Bug 1355648 - Part 2: Handle GampadPose losing tracking situation; r?kip, qdot
MozReview-Commit-ID: FAWnYBuDfFy
--- a/dom/gamepad/GamepadPose.cpp
+++ b/dom/gamepad/GamepadPose.cpp
@@ -50,63 +50,69 @@ GamepadPose::HasPosition() const
return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation);
}
void
GamepadPose::GetPosition(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mPosition, mPoseState.position, 3,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
+ SetFloat32Array(aJSContext, aRetval, mPosition,
+ mPoseState.isPositionValid ? mPoseState.position : nullptr, 3,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
}
void
GamepadPose::GetLinearVelocity(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mLinearVelocity, mPoseState.linearVelocity, 3,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
+ SetFloat32Array(aJSContext, aRetval, mLinearVelocity,
+ mPoseState.isPositionValid ? mPoseState.linearVelocity : nullptr, 3,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position), aRv);
}
void
GamepadPose::GetLinearAcceleration(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mLinearAcceleration, mPoseState.linearAcceleration, 3,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration), aRv);
+ SetFloat32Array(aJSContext, aRetval, mLinearAcceleration,
+ mPoseState.isPositionValid ? mPoseState.linearAcceleration : nullptr, 3,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration), aRv);
}
void
GamepadPose::GetOrientation(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mOrientation, mPoseState.orientation, 4,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
+ SetFloat32Array(aJSContext, aRetval, mOrientation,
+ mPoseState.isOrientationValid ? mPoseState.orientation : nullptr, 4,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
}
void
GamepadPose::GetAngularVelocity(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mAngularVelocity, mPoseState.angularVelocity, 3,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
+ SetFloat32Array(aJSContext, aRetval, mAngularVelocity,
+ mPoseState.isOrientationValid ? mPoseState.angularVelocity : nullptr, 3,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation), aRv);
}
void
GamepadPose::GetAngularAcceleration(JSContext* aJSContext,
JS::MutableHandle<JSObject*> aRetval,
ErrorResult& aRv)
{
- SetFloat32Array(aJSContext, aRetval, mAngularAcceleration, mPoseState.angularAcceleration, 3,
- bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration), aRv);
+ SetFloat32Array(aJSContext, aRetval, mAngularAcceleration,
+ mPoseState.isOrientationValid ? mPoseState.angularAcceleration : nullptr, 3,
+ bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration), aRv);
}
void
GamepadPose::SetPoseState(const GamepadPoseState& aPose)
{
mPoseState = aPose;
}
--- a/dom/gamepad/GamepadPoseState.h
+++ b/dom/gamepad/GamepadPoseState.h
@@ -37,16 +37,18 @@ struct GamepadPoseState
{
GamepadCapabilityFlags flags;
float orientation[4];
float position[3];
float angularVelocity[3];
float angularAcceleration[3];
float linearVelocity[3];
float linearAcceleration[3];
+ bool isPositionValid;
+ bool isOrientationValid;
GamepadPoseState()
{
Clear();
}
bool operator==(const GamepadPoseState& aPose) const
{
@@ -64,17 +66,19 @@ struct GamepadPoseState
&& angularAcceleration[0] == aPose.angularAcceleration[0]
&& angularAcceleration[1] == aPose.angularAcceleration[1]
&& angularAcceleration[2] == aPose.angularAcceleration[2]
&& linearVelocity[0] == aPose.linearVelocity[0]
&& linearVelocity[1] == aPose.linearVelocity[1]
&& linearVelocity[2] == aPose.linearVelocity[2]
&& linearAcceleration[0] == aPose.linearAcceleration[0]
&& linearAcceleration[1] == aPose.linearAcceleration[1]
- && linearAcceleration[2] == aPose.linearAcceleration[2];
+ && linearAcceleration[2] == aPose.linearAcceleration[2]
+ && isPositionValid == aPose.isPositionValid
+ && isOrientationValid == aPose.isOrientationValid;
}
bool operator!=(const GamepadPoseState& aPose) const
{
return !(*this == aPose);
}
void Clear() {
--- a/dom/gamepad/ipc/GamepadMessageUtils.h
+++ b/dom/gamepad/ipc/GamepadMessageUtils.h
@@ -57,16 +57,18 @@ struct ParamTraits<mozilla::dom::Gamepad
WriteParam(aMsg, aParam.angularAcceleration[1]);
WriteParam(aMsg, aParam.angularAcceleration[2]);
WriteParam(aMsg, aParam.linearVelocity[0]);
WriteParam(aMsg, aParam.linearVelocity[1]);
WriteParam(aMsg, aParam.linearVelocity[2]);
WriteParam(aMsg, aParam.linearAcceleration[0]);
WriteParam(aMsg, aParam.linearAcceleration[1]);
WriteParam(aMsg, aParam.linearAcceleration[2]);
+ WriteParam(aMsg, aParam.isPositionValid);
+ WriteParam(aMsg, aParam.isOrientationValid);
}
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{
if (!ReadParam(aMsg, aIter, &(aResult->flags)) ||
!ReadParam(aMsg, aIter, &(aResult->orientation[0])) ||
!ReadParam(aMsg, aIter, &(aResult->orientation[1])) ||
!ReadParam(aMsg, aIter, &(aResult->orientation[2])) ||
@@ -80,17 +82,19 @@ struct ParamTraits<mozilla::dom::Gamepad
!ReadParam(aMsg, aIter, &(aResult->angularAcceleration[0])) ||
!ReadParam(aMsg, aIter, &(aResult->angularAcceleration[1])) ||
!ReadParam(aMsg, aIter, &(aResult->angularAcceleration[2])) ||
!ReadParam(aMsg, aIter, &(aResult->linearVelocity[0])) ||
!ReadParam(aMsg, aIter, &(aResult->linearVelocity[1])) ||
!ReadParam(aMsg, aIter, &(aResult->linearVelocity[2])) ||
!ReadParam(aMsg, aIter, &(aResult->linearAcceleration[0])) ||
!ReadParam(aMsg, aIter, &(aResult->linearAcceleration[1])) ||
- !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[2]))) {
+ !ReadParam(aMsg, aIter, &(aResult->linearAcceleration[2])) ||
+ !ReadParam(aMsg, aIter, &(aResult->isPositionValid)) ||
+ !ReadParam(aMsg, aIter, &(aResult->isOrientationValid))) {
return false;
}
return true;
}
};
} // namespace IPC