/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_gamepad_GamepadPoseState_h_
#define mozilla_dom_gamepad_GamepadPoseState_h_
namespace mozilla::dom {
enum class GamepadCapabilityFlags : uint16_t {
Cap_None =
0,
/**
* Cap_Position is set if the Gamepad is capable of tracking its position.
*/
Cap_Position =
1 <<
1,
/**
* Cap_Orientation is set if the Gamepad is capable of tracking its
* orientation.
*/
Cap_Orientation =
1 <<
2,
/**
* Cap_AngularAcceleration is set if the Gamepad is capable of tracking its
* angular acceleration.
*/
Cap_AngularAcceleration =
1 <<
3,
/**
* Cap_LinearAcceleration is set if the Gamepad is capable of tracking its
* linear acceleration.
*/
Cap_LinearAcceleration =
1 <<
4,
/**
* Cap_GripSpacePosition is set if the Gamepad has a grip space position.
*/
Cap_GripSpacePosition =
1 <<
5,
/**
* Cap_PositionEmulated is set if the VRDisplay is capable of setting a
* emulated position (e.g. neck model) even if still doesn't support 6DOF
* tracking.
*/
Cap_PositionEmulated =
1 <<
6,
/**
* Cap_All used for validity checking during IPC serialization
*/
Cap_All = (
1 <<
7) -
1
};
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(GamepadCapabilityFlags)
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()
: flags(GamepadCapabilityFlags::Cap_None),
orientation{
0,
0,
0,
0},
position{
0,
0,
0},
angularVelocity{
0,
0,
0},
angularAcceleration{
0,
0,
0},
linearVelocity{
0,
0,
0},
linearAcceleration{
0,
0,
0},
isPositionValid(
false),
isOrientationValid(
false) {}
bool operator==(
const GamepadPoseState& aPose)
const {
return flags == aPose.flags && orientation[
0] == aPose.orientation[
0] &&
orientation[
1] == aPose.orientation[
1] &&
orientation[
2] == aPose.orientation[
2] &&
orientation[
3] == aPose.orientation[
3] &&
position[
0] == aPose.position[
0] &&
position[
1] == aPose.position[
1] &&
position[
2] == aPose.position[
2] &&
angularVelocity[
0] == aPose.angularVelocity[
0] &&
angularVelocity[
1] == aPose.angularVelocity[
1] &&
angularVelocity[
2] == aPose.angularVelocity[
2] &&
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] &&
isPositionValid == aPose.isPositionValid &&
isOrientationValid == aPose.isOrientationValid;
}
bool operator!=(
const GamepadPoseState& aPose)
const {
return !(*
this == aPose);
}
void Clear() {
memset(&flags,
0,
reinterpret_cast<
char*>(&isOrientationValid) +
sizeof(isOrientationValid) -
reinterpret_cast<
char*>(&flags));
}
};
}
// namespace mozilla::dom
#endif // mozilla_dom_gamepad_GamepadPoseState_h_