summaryrefslogtreecommitdiffstats
path: root/scene/2d/skeleton_2d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d/skeleton_2d.cpp')
-rw-r--r--scene/2d/skeleton_2d.cpp39
1 files changed, 15 insertions, 24 deletions
diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp
index 527bbaf956..69e0414855 100644
--- a/scene/2d/skeleton_2d.cpp
+++ b/scene/2d/skeleton_2d.cpp
@@ -433,29 +433,23 @@ PackedStringArray Bone2D::get_configuration_warnings() const {
}
void Bone2D::calculate_length_and_rotation() {
- // if there is at least a single child Bone2D node, we can calculate
+ // If there is at least a single child Bone2D node, we can calculate
// the length and direction. We will always just use the first Bone2D for this.
- bool calculated = false;
int child_count = get_child_count();
- if (child_count > 0) {
- for (int i = 0; i < child_count; i++) {
- Bone2D *child = Object::cast_to<Bone2D>(get_child(i));
- if (child) {
- Vector2 child_local_pos = to_local(child->get_global_position());
- length = child_local_pos.length();
- bone_angle = child_local_pos.normalized().angle();
- calculated = true;
- break;
- }
+ Transform2D global_inv = get_global_transform().affine_inverse();
+
+ for (int i = 0; i < child_count; i++) {
+ Bone2D *child = Object::cast_to<Bone2D>(get_child(i));
+ if (child) {
+ Vector2 child_local_pos = global_inv.xform(child->get_global_position());
+ length = child_local_pos.length();
+ bone_angle = child_local_pos.angle();
+ return; // Finished!
}
}
- if (calculated) {
- return; // Finished!
- } else {
- WARN_PRINT("No Bone2D children of node " + get_name() + ". Cannot calculate bone length or angle reliably.\nUsing transform rotation for bone angle");
- bone_angle = get_transform().get_rotation();
- return;
- }
+
+ WARN_PRINT("No Bone2D children of node " + get_name() + ". Cannot calculate bone length or angle reliably.\nUsing transform rotation for bone angle.");
+ bone_angle = get_transform().get_rotation();
}
void Bone2D::set_autocalculate_length_and_angle(bool p_autocalculate) {
@@ -555,7 +549,7 @@ void Skeleton2D::_make_bone_setup_dirty() {
}
bone_setup_dirty = true;
if (is_inside_tree()) {
- call_deferred(SNAME("_update_bone_setup"));
+ callable_mp(this, &Skeleton2D::_update_bone_setup).call_deferred();
}
}
@@ -593,7 +587,7 @@ void Skeleton2D::_make_transform_dirty() {
}
transform_dirty = true;
if (is_inside_tree()) {
- call_deferred(SNAME("_update_transform"));
+ callable_mp(this, &Skeleton2D::_update_transform).call_deferred();
}
}
@@ -764,9 +758,6 @@ void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {
}
void Skeleton2D::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_update_bone_setup"), &Skeleton2D::_update_bone_setup);
- ClassDB::bind_method(D_METHOD("_update_transform"), &Skeleton2D::_update_transform);
-
ClassDB::bind_method(D_METHOD("get_bone_count"), &Skeleton2D::get_bone_count);
ClassDB::bind_method(D_METHOD("get_bone", "idx"), &Skeleton2D::get_bone);