@@ -40,6 +40,9 @@ void OpenXRHand::_bind_methods() {
4040 ClassDB::bind_method (D_METHOD (" set_hand" , " hand" ), &OpenXRHand::set_hand);
4141 ClassDB::bind_method (D_METHOD (" get_hand" ), &OpenXRHand::get_hand);
4242
43+ ClassDB::bind_method (D_METHOD (" set_hand_skeleton" , " hand_skeleton" ), &OpenXRHand::set_hand_skeleton);
44+ ClassDB::bind_method (D_METHOD (" get_hand_skeleton" ), &OpenXRHand::get_hand_skeleton);
45+
4346 ClassDB::bind_method (D_METHOD (" set_motion_range" , " motion_range" ), &OpenXRHand::set_motion_range);
4447 ClassDB::bind_method (D_METHOD (" get_motion_range" ), &OpenXRHand::get_motion_range);
4548
@@ -51,6 +54,7 @@ void OpenXRHand::_bind_methods() {
5154
5255 ADD_PROPERTY (PropertyInfo (Variant::INT, " hand" , PROPERTY_HINT_ENUM, " Left,Right" ), " set_hand" , " get_hand" );
5356 ADD_PROPERTY (PropertyInfo (Variant::INT, " motion_range" , PROPERTY_HINT_ENUM, " Unobstructed,Conform to controller" ), " set_motion_range" , " get_motion_range" );
57+ ADD_PROPERTY (PropertyInfo (Variant::NODE_PATH, " hand_skeleton" , PROPERTY_HINT_NODE_PATH_VALID_TYPES, " Skeleton3D" ), " set_hand_skeleton" , " get_hand_skeleton" );
5458 ADD_PROPERTY (PropertyInfo (Variant::INT, " skeleton_rig" , PROPERTY_HINT_ENUM, " OpenXR,Humanoid" ), " set_skeleton_rig" , " get_skeleton_rig" );
5559 ADD_PROPERTY (PropertyInfo (Variant::INT, " bone_update" , PROPERTY_HINT_ENUM, " Full,Rotation Only" ), " set_bone_update" , " get_bone_update" );
5660
@@ -86,6 +90,12 @@ OpenXRHand::Hands OpenXRHand::get_hand() const {
8690 return hand;
8791}
8892
93+ void OpenXRHand::set_hand_skeleton (const NodePath &p_hand_skeleton) {
94+ hand_skeleton = p_hand_skeleton;
95+
96+ // TODO if inside tree call _get_bones()
97+ }
98+
8999void OpenXRHand::set_motion_range (MotionRange p_motion_range) {
90100 ERR_FAIL_INDEX (p_motion_range, MOTION_RANGE_MAX);
91101 motion_range = p_motion_range;
@@ -97,6 +107,10 @@ OpenXRHand::MotionRange OpenXRHand::get_motion_range() const {
97107 return motion_range;
98108}
99109
110+ NodePath OpenXRHand::get_hand_skeleton () const {
111+ return hand_skeleton;
112+ }
113+
100114void OpenXRHand::_set_motion_range () {
101115 if (!hand_tracking_ext) {
102116 return ;
@@ -138,6 +152,20 @@ OpenXRHand::BoneUpdate OpenXRHand::get_bone_update() const {
138152 return bone_update;
139153}
140154
155+ Skeleton3D *OpenXRHand::get_skeleton () {
156+ if (!has_node (hand_skeleton)) {
157+ return nullptr ;
158+ }
159+
160+ Node *node = get_node (hand_skeleton);
161+ if (!node) {
162+ return nullptr ;
163+ }
164+
165+ Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(node);
166+ return skeleton;
167+ }
168+
141169void OpenXRHand::_get_joint_data () {
142170 // Table of bone names for different rig types.
143171 static const String bone_names[SKELETON_RIG_MAX][XR_HAND_JOINT_COUNT_EXT] = {
@@ -262,7 +290,7 @@ void OpenXRHand::_get_joint_data() {
262290 }
263291}
264292
265- void OpenXRHand::_process_modification () {
293+ void OpenXRHand::_update_skeleton () {
266294 if (openxr_api == nullptr || !openxr_api->is_initialized ()) {
267295 return ;
268296 } else if (hand_tracking_ext == nullptr || !hand_tracking_ext->get_active ()) {
@@ -367,14 +395,21 @@ void OpenXRHand::_notification(int p_what) {
367395 switch (p_what) {
368396 case NOTIFICATION_ENTER_TREE: {
369397 _get_joint_data ();
398+
399+ set_process_internal (true );
370400 } break ;
371401 case NOTIFICATION_EXIT_TREE: {
402+ set_process_internal (false );
403+
372404 // reset
373405 for (int i = 0 ; i < XR_HAND_JOINT_COUNT_EXT; i++) {
374406 joints[i].bone = -1 ;
375407 joints[i].parent_joint = -1 ;
376408 }
377409 } break ;
410+ case NOTIFICATION_INTERNAL_PROCESS: {
411+ _update_skeleton ();
412+ } break ;
378413 default : {
379414 } break ;
380415 }
0 commit comments