[as3] Ported skin bones/constraints changes. See #1346.

This commit is contained in:
badlogic 2019-06-05 14:35:35 +02:00
parent 4ca84774a3
commit 900085d26f
43 changed files with 228 additions and 140 deletions

View File

@ -1,12 +1,21 @@
eclipse.preferences.version=1
encoding//src/spine/Bone.as=UTF-8
encoding//src/spine/BoneData.as=UTF-8
encoding//src/spine/IkConstraint.as=UTF-8
encoding//src/spine/IkConstraintData.as=UTF-8
encoding//src/spine/Interpolation.as=UTF-8
encoding//src/spine/MathUtils.as=UTF-8
encoding//src/spine/PathConstraint.as=UTF-8
encoding//src/spine/PathConstraintData.as=UTF-8
encoding//src/spine/Skeleton.as=UTF-8
encoding//src/spine/SkeletonClipping.as=UTF-8
encoding//src/spine/SkeletonData.as=UTF-8
encoding//src/spine/SkeletonJson.as=UTF-8
encoding//src/spine/Skin.as=UTF-8
encoding//src/spine/TransformConstraint.as=UTF-8
encoding//src/spine/TransformConstraintData.as=UTF-8
encoding//src/spine/Triangulator.as=UTF-8
encoding//src/spine/Updatable.as=UTF-8
encoding//src/spine/Vertex.as=UTF-8
encoding//src/spine/VertexEffect.as=UTF-8
encoding//src/spine/animation/Animation.as=UTF-8

View File

