summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <juan@godotengine.org>2018-06-27 16:30:48 -0300
committerJuan Linietsky <juan@godotengine.org>2018-06-27 16:30:48 -0300
commit9bab5134cfd4f0095545ae58fcf6a10dc07dc7d1 (patch)
tree1d5d15103cde49a22592b90c93b3cb80f53db7dd
parent68f7cf13c7326c077cc6ff8a6a267ae2610c4519 (diff)
The way multiple quaternions being slerped was not good, changed approach to one that seems to work better.
-rw-r--r--editor/plugins/root_motion_editor_plugin.cpp3
-rw-r--r--scene/animation/animation_tree.cpp10
-rw-r--r--scene/animation/animation_tree.h1
3 files changed, 12 insertions, 2 deletions
diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp
index e316116b43..89c1b3a978 100644
--- a/editor/plugins/root_motion_editor_plugin.cpp
+++ b/editor/plugins/root_motion_editor_plugin.cpp
@@ -124,9 +124,10 @@ void EditorPropertyRootMotion::_node_assign() {
ti = filters->create_item(ti);
parenthood[accum] = ti;
ti->set_text(0, F->get());
- ti->set_selectable(0, false);
+ ti->set_selectable(0, true);
ti->set_editable(0, false);
ti->set_icon(0, get_icon("BoneAttachment", "EditorIcons"));
+ ti->set_metadata(0, accum);
} else {
ti = parenthood[accum];
}
diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp
index 62f2726f75..1e583db676 100644
--- a/scene/animation/animation_tree.cpp
+++ b/scene/animation/animation_tree.cpp
@@ -813,6 +813,7 @@ void AnimationTree::_process_graph(float p_delta) {
t->process_pass = process_pass;
t->loc = Vector3();
t->rot = Quat();
+ t->rot_blend_accum = 0;
t->scale = Vector3();
}
@@ -876,7 +877,14 @@ void AnimationTree::_process_graph(float p_delta) {
continue;
t->loc = t->loc.linear_interpolate(loc, blend);
- t->rot = t->rot.slerp(rot, blend);
+ if (t->rot_blend_accum==0) {
+ t->rot = rot;
+ t->rot_blend_accum = blend;
+ } else {
+ float rot_total = t->rot_blend_accum + blend;
+ t->rot = rot.slerp(t->rot, t->rot_blend_accum / rot_total).normalized();
+ t->rot_blend_accum = rot_total;
+ }
t->scale = t->scale.linear_interpolate(scale, blend);
}
diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h
index 41d67118c1..540c36437a 100644
--- a/scene/animation/animation_tree.h
+++ b/scene/animation/animation_tree.h
@@ -161,6 +161,7 @@ private:
int bone_idx;
Vector3 loc;
Quat rot;
+ float rot_blend_accum;
Vector3 scale;
TrackCacheTransform() {