public HmdSwapTextureSet(IntPtr hmdPtr, Device device, int width, int height) { var cDesc = new _D3D11_TEXTURE2D_DESC() { Width = (uint)width, Height = (uint)height, MipLevels = (uint)1, ArraySize = (uint)1, Format = (uint)DrawSystem.GetRenderTargetFormat(), SampleDesc_Count = (uint)1, SampleDesc_Quality = (uint)0, Usage = (uint)ResourceUsage.Default, BindFlags = (uint)(BindFlags.RenderTarget | BindFlags.ShaderResource), CPUAccessFlags = (uint)CpuAccessFlags.None, MiscFlags = (uint)ResourceOptionFlags.None, }; unsafe { IntPtr textureSetPtr; int result = LibOVR.ovrHmd_CreateSwapTextureSetD3D11(hmdPtr, device.NativePointer, (IntPtr)(&cDesc), out textureSetPtr); if (result != 0) { MessageBox.Show("Failed to ovrHmd_CreateSwapTexturesetD3D11() code=" + result); return; } var textureSet = CRef <LibOVR.ovrSwapTextureSet> .FromPtr(textureSetPtr); if (textureSet == null) { return; } var textureList = new List <CRef <LibOVR.ovrTexture> >(); for (int texIndex = 0; texIndex < textureSet.Value.TextureCount; ++texIndex) { IntPtr texPtr = textureSet.Value.Textures + sizeof(LibOVR.ovrTexture) * texIndex; var tex = CRef <LibOVR.ovrTexture> .FromPtr(texPtr); textureList.Add(tex); } m_hmdPtr = hmdPtr; m_textureSet = textureSet; m_textures = textureList.ToArray(); } var csize = m_textures[0].Value.Header.TextureSize; m_resolution = new Size(csize.w, csize.h); // make SharpDx resource m_textureResList = m_textures.Select(t => new Texture2D(t.Value.Texture)).ToList(); // make and set texture views m_renderTargetViewList = m_textureResList.Select(t => new RenderTargetView(device, t)).ToList(); _SetTextureView(0, m_renderTargetViewList[0]); _SetTextureView(1, m_renderTargetViewList[1]); }
private Matrix _CalcProjection(int eyeIndex, float nearClip, float farClip) { var fov = m_hmd.GetEyeFovs()[eyeIndex]; uint flag = (uint)LibOVR.ovrProjectionModifier.None; LibOVR.ovrMatrix4f ovrProj = LibOVR.ovrMatrix4f_Projection(fov, nearClip, farClip, flag); Matrix tmp = new Matrix(); tmp.M11 = ovrProj.M11; tmp.M12 = ovrProj.M21; tmp.M13 = ovrProj.M31; tmp.M14 = ovrProj.M41; tmp.M21 = ovrProj.M12; tmp.M22 = ovrProj.M22; tmp.M23 = ovrProj.M32; tmp.M24 = ovrProj.M42; tmp.M31 = ovrProj.M13; tmp.M32 = ovrProj.M23; tmp.M33 = ovrProj.M33; tmp.M34 = ovrProj.M43; tmp.M41 = ovrProj.M14; tmp.M42 = ovrProj.M24; tmp.M43 = ovrProj.M34; tmp.M44 = ovrProj.M44; return(tmp); }
static public void Dispose() { if (s_singleton.m_hmdDevice != null) { s_singleton.m_hmdDevice.Dispose(); s_singleton.m_hmdDevice = null; } LibOVR.ovr_Shutdown(); }
public void Dispose() { if (m_mirrorTexturePtr != IntPtr.Zero) { LibOVR.ovrHmd_DestroyMirrorTexture(m_hmdPtr, m_mirrorTexturePtr); m_mirrorTexturePtr = IntPtr.Zero; m_hmdPtr = IntPtr.Zero; m_texture = null; } }
public void Dispose() { if (m_isDisposed) { return; } LibOVR.ovrHmd_Destroy(m_handle.Ptr); m_isDisposed = true; }
public void BeginScene() { // update m_tmpEyePoses LibOVR.ovrFrameTiming ftiming = LibOVR.ovrHmd_GetFrameTiming(m_handle.Ptr, 0); LibOVR.ovrTrackingState hmdState = LibOVR.ovrHmd_GetTrackingState(m_handle.Ptr, ftiming.DisplayMidpointSeconds); var hmdToEyeOffsets = new LibOVR.ovrVector3f[] { m_eyeDescArray[0].HmdtoEyeViewOffset, m_eyeDescArray[1].HmdtoEyeViewOffset }; LibOVR.ovr_CalcEyePoses(hmdState.HeadPose.ThePose, hmdToEyeOffsets, m_tmpEyePoses); }
public void Dispose() { foreach (var renderTargetView in m_renderTargetViewList) { renderTargetView.Dispose(); } m_renderTargetViewList.Clear(); LibOVR.ovrHmd_DestroySwapTextureSet(m_hmdPtr, m_textureSet.Ptr); m_textureSet.Clear(); m_textures = null; }
public void SwitchPerfDisplay() { #if DEBUG int[] table = { (int)LibOVR.ovrPerHudMode.Off, (int)LibOVR.ovrPerHudMode.LatencyTiming, (int)LibOVR.ovrPerHudMode.RenderTiming, }; m_perfModeIndex = (m_perfModeIndex + 1) % table.Length; LibOVR.ovrHmd_SetInt(m_handle.Ptr, "PerfHudMode", table[m_perfModeIndex]); #endif }
private HmdSystem() { //var initParams = new LibOVR.ovrInitParams; //initParams.Flags = 0; if (LibOVR.ovr_Initialize(IntPtr.Zero) != 0) { MessageBox.Show("Failed to initialize LibOVR."); return; } string version = CRef <string> .FromCharPtr(LibOVR.ovr_GetVersionString()).Value; int detect = LibOVR.ovrHmd_Detect(); Debug.Print("[HMD] sdk version = {0}", version); Debug.Print("[HMD] detected device count = {0}", detect); }
/// <summary> /// set up device /// </summary> /// <param name="d3d">d3d data</param> /// <param name="renderTarget">render target of back buffer</param> public void Setup(DrawSystem.D3DData d3d, RenderTarget renderTarget) { uint hmdCaps = (uint)LibOVR.ovrHmdCaps.LowPersistence | (uint)LibOVR.ovrHmdCaps.DynamicPrediction; LibOVR.ovrHmd_SetEnabledCaps(m_handle.Ptr, hmdCaps); uint trackingCaps = (uint)LibOVR.ovrTrackingCaps.Orientation | (uint)LibOVR.ovrTrackingCaps.MagYawCorrection | (uint)LibOVR.ovrTrackingCaps.Position; if (LibOVR.ovrHmd_ConfigureTracking(m_handle.Ptr, trackingCaps, 0) != 0) { MessageBox.Show("Failed to ConfigureTracking()"); Application.Exit(); } m_eyeDescArray = new LibOVR.ovrEyeRenderDesc[2]; m_eyeDescArray[0] = LibOVR.ovrHmd_GetRenderDesc(m_handle.Ptr, LibOVR.ovrEyeType.Left, m_handle.Value.DefaultEyeFov[0]); m_eyeDescArray[1] = LibOVR.ovrHmd_GetRenderDesc(m_handle.Ptr, LibOVR.ovrEyeType.Right, m_handle.Value.DefaultEyeFov[1]); }
/// <summary> /// get the first detected hmd device /// </summary> /// <returns> /// detected hmd /// </returns> public HmdDevice DetectHmd() { IntPtr hmdPtr; if (LibOVR.ovrHmd_Create(0, out hmdPtr) != 0) { MessageBox.Show("Oculus Rift not detected."); return(null); } var hmd = CRef <LibOVR.ovrHmdDesc> .FromPtr(hmdPtr); if (hmd == null) { return(null); } else { m_hmdDevice = new HmdDevice(hmd); return(m_hmdDevice); } }
public HmdMirrorTexture(IntPtr hmdPtr, Device device, int width, int height) { var cDesc = new _D3D11_TEXTURE2D_DESC() { Width = (uint)width, Height = (uint)height, MipLevels = (uint)1, ArraySize = (uint)1, Format = (uint)DrawSystem.GetRenderTargetFormat(), SampleDesc_Count = (uint)1, SampleDesc_Quality = (uint)0, Usage = (uint)ResourceUsage.Default, BindFlags = (uint)BindFlags.None, CPUAccessFlags = (uint)CpuAccessFlags.None, MiscFlags = (uint)ResourceOptionFlags.None, }; unsafe { IntPtr mirrorTexturePtr; int result = LibOVR.ovrHmd_CreateMirrorTextureD3D11(hmdPtr, device.NativePointer, (IntPtr)(&cDesc), out mirrorTexturePtr); if (result != 0) { MessageBox.Show("Failed to ovrHmd_CreateMirrorTextureD3D11() code=" + result); return; } IntPtr nativeTexturePtr = ((LibOVR.ovrTexture *)mirrorTexturePtr)->Texture; var texture = new Texture2D(nativeTexturePtr); // succeeded all m_mirrorTexturePtr = mirrorTexturePtr; m_hmdPtr = hmdPtr; m_texture = texture; } }
public void EndScene(HmdSwapTextureSet leftEyeSwapTextureSet, HmdSwapTextureSet rightEyeSwapTextureSet) { LibOVR.ovrLayerEyeFov layer = new LibOVR.ovrLayerEyeFov(); layer.Header.Type = LibOVR.ovrLayerType.EyeFov; layer.Header.Flags = (uint)LibOVR.ovrLayerFlags.HighQuality; layer.ColorTexture_Left = leftEyeSwapTextureSet.Ptr; layer.ColorTexture_Right = rightEyeSwapTextureSet.Ptr; layer.Viewport_Left = ToOvrRecti(leftEyeSwapTextureSet.Resolution); layer.Viewport_Right = ToOvrRecti(rightEyeSwapTextureSet.Resolution); layer.Fov_Left = m_handle.Value.DefaultEyeFov[0]; layer.Fov_Right = m_handle.Value.DefaultEyeFov[1]; layer.RnderPose_Left = m_tmpEyePoses[0]; layer.RnderPose_Right = m_tmpEyePoses[1]; unsafe { void *layerList = &layer; int result = LibOVR.ovrHmd_SubmitFrame(m_handle.Ptr, 0, IntPtr.Zero, (IntPtr)(&layerList), 1); if (result != 0) { // is invisible next frame @todo } } }
public void ResetPose() { LibOVR.ovrHmd_RecenterPose(m_handle.Ptr); }