diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java index 1e60a842a..ab610daa4 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/Animation.java @@ -862,6 +862,8 @@ public class Animation { /** Changes a slot's {@link Slot#getAttachmentVertices()} to deform a {@link VertexAttachment}. */ static public class DeformTimeline extends CurveTimeline { + static private float[] zeros = new float[64]; + int slotIndex; VertexAttachment attachment; private final float[] frames; // time, ... @@ -923,20 +925,43 @@ public class Animation { FloatArray verticesArray = slot.getAttachmentVertices(); float[][] frameVertices = this.frameVertices; int vertexCount = frameVertices[0].length; - if (verticesArray.size != vertexCount && pose != setup) alpha = 1; // Don't mix from uninitialized slot vertices. float[] vertices = verticesArray.setSize(vertexCount); float[] frames = this.frames; if (time < frames[0]) { // Time is before first frame. + VertexAttachment vertexAttachment = (VertexAttachment)slotAttachment; + switch (pose) { case setup: - verticesArray.size = 0; - return; + break; case current: - alpha = 1 - alpha; - for (int i = 0; i < vertexCount; i++) - vertices[i] *= alpha; + if (alpha == 1) break; + if (vertexAttachment.getBones() == null) { + // Unweighted vertex positions. + float[] setupVertices = vertexAttachment.getVertices(); + for (int i = 0; i < vertexCount; i++) + vertices[i] += (setupVertices[i] - vertices[i]) * alpha; + } else { + // Weighted deform offsets. + alpha = 1 - alpha; + for (int i = 0; i < vertexCount; i++) + vertices[i] *= alpha; + } + // Fall thru. + default: + return; } + + float[] zeroVertices; + if (vertexAttachment.getBones() == null) { + // Unweighted vertex positions (setup pose). + zeroVertices = vertexAttachment.getVertices(); + } else { + // Weighted deform offsets (zeros). + zeroVertices = zeros; + if (zeroVertices.length < vertexCount) zeros = zeroVertices = new float[vertexCount]; + } + System.arraycopy(zeroVertices, 0, vertices, 0, vertexCount); return; }