Bug 1383110 - Force to fetch Oculus Touch tracking data when it is added; r=kip
authorDaosheng Mu <daoshengmu@gmail.com>
Thu, 27 Jul 2017 15:42:59 +0800
changeset 420237 047029e0a1d4b5a5dcad3c70d31a25f8352d38ab
parent 420236 113b17f0f95d002c73be1ae29356d157afc1772d
child 420238 f29dc4908f511f15c2664417f6b96b571c39f8f8
push id7566
push usermtabara@mozilla.com
push dateWed, 02 Aug 2017 08:25:16 +0000
treeherdermozilla-beta@86913f512c3c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskip
bugs1383110
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1383110 - Force to fetch Oculus Touch tracking data when it is added; r=kip MozReview-Commit-ID: 4e8qoV6cDzy
gfx/vr/gfxVROculus.cpp
gfx/vr/gfxVROculus.h
--- a/gfx/vr/gfxVROculus.cpp
+++ b/gfx/vr/gfxVROculus.cpp
@@ -1547,60 +1547,67 @@ VRSystemManagerOculus::HandleInput()
     controller->SetButtonTouched(inputState.Touches);
 
     axis = static_cast<uint32_t>(OculusControllerAxisType::ThumbstickXAxis);
     HandleAxisMove(i, axis, inputState.Thumbstick[i].x);
 
     axis = static_cast<uint32_t>(OculusControllerAxisType::ThumbstickYAxis);
     HandleAxisMove(i, axis, -inputState.Thumbstick[i].y);
 
-    // Start to process pose
+    // Process pose state.
+    GamepadPoseState poseState;
+    GetControllerPoseState(handIdx, poseState);
+    HandlePoseTracking(i, poseState, controller);
+  }
+}
+
+void
+VRSystemManagerOculus::GetControllerPoseState(uint32_t aHandIdx, GamepadPoseState& aPoseState,
+                                              bool aForceUpdate)
+{
     ovrTrackingState state = ovr_GetTrackingState(mSession->Get(), 0.0, false);
 
     // HandPoses is ordered by ovrControllerType_LTouch and ovrControllerType_RTouch,
     // therefore, we can't get its state by the index of mOculusController.
-    ovrPoseStatef& pose(state.HandPoses[handIdx]);
-    GamepadPoseState poseState;
+    ovrPoseStatef& pose(state.HandPoses[aHandIdx]);
 
-    if (state.HandStatusFlags[handIdx] & ovrStatus_OrientationTracked) {
-      poseState.flags |= GamepadCapabilityFlags::Cap_Orientation;
-      poseState.orientation[0] = pose.ThePose.Orientation.x;
-      poseState.orientation[1] = pose.ThePose.Orientation.y;
-      poseState.orientation[2] = pose.ThePose.Orientation.z;
-      poseState.orientation[3] = pose.ThePose.Orientation.w;
-      poseState.angularVelocity[0] = pose.AngularVelocity.x;
-      poseState.angularVelocity[1] = pose.AngularVelocity.y;
-      poseState.angularVelocity[2] = pose.AngularVelocity.z;
+    if (aForceUpdate || state.HandStatusFlags[aHandIdx] & ovrStatus_OrientationTracked) {
+      aPoseState.flags |= GamepadCapabilityFlags::Cap_Orientation;
+      aPoseState.orientation[0] = pose.ThePose.Orientation.x;
+      aPoseState.orientation[1] = pose.ThePose.Orientation.y;
+      aPoseState.orientation[2] = pose.ThePose.Orientation.z;
+      aPoseState.orientation[3] = pose.ThePose.Orientation.w;
+      aPoseState.angularVelocity[0] = pose.AngularVelocity.x;
+      aPoseState.angularVelocity[1] = pose.AngularVelocity.y;
+      aPoseState.angularVelocity[2] = pose.AngularVelocity.z;
 
-      poseState.flags |= GamepadCapabilityFlags::Cap_AngularAcceleration;
-      poseState.angularAcceleration[0] = pose.AngularAcceleration.x;
-      poseState.angularAcceleration[1] = pose.AngularAcceleration.y;
-      poseState.angularAcceleration[2] = pose.AngularAcceleration.z;
-      poseState.isOrientationValid = true;
+      aPoseState.flags |= GamepadCapabilityFlags::Cap_AngularAcceleration;
+      aPoseState.angularAcceleration[0] = pose.AngularAcceleration.x;
+      aPoseState.angularAcceleration[1] = pose.AngularAcceleration.y;
+      aPoseState.angularAcceleration[2] = pose.AngularAcceleration.z;
+      aPoseState.isOrientationValid = true;
     }
-    if (state.HandStatusFlags[handIdx] & ovrStatus_PositionTracked) {
-      poseState.flags |= GamepadCapabilityFlags::Cap_Position;
-      poseState.position[0] = pose.ThePose.Position.x;
-      poseState.position[1] = pose.ThePose.Position.y;
-      poseState.position[2] = pose.ThePose.Position.z;
-      poseState.linearVelocity[0] = pose.LinearVelocity.x;
-      poseState.linearVelocity[1] = pose.LinearVelocity.y;
-      poseState.linearVelocity[2] = pose.LinearVelocity.z;
+    if (aForceUpdate || state.HandStatusFlags[aHandIdx] & ovrStatus_PositionTracked) {
+      aPoseState.flags |= GamepadCapabilityFlags::Cap_Position;
+      aPoseState.position[0] = pose.ThePose.Position.x;
+      aPoseState.position[1] = pose.ThePose.Position.y;
+      aPoseState.position[2] = pose.ThePose.Position.z;
+      aPoseState.linearVelocity[0] = pose.LinearVelocity.x;
+      aPoseState.linearVelocity[1] = pose.LinearVelocity.y;
+      aPoseState.linearVelocity[2] = pose.LinearVelocity.z;
 
-      poseState.flags |= GamepadCapabilityFlags::Cap_LinearAcceleration;
-      poseState.linearAcceleration[0] = pose.LinearAcceleration.x;
-      poseState.linearAcceleration[1] = pose.LinearAcceleration.y;
-      poseState.linearAcceleration[2] = pose.LinearAcceleration.z;
+      aPoseState.flags |= GamepadCapabilityFlags::Cap_LinearAcceleration;
+      aPoseState.linearAcceleration[0] = pose.LinearAcceleration.x;
+      aPoseState.linearAcceleration[1] = pose.LinearAcceleration.y;
+      aPoseState.linearAcceleration[2] = pose.LinearAcceleration.z;
 
       float eyeHeight = ovr_GetFloat(mSession->Get(), OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT);
-      poseState.position[1] -= eyeHeight;
-      poseState.isPositionValid = true;
+      aPoseState.position[1] -= eyeHeight;
+      aPoseState.isPositionValid = true;
     }
-    HandlePoseTracking(i, poseState, controller);
-  }
 }
 
 void
 VRSystemManagerOculus::HandleButtonPress(uint32_t aControllerIdx,
                                          uint32_t aButton,
                                          uint64_t aButtonMask,
                                          uint64_t aButtonPressed,
                                          uint64_t aButtonTouched)
@@ -1761,16 +1768,21 @@ VRSystemManagerOculus::ScanForController
   // at GetHMDs().
   if (!mSession || !mSession->IsTrackingReady()) {
     return;
   }
 
   ovrInputState inputState;
   bool hasInputState = ovr_GetInputState(mSession->Get(), ovrControllerType_Touch,
                                          &inputState) == ovrSuccess;
+
+  if (!hasInputState) {
+    return;
+  }
+
   ovrControllerType activeControllerArray[2];
   uint32_t newControllerCount = 0;
 
   if (inputState.ControllerType & ovrControllerType_LTouch) {
     activeControllerArray[newControllerCount] = ovrControllerType_LTouch;
     ++newControllerCount;
   }
 
@@ -1795,16 +1807,26 @@ VRSystemManagerOculus::ScanForController
           break;
       }
       RefPtr<VRControllerOculus> oculusController = new VRControllerOculus(hand,
                                                       mDisplay->GetDisplayInfo().GetDisplayID());
       mOculusController.AppendElement(oculusController);
 
       // Not already present, add it.
       AddGamepad(oculusController->GetControllerInfo());
