From 913e694e222e4b94b11a5e8977efc79a641f60f6 Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Sun, 20 Apr 2025 01:02:55 -0400 Subject: [PATCH] [libgdx] Constraints only updateLocalTransform when necessary. --- .../com/esotericsoftware/spine/BoneLocal.java | 3 --- .../com/esotericsoftware/spine/BonePose.java | 12 ++++++++--- .../esotericsoftware/spine/IkConstraint.java | 3 +++ .../spine/PathConstraint.java | 2 +- .../spine/PhysicsConstraint.java | 2 +- .../com/esotericsoftware/spine/Slider.java | 21 ++++++++++++++----- .../spine/TransformConstraint.java | 10 +++++---- 7 files changed, 36 insertions(+), 17 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BoneLocal.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BoneLocal.java index bf04928bb..7ed27a083 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BoneLocal.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BoneLocal.java @@ -36,9 +36,6 @@ public class BoneLocal implements Pose { float x, y, rotation, scaleX, scaleY, shearX, shearY; Inherit inherit; - BoneLocal () { - } - public void set (BoneLocal pose) { if (pose == null) throw new IllegalArgumentException("pose cannot be null."); x = pose.x; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BonePose.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BonePose.java index 17380efdc..b7bdbc876 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BonePose.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BonePose.java @@ -16,9 +16,7 @@ public class BonePose extends BoneLocal implements Update { float a, b, worldX; float c, d, worldY; int update; - - BonePose () { - } + boolean localDirty; /** Called by {@link Skeleton#updateCache()} to compute the world transform, if needed. */ public void update (Skeleton skeleton, Physics physics) { @@ -31,6 +29,7 @@ public class BonePose extends BoneLocal implements Update { * Runtimes Guide. */ public void updateWorldTransform (Skeleton skeleton) { update = skeleton.update; + localDirty = false; if (bone.parent == null) { // Root bone. float sx = skeleton.scaleX, sy = skeleton.scaleY; @@ -140,6 +139,7 @@ public class BonePose extends BoneLocal implements Update { * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */ public void updateLocalTransform (Skeleton skeleton) { update = skeleton.update; + localDirty = false; if (bone.parent == null) { x = worldX - skeleton.x; @@ -218,6 +218,12 @@ public class BonePose extends BoneLocal implements Update { } } + /** When true, the world transform has been modified and the local transform no longer matches. Call + * {@link #updateLocalTransform(Skeleton)} before using the local transform. */ + public boolean isLocalDirty () { + return localDirty; + } + /** Part of the world transform matrix for the X axis. If changed, {@link #updateLocalTransform(Skeleton)} should be called. */ public float getA () { return a; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java index ae15e70c6..b360422a0 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java @@ -114,6 +114,7 @@ public class IkConstraint extends Constraint { public void update (Skeleton skeleton, Physics physics) { if (pose.mix == 0) return; - SliderPose pose = applied; - data.animation.apply(skeleton, pose.time, pose.time, false, null, pose.mix, MixBlend.replace, MixDirection.in, true); Timeline[] timelines = data.animation.timelines.items; int timelineCount = data.animation.timelines.size; Bone[] bones = skeleton.bones.items; - for (int i = 0; i < timelineCount; i++) - if (timelines[i] instanceof BoneTimeline boneTimeline) bones[boneTimeline.getBoneIndex()].resetUpdate(skeleton); + if (pose.mix == 1) { + for (int i = 0; i < timelineCount; i++) + if (timelines[i] instanceof BoneTimeline timeline) bones[timeline.getBoneIndex()].resetUpdate(skeleton); + } else { + for (int i = 0; i < timelineCount; i++) { + if (timelines[i] instanceof BoneTimeline timeline) { + Bone bone = bones[timeline.getBoneIndex()]; + bone.resetUpdate(skeleton); + if (bone.applied.localDirty) bone.applied.updateLocalTransform(skeleton); + } + } + } + + SliderPose pose = applied; + data.animation.apply(skeleton, pose.time, pose.time, false, null, pose.mix, MixBlend.replace, MixDirection.in, true); } void sort (Skeleton skeleton) { @@ -68,7 +79,7 @@ public class Slider extends Constraint { int timelineCount = data.animation.timelines.size; Bone[] bones = skeleton.bones.items; for (int i = 0; i < timelineCount; i++) - if (timelines[i] instanceof BoneTimeline boneTimeline) skeleton.sortBone(bones[boneTimeline.getBoneIndex()]); + if (timelines[i] instanceof BoneTimeline timeline) skeleton.sortBone(bones[timeline.getBoneIndex()]); skeleton.updateCache.add(this); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java index 0e50383c7..8a843df93 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java @@ -68,16 +68,18 @@ public class TransformConstraint extends Constraint