summaryrefslogtreecommitdiffstats
path: root/scene/3d/skeleton_3d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/3d/skeleton_3d.cpp')
-rw-r--r--scene/3d/skeleton_3d.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp
index 445c1003b5..ee30f60c72 100644
--- a/scene/3d/skeleton_3d.cpp
+++ b/scene/3d/skeleton_3d.cpp
@@ -30,7 +30,6 @@
#include "skeleton_3d.h"
-#include "core/object/message_queue.h"
#include "core/variant/type_info.h"
#include "scene/3d/physics_body_3d.h"
#include "scene/resources/surface_tool.h"
@@ -95,6 +94,19 @@ bool Skeleton3D::_set(const StringName &p_path, const Variant &p_value) {
set_bone_pose_rotation(which, p_value);
} else if (what == "scale") {
set_bone_pose_scale(which, p_value);
+#ifndef DISABLE_DEPRECATED
+ } else if (what == "pose") {
+ // Kept for compatibility from 3.x to 4.x.
+ WARN_DEPRECATED_MSG("Skeleton uses old pose format, which is deprecated (and loads slower). Consider re-importing or re-saving the scene." +
+ (is_inside_tree() ? vformat(" Path: \"%s\"", get_path()) : String()));
+ // Old Skeleton poses were relative to rest, new ones are absolute, so we need to recompute the pose.
+ // Skeleton3D nodes were always written with rest before pose, so this *SHOULD* work...
+ Transform3D rest = get_bone_rest(which);
+ Transform3D pose = rest * (Transform3D)p_value;
+ set_bone_pose_position(which, pose.origin);
+ set_bone_pose_rotation(which, pose.basis.get_rotation_quaternion());
+ set_bone_pose_scale(which, pose.basis.get_scale());
+#endif
} else {
return false;
}