Fix AnimationPlayer redundantly signaling finish

Now it will emit only when actually going from not-finished-yet to finished, as has always been the case.

The bug was a side effect of 2d2467c0ff.
This commit is contained in:
Pedro J. Estébanez 2017-12-28 21:48:09 +01:00
parent 1c0007ba71
commit 9c3fbfc9db
2 changed files with 14 additions and 8 deletions

View File

@ -548,12 +548,14 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, f
if (!backwards && cd.pos <= len && next_pos == len /*&& playback.blend.empty()*/) { if (!backwards && cd.pos <= len && next_pos == len /*&& playback.blend.empty()*/) {
//playback finished //playback finished
end_notify = true; end_reached = true;
end_notify = cd.pos < len; // Notify only if not already at the end
} }
if (backwards && cd.pos >= 0 && next_pos == 0 /*&& playback.blend.empty()*/) { if (backwards && cd.pos >= 0 && next_pos == 0 /*&& playback.blend.empty()*/) {
//playback finished //playback finished
end_notify = true; end_reached = true;
end_notify = cd.pos > 0; // Notify only if not already at the beginning
} }
} }
@ -680,24 +682,26 @@ void AnimationPlayer::_animation_process(float p_delta) {
if (playback.current.from) { if (playback.current.from) {
end_reached = false;
end_notify = false; end_notify = false;
_animation_process2(p_delta); _animation_process2(p_delta);
_animation_update_transforms(); _animation_update_transforms();
if (end_notify) { if (end_reached) {
if (queued.size()) { if (queued.size()) {
String old = playback.assigned; String old = playback.assigned;
play(queued.front()->get()); play(queued.front()->get());
String new_name = playback.assigned; String new_name = playback.assigned;
queued.pop_front(); queued.pop_front();
end_notify = false; if (end_notify)
emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name); emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name);
} else { } else {
//stop(); //stop();
playing = false; playing = false;
_set_process(false); _set_process(false);
end_notify = false; if (end_notify)
emit_signal(SceneStringNames::get_singleton()->animation_finished, playback.assigned); emit_signal(SceneStringNames::get_singleton()->animation_finished, playback.assigned);
} }
end_reached = false;
} }
} else { } else {
@ -957,7 +961,7 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float
c.current.speed_scale = p_custom_scale; c.current.speed_scale = p_custom_scale;
c.assigned = p_name; c.assigned = p_name;
if (!end_notify) if (!end_reached)
queued.clear(); queued.clear();
_set_process(true); // always process when starting an animation _set_process(true); // always process when starting an animation
playing = true; playing = true;
@ -1363,6 +1367,7 @@ AnimationPlayer::AnimationPlayer() {
cache_update_size = 0; cache_update_size = 0;
cache_update_prop_size = 0; cache_update_prop_size = 0;
speed_scale = 1; speed_scale = 1;
end_reached = false;
end_notify = false; end_notify = false;
animation_process_mode = ANIMATION_PROCESS_IDLE; animation_process_mode = ANIMATION_PROCESS_IDLE;
processing = false; processing = false;

View File

@ -205,6 +205,7 @@ private:
List<StringName> queued; List<StringName> queued;
bool end_reached;
bool end_notify; bool end_notify;
String autoplay; String autoplay;