|
@@ -524,8 +524,8 @@ const GodotWebXR = {
|
|
|
},
|
|
|
|
|
|
godot_webxr_get_controller_buttons__proxy: 'sync',
|
|
|
- godot_webxr_get_controller_buttons__sig: 'ii',
|
|
|
- godot_webxr_get_controller_buttons: function (p_controller) {
|
|
|
+ godot_webxr_get_controller_buttons__sig: 'iii',
|
|
|
+ godot_webxr_get_controller_buttons: function (p_controller, p_xr_standard_mapping) {
|
|
|
if (GodotWebXR.controllers.length === 0) {
|
|
|
return 0;
|
|
|
}
|
|
@@ -535,19 +535,55 @@ const GodotWebXR = {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- const button_count = controller.gamepad.buttons.length;
|
|
|
+ let buttons = controller.gamepad.buttons;
|
|
|
+ if (controller.gamepad.mapping === 'xr-standard' && p_xr_standard_mapping) {
|
|
|
+ buttons = [
|
|
|
+ // 0 = unused,
|
|
|
+ 0,
|
|
|
+ // 1 = B/Y
|
|
|
+ buttons[5],
|
|
|
+ // 2 = Grip
|
|
|
+ buttons[1],
|
|
|
+ // 3
|
|
|
+ buttons[3],
|
|
|
+ // 4
|
|
|
+ buttons[6],
|
|
|
+ // 5
|
|
|
+ buttons[7],
|
|
|
+ // 6
|
|
|
+ buttons[8],
|
|
|
+ // 7 = A/X
|
|
|
+ buttons[4],
|
|
|
+ // 8
|
|
|
+ buttons[9],
|
|
|
+ // 9
|
|
|
+ buttons[10],
|
|
|
+ // 10
|
|
|
+ buttons[11],
|
|
|
+ // 11
|
|
|
+ buttons[12],
|
|
|
+ // 12
|
|
|
+ buttons[13],
|
|
|
+ // 13
|
|
|
+ buttons[14],
|
|
|
+ // 14 = Pad
|
|
|
+ buttons[2],
|
|
|
+ // 15 = Trigger
|
|
|
+ buttons[0],
|
|
|
+ ];
|
|
|
+ }
|
|
|
|
|
|
- const buf = GodotRuntime.malloc((button_count + 1) * 4);
|
|
|
- GodotRuntime.setHeapValue(buf, button_count, 'i32');
|
|
|
- for (let i = 0; i < button_count; i++) {
|
|
|
- GodotRuntime.setHeapValue(buf + 4 + (i * 4), controller.gamepad.buttons[i].value, 'float');
|
|
|
+ const buf = GodotRuntime.malloc((buttons.length + 1) * 4);
|
|
|
+ GodotRuntime.setHeapValue(buf, buttons.length, 'i32');
|
|
|
+ for (let i = 0; i < buttons.length; i++) {
|
|
|
+ GodotRuntime.setHeapValue(buf + 4 + (i * 4), (buttons[i] ? buttons[i].value : 0.0), 'float');
|
|
|
}
|
|
|
return buf;
|
|
|
},
|
|
|
|
|
|
godot_webxr_get_controller_axes__proxy: 'sync',
|
|
|
- godot_webxr_get_controller_axes__sig: 'ii',
|
|
|
- godot_webxr_get_controller_axes: function (p_controller) {
|
|
|
+ godot_webxr_get_controller_axes__sig: 'iii',
|
|
|
+ godot_webxr_get_controller_axes: function (p_controller, p_xr_standard_mapping) {
|
|
|
if (GodotWebXR.controllers.length === 0) {
|
|
|
return 0;
|
|
|
}
|
|
@@ -557,18 +593,41 @@ const GodotWebXR = {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- const axes_count = controller.gamepad.axes.length;
|
|
|
-
|
|
|
- const buf = GodotRuntime.malloc((axes_count + 1) * 4);
|
|
|
- GodotRuntime.setHeapValue(buf, axes_count, 'i32');
|
|
|
- for (let i = 0; i < axes_count; i++) {
|
|
|
- let value = controller.gamepad.axes[i];
|
|
|
- if (i === 1 || i === 3) {
|
|
|
+ let axes = controller.gamepad.axes;
|
|
|
+ if (controller.gamepad.mapping === 'xr-standard') {
|
|
|
+ if (p_xr_standard_mapping) {
|
|
|
+ const trigger_axis = controller.gamepad.buttons[0].value;
|
|
|
+ const grip_axis = controller.gamepad.buttons[1].value;
|
|
|
+ axes = [
|
|
|
+ // 0 = Thumbstick X
|
|
|
+ axes[2],
|
|
|
+ // 1 = Thumbstick Y
|
|
|
+ axes[3] * -1.0,
|
|
|
+ // 2 = Trigger
|
|
|
+ trigger_axis,
|
|
|
+ // 3 = Grip (to match mistake in Oculus mobile plugin).
|
|
|
+ grip_axis,
|
|
|
+ // 4 = Grip
|
|
|
+ grip_axis,
|
|
|
+ // 5 = unused
|
|
|
+ 0,
|
|
|
+ // 6 = Trackpad X
|
|
|
+ axes[0],
|
|
|
+ // 7 = Trackpad Y
|
|
|
+ axes[1] * -1.0,
|
|
|
+ ];
|
|
|
+ } else {
|
|
|
// Invert the Y-axis on thumbsticks and trackpads, in order to
|
|
|
// match OpenXR and other XR platform SDKs.
|
|
|
- value *= -1.0;
|
|
|
+ axes[1] *= -1.0;
|
|
|
+ axes[3] *= -1.0;
|
|
|
}
|
|
|
- GodotRuntime.setHeapValue(buf + 4 + (i * 4), value, 'float');
|
|
|
+ }
|
|
|
+
|
|
|
+ const buf = GodotRuntime.malloc((axes.length + 1) * 4);
|
|
|
+ GodotRuntime.setHeapValue(buf, axes.length, 'i32');
|
|
|
+ for (let i = 0; i < axes.length; i++) {
|
|
|
+ GodotRuntime.setHeapValue(buf + 4 + (i * 4), axes[i], 'float');
|
|
|
}
|
|
|
return buf;
|
|
|
},
|