[libgdx] Consistent naming for applied, constrained, and setup pose fields.

This commit is contained in:
Nathan Sweet 2026-03-24 23:35:00 -04:00
parent bf6ba6f858
commit c7f328c079
19 changed files with 129 additions and 127 deletions

View File

@ -141,7 +141,7 @@ public class Animation {
* @param add If true, for timelines that support it, their values are added to the setup or current values (depending on * @param add If true, for timelines that support it, their values are added to the setup or current values (depending on
* <code>fromSetup</code>). * <code>fromSetup</code>).
* @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant transitions. * @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant transitions.
* @param appliedPose True to modify {@link Posed#getAppliedPose()}, else {@link Posed#pose} is modified. */ * @param appliedPose True to modify {@link Posed#appliedPose}, else {@link Posed#pose} is modified. */
public void apply (Skeleton skeleton, float lastTime, float time, boolean loop, @Null Array<Event> events, float alpha, public void apply (Skeleton skeleton, float lastTime, float time, boolean loop, @Null Array<Event> events, float alpha,
boolean fromSetup, boolean add, boolean out, boolean appliedPose) { boolean fromSetup, boolean add, boolean out, boolean appliedPose) {
if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null.");
@ -254,7 +254,7 @@ public class Animation {
* <code>fromSetup</code>). * <code>fromSetup</code>).
* @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant * @param out True when the animation is mixing out, else it is mixing in. Used by timelines that perform instant
* transitions. * transitions.
* @param appliedPose True to modify {@link Posed#getAppliedPose()}, else {@link Posed#pose} is modified. */ * @param appliedPose True to modify {@link Posed#appliedPose}, else {@link Posed#pose} is modified. */
abstract public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, abstract public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha,
boolean fromSetup, boolean add, boolean out, boolean appliedPose); boolean fromSetup, boolean add, boolean out, boolean appliedPose);
@ -514,7 +514,8 @@ public class Animation {
public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup, public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup,
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Bone bone = skeleton.bones.items[boneIndex]; Bone bone = skeleton.bones.items[boneIndex];
if (bone.active) apply(appliedPose ? bone.applied : bone.pose, bone.data.setup, time, alpha, fromSetup, add, out); if (bone.active)
apply(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, fromSetup, add, out);
} }
abstract protected void apply (BonePose pose, BonePose setup, float time, float alpha, boolean fromSetup, boolean add, abstract protected void apply (BonePose pose, BonePose setup, float time, float alpha, boolean fromSetup, boolean add,
@ -556,7 +557,8 @@ public class Animation {
public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup, public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup,
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Bone bone = skeleton.bones.items[boneIndex]; Bone bone = skeleton.bones.items[boneIndex];
if (bone.active) apply(appliedPose ? bone.applied : bone.pose, bone.data.setup, time, alpha, fromSetup, add, out); if (bone.active)
apply(appliedPose ? bone.appliedPose : bone.pose, bone.data.setupPose, time, alpha, fromSetup, add, out);
} }
abstract protected void apply (BonePose pose, BonePose setup, float time, float alpha, boolean fromSetup, boolean add, abstract protected void apply (BonePose pose, BonePose setup, float time, float alpha, boolean fromSetup, boolean add,
@ -841,14 +843,14 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Bone bone = skeleton.bones.items[boneIndex]; Bone bone = skeleton.bones.items[boneIndex];
if (!bone.active) return; if (!bone.active) return;
BonePose pose = appliedPose ? bone.applied : bone.pose; BonePose pose = appliedPose ? bone.appliedPose : bone.pose;
if (out) { if (out) {
if (fromSetup) pose.inherit = bone.data.setup.inherit; if (fromSetup) pose.inherit = bone.data.setupPose.inherit;
} else { } else {
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) pose.inherit = bone.data.setup.inherit; if (fromSetup) pose.inherit = bone.data.setupPose.inherit;
} else } else
pose.inherit = Inherit.values[(int)frames[search(frames, time, ENTRIES) + INHERIT]]; pose.inherit = Inherit.values[(int)frames[search(frames, time, ENTRIES) + INHERIT]];
} }
@ -871,7 +873,7 @@ public class Animation {
public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup, public void apply (Skeleton skeleton, float lastTime, float time, @Null Array<Event> events, float alpha, boolean fromSetup,
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Slot slot = skeleton.slots.items[slotIndex]; Slot slot = skeleton.slots.items[slotIndex];
if (slot.bone.active) apply(slot, appliedPose ? slot.applied : slot.pose, time, alpha, fromSetup, add); if (slot.bone.active) apply(slot, appliedPose ? slot.appliedPose : slot.pose, time, alpha, fromSetup, add);
} }
abstract protected void apply (Slot slot, SlotPose pose, float time, float alpha, boolean fromSetup, boolean add); abstract protected void apply (Slot slot, SlotPose pose, float time, float alpha, boolean fromSetup, boolean add);
@ -908,7 +910,7 @@ public class Animation {
Color color = pose.color; Color color = pose.color;
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) color.set(slot.data.setup.color); if (fromSetup) color.set(slot.data.setupPose.color);
return; return;
} }
@ -945,7 +947,7 @@ public class Animation {
color.set(r, g, b, a); color.set(r, g, b, a);
else { else {
if (fromSetup) { if (fromSetup) {
Color setup = slot.data.setup.color; Color setup = slot.data.setupPose.color;
color.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, color.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha,
setup.a + (a - setup.a) * alpha); setup.a + (a - setup.a) * alpha);
} else } else
@ -984,7 +986,7 @@ public class Animation {
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
Color setup = slot.data.setup.color; Color setup = slot.data.setupPose.color;
color.r = setup.r; color.r = setup.r;
color.g = setup.g; color.g = setup.g;
color.b = setup.b; color.b = setup.b;
@ -1018,7 +1020,7 @@ public class Animation {
if (alpha != 1) { if (alpha != 1) {
if (fromSetup) { if (fromSetup) {
Color setup = slot.data.setup.color; Color setup = slot.data.setupPose.color;
r = setup.r + (r - setup.r) * alpha; r = setup.r + (r - setup.r) * alpha;
g = setup.g + (g - setup.g) * alpha; g = setup.g + (g - setup.g) * alpha;
b = setup.b + (b - setup.b) * alpha; b = setup.b + (b - setup.b) * alpha;
@ -1052,18 +1054,18 @@ public class Animation {
Slot slot = skeleton.slots.items[slotIndex]; Slot slot = skeleton.slots.items[slotIndex];
if (!slot.bone.active) return; if (!slot.bone.active) return;
Color color = (appliedPose ? slot.applied : slot.pose).color; Color color = (appliedPose ? slot.appliedPose : slot.pose).color;
float a; float a;
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) color.a = slot.data.setup.color.a; if (fromSetup) color.a = slot.data.setupPose.color.a;
return; return;
} }
a = getCurveValue(time); a = getCurveValue(time);
if (alpha != 1) { if (alpha != 1) {
if (fromSetup) { if (fromSetup) {
Color setup = slot.data.setup.color; Color setup = slot.data.setupPose.color;
a = setup.a + (a - setup.a) * alpha; a = setup.a + (a - setup.a) * alpha;
} else } else
a = color.a + (a - color.a) * alpha; a = color.a + (a - color.a) * alpha;
@ -1109,7 +1111,7 @@ public class Animation {
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
SlotPose setup = slot.data.setup; SlotPose setup = slot.data.setupPose;
light.set(setup.color); light.set(setup.color);
Color setupDark = setup.darkColor; Color setupDark = setup.darkColor;
dark.r = setupDark.r; dark.r = setupDark.r;
@ -1163,7 +1165,7 @@ public class Animation {
if (alpha == 1) if (alpha == 1)
light.set(r, g, b, a); light.set(r, g, b, a);
else if (fromSetup) { else if (fromSetup) {
SlotPose setupPose = slot.data.setup; SlotPose setupPose = slot.data.setupPose;
Color setup = setupPose.color; Color setup = setupPose.color;
light.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha, light.set(setup.r + (r - setup.r) * alpha, setup.g + (g - setup.g) * alpha, setup.b + (b - setup.b) * alpha,
setup.a + (a - setup.a) * alpha); setup.a + (a - setup.a) * alpha);
@ -1218,7 +1220,7 @@ public class Animation {
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
SlotPose setup = slot.data.setup; SlotPose setup = slot.data.setupPose;
Color setupLight = setup.color, setupDark = setup.darkColor; Color setupLight = setup.color, setupDark = setup.darkColor;
light.r = setupLight.r; light.r = setupLight.r;
light.g = setupLight.g; light.g = setupLight.g;
@ -1268,7 +1270,7 @@ public class Animation {
if (alpha != 1) { if (alpha != 1) {
if (fromSetup) { if (fromSetup) {
SlotPose setupPose = slot.data.setup; SlotPose setupPose = slot.data.setupPose;
Color setup = setupPose.color; Color setup = setupPose.color;
r = setup.r + (r - setup.r) * alpha; r = setup.r + (r - setup.r) * alpha;
g = setup.g + (g - setup.g) * alpha; g = setup.g + (g - setup.g) * alpha;
@ -1332,7 +1334,7 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Slot slot = skeleton.slots.items[slotIndex]; Slot slot = skeleton.slots.items[slotIndex];
if (!slot.bone.active) return; if (!slot.bone.active) return;
SlotPose pose = appliedPose ? slot.applied : slot.pose; SlotPose pose = appliedPose ? slot.appliedPose : slot.pose;
if (out || time < this.frames[0]) { if (out || time < this.frames[0]) {
if (fromSetup) setAttachment(skeleton, pose, slot.data.attachmentName); if (fromSetup) setAttachment(skeleton, pose, slot.data.attachmentName);
@ -1599,7 +1601,7 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
Slot slot = skeleton.slots.items[slotIndex]; Slot slot = skeleton.slots.items[slotIndex];
if (!slot.bone.active) return; if (!slot.bone.active) return;
SlotPose pose = appliedPose ? slot.applied : slot.pose; SlotPose pose = appliedPose ? slot.appliedPose : slot.pose;
Attachment slotAttachment = pose.attachment; Attachment slotAttachment = pose.attachment;
if (!(slotAttachment instanceof HasSequence hasSequence) || slotAttachment.getTimelineAttachment() != attachment) return; if (!(slotAttachment instanceof HasSequence hasSequence) || slotAttachment.getTimelineAttachment() != attachment) return;
@ -1887,12 +1889,12 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (IkConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (IkConstraint)skeleton.constraints.items[constraintIndex];
if (!constraint.active) return; if (!constraint.active) return;
IkConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; IkConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
IkConstraintPose setup = constraint.data.setup; IkConstraintPose setup = constraint.data.setupPose;
pose.mix = setup.mix; pose.mix = setup.mix;
pose.softness = setup.softness; pose.softness = setup.softness;
pose.bendDirection = setup.bendDirection; pose.bendDirection = setup.bendDirection;
@ -1923,7 +1925,7 @@ public class Animation {
} }
} }
IkConstraintPose base = fromSetup ? constraint.data.setup : pose; IkConstraintPose base = fromSetup ? constraint.data.setupPose : pose;
pose.mix = base.mix + (mix - base.mix) * alpha; pose.mix = base.mix + (mix - base.mix) * alpha;
pose.softness = base.softness + (softness - base.softness) * alpha; pose.softness = base.softness + (softness - base.softness) * alpha;
if (out) { if (out) {
@ -1982,12 +1984,12 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (TransformConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (TransformConstraint)skeleton.constraints.items[constraintIndex];
if (!constraint.active) return; if (!constraint.active) return;
TransformConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; TransformConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
TransformConstraintPose setup = constraint.data.setup; TransformConstraintPose setup = constraint.data.setupPose;
pose.mixRotate = setup.mixRotate; pose.mixRotate = setup.mixRotate;
pose.mixX = setup.mixX; pose.mixX = setup.mixX;
pose.mixY = setup.mixY; pose.mixY = setup.mixY;
@ -2035,7 +2037,7 @@ public class Animation {
} }
} }
TransformConstraintPose base = fromSetup ? constraint.data.setup : pose; TransformConstraintPose base = fromSetup ? constraint.data.setupPose : pose;
if (add) { if (add) {
pose.mixRotate = base.mixRotate + rotate * alpha; pose.mixRotate = base.mixRotate + rotate * alpha;
pose.mixX = base.mixX + x * alpha; pose.mixX = base.mixX + x * alpha;
@ -2079,8 +2081,8 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex];
if (constraint.active) { if (constraint.active) {
PathConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; PathConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.position = getAbsoluteValue(time, alpha, fromSetup, add, pose.position, constraint.data.setup.position); pose.position = getAbsoluteValue(time, alpha, fromSetup, add, pose.position, constraint.data.setupPose.position);
} }
} }
} }
@ -2095,8 +2097,8 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex];
if (constraint.active) { if (constraint.active) {
PathConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; PathConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.spacing = getAbsoluteValue(time, alpha, fromSetup, false, pose.spacing, constraint.data.setup.spacing); pose.spacing = getAbsoluteValue(time, alpha, fromSetup, false, pose.spacing, constraint.data.setupPose.spacing);
} }
} }
} }
@ -2137,12 +2139,12 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (PathConstraint)skeleton.constraints.items[constraintIndex];
if (!constraint.active) return; if (!constraint.active) return;
PathConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; PathConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
float[] frames = this.frames; float[] frames = this.frames;
if (time < frames[0]) { if (time < frames[0]) {
if (fromSetup) { if (fromSetup) {
PathConstraintPose setup = constraint.data.setup; PathConstraintPose setup = constraint.data.setupPose;
pose.mixRotate = setup.mixRotate; pose.mixRotate = setup.mixRotate;
pose.mixX = setup.mixX; pose.mixX = setup.mixX;
pose.mixY = setup.mixY; pose.mixY = setup.mixY;
@ -2175,7 +2177,7 @@ public class Animation {
} }
} }
PathConstraintPose base = fromSetup ? constraint.data.setup : pose; PathConstraintPose base = fromSetup ? constraint.data.setupPose : pose;
if (add) { if (add) {
pose.mixRotate = base.mixRotate + rotate * alpha; pose.mixRotate = base.mixRotate + rotate * alpha;
pose.mixX = base.mixX + x * alpha; pose.mixX = base.mixX + x * alpha;
@ -2204,15 +2206,15 @@ public class Animation {
for (int i = 0, n = skeleton.physics.size; i < n; i++) { for (int i = 0, n = skeleton.physics.size; i < n; i++) {
PhysicsConstraint constraint = constraints[i]; PhysicsConstraint constraint = constraints[i];
if (constraint.active && global(constraint.data)) { if (constraint.active && global(constraint.data)) {
PhysicsConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; PhysicsConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
set(pose, getAbsoluteValue(time, alpha, fromSetup, add, get(pose), get(constraint.data.setup), value)); set(pose, getAbsoluteValue(time, alpha, fromSetup, add, get(pose), get(constraint.data.setupPose), value));
} }
} }
} else { } else {
var constraint = (PhysicsConstraint)skeleton.constraints.items[constraintIndex]; var constraint = (PhysicsConstraint)skeleton.constraints.items[constraintIndex];
if (constraint.active) { if (constraint.active) {
PhysicsConstraintPose pose = appliedPose ? constraint.applied : constraint.pose; PhysicsConstraintPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
set(pose, getAbsoluteValue(time, alpha, fromSetup, add, get(pose), get(constraint.data.setup))); set(pose, getAbsoluteValue(time, alpha, fromSetup, add, get(pose), get(constraint.data.setupPose)));
} }
} }
} }
@ -2431,8 +2433,8 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (Slider)skeleton.constraints.items[constraintIndex]; var constraint = (Slider)skeleton.constraints.items[constraintIndex];
if (constraint.active) { if (constraint.active) {
SliderPose pose = appliedPose ? constraint.applied : constraint.pose; SliderPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.time = getAbsoluteValue(time, alpha, fromSetup, add, pose.time, constraint.data.setup.time); pose.time = getAbsoluteValue(time, alpha, fromSetup, add, pose.time, constraint.data.setupPose.time);
} }
} }
} }
@ -2448,8 +2450,8 @@ public class Animation {
boolean add, boolean out, boolean appliedPose) { boolean add, boolean out, boolean appliedPose) {
var constraint = (Slider)skeleton.constraints.items[constraintIndex]; var constraint = (Slider)skeleton.constraints.items[constraintIndex];
if (constraint.active) { if (constraint.active) {
SliderPose pose = appliedPose ? constraint.applied : constraint.pose; SliderPose pose = appliedPose ? constraint.appliedPose : constraint.pose;
pose.mix = getAbsoluteValue(time, alpha, fromSetup, add, pose.mix, constraint.data.setup.mix); pose.mix = getAbsoluteValue(time, alpha, fromSetup, add, pose.mix, constraint.data.setupPose.mix);
} }
} }
} }

View File

@ -345,7 +345,7 @@ public class AnimationState {
Bone bone = skeleton.bones.items[timeline.boneIndex]; Bone bone = skeleton.bones.items[timeline.boneIndex];
if (!bone.active) return; if (!bone.active) return;
BonePose pose = bone.pose, setup = bone.data.setup; BonePose pose = bone.pose, setup = bone.data.setupPose;
float[] frames = timeline.frames; float[] frames = timeline.frames;
if (time < frames[0]) { // Time is before first frame. if (time < frames[0]) { // Time is before first frame.
if (fromSetup) pose.rotation = setup.rotation; if (fromSetup) pose.rotation = setup.rotation;

View File

@ -37,8 +37,8 @@ import com.badlogic.gdx.utils.Null;
* <ul> * <ul>
* <li>{@link #data}: The setup pose. * <li>{@link #data}: The setup pose.
* <li>{@link #pose}: The unconstrained local pose. Set by animations and application code. * <li>{@link #pose}: The unconstrained local pose. Set by animations and application code.
* <li>{@link #getAppliedPose()}: The constrained local pose. The {@link #pose} with modifications by constraints. * <li>{@link #appliedPose}: The constrained local pose. The {@link #pose} with modifications by constraints.
* <li>World transform (on the applied pose): the {@link #getAppliedPose()} combined with the parent world transform. Computed by * <li>World transform (on the applied pose): the {@link #appliedPose} combined with the parent world transform. Computed by
* {@link Skeleton#updateWorldTransform(Physics)} and {@link BonePose#updateWorldTransform(Skeleton)}. * {@link Skeleton#updateWorldTransform(Physics)} and {@link BonePose#updateWorldTransform(Skeleton)}.
* </ul> * </ul>
*/ */
@ -50,8 +50,8 @@ public class Bone extends PosedActive<BoneData, BonePose> {
public Bone (BoneData data, @Null Bone parent) { public Bone (BoneData data, @Null Bone parent) {
super(data, new BonePose(), new BonePose()); super(data, new BonePose(), new BonePose());
this.parent = parent; this.parent = parent;
applied.bone = this; appliedPose.bone = this;
constrained.bone = this; constrainedPose.bone = this;
} }
/** Copy constructor. Does not copy the {@link #children} bones. */ /** Copy constructor. Does not copy the {@link #children} bones. */

View File

@ -55,7 +55,7 @@ public class BoneData extends PosedData<BonePose> {
public BoneData (BoneData data, @Null BoneData parent) { public BoneData (BoneData data, @Null BoneData parent) {
this(data.index, data.name, parent); this(data.index, data.name, parent);
length = data.length; length = data.length;
setup.set(data.setup); setupPose.set(data.setupPose);
} }
/** The bone's name, unique across all bones in the skeleton. /** The bone's name, unique across all bones in the skeleton.

View File

@ -160,7 +160,7 @@ public class BonePose implements Pose<BonePose>, Update {
return; return;
} }
BonePose parent = bone.parent.applied; BonePose parent = bone.parent.appliedPose;
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
worldX = pa * x + pb * y + parent.worldX; worldX = pa * x + pb * y + parent.worldX;
worldY = pc * x + pd * y + parent.worldY; worldY = pc * x + pd * y + parent.worldY;
@ -264,7 +264,7 @@ public class BonePose implements Pose<BonePose>, Update {
return; return;
} }
BonePose parent = bone.parent.applied; BonePose parent = bone.parent.appliedPose;
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
float pid = 1 / (pa * pd - pb * pc); float pid = 1 / (pa * pd - pb * pc);
float ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid; float ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid;
@ -351,7 +351,7 @@ public class BonePose implements Pose<BonePose>, Update {
void resetWorld (int update) { void resetWorld (int update) {
Bone[] children = bone.children.items; Bone[] children = bone.children.items;
for (int i = 0, n = bone.children.size; i < n; i++) { for (int i = 0, n = bone.children.size; i < n; i++) {
BonePose child = children[i].applied; BonePose child = children[i].appliedPose;
if (child.world == update) { if (child.world == update) {
child.world = 0; child.world = 0;
child.local = 0; child.local = 0;
@ -472,13 +472,13 @@ public class BonePose implements Pose<BonePose>, Update {
/** Transforms a point from world coordinates to the parent bone's local coordinates. */ /** Transforms a point from world coordinates to the parent bone's local coordinates. */
public Vector2 worldToParent (Vector2 world) { public Vector2 worldToParent (Vector2 world) {
if (world == null) throw new IllegalArgumentException("world cannot be null."); if (world == null) throw new IllegalArgumentException("world cannot be null.");
return bone.parent == null ? world : bone.parent.applied.worldToLocal(world); return bone.parent == null ? world : bone.parent.appliedPose.worldToLocal(world);
} }
/** Transforms a point from the parent bone's coordinates to world coordinates. */ /** Transforms a point from the parent bone's coordinates to world coordinates. */
public Vector2 parentToWorld (Vector2 world) { public Vector2 parentToWorld (Vector2 world) {
if (world == null) throw new IllegalArgumentException("world cannot be null."); if (world == null) throw new IllegalArgumentException("world cannot be null.");
return bone.parent == null ? world : bone.parent.applied.localToWorld(world); return bone.parent == null ? world : bone.parent.appliedPose.localToWorld(world);
} }
/** Transforms a world rotation to a local rotation. */ /** Transforms a world rotation to a local rotation. */

View File

@ -49,7 +49,7 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
bones = new Array(true, data.bones.size, BonePose[]::new); bones = new Array(true, data.bones.size, BonePose[]::new);
for (BoneData boneData : data.bones) for (BoneData boneData : data.bones)
bones.add(skeleton.bones.items[boneData.index].constrained); bones.add(skeleton.bones.items[boneData.index].constrainedPose);
target = skeleton.bones.items[data.target.index]; target = skeleton.bones.items[data.target.index];
} }
@ -62,9 +62,9 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
/** Applies the constraint to the constrained bones. */ /** Applies the constraint to the constrained bones. */
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
IkConstraintPose p = applied; IkConstraintPose p = appliedPose;
if (p.mix == 0) return; if (p.mix == 0) return;
BonePose target = this.target.applied; BonePose target = this.target.appliedPose;
BonePose[] bones = this.bones.items; BonePose[] bones = this.bones.items;
switch (this.bones.size) { switch (this.bones.size) {
case 1 -> apply(skeleton, bones[0], target.worldX, target.worldY, p.compress, p.stretch, data.uniform, p.mix); case 1 -> apply(skeleton, bones[0], target.worldX, target.worldY, p.compress, p.stretch, data.uniform, p.mix);
@ -108,7 +108,7 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
boolean uniform, float mix) { boolean uniform, float mix) {
if (bone == null) throw new IllegalArgumentException("bone cannot be null."); if (bone == null) throw new IllegalArgumentException("bone cannot be null.");
bone.modifyLocal(skeleton); bone.modifyLocal(skeleton);
BonePose p = bone.bone.parent.applied; BonePose p = bone.bone.parent.appliedPose;
float pa = p.a, pb = p.b, pc = p.c, pd = p.d; float pa = p.a, pb = p.b, pc = p.c, pd = p.d;
float rotationIK = -bone.shearX - bone.rotation, tx, ty; float rotationIK = -bone.shearX - bone.rotation, tx, ty;
switch (bone.inherit) { switch (bone.inherit) {
@ -199,7 +199,7 @@ public class IkConstraint extends Constraint<IkConstraint, IkConstraintData, IkC
cwx = a * child.x + b * child.y + parent.worldX; cwx = a * child.x + b * child.y + parent.worldX;
cwy = c * child.x + d * child.y + parent.worldY; cwy = c * child.x + d * child.y + parent.worldY;
} }
BonePose pp = parent.bone.parent.applied; BonePose pp = parent.bone.parent.appliedPose;
a = pp.a; a = pp.a;
b = pp.b; b = pp.b;
c = pp.c; c = pp.c;

View File

@ -63,7 +63,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
bones = new Array(true, data.bones.size, BonePose[]::new); bones = new Array(true, data.bones.size, BonePose[]::new);
for (BoneData boneData : data.bones) for (BoneData boneData : data.bones)
bones.add(skeleton.bones.items[boneData.index].constrained); bones.add(skeleton.bones.items[boneData.index].constrainedPose);
slot = skeleton.slots.items[data.slot.index]; slot = skeleton.slots.items[data.slot.index];
} }
@ -76,9 +76,9 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
/** Applies the constraint to the constrained bones. */ /** Applies the constraint to the constrained bones. */
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
if (!(slot.applied.attachment instanceof PathAttachment pathAttachment)) return; if (!(slot.appliedPose.attachment instanceof PathAttachment pathAttachment)) return;
PathConstraintPose p = applied; PathConstraintPose p = appliedPose;
float mixRotate = p.mixRotate, mixX = p.mixX, mixY = p.mixY; float mixRotate = p.mixRotate, mixX = p.mixX, mixY = p.mixY;
if (mixRotate == 0 & mixX == 0 & mixY == 0) return; if (mixRotate == 0 & mixX == 0 & mixY == 0) return;
@ -148,7 +148,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
tip = data.rotateMode == RotateMode.chain; tip = data.rotateMode == RotateMode.chain;
else { else {
tip = false; tip = false;
BonePose bone = slot.bone.applied; BonePose bone = slot.bone.appliedPose;
offsetRotation *= bone.a * bone.d - bone.b * bone.c > 0 ? degRad : -degRad; offsetRotation *= bone.a * bone.d - bone.b * bone.c > 0 ? degRad : -degRad;
} }
for (int i = 0, ip = 3, u = skeleton.update; i < boneCount; i++, ip += 3) { for (int i = 0, ip = 3, u = skeleton.update; i < boneCount; i++, ip += 3) {
@ -201,7 +201,7 @@ public class PathConstraint extends Constraint<PathConstraint, PathConstraintDat
float[] computeWorldPositions (Skeleton skeleton, PathAttachment path, int spacesCount, boolean tangents) { float[] computeWorldPositions (Skeleton skeleton, PathAttachment path, int spacesCount, boolean tangents) {
Slot slot = this.slot; Slot slot = this.slot;
float position = applied.position; float position = appliedPose.position;
float[] spaces = this.spaces.items, out = this.positions.setSize(spacesCount * 3 + 2), world; float[] spaces = this.spaces.items, out = this.positions.setSize(spacesCount * 3 + 2), world;
boolean closed = path.getClosed(); boolean closed = path.getClosed();
int verticesLength = path.getWorldVerticesLength(), curveCount = verticesLength / 6, prevCurve = NONE; int verticesLength = path.getWorldVerticesLength(), curveCount = verticesLength / 6, prevCurve = NONE;

View File

@ -49,7 +49,7 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose()); super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose());
if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null.");
bone = skeleton.bones.items[data.bone.index].constrained; bone = skeleton.bones.items[data.bone.index].constrainedPose;
} }
public PhysicsConstraint copy (Skeleton skeleton) { public PhysicsConstraint copy (Skeleton skeleton) {
@ -97,7 +97,7 @@ public class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsCons
/** Applies the constraint to the constrained bones. */ /** Applies the constraint to the constrained bones. */
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
PhysicsConstraintPose p = applied; PhysicsConstraintPose p = appliedPose;
float mix = p.mix; float mix = p.mix;
if (mix == 0) return; if (mix == 0) return;

View File

@ -5,7 +5,7 @@ package com.esotericsoftware.spine;
* <ul> * <ul>
* <li>{@link #data}: The setup pose. * <li>{@link #data}: The setup pose.
* <li>{@link #pose}: The unconstrained pose. Set by animations and application code. * <li>{@link #pose}: The unconstrained pose. Set by animations and application code.
* <li>{@link #getAppliedPose()}: The constrained pose. The {@link #pose} with modifications by constraints. * <li>{@link #appliedPose}: The constrained pose. The {@link #pose} with modifications by constraints.
* </ul> * </ul>
*/ */
abstract public class Posed< // abstract public class Posed< //
@ -14,20 +14,20 @@ abstract public class Posed< //
final D data; final D data;
final P pose; final P pose;
final P constrained; final P constrainedPose;
P applied; P appliedPose;
protected Posed (D data, P pose, P constrained) { protected Posed (D data, P pose, P constrainedPose) {
if (data == null) throw new IllegalArgumentException("data cannot be null."); if (data == null) throw new IllegalArgumentException("data cannot be null.");
this.data = data; this.data = data;
this.pose = pose; this.pose = pose;
this.constrained = constrained; this.constrainedPose = constrainedPose;
applied = pose; appliedPose = pose;
} }
/** Sets the unconstrained pose to the setup pose. */ /** Sets the unconstrained pose to the setup pose. */
public void setupPose () { public void setupPose () {
pose.set(data.setup); pose.set(data.setupPose);
} }
/** The setup pose data. May be shared with multiple instances. */ /** The setup pose data. May be shared with multiple instances. */
@ -43,22 +43,22 @@ abstract public class Posed< //
/** If no constraints modify this object, the applied pose is the same as the {@link #pose}. Otherwise it is a copy of the /** If no constraints modify this object, the applied pose is the same as the {@link #pose}. Otherwise it is a copy of the
* {@link #pose} modified by constraints. */ * {@link #pose} modified by constraints. */
public P getAppliedPose () { public P getAppliedPose () {
return applied; return appliedPose;
} }
/** Sets the applied pose to the unconstrained pose, for when no constraints will modify the pose. */ /** Sets the applied pose to the unconstrained pose, for when no constraints will modify the pose. */
void pose () { // Port: usePose void pose () { // Port: usePose
applied = pose; appliedPose = pose;
} }
/** Sets the applied pose to the constrained pose, in anticipation of the applied pose being modified by constraints. */ /** Sets the applied pose to the constrained pose, in anticipation of the applied pose being modified by constraints. */
void constrained () { // Port: useConstrained void constrained () { // Port: useConstrained
applied = constrained; appliedPose = constrainedPose;
} }
/** Sets the constrained pose to the unconstrained pose, as a starting point for constraints to be applied. */ /** Sets the constrained pose to the unconstrained pose, as a starting point for constraints to be applied. */
void reset () { // Port: resetConstrained void reset () { // Port: resetConstrained
constrained.set(pose); constrainedPose.set(pose);
} }
public String toString () { public String toString () {

View File

@ -32,13 +32,13 @@ package com.esotericsoftware.spine;
/** The base class for storing setup data for a posed object. May be shared with multiple instances. */ /** The base class for storing setup data for a posed object. May be shared with multiple instances. */
abstract public class PosedData<P extends Pose> { abstract public class PosedData<P extends Pose> {
final String name; final String name;
final P setup; final P setupPose;
boolean skinRequired; boolean skinRequired;
protected PosedData (String name, P setup) { protected PosedData (String name, P setupPose) {
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.setup = setup; this.setupPose = setupPose;
} }
public String getName () { public String getName () {
@ -47,7 +47,7 @@ abstract public class PosedData<P extends Pose> {
/** The setup pose that most animations are relative to. */ /** The setup pose that most animations are relative to. */
public P getSetupPose () { public P getSetupPose () {
return setup; return setupPose;
} }
/** When true, {@link Skeleton#updateWorldTransform(Physics)} only updates this constraint if the {@link Skeleton#skin} /** When true, {@link Skeleton#updateWorldTransform(Physics)} only updates this constraint if the {@link Skeleton#skin}

View File

@ -195,11 +195,11 @@ public class Skeleton {
Object[] updateCache = this.updateCache.items; Object[] updateCache = this.updateCache.items;
n = this.updateCache.size; n = this.updateCache.size;
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
if (updateCache[i] instanceof Bone bone) updateCache[i] = bone.applied; if (updateCache[i] instanceof Bone bone) updateCache[i] = bone.appliedPose;
} }
void constrained (Posed object) { void constrained (Posed object) {
if (object.pose == object.applied) { if (object.pose == object.appliedPose) {
object.constrained(); object.constrained();
resetCache.add(object); resetCache.add(object);
} }
@ -255,7 +255,7 @@ public class Skeleton {
resetCache[i].reset(); resetCache[i].reset();
// Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection. // Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection.
BonePose rootBone = getRootBone().applied; BonePose rootBone = getRootBone().appliedPose;
float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
rootBone.worldX = pa * x + pb * y + parent.worldX; rootBone.worldX = pa * x + pb * y + parent.worldX;
rootBone.worldY = pc * x + pd * y + parent.worldY; rootBone.worldY = pc * x + pd * y + parent.worldY;
@ -498,7 +498,7 @@ public class Skeleton {
if (attachment instanceof RegionAttachment region) { if (attachment instanceof RegionAttachment region) {
verticesLength = 8; verticesLength = 8;
vertices = temp.setSize(8); vertices = temp.setSize(8);
region.computeWorldVertices(slot, region.getOffsets(slot.applied), vertices, 0, 2); region.computeWorldVertices(slot, region.getOffsets(slot.appliedPose), vertices, 0, 2);
triangles = quadTriangles; triangles = quadTriangles;
} else if (attachment instanceof MeshAttachment mesh) { } else if (attachment instanceof MeshAttachment mesh) {
verticesLength = mesh.getWorldVerticesLength(); verticesLength = mesh.getWorldVerticesLength();

View File

@ -230,7 +230,7 @@ public class SkeletonBinary extends SkeletonLoader {
String name = input.readString(); String name = input.readString();
BoneData parent = i == 0 ? null : bones[input.readInt(true)]; BoneData parent = i == 0 ? null : bones[input.readInt(true)];
var data = new BoneData(i, name, parent); var data = new BoneData(i, name, parent);
BonePose setup = data.setup; BonePose setup = data.setupPose;
setup.rotation = input.readFloat(); setup.rotation = input.readFloat();
setup.x = input.readFloat() * scale; setup.x = input.readFloat() * scale;
setup.y = input.readFloat() * scale; setup.y = input.readFloat() * scale;
@ -255,10 +255,10 @@ public class SkeletonBinary extends SkeletonLoader {
String slotName = input.readString(); String slotName = input.readString();
var boneData = bones[input.readInt(true)]; var boneData = bones[input.readInt(true)];
var data = new SlotData(i, slotName, boneData); var data = new SlotData(i, slotName, boneData);
Color.rgba8888ToColor(data.setup.color, input.readInt()); Color.rgba8888ToColor(data.setupPose.color, input.readInt());
int darkColor = input.readInt(); int darkColor = input.readInt();
if (darkColor != -1) Color.rgb888ToColor(data.setup.darkColor = new Color(), darkColor); if (darkColor != -1) Color.rgb888ToColor(data.setupPose.darkColor = new Color(), darkColor);
data.attachmentName = input.readStringRef(); data.attachmentName = input.readStringRef();
data.blendMode = BlendMode.values[input.readInt(true)]; data.blendMode = BlendMode.values[input.readInt(true)];
@ -282,7 +282,7 @@ public class SkeletonBinary extends SkeletonLoader {
int flags = input.read(); int flags = input.read();
data.skinRequired = (flags & 1) != 0; data.skinRequired = (flags & 1) != 0;
data.uniform = (flags & 2) != 0; data.uniform = (flags & 2) != 0;
IkConstraintPose setup = data.setup; IkConstraintPose setup = data.setupPose;
setup.bendDirection = (flags & 4) != 0 ? -1 : 1; setup.bendDirection = (flags & 4) != 0 ? -1 : 1;
setup.compress = (flags & 8) != 0; setup.compress = (flags & 8) != 0;
setup.stretch = (flags & 16) != 0; setup.stretch = (flags & 16) != 0;
@ -354,7 +354,7 @@ public class SkeletonBinary extends SkeletonLoader {
if ((flags & 16) != 0) data.offsets[TransformConstraintData.SCALEY] = input.readFloat(); if ((flags & 16) != 0) data.offsets[TransformConstraintData.SCALEY] = input.readFloat();
if ((flags & 32) != 0) data.offsets[TransformConstraintData.SHEARY] = input.readFloat(); if ((flags & 32) != 0) data.offsets[TransformConstraintData.SHEARY] = input.readFloat();
flags = input.read(); flags = input.read();
TransformConstraintPose setup = data.setup; TransformConstraintPose setup = data.setupPose;
if ((flags & 1) != 0) setup.mixRotate = input.readFloat(); if ((flags & 1) != 0) setup.mixRotate = input.readFloat();
if ((flags & 2) != 0) setup.mixX = input.readFloat(); if ((flags & 2) != 0) setup.mixX = input.readFloat();
if ((flags & 4) != 0) setup.mixY = input.readFloat(); if ((flags & 4) != 0) setup.mixY = input.readFloat();
@ -375,7 +375,7 @@ public class SkeletonBinary extends SkeletonLoader {
data.spacingMode = SpacingMode.values[(flags >> 2) & 0b11]; data.spacingMode = SpacingMode.values[(flags >> 2) & 0b11];
data.rotateMode = RotateMode.values[(flags >> 4) & 0b11]; data.rotateMode = RotateMode.values[(flags >> 4) & 0b11];
if ((flags & 128) != 0) data.offsetRotation = input.readFloat(); if ((flags & 128) != 0) data.offsetRotation = input.readFloat();
PathConstraintPose setup = data.setup; PathConstraintPose setup = data.setupPose;
setup.position = input.readFloat(); setup.position = input.readFloat();
if (data.positionMode == PositionMode.fixed) setup.position *= scale; if (data.positionMode == PositionMode.fixed) setup.position *= scale;
setup.spacing = input.readFloat(); setup.spacing = input.readFloat();
@ -397,7 +397,7 @@ public class SkeletonBinary extends SkeletonLoader {
if ((flags & 32) != 0) data.shearX = input.readFloat(); if ((flags & 32) != 0) data.shearX = input.readFloat();
data.limit = ((flags & 64) != 0 ? input.readFloat() : 5000) * scale; data.limit = ((flags & 64) != 0 ? input.readFloat() : 5000) * scale;
data.step = 1f / input.readUnsignedByte(); data.step = 1f / input.readUnsignedByte();
PhysicsConstraintPose setup = data.setup; PhysicsConstraintPose setup = data.setupPose;
setup.inertia = input.readFloat(); setup.inertia = input.readFloat();
setup.strength = input.readFloat(); setup.strength = input.readFloat();
setup.damping = input.readFloat(); setup.damping = input.readFloat();
@ -421,8 +421,8 @@ public class SkeletonBinary extends SkeletonLoader {
data.skinRequired = (flags & 1) != 0; data.skinRequired = (flags & 1) != 0;
data.loop = (flags & 2) != 0; data.loop = (flags & 2) != 0;
data.additive = (flags & 4) != 0; data.additive = (flags & 4) != 0;
if ((flags & 8) != 0) data.setup.time = input.readFloat(); if ((flags & 8) != 0) data.setupPose.time = input.readFloat();
if ((flags & 16) != 0) data.setup.mix = (flags & 32) != 0 ? input.readFloat() : 1; if ((flags & 16) != 0) data.setupPose.mix = (flags & 32) != 0 ? input.readFloat() : 1;
if ((flags & 64) != 0) { if ((flags & 64) != 0) {
data.local = (flags & 128) != 0; data.local = (flags & 128) != 0;
data.bone = bones[input.readInt(true)]; data.bone = bones[input.readInt(true)];

View File

@ -67,7 +67,7 @@ public class SkeletonBounds {
for (int i = 0; i < slotCount; i++) { for (int i = 0; i < slotCount; i++) {
Slot slot = slots[i]; Slot slot = slots[i];
if (!slot.bone.active) continue; if (!slot.bone.active) continue;
Attachment attachment = slot.applied.attachment; Attachment attachment = slot.appliedPose.attachment;
if (attachment instanceof BoundingBoxAttachment boundingBox) { if (attachment instanceof BoundingBoxAttachment boundingBox) {
boundingBoxes.add(boundingBox); boundingBoxes.add(boundingBox);

View File

@ -189,7 +189,7 @@ public class SkeletonJson extends SkeletonLoader {
} }
var data = new BoneData(skeletonData.bones.size, boneMap.getString("name"), parent); var data = new BoneData(skeletonData.bones.size, boneMap.getString("name"), parent);
data.length = boneMap.getFloat("length", 0) * scale; data.length = boneMap.getFloat("length", 0) * scale;
BonePose setup = data.setup; BonePose setup = data.setupPose;
setup.x = boneMap.getFloat("x", 0) * scale; setup.x = boneMap.getFloat("x", 0) * scale;
setup.y = boneMap.getFloat("y", 0) * scale; setup.y = boneMap.getFloat("y", 0) * scale;
setup.rotation = boneMap.getFloat("rotation", 0); setup.rotation = boneMap.getFloat("rotation", 0);
@ -219,10 +219,10 @@ public class SkeletonJson extends SkeletonLoader {
var data = new SlotData(skeletonData.slots.size, slotName, boneData); var data = new SlotData(skeletonData.slots.size, slotName, boneData);
String color = slotMap.getString("color", null); String color = slotMap.getString("color", null);
if (color != null) Color.valueOf(color, data.setup.getColor()); if (color != null) Color.valueOf(color, data.setupPose.getColor());
String dark = slotMap.getString("dark", null); String dark = slotMap.getString("dark", null);
if (dark != null) data.setup.darkColor = Color.valueOf(dark); if (dark != null) data.setupPose.darkColor = Color.valueOf(dark);
data.attachmentName = slotMap.getString("attachment", null); data.attachmentName = slotMap.getString("attachment", null);
data.blendMode = BlendMode.valueOf(slotMap.getString("blend", BlendMode.normal.name())); data.blendMode = BlendMode.valueOf(slotMap.getString("blend", BlendMode.normal.name()));
@ -250,7 +250,7 @@ public class SkeletonJson extends SkeletonLoader {
if (data.target == null) throw new SerializationException("IK target bone not found: " + targetName); if (data.target == null) throw new SerializationException("IK target bone not found: " + targetName);
data.uniform = constraintMap.getBoolean("uniform", false); data.uniform = constraintMap.getBoolean("uniform", false);
IkConstraintPose setup = data.setup; IkConstraintPose setup = data.setupPose;
setup.mix = constraintMap.getFloat("mix", 1); setup.mix = constraintMap.getFloat("mix", 1);
setup.softness = constraintMap.getFloat("softness", 0) * scale; setup.softness = constraintMap.getFloat("softness", 0) * scale;
setup.bendDirection = constraintMap.getBoolean("bendPositive", true) ? 1 : -1; setup.bendDirection = constraintMap.getBoolean("bendPositive", true) ? 1 : -1;
@ -331,7 +331,7 @@ public class SkeletonJson extends SkeletonLoader {
data.offsets[TransformConstraintData.SCALEY] = constraintMap.getFloat("scaleY", 0); data.offsets[TransformConstraintData.SCALEY] = constraintMap.getFloat("scaleY", 0);
data.offsets[TransformConstraintData.SHEARY] = constraintMap.getFloat("shearY", 0); data.offsets[TransformConstraintData.SHEARY] = constraintMap.getFloat("shearY", 0);
TransformConstraintPose setup = data.setup; TransformConstraintPose setup = data.setupPose;
if (rotate) setup.mixRotate = constraintMap.getFloat("mixRotate", 1); if (rotate) setup.mixRotate = constraintMap.getFloat("mixRotate", 1);
if (x) setup.mixX = constraintMap.getFloat("mixX", 1); if (x) setup.mixX = constraintMap.getFloat("mixX", 1);
if (y) setup.mixY = constraintMap.getFloat("mixY", setup.mixX); if (y) setup.mixY = constraintMap.getFloat("mixY", setup.mixX);
@ -359,7 +359,7 @@ public class SkeletonJson extends SkeletonLoader {
data.spacingMode = SpacingMode.valueOf(constraintMap.getString("spacingMode", "length")); data.spacingMode = SpacingMode.valueOf(constraintMap.getString("spacingMode", "length"));
data.rotateMode = RotateMode.valueOf(constraintMap.getString("rotateMode", "tangent")); data.rotateMode = RotateMode.valueOf(constraintMap.getString("rotateMode", "tangent"));
data.offsetRotation = constraintMap.getFloat("rotation", 0); data.offsetRotation = constraintMap.getFloat("rotation", 0);
PathConstraintPose setup = data.setup; PathConstraintPose setup = data.setupPose;
setup.position = constraintMap.getFloat("position", 0); setup.position = constraintMap.getFloat("position", 0);
if (data.positionMode == PositionMode.fixed) setup.position *= scale; if (data.positionMode == PositionMode.fixed) setup.position *= scale;
setup.spacing = constraintMap.getFloat("spacing", 0); setup.spacing = constraintMap.getFloat("spacing", 0);
@ -385,7 +385,7 @@ public class SkeletonJson extends SkeletonLoader {
data.shearX = constraintMap.getFloat("shearX", 0); data.shearX = constraintMap.getFloat("shearX", 0);
data.limit = constraintMap.getFloat("limit", 5000) * scale; data.limit = constraintMap.getFloat("limit", 5000) * scale;
data.step = 1f / constraintMap.getInt("fps", 60); data.step = 1f / constraintMap.getInt("fps", 60);
PhysicsConstraintPose setup = data.setup; PhysicsConstraintPose setup = data.setupPose;
setup.inertia = constraintMap.getFloat("inertia", 0.5f); setup.inertia = constraintMap.getFloat("inertia", 0.5f);
setup.strength = constraintMap.getFloat("strength", 100); setup.strength = constraintMap.getFloat("strength", 100);
setup.damping = constraintMap.getFloat("damping", 0.85f); setup.damping = constraintMap.getFloat("damping", 0.85f);
@ -408,8 +408,8 @@ public class SkeletonJson extends SkeletonLoader {
data.skinRequired = skinRequired; data.skinRequired = skinRequired;
data.additive = constraintMap.getBoolean("additive", false); data.additive = constraintMap.getBoolean("additive", false);
data.loop = constraintMap.getBoolean("loop", false); data.loop = constraintMap.getBoolean("loop", false);
data.setup.time = constraintMap.getFloat("time", 0); data.setupPose.time = constraintMap.getFloat("time", 0);
data.setup.mix = constraintMap.getFloat("mix", 1); data.setupPose.mix = constraintMap.getFloat("mix", 1);
String boneName = constraintMap.getString("bone", null); String boneName = constraintMap.getString("bone", null);
if (boneName != null) { if (boneName != null) {

View File

@ -81,7 +81,7 @@ public class SkeletonRenderer {
for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) { for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) {
Slot slot = drawOrder[i]; Slot slot = drawOrder[i];
if (!slot.bone.active) continue; if (!slot.bone.active) continue;
SlotPose pose = slot.applied; SlotPose pose = slot.appliedPose;
Attachment attachment = pose.attachment; Attachment attachment = pose.attachment;
if (attachment instanceof RegionAttachment region) { if (attachment instanceof RegionAttachment region) {
Sequence sequence = region.getSequence(); Sequence sequence = region.getSequence();
@ -150,7 +150,7 @@ public class SkeletonRenderer {
for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) { for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) {
Slot slot = drawOrder[i]; Slot slot = drawOrder[i];
if (slot.bone.active) { if (slot.bone.active) {
SlotPose pose = slot.applied; SlotPose pose = slot.appliedPose;
Attachment attachment = pose.attachment; Attachment attachment = pose.attachment;
if (attachment != null) { if (attachment != null) {
Texture texture = null; Texture texture = null;
@ -249,7 +249,7 @@ public class SkeletonRenderer {
for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) { for (int i = 0, n = skeleton.drawOrder.size; i < n; i++) {
Slot slot = drawOrder[i]; Slot slot = drawOrder[i];
if (slot.bone.active) { if (slot.bone.active) {
SlotPose pose = slot.applied; SlotPose pose = slot.appliedPose;
Attachment attachment = pose.attachment; Attachment attachment = pose.attachment;
if (attachment != null) { if (attachment != null) {
Texture texture = null; Texture texture = null;

View File

@ -96,7 +96,7 @@ public class SkeletonRendererDebug {
shapes.setColor(boneOriginColor); shapes.setColor(boneOriginColor);
} else } else
shapes.setColor(boneLineColor); shapes.setColor(boneLineColor);
BonePose applied = bone.applied; BonePose applied = bone.appliedPose;
float x = length * applied.a + applied.worldX; float x = length * applied.a + applied.worldX;
float y = length * applied.c + applied.worldY; float y = length * applied.c + applied.worldY;
shapes.rectLine(applied.worldX, applied.worldY, x, y, width * scale); shapes.rectLine(applied.worldX, applied.worldY, x, y, width * scale);
@ -109,9 +109,9 @@ public class SkeletonRendererDebug {
for (int i = 0; i < slotCount; i++) { for (int i = 0; i < slotCount; i++) {
Slot slot = slots[i]; Slot slot = slots[i];
if (!slot.bone.active) continue; if (!slot.bone.active) continue;
if (!(slot.applied.attachment instanceof PointAttachment point)) continue; if (!(slot.appliedPose.attachment instanceof PointAttachment point)) continue;
point.computeWorldPosition(slot.bone.applied, temp1); point.computeWorldPosition(slot.bone.appliedPose, temp1);
temp2.set(8, 0).rotate(point.computeWorldRotation(slot.bone.applied)); temp2.set(8, 0).rotate(point.computeWorldRotation(slot.bone.appliedPose));
shapes.rectLine(temp1, temp2, boneWidth / 2 * scale); shapes.rectLine(temp1, temp2, boneWidth / 2 * scale);
} }
} }
@ -126,7 +126,7 @@ public class SkeletonRendererDebug {
if (!slot.bone.active) continue; if (!slot.bone.active) continue;
if (slot.pose.attachment instanceof RegionAttachment region) { if (slot.pose.attachment instanceof RegionAttachment region) {
float[] vertices = this.vertices.items; float[] vertices = this.vertices.items;
float[] offsets = region.getOffsets(slot.applied); float[] offsets = region.getOffsets(slot.appliedPose);
region.computeWorldVertices(slot, offsets, vertices, 0, 2); region.computeWorldVertices(slot, offsets, vertices, 0, 2);
shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]); shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]);
shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]); shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]);
@ -241,7 +241,7 @@ public class SkeletonRendererDebug {
for (int i = 0; i < boneCount; i++) { for (int i = 0; i < boneCount; i++) {
Bone bone = bones[i]; Bone bone = bones[i];
if (!bone.active) continue; if (!bone.active) continue;
shapes.circle(bone.applied.worldX, bone.applied.worldY, 3 * scale, 8); shapes.circle(bone.appliedPose.worldX, bone.appliedPose.worldY, 3 * scale, 8);
} }
} }
@ -251,7 +251,7 @@ public class SkeletonRendererDebug {
Slot slot = slots[i]; Slot slot = slots[i];
if (!slot.bone.active) continue; if (!slot.bone.active) continue;
if (!(slot.pose.attachment instanceof PointAttachment point)) continue; if (!(slot.pose.attachment instanceof PointAttachment point)) continue;
point.computeWorldPosition(slot.bone.applied, temp1); point.computeWorldPosition(slot.bone.appliedPose, temp1);
shapes.circle(temp1.x, temp1.y, 3 * scale, 8); shapes.circle(temp1.x, temp1.y, 3 * scale, 8);
} }
} }

View File

@ -56,15 +56,15 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
} }
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
SliderPose p = applied; SliderPose p = appliedPose;
if (p.mix == 0) return; if (p.mix == 0) return;
Animation animation = data.animation; Animation animation = data.animation;
if (bone != null) { if (bone != null) {
if (!bone.active) return; if (!bone.active) return;
if (data.local) bone.applied.validateLocalTransform(skeleton); if (data.local) bone.appliedPose.validateLocalTransform(skeleton);
p.time = data.offset p.time = data.offset
+ (data.property.value(skeleton, bone.applied, data.local, offsets) - data.property.offset) * data.scale; + (data.property.value(skeleton, bone.appliedPose, data.local, offsets) - data.property.offset) * data.scale;
if (data.loop) if (data.loop)
p.time = animation.duration + (p.time % animation.duration); p.time = animation.duration + (p.time % animation.duration);
else else
@ -74,7 +74,7 @@ public class Slider extends Constraint<Slider, SliderData, SliderPose> {
Bone[] bones = skeleton.bones.items; Bone[] bones = skeleton.bones.items;
int[] indices = animation.bones.items; int[] indices = animation.bones.items;
for (int i = 0, n = animation.bones.size; i < n; i++) for (int i = 0, n = animation.bones.size; i < n; i++)
bones[indices[i]].applied.modifyLocal(skeleton); bones[indices[i]].appliedPose.modifyLocal(skeleton);
animation.apply(skeleton, p.time, p.time, data.loop, null, p.mix, false, data.additive, false, true); animation.apply(skeleton, p.time, p.time, data.loop, null, p.mix, false, data.additive, false, true);
} }

View File

@ -45,9 +45,9 @@ public class Slot extends Posed<SlotData, SlotPose> {
if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null.");
this.skeleton = skeleton; this.skeleton = skeleton;
bone = skeleton.bones.items[data.boneData.index]; bone = skeleton.bones.items[data.boneData.index];
if (data.setup.darkColor != null) { if (data.setupPose.darkColor != null) {
pose.darkColor = new Color(); pose.darkColor = new Color();
constrained.darkColor = new Color(); constrainedPose.darkColor = new Color();
} }
setupPose(); setupPose();
} }
@ -59,9 +59,9 @@ public class Slot extends Posed<SlotData, SlotPose> {
if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null.");
this.bone = bone; this.bone = bone;
this.skeleton = skeleton; this.skeleton = skeleton;
if (data.setup.darkColor != null) { if (data.setupPose.darkColor != null) {
pose.darkColor = new Color(); pose.darkColor = new Color();
constrained.darkColor = new Color(); constrainedPose.darkColor = new Color();
} }
pose.set(slot.pose); pose.set(slot.pose);
} }
@ -72,9 +72,9 @@ public class Slot extends Posed<SlotData, SlotPose> {
} }
public void setupPose () { public void setupPose () {
pose.color.set(data.setup.color); pose.color.set(data.setupPose.color);
if (pose.darkColor != null) pose.darkColor.set(data.setup.darkColor); if (pose.darkColor != null) pose.darkColor.set(data.setupPose.darkColor);
pose.sequenceIndex = data.setup.sequenceIndex; pose.sequenceIndex = data.setupPose.sequenceIndex;
if (data.attachmentName == null) if (data.attachmentName == null)
pose.setAttachment(null); pose.setAttachment(null);
else { else {

View File

@ -49,7 +49,7 @@ public class TransformConstraint extends Constraint<TransformConstraint, Transfo
bones = new Array(true, data.bones.size, BonePose[]::new); bones = new Array(true, data.bones.size, BonePose[]::new);
for (BoneData boneData : data.bones) for (BoneData boneData : data.bones)
bones.add(skeleton.bones.items[boneData.index].constrained); bones.add(skeleton.bones.items[boneData.index].constrainedPose);
source = skeleton.bones.items[data.source.index]; source = skeleton.bones.items[data.source.index];
} }
@ -62,13 +62,13 @@ public class TransformConstraint extends Constraint<TransformConstraint, Transfo
/** Applies the constraint to the constrained bones. */ /** Applies the constraint to the constrained bones. */
public void update (Skeleton skeleton, Physics physics) { public void update (Skeleton skeleton, Physics physics) {
TransformConstraintPose p = applied; TransformConstraintPose p = appliedPose;
if (p.mixRotate == 0 & p.mixX == 0 & p.mixY == 0 & p.mixScaleX == 0 & p.mixScaleY == 0 & p.mixShearY == 0) return; if (p.mixRotate == 0 & p.mixX == 0 & p.mixY == 0 & p.mixScaleX == 0 & p.mixScaleY == 0 & p.mixShearY == 0) return;
TransformConstraintData data = this.data; TransformConstraintData data = this.data;
boolean localSource = data.localSource, localTarget = data.localTarget, additive = data.additive, clamp = data.clamp; boolean localSource = data.localSource, localTarget = data.localTarget, additive = data.additive, clamp = data.clamp;
float[] offsets = data.offsets; float[] offsets = data.offsets;
BonePose source = this.source.applied; BonePose source = this.source.appliedPose;
if (localSource) source.validateLocalTransform(skeleton); if (localSource) source.validateLocalTransform(skeleton);
FromProperty[] fromItems = data.properties.items; FromProperty[] fromItems = data.properties.items;
int fn = data.properties.size, update = skeleton.update; int fn = data.properties.size, update = skeleton.update;