void OculusInterface::oculusDisplayWarning() { // Health and Safety Warning display state. ovrHSWDisplayState hswDisplayState; ovrHmd_GetHSWDisplayState(m_hmd, &hswDisplayState); if (hswDisplayState.Displayed) { // Dismiss the warning if the user pressed the appropriate key or if the user // is tapping the side of the HMD. // If the user has requested to dismiss the warning via keyboard or controller input... if (m_warningOff) ovrHmd_DismissHSWDisplay(m_hmd); else { // Detect a moderate tap on the side of the HMD. ovrTrackingState ts = ovrHmd_GetTrackingState(m_hmd, ovr_GetTimeInSeconds()); if (ts.StatusFlags & ovrStatus_OrientationTracked) { const OVR::Vector3f v(ts.RawSensorData.Accelerometer.x, ts.RawSensorData.Accelerometer.y, ts.RawSensorData.Accelerometer.z); // Arbitrary value and representing moderate tap on the side of the DK2 Rift. if (v.LengthSq() > 250.f) ovrHmd_DismissHSWDisplay(m_hmd); } } } }
void OcculusCameraComponent::update( float dt ) { //Occulus warning // Health and Safety Warning display state. ovrHSWDisplayState hswDisplayState; ovrHmd_GetHSWDisplayState(hmd, &hswDisplayState); if (hswDisplayState.Displayed) { // Dismiss the warning if the user pressed the appropriate key or if the user // is tapping the side of the HMD. // If the user has requested to dismiss the warning via keyboard or controller input... //if (Util_GetAndResetHSWDismissedState()) // ovrHmd_DismissHSWDisplay(hmd); //else { // Detect a moderate tap on the side of the HMD. ovrTrackingState ts = ovrHmd_GetTrackingState(hmd, ovr_GetTimeInSeconds()); if (ts.StatusFlags & ovrStatus_OrientationTracked) { const OVR::Vector3f v(ts.RawSensorData.Accelerometer.x, ts.RawSensorData.Accelerometer.y, ts.RawSensorData.Accelerometer.z); // Arbitrary value and representing moderate tap on the side of the DK2 Rift. if (v.LengthSq() > 250.f) ovrHmd_DismissHSWDisplay(hmd); } } } dt; // Query the HMD for the current tracking state. ovrTrackingState ts = ovrHmd_GetTrackingState(hmd, ovr_GetTimeInSeconds()); if (ts.StatusFlags & (ovrStatus_OrientationTracked | ovrStatus_PositionTracked)) { ovrPosef pose = ts.HeadPose.ThePose; //convert to mat4 if desired glm::mat4 transformMatrix = glm::mat4_cast( fromOVR( pose.Orientation ) ); //parent->gc<TransformComponent>()->setRotation( glm::mat3(transformMatrix) ); } parent->getStage()->subscribeRender( this ); }
///@brief This function will detect a moderate tap on the Rift via the accelerometer. ///@return true if a tap was detected, false otherwise. bool RiftAppSkeleton::CheckForTapOnHmd() { const ovrTrackingState ts = ovrHmd_GetTrackingState(m_Hmd, ovr_GetTimeInSeconds()); if (!(ts.StatusFlags & ovrStatus_OrientationTracked)) return false; const OVR::Vector3f v(ts.RawSensorData.Accelerometer); // Arbitrary value and representing moderate tap on the side of the DK2 Rift. if (v.LengthSq() > 250.f) { // Limit tapping rate static double lastTapTime = 0.0; if (ovr_GetTimeInSeconds() - lastTapTime > 0.5) { lastTapTime = ovr_GetTimeInSeconds(); DismissHealthAndSafetyWarning(); ToggleShaderWorld(); return true; } } return false; }
bool HSWDisplay::TickState(ovrHSWDisplayState *hswDisplayState) { bool newlyDisplayed = false; const double currentTime = ovr_GetTimeInSeconds(); // See if we need to be currently displayed. By design we automatically display but don't automatically dismiss. if (Displayed) { if (DismissRequested) // If dismiss was previously requested, see if it can be executed. Dismiss(); if (Displayed) // If not already dismissed above... { // We currently have the debug behavior that we permit dismiss very soon after launch. #if defined(OVR_BUILD_DEBUG) if(currentTime >= (StartTime + 2)) { DismissibleTime = StartTime; //Dismiss(); } #endif } if (Displayed) // If not already dismissed above... { const ovrTrackingState ts = ((OVR::CAPI::HMDState*)HMD->Handle)->PredictedTrackingState(currentTime); if (ts.StatusFlags & ovrStatus_OrientationTracked) // If the Accelerometer data is valid... { const OVR::Vector3f v(ts.HeadPose.LinearAcceleration.x, ts.HeadPose.LinearAcceleration.y, ts.HeadPose.LinearAcceleration.z); const float minTapMagnitude = 350.0f; // Empirically determined by some testing. if (v.LengthSq() > minTapMagnitude) Dismiss(); // This will do nothing if the display is not present. } } } else { if (Enabled && (currentTime >= (LastPollTime + HSWDISPLAY_POLL_INTERVAL))) { LastPollTime = currentTime; // We need to display if any of the following are true: // - The application is just started in Event Mode while the HMD is mounted (warning display would be viewable) and this app was not spawned from a launcher. // - The current user has never seen the display yet while the HMD is mounted (warning display would be viewable). // - The HMD is newly mounted (or the warning display is otherwise newly viewable). // - The warning display hasn't shown in 24 hours (need to verify this as a requirement). // Event Mode refers to when the app is being run in a public demo event such as a trade show. OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)HMD->Handle; if(pHMDState) { const time_t lastDisplayedTime = HSWDisplay::GetCurrentProfileLastHSWTime(); // We currently unilaterally set HMDMounted to true because we don't yet have the ability to detect this. To do: Implement this when possible. const bool previouslyMounted = HMDMounted; HMDMounted = true; HMDNewlyMounted = (!previouslyMounted && HMDMounted); // We set this back to false in the Display function or if the HMD is unmounted before then. if((lastDisplayedTime == HSWDisplayTimeNever) || HMDNewlyMounted) { if(IsDisplayViewable()) // If the HMD is mounted and otherwise being viewed by the user... { Display(); newlyDisplayed = true; } } } } } if(hswDisplayState) GetState(hswDisplayState); return newlyDisplayed; }