void GVRActivity::onDrawFrame() { ovrFrameParms parms = vrapi_DefaultFrameParms(&oculusJavaGlThread_, VRAPI_FRAME_INIT_DEFAULT, vrapi_GetTimeInSeconds(), NULL); parms.FrameIndex = ++frameIndex; parms.MinimumVsyncs = 1; parms.PerformanceParms = oculusPerformanceParms_; parms.Layers[VRAPI_FRAME_LAYER_TYPE_WORLD].Flags |= VRAPI_FRAME_LAYER_FLAG_CHROMATIC_ABERRATION_CORRECTION; const double predictedDisplayTime = vrapi_GetPredictedDisplayTime(oculusMobile_, frameIndex); const ovrTracking baseTracking = vrapi_GetPredictedTracking(oculusMobile_, predictedDisplayTime); const ovrHeadModelParms headModelParms = vrapi_DefaultHeadModelParms(); const ovrTracking tracking = vrapi_ApplyHeadModel(&headModelParms, &baseTracking); ovrTracking updatedTracking = vrapi_GetPredictedTracking(oculusMobile_, tracking.HeadPose.TimeInSeconds); updatedTracking.HeadPose.Pose.Position = tracking.HeadPose.Pose.Position; for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ ) { ovrFrameLayerTexture& eyeTexture = parms.Layers[VRAPI_FRAME_LAYER_TYPE_WORLD].Textures[eye]; eyeTexture.ColorTextureSwapChain = frameBuffer_[use_multiview ? 0 : eye].mColorTextureSwapChain; eyeTexture.DepthTextureSwapChain = frameBuffer_[use_multiview ? 0 : eye].mDepthTextureSwapChain; eyeTexture.TextureSwapChainIndex = frameBuffer_[use_multiview ? 0 : eye].mTextureSwapChainIndex; eyeTexture.TexCoordsFromTanAngles = texCoordsTanAnglesMatrix_; eyeTexture.HeadPose = updatedTracking.HeadPose; } if (docked_) { const ovrQuatf& orientation = updatedTracking.HeadPose.Pose.Orientation; const glm::quat tmp(orientation.w, orientation.x, orientation.y, orientation.z); const glm::quat quat = glm::conjugate(glm::inverse(tmp)); cameraRig_->setRotation(quat); } else if (nullptr != cameraRig_) { cameraRig_->updateRotation(); } else { cameraRig_->setRotation(glm::quat()); } if (!sensoredSceneUpdated_ && docked_) { sensoredSceneUpdated_ = updateSensoredScene(); } // Render the eye images. for (int eye = 0; eye < (use_multiview ? 1 :VRAPI_FRAME_LAYER_EYE_MAX); eye++) { beginRenderingEye(eye); oculusJavaGlThread_.Env->CallVoidMethod(viewManager_, onDrawEyeMethodId, eye); endRenderingEye(eye); } FrameBufferObject::unbind(); vrapi_SubmitFrame(oculusMobile_, &parms); }
void OculusHeadRotation::predict(GVRActivity& gvrActivity, const ovrFrameParms& frameParms, const float time) { if (docked_) { ovrMobile* ovr = gvrActivity.getOculusContext(); ovrTracking tracking = vrapi_GetPredictedTracking(ovr, vrapi_GetPredictedDisplayTime(ovr, frameParms.FrameIndex)); tracking = vrapi_ApplyHeadModel(gvrActivity.getOculusHeadModelParms(), &tracking); const ovrQuatf& orientation = tracking.HeadPose.Pose.Orientation; glm::quat quat(orientation.w, orientation.x, orientation.y, orientation.z); gvrActivity.cameraRig_->setRotation(glm::conjugate(glm::inverse(quat))); } else if (nullptr != gvrActivity.cameraRig_) { gvrActivity.cameraRig_->predict(time); } else { gvrActivity.cameraRig_->setRotation(glm::quat()); } }
void GVRActivity::onDrawFrame() { ovrFrameParms parms = vrapi_DefaultFrameParms(&oculusJavaGlThread_, VRAPI_FRAME_INIT_DEFAULT, vrapi_GetTimeInSeconds(), NULL); parms.FrameIndex = ++frameIndex; parms.MinimumVsyncs = 1; parms.PerformanceParms = oculusPerformanceParms_; parms.Layers[VRAPI_FRAME_LAYER_TYPE_WORLD].Flags |= VRAPI_FRAME_LAYER_FLAG_CHROMATIC_ABERRATION_CORRECTION; const double predictedDisplayTime = vrapi_GetPredictedDisplayTime(oculusMobile_, frameIndex); const ovrTracking baseTracking = vrapi_GetPredictedTracking(oculusMobile_, predictedDisplayTime); const ovrHeadModelParms headModelParms = vrapi_DefaultHeadModelParms(); const ovrTracking tracking = vrapi_ApplyHeadModel(&headModelParms, &baseTracking); // Render the eye images. for (int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++) { ovrTracking updatedTracking = vrapi_GetPredictedTracking(oculusMobile_, tracking.HeadPose.TimeInSeconds); updatedTracking.HeadPose.Pose.Position = tracking.HeadPose.Pose.Position; beginRenderingEye(eye); if (!sensoredSceneUpdated_ && headRotationProvider_.receivingUpdates()) { sensoredSceneUpdated_ = updateSensoredScene(); } headRotationProvider_.predict(*this, parms, (1 == eye ? 4.0f : 3.5f) / 60.0f); oculusJavaGlThread_.Env->CallVoidMethod(activityRenderingCallbacks_, onDrawEyeMethodId, eye); ovrFrameLayerTexture& eyeTexture = parms.Layers[VRAPI_FRAME_LAYER_TYPE_WORLD].Textures[eye]; eyeTexture.ColorTextureSwapChain = frameBuffer_[eye].mColorTextureSwapChain; eyeTexture.DepthTextureSwapChain = frameBuffer_[eye].mDepthTextureSwapChain; eyeTexture.TextureSwapChainIndex = frameBuffer_[eye].mTextureSwapChainIndex; for (int layer = 0; layer < VRAPI_FRAME_LAYER_TYPE_MAX; layer++) { parms.Layers[layer].Textures[eye].TexCoordsFromTanAngles = texCoordsTanAnglesMatrix_; parms.Layers[layer].Textures[eye].HeadPose = updatedTracking.HeadPose; } endRenderingEye(eye); } FrameBufferObject::unbind(); vrapi_SubmitFrame(oculusMobile_, &parms); }
void GVRActivity::onDrawFrame(jobject jViewManager) { ovrFrameParms parms = vrapi_DefaultFrameParms(&oculusJavaGlThread_, VRAPI_FRAME_INIT_DEFAULT, vrapi_GetTimeInSeconds(), NULL); parms.FrameIndex = ++frameIndex; parms.MinimumVsyncs = 1; parms.PerformanceParms = oculusPerformanceParms_; const double predictedDisplayTime = vrapi_GetPredictedDisplayTime(oculusMobile_, frameIndex); const ovrTracking baseTracking = vrapi_GetPredictedTracking(oculusMobile_, predictedDisplayTime); const ovrHeadModelParms headModelParms = vrapi_DefaultHeadModelParms(); const ovrTracking tracking = vrapi_ApplyHeadModel(&headModelParms, &baseTracking); ovrTracking updatedTracking = vrapi_GetPredictedTracking(oculusMobile_, tracking.HeadPose.TimeInSeconds); updatedTracking.HeadPose.Pose.Position = tracking.HeadPose.Pose.Position; for ( int eye = 0; eye < VRAPI_FRAME_LAYER_EYE_MAX; eye++ ) { ovrFrameLayerTexture& eyeTexture = parms.Layers[0].Textures[eye]; eyeTexture.ColorTextureSwapChain = frameBuffer_[use_multiview ? 0 : eye].mColorTextureSwapChain; eyeTexture.DepthTextureSwapChain = frameBuffer_[use_multiview ? 0 : eye].mDepthTextureSwapChain; eyeTexture.TextureSwapChainIndex = frameBuffer_[use_multiview ? 0 : eye].mTextureSwapChainIndex; eyeTexture.TexCoordsFromTanAngles = texCoordsTanAnglesMatrix_; eyeTexture.HeadPose = updatedTracking.HeadPose; } parms.Layers[0].Flags |= VRAPI_FRAME_LAYER_FLAG_CHROMATIC_ABERRATION_CORRECTION; if (CameraRig::CameraRigType::FREEZE == cameraRig_->camera_rig_type()) { parms.Layers[0].Flags |= VRAPI_FRAME_LAYER_FLAG_FIXED_TO_VIEW; } if (docked_) { const ovrQuatf& orientation = updatedTracking.HeadPose.Pose.Orientation; const glm::quat tmp(orientation.w, orientation.x, orientation.y, orientation.z); const glm::quat quat = glm::conjugate(glm::inverse(tmp)); cameraRig_->setRotationSensorData(0, quat.w, quat.x, quat.y, quat.z, 0, 0, 0); cameraRig_->updateRotation(); } else if (nullptr != cameraRig_) { cameraRig_->updateRotation(); } else { cameraRig_->setRotation(glm::quat()); } if (!sensoredSceneUpdated_ && docked_) { sensoredSceneUpdated_ = updateSensoredScene(); } // Render the eye images. for (int eye = 0; eye < (use_multiview ? 1 :VRAPI_FRAME_LAYER_EYE_MAX); eye++) { beginRenderingEye(eye); int textureSwapChainIndex = frameBuffer_[eye].mTextureSwapChainIndex; int colorTexture = vrapi_GetTextureSwapChainHandle(frameBuffer_[eye].mColorTextureSwapChain, textureSwapChainIndex); oculusJavaGlThread_.Env->CallVoidMethod(jViewManager, onDrawEyeMethodId, eye, colorTexture); endRenderingEye(eye); } FrameBufferObject::unbind(); // check if the controller is available if (gearController != nullptr && gearController->findConnectedGearController()) { // collect the controller input if available gearController->onFrame(predictedDisplayTime); } vrapi_SubmitFrame(oculusMobile_, &parms); }