[as3] Fixed first frame setup pose in all timelines2

This commit is contained in:
badlogic 2016-11-03 11:26:26 +01:00
parent ca074364c5
commit f85bfe5080
19 changed files with 113 additions and 41 deletions

View File

@ -307,7 +307,7 @@ public class Bone implements Updatable {
* the applied transform after the world transform has been modified directly (eg, by a constraint). * the applied transform after the world transform has been modified directly (eg, by a constraint).
* <p> * <p>
* Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. */ * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. */
function updateAppliedTransform () : void { internal function updateAppliedTransform () : void {
appliedValid = true; appliedValid = true;
var parent:Bone = this.parent; var parent:Bone = this.parent;
if (parent == null) { if (parent == null) {

View File

@ -59,14 +59,20 @@ public class AttachmentTimeline implements Timeline {
public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var attachmentName:String; var attachmentName:String;
var slot:Slot = skeleton.slots[slotIndex];
if (mixingOut && setupPose) { if (mixingOut && setupPose) {
var slot:Slot = skeleton.slots[slotIndex];
attachmentName = slot.data.attachmentName; attachmentName = slot.data.attachmentName;
slot.attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName); slot.attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName);
return; return;
} }
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame. if (time < frames[0]) {
if (setupPose) {
attachmentName = slot.data.attachmentName;
slot.attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName);
}
return;
}
var frameIndex:int; var frameIndex:int;
if (time >= frames[frames.length - 1]) // Time is after last frame. if (time >= frames[frames.length - 1]) // Time is after last frame.

View File

@ -62,7 +62,17 @@ public class ColorTimeline extends CurveTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame. var slot:Slot = skeleton.slots[slotIndex];
if (time < frames[0]) {
if (setupPose) {
slot.r = slot.data.r;
slot.g = slot.data.g;
slot.b = slot.data.b;
slot.a = slot.data.a;
}
return;
}
var r:Number, g:Number, b:Number, a:Number; var r:Number, g:Number, b:Number, a:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.
@ -87,7 +97,6 @@ public class ColorTimeline extends CurveTimeline {
b += (frames[frame + B] - b) * percent; b += (frames[frame + B] - b) * percent;
a += (frames[frame + A] - a) * percent; a += (frames[frame + A] - a) * percent;
} }
var slot:Slot = skeleton.slots[slotIndex];
if (alpha == 1) { if (alpha == 1) {
slot.r = r; slot.r = r;
slot.g = g; slot.g = g;

View File

@ -63,12 +63,15 @@ public class DeformTimeline extends CurveTimeline {
if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment)).applyDeform(attachment)) return; if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment)).applyDeform(attachment)) return;
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame. var verticesArray:Vector.<Number> = slot.attachmentVertices;
if (time < frames[0]) {
if (setupPose) verticesArray.length = 0;
return;
}
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 verticesArray:Vector.<Number> = slot.attachmentVertices;
if (verticesArray.length != vertexCount) alpha = 1; // Don't mix from uninitialized slot vertices. if (verticesArray.length != vertexCount) alpha = 1; // Don't mix from uninitialized slot vertices.
verticesArray.length = vertexCount; verticesArray.length = vertexCount;
var vertices:Vector.<Number> = verticesArray; var vertices:Vector.<Number> = verticesArray;

View File

