Browse Source

Merge branch 'master' of https://github.com/EsotericSoftware/spine-runtimes

pharan 8 years ago
parent
commit
be13e57bbc

+ 2 - 2
spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/AnimationStateTests.java

@@ -650,8 +650,8 @@ public class AnimationStateTests {
 			expect(0, "end", 0.8f, 0.9f), //
 			expect(0, "dispose", 0.8f, 0.9f), //
 
-			expect(-1, "end", 0.1f, 0.9f), //
-			expect(-1, "dispose", 0.1f, 0.9f) //
+			expect(-1, "end", 0.2f, 1), //
+			expect(-1, "dispose", 0.2f, 1) //
 		);
 		state.addAnimation(0, "events1", false, 0);
 		run(0.1f, 10, new TestListener() {

+ 10 - 8
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java

@@ -108,9 +108,7 @@ public class AnimationState {
 					}
 					continue;
 				}
-				updateMixingFrom(current, delta);
 			} else {
-				updateMixingFrom(current, delta);
 				// Clear the track when there is no next entry, the track end time is reached, and there is no mixingFrom.
 				if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
 					tracks.set(i, null);
@@ -119,6 +117,7 @@ public class AnimationState {
 					continue;
 				}
 			}
+			updateMixingFrom(current, delta);
 
 			current.trackTime += currentDelta;
 		}
@@ -158,7 +157,10 @@ public class AnimationState {
 
 			// Apply mixing from entries first.
 			float mix = current.alpha;
-			if (current.mixingFrom != null) mix *= applyMixingFrom(current, skeleton);
+			if (current.mixingFrom != null)
+				mix *= applyMixingFrom(current, skeleton);
+			else if (current.trackTime >= current.trackEnd) //
+				mix = 0; // Set to setup pose the last time the entry will be applied.
 
 			// Apply current entry.
 			float animationLast = current.animationLast, animationTime = current.getAnimationTime();
@@ -408,11 +410,11 @@ public class AnimationState {
 		if (current != null) {
 			if (current.nextTrackLast == -1) {
 				// Don't mix from an entry that was never applied.
-				tracks.set(trackIndex, null);
+				tracks.set(trackIndex, current.mixingFrom);
 				queue.interrupt(current);
 				queue.end(current);
 				disposeNext(current);
-				current = null;
+				current = current.mixingFrom;
 			} else
 				disposeNext(current);
 		}
@@ -750,10 +752,10 @@ public class AnimationState {
 		/** The track time in seconds when this animation will be removed from the track. Defaults to the animation
 		 * {@link Animation#duration} for non-looping animations and the highest float possible for looping animations. If the track
 		 * end time is reached, no other animations are queued for playback, and mixing from any previous animations is complete,
-		 * then the track is cleared, leaving skeletons in their previous pose.
+		 * then the properties keyed by the animation are set to the setup pose and the track is cleared.
 		 * <p>
-		 * It may be desired to use {@link AnimationState#addEmptyAnimation(int, float, float)} to mix the skeletons back to the
-		 * setup pose, rather than leaving them in their previous pose. */
+		 * It may be desired to use {@link AnimationState#addEmptyAnimation(int, float, float)} to mix the properties back to the
+		 * setup pose over time, rather than have it happen instantly. */
 		public float getTrackEnd () {
 			return trackEnd;
 		}

+ 6 - 2
spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java

@@ -227,10 +227,8 @@ public class SkeletonViewer extends ApplicationAdapter {
 			state.setEmptyAnimation(track, 0);
 			entry = state.addAnimation(track, ui.animationList.getSelected(), ui.loopCheckbox.isChecked(), 0);
 			entry.setMixDuration(ui.mixSlider.getValue());
-			entry.setTrackEnd(Integer.MAX_VALUE);
 		} else {
 			entry = state.setAnimation(track, ui.animationList.getSelected(), ui.loopCheckbox.isChecked());
-			entry.setTrackEnd(Integer.MAX_VALUE);
 		}
 		entry.setAlpha(ui.alphaSlider.getValue());
 	}
@@ -705,6 +703,12 @@ public class SkeletonViewer extends ApplicationAdapter {
 		}
 
 		void render () {
+			if (state.getCurrent(ui.trackButtons.getCheckedIndex()) == null) {
+				ui.animationList.getSelection().setProgrammaticChangeEvents(false);
+				ui.animationList.setSelected(null);
+				ui.animationList.getSelection().setProgrammaticChangeEvents(true);
+			}
+
 			statusLabel.pack();
 			if (minimizeButton.isChecked())
 				statusLabel.setPosition(10, 25, Align.bottom | Align.left);