You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			172 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								//======= Copyright (c) Valve Corporation, All rights reserved. ===============
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Purpose: Displays 2d content on a large virtual screen.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//=============================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								using Valve.VR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Valve.VR
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class SteamVR_Overlay : MonoBehaviour
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        public Texture texture;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Tooltip("Size of overlay view.")]
							 | 
						||
| 
								 | 
							
								        public float scale = 3.0f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Tooltip("Distance from surface.")]
							 | 
						||
| 
								 | 
							
								        public float distance = 1.25f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        [Tooltip("Opacity"), Range(0.0f, 1.0f)]
							 | 
						||
| 
								 | 
							
								        public float alpha = 1.0f;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public Vector4 uvOffset = new Vector4(0, 0, 1, 1);
							 | 
						||
| 
								 | 
							
								        public Vector2 mouseScale = new Vector2(1, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public VROverlayInputMethod inputMethod = VROverlayInputMethod.None;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        static public SteamVR_Overlay instance { get; private set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        static public string key { get { return "unity:" + Application.companyName + "." + Application.productName; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private ulong handle = OpenVR.k_ulOverlayHandleInvalid;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void OnEnable()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var overlay = OpenVR.Overlay;
							 | 
						||
| 
								 | 
							
								            if (overlay != null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var error = overlay.CreateOverlay(key, gameObject.name, ref handle);
							 | 
						||
| 
								 | 
							
								                if (error != EVROverlayError.None)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Debug.Log("<b>[SteamVR]</b> " + overlay.GetOverlayErrorNameFromEnum(error));
							 | 
						||
| 
								 | 
							
								                    enabled = false;
							 | 
						||
| 
								 | 
							
								                    return;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            SteamVR_Overlay.instance = this;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void OnDisable()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (handle != OpenVR.k_ulOverlayHandleInvalid)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var overlay = OpenVR.Overlay;
							 | 
						||
| 
								 | 
							
								                if (overlay != null)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    overlay.DestroyOverlay(handle);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                handle = OpenVR.k_ulOverlayHandleInvalid;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            SteamVR_Overlay.instance = null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        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);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                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);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                overlay.HideOverlay(handle);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool PollNextEvent(ref VREvent_t pEvent)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var overlay = OpenVR.Overlay;
							 | 
						||
| 
								 | 
							
								            if (overlay == null)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var size = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Valve.VR.VREvent_t));
							 | 
						||
| 
								 | 
							
								            return overlay.PollNextOverlayEvent(handle, ref pEvent, size);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public struct IntersectionResults
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            public Vector3 point;
							 | 
						||
| 
								 | 
							
								            public Vector3 normal;
							 | 
						||
| 
								 | 
							
								            public Vector2 UVs;
							 | 
						||
| 
								 | 
							
								            public float distance;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public bool ComputeIntersection(Vector3 source, Vector3 direction, ref IntersectionResults results)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var overlay = OpenVR.Overlay;
							 | 
						||
| 
								 | 
							
								            if (overlay == null)
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var input = new VROverlayIntersectionParams_t();
							 | 
						||
| 
								 | 
							
								            input.eOrigin = SteamVR.settings.trackingSpace;
							 | 
						||
| 
								 | 
							
								            input.vSource.v0 = source.x;
							 | 
						||
| 
								 | 
							
								            input.vSource.v1 = source.y;
							 | 
						||
| 
								 | 
							
								            input.vSource.v2 = -source.z;
							 | 
						||
| 
								 | 
							
								            input.vDirection.v0 = direction.x;
							 | 
						||
| 
								 | 
							
								            input.vDirection.v1 = direction.y;
							 | 
						||
| 
								 | 
							
								            input.vDirection.v2 = -direction.z;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var output = new VROverlayIntersectionResults_t();
							 | 
						||
| 
								 | 
							
								            if (!overlay.ComputeOverlayIntersection(handle, ref input, ref output))
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            results.point = new Vector3(output.vPoint.v0, output.vPoint.v1, -output.vPoint.v2);
							 | 
						||
| 
								 | 
							
								            results.normal = new Vector3(output.vNormal.v0, output.vNormal.v1, -output.vNormal.v2);
							 | 
						||
| 
								 | 
							
								            results.UVs = new Vector2(output.vUVs.v0, output.vUVs.v1);
							 | 
						||
| 
								 | 
							
								            results.distance = output.fDistance;
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |