// Helper to create (or reuse if possible) each of our different overlay types. ulong GetOverlayHandle(string overlayName, Transform transform, float widthInMeters = 1.0f) { ulong handle = OpenVR.k_ulOverlayHandleInvalid; var overlay = OpenVR.Overlay; if (overlay == null) { return(handle); } var key = SteamVR_Overlay.key + "." + overlayName; var error = overlay.FindOverlay(key, ref handle); if (error != EVROverlayError.None) { error = overlay.CreateOverlay(key, overlayName, ref handle); } if (error == EVROverlayError.None) { overlay.ShowOverlay(handle); overlay.SetOverlayAlpha(handle, alpha); overlay.SetOverlayWidthInMeters(handle, widthInMeters); // D3D textures are upside-down in Unity to match OpenGL. if (SteamVR.instance.textureType == ETextureType.DirectX) { var textureBounds = new VRTextureBounds_t(); textureBounds.uMin = 0; textureBounds.vMin = 1; textureBounds.uMax = 1; textureBounds.vMax = 0; overlay.SetOverlayTextureBounds(handle, ref textureBounds); } // Convert from world space to tracking space using the top-most camera. var vrcam = (loadingScreenDistance == 0.0f) ? SteamVR_Render.Top() : null; if (vrcam != null && vrcam.origin != null) { var offset = new SteamVR_Utils.RigidTransform(vrcam.origin, transform); offset.pos.x /= vrcam.origin.localScale.x; offset.pos.y /= vrcam.origin.localScale.y; offset.pos.z /= vrcam.origin.localScale.z; var t = offset.ToHmdMatrix34(); overlay.SetOverlayTransformAbsolute(handle, SteamVR.settings.trackingSpace, ref t); } else { var t = new SteamVR_Utils.RigidTransform(transform).ToHmdMatrix34(); overlay.SetOverlayTransformAbsolute(handle, SteamVR.settings.trackingSpace, ref t); } } return(handle); }
void OnEnable() { // Bail if no hmd is connected var vr = SteamVR.instance; if (vr == null) { if (head != null) { head.GetComponent <SteamVR_TrackedObject>().enabled = false; } enabled = false; return; } // Convert camera rig for native OpenVR integration. var t = transform; if (head != t) { Expand(); t.parent = origin; while (head.childCount > 0) { head.GetChild(0).parent = t; } // Keep the head around, but parent to the camera now since it moves with the hmd // but existing content may still have references to this object. head.parent = t; head.localPosition = Vector3.zero; head.localRotation = Quaternion.identity; head.localScale = Vector3.one; head.gameObject.SetActive(false); _head = t; } if (ears == null) { var e = transform.GetComponentInChildren <SteamVR_Ears>(); if (e != null) { _ears = e.transform; } } if (ears != null) { ears.GetComponent <SteamVR_Ears>().vrcam = this; } SteamVR_Render.Add(this); }
private void OnEnable() { SteamVR instance = SteamVR.instance; if (instance == null) { if (this.head != null) { this.head.GetComponent <SteamVR_GameView>().enabled = false; this.head.GetComponent <SteamVR_TrackedObject>().enabled = false; } if (this.flip != null) { this.flip.enabled = false; } base.enabled = false; return; } this.Expand(); if (SteamVR_Camera.blitMaterial == null) { SteamVR_Camera.blitMaterial = new Material(VRShaders.GetShader(VRShaders.VRShader.blit)); } Camera component = base.GetComponent <Camera>(); component.fieldOfView = instance.fieldOfView; component.aspect = instance.aspect; component.eventMask = 0; component.orthographic = false; component.enabled = false; if (component.actualRenderingPath != RenderingPath.Forward && QualitySettings.antiAliasing > 1) { Debug.LogWarning("MSAA only supported in Forward rendering path. (disabling MSAA)"); QualitySettings.antiAliasing = 0; } Camera component2 = this.head.GetComponent <Camera>(); if (component2 != null) { component2.renderingPath = component.renderingPath; } if (this.ears == null) { SteamVR_Ears componentInChildren = base.transform.GetComponentInChildren <SteamVR_Ears>(); if (componentInChildren != null) { this._ears = componentInChildren.transform; } } if (this.ears != null) { this.ears.GetComponent <SteamVR_Ears>().vrcam = this; } SteamVR_Render.Add(this); }
void SetScale(float scale) { this.scale = scale; var tracker = SteamVR_Render.Top(); if (tracker != null) { tracker.origin.localScale = new Vector3(scale, scale, scale); } }
public static void Initialize() { if (_instance == null && initializing == false) { initializing = true; GameObject steamVRObject = null; SteamVR_Render renderInstance = GameObject.FindObjectOfType <SteamVR_Render>(); if (renderInstance != null) { steamVRObject = renderInstance.gameObject; } SteamVR_Behaviour behaviourInstance = GameObject.FindObjectOfType <SteamVR_Behaviour>(); if (behaviourInstance != null) { steamVRObject = behaviourInstance.gameObject; } if (steamVRObject == null) { GameObject objectInstance = new GameObject("[SteamVR]"); _instance = objectInstance.AddComponent <SteamVR_Behaviour>(); _instance.steamvr_render = objectInstance.AddComponent <SteamVR_Render>(); } else { behaviourInstance = steamVRObject.GetComponent <SteamVR_Behaviour>(); if (behaviourInstance == null) { behaviourInstance = steamVRObject.AddComponent <SteamVR_Behaviour>(); } if (renderInstance != null) { behaviourInstance.steamvr_render = renderInstance; } else { behaviourInstance.steamvr_render = steamVRObject.GetComponent <SteamVR_Render>(); if (behaviourInstance.steamvr_render == null) { behaviourInstance.steamvr_render = steamVRObject.AddComponent <SteamVR_Render>(); } } _instance = behaviourInstance; } initializing = false; } }
void OnRenderImage(RenderTexture src, RenderTexture dest) { if (SteamVR_Render.Top() == this) { int eventID; if (SteamVR_Render.eye == EVREye.Eye_Left) { // Get gpu started on work early to avoid bubbles at the top of the frame. SteamVR_Utils.QueueEventOnRenderThread(SteamVR.OpenVRMagic.k_nRenderEventID_Flush); eventID = SteamVR.OpenVRMagic.k_nRenderEventID_SubmitL; } else { eventID = SteamVR.OpenVRMagic.k_nRenderEventID_SubmitR; } // Queue up a call on the render thread to Submit our render target to the compositor. SteamVR_Utils.QueueEventOnRenderThread(eventID); } if (SteamVR_Camera.doomp) { Debug.Log(Time.frameCount.ToString() + "/Camera_OnRenderImage"); DumpRenderTexture(src, Application.streamingAssetsPath + "/Camera_OnRenderImage_src.png"); } RenderTexture.active = dest; SteamVR_Camera.blitMaterial.mainTexture = src; GL.PushMatrix(); GL.LoadOrtho(); SteamVR_Camera.blitMaterial.SetPass(0); GL.Begin(7); GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(-1, 1, 0); GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1, 1, 0); GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1, -1, 0); GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(-1, -1, 0); GL.End(); GL.PopMatrix(); if (SteamVR_Camera.doomp) { DumpRenderTexture(dest, Application.streamingAssetsPath + "/Camera_OnRenderImage_dst.png"); } RenderTexture.active = null; }
public static void Initialize(bool forceUnityVRToOpenVR = false) { if (_instance == null && initializing == false) { initializing = true; GameObject steamVRObject = null; if (forceUnityVRToOpenVR) forcingInitialization = true; SteamVR_Render renderInstance = GameObject.FindObjectOfType<SteamVR_Render>(); if (renderInstance != null) steamVRObject = renderInstance.gameObject; SteamVR_Behaviour behaviourInstance = GameObject.FindObjectOfType<SteamVR_Behaviour>(); if (behaviourInstance != null) steamVRObject = behaviourInstance.gameObject; if (steamVRObject == null) { GameObject objectInstance = new GameObject("[SteamVR]"); _instance = objectInstance.AddComponent<SteamVR_Behaviour>(); _instance.steamvr_render = objectInstance.AddComponent<SteamVR_Render>(); } else { behaviourInstance = steamVRObject.GetComponent<SteamVR_Behaviour>(); if (behaviourInstance == null) behaviourInstance = steamVRObject.AddComponent<SteamVR_Behaviour>(); if (renderInstance != null) behaviourInstance.steamvr_render = renderInstance; else { behaviourInstance.steamvr_render = steamVRObject.GetComponent<SteamVR_Render>(); if (behaviourInstance.steamvr_render == null) behaviourInstance.steamvr_render = steamVRObject.AddComponent<SteamVR_Render>(); } _instance = behaviourInstance; } if (_instance != null && _instance.doNotDestroy) GameObject.DontDestroyOnLoad(_instance.transform.root.gameObject); initializing = false; } }
public void ShowMenu() { var overlay = SteamVR_Overlay.instance; if (overlay == null) { return; } var texture = overlay.texture as RenderTexture; if (texture == null) { Debug.LogError("Menu requires overlay texture to be a render texture."); return; } SaveCursorState(); Cursor.visible = true; Cursor.lockState = CursorLockMode.None; this.overlay = overlay; uvOffset = overlay.uvOffset; distance = overlay.distance; // If an existing camera is rendering into the overlay texture, we need // to temporarily disable it to keep it from clearing the texture on us. var cameras = Object.FindObjectsOfType(typeof(Camera)) as Camera[]; foreach (var cam in cameras) { if (cam.enabled && cam.targetTexture == texture) { overlayCam = cam; overlayCam.enabled = false; break; } } var tracker = SteamVR_Render.Top(); if (tracker != null) { scale = tracker.origin.localScale.x; } }
private void OnPreRender() { if (this.flip) { this.flip.enabled = (SteamVR_Render.Top() == this && SteamVR.instance.textureType == ETextureType.DirectX); } Camera component = this.head.GetComponent <Camera>(); if (component != null) { component.enabled = (SteamVR_Render.Top() == this); } if (this.wireframe) { GL.wireframe = true; } }
void OnPreRender() { if (flip) { flip.enabled = (SteamVR_Render.Top() == this && SteamVR.instance.textureType == ETextureType.DirectX); } var headCam = head.GetComponent <Camera>(); if (headCam != null) { headCam.enabled = (SteamVR_Render.Top() == this); } if (wireframe) { GL.wireframe = true; } }
public void UpdateOverlay() { var overlay = OpenVR.Overlay; if (overlay == null) { return; } if (texture != null) { var error = overlay.ShowOverlay(handle); if (error == EVROverlayError.InvalidHandle || error == EVROverlayError.UnknownOverlay) { if (overlay.FindOverlay(key, ref handle) != EVROverlayError.None) { return; } } var tex = new Texture_t(); tex.handle = texture.GetNativeTexturePtr(); tex.eType = SteamVR.instance.textureType; tex.eColorSpace = EColorSpace.Auto; overlay.SetOverlayTexture(handle, ref tex); overlay.SetOverlayAlpha(handle, alpha); overlay.SetOverlayWidthInMeters(handle, scale); overlay.SetOverlayAutoCurveDistanceRangeInMeters(handle, curvedRange.x, curvedRange.y); var textureBounds = new VRTextureBounds_t(); textureBounds.uMin = (0 + uvOffset.x) * uvOffset.z; textureBounds.vMin = (1 + uvOffset.y) * uvOffset.w; textureBounds.uMax = (1 + uvOffset.x) * uvOffset.z; textureBounds.vMax = (0 + uvOffset.y) * uvOffset.w; overlay.SetOverlayTextureBounds(handle, ref textureBounds); var vecMouseScale = new HmdVector2_t(); vecMouseScale.v0 = mouseScale.x; vecMouseScale.v1 = mouseScale.y; overlay.SetOverlayMouseScale(handle, ref vecMouseScale); var vrcam = SteamVR_Render.Top(); if (vrcam != null && vrcam.origin != null) { var offset = new SteamVR_Utils.RigidTransform(vrcam.origin, transform); offset.pos.x /= vrcam.origin.localScale.x; offset.pos.y /= vrcam.origin.localScale.y; offset.pos.z /= vrcam.origin.localScale.z; offset.pos.z += distance; var t = offset.ToHmdMatrix34(); overlay.SetOverlayTransformAbsolute(handle, SteamVR.settings.trackingSpace, ref t); } overlay.SetOverlayInputMethod(handle, inputMethod); if (curved || antialias) { highquality = true; } if (highquality) { overlay.SetHighQualityOverlay(handle); overlay.SetOverlayFlag(handle, VROverlayFlags.Curved, curved); overlay.SetOverlayFlag(handle, VROverlayFlags.RGSS4X, antialias); } else if (overlay.GetHighQualityOverlay() == handle) { overlay.SetHighQualityOverlay(OpenVR.k_ulOverlayHandleInvalid); } } else { overlay.HideOverlay(handle); } }
private void OnDisable() { SteamVR_Render.Remove(this); }
void OnGUI() { if (overlay == null) { return; } var texture = overlay.texture as RenderTexture; var prevActive = RenderTexture.active; RenderTexture.active = texture; if (Event.current.type == EventType.Repaint) { GL.Clear(false, true, Color.clear); } var area = new Rect(0, 0, texture.width, texture.height); // Account for screen smaller than texture (since mouse position gets clamped) if (Screen.width < texture.width) { area.width = Screen.width; overlay.uvOffset.x = -(float)(texture.width - Screen.width) / (2 * texture.width); } if (Screen.height < texture.height) { area.height = Screen.height; overlay.uvOffset.y = (float)(texture.height - Screen.height) / (2 * texture.height); } GUILayout.BeginArea(area); if (background != null) { GUI.DrawTexture(new Rect( (area.width - background.width) / 2, (area.height - background.height) / 2, background.width, background.height), background); } GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); if (logo != null) { GUILayout.Space(area.height / 2 - logoHeight); GUILayout.Box(logo); } GUILayout.Space(menuOffset); bool bHideMenu = GUILayout.Button("[Esc] - Close menu"); GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Scale: {0:N4}", scale)); { var result = GUILayout.HorizontalSlider(scale, scaleLimits.x, scaleLimits.y); if (result != scale) { SetScale(result); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Scale limits:")); { var result = GUILayout.TextField(scaleLimitX); if (result != scaleLimitX) { if (float.TryParse(result, out scaleLimits.x)) { scaleLimitX = result; } } } { var result = GUILayout.TextField(scaleLimitY); if (result != scaleLimitY) { if (float.TryParse(result, out scaleLimits.y)) { scaleLimitY = result; } } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label(string.Format("Scale rate:")); { var result = GUILayout.TextField(scaleRateText); if (result != scaleRateText) { if (float.TryParse(result, out scaleRate)) { scaleRateText = result; } } } GUILayout.EndHorizontal(); if (SteamVR.active) { var vr = SteamVR.instance; GUILayout.BeginHorizontal(); { var t = SteamVR_Camera.sceneResolutionScale; int w = (int)(vr.sceneWidth * t); int h = (int)(vr.sceneHeight * t); int pct = (int)(100.0f * t); GUILayout.Label(string.Format("Scene quality: {0}x{1} ({2}%)", w, h, pct)); var result = Mathf.RoundToInt(GUILayout.HorizontalSlider(pct, 50, 200)); if (result != pct) { SteamVR_Camera.sceneResolutionScale = (float)result / 100.0f; } } GUILayout.EndHorizontal(); } overlay.highquality = GUILayout.Toggle(overlay.highquality, "High quality"); if (overlay.highquality) { overlay.curved = GUILayout.Toggle(overlay.curved, "Curved overlay"); overlay.antialias = GUILayout.Toggle(overlay.antialias, "Overlay RGSS(2x2)"); } else { overlay.curved = false; overlay.antialias = false; } var tracker = SteamVR_Render.Top(); if (tracker != null) { tracker.wireframe = GUILayout.Toggle(tracker.wireframe, "Wireframe"); if (SteamVR.settings.trackingSpace == ETrackingUniverseOrigin.TrackingUniverseSeated) { if (GUILayout.Button("Switch to Standing")) { SteamVR.settings.trackingSpace = ETrackingUniverseOrigin.TrackingUniverseStanding; } if (GUILayout.Button("Center View")) { var system = OpenVR.System; if (system != null) { system.ResetSeatedZeroPose(); } } } else { if (GUILayout.Button("Switch to Seated")) { SteamVR.settings.trackingSpace = ETrackingUniverseOrigin.TrackingUniverseSeated; } } } #if !UNITY_EDITOR if (GUILayout.Button("Exit")) { Application.Quit(); } #endif GUILayout.Space(menuOffset); var env = System.Environment.GetEnvironmentVariable("VR_OVERRIDE"); if (env != null) { GUILayout.Label("VR_OVERRIDE=" + env); } GUILayout.Label("Graphics device: " + SystemInfo.graphicsDeviceVersion); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.EndArea(); if (cursor != null) { float x = Input.mousePosition.x, y = Screen.height - Input.mousePosition.y; float w = cursor.width, h = cursor.height; GUI.DrawTexture(new Rect(x, y, w, h), cursor); } RenderTexture.active = prevActive; if (bHideMenu) { HideMenu(); } }
void OnEnable() { // Bail if no hmd is connected var vr = SteamVR.instance; if (vr == null) { if (head != null) { head.GetComponent <SteamVR_GameView>().enabled = false; head.GetComponent <SteamVR_TrackedObject>().enabled = false; } if (flip != null) { flip.enabled = false; } enabled = false; return; } // Ensure rig is properly set up Expand(); if (blitMaterial == null) { blitMaterial = new Material(VRShaders.GetShader(VRShaders.VRShader.blit)); } // Set remaining hmd specific settings var camera = GetComponent <Camera>(); camera.fieldOfView = vr.fieldOfView; camera.aspect = vr.aspect; camera.eventMask = 0; // disable mouse events camera.orthographic = false; // force perspective camera.enabled = false; // manually rendered by SteamVR_Render if (camera.actualRenderingPath != RenderingPath.Forward && QualitySettings.antiAliasing > 1) { Debug.LogWarning("MSAA only supported in Forward rendering path. (disabling MSAA)"); QualitySettings.antiAliasing = 0; } // Ensure game view camera hdr setting matches var headCam = head.GetComponent <Camera>(); if (headCam != null) { headCam.renderingPath = camera.renderingPath; } if (ears == null) { var e = transform.GetComponentInChildren <SteamVR_Ears>(); if (e != null) { _ears = e.transform; } } if (ears != null) { ears.GetComponent <SteamVR_Ears>().vrcam = this; } SteamVR_Render.Add(this); }