// 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_Render.instance.trackingSpace, ref t); } else { var t = new SteamVR_Utils.RigidTransform(transform).ToHmdMatrix34(); overlay.SetOverlayTransformAbsolute(handle, SteamVR_Render.instance.trackingSpace, ref t); } } return(handle); }
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_Render.instance.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); } }