From 7cb3d99114b713372a79c6afa6cf1cb62e7d6b2c Mon Sep 17 00:00:00 2001 From: Luke Ingram Date: Fri, 28 Jan 2022 11:01:17 -0400 Subject: [PATCH 1/2] [ts] Port of ShortestRotation, see #2027 --- spine-ts/spine-core/src/AnimationState.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/spine-ts/spine-core/src/AnimationState.ts b/spine-ts/spine-core/src/AnimationState.ts index 382b204cf..b9c3fca2a 100644 --- a/spine-ts/spine-core/src/AnimationState.ts +++ b/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. */ From fd617b562ec2c1416f1184ab1259bc11691337e2 Mon Sep 17 00:00:00 2001 From: Luke Ingram Date: Fri, 28 Jan 2022 11:03:36 -0400 Subject: [PATCH 2/2] [libgdx] Fixed AnimationState.trackEntry() Some TrackEntry fields weren't reset to their default values. @NathanSweet you did a bug --- formatters/README.md | 2 +- .../src/com/esotericsoftware/spine/AnimationState.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/formatters/README.md b/formatters/README.md index 3f00aced9..d896d422f 100644 --- a/formatters/README.md +++ b/formatters/README.md @@ -4,7 +4,7 @@ This folder contains formatter configuration files to be used with IDEs as well You will need the following on your `PATH`: - JDK 10+ -- clang-format 12 (i.e. `brew install clang-format`). Also set the environment variable `CLANGFORMAT` to the path of the `clang-format` executable. +- clang-format 12.0.1 (i.e. `brew install clang-format`). Also set the environment variable `CLANGFORMAT` to the path of the `clang-format` executable. - dotnet format (i.e. `dotnet tool install -g dotnet-format`, comes with dotnet 6 out of the box) - tsfmt, (i.e. `npm install -g typescript-formatter`) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index 90384dd41..a7d9e52cf 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -703,6 +703,9 @@ public class AnimationState { entry.loop = loop; entry.holdPrevious = false; + entry.reverse = false; + entry.shortestRotation = false; + entry.eventThreshold = 0; entry.attachmentThreshold = 0; entry.drawOrderThreshold = 0; @@ -720,9 +723,10 @@ public class AnimationState { entry.timeScale = 1; entry.alpha = 1; - entry.interruptAlpha = 1; entry.mixTime = 0; entry.mixDuration = last == null ? 0 : data.getMix(last.animation, animation); + entry.interruptAlpha = 1; + entry.totalAlpha = 0; entry.mixBlend = MixBlend.replace; return entry; }