[libgdx] Use transform constraint mix for the "to" property.

This commit is contained in:
Nathan Sweet 2025-04-01 23:29:21 -04:00
parent df06ab29e7
commit 7a366cd6f5
2 changed files with 25 additions and 26 deletions

View File

@ -106,8 +106,7 @@ public class TransformConstraint implements Updatable {
var bone = (Bone)bones[i]; var bone = (Bone)bones[i];
for (int f = 0; f < fn; f++) { for (int f = 0; f < fn; f++) {
var from = (FromProperty)fromItems[f]; var from = (FromProperty)fromItems[f];
float mix = from.mix(this); if (from.mix(this) != 0) {
if (mix != 0) {
float value = from.value(data, source, localFrom) - from.offset; float value = from.value(data, source, localFrom) - from.offset;
Object[] toItems = from.to.items; Object[] toItems = from.to.items;
for (int t = 0, tn = from.to.size; t < tn; t++) { for (int t = 0, tn = from.to.size; t < tn; t++) {
@ -119,7 +118,7 @@ public class TransformConstraint implements Updatable {
else else
clamped = clamp(clamped, to.max, to.offset); clamped = clamp(clamped, to.max, to.offset);
} }
to.apply(bone, clamped, localTarget, relative, mix); to.apply(data, bone, clamped, localTarget, relative);
} }
} }
} }

View File

@ -202,7 +202,7 @@ public class TransformConstraintData extends ConstraintData {
public float scale; public float scale;
/** Applies the value to this property. */ /** Applies the value to this property. */
abstract public void apply (Bone bone, float value, boolean local, boolean relative, float mix); abstract public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative);
} }
static public class FromRotate extends FromProperty { static public class FromRotate extends FromProperty {
@ -216,10 +216,10 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToRotate extends ToProperty { static public class ToRotate extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (!relative) value -= bone.arotation; if (!relative) value -= bone.arotation;
bone.arotation += value * mix; bone.arotation += value * data.mixRotate;
} else { } else {
float a = bone.a, b = bone.b, c = bone.c, d = bone.d; float a = bone.a, b = bone.b, c = bone.c, d = bone.d;
value *= degRad; value *= degRad;
@ -228,7 +228,7 @@ public class TransformConstraintData extends ConstraintData {
value -= PI2; value -= PI2;
else if (value < -PI) // else if (value < -PI) //
value += PI2; value += PI2;
value *= mix; value *= data.mixRotate;
float cos = cos(value), sin = sin(value); float cos = cos(value), sin = sin(value);
bone.a = cos * a - sin * c; bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d; bone.b = cos * b - sin * d;
@ -249,13 +249,13 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToX extends ToProperty { static public class ToX extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (!relative) value -= bone.ax; if (!relative) value -= bone.ax;
bone.ax += value * mix; bone.ax += value * data.mixX;
} else { } else {
if (!relative) value -= bone.worldX; if (!relative) value -= bone.worldX;
bone.worldX += value * mix; bone.worldX += value * data.mixX;
} }
} }
} }
@ -271,13 +271,13 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToY extends ToProperty { static public class ToY extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (!relative) value -= bone.ay; if (!relative) value -= bone.ay;
bone.ay += value * mix; bone.ay += value * data.mixY;
} else { } else {
if (!relative) value -= bone.worldY; if (!relative) value -= bone.worldY;
bone.worldY += value * mix; bone.worldY += value * data.mixY;
} }
} }
} }
@ -293,19 +293,19 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToScaleX extends ToProperty { static public class ToScaleX extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (relative) if (relative)
bone.ascaleX *= 1 + ((value - 1) * mix); bone.ascaleX *= 1 + ((value - 1) * data.mixScaleX);
else if (bone.ascaleX != 0) // else if (bone.ascaleX != 0) //
bone.ascaleX = 1 + (value / bone.ascaleX - 1) * mix; bone.ascaleX = 1 + (value / bone.ascaleX - 1) * data.mixScaleX;
} else { } else {
float s; float s;
if (relative) if (relative)
s = 1 + (value - 1) * mix; s = 1 + (value - 1) * data.mixScaleX;
else { else {
s = (float)Math.sqrt(bone.a * bone.a + bone.c * bone.c); s = (float)Math.sqrt(bone.a * bone.a + bone.c * bone.c);
if (s != 0) s = 1 + (value / s - 1) * mix; if (s != 0) s = 1 + (value / s - 1) * data.mixScaleX;
} }
bone.a *= s; bone.a *= s;
bone.c *= s; bone.c *= s;
@ -324,19 +324,19 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToScaleY extends ToProperty { static public class ToScaleY extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (relative) if (relative)
bone.ascaleY *= 1 + ((value - 1) * mix); bone.ascaleY *= 1 + ((value - 1) * data.mixScaleY);
else if (bone.ascaleY != 0) // else if (bone.ascaleY != 0) //
bone.ascaleY = 1 + (value / bone.ascaleY - 1) * mix; bone.ascaleY = 1 + (value / bone.ascaleY - 1) * data.mixScaleY;
} else { } else {
float s; float s;
if (relative) if (relative)
s = 1 + (value - 1) * mix; s = 1 + (value - 1) * data.mixScaleY;
else { else {
s = (float)Math.sqrt(bone.b * bone.b + bone.d * bone.d); s = (float)Math.sqrt(bone.b * bone.b + bone.d * bone.d);
if (s != 0) s = 1 + (value / s - 1) * mix; if (s != 0) s = 1 + (value / s - 1) * data.mixScaleY;
} }
bone.b *= s; bone.b *= s;
bone.d *= s; bone.d *= s;
@ -355,10 +355,10 @@ public class TransformConstraintData extends ConstraintData {
} }
static public class ToShearY extends ToProperty { static public class ToShearY extends ToProperty {
public void apply (Bone bone, float value, boolean local, boolean relative, float mix) { public void apply (TransformConstraintData data, Bone bone, float value, boolean local, boolean relative) {
if (local) { if (local) {
if (!relative) value -= bone.ashearY; if (!relative) value -= bone.ashearY;
bone.ashearY += value * mix; bone.ashearY += value * data.mixShearY;
} else { } else {
float b = bone.b, d = bone.d, by = atan2(d, b); float b = bone.b, d = bone.d, by = atan2(d, b);
value = (value + 90) * degRad; value = (value + 90) * degRad;
@ -371,7 +371,7 @@ public class TransformConstraintData extends ConstraintData {
else if (value < -PI) // else if (value < -PI) //
value += PI2; value += PI2;
} }
value = by + value * mix; value = by + value * data.mixShearY;
float s = (float)Math.sqrt(b * b + d * d); float s = (float)Math.sqrt(b * b + d * d);
bone.b = cos(value) * s; bone.b = cos(value) * s;
bone.d = sin(value) * s; bone.d = sin(value) * s;