[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) { void sort (Skeleton skeleton) {
skeleton.sortBone(target); skeleton.sortBone(target);
Bone parent = bones.items[0].bone; Bone parent = bones.items[0].bone;
skeleton.sortBone(parent);
skeleton.resetCache(parent); skeleton.resetCache(parent);
skeleton.sortBone(parent);
if (bones.size == 1) { if (bones.size == 1) {
skeleton.updateCache.add(this); skeleton.updateCache.add(this);
skeleton.sortReset(parent.children); skeleton.sortReset(parent.children);
@ -86,9 +85,7 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
Bone child = bones.items[1].bone; Bone child = bones.items[1].bone;
skeleton.resetCache(child); skeleton.resetCache(child);
skeleton.sortBone(child); skeleton.sortBone(child);
skeleton.updateCache.add(this); skeleton.updateCache.add(this);
skeleton.sortReset(parent.children); skeleton.sortReset(parent.children);
child.sorted = true; 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.skin != null) sortPathConstraintAttachment(skeleton, skeleton.skin, slotIndex, slotBone);
if (skeleton.data.defaultSkin != null && skeleton.data.defaultSkin != skeleton.skin) if (skeleton.data.defaultSkin != null && skeleton.data.defaultSkin != skeleton.skin)
sortPathConstraintAttachment(skeleton, skeleton.data.defaultSkin, slotIndex, slotBone); sortPathConstraintAttachment(skeleton, skeleton.data.defaultSkin, slotIndex, slotBone);
sortPathConstraintAttachment(skeleton, slot.pose.attachment, slotBone); sortPathConstraintAttachment(skeleton, slot.pose.attachment, slotBone);
BonePose[] bones = this.bones.items; BonePose[] bones = this.bones.items;
int boneCount = this.bones.size; int boneCount = this.bones.size;
for (int i = 0; i < boneCount; i++) { for (int i = 0; i < boneCount; i++) {
@ -474,9 +472,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
skeleton.resetCache(bone); skeleton.resetCache(bone);
skeleton.sortBone(bone); skeleton.sortBone(bone);
} }
skeleton.updateCache.add(this); skeleton.updateCache.add(this);
for (int i = 0; i < boneCount; i++) for (int i = 0; i < boneCount; i++)
skeleton.sortReset(bones[i].bone.children); skeleton.sortReset(bones[i].bone.children);
for (int i = 0; i < boneCount; i++) for (int i = 0; i < boneCount; i++)

View File

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

View File

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

View File

@ -52,6 +52,7 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
} }
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
if (pose.mix == 0) return;
SliderPose pose = applied; SliderPose pose = applied;
data.animation.apply(skeleton, pose.time, pose.time, false, null, pose.mix, MixBlend.replace, MixDirection.in, true); 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]; Timeline t = timelines[i];
if (t instanceof BoneTimeline timeline) { if (t instanceof BoneTimeline timeline) {
Bone bone = bones[timeline.getBoneIndex()]; Bone bone = bones[timeline.getBoneIndex()];
skeleton.sortBone(bone);
skeleton.sortReset(bone.children); skeleton.sortReset(bone.children);
bone.sorted = false; bone.sorted = false;
} else if (t instanceof SlotTimeline timeline) } else if (t instanceof SlotTimeline timeline)
@ -86,7 +86,5 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
} else if (t instanceof ConstraintTimeline timeline) // } else if (t instanceof ConstraintTimeline timeline) //
skeleton.resetCache(skeleton.constraints.items[timeline.getConstraintIndex()]); 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) { void sort (Skeleton skeleton) {
skeleton.sortBone(source); skeleton.sortBone(source);
BonePose[] bones = this.bones.items; BonePose[] bones = this.bones.items;
int boneCount = this.bones.size; int boneCount = this.bones.size;
if (data.localSource) { for (int i = 0; i < boneCount; i++) {
for (int i = 0; i < boneCount; i++) { Bone bone = bones[i].bone;
Bone child = bones[i].bone; skeleton.resetCache(bone);
skeleton.resetCache(child); skeleton.sortBone(bone);
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);
}
} }
skeleton.updateCache.add(this); skeleton.updateCache.add(this);
for (int i = 0; i < boneCount; i++) for (int i = 0; i < boneCount; i++)
skeleton.sortReset(bones[i].bone.children); skeleton.sortReset(bones[i].bone.children);
for (int i = 0; i < boneCount; i++) for (int i = 0; i < boneCount; i++)