33
33
void LookAtModifier3D::_validate_property (PropertyInfo &p_property) const {
34
34
SkeletonModifier3D::_validate_property (p_property);
35
35
36
- if (p_property.name == " bone " || p_property.name == " origin_bone " ) {
36
+ if (p_property.name == " bone_name " || p_property.name == " origin_bone_name " ) {
37
37
Skeleton3D *skeleton = get_skeleton ();
38
38
if (skeleton) {
39
39
p_property.hint = PROPERTY_HINT_ENUM;
@@ -49,11 +49,11 @@ void LookAtModifier3D::_validate_property(PropertyInfo &p_property) const {
49
49
p_property.usage = PROPERTY_USAGE_NONE;
50
50
}
51
51
} else if (origin_from == ORIGIN_FROM_EXTERNAL_NODE) {
52
- if (p_property.name == " origin_bone" ) {
52
+ if (p_property.name == " origin_bone" || p_property. name == " origin_bone_name " ) {
53
53
p_property.usage = PROPERTY_USAGE_NONE;
54
54
}
55
55
} else {
56
- if (p_property.name == " origin_external_node" || p_property.name == " origin_bone" ) {
56
+ if (p_property.name == " origin_external_node" || p_property.name == " origin_bone" || p_property. name == " origin_bone_name " ) {
57
57
p_property.usage = PROPERTY_USAGE_NONE;
58
58
}
59
59
}
@@ -75,8 +75,29 @@ PackedStringArray LookAtModifier3D::get_configuration_warnings() const {
75
75
return warnings;
76
76
}
77
77
78
+ void LookAtModifier3D::set_bone_name (const String &p_bone_name) {
79
+ bone_name = p_bone_name;
80
+ Skeleton3D *sk = get_skeleton ();
81
+ if (sk) {
82
+ set_bone (sk->find_bone (bone_name));
83
+ }
84
+ }
85
+
86
+ String LookAtModifier3D::get_bone_name () const {
87
+ return bone_name;
88
+ }
89
+
78
90
void LookAtModifier3D::set_bone (int p_bone) {
79
91
bone = p_bone;
92
+ Skeleton3D *sk = get_skeleton ();
93
+ if (sk) {
94
+ if (bone <= -1 || bone >= sk->get_bone_count ()) {
95
+ WARN_PRINT (" Bone index out of range!" );
96
+ bone = -1 ;
97
+ } else {
98
+ bone_name = sk->get_bone_name (bone);
99
+ }
100
+ }
80
101
}
81
102
82
103
int LookAtModifier3D::get_bone () const {
@@ -132,8 +153,29 @@ LookAtModifier3D::OriginFrom LookAtModifier3D::get_origin_from() const {
132
153
return origin_from;
133
154
}
134
155
156
+ void LookAtModifier3D::set_origin_bone_name (const String &p_bone_name) {
157
+ origin_bone_name = p_bone_name;
158
+ Skeleton3D *sk = get_skeleton ();
159
+ if (sk) {
160
+ set_origin_bone (sk->find_bone (origin_bone_name));
161
+ }
162
+ }
163
+
164
+ String LookAtModifier3D::get_origin_bone_name () const {
165
+ return origin_bone_name;
166
+ }
167
+
135
168
void LookAtModifier3D::set_origin_bone (int p_bone) {
136
169
origin_bone = p_bone;
170
+ Skeleton3D *sk = get_skeleton ();
171
+ if (sk) {
172
+ if (origin_bone <= -1 || origin_bone >= sk->get_bone_count ()) {
173
+ WARN_PRINT (" Bone index out of range!" );
174
+ origin_bone = -1 ;
175
+ } else {
176
+ origin_bone_name = sk->get_bone_name (origin_bone);
177
+ }
178
+ }
137
179
}
138
180
139
181
int LookAtModifier3D::get_origin_bone () const {
@@ -330,6 +372,8 @@ void LookAtModifier3D::_bind_methods() {
330
372
ClassDB::bind_method (D_METHOD (" set_target_node" , " target_node" ), &LookAtModifier3D::set_target_node);
331
373
ClassDB::bind_method (D_METHOD (" get_target_node" ), &LookAtModifier3D::get_target_node);
332
374
375
+ ClassDB::bind_method (D_METHOD (" set_bone_name" , " bone_name" ), &LookAtModifier3D::set_bone_name);
376
+ ClassDB::bind_method (D_METHOD (" get_bone_name" ), &LookAtModifier3D::get_bone_name);
333
377
ClassDB::bind_method (D_METHOD (" set_bone" , " bone" ), &LookAtModifier3D::set_bone);
334
378
ClassDB::bind_method (D_METHOD (" get_bone" ), &LookAtModifier3D::get_bone);
335
379
ClassDB::bind_method (D_METHOD (" set_forward_axis" , " forward_axis" ), &LookAtModifier3D::set_forward_axis);
@@ -343,6 +387,8 @@ void LookAtModifier3D::_bind_methods() {
343
387
344
388
ClassDB::bind_method (D_METHOD (" set_origin_from" , " origin_from" ), &LookAtModifier3D::set_origin_from);
345
389
ClassDB::bind_method (D_METHOD (" get_origin_from" ), &LookAtModifier3D::get_origin_from);
390
+ ClassDB::bind_method (D_METHOD (" set_origin_bone_name" , " bone_name" ), &LookAtModifier3D::set_origin_bone_name);
391
+ ClassDB::bind_method (D_METHOD (" get_origin_bone_name" ), &LookAtModifier3D::get_origin_bone_name);
346
392
ClassDB::bind_method (D_METHOD (" set_origin_bone" , " bone" ), &LookAtModifier3D::set_origin_bone);
347
393
ClassDB::bind_method (D_METHOD (" get_origin_bone" ), &LookAtModifier3D::get_origin_bone);
348
394
ClassDB::bind_method (D_METHOD (" set_origin_external_node" , " external_node" ), &LookAtModifier3D::set_origin_external_node);
@@ -397,14 +443,16 @@ void LookAtModifier3D::_bind_methods() {
397
443
398
444
ADD_PROPERTY (PropertyInfo (Variant::NODE_PATH, " target_node" , PROPERTY_HINT_NODE_TYPE, " Node3D" ), " set_target_node" , " get_target_node" );
399
445
400
- ADD_PROPERTY (PropertyInfo (Variant::INT, " bone" , PROPERTY_HINT_ENUM, " " ), " set_bone" , " get_bone" );
446
+ ADD_PROPERTY (PropertyInfo (Variant::STRING, " bone_name" , PROPERTY_HINT_ENUM_SUGGESTION, " " ), " set_bone_name" , " get_bone_name" );
447
+ ADD_PROPERTY (PropertyInfo (Variant::INT, " bone" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_NO_EDITOR), " set_bone" , " get_bone" );
401
448
ADD_PROPERTY (PropertyInfo (Variant::INT, " forward_axis" , PROPERTY_HINT_ENUM, " +X,-X,+Y,-Y,+Z,-Z" ), " set_forward_axis" , " get_forward_axis" );
402
449
ADD_PROPERTY (PropertyInfo (Variant::INT, " primary_rotation_axis" , PROPERTY_HINT_ENUM, " X,Y,Z" ), " set_primary_rotation_axis" , " get_primary_rotation_axis" );
403
450
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " use_secondary_rotation" ), " set_use_secondary_rotation" , " is_using_secondary_rotation" );
404
451
405
452
ADD_GROUP (" Origin Settings" , " origin_" );
406
453
ADD_PROPERTY (PropertyInfo (Variant::INT, " origin_from" , PROPERTY_HINT_ENUM, " Self,SpecificBone,ExternalNode" ), " set_origin_from" , " get_origin_from" );
407
- ADD_PROPERTY (PropertyInfo (Variant::INT, " origin_bone" , PROPERTY_HINT_ENUM, " " ), " set_origin_bone" , " get_origin_bone" );
454
+ ADD_PROPERTY (PropertyInfo (Variant::STRING, " origin_bone_name" , PROPERTY_HINT_ENUM_SUGGESTION, " " ), " set_origin_bone_name" , " get_origin_bone_name" );
455
+ ADD_PROPERTY (PropertyInfo (Variant::INT, " origin_bone" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_NO_EDITOR), " set_origin_bone" , " get_origin_bone" );
408
456
ADD_PROPERTY (PropertyInfo (Variant::NODE_PATH, " origin_external_node" , PROPERTY_HINT_NODE_TYPE, " Node3D" ), " set_origin_external_node" , " get_origin_external_node" );
409
457
ADD_PROPERTY (PropertyInfo (Variant::VECTOR3, " origin_offset" ), " set_origin_offset" , " get_origin_offset" );
410
458
ADD_PROPERTY (PropertyInfo (Variant::FLOAT, " origin_safe_margin" , PROPERTY_HINT_RANGE, " 0,100,0.001,or_greater,suffix:m" ), " set_origin_safe_margin" , " get_origin_safe_margin" );
@@ -474,7 +522,7 @@ void LookAtModifier3D::_process_modification() {
474
522
destination = skeleton->get_bone_pose_rotation (bone);
475
523
} else {
476
524
Transform3D origin_tr;
477
- if (origin_from == ORIGIN_FROM_SPECIFIC_BONE && origin_bone < skeleton->get_bone_count ()) {
525
+ if (origin_from == ORIGIN_FROM_SPECIFIC_BONE && origin_bone >= 0 && origin_bone < skeleton->get_bone_count ()) {
478
526
origin_tr = skeleton->get_global_transform () * skeleton->get_bone_global_pose (origin_bone);
479
527
} else if (origin_from == ORIGIN_FROM_EXTERNAL_NODE) {
480
528
Node3D *origin_src = Object::cast_to<Node3D>(get_node_or_null (origin_external_node));
0 commit comments