+
+      // Process pose state.
+      // We wanna Oculus Touch has the right position when it shows up,
+      // so we force to update the pose no matter if it has OrientationTracked
+      // or PositionTracked.
+      const uint32_t handIdx = static_cast<uint32_t>(hand) - 1;
+      GamepadPoseState poseState;
+      GetControllerPoseState(handIdx, poseState, true);
+      HandlePoseTracking(i, poseState, oculusController);
+
       ++mControllerCount;
     }
   }
 }
 
 void
 VRSystemManagerOculus::RemoveControllers()
 {
--- a/gfx/vr/gfxVROculus.h
+++ b/gfx/vr/gfxVROculus.h
@@ -197,16 +197,19 @@ private:
                       float aValue);
   void HandlePoseTracking(uint32_t aControllerIdx,
                           const dom::GamepadPoseState& aPose,
                           VRControllerHost* aController);
   void HandleIndexTriggerPress(uint32_t aControllerIdx, uint32_t aButton, float aValue);
   void HandleHandTriggerPress(uint32_t aControllerIdx, uint32_t aButton, float aValue);
   void HandleTouchEvent(uint32_t aControllerIdx, uint32_t aButton,
                         uint64_t aTouchMask, uint64_t aTouched);
+  void GetControllerPoseState(uint32_t aHandIdx, dom::GamepadPoseState& aPoseState,
+                              bool aForceUpdate = false);
+
   RefPtr<impl::VRDisplayOculus> mDisplay;
   nsTArray<RefPtr<impl::VRControllerOculus>> mOculusController;
   RefPtr<impl::VROculusSession> mSession;
 };
 
 } // namespace gfx
 } // namespace mozilla