Skip to content

Commit b76cdf5

Browse files
committed
Make LookAtModifier3D adopt to bone name method
1 parent f952bfe commit b76cdf5

File tree

3 files changed

+69
-9
lines changed

3 files changed

+69
-9
lines changed

doc/classes/LookAtModifier3D.xml

+8-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@
3232
</method>
3333
</methods>
3434
<members>
35-
<member name="bone" type="int" setter="set_bone" getter="get_bone" default="0">
36-
The bone index of the [Skeleton3D] that the modification will operate on.
35+
<member name="bone" type="int" setter="set_bone" getter="get_bone" default="-1">
36+
Index of the [member bone_name] in the parent [Skeleton3D].
37+
</member>
38+
<member name="bone_name" type="String" setter="set_bone_name" getter="get_bone_name" default="&quot;&quot;">
39+
The bone name of the [Skeleton3D] that the modification will operate on.
3740
</member>
3841
<member name="duration" type="float" setter="set_duration" getter="get_duration" default="0.0">
3942
The duration of the time-based interpolation. Interpolation is triggered at the following cases:
@@ -48,6 +51,9 @@
4851
The forward axis of the bone. This [SkeletonModifier3D] modifies the bone so that this axis points toward the [member target_node].
4952
</member>
5053
<member name="origin_bone" type="int" setter="set_origin_bone" getter="get_origin_bone">
54+
Index of the [member origin_bone_name] in the parent [Skeleton3D].
55+
</member>
56+
<member name="origin_bone_name" type="String" setter="set_origin_bone_name" getter="get_origin_bone_name">
5157
If [member origin_from] is [constant ORIGIN_FROM_SPECIFIC_BONE], the bone global pose position specified for this is used as origin.
5258
</member>
5359
<member name="origin_external_node" type="NodePath" setter="set_origin_external_node" getter="get_origin_external_node">

scene/3d/look_at_modifier_3d.cpp

+54-6
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
void LookAtModifier3D::_validate_property(PropertyInfo &p_property) const {
3434
SkeletonModifier3D::_validate_property(p_property);
3535

36-
if (p_property.name == "bone" || p_property.name == "origin_bone") {
36+
if (p_property.name == "bone_name" || p_property.name == "origin_bone_name") {
3737
Skeleton3D *skeleton = get_skeleton();
3838
if (skeleton) {
3939
p_property.hint = PROPERTY_HINT_ENUM;
@@ -49,11 +49,11 @@ void LookAtModifier3D::_validate_property(PropertyInfo &p_property) const {
4949
p_property.usage = PROPERTY_USAGE_NONE;
5050
}
5151
} 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") {
5353
p_property.usage = PROPERTY_USAGE_NONE;
5454
}
5555
} 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") {
5757
p_property.usage = PROPERTY_USAGE_NONE;
5858
}
5959
}
@@ -75,8 +75,29 @@ PackedStringArray LookAtModifier3D::get_configuration_warnings() const {
7575
return warnings;
7676
}
7777

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+
7890
void LookAtModifier3D::set_bone(int p_bone) {
7991
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+
}
80101
}
81102

82103
int LookAtModifier3D::get_bone() const {
@@ -132,8 +153,29 @@ LookAtModifier3D::OriginFrom LookAtModifier3D::get_origin_from() const {
132153
return origin_from;
133154
}
134155

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+
135168
void LookAtModifier3D::set_origin_bone(int p_bone) {
136169
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+
}
137179
}
138180

