[libgdx] Improved constraint sorting.

This commit is contained in:
Nathan Sweet 2025-04-19 18:12:45 -04:00
parent 6a5d054726
commit 20683ff9ce
6 changed files with 11 additions and 34 deletions

View File

@ -75,10 +75,9 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
void sort (Skeleton skeleton) {
skeleton.sortBone(target);
Bone parent = bones.items[0].bone;
skeleton.sortBone(parent);
skeleton.resetCache(parent);
skeleton.sortBone(parent);
if (bones.size == 1) {
skeleton.updateCache.add(this);
skeleton.sortReset(parent.children);
@ -86,9 +85,7 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
Bone child = bones.items[1].bone;
skeleton.resetCache(child);
skeleton.sortBone(child);
skeleton.updateCache.add(this);
skeleton.sortReset(parent.children);
child.sorted = true;
}

View File

@ -464,9 +464,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
if (skeleton.skin != null) sortPathConstraintAttachment(skeleton, skeleton.skin, slotIndex, slotBone);
if (skeleton.data.defaultSkin != null && skeleton.data.defaultSkin != skeleton.skin)
sortPathConstraintAttachment(skeleton, skeleton.data.defaultSkin, slotIndex, slotBone);
sortPathConstraintAttachment(skeleton, slot.pose.attachment, slotBone);
BonePose[] bones = this.bones.items;
int boneCount = this.bones.size;
for (int i = 0; i < boneCount; i++) {
@ -474,9 +472,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
skeleton.resetCache(bone);
skeleton.sortBone(bone);
}
skeleton.updateCache.add(this);
for (int i = 0; i < boneCount; i++)
skeleton.sortReset(bones[i].bone.children);
for (int i = 0; i < boneCount; i++)

View File

@ -269,12 +269,9 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
void sort (Skeleton skeleton) {
Bone bone = this.bone.bone;
skeleton.sortBone(bone);
skeleton.resetCache(bone);
skeleton.updateCache.add(this);
skeleton.sortReset(bone.children);
bone.sorted = true;
}
boolean isSourceActive () {

View File

@ -201,7 +201,7 @@ public class Skeleton {
}
void sortBone (Bone bone) {
if (bone.sorted) return;
if (bone.sorted || !bone.active) return;
Bone parent = bone.parent;
if (parent != null) sortBone(parent);
bone.sorted = true;
@ -212,9 +212,10 @@ public class Skeleton {
Bone[] items = bones.items;
for (int i = 0, n = bones.size; i < n; i++) {
Bone bone = items[i];
if (!bone.active) continue;
if (bone.sorted) sortReset(bone.children);
bone.sorted = false;
if (bone.active) {
if (bone.sorted) sortReset(bone.children);
bone.sorted = false;
}
}
}

View File

@ -52,6 +52,7 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
}
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);
}
@ -71,7 +72,6 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
Timeline t = timelines[i];
if (t instanceof BoneTimeline timeline) {
Bone bone = bones[timeline.getBoneIndex()];
skeleton.sortBone(bone);
skeleton.sortReset(bone.children);
bone.sorted = false;
} else if (t instanceof SlotTimeline timeline)
@ -86,7 +86,5 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
} else if (t instanceof ConstraintTimeline timeline) //
skeleton.resetCache(skeleton.constraints.items[timeline.getConstraintIndex()]);
}
for (int i = 0; i < timelineCount; i++)
if (timelines[i] instanceof BoneTimeline boneTimeline) skeleton.sortBone(bones[boneTimeline.getBoneIndex()]);
}
}

View File

@ -102,26 +102,14 @@ public class TransformConstraint extends Constraint<TransformConstraint, Transfo
void sort (Skeleton skeleton) {
skeleton.sortBone(source);
BonePose[] bones = this.bones.items;
int boneCount = this.bones.size;
if (data.localSource) {
for (int i = 0; i < boneCount; i++) {
Bone child = bones[i].bone;
skeleton.resetCache(child);
skeleton.sortBone(child.parent);
skeleton.sortBone(child);
}
} else {
for (int i = 0; i < boneCount; i++) {
Bone bone = bones[i].bone;
skeleton.resetCache(bone);
skeleton.sortBone(bone);
}
for (int i = 0; i < boneCount; i++) {
Bone bone = bones[i].bone;
skeleton.resetCache(bone);
skeleton.sortBone(bone);
}
skeleton.updateCache.add(this);
for (int i = 0; i < boneCount; i++)
skeleton.sortReset(bones[i].bone.children);
for (int i = 0; i < boneCount; i++)