CARVIEW |
[gamepad]
. See
Bugzilla for this specification's open bugs.
Introduction
The Gamepad API provides a tightly scoped interface to gamepad devices and is focused on the most common elements of those devices, namely axis and button inputs. It specifically excludes support for more complex devices (e.g., those that do motion tracking or haptic feedback).
However, some uses of gamepads (e.g., those paired with Virtual Reality headsets) rely heavily on those more advanced features. This supplemetary spec describes extensions to the base API to accommodate those use cases. If they prove to be broadly useful, the hope is that they will be eventually merged into the main spec.
GamepadHand Enum
This enum defines the set of possible hands a gamepad may be held by.
enum GamepadHand { "", /* unknown, both hands, or not applicable */ "left", "right" };
- "" (the empty string)
- The empty string indicates the hand that is holding the gamepad is unknown or not applicable (e.g., if the gamepad is held with two hands).
- left
- Gamepad is held or is most likely to be held in the left hand.
- right
- Gamepad is held or is most likely to be held in the right hand.
GamepadPose Interface
This interface defines the gamepad's position, orientation, velocity, and acceleration.
[Exposed=Window] interface GamepadPose { readonly attribute boolean hasOrientation; readonly attribute boolean hasPosition; readonly attribute Float32Array? position; readonly attribute Float32Array? linearVelocity; readonly attribute Float32Array? linearAcceleration; readonly attribute Float32Array? orientation; readonly attribute Float32Array? angularVelocity; readonly attribute Float32Array? angularAcceleration; };
- hasOrientation
-
The
hasOrientation
attribute MUST return whether the gamepad is capable of tracking its orientation. - hasPosition
-
The
hasPosition
attribute MUST return whether the gamepad is capable of tracking its position. - position
-
Position of the gamepad as a 3D vector, given in meters from an origin point, which is determined by the gamepad hardware and MAY be the position of the gamepad when first polled if no other reference point is available. The coordinate system uses these axis definitions, assuming the user is holding the gamepad in the forward orientation:
- Positive X is to the user's right.
- Positive Y is up.
- Positive Z is behind the user.
MUST be
null
if the gamepad is incapable of providing positional data. When notnull
, MUST be a three-element array. - linearVelocity
-
Linear velocity of the gamepad in meters per second. MUST be
null
if the sensor is incapable of providing linear velocity. When notnull
, MUST be a three-element array. - linearAcceleration
-
Linear acceleration of the gamepad in meters per second. MUST be
null
if the sensor is incapable of providing linear acceleration. When notnull
, MUST be a three-element array. - orientation
-
Orientation of the gamepad as a quaternion. An orientation of
[0, 0, 0, 1]
is considered to beforward
. The forward direction MUST be determined by the gamepad hardware. The forward direction MAY be the orientation of the hardware when it was first polled if no other reference orientation is available. If the sensor is incapable of providing orientation data, the orientation MUST benull
. When notnull
, theorientation
MUST be a four-element array. - angularVelocity
-
Angular velocity of the gamepad in meters per second. MUST be
null
if the sensor is incapable of providing angular velocity. When notnull
, theangularVelocity
MUST be a three-element array. - angularAcceleration
-
Angular acceleration of the gamepad in meters per second. MUST be
null
if the sensor is incapable of providing angular acceleration. When notnull
,angularAcceleration
MUST be a three-element array.
Partial Gamepad Interface
This partial interface supplements the Gamepad interface described in the main Gamepad spec.
partial interface Gamepad { readonly attribute GamepadHand hand; readonly attribute FrozenArray<GamepadHapticActuator> hapticActuators; readonly attribute GamepadPose? pose; };
Instances of {{Gamepad}} are created with the internal slots described in the following table:
Internal slot | Initial value | Description (non-normative) |
---|---|---|
[[\hand]] | `undefined` | Indicates the hand the controller is held in. |
[[\hapticActuators]] | `undefined` | List of all the haptic actuators in the gamepad. |
[[\pose]] | `null` | The current pose of the gamepad. |
- hand
- An enumeration, {{GamepadHand}}, that indicates which hand the controller is being held in or is most likely to be held in.
- hapticActuators
- A list of all the {{GamepadHapticActuator}}s in the gamepad. The same object MUST be returned until the user agent needs to return different values (or values in a different order).
- pose
- The current {{GamepadPose}} of the gamepad, if supported by the hardware. Includes position, orientation, velocity, and acceleration. If the hardware cannot supply any pose values, MUST be set to `null`.
Receiving inputs
This section supplements the Receiving inputs section of the main Gamepad specification.
Constructing a `Gamepad`
This section supplements the Constructing a `Gamepad` section of the main Gamepad specification.
Partial GamepadHapticActuator Interface
This partial interface supplements the {{GamepadHapticActuator}} interface described in the main Gamepad spec.
[Exposed=Window] partial interface GamepadHapticActuator { Promise<boolean> pulse(double value, double duration); };
- pulse() method
-
{{GamepadHapticActuator/pulse()}} applies a |value:double| to the actuator for duration milliseconds. The value passed to
pulse()
is clamped to limits defined by the actuator type. The returned Promise will resolvetrue
once the pulse has completed.Repeated calls to
pulse()
override the previous values.