Browse Source

[ts] Port of ShortestRotation, see #2027

Luke Ingram 3 năm trước cách đây
mục cha
commit
7cb3d99114
1 tập tin đã thay đổi với 13 bổ sung6 xóa
  1. 13 6
      spine-ts/spine-core/src/AnimationState.ts

+ 13 - 6
spine-ts/spine-core/src/AnimationState.ts

@@ -203,13 +203,14 @@ export class AnimationState {
 			} else {
 				let timelineMode = current.timelineMode;
 
-				let firstFrame = current.timelinesRotation.length != timelineCount << 1;
+				let shortestRotation = current.shortestRotation;
+				let firstFrame = !shortestRotation && current.timelinesRotation.length != timelineCount << 1;
 				if (firstFrame) current.timelinesRotation.length = timelineCount << 1;
 
 				for (let ii = 0; ii < timelineCount; ii++) {
 					let timeline = timelines[ii];
 					let timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup;
-					if (timeline instanceof RotateTimeline) {
+					if (!shortestRotation && timeline instanceof RotateTimeline) {
 						this.applyRotateTimeline(timeline, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame);
 					} else if (timeline instanceof AttachmentTimeline) {
 						this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);
@@ -276,8 +277,8 @@ export class AnimationState {
 			let timelineMode = from.timelineMode;
 			let timelineHoldMix = from.timelineHoldMix;
 
-			let firstFrame = from.timelinesRotation.length != timelineCount << 1;
-			if (firstFrame) from.timelinesRotation.length = timelineCount << 1;
+			let shortestRotation = from.shortestRotation;
+			let firstFrame = !shortestRotation && from.timelinesRotation.length != timelineCount << 1;
 
 			from.totalAlpha = 0;
 			for (let i = 0; i < timelineCount; i++) {
@@ -311,7 +312,7 @@ export class AnimationState {
 				}
 				from.totalAlpha += alpha;
 
-				if (timeline instanceof RotateTimeline)
+				if (shortestRotation && timeline instanceof RotateTimeline)
 					this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, timelineBlend, from.timelinesRotation, i << 1, firstFrame);
 				else if (timeline instanceof AttachmentTimeline)
 					this.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments);
@@ -651,6 +652,9 @@ export class AnimationState {
 		entry.loop = loop;
 		entry.holdPrevious = false;
 
+		entry.reverse = false;
+		entry.shortestRotation = false;
+
 		entry.eventThreshold = 0;
 		entry.attachmentThreshold = 0;
 		entry.drawOrderThreshold = 0;
@@ -668,9 +672,10 @@ export class AnimationState {
 		entry.timeScale = 1;
 
 		entry.alpha = 1;
-		entry.interruptAlpha = 1;
 		entry.mixTime = 0;
 		entry.mixDuration = !last ? 0 : this.data.getMix(last.animation, animation);
+		entry.interruptAlpha = 1;
+		entry.totalAlpha = 0;
 		entry.mixBlend = MixBlend.replace;
 		return entry;
 	}
@@ -823,6 +828,8 @@ export class TrackEntry {
 
 	reverse: boolean = false;
 
+	shortestRotation: boolean = false;
+
 	/** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the
 	 * `eventThreshold`, event timelines are applied while this animation is being mixed out. Defaults to 0, so event
 	 * timelines are not applied while this animation is being mixed out. */