diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java index 553d1566e..2566b4b4f 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java @@ -37,7 +37,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.FloatArray; - +import com.badlogic.gdx.utils.IntSet; import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.VertexAttachment; @@ -45,6 +45,7 @@ import com.esotericsoftware.spine.attachments.VertexAttachment; public class Animation { final String name; final Array timelines; + final IntSet timelineIds; float duration; public Animation (String name, Array timelines, float duration) { @@ -52,6 +53,9 @@ public class Animation { if (timelines == null) throw new IllegalArgumentException("timelines cannot be null."); this.name = name; this.timelines = timelines; + this.timelineIds = new IntSet(); + for (Timeline timeline : timelines) + timelineIds.add(timeline.getPropertyId()); this.duration = duration; } @@ -59,6 +63,11 @@ public class Animation { return timelines; } + /** Whether the timeline with the property id is contained in this animation **/ + boolean hasTimeline (int id) { + return timelineIds.contains(id); + } + /** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */ public float getDuration () { return duration; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index 9e05ee108..0bb9ca2c5 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -745,11 +745,11 @@ public class AnimationState { if (!propertyIDs.add(id)) timelineMode[i] = SUBSEQUENT; else if (to == null || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline - || timeline instanceof EventTimeline || !hasTimeline(to, id)) { + || timeline instanceof EventTimeline || !to.animation.hasTimeline(id)) { timelineMode[i] = FIRST; } else { for (TrackEntry next = to.mixingTo; next != null; next = next.mixingTo) { - if (hasTimeline(next, id)) continue; + if (next.animation.hasTimeline(id)) continue; if (next.mixDuration > 0) { timelineMode[i] = HOLD_MIX; timelineHoldMix[i] = next; @@ -776,13 +776,6 @@ public class AnimationState { } } - private boolean hasTimeline (TrackEntry entry, int id) { - Object[] timelines = entry.animation.timelines.items; - for (int i = 0, n = entry.animation.timelines.size; i < n; i++) - if (((Timeline)timelines[i]).getPropertyId() == id) return true; - return false; - } - /** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */ public TrackEntry getCurrent (int trackIndex) { if (trackIndex < 0) throw new IllegalArgumentException("trackIndex must be >= 0.");