Fixed incorrect blending in Pos/Rot/Scl Track

This commit is contained in:
Silc 'Tokage' Renew 2021-10-25 06:42:01 +09:00
parent e317e34c15
commit 78f5ce04f4
2 changed files with 34 additions and 33 deletions

View file

@ -934,15 +934,12 @@ void AnimationTree::_process_graph(real_t p_delta) {
#ifndef _3D_DISABLED
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->loc = Vector3();
t->rot = Quaternion();
t->rot_blend_accum = 0;
t->scale = Vector3(1, 1, 1);
}
if (track->root_motion) {
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->loc = Vector3();
}
double prev_time = time - delta;
if (!backward) {
if (prev_time < 0) {
@ -1015,6 +1012,12 @@ void AnimationTree::_process_graph(real_t p_delta) {
Vector3 loc;
Error err = a->position_track_interpolate(i, time, &loc);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->loc = loc;
}
if (err != OK) {
continue;
}
@ -1027,15 +1030,12 @@ void AnimationTree::_process_graph(real_t p_delta) {
#ifndef _3D_DISABLED
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->loc = Vector3();
t->rot = Quaternion();
t->rot_blend_accum = 0;
t->scale = Vector3(1, 1, 1);
}
if (track->root_motion) {
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->rot = Quaternion();
}
double prev_time = time - delta;
if (!backward) {
if (prev_time < 0) {
@ -1111,18 +1111,17 @@ void AnimationTree::_process_graph(real_t p_delta) {
Quaternion rot;
Error err = a->rotation_track_interpolate(i, time, &rot);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->rot = rot;
}
if (err != OK) {
continue;
}
if (t->rot_blend_accum == 0) {
t->rot = rot;
t->rot_blend_accum = blend;
} else {
real_t 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->rot = t->rot.slerp(rot, blend).normalized();
}
#endif // _3D_DISABLED
} break;
@ -1130,15 +1129,12 @@ void AnimationTree::_process_graph(real_t p_delta) {
#ifndef _3D_DISABLED
TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->loc = Vector3();
t->rot = Quaternion();
t->rot_blend_accum = 0;
t->scale = Vector3(1, 1, 1);
}
if (track->root_motion) {
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->scale = Vector3(1, 1, 1);
}
double prev_time = time - delta;
if (!backward) {
if (prev_time < 0) {
@ -1211,6 +1207,12 @@ void AnimationTree::_process_graph(real_t p_delta) {
Vector3 scale;
Error err = a->scale_track_interpolate(i, time, &scale);
if (t->process_pass != process_pass) {
t->process_pass = process_pass;
t->scale = scale;
}
if (err != OK) {
continue;
}

View file

@ -199,7 +199,6 @@ private:
bool scale_used = false;
Vector3 loc;
Quaternion rot;
real_t rot_blend_accum = 0.0;
Vector3 scale;
TrackCacheTransform() {