diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java index 0fde2942b..e5e5d7fde 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java @@ -334,14 +334,19 @@ public class SkeletonBinary extends SkeletonLoader { froms[ii] = from; } flags = input.read(); - if ((flags & 1) != 0) data.offsetX = input.readFloat(); - if ((flags & 2) != 0) data.offsetY = input.readFloat(); - if ((flags & 4) != 0) data.mixRotate = input.readFloat(); - if ((flags & 8) != 0) data.mixX = input.readFloat(); - if ((flags & 16) != 0) data.mixY = input.readFloat(); - if ((flags & 32) != 0) data.mixScaleX = input.readFloat(); - if ((flags & 64) != 0) data.mixScaleY = input.readFloat(); - if ((flags & 128) != 0) data.mixShearY = input.readFloat(); + if ((flags & 1) != 0) data.offsetRotation = input.readFloat(); + if ((flags & 2) != 0) data.offsetX = input.readFloat(); + if ((flags & 4) != 0) data.offsetY = input.readFloat(); + if ((flags & 8) != 0) data.offsetScaleX = input.readFloat(); + if ((flags & 16) != 0) data.offsetScaleY = input.readFloat(); + if ((flags & 32) != 0) data.offsetShearY = input.readFloat(); + flags = input.read(); + if ((flags & 1) != 0) data.mixRotate = input.readFloat(); + if ((flags & 2) != 0) data.mixX = input.readFloat(); + if ((flags & 4) != 0) data.mixY = input.readFloat(); + if ((flags & 8) != 0) data.mixScaleX = input.readFloat(); + if ((flags & 16) != 0) data.mixScaleY = input.readFloat(); + if ((flags & 32) != 0) data.mixShearY = input.readFloat(); o[i] = data; } diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java index 9cdbfe39f..01f26c89b 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -321,8 +321,13 @@ public class SkeletonJson extends SkeletonLoader { if (from.to.notEmpty()) data.properties.add(from); } + data.offsetRotation = constraintMap.getFloat("rotation", 0); data.offsetX = constraintMap.getFloat("x", 0) * scale; data.offsetY = constraintMap.getFloat("y", 0) * scale; + data.offsetScaleX = constraintMap.getFloat("scaleX", 0); + data.offsetScaleY = constraintMap.getFloat("scaleY", 0); + data.offsetShearY = constraintMap.getFloat("shearY", 0); + if (rotate) data.mixRotate = constraintMap.getFloat("mixRotate", 1); if (x) data.mixX = constraintMap.getFloat("mixX", 1); if (y) data.mixY = constraintMap.getFloat("mixY", data.mixX); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraintData.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraintData.java index d4a9e3ef5..fefb1a483 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraintData.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraintData.java @@ -39,7 +39,8 @@ import com.badlogic.gdx.utils.Array; public class TransformConstraintData extends ConstraintData { final Array bones = new Array(); BoneData source; - float offsetX, offsetY, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY; + float mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY; + float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY; boolean localSource, localTarget, additive, clamp; final Array properties = new Array(); @@ -121,6 +122,15 @@ public class TransformConstraintData extends ConstraintData { this.mixShearY = mixShearY; } + /** An offset added to the constrained bone rotation. */ + public float getOffsetRotation () { + return offsetRotation; + } + + public void setOffsetRotation (float offsetRotation) { + this.offsetRotation = offsetRotation; + } + /** An offset added to the constrained bone X translation. */ public float getOffsetX () { return offsetX; @@ -139,6 +149,33 @@ public class TransformConstraintData extends ConstraintData { this.offsetY = offsetY; } + /** An offset added to the constrained bone scaleX. */ + public float getOffsetScaleX () { + return offsetScaleX; + } + + public void setOffsetScaleX (float offsetScaleX) { + this.offsetScaleX = offsetScaleX; + } + + /** An offset added to the constrained bone scaleY. */ + public float getOffsetScaleY () { + return offsetScaleY; + } + + public void setOffsetScaleY (float offsetScaleY) { + this.offsetScaleY = offsetScaleY; + } + + /** An offset added to the constrained bone shearY. */ + public float getOffsetShearY () { + return offsetShearY; + } + + public void setOffsetShearY (float offsetShearY) { + this.offsetShearY = offsetShearY; + } + /** Reads the source bone's local transform instead of its world transform. */ public boolean getLocalSource () { return localSource; @@ -207,7 +244,11 @@ public class TransformConstraintData extends ConstraintData { static public class FromRotate extends FromProperty { public float value (TransformConstraintData data, Bone source, boolean local) { - return local ? source.arotation : atan2(source.c, source.a) * radDeg; + if (local) return source.arotation + data.offsetRotation; + float value = atan2(source.c, source.a) * radDeg + + (source.a * source.d - source.b * source.c > 0 ? data.offsetRotation : -data.offsetRotation); + if (value < 0) value += 360; + return value; } } @@ -284,7 +325,7 @@ public class TransformConstraintData extends ConstraintData { static public class FromScaleX extends FromProperty { public float value (TransformConstraintData data, Bone source, boolean local) { - return local ? source.ascaleX : (float)Math.sqrt(source.a * source.a + source.c * source.c); + return (local ? source.ascaleX : (float)Math.sqrt(source.a * source.a + source.c * source.c)) + data.offsetScaleX; } } @@ -315,7 +356,7 @@ public class TransformConstraintData extends ConstraintData { static public class FromScaleY extends FromProperty { public float value (TransformConstraintData data, Bone source, boolean local) { - return local ? source.ascaleY : (float)Math.sqrt(source.b * source.b + source.d * source.d); + return (local ? source.ascaleY : (float)Math.sqrt(source.b * source.b + source.d * source.d)) + data.offsetScaleY; } } @@ -346,7 +387,8 @@ public class TransformConstraintData extends ConstraintData { static public class FromShearY extends FromProperty { public float value (TransformConstraintData data, Bone source, boolean local) { - return local ? source.ashearY : (atan2(source.d, source.b) - atan2(source.c, source.a)) * radDeg - 90; + return (local ? source.ashearY : (atan2(source.d, source.b) - atan2(source.c, source.a)) * radDeg - 90) + + data.offsetShearY; } }