[libgdx] Store bones indices on animation for sliders.

This commit is contained in:
Nathan Sweet 2025-05-15 17:03:23 -04:00
parent 0f4abc0aab
commit 79d9438132
2 changed files with 26 additions and 15 deletions

View File

@ -36,6 +36,7 @@ import static com.esotericsoftware.spine.utils.SpineUtils.*;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.FloatArray; import com.badlogic.gdx.utils.FloatArray;
import com.badlogic.gdx.utils.IntArray;
import com.badlogic.gdx.utils.Null; import com.badlogic.gdx.utils.Null;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
@ -49,15 +50,18 @@ import com.esotericsoftware.spine.attachments.VertexAttachment;
/** Stores a list of timelines to animate a skeleton's pose over time. */ /** Stores a list of timelines to animate a skeleton's pose over time. */
public class Animation { public class Animation {
final String name; final String name;
float duration;
Array<Timeline> timelines; Array<Timeline> timelines;
final ObjectSet<String> timelineIds; final ObjectSet<String> timelineIds;
float duration; final IntArray bones;
public Animation (String name, Array<Timeline> timelines, float duration) { public Animation (String name, Array<Timeline> timelines, float duration) {
if (name == null) throw new IllegalArgumentException("name cannot be null."); if (name == null) throw new IllegalArgumentException("name cannot be null.");
this.name = name; this.name = name;
this.duration = duration; this.duration = duration;
timelineIds = new ObjectSet(timelines.size << 1); int n = timelines.size << 1;
timelineIds = new ObjectSet(n);
bones = new IntArray(n);
setTimelines(timelines); setTimelines(timelines);
} }
@ -72,9 +76,14 @@ public class Animation {
int n = timelines.size; int n = timelines.size;
timelineIds.clear(n << 1); timelineIds.clear(n << 1);
bones.clear();
Timeline[] items = timelines.items; Timeline[] items = timelines.items;
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++) {
timelineIds.addAll(items[i].getPropertyIds()); Timeline timeline = items[i];
timelineIds.addAll(timeline.getPropertyIds());
if (timeline instanceof BoneTimeline boneTimeline) bones.add(boneTimeline.getBoneIndex());
}
bones.shrink();
} }
/** Returns true if this animation contains a timeline with any of the specified property IDs. */ /** Returns true if this animation contains a timeline with any of the specified property IDs. */

View File

@ -29,7 +29,6 @@
package com.esotericsoftware.spine; package com.esotericsoftware.spine;
import com.esotericsoftware.spine.Animation.BoneTimeline;
import com.esotericsoftware.spine.Animation.ConstraintTimeline; import com.esotericsoftware.spine.Animation.ConstraintTimeline;
import com.esotericsoftware.spine.Animation.MixBlend; import com.esotericsoftware.spine.Animation.MixBlend;
import com.esotericsoftware.spine.Animation.MixDirection; import com.esotericsoftware.spine.Animation.MixDirection;
@ -75,9 +74,9 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
if (p.mix != 1) { if (p.mix != 1) {
Bone[] bones = skeleton.bones.items; Bone[] bones = skeleton.bones.items;
Timeline[] timelines = animation.timelines.items; int[] indices = animation.bones.items;
for (int i = 0, n = animation.timelines.size; i < n; i++) for (int i = 0, n = animation.bones.size; i < n; i++)
if (timelines[i] instanceof BoneTimeline timeline) bones[timeline.getBoneIndex()].applied.modifyLocal(skeleton); bones[indices[i]].applied.modifyLocal(skeleton);
} }
animation.apply(skeleton, p.time, p.time, data.loop, null, p.mix, data.additive ? MixBlend.add : MixBlend.replace, animation.apply(skeleton, p.time, p.time, data.loop, null, p.mix, data.additive ? MixBlend.add : MixBlend.replace,
@ -88,20 +87,23 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
if (bone != null && !data.local) skeleton.sortBone(bone); if (bone != null && !data.local) skeleton.sortBone(bone);
skeleton.updateCache.add(this); skeleton.updateCache.add(this);
Timeline[] timelines = data.animation.timelines.items;
Bone[] bones = skeleton.bones.items; Bone[] bones = skeleton.bones.items;
int[] indices = data.animation.bones.items;
for (int i = 0, n = data.animation.bones.size; i < n; i++) {
Bone bone = bones[indices[i]];
bone.sorted = false;
skeleton.sortReset(bone.children);
skeleton.constrained(bone);
}
Timeline[] timelines = data.animation.timelines.items;
Slot[] slots = skeleton.slots.items; Slot[] slots = skeleton.slots.items;
Constraint[] constraints = skeleton.constraints.items; Constraint[] constraints = skeleton.constraints.items;
PhysicsConstraint[] physics = skeleton.physics.items; PhysicsConstraint[] physics = skeleton.physics.items;
int physicsCount = skeleton.physics.size; int physicsCount = skeleton.physics.size;
for (int i = 0, n = data.animation.timelines.size; i < n; i++) { for (int i = 0, n = data.animation.timelines.size; i < n; i++) {
Timeline t = timelines[i]; Timeline t = timelines[i];
if (t instanceof BoneTimeline timeline) { if (t instanceof SlotTimeline timeline)
Bone bone = bones[timeline.getBoneIndex()];
bone.sorted = false;
skeleton.sortReset(bone.children);
skeleton.constrained(bone);
} else if (t instanceof SlotTimeline timeline)
skeleton.constrained(slots[timeline.getSlotIndex()]); skeleton.constrained(slots[timeline.getSlotIndex()]);
else if (t instanceof PhysicsConstraintTimeline timeline) { else if (t instanceof PhysicsConstraintTimeline timeline) {
if (timeline.constraintIndex == -1) { if (timeline.constraintIndex == -1) {