You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
WebXR: Add support for hand tracking
This commit is contained in:
@@ -318,9 +318,11 @@ const GodotWebXR = {
|
||||
// callback don't bubble up here and cause Godot to try the
|
||||
// next reference space.
|
||||
window.setTimeout(function () {
|
||||
const c_str = GodotRuntime.allocString(reference_space_type);
|
||||
onstarted(c_str);
|
||||
GodotRuntime.free(c_str);
|
||||
const reference_space_c_str = GodotRuntime.allocString(reference_space_type);
|
||||
const enabled_features_c_str = GodotRuntime.allocString(Array.from(session.enabledFeatures).join(","));
|
||||
onstarted(reference_space_c_str, enabled_features_c_str);
|
||||
GodotRuntime.free(reference_space_c_str);
|
||||
GodotRuntime.free(enabled_features_c_str);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -479,8 +481,8 @@ const GodotWebXR = {
|
||||
},
|
||||
|
||||
godot_webxr_update_input_source__proxy: 'sync',
|
||||
godot_webxr_update_input_source__sig: 'iiiiiiiiiiii',
|
||||
godot_webxr_update_input_source: function (p_input_source_id, r_target_pose, r_target_ray_mode, r_touch_index, r_has_grip_pose, r_grip_pose, r_has_standard_mapping, r_button_count, r_buttons, r_axes_count, r_axes) {
|
||||
godot_webxr_update_input_source__sig: 'iiiiiiiiiiiiiii',
|
||||
godot_webxr_update_input_source: function (p_input_source_id, r_target_pose, r_target_ray_mode, r_touch_index, r_has_grip_pose, r_grip_pose, r_has_standard_mapping, r_button_count, r_buttons, r_axes_count, r_axes, r_has_hand_data, r_hand_joints, r_hand_radii) {
|
||||
if (!GodotWebXR.session || !GodotWebXR.frame) {
|
||||
return 0;
|
||||
}
|
||||
@@ -563,6 +565,19 @@ const GodotWebXR = {
|
||||
GodotRuntime.setHeapValue(r_button_count, button_count, 'i32');
|
||||
GodotRuntime.setHeapValue(r_axes_count, axes_count, 'i32');
|
||||
|
||||
// Hand tracking data.
|
||||
let has_hand_data = false;
|
||||
if (input_source.hand && r_hand_joints != 0 && r_hand_radii != 0) {
|
||||
const hand_joint_array = new Float32Array(25 * 16);
|
||||
const hand_radii_array = new Float32Array(25);
|
||||
if (frame.fillPoses(input_source.hand.values(), space, hand_joint_array) && frame.fillJointRadii(input_source.hand.values(), hand_radii_array)) {
|
||||
GodotRuntime.heapCopy(HEAPF32, hand_joint_array, r_hand_joints);
|
||||
GodotRuntime.heapCopy(HEAPF32, hand_radii_array, r_hand_radii);
|
||||
has_hand_data = true;
|
||||
}
|
||||
}
|
||||
GodotRuntime.setHeapValue(r_has_hand_data, has_hand_data ? 1 : 0, 'i32');
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user