dragonbones-tools
Version:
Dragonbones tools.
901 lines (900 loc) • 46.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var geom = require("../format/geom");
var dbft = require("../format/dragonBonesFormat");
var l2ft = require("../format/live2DFormat");
var rotateMatrixA = geom.helpMatrixA;
var rotateMatrixB = geom.helpMatrixB;
var modelConfig;
var result;
var armature;
var defaultSkin;
/**
* Convert Live2D format to DragonBones format.
*/
function default_1(data) {
modelConfig = data;
var l2Displays = modelConfig.modelImpl.displays;
// Create dragonBones.
result = new dbft.DragonBones();
result.frameRate = 30; //
result.name = modelConfig.name;
result.version = dbft.DATA_VERSION_5_6;
result.compatibleVersion = dbft.DATA_VERSION_5_5;
// Create textureAtlas.
var textureIndex = 0;
for (var _i = 0, _a = modelConfig.textures; _i < _a.length; _i++) {
var l2Texture = _a[_i];
if (typeof l2Texture === "string") {
continue;
}
var textureAtlas = new dbft.TextureAtlas();
textureAtlas.name = result.name;
textureAtlas.width = l2Texture.width;
textureAtlas.height = l2Texture.height;
textureAtlas.imagePath = l2Texture.file;
result.textureAtlas.push(textureAtlas);
var subTexture = new dbft.Texture();
subTexture.name = result.name + "_" + textureIndex.toString().padStart(2, "0");
subTexture.x = 0;
subTexture.y = 0;
subTexture.width = textureAtlas.width;
subTexture.height = textureAtlas.height;
textureAtlas.SubTexture.push(subTexture);
textureIndex++;
}
// Create armature.
armature = new dbft.Armature();
armature.name = data.name;
armature.aabb.x = -modelConfig.modelImpl.stageWidth * 0.5;
armature.aabb.y = -modelConfig.modelImpl.stageHeight;
armature.aabb.width = modelConfig.modelImpl.stageWidth;
armature.aabb.height = modelConfig.modelImpl.stageHeight;
armature.canvas = new dbft.Canvas();
armature.canvas.x = 0.0;
armature.canvas.y = -modelConfig.modelImpl.stageHeight * 0.5;
armature.canvas.width = modelConfig.modelImpl.stageWidth;
armature.canvas.height = modelConfig.modelImpl.stageHeight;
result.armature.push(armature);
// Create root bone.
var rootBone = new dbft.Bone();
rootBone.name = "DST_BASE";
rootBone.length = 150.0;
armature.bone.push(rootBone);
// Modify bone rotate.
rotateMatrixA.identity();
rotateMatrixA.rotate(Math.PI * 0.5);
rotateMatrixB.identity();
rotateMatrixB.rotate(-Math.PI * 0.5);
for (var _c = 0, _d = modelConfig.modelImpl.parts; _c < _d.length; _c++) {
var l2Part = _d[_c];
for (var _e = 0, _f = l2Part.bones; _e < _f.length; _e++) {
var l2Bone = _f[_e];
var l2Parent = modelConfig.modelImpl.getBone(l2Bone.parent);
var isSurfaceParent = l2Parent && l2Parent instanceof l2ft.Surface;
var l2Timelines = l2Bone.animation.timelines;
if (l2Bone instanceof l2ft.Bone) {
var bone = new dbft.Bone();
bone.length = 150.0;
if (l2Bone.alphaFrames) {
bone.alpha = getPose(l2Timelines, l2Bone.alphaFrames, function (a, b, t) {
if (b) {
return a + (b - a) * t;
}
return a;
});
}
bone.name = l2Bone.name;
bone.parent = l2Parent ? (l2Parent.name === rootBone.name ? "" : l2Parent.name) : "";
armature.bone.push(bone);
//
var poseTransform = getPose(l2Timelines, l2Bone.transformFrames, function (a, b, t) {
var result = new l2ft.Transform();
if (b) {
result.interpolation(a, b, t);
}
else {
result.copyFrom(a);
}
return result;
});
if (isSurfaceParent) { // Scale and rotate.
bone.transform.x = (poseTransform.x - 0.5) * 400.0;
bone.transform.y = (poseTransform.y - 0.5) * 400.0;
if (poseTransform.reflectX !== poseTransform.reflectY) {
bone.transform.skY = poseTransform.rotate + 90.0;
bone.transform.skX = poseTransform.rotate + 90.0;
}
else {
bone.transform.skY = poseTransform.rotate - 90.0;
bone.transform.skX = poseTransform.rotate - 90.0;
}
bone.transform.scX = poseTransform.scaleX * (poseTransform.reflectX ? -1.0 : 1.0);
bone.transform.scY = poseTransform.scaleY * (poseTransform.reflectY ? -1.0 : 1.0);
}
else if (bone.parent) { // Rotate.
rotateMatrixA.transformPoint(poseTransform.x, poseTransform.y, bone.transform);
//
var parentTransform = l2Parent.transformFrames[0];
if (parentTransform.reflectX !== parentTransform.reflectY) {
bone.transform.skY = poseTransform.rotate;
bone.transform.skX = poseTransform.rotate;
if (poseTransform.reflectX !== poseTransform.reflectY) {
}
else {
bone.transform.scX = poseTransform.scaleX * (parentTransform.reflectY ? -1.0 : 1.0);
bone.transform.scY = poseTransform.scaleY * (parentTransform.reflectX ? -1.0 : 1.0);
}
}
else {
if (poseTransform.reflectX !== poseTransform.reflectY) {
bone.transform.skY = poseTransform.rotate + 180.0;
bone.transform.skX = poseTransform.rotate + 180.0;
}
else {
bone.transform.skY = poseTransform.rotate;
bone.transform.skX = poseTransform.rotate;
}
bone.transform.scX = poseTransform.scaleX * (poseTransform.reflectX ? -1.0 : 1.0);
bone.transform.scY = poseTransform.scaleY * (poseTransform.reflectY ? -1.0 : 1.0);
}
}
else { // Rotate and offset.
bone.transform.x = poseTransform.x + armature.aabb.x;
bone.transform.y = poseTransform.y + armature.aabb.y;
if (poseTransform.reflectX !== poseTransform.reflectY) {
bone.transform.skY = poseTransform.rotate + 90.0;
bone.transform.skX = poseTransform.rotate + 90.0;
}
else {
bone.transform.skY = poseTransform.rotate - 90.0;
bone.transform.skX = poseTransform.rotate - 90.0;
}
bone.transform.scX = poseTransform.scaleX * (poseTransform.reflectX ? -1.0 : 1.0);
bone.transform.scY = poseTransform.scaleY * (poseTransform.reflectY ? -1.0 : 1.0);
}
if (!bone.transform.scX) {
bone.transform.scX = 0.000001;
}
if (!bone.transform.scY) {
bone.transform.scY = 0.000001;
}
}
else if (l2Bone instanceof l2ft.Surface) {
var surface = new dbft.Surface();
surface.segmentX = l2Bone.segmentX;
surface.segmentY = l2Bone.segmentY;
surface.name = l2Bone.name;
surface.parent = l2Parent ? (l2Parent.name === rootBone.name ? "" : l2Parent.name) : "";
armature.bone.push(surface);
//
var poseVertices = getPose(l2Timelines, l2Bone.deformFrames, function (a, b, t) {
var result = new Array();
if (b) {
vertivesInterpolation(result, a, b, t);
}
else {
vertivesCopyFrom(result, a);
}
return result;
});
for (var i = 0, l = poseVertices.length; i < l; i += 2) {
if (isSurfaceParent) { // Scale.
surface.vertices[i] = (poseVertices[i] - 0.5) * 400.0;
surface.vertices[i + 1] = (poseVertices[i + 1] - 0.5) * 400.0;
}
else if (surface.parent) { // Rotate.
rotateMatrixA.transformPoint(poseVertices[i], poseVertices[i + 1], geom.helpPointA);
surface.vertices[i] = geom.helpPointA.x;
surface.vertices[i + 1] = geom.helpPointA.y;
}
else { // Offset.
surface.vertices[i] = poseVertices[i] + armature.aabb.x;
surface.vertices[i + 1] = poseVertices[i + 1] + armature.aabb.y;
}
}
}
}
}
// Sort bones.
armature.sortBones();
// armature.localToGlobal();
// Create slots and skins.
defaultSkin = new dbft.Skin();
armature.skin.push(defaultSkin);
for (var _g = 0, l2Displays_1 = l2Displays; _g < l2Displays_1.length; _g++) {
var l2Display = l2Displays_1[_g];
var l2Parent = modelConfig.modelImpl.getBone(l2Display.parent);
var isSurfaceParent = l2Parent !== null && l2Parent instanceof l2ft.Surface;
var l2Timelines = l2Display.animation.timelines;
if (l2Display instanceof l2ft.Mesh) {
// Create slot.
var slot = new dbft.Slot();
slot.name = l2Display.name;
slot.parent = l2Parent ? l2Parent.name : rootBone.name;
slot.alpha = getPose(l2Timelines, l2Display.alphaFrames, function (a, b, t) {
if (b) {
return a + (b - a) * t;
}
return a;
});
slot.zIndex = getPose(l2Timelines, l2Display.zIndexFrames, function (a, _b, _t) {
return a;
});
slot._zOrder = slot.zIndex * 1000 + l2Display.zOrder;
// slot.color;
armature.slot.push(slot);
// Create displays.
var display = new dbft.MeshDisplay();
display.name = l2Display.name;
display.path = result.name + "_" + (l2Display.textureIndex >= 0 ? l2Display.textureIndex : 0).toString().padStart(2, "0");
// UVs.
for (var _h = 0, _j = l2Display.uvs; _h < _j.length; _h++) {
var value = _j[_h];
display.uvs.push(value);
}
// Triangles.
for (var _k = 0, _l = l2Display.indices; _k < _l.length; _k++) {
var index = _l[_k];
display.triangles.push(index);
}
// Vertices.
var poseVertices = getPose(l2Timelines, l2Display.deformFrames, function (a, b, t) {
var result = new Array();
if (b) {
vertivesInterpolation(result, a, b, t);
}
else {
vertivesCopyFrom(result, a);
}
return result;
});
for (var i = 0, l = poseVertices.length; i < l; i += 2) {
if (isSurfaceParent) { // Scale.
display.vertices[i] = (poseVertices[i] - 0.5) * 400.0;
display.vertices[i + 1] = (poseVertices[i + 1] - 0.5) * 400.0;
}
else if (slot.parent !== rootBone.name) { // Rotate.
rotateMatrixA.transformPoint(poseVertices[i], poseVertices[i + 1], geom.helpPointA);
display.vertices[i] = geom.helpPointA.x;
display.vertices[i + 1] = geom.helpPointA.y;
}
else { // Offset.
display.vertices[i] = poseVertices[i] + armature.aabb.x;
display.vertices[i + 1] = poseVertices[i + 1] + armature.aabb.y;
}
}
// const edges = dbft.getEdgeFormTriangles(display.triangles);
// for (const value of edges) {
// display.edges.push(value);
// }
// Create skinSlot.
var skinSlot = new dbft.SkinSlot();
skinSlot.name = l2Display.name;
skinSlot.display.push(display);
defaultSkin.slot.push(skinSlot);
}
}
armature.sortSlots();
// Create animations.
if (modelConfig.modelImpl.animations.timelines.length > 0) {
for (var _m = 0, _o = modelConfig.modelImpl.parts; _m < _o.length; _m++) {
var l2Part = _o[_m];
var _loop_1 = function (l2Bone) {
var l2Timelines = l2Bone.animation.timelines;
var bone = armature.getBone(l2Bone.name);
if (l2Timelines.length === 0 || !bone) {
return "continue";
}
var l2Parent = modelConfig.modelImpl.getBone(l2Bone.parent);
var isSurfaceParent = l2Parent !== null && l2Parent instanceof l2ft.Surface;
if (l2Bone.alphaFrames) {
var hasAlpha = false;
for (var _i = 0, _a = l2Bone.alphaFrames; _i < _a.length; _i++) {
var alpha = _a[_i];
if (alpha !== bone.alpha) {
hasAlpha = true;
break;
}
}
if (hasAlpha) {
createAnimation(l2Timelines, l2Bone.alphaFrames, bone, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.BoneAlpha;
timeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var frame = new dbft.SingleValueFrame1();
frame._position = Math.floor(progress * blendAnimation.duration);
frame.tweenEasing = i === l2Timeline.frameCount - 1 ? NaN : 0.0;
frame.value = l2Frame;
timeline.frame.push(frame);
}
dbft.modifyFramesByPosition(timeline.frame);
blendAnimation.timeline.push(timeline);
});
}
}
if (l2Bone instanceof l2ft.Bone) {
createAnimation(l2Timelines, l2Bone.transformFrames, bone, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var translateTimeline = new dbft.TypeTimeline();
var rotateTimeline = new dbft.TypeTimeline();
var scaleTimeline = new dbft.TypeTimeline();
translateTimeline.type = dbft.TimelineType.BoneTranslate;
rotateTimeline.type = dbft.TimelineType.BoneRotate;
scaleTimeline.type = dbft.TimelineType.BoneScale;
translateTimeline.name = target.name;
rotateTimeline.name = target.name;
scaleTimeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var translateFrame = new dbft.DoubleValueFrame0();
var rotateFrame = new dbft.DoubleValueFrame0();
var scaleFrame = new dbft.DoubleValueFrame1();
var x = 0.0;
var y = 0.0;
translateFrame._position = rotateFrame._position = scaleFrame._position = Math.floor(progress * blendAnimation.duration);
translateFrame.tweenEasing = rotateFrame.tweenEasing = scaleFrame.tweenEasing = i === l2Timeline.frameCount - 1 ? NaN : 0.0;
if (isSurfaceParent) {
x = (l2Frame.x - 0.5) * 400.0;
y = (l2Frame.y - 0.5) * 400.0;
}
else {
x = l2Frame.x;
y = l2Frame.y;
}
if (!target.parent || isSurfaceParent) {
if (target.parent) {
translateFrame.x = x - target.transform.x;
translateFrame.y = y - target.transform.y;
if (l2Frame.reflectX !== l2Frame.reflectY) {
rotateFrame.x = l2Frame.rotate + 90.0 - target.transform.skY;
}
else {
rotateFrame.x = l2Frame.rotate - 90.0 - target.transform.skY;
}
}
else {
translateFrame.x = x - target.transform.x + armature.aabb.x;
translateFrame.y = y - target.transform.y + armature.aabb.y;
if (l2Frame.reflectX !== l2Frame.reflectY) {
rotateFrame.x = l2Frame.rotate + 90.0 - target.transform.skY;
}
else {
rotateFrame.x = l2Frame.rotate - 90.0 - target.transform.skY;
}
}
scaleFrame.x = l2Frame.scaleX * (l2Frame.reflectX ? -1.0 : 1.0) / target.transform.scX;
scaleFrame.y = l2Frame.scaleY * (l2Frame.reflectY ? -1.0 : 1.0) / target.transform.scY;
}
else {
rotateMatrixA.transformPoint(x, y, translateFrame);
translateFrame.x -= target.transform.x;
translateFrame.y -= target.transform.y;
//
var parentTransform = l2Parent.transformFrames[0];
if (parentTransform.reflectX !== parentTransform.reflectY) {
rotateFrame.x = l2Frame.rotate - target.transform.skY;
if (l2Frame.reflectX !== l2Frame.reflectY) {
}
else {
scaleFrame.x = l2Frame.scaleX * (parentTransform.reflectY ? -1.0 : 1.0) / target.transform.scX;
scaleFrame.y = l2Frame.scaleY * (parentTransform.reflectX ? -1.0 : 1.0) / target.transform.scY;
}
}
else {
if (l2Frame.reflectX !== l2Frame.reflectY) {
rotateFrame.x = l2Frame.rotate + 180 - target.transform.skY;
}
else {
rotateFrame.x = l2Frame.rotate - target.transform.skY;
}
scaleFrame.x = l2Frame.scaleX * (l2Frame.reflectX ? -1.0 : 1.0) / target.transform.scX;
scaleFrame.y = l2Frame.scaleY * (l2Frame.reflectY ? -1.0 : 1.0) / target.transform.scY;
}
}
translateTimeline.frame.push(translateFrame);
rotateTimeline.frame.push(rotateFrame);
scaleTimeline.frame.push(scaleFrame);
}
dbft.modifyFramesByPosition(translateTimeline.frame);
dbft.modifyFramesByPosition(rotateTimeline.frame);
dbft.modifyFramesByPosition(scaleTimeline.frame);
blendAnimation.timeline.push(translateTimeline);
blendAnimation.timeline.push(rotateTimeline);
blendAnimation.timeline.push(scaleTimeline);
});
}
else if (l2Bone instanceof l2ft.Surface) {
createAnimation(l2Timelines, l2Bone.deformFrames, bone, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.Surface;
timeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var frame = new dbft.MutilpleValueFrame();
frame._position = Math.floor(progress * blendAnimation.duration);
frame.tweenEasing = i === l2Timeline.frameCount - 1 ? NaN : 0.0;
createDeformFrame(frame, l2Frame, target.vertices, isSurfaceParent, target.parent.length > 0);
timeline.frame.push(frame);
}
dbft.modifyFramesByPosition(timeline.frame);
blendAnimation.timeline.push(timeline);
});
}
};
// Create bone timelines.
for (var _p = 0, _q = l2Part.bones; _p < _q.length; _p++) {
var l2Bone = _q[_p];
_loop_1(l2Bone);
}
var _loop_2 = function (l2Display) {
var l2Timelines = l2Display.animation.timelines;
var slot = armature.getSlot(l2Display.name);
if (l2Timelines.length === 0 || !slot) {
return "continue";
}
var l2Parent = modelConfig.modelImpl.getBone(l2Display.parent);
var isSurfaceParent = l2Parent !== null && l2Parent instanceof l2ft.Surface;
if (l2Display instanceof l2ft.Mesh) {
var meshDisplay = armature.getDisplay(defaultSkin.name, l2Display.name, l2Display.name);
if (!meshDisplay) {
return "continue";
}
var hasZIndex = false;
var prevZIndex = NaN;
for (var _i = 0, _a = l2Display.zIndexFrames; _i < _a.length; _i++) {
var zIndex = _a[_i];
if (prevZIndex === prevZIndex && zIndex !== prevZIndex) {
hasZIndex = true;
break;
}
prevZIndex = zIndex;
}
if (hasZIndex) {
createAnimation(l2Timelines, l2Display.zIndexFrames, meshDisplay, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.SlotZIndex;
timeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var frame = new dbft.SingleValueFrame0();
frame._position = Math.floor(progress * blendAnimation.duration);
frame.value = l2Frame;
timeline.frame.push(frame);
}
dbft.modifyFramesByPosition(timeline.frame);
blendAnimation.timeline.push(timeline);
});
}
var hasAlpha = false;
for (var _c = 0, _d = l2Display.alphaFrames; _c < _d.length; _c++) {
var alpha = _d[_c];
if (alpha !== slot.alpha) {
hasAlpha = true;
break;
}
}
if (hasAlpha) {
createAnimation(l2Timelines, l2Display.alphaFrames, meshDisplay, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.SlotAlpha;
timeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var frame = new dbft.SingleValueFrame1();
frame._position = Math.floor(progress * blendAnimation.duration);
frame.tweenEasing = i === l2Timeline.frameCount - 1 ? NaN : 0.0;
frame.value = l2Frame;
timeline.frame.push(frame);
}
dbft.modifyFramesByPosition(timeline.frame);
blendAnimation.timeline.push(timeline);
});
}
//
createAnimation(l2Timelines, l2Display.deformFrames, meshDisplay, function (l2Timeline, l2Frames, target, offset, blendAnimation) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var totalValue = l2TimelineInfo.maximum - l2TimelineInfo.minimum;
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.SlotDeform;
timeline.name = target.name;
for (var i = 0; i < l2Timeline.frameCount; ++i) {
var progress = (l2Timeline.frames[i] - l2TimelineInfo.minimum) / totalValue;
var l2Frame = l2Frames[offset + i];
var frame = new dbft.MutilpleValueFrame();
frame._position = Math.floor(progress * blendAnimation.duration);
frame.tweenEasing = i === l2Timeline.frameCount - 1 ? NaN : 0.0;
createDeformFrame(frame, l2Frame, target.vertices, isSurfaceParent, slot.parent !== rootBone.name);
timeline.frame.push(frame);
}
dbft.modifyFramesByPosition(timeline.frame);
blendAnimation.timeline.push(timeline);
});
}
};
// Create slot timeines.
for (var _r = 0, _s = l2Part.displays; _r < _s.length; _r++) {
var l2Display = _s[_r];
_loop_2(l2Display);
}
}
}
var paramBackupAnimations = armature.animation.map(function (animation) { return animation.name; });
if (modelConfig.motions) { // Create motion animations.
for (var motionName in modelConfig.motions) {
var index = 0;
var motionConfigs = modelConfig.motions[motionName];
for (var _u = 0, motionConfigs_1 = motionConfigs; _u < motionConfigs_1.length; _u++) {
var motionConfig = motionConfigs_1[_u];
if (!motionConfig.motion) {
continue;
}
var paramAnimations = paramBackupAnimations.concat();
var animationName = motionConfigs.length > 1 ? (motionName + "_" + index.toString().padStart(2, "0")) : motionName;
var animation = new dbft.Animation();
animation.playTimes = 0;
animation.fadeInTime = motionConfig.fade_in ? motionConfig.fade_in * 0.001 : (motionConfig.motion.fade_in ? motionConfig.motion.fade_in * 0.001 : 0.3);
animation.name = animationName;
animation.type = dbft.AnimationType.Tree;
for (var timelineName in motionConfig.motion.values) {
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(timelineName);
if (!l2TimelineInfo) {
continue;
}
if (!paramAnimations.includes(timelineName)) {
continue;
}
paramAnimations.splice(paramAnimations.indexOf(timelineName), 1);
var duration = 0;
var values = motionConfig.motion.values[timelineName];
var _v = getMinAndMax(values), min = _v[0], max = _v[1];
var timeline = new dbft.TypeTimeline();
var prevFrame = null;
timeline.type = dbft.TimelineType.AnimationProgress;
timeline.name = timelineName;
min = (min - l2TimelineInfo.minimum) / (l2TimelineInfo.maximum - l2TimelineInfo.minimum);
max = (max - l2TimelineInfo.minimum) / (l2TimelineInfo.maximum - l2TimelineInfo.minimum);
for (var i = 0, l = values.length; i < l; ++i) {
var value = values[i];
var frame = new dbft.SingleValueFrame0();
frame.tweenEasing = 0.0;
frame.value = (value - l2TimelineInfo.minimum) / (l2TimelineInfo.maximum - l2TimelineInfo.minimum);
timeline.frame.push(frame);
duration += frame.duration;
if (i > 1 && prevFrame &&
((Math.abs(prevFrame.value - min) < 0.1 || Math.abs(prevFrame.value - max) < 0.1) &&
(Math.abs(frame.value - min) < 0.1 || Math.abs(frame.value - max) < 0.1)) &&
Math.abs(prevFrame.value - frame.value) > Math.abs(max - min) * 0.7) {
prevFrame.tweenEasing = NaN;
}
prevFrame = frame;
}
var firstVaule = timeline.frame[0].value;
if (prevFrame &&
((Math.abs(prevFrame.value - min) < 0.1 || Math.abs(prevFrame.value - max) < 0.1) &&
(Math.abs(firstVaule - min) < 0.1 || Math.abs(firstVaule - max) < 0.1)) &&
Math.abs(prevFrame.value - firstVaule) > Math.abs(max - min) * 0.7) {
prevFrame.tweenEasing = NaN;
}
animation.duration = Math.max(duration, animation.duration);
animation.timeline.push(timeline);
}
// for (const timelineName of paramAnimations) {
// const l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(timelineName);
// if (!l2TimelineInfo) {
// continue;
// }
// const timeline = new dbft.TypeTimeline();
// timeline.type = dbft.TimelineType.AnimationProgress;
// timeline.name = timelineName;
// //
// const frame = new dbft.SingleValueFrame0();
// frame.value = l2TimelineInfo.default;
// timeline.frame.push(frame);
// animation.timeline.push(timeline);
// }
for (var timelineName in motionConfig.motion.alphas) {
var part = modelConfig.modelImpl.getPart(timelineName);
if (!part) {
continue;
}
var duration = 0;
var alphas = motionConfig.motion.alphas[timelineName];
for (var _w = 0, _x = part.displays; _w < _x.length; _w++) {
var l2Display = _x[_w];
if (l2Display instanceof l2ft.Mesh) {
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.SlotColor;
timeline.name = l2Display.name;
for (var i = 0, l = alphas.length; i < l; ++i) {
var alpha = alphas[i];
var frame = new dbft.SlotColorFrame();
if (i !== l - 1) {
frame.tweenEasing = 0;
duration += frame.duration;
}
frame.value.aM = alpha * 100.0;
timeline.frame.push(frame);
}
animation.timeline.push(timeline);
}
}
animation.duration = Math.max(duration, animation.duration);
}
armature.animation.unshift(animation);
index++;
}
}
}
if (modelConfig.expressions) { // Create expression animations.
for (var _y = 0, _z = modelConfig.expressions; _y < _z.length; _y++) {
var expressionConfig = _z[_y];
var expression = expressionConfig.expression;
if (!expression || !expression.params || expression.params.length === 0) {
continue;
}
var animation = new dbft.Animation();
animation.playTimes = 1;
animation.fadeInTime = expression.fade_in ? expression.fade_in * 0.001 : 0.3;
animation.name = expressionConfig.name;
animation.type = dbft.AnimationType.Tree;
for (var _0 = 0, _1 = expression.params; _0 < _1.length; _0++) {
var timelineConfig = _1[_0];
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(timelineConfig.id);
if (!l2TimelineInfo) {
continue;
}
var timeline = new dbft.TypeTimeline();
timeline.type = dbft.TimelineType.AnimationProgress;
timeline.name = l2TimelineInfo.name;
//
var frame = new dbft.SingleValueFrame0();
frame.value = (timelineConfig.val - l2TimelineInfo.minimum) / (l2TimelineInfo.maximum - l2TimelineInfo.minimum);
timeline.frame.push(frame);
if (timelineConfig.def) {
// TODO
}
animation.duration = 0;
animation.timeline.push(timeline);
}
armature.animation.unshift(animation);
}
}
return result;
}
exports.default = default_1;
function getPose(l2Timelines, frames, action, level, offset) {
if (level === void 0) { level = -1; }
if (offset === void 0) { offset = -1; }
if (level < 0) {
if (l2Timelines.length > 0) {
level = l2Timelines.length - 1;
offset = 0;
}
else {
return frames[0];
}
}
var l2Timeline = l2Timelines[level];
var l2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(l2Timeline.name);
var index = l2Timeline.frames.indexOf(l2TimelineInfo.default);
var count = 1;
if (index < 0) {
if (l2TimelineInfo.default <= l2Timeline.frames[0]) {
index = 0;
}
else if (l2TimelineInfo.default >= l2Timeline.frames[l2Timeline.frames.length - 1]) {
index = l2Timeline.frames.length - 1;
}
}
for (var i = 0; i < level; ++i) {
count *= l2Timelines[i].frameCount;
}
if (index < 0) {
for (var _i = 0, _a = l2Timeline.frames; _i < _a.length; _i++) {
var value = _a[_i];
index++;
if (value > l2TimelineInfo.default) {
var prevValue = l2Timeline.frames[index - 1];
var progress = (l2TimelineInfo.default - prevValue) / (value - prevValue);
if (level === 0) {
return action(frames[offset + index - 1], frames[offset + index], progress);
}
return action(getPose(l2Timelines, frames, action, level - 1, offset + (index - 1) * count), getPose(l2Timelines, frames, action, level - 1, offset + index * count), progress);
}
}
throw new Error();
}
else {
if (level === 0) {
return frames[offset + index];
}
offset += index * count;
return getPose(l2Timelines, frames, action, level - 1, offset);
}
}
function createAnimation(l2Timelines, frames, target, action, indices, parentAnimation) {
if (indices === void 0) { indices = [0]; }
if (parentAnimation === void 0) { parentAnimation = null; }
var level = l2Timelines.length - indices.length;
var index = indices[indices.length - 1];
var l2Timeline = l2Timelines[level];
var blendName = target.name;
var animation = armature.getAnimation(l2Timeline.name);
if (!animation) {
animation = new dbft.Animation();
animation.playTimes = 0;
animation.duration = modelConfig.modelImpl.frameCount;
animation.name = l2Timeline.name;
animation.type = dbft.AnimationType.Tree;
armature.animation.unshift(animation);
}
if (l2Timelines.length === 1) {
action(l2Timeline, frames, target, 0, animation);
return;
}
else if (level === 0 && !animation.getAnimationTimeline(blendName, dbft.TimelineType.AnimationProgress)) {
var blendTimeline = new dbft.TypeTimeline();
var frameBegin = new dbft.SingleValueFrame0();
var frameEnd = new dbft.SingleValueFrame0();
frameBegin._position = 0;
frameBegin.value = 0.0;
frameBegin.tweenEasing = 0.0;
frameEnd._position = animation.duration;
frameEnd.value = 1.0;
blendTimeline.type = dbft.TimelineType.AnimationProgress;
blendTimeline.name = blendName;
blendTimeline.frame.push(frameBegin, frameEnd);
dbft.modifyFramesByPosition(blendTimeline.frame);
animation.timeline.push(blendTimeline);
}
if (parentAnimation) {
var i = 0;
for (var _i = 0, indices_1 = indices; _i < indices_1.length; _i++) {
var value = indices_1[_i];
if (i > 0) {
blendName += "_" + (value).toString().padStart(2, "0");
}
i++;
}
if (!parentAnimation.getAnimationTimeline(blendName, dbft.TimelineType.AnimationProgress)) {
var parentL2Timleine = l2Timelines[level + 1];
var parentL2TimelineInfo = modelConfig.modelImpl.getTimelineInfo(parentL2Timleine.name);
var totalValue = parentL2TimelineInfo.maximum - parentL2TimelineInfo.minimum;
var childTimeline = new dbft.AnimationTimeline();
var frameBegin = new dbft.SingleValueFrame0();
var frameEnd = new dbft.SingleValueFrame0();
childTimeline.type = dbft.TimelineType.AnimationProgress;
childTimeline.x = (parentL2Timleine.frames[index] - parentL2TimelineInfo.minimum) / totalValue * 2.0 - 1.0;
childTimeline.name = blendName;
frameBegin._position = 0;
frameBegin.value = 0;
frameBegin.tweenEasing = 0.0;
frameEnd._position = parentAnimation.duration;
frameEnd.value = 1.0;
childTimeline.frame.push(frameBegin, frameEnd);
dbft.modifyFramesByPosition(childTimeline.frame);
parentAnimation.timeline.push(childTimeline);
}
}
var blendAnimation = armature.getAnimation(blendName);
if (!blendAnimation) {
blendAnimation = new dbft.Animation();
blendAnimation.playTimes = 0;
blendAnimation.duration = animation.duration;
blendAnimation.type = dbft.AnimationType.Node;
blendAnimation.blendType = level !== 0 ? dbft.AnimationBlendType.E1D : dbft.AnimationBlendType.None;
blendAnimation.name = blendName;
armature.animation.push(blendAnimation);
if (level !== 0) {
var blendTimeline = new dbft.TypeTimeline();
var frameBegin = new dbft.DoubleValueFrame0();
var frameEnd = new dbft.DoubleValueFrame0();
frameBegin._position = 0;
frameBegin.x = -1.0;
frameBegin.tweenEasing = 0.0;
frameEnd._position = blendAnimation.duration;
frameEnd.x = 1.0;
blendTimeline.type = dbft.TimelineType.AnimationParameter;
blendTimeline.name = blendAnimation.name;
blendTimeline.frame.push(frameBegin, frameEnd);
dbft.modifyFramesByPosition(blendTimeline.frame);
animation.timeline.push(blendTimeline);
}
}
if (level === 0) {
var offset = 0;
for (var i = 0, l = indices.length; i < l; ++i) {
var value = indices[i];
var count = 1;
for (var j = 0; j < l2Timelines.length - i; ++j) {
count *= l2Timelines[j].frameCount;
}
offset += value * count;
}
action(l2Timeline, frames, target, offset, blendAnimation);
}
else {
for (var i = 0, l = l2Timeline.frameCount; i < l; ++i) {
var childIndices = indices.concat();
childIndices.push(i);
createAnimation(l2Timelines, frames, target, action, childIndices, blendAnimation);
}
}
}
function createDeformFrame(deformFrame, l2DeformFrame, pose, isSurfaceParent, isRotatedParent) {
for (var j = 0, lJ = l2DeformFrame.length; j < lJ; j += 2) {
if (isSurfaceParent) { // Scale.
deformFrame.value[j] = (l2DeformFrame[j] - 0.5) * 400.0 - pose[j];
deformFrame.value[j + 1] = (l2DeformFrame[j + 1] - 0.5) * 400.0 - pose[j + 1];
}
else if (isRotatedParent) { // Rotate.
rotateMatrixA.transformPoint(l2DeformFrame[j], l2DeformFrame[j + 1], geom.helpPointA);
deformFrame.value[j] = geom.helpPointA.x - pose[j];
deformFrame.value[j + 1] = geom.helpPointA.y - pose[j + 1];
}
else { // Offset.
deformFrame.value[j] = l2DeformFrame[j] - pose[j] + armature.aabb.x;
deformFrame.value[j + 1] = l2DeformFrame[j + 1] - pose[j + 1] + armature.aabb.y;
}
}
}
function vertivesCopyFrom(result, target) {
result.length = target.length;
for (var i = 0, l = target.length; i < l; ++i) {
result[i] = target[i];
}
}
function vertivesAdd(result, target) {
result.length = target.length;
for (var i = 0, l = target.length; i < l; ++i) {
result[i] += target[i];
}
}
function vertivesMinus(result, target) {
result.length = target.length;
for (var i = 0, l = target.length; i < l; ++i) {
result[i] -= target[i];
}
}
function vertivesInterpolation(result, a, b, t) {
result.length = a.length;
var helper = [];
vertivesCopyFrom(helper, b);
vertivesMinus(helper, a);
for (var i = 0, l = helper.length; i < l; ++i) {
helper[i] *= t;
}
vertivesCopyFrom(result, a);
vertivesAdd(result, helper);
}
function getMinAndMax(values) {
var min = 999999.0;
var max = -999999.0;
for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
var value = values_1[_i];
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
}
return [min, max];
}