Ejemplo n.º 1
0
        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]);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 static public void Dispose()
 {
     if (s_singleton.m_hmdDevice != null)
     {
         s_singleton.m_hmdDevice.Dispose();
         s_singleton.m_hmdDevice = null;
     }
     LibOVR.ovr_Shutdown();
 }
Ejemplo n.º 4
0
 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;
     }
 }
Ejemplo n.º 5
0
        public void Dispose()
        {
            if (m_isDisposed)
            {
                return;
            }

            LibOVR.ovrHmd_Destroy(m_handle.Ptr);
            m_isDisposed = true;
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
        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
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        /// <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]);
        }
Ejemplo n.º 11
0
        /// <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);
            }
        }
Ejemplo n.º 12
0
        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;
            }
        }
Ejemplo n.º 13
0
        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
                }
            }
        }
Ejemplo n.º 14
0
 public void ResetPose()
 {
     LibOVR.ovrHmd_RecenterPose(m_handle.Ptr);
 }