AnimationTreePlayer (Blend3): process all inputs.

Always call _process_node on all three inputs so that looped animations
don't get out of sync.

(cherry picked from commit b79351aa45)
This commit is contained in:
Josh Grams 2016-02-28 06:55:53 -05:00 committed by Rémi Verschelde
parent cafcdb015d
commit bea8e1654e

View file

@ -607,20 +607,21 @@ float AnimationTreePlayer::_process_node(const StringName& p_node,AnimationNode
Blend3Node *bn = static_cast<Blend3Node*>(nb); Blend3Node *bn = static_cast<Blend3Node*>(nb);
float rem; float rem;
float blend, lower_blend, upper_blend;
if (bn->value==0) { if (bn->value < 0) {
rem = _process_node(bn->inputs[1].node,r_prev_anim,p_weight,p_time,switched,p_seek,p_filter,p_reverse_weight); lower_blend = -bn->value;
} else if (bn->value>0) { blend = 1.0 - lower_blend;
upper_blend = 0;
rem = _process_node(bn->inputs[1].node,r_prev_anim,p_weight*(1.0-bn->value),p_time,switched,p_seek,p_filter,p_reverse_weight*(1.0-bn->value));
_process_node(bn->inputs[2].node,r_prev_anim,p_weight*bn->value,p_time,switched,p_seek,p_filter,p_reverse_weight*bn->value);
} else { } else {
lower_blend = 0;
rem = _process_node(bn->inputs[1].node,r_prev_anim,p_weight*(1.0+bn->value),p_time,switched,p_seek,p_filter,p_reverse_weight*(1.0+bn->value)); blend = 1.0 - bn->value;
_process_node(bn->inputs[0].node,r_prev_anim,p_weight*-bn->value,p_time,switched,p_seek,p_filter,p_reverse_weight*-bn->value); upper_blend = bn->value;
} }
rem = _process_node(bn->inputs[1].node,r_prev_anim,p_weight*blend,p_time,switched,p_seek,p_filter,p_reverse_weight*blend);
_process_node(bn->inputs[2].node,r_prev_anim,p_weight*upper_blend,p_time,switched,p_seek,p_filter,p_reverse_weight*upper_blend);
_process_node(bn->inputs[0].node,r_prev_anim,p_weight*lower_blend,p_time,switched,p_seek,p_filter,p_reverse_weight*lower_blend);
return rem; return rem;
} break; } break;
case NODE_BLEND4: { case NODE_BLEND4: {