void OculusVRDebug::OnRender(const ovrSession session, const ovrTrackingState &trackingState, const ovrEyeRenderDesc *eyeRenderDescs, const ovrSizei &eyeTextureSize) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glActiveTexture(GL_TEXTURE0); static const float xPos = -0.3f; static const float ySpacing = 0.05f; std::stringstream statsStream; char buf[128]; float hmdYaw, hmdPitch, hmdRoll; ovrHmdDesc hmdDesc = ovr_GetHmdDesc(session); OVR::Quatf headOrientation(trackingState.HeadPose.ThePose.Orientation); headOrientation.GetEulerAngles<OVR::Axis_Y, OVR::Axis_X, OVR::Axis_Z>(&hmdYaw, &hmdPitch, &hmdRoll); OVR::OVR_sprintf(buf, sizeof(buf), "HMD YPR:%2.0f %2.0f %2.0f HMD: %s", hmdYaw * PIdiv180inv, hmdPitch * PIdiv180inv, hmdRoll * PIdiv180inv, hmdDesc.ProductName); m_font->drawText(buf, xPos, 0.1f, 0.f); OVR::OVR_sprintf(buf, sizeof(buf), "FPS: %.1f ms/frame: %.1f Frame: %03d %d", m_fps, m_secondsPerFrame * 1000.0f, m_frameCounter, m_totalFrameCounter % 2); m_font->drawText(buf, xPos, 0.1f - ySpacing, 0.f); OVR::OVR_sprintf(buf, sizeof(buf), "Pos: %2.2f %2.2f %2.2f Tracking: %s", g_cameraDirector.GetActiveCamera()->Position().m_x, g_cameraDirector.GetActiveCamera()->Position().m_y, g_cameraDirector.GetActiveCamera()->Position().m_z, trackingState.StatusFlags & ovrStatus_PositionTracked ? "YES" : "NO"); m_font->drawText(buf, xPos, 0.1f - ySpacing * 2.f, 0.f); OVR::OVR_sprintf(buf, sizeof(buf), "EyeHeight: %2.2f IPD: %2.1fmm", ovr_GetFloat(session, OVR_KEY_EYE_HEIGHT, 0.f), ovr_GetFloat(session, OVR_KEY_IPD, 0.f) * 1000.f); m_font->drawText(buf, xPos, 0.1f - ySpacing * 3.f, 0.f); // Average FOVs OVR::FovPort leftFov = eyeRenderDescs[0].Fov; OVR::FovPort rightFov = eyeRenderDescs[1].Fov; // Rendered size changes based on selected options & dynamic rendering. OVR::OVR_sprintf(buf, sizeof(buf), "FOV %2.1fx%2.1f, Resolution: %ix%i", (leftFov.GetHorizontalFovDegrees() + rightFov.GetHorizontalFovDegrees()) * 0.5f, (leftFov.GetVerticalFovDegrees() + rightFov.GetVerticalFovDegrees()) * 0.5, eyeTextureSize.w, eyeTextureSize.h); m_font->drawText(buf, xPos, 0.1f - ySpacing * 4.f, 0.f); // latency readings float latencies[5] = {}; if (ovr_GetFloatArray(session, "DK2Latency", latencies, 5) == 5) { char text[5][32]; for (int i = 0; i < 5; ++i) { FormatLatencyReading(text[i], sizeof(text[i]), latencies[i]); } statsStream.str(""); statsStream << "M2P Latency Ren: " << text[0] << " TWrp: " << text[1]; m_font->drawText(statsStream.str(), xPos, 0.1f - ySpacing * 5.f, 0.f); statsStream.str(""); statsStream << "PostPresent: " << text[2] << " Err: " << text[3] << " " << text[4]; m_font->drawText(statsStream.str(), xPos, 0.1f - ySpacing * 6.f, 0.f); } }
void VRImplOVR::connect(VRDesc* _desc) { ovrGraphicsLuid luid; ovrResult result = ovr_Create(&m_session, &luid); if (!OVR_SUCCESS(result)) { BX_TRACE("Failed to create OVR device."); return; } BX_STATIC_ASSERT(sizeof(_desc->m_adapterLuid) >= sizeof(luid)); memcpy(&_desc->m_adapterLuid, &luid, sizeof(luid)); ovrHmdDesc hmdDesc = ovr_GetHmdDesc(m_session); _desc->m_deviceType = hmdDesc.Type; _desc->m_refreshRate = hmdDesc.DisplayRefreshRate; _desc->m_deviceSize.m_w = hmdDesc.Resolution.w; _desc->m_deviceSize.m_h = hmdDesc.Resolution.h; BX_TRACE("OVR HMD: %s, %s, firmware: %d.%d" , hmdDesc.ProductName , hmdDesc.Manufacturer , hmdDesc.FirmwareMajor , hmdDesc.FirmwareMinor ); ovrSizei eyeSize[2] = { ovr_GetFovTextureSize(m_session, ovrEye_Left, hmdDesc.DefaultEyeFov[0], 1.0f), ovr_GetFovTextureSize(m_session, ovrEye_Right, hmdDesc.DefaultEyeFov[0], 1.0f), }; for (int eye = 0; eye < 2; ++eye) { BX_STATIC_ASSERT(sizeof(_desc->m_eyeFov[eye]) == sizeof(hmdDesc.DefaultEyeFov[eye])); memcpy(&_desc->m_eyeFov[eye], &hmdDesc.DefaultEyeFov[eye], sizeof(_desc->m_eyeFov[eye])); _desc->m_eyeSize[eye].m_w = eyeSize[eye].w; _desc->m_eyeSize[eye].m_h = eyeSize[eye].h; } float neckOffset[2] = {OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL}; ovr_GetFloatArray(m_session, OVR_KEY_NECK_TO_EYE_DISTANCE, neckOffset, 2); _desc->m_neckOffset[0] = neckOffset[0]; _desc->m_neckOffset[1] = neckOffset[1]; // build constant layer settings m_renderLayer.Header.Type = ovrLayerType_EyeFov; m_renderLayer.Header.Flags = 0; for (int eye = 0; eye < 2; ++eye) { m_renderLayer.Fov[eye] = hmdDesc.DefaultEyeFov[eye]; m_renderLayer.Viewport[eye].Pos.x = 0; m_renderLayer.Viewport[eye].Pos.y = 0; m_renderLayer.Viewport[eye].Size = eyeSize[eye]; } m_viewScale.HmdSpaceToWorldScaleInMeters = 1.0f; for (int eye = 0; eye < 2; ++eye) { ovrEyeRenderDesc erd = ovr_GetRenderDesc(m_session, static_cast<ovrEyeType>(eye), hmdDesc.DefaultEyeFov[eye]); m_viewScale.HmdToEyeOffset[eye] = erd.HmdToEyeOffset; m_eyeFov[eye] = erd.Fov; m_pixelsPerTanAngleAtCenter[eye] = erd.PixelsPerTanAngleAtCenter; } }