139181
int LookAtModifier3D::get_origin_bone() const {
@@ -330,6 +372,8 @@ void LookAtModifier3D::_bind_methods() {
330372
ClassDB::bind_method(D_METHOD("set_target_node", "target_node"), &LookAtModifier3D::set_target_node);
331373
ClassDB::bind_method(D_METHOD("get_target_node"), &LookAtModifier3D::get_target_node);
332374

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);
333377
ClassDB::bind_method(D_METHOD("set_bone", "bone"), &LookAtModifier3D::set_bone);
334378
ClassDB::bind_method(D_METHOD("get_bone"), &LookAtModifier3D::get_bone);
335379
ClassDB::bind_method(D_METHOD("set_forward_axis", "forward_axis"), &LookAtModifier3D::set_forward_axis);
@@ -343,6 +387,8 @@ void LookAtModifier3D::_bind_methods() {
343387

344388
ClassDB::bind_method(D_METHOD("set_origin_from", "origin_from"), &LookAtModifier3D::set_origin_from);
345389
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);
346392
ClassDB::bind_method(D_METHOD("set_origin_bone", "bone"), &LookAtModifier3D::set_origin_bone);
347393
ClassDB::bind_method(D_METHOD("get_origin_bone"), &LookAtModifier3D::get_origin_bone);
348394
ClassDB::bind_method(D_METHOD("set_origin_external_node", "external_node"), &LookAtModifier3D::set_origin_external_node);
@@ -397,14 +443,16 @@ void LookAtModifier3D::_bind_methods() {
397443

398444
ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "target_node", PROPERTY_HINT_NODE_TYPE, "Node3D"), "set_target_node", "get_target_node");
399445

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");
401448
ADD_PROPERTY(PropertyInfo(Variant::INT, "forward_axis", PROPERTY_HINT_ENUM, "+X,-X,+Y,-Y,+Z,-Z"), "set_forward_axis", "get_forward_axis");
402449
ADD_PROPERTY(PropertyInfo(Variant::INT, "primary_rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z"), "set_primary_rotation_axis", "get_primary_rotation_axis");
403450
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_secondary_rotation"), "set_use_secondary_rotation", "is_using_secondary_rotation");
404451

405452
ADD_GROUP("Origin Settings", "origin_");
406453
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");
408456
ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "origin_external_node", PROPERTY_HINT_NODE_TYPE, "Node3D"), "set_origin_external_node", "get_origin_external_node");
409457
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "origin_offset"), "set_origin_offset", "get_origin_offset");
410458
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() {
474522
destination = skeleton->get_bone_pose_rotation(bone);
475523
} else {
476524
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()) {
478526
origin_tr = skeleton->get_global_transform() * skeleton->get_bone_global_pose(origin_bone);
479527
} else if (origin_from == ORIGIN_FROM_EXTERNAL_NODE) {
480528
Node3D *origin_src = Object::cast_to<Node3D>(get_node_or_null(origin_external_node));

scene/3d/look_at_modifier_3d.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class LookAtModifier3D : public SkeletonModifier3D {
5454
};
5555

5656
private:
57-
int bone = 0;
57+
String bone_name;
58+
int bone = -1;
5859

5960
Vector3 forward_vector;
6061
Vector3 forward_vector_nrm;
@@ -64,6 +65,7 @@ class LookAtModifier3D : public SkeletonModifier3D {
6465
bool use_secondary_rotation = true;
6566

6667
OriginFrom origin_from = ORIGIN_FROM_SELF;
68+
String origin_bone_name;
6769
int origin_bone = -1;
6870
NodePath origin_external_node;
6971

@@ -123,6 +125,8 @@ class LookAtModifier3D : public SkeletonModifier3D {
123125
virtual void _process_modification() override;
124126

125127
public:
128+
void set_bone_name(const String &p_bone_name);
129+
String get_bone_name() const;
126130
void set_bone(int p_bone);
127131
int get_bone() const;
128132

@@ -135,6 +139,8 @@ class LookAtModifier3D : public SkeletonModifier3D {
135139

136140
void set_origin_from(OriginFrom p_origin_from);
137141
OriginFrom get_origin_from() const;
142+
void set_origin_bone_name(const String &p_bone_name);
143+
String get_origin_bone_name() const;
138144
void set_origin_bone(int p_bone);
139145
int get_origin_bone() const;
140146
void set_origin_external_node(const NodePath &p_external_node);

0 commit comments

Comments
 (0)