Skip to content

Commit

Permalink
Merge pull request #60247 from ScottVMariotte/AnimationTree_atEndFix
Browse files Browse the repository at this point in the history
Replaced `loops_current` with `end_loop` in `AnimationNodeStateMachinePlayback`
  • Loading branch information
akien-mga authored Apr 28, 2022
2 parents e27e376 + c526ee6 commit 1eb0936
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 13 deletions.
16 changes: 4 additions & 12 deletions scene/animation/animation_node_state_machine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,6 @@ bool AnimationNodeStateMachinePlayback::_travel(AnimationNodeStateMachine *p_sta
return true; //nothing to do
}

loops_current = 0; // reset loops, so fade does not happen immediately

Vector2 current_pos = p_state_machine->states[current].position;
Vector2 target_pos = p_state_machine->states[p_travel].position;

Expand Down Expand Up @@ -352,7 +350,6 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s

len_current = p_state_machine->blend_node(current, p_state_machine->states[current].node, 0, true, 1.0, AnimationNode::FILTER_IGNORE, false);
pos_current = 0;
loops_current = 0;
}

if (!p_state_machine->states.has(current)) {
Expand Down Expand Up @@ -388,12 +385,8 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s
}

{ //advance and loop check

float next_pos = len_current - rem;

if (next_pos < pos_current) {
loops_current++;
}
end_loop = next_pos < pos_current;
pos_current = next_pos; //looped
}

Expand Down Expand Up @@ -443,15 +436,15 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s
bool goto_next = false;

if (switch_mode == AnimationNodeStateMachineTransition::SWITCH_MODE_AT_END) {
goto_next = next_xfade >= (len_current - pos_current) || loops_current > 0;
if (loops_current > 0) {
goto_next = next_xfade >= (len_current - pos_current) || end_loop;
if (end_loop) {
next_xfade = 0;
}
} else {
goto_next = fading_from == StringName();
}

if (goto_next) { //loops should be used because fade time may be too small or zero and animation may have looped
if (goto_next) { //end_loop should be used because fade time may be too small or zero and animation may have looped

if (next_xfade) {
//time to fade, baby
Expand All @@ -478,7 +471,6 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s
}

rem = len_current; //so it does not show 0 on transition
loops_current = 0;
}
}

Expand Down
2 changes: 1 addition & 1 deletion scene/animation/animation_node_state_machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class AnimationNodeStateMachinePlayback : public Resource {

float len_current = 0.0;
float pos_current = 0.0;
int loops_current = 0;
bool end_loop = false;

StringName current;

Expand Down

0 comments on commit 1eb0936

Please sign in to comment.