Ensure end events are called by clearTrack.

This commit is contained in:
NathanSweet 2016-06-26 19:08:02 +02:00
parent 0855ecd27c
commit 873e638b6e

View File

@ -102,13 +102,10 @@ public class AnimationState {
TrackEntry current = tracks.get(i); TrackEntry current = tracks.get(i);
if (current == null) continue; if (current == null) continue;
float time = current.time; float time = current.time, lastTime = current.lastTime, endTime = current.endTime, mix = current.mix;
float lastTime = current.lastTime;
float endTime = current.endTime;
boolean loop = current.loop; boolean loop = current.loop;
if (!loop && time > endTime) time = endTime; if (!loop && time > endTime) time = endTime;
float alpha = current.mix;
TrackEntry previous = current.previous; TrackEntry previous = current.previous;
if (previous != null) { if (previous != null) {
float previousTime = previous.time; float previousTime = previous.time;
@ -117,14 +114,14 @@ public class AnimationState {
queueEvents(previous, previous.lastTime, previousTime, previous.endTime); queueEvents(previous, previous.lastTime, previousTime, previous.endTime);
previous.lastTime = previousTime; previous.lastTime = previousTime;
alpha *= current.mixTime / current.mixDuration; mix *= current.mixTime / current.mixDuration;
if (alpha >= 1) { if (mix >= 1) {
alpha = 1; mix = 1;
queue.end(current.previous); queue.end(current.previous);
current.previous = null; current.previous = null;
} }
} }
current.animation.mix(skeleton, lastTime, time, loop, events, alpha); current.animation.mix(skeleton, lastTime, time, loop, events, mix);
queueEvents(current, lastTime, time, endTime); queueEvents(current, lastTime, time, endTime);
current.lastTime = current.time; current.lastTime = current.time;
@ -166,17 +163,16 @@ public class AnimationState {
if (trackIndex >= tracks.size) return; if (trackIndex >= tracks.size) return;
TrackEntry current = tracks.get(trackIndex); TrackEntry current = tracks.get(trackIndex);
if (current == null) return; if (current == null) return;
freeAll(current.next);
if (current.listener != null) current.listener.end(current); queue.end(current);
for (int i = 0, n = listeners.size; i < n; i++) if (current.previous != null) queue.end(current.previous);
listeners.get(i).end(current); queue.drain();
tracks.set(trackIndex, null); tracks.set(trackIndex, null);
freeAll(current);
if (current.previous != null) trackEntryPool.free(current.previous);
} }
/** @param entry May be null. */
private void freeAll (TrackEntry entry) { private void freeAll (TrackEntry entry) {
while (entry != null) { while (entry != null) {
TrackEntry next = entry.next; TrackEntry next = entry.next;