void OnDisable() { StopAllCoroutines(); SteamVR_Events.InputFocus.Remove(OnInputFocus); SteamVR_Events.System(EVREventType.VREvent_Quit).Remove(OnQuit); SteamVR_Events.System(EVREventType.VREvent_RequestScreenshot).Remove(OnRequestScreenshot); #if UNITY_2017_1_OR_NEWER Application.onBeforeRender -= OnBeforeRender; #else Camera.onPreCull -= OnCameraPreCull; #endif }
void OnEnable() { StartCoroutine(RenderLoop()); SteamVR_Events.InputFocus.Listen(OnInputFocus); SteamVR_Events.System(EVREventType.VREvent_Quit).Listen(OnQuit); SteamVR_Events.System(EVREventType.VREvent_RequestScreenshot).Listen(OnRequestScreenshot); #if UNITY_2017_1_OR_NEWER Application.onBeforeRender += OnBeforeRender; #else Camera.onPreCull += OnCameraPreCull; #endif var vr = SteamVR.instance; if (vr == null) { enabled = false; return; } var types = new EVRScreenshotType[] { EVRScreenshotType.StereoPanorama }; OpenVR.Screenshots.HookScreenshot(types); }
void Update() { // Force controller update in case no one else called this frame to ensure prevState gets updated. SteamVR_Controller.Update(); // Dispatch any OpenVR events. var system = OpenVR.System; if (system != null) { var vrEvent = new VREvent_t(); var size = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VREvent_t)); for (int i = 0; i < 64; i++) { if (!system.PollNextEvent(ref vrEvent, size)) { break; } switch ((EVREventType)vrEvent.eventType) { case EVREventType.VREvent_InputFocusCaptured: // another app has taken focus (likely dashboard) if (vrEvent.data.process.oldPid == 0) { SteamVR_Events.InputFocus.Send(false); } break; case EVREventType.VREvent_InputFocusReleased: // that app has released input focus if (vrEvent.data.process.pid == 0) { SteamVR_Events.InputFocus.Send(true); } break; case EVREventType.VREvent_ShowRenderModels: SteamVR_Events.HideRenderModels.Send(false); break; case EVREventType.VREvent_HideRenderModels: SteamVR_Events.HideRenderModels.Send(true); break; default: SteamVR_Events.System((EVREventType)vrEvent.eventType).Send(vrEvent); break; } } } // Ensure various settings to minimize latency. Application.targetFrameRate = -1; Application.runInBackground = true; // don't require companion window focus QualitySettings.maxQueuedFrames = -1; QualitySettings.vSyncCount = 0; // this applies to the companion window if (lockPhysicsUpdateRateToRenderFrequency && Time.timeScale > 0.0f) { var vr = SteamVR.instance; if (vr != null) { var timing = new Compositor_FrameTiming(); timing.m_nSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Compositor_FrameTiming)); vr.compositor.GetFrameTiming(ref timing, 0); Time.fixedDeltaTime = Time.timeScale / vr.hmd_DisplayFrequency; } } }