[as3] Ported latest AnimationState and Animation changes. See #1303.

This commit is contained in:
badlogic 2019-03-19 16:42:05 +01:00
parent eecc0467b6
commit 9229d93c8f
7 changed files with 77 additions and 42 deletions

View File

@ -38,7 +38,7 @@ package spine {
public var darkColor : Color; public var darkColor : Color;
internal var _attachment : Attachment; internal var _attachment : Attachment;
private var _attachmentTime : Number; private var _attachmentTime : Number;
public var attachmentVertices : Vector.<Number> = new Vector.<Number>(); public var deform : Vector.<Number> = new Vector.<Number>();
public function Slot(data : SlotData, bone : Bone) { public function Slot(data : SlotData, bone : Bone) {
if (data == null) throw new ArgumentError("data cannot be null."); if (data == null) throw new ArgumentError("data cannot be null.");
@ -73,7 +73,7 @@ package spine {
if (_attachment == attachment) return; if (_attachment == attachment) return;
_attachment = attachment; _attachment = attachment;
_attachmentTime = _bone._skeleton.time; _attachmentTime = _bone._skeleton.time;
attachmentVertices.length = 0; deform.length = 0;
} }
public function set attachmentTime(time : Number) : void { public function set attachmentTime(time : Number) : void {

View File

@ -40,6 +40,7 @@ package spine.animation {
public static var FIRST : int = 1; public static var FIRST : int = 1;
public static var HOLD : int = 2; public static var HOLD : int = 2;
public static var HOLD_MIX : int = 3; public static var HOLD_MIX : int = 3;
public static var NOT_LAST : int = 4;
internal static var emptyAnimation : Animation = new Animation("<empty>", new Vector.<Timeline>(), 0); internal static var emptyAnimation : Animation = new Animation("<empty>", new Vector.<Timeline>(), 0);
public var data : AnimationStateData; public var data : AnimationStateData;
public var tracks : Vector.<TrackEntry> = new Vector.<TrackEntry>(); public var tracks : Vector.<TrackEntry> = new Vector.<TrackEntry>();
@ -188,7 +189,7 @@ package spine.animation {
for (ii = 0; ii < timelineCount; ii++) { for (ii = 0; ii < timelineCount; ii++) {
var timeline : Timeline = timelines[ii]; var timeline : Timeline = timelines[ii];
var timelineBlend : MixBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup; var timelineBlend : MixBlend = (timelineMode[ii] & (NOT_LAST - 1)) == SUBSEQUENT ? blend : MixBlend.setup;
if (timeline is RotateTimeline) { if (timeline is RotateTimeline) {
applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame); applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
} else } else
@ -244,7 +245,7 @@ package spine.animation {
var direction : MixDirection = MixDirection.Out; var direction : MixDirection = MixDirection.Out;
var timelineBlend: MixBlend; var timelineBlend: MixBlend;
var alpha : Number = 0; var alpha : Number = 0;
switch (timelineMode[i]) { switch (timelineMode[i] & (NOT_LAST - 1)) {
case SUBSEQUENT: case SUBSEQUENT:
if (!attachments && timeline is AttachmentTimeline) continue; if (!attachments && timeline is AttachmentTimeline) continue;
if (!drawOrder && timeline is DrawOrderTimeline) continue; if (!drawOrder && timeline is DrawOrderTimeline) continue;
@ -271,7 +272,7 @@ package spine.animation {
else { else {
if (timelineBlend == MixBlend.setup) { if (timelineBlend == MixBlend.setup) {
if (timeline is AttachmentTimeline) { if (timeline is AttachmentTimeline) {
if (attachments) direction = MixDirection.In; if (attachments || ((timelineMode[i] & NOT_LAST) == NOT_LAST)) direction = MixDirection.In;
} else if (timeline is DrawOrderTimeline) { } else if (timeline is DrawOrderTimeline) {
if (drawOrder) direction = MixDirection.In; if (drawOrder) direction = MixDirection.In;
} }
@ -586,20 +587,51 @@ package spine.animation {
animationsChanged = false; animationsChanged = false;
propertyIDs = new Dictionary(); propertyIDs = new Dictionary();
var i : int = 0;
for (var i : int = 0, n : int = tracks.length; i < n; i++) { var n: int = 0;
var entry : TrackEntry = tracks[i]; var entry : TrackEntry = null;
for (i = 0, n = tracks.length; i < n; i++) {
entry = tracks[i];
if (entry == null) continue; if (entry == null) continue;
while (entry.mixingFrom != null) while (entry.mixingFrom != null)
entry = entry.mixingFrom; entry = entry.mixingFrom;
do { do {
if (entry.mixingTo == null || entry.mixBlend != MixBlend.add) setTimelineModes(entry); if (entry.mixingTo == null || entry.mixBlend != MixBlend.add) computeHold(entry);
entry = entry.mixingTo; entry = entry.mixingTo;
} while (entry != null); } while (entry != null);
} }
propertyIDs = new Dictionary();
for (i = tracks.length - 1; i >= 0; i--) {
entry = tracks[i];
while (entry != null) {
computeNotLast(entry);
entry = entry.mixingFrom;
}
}
} }
private function setTimelineModes (entry: TrackEntry) { private function computeNotLast (entry: TrackEntry) : void {
var timelines : Vector.<Timeline> = entry.animation.timelines;
var timelinesCount : int = entry.animation.timelines.length;
var timelineMode : Vector.<int> = entry.timelineMode;
var propertyIDs : Dictionary = this.propertyIDs;
for (var i : int = 0; i < timelinesCount; i++) {
if (timelines[i] is AttachmentTimeline) {
var timeline : AttachmentTimeline = AttachmentTimeline(timelines[i]);
var intId : int = timeline.slotIndex;
var id : String = intId.toString();
var contained : Object = propertyIDs[id];
propertyIDs[id] = true;
if (contained != null) {
timelineMode[i] |= NOT_LAST;
}
}
}
}
private function computeHold (entry: TrackEntry) : void {
var to: TrackEntry = entry.mixingTo; var to: TrackEntry = entry.mixingTo;
var timelines : Vector.<Timeline> = entry.animation.timelines; var timelines : Vector.<Timeline> = entry.animation.timelines;
var timelinesCount : int = entry.animation.timelines.length; var timelinesCount : int = entry.animation.timelines.length;
@ -609,8 +641,9 @@ package spine.animation {
timelineHoldMix.length = 0; timelineHoldMix.length = 0;
var propertyIDs: Dictionary = this.propertyIDs; var propertyIDs: Dictionary = this.propertyIDs;
var i : int = 0;
if (to != null && to.holdPrevious) { if (to != null && to.holdPrevious) {
for (var i : int = 0; i < timelinesCount; i++) { for (i = 0; i < timelinesCount; i++) {
propertyIDs[timelines[i].getPropertyId().toString()] = true; propertyIDs[timelines[i].getPropertyId().toString()] = true;
timelineMode[i] = HOLD; timelineMode[i] = HOLD;
} }
@ -618,14 +651,16 @@ package spine.animation {
} }
outer: outer:
for (var i : int = 0; i < timelinesCount; i++) { for (i = 0; i < timelinesCount; i++) {
var intId : int = timelines[i].getPropertyId(); var timeline : Timeline = Timeline(timelines[i]);
var intId : int = timeline.getPropertyId();
var id : String = intId.toString(); var id : String = intId.toString();
var contained: Object = propertyIDs[id]; var contained: Object = propertyIDs[id];
propertyIDs[id] = true; propertyIDs[id] = true;
if (contained != null) { if (contained != null) {
timelineMode[i] = AnimationState.SUBSEQUENT; timelineMode[i] = AnimationState.SUBSEQUENT;
} else if (to == null || !hasTimeline(to, intId)) { } else if (to == null || timeline is AttachmentTimeline || timeline is DrawOrderTimeline
|| timeline is EventTimeline || !hasTimeline(to, intId)) {
timelineMode[i] = AnimationState.FIRST; timelineMode[i] = AnimationState.FIRST;
} else { } else {
for (var next : TrackEntry = to.mixingTo; next != null; next = next.mixingTo) { for (var next : TrackEntry = to.mixingTo; next != null; next = next.mixingTo) {

View File

@ -64,12 +64,12 @@ package spine.animation {
var slotAttachment : Attachment = slot.attachment; var slotAttachment : Attachment = slot.attachment;
if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment)).applyDeform(attachment)) return; if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment)).applyDeform(attachment)) return;
var verticesArray : Vector.<Number> = slot.attachmentVertices; var deformArray : Vector.<Number> = slot.deform;
if (verticesArray.length == 0) blend = MixBlend.setup; if (deformArray.length == 0) blend = MixBlend.setup;
var frameVertices : Vector.<Vector.<Number>> = this.frameVertices; var frameVertices : Vector.<Vector.<Number>> = this.frameVertices;
var vertexCount : int = frameVertices[0].length; var vertexCount : int = frameVertices[0].length;
var vertices : Vector.<Number>; var deform : Vector.<Number>;
var frames : Vector.<Number> = this.frames; var frames : Vector.<Number> = this.frames;
var i : int; var i : int;
@ -77,32 +77,32 @@ package spine.animation {
vertexAttachment = VertexAttachment(slotAttachment); vertexAttachment = VertexAttachment(slotAttachment);
switch (blend) { switch (blend) {
case MixBlend.setup: case MixBlend.setup:
verticesArray.length = 0; deformArray.length = 0;
return; return;
case MixBlend.first: case MixBlend.first:
if (alpha == 1) { if (alpha == 1) {
verticesArray.length = 0; deformArray.length = 0;
return; return;
} }
verticesArray.length = vertexCount; deformArray.length = vertexCount;
vertices = verticesArray; deform = deformArray;
if (vertexAttachment.bones == null) { if (vertexAttachment.bones == null) {
// Unweighted vertex positions. // Unweighted vertex positions.
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] += (setupVertices[i] - vertices[i]) * alpha; deform[i] += (setupVertices[i] - deform[i]) * alpha;
} else { } else {
// Weighted deform offsets. // Weighted deform offsets.
alpha = 1 - alpha; alpha = 1 - alpha;
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] *= alpha; deform[i] *= alpha;
} }
} }
return; return;
} }
verticesArray.length = vertexCount; deformArray.length = vertexCount;
vertices = verticesArray; deform = deformArray;
var n : int; var n : int;
var setup : Number, prev : Number; var setup : Number, prev : Number;
if (time >= frames[frames.length - 1]) { // Time is after last frame. if (time >= frames[frames.length - 1]) { // Time is after last frame.
@ -113,15 +113,15 @@ package spine.animation {
if (vertexAttachment.bones == null) { if (vertexAttachment.bones == null) {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
vertices[i] += lastVertices[i] - setupVertices[i]; deform[i] += lastVertices[i] - setupVertices[i];
} }
} else { } else {
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] += lastVertices[i]; deform[i] += lastVertices[i];
} }
} else { } else {
for (i = 0, n = vertexCount; i < n; i++) for (i = 0, n = vertexCount; i < n; i++)
vertices[i] = lastVertices[i]; deform[i] = lastVertices[i];
} }
} else { } else {
switch (blend) { switch (blend) {
@ -132,28 +132,28 @@ package spine.animation {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
setup = setupVertices[i]; setup = setupVertices[i];
vertices[i] = setup + (lastVertices[i] - setup) * alpha; deform[i] = setup + (lastVertices[i] - setup) * alpha;
} }
} else { } else {
// Weighted deform offsets, with alpha. // Weighted deform offsets, with alpha.
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] = lastVertices[i] * alpha; deform[i] = lastVertices[i] * alpha;
} }
break; break;
case MixBlend.first: case MixBlend.first:
case MixBlend.replace: case MixBlend.replace:
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] += (lastVertices[i] - vertices[i]) * alpha; deform[i] += (lastVertices[i] - deform[i]) * alpha;
case MixBlend.add: case MixBlend.add:
vertexAttachment = VertexAttachment(slotAttachment); vertexAttachment = VertexAttachment(slotAttachment);
if (vertexAttachment.bones == null) { if (vertexAttachment.bones == null) {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
vertices[i] += (lastVertices[i] - setupVertices[i]) * alpha; deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
} }
} else { } else {
for (i = 0; i < vertexCount; i++) for (i = 0; i < vertexCount; i++)
vertices[i] += lastVertices[i] * alpha; deform[i] += lastVertices[i] * alpha;
} }
} }
} }
@ -174,18 +174,18 @@ package spine.animation {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i]; deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
} }
} else { } else {
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] += prev + (nextVertices[i] - prev) * percent; deform[i] += prev + (nextVertices[i] - prev) * percent;
} }
} }
} else { } else {
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] = prev + (nextVertices[i] - prev) * percent; deform[i] = prev + (nextVertices[i] - prev) * percent;
} }
} }
} else { } else {
@ -197,13 +197,13 @@ package spine.animation {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i], setup = setupVertices[i]; prev = prevVertices[i], setup = setupVertices[i];
vertices[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha; deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
} }
} else { } else {
// Weighted deform offsets, with alpha. // Weighted deform offsets, with alpha.
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] = (prev + (nextVertices[i] - prev) * percent) * alpha; deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
} }
} }
break; break;
@ -211,7 +211,7 @@ package spine.animation {
case MixBlend.replace: case MixBlend.replace:
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] += (prev + (nextVertices[i] - prev) * percent - vertices[i]) * alpha; deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
} }
break; break;
case MixBlend.add: case MixBlend.add:
@ -220,12 +220,12 @@ package spine.animation {
setupVertices = vertexAttachment.vertices; setupVertices = vertexAttachment.vertices;
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i], setup = setupVertices[i]; prev = prevVertices[i], setup = setupVertices[i];
vertices[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha; deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
} }
} else { } else {
for (i = 0; i < vertexCount; i++) { for (i = 0; i < vertexCount; i++) {
prev = prevVertices[i]; prev = prevVertices[i];
vertices[i] += (prev + (nextVertices[i] - prev) * percent) * alpha; deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
} }
} }
} }

View File

@ -53,7 +53,7 @@ package spine.attachments {
public function computeWorldVertices(slot : Slot, start : int, count : int, worldVertices : Vector.<Number>, offset : int, stride : int) : void { public function computeWorldVertices(slot : Slot, start : int, count : int, worldVertices : Vector.<Number>, offset : int, stride : int) : void {
count = offset + (count >> 1) * stride; count = offset + (count >> 1) * stride;
var skeleton : Skeleton = slot.skeleton; var skeleton : Skeleton = slot.skeleton;
var deformArray : Vector.<Number> = slot.attachmentVertices; var deformArray : Vector.<Number> = slot.deform;
var vertices : Vector.<Number> = this.vertices; var vertices : Vector.<Number> = this.vertices;
var bones : Vector.<int> = this.bones; var bones : Vector.<int> = this.bones;
var deform : Vector.<Number>; var deform : Vector.<Number>;