void OculusWorldDemoApp::CenterPupilDepthChange(OptionVar*) { ovrHmd_SetFloat(Hmd, "CenterPupilDepth", CenterPupilDepthMeters); }
int OVRConfigureRenderer(int width, int height, float znear, float zfar, float ipd, float multisample, int lowpersistence, int dynamicprediction, int vsync, int chromatic, int timewarp, int vignette, int state, int flip, int srgb, int overdrive, int profile) { unsigned hmdCaps; unsigned int distortionCaps; ovrFovPort eyeFov[EYE_ALL] = { _OVRGlobals.HMD->DefaultEyeFov[EYE_LEFT], _OVRGlobals.HMD->DefaultEyeFov[EYE_RIGHT] }; float FovSideTanMax = OVR::FovPort::Max(_OVRGlobals.HMD->DefaultEyeFov[EYE_LEFT], _OVRGlobals.HMD->DefaultEyeFov[EYE_RIGHT]).GetMaxSideTan(); //float FovSideTanLimit = OVR::FovPort::Max(_OVRGlobals.HMD->MaxEyeFov[EYE_LEFT], _OVRGlobals.HMD->MaxEyeFov[EYE_RIGHT]).GetMaxSideTan(); ovrBool didSetIPD = 0; // generate the HMD and distortion caps hmdCaps = (lowpersistence ? ovrHmdCap_LowPersistence : 0) | (dynamicprediction ? ovrHmdCap_DynamicPrediction : 0) | (vsync ? 0 : ovrHmdCap_NoVSync); distortionCaps = (chromatic ? ovrDistortionCap_Chromatic : 0) | (timewarp ? ovrDistortionCap_TimeWarp : 0) | (vignette ? ovrDistortionCap_Vignette : 0) | (state ? 0 : ovrDistortionCap_NoRestore) | (flip ? ovrDistortionCap_FlipInput : 0) | (srgb ? ovrDistortionCap_SRGB : 0) | (overdrive ? ovrDistortionCap_Overdrive : 0) | (profile ? ovrDistortionCap_ProfileNoTimewarpSpinWaits : 0); didSetIPD = ovrHmd_SetFloat( _OVRGlobals.HMD, OVR_KEY_IPD, ipd * 0.001 ); ovrHmd_SetEnabledCaps( _OVRGlobals.HMD, hmdCaps ); ovrRenderAPIConfig config = ovrRenderAPIConfig(); config.Header.API = ovrRenderAPI_OpenGL; config.Header.RTSize.w = width; config.Header.RTSize.h = height; config.Header.Multisample = multisample > 1 ? 1 : 0; // clamp fov eyeFov[EYE_LEFT] = OVR::FovPort::Min(eyeFov[EYE_LEFT], OVR::FovPort(FovSideTanMax)); eyeFov[EYE_RIGHT] = OVR::FovPort::Min(eyeFov[EYE_RIGHT], OVR::FovPort(FovSideTanMax)); if ( !ovrHmd_ConfigureRendering( _OVRGlobals.HMD, &config, distortionCaps, eyeFov, _OVRGlobals.EyeRenderDesc ) ) { return 0; } #ifdef DEBUG ovrhmd_EnableHSWDisplaySDKRender( _OVRGlobals.HMD, false ); #else ovrHmd_DismissHSWDisplay( _OVRGlobals.HMD ); #endif _OVRGlobals.IPD = ovrHmd_GetFloat( _OVRGlobals.HMD, OVR_KEY_IPD, ipd * 0.001 ); // create the projection _OVRGlobals.Eye[EYE_LEFT].Projection = ovrMatrix4f_Projection( _OVRGlobals.EyeRenderDesc[EYE_LEFT].Fov, znear, zfar, true ); _OVRGlobals.Eye[EYE_RIGHT].Projection = ovrMatrix4f_Projection( _OVRGlobals.EyeRenderDesc[EYE_RIGHT].Fov, znear, zfar, true ); // transpose the projection OVR::Matrix4 <float>transposeLeft = _OVRGlobals.Eye[EYE_LEFT].Projection; OVR::Matrix4 <float>transposeRight = _OVRGlobals.Eye[EYE_RIGHT].Projection; _OVRGlobals.Eye[EYE_LEFT].Projection = transposeLeft.Transposed(); _OVRGlobals.Eye[EYE_RIGHT].Projection = transposeRight.Transposed(); // TODO: ortho { float orthoDistance = 0.8f; // 2D is 0.8 meter from camera OVR::Vector2f orthoScale0 = OVR::Vector2f(1.0f) / OVR::Vector2f(_OVRGlobals.EyeRenderDesc[EYE_LEFT].PixelsPerTanAngleAtCenter); OVR::Vector2f orthoScale1 = OVR::Vector2f(1.0f) / OVR::Vector2f(_OVRGlobals.EyeRenderDesc[EYE_RIGHT].PixelsPerTanAngleAtCenter); _OVRGlobals.Eye[EYE_LEFT].OrthoProjection = ovrMatrix4f_OrthoSubProjection(_OVRGlobals.Eye[EYE_LEFT].Projection, orthoScale0, orthoDistance, _OVRGlobals.EyeRenderDesc[EYE_LEFT].ViewAdjust.x); _OVRGlobals.Eye[EYE_RIGHT].OrthoProjection = ovrMatrix4f_OrthoSubProjection(_OVRGlobals.Eye[EYE_RIGHT].Projection, orthoScale1, orthoDistance, _OVRGlobals.EyeRenderDesc[EYE_RIGHT].ViewAdjust.x); OVR::Matrix4 <float>transposeLeftOrtho = _OVRGlobals.Eye[EYE_LEFT].OrthoProjection; OVR::Matrix4 <float>transposeRightOrtho = _OVRGlobals.Eye[EYE_RIGHT].OrthoProjection; _OVRGlobals.Eye[EYE_LEFT].OrthoProjection = transposeLeftOrtho.Transposed(); _OVRGlobals.Eye[EYE_RIGHT].OrthoProjection = transposeRightOrtho.Transposed(); } return 1; }