@ -63,8 +63,16 @@ public class DrawOrderTimeline implements Timeline {
return; return;
} }
if (time < frames[0]) var drawOrder:Vector.<Slot> = skeleton.drawOrder;
return; // Time is before first frame. var slots:Vector.<Slot> = skeleton.slots;
var slot:Slot;
var i:int = 0;
if (time < frames[0]) {
if (setupPose) {
for each (slot in slots)
drawOrder[i++] = slot;
}
}
var frameIndex:int; var frameIndex:int;
if (time >= frames[int(frames.length - 1)]) // Time is after last frame. if (time >= frames[int(frames.length - 1)]) // Time is after last frame.
@ -72,12 +80,10 @@ public class DrawOrderTimeline implements Timeline {
else else
frameIndex = Animation.binarySearch1(frames, time) - 1; frameIndex = Animation.binarySearch1(frames, time) - 1;
var drawOrder:Vector.<Slot> = skeleton.drawOrder;
var slots:Vector.<Slot> = skeleton.slots;
var drawOrderToSetupIndex:Vector.<int> = drawOrders[frameIndex]; var drawOrderToSetupIndex:Vector.<int> = drawOrders[frameIndex];
var i:int = 0; i = 0;
if (!drawOrderToSetupIndex) { if (!drawOrderToSetupIndex) {
for each (var slot:Slot in slots) for each (slot in slots)
drawOrder[i++] = slot; drawOrder[i++] = slot;
} else { } else {
for each (var setupIndex:int in drawOrderToSetupIndex) for each (var setupIndex:int in drawOrderToSetupIndex)

View File

@ -59,9 +59,14 @@ public class IkConstraintTimeline extends CurveTimeline {
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
if (time < frames[0]) return; // Time is before first frame.
var constraint:IkConstraint = skeleton.ikConstraints[ikConstraintIndex]; var constraint:IkConstraint = skeleton.ikConstraints[ikConstraintIndex];
if (time < frames[0]) {
if (setupPose) {
constraint.mix = constraint.data.mix;
constraint.bendDirection = constraint.data.bendDirection;
}
return;
}
if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame. if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame.
if (setupPose) { if (setupPose) {

View File

@ -60,9 +60,14 @@ public class PathConstraintMixTimeline extends CurveTimeline {
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
if (time < frames[0]) return; // Time is before first frame.
var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (time < frames[0]) {
if (setupPose) {
constraint.rotateMix = constraint.data.rotateMix;
constraint.translateMix = constraint.data.translateMix;
}
return;
}
var rotate:Number, translate:Number; var rotate:Number, translate:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.

View File

@ -59,9 +59,11 @@ public class PathConstraintPositionTimeline extends CurveTimeline {
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
if (time < frames[0]) return; // Time is before first frame.
var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (time < frames[0]) {
if (setupPose) constraint.position = constraint.data.position;
return;
}
var position:Number; var position:Number;
if (time >= frames[frames.length - ENTRIES]) // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) // Time is after last frame.

View File

@ -43,9 +43,11 @@ public class PathConstraintSpacingTimeline extends PathConstraintPositionTimelin
} }
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
if (time < frames[0]) return; // Time is before first frame.
var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (time < frames[0]) {
if (setupPose) constraint.spacing = constraint.data.spacing;
return;
}
var spacing:Number; var spacing:Number;
if (time >= frames[frames.length - ENTRIES]) // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) // Time is after last frame.

View File

@ -59,10 +59,13 @@ public class RotateTimeline extends CurveTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame.
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
var r:Number; var r:Number;
if (time < frames[0]) {
if (setupPose) bone.rotation = bone.data.rotation;
return;
}
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.
if (setupPose) if (setupPose)

View File

@ -45,10 +45,16 @@ public class ScaleTimeline extends TranslateTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame.
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
if (time < frames[0]) {
if (setupPose) {
bone.scaleX = bone.data.scaleX;
bone.scaleY = bone.data.scaleY;
}
return;
}
var x:Number, y:Number; var x:Number, y:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.
x = frames[frames.length + PREV_X] * bone.data.scaleX; x = frames[frames.length + PREV_X] * bone.data.scaleX;

View File

@ -44,10 +44,16 @@ public class ShearTimeline extends TranslateTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame.
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
if (time < frames[0]) {
if (setupPose) {
bone.shearX = bone.data.shearX;
bone.shearY = bone.data.shearY;
}
return;
}
var x:Number, y:Number; var x:Number, y:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.
x = frames[frames.length + PREV_X]; x = frames[frames.length + PREV_X];

View File

@ -49,6 +49,9 @@ public class TrackEntry implements Poolable {
public var timelinesFirst:Vector.<Boolean> = new Vector.<Boolean>(); public var timelinesFirst:Vector.<Boolean> = new Vector.<Boolean>();
public var timelinesRotation:Vector.<Number> = new Vector.<Number>(); public var timelinesRotation:Vector.<Number> = new Vector.<Number>();
public function TrackEntry () {
}
public function getAnimationTime():Number { public function getAnimationTime():Number {
if (loop) { if (loop) {
var duration:Number = animationEnd - animationStart; var duration:Number = animationEnd - animationStart;

View File

@ -63,9 +63,19 @@ public class TransformConstraintTimeline extends CurveTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame.
var constraint:TransformConstraint = skeleton.transformConstraints[transformConstraintIndex]; var constraint:TransformConstraint = skeleton.transformConstraints[transformConstraintIndex];
var data:TransformConstraintData;
if (time < frames[0]) {
if (setupPose) {
data = constraint.data;
constraint.rotateMix = constraint.data.rotateMix;
constraint.translateMix = constraint.data.translateMix;
constraint.scaleMix = constraint.data.scaleMix;
constraint.shearMix = constraint.data.shearMix;
}
return;
}
var rotate:Number, translate:Number, scale:Number, shear:Number; var rotate:Number, translate:Number, scale:Number, shear:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.
@ -91,7 +101,7 @@ public class TransformConstraintTimeline extends CurveTimeline {
shear += (frames[frame + SHEAR] - shear) * percent; shear += (frames[frame + SHEAR] - shear) * percent;
} }
if (setupPose) { if (setupPose) {
var data:TransformConstraintData = constraint.data; data = constraint.data;
constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha; constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha;
constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha; constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha;
constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha; constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha;

View File

@ -60,9 +60,15 @@ public class TranslateTimeline extends CurveTimeline {
override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector.<Event>, alpha:Number, setupPose:Boolean, mixingOut:Boolean) : void {
var frames:Vector.<Number> = this.frames; var frames:Vector.<Number> = this.frames;
if (time < frames[0]) return; // Time is before first frame.
var bone:Bone = skeleton.bones[boneIndex]; var bone:Bone = skeleton.bones[boneIndex];
if (time < frames[0]) {
if (setupPose) {
bone.x = bone.data.x;
bone.y = bone.data.y;
}
return;
}
var x:Number, y:Number; var x:Number, y:Number;
if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame.

View File

@ -40,12 +40,12 @@ public class Main extends Sprite {
public function Main () { public function Main () {
var example:Class; var example:Class;
// example = SpineboyExample; example = SpineboyExample;
// example = GoblinsExample; // example = GoblinsExample;
// example = RaptorExample; // example = RaptorExample;
// example = TankExample; // example = TankExample;
// example = VineExample; // example = VineExample;
example = StretchymanExample; // example = StretchymanExample;
_starling = new Starling(example, stage); _starling = new Starling(example, stage);
_starling.enableErrorChecking = true; _starling.enableErrorChecking = true;