@ -56,6 +56,8 @@ package spine {
public var worldX : Number;
public var worldY : Number;
internal var _sorted : Boolean;
public var active : Boolean;
/** @param parent May be null. */
public function Bone(data : BoneData, skeleton : Skeleton, parent : Bone) {
@ -66,6 +68,10 @@ package spine {
_parent = parent;
setToSetupPose();
}
public function isActive() : Boolean {
return active;
}
/** Same as updateWorldTransform(). This method exists for Bone to implement Updatable. */
public function update() : void {

View File

@ -41,6 +41,7 @@ package spine {
public var shearX : Number;
public var shearY : Number;
public var transformMode : TransformMode = TransformMode.normal;
public var skinRequired : Boolean;
/** @param parent May be null. */
public function BoneData(index : int, name : String, parent : BoneData) {

View File

@ -1,34 +1,46 @@
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
package spine {
public interface Constraint extends Updatable {
function getOrder() : Number;
}
}
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
package spine {
public class ConstraintData {
public var name: String;
public var order: Number;
public var skinRequired: Boolean;
function ConstraintData(name: String, order: Number, skinRequired: Boolean) {
this.name = name;
this.order = order;
this.skinRequired = skinRequired;
}
public function toString() : String {
return name;
}
}
}

View File

@ -28,7 +28,7 @@
*****************************************************************************/
package spine {
public class IkConstraint implements Constraint {
public class IkConstraint implements Updatable {
internal var _data : IkConstraintData;
public var bones : Vector.<Bone>;
public var target : Bone;
@ -36,6 +36,7 @@ package spine {
public var compress: Boolean;
public var stretch: Boolean;
public var mix : Number;
public var active : Boolean;
public function IkConstraint(data : IkConstraintData, skeleton : Skeleton) {
if (data == null) throw new ArgumentError("data cannot be null.");
@ -51,6 +52,10 @@ package spine {
bones[bones.length] = skeleton.findBone(boneData.name);
target = skeleton.findBone(data.target._name);
}
public function isActive() : Boolean {
return active;
}
public function apply() : void {
update();
@ -67,16 +72,12 @@ package spine {
}
}
public function getOrder() : Number {
return _data.order;
}
public function get data() : IkConstraintData {
return _data;
}
public function toString() : String {
return _data._name;
return _data.name;
}
/** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world

View File

@ -28,9 +28,7 @@
*****************************************************************************/
package spine {
public class IkConstraintData {
internal var _name : String;
public var order : Number;
public class IkConstraintData extends ConstraintData {
public var bones : Vector.<BoneData> = new Vector.<BoneData>();
public var target : BoneData;
public var mix : Number = 1;
@ -40,16 +38,7 @@ package spine {
public var uniform : Boolean = false;
public function IkConstraintData(name : String) {
if (name == null) throw new ArgumentError("name cannot be null.");
_name = name;
}
public function get name() : String {
return _name;
}
public function toString() : String {
return _name;
super(name, 0, false);
}
}
}

View File

@ -30,7 +30,7 @@
package spine {
import spine.attachments.PathAttachment;
public class PathConstraint implements Constraint {
public class PathConstraint implements Updatable {
private static const NONE : int = -1, BEFORE : int = -2, AFTER : int = -3;
private static const epsilon : Number = 0.00001;
internal var _data : PathConstraintData;
@ -43,6 +43,7 @@ package spine {
internal const _curves : Vector.<Number> = new Vector.<Number>();
internal const _lengths : Vector.<Number> = new Vector.<Number>();
internal const _segments : Vector.<Number> = new Vector.<Number>(10);
public var active : Boolean;
public function PathConstraint(data : PathConstraintData, skeleton : Skeleton) {
if (data == null) throw new ArgumentError("data cannot be null.");
@ -57,6 +58,10 @@ package spine {
rotateMix = data.rotateMix;
translateMix = data.translateMix;
}
public function isActive() : Boolean {
return active;
}
public function apply() : void {
update();
@ -442,10 +447,6 @@ package spine {
return _data;
}
public function getOrder() : Number {
return _data.order;
}
public function toString() : String {
return _data.name;
}

View File

@ -28,9 +28,7 @@
*****************************************************************************/
package spine {
public dynamic class PathConstraintData {
internal var _name : String;
public var order : Number;
public dynamic class PathConstraintData extends ConstraintData {
internal var _bones : Vector.<BoneData> = new Vector.<BoneData>();
public var target : SlotData;
public var positionMode : PositionMode;
@ -40,20 +38,11 @@ package spine {
public var position : Number, spacing : Number, rotateMix : Number, translateMix : Number;
public function PathConstraintData(name : String) {
if (name == null) throw new ArgumentError("name cannot be null.");
_name = name;
super(name, 0, false);
}
public function get bones() : Vector.<BoneData> {
return _bones;
}
public function get name() : String {
return _name;
}
public function toString() : String {
return name;
}
}
}

View File

@ -104,8 +104,24 @@ package spine {
var bones : Vector.<Bone> = this.bones;
var i : Number = 0;
var n : Number = 0;
for (i = 0, n = bones.length; i < n; i++)
bones[i]._sorted = false;
var bone : Bone;
for (i = 0, n = bones.length; i < n; i++) {
bone = bones[i];
bone._sorted = bone.data.skinRequired;
bone.active = !bone._sorted;
}
if (skin != null) {
var skinBones : Vector.<BoneData> = skin.bones;
for (i = 0, n = this.skin.bones.length; i < n; i++) {
bone = this.bones[skinBones[i].index];
do {
bone._sorted = false;
bone.active = true;
bone = bone.parent;
} while (bone != null);
}
}
// IK first, lowest hierarchy depth first.
var ikConstraints : Vector.<IkConstraint> = this.ikConstraints;
@ -143,8 +159,17 @@ package spine {
for (i = 0, n = bones.length; i < n; i++)
sortBone(bones[i]);
}
static function contains(list : Vector.<ConstraintData>, element : ConstraintData) : Boolean {
for (var i : Number = 0; i < list.length; i++)
if (list[i] == element) return true;
return false;
}
private function sortIkConstraint(constraint : IkConstraint) : void {
constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && contains(this.skin.constraints, constraint.data)));
if (!constraint.active) return;
var target : Bone = constraint.target;
sortBone(target);
@ -164,6 +189,9 @@ package spine {
}
private function sortPathConstraint(constraint : PathConstraint) : void {
constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin != null && contains(this.skin.constraints, constraint.data)));
if (!constraint.active) return;
var slot : Slot = constraint.target;
var slotIndex : Number = slot.data.index;
var slotBone : Bone = slot.bone;
@ -192,6 +220,9 @@ package spine {
}
private function sortTransformConstraint(constraint : TransformConstraint) : void {
constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && contains(this.skin.constraints, constraint.data)));
if (!constraint.active) return;
sortBone(constraint.target);
var constrained : Vector.<Bone> = constraint.bones;
@ -255,6 +286,7 @@ package spine {
private function sortReset(bones : Vector.<Bone>) : void {
for (var i : int = 0, n : int = bones.length; i < n; i++) {
var bone : Bone = bones[i];
if (!bone.active) continue;
if (bone._sorted) sortReset(bone.children);
bone._sorted = false;
}
@ -393,6 +425,7 @@ package spine {
* no old skin, each slot's setup mode attachment is attached from the new skin.
* @param newSkin May be null. */
public function set skin(newSkin : Skin) : void {
if (newSkin == _skin) return;
if (newSkin) {
if (skin)
newSkin.attachAll(this, skin);
@ -409,6 +442,7 @@ package spine {
}
}
_skin = newSkin;
updateCache();
}
/** @return May be null. */
@ -451,7 +485,7 @@ package spine {
public function findIkConstraint(constraintName : String) : IkConstraint {
if (constraintName == null) throw new ArgumentError("constraintName cannot be null.");
for each (var ikConstraint : IkConstraint in ikConstraints)
if (ikConstraint._data._name == constraintName) return ikConstraint;
if (ikConstraint._data.name == constraintName) return ikConstraint;
return null;
}
@ -459,7 +493,7 @@ package spine {
public function findTransformConstraint(constraintName : String) : TransformConstraint {
if (constraintName == null) throw new ArgumentError("constraintName cannot be null.");
for each (var transformConstraint : TransformConstraint in transformConstraints)
if (transformConstraint._data._name == constraintName) return transformConstraint;
if (transformConstraint._data.name == constraintName) return transformConstraint;
return null;
}
@ -467,7 +501,7 @@ package spine {
public function findPathConstraint(constraintName : String) : PathConstraint {
if (constraintName == null) throw new ArgumentError("constraintName cannot be null.");
for each (var pathConstraint : PathConstraint in pathConstraints)
if (pathConstraint._data._name == constraintName) return pathConstraint;
if (pathConstraint._data.name == constraintName) return pathConstraint;
return null;
}

View File

@ -120,7 +120,7 @@ package spine {
public function findIkConstraint(constraintName : String) : IkConstraintData {
if (constraintName == null) throw new ArgumentError("constraintName cannot be null.");
for each (var ikConstraintData : IkConstraintData in ikConstraints)
if (ikConstraintData._name == constraintName) return ikConstraintData;
if (ikConstraintData.name == constraintName) return ikConstraintData;
return null;
}
@ -129,7 +129,7 @@ package spine {
public function findTransformConstraint(constraintName : String) : TransformConstraintData {
if (constraintName == null) throw new ArgumentError("constraintName cannot be null.");
for each (var transformConstraintData : TransformConstraintData in transformConstraints)
if (transformConstraintData._name == constraintName) return transformConstraintData;
if (transformConstraintData.name == constraintName) return transformConstraintData;
return null;
}

View File

@ -118,6 +118,7 @@ package spine {
boneData.shearX = Number(boneMap["shearX"] || 0);
boneData.shearY = Number(boneMap["shearY"] || 0);
boneData.transformMode = TransformMode[boneMap["transform"] || "normal"];
boneData.skinRequired = boneMap.hasOwnProperty("skin") ? boneMap["skin"] : false;
skeletonData.bones.push(boneData);
}
@ -148,6 +149,7 @@ package spine {
for each (var constraintMap : Object in root["ik"]) {
var ikConstraintData : IkConstraintData = new IkConstraintData(constraintMap["name"]);
ikConstraintData.order = constraintMap["order"] || 0;
ikConstraintData.skinRequired = constraintMap.hasOwnProperty("skin") ? constraintMap["skin"] : false;
for each (boneName in constraintMap["bones"]) {
var bone : BoneData = skeletonData.findBone(boneName);
@ -171,6 +173,7 @@ package spine {
for each (constraintMap in root["transform"]) {
var transformConstraintData : TransformConstraintData = new TransformConstraintData(constraintMap["name"]);
transformConstraintData.order = constraintMap["order"] || 0;
transformConstraintData.skinRequired = constraintMap.hasOwnProperty("skin") ? constraintMap["skin"] : false;
for each (boneName in constraintMap["bones"]) {
bone = skeletonData.findBone(boneName);
@ -203,6 +206,7 @@ package spine {
for each (constraintMap in root["path"]) {
var pathConstraintData : PathConstraintData = new PathConstraintData(constraintMap["name"]);
pathConstraintData.order = constraintMap["order"] || 0;
pathConstraintData.skinRequired = constraintMap.hasOwnProperty("skin") ? constraintMap["skin"] : false;
for each (boneName in constraintMap["bones"]) {
bone = skeletonData.findBone(boneName);
@ -228,17 +232,51 @@ package spine {
}
// Skins.
var skins : Object = root["skins"];
for (var skinName : String in skins) {
var skinMap : Object = skins[skinName];
var skin : Skin = new Skin(skinName);
for (slotName in skinMap) {
var slotIndex : int = skeletonData.findSlotIndex(slotName);
var slotEntry : Object = skinMap[slotName];
var skins : Object = root["skins"];
for (var i : Number = 0; i < skins.length; i++) {
var ii : Number;
var skinMap : Object = skins[i];
var skin : Skin = new Skin(skinMap["name"]);
if (skinMap["bones"]) {
for (ii = 0; ii < skinMap["bones"].length; ii++) {
var boneData : BoneData = skeletonData.findBone(skinMap["bones"][ii]);
if (boneData == null) throw new Error("Skin bone not found: " + skinMap["bones"][ii]);
skin.bones.push(boneData);
}
}
if (skinMap["ik"]) {
for (ii = 0; ii < skinMap["ik"].length; ii++) {
var constraint : ConstraintData = skeletonData.findIkConstraint(skinMap["ik"][ii]);
if (constraint == null) throw new Error("Skin IK constraint not found: " + skinMap["ik"][ii]);
skin.constraints.push(constraint);
}
}
if (skinMap["transform"]) {
for (ii = 0; ii < skinMap["transform"].length; ii++) {
var constraint : ConstraintData = skeletonData.findIkConstraint(skinMap["transform"][ii]);
if (constraint == null) throw new Error("Skin transform constraint not found: " + skinMap["transform"][ii]);
skin.constraints.push(constraint);
}
}
if (skinMap["path"]) {
for (ii = 0; ii < skinMap["path"].length; ii++) {
var constraint : ConstraintData = skeletonData.findIkConstraint(skinMap["path"][ii]);
if (constraint == null) throw new Error("Skin path constraint not found: " + skinMap["path"][ii]);
skin.constraints.push(constraint);
}
}
for (slotName in skinMap.attachments) {
var slot : SlotData = skeletonData.findSlot(slotName);
var slotEntry : Object = skinMap.attachments[slotName];
for (var attachmentName : String in slotEntry) {
var attachment : Attachment = readAttachment(slotEntry[attachmentName], skin, slotIndex, attachmentName, skeletonData);
var attachment : Attachment = readAttachment(slotEntry[attachmentName], skin, slot.index, attachmentName, skeletonData);
if (attachment != null)
skin.setAttachment(slotIndex, attachmentName, attachment);
skin.setAttachment(slot.index, attachmentName, attachment);
}
}
skeletonData.skins[skeletonData.skins.length] = skin;
@ -440,7 +478,7 @@ package spine {
frameIndex = 0;
for each (valueMap in values)
attachmentTimeline.setFrame(frameIndex++, valueMap["time"], valueMap["name"]);
attachmentTimeline.setFrame(frameIndex++, Number(valueMap["time"] || 0), valueMap["name"]);
timelines[timelines.length] = attachmentTimeline;
duration = Math.max(duration, attachmentTimeline.frames[attachmentTimeline.frameCount - 1]);
} else if (timelineName == "color") {
@ -454,7 +492,7 @@ package spine {
var g : Number = toColor(color, 1);
var b : Number = toColor(color, 2);
var a : Number = toColor(color, 3);
colorTimeline.setFrame(frameIndex, valueMap["time"], r, g, b, a);
colorTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), r, g, b, a);
readCurve(valueMap, colorTimeline, frameIndex);
frameIndex++;
}
@ -472,7 +510,7 @@ package spine {
var dark : Color = new Color(0, 0, 0, 0);
light.setFrom(toColor(color, 0), toColor(color, 1), toColor(color, 2), toColor(color, 3));
dark.setFrom(toColor(darkColor, 0), toColor(darkColor, 1), toColor(darkColor, 2), toColor(darkColor, 3));
twoColorTimeline.setFrame(frameIndex, valueMap["time"], light.r, light.g, light.b, light.a, dark.r, dark.g, dark.b);
twoColorTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), light.r, light.g, light.b, light.a, dark.r, dark.g, dark.b);
readCurve(valueMap, twoColorTimeline, frameIndex);
frameIndex++;
}
@ -497,7 +535,7 @@ package spine {
frameIndex = 0;
for each (valueMap in values) {
rotateTimeline.setFrame(frameIndex, valueMap["time"], valueMap["angle"]);
rotateTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), Number(valueMap["angle"] || 0));
readCurve(valueMap, rotateTimeline, frameIndex);
frameIndex++;
}
@ -506,9 +544,11 @@ package spine {
} else if (timelineName == "translate" || timelineName == "scale" || timelineName == "shear") {
var translateTimeline : TranslateTimeline;
var timelineScale : Number = 1;
if (timelineName == "scale")
var defaultValue : Number = 0;
if (timelineName == "scale") {
translateTimeline = new ScaleTimeline(values.length);
else if (timelineName == "shear")
defaultValue = 1;
} else if (timelineName == "shear")
translateTimeline = new ShearTimeline(values.length);
else {
translateTimeline = new TranslateTimeline(values.length);
@ -518,9 +558,9 @@ package spine {
frameIndex = 0;
for each (valueMap in values) {
var x : Number = Number(valueMap["x"] || 0) * timelineScale;
var y : Number = Number(valueMap["y"] || 0) * timelineScale;
translateTimeline.setFrame(frameIndex, valueMap["time"], x, y);
var x : Number = Number(valueMap["x"] || defaultValue) * timelineScale;
var y : Number = Number(valueMap["y"] || defaultValue) * timelineScale;
translateTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), x, y);
readCurve(valueMap, translateTimeline, frameIndex);
frameIndex++;
}
@ -543,7 +583,7 @@ package spine {
var bendDirection : int = (!valueMap.hasOwnProperty("bendPositive") || valueMap["bendPositive"]) ? 1 : -1;
var compress : Boolean = (valueMap.hasOwnProperty("compress") && valueMap["compress"]);
var stretch : Boolean = (valueMap.hasOwnProperty("stretch") && valueMap["stretch"]);
ikTimeline.setFrame(frameIndex, valueMap["time"], mix, bendDirection, compress, stretch);
ikTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), mix, bendDirection, compress, stretch);
readCurve(valueMap, ikTimeline, frameIndex);
frameIndex++;
}
@ -563,7 +603,7 @@ package spine {
var translateMix : Number = valueMap.hasOwnProperty("translateMix") ? valueMap["translateMix"] : 1;
var scaleMix : Number = valueMap.hasOwnProperty("scaleMix") ? valueMap["scaleMix"] : 1;
var shearMix : Number = valueMap.hasOwnProperty("shearMix") ? valueMap["shearMix"] : 1;
transformTimeline.setFrame(frameIndex, valueMap["time"], rotateMix, translateMix, scaleMix, shearMix);
transformTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), rotateMix, translateMix, scaleMix, shearMix);
readCurve(valueMap, transformTimeline, frameIndex);
frameIndex++;
}
@ -596,7 +636,7 @@ package spine {
frameIndex = 0;
for each (valueMap in values) {
var value : Number = valueMap[timelineName] || 0;
pathTimeline.setFrame(frameIndex, valueMap["time"], value * timelineScale);
pathTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), value * timelineScale);
readCurve(valueMap, pathTimeline, frameIndex);
frameIndex++;
}
@ -609,7 +649,7 @@ package spine {
for each (valueMap in values) {
rotateMix = valueMap.hasOwnProperty("rotateMix") ? valueMap["rotateMix"] : 1;
translateMix = valueMap.hasOwnProperty("translateMix") ? valueMap["translateMix"] : 1;
pathMixTimeline.setFrame(frameIndex, valueMap["time"], rotateMix, translateMix);
pathMixTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), rotateMix, translateMix);
readCurve(valueMap, pathMixTimeline, frameIndex);
frameIndex++;
}
@ -663,7 +703,7 @@ package spine {
}
}
deformTimeline.setFrame(frameIndex, valueMap["time"], deform);
deformTimeline.setFrame(frameIndex, Number(valueMap["time"] || 0), deform);
readCurve(valueMap, deformTimeline, frameIndex);
frameIndex++;
}
@ -704,7 +744,7 @@ package spine {
for (i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
}
drawOrderTimeline.setFrame(frameIndex++, drawOrderMap["time"], drawOrder);
drawOrderTimeline.setFrame(frameIndex++, Number(drawOrderMap["time"] || 0), drawOrder);
}
timelines[timelines.length] = drawOrderTimeline;
duration = Math.max(duration, drawOrderTimeline.frames[drawOrderTimeline.frameCount - 1]);
@ -717,7 +757,7 @@ package spine {
for each (var eventMap : Object in eventsMap) {
var eventData : EventData = skeletonData.findEvent(eventMap["name"]);
if (!eventData) throw new Error("Event not found: " + eventMap["name"]);
var event : Event = new Event(eventMap["time"], eventData);
var event : Event = new Event(Number(eventMap["time"] || 0), eventData);
event.intValue = eventMap.hasOwnProperty("int") ? eventMap["int"] : eventData.intValue;
event.floatValue = eventMap.hasOwnProperty("float") ? eventMap["float"] : eventData.floatValue;
event.stringValue = eventMap.hasOwnProperty("string") ? eventMap["string"] : eventData.stringValue;
@ -739,8 +779,8 @@ package spine {
if (!curve) return;
if (curve == "stepped")
timeline.setStepped(frameIndex);
else if (curve is Array)
timeline.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]);
else
timeline.setCurve(frameIndex, parseFloat(curve.toString()), Number(map["c2"] || 0), Number(map["c3"] || 1), Number(map["c4"] || 1));
}
static private function toColor(hexString : String, colorIndex : int) : Number {

View File

@ -38,7 +38,7 @@ package spine {
internal var _name : String;
private var _attachments : Vector.<Dictionary> = new Vector.<Dictionary>();
private var _bones: Vector.<BoneData> = new Vector.<BoneData>();
private var _constraints: Vector.<Constraint> = new Vector.<Constraint>();
private var _constraints: Vector.<ConstraintData> = new Vector.<ConstraintData>();
public function Skin(name : String) {
if (name == null) throw new ArgumentError("name cannot be null.");
@ -69,7 +69,7 @@ package spine {
}
for(i = 0; i < skin._constraints.length; i++) {
var constraint : Constraint = skin._constraints[i];
var constraint : ConstraintData = skin._constraints[i];
contained = false;
for (j = 0; j < this._constraints.length; j++) {
if (_constraints[j] == constraint) {
@ -105,7 +105,7 @@ package spine {
}
for(i = 0; i < skin._constraints.length; i++) {
var constraint : Constraint = skin._constraints[i];
var constraint : ConstraintData = skin._constraints[i];
contained = false;
for (j = 0; j < this._constraints.length; j++) {
if (_constraints[j] == constraint) {
@ -181,7 +181,7 @@ package spine {
return _bones;
}
public function get constraints() : Vector.<Constraint> {
public function get constraints() : Vector.<ConstraintData> {
return _constraints;
}

View File

@ -28,7 +28,7 @@
*****************************************************************************/
package spine {
public class TransformConstraint implements Constraint {
public class TransformConstraint implements Updatable {
internal var _data : TransformConstraintData;
internal var _bones : Vector.<Bone>;
public var target : Bone;
@ -37,6 +37,7 @@ package spine {
public var scaleMix : Number;
public var shearMix : Number;
internal var _temp : Vector.<Number> = new Vector.<Number>(2);
public var active : Boolean;
public function TransformConstraint(data : TransformConstraintData, skeleton : Skeleton) {
if (data == null) throw new ArgumentError("data cannot be null.");
@ -51,6 +52,10 @@ package spine {
_bones.push(skeleton.findBone(boneData.name));
target = skeleton.findBone(data.target._name);
}
public function isActive() : Boolean {
return active;
}
public function apply() : void {
update();
@ -274,10 +279,6 @@ package spine {
}
}
public function getOrder() : Number {
return _data.order;
}
public function get data() : TransformConstraintData {
return _data;
}
@ -287,7 +288,7 @@ package spine {
}
public function toString() : String {
return _data._name;
return _data.name;
}
}
}

View File

@ -28,9 +28,7 @@
*****************************************************************************/
package spine {
public class TransformConstraintData {
internal var _name : String;
public var order : Number;
public class TransformConstraintData extends ConstraintData {
internal var _bones : Vector.<BoneData> = new Vector.<BoneData>();
public var target : BoneData;
public var rotateMix : Number;
@ -47,21 +45,11 @@ package spine {
public var local : Boolean = false;
public function TransformConstraintData(name : String) {
if (name == null) throw new ArgumentError("name cannot be null.");
_name = name;
super(name, 0, false);
}
public function get bones() : Vector.<BoneData> {
;
public function get bones() : Vector.<BoneData> {
return _bones;
}
public function get name() : String {
return _name;
}
public function toString() : String {
return _name;
}
}
}
}

View File

@ -30,5 +30,6 @@
package spine {
public interface Updatable {
function update() : void;
function isActive() : Boolean;
}
}

View File

@ -304,6 +304,7 @@ package spine.animation {
var rotateTimeline : RotateTimeline = RotateTimeline(timeline);
var frames : Vector.<Number> = rotateTimeline.frames;
var bone : Bone = skeleton.bones[rotateTimeline.boneIndex];
if (!bone.active) return;
var r1 : Number, r2 : Number;
if (time < frames[0]) {
switch (blend) {

View File

@ -59,6 +59,7 @@ package spine.animation {
public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var attachmentName : String;
var slot : Slot = skeleton.slots[slotIndex];
if (!slot.bone.active) return;
if (direction == MixDirection.Out && blend == MixBlend.setup) {
attachmentName = slot.data.attachmentName;
slot.attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName);

View File

@ -62,6 +62,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var frames : Vector.<Number> = this.frames;
var slot : Slot = skeleton.slots[slotIndex];
if (!slot.bone.active) return;
if (time < frames[0]) {
switch (blend) {

View File

@ -60,6 +60,7 @@ package spine.animation {
var vertexAttachment : VertexAttachment;
var setupVertices : Vector.<Number>;
var slot : Slot = skeleton.slots[slotIndex];
if (!slot.bone.active) return;
var slotAttachment : Attachment = slot.attachment;
if (!(slotAttachment is VertexAttachment) || !(VertexAttachment(slotAttachment).deformAttachment == attachment)) return;

View File

@ -60,6 +60,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var constraint : IkConstraint = skeleton.ikConstraints[ikConstraintIndex];
if (!constraint.active) return;
if (time < frames[0]) {
switch (blend) {
case MixBlend.setup:

View File

@ -58,6 +58,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var constraint : PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (!constraint.active) return;
if (time < frames[0]) {
switch (blend) {
case MixBlend.setup:

View File

@ -57,6 +57,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var constraint : PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (!constraint.active) return;
if (time < frames[0]) {
switch (blend) {
case MixBlend.setup:

View File

@ -43,6 +43,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var constraint : PathConstraint = skeleton.pathConstraints[pathConstraintIndex];
if (!constraint.active) return;
if (time < frames[0]) {
switch (blend) {
case MixBlend.setup:

View File

@ -59,6 +59,7 @@ package spine.animation {
var frames : Vector.<Number> = this.frames;
var bone : Bone = skeleton.bones[boneIndex];
if (!bone.active) return;
var r : Number;
if (time < frames[0]) {
switch (blend) {

View File

@ -45,6 +45,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var frames : Vector.<Number> = this.frames;
var bone : Bone = skeleton.bones[boneIndex];
if (!bone.active) return;
if (time < frames[0]) {
switch (blend) {

View File

@ -44,6 +44,7 @@ package spine.animation {
override public function apply(skeleton : Skeleton, lastTime : Number, time : Number, firedEvents : Vector.<Event>, alpha : Number, blend : MixBlend, direction : MixDirection) : void {
var frames : Vector.<Number> = this.frames;
var bone : Bone = skeleton.bones[boneIndex];
if (!bone.active) return;
if (time < frames[0]) {
switch (blend) {

View File

@ -63,6 +63,7 @@ package spine.animation {
var frames : Vector.<Number> = this.frames;
var constraint : TransformConstraint = skeleton.transformConstraints[transformConstraintIndex];
if (!constraint.active) return;
var data : TransformConstraintData;
if (time < frames[0]) {
data = constraint.data;

View File

@ -60,6 +60,7 @@ package spine.animation {
var frames : Vector.<Number> = this.frames;
var bone : Bone = skeleton.bones[boneIndex];
if (!bone.active) return;
if (time < frames[0]) {
switch (blend) {
case MixBlend.setup:

View File

@ -67,6 +67,7 @@ package spine.animation {
var frames : Vector.<Number> = this.frames;
var slot : Slot = skeleton.slots[slotIndex];
var light : Color, dark : Color;
if (!slot.bone.active) return;
if (time < frames[0]) {
switch (blend) {

View File

@ -39,10 +39,11 @@ package spine.attachments {
public var vertices : Vector.<Number>;
public var worldVerticesLength : int;
public var id : int = (nextID++ & 65535) << 11;
public var deformAttachment : VertexAttachment = this;
public var deformAttachment : VertexAttachment;
public function VertexAttachment(name : String) {
super(name);
deformAttachment = this;
}
/** Transforms local vertices to world coordinates.

View File

@ -88,7 +88,7 @@ package spine.examples {
skeleton.skeleton.setSlotsToSetupPose();
skeleton.state.setAnimationByName(0, "walk", true);
var skin : Skin = new Skin("test");
var skin : Skin = new Skin("test");
skin.copySkin(skeletonData.findSkin("goblingirl"));
skeleton.skeleton.skin = skin;
skeleton.skeleton.setToSetupPose();

View File

@ -98,6 +98,7 @@ package spine.starling {
for (var i : int = 0, n : int = drawOrder.length; i < n; ++i) {
var worldVertices : Vector.<Number> = _tempVertices;
var slot : Slot = drawOrder[i];
if (!slot.bone.active) continue;
if (slot.attachment is RegionAttachment) {
var region : RegionAttachment = slot.attachment as RegionAttachment;

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -3747,7 +3747,7 @@ var spine;
Skeleton.prototype.sortReset = function (bones) {
for (var i = 0, n = bones.length; i < n; i++) {
var bone = bones[i];
if (!bone.update)
if (!bone.active)
continue;
if (bone.sorted)
this.sortReset(bone.children);

View File

@ -270,7 +270,7 @@ module spine {
sortReset (bones: Array<Bone>) {
for (let i = 0, n = bones.length; i < n; i++) {
let bone = bones[i];
if (!bone.update) continue;
if (!bone.active) continue;
if (bone.sorted) this.sortReset(bone.children);
bone.sorted = false;
}