Implement WebXR Gamepads Module (#32860)

* Expose gamepad attribute on XRInputSource

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Tidy, add spec links

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Update WPT test expectations

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Update gamepad state on InputChanged event

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Pin webxr commit

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Apply gamepad updates during frame updates

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Drain input frame map

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Don't store gamepad as option

Signed-off-by: Daniel Adams <msub2official@gmail.com>

---------

Signed-off-by: Daniel Adams <msub2official@gmail.com>
This commit is contained in:
Daniel Adams 2024-08-03 02:51:44 -10:00 committed by GitHub
parent 0672eca749
commit fd83281657
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 90 additions and 32 deletions

View file

@ -3214,22 +3214,29 @@ impl GlobalScope {
// TODO: 2. If document is not null and is not allowed to use the "gamepad" permission,
// then abort these steps.
let this = Trusted::new(self);
self.gamepad_task_source().queue_with_canceller(
task!(gamepad_connected: move || {
let global = this.root();
self.gamepad_task_source()
.queue_with_canceller(
task!(gamepad_connected: move || {
let global = this.root();
if let Some(window) = global.downcast::<Window>() {
let navigator = window.Navigator();
let selected_index = navigator.select_gamepad_index();
let gamepad = Gamepad::new(
&global, selected_index, name, axis_bounds, button_bounds, supported_haptic_effects
);
navigator.set_gamepad(selected_index as usize, &gamepad);
}
}),
&self.task_canceller(TaskSourceName::Gamepad)
)
.expect("Failed to queue gamepad connected task.");
if let Some(window) = global.downcast::<Window>() {
let navigator = window.Navigator();
let selected_index = navigator.select_gamepad_index();
let gamepad = Gamepad::new(
&global,
selected_index,
name,
"standard".into(),
axis_bounds,
button_bounds,
supported_haptic_effects
);
navigator.set_gamepad(selected_index as usize, &gamepad);
}
}),
&self.task_canceller(TaskSourceName::Gamepad),
)
.expect("Failed to queue gamepad connected task.");
}
/// <https://www.w3.org/TR/gamepad/#dfn-gamepaddisconnected>