public void renderFrame() { if (mHMD != null) { GL.DepthFunc(DepthFunction.Less); GL.Enable(EnableCap.DepthTest); setupCameras(); // DrawControllers RenderStereoTargets(); //RenderDistortion(); GL.Finish(); GL.Flush(); renderCompanionWindow(); Valve.VR.Texture_t leftEyeTexture, rightEyeTexture; leftEyeTexture.handle = new IntPtr(leftEyeDesc.resolveTextureId); rightEyeTexture.handle = new IntPtr(rightEyeDesc.resolveTextureId); leftEyeTexture.eType = Valve.VR.ETextureType.OpenGL; rightEyeTexture.eType = Valve.VR.ETextureType.OpenGL; leftEyeTexture.eColorSpace = Valve.VR.EColorSpace.Gamma; rightEyeTexture.eColorSpace = Valve.VR.EColorSpace.Gamma; Valve.VR.VRTextureBounds_t pBounds = new Valve.VR.VRTextureBounds_t(); pBounds.uMax = 1; pBounds.uMin = 0; pBounds.vMax = 1; pBounds.uMin = 0; Valve.VR.OpenVR.Compositor.Submit(Valve.VR.EVREye.Eye_Left, ref leftEyeTexture, ref pBounds, Valve.VR.EVRSubmitFlags.Submit_LensDistortionAlreadyApplied); // TODO: There's a distortion already applied flag. Valve.VR.OpenVR.Compositor.Submit(Valve.VR.EVREye.Eye_Right, ref rightEyeTexture, ref pBounds, Valve.VR.EVRSubmitFlags.Submit_LensDistortionAlreadyApplied); GL.Finish(); } }
private SteamVR() { hmd = OpenVR.System; Debug.Log("Connected to " + hmd_TrackingSystemName + ":" + hmd_SerialNumber); compositor = OpenVR.Compositor; overlay = OpenVR.Overlay; // Setup render values uint w = 0, h = 0; hmd.GetRecommendedRenderTargetSize(ref w, ref h); sceneWidth = (float)w; sceneHeight = (float)h; float l_left = 0.0f, l_right = 0.0f, l_top = 0.0f, l_bottom = 0.0f; hmd.GetProjectionRaw(EVREye.Eye_Left, ref l_left, ref l_right, ref l_top, ref l_bottom); float r_left = 0.0f, r_right = 0.0f, r_top = 0.0f, r_bottom = 0.0f; hmd.GetProjectionRaw(EVREye.Eye_Right, ref r_left, ref r_right, ref r_top, ref r_bottom); tanHalfFov = new Vector2( Mathf.Max(-l_left, l_right, -r_left, r_right), Mathf.Max(-l_top, l_bottom, -r_top, r_bottom)); textureBounds = new VRTextureBounds_t[2]; textureBounds[0].uMin = 0.5f + 0.5f * l_left / tanHalfFov.x; textureBounds[0].uMax = 0.5f + 0.5f * l_right / tanHalfFov.x; textureBounds[0].vMin = 0.5f - 0.5f * l_bottom / tanHalfFov.y; textureBounds[0].vMax = 0.5f - 0.5f * l_top / tanHalfFov.y; textureBounds[1].uMin = 0.5f + 0.5f * r_left / tanHalfFov.x; textureBounds[1].uMax = 0.5f + 0.5f * r_right / tanHalfFov.x; textureBounds[1].vMin = 0.5f - 0.5f * r_bottom / tanHalfFov.y; textureBounds[1].vMax = 0.5f - 0.5f * r_top / tanHalfFov.y; // Grow the recommended size to account for the overlapping fov sceneWidth = sceneWidth / Mathf.Max(textureBounds[0].uMax - textureBounds[0].uMin, textureBounds[1].uMax - textureBounds[1].uMin); sceneHeight = sceneHeight / Mathf.Max(textureBounds[0].vMax - textureBounds[0].vMin, textureBounds[1].vMax - textureBounds[1].vMin); aspect = tanHalfFov.x / tanHalfFov.y; fieldOfView = 2.0f * Mathf.Atan(tanHalfFov.y) * Mathf.Rad2Deg; eyes = new SteamVR_Utils.RigidTransform[] { new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(EVREye.Eye_Left)), new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(EVREye.Eye_Right)) }; if (SystemInfo.graphicsDeviceVersion.StartsWith("OpenGL")) graphicsAPI = EGraphicsAPIConvention.API_OpenGL; else graphicsAPI = EGraphicsAPIConvention.API_DirectX; SteamVR_Utils.Event.Listen("initializing", OnInitializing); SteamVR_Utils.Event.Listen("calibrating", OnCalibrating); SteamVR_Utils.Event.Listen("out_of_range", OnOutOfRange); SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected); SteamVR_Utils.Event.Listen("new_poses", OnNewPoses); }
internal static extern EVROverlayError VR_IVROverlay_GetOverlayTextureBounds(IntPtr instancePtr, ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds);
public override EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) { CheckIfUsable(); EVROverlayError result = VRNativeEntrypoints.VR_IVROverlay_GetOverlayTextureBounds(m_pVROverlay,ulOverlayHandle,ref pOverlayTextureBounds); return result; }
void Update() { if (Time.frameCount == prevFrameCount) return; prevFrameCount = Time.frameCount; if (videostream.handle == 0) return; var vr = SteamVR.instance; if (vr == null) return; var trackedCamera = OpenVR.TrackedCamera; if (trackedCamera == null) return; var nativeTex = System.IntPtr.Zero; var deviceTexture = (_texture != null) ? _texture : new Texture2D(2, 2); var headerSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(header.GetType()); if (vr.graphicsAPI == EGraphicsAPIConvention.API_OpenGL) { if (glTextureId != 0) trackedCamera.ReleaseVideoStreamTextureGL(videostream.handle, glTextureId); if (trackedCamera.GetVideoStreamTextureGL(videostream.handle, frameType, ref glTextureId, ref header, headerSize) != EVRTrackedCameraError.None) return; nativeTex = (System.IntPtr)glTextureId; } else { if (trackedCamera.GetVideoStreamTextureD3D11(videostream.handle, frameType, deviceTexture.GetNativeTexturePtr(), ref nativeTex, ref header, headerSize) != EVRTrackedCameraError.None) return; } if (_texture == null) { _texture = Texture2D.CreateExternalTexture((int)header.nWidth, (int)header.nHeight, TextureFormat.RGBA32, false, false, nativeTex); uint width = 0, height = 0; var frameBounds = new VRTextureBounds_t(); if (trackedCamera.GetVideoStreamTextureSize(deviceIndex, frameType, ref frameBounds, ref width, ref height) == EVRTrackedCameraError.None) { // Account for textures being upside-down in Unity. frameBounds.vMin = 1.0f - frameBounds.vMin; frameBounds.vMax = 1.0f - frameBounds.vMax; this.frameBounds = frameBounds; } } else { _texture.UpdateExternalTexture(nativeTex); } }
internal static extern VRCompositorError VR_IVRCompositor_Submit(IntPtr instancePtr, Hmd_Eye eEye, GraphicsAPIConvention eTextureType, IntPtr pTexture, ref VRTextureBounds_t pBounds, VRSubmitFlags_t nSubmitFlags);
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 SteamVR() { hmd = OpenVR.System; Debug.Log("Connected to " + hmd_TrackingSystemName + ":" + hmd_SerialNumber); compositor = OpenVR.Compositor; overlay = OpenVR.Overlay; // Setup render values uint w = 0, h = 0; hmd.GetRecommendedRenderTargetSize(ref w, ref h); sceneWidth = (float)w; sceneHeight = (float)h; float l_left = 0.0f, l_right = 0.0f, l_top = 0.0f, l_bottom = 0.0f; hmd.GetProjectionRaw(EVREye.Eye_Left, ref l_left, ref l_right, ref l_top, ref l_bottom); float r_left = 0.0f, r_right = 0.0f, r_top = 0.0f, r_bottom = 0.0f; hmd.GetProjectionRaw(EVREye.Eye_Right, ref r_left, ref r_right, ref r_top, ref r_bottom); tanHalfFov = new Vector2( Mathf.Max(-l_left, l_right, -r_left, r_right), Mathf.Max(-l_top, l_bottom, -r_top, r_bottom)); textureBounds = new VRTextureBounds_t[2]; textureBounds[0].uMin = 0.5f + 0.5f * l_left / tanHalfFov.x; textureBounds[0].uMax = 0.5f + 0.5f * l_right / tanHalfFov.x; textureBounds[0].vMin = 0.5f - 0.5f * l_bottom / tanHalfFov.y; textureBounds[0].vMax = 0.5f - 0.5f * l_top / tanHalfFov.y; textureBounds[1].uMin = 0.5f + 0.5f * r_left / tanHalfFov.x; textureBounds[1].uMax = 0.5f + 0.5f * r_right / tanHalfFov.x; textureBounds[1].vMin = 0.5f - 0.5f * r_bottom / tanHalfFov.y; textureBounds[1].vMax = 0.5f - 0.5f * r_top / tanHalfFov.y; // Grow the recommended size to account for the overlapping fov sceneWidth = sceneWidth / Mathf.Max(textureBounds[0].uMax - textureBounds[0].uMin, textureBounds[1].uMax - textureBounds[1].uMin); sceneHeight = sceneHeight / Mathf.Max(textureBounds[0].vMax - textureBounds[0].vMin, textureBounds[1].vMax - textureBounds[1].vMin); aspect = tanHalfFov.x / tanHalfFov.y; fieldOfView = 2.0f * Mathf.Atan(tanHalfFov.y) * Mathf.Rad2Deg; eyes = new SteamVR_Utils.RigidTransform[] { new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(EVREye.Eye_Left)), new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(EVREye.Eye_Right)) }; switch (SystemInfo.graphicsDeviceType) { #if (UNITY_5_4) case UnityEngine.Rendering.GraphicsDeviceType.OpenGL2: #endif case UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore: case UnityEngine.Rendering.GraphicsDeviceType.OpenGLES2: case UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3: textureType = ETextureType.OpenGL; break; #if !(UNITY_5_4) case UnityEngine.Rendering.GraphicsDeviceType.Vulkan: textureType = ETextureType.Vulkan; break; #endif default: textureType = ETextureType.DirectX; break; } SteamVR_Events.Initializing.Listen(OnInitializing); SteamVR_Events.Calibrating.Listen(OnCalibrating); SteamVR_Events.OutOfRange.Listen(OnOutOfRange); SteamVR_Events.DeviceConnected.Listen(OnDeviceConnected); SteamVR_Events.NewPoses.Listen(OnNewPoses); }
public EVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera, EVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref CameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize) => default; // 0x00000001811E1100-0x00000001811E1130 public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex, EVRTrackedCameraFrameType eFrameType, ref VRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight) => default; // 0x00000001811E1190-0x00000001811E11D0
public abstract VRCompositorError Submit(Hmd_Eye eEye,IntPtr pTexture,ref VRTextureBounds_t pBounds);
internal static extern VRCompositorError VR_IVRCompositor_Submit(IntPtr instancePtr, Hmd_Eye eEye, IntPtr pTexture, ref VRTextureBounds_t pBounds);
public override VRCompositorError Submit(Hmd_Eye eEye,IntPtr pTexture,ref VRTextureBounds_t pBounds) { CheckIfUsable(); VRCompositorError result = VRNativeEntrypoints.VR_IVRCompositor_Submit(m_pVRCompositor,eEye,pTexture,ref pBounds); return result; }
public void UpdateOverlay(SteamVR vr) { if (texture != null) { var error = vr.overlay.ShowOverlay(handle); if (error == VROverlayError.InvalidHandle || error == VROverlayError.UnknownOverlay) { if (vr.overlay.FindOverlay(key, ref handle) != VROverlayError.None) return; } vr.overlay.SetOverlayTexture(handle, texture.GetNativeTexturePtr()); vr.overlay.SetOverlayAlpha(handle, alpha); vr.overlay.SetOverlayGamma(handle, gamma); vr.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; vr.overlay.SetOverlayTextureBounds(handle, ref textureBounds); var vecMouseScale = new HmdVector2_t(); vecMouseScale.v = new float[] { mouseScale.x, mouseScale.y }; vr.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(); vr.overlay.SetOverlayTransformAbsolute(handle, SteamVR_Render.instance.trackingSpace, ref t); } vr.overlay.SetOverlayVisibility(handle, visibility); vr.overlay.SetOverlayInputMethod(handle, inputMethod); if (curved || antialias) highquality = true; if (highquality) { vr.overlay.SetHighQualityOverlay(handle); vr.overlay.SetOverlayFlag(handle, VROverlayFlags.Curved, curved); vr.overlay.SetOverlayFlag(handle, VROverlayFlags.RGSS4X, antialias); } else if (vr.overlay.GetHighQualityOverlay() == handle) { vr.overlay.SetHighQualityOverlay(OpenVR.k_ulOverlayHandleInvalid); } } else { vr.overlay.HideOverlay(handle); } }
public EVRCompositorError Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags) { return(this.FnTable.Submit(eEye, ref pTexture, ref pBounds, nSubmitFlags)); }
private SteamVR(System.IntPtr pHmd, System.IntPtr pCompositor, System.IntPtr pOverlay) { hmd = new CVRSystem(pHmd); Debug.Log("Connected to " + hmd_TrackingSystemName + ":" + hmd_SerialNumber); compositor = new CVRCompositor(pCompositor); overlay = new CVROverlay(pOverlay); var device = new UnityGraphicsDevice(); GetUnityGraphicsDevice(ref device); switch (device.type) { case GfxDeviceRenderer.kGfxRendererD3D11: compositor.SetGraphicsDevice(Compositor_DeviceType.D3D11, device.ptr); break; case GfxDeviceRenderer.kGfxRendererOpenGL: compositor.SetGraphicsDevice(Compositor_DeviceType.OpenGL, device.ptr); break; default: throw new System.Exception("Unsupported device type."); } var capacity = compositor.GetLastError(null, 0); if (capacity > 1) { var result = new System.Text.StringBuilder((int)capacity); compositor.GetLastError(result, capacity); Debug.Log("Compositor - " + result); } // Register for a callback if our graphics device goes away, so we can properly clean up. var resetDelegate = new UnityResetDelegate(SteamVR.SafeDispose); callbackHandle = GCHandle.Alloc(resetDelegate); SetUnityResetCallback(Marshal.GetFunctionPointerForDelegate(resetDelegate)); // Hook up the render thread present event just in case we wind up needing to use this. var error = HmdError.None; SetUnityRenderCallback(OpenVR.GetGenericInterface(IVRHmdDistortPresent_Version, ref error)); // Setup render values uint w = 0, h = 0; hmd.GetRecommendedRenderTargetSize(ref w, ref h); sceneWidth = (float)w; sceneHeight = (float)h; float l_left = 0.0f, l_right = 0.0f, l_top = 0.0f, l_bottom = 0.0f; hmd.GetProjectionRaw(Hmd_Eye.Eye_Left, ref l_left, ref l_right, ref l_top, ref l_bottom); float r_left = 0.0f, r_right = 0.0f, r_top = 0.0f, r_bottom = 0.0f; hmd.GetProjectionRaw(Hmd_Eye.Eye_Right, ref r_left, ref r_right, ref r_top, ref r_bottom); tanHalfFov = new Vector2( Mathf.Max(-l_left, l_right, -r_left, r_right), Mathf.Max(-l_top, l_bottom, -r_top, r_bottom)); textureBounds = new VRTextureBounds_t[2]; textureBounds[0].uMin = 0.5f + 0.5f * l_left / tanHalfFov.x; textureBounds[0].uMax = 0.5f + 0.5f * l_right / tanHalfFov.x; textureBounds[0].vMin = 0.5f - 0.5f * l_bottom / tanHalfFov.y; textureBounds[0].vMax = 0.5f - 0.5f * l_top / tanHalfFov.y; textureBounds[1].uMin = 0.5f + 0.5f * r_left / tanHalfFov.x; textureBounds[1].uMax = 0.5f + 0.5f * r_right / tanHalfFov.x; textureBounds[1].vMin = 0.5f - 0.5f * r_bottom / tanHalfFov.y; textureBounds[1].vMax = 0.5f - 0.5f * r_top / tanHalfFov.y; // Grow the recommended size to account for the overlapping fov sceneWidth = sceneWidth / Mathf.Max(textureBounds[0].uMax - textureBounds[0].uMin, textureBounds[1].uMax - textureBounds[1].uMin); sceneHeight = sceneHeight / Mathf.Max(textureBounds[0].vMax - textureBounds[0].vMin, textureBounds[1].vMax - textureBounds[1].vMin); aspect = tanHalfFov.x / tanHalfFov.y; fieldOfView = 2.0f * Mathf.Atan(tanHalfFov.y) * Mathf.Rad2Deg; eyes = new SteamVR_Utils.RigidTransform[] { new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(Hmd_Eye.Eye_Left)), new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(Hmd_Eye.Eye_Right)) }; SteamVR_Utils.Event.Listen("initializing", OnInitializing); SteamVR_Utils.Event.Listen("calibrating", OnCalibrating); SteamVR_Utils.Event.Listen("out_of_range", OnOutOfRange); SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected); SteamVR_Utils.Event.Listen("new_poses", OnNewPoses); }
public abstract EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags);
// 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.graphicsAPI == EGraphicsAPIConvention.API_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; }
void Update() { if (Time.frameCount == prevFrameCount) { return; } prevFrameCount = Time.frameCount; if (videostream.handle == 0) { return; } var vr = SteamVR.instance; if (vr == null) { return; } var trackedCamera = OpenVR.TrackedCamera; if (trackedCamera == null) { return; } var nativeTex = System.IntPtr.Zero; var deviceTexture = (_texture != null) ? _texture : new Texture2D(2, 2); var headerSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(header.GetType()); if (vr.textureType == ETextureType.OpenGL) { if (glTextureId != 0) { trackedCamera.ReleaseVideoStreamTextureGL(videostream.handle, glTextureId); } if (trackedCamera.GetVideoStreamTextureGL(videostream.handle, frameType, ref glTextureId, ref header, headerSize) != EVRTrackedCameraError.None) { return; } nativeTex = (System.IntPtr)glTextureId; } else if (vr.textureType == ETextureType.DirectX) { if (trackedCamera.GetVideoStreamTextureD3D11(videostream.handle, frameType, deviceTexture.GetNativeTexturePtr(), ref nativeTex, ref header, headerSize) != EVRTrackedCameraError.None) { return; } } if (_texture == null) { _texture = Texture2D.CreateExternalTexture((int)header.nWidth, (int)header.nHeight, TextureFormat.RGBA32, false, false, nativeTex); uint width = 0, height = 0; var frameBounds = new VRTextureBounds_t(); if (trackedCamera.GetVideoStreamTextureSize(deviceIndex, frameType, ref frameBounds, ref width, ref height) == EVRTrackedCameraError.None) { // Account for textures being upside-down in Unity. frameBounds.vMin = 1.0f - frameBounds.vMin; frameBounds.vMax = 1.0f - frameBounds.vMax; this.frameBounds = frameBounds; } } else { _texture.UpdateExternalTexture(nativeTex); } }
public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds) { EVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle,ref pOverlayTextureBounds); return result; }
public static extern void SetSubmitParams(VRTextureBounds_t boundsL, VRTextureBounds_t boundsR, EVRSubmitFlags nSubmitFlags);
public EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle, ref VRTextureBounds_t pOverlayTextureBounds) { return(this.FnTable.GetOverlayTextureBounds(ulOverlayHandle, ref pOverlayTextureBounds)); }
public EVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EVRTrackedCameraFrameType eFrameType,ref VRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) { pnWidth = 0; pnHeight = 0; EVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); return result; }
private SteamVR(System.IntPtr pHmd, System.IntPtr pCompositor, System.IntPtr pOverlay) { hmd = new CVRSystem(pHmd); Debug.Log("Connected to " + hmd_TrackingSystemName + ":" + hmd_SerialNumber); compositor = new CVRCompositor(pCompositor); overlay = new CVROverlay(pOverlay); var capacity = compositor.GetLastError(null, 0); if (capacity > 1) { var result = new System.Text.StringBuilder((int)capacity); compositor.GetLastError(result, capacity); Debug.Log("Compositor - " + result); } // Setup render values uint w = 0, h = 0; hmd.GetRecommendedRenderTargetSize(ref w, ref h); sceneWidth = (float)w; sceneHeight = (float)h; float l_left = 0.0f, l_right = 0.0f, l_top = 0.0f, l_bottom = 0.0f; hmd.GetProjectionRaw(Hmd_Eye.Eye_Left, ref l_left, ref l_right, ref l_top, ref l_bottom); float r_left = 0.0f, r_right = 0.0f, r_top = 0.0f, r_bottom = 0.0f; hmd.GetProjectionRaw(Hmd_Eye.Eye_Right, ref r_left, ref r_right, ref r_top, ref r_bottom); tanHalfFov = new Vector2( Mathf.Max(-l_left, l_right, -r_left, r_right), Mathf.Max(-l_top, l_bottom, -r_top, r_bottom)); textureBounds = new VRTextureBounds_t[2]; textureBounds[0].uMin = 0.5f + 0.5f * l_left / tanHalfFov.x; textureBounds[0].uMax = 0.5f + 0.5f * l_right / tanHalfFov.x; textureBounds[0].vMin = 0.5f - 0.5f * l_bottom / tanHalfFov.y; textureBounds[0].vMax = 0.5f - 0.5f * l_top / tanHalfFov.y; textureBounds[1].uMin = 0.5f + 0.5f * r_left / tanHalfFov.x; textureBounds[1].uMax = 0.5f + 0.5f * r_right / tanHalfFov.x; textureBounds[1].vMin = 0.5f - 0.5f * r_bottom / tanHalfFov.y; textureBounds[1].vMax = 0.5f - 0.5f * r_top / tanHalfFov.y; Unity.SetSubmitParams(textureBounds[0], textureBounds[1], VRSubmitFlags_t.Submit_Default); // Grow the recommended size to account for the overlapping fov sceneWidth = sceneWidth / Mathf.Max(textureBounds[0].uMax - textureBounds[0].uMin, textureBounds[1].uMax - textureBounds[1].uMin); sceneHeight = sceneHeight / Mathf.Max(textureBounds[0].vMax - textureBounds[0].vMin, textureBounds[1].vMax - textureBounds[1].vMin); aspect = tanHalfFov.x / tanHalfFov.y; fieldOfView = 2.0f * Mathf.Atan(tanHalfFov.y) * Mathf.Rad2Deg; eyes = new SteamVR_Utils.RigidTransform[] { new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(Hmd_Eye.Eye_Left)), new SteamVR_Utils.RigidTransform(hmd.GetEyeToHeadTransform(Hmd_Eye.Eye_Right)) }; if (SystemInfo.graphicsDeviceVersion.StartsWith("OpenGL")) graphicsAPI = GraphicsAPIConvention.API_OpenGL; else graphicsAPI = GraphicsAPIConvention.API_DirectX; SteamVR_Utils.Event.Listen("initializing", OnInitializing); SteamVR_Utils.Event.Listen("calibrating", OnCalibrating); SteamVR_Utils.Event.Listen("out_of_range", OnOutOfRange); SteamVR_Utils.Event.Listen("device_connected", OnDeviceConnected); SteamVR_Utils.Event.Listen("new_poses", OnNewPoses); }
public EVRCompositorError Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags) { return this.FnTable.Submit(eEye, ref pTexture, ref pBounds, nSubmitFlags); }
public static Mesh CreateHiddenAreaMesh(HiddenAreaMesh_t src, VRTextureBounds_t bounds) { if (src.unTriangleCount == 0) return null; var data = new float[src.unTriangleCount * 3 * 2]; //HmdVector2_t Marshal.Copy(src.pVertexData, data, 0, data.Length); var vertices = new Vector3[src.unTriangleCount * 3 + 12]; var indices = new int[src.unTriangleCount * 3 + 24]; var x0 = 2.0f * bounds.uMin - 1.0f; var x1 = 2.0f * bounds.uMax - 1.0f; var y0 = 2.0f * bounds.vMin - 1.0f; var y1 = 2.0f * bounds.vMax - 1.0f; for (int i = 0, j = 0; i < src.unTriangleCount * 3; i++) { var x = Lerp(x0, x1, data[j++]); var y = Lerp(y0, y1, data[j++]); vertices[i] = new Vector3(x, y, 0.0f); indices[i] = i; } // Add border var offset = (int)src.unTriangleCount * 3; var iVert = offset; vertices[iVert++] = new Vector3(-1, -1, 0); vertices[iVert++] = new Vector3(x0, -1, 0); vertices[iVert++] = new Vector3(-1, 1, 0); vertices[iVert++] = new Vector3(x0, 1, 0); vertices[iVert++] = new Vector3(x1, -1, 0); vertices[iVert++] = new Vector3(1, -1, 0); vertices[iVert++] = new Vector3(x1, 1, 0); vertices[iVert++] = new Vector3(1, 1, 0); vertices[iVert++] = new Vector3(x0, y0, 0); vertices[iVert++] = new Vector3(x1, y0, 0); vertices[iVert++] = new Vector3(x0, y1, 0); vertices[iVert++] = new Vector3(x1, y1, 0); var iTri = offset; indices[iTri++] = offset + 0; indices[iTri++] = offset + 1; indices[iTri++] = offset + 2; indices[iTri++] = offset + 2; indices[iTri++] = offset + 1; indices[iTri++] = offset + 3; indices[iTri++] = offset + 4; indices[iTri++] = offset + 5; indices[iTri++] = offset + 6; indices[iTri++] = offset + 6; indices[iTri++] = offset + 5; indices[iTri++] = offset + 7; indices[iTri++] = offset + 1; indices[iTri++] = offset + 4; indices[iTri++] = offset + 8; indices[iTri++] = offset + 8; indices[iTri++] = offset + 4; indices[iTri++] = offset + 9; indices[iTri++] = offset + 10; indices[iTri++] = offset + 11; indices[iTri++] = offset + 3; indices[iTri++] = offset + 3; indices[iTri++] = offset + 11; indices[iTri++] = offset + 6; var mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = indices; mesh.bounds = new Bounds(Vector3.zero, new Vector3(float.MaxValue, float.MaxValue, float.MaxValue)); // Prevent frustum culling from culling this mesh return mesh; }
public void RenderFrame(params IVRDrawable[] drawables) { if (graphics == null) throw new InvalidOperationException("Cannot render a frame until graphics are initialized"); EyeTextures eyeTextures = graphics.RenderToTextures( CurrentViewProjMatrix(EVREye.Eye_Left), CurrentViewProjMatrix(EVREye.Eye_Right), LeftEyePos, RightEyePos, drawables); Texture_t leftEye = eyeTextures.LeftEye; Texture_t rightEye = eyeTextures.RightEye; // send to the headset VRTextureBounds_t bounds = new VRTextureBounds_t() { uMin = 0, vMin = 0, uMax = 1f, vMax = 1f }; // is this right? EVRCompositorError compErr = OpenVR.Compositor.Submit(EVREye.Eye_Left, ref leftEye, ref bounds, EVRSubmitFlags.Submit_Default); if (compErr != EVRCompositorError.None) throw new InvalidOperationException($"Failed to submit image to compositor: {compErr}"); compErr = OpenVR.Compositor.Submit(EVREye.Eye_Right, ref rightEye, ref bounds, EVRSubmitFlags.Submit_Default); if (compErr != EVRCompositorError.None) throw new InvalidOperationException($"Failed to submit image to compositor: {compErr}"); }
public override EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) { CheckIfUsable(); EVRCompositorError result = VRNativeEntrypoints.VR_IVRCompositor_Submit(m_pVRCompositor,eEye,ref pTexture,ref pBounds,nSubmitFlags); return result; }
// Token: 0x06001FBA RID: 8122 RVA: 0x0009DE54 File Offset: 0x0009C054 public EVROverlayError GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref ETextureType pAPIType, ref EColorSpace pColorSpace, ref VRTextureBounds_t pTextureBounds) { pWidth = 0U; pHeight = 0U; pNativeFormat = 0U; return(this.FnTable.GetOverlayTexture(ulOverlayHandle, ref pNativeTextureHandle, pNativeTextureRef, ref pWidth, ref pHeight, ref pNativeFormat, ref pAPIType, ref pColorSpace, ref pTextureBounds)); }
internal static extern EVRCompositorError VR_IVRCompositor_Submit(IntPtr instancePtr, EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags);
public static Mesh CreateHiddenAreaMesh(HiddenAreaMesh_t src, VRTextureBounds_t bounds) { if (src.unTriangleCount == 0u) { return(null); } float[] array = new float[src.unTriangleCount * 3u * 2u]; Marshal.Copy(src.pVertexData, array, 0, array.Length); Vector3[] array2 = new Vector3[src.unTriangleCount * 3u + 12u]; int[] array3 = new int[src.unTriangleCount * 3u + 24u]; float num = 2f * bounds.uMin - 1f; float num2 = 2f * bounds.uMax - 1f; float num3 = 2f * bounds.vMin - 1f; float num4 = 2f * bounds.vMax - 1f; int num5 = 0; int num6 = 0; while ((long)num5 < (long)((ulong)(src.unTriangleCount * 3u))) { float x = SteamVR_Utils.Lerp(num, num2, array[num6++]); float y = SteamVR_Utils.Lerp(num3, num4, array[num6++]); array2[num5] = new Vector3(x, y, 0f); array3[num5] = num5; num5++; } int num7 = (int)(src.unTriangleCount * 3u); int num8 = num7; array2[num8++] = new Vector3(-1f, -1f, 0f); array2[num8++] = new Vector3(num, -1f, 0f); array2[num8++] = new Vector3(-1f, 1f, 0f); array2[num8++] = new Vector3(num, 1f, 0f); array2[num8++] = new Vector3(num2, -1f, 0f); array2[num8++] = new Vector3(1f, -1f, 0f); array2[num8++] = new Vector3(num2, 1f, 0f); array2[num8++] = new Vector3(1f, 1f, 0f); array2[num8++] = new Vector3(num, num3, 0f); array2[num8++] = new Vector3(num2, num3, 0f); array2[num8++] = new Vector3(num, num4, 0f); array2[num8++] = new Vector3(num2, num4, 0f); int num9 = num7; array3[num9++] = num7; array3[num9++] = num7 + 1; array3[num9++] = num7 + 2; array3[num9++] = num7 + 2; array3[num9++] = num7 + 1; array3[num9++] = num7 + 3; array3[num9++] = num7 + 4; array3[num9++] = num7 + 5; array3[num9++] = num7 + 6; array3[num9++] = num7 + 6; array3[num9++] = num7 + 5; array3[num9++] = num7 + 7; array3[num9++] = num7 + 1; array3[num9++] = num7 + 4; array3[num9++] = num7 + 8; array3[num9++] = num7 + 8; array3[num9++] = num7 + 4; array3[num9++] = num7 + 9; array3[num9++] = num7 + 10; array3[num9++] = num7 + 11; array3[num9++] = num7 + 3; array3[num9++] = num7 + 3; array3[num9++] = num7 + 11; array3[num9++] = num7 + 6; return(new Mesh { vertices = array2, triangles = array3, bounds = new Bounds(Vector3.zero, new Vector3(float.MaxValue, float.MaxValue, float.MaxValue)) }); }
public void DisplayEye(IntPtr nativePointer) { VRTextureBounds_t tboud = new VRTextureBounds_t(); Texture_t tex; tex.eType = EGraphicsAPIConvention.API_DirectX; tex.eColorSpace = EColorSpace.Auto; tex.handle = nativePointer;// MyRender11.Backbuffer.m_resource.NativePointer; tboud.vMin = 0; tboud.vMax = 1; tboud.uMin = m_outsideLimit / 2; tboud.uMax = (1-m_insideLimit) / 2; var error = m_vrCompositor.Submit(EVREye.Eye_Left, ref tex, ref tboud, EVRSubmitFlags.Submit_Default); tboud.uMin = 0.5f + m_insideLimit / 2; tboud.uMax = 0.5f + (1-m_outsideLimit) / 2; var error2 = m_vrCompositor.Submit(EVREye.Eye_Right, ref tex, ref tboud, EVRSubmitFlags.Submit_Default); //FrameDone(); if (debug_var) m_vrCompositor.CompositorDumpImages(); }
public abstract EVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle,ref VRTextureBounds_t pOverlayTextureBounds);
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.graphicsAPI; 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); } }
public EVRCompositorError Submit(EVREye eEye,ref Texture_t pTexture,ref VRTextureBounds_t pBounds,EVRSubmitFlags nSubmitFlags) { EVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); return result; }
public EVRCompositorError GetLastPoseForTrackedDeviceIndex(uint unDeviceIndex, ref TrackedDevicePose_t pOutputPose, ref TrackedDevicePose_t pOutputGamePose) => default; // 0x00000001811DD660-0x00000001811DD690 public EVRCompositorError Submit(EVREye eEye, ref Texture_t pTexture, ref VRTextureBounds_t pBounds, EVRSubmitFlags nSubmitFlags) => default; // 0x00000001811DD9A0-0x00000001811DD9D0