/// <summary>
    /// Gets the FOV and resolution.
    /// </summary>
    public static void GetImageInfo(ref int resH, ref int resV, ref float fovH, ref float fovV)
    {
        // Always set to safe values :)
        resH = 1280;
        resV = 800;
        fovH = fovV = 90.0f;

        if (HMD == null || !SupportedPlatform)
        {
            return;
        }

        ovrHmdDesc desc = HMD.GetDesc();
        ovrFovPort fov  = desc.DefaultEyeFov[0];

        fov.LeftTan = fov.RightTan = Mathf.Max(fov.LeftTan, fov.RightTan);
        fov.UpTan   = fov.DownTan = Mathf.Max(fov.UpTan, fov.DownTan);

        // Configure Stereo settings. Default pixel density is 1.0f.
        float    desiredPixelDensity = 1.0f;
        ovrSizei texSize             = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, fov, desiredPixelDensity);

        resH = texSize.w;
        resV = texSize.h;
        fovH = 2f * Mathf.Rad2Deg * Mathf.Atan(fov.LeftTan);
        fovV = 2f * Mathf.Rad2Deg * Mathf.Atan(fov.UpTan);
    }
Exemple #2
0
        public override void Initialize(GraphicsDevice gd)
        {
            _gd = gd;
            if (gd.GetVulkanInfo(out BackendInfoVulkan vkInfo))
            {
                IntPtr    physicalDevice;
                ovrResult result = ovr_GetSessionPhysicalDeviceVk(_session, _luid, vkInfo.Instance, &physicalDevice);
                if (result != ovrResult.Success)
                {
                    throw new VeldridException($"Failed to get Vulkan physical device.");
                }

                result = ovr_SetSynchonizationQueueVk(_session, vkInfo.GraphicsQueue);
                if (result != ovrResult.Success)
                {
                    throw new VeldridException($"Failed to set the Oculus session's Vulkan synchronization queue.");
                }
            }

            _hmdDesc    = ovr_GetHmdDesc(_session);
            _deviceName = _hmdDesc.ProductName.ToString();

            _eyeRenderViewport = new ovrRecti[2];
            _eyeSwapchains     = new OculusSwapchain[2];
            for (int eye = 0; eye < 2; ++eye)
            {
                ovrSizei idealSize = ovr_GetFovTextureSize(
                    _session,
                    (ovrEyeType)eye,
                    _hmdDesc.DefaultEyeFov[eye],
                    1.0f);
                _eyeSwapchains[eye] = new OculusSwapchain(
                    _gd,
                    _session,
                    idealSize.w, idealSize.h,
                    Util.GetSampleCount(_options.EyeFramebufferSampleCount),
                    createDepth: true);
                _eyeRenderViewport[eye].Pos.X = 0;
                _eyeRenderViewport[eye].Pos.Y = 0;
                _eyeRenderViewport[eye].Size  = idealSize;
            }
        }
    /// <summary>
    /// Get resolution of eye texture
    /// </summary>
    /// <param name="w">Width</param>
    /// <param name="h">Height</param>
    public static void GetResolutionEyeTexture(ref int w, ref int h)
    {
        if (HMD == null || !SupportedPlatform)
        {
            return;
        }

        ovrHmdDesc desc = HMD.GetDesc();

        ovrFovPort[] eyeFov = new ovrFovPort[2];

        eyeFov[0] = desc.DefaultEyeFov[0];
        eyeFov[1] = desc.DefaultEyeFov[1];

        ovrSizei recommenedTex0Size = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, desc.DefaultEyeFov[0], 1.0f);
        ovrSizei recommenedTex1Size = HMD.GetFovTextureSize(ovrEyeType.ovrEye_Left, desc.DefaultEyeFov[1], 1.0f);

        w = recommenedTex0Size.w + recommenedTex1Size.w;
        h = (recommenedTex0Size.h + recommenedTex1Size.h) / 2;
    }
Exemple #4
0
        static void Main(string[] args)
        {
            Initialize();
            IntPtr     hmd  = Create(0);
            ovrHmdDesc desc = new ovrHmdDesc();

            GetDesc(hmd, ref desc);

            ovrSizei texture_size_left  = GetFovTextureSize(hmd, ovrEyeType.ovrEye_Left, desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Left], 1.0f);
            ovrSizei texture_size_right = GetFovTextureSize(hmd, ovrEyeType.ovrEye_Right, desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Right], 1.0f);

            ovrSizei rt_size = new ovrSizei(texture_size_left.w + texture_size_right.w, (texture_size_left.h > texture_size_right.h) ? texture_size_left.h : texture_size_right.h);

            // Initialize eye rendering information for ovrHmd_Configure.
            // The viewport sizes are re-computed in case RenderTargetSize changed due to HW limitations.
            ovrEyeDesc[] eyes = new ovrEyeDesc[2];
            eyes[0].Eye                 = ovrEyeType.ovrEye_Left;
            eyes[1].Eye                 = ovrEyeType.ovrEye_Right;
            eyes[0].Fov                 = desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Left];
            eyes[1].Fov                 = desc.DefaultEyeFov()[(int)ovrEyeType.ovrEye_Right];
            eyes[0].TextureSize         = rt_size;
            eyes[1].TextureSize         = rt_size;
            eyes[0].RenderViewport.Pos  = new ovrVector2i(0, 0);
            eyes[0].RenderViewport.Size = new ovrSizei(rt_size.w / 2, rt_size.h);
            eyes[1].RenderViewport.Pos  = new ovrVector2i((rt_size.w + 1) / 2, 0);
            eyes[1].RenderViewport.Size = eyes[0].RenderViewport.Size;

            ovrEyeRenderDesc[] renderDesc = new ovrEyeRenderDesc[2];

            ovrD3D9ConfigData renderConfigData = new ovrD3D9ConfigData();

            //real pointer (IDirect3DDevice9*) to device
            renderConfigData.Device = (IntPtr)0;
            renderConfigData.Header = new ovrRenderAPIConfigHeader
            {
                API         = ovrRenderAPIType.ovrRenderAPI_D3D9,
                Multisample = 1,
                RTSize      = new ovrSizei(desc.Resolution.w, desc.Resolution.h)
            };

            ovrD3D9Texture[] textures = new ovrD3D9Texture[2];

            if (ConfigureRendering(hmd, ref renderConfigData, 0, ovrDistortionCaps.ovrDistortion_Chromatic | ovrDistortionCaps.ovrDistortion_TimeWarp, eyes, renderDesc))
            {
                StartSensor(hmd, ovrHmdCapBits.ovrHmdCap_Orientation | ovrHmdCapBits.ovrHmdCap_YawCorrection | ovrHmdCapBits.ovrHmdCap_LatencyTest, 0);
                //while true
                BeginFrame(hmd, 0);
                for (int eyeIndex = 0; eyeIndex < (int)ovrEyeType.ovrEye_Count; eyeIndex++)
                {
                    ovrEyeType eye           = desc.EyeRenderOrder()[eyeIndex];
                    ovrPosef   eyeRenderPose = BeginEyeRender(hmd, eye);

                    ovrSensorState sensor_state = GetSensorState(hmd, 0.0);

                    EndEyeRender(hmd, eye, eyeRenderPose, ref textures[eyeIndex]);
                }
                EndFrame(hmd);
                //end while
                StopSensor(hmd);
            }
            Shutdown();
        }