Skip to content

Commit 17d0689

Browse files
committed
Add bone name/idx matching validation & virtual func to skel Modifier
1 parent 1b4ed4c commit 17d0689

9 files changed

+85
-2
lines changed

doc/classes/SkeletonModifier3D.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@
2828
[param delta] is passed from parent [Skeleton3D]. See also [method Skeleton3D.advance].
2929
</description>
3030
</method>
31+
<method name="_skeleton_changed" qualifiers="virtual">
32+
<return type="void" />
33+
<param index="0" name="old_skeleton" type="Skeleton3D" />
34+
<param index="1" name="new_skeleton" type="Skeleton3D" />
35+
<description>
36+
Called when the skeleton is changed.
37+
</description>
38+
</method>
39+
<method name="_validate_bone_names" qualifiers="virtual">
40+
<return type="void" />
41+
<description>
42+
Called when bone name and index need to be validated such as the timing of the entering tree or changing skeleton.
43+
</description>
44+
</method>
3145
<method name="get_skeleton" qualifiers="const">
3246
<return type="Skeleton3D" />
3347
<description>

scene/3d/look_at_modifier_3d.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,20 @@ PackedStringArray LookAtModifier3D::get_configuration_warnings() const {
7575
return warnings;
7676
}
7777

78+
void LookAtModifier3D::_validate_bone_names() {
79+
// Prior bone name.
80+
if (!bone_name.is_empty()) {
81+
set_bone_name(bone_name);
82+
} else if (bone != -1) {
83+
set_bone(bone);
84+
}
85+
if (!origin_bone_name.is_empty()) {
86+
set_origin_bone_name(origin_bone_name);
87+
} else if (origin_bone != -1) {
88+
set_origin_bone(origin_bone);
89+
}
90+
}
91+
7892
void LookAtModifier3D::set_bone_name(const String &p_bone_name) {
7993
bone_name = p_bone_name;
8094
Skeleton3D *sk = get_skeleton();
@@ -529,7 +543,7 @@ void LookAtModifier3D::_process_modification(double p_delta) {
529543
} else {
530544
origin_tr = bone_rest_space;
531545
}
532-
forward_vector = bone_rest_space.orthonormalized().basis.xform_inv((target->get_global_position() - origin_tr.translated_local(origin_offset).origin));
546+
forward_vector = bone_rest_space.orthonormalized().basis.xform_inv(target->get_global_position() - origin_tr.translated_local(origin_offset).origin);
533547
forward_vector_nrm = forward_vector.normalized();
534548
if (forward_vector_nrm.abs().is_equal_approx(get_vector_from_axis(primary_rotation_axis))) {
535549
destination = skeleton->get_bone_pose_rotation(bone);

scene/3d/look_at_modifier_3d.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ class LookAtModifier3D : public SkeletonModifier3D {
105105
virtual PackedStringArray get_configuration_warnings() const override;
106106
void _validate_property(PropertyInfo &p_property) const;
107107

108+
virtual void _validate_bone_names() override;
109+
108110
static void _bind_methods();
109111

110112
virtual void _process_modification(double p_delta) override;

scene/3d/skeleton_modifier_3d.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,18 @@ void SkeletonModifier3D::_update_skeleton() {
6868
if (old_sk != new_sk) {
6969
_skeleton_changed(old_sk, new_sk);
7070
}
71+
if (new_sk) {
72+
_validate_bone_names();
73+
}
7174
update_configuration_warnings();
7275
}
7376

7477
void SkeletonModifier3D::_skeleton_changed(Skeleton3D *p_old, Skeleton3D *p_new) {
75-
//
78+
GDVIRTUAL_CALL(_skeleton_changed, p_old, p_new);
79+
}
80+
81+
void SkeletonModifier3D::_validate_bone_names() {
82+
GDVIRTUAL_CALL(_validate_bone_names);
7683
}
7784

7885
void SkeletonModifier3D::_force_update_skeleton_skin() {
@@ -163,6 +170,9 @@ void SkeletonModifier3D::_bind_methods() {
163170
GDVIRTUAL_BIND(_process_modification);
164171
#endif
165172

173+
GDVIRTUAL_BIND(_skeleton_changed, "old_skeleton", "new_skeleton");
174+
GDVIRTUAL_BIND(_validate_bone_names);
175+
166176
BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_X);
167177
BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_X);
168178
BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_Y);

scene/3d/skeleton_modifier_3d.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class SkeletonModifier3D : public Node3D {
6161
void _force_update_skeleton_skin();
6262

6363
virtual void _skeleton_changed(Skeleton3D *p_old, Skeleton3D *p_new);
64+
virtual void _validate_bone_names();
65+
GDVIRTUAL2(_skeleton_changed, Skeleton3D *, Skeleton3D *);
66+
GDVIRTUAL0(_validate_bone_names);
6467

6568
void _validate_property(PropertyInfo &p_property) const;
6669
void _notification(int p_what);

scene/3d/spring_bone_collision_3d.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ void SpringBoneCollision3D::_validate_property(PropertyInfo &p_property) const {
5858
}
5959
}
6060

61+
void SpringBoneCollision3D::_validate_bone_name() {
62+
// Prior bone name.
63+
if (!bone_name.is_empty()) {
64+
set_bone_name(bone_name);
65+
} else if (bone != -1) {
66+
set_bone(bone);
67+
}
68+
}
69+
6170
Skeleton3D *SpringBoneCollision3D::get_skeleton() const {
6271
SpringBoneSimulator3D *parent = Object::cast_to<SpringBoneSimulator3D>(get_parent());
6372
if (!parent) {
@@ -173,6 +182,15 @@ void SpringBoneCollision3D::_bind_methods() {
173182
ADD_PROPERTY(PropertyInfo(Variant::QUATERNION, "rotation_offset"), "set_rotation_offset", "get_rotation_offset");
174183
}
175184

185+
void SpringBoneCollision3D::_notification(int p_what) {
186+
switch (p_what) {
187+
case NOTIFICATION_ENTER_TREE:
188+
case NOTIFICATION_PARENTED: {
189+
_validate_bone_name();
190+
} break;
191+
}
192+
}
193+
176194
Vector3 SpringBoneCollision3D::collide(const Transform3D &p_center, float p_bone_radius, float p_bone_length, const Vector3 &p_current) const {
177195
return _collide(p_center, p_bone_radius, p_bone_length, p_current);
178196
}

scene/3d/spring_bone_collision_3d.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@ class SpringBoneCollision3D : public Node3D {
4141
Vector3 position_offset;
4242
Quaternion rotation_offset;
4343

44+
void _validate_bone_name();
45+
4446
protected:
4547
PackedStringArray get_configuration_warnings() const override;
4648

4749
void _validate_property(PropertyInfo &p_property) const;
50+
void _notification(int p_what);
4851
static void _bind_methods();
4952

5053
virtual Vector3 _collide(const Transform3D &p_center, float p_bone_radius, float p_bone_length, const Vector3 &p_current) const;

scene/3d/spring_bone_simulator_3d.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,23 @@ void SpringBoneSimulator3D::_bind_methods() {
12401240
BIND_ENUM_CONSTANT(ROTATION_AXIS_ALL);
12411241
}
12421242

1243+
void SpringBoneSimulator3D::_validate_bone_names() {
1244+
for (int i = 0; i < settings.size(); i++) {
1245+
// Prior bone name.
1246+
if (!settings[i]->root_bone_name.is_empty()) {
1247+
set_root_bone_name(i, settings[i]->root_bone_name);
1248+
} else if (settings[i]->root_bone != -1) {
1249+
set_root_bone(i, settings[i]->root_bone);
1250+
}
1251+
// Prior bone name.
1252+
if (!settings[i]->end_bone_name.is_empty()) {
1253+
set_end_bone_name(i, settings[i]->end_bone_name);
1254+
} else if (settings[i]->end_bone != -1) {
1255+
set_end_bone(i, settings[i]->end_bone);
1256+
}
1257+
}
1258+
}
1259+
12431260
void SpringBoneSimulator3D::_make_joints_dirty(int p_index) {
12441261
ERR_FAIL_INDEX(p_index, settings.size());
12451262
settings[p_index]->joints_dirty = true;

scene/3d/spring_bone_simulator_3d.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ class SpringBoneSimulator3D : public SkeletonModifier3D {
150150

151151
void _notification(int p_what);
152152

153+
virtual void _validate_bone_names() override;
154+
153155
static void _bind_methods();
154156

155157
virtual void _set_active(bool p_active) override;

0 commit comments

Comments
 (0)