8 using System.Collections;
13 public Texture texture;
14 public bool curved =
true;
15 public bool antialias =
true;
16 public bool highquality =
true;
18 [Tooltip(
"Size of overlay view.")]
19 public float scale = 3.0f;
21 [Tooltip(
"Distance from surface.")]
22 public float distance = 1.25f;
24 [Tooltip(
"Opacity"), Range(0.0f, 1.0f)]
25 public float alpha = 1.0f;
27 public Vector4 uvOffset =
new Vector4(0, 0, 1, 1);
28 public Vector2 mouseScale =
new Vector2(1, 1);
29 public Vector2 curvedRange =
new Vector2(1, 2);
31 public VROverlayInputMethod inputMethod = VROverlayInputMethod.None;
35 static public string key {
get {
return "unity:" + Application.companyName +
"." + Application.productName; } }
37 private ulong handle = OpenVR.k_ulOverlayHandleInvalid;
41 var overlay = OpenVR.Overlay;
44 var error = overlay.CreateOverlay(key, gameObject.name, ref handle);
45 if (error != EVROverlayError.None)
47 Debug.Log(overlay.GetOverlayErrorNameFromEnum(error));
53 SteamVR_Overlay.instance =
this;
58 if (handle !=
OpenVR.k_ulOverlayHandleInvalid)
60 var overlay = OpenVR.Overlay;
63 overlay.DestroyOverlay(handle);
66 handle = OpenVR.k_ulOverlayHandleInvalid;
69 SteamVR_Overlay.instance = null;
72 public void UpdateOverlay()
74 var overlay = OpenVR.Overlay;
80 var error = overlay.ShowOverlay(handle);
81 if (error == EVROverlayError.InvalidHandle || error == EVROverlayError.UnknownOverlay)
83 if (overlay.FindOverlay(key, ref handle) != EVROverlayError.None)
88 tex.handle = texture.GetNativeTexturePtr();
89 tex.eType = SteamVR.instance.textureType;
90 tex.eColorSpace = EColorSpace.Auto;
91 overlay.SetOverlayTexture(handle, ref tex);
93 overlay.SetOverlayAlpha(handle, alpha);
94 overlay.SetOverlayWidthInMeters(handle, scale);
95 overlay.SetOverlayAutoCurveDistanceRangeInMeters(handle, curvedRange.x, curvedRange.y);
98 textureBounds.uMin = (0 + uvOffset.x) * uvOffset.z;
99 textureBounds.vMin = (1 + uvOffset.y) * uvOffset.w;
100 textureBounds.uMax = (1 + uvOffset.x) * uvOffset.z;
101 textureBounds.vMax = (0 + uvOffset.y) * uvOffset.w;
102 overlay.SetOverlayTextureBounds(handle, ref textureBounds);
105 vecMouseScale.v0 = mouseScale.x;
106 vecMouseScale.v1 = mouseScale.y;
107 overlay.SetOverlayMouseScale(handle, ref vecMouseScale);
109 var vrcam = SteamVR_Render.Top();
110 if (vrcam != null && vrcam.origin != null)
113 offset.pos.x /= vrcam.origin.localScale.x;
114 offset.pos.y /= vrcam.origin.localScale.y;
115 offset.pos.z /= vrcam.origin.localScale.z;
117 offset.pos.z += distance;
119 var t = offset.ToHmdMatrix34();
120 overlay.SetOverlayTransformAbsolute(handle, SteamVR_Render.instance.trackingSpace, ref t);
123 overlay.SetOverlayInputMethod(handle, inputMethod);
125 if (curved || antialias)
130 overlay.SetHighQualityOverlay(handle);
131 overlay.SetOverlayFlag(handle, VROverlayFlags.Curved, curved);
132 overlay.SetOverlayFlag(handle, VROverlayFlags.RGSS4X, antialias);
134 else if (overlay.GetHighQualityOverlay() == handle)
136 overlay.SetHighQualityOverlay(OpenVR.k_ulOverlayHandleInvalid);
141 overlay.HideOverlay(handle);
145 public bool PollNextEvent(ref
VREvent_t pEvent)
147 var overlay = OpenVR.Overlay;
151 var size = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Valve.VR.VREvent_t));
152 return overlay.PollNextOverlayEvent(handle, ref pEvent, size);
157 public Vector3 point;
158 public Vector3 normal;
160 public float distance;
163 public bool ComputeIntersection(Vector3 source, Vector3 direction, ref
IntersectionResults results)
165 var overlay = OpenVR.Overlay;
170 input.eOrigin = SteamVR_Render.instance.trackingSpace;
171 input.vSource.v0 = source.x;
172 input.vSource.v1 = source.y;
173 input.vSource.v2 = -source.z;
174 input.vDirection.v0 = direction.x;
175 input.vDirection.v1 = direction.y;
176 input.vDirection.v2 = -direction.z;
179 if (!overlay.ComputeOverlayIntersection(handle, ref input, ref output))
182 results.point =
new Vector3(output.vPoint.v0, output.vPoint.v1, -output.vPoint.v2);
183 results.normal =
new Vector3(output.vNormal.v0, output.vNormal.v1, -output.vNormal.v2);
184 results.UVs =
new Vector2(output.vUVs.v0, output.vUVs.v1);
185 results.distance = output.fDistance;