OMORI_Android/www.eng/js/libs/dragonbones/dragonBones.js
2024-01-15 18:44:53 +03:00

9766 lines
395 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var dragonBones;
(function (dragonBones) {
/**
* DragonBones
*/
var DragonBones = (function () {
function DragonBones() {
}
/**
* @internal
* @private
*/
DragonBones.hasArmature = function (value) {
return DragonBones._armatures.indexOf(value) >= 0;
};
/**
* @internal
* @private
*/
DragonBones.addArmature = function (value) {
if (value && DragonBones._armatures.indexOf(value) < 0) {
DragonBones._armatures.push(value);
}
};
/**
* @internal
* @private
*/
DragonBones.removeArmature = function (value) {
if (value) {
var index = DragonBones._armatures.indexOf(value);
if (index >= 0) {
DragonBones._armatures.splice(index, 1);
}
}
};
return DragonBones;
}());
/**
* @private
*/
DragonBones.PI_D = Math.PI * 2.0;
/**
* @private
*/
DragonBones.PI_H = Math.PI / 2.0;
/**
* @private
*/
DragonBones.PI_Q = Math.PI / 4.0;
/**
* @private
*/
DragonBones.ANGLE_TO_RADIAN = Math.PI / 180.0;
/**
* @private
*/
DragonBones.RADIAN_TO_ANGLE = 180.0 / Math.PI;
/**
* @private
*/
DragonBones.SECOND_TO_MILLISECOND = 1000.0;
/**
* @internal
* @private
*/
DragonBones.NO_TWEEN = 100;
DragonBones.VERSION = "5.0.0";
/**
* @internal
* @private
*/
DragonBones.ARGUMENT_ERROR = "Argument error.";
/**
* @private
*/
DragonBones.yDown = true;
/**
* @private
*/
DragonBones.debug = false;
/**
* @private
*/
DragonBones.debugDraw = false;
/**
* @internal
* @private
*/
DragonBones._armatures = [];
dragonBones.DragonBones = DragonBones;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 基础对象。
* @version DragonBones 4.5
*/
var BaseObject = (function () {
/**
* @internal
* @private
*/
function BaseObject() {
/**
* @language zh_CN
* 对象的唯一标识。
* @version DragonBones 4.5
*/
this.hashCode = BaseObject._hashCode++;
this._isInPool = false;
}
BaseObject._returnObject = function (object) {
var classType = String(object.constructor);
var maxCount = BaseObject._maxCountMap[classType] == null ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType];
var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || [];
if (pool.length < maxCount) {
if (!object._isInPool) {
pool.push(object);
}
}
};
/**
* @language zh_CN
* 设置每种对象池的最大缓存数量。
* @param objectConstructor 对象类。
* @param maxCount 最大缓存数量。 (设置为 0 则不缓存)
* @version DragonBones 4.5
*/
BaseObject.setMaxCount = function (objectConstructor, maxCount) {
if (maxCount < 0 || maxCount !== maxCount) {
maxCount = 0;
}
if (objectConstructor) {
var classType = String(objectConstructor);
BaseObject._maxCountMap[classType] = maxCount;
var pool = BaseObject._poolsMap[classType];
if (pool && pool.length > maxCount) {
pool.length = maxCount;
}
}
else {
BaseObject._defaultMaxCount = maxCount;
for (var classType in BaseObject._poolsMap) {
if (BaseObject._maxCountMap[classType] == null) {
continue;
}
BaseObject._maxCountMap[classType] = maxCount;
var pool = BaseObject._poolsMap[classType];
if (pool.length > maxCount) {
pool.length = maxCount;
}
}
}
};
/**
* @language zh_CN
* 清除对象池缓存的对象。
* @param objectConstructor 对象类。 (不设置则清除所有缓存)
* @version DragonBones 4.5
*/
BaseObject.clearPool = function (objectConstructor) {
if (objectConstructor === void 0) { objectConstructor = null; }
if (objectConstructor) {
var pool = BaseObject._poolsMap[String(objectConstructor)];
if (pool && pool.length) {
pool.length = 0;
}
}
else {
for (var k in BaseObject._poolsMap) {
var pool = BaseObject._poolsMap[k];
pool.length = 0;
}
}
};
/**
* @language zh_CN
* 从对象池中创建指定对象。
* @param objectConstructor 对象类。
* @version DragonBones 4.5
*/
BaseObject.borrowObject = function (objectConstructor) {
var pool = BaseObject._poolsMap[String(objectConstructor)];
if (pool && pool.length > 0) {
var object = pool.pop();
object._isInPool = false;
return object;
}
else {
var object = new objectConstructor();
object._onClear();
return object;
}
};
/**
* @language zh_CN
* 清除数据并返还对象池。
* @version DragonBones 4.5
*/
BaseObject.prototype.returnToPool = function () {
this._onClear();
BaseObject._returnObject(this);
};
return BaseObject;
}());
BaseObject._hashCode = 0;
BaseObject._defaultMaxCount = 5000;
BaseObject._maxCountMap = {};
BaseObject._poolsMap = {};
dragonBones.BaseObject = BaseObject;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
var Point = (function () {
function Point(x, y) {
if (x === void 0) { x = 0.0; }
if (y === void 0) { y = 0.0; }
this.x = x;
this.y = y;
}
Point.prototype.copyFrom = function (value) {
this.x = value.x;
this.y = value.y;
};
Point.prototype.clear = function () {
this.x = this.y = 0.0;
};
return Point;
}());
dragonBones.Point = Point;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
var Rectangle = (function () {
function Rectangle(x, y, width, height) {
if (x === void 0) { x = 0.0; }
if (y === void 0) { y = 0.0; }
if (width === void 0) { width = 0.0; }
if (height === void 0) { height = 0.0; }
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
Rectangle.prototype.copyFrom = function (value) {
this.x = value.x;
this.y = value.y;
this.width = value.width;
this.height = value.height;
};
Rectangle.prototype.clear = function () {
this.x = this.y = 0.0;
this.width = this.height = 0.0;
};
return Rectangle;
}());
dragonBones.Rectangle = Rectangle;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 2D 变换。
* @version DragonBones 3.0
*/
var Transform = (function () {
function Transform(
/**
* @language zh_CN
* 水平位移。
* @version DragonBones 3.0
*/
x,
/**
* @language zh_CN
* 垂直位移。
* @version DragonBones 3.0
*/
y,
/**
* @language zh_CN
* 水平倾斜。 (以弧度为单位)
* @version DragonBones 3.0
*/
skewX,
/**
* @language zh_CN
* 垂直倾斜。 (以弧度为单位)
* @version DragonBones 3.0
*/
skewY,
/**
* @language zh_CN
* 水平缩放。
* @version DragonBones 3.0
*/
scaleX,
/**
* @language zh_CN
* 垂直缩放。
* @version DragonBones 3.0
*/
scaleY) {
if (x === void 0) { x = 0.0; }
if (y === void 0) { y = 0.0; }
if (skewX === void 0) { skewX = 0.0; }
if (skewY === void 0) { skewY = 0.0; }
if (scaleX === void 0) { scaleX = 1.0; }
if (scaleY === void 0) { scaleY = 1.0; }
this.x = x;
this.y = y;
this.skewX = skewX;
this.skewY = skewY;
this.scaleX = scaleX;
this.scaleY = scaleY;
}
/**
* @private
*/
Transform.normalizeRadian = function (value) {
value = (value + Math.PI) % (Math.PI * 2.0);
value += value > 0.0 ? -Math.PI : Math.PI;
return value;
};
/**
* @private
*/
Transform.prototype.toString = function () {
return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skewX * 180.0 / Math.PI + " skewY:" + this.skewY * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY;
};
/**
* @private
*/
Transform.prototype.copyFrom = function (value) {
this.x = value.x;
this.y = value.y;
this.skewX = value.skewX;
this.skewY = value.skewY;
this.scaleX = value.scaleX;
this.scaleY = value.scaleY;
return this;
};
/**
* @private
*/
Transform.prototype.identity = function () {
this.x = this.y = this.skewX = this.skewY = 0.0;
this.scaleX = this.scaleY = 1.0;
return this;
};
/**
* @private
*/
Transform.prototype.add = function (value) {
this.x += value.x;
this.y += value.y;
this.skewX += value.skewX;
this.skewY += value.skewY;
this.scaleX *= value.scaleX;
this.scaleY *= value.scaleY;
return this;
};
/**
* @private
*/
Transform.prototype.minus = function (value) {
this.x -= value.x;
this.y -= value.y;
this.skewX = Transform.normalizeRadian(this.skewX - value.skewX);
this.skewY = Transform.normalizeRadian(this.skewY - value.skewY);
this.scaleX /= value.scaleX;
this.scaleY /= value.scaleY;
return this;
};
/**
* @language zh_CN
* 矩阵转换为变换。
* @param 矩阵。
* @version DragonBones 3.0
*/
Transform.prototype.fromMatrix = function (matrix) {
this.x = matrix.tx;
this.y = matrix.ty;
this.skewX = Math.atan(-matrix.c / matrix.d);
this.skewY = Math.atan(matrix.b / matrix.a);
var backupScaleX = this.scaleX, backupScaleY = this.scaleY;
var PI_Q = dragonBones.DragonBones.PI_Q;
var dSkew = this.skewX - this.skewY;
var cos = Math.cos(this.skewX);
var sin = Math.sin(this.skewX);
if (-0.01 < dSkew && dSkew < 0.01) {
this.scaleX = (this.skewY > -PI_Q && this.skewY < PI_Q) ? matrix.a / cos : matrix.b / sin;
}
else {
this.scaleX = (this.skewY > -PI_Q && this.skewY < PI_Q) ? matrix.a / Math.cos(this.skewY) : matrix.b / Math.sin(this.skewY);
}
this.scaleY = (this.skewX > -PI_Q && this.skewX < PI_Q) ? matrix.d / cos : -matrix.c / sin;
if (backupScaleX >= 0.0 && this.scaleX < 0.0) {
this.scaleX = -this.scaleX;
this.skewY = Transform.normalizeRadian(this.skewY - Math.PI);
}
if (backupScaleY >= 0.0 && this.scaleY < 0.0) {
this.scaleY = -this.scaleY;
this.skewX = Transform.normalizeRadian(this.skewX - Math.PI);
}
return this;
};
/**
* @language zh_CN
* 转换为矩阵。
* @param 矩阵。
* @version DragonBones 3.0
*/
Transform.prototype.toMatrix = function (matrix) {
if (this.skewX !== 0.0 || this.skewY !== 0.0) {
matrix.a = Math.cos(this.skewY);
matrix.b = Math.sin(this.skewY);
var dSkew = this.skewX - this.skewY;
if (-0.01 < dSkew && dSkew < 0.01) {
matrix.c = -matrix.b;
matrix.d = matrix.a;
}
else {
matrix.c = -Math.sin(this.skewX);
matrix.d = Math.cos(this.skewX);
}
if (this.scaleX !== 1.0) {
matrix.a *= this.scaleX;
matrix.b *= this.scaleX;
}
if (this.scaleY !== 1.0) {
matrix.c *= this.scaleY;
matrix.d *= this.scaleY;
}
}
else {
matrix.a = this.scaleX;
matrix.b = 0.0;
matrix.c = 0.0;
matrix.d = this.scaleY;
}
matrix.tx = this.x;
matrix.ty = this.y;
return this;
};
Object.defineProperty(Transform.prototype, "rotation", {
/**
* @language zh_CN
* 旋转。 (以弧度为单位)
* @version DragonBones 3.0
*/
get: function () {
return this.scaleX >= 0.0 ? this.skewY : this.skewY + Math.PI;
},
set: function (value) {
var dValue = this.scaleX >= 0.0 ? (value - this.skewY) : (value - this.skewY - Math.PI);
this.skewX += dValue;
this.skewY += dValue;
},
enumerable: true,
configurable: true
});
return Transform;
}());
dragonBones.Transform = Transform;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 2D 矩阵。
* @version DragonBones 3.0
*/
var Matrix = (function () {
function Matrix(a, b, c, d, tx, ty) {
if (a === void 0) { a = 1.0; }
if (b === void 0) { b = 0.0; }
if (c === void 0) { c = 0.0; }
if (d === void 0) { d = 1.0; }
if (tx === void 0) { tx = 0.0; }
if (ty === void 0) { ty = 0.0; }
this.a = a;
this.b = b;
this.c = c;
this.d = d;
this.tx = tx;
this.ty = ty;
}
/**
* @private
*/
Matrix.prototype.toString = function () {
return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty;
};
/**
* @language zh_CN
* 复制矩阵。
* @param value 需要复制的矩阵。
* @version DragonBones 3.0
*/
Matrix.prototype.copyFrom = function (value) {
this.a = value.a;
this.b = value.b;
this.c = value.c;
this.d = value.d;
this.tx = value.tx;
this.ty = value.ty;
return this;
};
/**
* @private
*/
Matrix.prototype.copyFromArray = function (value, offset) {
if (offset === void 0) { offset = 0; }
this.a = value[offset];
this.b = value[offset + 1];
this.c = value[offset + 2];
this.d = value[offset + 3];
this.tx = value[offset + 4];
this.ty = value[offset + 5];
return this;
};
/**
* @language zh_CN
* 转换为恒等矩阵。
* @version DragonBones 3.0
*/
Matrix.prototype.identity = function () {
this.a = this.d = 1.0;
this.b = this.c = 0.0;
this.tx = this.ty = 0.0;
return this;
};
/**
* @language zh_CN
* 将当前矩阵与另一个矩阵相乘。
* @param value 需要相乘的矩阵。
* @version DragonBones 3.0
*/
Matrix.prototype.concat = function (value) {
var aA = this.a * value.a;
var bA = 0.0;
var cA = 0.0;
var dA = this.d * value.d;
var txA = this.tx * value.a + value.tx;
var tyA = this.ty * value.d + value.ty;
if (this.b !== 0.0 || this.c !== 0.0) {
aA += this.b * value.c;
bA += this.b * value.d;
cA += this.c * value.a;
dA += this.c * value.b;
}
if (value.b !== 0.0 || value.c !== 0.0) {
bA += this.a * value.b;
cA += this.d * value.c;
txA += this.ty * value.c;
tyA += this.tx * value.b;
}
this.a = aA;
this.b = bA;
this.c = cA;
this.d = dA;
this.tx = txA;
this.ty = tyA;
return this;
};
/**
* @language zh_CN
* 转换为逆矩阵。
* @version DragonBones 3.0
*/
Matrix.prototype.invert = function () {
var aA = this.a;
var bA = this.b;
var cA = this.c;
var dA = this.d;
var txA = this.tx;
var tyA = this.ty;
if (bA === 0.0 && cA === 0.0) {
this.b = this.c = 0.0;
if (aA === 0.0 || dA === 0.0) {
this.a = this.b = this.tx = this.ty = 0.0;
}
else {
aA = this.a = 1.0 / aA;
dA = this.d = 1.0 / dA;
this.tx = -aA * txA;
this.ty = -dA * tyA;
}
return this;
}
var determinant = aA * dA - bA * cA;
if (determinant === 0.0) {
this.a = this.d = 1.0;
this.b = this.c = 0.0;
this.tx = this.ty = 0.0;
return this;
}
determinant = 1.0 / determinant;
var k = this.a = dA * determinant;
bA = this.b = -bA * determinant;
cA = this.c = -cA * determinant;
dA = this.d = aA * determinant;
this.tx = -(k * txA + cA * tyA);
this.ty = -(bA * txA + dA * tyA);
return this;
};
/**
* @language zh_CN
* 将矩阵转换应用于指定点。
* @param x 横坐标。
* @param y 纵坐标。
* @param result 应用转换之后的坐标。
* @params delta 是否忽略 txty 对坐标的转换。
* @version DragonBones 3.0
*/
Matrix.prototype.transformPoint = function (x, y, result, delta) {
if (delta === void 0) { delta = false; }
result.x = this.a * x + this.c * y;
result.y = this.b * x + this.d * y;
if (!delta) {
result.x += this.tx;
result.y += this.ty;
}
};
return Matrix;
}());
dragonBones.Matrix = Matrix;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @private
*/
var ColorTransform = (function () {
function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) {
if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; }
if (redMultiplier === void 0) { redMultiplier = 1.0; }
if (greenMultiplier === void 0) { greenMultiplier = 1.0; }
if (blueMultiplier === void 0) { blueMultiplier = 1.0; }
if (alphaOffset === void 0) { alphaOffset = 0; }
if (redOffset === void 0) { redOffset = 0; }
if (greenOffset === void 0) { greenOffset = 0; }
if (blueOffset === void 0) { blueOffset = 0; }
this.alphaMultiplier = alphaMultiplier;
this.redMultiplier = redMultiplier;
this.greenMultiplier = greenMultiplier;
this.blueMultiplier = blueMultiplier;
this.alphaOffset = alphaOffset;
this.redOffset = redOffset;
this.greenOffset = greenOffset;
this.blueOffset = blueOffset;
}
ColorTransform.prototype.copyFrom = function (value) {
this.alphaMultiplier = value.alphaMultiplier;
this.redMultiplier = value.redMultiplier;
this.greenMultiplier = value.greenMultiplier;
this.blueMultiplier = value.blueMultiplier;
this.alphaOffset = value.alphaOffset;
this.redOffset = value.redOffset;
this.redOffset = value.redOffset;
this.greenOffset = value.blueOffset;
};
ColorTransform.prototype.identity = function () {
this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0;
this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0;
};
return ColorTransform;
}());
dragonBones.ColorTransform = ColorTransform;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* @beta
* 动画配置,描述播放一个动画所需要的全部信息。
* @see dragonBones.AnimationState
* @version DragonBones 5.0
*/
var AnimationConfig = (function (_super) {
__extends(AnimationConfig, _super);
/**
* @internal
* @private
*/
function AnimationConfig() {
var _this = _super.call(this) || this;
/**
* @language zh_CN
* 骨骼遮罩。
* @version DragonBones 5.0
*/
_this.boneMask = [];
/**
* @language zh_CN
* @version DragonBones 5.0
*/
_this.animationNames = [];
return _this;
}
AnimationConfig.toString = function () {
return "[class dragonBones.AnimationConfig]";
};
/**
* @private
*/
AnimationConfig.prototype._onClear = function () {
this.pauseFadeOut = true;
this.fadeOutMode = 4 /* All */;
this.fadeOutTime = -1.0;
this.fadeOutEasing = 0.0;
this.additiveBlending = false;
this.displayControl = true;
this.pauseFadeIn = true;
this.actionEnabled = true;
this.playTimes = -1;
this.layer = 0;
this.position = 0.0;
this.duration = -1.0;
this.timeScale = -100.0;
this.fadeInTime = -1.0;
this.autoFadeOutTime = -1.0;
this.fadeInEasing = 0.0;
this.weight = 1.0;
this.name = null;
this.animation = null;
this.group = null;
this.boneMask.length = 0;
this.animationNames.length = 0;
};
AnimationConfig.prototype.clear = function () {
this._onClear();
};
AnimationConfig.prototype.copyFrom = function (value) {
this.pauseFadeOut = value.pauseFadeOut;
this.fadeOutMode = value.fadeOutMode;
this.autoFadeOutTime = value.autoFadeOutTime;
this.fadeOutEasing = value.fadeOutEasing;
this.additiveBlending = value.additiveBlending;
this.displayControl = value.displayControl;
this.pauseFadeIn = value.pauseFadeIn;
this.actionEnabled = value.actionEnabled;
this.playTimes = value.playTimes;
this.layer = value.layer;
this.position = value.position;
this.duration = value.duration;
this.timeScale = value.timeScale;
this.fadeInTime = value.fadeInTime;
this.fadeOutTime = value.fadeOutTime;
this.fadeInEasing = value.fadeInEasing;
this.weight = value.weight;
this.name = value.name;
this.animation = value.animation;
this.group = value.group;
this.boneMask.length = value.boneMask.length;
for (var i = 0, l = this.boneMask.length; i < l; ++i) {
this.boneMask[i] = value.boneMask[i];
}
this.animationNames.length = value.animationNames.length;
for (var i = 0, l = this.animationNames.length; i < l; ++i) {
this.animationNames[i] = value.animationNames[i];
}
};
AnimationConfig.prototype.containsBoneMask = function (name) {
return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0;
};
AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) {
if (recursive === void 0) { recursive = true; }
var currentBone = armature.getBone(name);
if (!currentBone) {
return;
}
if (this.boneMask.indexOf(name) < 0) {
this.boneMask.push(name);
}
if (recursive) {
var bones = armature.getBones();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) {
this.boneMask.push(bone.name);
}
}
}
};
AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) {
if (recursive === void 0) { recursive = true; }
var index = this.boneMask.indexOf(name);
if (index >= 0) {
this.boneMask.splice(index, 1);
}
if (recursive) {
var currentBone = armature.getBone(name);
if (currentBone) {
var bones = armature.getBones();
if (this.boneMask.length > 0) {
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
var index_1 = this.boneMask.indexOf(bone.name);
if (index_1 >= 0 && currentBone.contains(bone)) {
this.boneMask.splice(index_1, 1);
}
}
}
else {
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (!currentBone.contains(bone)) {
this.boneMask.push(bone.name);
}
}
}
}
}
};
return AnimationConfig;
}(dragonBones.BaseObject));
dragonBones.AnimationConfig = AnimationConfig;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @private
*/
var FrameData = (function (_super) {
__extends(FrameData, _super);
function FrameData() {
return _super.call(this) || this;
}
FrameData.prototype._onClear = function () {
this.position = 0.0;
this.duration = 0.0;
this.prev = null;
this.next = null;
};
return FrameData;
}(dragonBones.BaseObject));
dragonBones.FrameData = FrameData;
/**
* @private
*/
var TweenFrameData = (function (_super) {
__extends(TweenFrameData, _super);
function TweenFrameData() {
return _super.call(this) || this;
}
TweenFrameData._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) {
var l_t = 1 - t;
var powA = l_t * l_t;
var powB = t * t;
var kA = l_t * powA;
var kB = 3.0 * t * powA;
var kC = 3.0 * l_t * powB;
var kD = t * powB;
result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4;
result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4;
};
TweenFrameData.samplingEasingCurve = function (curve, samples) {
var curveCount = curve.length;
var result = new dragonBones.Point();
var stepIndex = -2;
for (var i = 0, l = samples.length; i < l; ++i) {
var t = (i + 1) / (l + 1);
while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) {
stepIndex += 6;
}
var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount;
var x1 = isInCurve ? curve[stepIndex] : 0.0;
var y1 = isInCurve ? curve[stepIndex + 1] : 0.0;
var x2 = curve[stepIndex + 2];
var y2 = curve[stepIndex + 3];
var x3 = curve[stepIndex + 4];
var y3 = curve[stepIndex + 5];
var x4 = isInCurve ? curve[stepIndex + 6] : 1.0;
var y4 = isInCurve ? curve[stepIndex + 7] : 1.0;
var lower = 0.0;
var higher = 1.0;
while (higher - lower > 0.01) {
var percentage = (higher + lower) / 2.0;
TweenFrameData._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, result);
if (t - result.x > 0.0) {
lower = percentage;
}
else {
higher = percentage;
}
}
samples[i] = result.y;
}
};
TweenFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.tweenEasing = 0.0;
this.curve = null;
};
return TweenFrameData;
}(FrameData));
dragonBones.TweenFrameData = TweenFrameData;
/**
* @private
*/
var AnimationFrameData = (function (_super) {
__extends(AnimationFrameData, _super);
function AnimationFrameData() {
var _this = _super.call(this) || this;
_this.actions = [];
_this.events = [];
return _this;
}
AnimationFrameData.toString = function () {
return "[class dragonBones.AnimationFrameData]";
};
AnimationFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
for (var i = 0, l = this.actions.length; i < l; ++i) {
this.actions[i].returnToPool();
}
for (var i = 0, l = this.events.length; i < l; ++i) {
this.events[i].returnToPool();
}
this.actions.length = 0;
this.events.length = 0;
};
return AnimationFrameData;
}(FrameData));
dragonBones.AnimationFrameData = AnimationFrameData;
/**
* @private
*/
var ZOrderFrameData = (function (_super) {
__extends(ZOrderFrameData, _super);
function ZOrderFrameData() {
var _this = _super.call(this) || this;
_this.zOrder = [];
return _this;
}
ZOrderFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.zOrder.length = 0;
};
return ZOrderFrameData;
}(FrameData));
dragonBones.ZOrderFrameData = ZOrderFrameData;
/**
* @private
*/
var BoneFrameData = (function (_super) {
__extends(BoneFrameData, _super);
function BoneFrameData() {
var _this = _super.call(this) || this;
_this.transform = new dragonBones.Transform();
return _this;
}
BoneFrameData.toString = function () {
return "[class dragonBones.BoneFrameData]";
};
BoneFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.tweenScale = false;
this.tweenRotate = 0.0;
this.transform.identity();
};
return BoneFrameData;
}(TweenFrameData));
dragonBones.BoneFrameData = BoneFrameData;
/**
* @private
*/
var SlotFrameData = (function (_super) {
__extends(SlotFrameData, _super);
function SlotFrameData() {
return _super.call(this) || this;
}
SlotFrameData.generateColor = function () {
return new dragonBones.ColorTransform();
};
SlotFrameData.toString = function () {
return "[class dragonBones.SlotFrameData]";
};
SlotFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.displayIndex = 0;
this.color = null;
};
return SlotFrameData;
}(TweenFrameData));
SlotFrameData.DEFAULT_COLOR = new dragonBones.ColorTransform();
dragonBones.SlotFrameData = SlotFrameData;
/**
* @private
*/
var ExtensionFrameData = (function (_super) {
__extends(ExtensionFrameData, _super);
function ExtensionFrameData() {
var _this = _super.call(this) || this;
_this.tweens = [];
return _this;
}
ExtensionFrameData.toString = function () {
return "[class dragonBones.ExtensionFrameData]";
};
ExtensionFrameData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.tweens.length = 0;
};
return ExtensionFrameData;
}(TweenFrameData));
dragonBones.ExtensionFrameData = ExtensionFrameData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @private
*/
var TimelineData = (function (_super) {
__extends(TimelineData, _super);
/**
* @private
*/
function TimelineData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.frames = [];
return _this;
}
/**
* @private
*/
TimelineData.toString = function () {
return "[class dragonBones.TimelineData]";
};
/**
* @private
*/
TimelineData.prototype._onClear = function () {
var prevFrame = null;
for (var i = 0, l = this.frames.length; i < l; ++i) {
var frame = this.frames[i];
if (prevFrame && frame !== prevFrame) {
prevFrame.returnToPool();
}
prevFrame = frame;
}
this.scale = 1;
this.offset = 0;
this.frames.length = 0;
};
return TimelineData;
}(dragonBones.BaseObject));
dragonBones.TimelineData = TimelineData;
/**
* @private
*/
var ZOrderTimelineData = (function (_super) {
__extends(ZOrderTimelineData, _super);
function ZOrderTimelineData() {
return _super !== null && _super.apply(this, arguments) || this;
}
ZOrderTimelineData.toString = function () {
return "[class dragonBones.ZOrderTimelineData]";
};
return ZOrderTimelineData;
}(TimelineData));
dragonBones.ZOrderTimelineData = ZOrderTimelineData;
/**
* @private
*/
var BoneTimelineData = (function (_super) {
__extends(BoneTimelineData, _super);
function BoneTimelineData() {
var _this = _super.call(this) || this;
_this.originalTransform = new dragonBones.Transform();
return _this;
}
BoneTimelineData.toString = function () {
return "[class dragonBones.BoneTimelineData]";
};
BoneTimelineData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.originalTransform.identity();
this.bone = null;
};
return BoneTimelineData;
}(TimelineData));
dragonBones.BoneTimelineData = BoneTimelineData;
/**
* @private
*/
var SlotTimelineData = (function (_super) {
__extends(SlotTimelineData, _super);
function SlotTimelineData() {
return _super.call(this) || this;
}
SlotTimelineData.toString = function () {
return "[class dragonBones.SlotTimelineData]";
};
SlotTimelineData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.slot = null;
};
return SlotTimelineData;
}(TimelineData));
dragonBones.SlotTimelineData = SlotTimelineData;
/**
* @private
*/
var FFDTimelineData = (function (_super) {
__extends(FFDTimelineData, _super);
function FFDTimelineData() {
return _super.call(this) || this;
}
FFDTimelineData.toString = function () {
return "[class dragonBones.FFDTimelineData]";
};
FFDTimelineData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.skin = null;
this.slot = null;
this.display = null;
};
return FFDTimelineData;
}(TimelineData));
dragonBones.FFDTimelineData = FFDTimelineData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 动画数据。
* @version DragonBones 3.0
*/
var AnimationData = (function (_super) {
__extends(AnimationData, _super);
/**
* @internal
* @private
*/
function AnimationData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.boneTimelines = {};
/**
* @private
*/
_this.slotTimelines = {};
/**
* @private
*/
_this.ffdTimelines = {}; // skin slot mesh
/**
* @private
*/
_this.cachedFrames = [];
/**
* @private
*/
_this.boneCachedFrameIndices = {};
/**
* @private
*/
_this.slotCachedFrameIndices = {};
return _this;
}
/**
* @private
*/
AnimationData.toString = function () {
return "[class dragonBones.AnimationData]";
};
/**
* @private
*/
AnimationData.prototype._onClear = function () {
_super.prototype._onClear.call(this);
for (var k in this.boneTimelines) {
this.boneTimelines[k].returnToPool();
delete this.boneTimelines[k];
}
for (var k in this.slotTimelines) {
this.slotTimelines[k].returnToPool();
delete this.slotTimelines[k];
}
for (var k in this.ffdTimelines) {
for (var kA in this.ffdTimelines[k]) {
for (var kB in this.ffdTimelines[k][kA]) {
this.ffdTimelines[k][kA][kB].returnToPool();
}
}
delete this.ffdTimelines[k];
}
for (var k in this.boneCachedFrameIndices) {
// this.boneCachedFrameIndices[i].length = 0;
delete this.boneCachedFrameIndices[k];
}
for (var k in this.slotCachedFrameIndices) {
// this.slotCachedFrameIndices[i].length = 0;
delete this.slotCachedFrameIndices[k];
}
if (this.zOrderTimeline) {
this.zOrderTimeline.returnToPool();
}
this.frameCount = 0;
this.playTimes = 0;
this.duration = 0.0;
this.fadeInTime = 0.0;
this.cacheFrameRate = 0.0;
this.name = null;
//this.boneTimelines.clear();
//this.slotTimelines.clear();
//this.ffdTimelines.clear();
this.cachedFrames.length = 0;
//this.boneCachedFrameIndices.clear();
//this.boneCachedFrameIndices.clear();
this.zOrderTimeline = null;
};
/**
* @private
*/
AnimationData.prototype.cacheFrames = function (frameRate) {
if (this.cacheFrameRate > 0.0) {
return;
}
this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0);
var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // uint
this.cachedFrames.length = 0;
this.cachedFrames.length = cacheFrameCount;
for (var k in this.boneTimelines) {
var indices = new Array(cacheFrameCount);
for (var i = 0, l = indices.length; i < l; ++i) {
indices[i] = -1;
}
this.boneCachedFrameIndices[k] = indices;
}
for (var k in this.slotTimelines) {
var indices = new Array(cacheFrameCount);
for (var i = 0, l = indices.length; i < l; ++i) {
indices[i] = -1;
}
this.slotCachedFrameIndices[k] = indices;
}
};
/**
* @private
*/
AnimationData.prototype.addBoneTimeline = function (value) {
if (value && value.bone && !this.boneTimelines[value.bone.name]) {
this.boneTimelines[value.bone.name] = value;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
AnimationData.prototype.addSlotTimeline = function (value) {
if (value && value.slot && !this.slotTimelines[value.slot.name]) {
this.slotTimelines[value.slot.name] = value;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
AnimationData.prototype.addFFDTimeline = function (value) {
if (value && value.skin && value.slot && value.display) {
var skin = this.ffdTimelines[value.skin.name] = this.ffdTimelines[value.skin.name] || {};
var slot = skin[value.slot.slot.name] = skin[value.slot.slot.name] || {};
if (!slot[value.display.name]) {
slot[value.display.name] = value;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
AnimationData.prototype.getBoneTimeline = function (name) {
return this.boneTimelines[name];
};
/**
* @private
*/
AnimationData.prototype.getSlotTimeline = function (name) {
return this.slotTimelines[name];
};
/**
* @private
*/
AnimationData.prototype.getFFDTimeline = function (skinName, slotName) {
var skin = this.ffdTimelines[skinName];
if (skin) {
return skin[slotName];
}
return null;
};
/**
* @private
*/
AnimationData.prototype.getBoneCachedFrameIndices = function (name) {
return this.boneCachedFrameIndices[name];
};
/**
* @private
*/
AnimationData.prototype.getSlotCachedFrameIndices = function (name) {
return this.slotCachedFrameIndices[name];
};
return AnimationData;
}(dragonBones.TimelineData));
dragonBones.AnimationData = AnimationData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 骨架数据。
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
var ArmatureData = (function (_super) {
__extends(ArmatureData, _super);
/**
* @internal
* @private
*/
function ArmatureData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.aabb = new dragonBones.Rectangle();
/**
* @language zh_CN
* 所有骨骼数据。
* @see dragonBones.BoneData
* @version DragonBones 3.0
*/
_this.bones = {};
/**
* @language zh_CN
* 所有插槽数据。
* @see dragonBones.SlotData
* @version DragonBones 3.0
*/
_this.slots = {};
/**
* @private
*/
_this.skins = {};
/**
* @language zh_CN
* 所有动画数据。
* @see dragonBones.AnimationData
* @version DragonBones 3.0
*/
_this.animations = {};
/**
* @private
*/
_this.actions = [];
_this._animationNames = [];
_this._sortedBones = [];
_this._sortedSlots = [];
_this._bonesChildren = {};
return _this;
}
/**
* @private
*/
ArmatureData.toString = function () {
return "[class dragonBones.ArmatureData]";
};
ArmatureData._onSortSlots = function (a, b) {
return a.zOrder > b.zOrder ? 1 : -1;
};
/**
* @private
*/
ArmatureData.prototype._onClear = function () {
for (var k in this.bones) {
this.bones[k].returnToPool();
delete this.bones[k];
}
for (var k in this.slots) {
this.slots[k].returnToPool();
delete this.slots[k];
}
for (var k in this.skins) {
this.skins[k].returnToPool();
delete this.skins[k];
}
for (var k in this.animations) {
this.animations[k].returnToPool();
delete this.animations[k];
}
for (var i = 0, l = this.actions.length; i < l; ++i) {
this.actions[i].returnToPool();
}
for (var k in this._bonesChildren) {
delete this._bonesChildren[k];
}
if (this.userData) {
this.userData.returnToPool();
}
this.isRightTransform = false;
this.frameRate = 0;
this.type = -1 /* None */;
this.cacheFrameRate = 0;
this.scale = 1.0;
this.name = null;
this.aabb.clear();
//this.bones.clear();
//this.slots.clear();
//this.skins.clear();
//this.animations.clear();
this.actions.length = 0;
this.parent = null;
this.userData = null;
this._boneDirty = false;
this._slotDirty = false;
this._animationNames.length = 0;
this._sortedBones.length = 0;
this._sortedSlots.length = 0;
this._defaultSkin = null;
this._defaultAnimation = null;
};
ArmatureData.prototype._sortBones = function () {
var total = this._sortedBones.length;
if (total < 1) {
return;
}
var sortHelper = this._sortedBones.concat();
var index = 0;
var count = 0;
this._sortedBones.length = 0;
while (count < total) {
var bone = sortHelper[index++];
if (index >= total) {
index = 0;
}
if (this._sortedBones.indexOf(bone) >= 0) {
continue;
}
if (bone.parent && this._sortedBones.indexOf(bone.parent) < 0) {
continue;
}
if (bone.ik && this._sortedBones.indexOf(bone.ik) < 0) {
continue;
}
if (bone.ik && bone.chain > 0 && bone.chainIndex === bone.chain) {
this._sortedBones.splice(this._sortedBones.indexOf(bone.parent) + 1, 0, bone);
}
else {
this._sortedBones.push(bone);
}
count++;
}
};
ArmatureData.prototype._sortSlots = function () {
this._sortedSlots.sort(ArmatureData._onSortSlots);
};
/**
* @private
*/
ArmatureData.prototype.cacheFrames = function (frameRate) {
if (this.cacheFrameRate > 0) {
return;
}
this.cacheFrameRate = frameRate;
for (var k in this.animations) {
this.animations[k].cacheFrames(this.cacheFrameRate);
}
};
/**
* @private
*/
ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform, arrayOffset) {
if (arrayOffset === void 0) { arrayOffset = -1; }
var dataArray = this.parent.cachedFrames;
if (arrayOffset < 0) {
arrayOffset = dataArray.length;
}
dataArray.length += 10;
dataArray[arrayOffset] = globalTransformMatrix.a;
dataArray[arrayOffset + 1] = globalTransformMatrix.b;
dataArray[arrayOffset + 2] = globalTransformMatrix.c;
dataArray[arrayOffset + 3] = globalTransformMatrix.d;
dataArray[arrayOffset + 4] = globalTransformMatrix.tx;
dataArray[arrayOffset + 5] = globalTransformMatrix.ty;
dataArray[arrayOffset + 6] = transform.skewX;
dataArray[arrayOffset + 7] = transform.skewY;
dataArray[arrayOffset + 8] = transform.scaleX;
dataArray[arrayOffset + 9] = transform.scaleY;
return arrayOffset;
};
/**
* @private
*/
ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) {
var dataArray = this.parent.cachedFrames;
globalTransformMatrix.a = dataArray[arrayOffset];
globalTransformMatrix.b = dataArray[arrayOffset + 1];
globalTransformMatrix.c = dataArray[arrayOffset + 2];
globalTransformMatrix.d = dataArray[arrayOffset + 3];
globalTransformMatrix.tx = dataArray[arrayOffset + 4];
globalTransformMatrix.ty = dataArray[arrayOffset + 5];
transform.skewX = dataArray[arrayOffset + 6];
transform.skewY = dataArray[arrayOffset + 7];
transform.scaleX = dataArray[arrayOffset + 8];
transform.scaleY = dataArray[arrayOffset + 9];
transform.x = globalTransformMatrix.tx;
transform.y = globalTransformMatrix.ty;
};
/**
* @private
*/
ArmatureData.prototype.addBone = function (value, parentName) {
if (value && value.name && !this.bones[value.name]) {
if (parentName) {
var parent_1 = this.getBone(parentName);
if (parent_1) {
value.parent = parent_1;
}
else {
(this._bonesChildren[parentName] = this._bonesChildren[parentName] || []).push(value);
}
}
var children = this._bonesChildren[value.name];
if (children) {
for (var i = 0, l = children.length; i < l; ++i) {
children[i].parent = value;
}
delete this._bonesChildren[value.name];
}
this.bones[value.name] = value;
this._sortedBones.push(value);
this._boneDirty = true;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
ArmatureData.prototype.addSlot = function (value) {
if (value && value.name && !this.slots[value.name]) {
this.slots[value.name] = value;
this._sortedSlots.push(value);
this._slotDirty = true;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
ArmatureData.prototype.addSkin = function (value) {
if (value && value.name && !this.skins[value.name]) {
this.skins[value.name] = value;
if (!this._defaultSkin) {
this._defaultSkin = value;
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
ArmatureData.prototype.addAnimation = function (value) {
if (value && value.name && !this.animations[value.name]) {
this.animations[value.name] = value;
this._animationNames.push(value.name);
if (!this._defaultAnimation) {
this._defaultAnimation = value;
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @language zh_CN
* 获取骨骼数据。
* @param name 骨骼数据名称。
* @see dragonBones.BoneData
* @version DragonBones 3.0
*/
ArmatureData.prototype.getBone = function (name) {
return this.bones[name];
};
/**
* @language zh_CN
* 获取插槽数据。
* @param name 插槽数据名称。
* @see dragonBones.SlotData
* @version DragonBones 3.0
*/
ArmatureData.prototype.getSlot = function (name) {
return this.slots[name];
};
/**
* @private
*/
ArmatureData.prototype.getSkin = function (name) {
return name ? this.skins[name] : this._defaultSkin;
};
/**
* @language zh_CN
* 获取动画数据。
* @param name 动画数据名称。
* @see dragonBones.AnimationData
* @version DragonBones 3.0
*/
ArmatureData.prototype.getAnimation = function (name) {
return name ? this.animations[name] : this._defaultAnimation;
};
Object.defineProperty(ArmatureData.prototype, "animationNames", {
/**
* @language zh_CN
* 所有动画数据名称。
* @see #armatures
* @version DragonBones 3.0
*/
get: function () {
return this._animationNames;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ArmatureData.prototype, "sortedBones", {
/**
* @private
*/
get: function () {
if (this._boneDirty) {
this._boneDirty = false;
this._sortBones();
}
return this._sortedBones;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ArmatureData.prototype, "sortedSlots", {
/**
* @private
*/
get: function () {
if (this._slotDirty) {
this._slotDirty = false;
this._sortSlots();
}
return this._sortedSlots;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ArmatureData.prototype, "defaultSkin", {
/**
* @private
*/
get: function () {
return this._defaultSkin;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ArmatureData.prototype, "defaultAnimation", {
/**
* @language zh_CN
* 获取默认动画数据。
* @see dragonBones.AnimationData
* @version DragonBones 4.5
*/
get: function () {
return this._defaultAnimation;
},
enumerable: true,
configurable: true
});
return ArmatureData;
}(dragonBones.BaseObject));
dragonBones.ArmatureData = ArmatureData;
/**
* @language zh_CN
* 骨骼数据。
* @see dragonBones.Bone
* @version DragonBones 3.0
*/
var BoneData = (function (_super) {
__extends(BoneData, _super);
/**
* @internal
* @private
*/
function BoneData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.transform = new dragonBones.Transform();
return _this;
}
/**
* @private
*/
BoneData.toString = function () {
return "[class dragonBones.BoneData]";
};
/**
* @private
*/
BoneData.prototype._onClear = function () {
if (this.userData) {
this.userData.returnToPool();
}
this.inheritTranslation = false;
this.inheritRotation = false;
this.inheritScale = false;
this.inheritReflection = false;
this.bendPositive = false;
this.chain = 0;
this.chainIndex = 0;
this.weight = 0.0;
this.length = 0.0;
this.name = null;
this.transform.identity();
this.parent = null;
this.ik = null;
this.userData = null;
};
return BoneData;
}(dragonBones.BaseObject));
dragonBones.BoneData = BoneData;
/**
* @language zh_CN
* 插槽数据。
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
var SlotData = (function (_super) {
__extends(SlotData, _super);
/**
* @internal
* @private
*/
function SlotData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.actions = [];
return _this;
}
/**
* @private
*/
SlotData.generateColor = function () {
return new dragonBones.ColorTransform();
};
/**
* @private
*/
SlotData.toString = function () {
return "[class dragonBones.SlotData]";
};
/**
* @private
*/
SlotData.prototype._onClear = function () {
for (var i = 0, l = this.actions.length; i < l; ++i) {
this.actions[i].returnToPool();
}
if (this.userData) {
this.userData.returnToPool();
}
this.displayIndex = -1;
this.zOrder = 0;
this.blendMode = -1 /* None */;
this.name = null;
this.actions.length = 0;
this.parent = null;
this.color = null;
this.userData = null;
};
return SlotData;
}(dragonBones.BaseObject));
/**
* @private
*/
SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform();
dragonBones.SlotData = SlotData;
/**
* @private
*/
var SkinData = (function (_super) {
__extends(SkinData, _super);
function SkinData() {
var _this = _super.call(this) || this;
_this.slots = {};
return _this;
}
SkinData.toString = function () {
return "[class dragonBones.SkinData]";
};
SkinData.prototype._onClear = function () {
for (var k in this.slots) {
this.slots[k].returnToPool();
delete this.slots[k];
}
this.name = null;
//this.slots.clear();
};
SkinData.prototype.addSlot = function (value) {
if (value && value.slot && !this.slots[value.slot.name]) {
this.slots[value.slot.name] = value;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
SkinData.prototype.getSlot = function (name) {
return this.slots[name];
};
return SkinData;
}(dragonBones.BaseObject));
dragonBones.SkinData = SkinData;
/**
* @private
*/
var SkinSlotData = (function (_super) {
__extends(SkinSlotData, _super);
function SkinSlotData() {
var _this = _super.call(this) || this;
_this.displays = [];
_this.meshs = {};
return _this;
}
SkinSlotData.toString = function () {
return "[class dragonBones.SkinSlotData]";
};
SkinSlotData.prototype._onClear = function () {
for (var i = 0, l = this.displays.length; i < l; ++i) {
this.displays[i].returnToPool();
}
for (var k in this.meshs) {
this.meshs[k].returnToPool();
delete this.meshs[k];
}
this.displays.length = 0;
//this.meshs.clear();
this.slot = null;
};
SkinSlotData.prototype.getDisplay = function (name) {
for (var i = 0, l = this.displays.length; i < l; ++i) {
var display = this.displays[i];
if (display.name === name) {
return display;
}
}
return null;
};
SkinSlotData.prototype.addMesh = function (value) {
if (value && value.name && !this.meshs[value.name]) {
this.meshs[value.name] = value;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
SkinSlotData.prototype.getMesh = function (name) {
return this.meshs[name];
};
return SkinSlotData;
}(dragonBones.BaseObject));
dragonBones.SkinSlotData = SkinSlotData;
/**
* @private
*/
var DisplayData = (function (_super) {
__extends(DisplayData, _super);
function DisplayData() {
var _this = _super.call(this) || this;
_this.pivot = new dragonBones.Point();
_this.transform = new dragonBones.Transform();
return _this;
}
DisplayData.toString = function () {
return "[class dragonBones.DisplayData]";
};
DisplayData.prototype._onClear = function () {
if (this.boundingBox) {
this.boundingBox.returnToPool();
}
this.isRelativePivot = false;
this.type = -1 /* None */;
this.inheritAnimation = true;
this.name = null;
this.path = null;
this.share = null;
this.pivot.clear();
this.transform.identity();
this.texture = null;
this.armature = null;
this.mesh = null;
this.boundingBox = null;
};
return DisplayData;
}(dragonBones.BaseObject));
dragonBones.DisplayData = DisplayData;
/**
* @private
*/
var MeshData = (function (_super) {
__extends(MeshData, _super);
function MeshData() {
var _this = _super.call(this) || this;
_this.slotPose = new dragonBones.Matrix();
_this.uvs = []; // vertices * 2
_this.vertices = []; // vertices * 2
_this.vertexIndices = []; // triangles * 3
_this.boneIndices = []; // vertices bones
_this.weights = []; // vertices bones
_this.boneVertices = []; // vertices bones * 2
_this.bones = []; // bones
_this.inverseBindPose = []; // bones
return _this;
}
MeshData.toString = function () {
return "[class dragonBones.MeshData]";
};
MeshData.prototype._onClear = function () {
this.skinned = false;
this.name = null;
this.slotPose.identity();
this.uvs.length = 0;
this.vertices.length = 0;
this.vertexIndices.length = 0;
this.boneIndices.length = 0;
this.weights.length = 0;
this.boneVertices.length = 0;
this.bones.length = 0;
this.inverseBindPose.length = 0;
};
return MeshData;
}(dragonBones.BaseObject));
dragonBones.MeshData = MeshData;
/**
* @language zh_CN
* 自定义包围盒数据。
* @version DragonBones 5.0
*/
var BoundingBoxData = (function (_super) {
__extends(BoundingBoxData, _super);
/**
* @internal
* @private
*/
function BoundingBoxData() {
var _this = _super.call(this) || this;
/**
* @language zh_CN
* 自定义多边形顶点。
* @version DragonBones 5.0
*/
_this.vertices = [];
return _this;
}
/**
* @private
*/
BoundingBoxData.toString = function () {
return "[class dragonBones.BoundingBoxData]";
};
/**
* Compute the bit code for a point (x, y) using the clip rectangle
*/
BoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) {
var code = 0 /* InSide */; // initialised as being inside of [[clip window]]
if (x < xMin) {
code |= 1 /* Left */;
}
else if (x > xMax) {
code |= 2 /* Right */;
}
if (y < yMin) {
code |= 4 /* Top */;
}
else if (y > yMax) {
code |= 8 /* Bottom */;
}
return code;
};
/**
* @private
*/
BoundingBoxData.segmentIntersectsRectangle = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax;
var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax;
if (inSideA && inSideB) {
return -1;
}
var intersectionCount = 0;
var outcode0 = BoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax);
var outcode1 = BoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax);
while (true) {
if (!(outcode0 | outcode1)) {
intersectionCount = 2;
break;
}
else if (outcode0 & outcode1) {
break;
}
// failed both tests, so calculate the line segment to clip
// from an outside point to an intersection with clip edge
var x = 0.0;
var y = 0.0;
var normalRadian = 0.0;
// At least one endpoint is outside the clip rectangle; pick it.
var outcodeOut = outcode0 ? outcode0 : outcode1;
// Now find the intersection point;
if (outcodeOut & 4 /* Top */) {
x = xA + (xB - xA) * (yMin - yA) / (yB - yA);
y = yMin;
if (normalRadians) {
normalRadian = -Math.PI * 0.5;
}
}
else if (outcodeOut & 8 /* Bottom */) {
x = xA + (xB - xA) * (yMax - yA) / (yB - yA);
y = yMax;
if (normalRadians) {
normalRadian = Math.PI * 0.5;
}
}
else if (outcodeOut & 2 /* Right */) {
y = yA + (yB - yA) * (xMax - xA) / (xB - xA);
x = xMax;
if (normalRadians) {
normalRadian = 0;
}
}
else if (outcodeOut & 1 /* Left */) {
y = yA + (yB - yA) * (xMin - xA) / (xB - xA);
x = xMin;
if (normalRadians) {
normalRadian = Math.PI;
}
}
// Now we move outside point to intersection point to clip
// and get ready for next pass.
if (outcodeOut === outcode0) {
xA = x;
yA = y;
outcode0 = BoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax);
if (normalRadians) {
normalRadians.x = normalRadian;
}
}
else {
xB = x;
yB = y;
outcode1 = BoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax);
if (normalRadians) {
normalRadians.y = normalRadian;
}
}
}
if (intersectionCount) {
if (inSideA) {
intersectionCount = 2; // 10
if (intersectionPointA) {
intersectionPointA.x = xB;
intersectionPointA.y = yB;
}
if (intersectionPointB) {
intersectionPointB.x = xB;
intersectionPointB.y = xB;
}
if (normalRadians) {
normalRadians.x = normalRadians.y + Math.PI;
}
}
else if (inSideB) {
intersectionCount = 1; // 01
if (intersectionPointA) {
intersectionPointA.x = xA;
intersectionPointA.y = yA;
}
if (intersectionPointB) {
intersectionPointB.x = xA;
intersectionPointB.y = yA;
}
if (normalRadians) {
normalRadians.y = normalRadians.x + Math.PI;
}
}
else {
intersectionCount = 3; // 11
if (intersectionPointA) {
intersectionPointA.x = xA;
intersectionPointA.y = yA;
}
if (intersectionPointB) {
intersectionPointB.x = xB;
intersectionPointB.y = yB;
}
}
}
return intersectionCount;
};
/**
* @private
*/
BoundingBoxData.segmentIntersectsEllipse = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
var d = widthH / heightH;
var dd = d * d;
yA *= d;
yB *= d;
var dX = xB - xA;
var dY = yB - yA;
var lAB = Math.sqrt(dX * dX + dY * dY);
var xD = dX / lAB;
var yD = dY / lAB;
var a = (xC - xA) * xD + (yC - yA) * yD;
var aa = a * a;
var ee = xA * xA + yA * yA;
var rr = widthH * widthH;
var dR = rr - ee + aa;
var intersectionCount = 0;
if (dR >= 0) {
var dT = Math.sqrt(dR);
var sA = a - dT;
var sB = a + dT;
var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1);
var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1);
var sideAB = inSideA * inSideB;
if (sideAB < 0) {
return -1;
}
else if (sideAB === 0) {
if (inSideA === -1) {
intersectionCount = 2; // 10
xB = xA + sB * xD;
yB = (yA + sB * yD) / d;
if (intersectionPointA) {
intersectionPointA.x = xB;
intersectionPointA.y = yB;
}
if (intersectionPointB) {
intersectionPointB.x = xB;
intersectionPointB.y = yB;
}
if (normalRadians) {
normalRadians.x = Math.atan2(yB / rr * dd, xB / rr);
normalRadians.y = normalRadians.x + Math.PI;
}
}
else if (inSideB === 1) {
intersectionCount = 1; // 01
xA = xA + sA * xD;
yA = (yA + sA * yD) / d;
if (intersectionPointA) {
intersectionPointA.x = xA;
intersectionPointA.y = yA;
}
if (intersectionPointB) {
intersectionPointB.x = xA;
intersectionPointB.y = yA;
}
if (normalRadians) {
normalRadians.x = Math.atan2(yA / rr * dd, xA / rr);
normalRadians.y = normalRadians.x + Math.PI;
}
}
else {
intersectionCount = 3; // 11
if (intersectionPointA) {
intersectionPointA.x = xA + sA * xD;
intersectionPointA.y = (yA + sA * yD) / d;
if (normalRadians) {
normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr);
}
}
if (intersectionPointB) {
intersectionPointB.x = xA + sB * xD;
intersectionPointB.y = (yA + sB * yD) / d;
if (normalRadians) {
normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr);
}
}
}
}
}
return intersectionCount;
};
/**
* @private
*/
BoundingBoxData.segmentIntersectsPolygon = function (xA, yA, xB, yB, vertices, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
if (xA === xB) {
xA = xB + 0.01;
}
if (yA === yB) {
yA = yB + 0.01;
}
var l = vertices.length;
var dXAB = xA - xB;
var dYAB = yA - yB;
var llAB = xA * yB - yA * xB;
var intersectionCount = 0;
var xC = vertices[l - 2];
var yC = vertices[l - 1];
var dMin = 0.0;
var dMax = 0.0;
var xMin = 0.0;
var yMin = 0.0;
var xMax = 0.0;
var yMax = 0.0;
for (var i = 0; i < l; i += 2) {
var xD = vertices[i];
var yD = vertices[i + 1];
if (xC === xD) {
xC = xD + 0.01;
}
if (yC === yD) {
yC = yD + 0.01;
}
var dXCD = xC - xD;
var dYCD = yC - yD;
var llCD = xC * yD - yC * xD;
var ll = dXAB * dYCD - dYAB * dXCD;
var x = (llAB * dXCD - dXAB * llCD) / ll;
if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) {
var y = (llAB * dYCD - dYAB * llCD) / ll;
if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) {
if (intersectionPointB) {
var d = x - xA;
if (d < 0.0) {
d = -d;
}
if (intersectionCount === 0) {
dMin = d;
dMax = d;
xMin = x;
yMin = y;
xMax = x;
yMax = y;
if (normalRadians) {
normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5;
normalRadians.y = normalRadians.x;
}
}
else {
if (d < dMin) {
dMin = d;
xMin = x;
yMin = y;
if (normalRadians) {
normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5;
}
}
if (d > dMax) {
dMax = d;
xMax = x;
yMax = y;
if (normalRadians) {
normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5;
}
}
}
intersectionCount++;
}
else {
xMin = x;
yMin = y;
xMax = x;
yMax = y;
intersectionCount++;
if (normalRadians) {
normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5;
normalRadians.y = normalRadians.x;
}
break;
}
}
}
xC = xD;
yC = yD;
}
if (intersectionCount === 1) {
if (intersectionPointA) {
intersectionPointA.x = xMin;
intersectionPointA.y = yMin;
}
if (intersectionPointB) {
intersectionPointB.x = xMin;
intersectionPointB.y = yMin;
}
if (normalRadians) {
normalRadians.y = normalRadians.x + Math.PI;
}
}
else if (intersectionCount > 1) {
intersectionCount++;
if (intersectionPointA) {
intersectionPointA.x = xMin;
intersectionPointA.y = yMin;
}
if (intersectionPointB) {
intersectionPointB.x = xMax;
intersectionPointB.y = yMax;
}
}
return intersectionCount;
};
/**
* @private
*/
BoundingBoxData.prototype._onClear = function () {
this.type = -1 /* None */;
this.color = 0x000000;
this.x = 0.0;
this.y = 0.0;
this.width = 0.0;
this.height = 0.0;
this.vertices.length = 0;
};
/**
* @language zh_CN
* 是否包含点。
* @version DragonBones 5.0
*/
BoundingBoxData.prototype.containsPoint = function (pX, pY) {
var isInSide = false;
if (this.type === 2 /* Polygon */) {
if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) {
for (var i = 0, l = this.vertices.length, iP = l - 2; i < l; i += 2) {
var yA = this.vertices[iP + 1];
var yB = this.vertices[i + 1];
if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) {
var xA = this.vertices[iP];
var xB = this.vertices[i];
if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) {
isInSide = !isInSide;
}
}
iP = i;
}
}
}
else {
var widthH = this.width * 0.5;
if (pX >= -widthH && pX <= widthH) {
var heightH = this.height * 0.5;
if (pY >= -heightH && pY <= heightH) {
if (this.type === 1 /* Ellipse */) {
pY *= widthH / heightH;
isInSide = Math.sqrt(pX * pX + pY * pY) <= widthH;
}
else {
isInSide = true;
}
}
}
}
return isInSide;
};
/**
* @language zh_CN
* 是否与线段相交。
* @version DragonBones 5.0
*/
BoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
var intersectionCount = 0;
switch (this.type) {
case 0 /* Rectangle */:
var widthH = this.width * 0.5;
var heightH = this.height * 0.5;
intersectionCount = BoundingBoxData.segmentIntersectsRectangle(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians);
break;
case 1 /* Ellipse */:
intersectionCount = BoundingBoxData.segmentIntersectsEllipse(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians);
break;
case 2 /* Polygon */:
if (BoundingBoxData.segmentIntersectsRectangle(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null) !== 0) {
intersectionCount = BoundingBoxData.segmentIntersectsPolygon(xA, yA, xB, yB, this.vertices, intersectionPointA, intersectionPointB, normalRadians);
}
break;
default:
break;
}
return intersectionCount;
};
return BoundingBoxData;
}(dragonBones.BaseObject));
dragonBones.BoundingBoxData = BoundingBoxData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 自定义数据。
* @version DragonBones 5.0
*/
var CustomData = (function (_super) {
__extends(CustomData, _super);
/**
* @internal
* @private
*/
function CustomData() {
var _this = _super.call(this) || this;
/**
* @language zh_CN
* 自定义整数。
* @version DragonBones 5.0
*/
_this.ints = [];
/**
* @language zh_CN
* 自定义浮点数。
* @version DragonBones 5.0
*/
_this.floats = [];
/**
* @language zh_CN
* 自定义字符串。
* @version DragonBones 5.0
*/
_this.strings = [];
return _this;
}
/**
* @private
*/
CustomData.toString = function () {
return "[class dragonBones.CustomData]";
};
/**
* @private
*/
CustomData.prototype._onClear = function () {
this.ints.length = 0;
this.floats.length = 0;
this.strings.length = 0;
};
/**
* @language zh_CN
* 获取自定义整数。
* @version DragonBones 5.0
*/
CustomData.prototype.getInt = function (index) {
if (index === void 0) { index = 0; }
return index >= 0 && index < this.ints.length ? this.ints[index] : 0;
};
/**
* @language zh_CN
* 获取自定义浮点数。
* @version DragonBones 5.0
*/
CustomData.prototype.getFloat = function (index) {
if (index === void 0) { index = 0; }
return index >= 0 && index < this.floats.length ? this.floats[index] : 0;
};
/**
* @language zh_CN
* 获取自定义字符串。
* @version DragonBones 5.0
*/
CustomData.prototype.getString = function (index) {
if (index === void 0) { index = 0; }
return index >= 0 && index < this.strings.length ? this.strings[index] : null;
};
return CustomData;
}(dragonBones.BaseObject));
dragonBones.CustomData = CustomData;
/**
* @private
*/
var EventData = (function (_super) {
__extends(EventData, _super);
function EventData() {
return _super.call(this) || this;
}
EventData.toString = function () {
return "[class dragonBones.EventData]";
};
EventData.prototype._onClear = function () {
if (this.data) {
this.data.returnToPool();
}
this.type = -1 /* None */;
this.name = null;
this.bone = null;
this.slot = null;
this.data = null;
};
return EventData;
}(dragonBones.BaseObject));
dragonBones.EventData = EventData;
/**
* @private
*/
var ActionData = (function (_super) {
__extends(ActionData, _super);
function ActionData() {
return _super.call(this) || this;
}
ActionData.toString = function () {
return "[class dragonBones.ActionData]";
};
ActionData.prototype._onClear = function () {
if (this.animationConfig) {
this.animationConfig.returnToPool();
}
this.type = -1 /* None */;
this.bone = null;
this.slot = null;
this.animationConfig = null;
};
return ActionData;
}(dragonBones.BaseObject));
dragonBones.ActionData = ActionData;
/**
* @language zh_CN
* 龙骨数据。
* 一个龙骨数据包含多个骨架数据。
* @see dragonBones.ArmatureData
* @version DragonBones 3.0
*/
var DragonBonesData = (function (_super) {
__extends(DragonBonesData, _super);
/**
* @internal
* @private
*/
function DragonBonesData() {
var _this = _super.call(this) || this;
/**
* @language zh_CN
* 所有骨架数据。
* @see dragonBones.ArmatureData
* @version DragonBones 3.0
*/
_this.armatures = {};
/**
* @private
*/
_this.cachedFrames = [];
_this._armatureNames = [];
return _this;
}
/**
* @private
*/
DragonBonesData.toString = function () {
return "[class dragonBones.DragonBonesData]";
};
/**
* @private
*/
DragonBonesData.prototype._onClear = function () {
if (dragonBones.DragonBones.debug) {
for (var i = 0, l = dragonBones.DragonBones._armatures.length; i < l; ++i) {
var armature = dragonBones.DragonBones._armatures[i];
if (armature.armatureData.parent === this) {
throw new Error("The DragonBonesData is being used, please make sure all armature references to the data have been deleted.");
}
}
}
for (var k in this.armatures) {
this.armatures[k].returnToPool();
delete this.armatures[k];
}
if (this.userData) {
this.userData.returnToPool();
}
this.autoSearch = false;
this.frameRate = 0;
this.version = null;
this.name = null;
//this.armatures.clear();
this.cachedFrames.length = 0;
this.userData = null;
this._armatureNames.length = 0;
};
/**
* @private
*/
DragonBonesData.prototype.addArmature = function (value) {
if (value && value.name && !this.armatures[value.name]) {
this.armatures[value.name] = value;
this._armatureNames.push(value.name);
value.parent = this;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @language zh_CN
* 获取骨架。
* @param name 骨架数据名称。
* @see dragonBones.ArmatureData
* @version DragonBones 3.0
*/
DragonBonesData.prototype.getArmature = function (name) {
return this.armatures[name];
};
Object.defineProperty(DragonBonesData.prototype, "armatureNames", {
/**
* @language zh_CN
* 所有骨架数据名称。
* @see #armatures
* @version DragonBones 3.0
*/
get: function () {
return this._armatureNames;
},
enumerable: true,
configurable: true
});
/**
* @deprecated
* @see dragonBones.BaseFactory#removeDragonBonesData()
*/
DragonBonesData.prototype.dispose = function () {
this.returnToPool();
};
return DragonBonesData;
}(dragonBones.BaseObject));
dragonBones.DragonBonesData = DragonBonesData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 贴图集数据。
* @version DragonBones 3.0
*/
var TextureAtlasData = (function (_super) {
__extends(TextureAtlasData, _super);
/**
* @internal
* @private
*/
function TextureAtlasData() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this.textures = {};
return _this;
}
/**
* @private
*/
TextureAtlasData.prototype._onClear = function () {
for (var k in this.textures) {
this.textures[k].returnToPool();
delete this.textures[k];
}
this.autoSearch = false;
this.scale = 1.0;
this.width = 0.0;
this.height = 0.0;
//this.textures.clear();
this.name = null;
this.imagePath = null;
};
/**
* @private
*/
TextureAtlasData.prototype.addTexture = function (value) {
if (value && value.name && !this.textures[value.name]) {
this.textures[value.name] = value;
value.parent = this;
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @private
*/
TextureAtlasData.prototype.getTexture = function (name) {
return this.textures[name];
};
/**
* @private
*/
TextureAtlasData.prototype.copyFrom = function (value) {
this.autoSearch = value.autoSearch;
this.scale = value.scale;
this.width = value.width;
this.height = value.height;
this.name = value.name;
this.imagePath = value.imagePath;
for (var k in this.textures) {
this.textures[k].returnToPool();
delete this.textures[k];
}
for (var k in value.textures) {
var texture = this.generateTexture();
texture.copyFrom(value.textures[k]);
this.textures[k] = texture;
}
};
return TextureAtlasData;
}(dragonBones.BaseObject));
dragonBones.TextureAtlasData = TextureAtlasData;
/**
* @private
*/
var TextureData = (function (_super) {
__extends(TextureData, _super);
function TextureData() {
var _this = _super.call(this) || this;
_this.region = new dragonBones.Rectangle();
return _this;
}
TextureData.generateRectangle = function () {
return new dragonBones.Rectangle();
};
TextureData.prototype._onClear = function () {
this.rotated = false;
this.name = null;
this.region.clear();
this.frame = null;
this.parent = null;
};
TextureData.prototype.copyFrom = function (value) {
this.rotated = value.rotated;
this.name = value.name;
if (!this.frame && value.frame) {
this.frame = TextureData.generateRectangle();
}
else if (this.frame && !value.frame) {
this.frame = null;
}
if (this.frame && value.frame) {
this.frame.copyFrom(value.frame);
}
this.parent = value.parent;
this.region.copyFrom(value.region);
};
return TextureData;
}(dragonBones.BaseObject));
dragonBones.TextureData = TextureData;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @private
*/
var DataParser = (function () {
function DataParser() {
this._isOldData = false; // For 2.x ~ 3.x
this._isGlobalTransform = false; // For 2.x ~ 3.x
this._isAutoTween = false; // For 2.x ~ 3.x
this._animationTweenEasing = 0.0; // For 2.x ~ 3.x
this._timelinePivot = new dragonBones.Point(); // For 2.x ~ 3.x
this._helpPoint = new dragonBones.Point();
this._helpTransformA = new dragonBones.Transform();
this._helpTransformB = new dragonBones.Transform();
this._helpMatrix = new dragonBones.Matrix();
this._rawBones = []; // For skinned mesh
this._data = null;
this._armature = null;
this._skin = null;
this._skinSlotData = null;
this._animation = null;
this._timeline = null;
}
DataParser._getArmatureType = function (value) {
switch (value.toLowerCase()) {
case "stage":
return 2 /* Stage */;
case "armature":
return 0 /* Armature */;
case "movieclip":
return 1 /* MovieClip */;
default:
return -1 /* None */;
}
};
DataParser._getDisplayType = function (value) {
switch (value.toLowerCase()) {
case "image":
return 0 /* Image */;
case "mesh":
return 2 /* Mesh */;
case "armature":
return 1 /* Armature */;
case "boundingbox":
return 3 /* BoundingBox */;
default:
return -1 /* None */;
}
};
DataParser._getBoundingBoxType = function (value) {
switch (value.toLowerCase()) {
case "rectangle":
return 0 /* Rectangle */;
case "ellipse":
return 1 /* Ellipse */;
case "polygon":
return 2 /* Polygon */;
default:
return -1 /* None */;
}
};
DataParser._getBlendMode = function (value) {
switch (value.toLowerCase()) {
case "normal":
return 0 /* Normal */;
case "add":
return 1 /* Add */;
case "alpha":
return 2 /* Alpha */;
case "darken":
return 3 /* Darken */;
case "difference":
return 4 /* Difference */;
case "erase":
return 5 /* Erase */;
case "hardlight":
return 6 /* HardLight */;
case "invert":
return 7 /* Invert */;
case "layer":
return 8 /* Layer */;
case "lighten":
return 9 /* Lighten */;
case "multiply":
return 10 /* Multiply */;
case "overlay":
return 11 /* Overlay */;
case "screen":
return 12 /* Screen */;
case "subtract":
return 13 /* Subtract */;
default:
return -1 /* None */;
}
};
DataParser._getActionType = function (value) {
switch (value.toLowerCase()) {
case "play":
case "gotoandplay":
return 0 /* Play */;
default:
return -1 /* None */;
}
};
DataParser.prototype._getTimelineFrameMatrix = function (animation, timeline, position, transform) {
var frameIndex = Math.floor(position * animation.frameCount / animation.duration);
if (timeline.frames.length === 1 || frameIndex >= timeline.frames.length) {
transform.copyFrom(timeline.frames[0].transform);
}
else {
var frame = timeline.frames[frameIndex];
var tweenProgress = 0.0;
if (frame.tweenEasing !== dragonBones.DragonBones.NO_TWEEN) {
tweenProgress = (position - frame.position) / frame.duration;
if (frame.tweenEasing !== 0.0) {
tweenProgress = dragonBones.TweenTimelineState._getEasingValue(tweenProgress, frame.tweenEasing);
}
}
else if (frame.curve) {
tweenProgress = (position - frame.position) / frame.duration;
tweenProgress = dragonBones.TweenTimelineState._getEasingCurveValue(tweenProgress, frame.curve);
}
var nextFrame = frame.next;
transform.x = nextFrame.transform.x - frame.transform.x;
transform.y = nextFrame.transform.y - frame.transform.y;
transform.skewX = dragonBones.Transform.normalizeRadian(nextFrame.transform.skewX - frame.transform.skewX);
transform.skewY = dragonBones.Transform.normalizeRadian(nextFrame.transform.skewY - frame.transform.skewY);
transform.scaleX = nextFrame.transform.scaleX - frame.transform.scaleX;
transform.scaleY = nextFrame.transform.scaleY - frame.transform.scaleY;
transform.x = frame.transform.x + transform.x * tweenProgress;
transform.y = frame.transform.y + transform.y * tweenProgress;
transform.skewX = frame.transform.skewX + transform.skewX * tweenProgress;
transform.skewY = frame.transform.skewY + transform.skewY * tweenProgress;
transform.scaleX = frame.transform.scaleX + transform.scaleX * tweenProgress;
transform.scaleY = frame.transform.scaleY + transform.scaleY * tweenProgress;
}
transform.add(timeline.originalTransform);
};
DataParser.prototype._globalToLocal = function (armature) {
var keyFrames = new Array();
var bones = armature.sortedBones.concat().reverse();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (bone.parent) {
bone.parent.transform.toMatrix(this._helpMatrix);
this._helpMatrix.invert();
this._helpMatrix.transformPoint(bone.transform.x, bone.transform.y, this._helpPoint);
bone.transform.x = this._helpPoint.x;
bone.transform.y = this._helpPoint.y;
bone.transform.rotation -= bone.parent.transform.rotation;
}
for (var i_1 in armature.animations) {
var animation = armature.animations[i_1];
var timeline = animation.getBoneTimeline(bone.name);
if (!timeline) {
continue;
}
var parentTimeline = bone.parent ? animation.getBoneTimeline(bone.parent.name) : null;
this._helpTransformB.copyFrom(timeline.originalTransform);
keyFrames.length = 0;
for (var i_2 = 0, l_1 = timeline.frames.length; i_2 < l_1; ++i_2) {
var frame = timeline.frames[i_2];
if (keyFrames.indexOf(frame) >= 0) {
continue;
}
keyFrames.push(frame);
if (parentTimeline) {
this._getTimelineFrameMatrix(animation, parentTimeline, frame.position, this._helpTransformA);
frame.transform.add(this._helpTransformB);
this._helpTransformA.toMatrix(this._helpMatrix);
this._helpMatrix.invert();
this._helpMatrix.transformPoint(frame.transform.x, frame.transform.y, this._helpPoint);
frame.transform.x = this._helpPoint.x;
frame.transform.y = this._helpPoint.y;
frame.transform.rotation -= this._helpTransformA.rotation;
}
else {
frame.transform.add(this._helpTransformB);
}
frame.transform.minus(bone.transform);
if (i_2 === 0) {
timeline.originalTransform.copyFrom(frame.transform);
frame.transform.identity();
}
else {
frame.transform.minus(timeline.originalTransform);
}
}
}
}
};
DataParser.prototype._mergeFrameToAnimationTimeline = function (framePostion, actions, events) {
var frameStart = Math.floor(framePostion * this._armature.frameRate); // uint()
var frames = this._animation.frames;
if (frames.length === 0) {
var startFrame = dragonBones.BaseObject.borrowObject(dragonBones.AnimationFrameData); // Add start frame.
startFrame.position = 0.0;
if (this._animation.frameCount > 1) {
frames.length = this._animation.frameCount + 1; // One more count for zero duration frame.
var endFrame = dragonBones.BaseObject.borrowObject(dragonBones.AnimationFrameData); // Add end frame to keep animation timeline has two different frames atleast.
endFrame.position = this._animation.frameCount / this._armature.frameRate;
frames[0] = startFrame;
frames[this._animation.frameCount] = endFrame;
}
}
var insertedFrame = null;
var replacedFrame = frames[frameStart];
if (replacedFrame && (frameStart === 0 || frames[frameStart - 1] === replacedFrame.prev)) {
insertedFrame = replacedFrame;
}
else {
insertedFrame = dragonBones.BaseObject.borrowObject(dragonBones.AnimationFrameData); // Create frame.
insertedFrame.position = frameStart / this._armature.frameRate;
frames[frameStart] = insertedFrame;
for (var i = frameStart + 1, l = frames.length; i < l; ++i) {
if (replacedFrame && frames[i] === replacedFrame) {
frames[i] = null;
}
}
}
if (actions) {
for (var i = 0, l = actions.length; i < l; ++i) {
insertedFrame.actions.push(actions[i]);
}
}
if (events) {
for (var i = 0, l = events.length; i < l; ++i) {
insertedFrame.events.push(events[i]);
}
}
// Modify frame link and duration.
var prevFrame = null;
var nextFrame = null;
for (var i = 0, l = frames.length; i < l; ++i) {
var currentFrame = frames[i];
if (currentFrame && nextFrame !== currentFrame) {
nextFrame = currentFrame;
if (prevFrame) {
nextFrame.prev = prevFrame;
prevFrame.next = nextFrame;
prevFrame.duration = nextFrame.position - prevFrame.position;
}
prevFrame = nextFrame;
}
else {
frames[i] = prevFrame;
}
}
nextFrame.duration = this._animation.duration - nextFrame.position;
nextFrame = frames[0];
prevFrame.next = nextFrame;
nextFrame.prev = prevFrame;
};
/**
* @deprecated
* @see dragonBones.BaseFactory#parseDragonBonesData()
*/
DataParser.parseDragonBonesData = function (rawData) {
return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData);
};
/**
* @deprecated
* @see dragonBones.BaseFactory#parsetTextureAtlasData()
*/
DataParser.parseTextureAtlasData = function (rawData, scale) {
if (scale === void 0) { scale = 1; }
var textureAtlasData = {};
var subTextureList = rawData[DataParser.SUB_TEXTURE];
for (var i = 0, len = subTextureList.length; i < len; i++) {
var subTextureObject = subTextureList[i];
var subTextureName = subTextureObject[DataParser.NAME];
var subTextureRegion = new dragonBones.Rectangle();
var subTextureFrame = null;
subTextureRegion.x = subTextureObject[DataParser.X] / scale;
subTextureRegion.y = subTextureObject[DataParser.Y] / scale;
subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale;
subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale;
if (DataParser.FRAME_WIDTH in subTextureObject) {
subTextureFrame = new dragonBones.Rectangle();
subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale;
subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale;
subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale;
subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale;
}
textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false };
}
return textureAtlasData;
};
return DataParser;
}());
DataParser.DATA_VERSION_2_3 = "2.3";
DataParser.DATA_VERSION_3_0 = "3.0";
DataParser.DATA_VERSION_4_0 = "4.0";
DataParser.DATA_VERSION_4_5 = "4.5";
DataParser.DATA_VERSION_5_0 = "5.0";
DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0;
DataParser.DATA_VERSIONS = [
DataParser.DATA_VERSION_5_0,
DataParser.DATA_VERSION_4_5,
DataParser.DATA_VERSION_4_0,
DataParser.DATA_VERSION_3_0,
DataParser.DATA_VERSION_2_3
];
DataParser.TEXTURE_ATLAS = "TextureAtlas";
DataParser.SUB_TEXTURE = "SubTexture";
DataParser.FORMAT = "format";
DataParser.IMAGE_PATH = "imagePath";
DataParser.WIDTH = "width";
DataParser.HEIGHT = "height";
DataParser.ROTATED = "rotated";
DataParser.FRAME_X = "frameX";
DataParser.FRAME_Y = "frameY";
DataParser.FRAME_WIDTH = "frameWidth";
DataParser.FRAME_HEIGHT = "frameHeight";
DataParser.DRADON_BONES = "dragonBones";
DataParser.ARMATURE = "armature";
DataParser.BONE = "bone";
DataParser.IK = "ik";
DataParser.SLOT = "slot";
DataParser.SKIN = "skin";
DataParser.DISPLAY = "display";
DataParser.ANIMATION = "animation";
DataParser.Z_ORDER = "zOrder";
DataParser.FFD = "ffd";
DataParser.FRAME = "frame";
DataParser.ACTIONS = "actions";
DataParser.EVENTS = "events";
DataParser.INTS = "ints";
DataParser.FLOATS = "floats";
DataParser.STRINGS = "strings";
DataParser.PIVOT = "pivot";
DataParser.TRANSFORM = "transform";
DataParser.AABB = "aabb";
DataParser.COLOR = "color";
DataParser.VERSION = "version";
DataParser.COMPATIBLE_VERSION = "compatibleVersion";
DataParser.FRAME_RATE = "frameRate";
DataParser.TYPE = "type";
DataParser.SUB_TYPE = "subType";
DataParser.NAME = "name";
DataParser.PARENT = "parent";
DataParser.TARGET = "target";
DataParser.SHARE = "share";
DataParser.PATH = "path";
DataParser.LENGTH = "length";
DataParser.DISPLAY_INDEX = "displayIndex";
DataParser.BLEND_MODE = "blendMode";
DataParser.INHERIT_TRANSLATION = "inheritTranslation";
DataParser.INHERIT_ROTATION = "inheritRotation";
DataParser.INHERIT_SCALE = "inheritScale";
DataParser.INHERIT_REFLECTION = "inheritReflection";
DataParser.INHERIT_ANIMATION = "inheritAnimation";
DataParser.INHERIT_FFD = "inheritFFD";
DataParser.BEND_POSITIVE = "bendPositive";
DataParser.CHAIN = "chain";
DataParser.WEIGHT = "weight";
DataParser.FADE_IN_TIME = "fadeInTime";
DataParser.PLAY_TIMES = "playTimes";
DataParser.SCALE = "scale";
DataParser.OFFSET = "offset";
DataParser.POSITION = "position";
DataParser.DURATION = "duration";
DataParser.TWEEN_TYPE = "tweenType";
DataParser.TWEEN_EASING = "tweenEasing";
DataParser.TWEEN_ROTATE = "tweenRotate";
DataParser.TWEEN_SCALE = "tweenScale";
DataParser.CURVE = "curve";
DataParser.EVENT = "event";
DataParser.SOUND = "sound";
DataParser.ACTION = "action";
DataParser.DEFAULT_ACTIONS = "defaultActions";
DataParser.X = "x";
DataParser.Y = "y";
DataParser.SKEW_X = "skX";
DataParser.SKEW_Y = "skY";
DataParser.SCALE_X = "scX";
DataParser.SCALE_Y = "scY";
DataParser.ALPHA_OFFSET = "aO";
DataParser.RED_OFFSET = "rO";
DataParser.GREEN_OFFSET = "gO";
DataParser.BLUE_OFFSET = "bO";
DataParser.ALPHA_MULTIPLIER = "aM";
DataParser.RED_MULTIPLIER = "rM";
DataParser.GREEN_MULTIPLIER = "gM";
DataParser.BLUE_MULTIPLIER = "bM";
DataParser.UVS = "uvs";
DataParser.VERTICES = "vertices";
DataParser.TRIANGLES = "triangles";
DataParser.WEIGHTS = "weights";
DataParser.SLOT_POSE = "slotPose";
DataParser.BONE_POSE = "bonePose";
DataParser.COLOR_TRANSFORM = "colorTransform";
DataParser.TIMELINE = "timeline";
DataParser.IS_GLOBAL = "isGlobal";
DataParser.PIVOT_X = "pX";
DataParser.PIVOT_Y = "pY";
DataParser.Z = "z";
DataParser.LOOP = "loop";
DataParser.AUTO_TWEEN = "autoTween";
DataParser.HIDE = "hide";
DataParser.DEFAULT_NAME = "__default";
dragonBones.DataParser = DataParser;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @private
*/
var ObjectDataParser = (function (_super) {
__extends(ObjectDataParser, _super);
/**
* @private
*/
function ObjectDataParser() {
return _super.call(this) || this;
}
/**
* @private
*/
ObjectDataParser._getBoolean = function (rawData, key, defaultValue) {
if (key in rawData) {
var value = rawData[key];
var valueType = typeof value;
if (valueType === "boolean") {
return value;
}
else if (valueType === "string") {
switch (value) {
case "0":
case "NaN":
case "":
case "false":
case "null":
case "undefined":
return false;
default:
return true;
}
}
else {
return !!value;
}
}
return defaultValue;
};
/**
* @private
*/
ObjectDataParser._getNumber = function (rawData, key, defaultValue) {
if (key in rawData) {
var value = rawData[key];
if (value == null || value === "NaN") {
return defaultValue;
}
return +value || 0;
}
return defaultValue;
};
/**
* @private
*/
ObjectDataParser._getString = function (rawData, key, defaultValue) {
if (key in rawData) {
return String(rawData[key]);
}
return defaultValue;
};
/**
* @private
*/
ObjectDataParser.prototype._parseArmature = function (rawData, scale) {
var armature = dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData);
armature.isRightTransform = ObjectDataParser.DATA_VERSIONS.indexOf(this._data.version) > ObjectDataParser.DATA_VERSIONS.indexOf(ObjectDataParser.DATA_VERSION_4_5);
armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate);
armature.scale = scale;
if (armature.frameRate === 0) {
armature.frameRate = 24;
}
if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") {
armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]);
}
else {
armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */);
}
this._armature = armature;
this._rawBones.length = 0;
if (ObjectDataParser.AABB in rawData) {
var rawAABB = rawData[ObjectDataParser.AABB];
armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0);
armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0);
armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0);
armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0);
}
if (ObjectDataParser.BONE in rawData) {
var rawBones = rawData[ObjectDataParser.BONE];
for (var i = 0, l = rawBones.length; i < l; ++i) {
var rawBone = rawBones[i];
var bone = this._parseBone(rawBone);
armature.addBone(bone, ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, null));
this._rawBones.push(bone);
}
}
if (ObjectDataParser.IK in rawData) {
var rawIKS = rawData[ObjectDataParser.IK];
for (var i = 0, l = rawIKS.length; i < l; ++i) {
this._parseIK(rawIKS[i]);
}
}
if (ObjectDataParser.SLOT in rawData) {
var rawSlots = rawData[ObjectDataParser.SLOT];
var zOrder = 0;
for (var i = 0, l = rawSlots.length; i < l; ++i) {
armature.addSlot(this._parseSlot(rawSlots[i], zOrder++));
}
}
if (ObjectDataParser.SKIN in rawData) {
var rawSkins = rawData[ObjectDataParser.SKIN];
for (var i = 0, l = rawSkins.length; i < l; ++i) {
armature.addSkin(this._parseSkin(rawSkins[i]));
}
}
if (ObjectDataParser.ANIMATION in rawData) {
var rawAnimations = rawData[ObjectDataParser.ANIMATION];
for (var i = 0, l = rawAnimations.length; i < l; ++i) {
armature.addAnimation(this._parseAnimation(rawAnimations[i]));
}
}
if ((ObjectDataParser.ACTIONS in rawData) ||
(ObjectDataParser.DEFAULT_ACTIONS in rawData)) {
this._parseActionData(rawData, armature.actions, null, null);
}
if (this._isOldData && this._isGlobalTransform) {
this._globalToLocal(armature);
}
this._armature = null;
this._rawBones.length = 0;
return armature;
};
/**
* @private
*/
ObjectDataParser.prototype._parseBone = function (rawData) {
var bone = dragonBones.BaseObject.borrowObject(dragonBones.BoneData);
bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true);
bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true);
bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true);
bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true);
bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale;
bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
if (ObjectDataParser.TRANSFORM in rawData) {
this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform);
}
if (this._isOldData) {
bone.inheritScale = false;
}
return bone;
};
/**
* @private
*/
ObjectDataParser.prototype._parseIK = function (rawData) {
var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, null));
if (bone) {
bone.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true);
bone.chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0);
bone.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0);
bone.ik = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, null));
if (bone.chain > 0 && bone.parent && !bone.parent.ik) {
bone.parent.ik = bone.ik;
bone.parent.chainIndex = 0;
bone.parent.chain = 0;
bone.parent.weight = bone.weight;
bone.chainIndex = 1;
}
else {
bone.chain = 0;
bone.chainIndex = 0;
}
}
};
/**
* @private
*/
ObjectDataParser.prototype._parseSlot = function (rawData, zOrder) {
var slot = dragonBones.BaseObject.borrowObject(dragonBones.SlotData);
slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0);
slot.zOrder = ObjectDataParser._getNumber(rawData, ObjectDataParser.Z, zOrder); // Support 2.x ~ 3.x data.
slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, null));
if ((ObjectDataParser.COLOR in rawData) || (ObjectDataParser.COLOR_TRANSFORM in rawData)) {
slot.color = dragonBones.SlotData.generateColor();
this._parseColorTransform(rawData[ObjectDataParser.COLOR] || rawData[ObjectDataParser.COLOR_TRANSFORM], slot.color);
}
else {
slot.color = dragonBones.SlotData.DEFAULT_COLOR;
}
if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") {
slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]);
}
else {
slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */);
}
if ((ObjectDataParser.ACTIONS in rawData) || (ObjectDataParser.DEFAULT_ACTIONS in rawData)) {
this._parseActionData(rawData, slot.actions, null, null);
}
return slot;
};
/**
* @private
*/
ObjectDataParser.prototype._parseSkin = function (rawData) {
var skin = dragonBones.BaseObject.borrowObject(dragonBones.SkinData);
skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME);
if (!skin.name) {
skin.name = ObjectDataParser.DEFAULT_NAME;
}
if (ObjectDataParser.SLOT in rawData) {
this._skin = skin;
var slots = rawData[ObjectDataParser.SLOT];
var zOrder = 0;
for (var i = 0, l = slots.length; i < l; ++i) {
if (this._isOldData) {
this._armature.addSlot(this._parseSlot(slots[i], zOrder++));
}
skin.addSlot(this._parseSkinSlotData(slots[i]));
}
this._skin = null;
}
return skin;
};
/**
* @private
*/
ObjectDataParser.prototype._parseSkinSlotData = function (rawData) {
var skinSlotData = dragonBones.BaseObject.borrowObject(dragonBones.SkinSlotData);
skinSlotData.slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null));
if (ObjectDataParser.DISPLAY in rawData) {
var rawDisplays = rawData[ObjectDataParser.DISPLAY];
this._skinSlotData = skinSlotData;
for (var i = 0, l = rawDisplays.length; i < l; ++i) {
skinSlotData.displays.push(this._parseDisplay(rawDisplays[i]));
}
this._skinSlotData = null;
}
return skinSlotData;
};
/**
* @private
*/
ObjectDataParser.prototype._parseDisplay = function (rawData) {
var display = dragonBones.BaseObject.borrowObject(dragonBones.DisplayData);
display.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ANIMATION, true);
display.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
display.path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, display.name);
if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") {
display.type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]);
}
else {
display.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Image */);
}
display.isRelativePivot = true;
if (ObjectDataParser.PIVOT in rawData) {
var pivotObject = rawData[ObjectDataParser.PIVOT];
display.pivot.x = ObjectDataParser._getNumber(pivotObject, ObjectDataParser.X, 0);
display.pivot.y = ObjectDataParser._getNumber(pivotObject, ObjectDataParser.Y, 0);
}
else if (this._isOldData) {
var transformObject = rawData[ObjectDataParser.TRANSFORM];
display.isRelativePivot = false;
display.pivot.x = ObjectDataParser._getNumber(transformObject, ObjectDataParser.PIVOT_X, 0) * this._armature.scale;
display.pivot.y = ObjectDataParser._getNumber(transformObject, ObjectDataParser.PIVOT_Y, 0) * this._armature.scale;
}
else {
display.pivot.x = 0.5;
display.pivot.y = 0.5;
}
if (ObjectDataParser.TRANSFORM in rawData) {
this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform);
}
switch (display.type) {
case 0 /* Image */:
break;
case 1 /* Armature */:
break;
case 2 /* Mesh */:
display.share = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, null);
if (!display.share) {
display.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true);
display.mesh = this._parseMesh(rawData);
this._skinSlotData.addMesh(display.mesh);
}
break;
case 3 /* BoundingBox */:
display.boundingBox = this._parseBoundingBox(rawData);
break;
default:
break;
}
return display;
};
/**
* @private
*/
ObjectDataParser.prototype._parseMesh = function (rawData) {
var mesh = dragonBones.BaseObject.borrowObject(dragonBones.MeshData);
var rawVertices = rawData[ObjectDataParser.VERTICES];
var rawUVs = rawData[ObjectDataParser.UVS];
var rawTriangles = rawData[ObjectDataParser.TRIANGLES];
var numVertices = Math.floor(rawVertices.length / 2); // uint
var numTriangles = Math.floor(rawTriangles.length / 3); // uint
var inverseBindPose = new Array(this._armature.sortedBones.length);
mesh.skinned = ObjectDataParser.WEIGHTS in rawData && rawData[ObjectDataParser.WEIGHTS].length > 0;
mesh.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
mesh.uvs.length = numVertices * 2;
mesh.vertices.length = numVertices * 2;
mesh.vertexIndices.length = numTriangles * 3;
if (mesh.skinned) {
mesh.boneIndices.length = numVertices;
mesh.weights.length = numVertices;
mesh.boneVertices.length = numVertices;
if (ObjectDataParser.SLOT_POSE in rawData) {
var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE];
mesh.slotPose.a = rawSlotPose[0];
mesh.slotPose.b = rawSlotPose[1];
mesh.slotPose.c = rawSlotPose[2];
mesh.slotPose.d = rawSlotPose[3];
mesh.slotPose.tx = rawSlotPose[4] * this._armature.scale;
mesh.slotPose.ty = rawSlotPose[5] * this._armature.scale;
}
if (ObjectDataParser.BONE_POSE in rawData) {
var rawBonePose = rawData[ObjectDataParser.BONE_POSE];
for (var i = 0, l = rawBonePose.length; i < l; i += 7) {
var rawBoneIndex = rawBonePose[i]; // uint
var boneMatrix = inverseBindPose[rawBoneIndex] = new dragonBones.Matrix();
boneMatrix.a = rawBonePose[i + 1];
boneMatrix.b = rawBonePose[i + 2];
boneMatrix.c = rawBonePose[i + 3];
boneMatrix.d = rawBonePose[i + 4];
boneMatrix.tx = rawBonePose[i + 5] * this._armature.scale;
boneMatrix.ty = rawBonePose[i + 6] * this._armature.scale;
boneMatrix.invert();
}
}
}
for (var i = 0, iW = 0, l = rawVertices.length; i < l; i += 2) {
var iN = i + 1;
var vertexIndex = i / 2;
var x = mesh.vertices[i] = rawVertices[i] * this._armature.scale;
var y = mesh.vertices[iN] = rawVertices[iN] * this._armature.scale;
mesh.uvs[i] = rawUVs[i];
mesh.uvs[iN] = rawUVs[iN];
if (mesh.skinned) {
var rawWeights = rawData[ObjectDataParser.WEIGHTS];
var numBones = rawWeights[iW]; // uint
var indices = mesh.boneIndices[vertexIndex] = new Array(numBones);
var weights = mesh.weights[vertexIndex] = new Array(numBones);
var boneVertices = mesh.boneVertices[vertexIndex] = new Array(numBones * 2);
mesh.slotPose.transformPoint(x, y, this._helpPoint);
x = mesh.vertices[i] = this._helpPoint.x;
y = mesh.vertices[iN] = this._helpPoint.y;
for (var iB = 0; iB < numBones; ++iB) {
var iI = iW + 1 + iB * 2;
var rawBoneIndex = rawWeights[iI]; // uint
var boneData = this._rawBones[rawBoneIndex];
var boneIndex = mesh.bones.indexOf(boneData);
if (boneIndex < 0) {
boneIndex = mesh.bones.length;
mesh.bones[boneIndex] = boneData;
mesh.inverseBindPose[boneIndex] = inverseBindPose[rawBoneIndex];
}
mesh.inverseBindPose[boneIndex].transformPoint(x, y, this._helpPoint);
indices[iB] = boneIndex;
weights[iB] = rawWeights[iI + 1];
boneVertices[iB * 2] = this._helpPoint.x;
boneVertices[iB * 2 + 1] = this._helpPoint.y;
}
iW += numBones * 2 + 1;
}
}
for (var i = 0, l = rawTriangles.length; i < l; ++i) {
mesh.vertexIndices[i] = rawTriangles[i];
}
return mesh;
};
/**
* @private
*/
ObjectDataParser.prototype._parseBoundingBox = function (rawData) {
var boundingBox = dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxData);
if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") {
boundingBox.type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]);
}
else {
boundingBox.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, 0 /* Rectangle */);
}
boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000);
switch (boundingBox.type) {
case 0 /* Rectangle */:
case 1 /* Ellipse */:
boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0);
boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0);
break;
case 2 /* Polygon */:
if (ObjectDataParser.VERTICES in rawData) {
var rawVertices = rawData[ObjectDataParser.VERTICES];
boundingBox.vertices.length = rawVertices.length;
for (var i = 0, l = boundingBox.vertices.length; i < l; i += 2) {
var iN = i + 1;
var x = rawVertices[i];
var y = rawVertices[iN];
boundingBox.vertices[i] = x;
boundingBox.vertices[iN] = y;
// AABB.
if (i === 0) {
boundingBox.x = x;
boundingBox.y = y;
boundingBox.width = x;
boundingBox.height = y;
}
else {
if (x < boundingBox.x) {
boundingBox.x = x;
}
else if (x > boundingBox.width) {
boundingBox.width = x;
}
if (y < boundingBox.y) {
boundingBox.y = y;
}
else if (y > boundingBox.height) {
boundingBox.height = y;
}
}
}
}
break;
default:
break;
}
return boundingBox;
};
/**
* @private
*/
ObjectDataParser.prototype._parseAnimation = function (rawData) {
var animation = dragonBones.BaseObject.borrowObject(dragonBones.AnimationData);
animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1);
animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1);
animation.duration = animation.frameCount / this._armature.frameRate;
animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0);
animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME);
if (!animation.name) {
animation.name = ObjectDataParser.DEFAULT_NAME;
}
this._animation = animation;
this._parseTimeline(rawData, animation, this._parseAnimationFrame);
if (ObjectDataParser.Z_ORDER in rawData) {
animation.zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineData);
this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], animation.zOrderTimeline, this._parseZOrderFrame);
}
if (ObjectDataParser.BONE in rawData) {
var boneTimelines = rawData[ObjectDataParser.BONE];
for (var i = 0, l = boneTimelines.length; i < l; ++i) {
animation.addBoneTimeline(this._parseBoneTimeline(boneTimelines[i]));
}
}
if (ObjectDataParser.SLOT in rawData) {
var slotTimelines = rawData[ObjectDataParser.SLOT];
for (var i = 0, l = slotTimelines.length; i < l; ++i) {
animation.addSlotTimeline(this._parseSlotTimeline(slotTimelines[i]));
}
}
if (ObjectDataParser.FFD in rawData) {
var ffdTimelines = rawData[ObjectDataParser.FFD];
for (var i = 0, l = ffdTimelines.length; i < l; ++i) {
animation.addFFDTimeline(this._parseFFDTimeline(ffdTimelines[i]));
}
}
if (this._isOldData) {
this._isAutoTween = ObjectDataParser._getBoolean(rawData, ObjectDataParser.AUTO_TWEEN, true);
this._animationTweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, 0) || 0;
animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.LOOP, 1);
if (ObjectDataParser.TIMELINE in rawData) {
var timelineObjects = rawData[ObjectDataParser.TIMELINE];
for (var i = 0, l = timelineObjects.length; i < l; ++i) {
var timelineObject = timelineObjects[i];
animation.addBoneTimeline(this._parseBoneTimeline(timelineObject));
animation.addSlotTimeline(this._parseSlotTimeline(timelineObject));
}
}
}
else {
this._isAutoTween = false;
this._animationTweenEasing = 0;
}
for (var i in this._armature.bones) {
var bone = this._armature.bones[i];
if (!animation.getBoneTimeline(bone.name)) {
var boneTimeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneTimelineData);
var boneFrame = dragonBones.BaseObject.borrowObject(dragonBones.BoneFrameData);
boneTimeline.bone = bone;
boneTimeline.frames[0] = boneFrame;
animation.addBoneTimeline(boneTimeline);
}
}
for (var i in this._armature.slots) {
var slot = this._armature.slots[i];
if (!animation.getSlotTimeline(slot.name)) {
var slotTimeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotTimelineData);
var slotFrame = dragonBones.BaseObject.borrowObject(dragonBones.SlotFrameData);
slotTimeline.slot = slot;
slotFrame.displayIndex = slot.displayIndex;
if (slot.color === dragonBones.SlotData.DEFAULT_COLOR) {
slotFrame.color = dragonBones.SlotFrameData.DEFAULT_COLOR;
}
else {
slotFrame.color = dragonBones.SlotFrameData.generateColor();
slotFrame.color.copyFrom(slot.color);
}
slotTimeline.frames[0] = slotFrame;
animation.addSlotTimeline(slotTimeline);
if (this._isOldData) {
slotFrame.displayIndex = -1;
}
}
}
this._animation = null;
return animation;
};
/**
* @private
*/
ObjectDataParser.prototype._parseBoneTimeline = function (rawData) {
var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneTimelineData);
timeline.bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null));
this._parseTimeline(rawData, timeline, this._parseBoneFrame);
var originalTransform = timeline.originalTransform;
var prevFrame = null;
for (var i = 0, l = timeline.frames.length; i < l; ++i) {
var frame = timeline.frames[i];
if (!prevFrame) {
originalTransform.copyFrom(frame.transform);
frame.transform.identity();
if (originalTransform.scaleX === 0) {
originalTransform.scaleX = 0.001;
//frame.transform.scaleX = 0;
}
if (originalTransform.scaleY === 0) {
originalTransform.scaleY = 0.001;
//frame.transform.scaleY = 0;
}
}
else if (prevFrame !== frame) {
frame.transform.minus(originalTransform);
}
prevFrame = frame;
}
if (this._isOldData && (ObjectDataParser.PIVOT_X in rawData || ObjectDataParser.PIVOT_Y in rawData)) {
this._timelinePivot.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.PIVOT_X, 0.0) * this._armature.scale;
this._timelinePivot.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.PIVOT_Y, 0.0) * this._armature.scale;
}
else {
this._timelinePivot.clear();
}
return timeline;
};
/**
* @private
*/
ObjectDataParser.prototype._parseSlotTimeline = function (rawData) {
var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotTimelineData);
timeline.slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null));
this._parseTimeline(rawData, timeline, this._parseSlotFrame);
return timeline;
};
/**
* @private
*/
ObjectDataParser.prototype._parseFFDTimeline = function (rawData) {
var timeline = dragonBones.BaseObject.borrowObject(dragonBones.FFDTimelineData);
timeline.skin = this._armature.getSkin(ObjectDataParser._getString(rawData, ObjectDataParser.SKIN, null));
timeline.slot = timeline.skin.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.SLOT, null));
var meshName = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
for (var i = 0, l = timeline.slot.displays.length; i < l; ++i) {
var display = timeline.slot.displays[i];
if (display.mesh && display.name === meshName) {
timeline.display = display;
break;
}
}
this._parseTimeline(rawData, timeline, this._parseFFDFrame);
return timeline;
};
/**
* @private
*/
ObjectDataParser.prototype._parseAnimationFrame = function (rawData, frameStart, frameCount) {
var frame = dragonBones.BaseObject.borrowObject(dragonBones.AnimationFrameData);
this._parseFrame(rawData, frame, frameStart, frameCount);
if ((ObjectDataParser.ACTION in rawData) || (ObjectDataParser.ACTIONS in rawData)) {
this._parseActionData(rawData, frame.actions, null, null);
}
if ((ObjectDataParser.EVENTS in rawData) || (ObjectDataParser.EVENT in rawData) || (ObjectDataParser.SOUND in rawData)) {
this._parseEventData(rawData, frame.events, null, null);
}
return frame;
};
/**
* @private
*/
ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) {
var frame = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderFrameData);
this._parseFrame(rawData, frame, frameStart, frameCount);
var rawZOrder = rawData[ObjectDataParser.Z_ORDER];
if (rawZOrder && rawZOrder.length > 0) {
var slotCount = this._armature.sortedSlots.length;
var unchanged = new Array(slotCount - rawZOrder.length / 2);
frame.zOrder.length = slotCount;
for (var i_3 = 0; i_3 < slotCount; ++i_3) {
frame.zOrder[i_3] = -1;
}
var originalIndex = 0;
var unchangedIndex = 0;
for (var i_4 = 0, l = rawZOrder.length; i_4 < l; i_4 += 2) {
var slotIndex = rawZOrder[i_4];
var offset = rawZOrder[i_4 + 1];
while (originalIndex !== slotIndex) {
unchanged[unchangedIndex++] = originalIndex++;
}
frame.zOrder[originalIndex + offset] = originalIndex++;
}
while (originalIndex < slotCount) {
unchanged[unchangedIndex++] = originalIndex++;
}
var i = slotCount;
while (i--) {
if (frame.zOrder[i] === -1) {
frame.zOrder[i] = unchanged[--unchangedIndex];
}
}
}
return frame;
};
/**
* @private
*/
ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) {
var frame = dragonBones.BaseObject.borrowObject(dragonBones.BoneFrameData);
frame.tweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0);
frame.tweenScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.TWEEN_SCALE, true);
this._parseTweenFrame(rawData, frame, frameStart, frameCount);
if (ObjectDataParser.TRANSFORM in rawData) {
var transformObject = rawData[ObjectDataParser.TRANSFORM];
this._parseTransform(transformObject, frame.transform);
if (this._isOldData) {
this._helpPoint.x = this._timelinePivot.x + ObjectDataParser._getNumber(transformObject, ObjectDataParser.PIVOT_X, 0.0) * this._armature.scale;
this._helpPoint.y = this._timelinePivot.y + ObjectDataParser._getNumber(transformObject, ObjectDataParser.PIVOT_Y, 0.0) * this._armature.scale;
frame.transform.toMatrix(this._helpMatrix);
this._helpMatrix.transformPoint(this._helpPoint.x, this._helpPoint.y, this._helpPoint, true);
frame.transform.x += this._helpPoint.x;
frame.transform.y += this._helpPoint.y;
}
}
var bone = this._timeline.bone;
var actions = new Array();
var events = new Array();
if ((ObjectDataParser.ACTION in rawData) || (ObjectDataParser.ACTIONS in rawData)) {
var slot = this._armature.getSlot(bone.name);
this._parseActionData(rawData, actions, bone, slot);
}
if ((ObjectDataParser.EVENT in rawData) || (ObjectDataParser.SOUND in rawData)) {
this._parseEventData(rawData, events, bone, null);
}
if (actions.length > 0 || events.length > 0) {
this._mergeFrameToAnimationTimeline(frame.position, actions, events); // Merge actions and events to animation timeline.
}
return frame;
};
/**
* @private
*/
ObjectDataParser.prototype._parseSlotFrame = function (rawData, frameStart, frameCount) {
var frame = dragonBones.BaseObject.borrowObject(dragonBones.SlotFrameData);
frame.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0);
this._parseTweenFrame(rawData, frame, frameStart, frameCount);
if ((ObjectDataParser.COLOR in rawData) || (ObjectDataParser.COLOR_TRANSFORM in rawData)) {
frame.color = dragonBones.SlotFrameData.generateColor();
this._parseColorTransform(rawData[ObjectDataParser.COLOR] || rawData[ObjectDataParser.COLOR_TRANSFORM], frame.color);
}
else {
frame.color = dragonBones.SlotFrameData.DEFAULT_COLOR;
}
if (this._isOldData) {
if (ObjectDataParser._getBoolean(rawData, ObjectDataParser.HIDE, false)) {
frame.displayIndex = -1;
}
}
else if ((ObjectDataParser.ACTION in rawData) || (ObjectDataParser.ACTIONS in rawData)) {
var slot = this._timeline.slot;
var actions = new Array();
this._parseActionData(rawData, actions, slot.parent, slot);
this._mergeFrameToAnimationTimeline(frame.position, actions, null); // Merge actions and events to animation timeline.
}
return frame;
};
/**
* @private
*/
ObjectDataParser.prototype._parseFFDFrame = function (rawData, frameStart, frameCount) {
var ffdTimeline = this._timeline;
var mesh = ffdTimeline.display.mesh;
var frame = dragonBones.BaseObject.borrowObject(dragonBones.ExtensionFrameData);
this._parseTweenFrame(rawData, frame, frameStart, frameCount);
var rawVertices = rawData[ObjectDataParser.VERTICES];
var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint
var x = 0.0;
var y = 0.0;
for (var i = 0, l = mesh.vertices.length; i < l; i += 2) {
if (!rawVertices) {
x = 0.0;
y = 0.0;
}
else {
if (i < offset || i - offset >= rawVertices.length) {
x = 0.0;
}
else {
x = rawVertices[i - offset] * this._armature.scale;
}
if (i + 1 < offset || i + 1 - offset >= rawVertices.length) {
y = 0.0;
}
else {
y = rawVertices[i + 1 - offset] * this._armature.scale;
}
}
if (mesh.skinned) {
mesh.slotPose.transformPoint(x, y, this._helpPoint, true);
x = this._helpPoint.x;
y = this._helpPoint.y;
var boneIndices = mesh.boneIndices[i / 2];
for (var iB = 0, lB = boneIndices.length; iB < lB; ++iB) {
var boneIndex = boneIndices[iB];
mesh.inverseBindPose[boneIndex].transformPoint(x, y, this._helpPoint, true);
frame.tweens.push(this._helpPoint.x, this._helpPoint.y);
}
}
else {
frame.tweens.push(x, y);
}
}
return frame;
};
/**
* @private
*/
ObjectDataParser.prototype._parseTweenFrame = function (rawData, frame, frameStart, frameCount) {
this._parseFrame(rawData, frame, frameStart, frameCount);
if (frame.duration > 0.0) {
if (ObjectDataParser.TWEEN_EASING in rawData) {
frame.tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, dragonBones.DragonBones.NO_TWEEN);
}
else if (this._isOldData) {
frame.tweenEasing = this._isAutoTween ? this._animationTweenEasing : dragonBones.DragonBones.NO_TWEEN;
}
else {
frame.tweenEasing = dragonBones.DragonBones.NO_TWEEN;
}
if (this._isOldData && this._animation.scale === 1 && this._timeline.scale === 1 && frame.duration * this._armature.frameRate < 2) {
frame.tweenEasing = dragonBones.DragonBones.NO_TWEEN;
}
if (frameCount > 0 && (ObjectDataParser.CURVE in rawData)) {
frame.curve = new Array(frameCount * 2 - 1);
dragonBones.TweenFrameData.samplingEasingCurve(rawData[ObjectDataParser.CURVE], frame.curve);
}
}
else {
frame.tweenEasing = dragonBones.DragonBones.NO_TWEEN;
frame.curve = null;
}
};
/**
* @private
*/
ObjectDataParser.prototype._parseFrame = function (rawData, frame, frameStart, frameCount) {
frame.position = frameStart / this._armature.frameRate;
frame.duration = frameCount / this._armature.frameRate;
};
/**
* @private
*/
ObjectDataParser.prototype._parseTimeline = function (rawData, timeline, frameParser) {
timeline.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1);
timeline.offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0);
this._timeline = timeline;
if (ObjectDataParser.FRAME in rawData) {
var rawFrames = rawData[ObjectDataParser.FRAME];
if (rawFrames.length === 1) {
timeline.frames.length = 1;
timeline.frames[0] = frameParser.call(this, rawFrames[0], 0, ObjectDataParser._getNumber(rawFrames[0], ObjectDataParser.DURATION, 1));
}
else if (rawFrames.length > 1) {
timeline.frames.length = this._animation.frameCount + 1;
var frameStart = 0;
var frameCount = 0;
var frame = null;
var prevFrame = null;
for (var i = 0, iW = 0, l = timeline.frames.length; i < l; ++i) {
if (frameStart + frameCount <= i && iW < rawFrames.length) {
var rawFrame = rawFrames[iW++];
frameStart = i;
frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1);
frame = frameParser.call(this, rawFrame, frameStart, frameCount);
if (prevFrame) {
prevFrame.next = frame;
frame.prev = prevFrame;
if (this._isOldData) {
if (prevFrame instanceof dragonBones.TweenFrameData && ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DISPLAY_INDEX, 0) === -1) {
prevFrame.tweenEasing = dragonBones.DragonBones.NO_TWEEN;
}
}
}
prevFrame = frame;
}
timeline.frames[i] = frame;
}
frame.duration = this._animation.duration - frame.position; // Modify last frame duration.
frame = timeline.frames[0];
prevFrame.next = frame;
frame.prev = prevFrame;
if (this._isOldData) {
if (prevFrame instanceof dragonBones.TweenFrameData && ObjectDataParser._getNumber(rawFrames[0], ObjectDataParser.DISPLAY_INDEX, 0) === -1) {
prevFrame.tweenEasing = dragonBones.DragonBones.NO_TWEEN;
}
}
}
}
this._timeline = null;
};
/**
* @private
*/
ObjectDataParser.prototype._parseActionData = function (rawData, actions, bone, slot) {
var rawActions = rawData[ObjectDataParser.ACTION] || rawData[ObjectDataParser.ACTIONS] || rawData[ObjectDataParser.DEFAULT_ACTIONS];
if (typeof rawActions === "string") {
var actionData = dragonBones.BaseObject.borrowObject(dragonBones.ActionData);
actionData.type = 0 /* Play */;
actionData.bone = bone;
actionData.slot = slot;
actionData.animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig);
actionData.animationConfig.animation = rawActions;
actions.push(actionData);
}
else if (rawActions instanceof Array) {
for (var i = 0, l = rawActions.length; i < l; ++i) {
var actionObject = rawActions[i];
var isArray = actionObject instanceof Array;
var actionData = dragonBones.BaseObject.borrowObject(dragonBones.ActionData);
var animationName = isArray ? actionObject[1] : ObjectDataParser._getString(actionObject, "gotoAndPlay", null);
if (isArray) {
var actionType = actionObject[0];
if (typeof actionType === "string") {
actionData.type = ObjectDataParser._getActionType(actionType);
}
else {
actionData.type = actionType;
}
}
else {
actionData.type = 0 /* Play */;
}
switch (actionData.type) {
case 0 /* Play */:
actionData.animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig);
actionData.animationConfig.animation = animationName;
break;
default:
break;
}
actionData.bone = bone;
actionData.slot = slot;
actions.push(actionData);
}
}
};
/**
* @private
*/
ObjectDataParser.prototype._parseEventData = function (rawData, events, bone, slot) {
if (ObjectDataParser.SOUND in rawData) {
var soundEventData = dragonBones.BaseObject.borrowObject(dragonBones.EventData);
soundEventData.type = 11 /* Sound */;
soundEventData.name = ObjectDataParser._getString(rawData, ObjectDataParser.SOUND, null);
soundEventData.bone = bone;
soundEventData.slot = slot;
events.push(soundEventData);
}
if (ObjectDataParser.EVENT in rawData) {
var eventData = dragonBones.BaseObject.borrowObject(dragonBones.EventData);
eventData.type = 10 /* Frame */;
eventData.name = ObjectDataParser._getString(rawData, ObjectDataParser.EVENT, null);
eventData.bone = bone;
eventData.slot = slot;
events.push(eventData);
}
if (ObjectDataParser.EVENTS in rawData) {
var rawEvents = rawData[ObjectDataParser.EVENTS];
for (var i = 0, l = rawEvents.length; i < l; ++i) {
var rawEvent = rawEvents[i];
var boneName = ObjectDataParser._getString(rawEvent, ObjectDataParser.BONE, null);
var slotName = ObjectDataParser._getString(rawEvent, ObjectDataParser.SLOT, null);
var eventData = dragonBones.BaseObject.borrowObject(dragonBones.EventData);
eventData.type = 10 /* Frame */;
eventData.name = ObjectDataParser._getString(rawEvent, ObjectDataParser.NAME, null);
eventData.bone = this._armature.getBone(boneName);
eventData.slot = this._armature.getSlot(slotName);
if (ObjectDataParser.INTS in rawEvent) {
if (!eventData.data) {
eventData.data = dragonBones.BaseObject.borrowObject(dragonBones.CustomData);
}
var rawInts = rawEvent[ObjectDataParser.INTS];
for (var i_5 = 0, l_2 = rawInts.length; i_5 < l_2; ++i_5) {
eventData.data.ints.push(rawInts[i_5]);
}
}
if (ObjectDataParser.FLOATS in rawEvent) {
if (!eventData.data) {
eventData.data = dragonBones.BaseObject.borrowObject(dragonBones.CustomData);
}
var rawFloats = rawEvent[ObjectDataParser.FLOATS];
for (var i_6 = 0, l_3 = rawFloats.length; i_6 < l_3; ++i_6) {
eventData.data.floats.push(rawFloats[i_6]);
}
}
if (ObjectDataParser.STRINGS in rawEvent) {
if (!eventData.data) {
eventData.data = dragonBones.BaseObject.borrowObject(dragonBones.CustomData);
}
var rawStrings = rawEvent[ObjectDataParser.STRINGS];
for (var i_7 = 0, l_4 = rawStrings.length; i_7 < l_4; ++i_7) {
eventData.data.strings.push(rawStrings[i_7]);
}
}
events.push(eventData);
}
}
};
/**
* @private
*/
ObjectDataParser.prototype._parseTransform = function (rawData, transform) {
transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * this._armature.scale;
transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * this._armature.scale;
transform.skewX = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.DragonBones.ANGLE_TO_RADIAN);
transform.skewY = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.DragonBones.ANGLE_TO_RADIAN);
transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0);
transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0);
};
/**
* @private
*/
ObjectDataParser.prototype._parseColorTransform = function (rawData, color) {
color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01;
color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01;
color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01;
color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01;
color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0);
color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0);
color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0);
color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0);
};
/**
* @inheritDoc
*/
ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) {
if (scale === void 0) { scale = 1; }
if (rawData) {
var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, null);
var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, null);
this._isOldData = version === ObjectDataParser.DATA_VERSION_2_3 || version === ObjectDataParser.DATA_VERSION_3_0;
if (this._isOldData) {
this._isGlobalTransform = ObjectDataParser._getBoolean(rawData, ObjectDataParser.IS_GLOBAL, true);
}
else {
this._isGlobalTransform = false;
}
if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 ||
ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) {
var data = dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData);
data.version = version;
data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24);
if (data.frameRate === 0) {
data.frameRate = 24;
}
if (ObjectDataParser.ARMATURE in rawData) {
this._data = data;
var rawArmatures = rawData[ObjectDataParser.ARMATURE];
for (var i = 0, l = rawArmatures.length; i < l; ++i) {
data.addArmature(this._parseArmature(rawArmatures[i], scale));
}
this._data = null;
}
return data;
}
else {
throw new Error("Nonsupport data version.");
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
// return null;
};
/**
* @inheritDoc
*/
ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) {
if (scale === void 0) { scale = 0.0; }
if (rawData) {
textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, null);
textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, null);
textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0);
textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0);
// Texture format.
if (scale > 0.0) {
textureAtlasData.scale = scale;
}
else {
scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale);
}
scale = 1.0 / scale;
if (ObjectDataParser.SUB_TEXTURE in rawData) {
var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE];
for (var i = 0, l = rawTextures.length; i < l; ++i) {
var rawTexture = rawTextures[i];
var textureData = textureAtlasData.generateTexture();
textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, null);
textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false);
textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale;
textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale;
textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale;
textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale;
var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0);
var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0);
if (frameWidth > 0.0 && frameHeight > 0.0) {
textureData.frame = dragonBones.TextureData.generateRectangle();
textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale;
textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale;
textureData.frame.width = frameWidth * scale;
textureData.frame.height = frameHeight * scale;
}
textureAtlasData.addTexture(textureData);
}
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @deprecated
* @see dragonBones.BaseFactory#parseDragonBonesData()
*/
ObjectDataParser.getInstance = function () {
if (!ObjectDataParser._instance) {
ObjectDataParser._instance = new ObjectDataParser();
}
return ObjectDataParser._instance;
};
return ObjectDataParser;
}(dragonBones.DataParser));
/**
* @private
*/
ObjectDataParser._instance = null;
dragonBones.ObjectDataParser = ObjectDataParser;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 基础变换对象。
* @version DragonBones 4.5
*/
var TransformObject = (function (_super) {
__extends(TransformObject, _super);
/**
* @internal
* @private
*/
function TransformObject() {
var _this = _super.call(this) || this;
/**
* @language zh_CN
* 相对于骨架坐标系的矩阵。
* @readOnly
* @version DragonBones 3.0
*/
_this.globalTransformMatrix = new dragonBones.Matrix();
/**
* @language zh_CN
* 相对于骨架坐标系的变换。
* @see dragonBones.Transform
* @readOnly
* @version DragonBones 3.0
*/
_this.global = new dragonBones.Transform();
/**
* @language zh_CN
* 相对于骨架或父骨骼坐标系的偏移变换。
* @see dragonBones.Transform
* @version DragonBones 3.0
*/
_this.offset = new dragonBones.Transform();
return _this;
}
/**
* @private
*/
TransformObject.prototype._onClear = function () {
this.name = null;
this.global.identity();
this.offset.identity();
this.globalTransformMatrix.identity();
this.origin = null;
this.userData = null;
this._armature = null;
this._parent = null;
this._globalDirty = false;
};
/**
* @internal
* @private
*/
TransformObject.prototype._setArmature = function (value) {
this._armature = value;
};
/**
* @internal
* @private
*/
TransformObject.prototype._setParent = function (value) {
this._parent = value;
};
/**
* @private
*/
TransformObject.prototype.updateGlobalTransform = function () {
if (this._globalDirty) {
this._globalDirty = false;
this.global.fromMatrix(this.globalTransformMatrix);
}
};
Object.defineProperty(TransformObject.prototype, "armature", {
/**
* @language zh_CN
* 所属的骨架。
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
get: function () {
return this._armature;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TransformObject.prototype, "parent", {
/**
* @language zh_CN
* 所属的父骨骼。
* @see dragonBones.Bone
* @version DragonBones 3.0
*/
get: function () {
return this._parent;
},
enumerable: true,
configurable: true
});
return TransformObject;
}(dragonBones.BaseObject));
/**
* @private
*/
TransformObject._helpPoint = new dragonBones.Point();
/**
* @private
*/
TransformObject._helpTransform = new dragonBones.Transform();
/**
* @private
*/
TransformObject._helpMatrix = new dragonBones.Matrix();
dragonBones.TransformObject = TransformObject;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。
* 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。
* @see dragonBones.BoneData
* @see dragonBones.Armature
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
var Bone = (function (_super) {
__extends(Bone, _super);
/**
* @internal
* @private
*/
function Bone() {
var _this = _super.call(this) || this;
/**
* @internal
* @private
*/
_this._animationPose = new dragonBones.Transform();
_this._bones = [];
_this._slots = [];
return _this;
}
/**
* @private
*/
Bone.toString = function () {
return "[class dragonBones.Bone]";
};
/**
* @private
*/
Bone.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.ikBendPositive = false;
this.ikWeight = 0.0;
this._ikChain = 0;
this._ikChainIndex = 0;
this._ik = null;
this._transformDirty = false;
this._childrenTransformDirty = false;
this._blendDirty = false;
this._visible = true;
this._cachedFrameIndex = -1;
this._blendLayer = 0;
this._blendLeftWeight = 1.0;
this._blendTotalWeight = 0.0;
this._animationPose.identity();
this._bones.length = 0;
this._slots.length = 0;
this._boneData = null;
this._cachedFrameIndices = null;
};
/**
* @private
*/
Bone.prototype._updateGlobalTransformMatrix = function (isCache) {
var flipX = this._armature.flipX;
var flipY = this._armature.flipY === dragonBones.DragonBones.yDown;
var dR = 0.0;
this.global.x = this.origin.x + this.offset.x + this._animationPose.x;
this.global.y = this.origin.y + this.offset.y + this._animationPose.y;
this.global.skewX = this.origin.skewX + this.offset.skewX + this._animationPose.skewX;
this.global.skewY = this.origin.skewY + this.offset.skewY + this._animationPose.skewY;
this.global.scaleX = this.origin.scaleX * this.offset.scaleX * this._animationPose.scaleX;
this.global.scaleY = this.origin.scaleY * this.offset.scaleY * this._animationPose.scaleY;
if (this._parent) {
var parentMatrix = this._parent.globalTransformMatrix;
if (this._boneData.inheritScale) {
if (!this._boneData.inheritRotation) {
this._parent.updateGlobalTransform();
dR = this._parent.global.skewY; //
this.global.skewX -= dR;
this.global.skewY -= dR;
}
this.global.toMatrix(this.globalTransformMatrix);
this.globalTransformMatrix.concat(parentMatrix);
if (this._boneData.inheritTranslation) {
this.global.x = this.globalTransformMatrix.tx;
this.global.y = this.globalTransformMatrix.ty;
}
else {
this.globalTransformMatrix.tx = this.global.x;
this.globalTransformMatrix.ty = this.global.y;
}
if (isCache) {
this.global.fromMatrix(this.globalTransformMatrix);
}
else {
this._globalDirty = true;
}
}
else {
if (this._boneData.inheritTranslation) {
var x = this.global.x;
var y = this.global.y;
this.global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx;
this.global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty;
}
else {
if (flipX) {
this.global.x = -this.global.x;
}
if (flipY) {
this.global.y = -this.global.y;
}
}
if (this._boneData.inheritRotation) {
this._parent.updateGlobalTransform();
dR = this._parent.global.skewY;
if (this._armature._armatureData.isRightTransform && parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) {
dR -= this.global.skewY * 2.0;
if (this._parent.global.scaleX < 0.0) {
dR += Math.PI;
}
if (flipX != flipY || this._boneData.inheritReflection) {
this.global.skewX += Math.PI;
}
}
this.global.skewX += dR;
this.global.skewY += dR;
}
else if (flipX || flipY) {
if (flipX && flipY) {
dR = Math.PI;
}
else {
dR = -this.global.skewY * 2.0;
if (flipX) {
dR += Math.PI;
}
this.global.skewX += Math.PI;
}
this.global.skewX += dR;
this.global.skewY += dR;
}
this.global.toMatrix(this.globalTransformMatrix);
}
}
else {
if (flipX || flipY) {
if (flipX) {
this.global.x = -this.global.x;
}
if (flipY) {
this.global.y = -this.global.y;
}
if (flipX && flipY) {
dR = Math.PI;
}
else {
dR = -this.global.skewY * 2.0;
if (flipX) {
dR += Math.PI;
}
this.global.skewX += Math.PI;
}
this.global.skewX += dR;
this.global.skewY += dR;
}
this.global.toMatrix(this.globalTransformMatrix);
}
//
if (this._ik && this._ikChainIndex === this._ikChain && this.ikWeight > 0) {
if (this._boneData.inheritTranslation && this._ikChain > 0 && this._parent) {
this._computeIKB();
}
else {
this._computeIKA();
}
}
};
/**
* @private
*/
Bone.prototype._computeIKA = function () {
this.updateGlobalTransform();
var boneLength = this._boneData.length;
var ikGlobal = this._ik.global;
var x = this.globalTransformMatrix.a * boneLength;
var y = this.globalTransformMatrix.b * boneLength;
var ikRadian = Math.atan2(ikGlobal.y - this.global.y, ikGlobal.x - this.global.x);
if (this.global.scaleX < 0.0) {
ikRadian += Math.PI;
}
var dR = (ikRadian - this.global.skewY) * this.ikWeight;
this.global.skewX += dR;
this.global.skewY += dR;
this.global.toMatrix(this.globalTransformMatrix);
};
/**
* @private
*/
Bone.prototype._computeIKB = function () {
this._parent.updateGlobalTransform();
this.updateGlobalTransform();
var boneLength = this._boneData.length;
var parentGlobal = this._parent.global;
var ikGlobal = this._ik.global;
var x = this.globalTransformMatrix.a * boneLength;
var y = this.globalTransformMatrix.b * boneLength;
var lLL = x * x + y * y;
var lL = Math.sqrt(lLL);
var dX = this.global.x - parentGlobal.x;
var dY = this.global.y - parentGlobal.y;
var lPP = dX * dX + dY * dY;
var lP = Math.sqrt(lPP);
var rawRadianA = Math.atan2(dY, dX);
dX = ikGlobal.x - parentGlobal.x;
dY = ikGlobal.y - parentGlobal.y;
var lTT = dX * dX + dY * dY;
var lT = Math.sqrt(lTT);
var ikRadianA = 0.0;
if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) {
ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x);
if (lL + lP <= lT) {
}
else if (lP < lL) {
ikRadianA += Math.PI;
}
}
else {
var h = (lPP - lLL + lTT) / (2.0 * lTT);
var r = Math.sqrt(lPP - h * h * lTT) / lT;
var hX = parentGlobal.x + (dX * h);
var hY = parentGlobal.y + (dY * h);
var rX = -dY * r;
var rY = dX * r;
var isPPR = false;
if (this._parent._parent) {
var parentParentMatrix = this._parent._parent.globalTransformMatrix;
isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0;
}
if (isPPR !== this.ikBendPositive) {
this.global.x = hX - rX;
this.global.y = hY - rY;
}
else {
this.global.x = hX + rX;
this.global.y = hY + rY;
}
ikRadianA = Math.atan2(this.global.y - parentGlobal.y, this.global.x - parentGlobal.x);
}
var dR = (ikRadianA - rawRadianA) * this.ikWeight;
parentGlobal.skewX += dR;
parentGlobal.skewY += dR;
parentGlobal.toMatrix(this._parent.globalTransformMatrix);
this._parent._childrenTransformDirty = true;
if (this._parent._cachedFrameIndex >= 0) {
this._armature._armatureData.setCacheFrame(this._parent.globalTransformMatrix, parentGlobal, this._parent._cachedFrameIndex);
}
var parentRadian = rawRadianA + dR;
this.global.x = parentGlobal.x + Math.cos(parentRadian) * lP;
this.global.y = parentGlobal.y + Math.sin(parentRadian) * lP;
var ikRadianB = Math.atan2(ikGlobal.y - this.global.y, ikGlobal.x - this.global.x);
if (this.global.scaleX < 0.0) {
ikRadianB += Math.PI;
}
dR = (ikRadianB - this.global.skewY) * this.ikWeight;
this.global.skewX += dR;
this.global.skewY += dR;
this.global.toMatrix(this.globalTransformMatrix);
};
/**
* @internal
* @private
*/
Bone.prototype._init = function (boneData) {
if (this._boneData) {
return;
}
this._boneData = boneData;
this.name = this._boneData.name;
this.origin = this._boneData.transform;
};
/**
* @internal
* @private
*/
Bone.prototype._setArmature = function (value) {
if (this._armature === value) {
return;
}
this._ik = null;
var oldSlots = null;
var oldBones = null;
if (this._armature) {
oldSlots = this.getSlots();
oldBones = this.getBones();
this._armature._removeBoneFromBoneList(this);
}
this._armature = value;
if (this._armature) {
this._armature._addBoneToBoneList(this);
}
if (oldSlots) {
for (var i = 0, l = oldSlots.length; i < l; ++i) {
var slot = oldSlots[i];
if (slot.parent === this) {
slot._setArmature(this._armature);
}
}
}
if (oldBones) {
for (var i = 0, l = oldBones.length; i < l; ++i) {
var bone = oldBones[i];
if (bone.parent === this) {
bone._setArmature(this._armature);
}
}
}
};
/**
* @internal
* @private
*/
Bone.prototype._setIK = function (value, chain, chainIndex) {
if (value) {
if (chain === chainIndex) {
var chainEnd = this._parent;
if (chain && chainEnd) {
chain = 1;
}
else {
chain = 0;
chainIndex = 0;
chainEnd = this;
}
if (chainEnd === value || chainEnd.contains(value)) {
value = null;
chain = 0;
chainIndex = 0;
}
else {
var ancestor = value;
while (ancestor.ik && ancestor.ikChain) {
if (chainEnd.contains(ancestor.ik)) {
value = null;
chain = 0;
chainIndex = 0;
break;
}
ancestor = ancestor.parent;
}
}
}
}
else {
chain = 0;
chainIndex = 0;
}
this._ik = value;
this._ikChain = chain;
this._ikChainIndex = chainIndex;
if (this._armature) {
this._armature._bonesDirty = true;
}
};
/**
* @internal
* @private
*/
Bone.prototype._update = function (cacheFrameIndex) {
this._blendDirty = false;
if (cacheFrameIndex >= 0 && this._cachedFrameIndices) {
var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex];
if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) {
this._transformDirty = false;
}
else if (cachedFrameIndex >= 0) {
this._transformDirty = true;
this._cachedFrameIndex = cachedFrameIndex;
}
else if (this._transformDirty ||
(this._parent && this._parent._childrenTransformDirty) ||
(this._ik && this.ikWeight > 0 && this._ik._childrenTransformDirty)) {
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
else if (this._cachedFrameIndex >= 0) {
this._transformDirty = false;
this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex;
}
else {
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
}
else if (this._transformDirty ||
(this._parent && this._parent._childrenTransformDirty) ||
(this._ik && this.ikWeight > 0 && this._ik._childrenTransformDirty)) {
cacheFrameIndex = -1;
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
if (this._transformDirty) {
this._transformDirty = false;
this._childrenTransformDirty = true;
if (this._cachedFrameIndex < 0) {
var isCache = cacheFrameIndex >= 0;
this._updateGlobalTransformMatrix(isCache);
if (isCache) {
this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature._armatureData.setCacheFrame(this.globalTransformMatrix, this.global);
}
}
else {
this._armature._armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex);
}
}
else if (this._childrenTransformDirty) {
this._childrenTransformDirty = false;
}
};
/**
* @language zh_CN
* 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新)
* @version DragonBones 3.0
*/
Bone.prototype.invalidUpdate = function () {
this._transformDirty = true;
};
/**
* @language zh_CN
* 是否包含骨骼或插槽。
* @returns
* @see dragonBones.TransformObject
* @version DragonBones 3.0
*/
Bone.prototype.contains = function (child) {
if (child) {
if (child === this) {
return false;
}
var ancestor = child;
while (ancestor !== this && ancestor) {
ancestor = ancestor.parent;
}
return ancestor === this;
}
return false;
};
/**
* @language zh_CN
* 所有的子骨骼。
* @version DragonBones 3.0
*/
Bone.prototype.getBones = function () {
this._bones.length = 0;
var bones = this._armature.getBones();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (bone.parent === this) {
this._bones.push(bone);
}
}
return this._bones;
};
/**
* @language zh_CN
* 所有的插槽。
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
Bone.prototype.getSlots = function () {
this._slots.length = 0;
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var slot = slots[i];
if (slot.parent === this) {
this._slots.push(slot);
}
}
return this._slots;
};
Object.defineProperty(Bone.prototype, "boneData", {
/**
* @private
*/
get: function () {
return this._boneData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "visible", {
/**
* @language zh_CN
* 控制此骨骼所有插槽的可见。
* @default true
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
get: function () {
return this._visible;
},
set: function (value) {
if (this._visible === value) {
return;
}
this._visible = value;
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var slot = slots[i];
if (slot._parent === this) {
slot._updateVisible();
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "length", {
/**
* @deprecated
* @see #boneData
* @see #dragonBones.BoneData#length
*/
get: function () {
return this.boneData.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "slot", {
/**
* @deprecated
* @see dragonBones.Armature#getSlot()
*/
get: function () {
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var slot = slots[i];
if (slot.parent === this) {
return slot;
}
}
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "ikChain", {
/**
* @deprecated
*/
get: function () {
return this._ikChain;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "ikChainIndex", {
/**
* @deprecated
*/
get: function () {
return this._ikChainIndex;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Bone.prototype, "ik", {
/**
* @deprecated
*/
get: function () {
return this._ik;
},
enumerable: true,
configurable: true
});
return Bone;
}(dragonBones.TransformObject));
dragonBones.Bone = Bone;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 插槽,附着在骨骼上,控制显示对象的显示状态和属性。
* 一个骨骼上可以包含多个插槽。
* 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。
* 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。
* @see dragonBones.Armature
* @see dragonBones.Bone
* @see dragonBones.SlotData
* @version DragonBones 3.0
*/
var Slot = (function (_super) {
__extends(Slot, _super);
/**
* @internal
* @private
*/
function Slot() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this._localMatrix = new dragonBones.Matrix();
/**
* @private
*/
_this._colorTransform = new dragonBones.ColorTransform();
/**
* @private
*/
_this._ffdVertices = [];
/**
* @private
*/
_this._displayList = [];
/**
* @private
*/
_this._textureDatas = [];
/**
* @private
*/
_this._replacedDisplayDatas = [];
/**
* @private
*/
_this._meshBones = [];
return _this;
}
/**
* @private
*/
Slot.prototype._onClear = function () {
_super.prototype._onClear.call(this);
var disposeDisplayList = [];
for (var i = 0, l = this._displayList.length; i < l; ++i) {
var eachDisplay = this._displayList[i];
if (eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay &&
disposeDisplayList.indexOf(eachDisplay) < 0) {
disposeDisplayList.push(eachDisplay);
}
}
for (var i = 0, l = disposeDisplayList.length; i < l; ++i) {
var eachDisplay = disposeDisplayList[i];
if (eachDisplay instanceof dragonBones.Armature) {
eachDisplay.dispose();
}
else {
this._disposeDisplay(eachDisplay);
}
}
if (this._meshDisplay && this._meshDisplay !== this._rawDisplay) {
this._disposeDisplay(this._meshDisplay);
}
if (this._rawDisplay) {
this._disposeDisplay(this._rawDisplay);
}
this.displayController = null;
this._displayDirty = false;
this._zOrderDirty = false;
this._blendModeDirty = false;
this._colorDirty = false;
this._meshDirty = false;
this._transformDirty = false;
this._blendMode = 0 /* Normal */;
this._displayIndex = -1;
this._zOrder = 0;
this._cachedFrameIndex = -1;
this._pivotX = 0.0;
this._pivotY = 0.0;
this._localMatrix.identity();
this._colorTransform.identity();
this._ffdVertices.length = 0;
this._displayList.length = 0;
this._textureDatas.length = 0;
this._replacedDisplayDatas.length = 0;
this._meshBones.length = 0;
this._skinSlotData = null;
this._displayData = null;
this._replacedDisplayData = null;
this._textureData = null;
this._meshData = null;
this._boundingBoxData = null;
this._rawDisplay = null;
this._meshDisplay = null;
this._display = null;
this._childArmature = null;
this._cachedFrameIndices = null;
};
/**
* @private
*/
Slot.prototype._isMeshBonesUpdate = function () {
for (var i = 0, l = this._meshBones.length; i < l; ++i) {
if (this._meshBones[i]._childrenTransformDirty) {
return true;
}
}
return false;
};
/**
* @private
*/
Slot.prototype._updateDisplayData = function () {
var prevDisplayData = this._displayData;
var prevReplaceDisplayData = this._replacedDisplayData;
var prevTextureData = this._textureData;
var prevMeshData = this._meshData;
var currentDisplay = this._displayIndex >= 0 && this._displayIndex < this._displayList.length ? this._displayList[this._displayIndex] : null;
if (this._displayIndex >= 0 && this._displayIndex < this._skinSlotData.displays.length) {
this._displayData = this._skinSlotData.displays[this._displayIndex];
}
else {
this._displayData = null;
}
if (this._displayIndex >= 0 && this._displayIndex < this._replacedDisplayDatas.length) {
this._replacedDisplayData = this._replacedDisplayDatas[this._displayIndex];
}
else {
this._replacedDisplayData = null;
}
if (this._displayData !== prevDisplayData || this._replacedDisplayData !== prevReplaceDisplayData || this._display != currentDisplay) {
var currentDisplayData = this._replacedDisplayData ? this._replacedDisplayData : this._displayData;
if (currentDisplayData && (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay)) {
if (this._replacedDisplayData) {
this._textureData = this._replacedDisplayData.texture;
}
else if (this._displayIndex < this._textureDatas.length && this._textureDatas[this._displayIndex]) {
this._textureData = this._textureDatas[this._displayIndex];
}
else {
this._textureData = this._displayData.texture;
}
if (currentDisplay === this._meshDisplay) {
if (this._replacedDisplayData && this._replacedDisplayData.mesh) {
this._meshData = this._replacedDisplayData.mesh;
}
else {
this._meshData = this._displayData.mesh;
}
}
else {
this._meshData = null;
}
// Update pivot offset.
if (this._meshData) {
this._pivotX = 0.0;
this._pivotY = 0.0;
}
else if (this._textureData) {
var scale = this._armature.armatureData.scale;
this._pivotX = currentDisplayData.pivot.x;
this._pivotY = currentDisplayData.pivot.y;
if (currentDisplayData.isRelativePivot) {
var rect = this._textureData.frame ? this._textureData.frame : this._textureData.region;
var width = rect.width * scale;
var height = rect.height * scale;
if (this._textureData.rotated) {
width = rect.height;
height = rect.width;
}
this._pivotX *= width;
this._pivotY *= height;
}
if (this._textureData.frame) {
this._pivotX += this._textureData.frame.x * scale;
this._pivotY += this._textureData.frame.y * scale;
}
}
else {
this._pivotX = 0.0;
this._pivotY = 0.0;
}
if (this._displayData && currentDisplayData !== this._displayData &&
(!this._meshData || this._meshData !== this._displayData.mesh)) {
this._displayData.transform.toMatrix(Slot._helpMatrix);
Slot._helpMatrix.invert();
Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint);
this._pivotX -= Slot._helpPoint.x;
this._pivotY -= Slot._helpPoint.y;
currentDisplayData.transform.toMatrix(Slot._helpMatrix);
Slot._helpMatrix.invert();
Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint);
this._pivotX += Slot._helpPoint.x;
this._pivotY += Slot._helpPoint.y;
}
if (this._meshData !== prevMeshData) {
if (this._meshData && this._displayData && this._meshData === this._displayData.mesh) {
if (this._meshData.skinned) {
this._meshBones.length = this._meshData.bones.length;
for (var i = 0, l = this._meshBones.length; i < l; ++i) {
this._meshBones[i] = this._armature.getBone(this._meshData.bones[i].name);
}
var ffdVerticesCount = 0;
for (var i = 0, l = this._meshData.boneIndices.length; i < l; ++i) {
ffdVerticesCount += this._meshData.boneIndices[i].length;
}
this._ffdVertices.length = ffdVerticesCount * 2;
}
else {
this._meshBones.length = 0;
this._ffdVertices.length = this._meshData.vertices.length;
}
for (var i = 0, l = this._ffdVertices.length; i < l; ++i) {
this._ffdVertices[i] = 0.0;
}
this._meshDirty = true;
}
else {
this._meshBones.length = 0;
this._ffdVertices.length = 0;
}
}
else if (this._textureData !== prevTextureData) {
this._meshDirty = true;
}
}
else {
this._textureData = null;
this._meshData = null;
this._pivotX = 0.0;
this._pivotY = 0.0;
this._meshBones.length = 0;
this._ffdVertices.length = 0;
}
this._displayDirty = true;
this._transformDirty = true;
if (this._displayData) {
this.origin = this._displayData.transform;
}
else if (this._replacedDisplayData) {
this.origin = this._replacedDisplayData.transform;
}
}
// Update bounding box data.
if (this._replacedDisplayData) {
this._boundingBoxData = this._replacedDisplayData.boundingBox;
}
else if (this._displayData) {
this._boundingBoxData = this._displayData.boundingBox;
}
else {
this._boundingBoxData = null;
}
};
/**
* @private
*/
Slot.prototype._updateDisplay = function () {
var prevDisplay = this._display || this._rawDisplay;
var prevChildArmature = this._childArmature;
if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) {
this._display = this._displayList[this._displayIndex];
if (this._display instanceof dragonBones.Armature) {
this._childArmature = this._display;
this._display = this._childArmature.display;
}
else {
this._childArmature = null;
}
}
else {
this._display = null;
this._childArmature = null;
}
var currentDisplay = this._display ? this._display : this._rawDisplay;
if (currentDisplay !== prevDisplay) {
this._onUpdateDisplay();
this._replaceDisplay(prevDisplay);
this._blendModeDirty = true;
this._colorDirty = true;
}
// Update frame.
if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) {
this._updateFrame();
}
// Update child armature.
if (this._childArmature !== prevChildArmature) {
if (prevChildArmature) {
prevChildArmature._parent = null; // Update child armature parent.
prevChildArmature.clock = null;
if (prevChildArmature.inheritAnimation) {
prevChildArmature.animation.reset();
}
}
if (this._childArmature) {
this._childArmature._parent = this; // Update child armature parent.
this._childArmature.clock = this._armature.clock;
if (this._childArmature.inheritAnimation) {
if (this._childArmature.cacheFrameRate === 0) {
var cacheFrameRate = this._armature.cacheFrameRate;
if (cacheFrameRate !== 0) {
this._childArmature.cacheFrameRate = cacheFrameRate;
}
}
// Child armature action.
var actions = this._skinSlotData.slot.actions.length > 0 ? this._skinSlotData.slot.actions : this._childArmature.armatureData.actions;
if (actions.length > 0) {
for (var i = 0, l = actions.length; i < l; ++i) {
this._childArmature._bufferAction(actions[i]);
}
}
else {
this._childArmature.animation.play();
}
}
}
}
};
/**
* @private
*/
Slot.prototype._updateGlobalTransformMatrix = function (isCache) {
this.globalTransformMatrix.copyFrom(this._localMatrix);
this.globalTransformMatrix.concat(this._parent.globalTransformMatrix);
if (isCache) {
this.global.fromMatrix(this.globalTransformMatrix);
}
else {
this._globalDirty = true;
}
};
/**
* @private
*/
Slot.prototype._init = function (skinSlotData, rawDisplay, meshDisplay) {
if (this._skinSlotData) {
return;
}
this._skinSlotData = skinSlotData;
var slotData = this._skinSlotData.slot;
this.name = slotData.name;
this._zOrder = slotData.zOrder;
this._blendMode = slotData.blendMode;
this._colorTransform.copyFrom(slotData.color);
this._rawDisplay = rawDisplay;
this._meshDisplay = meshDisplay;
this._blendModeDirty = true;
this._colorDirty = true;
};
/**
* @internal
* @private
*/
Slot.prototype._setArmature = function (value) {
if (this._armature === value) {
return;
}
if (this._armature) {
this._armature._removeSlotFromSlotList(this);
}
this._armature = value;
this._onUpdateDisplay();
if (this._armature) {
this._armature._addSlotToSlotList(this);
this._addDisplay();
}
else {
this._removeDisplay();
}
};
/**
* @internal
* @private
*/
Slot.prototype._update = function (cacheFrameIndex) {
if (this._displayDirty) {
this._displayDirty = false;
this._updateDisplay();
if (this._transformDirty) {
if (this.origin) {
this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix);
}
else {
this.global.copyFrom(this.offset).toMatrix(this._localMatrix);
}
}
}
if (this._zOrderDirty) {
this._zOrderDirty = false;
this._updateZOrder();
}
if (cacheFrameIndex >= 0 && this._cachedFrameIndices) {
var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex];
if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) {
this._transformDirty = false;
}
else if (cachedFrameIndex >= 0) {
this._transformDirty = true;
this._cachedFrameIndex = cachedFrameIndex;
}
else if (this._transformDirty || this._parent._childrenTransformDirty) {
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
else if (this._cachedFrameIndex >= 0) {
this._transformDirty = false;
this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex;
}
else {
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
}
else if (this._transformDirty || this._parent._childrenTransformDirty) {
cacheFrameIndex = -1;
this._transformDirty = true;
this._cachedFrameIndex = -1;
}
if (!this._display) {
return;
}
if (this._blendModeDirty) {
this._blendModeDirty = false;
this._updateBlendMode();
}
if (this._colorDirty) {
this._colorDirty = false;
this._updateColor();
}
if (this._meshData && this._displayData && this._meshData === this._displayData.mesh) {
if (this._meshDirty || (this._meshData.skinned && this._isMeshBonesUpdate())) {
this._meshDirty = false;
this._updateMesh();
}
if (this._meshData.skinned) {
if (this._transformDirty) {
this._transformDirty = false;
this._updateTransform(true);
}
return;
}
}
if (this._transformDirty) {
this._transformDirty = false;
if (this._cachedFrameIndex < 0) {
var isCache = cacheFrameIndex >= 0;
this._updateGlobalTransformMatrix(isCache);
if (isCache) {
this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature._armatureData.setCacheFrame(this.globalTransformMatrix, this.global);
}
}
else {
this._armature._armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex);
}
this._updateTransform(false);
}
};
/**
* @private
*/
Slot.prototype._updateTransformAndMatrix = function () {
if (this._transformDirty) {
this._transformDirty = false;
this._updateGlobalTransformMatrix(false);
}
};
/**
* @private Factory
*/
Slot.prototype._setDisplayList = function (value) {
if (value && value.length > 0) {
if (this._displayList.length !== value.length) {
this._displayList.length = value.length;
}
for (var i = 0, l = value.length; i < l; ++i) {
var eachDisplay = value[i];
if (eachDisplay && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay &&
!(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) {
this._initDisplay(eachDisplay);
}
this._displayList[i] = eachDisplay;
}
}
else if (this._displayList.length > 0) {
this._displayList.length = 0;
}
if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) {
this._displayDirty = this._display !== this._displayList[this._displayIndex];
}
else {
this._displayDirty = this._display != null;
}
this._updateDisplayData();
return this._displayDirty;
};
/**
* @internal
* @private
*/
Slot.prototype._setDisplayIndex = function (value) {
if (this._displayIndex === value) {
return false;
}
this._displayIndex = value;
this._displayDirty = true;
this._updateDisplayData();
return this._displayDirty;
};
/**
* @internal
* @private
*/
Slot.prototype._setZorder = function (value) {
if (this._zOrder === value) {
//return false;
}
this._zOrder = value;
this._zOrderDirty = true;
return this._zOrderDirty;
};
/**
* @internal
* @private
*/
Slot.prototype._setColor = function (value) {
this._colorTransform.copyFrom(value);
this._colorDirty = true;
return true;
};
/**
* @language zh_CN
* 判断指定的点是否在插槽的自定义包围盒内。
* @param x 点的水平坐标。(骨架内坐标系)
* @param y 点的垂直坐标。(骨架内坐标系)
* @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断]
* @version DragonBones 5.0
*/
Slot.prototype.containsPoint = function (x, y) {
if (!this._boundingBoxData) {
return false;
}
this._updateTransformAndMatrix();
Slot._helpMatrix.copyFrom(this.globalTransformMatrix);
Slot._helpMatrix.invert();
Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint);
return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y);
};
/**
* @language zh_CN
* 判断指定的线段与插槽的自定义包围盒是否相交。
* @param xA 线段起点的水平坐标。(骨架内坐标系)
* @param yA 线段起点的垂直坐标。(骨架内坐标系)
* @param xB 线段终点的水平坐标。(骨架内坐标系)
* @param yB 线段终点的垂直坐标。(骨架内坐标系)
* @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系)
* @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系)
* @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度]
* @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点]
* @version DragonBones 5.0
*/
Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
if (!this._boundingBoxData) {
return 0;
}
this._updateTransformAndMatrix();
Slot._helpMatrix.copyFrom(this.globalTransformMatrix);
Slot._helpMatrix.invert();
Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint);
xA = Slot._helpPoint.x;
yA = Slot._helpPoint.y;
Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint);
xB = Slot._helpPoint.x;
yB = Slot._helpPoint.y;
var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians);
if (intersectionCount > 0) {
if (intersectionCount === 1 || intersectionCount === 2) {
if (intersectionPointA) {
this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA);
if (intersectionPointB) {
intersectionPointB.x = intersectionPointA.x;
intersectionPointB.y = intersectionPointA.y;
}
}
else if (intersectionPointB) {
this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB);
}
}
else {
if (intersectionPointA) {
this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA);
}
if (intersectionPointB) {
this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB);
}
}
if (normalRadians) {
this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true);
normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x);
this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true);
normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x);
}
}
return intersectionCount;
};
/**
* @language zh_CN
* 在下一帧更新显示对象的状态。
* @version DragonBones 4.5
*/
Slot.prototype.invalidUpdate = function () {
this._displayDirty = true;
this._transformDirty = true;
};
Object.defineProperty(Slot.prototype, "skinSlotData", {
/**
* @private
*/
get: function () {
return this._skinSlotData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "boundingBoxData", {
/**
* @language zh_CN
* 插槽此时的自定义包围盒数据。
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
get: function () {
return this._boundingBoxData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "rawDisplay", {
/**
* @private
*/
get: function () {
return this._rawDisplay;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "meshDisplay", {
/**
* @private
*/
get: function () {
return this._meshDisplay;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "displayIndex", {
/**
* @language zh_CN
* 此时显示的显示对象在显示列表中的索引。
* @version DragonBones 4.5
*/
get: function () {
return this._displayIndex;
},
set: function (value) {
if (this._setDisplayIndex(value)) {
this._update(-1);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "displayList", {
/**
* @language zh_CN
* 包含显示对象或子骨架的显示列表。
* @version DragonBones 3.0
*/
get: function () {
return this._displayList.concat();
},
set: function (value) {
var backupDisplayList = this._displayList.concat(); // Copy.
var disposeDisplayList = [];
if (this._setDisplayList(value)) {
this._update(-1);
}
// Release replaced render displays.
for (var i = 0, l = backupDisplayList.length; i < l; ++i) {
var eachDisplay = backupDisplayList[i];
if (eachDisplay && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay &&
this._displayList.indexOf(eachDisplay) < 0 &&
disposeDisplayList.indexOf(eachDisplay) < 0) {
disposeDisplayList.push(eachDisplay);
}
}
for (var i = 0, l = disposeDisplayList.length; i < l; ++i) {
var eachDisplay = disposeDisplayList[i];
if (eachDisplay instanceof dragonBones.Armature) {
eachDisplay.dispose();
}
else {
this._disposeDisplay(eachDisplay);
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "display", {
/**
* @language zh_CN
* 此时显示的显示对象。
* @version DragonBones 3.0
*/
get: function () {
return this._display;
},
set: function (value) {
if (this._display === value) {
return;
}
var displayListLength = this._displayList.length;
if (this._displayIndex < 0 && displayListLength === 0) {
this._displayIndex = 0;
}
if (this._displayIndex < 0) {
return;
}
else {
var replaceDisplayList = this.displayList; // Copy.
if (displayListLength <= this._displayIndex) {
replaceDisplayList.length = this._displayIndex + 1;
}
replaceDisplayList[this._displayIndex] = value;
this.displayList = replaceDisplayList;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Slot.prototype, "childArmature", {
/**
* @language zh_CN
* 此时显示的子骨架。
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
get: function () {
return this._childArmature;
},
set: function (value) {
if (this._childArmature === value) {
return;
}
this.display = value;
},
enumerable: true,
configurable: true
});
/**
* @deprecated
* @see #display
*/
Slot.prototype.getDisplay = function () {
return this._display;
};
/**
* @deprecated
* @see #display
*/
Slot.prototype.setDisplay = function (value) {
this.display = value;
};
return Slot;
}(dragonBones.TransformObject));
dragonBones.Slot = Slot;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。
* @see dragonBones.ArmatureData
* @see dragonBones.Bone
* @see dragonBones.Slot
* @see dragonBones.Animation
* @version DragonBones 3.0
*/
var Armature = (function (_super) {
__extends(Armature, _super);
/**
* @internal
* @private
*/
function Armature() {
var _this = _super.call(this) || this;
_this._bones = [];
_this._slots = [];
_this._actions = [];
_this._events = [];
/**
* @deprecated
* @see #cacheFrameRate
*/
_this.enableCache = false;
return _this;
}
/**
* @private
*/
Armature.toString = function () {
return "[class dragonBones.Armature]";
};
Armature._onSortSlots = function (a, b) {
return a._zOrder > b._zOrder ? 1 : -1;
};
/**
* @private
*/
Armature.prototype._onClear = function () {
for (var i = 0, l = this._bones.length; i < l; ++i) {
this._bones[i].returnToPool();
}
for (var i = 0, l = this._slots.length; i < l; ++i) {
this._slots[i].returnToPool();
}
for (var i = 0, l = this._events.length; i < l; ++i) {
this._events[i].returnToPool();
}
if (this._clock) {
this._clock.remove(this);
}
if (this._proxy) {
this._proxy._onClear();
}
if (this._replaceTextureAtlasData) {
this._replaceTextureAtlasData.returnToPool();
}
if (this._animation) {
this._animation.returnToPool();
}
this.inheritAnimation = true;
this.debugDraw = false;
this.userData = null;
this._debugDraw = false;
this._delayDispose = false;
this._lockDispose = false;
this._bonesDirty = false;
this._slotsDirty = false;
this._zOrderDirty = false;
this._flipX = false;
this._flipY = false;
this._bones.length = 0;
this._slots.length = 0;
this._actions.length = 0;
this._events.length = 0;
this._armatureData = null;
this._skinData = null;
this._animation = null;
this._proxy = null;
this._display = null;
this._eventManager = null;
this._parent = null;
this._clock = null;
this._replaceTextureAtlasData = null;
this._replacedTexture = null;
};
Armature.prototype._sortBones = function () {
var total = this._bones.length;
if (total <= 0) {
return;
}
var sortHelper = this._bones.concat();
var index = 0;
var count = 0;
this._bones.length = 0;
while (count < total) {
var bone = sortHelper[index++];
if (index >= total) {
index = 0;
}
if (this._bones.indexOf(bone) >= 0) {
continue;
}
if (bone.parent && this._bones.indexOf(bone.parent) < 0) {
continue;
}
if (bone.ik && this._bones.indexOf(bone.ik) < 0) {
continue;
}
if (bone.ik && bone.ikChain > 0 && bone.ikChainIndex === bone.ikChain) {
this._bones.splice(this._bones.indexOf(bone.parent) + 1, 0, bone); // ik, parent, bone, children
}
else {
this._bones.push(bone);
}
count++;
}
};
Armature.prototype._sortSlots = function () {
this._slots.sort(Armature._onSortSlots);
};
Armature.prototype._doAction = function (value) {
switch (value.type) {
case 0 /* Play */:
this._animation.playConfig(value.animationConfig);
break;
default:
break;
}
};
/**
* @private
*/
Armature.prototype._init = function (armatureData, skinData, proxy, display, eventManager) {
if (this._armatureData) {
return;
}
this._armatureData = armatureData;
this._skinData = skinData;
this._animation = dragonBones.BaseObject.borrowObject(dragonBones.Animation);
this._proxy = proxy;
this._display = display;
this._eventManager = eventManager;
this._animation._init(this);
this._animation.animations = this._armatureData.animations;
};
/**
* @internal
* @private
*/
Armature.prototype._addBoneToBoneList = function (value) {
if (this._bones.indexOf(value) < 0) {
this._bonesDirty = true;
this._bones.push(value);
this._animation._timelineStateDirty = true;
}
};
/**
* @internal
* @private
*/
Armature.prototype._removeBoneFromBoneList = function (value) {
var index = this._bones.indexOf(value);
if (index >= 0) {
this._bones.splice(index, 1);
this._animation._timelineStateDirty = true;
}
};
/**
* @internal
* @private
*/
Armature.prototype._addSlotToSlotList = function (value) {
if (this._slots.indexOf(value) < 0) {
this._slotsDirty = true;
this._slots.push(value);
this._animation._timelineStateDirty = true;
}
};
/**
* @internal
* @private
*/
Armature.prototype._removeSlotFromSlotList = function (value) {
var index = this._slots.indexOf(value);
if (index >= 0) {
this._slots.splice(index, 1);
this._animation._timelineStateDirty = true;
}
};
/**
* @private
*/
Armature.prototype._sortZOrder = function (slotIndices) {
var slots = this._armatureData.sortedSlots;
var isOriginal = !slotIndices || slotIndices.length < 1;
if (this._zOrderDirty || !isOriginal) {
for (var i = 0, l = slots.length; i < l; ++i) {
var slotIndex = isOriginal ? i : slotIndices[i];
var slotData = slots[slotIndex];
if (slotData) {
var slot = this.getSlot(slotData.name);
if (slot) {
slot._setZorder(i);
}
}
}
this._slotsDirty = true;
this._zOrderDirty = !isOriginal;
}
};
/**
* @private
*/
Armature.prototype._bufferAction = function (value) {
this._actions.push(value);
};
/**
* @internal
* @private
*/
Armature.prototype._bufferEvent = function (value, type) {
value.type = type;
value.armature = this;
this._events.push(value);
};
/**
* @language zh_CN
* 释放骨架。 (回收到对象池)
* @version DragonBones 3.0
*/
Armature.prototype.dispose = function () {
if (this._armatureData) {
if (this._lockDispose) {
this._delayDispose = true;
}
else {
this.returnToPool();
}
}
};
/**
* @language zh_CN
* 更新骨架和动画。
* @param passedTime 两帧之间的时间间隔。 (以秒为单位)
* @see dragonBones.IAnimateble
* @see dragonBones.WorldClock
* @version DragonBones 3.0
*/
Armature.prototype.advanceTime = function (passedTime) {
if (!this._armatureData) {
throw new Error("The armature has been disposed.");
//return;
}
else if (!this._armatureData.parent) {
throw new Error("The armature data has been disposed.");
//return;
}
var prevCacheFrameIndex = this._animation._cacheFrameIndex;
// Update nimation.
this._animation._advanceTime(passedTime);
var currentCacheFrameIndex = this._animation._cacheFrameIndex;
// Sort bones and slots.
if (this._bonesDirty) {
this._bonesDirty = false;
this._sortBones();
}
if (this._slotsDirty) {
this._slotsDirty = false;
this._sortSlots();
}
var i = 0, l = 0;
// Update bones and slots.
if (currentCacheFrameIndex < 0 || currentCacheFrameIndex !== prevCacheFrameIndex) {
for (i = 0, l = this._bones.length; i < l; ++i) {
this._bones[i]._update(currentCacheFrameIndex);
}
for (i = 0, l = this._slots.length; i < l; ++i) {
this._slots[i]._update(currentCacheFrameIndex);
}
}
//
var drawed = this.debugDraw || dragonBones.DragonBones.debugDraw;
if (drawed || this._debugDraw) {
this._debugDraw = drawed;
this._proxy._debugDraw(this._debugDraw);
}
if (!this._lockDispose) {
this._lockDispose = true;
// Events. (Dispatch event before action.)
l = this._events.length;
if (l > 0) {
for (i = 0; i < l; ++i) {
var eventObject = this._events[i];
this._proxy._dispatchEvent(eventObject.type, eventObject);
if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) {
this._eventManager._dispatchEvent(eventObject.type, eventObject);
}
eventObject.returnToPool();
}
this._events.length = 0;
}
// Actions.
l = this._actions.length;
if (l > 0) {
for (i = 0; i < l; ++i) {
var action = this._actions[i];
if (action.slot) {
var slot = this.getSlot(action.slot.name);
if (slot) {
var childArmature = slot.childArmature;
if (childArmature) {
childArmature._doAction(action);
}
}
}
else if (action.bone) {
for (var iA = 0, lA = this._slots.length; iA < lA; ++iA) {
var childArmature = this._slots[iA].childArmature;
if (childArmature) {
childArmature._doAction(action);
}
}
}
else {
this._doAction(action);
}
}
this._actions.length = 0;
}
this._lockDispose = false;
}
if (this._delayDispose) {
this.returnToPool();
}
};
/**
* @language zh_CN
* 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新)
* @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。
* @param updateSlotDisplay 是否更新插槽的显示对象。
* @see dragonBones.Bone
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) {
if (boneName === void 0) { boneName = null; }
if (updateSlotDisplay === void 0) { updateSlotDisplay = false; }
if (boneName) {
var bone = this.getBone(boneName);
if (bone) {
bone.invalidUpdate();
if (updateSlotDisplay) {
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
if (slot.parent === bone) {
slot.invalidUpdate();
}
}
}
}
}
else {
for (var i = 0, l = this._bones.length; i < l; ++i) {
this._bones[i].invalidUpdate();
}
if (updateSlotDisplay) {
for (var i = 0, l = this._slots.length; i < l; ++i) {
this._slots[i].invalidUpdate();
}
}
}
};
/**
* @language zh_CN
* 判断点是否在所有插槽的自定义包围盒内。
* @param x 点的水平坐标。(骨架内坐标系)
* @param y 点的垂直坐标。(骨架内坐标系)
* @version DragonBones 5.0
*/
Armature.prototype.containsPoint = function (x, y) {
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
if (slot.containsPoint(x, y)) {
return slot;
}
}
return null;
};
/**
* @language zh_CN
* 判断线段是否与骨架的所有插槽的自定义包围盒相交。
* @param xA 线段起点的水平坐标。(骨架内坐标系)
* @param yA 线段起点的垂直坐标。(骨架内坐标系)
* @param xB 线段终点的水平坐标。(骨架内坐标系)
* @param yB 线段终点的垂直坐标。(骨架内坐标系)
* @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系)
* @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系)
* @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度]
* @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。
* @version DragonBones 5.0
*/
Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) {
if (intersectionPointA === void 0) { intersectionPointA = null; }
if (intersectionPointB === void 0) { intersectionPointB = null; }
if (normalRadians === void 0) { normalRadians = null; }
var isV = xA === xB;
var dMin = 0.0;
var dMax = 0.0;
var intXA = 0.0;
var intYA = 0.0;
var intXB = 0.0;
var intYB = 0.0;
var intAN = 0.0;
var intBN = 0.0;
var intSlotA = null;
var intSlotB = null;
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians);
if (intersectionCount > 0) {
if (intersectionPointA || intersectionPointB) {
if (intersectionPointA) {
var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA;
if (d < 0.0) {
d = -d;
}
if (!intSlotA || d < dMin) {
dMin = d;
intXA = intersectionPointA.x;
intYA = intersectionPointA.y;
intSlotA = slot;
if (normalRadians) {
intAN = normalRadians.x;
}
}
}
if (intersectionPointB) {
var d = intersectionPointB.x - xA;
if (d < 0.0) {
d = -d;
}
if (!intSlotB || d > dMax) {
dMax = d;
intXB = intersectionPointB.x;
intYB = intersectionPointB.y;
intSlotB = slot;
if (normalRadians) {
intBN = normalRadians.y;
}
}
}
}
else {
intSlotA = slot;
break;
}
}
}
if (intSlotA && intersectionPointA) {
intersectionPointA.x = intXA;
intersectionPointA.y = intYA;
if (normalRadians) {
normalRadians.x = intAN;
}
}
if (intSlotB && intersectionPointB) {
intersectionPointB.x = intXB;
intersectionPointB.y = intYB;
if (normalRadians) {
normalRadians.y = intBN;
}
}
return intSlotA;
};
/**
* @language zh_CN
* 获取指定名称的骨骼。
* @param name 骨骼的名称。
* @returns 骨骼。
* @see dragonBones.Bone
* @version DragonBones 3.0
*/
Armature.prototype.getBone = function (name) {
for (var i = 0, l = this._bones.length; i < l; ++i) {
var bone = this._bones[i];
if (bone.name === name) {
return bone;
}
}
return null;
};
/**
* @language zh_CN
* 通过显示对象获取骨骼。
* @param display 显示对象。
* @returns 包含这个显示对象的骨骼。
* @see dragonBones.Bone
* @version DragonBones 3.0
*/
Armature.prototype.getBoneByDisplay = function (display) {
var slot = this.getSlotByDisplay(display);
return slot ? slot.parent : null;
};
/**
* @language zh_CN
* 获取插槽。
* @param name 插槽的名称。
* @returns 插槽。
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
Armature.prototype.getSlot = function (name) {
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
if (slot.name === name) {
return slot;
}
}
return null;
};
/**
* @language zh_CN
* 通过显示对象获取插槽。
* @param display 显示对象。
* @returns 包含这个显示对象的插槽。
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
Armature.prototype.getSlotByDisplay = function (display) {
if (display) {
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
if (slot.display === display) {
return slot;
}
}
}
return null;
};
/**
* @deprecated
*/
Armature.prototype.addBone = function (value, parentName) {
if (parentName === void 0) { parentName = null; }
if (value) {
value._setArmature(this);
value._setParent(parentName ? this.getBone(parentName) : null);
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @deprecated
*/
Armature.prototype.removeBone = function (value) {
if (value && value.armature === this) {
value._setParent(null);
value._setArmature(null);
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @deprecated
*/
Armature.prototype.addSlot = function (value, parentName) {
var bone = this.getBone(parentName);
if (bone) {
value._setArmature(this);
value._setParent(bone);
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @deprecated
*/
Armature.prototype.removeSlot = function (value) {
if (value && value.armature === this) {
value._setParent(null);
value._setArmature(null);
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @language zh_CN
* 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图类型。
* @param texture 贴图。
* @version DragonBones 4.5
*/
Armature.prototype.replaceTexture = function (texture) {
this.replacedTexture = texture;
};
/**
* @language zh_CN
* 获取所有骨骼。
* @see dragonBones.Bone
* @version DragonBones 3.0
*/
Armature.prototype.getBones = function () {
return this._bones;
};
/**
* @language zh_CN
* 获取所有插槽。
* @see dragonBones.Slot
* @version DragonBones 3.0
*/
Armature.prototype.getSlots = function () {
return this._slots;
};
Object.defineProperty(Armature.prototype, "name", {
/**
* @language zh_CN
* 骨架名称。
* @see dragonBones.ArmatureData#name
* @version DragonBones 3.0
*/
get: function () {
return this._armatureData ? this._armatureData.name : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "armatureData", {
/**
* @language zh_CN
* 获取骨架数据。
* @see dragonBones.ArmatureData
* @version DragonBones 4.5
*/
get: function () {
return this._armatureData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "animation", {
/**
* @language zh_CN
* 获得动画控制器。
* @see dragonBones.Animation
* @version DragonBones 3.0
*/
get: function () {
return this._animation;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "eventDispatcher", {
/**
* @language zh_CN
* 获取事件监听器。
* @version DragonBones 5.0
*/
get: function () {
return this._proxy;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "display", {
/**
* @language zh_CN
* 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。
* @version DragonBones 3.0
*/
get: function () {
return this._display;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "parent", {
/**
* @language zh_CN
* 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系)
* @see dragonBones.Slot
* @version DragonBones 4.5
*/
get: function () {
return this._parent;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "flipX", {
get: function () {
return this._flipX;
},
set: function (value) {
if (this._flipX === value) {
return;
}
this._flipX = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "flipY", {
get: function () {
return this._flipY;
},
set: function (value) {
if (this._flipY === value) {
return;
}
this._flipY = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "cacheFrameRate", {
/**
* @language zh_CN
* 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。
* 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。
* 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。
* 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。
* @see dragonBones.DragonBonesData#frameRate
* @see dragonBones.ArmatureData#frameRate
* @version DragonBones 4.5
*/
get: function () {
return this._armatureData.cacheFrameRate;
},
set: function (value) {
if (this._armatureData.cacheFrameRate !== value) {
this._armatureData.cacheFrames(value);
// Set child armature frameRate.
for (var i = 0, l = this._slots.length; i < l; ++i) {
var childArmature = this._slots[i].childArmature;
if (childArmature) {
childArmature.cacheFrameRate = value;
}
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "clock", {
/**
* @inheritDoc
*/
get: function () {
return this._clock;
},
set: function (value) {
if (this._clock === value) {
return;
}
var prevClock = this._clock;
if (prevClock) {
prevClock.remove(this);
}
this._clock = value;
if (this._clock) {
this._clock.add(this);
}
// Update childArmature clock.
for (var i = 0, l = this._slots.length; i < l; ++i) {
var childArmature = this._slots[i].childArmature;
if (childArmature) {
childArmature.clock = this._clock;
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Armature.prototype, "replacedTexture", {
/**
* @language zh_CN
* 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。
* @version DragonBones 4.5
*/
get: function () {
return this._replacedTexture;
},
set: function (value) {
if (this._replacedTexture === value) {
return;
}
if (this._replaceTextureAtlasData) {
this._replaceTextureAtlasData.returnToPool();
this._replaceTextureAtlasData = null;
}
this._replacedTexture = value;
for (var i = 0, l = this._slots.length; i < l; ++i) {
var slot = this._slots[i];
slot.invalidUpdate();
slot._update(-1);
}
},
enumerable: true,
configurable: true
});
/**
* @deprecated
* @see dragonBones.Armature#eventDispatcher
*/
Armature.prototype.hasEventListener = function (type) {
return this._proxy.hasEvent(type);
};
/**
* @deprecated
* @see dragonBones.Armature#eventDispatcher
*/
Armature.prototype.addEventListener = function (type, listener, target) {
this._proxy.addEvent(type, listener, target);
};
/**
* @deprecated
* @see dragonBones.Armature#eventDispatcher
*/
Armature.prototype.removeEventListener = function (type, listener, target) {
this._proxy.removeEvent(type, listener, target);
};
/**
* @deprecated
* @see #cacheFrameRate
*/
Armature.prototype.enableAnimationCache = function (frameRate) {
this.cacheFrameRate = frameRate;
};
/**
* @deprecated
* @see #display
*/
Armature.prototype.getDisplay = function () {
return this._display;
};
return Armature;
}(dragonBones.BaseObject));
dragonBones.Armature = Armature;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 动画控制器,用来播放动画数据,管理动画状态。
* @see dragonBones.AnimationData
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
var Animation = (function (_super) {
__extends(Animation, _super);
/**
* @internal
* @private
*/
function Animation() {
var _this = _super.call(this) || this;
_this._animationNames = [];
_this._animations = {};
_this._animationStates = [];
return _this;
}
Animation._sortAnimationState = function (a, b) {
return a.layer > b.layer ? -1 : 1;
};
/**
* @private
*/
Animation.toString = function () {
return "[class dragonBones.Animation]";
};
/**
* @private
*/
Animation.prototype._onClear = function () {
for (var i = 0, l = this._animationStates.length; i < l; ++i) {
this._animationStates[i].returnToPool();
}
if (this._animationConfig) {
this._animationConfig.returnToPool();
}
for (var k in this._animations) {
delete this._animations[k];
}
this.timeScale = 1.0;
this._isPlaying = false;
this._animationStateDirty = false;
this._timelineStateDirty = false;
this._cacheFrameIndex = -1;
this._animationNames.length = 0;
//this._animations.clear();
this._animationStates.length = 0;
this._armature = null;
this._lastAnimationState = null;
this._animationConfig = null;
};
Animation.prototype._fadeOut = function (animationConfig) {
var i = 0, l = this._animationStates.length;
var animationState = null;
switch (animationConfig.fadeOutMode) {
case 1 /* SameLayer */:
for (; i < l; ++i) {
animationState = this._animationStates[i];
if (animationState.layer === animationConfig.layer) {
animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
}
}
break;
case 2 /* SameGroup */:
for (; i < l; ++i) {
animationState = this._animationStates[i];
if (animationState.group === animationConfig.group) {
animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
}
}
break;
case 3 /* SameLayerAndGroup */:
for (; i < l; ++i) {
animationState = this._animationStates[i];
if (animationState.layer === animationConfig.layer &&
animationState.group === animationConfig.group) {
animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
}
}
break;
case 4 /* All */:
for (; i < l; ++i) {
animationState = this._animationStates[i];
animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut);
}
break;
case 0 /* None */:
default:
break;
}
};
/**
* @internal
* @private
*/
Animation.prototype._init = function (armature) {
if (this._armature) {
return;
}
this._armature = armature;
this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig);
};
/**
* @internal
* @private
*/
Animation.prototype._advanceTime = function (passedTime) {
if (!this._isPlaying) {
return;
}
if (passedTime < 0.0) {
passedTime = -passedTime;
}
if (this._armature.inheritAnimation && this._armature._parent) {
passedTime *= this._armature._parent._armature.animation.timeScale;
}
if (this.timeScale !== 1.0) {
passedTime *= this.timeScale;
}
var animationStateCount = this._animationStates.length;
if (animationStateCount === 1) {
var animationState = this._animationStates[0];
if (animationState._fadeState > 0 && animationState._subFadeState > 0) {
animationState.returnToPool();
this._animationStates.length = 0;
this._animationStateDirty = true;
this._lastAnimationState = null;
}
else {
var animationData = animationState.animationData;
var cacheFrameRate = animationData.cacheFrameRate;
if (this._animationStateDirty && cacheFrameRate > 0.0) {
this._animationStateDirty = false;
var bones = this._armature.getBones();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name);
}
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var slot = slots[i];
slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name);
}
}
if (this._timelineStateDirty) {
animationState._updateTimelineStates();
}
animationState._advanceTime(passedTime, cacheFrameRate);
}
}
else if (animationStateCount > 1) {
for (var i = 0, r = 0; i < animationStateCount; ++i) {
var animationState = this._animationStates[i];
if (animationState._fadeState > 0 && animationState._subFadeState > 0) {
r++;
animationState.returnToPool();
this._animationStateDirty = true;
if (this._lastAnimationState === animationState) {
this._lastAnimationState = null;
}
}
else {
if (r > 0) {
this._animationStates[i - r] = animationState;
}
if (this._timelineStateDirty) {
animationState._updateTimelineStates();
}
animationState._advanceTime(passedTime, 0.0);
}
if (i === animationStateCount - 1 && r > 0) {
this._animationStates.length -= r;
if (!this._lastAnimationState && this._animationStates.length > 0) {
this._lastAnimationState = this._animationStates[this._animationStates.length - 1];
}
}
}
this._cacheFrameIndex = -1;
}
else {
this._cacheFrameIndex = -1;
}
this._timelineStateDirty = false;
};
/**
* @language zh_CN
* 清除所有动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.reset = function () {
for (var i = 0, l = this._animationStates.length; i < l; ++i) {
this._animationStates[i].returnToPool();
}
this._isPlaying = false;
this._animationStateDirty = false;
this._timelineStateDirty = false;
this._cacheFrameIndex = -1;
this._animationConfig.clear();
this._animationStates.length = 0;
this._lastAnimationState = null;
};
/**
* @language zh_CN
* 暂停播放动画。
* @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
Animation.prototype.stop = function (animationName) {
if (animationName === void 0) { animationName = null; }
if (animationName) {
var animationState = this.getState(animationName);
if (animationState) {
animationState.stop();
}
}
else {
this._isPlaying = false;
}
};
/**
* @language zh_CN
* @beta
* 通过动画配置来播放动画。
* @param animationConfig 动画配置。
* @returns 对应的动画状态。
* @see dragonBones.AnimationConfig
* @see dragonBones.AnimationState
* @version DragonBones 5.0
*/
Animation.prototype.playConfig = function (animationConfig) {
if (!animationConfig) {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
//return null;
}
var animationName = animationConfig.animation ? animationConfig.animation : animationConfig.name;
var animationData = this._animations[animationName];
if (!animationData) {
console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName);
return null;
}
this._isPlaying = true;
if (animationConfig.fadeInTime < 0.0 || animationConfig.fadeInTime !== animationConfig.fadeInTime) {
if (this._lastAnimationState) {
animationConfig.fadeInTime = animationData.fadeInTime;
}
else {
animationConfig.fadeInTime = 0.0;
}
}
if (animationConfig.fadeOutTime < 0.0 || animationConfig.fadeOutTime !== animationConfig.fadeOutTime) {
animationConfig.fadeOutTime = animationConfig.fadeInTime;
}
if (animationConfig.timeScale <= -100.0 || animationConfig.timeScale !== animationConfig.timeScale) {
animationConfig.timeScale = 1.0 / animationData.scale;
}
if (animationData.frameCount > 1) {
if (animationConfig.position !== animationConfig.position) {
animationConfig.position = 0.0;
}
else if (animationConfig.position < 0.0) {
animationConfig.position %= animationData.duration;
animationConfig.position = animationData.duration - animationConfig.position;
}
else if (animationConfig.position === animationData.duration) {
animationConfig.position -= 0.000001;
}
else if (animationConfig.position > animationData.duration) {
animationConfig.position %= animationData.duration;
}
if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) {
animationConfig.duration = animationData.duration - animationConfig.position;
}
if (animationConfig.playTimes < 0) {
animationConfig.playTimes = animationData.playTimes;
}
}
else {
animationConfig.playTimes = 1;
animationConfig.position = 0.0;
if (animationConfig.duration > 0.0) {
animationConfig.duration = 0.0;
}
}
var isStop = false;
if (animationConfig.duration === 0.0) {
animationConfig.duration = -1.0;
isStop = true;
}
this._fadeOut(animationConfig);
this._lastAnimationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState);
this._lastAnimationState._init(this._armature, animationData, animationConfig);
this._animationStates.push(this._lastAnimationState);
this._animationStateDirty = true;
this._cacheFrameIndex = -1;
if (this._animationStates.length > 1) {
this._animationStates.sort(Animation._sortAnimationState);
}
// Child armature play same name animation.
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var childArmature = slots[i].childArmature;
if (childArmature && childArmature.inheritAnimation &&
childArmature.animation.hasAnimation(animationName) &&
!childArmature.animation.getState(animationName)) {
childArmature.animation.fadeIn(animationName); //
}
}
if (animationConfig.fadeInTime <= 0.0) {
this._armature.advanceTime(0.0);
}
if (isStop) {
this._lastAnimationState.stop();
}
return this._lastAnimationState;
};
/**
* @language zh_CN
* 淡入播放动画。
* @param animationName 动画数据名称。
* @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次]
* @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位)
* @param layer 混合图层,图层高会优先获取混合权重。
* @param group 混合组,用于动画状态编组,方便控制淡出。
* @param fadeOutMode 淡出模式。
* @returns 对应的动画状态。
* @see dragonBones.AnimationFadeOutMode
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) {
if (fadeInTime === void 0) { fadeInTime = -1.0; }
if (playTimes === void 0) { playTimes = -1; }
if (layer === void 0) { layer = 0; }
if (group === void 0) { group = null; }
if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; }
this._animationConfig.clear();
this._animationConfig.fadeOutMode = fadeOutMode;
this._animationConfig.playTimes = playTimes;
this._animationConfig.layer = layer;
this._animationConfig.fadeInTime = fadeInTime;
this._animationConfig.animation = animationName;
this._animationConfig.group = group;
return this.playConfig(this._animationConfig);
};
/**
* @language zh_CN
* 播放动画。
* @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。
* @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次]
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
Animation.prototype.play = function (animationName, playTimes) {
if (animationName === void 0) { animationName = null; }
if (playTimes === void 0) { playTimes = -1; }
this._animationConfig.clear();
this._animationConfig.playTimes = playTimes;
this._animationConfig.fadeInTime = 0.0;
this._animationConfig.animation = animationName;
if (animationName) {
this.playConfig(this._animationConfig);
}
else if (!this._lastAnimationState) {
var defaultAnimation = this._armature.armatureData.defaultAnimation;
if (defaultAnimation) {
this._animationConfig.animation = defaultAnimation.name;
this.playConfig(this._animationConfig);
}
}
else if (!this._isPlaying || (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted)) {
this._isPlaying = true;
this._lastAnimationState.play();
}
else {
this._animationConfig.animation = this._lastAnimationState.name;
this.playConfig(this._animationConfig);
}
return this._lastAnimationState;
};
/**
* @language zh_CN
* 从指定时间开始播放动画。
* @param animationName 动画数据的名称。
* @param time 开始时间。 (以秒为单位)
* @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次]
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) {
if (time === void 0) { time = 0.0; }
if (playTimes === void 0) { playTimes = -1; }
this._animationConfig.clear();
this._animationConfig.playTimes = playTimes;
this._animationConfig.position = time;
this._animationConfig.fadeInTime = 0.0;
this._animationConfig.animation = animationName;
return this.playConfig(this._animationConfig);
};
/**
* @language zh_CN
* 从指定帧开始播放动画。
* @param animationName 动画数据的名称。
* @param frame 帧。
* @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次]
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) {
if (frame === void 0) { frame = 0; }
if (playTimes === void 0) { playTimes = -1; }
this._animationConfig.clear();
this._animationConfig.playTimes = playTimes;
this._animationConfig.fadeInTime = 0.0;
this._animationConfig.animation = animationName;
var animationData = this._animations[animationName];
if (animationData) {
this._animationConfig.position = animationData.duration * frame / animationData.frameCount;
}
return this.playConfig(this._animationConfig);
};
/**
* @language zh_CN
* 从指定进度开始播放动画。
* @param animationName 动画数据的名称。
* @param progress 进度。 [0~1]
* @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次]
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) {
if (progress === void 0) { progress = 0.0; }
if (playTimes === void 0) { playTimes = -1; }
this._animationConfig.clear();
this._animationConfig.playTimes = playTimes;
this._animationConfig.fadeInTime = 0.0;
this._animationConfig.animation = animationName;
var animationData = this._animations[animationName];
if (animationData) {
this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0);
}
return this.playConfig(this._animationConfig);
};
/**
* @language zh_CN
* 将动画停止到指定的时间。
* @param animationName 动画数据的名称。
* @param time 时间。 (以秒为单位)
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndStopByTime = function (animationName, time) {
if (time === void 0) { time = 0.0; }
var animationState = this.gotoAndPlayByTime(animationName, time, 1);
if (animationState) {
animationState.stop();
}
return animationState;
};
/**
* @language zh_CN
* 将动画停止到指定的帧。
* @param animationName 动画数据的名称。
* @param frame 帧。
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndStopByFrame = function (animationName, frame) {
if (frame === void 0) { frame = 0; }
var animationState = this.gotoAndPlayByFrame(animationName, frame, 1);
if (animationState) {
animationState.stop();
}
return animationState;
};
/**
* @language zh_CN
* 将动画停止到指定的进度。
* @param animationName 动画数据的名称。
* @param progress 进度。 [0 ~ 1]
* @returns 对应的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 4.5
*/
Animation.prototype.gotoAndStopByProgress = function (animationName, progress) {
if (progress === void 0) { progress = 0.0; }
var animationState = this.gotoAndPlayByProgress(animationName, progress, 1);
if (animationState) {
animationState.stop();
}
return animationState;
};
/**
* @language zh_CN
* 获取动画状态。
* @param animationName 动画状态的名称。
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
Animation.prototype.getState = function (animationName) {
for (var i = 0, l = this._animationStates.length; i < l; ++i) {
var animationState = this._animationStates[i];
if (animationState.name === animationName) {
return animationState;
}
}
return null;
};
/**
* @language zh_CN
* 是否包含动画数据。
* @param animationName 动画数据的名称。
* @see dragonBones.AnimationData
* @version DragonBones 3.0
*/
Animation.prototype.hasAnimation = function (animationName) {
return this._animations[animationName] != null;
};
Object.defineProperty(Animation.prototype, "isPlaying", {
/**
* @language zh_CN
* 动画是否处于播放状态。
* @version DragonBones 3.0
*/
get: function () {
if (this._animationStates.length > 1) {
return this._isPlaying && !this.isCompleted;
}
else if (this._lastAnimationState) {
return this._isPlaying && this._lastAnimationState.isPlaying;
}
return this._isPlaying;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "isCompleted", {
/**
* @language zh_CN
* 所有动画状态是否均已播放完毕。
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
get: function () {
if (this._lastAnimationState) {
if (!this._lastAnimationState.isCompleted) {
return false;
}
for (var i = 0, l = this._animationStates.length; i < l; ++i) {
if (!this._animationStates[i].isCompleted) {
return false;
}
}
return true;
}
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "lastAnimationName", {
/**
* @language zh_CN
* 上一个正在播放的动画状态名称。
* @see #lastAnimationState
* @version DragonBones 3.0
*/
get: function () {
return this._lastAnimationState ? this._lastAnimationState.name : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "lastAnimationState", {
/**
* @language zh_CN
* 上一个正在播放的动画状态。
* @see dragonBones.AnimationState
* @version DragonBones 3.0
*/
get: function () {
return this._lastAnimationState;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "animationConfig", {
/**
* @language zh_CN
* 一个可以快速使用的动画配置实例。
* @see dragonBones.AnimationConfig
* @version DragonBones 5.0
*/
get: function () {
this._animationConfig.clear();
return this._animationConfig;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "animationNames", {
/**
* @language zh_CN
* 所有动画数据名称。
* @see #animations
* @version DragonBones 4.5
*/
get: function () {
return this._animationNames;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "animations", {
/**
* @language zh_CN
* 所有动画数据。
* @see dragonBones.AnimationData
* @version DragonBones 4.5
*/
get: function () {
return this._animations;
},
set: function (value) {
if (this._animations === value) {
return;
}
this._animationNames.length = 0;
for (var k in this._animations) {
delete this._animations[k];
}
if (value) {
for (var k in value) {
this._animations[k] = value[k];
this._animationNames.push(k);
}
}
},
enumerable: true,
configurable: true
});
/**
* @deprecated
* @see #play()
* @see #fadeIn()
* @see #gotoAndPlayByTime()
* @see #gotoAndPlayByFrame()
* @see #gotoAndPlayByProgress()
*/
Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) {
if (fadeInTime === void 0) { fadeInTime = -1; }
if (duration === void 0) { duration = -1; }
if (playTimes === void 0) { playTimes = -1; }
if (layer === void 0) { layer = 0; }
if (group === void 0) { group = null; }
if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; }
if (pauseFadeOut === void 0) { pauseFadeOut = true; }
if (pauseFadeIn === void 0) { pauseFadeIn = true; }
this._animationConfig.clear();
this._animationConfig.fadeOutMode = fadeOutMode;
this._animationConfig.playTimes = playTimes;
this._animationConfig.layer = layer;
this._animationConfig.fadeInTime = fadeInTime;
this._animationConfig.animation = animationName;
this._animationConfig.group = group;
var animationData = this._animations[animationName];
if (animationData && duration > 0.0) {
this._animationConfig.timeScale = animationData.duration / duration;
}
return this.playConfig(this._animationConfig);
};
/**
* @deprecated
* @see #gotoAndStopByTime()
* @see #gotoAndStopByFrame()
* @see #gotoAndStopByProgress()
*/
Animation.prototype.gotoAndStop = function (animationName, time) {
if (time === void 0) { time = 0; }
return this.gotoAndStopByTime(animationName, time);
};
Object.defineProperty(Animation.prototype, "animationList", {
/**
* @deprecated
* @see #animationNames
* @see #animations
*/
get: function () {
return this._animationNames;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Animation.prototype, "animationDataList", {
/**
* @deprecated
* @see #animationNames
* @see #animations
*/
get: function () {
var list = [];
for (var i = 0, l = this._animationNames.length; i < l; ++i) {
list.push(this._animations[this._animationNames[i]]);
}
return list;
},
enumerable: true,
configurable: true
});
return Animation;
}(dragonBones.BaseObject));
/**
* @deprecated
* @see dragonBones.AnimationFadeOutMode.None
*/
Animation.None = 0 /* None */;
/**
* @deprecated
* @see dragonBones.AnimationFadeOutMode.SameLayer
*/
Animation.SameLayer = 1 /* SameLayer */;
/**
* @deprecated
* @see dragonBones.AnimationFadeOutMode.SameGroup
*/
Animation.SameGroup = 2 /* SameGroup */;
/**
* @deprecated
* @see dragonBones.AnimationFadeOutMode.SameLayerAndGroup
*/
Animation.SameLayerAndGroup = 3 /* SameLayerAndGroup */;
/**
* @deprecated
* @see dragonBones.AnimationFadeOutMode.All
*/
Animation.All = 4 /* All */;
dragonBones.Animation = Animation;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。
* @see dragonBones.Animation
* @see dragonBones.AnimationData
* @version DragonBones 3.0
*/
var AnimationState = (function (_super) {
__extends(AnimationState, _super);
/**
* @internal
* @private
*/
function AnimationState() {
var _this = _super.call(this) || this;
/**
* @private
*/
_this._boneMask = [];
/**
* @private
*/
_this._animationNames = [];
/**
* @private
*/
_this._boneTimelines = [];
/**
* @private
*/
_this._slotTimelines = [];
/**
* @private
*/
_this._ffdTimelines = [];
/**
* @deprecated
*/
_this.autoTween = false;
return _this;
}
/**
* @private
*/
AnimationState.toString = function () {
return "[class dragonBones.AnimationState]";
};
/**
* @private
*/
AnimationState.prototype._onClear = function () {
for (var i = 0, l = this._boneTimelines.length; i < l; ++i) {
this._boneTimelines[i].returnToPool();
}
for (var i = 0, l = this._slotTimelines.length; i < l; ++i) {
this._slotTimelines[i].returnToPool();
}
for (var i = 0, l = this._ffdTimelines.length; i < l; ++i) {
this._ffdTimelines[i].returnToPool();
}
if (this._timeline) {
this._timeline.returnToPool();
}
if (this._zOrderTimeline) {
this._zOrderTimeline.returnToPool();
}
this.displayControl = true;
this.additiveBlending = false;
this.actionEnabled = false;
this.playTimes = 1;
this.timeScale = 1.0;
this.weight = 1.0;
this.autoFadeOutTime = -1.0;
this.fadeTotalTime = 0.0;
this._playheadState = 0;
this._fadeState = -1;
this._subFadeState = -1;
this._layer = 0;
this._position = 0.0;
this._duration = 0.0;
this._fadeTime = 0.0;
this._time = 0.0;
this._fadeProgress = 0.0;
this._weightResult = 0.0;
this._name = null;
this._group = null;
this._boneMask.length = 0;
this._animationNames.length = 0;
this._boneTimelines.length = 0;
this._slotTimelines.length = 0;
this._ffdTimelines.length = 0;
this._animationData = null;
this._armature = null;
this._timeline = null;
this._zOrderTimeline = null;
};
AnimationState.prototype._advanceFadeTime = function (passedTime) {
var isFadeOut = this._fadeState > 0;
if (this._subFadeState < 0) {
this._subFadeState = 0;
var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN;
if (this._armature.eventDispatcher.hasEvent(eventType)) {
var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
eventObject.animationState = this;
this._armature._bufferEvent(eventObject, eventType);
}
}
if (passedTime < 0.0) {
passedTime = -passedTime;
}
this._fadeTime += passedTime;
if (this._fadeTime >= this.fadeTotalTime) {
this._subFadeState = 1;
this._fadeProgress = isFadeOut ? 0.0 : 1.0;
}
else if (this._fadeTime > 0.0) {
this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime);
}
else {
this._fadeProgress = isFadeOut ? 1.0 : 0.0;
}
if (this._subFadeState > 0) {
if (!isFadeOut) {
this._playheadState |= 1; // x1
this._fadeState = 0;
}
var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE;
if (this._armature.eventDispatcher.hasEvent(eventType)) {
var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
eventObject.animationState = this;
this._armature._bufferEvent(eventObject, eventType);
}
}
};
/**
* @internal
* @private
*/
AnimationState.prototype._init = function (armature, animationData, animationConfig) {
this._armature = armature;
this._animationData = animationData;
this._name = animationConfig.name ? animationConfig.name : animationConfig.animation;
this.actionEnabled = animationConfig.actionEnabled;
this.additiveBlending = animationConfig.additiveBlending;
this.displayControl = animationConfig.displayControl;
this.playTimes = animationConfig.playTimes;
this.timeScale = animationConfig.timeScale;
this.fadeTotalTime = animationConfig.fadeInTime;
this.autoFadeOutTime = animationConfig.autoFadeOutTime;
this.weight = animationConfig.weight;
if (animationConfig.pauseFadeIn) {
this._playheadState = 2; // 10
}
else {
this._playheadState = 3; // 11
}
this._fadeState = -1;
this._subFadeState = -1;
this._layer = animationConfig.layer;
this._group = animationConfig.group;
if (animationConfig.duration < 0.0) {
this._position = 0.0;
this._duration = this._animationData.duration;
if (animationConfig.position !== 0.0) {
if (this.timeScale >= 0.0) {
this._time = animationConfig.position;
}
else {
this._time = animationConfig.position - this._duration;
}
}
else {
this._time = 0.0;
}
}
else {
this._position = animationConfig.position;
this._duration = animationConfig.duration;
this._time = 0.0;
}
if (this.timeScale < 0.0 && this._time === 0.0) {
this._time = -0.000001; // Can not cross last frame event.
}
if (this.fadeTotalTime <= 0.0) {
this._fadeProgress = 0.999999;
}
if (animationConfig.boneMask.length > 0) {
this._boneMask.length = animationConfig.boneMask.length;
for (var i = 0, l = this._boneMask.length; i < l; ++i) {
this._boneMask[i] = animationConfig.boneMask[i];
}
}
if (animationConfig.animationNames.length > 0) {
this._animationNames.length = animationConfig.animationNames.length;
for (var i = 0, l = this._animationNames.length; i < l; ++i) {
this._animationNames[i] = animationConfig.animationNames[i];
}
}
this._timeline = dragonBones.BaseObject.borrowObject(dragonBones.AnimationTimelineState);
this._timeline._init(this._armature, this, this._animationData);
if (this._animationData.zOrderTimeline) {
this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState);
this._zOrderTimeline._init(this._armature, this, this._animationData.zOrderTimeline);
}
this._updateTimelineStates();
};
/**
* @internal
* @private
*/
AnimationState.prototype._updateTimelineStates = function () {
var boneTimelineStates = {};
var slotTimelineStates = {};
var ffdTimelineStates = {};
for (var i = 0, l = this._boneTimelines.length; i < l; ++i) {
var boneTimelineState = this._boneTimelines[i];
boneTimelineStates[boneTimelineState.bone.name] = boneTimelineState;
}
var bones = this._armature.getBones();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
var boneTimelineName = bone.name;
if (this.containsBoneMask(boneTimelineName)) {
var boneTimelineData = this._animationData.getBoneTimeline(boneTimelineName);
if (boneTimelineData) {
if (boneTimelineStates[boneTimelineName]) {
delete boneTimelineStates[boneTimelineName];
}
else {
var boneTimelineState = dragonBones.BaseObject.borrowObject(dragonBones.BoneTimelineState);
boneTimelineState.bone = bone;
boneTimelineState._init(this._armature, this, boneTimelineData);
this._boneTimelines.push(boneTimelineState);
}
}
}
}
for (var k in boneTimelineStates) {
var boneTimelineState = boneTimelineStates[k];
boneTimelineState.bone.invalidUpdate(); //
this._boneTimelines.splice(this._boneTimelines.indexOf(boneTimelineState), 1);
boneTimelineState.returnToPool();
}
for (var i = 0, l = this._slotTimelines.length; i < l; ++i) {
var slotTimelineState = this._slotTimelines[i];
slotTimelineStates[slotTimelineState.slot.name] = slotTimelineState;
}
for (var i = 0, l = this._ffdTimelines.length; i < l; ++i) {
var ffdTimelineState = this._ffdTimelines[i];
var display = ffdTimelineState._timelineData.display;
var meshName = display.inheritAnimation ? display.mesh.name : display.name;
ffdTimelineStates[meshName] = ffdTimelineState;
}
var slots = this._armature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var slot = slots[i];
var slotTimelineName = slot.name;
var parentTimelineName = slot.parent.name;
var resetFFDVertices = false;
if (this.containsBoneMask(parentTimelineName)) {
var slotTimelineData = this._animationData.getSlotTimeline(slotTimelineName);
if (slotTimelineData) {
if (slotTimelineStates[slotTimelineName]) {
delete slotTimelineStates[slotTimelineName];
}
else {
var slotTimelineState = dragonBones.BaseObject.borrowObject(dragonBones.SlotTimelineState);
slotTimelineState.slot = slot;
slotTimelineState._init(this._armature, this, slotTimelineData);
this._slotTimelines.push(slotTimelineState);
}
}
var ffdTimelineDatas = this._animationData.getFFDTimeline(this._armature._skinData.name, slotTimelineName);
if (ffdTimelineDatas) {
for (var k in ffdTimelineDatas) {
if (ffdTimelineStates[k]) {
delete ffdTimelineStates[k];
}
else {
var ffdTimelineState = dragonBones.BaseObject.borrowObject(dragonBones.FFDTimelineState);
ffdTimelineState.slot = slot;
ffdTimelineState._init(this._armature, this, ffdTimelineDatas[k]);
this._ffdTimelines.push(ffdTimelineState);
}
}
}
else {
resetFFDVertices = true;
}
}
else {
resetFFDVertices = true;
}
if (resetFFDVertices) {
for (var iA = 0, lA = slot._ffdVertices.length; iA < lA; ++iA) {
slot._ffdVertices[iA] = 0.0;
}
slot._meshDirty = true;
}
}
for (var k in slotTimelineStates) {
var slotTimelineState = slotTimelineStates[k];
this._slotTimelines.splice(this._slotTimelines.indexOf(slotTimelineState), 1);
slotTimelineState.returnToPool();
}
for (var k in ffdTimelineStates) {
var ffdTimelineState = ffdTimelineStates[k];
this._ffdTimelines.splice(this._ffdTimelines.indexOf(ffdTimelineState), 1);
ffdTimelineState.returnToPool();
}
};
/**
* @internal
* @private
*/
AnimationState.prototype._advanceTime = function (passedTime, cacheFrameRate) {
// Update fade time.
if (this._fadeState !== 0 || this._subFadeState !== 0) {
this._advanceFadeTime(passedTime);
}
// Update time.
if (this.timeScale !== 1.0) {
passedTime *= this.timeScale;
}
if (passedTime !== 0.0 && this._playheadState === 3) {
this._time += passedTime;
}
// Weight.
if (this.weight !== 0.0) {
var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0;
var isUpdatesTimeline = true;
var isUpdatesBoneTimeline = true;
var time = this._time;
this._weightResult = this.weight * this._fadeProgress;
// Update main timeline.
this._timeline.update(time);
// Cache time internval.
if (isCacheEnabled) {
var internval = cacheFrameRate * 2.0;
this._timeline._currentTime = Math.floor(this._timeline._currentTime * internval) / internval;
}
// Update zOrder timeline.
if (this._zOrderTimeline) {
this._zOrderTimeline.update(time);
}
// Update cache.
if (isCacheEnabled) {
var cacheFrameIndex = Math.floor(this._timeline._currentTime * cacheFrameRate); // uint
if (this._armature.animation._cacheFrameIndex === cacheFrameIndex) {
isUpdatesTimeline = false;
isUpdatesBoneTimeline = false;
}
else {
this._armature.animation._cacheFrameIndex = cacheFrameIndex;
if (this._animationData.cachedFrames[cacheFrameIndex]) {
isUpdatesBoneTimeline = false;
}
else {
this._animationData.cachedFrames[cacheFrameIndex] = true;
}
}
}
// Update timelines.
if (isUpdatesTimeline) {
if (isUpdatesBoneTimeline) {
for (var i = 0, l = this._boneTimelines.length; i < l; ++i) {
this._boneTimelines[i].update(time);
}
}
for (var i = 0, l = this._slotTimelines.length; i < l; ++i) {
this._slotTimelines[i].update(time);
}
for (var i = 0, l = this._ffdTimelines.length; i < l; ++i) {
this._ffdTimelines[i].update(time);
}
}
}
if (this._fadeState === 0) {
if (this._subFadeState > 0) {
this._subFadeState = 0;
}
if (this._timeline._playState > 0) {
// Auto fade out.
if (this.autoFadeOutTime >= 0.0) {
this.fadeOut(this.autoFadeOutTime);
}
if (this._animationNames.length > 0) {
// TODO
}
}
}
};
/**
* @internal
* @private
*/
AnimationState.prototype._isDisabled = function (slot) {
if (this.displayControl &&
(!slot.displayController ||
slot.displayController === this._name ||
slot.displayController === this._group)) {
return false;
}
return true;
};
/**
* @language zh_CN
* 继续播放。
* @version DragonBones 3.0
*/
AnimationState.prototype.play = function () {
this._playheadState = 3; // 11
};
/**
* @language zh_CN
* 暂停播放。
* @version DragonBones 3.0
*/
AnimationState.prototype.stop = function () {
this._playheadState &= 1; // 0x
};
/**
* @language zh_CN
* 淡出动画。
* @param fadeOutTime 淡出时间。 (以秒为单位)
* @param pausePlayhead 淡出时是否暂停动画。
* @version DragonBones 3.0
*/
AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) {
if (pausePlayhead === void 0) { pausePlayhead = true; }
if (fadeOutTime < 0.0 || fadeOutTime !== fadeOutTime) {
fadeOutTime = 0.0;
}
if (pausePlayhead) {
this._playheadState &= 2; // x0
}
if (this._fadeState > 0) {
if (fadeOutTime > this.fadeTotalTime - this._fadeTime) {
// If the animation is already in fade out, the new fade out will be ignored.
return;
}
}
else {
this._fadeState = 1;
this._subFadeState = -1;
if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) {
this._fadeProgress = 0.000001; // Modify _fadeProgress to different value.
}
for (var i = 0, l = this._boneTimelines.length; i < l; ++i) {
this._boneTimelines[i].fadeOut();
}
for (var i = 0, l = this._slotTimelines.length; i < l; ++i) {
this._slotTimelines[i].fadeOut();
}
for (var i = 0, l = this._ffdTimelines.length; i < l; ++i) {
this._ffdTimelines[i].fadeOut();
}
}
this.displayControl = false; //
this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0;
this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress);
};
/**
* @language zh_CN
* 是否包含骨骼遮罩。
* @param name 指定的骨骼名称。
* @version DragonBones 3.0
*/
AnimationState.prototype.containsBoneMask = function (name) {
return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0;
};
/**
* @language zh_CN
* 添加骨骼遮罩。
* @param boneName 指定的骨骼名称。
* @param recursive 是否为该骨骼的子骨骼添加遮罩。
* @version DragonBones 3.0
*/
AnimationState.prototype.addBoneMask = function (name, recursive) {
if (recursive === void 0) { recursive = true; }
var currentBone = this._armature.getBone(name);
if (!currentBone) {
return;
}
if (this._boneMask.indexOf(name) < 0) {
this._boneMask.push(name);
}
if (recursive) {
var bones = this._armature.getBones();
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) {
this._boneMask.push(bone.name);
}
}
}
this._updateTimelineStates();
};
/**
* @language zh_CN
* 删除骨骼遮罩。
* @param boneName 指定的骨骼名称。
* @param recursive 是否删除该骨骼的子骨骼遮罩。
* @version DragonBones 3.0
*/
AnimationState.prototype.removeBoneMask = function (name, recursive) {
if (recursive === void 0) { recursive = true; }
var index = this._boneMask.indexOf(name);
if (index >= 0) {
this._boneMask.splice(index, 1);
}
if (recursive) {
var currentBone = this._armature.getBone(name);
if (currentBone) {
var bones = this._armature.getBones();
if (this._boneMask.length > 0) {
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
var index_2 = this._boneMask.indexOf(bone.name);
if (index_2 >= 0 && currentBone.contains(bone)) {
this._boneMask.splice(index_2, 1);
}
}
}
else {
for (var i = 0, l = bones.length; i < l; ++i) {
var bone = bones[i];
if (!currentBone.contains(bone)) {
this._boneMask.push(bone.name);
}
}
}
}
}
this._updateTimelineStates();
};
/**
* @language zh_CN
* 删除所有骨骼遮罩。
* @version DragonBones 3.0
*/
AnimationState.prototype.removeAllBoneMask = function () {
this._boneMask.length = 0;
this._updateTimelineStates();
};
Object.defineProperty(AnimationState.prototype, "layer", {
/**
* @language zh_CN
* 混合图层。
* @version DragonBones 3.0
*/
get: function () {
return this._layer;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "group", {
/**
* @language zh_CN
* 混合组。
* @version DragonBones 3.0
*/
get: function () {
return this._group;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "name", {
/**
* @language zh_CN
* 动画名称。
* @version DragonBones 3.0
*/
get: function () {
return this._name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "animationData", {
/**
* @language zh_CN
* 动画数据。
* @see dragonBones.AnimationData
* @version DragonBones 3.0
*/
get: function () {
return this._animationData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "isCompleted", {
/**
* @language zh_CN
* 是否播放完毕。
* @version DragonBones 3.0
*/
get: function () {
return this._timeline._playState > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "isPlaying", {
/**
* @language zh_CN
* 是否正在播放。
* @version DragonBones 3.0
*/
get: function () {
return (this._playheadState & 2) && this._timeline._playState <= 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "currentPlayTimes", {
/**
* @language zh_CN
* 当前播放次数。
* @version DragonBones 3.0
*/
get: function () {
return this._timeline._currentPlayTimes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "totalTime", {
/**
* @language zh_CN
* 动画的总时间。 (以秒为单位)
* @version DragonBones 3.0
*/
get: function () {
return this._duration;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "currentTime", {
/**
* @language zh_CN
* 动画播放的时间。 (以秒为单位)
* @version DragonBones 3.0
*/
get: function () {
return this._timeline._currentTime;
},
set: function (value) {
if (value !== value) {
value = 0.0;
}
var currentPlayTimes = this._timeline._currentPlayTimes - (this._timeline._playState > 0 ? 1 : 0);
value = (value % this._duration) + currentPlayTimes * this._duration;
if (value < 0) {
value += this._duration;
}
if (this._time === value) {
return;
}
this._time = value;
this._timeline.setCurrentTime(this._time);
if (this._zOrderTimeline) {
this._zOrderTimeline._playState = -1;
}
for (var i = 0, l = this._boneTimelines.length; i < l; ++i) {
this._boneTimelines[i]._playState = -1;
}
for (var i = 0, l = this._slotTimelines.length; i < l; ++i) {
this._slotTimelines[i]._playState = -1;
}
for (var i = 0, l = this._ffdTimelines.length; i < l; ++i) {
this._ffdTimelines[i]._playState = -1;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnimationState.prototype, "clip", {
/**
* @deprecated
* @see #animationData
*/
get: function () {
return this._animationData;
},
enumerable: true,
configurable: true
});
return AnimationState;
}(dragonBones.BaseObject));
dragonBones.AnimationState = AnimationState;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @internal
* @private
*/
var TimelineState = (function (_super) {
__extends(TimelineState, _super);
function TimelineState() {
return _super.call(this) || this;
}
TimelineState.prototype._onClear = function () {
this._playState = -1;
this._currentPlayTimes = 0;
this._currentTime = -1.0;
this._timelineData = null;
this._frameRate = 0;
this._frameCount = 0;
this._position = 0.0;
this._duration = 0.0;
this._animationDutation = 0.0;
this._timeScale = 1.0;
this._timeOffset = 0.0;
this._currentFrame = null;
this._armature = null;
this._animationState = null;
this._mainTimeline = null;
};
TimelineState.prototype._onUpdateFrame = function () { };
TimelineState.prototype._onArriveAtFrame = function () { };
TimelineState.prototype._setCurrentTime = function (passedTime) {
var prevState = this._playState;
var currentPlayTimes = 0;
var currentTime = 0.0;
if (this._mainTimeline && this._frameCount === 1) {
this._playState = this._mainTimeline._playState >= 0 ? 1 : -1;
currentPlayTimes = 1;
currentTime = this._mainTimeline._currentTime;
}
else if (!this._mainTimeline || this._timeScale !== 1.0 || this._timeOffset !== 0.0) {
var playTimes = this._animationState.playTimes;
var totalTime = playTimes * this._duration;
passedTime *= this._timeScale;
if (this._timeOffset !== 0.0) {
passedTime += this._timeOffset * this._animationDutation;
}
if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) {
if (this._playState <= 0 && this._animationState._playheadState === 3) {
this._playState = 1;
}
currentPlayTimes = playTimes;
if (passedTime < 0.0) {
currentTime = 0.0;
}
else {
currentTime = this._duration;
}
}
else {
if (this._playState !== 0 && this._animationState._playheadState === 3) {
this._playState = 0;
}
if (passedTime < 0.0) {
passedTime = -passedTime;
currentPlayTimes = Math.floor(passedTime / this._duration);
currentTime = this._duration - (passedTime % this._duration);
}
else {
currentPlayTimes = Math.floor(passedTime / this._duration);
currentTime = passedTime % this._duration;
}
}
currentTime += this._position;
}
else {
this._playState = this._mainTimeline._playState;
currentPlayTimes = this._mainTimeline._currentPlayTimes;
currentTime = this._mainTimeline._currentTime;
}
if (this._currentPlayTimes === currentPlayTimes && this._currentTime === currentTime) {
return false;
}
// Clear frame flag when timeline start or loopComplete.
if ((prevState < 0 && this._playState !== prevState) ||
(this._playState <= 0 && this._currentPlayTimes !== currentPlayTimes)) {
this._currentFrame = null;
}
this._currentPlayTimes = currentPlayTimes;
this._currentTime = currentTime;
return true;
};
TimelineState.prototype._init = function (armature, animationState, timelineData) {
this._armature = armature;
this._animationState = animationState;
this._timelineData = timelineData;
this._mainTimeline = this._animationState._timeline;
if (this === this._mainTimeline) {
this._mainTimeline = null;
}
this._frameRate = this._armature.armatureData.frameRate;
this._frameCount = this._timelineData.frames.length;
this._position = this._animationState._position;
this._duration = this._animationState._duration;
this._animationDutation = this._animationState.animationData.duration;
this._timeScale = !this._mainTimeline ? 1.0 : (1.0 / this._timelineData.scale);
this._timeOffset = !this._mainTimeline ? 0.0 : this._timelineData.offset;
};
TimelineState.prototype.fadeOut = function () { };
TimelineState.prototype.update = function (passedTime) {
if (this._playState <= 0 && this._setCurrentTime(passedTime)) {
var currentFrameIndex = this._frameCount > 1 ? Math.floor(this._currentTime * this._frameRate) : 0; // uint
var currentFrame = this._timelineData.frames[currentFrameIndex];
if (this._currentFrame !== currentFrame) {
this._currentFrame = currentFrame;
this._onArriveAtFrame();
}
this._onUpdateFrame();
}
};
return TimelineState;
}(dragonBones.BaseObject));
dragonBones.TimelineState = TimelineState;
/**
* @internal
* @private
*/
var TweenTimelineState = (function (_super) {
__extends(TweenTimelineState, _super);
function TweenTimelineState() {
return _super.call(this) || this;
}
TweenTimelineState._getEasingValue = function (progress, easing) {
if (progress <= 0.0) {
return 0.0;
}
else if (progress >= 1.0) {
return 1.0;
}
var value = 1.0;
if (easing > 2.0) {
return progress;
}
else if (easing > 1.0) {
value = 0.5 * (1.0 - Math.cos(progress * Math.PI));
easing -= 1.0;
}
else if (easing > 0.0) {
value = 1.0 - Math.pow(1.0 - progress, 2.0);
}
else if (easing >= -1.0) {
easing *= -1.0;
value = Math.pow(progress, 2.0);
}
else if (easing >= -2.0) {
easing *= -1.0;
value = Math.acos(1.0 - progress * 2.0) / Math.PI;
easing -= 1.0;
}
else {
return progress;
}
return (value - progress) * easing + progress;
};
TweenTimelineState._getEasingCurveValue = function (progress, samples) {
if (progress <= 0.0) {
return 0.0;
}
else if (progress >= 1.0) {
return 1.0;
}
var segmentCount = samples.length + 1; // + 2 - 1
var valueIndex = Math.floor(progress * segmentCount);
var fromValue = valueIndex === 0 ? 0.0 : samples[valueIndex - 1];
var toValue = (valueIndex === segmentCount - 1) ? 1.0 : samples[valueIndex];
return fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex);
};
TweenTimelineState.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this._tweenProgress = 0.0;
this._tweenEasing = dragonBones.DragonBones.NO_TWEEN;
this._curve = null;
};
TweenTimelineState.prototype._onArriveAtFrame = function () {
if (this._frameCount > 1 &&
(this._currentFrame.next !== this._timelineData.frames[0] ||
this._animationState.playTimes === 0 ||
this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) {
this._tweenEasing = this._currentFrame.tweenEasing;
this._curve = this._currentFrame.curve;
}
else {
this._tweenEasing = dragonBones.DragonBones.NO_TWEEN;
this._curve = null;
}
};
TweenTimelineState.prototype._onUpdateFrame = function () {
if (this._tweenEasing !== dragonBones.DragonBones.NO_TWEEN) {
this._tweenProgress = (this._currentTime - this._currentFrame.position) / this._currentFrame.duration;
if (this._tweenEasing !== 0.0) {
this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenProgress, this._tweenEasing);
}
}
else if (this._curve) {
this._tweenProgress = (this._currentTime - this._currentFrame.position) / this._currentFrame.duration;
this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._curve);
}
else {
this._tweenProgress = 0.0;
}
};
return TweenTimelineState;
}(TimelineState));
dragonBones.TweenTimelineState = TweenTimelineState;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @internal
* @private
*/
var AnimationTimelineState = (function (_super) {
__extends(AnimationTimelineState, _super);
function AnimationTimelineState() {
return _super.call(this) || this;
}
AnimationTimelineState.toString = function () {
return "[class dragonBones.AnimationTimelineState]";
};
AnimationTimelineState.prototype._onCrossFrame = function (frame) {
if (this._animationState.actionEnabled) {
var actions = frame.actions;
for (var i = 0, l = actions.length; i < l; ++i) {
this._armature._bufferAction(actions[i]);
}
}
var eventDispatcher = this._armature.eventDispatcher;
var events = frame.events;
for (var i = 0, l = events.length; i < l; ++i) {
var eventData = events[i];
var eventType = null;
switch (eventData.type) {
case 10 /* Frame */:
eventType = dragonBones.EventObject.FRAME_EVENT;
break;
case 11 /* Sound */:
eventType = dragonBones.EventObject.SOUND_EVENT;
break;
}
if (eventDispatcher.hasEvent(eventType) || eventData.type === 11 /* Sound */) {
var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
eventObject.name = eventData.name;
eventObject.frame = frame;
eventObject.data = eventData.data;
eventObject.animationState = this._animationState;
if (eventData.bone) {
eventObject.bone = this._armature.getBone(eventData.bone.name);
}
if (eventData.slot) {
eventObject.slot = this._armature.getSlot(eventData.slot.name);
}
this._armature._bufferEvent(eventObject, eventType);
}
}
};
AnimationTimelineState.prototype.update = function (passedTime) {
var prevState = this._playState;
var prevPlayTimes = this._currentPlayTimes;
var prevTime = this._currentTime;
if (this._playState <= 0 && this._setCurrentTime(passedTime)) {
var eventDispatcher = this._armature.eventDispatcher;
if (prevState < 0 && this._playState !== prevState) {
if (this._animationState.displayControl) {
this._armature._sortZOrder(null);
}
if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) {
var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
eventObject.animationState = this._animationState;
this._armature._bufferEvent(eventObject, dragonBones.EventObject.START);
}
}
if (prevTime < 0.0) {
return;
}
var isReverse = false;
var loopCompleteEvent = null;
var completeEvent = null;
if (this._currentPlayTimes !== prevPlayTimes) {
if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) {
loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
loopCompleteEvent.animationState = this._animationState;
}
if (this._playState > 0) {
if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) {
completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject);
completeEvent.animationState = this._animationState;
}
isReverse = prevTime > this._currentTime;
}
else {
isReverse = prevTime < this._currentTime;
}
}
else {
isReverse = prevTime > this._currentTime;
}
if (this._frameCount > 1) {
var currentFrameIndex = Math.floor(this._currentTime * this._frameRate); // uint
var currentFrame = this._timelineData.frames[currentFrameIndex];
if (this._currentFrame !== currentFrame) {
var crossedFrame = this._currentFrame;
this._currentFrame = currentFrame;
if (isReverse) {
if (!crossedFrame) {
var prevFrameIndex = Math.floor(prevTime * this._frameRate);
crossedFrame = this._timelineData.frames[prevFrameIndex];
if (this._currentPlayTimes === prevPlayTimes) {
if (crossedFrame === currentFrame) {
crossedFrame = null;
}
}
}
while (crossedFrame) {
if (this._position <= crossedFrame.position &&
crossedFrame.position <= this._position + this._duration) {
this._onCrossFrame(crossedFrame);
}
if (loopCompleteEvent && crossedFrame === this._timelineData.frames[0]) {
this._armature._bufferEvent(loopCompleteEvent, dragonBones.EventObject.LOOP_COMPLETE);
loopCompleteEvent = null;
}
crossedFrame = crossedFrame.prev;
if (crossedFrame === currentFrame) {
break;
}
}
}
else {
if (!crossedFrame) {
var prevFrameIndex = Math.floor(prevTime * this._frameRate);
crossedFrame = this._timelineData.frames[prevFrameIndex];
if (this._currentPlayTimes === prevPlayTimes) {
if (prevTime <= crossedFrame.position) {
crossedFrame = crossedFrame.prev;
}
else if (crossedFrame === currentFrame) {
crossedFrame = null;
}
}
}
while (crossedFrame) {
crossedFrame = crossedFrame.next;
if (loopCompleteEvent && crossedFrame === this._timelineData.frames[0]) {
this._armature._bufferEvent(loopCompleteEvent, dragonBones.EventObject.LOOP_COMPLETE);
loopCompleteEvent = null;
}
if (this._position <= crossedFrame.position &&
crossedFrame.position <= this._position + this._duration) {
this._onCrossFrame(crossedFrame);
}
if (crossedFrame === currentFrame) {
break;
}
}
}
}
}
else if (this._frameCount > 0 && !this._currentFrame) {
this._currentFrame = this._timelineData.frames[0];
if (this._currentPlayTimes === prevPlayTimes) {
if (prevTime <= this._currentFrame.position) {
this._onCrossFrame(this._currentFrame);
}
}
else if (this._position <= this._currentFrame.position) {
if (!isReverse && loopCompleteEvent) {
this._armature._bufferEvent(loopCompleteEvent, dragonBones.EventObject.LOOP_COMPLETE);
loopCompleteEvent = null;
}
this._onCrossFrame(this._currentFrame);
}
}
if (loopCompleteEvent) {
this._armature._bufferEvent(loopCompleteEvent, dragonBones.EventObject.LOOP_COMPLETE);
loopCompleteEvent = null;
}
if (completeEvent) {
this._armature._bufferEvent(completeEvent, dragonBones.EventObject.COMPLETE);
completeEvent = null;
}
}
};
AnimationTimelineState.prototype.setCurrentTime = function (value) {
this._setCurrentTime(value);
this._currentFrame = null;
};
return AnimationTimelineState;
}(dragonBones.TimelineState));
dragonBones.AnimationTimelineState = AnimationTimelineState;
/**
* @internal
* @private
*/
var ZOrderTimelineState = (function (_super) {
__extends(ZOrderTimelineState, _super);
function ZOrderTimelineState() {
return _super.call(this) || this;
}
ZOrderTimelineState.toString = function () {
return "[class dragonBones.ZOrderTimelineState]";
};
ZOrderTimelineState.prototype._onArriveAtFrame = function () {
_super.prototype._onArriveAtFrame.call(this);
this._armature._sortZOrder(this._currentFrame.zOrder);
};
return ZOrderTimelineState;
}(dragonBones.TimelineState));
dragonBones.ZOrderTimelineState = ZOrderTimelineState;
/**
* @internal
* @private
*/
var BoneTimelineState = (function (_super) {
__extends(BoneTimelineState, _super);
function BoneTimelineState() {
var _this = _super.call(this) || this;
_this._transform = new dragonBones.Transform();
_this._durationTransform = new dragonBones.Transform();
return _this;
}
BoneTimelineState.toString = function () {
return "[class dragonBones.BoneTimelineState]";
};
BoneTimelineState.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.bone = null;
this._transformDirty = false;
this._tweenTransform = 0 /* None */;
this._tweenRotate = 0 /* None */;
this._tweenScale = 0 /* None */;
this._transform.identity();
this._durationTransform.identity();
this._boneTransform = null;
this._originalTransform = null;
};
BoneTimelineState.prototype._onArriveAtFrame = function () {
_super.prototype._onArriveAtFrame.call(this);
this._tweenTransform = 1 /* Once */;
this._tweenRotate = 1 /* Once */;
this._tweenScale = 1 /* Once */;
if (this._frameCount > 1 && (this._tweenEasing !== dragonBones.DragonBones.NO_TWEEN || this._curve)) {
var currentTransform = this._currentFrame.transform;
var nextFrame = this._currentFrame.next;
var nextTransform = nextFrame.transform;
// Transform.
this._durationTransform.x = nextTransform.x - currentTransform.x;
this._durationTransform.y = nextTransform.y - currentTransform.y;
if (this._durationTransform.x !== 0.0 || this._durationTransform.y !== 0.0) {
this._tweenTransform = 2 /* Always */;
}
// Rotate.
var tweenRotate = this._currentFrame.tweenRotate;
if (tweenRotate !== dragonBones.DragonBones.NO_TWEEN) {
if (tweenRotate) {
if (tweenRotate > 0.0 ? nextTransform.skewY >= currentTransform.skewY : nextTransform.skewY <= currentTransform.skewY) {
tweenRotate = tweenRotate > 0.0 ? tweenRotate - 1.0 : tweenRotate + 1.0;
}
this._durationTransform.skewX = nextTransform.skewX - currentTransform.skewX + dragonBones.DragonBones.PI_D * tweenRotate;
this._durationTransform.skewY = nextTransform.skewY - currentTransform.skewY + dragonBones.DragonBones.PI_D * tweenRotate;
}
else {
this._durationTransform.skewX = dragonBones.Transform.normalizeRadian(nextTransform.skewX - currentTransform.skewX);
this._durationTransform.skewY = dragonBones.Transform.normalizeRadian(nextTransform.skewY - currentTransform.skewY);
}
if (this._durationTransform.skewX !== 0.0 || this._durationTransform.skewY !== 0.0) {
this._tweenRotate = 2 /* Always */;
}
}
else {
this._durationTransform.skewX = 0.0;
this._durationTransform.skewY = 0.0;
}
// Scale.
if (this._currentFrame.tweenScale) {
this._durationTransform.scaleX = nextTransform.scaleX - currentTransform.scaleX;
this._durationTransform.scaleY = nextTransform.scaleY - currentTransform.scaleY;
if (this._durationTransform.scaleX !== 0.0 || this._durationTransform.scaleY !== 0.0) {
this._tweenScale = 2 /* Always */;
}
}
else {
this._durationTransform.scaleX = 0.0;
this._durationTransform.scaleY = 0.0;
}
}
else {
this._durationTransform.x = 0.0;
this._durationTransform.y = 0.0;
this._durationTransform.skewX = 0.0;
this._durationTransform.skewY = 0.0;
this._durationTransform.scaleX = 0.0;
this._durationTransform.scaleY = 0.0;
}
};
BoneTimelineState.prototype._onUpdateFrame = function () {
_super.prototype._onUpdateFrame.call(this);
var tweenProgress = 0.0;
var currentTransform = this._currentFrame.transform;
if (this._tweenTransform !== 0 /* None */) {
if (this._tweenTransform === 1 /* Once */) {
this._tweenTransform = 0 /* None */;
tweenProgress = 0.0;
}
else {
tweenProgress = this._tweenProgress;
}
if (this._animationState.additiveBlending) {
this._transform.x = currentTransform.x + this._durationTransform.x * tweenProgress;
this._transform.y = currentTransform.y + this._durationTransform.y * tweenProgress;
}
else {
this._transform.x = this._originalTransform.x + currentTransform.x + this._durationTransform.x * tweenProgress;
this._transform.y = this._originalTransform.y + currentTransform.y + this._durationTransform.y * tweenProgress;
}
this._transformDirty = true;
}
if (this._tweenRotate !== 0 /* None */) {
if (this._tweenRotate === 1 /* Once */) {
this._tweenRotate = 0 /* None */;
tweenProgress = 0.0;
}
else {
tweenProgress = this._tweenProgress;
}
if (this._animationState.additiveBlending) {
this._transform.skewX = currentTransform.skewX + this._durationTransform.skewX * tweenProgress;
this._transform.skewY = currentTransform.skewY + this._durationTransform.skewY * tweenProgress;
}
else {
this._transform.skewX = dragonBones.Transform.normalizeRadian(this._originalTransform.skewX + currentTransform.skewX + this._durationTransform.skewX * tweenProgress);
this._transform.skewY = dragonBones.Transform.normalizeRadian(this._originalTransform.skewY + currentTransform.skewY + this._durationTransform.skewY * tweenProgress);
}
this._transformDirty = true;
}
if (this._tweenScale !== 0 /* None */) {
if (this._tweenScale === 1 /* Once */) {
this._tweenScale = 0 /* None */;
tweenProgress = 0.0;
}
else {
tweenProgress = this._tweenProgress;
}
if (this._animationState.additiveBlending) {
this._transform.scaleX = currentTransform.scaleX + this._durationTransform.scaleX * tweenProgress;
this._transform.scaleY = currentTransform.scaleY + this._durationTransform.scaleY * tweenProgress;
}
else {
this._transform.scaleX = this._originalTransform.scaleX * (currentTransform.scaleX + this._durationTransform.scaleX * tweenProgress);
this._transform.scaleY = this._originalTransform.scaleY * (currentTransform.scaleY + this._durationTransform.scaleY * tweenProgress);
}
this._transformDirty = true;
}
};
BoneTimelineState.prototype._init = function (armature, animationState, timelineData) {
_super.prototype._init.call(this, armature, animationState, timelineData);
this._originalTransform = this._timelineData.originalTransform;
this._boneTransform = this.bone._animationPose;
};
BoneTimelineState.prototype.fadeOut = function () {
this._transform.skewX = dragonBones.Transform.normalizeRadian(this._transform.skewX);
this._transform.skewY = dragonBones.Transform.normalizeRadian(this._transform.skewY);
};
BoneTimelineState.prototype.update = function (passedTime) {
// Blend animation state.
var animationLayer = this._animationState._layer;
var weight = this._animationState._weightResult;
if (!this.bone._blendDirty) {
_super.prototype.update.call(this, passedTime);
this.bone._blendLayer = animationLayer;
this.bone._blendLeftWeight = 1.0;
this.bone._blendTotalWeight = weight;
this._boneTransform.x = this._transform.x * weight;
this._boneTransform.y = this._transform.y * weight;
this._boneTransform.skewX = this._transform.skewX * weight;
this._boneTransform.skewY = this._transform.skewY * weight;
this._boneTransform.scaleX = (this._transform.scaleX - 1.0) * weight + 1.0;
this._boneTransform.scaleY = (this._transform.scaleY - 1.0) * weight + 1.0;
this.bone._blendDirty = true;
}
else if (this.bone._blendLeftWeight > 0.0) {
if (this.bone._blendLayer !== animationLayer) {
if (this.bone._blendTotalWeight >= this.bone._blendLeftWeight) {
this.bone._blendLeftWeight = 0.0;
}
else {
this.bone._blendLayer = animationLayer;
this.bone._blendLeftWeight -= this.bone._blendTotalWeight;
this.bone._blendTotalWeight = 0.0;
}
}
weight *= this.bone._blendLeftWeight;
if (weight >= 0.0) {
_super.prototype.update.call(this, passedTime);
this.bone._blendTotalWeight += weight;
this._boneTransform.x += this._transform.x * weight;
this._boneTransform.y += this._transform.y * weight;
this._boneTransform.skewX += this._transform.skewX * weight;
this._boneTransform.skewY += this._transform.skewY * weight;
this._boneTransform.scaleX += (this._transform.scaleX - 1) * weight;
this._boneTransform.scaleY += (this._transform.scaleY - 1) * weight;
}
}
if (this._transformDirty || this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) {
this._transformDirty = false;
this.bone.invalidUpdate();
}
};
return BoneTimelineState;
}(dragonBones.TweenTimelineState));
dragonBones.BoneTimelineState = BoneTimelineState;
/**
* @internal
* @private
*/
var SlotTimelineState = (function (_super) {
__extends(SlotTimelineState, _super);
function SlotTimelineState() {
var _this = _super.call(this) || this;
_this._color = new dragonBones.ColorTransform();
_this._durationColor = new dragonBones.ColorTransform();
return _this;
}
SlotTimelineState.toString = function () {
return "[class dragonBones.SlotTimelineState]";
};
SlotTimelineState.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.slot = null;
this._colorDirty = false;
this._tweenColor = 0 /* None */;
this._color.identity();
this._durationColor.identity();
this._slotColor = null;
};
SlotTimelineState.prototype._onArriveAtFrame = function () {
_super.prototype._onArriveAtFrame.call(this);
if (this._animationState._isDisabled(this.slot)) {
this._tweenEasing = dragonBones.DragonBones.NO_TWEEN;
this._curve = null;
this._tweenColor = 0 /* None */;
return;
}
var displayIndex = this._currentFrame.displayIndex;
if (this._playState >= 0 && this.slot.displayIndex !== displayIndex) {
this.slot._setDisplayIndex(displayIndex);
}
if (displayIndex >= 0) {
this._tweenColor = 0 /* None */;
var currentColor = this._currentFrame.color;
if (this._tweenEasing !== dragonBones.DragonBones.NO_TWEEN || this._curve) {
var nextFrame = this._currentFrame.next;
var nextColor = nextFrame.color;
if (currentColor !== nextColor) {
this._durationColor.alphaMultiplier = nextColor.alphaMultiplier - currentColor.alphaMultiplier;
this._durationColor.redMultiplier = nextColor.redMultiplier - currentColor.redMultiplier;
this._durationColor.greenMultiplier = nextColor.greenMultiplier - currentColor.greenMultiplier;
this._durationColor.blueMultiplier = nextColor.blueMultiplier - currentColor.blueMultiplier;
this._durationColor.alphaOffset = nextColor.alphaOffset - currentColor.alphaOffset;
this._durationColor.redOffset = nextColor.redOffset - currentColor.redOffset;
this._durationColor.greenOffset = nextColor.greenOffset - currentColor.greenOffset;
this._durationColor.blueOffset = nextColor.blueOffset - currentColor.blueOffset;
if (this._durationColor.alphaMultiplier !== 0.0 ||
this._durationColor.redMultiplier !== 0.0 ||
this._durationColor.greenMultiplier !== 0.0 ||
this._durationColor.blueMultiplier !== 0.0 ||
this._durationColor.alphaOffset !== 0 ||
this._durationColor.redOffset !== 0 ||
this._durationColor.greenOffset !== 0 ||
this._durationColor.blueOffset !== 0) {
this._tweenColor = 2 /* Always */;
}
}
}
if (this._tweenColor === 0 /* None */) {
if (this._slotColor.alphaMultiplier !== currentColor.alphaMultiplier ||
this._slotColor.redMultiplier !== currentColor.redMultiplier ||
this._slotColor.greenMultiplier !== currentColor.greenMultiplier ||
this._slotColor.blueMultiplier !== currentColor.blueMultiplier ||
this._slotColor.alphaOffset !== currentColor.alphaOffset ||
this._slotColor.redOffset !== currentColor.redOffset ||
this._slotColor.greenOffset !== currentColor.greenOffset ||
this._slotColor.blueOffset !== currentColor.blueOffset) {
this._tweenColor = 1 /* Once */;
}
}
}
else {
this._tweenEasing = dragonBones.DragonBones.NO_TWEEN;
this._curve = null;
this._tweenColor = 0 /* None */;
}
};
SlotTimelineState.prototype._onUpdateFrame = function () {
_super.prototype._onUpdateFrame.call(this);
var tweenProgress = 0.0;
if (this._tweenColor !== 0 /* None */ && this.slot.parent._blendLayer >= this._animationState._layer) {
if (this._tweenColor === 1 /* Once */) {
this._tweenColor = 0 /* None */;
tweenProgress = 0.0;
}
else {
tweenProgress = this._tweenProgress;
}
var currentColor = this._currentFrame.color;
this._color.alphaMultiplier = currentColor.alphaMultiplier + this._durationColor.alphaMultiplier * tweenProgress;
this._color.redMultiplier = currentColor.redMultiplier + this._durationColor.redMultiplier * tweenProgress;
this._color.greenMultiplier = currentColor.greenMultiplier + this._durationColor.greenMultiplier * tweenProgress;
this._color.blueMultiplier = currentColor.blueMultiplier + this._durationColor.blueMultiplier * tweenProgress;
this._color.alphaOffset = currentColor.alphaOffset + this._durationColor.alphaOffset * tweenProgress;
this._color.redOffset = currentColor.redOffset + this._durationColor.redOffset * tweenProgress;
this._color.greenOffset = currentColor.greenOffset + this._durationColor.greenOffset * tweenProgress;
this._color.blueOffset = currentColor.blueOffset + this._durationColor.blueOffset * tweenProgress;
this._colorDirty = true;
}
};
SlotTimelineState.prototype._init = function (armature, animationState, timelineData) {
_super.prototype._init.call(this, armature, animationState, timelineData);
this._slotColor = this.slot._colorTransform;
};
SlotTimelineState.prototype.fadeOut = function () {
this._tweenColor = 0 /* None */;
};
SlotTimelineState.prototype.update = function (passedTime) {
_super.prototype.update.call(this, passedTime);
// Fade animation.
if (this._tweenColor !== 0 /* None */ || this._colorDirty) {
if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) {
var fadeProgress = Math.pow(this._animationState._fadeProgress, 4);
this._slotColor.alphaMultiplier += (this._color.alphaMultiplier - this._slotColor.alphaMultiplier) * fadeProgress;
this._slotColor.redMultiplier += (this._color.redMultiplier - this._slotColor.redMultiplier) * fadeProgress;
this._slotColor.greenMultiplier += (this._color.greenMultiplier - this._slotColor.greenMultiplier) * fadeProgress;
this._slotColor.blueMultiplier += (this._color.blueMultiplier - this._slotColor.blueMultiplier) * fadeProgress;
this._slotColor.alphaOffset += (this._color.alphaOffset - this._slotColor.alphaOffset) * fadeProgress;
this._slotColor.redOffset += (this._color.redOffset - this._slotColor.redOffset) * fadeProgress;
this._slotColor.greenOffset += (this._color.greenOffset - this._slotColor.greenOffset) * fadeProgress;
this._slotColor.blueOffset += (this._color.blueOffset - this._slotColor.blueOffset) * fadeProgress;
this.slot._colorDirty = true;
}
else if (this._colorDirty) {
this._colorDirty = false;
this._slotColor.alphaMultiplier = this._color.alphaMultiplier;
this._slotColor.redMultiplier = this._color.redMultiplier;
this._slotColor.greenMultiplier = this._color.greenMultiplier;
this._slotColor.blueMultiplier = this._color.blueMultiplier;
this._slotColor.alphaOffset = this._color.alphaOffset;
this._slotColor.redOffset = this._color.redOffset;
this._slotColor.greenOffset = this._color.greenOffset;
this._slotColor.blueOffset = this._color.blueOffset;
this.slot._colorDirty = true;
}
}
};
return SlotTimelineState;
}(dragonBones.TweenTimelineState));
dragonBones.SlotTimelineState = SlotTimelineState;
/**
* @internal
* @private
*/
var FFDTimelineState = (function (_super) {
__extends(FFDTimelineState, _super);
function FFDTimelineState() {
var _this = _super.call(this) || this;
_this._ffdVertices = [];
_this._durationFFDVertices = [];
return _this;
}
FFDTimelineState.toString = function () {
return "[class dragonBones.FFDTimelineState]";
};
FFDTimelineState.prototype._onClear = function () {
_super.prototype._onClear.call(this);
this.slot = null;
this._ffdDirty = false;
this._tweenFFD = 0 /* None */;
this._ffdVertices.length = 0;
this._durationFFDVertices.length = 0;
this._slotFFDVertices = null;
};
FFDTimelineState.prototype._onArriveAtFrame = function () {
_super.prototype._onArriveAtFrame.call(this);
if (this.slot.displayIndex >= 0 && this._animationState._isDisabled(this.slot)) {
this._tweenEasing = dragonBones.DragonBones.NO_TWEEN;
this._curve = null;
this._tweenFFD = 0 /* None */;
return;
}
this._tweenFFD = 0 /* None */;
if (this._tweenEasing !== dragonBones.DragonBones.NO_TWEEN || this._curve) {
var currentFFDVertices = this._currentFrame.tweens;
var nextFFDVertices = this._currentFrame.next.tweens;
for (var i = 0, l = currentFFDVertices.length; i < l; ++i) {
var duration = nextFFDVertices[i] - currentFFDVertices[i];
this._durationFFDVertices[i] = duration;
if (duration !== 0.0) {
this._tweenFFD = 2 /* Always */;
}
}
}
//
if (this._tweenFFD === 0 /* None */) {
this._tweenFFD = 1 /* Once */;
for (var i = 0, l = this._durationFFDVertices.length; i < l; ++i) {
this._durationFFDVertices[i] = 0;
}
}
};
FFDTimelineState.prototype._onUpdateFrame = function () {
_super.prototype._onUpdateFrame.call(this);
var tweenProgress = 0.0;
if (this._tweenFFD !== 0 /* None */ && this.slot.parent._blendLayer >= this._animationState._layer) {
if (this._tweenFFD === 1 /* Once */) {
this._tweenFFD = 0 /* None */;
tweenProgress = 0.0;
}
else {
tweenProgress = this._tweenProgress;
}
var currentFFDVertices = this._currentFrame.tweens;
for (var i = 0, l = currentFFDVertices.length; i < l; ++i) {
this._ffdVertices[i] = currentFFDVertices[i] + this._durationFFDVertices[i] * tweenProgress;
}
this._ffdDirty = true;
}
};
FFDTimelineState.prototype._init = function (armature, animationState, timelineData) {
_super.prototype._init.call(this, armature, animationState, timelineData);
this._slotFFDVertices = this.slot._ffdVertices;
this._ffdVertices.length = this._timelineData.frames[0].tweens.length;
this._durationFFDVertices.length = this._ffdVertices.length;
for (var i = 0, l = this._ffdVertices.length; i < l; ++i) {
this._ffdVertices[i] = 0.0;
}
for (var i = 0, l = this._durationFFDVertices.length; i < l; ++i) {
this._durationFFDVertices[i] = 0.0;
}
};
FFDTimelineState.prototype.fadeOut = function () {
this._tweenFFD = 0 /* None */;
};
FFDTimelineState.prototype.update = function (passedTime) {
_super.prototype.update.call(this, passedTime);
if (this.slot._meshData !== this._timelineData.display.mesh) {
return;
}
// Fade animation.
if (this._tweenFFD !== 0 /* None */ || this._ffdDirty) {
if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) {
var fadeProgress = Math.pow(this._animationState._fadeProgress, 4.0);
for (var i = 0, l = this._ffdVertices.length; i < l; ++i) {
this._slotFFDVertices[i] += (this._ffdVertices[i] - this._slotFFDVertices[i]) * fadeProgress;
}
this.slot._meshDirty = true;
}
else if (this._ffdDirty) {
this._ffdDirty = false;
for (var i = 0, l = this._ffdVertices.length; i < l; ++i) {
this._slotFFDVertices[i] = this._ffdVertices[i];
}
this.slot._meshDirty = true;
}
}
};
return FFDTimelineState;
}(dragonBones.TweenTimelineState));
dragonBones.FFDTimelineState = FFDTimelineState;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。
* @see dragonBones.IAnimateble
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
var WorldClock = (function () {
/**
* @language zh_CN
* 创建一个新的 WorldClock 实例。
* 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。
* (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度)
* @version DragonBones 3.0
*/
function WorldClock() {
/**
* @language zh_CN
* 当前时间。 (以秒为单位)
* @version DragonBones 3.0
*/
this.time = new Date().getTime() / dragonBones.DragonBones.SECOND_TO_MILLISECOND;
/**
* @language zh_CN
* 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放]
* @default 1
* @version DragonBones 3.0
*/
this.timeScale = 1.0;
this._animatebles = [];
this._clock = null;
}
Object.defineProperty(WorldClock, "clock", {
/**
* @language zh_CN
* 一个可以直接使用的全局 WorldClock 实例.
* @version DragonBones 3.0
*/
get: function () {
if (!WorldClock._clock) {
WorldClock._clock = new WorldClock();
}
return WorldClock._clock;
},
enumerable: true,
configurable: true
});
/**
* @language zh_CN
* 为所有的 IAnimatable 实例更新时间。
* @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差)
* @version DragonBones 3.0
*/
WorldClock.prototype.advanceTime = function (passedTime) {
if (passedTime !== passedTime) {
passedTime = 0.0;
}
if (passedTime < 0.0) {
passedTime = new Date().getTime() / dragonBones.DragonBones.SECOND_TO_MILLISECOND - this.time;
}
if (this.timeScale !== 1.0) {
passedTime *= this.timeScale;
}
if (passedTime < 0.0) {
this.time -= passedTime;
}
else {
this.time += passedTime;
}
if (passedTime) {
var i = 0, r = 0, l = this._animatebles.length;
for (; i < l; ++i) {
var animateble = this._animatebles[i];
if (animateble) {
if (r > 0) {
this._animatebles[i - r] = animateble;
this._animatebles[i] = null;
}
animateble.advanceTime(passedTime);
}
else {
r++;
}
}
if (r > 0) {
l = this._animatebles.length;
for (; i < l; ++i) {
var animateble = this._animatebles[i];
if (animateble) {
this._animatebles[i - r] = animateble;
}
else {
r++;
}
}
this._animatebles.length -= r;
}
}
};
/**
* 是否包含 IAnimatable 实例
* @param value IAnimatable 实例。
* @version DragonBones 3.0
*/
WorldClock.prototype.contains = function (value) {
return this._animatebles.indexOf(value) >= 0;
};
/**
* @language zh_CN
* 添加 IAnimatable 实例。
* @param value IAnimatable 实例。
* @version DragonBones 3.0
*/
WorldClock.prototype.add = function (value) {
if (value && this._animatebles.indexOf(value) < 0) {
this._animatebles.push(value);
value.clock = this;
if (dragonBones.DragonBones.debug && value instanceof dragonBones.Armature) {
dragonBones.DragonBones.addArmature(value);
}
}
};
/**
* @language zh_CN
* 移除 IAnimatable 实例。
* @param value IAnimatable 实例。
* @version DragonBones 3.0
*/
WorldClock.prototype.remove = function (value) {
var index = this._animatebles.indexOf(value);
if (index >= 0) {
this._animatebles[index] = null;
value.clock = null;
if (dragonBones.DragonBones.debug && value instanceof dragonBones.Armature) {
dragonBones.DragonBones.removeArmature(value);
}
}
};
/**
* @language zh_CN
* 清除所有的 IAnimatable 实例。
* @version DragonBones 3.0
*/
WorldClock.prototype.clear = function () {
for (var i = 0, l = this._animatebles.length; i < l; ++i) {
var animateble = this._animatebles[i];
this._animatebles[i] = null;
if (animateble != null) {
animateble.clock = null;
}
}
};
Object.defineProperty(WorldClock.prototype, "clock", {
/**
* @inheritDoc
*/
get: function () {
return this._clock;
},
set: function (value) {
if (this._clock === value) {
return;
}
var prevClock = this._clock;
if (prevClock) {
prevClock.remove(this);
}
this._clock = value;
if (this._clock) {
this._clock.add(this);
}
},
enumerable: true,
configurable: true
});
return WorldClock;
}());
WorldClock._clock = null;
dragonBones.WorldClock = WorldClock;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 事件数据。
* @version DragonBones 4.5
*/
var EventObject = (function (_super) {
__extends(EventObject, _super);
/**
* @internal
* @private
*/
function EventObject() {
return _super.call(this) || this;
}
/**
* @private
*/
EventObject.toString = function () {
return "[class dragonBones.EventObject]";
};
/**
* @private
*/
EventObject.prototype._onClear = function () {
this.type = null;
this.name = null;
this.frame = null;
this.data = null;
this.armature = null;
this.bone = null;
this.slot = null;
this.animationState = null;
};
return EventObject;
}(dragonBones.BaseObject));
/**
* @language zh_CN
* 动画开始。
* @version DragonBones 4.5
*/
EventObject.START = "start";
/**
* @language zh_CN
* 动画循环播放一次完成。
* @version DragonBones 4.5
*/
EventObject.LOOP_COMPLETE = "loopComplete";
/**
* @language zh_CN
* 动画播放完成。
* @version DragonBones 4.5
*/
EventObject.COMPLETE = "complete";
/**
* @language zh_CN
* 动画淡入开始。
* @version DragonBones 4.5
*/
EventObject.FADE_IN = "fadeIn";
/**
* @language zh_CN
* 动画淡入完成。
* @version DragonBones 4.5
*/
EventObject.FADE_IN_COMPLETE = "fadeInComplete";
/**
* @language zh_CN
* 动画淡出开始。
* @version DragonBones 4.5
*/
EventObject.FADE_OUT = "fadeOut";
/**
* @language zh_CN
* 动画淡出完成。
* @version DragonBones 4.5
*/
EventObject.FADE_OUT_COMPLETE = "fadeOutComplete";
/**
* @language zh_CN
* 动画帧事件。
* @version DragonBones 4.5
*/
EventObject.FRAME_EVENT = "frameEvent";
/**
* @language zh_CN
* 动画声音事件。
* @version DragonBones 4.5
*/
EventObject.SOUND_EVENT = "soundEvent";
dragonBones.EventObject = EventObject;
})(dragonBones || (dragonBones = {}));
var dragonBones;
(function (dragonBones) {
/**
* @language zh_CN
* 创建骨架的基础工厂。 (通常只需要一个全局工厂实例)
* @see dragonBones.DragonBonesData
* @see dragonBones.TextureAtlasData
* @see dragonBones.ArmatureData
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
var BaseFactory = (function () {
/**
* @private
*/
function BaseFactory(dataParser) {
if (dataParser === void 0) { dataParser = null; }
/**
* @language zh_CN
* 是否开启共享搜索。
* 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启)
* @see dragonBones.DragonBonesData#autoSearch
* @see dragonBones.TextureAtlasData#autoSearch
* @version DragonBones 4.5
*/
this.autoSearch = false;
/**
* @private
*/
this._dragonBonesDataMap = {};
/**
* @private
*/
this._textureAtlasDataMap = {};
/**
* @private
*/
this._dataParser = null;
this._dataParser = dataParser;
if (!this._dataParser) {
if (!BaseFactory._defaultParser) {
BaseFactory._defaultParser = new dragonBones.ObjectDataParser();
}
this._dataParser = BaseFactory._defaultParser;
}
}
/**
* @private
*/
BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) {
var textureAtlasDataList = this._textureAtlasDataMap[textureAtlasName];
if (textureAtlasDataList) {
for (var i = 0, l = textureAtlasDataList.length; i < l; ++i) {
var textureData = textureAtlasDataList[i].getTexture(textureName);
if (textureData) {
return textureData;
}
}
}
if (this.autoSearch) {
for (var textureAtlasName_1 in this._textureAtlasDataMap) {
textureAtlasDataList = this._textureAtlasDataMap[textureAtlasName_1];
for (var i = 0, l = textureAtlasDataList.length; i < l; ++i) {
var textureAtlasData = textureAtlasDataList[i];
if (textureAtlasData.autoSearch) {
var textureData = textureAtlasData.getTexture(textureName);
if (textureData) {
return textureData;
}
}
}
}
}
return null;
};
/**
* @private
*/
BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) {
var dragonBonesData = null;
var armatureData = null;
if (dragonBonesName) {
dragonBonesData = this._dragonBonesDataMap[dragonBonesName];
if (dragonBonesData) {
armatureData = dragonBonesData.getArmature(armatureName);
}
}
if (!armatureData && (!dragonBonesName || this.autoSearch)) {
for (var eachDragonBonesName in this._dragonBonesDataMap) {
dragonBonesData = this._dragonBonesDataMap[eachDragonBonesName];
if (!dragonBonesName || dragonBonesData.autoSearch) {
armatureData = dragonBonesData.getArmature(armatureName);
if (armatureData) {
dragonBonesName = eachDragonBonesName;
break;
}
}
}
}
if (armatureData) {
dataPackage.dataName = dragonBonesName;
dataPackage.textureAtlasName = textureAtlasName;
dataPackage.data = dragonBonesData;
dataPackage.armature = armatureData;
dataPackage.skin = armatureData.getSkin(skinName);
if (!dataPackage.skin) {
dataPackage.skin = armatureData.defaultSkin;
}
return true;
}
return false;
};
/**
* @private
*/
BaseFactory.prototype._buildBones = function (dataPackage, armature) {
var bones = dataPackage.armature.sortedBones;
for (var i = 0, l = bones.length; i < l; ++i) {
var boneData = bones[i];
var bone = dragonBones.BaseObject.borrowObject(dragonBones.Bone);
bone._init(boneData);
if (boneData.parent) {
armature.addBone(bone, boneData.parent.name);
}
else {
armature.addBone(bone);
}
if (boneData.ik) {
bone.ikBendPositive = boneData.bendPositive;
bone.ikWeight = boneData.weight;
bone._setIK(armature.getBone(boneData.ik.name), boneData.chain, boneData.chainIndex);
}
}
};
/**
* @private
*/
BaseFactory.prototype._buildSlots = function (dataPackage, armature) {
var currentSkin = dataPackage.skin;
var defaultSkin = dataPackage.armature.defaultSkin;
if (!currentSkin || !defaultSkin) {
return;
}
var skinSlotDatas = {};
for (var k in defaultSkin.slots) {
var skinSlotData = defaultSkin.slots[k];
skinSlotDatas[skinSlotData.slot.name] = skinSlotData;
}
if (currentSkin !== defaultSkin) {
for (var k in currentSkin.slots) {
var skinSlotData = currentSkin.slots[k];
skinSlotDatas[skinSlotData.slot.name] = skinSlotData;
}
}
var slots = dataPackage.armature.sortedSlots;
for (var i = 0, l = slots.length; i < l; ++i) {
var slotData = slots[i];
var skinSlotData = skinSlotDatas[slotData.name];
if (!skinSlotData) {
continue;
}
var slot = this._generateSlot(dataPackage, skinSlotData, armature);
if (slot) {
armature.addSlot(slot, slotData.parent.name);
slot._setDisplayIndex(slotData.displayIndex);
}
}
};
/**
* @private
*/
BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) {
if (displayIndex < 0) {
displayIndex = slot.displayIndex;
}
if (displayIndex >= 0) {
var displayList = slot.displayList; // Copy.
if (displayList.length <= displayIndex) {
displayList.length = displayIndex + 1;
}
if (slot._replacedDisplayDatas.length <= displayIndex) {
slot._replacedDisplayDatas.length = displayIndex + 1;
}
slot._replacedDisplayDatas[displayIndex] = displayData;
if (displayData.type === 1 /* Armature */) {
var childArmature = this.buildArmature(displayData.path, dataPackage.dataName, null, dataPackage.textureAtlasName);
displayList[displayIndex] = childArmature;
}
else {
if (!displayData.texture || dataPackage.textureAtlasName) {
displayData.texture = this._getTextureData(dataPackage.textureAtlasName ? dataPackage.textureAtlasName : dataPackage.dataName, displayData.path);
}
var displayDatas = slot.skinSlotData.displays;
if (displayData.mesh ||
(displayIndex < displayDatas.length && displayDatas[displayIndex].mesh)) {
displayList[displayIndex] = slot.meshDisplay;
}
else {
displayList[displayIndex] = slot.rawDisplay;
}
}
slot.displayList = displayList;
}
};
/**
* @language zh_CN
* 解析并添加龙骨数据。
* @param rawData 需要解析的原始数据。 (JSON)
* @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。
* @returns DragonBonesData
* @see #getDragonBonesData()
* @see #addDragonBonesData()
* @see #removeDragonBonesData()
* @see dragonBones.DragonBonesData
* @version DragonBones 4.5
*/
BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) {
if (name === void 0) { name = null; }
if (scale === void 0) { scale = 1.0; }
var dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale);
this.addDragonBonesData(dragonBonesData, name);
return dragonBonesData;
};
/**
* @language zh_CN
* 解析并添加贴图集数据。
* @param rawData 需要解析的原始数据。 (JSON)
* @param textureAtlas 贴图。
* @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。
* @param scale 为贴图集设置一个缩放值。
* @returns 贴图集数据
* @see #getTextureAtlasData()
* @see #addTextureAtlasData()
* @see #removeTextureAtlasData()
* @see dragonBones.TextureAtlasData
* @version DragonBones 4.5
*/
BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) {
if (name === void 0) { name = null; }
if (scale === void 0) { scale = 0.0; }
var textureAtlasData = this._generateTextureAtlasData(null, null);
this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale);
this._generateTextureAtlasData(textureAtlasData, textureAtlas);
this.addTextureAtlasData(textureAtlasData, name);
return textureAtlasData;
};
/**
* @language zh_CN
* 获取指定名称的龙骨数据。
* @param name 数据名称。
* @returns DragonBonesData
* @see #parseDragonBonesData()
* @see #addDragonBonesData()
* @see #removeDragonBonesData()
* @see dragonBones.DragonBonesData
* @version DragonBones 3.0
*/
BaseFactory.prototype.getDragonBonesData = function (name) {
return this._dragonBonesDataMap[name];
};
/**
* @language zh_CN
* 添加龙骨数据。
* @param data 龙骨数据。
* @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。
* @see #parseDragonBonesData()
* @see #getDragonBonesData()
* @see #removeDragonBonesData()
* @see dragonBones.DragonBonesData
* @version DragonBones 3.0
*/
BaseFactory.prototype.addDragonBonesData = function (data, name) {
if (name === void 0) { name = null; }
if (data) {
name = name || data.name;
if (name) {
if (!this._dragonBonesDataMap[name]) {
this._dragonBonesDataMap[name] = data;
}
else {
console.warn("Same name data.", name);
}
}
else {
console.warn("Unnamed data.");
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @language zh_CN
* 移除龙骨数据。
* @param name 数据名称。
* @param disposeData 是否释放数据。
* @see #parseDragonBonesData()
* @see #getDragonBonesData()
* @see #addDragonBonesData()
* @see dragonBones.DragonBonesData
* @version DragonBones 3.0
*/
BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) {
if (disposeData === void 0) { disposeData = true; }
var dragonBonesData = this._dragonBonesDataMap[name];
if (dragonBonesData) {
if (disposeData) {
dragonBonesData.returnToPool();
}
delete this._dragonBonesDataMap[name];
}
};
/**
* @language zh_CN
* 获取指定名称的贴图集数据列表。
* @param name 数据名称。
* @returns 贴图集数据列表。
* @see #parseTextureAtlasData()
* @see #addTextureAtlasData()
* @see #removeTextureAtlasData()
* @see dragonBones.textures.TextureAtlasData
* @version DragonBones 3.0
*/
BaseFactory.prototype.getTextureAtlasData = function (name) {
return this._textureAtlasDataMap[name];
};
/**
* @language zh_CN
* 添加贴图集数据。
* @param data 贴图集数据。
* @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。
* @see #parseTextureAtlasData()
* @see #getTextureAtlasData()
* @see #removeTextureAtlasData()
* @see dragonBones.textures.TextureAtlasData
* @version DragonBones 3.0
*/
BaseFactory.prototype.addTextureAtlasData = function (data, name) {
if (name === void 0) { name = null; }
if (data) {
name = name || data.name;
if (name) {
var textureAtlasList = this._textureAtlasDataMap[name] ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []);
if (textureAtlasList.indexOf(data) < 0) {
textureAtlasList.push(data);
}
}
else {
console.warn("Unnamed data.");
}
}
else {
throw new Error(dragonBones.DragonBones.ARGUMENT_ERROR);
}
};
/**
* @language zh_CN
* 移除贴图集数据。
* @param name 数据名称。
* @param disposeData 是否释放数据。
* @see #parseTextureAtlasData()
* @see #getTextureAtlasData()
* @see #addTextureAtlasData()
* @see dragonBones.textures.TextureAtlasData
* @version DragonBones 3.0
*/
BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) {
if (disposeData === void 0) { disposeData = true; }
var textureAtlasDataList = this._textureAtlasDataMap[name];
if (textureAtlasDataList) {
if (disposeData) {
for (var i = 0, l = textureAtlasDataList.length; i < l; ++i) {
textureAtlasDataList[i].returnToPool();
}
}
delete this._textureAtlasDataMap[name];
}
};
/**
* @language zh_CN
* 清除所有的数据。
* @param disposeData 是否释放数据。
* @version DragonBones 4.5
*/
BaseFactory.prototype.clear = function (disposeData) {
if (disposeData === void 0) { disposeData = true; }
for (var k in this._dragonBonesDataMap) {
if (disposeData) {
this._dragonBonesDataMap[k].returnToPool();
}
delete this._dragonBonesDataMap[k];
}
for (var k in this._textureAtlasDataMap) {
if (disposeData) {
var textureAtlasDataList = this._textureAtlasDataMap[k];
for (var i = 0, l = textureAtlasDataList.length; i < l; ++i) {
textureAtlasDataList[i].returnToPool();
}
}
delete this._textureAtlasDataMap[k];
}
};
/**
* @language zh_CN
* 创建一个骨架。
* @param armatureName 骨架数据名称。
* @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。
* @param skinName 皮肤名称,如果未设置,则使用默认皮肤。
* @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。
* @returns 骨架
* @see dragonBones.ArmatureData
* @see dragonBones.Armature
* @version DragonBones 3.0
*/
BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) {
if (dragonBonesName === void 0) { dragonBonesName = null; }
if (skinName === void 0) { skinName = null; }
if (textureAtlasName === void 0) { textureAtlasName = null; }
var dataPackage = {};
if (this._fillBuildArmaturePackage(dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName)) {
var armature = this._generateArmature(dataPackage);
this._buildBones(dataPackage, armature);
this._buildSlots(dataPackage, armature);
armature.invalidUpdate(null, true);
armature.advanceTime(0.0); // Update armature pose.
return armature;
}
console.warn("No armature data.", armatureName, dragonBonesName ? dragonBonesName : "");
return null;
};
/**
* @language zh_CN
* 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构)
* @param toArmature 指定的骨架。
* @param fromArmatreName 其他骨架的名称。
* @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。
* @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。
* @param replaceOriginalAnimation 是否替换原有的同名动画。
* @returns 是否替换成功。
* @see dragonBones.Armature
* @see dragonBones.ArmatureData
* @version DragonBones 4.5
*/
BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) {
if (fromSkinName === void 0) { fromSkinName = null; }
if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; }
if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; }
var dataPackage = {};
if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName, fromArmatreName, fromSkinName, null)) {
var fromArmatureData = dataPackage.armature;
if (replaceOriginalAnimation) {
toArmature.animation.animations = fromArmatureData.animations;
}
else {
var animations = {};
for (var animationName in toArmature.animation.animations) {
animations[animationName] = toArmature.animation.animations[animationName];
}
for (var animationName in fromArmatureData.animations) {
animations[animationName] = fromArmatureData.animations[animationName];
}
toArmature.animation.animations = animations;
}
if (dataPackage.skin) {
var slots = toArmature.getSlots();
for (var i = 0, l = slots.length; i < l; ++i) {
var toSlot = slots[i];
var toSlotDisplayList = toSlot.displayList;
for (var iA = 0, lA = toSlotDisplayList.length; iA < lA; ++iA) {
var toDisplayObject = toSlotDisplayList[iA];
if (toDisplayObject instanceof dragonBones.Armature) {
var displays = dataPackage.skin.getSlot(toSlot.name).displays;
if (iA < displays.length) {
var fromDisplayData = displays[iA];
if (fromDisplayData.type === 1 /* Armature */) {
this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation);
}
}
}
}
}
return true;
}
}
return false;
};
/**
* @language zh_CN
* 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象)
* @param dragonBonesName 指定的龙骨数据名称。
* @param armatureName 指定的骨架名称。
* @param slotName 指定的插槽名称。
* @param displayName 指定的显示对象名称。
* @param slot 指定的插槽实例。
* @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。
* @version DragonBones 4.5
*/
BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) {
if (displayIndex === void 0) { displayIndex = -1; }
var dataPackage = {};
if (this._fillBuildArmaturePackage(dataPackage, dragonBonesName, armatureName, null, null)) {
var skinSlotData = dataPackage.skin.getSlot(slotName);
if (skinSlotData) {
for (var i = 0, l = skinSlotData.displays.length; i < l; ++i) {
var displayData = skinSlotData.displays[i];
if (displayData.name === displayName) {
this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex);
break;
}
}
}
}
};
/**
* @language zh_CN
* 用指定资源列表替换插槽的显示对象列表。
* @param dragonBonesName 指定的 DragonBonesData 名称。
* @param armatureName 指定的骨架名称。
* @param slotName 指定的插槽名称。
* @param slot 指定的插槽实例。
* @version DragonBones 4.5
*/
BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) {
var dataPackage = {};
if (this._fillBuildArmaturePackage(dataPackage, dragonBonesName, armatureName, null, null)) {
var skinSlotData = dataPackage.skin.getSlot(slotName);
if (skinSlotData) {
for (var i = 0, l = skinSlotData.displays.length; i < l; ++i) {
var displayData = skinSlotData.displays[i];
this._replaceSlotDisplay(dataPackage, displayData, slot, i);
}
}
}
};
/**
* @private
*/
BaseFactory.prototype.getAllDragonBonesData = function () {
return this._dragonBonesDataMap;
};
/**
* @private
*/
BaseFactory.prototype.getAllTextureAtlasData = function () {
return this._textureAtlasDataMap;
};
return BaseFactory;
}());
/**
* @private
*/
BaseFactory._defaultParser = null;
dragonBones.BaseFactory = BaseFactory;
})(dragonBones || (dragonBones = {}));