diff --git a/spine-as3/spine-as3-example/lib/spine-as3.swc b/spine-as3/spine-as3-example/lib/spine-as3.swc index 6a8ee66f1..732b813b7 100644 Binary files a/spine-as3/spine-as3-example/lib/spine-as3.swc and b/spine-as3/spine-as3-example/lib/spine-as3.swc differ diff --git a/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as b/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as index c903fa449..9ccab609b 100644 --- a/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as @@ -36,6 +36,7 @@ package spine.animation { import spine.Slot; public class DeformTimeline extends CurveTimeline { + private static var zeros : Vector. = new Vector.(64); public var slotIndex : int; public var frames : Vector.; public var frameVertices : Vector.>; @@ -58,35 +59,54 @@ package spine.animation { } override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector., alpha : Number, pose : MixPose, direction : MixDirection) : void { + var vertexAttachment : VertexAttachment; + var setupVertices : Vector.; var slot : Slot = skeleton.slots[slotIndex]; var slotAttachment : Attachment = slot.attachment; if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment)).applyDeform(attachment)) return; var verticesArray : Vector. = slot.attachmentVertices; var frameVertices : Vector.> = this.frameVertices; - var vertexCount : int = frameVertices[0].length; - if (verticesArray.length != vertexCount && pose != MixPose.setup) alpha = 1; // Don't mix from uninitialized slot vertices. + var vertexCount : int = frameVertices[0].length; verticesArray.length = vertexCount; var vertices : Vector. = verticesArray; var frames : Vector. = this.frames; var i : int; if (time < frames[0]) { + vertexAttachment = VertexAttachment(slotAttachment); switch (pose) { case MixPose.setup: - verticesArray.length = 0; + var zeroVertices : Vector.; + if (vertexAttachment.bones == null) { + // Unweighted vertex positions (setup pose). + zeroVertices = vertexAttachment.vertices; + } else { + // Weighted deform offsets (zeros). + zeroVertices = zeros; + if (zeroVertices.length < vertexCount) zeros = zeroVertices = new Vector.(vertexCount); + } + for (i = 0; i < vertexCount; i++) + vertices[i] = zeroVertices[i]; return; case MixPose.current: - alpha = 1 - alpha; - for (i = 0; i < vertexCount; i++) - vertices[i] *= alpha; + if (alpha == 1) break; + if (vertexAttachment.bones == null) { + // Unweighted vertex positions. + setupVertices = vertexAttachment.vertices; + for (i = 0; i < vertexCount; i++) + vertices[i] += (setupVertices[i] - vertices[i]) * alpha; + } else { + // Weighted deform offsets. + alpha = 1 - alpha; + for (i = 0; i < vertexCount; i++) + vertices[i] *= alpha; + } } return; } - var n : int; - var vertexAttachment : VertexAttachment; - var setupVertices : Vector.; + var n : int; var setup : Number, prev : Number; if (time >= frames[frames.length - 1]) { // Time is after last frame. var lastVertices : Vector. = frameVertices[frames.length - 1]; diff --git a/spine-starling/spine-starling-example/lib/spine-as3.swc b/spine-starling/spine-starling-example/lib/spine-as3.swc index 6a8ee66f1..732b813b7 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-as3.swc and b/spine-starling/spine-starling-example/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling/lib/spine-as3.swc b/spine-starling/spine-starling/lib/spine-as3.swc index 6a8ee66f1..732b813b7 100644 Binary files a/spine-starling/spine-starling/lib/spine-as3.swc and b/spine-starling/spine-starling/lib/spine-as3.swc differ