dragonbones-tools
Version:
Dragonbones tools.
898 lines (897 loc) • 39.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var object = require("../common/object");
var geom = require("../format/geom");
var dbft = require("../format/dragonBonesFormat");
var intArray = [];
var floatArray = [];
var timelineArray = [];
var frameArray = [];
var frameIntArray = [];
var frameFloatArray = [];
var colorArray = [];
var colors = {};
var currentArmature;
var currentAnimationBinary;
/**
* Convert DragonBones format to binary.
*/
function default_1(data) {
// Clean helper.
intArray.length = 0;
floatArray.length = 0;
timelineArray.length = 0;
frameArray.length = 0;
frameIntArray.length = 0;
frameFloatArray.length = 0;
colorArray.length = 0;
for (var k in colors) {
delete colors[k];
}
var binaryDatas = new Array();
for (var _i = 0, _a = data.armature; _i < _a.length; _i++) {
currentArmature = _a[_i];
for (var _b = 0, _c = currentArmature.bone; _b < _c.length; _b++) {
var bone = _c[_b];
if (bone instanceof dbft.Surface) {
bone.offset = createVertices(bone);
binaryDatas.push(bone);
}
}
for (var _d = 0, _e = currentArmature.skin; _d < _e.length; _d++) {
var skin = _e[_d];
for (var _f = 0, _g = skin.slot; _f < _g.length; _f++) {
var slot = _g[_f];
for (var _h = 0, _j = slot.display; _h < _j.length; _h++) {
var display = _j[_h];
if (display instanceof dbft.MeshDisplay) {
display.offset = createMesh(display);
binaryDatas.push(display);
}
else if (display instanceof dbft.PathDisplay) {
display.offset = createVertices(display);
binaryDatas.push(display);
}
else if (display instanceof dbft.PolygonBoundingBoxDisplay) {
display.offset = createVertices(display);
binaryDatas.push(display);
}
}
}
}
var animationBinarys = new Array();
for (var _k = 0, _l = currentArmature.animation; _k < _l.length; _k++) {
var animation = _l[_k];
currentAnimationBinary = new dbft.AnimationBinary();
currentAnimationBinary.type = animation.type;
currentAnimationBinary.blendType = animation.blendType;
currentAnimationBinary.duration = animation.duration;
currentAnimationBinary.playTimes = animation.playTimes;
currentAnimationBinary.scale = animation.scale;
currentAnimationBinary.fadeInTime = animation.fadeInTime;
currentAnimationBinary.name = animation.name;
currentAnimationBinary.offset[dbft.OffsetOrder.FrameInt] = frameIntArray.length;
currentAnimationBinary.offset[dbft.OffsetOrder.FrameFloat] = frameFloatArray.length;
currentAnimationBinary.offset[dbft.OffsetOrder.Frame] = frameArray.length;
animationBinarys.push(currentAnimationBinary);
if (animation.frame.length > 0) {
currentAnimationBinary.action = createTimeline(animation, animation.frame, 0 /* Step */, 0, createActionFrame);
}
if (animation.zOrder) {
currentAnimationBinary.zOrder = createTimeline(animation.zOrder, animation.zOrder.frame, 0 /* Step */, 0, createZOrderFrame);
}
for (var _m = 0, _o = animation.bone; _m < _o.length; _m++) {
var timeline = _o[_m];
currentAnimationBinary.bone[timeline.name] = createBoneTimeline(timeline);
}
for (var _p = 0, _q = animation.slot; _p < _q.length; _p++) {
var timeline = _q[_p];
if (!(timeline.name in currentAnimationBinary.slot)) {
currentAnimationBinary.slot[timeline.name] = [];
}
var timelines = currentAnimationBinary.slot[timeline.name];
if (timeline.displayFrame.length > 0) {
timelines.push(dbft.TimelineType.SlotDisplay);
timelines.push(createTimeline(timeline, timeline.displayFrame, 0 /* Step */, 0, function (frame, frameStart) {
var offset = createFrame(frame, frameStart);
frameArray.push(frame.value);
return offset;
}));
}
if (timeline.colorFrame.length > 0) {
timelines.push(dbft.TimelineType.SlotColor);
timelines.push(createTimeline(timeline, timeline.colorFrame, 1 /* Int */, 1, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
// Color.
var colorString = frame.value.toString();
if (!(colorString in colors)) {
colors[colorString] = createColor(frame.value);
}
frameIntArray.push(colors[colorString]);
return offset;
}));
}
}
for (var _r = 0, _s = animation.ffd; _r < _s.length; _r++) {
var timeline = _s[_r];
if (!(timeline.slot in currentAnimationBinary.slot)) {
currentAnimationBinary.slot[timeline.slot] = [];
}
var timelines = currentAnimationBinary.slot[timeline.slot];
timelines.push(createDeformTimeline(timeline));
}
for (var _t = 0, _u = animation.ik; _t < _u.length; _t++) {
var timeline = _u[_t];
if (!(timeline.name in currentAnimationBinary.constraint)) {
currentAnimationBinary.constraint[timeline.name] = [];
}
var timelines = currentAnimationBinary.constraint[timeline.name];
if (timeline.frame.length > 0) {
timelines.push(dbft.TimelineType.IKConstraint);
timelines.push(createTimeline(timeline, timeline.frame, 1 /* Int */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameIntArray.push(frame.bendPositive ? 1 : 0); // TODO 100
frameIntArray.push(Math.round(frame.weight * 100.0));
return offset;
}));
}
currentAnimationBinary.constraint[timeline.name] = timelines;
}
for (var _v = 0, _w = animation.timeline; _v < _w.length; _v++) {
var timeline = _w[_v];
timeline.offset = createTypeTimeline(timeline);
if (timeline.offset >= 0) {
currentAnimationBinary.timeline.push(timeline);
timeline.clearToBinary();
}
}
}
currentArmature.animation.length = 0;
for (var _x = 0, animationBinarys_1 = animationBinarys; _x < animationBinarys_1.length; _x++) {
var animation = animationBinarys_1[_x];
currentArmature.animation.push(animation);
}
}
// Clear binary data.
for (var _y = 0, binaryDatas_1 = binaryDatas; _y < binaryDatas_1.length; _y++) {
var data_1 = binaryDatas_1[_y];
data_1.clearToBinary();
}
// Align.
if ((intArray.length % Int16Array.BYTES_PER_ELEMENT) !== 0) {
intArray.push(0);
}
if ((frameIntArray.length % Int16Array.BYTES_PER_ELEMENT) !== 0) {
frameIntArray.push(0);
}
if ((frameArray.length % Int16Array.BYTES_PER_ELEMENT) !== 0) {
frameArray.push(0);
}
if ((timelineArray.length % Uint16Array.BYTES_PER_ELEMENT) !== 0) {
timelineArray.push(0);
}
if ((colorArray.length % Int16Array.BYTES_PER_ELEMENT) !== 0) {
colorArray.push(0);
}
// Offset.
var byteLength = 0;
var byteOffset = 0;
data.offset[0] = 0;
byteLength += data.offset[1] = intArray.length * Int16Array.BYTES_PER_ELEMENT;
data.offset[2] = data.offset[0] + data.offset[1];
byteLength += data.offset[3] = floatArray.length * Float32Array.BYTES_PER_ELEMENT;
data.offset[4] = data.offset[2] + data.offset[3];
byteLength += data.offset[5] = frameIntArray.length * Int16Array.BYTES_PER_ELEMENT;
data.offset[6] = data.offset[4] + data.offset[5];
byteLength += data.offset[7] = frameFloatArray.length * Float32Array.BYTES_PER_ELEMENT;
data.offset[8] = data.offset[6] + data.offset[7];
byteLength += data.offset[9] = frameArray.length * Int16Array.BYTES_PER_ELEMENT;
data.offset[10] = data.offset[8] + data.offset[9];
byteLength += data.offset[11] = timelineArray.length * Uint16Array.BYTES_PER_ELEMENT;
data.offset[12] = data.offset[10] + data.offset[11];
byteLength += data.offset[13] = colorArray.length * Int16Array.BYTES_PER_ELEMENT;
object.compress(data, dbft.compressConfig);
//
var jsonString = JSON.stringify(data);
var jsonArray = stringToUTF8Array(jsonString);
modifyBytesPosition(jsonArray, " ".charCodeAt(0));
//
var buffer = new ArrayBuffer(4 + 4 + 4 + jsonArray.length + byteLength);
var dataView = new DataView(buffer);
// Write DragonBones format tag.
dataView.setUint8(byteOffset++, "D".charCodeAt(0));
dataView.setUint8(byteOffset++, "B".charCodeAt(0));
dataView.setUint8(byteOffset++, "D".charCodeAt(0));
dataView.setUint8(byteOffset++, "T".charCodeAt(0));
// Write version.
dataView.setUint8(byteOffset++, 0);
dataView.setUint8(byteOffset++, 0);
dataView.setUint8(byteOffset++, 0);
dataView.setUint8(byteOffset++, 3);
// Write json length.
dataView.setUint32(byteOffset, jsonArray.length, true);
byteOffset += 4;
for (var _z = 0, jsonArray_1 = jsonArray; _z < jsonArray_1.length; _z++) {
var value = jsonArray_1[_z];
dataView.setUint8(byteOffset, value);
byteOffset++;
}
for (var _0 = 0, intArray_1 = intArray; _0 < intArray_1.length; _0++) {
var value = intArray_1[_0];
dataView.setInt16(byteOffset, value, true);
byteOffset += 2;
}
for (var _1 = 0, floatArray_1 = floatArray; _1 < floatArray_1.length; _1++) {
var value = floatArray_1[_1];
dataView.setFloat32(byteOffset, value, true);
byteOffset += 4;
}
for (var _2 = 0, frameIntArray_1 = frameIntArray; _2 < frameIntArray_1.length; _2++) {
var value = frameIntArray_1[_2];
dataView.setInt16(byteOffset, value, true);
byteOffset += 2;
}
for (var _3 = 0, frameFloatArray_1 = frameFloatArray; _3 < frameFloatArray_1.length; _3++) {
var value = frameFloatArray_1[_3];
dataView.setFloat32(byteOffset, value, true);
byteOffset += 4;
}
for (var _4 = 0, frameArray_1 = frameArray; _4 < frameArray_1.length; _4++) {
var value = frameArray_1[_4];
dataView.setInt16(byteOffset, value, true);
byteOffset += 2;
}
for (var _5 = 0, timelineArray_1 = timelineArray; _5 < timelineArray_1.length; _5++) {
var value = timelineArray_1[_5];
dataView.setUint16(byteOffset, value, true);
byteOffset += 2;
}
for (var _6 = 0, colorArray_1 = colorArray; _6 < colorArray_1.length; _6++) {
var value = colorArray_1[_6];
dataView.setInt16(byteOffset, value, true);
byteOffset += 2;
}
return buffer;
}
exports.default = default_1;
function createColor(value) {
var offset = intArray.length;
intArray.length += 8;
intArray[offset + 0] = value.aM;
intArray[offset + 1] = value.rM;
intArray[offset + 2] = value.gM;
intArray[offset + 3] = value.bM;
intArray[offset + 4] = value.aO;
intArray[offset + 5] = value.rO;
intArray[offset + 6] = value.gO;
intArray[offset + 7] = value.bO;
if (offset >= 65536) {
// TODO
}
return offset;
}
function createVertices(value) {
var vertexCount = value.vertexCount;
var offset = intArray.length;
var vertexOffset = floatArray.length;
intArray.length += 1 + 1 + 1 + 1;
intArray[offset + dbft.BinaryOffset.GeometryVertexCount] = vertexCount;
intArray[offset + dbft.BinaryOffset.GeometryTriangleCount] = 0;
intArray[offset + dbft.BinaryOffset.GeometryFloatOffset] = vertexOffset;
if (value.weights.length === 0) {
floatArray.length += value.vertices.length;
for (var i = 0, l = value.vertices.length; i < l; i++) {
floatArray[vertexOffset + i] = value.vertices[i];
}
intArray[offset + dbft.BinaryOffset.GeometryWeightOffset] = -1;
}
else {
var weightBoneCount = value.bones.length;
var weightCount = Math.floor(value.weights.length - vertexCount) / 2; // uint
var weightOffset = intArray.length;
var floatOffset = floatArray.length;
intArray.length += 1 + 1 + weightBoneCount;
intArray[weightOffset + dbft.BinaryOffset.WeigthBoneCount] = weightBoneCount;
intArray[weightOffset + dbft.BinaryOffset.WeigthFloatOffset] = floatOffset;
for (var i = 0; i < weightBoneCount; i++) {
intArray[weightOffset + dbft.BinaryOffset.WeigthBoneIndices + i] = value.bones[i];
}
floatArray.length += weightCount * 3;
for (var i = 0, iV = 0, iW = 0, iB = weightOffset + dbft.BinaryOffset.WeigthBoneIndices + weightBoneCount, iF = floatOffset; i < weightCount; i++) {
var boneCount = value.weights[iW++];
intArray[iB++] = boneCount;
for (var j = 0; j < boneCount; j++) {
var boneIndex = value.weights[iW++];
var boneWeight = value.weights[iW++];
intArray[iB++] = value.bones.indexOf(boneIndex);
floatArray[iF++] = boneWeight;
floatArray[iF++] = value.vertices[iV++];
floatArray[iF++] = value.vertices[iV++];
}
}
intArray[offset + dbft.BinaryOffset.GeometryWeightOffset] = weightOffset;
}
return offset;
}
function createMesh(value) {
var vertexCount = Math.floor(value.vertices.length / 2); // uint
var triangleCount = Math.floor(value.triangles.length / 3); // uint
var offset = intArray.length;
var vertexOffset = floatArray.length;
var uvOffset = vertexOffset + vertexCount * 2;
intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3;
intArray[offset + dbft.BinaryOffset.GeometryVertexCount] = vertexCount;
intArray[offset + dbft.BinaryOffset.GeometryTriangleCount] = triangleCount;
intArray[offset + dbft.BinaryOffset.GeometryFloatOffset] = vertexOffset;
for (var i = 0, l = triangleCount * 3; i < l; ++i) {
intArray[offset + dbft.BinaryOffset.GeometryVertexIndices + i] = value.triangles[i];
}
floatArray.length += vertexCount * 2 + vertexCount * 2;
for (var i = 0, l = vertexCount * 2; i < l; ++i) {
floatArray[vertexOffset + i] = value.vertices[i];
floatArray[uvOffset + i] = value.uvs[i];
}
if (value.weights.length > 0) {
var weightOffset = intArray.length;
var floatOffset = floatArray.length;
value._boneCount = Math.floor(value.bonePose.length / 7);
value._weightCount = Math.floor((value.weights.length - vertexCount) / 2);
intArray.length += 1 + 1 + value._boneCount + vertexCount + value._weightCount;
intArray[weightOffset + dbft.BinaryOffset.WeigthBoneCount] = value._boneCount;
intArray[weightOffset + dbft.BinaryOffset.WeigthFloatOffset] = floatOffset;
for (var i = 0; i < value._boneCount; ++i) {
intArray[weightOffset + dbft.BinaryOffset.WeigthBoneIndices + i] = value.bonePose[i * 7];
}
floatArray.length += value._weightCount * 3;
geom.helpMatrixA.copyFromArray(value.slotPose, 0);
for (var i = 0, iW = 0, iB = weightOffset + dbft.BinaryOffset.WeigthBoneIndices + value._boneCount, iV = floatOffset; i < vertexCount; ++i) {
var iD = i * 2;
var vertexBoneCount = intArray[iB++] = value.weights[iW++]; // uint
var x = floatArray[vertexOffset + iD];
var y = floatArray[vertexOffset + iD + 1];
geom.helpMatrixA.transformPoint(x, y, geom.helpPointA);
x = geom.helpPointA.x;
y = geom.helpPointA.y;
for (var j = 0; j < vertexBoneCount; ++j) {
var rawBoneIndex = value.weights[iW++]; // uint
var bonePoseOffset = value.getBonePoseOffset(rawBoneIndex);
geom.helpMatrixB.copyFromArray(value.bonePose, bonePoseOffset + 1);
geom.helpMatrixB.invert();
geom.helpMatrixB.transformPoint(x, y, geom.helpPointA);
intArray[iB++] = bonePoseOffset / 7; //
floatArray[iV++] = value.weights[iW++];
floatArray[iV++] = geom.helpPointA.x;
floatArray[iV++] = geom.helpPointA.y;
}
}
intArray[offset + dbft.BinaryOffset.GeometryWeightOffset] = weightOffset;
}
else {
intArray[offset + dbft.BinaryOffset.GeometryWeightOffset] = -1;
}
return offset;
}
function createTimeline(value, frames, frameValueType, frameValueCount, createFrame) {
var offset = timelineArray.length;
timelineArray.length += 1 + 1 + 1 + 1 + 1;
if (value instanceof dbft.Animation) {
timelineArray[offset + dbft.BinaryOffset.TimelineScale] = 100;
timelineArray[offset + dbft.BinaryOffset.TimelineOffset] = 0;
}
else {
timelineArray[offset + dbft.BinaryOffset.TimelineScale] = Math.round(value.scale * 100.0);
timelineArray[offset + dbft.BinaryOffset.TimelineOffset] = Math.round(value.offset * 100.0);
}
timelineArray[offset + dbft.BinaryOffset.TimelineFrameValueCount] = frameValueCount;
switch (frameValueType) {
case 0 /* Step */:
timelineArray[offset + dbft.BinaryOffset.TimelineFrameValueOffset] = 0;
break;
case 1 /* Int */:
timelineArray[offset + dbft.BinaryOffset.TimelineFrameValueOffset] = frameIntArray.length - currentAnimationBinary.offset[dbft.OffsetOrder.FrameInt];
break;
case 2 /* Float */:
timelineArray[offset + dbft.BinaryOffset.TimelineFrameValueOffset] = frameFloatArray.length - currentAnimationBinary.offset[dbft.OffsetOrder.FrameFloat];
break;
}
var frameStart = 0;
var keyFrameCount = 0;
for (var i = 0, l = frames.length; i < l; ++i) { // Frame offsets.
var frame = frames[i];
var frameOffset = createFrame(frame, frameStart);
frameStart += frame.duration;
if (frameOffset >= 0) {
timelineArray.push(frameOffset - currentAnimationBinary.offset[dbft.OffsetOrder.Frame]);
keyFrameCount++;
}
}
timelineArray[offset + dbft.BinaryOffset.TimelineKeyFrameCount] = keyFrameCount;
return offset;
}
function createTypeTimeline(timeline) {
var valueScale = 1.0;
switch (timeline.type) {
case dbft.TimelineType.SlotDisplay:
// TODO
case dbft.TimelineType.SlotZIndex:
return createTimeline(timeline, timeline.frame, 1 /* Int */, 1, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameIntArray.push(frame.value);
return offset;
});
case dbft.TimelineType.BoneAlpha:
case dbft.TimelineType.SlotAlpha:
case dbft.TimelineType.AnimationProgress:
case dbft.TimelineType.AnimationWeight:
valueScale = timeline.type === dbft.TimelineType.BoneAlpha || timeline.type === dbft.TimelineType.SlotAlpha ? 100.0 : 10000.0;
return createTimeline(timeline, timeline.frame, 1 /* Int */, 1, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameIntArray.push(Math.round(frame.value * valueScale));
return offset;
});
case dbft.TimelineType.BoneTranslate:
case dbft.TimelineType.BoneRotate:
case dbft.TimelineType.BoneScale:
valueScale = timeline.type === dbft.TimelineType.BoneRotate ? geom.DEG_RAD : 1.0;
return createTimeline(timeline, timeline.frame, 2 /* Float */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameFloatArray.push(frame.x * valueScale);
frameFloatArray.push(frame.y * valueScale);
return offset;
});
case dbft.TimelineType.IKConstraint:
case dbft.TimelineType.AnimationParameter:
valueScale = timeline.type === dbft.TimelineType.IKConstraint ? 100.0 : 10000.0;
return createTimeline(timeline, timeline.frame, 1 /* Int */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameIntArray.push(Math.round(frame.x * valueScale));
frameIntArray.push(Math.round(frame.y * valueScale));
return offset;
});
case dbft.TimelineType.ZOrder:
// TODO
break;
case dbft.TimelineType.Surface:
return createSurfaceTimeline(timeline);
case dbft.TimelineType.SlotDeform:
return createDeformTimeline(timeline);
case dbft.TimelineType.SlotColor:
return createTimeline(timeline, timeline.frame, 1 /* Int */, 1, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
// Color.
var colorString = frame.value.toString();
if (!(colorString in colors)) {
colors[colorString] = createColor(frame.value);
}
frameIntArray.push(colors[colorString]);
return offset;
});
}
return -1;
}
function createFrame(value, frameStart) {
// tslint:disable-next-line:no-unused-expression
value;
var offset = frameArray.length;
frameArray.push(frameStart);
return offset;
}
function createTweenFrame(frame, frameStart) {
var frameOffset = createFrame(frame, frameStart);
if (frame.duration > 0) {
if (frame.curve.length > 0) {
var isOmited = (frame.curve.length % 3) === 1;
var sampleCount = frame.duration + (isOmited ? 1 : 3);
var samples = new Array(sampleCount);
dbft.samplingEasingCurve(frame.curve, samples, isOmited);
frameArray.length += 1 + 1 + samples.length;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.Curve;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenEasingOrCurveSampleCount] = isOmited ? sampleCount : -sampleCount; // Notice: If not omit data, the count is negative number.
for (var i = 0; i < sampleCount; ++i) {
frameArray[frameOffset + dbft.BinaryOffset.FrameCurveSamples + i] = Math.round(samples[i] * 10000.0); // Min ~ Max [-3.00~3.00]
}
}
else {
if (isNaN(frame.tweenEasing)) {
frameArray.length += 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.None;
}
else if (frame.tweenEasing === 0.0) {
frameArray.length += 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.Line;
}
else if (frame.tweenEasing < 0.0) {
frameArray.length += 1 + 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.QuadIn;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(-frame.tweenEasing * 100.0);
}
else if (frame.tweenEasing <= 1.0) {
frameArray.length += 1 + 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.QuadOut;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(frame.tweenEasing * 100.0);
}
else {
frameArray.length += 1 + 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.QuadInOut;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(frame.tweenEasing * 100.0 - 100.0);
}
}
}
else {
frameArray.length += 1;
frameArray[frameOffset + dbft.BinaryOffset.FrameTweenType] = dbft.TweenType.None;
}
return frameOffset;
}
function createActionFrame(frame, frameStart) {
var frameOffset = createFrame(frame, frameStart);
var actionCount = frame.actions.length;
frameArray.length += 1 + 1 + actionCount;
frameArray[frameOffset + dbft.BinaryOffset.FramePosition] = frameStart;
frameArray[frameOffset + dbft.BinaryOffset.ActionFrameActionCount] = actionCount; // Action count.
for (var i = 0; i < actionCount; ++i) { // Action offsets.
var action = frame.actions[i];
frameArray[frameOffset + dbft.BinaryOffset.ActionFrameActionIndices + i] = currentArmature.actions.length;
currentArmature.actions.push(action);
}
frame.actions.length = 0;
return frameOffset;
}
function createZOrderFrame(frame, frameStart) {
var frameOffset = createFrame(frame, frameStart);
if (frame.zOrder.length > 0) {
var slotCount = currentArmature.slot.length;
var unchanged = new Array(slotCount - frame.zOrder.length / 2);
var zOrders = new Array(slotCount);
for (var i_1 = 0; i_1 < unchanged.length; ++i_1) {
unchanged[i_1] = 0;
}
for (var i_2 = 0; i_2 < slotCount; ++i_2) {
zOrders[i_2] = -1;
}
var originalIndex = 0;
var unchangedIndex = 0;
for (var i_3 = 0, l = frame.zOrder.length; i_3 < l; i_3 += 2) {
var slotIndex = frame.zOrder[i_3];
var zOrderOffset = frame.zOrder[i_3 + 1];
while (originalIndex !== slotIndex) {
unchanged[unchangedIndex++] = originalIndex++;
}
zOrders[originalIndex + zOrderOffset] = originalIndex++;
}
while (originalIndex < slotCount) {
unchanged[unchangedIndex++] = originalIndex++;
}
frameArray.length += 1 + slotCount;
frameArray[frameOffset + 1] = slotCount;
var i = slotCount;
while (i--) {
if (zOrders[i] === -1) {
frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex] || 0;
}
else {
frameArray[frameOffset + 2 + i] = zOrders[i] || 0;
}
}
}
else {
frameArray.length += 1;
frameArray[frameOffset + 1] = 0;
}
return frameOffset;
}
function createBoneTimeline(timeline) {
var timelines = new Array();
if (timeline.translateFrame.length > 0) {
timelines.push(dbft.TimelineType.BoneTranslate);
timelines.push(createTimeline(timeline, timeline.translateFrame, 2 /* Float */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameFloatArray.push(frame.x);
frameFloatArray.push(frame.y);
return offset;
}));
}
if (timeline.rotateFrame.length > 0) {
var clockwise_1 = 0;
var prevRotate_1 = 0.0;
timelines.push(dbft.TimelineType.BoneRotate);
timelines.push(createTimeline(timeline, timeline.rotateFrame, 2 /* Float */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
var rotate = frame.rotate;
if (frameStart !== 0) {
if (clockwise_1 === 0) {
rotate = prevRotate_1 + geom.normalizeDegree(rotate - prevRotate_1);
}
else {
if (clockwise_1 > 0 ? rotate >= prevRotate_1 : rotate <= prevRotate_1) {
clockwise_1 = clockwise_1 > 0 ? clockwise_1 - 1 : clockwise_1 + 1;
}
rotate = prevRotate_1 + rotate - prevRotate_1 + geom.PI_D * clockwise_1 * geom.RAD_DEG;
}
}
clockwise_1 = frame.clockwise;
prevRotate_1 = rotate;
frameFloatArray.push(rotate * geom.DEG_RAD);
frameFloatArray.push(geom.normalizeDegree(frame.skew) * geom.DEG_RAD);
return offset;
}));
}
if (timeline.scaleFrame.length > 0) {
timelines.push(dbft.TimelineType.BoneScale);
timelines.push(createTimeline(timeline, timeline.scaleFrame, 2 /* Float */, 2, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
frameFloatArray.push(frame.x);
frameFloatArray.push(frame.y);
return offset;
}));
}
return timelines;
}
function createSurfaceTimeline(timeline) {
var surface = currentArmature.getBone(timeline.name);
var vertexCount = surface.vertices.length / 2;
var frames = timeline.frame;
for (var _i = 0, frames_1 = frames; _i < frames_1.length; _i++) {
var frame = frames_1[_i];
var x = 0.0;
var y = 0.0;
var vertices = new Array();
for (var i = 0; i < vertexCount * 2; i += 2) {
if (frame.value.length === 0) {
x = 0.0;
y = 0.0;
}
else {
if (i < frame.offset || i - frame.offset >= frame.value.length) {
x = 0.0;
}
else {
x = frame.value[i - frame.offset];
}
if (i + 1 < frame.offset || i + 1 - frame.offset >= frame.value.length) {
y = 0.0;
}
else {
y = frame.value[i + 1 - frame.offset];
}
}
vertices.push(x, y);
}
frame.value.length = 0;
for (var _a = 0, vertices_1 = vertices; _a < vertices_1.length; _a++) {
var value = vertices_1[_a];
frame.value.push(value);
}
}
var firstValues = frames[0].value;
var count = firstValues.length;
var completedBegin = false;
var completedEnd = false;
var begin = 0;
var end = count - 1;
while (!completedBegin || !completedEnd) {
if (!completedBegin) {
for (var _b = 0, frames_2 = frames; _b < frames_2.length; _b++) {
var frame = frames_2[_b];
if (frame.value[begin] !== firstValues[begin]) {
completedBegin = true;
break;
}
}
if (begin === count - 1) {
completedBegin = true;
}
else if (!completedBegin) {
begin++;
}
}
if (completedBegin && !completedEnd) {
for (var _c = 0, frames_3 = frames; _c < frames_3.length; _c++) {
var frame = frames_3[_c];
if (frame.value[end] !== firstValues[end]) {
completedEnd = true;
break;
}
}
if (end === begin) {
completedEnd = true;
}
else if (!completedEnd) {
end--;
}
}
}
var frameIntOffset = frameIntArray.length;
var valueCount = end - begin + 1;
frameIntArray.length += 5;
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformMeshOffset] = surface.offset; // Surface offset.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformCount] = count; // Deform count.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformValueCount] = valueCount; // Value count.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformValueOffset] = begin; // Value offset.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformFloatOffset] = frameFloatArray.length - currentAnimationBinary.offset[dbft.OffsetOrder.FrameFloat]; // Float offset.
for (var i = 0; i < begin; ++i) {
frameFloatArray.push(firstValues[i]);
}
for (var i = end + 1; i < count; ++i) {
frameFloatArray.push(firstValues[i]);
}
var timelineOffset = createTimeline(timeline, frames, 2 /* Float */, valueCount, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
for (var i = 0; i < valueCount; ++i) {
frameFloatArray.push(frame.value[begin + i]);
}
return offset;
});
// Get more infomation form value count offset.
timelineArray[timelineOffset + dbft.BinaryOffset.TimelineFrameValueCount] = frameIntOffset - currentAnimationBinary.offset[dbft.OffsetOrder.FrameInt];
return timelineOffset;
}
function createDeformTimeline(timeline) {
var mesh = (timeline instanceof dbft.SlotDeformTimeline ?
currentArmature.getDisplay(timeline.skin, timeline.slot, timeline.name) :
currentArmature.getDisplay("", "", timeline.name)); // TODO
if (!mesh) {
return -1;
}
var vertexCount = mesh.vertices.length / 2;
var frames = timeline.frame;
for (var _i = 0, frames_4 = frames; _i < frames_4.length; _i++) {
var frame = frames_4[_i];
var x = 0.0;
var y = 0.0;
var iB = 0;
if (mesh.weights.length > 0) {
geom.helpMatrixA.copyFromArray(mesh.slotPose, 0);
// frameFloatArray.length += mesh._weightCount * 2; // TODO CK
}
else {
// frameFloatArray.length += vertexCount * 2;
}
if (frame.vertices.length > 0) { //
frame.value.length = 0;
for (var _a = 0, _b = frame.vertices; _a < _b.length; _a++) {
var value = _b[_a];
frame.value.push(value);
}
frame.vertices.length = 0;
}
var vertices = new Array();
for (var i = 0; i < vertexCount * 2; i += 2) {
if (frame.value.length === 0) {
x = 0.0;
y = 0.0;
}
else {
if (i < frame.offset || i - frame.offset >= frame.value.length) {
x = 0.0;
}
else {
x = frame.value[i - frame.offset];
}
if (i + 1 < frame.offset || i + 1 - frame.offset >= frame.value.length) {
y = 0.0;
}
else {
y = frame.value[i + 1 - frame.offset];
}
}
if (mesh.weights.length > 0) { // If mesh is skinned, transform point by bone bind pose.
var vertexBoneCount = mesh.weights[iB++];
geom.helpMatrixA.transformPoint(x, y, geom.helpPointA, true);
x = geom.helpPointA.x;
y = geom.helpPointA.y;
for (var j = 0; j < vertexBoneCount; ++j) {
var rawBoneIndex = mesh.weights[iB];
geom.helpMatrixB.copyFromArray(mesh.bonePose, mesh.getBonePoseOffset(rawBoneIndex) + 1);
geom.helpMatrixB.invert();
geom.helpMatrixB.transformPoint(x, y, geom.helpPointA, true);
vertices.push(geom.helpPointA.x, geom.helpPointA.y);
iB += 2;
}
}
else {
vertices.push(x, y);
}
}
frame.value.length = 0;
for (var _c = 0, vertices_2 = vertices; _c < vertices_2.length; _c++) {
var value = vertices_2[_c];
frame.value.push(value);
}
}
var firstValues = frames[0].value;
var count = firstValues.length;
var completedBegin = false;
var completedEnd = false;
var begin = 0;
var end = count - 1;
while (!completedBegin || !completedEnd) {
if (!completedBegin) {
for (var _d = 0, frames_5 = frames; _d < frames_5.length; _d++) {
var frame = frames_5[_d];
if (frame.value[begin] !== firstValues[begin]) {
completedBegin = true;
break;
}
}
if (begin === count - 1) {
completedBegin = true;
}
else if (!completedBegin) {
begin++;
}
}
if (completedBegin && !completedEnd) {
for (var _e = 0, frames_6 = frames; _e < frames_6.length; _e++) {
var frame = frames_6[_e];
if (frame.value[end] !== firstValues[end]) {
completedEnd = true;
break;
}
}
if (end === begin) {
completedEnd = true;
}
else if (!completedEnd) {
end--;
}
}
}
var frameIntOffset = frameIntArray.length;
var valueCount = end - begin + 1;
frameIntArray.length += 5;
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformMeshOffset] = mesh.offset; // Mesh offset.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformCount] = count; // Deform count.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformValueCount] = valueCount; // Value count.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformValueOffset] = begin; // Value offset.
frameIntArray[frameIntOffset + dbft.BinaryOffset.DeformFloatOffset] = frameFloatArray.length - currentAnimationBinary.offset[dbft.OffsetOrder.FrameFloat]; // Float offset.
for (var i = 0; i < begin; ++i) {
frameFloatArray.push(firstValues[i]);
}
for (var i = end + 1; i < count; ++i) {
frameFloatArray.push(firstValues[i]);
}
var timelineOffset = createTimeline(timeline, frames, 2 /* Float */, valueCount, function (frame, frameStart) {
var offset = createTweenFrame(frame, frameStart);
for (var i = 0; i < valueCount; ++i) {
frameFloatArray.push(frame.value[begin + i]);
}
return offset;
});
// Get more infomation form value count offset.
timelineArray[timelineOffset + dbft.BinaryOffset.TimelineFrameValueCount] = frameIntOffset - currentAnimationBinary.offset[dbft.OffsetOrder.FrameInt];
return timelineOffset;
}
function modifyBytesPosition(bytes, byte) {
if (byte === void 0) { byte = 0; }
while ((bytes.length % 4) !== 0) {
bytes.push(byte);
}
}
function stringToUTF8Array(string) {
var result = [];
for (var i = 0; i < string.length; i++) {
var c = string.charAt(i);
var cc = c.charCodeAt(0);
if (cc > 0xFFFF) {
throw new Error("InvalidCharacterError");
}
if (cc > 0x80) {
if (cc < 0x07FF) {
var c1 = (cc >>> 6) | 0xC0;
var c2 = (cc & 0x3F) | 0x80;
result.push(c1, c2);
}
else {
var c1 = (cc >>> 12) | 0xE0;
var c2 = ((cc >>> 6) & 0x3F) | 0x80;
var c3 = (cc & 0x3F) | 0x80;
result.push(c1, c2, c3);
}
}
else {
result.push(cc);
}
}
return result;
}