Check "done" state in original loop

My first attepmt I added a second loop to check if processing should
stop. This attempts to optimize by using the original loop (one loop).

Also resets `elapsed` time on finish of tween which fixes `tell()`.
This commit is contained in:
Răzvan C. Rădulescu 2018-06-26 19:19:11 +02:00
parent 5c914e2d5b
commit 07874292d0

View File

@ -521,8 +521,8 @@ void Tween::_tween_process(float p_delta) {
pending_update++;
// if repeat and all interpolates was finished then reset all interpolates
bool all_finished = true;
if (repeat) {
bool all_finished = true;
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
@ -538,9 +538,12 @@ void Tween::_tween_process(float p_delta) {
reset_all();
}
all_finished = true;
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
InterpolateData &data = E->get();
all_finished = all_finished && data.finish;
if (!data.active || data.finish)
continue;
@ -554,8 +557,8 @@ void Tween::_tween_process(float p_delta) {
continue;
else if (prev_delaying) {
emit_signal("tween_started", object, NodePath(Vector<StringName>(), data.key, false));
_apply_tween_value(data, data.initial_val);
emit_signal("tween_started", object, NodePath(Vector<StringName>(), data.key, false));
}
if (data.elapsed > (data.delay + data.duration)) {
@ -608,29 +611,18 @@ void Tween::_tween_process(float p_delta) {
if (data.finish) {
_apply_tween_value(data, data.final_val);
data.elapsed = 0;
emit_signal("tween_completed", object, NodePath(Vector<StringName>(), data.key, false));
// not repeat mode, remove completed action
if (!repeat)
call_deferred("_remove", object, NodePath(Vector<StringName>(), data.key, false), true);
}
} else if (!repeat)
all_finished = all_finished && data.finish;
}
pending_update--;
if (!repeat) {
bool all_finished = true;
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
InterpolateData &data = E->get();
if (data.finish == false) {
all_finished = false;
break;
}
}
if (all_finished)
set_active(false);
}
if (all_finished)
set_active(false);
}
void Tween::set_tween_process_mode(TweenProcessMode p_mode) {