diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraintData.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraintData.java index ffa110214..dfa7b9eb3 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraintData.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraintData.java @@ -37,9 +37,9 @@ public class IkConstraintData extends ConstraintData { final Array bones = new Array(); BoneData target; - int bendDirection = 1; + int bendDirection; boolean compress, stretch, uniform; - float mix = 1, softness; + float mix, softness; public IkConstraintData (String name) { super(name); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java index 5abe044a7..0d894c8de 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java @@ -150,14 +150,16 @@ public void update (Physics physics) { ux = bx; uy = by; } else { - float a = remaining, i = inertia, t = data.step, f = skeleton.data.referenceScale, d = -1; + float a = remaining, i = inertia, q = data.limit, t = data.step, f = skeleton.data.referenceScale, d = -1; if (x || y) { if (x) { - xOffset += (ux - bx) * i; + float u = (ux - bx) * i; + xOffset += u > q ? q : u < -q ? -q : u; ux = bx; } if (y) { - yOffset += (uy - by) * i; + float u = (uy - by) * i; + yOffset += u > q ? q : u < -q ? -q : u; uy = by; } if (a >= t) { @@ -184,7 +186,9 @@ public void update (Physics physics) { float ca = atan2(bone.c, bone.a), c, s, mr = 0; if (rotateOrShearX) { mr = (data.rotate + data.shearX) * mix; - float dx = cx - bone.worldX, dy = cy - bone.worldY, r = atan2(dy + ty, dx + tx) - ca - rotateOffset * mr; + float dx = cx - bone.worldX, dy = cy - bone.worldY; + float r = atan2((dy > q ? q : dy < -q ? -q : dy) + ty, (dx > q ? q : dx < -q ? -q : dx) + tx) - ca + - rotateOffset * mr; rotateOffset += (r - (float)Math.ceil(r * invPI2 - 0.5f) * PI2) * i; r = rotateOffset * mr + ca; c = cos(r); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java index fa5c928b4..363643a5c 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java @@ -34,7 +34,7 @@ * See Physics constraints in the Spine User Guide. */ public class PhysicsConstraintData extends ConstraintData { BoneData bone; - float x, y, rotate, scaleX, shearX; + float x, y, rotate, scaleX, shearX, limit; float step, inertia, strength, damping, massInverse, wind, gravity, mix; boolean inertiaGlobal, strengthGlobal, dampingGlobal, massGlobal, windGlobal, gravityGlobal, mixGlobal; @@ -99,6 +99,14 @@ public void setShearX (float shearX) { this.shearX = shearX; } + public float getLimit () { + return limit; + } + + public void setLimit (float limit) { + this.limit = limit; + } + public float getInertia () { return inertia; } 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 926d5158b..14ace8ad0 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java @@ -256,14 +256,14 @@ public SkeletonData readSkeletonData (InputStream dataInput) { for (int ii = 0; ii < nn; ii++) constraintBones[ii] = bones[input.readInt(true)]; data.target = (BoneData)bones[input.readInt(true)]; - data.mix = input.readFloat(); - data.softness = input.readFloat() * scale; int flags = input.read(); data.skinRequired = (flags & 1) != 0; data.bendDirection = (flags & 2) != 0 ? 1 : -1; data.compress = (flags & 4) != 0; data.stretch = (flags & 8) != 0; data.uniform = (flags & 16) != 0; + if ((flags & 32) != 0) data.mix = (flags & 64) != 0 ? input.readFloat() : 1; + if ((flags & 128) != 0) data.softness = input.readFloat() * scale; o[i] = data; } @@ -280,18 +280,19 @@ public SkeletonData readSkeletonData (InputStream dataInput) { data.skinRequired = (flags & 1) != 0; data.local = (flags & 2) != 0; data.relative = (flags & 4) != 0; - data.offsetRotation = input.readFloat(); - data.offsetX = input.readFloat() * scale; - data.offsetY = input.readFloat() * scale; - data.offsetScaleX = input.readFloat(); - data.offsetScaleY = input.readFloat(); - data.offsetShearY = input.readFloat(); - data.mixRotate = input.readFloat(); - data.mixX = input.readFloat(); - data.mixY = input.readFloat(); - data.mixScaleX = input.readFloat(); - data.mixScaleY = input.readFloat(); - data.mixShearY = input.readFloat(); + if ((flags & 8) != 0) data.offsetRotation = input.readFloat(); + if ((flags & 16) != 0) data.offsetX = input.readFloat() * scale; + if ((flags & 32) != 0) data.offsetY = input.readFloat() * scale; + if ((flags & 64) != 0) data.offsetScaleX = input.readFloat(); + if ((flags & 128) != 0) data.offsetScaleY = input.readFloat(); + flags = input.read(); + if ((flags & 1) != 0) data.offsetShearY = input.readFloat(); + if ((flags & 2) != 0) data.mixRotate = input.readFloat(); + if ((flags & 4) != 0) data.mixX = input.readFloat(); + if ((flags & 8) != 0) data.mixY = input.readFloat(); + if ((flags & 16) != 0) data.mixScaleX = input.readFloat(); + if ((flags & 32) != 0) data.mixScaleY = input.readFloat(); + if ((flags & 64) != 0) data.mixShearY = input.readFloat(); o[i] = data; } @@ -305,10 +306,11 @@ public SkeletonData readSkeletonData (InputStream dataInput) { for (int ii = 0; ii < nn; ii++) constraintBones[ii] = bones[input.readInt(true)]; data.target = (SlotData)slots[input.readInt(true)]; - data.positionMode = PositionMode.values[input.readInt(true)]; - data.spacingMode = SpacingMode.values[input.readInt(true)]; - data.rotateMode = RotateMode.values[input.readInt(true)]; - data.offsetRotation = input.readFloat(); + int flags = input.read(); + data.positionMode = PositionMode.values[flags & 1]; + data.spacingMode = SpacingMode.values[(flags >> 1) & 2]; + data.rotateMode = RotateMode.values[(flags >> 3) & 2]; + if ((flags & 128) != 0) data.offsetRotation = input.readFloat(); data.position = input.readFloat(); if (data.positionMode == PositionMode.fixed) data.position *= scale; data.spacing = input.readFloat(); @@ -332,14 +334,14 @@ public SkeletonData readSkeletonData (InputStream dataInput) { if ((flags & 8) != 0) data.rotate = input.readFloat(); if ((flags & 16) != 0) data.scaleX = input.readFloat(); if ((flags & 32) != 0) data.shearX = input.readFloat(); + data.limit = ((flags & 64) != 0 ? input.readFloat() : 500) * scale; data.step = 1f / input.readByte(); data.inertia = input.readFloat(); data.strength = input.readFloat(); data.damping = input.readFloat(); - data.massInverse = input.readFloat(); + data.massInverse = (flags & 128) != 0 ? input.readFloat() : 1; data.wind = input.readFloat(); data.gravity = input.readFloat(); - data.mix = input.readFloat(); flags = input.read(); if ((flags & 1) != 0) data.inertiaGlobal = true; if ((flags & 2) != 0) data.strengthGlobal = true; @@ -348,6 +350,7 @@ public SkeletonData readSkeletonData (InputStream dataInput) { if ((flags & 16) != 0) data.windGlobal = true; if ((flags & 32) != 0) data.gravityGlobal = true; if ((flags & 64) != 0) data.mixGlobal = true; + data.mix = (flags & 128) != 0 ? input.readFloat() : 1; o[i] = data; } @@ -468,7 +471,7 @@ private Attachment readAttachment (SkeletonInput input, SkeletonData skeletonDat String path = (flags & 16) != 0 ? input.readStringRef() : null; int color = (flags & 32) != 0 ? input.readInt() : 0xffffffff; Sequence sequence = (flags & 64) != 0 ? readSequence(input) : null; - float rotation = input.readFloat(); + float rotation = (flags & 128) != 0 ? input.readFloat() : 0; float x = input.readFloat(); float y = input.readFloat(); float scaleX = input.readFloat(); @@ -880,17 +883,18 @@ private Animation readAnimation (SkeletonInput input, String name, SkeletonData for (int i = 0, n = input.readInt(true); i < n; i++) { int index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1; IkConstraintTimeline timeline = new IkConstraintTimeline(frameCount, input.readInt(true), index); - float time = input.readFloat(), mix = input.readFloat(), softness = input.readFloat() * scale; + int flags = input.read(); + float time = input.readFloat(), mix = (flags & 1) != 0 ? ((flags & 2) != 0 ? input.readFloat() : 1) : 0; + float softness = (flags & 4) != 0 ? input.readFloat() * scale : 0; for (int frame = 0, bezier = 0;; frame++) { - int flags = input.read(); - timeline.setFrame(frame, time, mix, softness, input.readByte(), (flags & 1) != 0, (flags & 2) != 0); + timeline.setFrame(frame, time, mix, softness, (flags & 8) != 0 ? 1 : -1, (flags & 16) != 0, (flags & 32) != 0); if (frame == frameLast) break; - float time2 = input.readFloat(), mix2 = input.readFloat(), softness2 = input.readFloat() * scale; - switch (input.readByte()) { - case CURVE_STEPPED: + flags = input.read(); + float time2 = input.readFloat(), mix2 = (flags & 1) != 0 ? ((flags & 2) != 0 ? input.readFloat() : 1) : 0; + float softness2 = (flags & 4) != 0 ? input.readFloat() * scale : 0; + if ((flags & 64) != 0) timeline.setStepped(frame); - break; - case CURVE_BEZIER: + else if ((flags & 128) != 0) { setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1); setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale); } 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 a96a51f76..ca9e50a13 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -314,6 +314,7 @@ public SkeletonData readSkeletonData (JsonValue root) { data.rotate = constraintMap.getFloat("rotate", 0); data.scaleX = constraintMap.getFloat("scaleX", 0); data.shearX = constraintMap.getFloat("shearX", 0); + data.limit = constraintMap.getFloat("limit", 500) * scale; data.step = 1f / constraintMap.getInt("fps", 60); data.inertia = constraintMap.getFloat("inertia", 1); data.strength = constraintMap.getFloat("strength", 100);