[libgdx] Reset to setup pose when trackEnd is reached.

This commit is contained in:
NathanSweet 2016-11-23 16:37:08 +01:00
parent d66df0775b
commit deca6bb92f
2 changed files with 14 additions and 8 deletions

View File

@ -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();
@ -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;
}

View File

@ -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);