diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java index 18b7f1813..fde91f9ce 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraint.java @@ -60,18 +60,16 @@ public class IkConstraint implements Updatable { bones = new Array(data.bones.size); for (BoneData boneData : data.bones) bones.add(skeleton.bones.get(boneData.index)); + target = skeleton.bones.get(data.target.index); } /** Copy constructor. */ - public IkConstraint (IkConstraint constraint, Skeleton skeleton) { + public IkConstraint (IkConstraint constraint) { if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); data = constraint.data; - bones = new Array(constraint.bones.size); - for (Bone bone : constraint.bones) - bones.add(skeleton.bones.get(bone.data.index)); - target = skeleton.bones.get(constraint.target.data.index); + bones = new Array(constraint.bones); + target = constraint.target; mix = constraint.mix; softness = constraint.softness; bendDirection = constraint.bendDirection; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java index fbb94d149..a9031e5e3 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PathConstraint.java @@ -65,9 +65,11 @@ public class PathConstraint implements Updatable { if (data == null) throw new IllegalArgumentException("data cannot be null."); if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); this.data = data; + bones = new Array(data.bones.size); for (BoneData boneData : data.bones) bones.add(skeleton.bones.get(boneData.index)); + target = skeleton.slots.get(data.target.index); position = data.position; spacing = data.spacing; @@ -77,14 +79,11 @@ public class PathConstraint implements Updatable { } /** Copy constructor. */ - public PathConstraint (PathConstraint constraint, Skeleton skeleton) { + public PathConstraint (PathConstraint constraint) { if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); data = constraint.data; - bones = new Array(constraint.bones.size); - for (Bone bone : constraint.bones) - bones.add(skeleton.bones.get(bone.data.index)); - target = skeleton.slots.get(constraint.target.data.index); + bones = new Array(constraint.bones); + target = constraint.target; position = constraint.position; spacing = constraint.spacing; mixRotate = constraint.mixRotate; 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 885bba8f5..4316a497c 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java @@ -29,26 +29,15 @@ package com.esotericsoftware.spine; -import static com.esotericsoftware.spine.utils.SpineUtils.*; - -import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Null; - -import com.esotericsoftware.spine.PhysicsConstraintData.NodeData; -import com.esotericsoftware.spine.PhysicsConstraintData.SpringData; /** Stores the current pose for a physics constraint. A physics constraint applies physics to bones. *

* See Physics constraints in the Spine User Guide. */ public class PhysicsConstraint implements Updatable { - static private final Vector2 temp = new Vector2(); - static private final float epsilon = 0.00001f; - final PhysicsConstraintData data; - final Array nodes; - final Array springs; - float friction, gravity, wind, length, stiffness, damping, mix; + final Array bones; + float mix; boolean active; @@ -61,20 +50,10 @@ public class PhysicsConstraint implements Updatable { this.data = data; this.skeleton = skeleton; - nodes = new Array(data.nodes.size); - for (NodeData nodeData : data.nodes) - nodes.add(new Node(nodeData, skeleton)); + bones = new Array(data.bones.size); + for (BoneData boneData : data.bones) + bones.add(skeleton.bones.get(boneData.index)); - springs = new Array(data.springs.size); - for (SpringData springData : data.springs) - springs.add(new Spring(springData, this, skeleton)); - - friction = data.friction; - gravity = data.gravity; - wind = data.wind; - length = data.length; - stiffness = data.stiffness; - damping = data.damping; mix = data.mix; } @@ -83,21 +62,7 @@ public class PhysicsConstraint implements Updatable { if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); data = constraint.data; skeleton = constraint.skeleton; - - nodes = new Array(constraint.nodes.size); - for (Node node : constraint.nodes) - nodes.add(new Node(node)); - - springs = new Array(constraint.springs.size); - for (Spring spring : constraint.springs) - springs.add(new Spring(spring, this)); - - friction = constraint.friction; - gravity = constraint.gravity; - wind = constraint.wind; - length = constraint.length; - stiffness = constraint.stiffness; - damping = constraint.damping; + bones = new Array(constraint.bones); mix = constraint.mix; } @@ -105,21 +70,7 @@ public class PhysicsConstraint implements Updatable { remaining = 0; lastTime = skeleton.time; - Object[] nodes = this.nodes.items; - for (int i = 0, n = this.nodes.size; i < n; i++) - ((Node)nodes[i]).setToSetupPose(); - - Object[] springs = this.springs.items; - for (int i = 0, n = this.springs.size; i < n; i++) - ((Spring)springs[i]).setToSetupPose(); - PhysicsConstraintData data = this.data; - friction = data.friction; - gravity = data.gravity; - wind = data.wind; - length = data.length; - stiffness = data.stiffness; - damping = data.damping; mix = data.mix; } @@ -127,129 +78,7 @@ public class PhysicsConstraint implements Updatable { public void update () { if (mix == 0) return; - Object[] nodes = this.nodes.items; - int nodeCount = this.nodes.size; - Vector2 temp = PhysicsConstraint.temp; - for (int i = 0; i < nodeCount; i++) { - Node node = (Node)nodes[i]; - if (node.parentBone == null) continue; - node.parentBone.localToWorld(temp.set(node.data.x, node.data.y)); - node.x = temp.x; - node.y = temp.y; - } - - Object[] springs = this.springs.items; - int springCount = this.springs.size; - - remaining += Math.max(skeleton.time - lastTime, 0); - lastTime = skeleton.time; - while (remaining >= 0.016f) { - remaining -= 0.016f; - for (int i = 0; i < springCount; i++) - ((Spring)springs[i]).step(); - for (int i = 0; i < nodeCount; i++) - ((Node)nodes[i]).step(this); - } - - if (mix == 1) { - for (int i = 0; i < nodeCount; i++) { - Node node = (Node)nodes[i]; - - // BOZO - if (node.parentBone != null) { - node.parentBone.rotateWorld(node.offset); - node.parentBone.updateAppliedTransform(); - } - - Object[] bones = node.bones; - for (int ii = 0, nn = bones.length; ii < nn; ii++) { - Bone bone = (Bone)bones[ii]; - bone.worldX = node.x; - bone.worldY = node.y; - bone.parent.worldToLocal(temp.set(node.x, node.y)); - bone.ax = temp.x; - bone.ay = temp.y; - } - } - } else { - for (int i = 0; i < nodeCount; i++) { - Node node = (Node)nodes[i]; - Object[] bones = node.bones; - for (int ii = 0, nn = bones.length; ii < nn; ii++) { - Bone bone = (Bone)bones[ii]; - bone.worldX = bone.worldX + (node.x - bone.worldX) * mix; - bone.worldY = bone.worldY + (node.y - bone.worldY) * mix; - bone.worldToLocal(temp.set(bone.worldX, bone.worldY)); - bone.ax = temp.x; - bone.ay = temp.y; - } - } - } - } - - public Array getNodes () { - return nodes; - } - - public Array getSprings () { - return springs; - } - - public float getFriction () { - return friction; - } - - public void setFriction (float friction) { - this.friction = friction; - } - - public float getGravity () { - return gravity; - } - - public void setGravity (float gravity) { - this.gravity = gravity; - } - - public float getWind () { - return wind; - } - - public void setWind (float wind) { - this.wind = wind; - } - - public float getLength () { - return length; - } - - public void setLength (float length) { - this.length = length; - } - - public float getStiffness () { - return stiffness; - } - - public void setStiffness (float stiffness) { - this.stiffness = stiffness; - } - - public float getDamping () { - return damping; - } - - public void setDamping (float damping) { - this.damping = damping; - } - - /** A percentage (0-1) that controls the mix between the constrained and unconstrained poses. */ - public float getMix () { - return mix; - } - - public void setMix (float mix) { - this.mix = mix; + // BOZO } public boolean isActive () { @@ -264,172 +93,4 @@ public class PhysicsConstraint implements Updatable { public String toString () { return data.name; } - - static public class Node { - public final NodeData data; - public @Null Bone parentBone; - public Bone[] bones; - - /** Position relative to the parent bone, or world position if there is no parent bone. */ - public float x, y; - - public float massInverse, vx, vy; - - public boolean reset; - public float offset, velocity, wx, wy; - - Node (NodeData data) { // Editor. - this.data = data; - } - - public Node (NodeData data, Skeleton skeleton) { - this.data = data; - - parentBone = data.parentBone == -1 ? null : skeleton.bones.get(data.parentBone); - - bones = new Bone[data.bones.length]; - for (int i = 0, n = bones.length; i < n; i++) - bones[i] = skeleton.bones.get(data.bones[i]); - - setToSetupPose(); - } - - public Node (Node node) { - this.data = node.data; - parentBone = node.parentBone; - bones = new Bone[node.bones.length]; - arraycopy(node.bones, 0, bones, 0, bones.length); - x = node.x; - y = node.y; - vx = node.vx; - vy = node.vy; - } - - public void setToSetupPose () { - x = data.x; - y = data.y; - vx = 0; - vy = 0; - - offset = 0; - velocity = 0; - reset = true; - } - - public void step (PhysicsConstraint constraint) { - // BOZO - if (parentBone != null) { - float strength = 0.1f; - float damping = 0.9f; - float wind = 0; - float gravity = 0;// -0.0048f; - float mass = 4; - - float length = parentBone.data.length, x = length * parentBone.a, y = length * parentBone.c; - length = (float)Math.sqrt(x * x + y * y); - - float r = atan2(parentBone.c, parentBone.a) - offset * degRad; - float cos = (float)Math.cos(r), sin = (float)Math.sin(r); - { - float tx = parentBone.worldX + length * cos, ty = parentBone.worldY + length * sin; - if (reset) - reset = false; - else { - if (wx - tx != 0 || wy - ty != 0) { - float diff = new Vector2(length, 0).rotateRad(r).add(wx - parentBone.worldX, wy - parentBone.worldY) - .angleRad() - r; - offset += diff * radDeg; - } - } - wx = tx; - wy = ty; - } - - velocity += ((((offset % 360) + 540) % 360) - 180) * strength / mass; - r += offset * degRad; - velocity += (length * sin * wind - length * cos * gravity) * mass; - offset -= velocity; - velocity *= damping; - } - - if (parentBone != null) return; - x += vx; - y += vy; - vx = vx * constraint.friction + constraint.wind; - vy = vy * constraint.friction - constraint.gravity; - } - } - - static public class Spring implements Updatable { - public final SpringData data; - public final PhysicsConstraint constraint; - public Node node1, node2; - public Bone bone; - public float length, stiffness, damping; - - Spring (SpringData data, PhysicsConstraint constraint) { // Editor. - this.data = data; - this.constraint = constraint; - } - - public Spring (SpringData data, PhysicsConstraint constraint, Skeleton skeleton) { - this.data = data; - this.constraint = constraint; - - node1 = constraint.nodes.get(data.node1); - node2 = constraint.nodes.get(data.node2); - - bone = skeleton.bones.get(data.bone); - - setToSetupPose(); - } - - public Spring (Spring spring, PhysicsConstraint constraint) { - this.data = spring.data; - this.constraint = constraint; - node1 = constraint.nodes.get(data.node1); - node2 = constraint.nodes.get(data.node2); - bone = spring.bone; - length = spring.length; - stiffness = spring.stiffness; - damping = spring.damping; - } - - public void setToSetupPose () { - length = data.length; - stiffness = data.stiffness; - damping = data.damping; - } - - public void step () { - float x = node2.x - node1.x, y = node2.y - node1.y, d = (float)Math.sqrt(Math.max(x * x + y * y, 0.00001f)); - if (data.rope && d <= length) return; - x /= d; - y /= d; - float m1 = node1.massInverse, m2 = node2.massInverse; - float i = (damping * (x * (node2.vx - node1.vx) + y * (node2.vy - node1.vy)) + stiffness * (d - length)) / (m1 + m2); - x *= i; - y *= i; - node1.vx += x * m1; - node1.vy += y * m1; - node2.vx -= x * m2; - node2.vy -= y * m2; - } - - public void update () { - float dx = node2.x - node1.x, dy = node2.y - node1.y; - float s = (float)Math.sqrt(dx * dx + dy * dy) / length, r = atan2(dy, dx), sin = sin(r), cos = cos(r); - if (constraint.mix == 1) { - bone.updateWorldTransform(bone.ax, bone.ay, - atan2Deg(bone.a * sin - bone.c * cos, bone.d * cos - bone.b * sin) + bone.arotation - bone.ashearX, - bone.ascaleX * s, bone.ascaleY, bone.ashearX, bone.ashearY); - } else { - // BOZO - } - } - - public boolean isActive () { - return constraint.active; - } - } } 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 cd7b5ff76..bfaae993f 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java @@ -35,20 +35,42 @@ import com.badlogic.gdx.utils.Array; *

* See Physics constraints in the Spine User Guide. */ public class PhysicsConstraintData extends ConstraintData { - final Array nodes = new Array(); - final Array springs = new Array(); - float friction, gravity, wind, length, stiffness, damping, mix; + final Array bones = new Array(); + float speed = 1, mass = 1; + float strength, friction, damping, inertia, wind, gravity, mix; + boolean translate, rotate, scale, shear; public PhysicsConstraintData (String name) { super(name); } - public Array getNodes () { - return nodes; + /** The bones that are constrained by this physics constraint. */ + public Array getBones () { + return bones; } - public Array getSprings () { - return springs; + public float getSpeed () { + return speed; + } + + public void setSpeed (float speed) { + this.speed = speed; + } + + public float getMass () { + return mass; + } + + public void setMass (float mass) { + this.mass = mass; + } + + public float getStrength () { + return strength; + } + + public void setStrength (float strength) { + this.strength = strength; } public float getFriction () { @@ -59,12 +81,20 @@ public class PhysicsConstraintData extends ConstraintData { this.friction = friction; } - public float getGravity () { - return gravity; + public float getDamping () { + return damping; } - public void setGravity (float gravity) { - this.gravity = gravity; + public void setDamping (float damping) { + this.damping = damping; + } + + public float getInertia () { + return inertia; + } + + public void setInertia (float inertia) { + this.inertia = inertia; } public float getWind () { @@ -75,28 +105,44 @@ public class PhysicsConstraintData extends ConstraintData { this.wind = wind; } - public float getLength () { - return length; + public float getGravity () { + return gravity; } - public void setLength (float length) { - this.length = length; + public void setGravity (float gravity) { + this.gravity = gravity; } - public float getStiffness () { - return stiffness; + public boolean getTranslate () { + return translate; } - public void setStiffness (float stiffness) { - this.stiffness = stiffness; + public void setTranslate (boolean translate) { + this.translate = translate; } - public float getDamping () { - return damping; + public boolean getRotate () { + return rotate; } - public void setDamping (float damping) { - this.damping = damping; + public void setRotate (boolean rotate) { + this.rotate = rotate; + } + + public boolean getScale () { + return scale; + } + + public void setScale (boolean scale) { + this.scale = scale; + } + + public boolean getShear () { + return shear; + } + + public void setShear (boolean shear) { + this.shear = shear; } /** A percentage (0-1) that controls the mix between the constrained and unconstrained poses. */ @@ -107,16 +153,4 @@ public class PhysicsConstraintData extends ConstraintData { public void setMix (float mix) { this.mix = mix; } - - static public class NodeData { - public int parentBone = -1; - public int[] bones; - public float x, y; - } - - static public class SpringData { - public int node1, node2, bone; - public float length, stiffness, damping; - public boolean rope; - } } diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java index cdbacc982..ceab5374c 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java @@ -37,8 +37,6 @@ import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.FloatArray; import com.badlogic.gdx.utils.Null; -import com.esotericsoftware.spine.PhysicsConstraint.Node; -import com.esotericsoftware.spine.PhysicsConstraint.Spring; import com.esotericsoftware.spine.Skin.SkinEntry; import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.MeshAttachment; @@ -143,15 +141,15 @@ public class Skeleton { ikConstraints = new Array(skeleton.ikConstraints.size); for (IkConstraint ikConstraint : skeleton.ikConstraints) - ikConstraints.add(new IkConstraint(ikConstraint, this)); + ikConstraints.add(new IkConstraint(ikConstraint)); transformConstraints = new Array(skeleton.transformConstraints.size); for (TransformConstraint transformConstraint : skeleton.transformConstraints) - transformConstraints.add(new TransformConstraint(transformConstraint, this)); + transformConstraints.add(new TransformConstraint(transformConstraint)); pathConstraints = new Array(skeleton.pathConstraints.size); for (PathConstraint pathConstraint : skeleton.pathConstraints) - pathConstraints.add(new PathConstraint(pathConstraint, this)); + pathConstraints.add(new PathConstraint(pathConstraint)); physicsConstraints = new Array(skeleton.physicsConstraints.size); for (PhysicsConstraint physicsConstraint : skeleton.physicsConstraints) @@ -343,44 +341,25 @@ public class Skeleton { constraint.active = !constraint.data.skinRequired || (skin != null && skin.constraints.contains(constraint.data, true)); if (!constraint.active) return; - Object[] nodes = constraint.nodes.items; - int nodeCount = constraint.nodes.size; - for (int i = 0; i < nodeCount; i++) { - Node node = (Node)nodes[i]; - sortBone(node.parentBone); -// for (Bone bone : node.bones) -// sortBone(bone); + Object[] constrained = constraint.bones.items; + int boneCount = constraint.bones.size; + for (int i = 0; i < boneCount; i++) { + if (((Bone)constrained[i]).active) { + constraint.active = true; + break; + } } + if (!constraint.active) return; + + for (int i = 0; i < boneCount; i++) + sortBone((Bone)constrained[i]); updateCache.add(constraint); - for (int i = 0; i < nodeCount; i++) { - Node node = (Node)nodes[i]; - sortReset(node.parentBone.children); - } - -// for (int i = 0; i < nodeCount; i++) { -// Node node = (Node)nodes[i]; -// for (Bone bone : node.bones) -// sortReset(bone.children); -// } -// for (int i = 0; i < nodeCount; i++) { -// Node node = (Node)nodes[i]; -// for (Bone bone : node.bones) -// bone.sorted = true; -// } -// -// Object[] springs = constraint.springs.items; -// for (int i = 0, n = constraint.springs.size; i < n; i++) { -// Spring spring = (Spring)springs[i]; -// if (spring.bone == null) continue; -// sortBone(spring.bone); -// updateCache.add(spring); -// sortReset(spring.bone.children); -// spring.bone.sorted = true; -// for (Bone child : spring.bone.children) -// sortBone(child); -// } + for (int i = 0; i < boneCount; i++) + sortReset(((Bone)constrained[i]).children); + for (int i = 0; i < boneCount; i++) + ((Bone)constrained[i]).sorted = true; } private void sortBone (Bone bone) { diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java index 84d37b001..350927a9b 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java @@ -38,8 +38,6 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.FloatArray; -import com.esotericsoftware.spine.PhysicsConstraint.Node; -import com.esotericsoftware.spine.PhysicsConstraint.Spring; import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.BoundingBoxAttachment; import com.esotericsoftware.spine.attachments.ClippingAttachment; @@ -57,7 +55,7 @@ public class SkeletonRendererDebug { private final ShapeRenderer shapes; private boolean drawBones = true, drawRegionAttachments = true, drawBoundingBoxes = true, drawPoints = true; - private boolean drawMeshHull = true, drawMeshTriangles = true, drawPaths = true, drawClipping = true, drawPhysics = true; + private boolean drawMeshHull = true, drawMeshTriangles = true, drawPaths = true, drawClipping = true; private final SkeletonBounds bounds = new SkeletonBounds(); private final FloatArray vertices = new FloatArray(32); private float scale = 1; @@ -238,22 +236,6 @@ public class SkeletonRendererDebug { } } - if (drawPhysics) { - Array physicsConstraints = skeleton.physicsConstraints; - for (int i = 0, n = physicsConstraints.size; i < n; i++) { - PhysicsConstraint constraint = physicsConstraints.get(i); - if (constraint.mix <= 0) continue; - for (Spring spring : constraint.springs) { - shapes.setColor(Color.GOLDENROD); - shapes.line(spring.node1.x, spring.node1.y, spring.node2.x, spring.node2.y); - } - for (Node node : constraint.nodes) { - shapes.setColor(Color.GREEN); - shapes.circle(node.x, node.y, 8); - } - } - } - shapes.end(); shapes.begin(ShapeType.Filled); @@ -322,10 +304,6 @@ public class SkeletonRendererDebug { drawClipping = clipping; } - public void setPhysics (boolean physics) { - drawPhysics = physics; - } - public void setPremultipliedAlpha (boolean premultipliedAlpha) { this.premultipliedAlpha = premultipliedAlpha; } diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java index 042cc1a28..788f19950 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/TransformConstraint.java @@ -57,21 +57,20 @@ public class TransformConstraint implements Updatable { mixScaleX = data.mixScaleX; mixScaleY = data.mixScaleY; mixShearY = data.mixShearY; + bones = new Array(data.bones.size); for (BoneData boneData : data.bones) bones.add(skeleton.bones.get(boneData.index)); + target = skeleton.bones.get(data.target.index); } /** Copy constructor. */ - public TransformConstraint (TransformConstraint constraint, Skeleton skeleton) { + public TransformConstraint (TransformConstraint constraint) { if (constraint == null) throw new IllegalArgumentException("constraint cannot be null."); - if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); data = constraint.data; - bones = new Array(constraint.bones.size); - for (Bone bone : constraint.bones) - bones.add(skeleton.bones.get(bone.data.index)); - target = skeleton.bones.get(constraint.target.data.index); + bones = new Array(constraint.bones); + target = constraint.target; mixRotate = constraint.mixRotate; mixX = constraint.mixX; mixY = constraint.mixY; diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/TwoColorPolygonBatch.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/TwoColorPolygonBatch.java index bbb2c6c73..2f4d5d6e6 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/TwoColorPolygonBatch.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/utils/TwoColorPolygonBatch.java @@ -48,7 +48,6 @@ import com.badlogic.gdx.math.Affine2; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.utils.Null; -import com.badlogic.gdx.utils.NumberUtils; /** A batch that renders polygons and performs tinting using a light and dark color. *