GamepadPose.cpp (4485B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/GamepadPose.h" 8 9 #include "mozilla/HoldDropJSObjects.h" 10 #include "mozilla/dom/GamepadPoseBinding.h" 11 #include "nsWrapperCache.h" 12 13 namespace mozilla::dom { 14 15 GamepadPose::GamepadPose(nsISupports* aParent, const GamepadPoseState& aState) 16 : Pose(aParent), mPoseState(aState) { 17 mozilla::HoldJSObjects(this); 18 } 19 20 GamepadPose::GamepadPose(nsISupports* aParent) : Pose(aParent) { 21 mozilla::HoldJSObjects(this); 22 mPoseState.Clear(); 23 } 24 25 GamepadPose::~GamepadPose() { mozilla::DropJSObjects(this); } 26 27 /* virtual */ 28 JSObject* GamepadPose::WrapObject(JSContext* aJSContext, 29 JS::Handle<JSObject*> aGivenProto) { 30 return GamepadPose_Binding::Wrap(aJSContext, this, aGivenProto); 31 } 32 33 bool GamepadPose::HasOrientation() const { 34 return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation); 35 } 36 37 bool GamepadPose::HasPosition() const { 38 return bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) || 39 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated); 40 } 41 42 void GamepadPose::GetPosition(JSContext* aJSContext, 43 JS::MutableHandle<JSObject*> aRetval, 44 ErrorResult& aRv) { 45 const bool valid = 46 mPoseState.isPositionValid && 47 (bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) || 48 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated)); 49 SetFloat32Array(aJSContext, this, aRetval, mPosition, 50 valid ? mPoseState.position : nullptr, 3, aRv); 51 } 52 53 void GamepadPose::GetLinearVelocity(JSContext* aJSContext, 54 JS::MutableHandle<JSObject*> aRetval, 55 ErrorResult& aRv) { 56 const bool valid = 57 mPoseState.isPositionValid && 58 (bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Position) || 59 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_PositionEmulated)); 60 SetFloat32Array(aJSContext, this, aRetval, mLinearVelocity, 61 valid ? mPoseState.linearVelocity : nullptr, 3, aRv); 62 } 63 64 void GamepadPose::GetLinearAcceleration(JSContext* aJSContext, 65 JS::MutableHandle<JSObject*> aRetval, 66 ErrorResult& aRv) { 67 const bool valid = 68 mPoseState.isPositionValid && 69 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_LinearAcceleration); 70 SetFloat32Array(aJSContext, this, aRetval, mLinearAcceleration, 71 valid ? mPoseState.linearAcceleration : nullptr, 3, aRv); 72 } 73 74 void GamepadPose::GetOrientation(JSContext* aJSContext, 75 JS::MutableHandle<JSObject*> aRetval, 76 ErrorResult& aRv) { 77 const bool valid = 78 mPoseState.isOrientationValid && 79 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation); 80 SetFloat32Array(aJSContext, this, aRetval, mOrientation, 81 valid ? mPoseState.orientation : nullptr, 4, aRv); 82 } 83 84 void GamepadPose::GetAngularVelocity(JSContext* aJSContext, 85 JS::MutableHandle<JSObject*> aRetval, 86 ErrorResult& aRv) { 87 const bool valid = 88 mPoseState.isOrientationValid && 89 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_Orientation); 90 SetFloat32Array(aJSContext, this, aRetval, mAngularVelocity, 91 valid ? mPoseState.angularVelocity : nullptr, 3, aRv); 92 } 93 94 void GamepadPose::GetAngularAcceleration(JSContext* aJSContext, 95 JS::MutableHandle<JSObject*> aRetval, 96 ErrorResult& aRv) { 97 const bool valid = 98 mPoseState.isOrientationValid && 99 bool(mPoseState.flags & GamepadCapabilityFlags::Cap_AngularAcceleration); 100 SetFloat32Array(aJSContext, this, aRetval, mAngularAcceleration, 101 valid ? mPoseState.angularAcceleration : nullptr, 3, aRv); 102 } 103 104 void GamepadPose::SetPoseState(const GamepadPoseState& aPose) { 105 mPoseState = aPose; 106 } 107 108 const GamepadPoseState& GamepadPose::GetPoseState() { return mPoseState; } 109 110 } // namespace mozilla::dom