From 0d444eb5deb9133fa592318327d9214a7d7e80a7 Mon Sep 17 00:00:00 2001 From: badlogic Date: Mon, 28 Nov 2016 16:44:16 +0100 Subject: [PATCH 1/2] [c] Ported latest AnimationState changes --- spine-c/spine-c/src/spine/AnimationState.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/spine-c/spine-c/src/spine/AnimationState.c b/spine-c/spine-c/src/spine/AnimationState.c index 2ae508aab..d1aaaf80d 100644 --- a/spine-c/spine-c/src/spine/AnimationState.c +++ b/spine-c/spine-c/src/spine/AnimationState.c @@ -46,7 +46,7 @@ void _spAnimationState_updateMixingFrom (spAnimationState* self, spTrackEntry* e float _spAnimationState_applyMixingFrom (spAnimationState* self, spTrackEntry* entry, spSkeleton* skeleton); void _spAnimationState_applyRotateTimeline (spAnimationState* self, spTimeline* timeline, spSkeleton* skeleton, float time, float alpha, int /*boolean*/ setupPose, float* timelinesRotation, int i, int /*boolean*/ firstFrame); void _spAnimationState_queueEvents (spAnimationState* self, spTrackEntry* entry, float animationTime); -void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* current); +void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* current, int /*boolean*/ interrupt); spTrackEntry* _spAnimationState_expandToIndex (spAnimationState* self, int index); spTrackEntry* _spAnimationState_trackEntry (spAnimationState* self, int trackIndex, spAnimation* animation, int /*boolean*/ loop, spTrackEntry* last); void _spAnimationState_disposeNext (spAnimationState* self, spTrackEntry* entry); @@ -260,7 +260,7 @@ void spAnimationState_update (spAnimationState* self, float delta) { next->delay = 0; next->trackTime = nextTime + delta * next->timeScale; current->trackTime += currentDelta; - _spAnimationState_setCurrent(self, i, next); + _spAnimationState_setCurrent(self, i, next, 1); while (next->mixingFrom) { next->mixTime += currentDelta; next = next->mixingFrom; @@ -571,13 +571,13 @@ void spAnimationState_clearTrack (spAnimationState* self, int trackIndex) { _spEventQueue_drain(internal->queue); } -void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* current) { +void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* current, int /*boolean*/ interrupt) { _spAnimationState* internal = SUB_CAST(_spAnimationState, self); spTrackEntry* from = _spAnimationState_expandToIndex(self, index); self->tracks[index] = current; if (from) { - _spEventQueue_interrupt(internal->queue, from); + if (interrupt) _spEventQueue_interrupt(internal->queue, from); current->mixingFrom = from; current->mixTime = 0; @@ -598,6 +598,7 @@ spTrackEntry* spAnimationState_setAnimationByName (spAnimationState* self, int t spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop) { spTrackEntry* entry; _spAnimationState* internal = SUB_CAST(_spAnimationState, self); + int interrupt = 1; spTrackEntry* current = _spAnimationState_expandToIndex(self, trackIndex); if (current) { if (current->nextTrackLast == -1) { @@ -607,11 +608,12 @@ spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIn _spEventQueue_end(internal->queue, current); _spAnimationState_disposeNext(self, current); current = current->mixingFrom; + interrupt = 0; } else _spAnimationState_disposeNext(self, current); } entry = _spAnimationState_trackEntry(self, trackIndex, animation, loop, current); - _spAnimationState_setCurrent(self, trackIndex, entry); + _spAnimationState_setCurrent(self, trackIndex, entry, interrupt); _spEventQueue_drain(internal->queue); return entry; } @@ -637,7 +639,7 @@ spTrackEntry* spAnimationState_addAnimation (spAnimationState* self, int trackIn entry = _spAnimationState_trackEntry(self, trackIndex, animation, loop, last); if (!last) { - _spAnimationState_setCurrent(self, trackIndex, entry); + _spAnimationState_setCurrent(self, trackIndex, entry, 1); _spEventQueue_drain(internal->queue); } else { last->next = entry; From 9c1b5b209ae48815adee967c7f57e99780817466 Mon Sep 17 00:00:00 2001 From: badlogic Date: Mon, 28 Nov 2016 16:46:14 +0100 Subject: [PATCH 2/2] [csharp] Ported latest AnimationState changes --- spine-csharp/src/AnimationState.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/spine-csharp/src/AnimationState.cs b/spine-csharp/src/AnimationState.cs index 804bc5a8f..c05067502 100644 --- a/spine-csharp/src/AnimationState.cs +++ b/spine-csharp/src/AnimationState.cs @@ -95,7 +95,7 @@ namespace Spine { next.delay = 0; next.trackTime = nextTime + (delta * next.timeScale); current.trackTime += currentDelta; - SetCurrent(i, next); + SetCurrent(i, next, true); while (next.mixingFrom != null) { next.mixTime += currentDelta; next = next.mixingFrom; @@ -378,12 +378,12 @@ namespace Spine { queue.Drain(); } - private void SetCurrent (int index, TrackEntry current) { + private void SetCurrent (int index, TrackEntry current, bool interrupt) { TrackEntry from = ExpandToIndex(index); tracks.Items[index] = current; if (from != null) { - queue.Interrupt(from); + if (interrupt) queue.Interrupt(from); current.mixingFrom = from; current.mixTime = 0; @@ -413,6 +413,7 @@ namespace Spine { /// after . public TrackEntry SetAnimation (int trackIndex, Animation animation, bool loop) { if (animation == null) throw new ArgumentNullException("animation", "animation cannot be null."); + bool interrupt = true; TrackEntry current = ExpandToIndex(trackIndex); if (current != null) { if (current.nextTrackLast == -1) { @@ -422,12 +423,13 @@ namespace Spine { queue.End(current); DisposeNext(current); current = current.mixingFrom; + interrupt = false; } else { DisposeNext(current); } } TrackEntry entry = NewTrackEntry(trackIndex, animation, loop, current); - SetCurrent(trackIndex, entry); + SetCurrent(trackIndex, entry, interrupt); queue.Drain(); return entry; } @@ -460,7 +462,7 @@ namespace Spine { TrackEntry entry = NewTrackEntry(trackIndex, animation, loop, last); if (last == null) { - SetCurrent(trackIndex, entry); + SetCurrent(trackIndex, entry, true); queue.Drain(); } else { last.next = entry;