// 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);
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #10
0
        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();
            }
        }
Beispiel #14
0
        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);
        }