ソースを参照

[c] Port of commit 8d058fb: Improved AnimationState behavior when paused. See #2705

Mario Zechner 9 ヶ月 前
コミット
140335636c

+ 11 - 9
spine-c/spine-c/src/spine/AnimationState.c

@@ -350,16 +350,18 @@ int /*boolean*/ _spAnimationState_updateMixingFrom(spAnimationState *self, spTra
 	from->animationLast = from->nextAnimationLast;
 	from->trackLast = from->nextTrackLast;
 
-	/* Require mixTime > 0 to ensure the mixing from entry was applied at least once. */
-	if (to->mixTime > 0 && to->mixTime >= to->mixDuration) {
-		/* Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame). */
-		if (from->totalAlpha == 0 || to->mixDuration == 0) {
-			to->mixingFrom = from->mixingFrom;
-			if (from->mixingFrom != 0) from->mixingFrom->mixingTo = to;
-			to->interruptAlpha = from->interruptAlpha;
-			_spEventQueue_end(internal->queue, from);
+	if (to->nextTrackLast != -1) {                           // The from entry was applied at least once.
+		int discard = to->mixTime == 0 && from->mixTime == 0;// Discard the from entry when neither have advanced yet.
+		if (to->mixTime >= to->mixDuration || discard) {
+			// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
+			if (from->totalAlpha == 0 || to->mixDuration == 0 || discard) {
+				to->mixingFrom = from->mixingFrom;
+				if (from->mixingFrom) from->mixingFrom->mixingTo = to;
+				to->interruptAlpha = from->interruptAlpha;
+				_spEventQueue_end(internal->queue, from);
+			}
+			return finished;
 		}
-		return finished;
 	}
 
 	from->trackTime += delta * from->timeScale;

+ 11 - 23
spine-cpp/spine-cpp/src/spine/AnimationState.cpp

@@ -794,31 +794,19 @@ bool AnimationState::updateMixingFrom(TrackEntry *to, float delta) {
 	from->_animationLast = from->_nextAnimationLast;
 	from->_trackLast = from->_nextTrackLast;
 
-	// Require mixTime > 0 to ensure the mixing from entry was applied at least once.
-	if (to->_mixTime > 0 && to->_mixTime >= to->_mixDuration) {
-		// Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
-		if (from->_totalAlpha == 0 || to->_mixDuration == 0) {
-			to->_mixingFrom = from->_mixingFrom;
-			if (from->_mixingFrom != NULL) from->_mixingFrom->_mixingTo = to;
-			to->_interruptAlpha = from->_interruptAlpha;
-			_queue->end(from);
-		}
-		return finished;
-	}
-
-	if (to->_nextTrackLast != -1) { // The from entry was applied at least once.
-			bool discard = to->_mixTime == 0 && from->_mixTime == 0; // Discard the from entry when neither have advanced yet.
-			if (to->_mixTime >= to->_mixDuration || discard) {
-				// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
-				if (from->_totalAlpha == 0 || to->_mixDuration == 0 || discard) {
-					to->_mixingFrom = from->_mixingFrom;
-					if (from->_mixingFrom) from->_mixingFrom->_mixingTo = to;
-					to->_interruptAlpha = from->_interruptAlpha;
-					_queue->end(from);
-				}
-				return finished;
+	if (to->_nextTrackLast != -1) {                             // The from entry was applied at least once.
+		bool discard = to->_mixTime == 0 && from->_mixTime == 0;// Discard the from entry when neither have advanced yet.
+		if (to->_mixTime >= to->_mixDuration || discard) {
+			// Require totalAlpha == 0 to ensure mixing is complete or the transition is a single frame or discarded.
+			if (from->_totalAlpha == 0 || to->_mixDuration == 0 || discard) {
+				to->_mixingFrom = from->_mixingFrom;
+				if (from->_mixingFrom) from->_mixingFrom->_mixingTo = to;
+				to->_interruptAlpha = from->_interruptAlpha;
+				_queue->end(from);
 			}
+			return finished;
 		}
+	}
 
 	from->_trackTime += delta * from->_timeScale;
 	to->_mixTime += delta;