4173 lines
181 KiB
JavaScript
4173 lines
181 KiB
JavaScript
(function (exports, Laya) {
|
||
'use strict';
|
||
|
||
class IAniLib {
|
||
}
|
||
IAniLib.Skeleton = null;
|
||
IAniLib.AnimationTemplet = null;
|
||
IAniLib.Templet = null;
|
||
|
||
class AnimationContent {
|
||
}
|
||
|
||
class AnimationNodeContent {
|
||
}
|
||
|
||
class KeyFramesContent {
|
||
}
|
||
|
||
class AnimationParser01 {
|
||
static parse(templet, reader) {
|
||
var data = reader.__getBuffer();
|
||
var i, j, k, n, l, m, o;
|
||
var aniClassName = reader.readUTFString();
|
||
templet._aniClassName = aniClassName;
|
||
var strList = reader.readUTFString().split("\n");
|
||
var aniCount = reader.getUint8();
|
||
var publicDataPos = reader.getUint32();
|
||
var publicExtDataPos = reader.getUint32();
|
||
var publicData;
|
||
if (publicDataPos > 0)
|
||
publicData = data.slice(publicDataPos, publicExtDataPos);
|
||
var publicRead = new Laya.Byte(publicData);
|
||
if (publicExtDataPos > 0)
|
||
templet._publicExtData = data.slice(publicExtDataPos, data.byteLength);
|
||
templet._useParent = !!reader.getUint8();
|
||
templet._anis.length = aniCount;
|
||
for (i = 0; i < aniCount; i++) {
|
||
var ani = templet._anis[i] = new AnimationContent();
|
||
ani.nodes = [];
|
||
var name = ani.name = strList[reader.getUint16()];
|
||
templet._aniMap[name] = i;
|
||
ani.bone3DMap = {};
|
||
ani.playTime = reader.getFloat32();
|
||
var boneCount = ani.nodes.length = reader.getUint8();
|
||
ani.totalKeyframeDatasLength = 0;
|
||
for (j = 0; j < boneCount; j++) {
|
||
var node = ani.nodes[j] = new AnimationNodeContent();
|
||
node.childs = [];
|
||
var nameIndex = reader.getInt16();
|
||
if (nameIndex >= 0) {
|
||
node.name = strList[nameIndex];
|
||
ani.bone3DMap[node.name] = j;
|
||
}
|
||
node.keyFrame = [];
|
||
node.parentIndex = reader.getInt16();
|
||
node.parentIndex == -1 ? node.parent = null : node.parent = ani.nodes[node.parentIndex];
|
||
node.lerpType = reader.getUint8();
|
||
var keyframeParamsOffset = reader.getUint32();
|
||
publicRead.pos = keyframeParamsOffset;
|
||
var keyframeDataCount = node.keyframeWidth = publicRead.getUint16();
|
||
ani.totalKeyframeDatasLength += keyframeDataCount;
|
||
if (node.lerpType === 0 || node.lerpType === 1) {
|
||
node.interpolationMethod = [];
|
||
node.interpolationMethod.length = keyframeDataCount;
|
||
for (k = 0; k < keyframeDataCount; k++)
|
||
node.interpolationMethod[k] = IAniLib.AnimationTemplet.interpolation[publicRead.getUint8()];
|
||
}
|
||
if (node.parent != null)
|
||
node.parent.childs.push(node);
|
||
var privateDataLen = reader.getUint16();
|
||
if (privateDataLen > 0) {
|
||
node.extenData = data.slice(reader.pos, reader.pos + privateDataLen);
|
||
reader.pos += privateDataLen;
|
||
}
|
||
var keyframeCount = reader.getUint16();
|
||
node.keyFrame.length = keyframeCount;
|
||
var startTime = 0;
|
||
var keyFrame;
|
||
for (k = 0, n = keyframeCount; k < n; k++) {
|
||
keyFrame = node.keyFrame[k] = new KeyFramesContent();
|
||
keyFrame.duration = reader.getFloat32();
|
||
keyFrame.startTime = startTime;
|
||
if (node.lerpType === 2) {
|
||
keyFrame.interpolationData = [];
|
||
var interDataLength = reader.getUint8();
|
||
var lerpType;
|
||
lerpType = reader.getFloat32();
|
||
switch (lerpType) {
|
||
case 254:
|
||
keyFrame.interpolationData.length = keyframeDataCount;
|
||
for (o = 0; o < keyframeDataCount; o++)
|
||
keyFrame.interpolationData[o] = 0;
|
||
break;
|
||
case 255:
|
||
keyFrame.interpolationData.length = keyframeDataCount;
|
||
for (o = 0; o < keyframeDataCount; o++)
|
||
keyFrame.interpolationData[o] = 5;
|
||
break;
|
||
default:
|
||
keyFrame.interpolationData.push(lerpType);
|
||
for (m = 1; m < interDataLength; m++) {
|
||
keyFrame.interpolationData.push(reader.getFloat32());
|
||
}
|
||
}
|
||
}
|
||
keyFrame.data = new Float32Array(keyframeDataCount);
|
||
keyFrame.dData = new Float32Array(keyframeDataCount);
|
||
keyFrame.nextData = new Float32Array(keyframeDataCount);
|
||
for (l = 0; l < keyframeDataCount; l++) {
|
||
keyFrame.data[l] = reader.getFloat32();
|
||
if (keyFrame.data[l] > -0.00000001 && keyFrame.data[l] < 0.00000001)
|
||
keyFrame.data[l] = 0;
|
||
}
|
||
startTime += keyFrame.duration;
|
||
}
|
||
keyFrame.startTime = ani.playTime;
|
||
node.playTime = ani.playTime;
|
||
templet._calculateKeyFrame(node, keyframeCount, keyframeDataCount);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
class AnimationParser02 {
|
||
static READ_DATA() {
|
||
AnimationParser02._DATA.offset = AnimationParser02._reader.getUint32();
|
||
AnimationParser02._DATA.size = AnimationParser02._reader.getUint32();
|
||
}
|
||
static READ_BLOCK() {
|
||
var count = AnimationParser02._BLOCK.count = AnimationParser02._reader.getUint16();
|
||
var blockStarts = AnimationParser02._BLOCK.blockStarts = [];
|
||
var blockLengths = AnimationParser02._BLOCK.blockLengths = [];
|
||
for (var i = 0; i < count; i++) {
|
||
blockStarts.push(AnimationParser02._reader.getUint32());
|
||
blockLengths.push(AnimationParser02._reader.getUint32());
|
||
}
|
||
}
|
||
static READ_STRINGS() {
|
||
var offset = AnimationParser02._reader.getUint32();
|
||
var count = AnimationParser02._reader.getUint16();
|
||
var prePos = AnimationParser02._reader.pos;
|
||
AnimationParser02._reader.pos = offset + AnimationParser02._DATA.offset;
|
||
for (var i = 0; i < count; i++)
|
||
AnimationParser02._strings[i] = AnimationParser02._reader.readUTFString();
|
||
AnimationParser02._reader.pos = prePos;
|
||
}
|
||
static parse(templet, reader) {
|
||
AnimationParser02._templet = templet;
|
||
AnimationParser02._reader = reader;
|
||
var arrayBuffer = reader.__getBuffer();
|
||
AnimationParser02.READ_DATA();
|
||
AnimationParser02.READ_BLOCK();
|
||
AnimationParser02.READ_STRINGS();
|
||
for (var i = 0, n = AnimationParser02._BLOCK.count; i < n; i++) {
|
||
var index = reader.getUint16();
|
||
var blockName = AnimationParser02._strings[index];
|
||
var fn = AnimationParser02["READ_" + blockName];
|
||
if (fn == null)
|
||
throw new Error("model file err,no this function:" + index + " " + blockName);
|
||
else
|
||
fn.call(null);
|
||
}
|
||
}
|
||
static READ_ANIMATIONS() {
|
||
var reader = AnimationParser02._reader;
|
||
var arrayBuffer = reader.__getBuffer();
|
||
var i, j, k, n;
|
||
var keyframeWidth = reader.getUint16();
|
||
var interpolationMethod = [];
|
||
interpolationMethod.length = keyframeWidth;
|
||
for (i = 0; i < keyframeWidth; i++)
|
||
interpolationMethod[i] = IAniLib.AnimationTemplet.interpolation[reader.getByte()];
|
||
var aniCount = reader.getUint8();
|
||
AnimationParser02._templet._anis.length = aniCount;
|
||
for (i = 0; i < aniCount; i++) {
|
||
var ani = AnimationParser02._templet._anis[i] = new AnimationContent();
|
||
ani.nodes = [];
|
||
var aniName = ani.name = AnimationParser02._strings[reader.getUint16()];
|
||
AnimationParser02._templet._aniMap[aniName] = i;
|
||
ani.bone3DMap = {};
|
||
ani.playTime = reader.getFloat32();
|
||
var boneCount = ani.nodes.length = reader.getInt16();
|
||
ani.totalKeyframeDatasLength = 0;
|
||
for (j = 0; j < boneCount; j++) {
|
||
var node = ani.nodes[j] = new AnimationNodeContent();
|
||
node.keyframeWidth = keyframeWidth;
|
||
node.childs = [];
|
||
var nameIndex = reader.getUint16();
|
||
if (nameIndex >= 0) {
|
||
node.name = AnimationParser02._strings[nameIndex];
|
||
ani.bone3DMap[node.name] = j;
|
||
}
|
||
node.keyFrame = [];
|
||
node.parentIndex = reader.getInt16();
|
||
node.parentIndex == -1 ? node.parent = null : node.parent = ani.nodes[node.parentIndex];
|
||
ani.totalKeyframeDatasLength += keyframeWidth;
|
||
node.interpolationMethod = interpolationMethod;
|
||
if (node.parent != null)
|
||
node.parent.childs.push(node);
|
||
var keyframeCount = reader.getUint16();
|
||
node.keyFrame.length = keyframeCount;
|
||
var keyFrame = null, lastKeyFrame = null;
|
||
for (k = 0, n = keyframeCount; k < n; k++) {
|
||
keyFrame = node.keyFrame[k] = new KeyFramesContent();
|
||
keyFrame.startTime = reader.getFloat32();
|
||
(lastKeyFrame) && (lastKeyFrame.duration = keyFrame.startTime - lastKeyFrame.startTime);
|
||
keyFrame.dData = new Float32Array(keyframeWidth);
|
||
keyFrame.nextData = new Float32Array(keyframeWidth);
|
||
var offset = AnimationParser02._DATA.offset;
|
||
var keyframeDataOffset = reader.getUint32();
|
||
var keyframeDataLength = keyframeWidth * 4;
|
||
var keyframeArrayBuffer = arrayBuffer.slice(offset + keyframeDataOffset, offset + keyframeDataOffset + keyframeDataLength);
|
||
keyFrame.data = new Float32Array(keyframeArrayBuffer);
|
||
lastKeyFrame = keyFrame;
|
||
}
|
||
keyFrame.duration = 0;
|
||
node.playTime = ani.playTime;
|
||
AnimationParser02._templet._calculateKeyFrame(node, keyframeCount, keyframeWidth);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
AnimationParser02._strings = [];
|
||
AnimationParser02._BLOCK = { count: 0 };
|
||
AnimationParser02._DATA = { offset: 0, size: 0 };
|
||
|
||
class AnimationState {
|
||
constructor() {
|
||
}
|
||
}
|
||
AnimationState.stopped = 0;
|
||
AnimationState.paused = 1;
|
||
AnimationState.playing = 2;
|
||
|
||
class AnimationPlayer extends Laya.EventDispatcher {
|
||
constructor() {
|
||
super();
|
||
this.isCache = true;
|
||
this.playbackRate = 1.0;
|
||
this._destroyed = false;
|
||
this._currentAnimationClipIndex = -1;
|
||
this._currentKeyframeIndex = -1;
|
||
this._currentTime = 0.0;
|
||
this._overallDuration = Number.MAX_VALUE;
|
||
this._stopWhenCircleFinish = false;
|
||
this._elapsedPlaybackTime = 0;
|
||
this._startUpdateLoopCount = -1;
|
||
this._cachePlayRate = 1.0;
|
||
this.cacheFrameRate = 60;
|
||
this.returnToZeroStopped = false;
|
||
}
|
||
get templet() {
|
||
return this._templet;
|
||
}
|
||
set templet(value) {
|
||
if (!(this.state === AnimationState.stopped))
|
||
this.stop(true);
|
||
if (this._templet !== value) {
|
||
this._templet = value;
|
||
this._computeFullKeyframeIndices();
|
||
}
|
||
}
|
||
get playStart() {
|
||
return this._playStart;
|
||
}
|
||
get playEnd() {
|
||
return this._playEnd;
|
||
}
|
||
get playDuration() {
|
||
return this._playDuration;
|
||
}
|
||
get overallDuration() {
|
||
return this._overallDuration;
|
||
}
|
||
get currentAnimationClipIndex() {
|
||
return this._currentAnimationClipIndex;
|
||
}
|
||
get currentKeyframeIndex() {
|
||
return this._currentKeyframeIndex;
|
||
}
|
||
get currentPlayTime() {
|
||
return this._currentTime + this._playStart;
|
||
}
|
||
get currentFrameTime() {
|
||
return this._currentFrameTime;
|
||
}
|
||
get cachePlayRate() {
|
||
return this._cachePlayRate;
|
||
}
|
||
set cachePlayRate(value) {
|
||
if (this._cachePlayRate !== value) {
|
||
this._cachePlayRate = value;
|
||
if (this._templet)
|
||
this._computeFullKeyframeIndices();
|
||
}
|
||
}
|
||
get cacheFrameRate() {
|
||
return this._cacheFrameRate;
|
||
}
|
||
set cacheFrameRate(value) {
|
||
if (this._cacheFrameRate !== value) {
|
||
this._cacheFrameRate = value;
|
||
this._cacheFrameRateInterval = 1000.0 / this._cacheFrameRate;
|
||
if (this._templet)
|
||
this._computeFullKeyframeIndices();
|
||
}
|
||
}
|
||
set currentTime(value) {
|
||
if (this._currentAnimationClipIndex === -1 || !this._templet)
|
||
return;
|
||
if (value < this._playStart || value > this._playEnd)
|
||
throw new Error("AnimationPlayer:value must large than playStartTime,small than playEndTime.");
|
||
this._startUpdateLoopCount = Laya.Stat.loopCount;
|
||
var cacheFrameInterval = this._cacheFrameRateInterval * this._cachePlayRate;
|
||
this._currentTime = value;
|
||
this._currentKeyframeIndex = Math.floor(this.currentPlayTime / cacheFrameInterval);
|
||
this._currentFrameTime = this._currentKeyframeIndex * cacheFrameInterval;
|
||
}
|
||
get paused() {
|
||
return this._paused;
|
||
}
|
||
set paused(value) {
|
||
this._paused = value;
|
||
value && this.event(Laya.Event.PAUSED);
|
||
}
|
||
get cacheFrameRateInterval() {
|
||
return this._cacheFrameRateInterval;
|
||
}
|
||
get state() {
|
||
if (this._currentAnimationClipIndex === -1)
|
||
return AnimationState.stopped;
|
||
if (this._paused)
|
||
return AnimationState.paused;
|
||
return AnimationState.playing;
|
||
}
|
||
get destroyed() {
|
||
return this._destroyed;
|
||
}
|
||
_onTempletLoadedComputeFullKeyframeIndices(cachePlayRate, cacheFrameRate, templet) {
|
||
if (this._templet === templet && this._cachePlayRate === cachePlayRate && this._cacheFrameRate === cacheFrameRate)
|
||
this._computeFullKeyframeIndices();
|
||
}
|
||
_computeFullKeyframeIndices() {
|
||
return;
|
||
}
|
||
_onAnimationTempletLoaded() {
|
||
(this.destroyed) || (this._calculatePlayDuration());
|
||
}
|
||
_calculatePlayDuration() {
|
||
if (this.state !== AnimationState.stopped) {
|
||
var oriDuration = this._templet.getAniDuration(this._currentAnimationClipIndex);
|
||
(this._playEnd === 0) && (this._playEnd = oriDuration);
|
||
if (this._playEnd > oriDuration)
|
||
this._playEnd = oriDuration;
|
||
this._playDuration = this._playEnd - this._playStart;
|
||
}
|
||
}
|
||
_setPlayParams(time, cacheFrameInterval) {
|
||
this._currentTime = time;
|
||
this._currentKeyframeIndex = Math.floor((this.currentPlayTime) / cacheFrameInterval + 0.01);
|
||
this._currentFrameTime = this._currentKeyframeIndex * cacheFrameInterval;
|
||
}
|
||
_setPlayParamsWhenStop(currentAniClipPlayDuration, cacheFrameInterval, playEnd = -1) {
|
||
this._currentTime = currentAniClipPlayDuration;
|
||
var endTime = playEnd > 0 ? playEnd : currentAniClipPlayDuration;
|
||
this._currentKeyframeIndex = Math.floor(endTime / cacheFrameInterval + 0.01);
|
||
this._currentKeyframeIndex = Math.floor(currentAniClipPlayDuration / cacheFrameInterval + 0.01);
|
||
this._currentFrameTime = this._currentKeyframeIndex * cacheFrameInterval;
|
||
this._currentAnimationClipIndex = -1;
|
||
}
|
||
_update(elapsedTime) {
|
||
if (this._currentAnimationClipIndex === -1 || this._paused || !this._templet)
|
||
return;
|
||
var cacheFrameInterval = this._cacheFrameRateInterval * this._cachePlayRate;
|
||
var time = 0;
|
||
(this._startUpdateLoopCount !== Laya.Stat.loopCount) && (time = elapsedTime * this.playbackRate, this._elapsedPlaybackTime += time);
|
||
var currentAniClipPlayDuration = this.playDuration;
|
||
time += this._currentTime;
|
||
if ((this._overallDuration !== 0 && this._elapsedPlaybackTime >= this._overallDuration) || (this._overallDuration === 0 && this._elapsedPlaybackTime >= currentAniClipPlayDuration
|
||
|| (this._overallDuration === 0 && time >= this.playEnd))) {
|
||
this._setPlayParamsWhenStop(currentAniClipPlayDuration, cacheFrameInterval, this.playEnd);
|
||
this.event(Laya.Event.STOPPED);
|
||
return;
|
||
}
|
||
if (currentAniClipPlayDuration > 0) {
|
||
if (time >= currentAniClipPlayDuration) {
|
||
if (this._stopWhenCircleFinish) {
|
||
this._setPlayParamsWhenStop(currentAniClipPlayDuration, cacheFrameInterval);
|
||
this._stopWhenCircleFinish = false;
|
||
this.event(Laya.Event.STOPPED);
|
||
return;
|
||
}
|
||
else {
|
||
time = time % currentAniClipPlayDuration;
|
||
this._setPlayParams(time, cacheFrameInterval);
|
||
this.event(Laya.Event.COMPLETE);
|
||
return;
|
||
}
|
||
}
|
||
else {
|
||
this._setPlayParams(time, cacheFrameInterval);
|
||
}
|
||
}
|
||
else {
|
||
if (this._stopWhenCircleFinish) {
|
||
this._setPlayParamsWhenStop(currentAniClipPlayDuration, cacheFrameInterval);
|
||
this._stopWhenCircleFinish = false;
|
||
this.event(Laya.Event.STOPPED);
|
||
return;
|
||
}
|
||
this._currentTime = this._currentFrameTime = this._currentKeyframeIndex = 0;
|
||
this.event(Laya.Event.COMPLETE);
|
||
}
|
||
}
|
||
_destroy() {
|
||
this.offAll();
|
||
this._templet = null;
|
||
this._destroyed = true;
|
||
}
|
||
play(index = 0, playbackRate = 1.0, overallDuration = 2147483647, playStart = 0, playEnd = 0) {
|
||
if (!this._templet)
|
||
throw new Error("AnimationPlayer:templet must not be null,maybe you need to set url.");
|
||
if (overallDuration < 0 || playStart < 0 || playEnd < 0)
|
||
throw new Error("AnimationPlayer:overallDuration,playStart and playEnd must large than zero.");
|
||
if ((playEnd !== 0) && (playStart > playEnd))
|
||
throw new Error("AnimationPlayer:start must less than end.");
|
||
this._currentTime = 0;
|
||
this._currentFrameTime = 0;
|
||
this._elapsedPlaybackTime = 0;
|
||
this.playbackRate = playbackRate;
|
||
this._overallDuration = overallDuration;
|
||
this._playStart = playStart;
|
||
this._playEnd = playEnd;
|
||
this._paused = false;
|
||
this._currentAnimationClipIndex = index;
|
||
this._currentKeyframeIndex = 0;
|
||
this._startUpdateLoopCount = Laya.Stat.loopCount;
|
||
this.event(Laya.Event.PLAYED);
|
||
this._calculatePlayDuration();
|
||
this._update(0);
|
||
}
|
||
playByFrame(index = 0, playbackRate = 1.0, overallDuration = 2147483647, playStartFrame = 0, playEndFrame = 0, fpsIn3DBuilder = 30) {
|
||
var interval = 1000.0 / fpsIn3DBuilder;
|
||
this.play(index, playbackRate, overallDuration, playStartFrame * interval, playEndFrame * interval);
|
||
}
|
||
stop(immediate = true) {
|
||
if (immediate) {
|
||
this._currentTime = this._currentFrameTime = this._currentKeyframeIndex = 0;
|
||
this._currentAnimationClipIndex = -1;
|
||
this.event(Laya.Event.STOPPED);
|
||
}
|
||
else {
|
||
this._stopWhenCircleFinish = true;
|
||
}
|
||
}
|
||
destroy() {
|
||
}
|
||
}
|
||
|
||
class BezierLerp {
|
||
constructor() {
|
||
}
|
||
static getBezierRate(t, px0, py0, px1, py1) {
|
||
var key = BezierLerp._getBezierParamKey(px0, py0, px1, py1);
|
||
var vKey = key * 100 + t;
|
||
if (BezierLerp._bezierResultCache[vKey])
|
||
return BezierLerp._bezierResultCache[vKey];
|
||
var points = BezierLerp._getBezierPoints(px0, py0, px1, py1, key);
|
||
var i, len;
|
||
len = points.length;
|
||
for (i = 0; i < len; i += 2) {
|
||
if (t <= points[i]) {
|
||
BezierLerp._bezierResultCache[vKey] = points[i + 1];
|
||
return points[i + 1];
|
||
}
|
||
}
|
||
BezierLerp._bezierResultCache[vKey] = 1;
|
||
return 1;
|
||
}
|
||
static _getBezierParamKey(px0, py0, px1, py1) {
|
||
return (((px0 * 100 + py0) * 100 + px1) * 100 + py1) * 100;
|
||
}
|
||
static _getBezierPoints(px0, py0, px1, py1, key) {
|
||
if (BezierLerp._bezierPointsCache[key])
|
||
return BezierLerp._bezierPointsCache[key];
|
||
var controlPoints;
|
||
controlPoints = [0, 0, px0, py0, px1, py1, 1, 1];
|
||
var bz;
|
||
bz = new Laya.Bezier();
|
||
var points;
|
||
points = bz.getBezierPoints(controlPoints, 100, 3);
|
||
BezierLerp._bezierPointsCache[key] = points;
|
||
return points;
|
||
}
|
||
}
|
||
BezierLerp._bezierResultCache = {};
|
||
BezierLerp._bezierPointsCache = {};
|
||
|
||
class AnimationTemplet extends Laya.Resource {
|
||
constructor() {
|
||
super();
|
||
this._anis = [];
|
||
this._aniMap = {};
|
||
this.unfixedLastAniIndex = -1;
|
||
this._fullFrames = null;
|
||
this._boneCurKeyFrm = [];
|
||
}
|
||
static _LinearInterpolation_0(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
out[outOfs] = data[index] + dt * dData[index];
|
||
return 1;
|
||
}
|
||
static _QuaternionInterpolation_1(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
var amount = duration === 0 ? 0 : dt / duration;
|
||
Laya.MathUtil.slerpQuaternionArray(data, index, nextData, index, amount, out, outOfs);
|
||
return 4;
|
||
}
|
||
static _AngleInterpolation_2(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
return 0;
|
||
}
|
||
static _RadiansInterpolation_3(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
return 0;
|
||
}
|
||
static _Matrix4x4Interpolation_4(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
for (var i = 0; i < 16; i++, index++)
|
||
out[outOfs + i] = data[index] + dt * dData[index];
|
||
return 16;
|
||
}
|
||
static _NoInterpolation_5(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null) {
|
||
out[outOfs] = data[index];
|
||
return 1;
|
||
}
|
||
static _BezierInterpolation_6(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null, offset = 0) {
|
||
out[outOfs] = data[index] + (nextData[index] - data[index]) * BezierLerp.getBezierRate(dt / duration, interData[offset], interData[offset + 1], interData[offset + 2], interData[offset + 3]);
|
||
return 5;
|
||
}
|
||
static _BezierInterpolation_7(bone, index, out, outOfs, data, dt, dData, duration, nextData, interData = null, offset = 0) {
|
||
out[outOfs] = interData[offset + 4] + interData[offset + 5] * BezierLerp.getBezierRate((dt * 0.001 + interData[offset + 6]) / interData[offset + 7], interData[offset], interData[offset + 1], interData[offset + 2], interData[offset + 3]);
|
||
return 9;
|
||
}
|
||
parse(data) {
|
||
var reader = new Laya.Byte(data);
|
||
this._aniVersion = reader.readUTFString();
|
||
AnimationParser01.parse(this, reader);
|
||
}
|
||
_calculateKeyFrame(node, keyframeCount, keyframeDataCount) {
|
||
var keyFrames = node.keyFrame;
|
||
keyFrames[keyframeCount] = keyFrames[0];
|
||
for (var i = 0; i < keyframeCount; i++) {
|
||
var keyFrame = keyFrames[i];
|
||
for (var j = 0; j < keyframeDataCount; j++) {
|
||
keyFrame.dData[j] = (keyFrame.duration === 0) ? 0 : (keyFrames[i + 1].data[j] - keyFrame.data[j]) / keyFrame.duration;
|
||
keyFrame.nextData[j] = keyFrames[i + 1].data[j];
|
||
}
|
||
}
|
||
keyFrames.length--;
|
||
}
|
||
_onAsynLoaded(data, propertyParams = null) {
|
||
var reader = new Laya.Byte(data);
|
||
this._aniVersion = reader.readUTFString();
|
||
switch (this._aniVersion) {
|
||
case "LAYAANIMATION:02":
|
||
AnimationParser02.parse(this, reader);
|
||
break;
|
||
default:
|
||
AnimationParser01.parse(this, reader);
|
||
}
|
||
}
|
||
getAnimationCount() {
|
||
return this._anis.length;
|
||
}
|
||
getAnimation(aniIndex) {
|
||
return this._anis[aniIndex];
|
||
}
|
||
getAniDuration(aniIndex) {
|
||
return this._anis[aniIndex].playTime;
|
||
}
|
||
getNodes(aniIndex) {
|
||
return this._anis[aniIndex].nodes;
|
||
}
|
||
getNodeIndexWithName(aniIndex, name) {
|
||
return this._anis[aniIndex].bone3DMap[name];
|
||
}
|
||
getNodeCount(aniIndex) {
|
||
return this._anis[aniIndex].nodes.length;
|
||
}
|
||
getTotalkeyframesLength(aniIndex) {
|
||
return this._anis[aniIndex].totalKeyframeDatasLength;
|
||
}
|
||
getPublicExtData() {
|
||
return this._publicExtData;
|
||
}
|
||
getAnimationDataWithCache(key, cacheDatas, aniIndex, frameIndex) {
|
||
var aniDatas = cacheDatas[aniIndex];
|
||
if (!aniDatas) {
|
||
return null;
|
||
}
|
||
else {
|
||
var keyDatas = aniDatas[key];
|
||
if (!keyDatas)
|
||
return null;
|
||
else {
|
||
return keyDatas[frameIndex];
|
||
}
|
||
}
|
||
}
|
||
setAnimationDataWithCache(key, cacheDatas, aniIndex, frameIndex, data) {
|
||
var aniDatas = (cacheDatas[aniIndex]) || (cacheDatas[aniIndex] = {});
|
||
var aniDatasCache = (aniDatas[key]) || (aniDatas[key] = []);
|
||
aniDatasCache[frameIndex] = data;
|
||
}
|
||
getNodeKeyFrame(nodeframes, nodeid, tm) {
|
||
var cid = this._boneCurKeyFrm[nodeid];
|
||
var frmNum = nodeframes.length;
|
||
if (cid == void 0 || cid >= frmNum) {
|
||
cid = this._boneCurKeyFrm[nodeid] = 0;
|
||
}
|
||
var kinfo = nodeframes[cid];
|
||
var curFrmTm = kinfo.startTime;
|
||
var dt = tm - curFrmTm;
|
||
if (dt == 0 || (dt > 0 && kinfo.duration > dt)) {
|
||
return cid;
|
||
}
|
||
var i = 0;
|
||
if (dt > 0) {
|
||
tm = tm + 0.01;
|
||
for (i = cid + 1; i < frmNum; i++) {
|
||
kinfo = nodeframes[i];
|
||
if (kinfo.startTime <= tm && kinfo.startTime + kinfo.duration > tm) {
|
||
this._boneCurKeyFrm[nodeid] = i;
|
||
return i;
|
||
}
|
||
}
|
||
return frmNum - 1;
|
||
}
|
||
else {
|
||
for (i = 0; i < cid; i++) {
|
||
kinfo = nodeframes[i];
|
||
if (kinfo.startTime <= tm && kinfo.startTime + kinfo.duration > tm) {
|
||
this._boneCurKeyFrm[nodeid] = i;
|
||
return i;
|
||
}
|
||
}
|
||
return cid;
|
||
}
|
||
}
|
||
getOriginalData(aniIndex, originalData, nodesFrameIndices, frameIndex, playCurTime) {
|
||
var oneAni = this._anis[aniIndex];
|
||
var nodes = oneAni.nodes;
|
||
var curKFrm = this._boneCurKeyFrm;
|
||
if (curKFrm.length < nodes.length) {
|
||
curKFrm.length = nodes.length;
|
||
}
|
||
var j = 0;
|
||
for (var i = 0, n = nodes.length, outOfs = 0; i < n; i++) {
|
||
var node = nodes[i];
|
||
var key;
|
||
var kfrm = node.keyFrame;
|
||
key = kfrm[this.getNodeKeyFrame(kfrm, i, playCurTime)];
|
||
node.dataOffset = outOfs;
|
||
var dt = playCurTime - key.startTime;
|
||
var lerpType = node.lerpType;
|
||
if (lerpType) {
|
||
switch (lerpType) {
|
||
case 0:
|
||
case 1:
|
||
for (j = 0; j < node.keyframeWidth;)
|
||
j += node.interpolationMethod[j](node, j, originalData, outOfs + j, key.data, dt, key.dData, key.duration, key.nextData);
|
||
break;
|
||
case 2:
|
||
var interpolationData = key.interpolationData;
|
||
var interDataLen = interpolationData.length;
|
||
var dataIndex = 0;
|
||
for (j = 0; j < interDataLen;) {
|
||
var type = interpolationData[j];
|
||
switch (type) {
|
||
case 6:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData, interpolationData, j + 1);
|
||
break;
|
||
case 7:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData, interpolationData, j + 1);
|
||
break;
|
||
default:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData);
|
||
}
|
||
dataIndex++;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else {
|
||
for (j = 0; j < node.keyframeWidth;)
|
||
j += node.interpolationMethod[j](node, j, originalData, outOfs + j, key.data, dt, key.dData, key.duration, key.nextData);
|
||
}
|
||
outOfs += node.keyframeWidth;
|
||
}
|
||
}
|
||
getNodesCurrentFrameIndex(aniIndex, playCurTime) {
|
||
var ani = this._anis[aniIndex];
|
||
var nodes = ani.nodes;
|
||
if (aniIndex !== this.unfixedLastAniIndex) {
|
||
this.unfixedCurrentFrameIndexes = new Uint32Array(nodes.length);
|
||
this.unfixedCurrentTimes = new Float32Array(nodes.length);
|
||
this.unfixedLastAniIndex = aniIndex;
|
||
}
|
||
for (var i = 0, n = nodes.length; i < n; i++) {
|
||
var node = nodes[i];
|
||
if (playCurTime < this.unfixedCurrentTimes[i])
|
||
this.unfixedCurrentFrameIndexes[i] = 0;
|
||
this.unfixedCurrentTimes[i] = playCurTime;
|
||
while ((this.unfixedCurrentFrameIndexes[i] < node.keyFrame.length)) {
|
||
if (node.keyFrame[this.unfixedCurrentFrameIndexes[i]].startTime > this.unfixedCurrentTimes[i])
|
||
break;
|
||
this.unfixedCurrentFrameIndexes[i]++;
|
||
}
|
||
this.unfixedCurrentFrameIndexes[i]--;
|
||
}
|
||
return this.unfixedCurrentFrameIndexes;
|
||
}
|
||
getOriginalDataUnfixedRate(aniIndex, originalData, playCurTime) {
|
||
var oneAni = this._anis[aniIndex];
|
||
var nodes = oneAni.nodes;
|
||
if (aniIndex !== this.unfixedLastAniIndex) {
|
||
this.unfixedCurrentFrameIndexes = new Uint32Array(nodes.length);
|
||
this.unfixedCurrentTimes = new Float32Array(nodes.length);
|
||
this.unfixedKeyframes = [];
|
||
this.unfixedLastAniIndex = aniIndex;
|
||
}
|
||
var j = 0;
|
||
for (var i = 0, n = nodes.length, outOfs = 0; i < n; i++) {
|
||
var node = nodes[i];
|
||
if (playCurTime < this.unfixedCurrentTimes[i])
|
||
this.unfixedCurrentFrameIndexes[i] = 0;
|
||
this.unfixedCurrentTimes[i] = playCurTime;
|
||
while (this.unfixedCurrentFrameIndexes[i] < node.keyFrame.length) {
|
||
if (node.keyFrame[this.unfixedCurrentFrameIndexes[i]].startTime > this.unfixedCurrentTimes[i])
|
||
break;
|
||
this.unfixedKeyframes[i] = node.keyFrame[this.unfixedCurrentFrameIndexes[i]];
|
||
this.unfixedCurrentFrameIndexes[i]++;
|
||
}
|
||
var key = this.unfixedKeyframes[i];
|
||
node.dataOffset = outOfs;
|
||
var dt = playCurTime - key.startTime;
|
||
var lerpType = node.lerpType;
|
||
if (lerpType) {
|
||
switch (node.lerpType) {
|
||
case 0:
|
||
case 1:
|
||
for (j = 0; j < node.keyframeWidth;)
|
||
j += node.interpolationMethod[j](node, j, originalData, outOfs + j, key.data, dt, key.dData, key.duration, key.nextData);
|
||
break;
|
||
case 2:
|
||
var interpolationData = key.interpolationData;
|
||
var interDataLen = interpolationData.length;
|
||
var dataIndex = 0;
|
||
for (j = 0; j < interDataLen;) {
|
||
var type = interpolationData[j];
|
||
switch (type) {
|
||
case 6:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData, interpolationData, j + 1);
|
||
break;
|
||
case 7:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData, interpolationData, j + 1);
|
||
break;
|
||
default:
|
||
j += AnimationTemplet.interpolation[type](node, dataIndex, originalData, outOfs + dataIndex, key.data, dt, key.dData, key.duration, key.nextData);
|
||
}
|
||
dataIndex++;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else {
|
||
for (j = 0; j < node.keyframeWidth;)
|
||
j += node.interpolationMethod[j](node, j, originalData, outOfs + j, key.data, dt, key.dData, key.duration, key.nextData);
|
||
}
|
||
outOfs += node.keyframeWidth;
|
||
}
|
||
}
|
||
}
|
||
AnimationTemplet.interpolation = [AnimationTemplet._LinearInterpolation_0, AnimationTemplet._QuaternionInterpolation_1, AnimationTemplet._AngleInterpolation_2, AnimationTemplet._RadiansInterpolation_3, AnimationTemplet._Matrix4x4Interpolation_4, AnimationTemplet._NoInterpolation_5, AnimationTemplet._BezierInterpolation_6, AnimationTemplet._BezierInterpolation_7];
|
||
IAniLib.AnimationTemplet = AnimationTemplet;
|
||
|
||
class GraphicsAni extends Laya.Graphics {
|
||
drawSkin(skinA, alpha) {
|
||
this.drawTriangles(skinA.texture, 0, 0, skinA.vertices, skinA.uvs, skinA.indexes, skinA.transform || Laya.Matrix.EMPTY, alpha);
|
||
}
|
||
static create() {
|
||
var rs = GraphicsAni._caches.pop();
|
||
return rs || new GraphicsAni();
|
||
}
|
||
static recycle(graphics) {
|
||
graphics.clear();
|
||
GraphicsAni._caches.push(graphics);
|
||
}
|
||
}
|
||
GraphicsAni._caches = [];
|
||
|
||
class Transform {
|
||
constructor() {
|
||
this.skX = 0;
|
||
this.skY = 0;
|
||
this.scX = 1;
|
||
this.scY = 1;
|
||
this.x = 0;
|
||
this.y = 0;
|
||
this.skewX = 0;
|
||
this.skewY = 0;
|
||
}
|
||
initData(data) {
|
||
if (data.x != undefined) {
|
||
this.x = data.x;
|
||
}
|
||
if (data.y != undefined) {
|
||
this.y = data.y;
|
||
}
|
||
if (data.skX != undefined) {
|
||
this.skX = data.skX;
|
||
}
|
||
if (data.skY != undefined) {
|
||
this.skY = data.skY;
|
||
}
|
||
if (data.scX != undefined) {
|
||
this.scX = data.scX;
|
||
}
|
||
if (data.scY != undefined) {
|
||
this.scY = data.scY;
|
||
}
|
||
}
|
||
getMatrix() {
|
||
var tMatrix;
|
||
if (this.mMatrix) {
|
||
tMatrix = this.mMatrix;
|
||
}
|
||
else {
|
||
tMatrix = this.mMatrix = new Laya.Matrix();
|
||
}
|
||
tMatrix.identity();
|
||
tMatrix.scale(this.scX, this.scY);
|
||
if (this.skewX || this.skewY) {
|
||
this.skew(tMatrix, this.skewX * Math.PI / 180, this.skewY * Math.PI / 180);
|
||
}
|
||
tMatrix.rotate(this.skX * Math.PI / 180);
|
||
tMatrix.translate(this.x, this.y);
|
||
return tMatrix;
|
||
}
|
||
skew(m, x, y) {
|
||
var sinX = Math.sin(y);
|
||
var cosX = Math.cos(y);
|
||
var sinY = Math.sin(x);
|
||
var cosY = Math.cos(x);
|
||
m.setTo(m.a * cosY - m.b * sinX, m.a * sinY + m.b * cosX, m.c * cosY - m.d * sinX, m.c * sinY + m.d * cosX, m.tx * cosY - m.ty * sinX, m.tx * sinY + m.ty * cosX);
|
||
return m;
|
||
}
|
||
}
|
||
|
||
class Bone {
|
||
constructor() {
|
||
this.length = 10;
|
||
this.resultTransform = new Transform();
|
||
this.resultMatrix = new Laya.Matrix();
|
||
this.inheritScale = true;
|
||
this.inheritRotation = true;
|
||
this.d = -1;
|
||
this._children = [];
|
||
}
|
||
setTempMatrix(matrix) {
|
||
this._tempMatrix = matrix;
|
||
var i = 0, n = 0;
|
||
var tBone;
|
||
for (i = 0, n = this._children.length; i < n; i++) {
|
||
tBone = this._children[i];
|
||
tBone.setTempMatrix(this._tempMatrix);
|
||
}
|
||
}
|
||
update(pMatrix = null) {
|
||
this.rotation = this.transform.skX;
|
||
var tResultMatrix;
|
||
if (pMatrix) {
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
Laya.Matrix.mul(tResultMatrix, pMatrix, this.resultMatrix);
|
||
this.resultRotation = this.rotation;
|
||
}
|
||
else {
|
||
this.resultRotation = this.rotation + this.parentBone.resultRotation;
|
||
if (this.parentBone) {
|
||
if (this.inheritRotation && this.inheritScale) {
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
Laya.Matrix.mul(tResultMatrix, this.parentBone.resultMatrix, this.resultMatrix);
|
||
}
|
||
else {
|
||
var parent = this.parentBone;
|
||
var tAngle;
|
||
var cos;
|
||
var sin;
|
||
var tParentMatrix = this.parentBone.resultMatrix;
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
var worldX = tParentMatrix.a * tResultMatrix.tx + tParentMatrix.c * tResultMatrix.ty + tParentMatrix.tx;
|
||
var worldY = tParentMatrix.b * tResultMatrix.tx + tParentMatrix.d * tResultMatrix.ty + tParentMatrix.ty;
|
||
var tTestMatrix = new Laya.Matrix();
|
||
if (this.inheritRotation) {
|
||
tAngle = Math.atan2(parent.resultMatrix.b, parent.resultMatrix.a);
|
||
cos = Math.cos(tAngle), sin = Math.sin(tAngle);
|
||
tTestMatrix.setTo(cos, sin, -sin, cos, 0, 0);
|
||
Laya.Matrix.mul(this._tempMatrix, tTestMatrix, Laya.Matrix.TEMP);
|
||
Laya.Matrix.TEMP.copyTo(tTestMatrix);
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
Laya.Matrix.mul(tResultMatrix, tTestMatrix, this.resultMatrix);
|
||
if (this.resultTransform.scX * this.resultTransform.scY < 0) {
|
||
this.resultMatrix.rotate(Math.PI * 0.5);
|
||
}
|
||
this.resultMatrix.tx = worldX;
|
||
this.resultMatrix.ty = worldY;
|
||
}
|
||
else if (this.inheritScale) {
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
Laya.Matrix.TEMP.identity();
|
||
Laya.Matrix.TEMP.d = this.d;
|
||
Laya.Matrix.mul(tResultMatrix, Laya.Matrix.TEMP, this.resultMatrix);
|
||
this.resultMatrix.tx = worldX;
|
||
this.resultMatrix.ty = worldY;
|
||
}
|
||
else {
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
Laya.Matrix.TEMP.identity();
|
||
Laya.Matrix.TEMP.d = this.d;
|
||
Laya.Matrix.mul(tResultMatrix, Laya.Matrix.TEMP, this.resultMatrix);
|
||
this.resultMatrix.tx = worldX;
|
||
this.resultMatrix.ty = worldY;
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
tResultMatrix = this.resultTransform.getMatrix();
|
||
tResultMatrix.copyTo(this.resultMatrix);
|
||
}
|
||
}
|
||
var i = 0, n = 0;
|
||
var tBone;
|
||
for (i = 0, n = this._children.length; i < n; i++) {
|
||
tBone = this._children[i];
|
||
tBone.update();
|
||
}
|
||
}
|
||
updateChild() {
|
||
var i = 0, n = 0;
|
||
var tBone;
|
||
for (i = 0, n = this._children.length; i < n; i++) {
|
||
tBone = this._children[i];
|
||
tBone.update();
|
||
}
|
||
}
|
||
setRotation(rd) {
|
||
if (this._sprite) {
|
||
this._sprite.rotation = rd * 180 / Math.PI;
|
||
}
|
||
}
|
||
updateDraw(x, y) {
|
||
if (!Bone.ShowBones || Bone.ShowBones[this.name]) {
|
||
if (this._sprite) {
|
||
this._sprite.x = x + this.resultMatrix.tx;
|
||
this._sprite.y = y + this.resultMatrix.ty;
|
||
}
|
||
else {
|
||
this._sprite = new Laya.Sprite();
|
||
this._sprite.graphics.drawCircle(0, 0, 5, "#ff0000");
|
||
this._sprite.graphics.drawLine(0, 0, this.length, 0, "#00ff00");
|
||
this._sprite.graphics.fillText(this.name, 0, 0, "20px Arial", "#00ff00", "center");
|
||
Laya.ILaya.stage.addChild(this._sprite);
|
||
this._sprite.x = x + this.resultMatrix.tx;
|
||
this._sprite.y = y + this.resultMatrix.ty;
|
||
}
|
||
}
|
||
var i = 0, n = 0;
|
||
var tBone;
|
||
for (i = 0, n = this._children.length; i < n; i++) {
|
||
tBone = this._children[i];
|
||
tBone.updateDraw(x, y);
|
||
}
|
||
}
|
||
addChild(bone) {
|
||
this._children.push(bone);
|
||
bone.parentBone = this;
|
||
}
|
||
findBone(boneName) {
|
||
if (this.name == boneName) {
|
||
return this;
|
||
}
|
||
else {
|
||
var i, n;
|
||
var tBone;
|
||
var tResult;
|
||
for (i = 0, n = this._children.length; i < n; i++) {
|
||
tBone = this._children[i];
|
||
tResult = tBone.findBone(boneName);
|
||
if (tResult) {
|
||
return tResult;
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
localToWorld(local) {
|
||
var localX = local[0];
|
||
var localY = local[1];
|
||
local[0] = localX * this.resultMatrix.a + localY * this.resultMatrix.c + this.resultMatrix.tx;
|
||
local[1] = localX * this.resultMatrix.b + localY * this.resultMatrix.d + this.resultMatrix.ty;
|
||
}
|
||
}
|
||
Bone.ShowBones = {};
|
||
|
||
class UVTools {
|
||
constructor() {
|
||
}
|
||
static getRelativeUV(bigUV, smallUV, rst = null) {
|
||
var startX = bigUV[0];
|
||
var width = bigUV[2] - bigUV[0];
|
||
var startY = bigUV[1];
|
||
var height = bigUV[5] - bigUV[1];
|
||
if (!rst)
|
||
rst = [];
|
||
rst.length = smallUV.length;
|
||
var i, len;
|
||
len = rst.length;
|
||
var dWidth = 1 / width;
|
||
var dHeight = 1 / height;
|
||
for (i = 0; i < len; i += 2) {
|
||
rst[i] = (smallUV[i] - startX) * dWidth;
|
||
rst[i + 1] = (smallUV[i + 1] - startY) * dHeight;
|
||
}
|
||
return rst;
|
||
}
|
||
static getAbsoluteUV(bigUV, smallUV, rst = null) {
|
||
if (bigUV[0] == 0 && bigUV[1] == 0 && bigUV[4] == 1 && bigUV[5] == 1) {
|
||
if (rst) {
|
||
Laya.Utils.copyArray(rst, smallUV);
|
||
return rst;
|
||
}
|
||
else {
|
||
return smallUV;
|
||
}
|
||
}
|
||
var startX = bigUV[0];
|
||
var width = bigUV[2] - bigUV[0];
|
||
var startY = bigUV[1];
|
||
var height = bigUV[5] - bigUV[1];
|
||
if (!rst)
|
||
rst = [];
|
||
rst.length = smallUV.length;
|
||
var i, len;
|
||
len = rst.length;
|
||
for (i = 0; i < len; i += 2) {
|
||
rst[i] = smallUV[i] * width + startX;
|
||
rst[i + 1] = smallUV[i + 1] * height + startY;
|
||
}
|
||
return rst;
|
||
}
|
||
}
|
||
|
||
class MeshData {
|
||
constructor() {
|
||
this.uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);
|
||
this.vertices = new Float32Array([0, 0, 100, 0, 100, 100, 0, 100]);
|
||
this.indexes = new Uint16Array([0, 1, 3, 3, 1, 2]);
|
||
this.useUvTransform = false;
|
||
this.canvasPadding = 1;
|
||
}
|
||
getBounds() {
|
||
return Laya.Rectangle._getWrapRec(this.vertices);
|
||
}
|
||
}
|
||
|
||
class SkinMeshForGraphic extends MeshData {
|
||
constructor() {
|
||
super();
|
||
}
|
||
init2(texture, ps, verticles, uvs) {
|
||
if (this.transform) {
|
||
this.transform = null;
|
||
}
|
||
var _ps = ps || [0, 1, 3, 3, 1, 2];
|
||
this.texture = texture;
|
||
this.indexes = new Uint16Array(_ps);
|
||
this.vertices = new Float32Array(verticles);
|
||
this.uvs = new Float32Array(uvs);
|
||
}
|
||
}
|
||
|
||
class BoneSlot {
|
||
constructor() {
|
||
this.srcDisplayIndex = -1;
|
||
this.type = "src";
|
||
this.displayIndex = -1;
|
||
this.originalIndex = -1;
|
||
this._replaceDic = {};
|
||
}
|
||
showSlotData(slotData, freshIndex = true) {
|
||
this.currSlotData = slotData;
|
||
if (freshIndex)
|
||
this.displayIndex = this.srcDisplayIndex;
|
||
this.currDisplayData = null;
|
||
this.currTexture = null;
|
||
}
|
||
showDisplayByName(name) {
|
||
if (this.currSlotData) {
|
||
this.showDisplayByIndex(this.currSlotData.getDisplayByName(name));
|
||
}
|
||
}
|
||
replaceDisplayByName(tarName, newName) {
|
||
if (!this.currSlotData)
|
||
return;
|
||
var preIndex;
|
||
preIndex = this.currSlotData.getDisplayByName(tarName);
|
||
var newIndex;
|
||
newIndex = this.currSlotData.getDisplayByName(newName);
|
||
this.replaceDisplayByIndex(preIndex, newIndex);
|
||
}
|
||
replaceDisplayByIndex(tarIndex, newIndex) {
|
||
if (!this.currSlotData)
|
||
return;
|
||
this._replaceDic[tarIndex] = newIndex;
|
||
if (this.originalIndex == tarIndex) {
|
||
this.showDisplayByIndex(tarIndex);
|
||
}
|
||
}
|
||
showDisplayByIndex(index) {
|
||
this.originalIndex = index;
|
||
if (this._replaceDic[index] != null)
|
||
index = this._replaceDic[index];
|
||
if (this.currSlotData && index > -1 && index < this.currSlotData.displayArr.length) {
|
||
this.displayIndex = index;
|
||
this.currDisplayData = this.currSlotData.displayArr[index];
|
||
if (this.currDisplayData) {
|
||
var tName = this.currDisplayData.name;
|
||
this.currTexture = this.templet.getTexture(tName);
|
||
if (this.currTexture && this.currDisplayData.type == 0 && this.currDisplayData.uvs) {
|
||
this.currTexture = this.currDisplayData.createTexture(this.currTexture);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
this.displayIndex = -1;
|
||
this.currDisplayData = null;
|
||
this.currTexture = null;
|
||
}
|
||
}
|
||
replaceSkin(_texture) {
|
||
this._diyTexture = _texture;
|
||
if (this._curDiyUV)
|
||
this._curDiyUV.length = 0;
|
||
if (this.currDisplayData && this._diyTexture == this.currDisplayData.texture) {
|
||
this._diyTexture = null;
|
||
}
|
||
}
|
||
setParentMatrix(parentMatrix) {
|
||
this._parentMatrix = parentMatrix;
|
||
}
|
||
static createSkinMesh() {
|
||
return new SkinMeshForGraphic();
|
||
}
|
||
static isSameArr(arrA, arrB) {
|
||
if (arrA.length != arrB.length)
|
||
return false;
|
||
var i, len;
|
||
len = arrA.length;
|
||
for (i = 0; i < len; i++) {
|
||
if (arrA[i] != arrB[i])
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
getSaveVerticle(tArr) {
|
||
if (BoneSlot.useSameMatrixAndVerticle && this._preGraphicVerticle && BoneSlot.isSameArr(tArr, this._preGraphicVerticle)) {
|
||
tArr = this._preGraphicVerticle;
|
||
}
|
||
else {
|
||
tArr = Laya.ILaya.Utils.copyArray([], tArr);
|
||
this._preGraphicVerticle = tArr;
|
||
}
|
||
return tArr;
|
||
}
|
||
static isSameMatrix(mtA, mtB) {
|
||
return mtA.a == mtB.a && mtA.b == mtB.b && mtA.c == mtB.c && mtA.d == mtB.d && Math.abs(mtA.tx - mtB.tx) < 0.00001 && Math.abs(mtA.ty - mtB.ty) < 0.00001;
|
||
}
|
||
getSaveMatrix(tResultMatrix) {
|
||
if (BoneSlot.useSameMatrixAndVerticle && this._preGraphicMatrix && BoneSlot.isSameMatrix(tResultMatrix, this._preGraphicMatrix)) {
|
||
tResultMatrix = this._preGraphicMatrix;
|
||
}
|
||
else {
|
||
var newMatrix = tResultMatrix.clone();
|
||
tResultMatrix = newMatrix;
|
||
this._preGraphicMatrix = tResultMatrix;
|
||
}
|
||
return tResultMatrix;
|
||
}
|
||
draw(graphics, boneMatrixArray, noUseSave = false, alpha = 1) {
|
||
if ((this._diyTexture == null && this.currTexture == null) || this.currDisplayData == null) {
|
||
if (!(this.currDisplayData && this.currDisplayData.type == 3)) {
|
||
return;
|
||
}
|
||
}
|
||
var tTexture = this.currTexture;
|
||
if (this._diyTexture)
|
||
tTexture = this._diyTexture;
|
||
var tSkinSprite;
|
||
switch (this.currDisplayData.type) {
|
||
case 0:
|
||
if (graphics) {
|
||
var tCurrentMatrix = this.getDisplayMatrix();
|
||
if (this._parentMatrix) {
|
||
var tRotateKey = false;
|
||
if (tCurrentMatrix) {
|
||
Laya.Matrix.mul(tCurrentMatrix, this._parentMatrix, Laya.Matrix.TEMP);
|
||
var tResultMatrix;
|
||
if (noUseSave) {
|
||
if (this._resultMatrix == null)
|
||
this._resultMatrix = new Laya.Matrix();
|
||
tResultMatrix = this._resultMatrix;
|
||
}
|
||
else {
|
||
tResultMatrix = BoneSlot._tempResultMatrix;
|
||
}
|
||
if (this._diyTexture && this.currDisplayData.uvs) {
|
||
var tTestMatrix = BoneSlot._tempMatrix;
|
||
tTestMatrix.identity();
|
||
if (this.currDisplayData.uvs[1] > this.currDisplayData.uvs[5]) {
|
||
tTestMatrix.d = -1;
|
||
}
|
||
if (this.currDisplayData.uvs[0] > this.currDisplayData.uvs[4]
|
||
&& this.currDisplayData.uvs[1] > this.currDisplayData.uvs[5]) {
|
||
tRotateKey = true;
|
||
tTestMatrix.rotate(-Math.PI / 2);
|
||
}
|
||
Laya.Matrix.mul(tTestMatrix, Laya.Matrix.TEMP, tResultMatrix);
|
||
}
|
||
else {
|
||
Laya.Matrix.TEMP.copyTo(tResultMatrix);
|
||
}
|
||
if (!noUseSave) {
|
||
tResultMatrix = this.getSaveMatrix(tResultMatrix);
|
||
}
|
||
tResultMatrix._checkTransform();
|
||
if (tRotateKey) {
|
||
graphics.drawTexture(tTexture, -this.currDisplayData.height / 2, -this.currDisplayData.width / 2, this.currDisplayData.height, this.currDisplayData.width, tResultMatrix, alpha);
|
||
}
|
||
else {
|
||
graphics.drawTexture(tTexture, -this.currDisplayData.width / 2, -this.currDisplayData.height / 2, this.currDisplayData.width, this.currDisplayData.height, tResultMatrix, alpha);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 1:
|
||
if (noUseSave) {
|
||
if (this._skinSprite == null) {
|
||
this._skinSprite = BoneSlot.createSkinMesh();
|
||
}
|
||
tSkinSprite = this._skinSprite;
|
||
}
|
||
else {
|
||
tSkinSprite = BoneSlot.createSkinMesh();
|
||
}
|
||
if (tSkinSprite == null) {
|
||
return;
|
||
}
|
||
var tIBArray;
|
||
if (this.currDisplayData.bones == null) {
|
||
var tVertices = this.currDisplayData.weights;
|
||
if (this.deformData) {
|
||
tVertices = this.deformData;
|
||
}
|
||
var tUVs;
|
||
if (this._diyTexture) {
|
||
if (!this._curDiyUV) {
|
||
this._curDiyUV = [];
|
||
}
|
||
if (this._curDiyUV.length == 0) {
|
||
this._curDiyUV = UVTools.getRelativeUV(this.currTexture.uv, this.currDisplayData.uvs, this._curDiyUV);
|
||
this._curDiyUV = UVTools.getAbsoluteUV(this._diyTexture.uv, this._curDiyUV, this._curDiyUV);
|
||
}
|
||
tUVs = this._curDiyUV;
|
||
}
|
||
else {
|
||
tUVs = this.currDisplayData.uvs;
|
||
}
|
||
this._mVerticleArr = tVertices;
|
||
var tTriangleNum = this.currDisplayData.triangles.length / 3;
|
||
tIBArray = this.currDisplayData.triangles;
|
||
if (this.deformData) {
|
||
if (!noUseSave) {
|
||
this._mVerticleArr = this.getSaveVerticle(this._mVerticleArr);
|
||
}
|
||
}
|
||
tSkinSprite.init2(tTexture, tIBArray, this._mVerticleArr, tUVs);
|
||
var tCurrentMatrix2 = this.getDisplayMatrix();
|
||
if (this._parentMatrix) {
|
||
if (tCurrentMatrix2) {
|
||
Laya.Matrix.mul(tCurrentMatrix2, this._parentMatrix, Laya.Matrix.TEMP);
|
||
var tResultMatrix2;
|
||
if (noUseSave) {
|
||
if (this._resultMatrix == null)
|
||
this._resultMatrix = new Laya.Matrix();
|
||
tResultMatrix2 = this._resultMatrix;
|
||
}
|
||
else {
|
||
tResultMatrix2 = BoneSlot._tempResultMatrix;
|
||
}
|
||
Laya.Matrix.TEMP.copyTo(tResultMatrix2);
|
||
if (!noUseSave) {
|
||
tResultMatrix2 = this.getSaveMatrix(tResultMatrix2);
|
||
}
|
||
tSkinSprite.transform = tResultMatrix2;
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
this.skinMesh(boneMatrixArray, tSkinSprite);
|
||
}
|
||
graphics.drawSkin(tSkinSprite, alpha);
|
||
break;
|
||
case 2:
|
||
if (noUseSave) {
|
||
if (this._skinSprite == null) {
|
||
this._skinSprite = BoneSlot.createSkinMesh();
|
||
}
|
||
tSkinSprite = this._skinSprite;
|
||
}
|
||
else {
|
||
tSkinSprite = BoneSlot.createSkinMesh();
|
||
}
|
||
if (tSkinSprite == null) {
|
||
return;
|
||
}
|
||
this.skinMesh(boneMatrixArray, tSkinSprite);
|
||
graphics.drawSkin(tSkinSprite, alpha);
|
||
break;
|
||
}
|
||
}
|
||
skinMesh(boneMatrixArray, skinSprite) {
|
||
var tTexture = this.currTexture;
|
||
var tBones = this.currDisplayData.bones;
|
||
var tUvs;
|
||
if (this._diyTexture) {
|
||
tTexture = this._diyTexture;
|
||
if (!this._curDiyUV) {
|
||
this._curDiyUV = [];
|
||
}
|
||
if (this._curDiyUV.length == 0) {
|
||
this._curDiyUV = UVTools.getRelativeUV(this.currTexture.uv, this.currDisplayData.uvs, this._curDiyUV);
|
||
this._curDiyUV = UVTools.getAbsoluteUV(this._diyTexture.uv, this._curDiyUV, this._curDiyUV);
|
||
}
|
||
tUvs = this._curDiyUV;
|
||
}
|
||
else {
|
||
tUvs = this.currDisplayData.uvs;
|
||
}
|
||
var tWeights = this.currDisplayData.weights;
|
||
var tTriangles = this.currDisplayData.triangles;
|
||
var tIBArray;
|
||
var tRx = 0;
|
||
var tRy = 0;
|
||
var nn = 0;
|
||
var tMatrix;
|
||
var tX;
|
||
var tY;
|
||
var tB = 0;
|
||
var tWeight = 0;
|
||
var tVertices;
|
||
var i = 0, n = 0;
|
||
BoneSlot._tempVerticleArr.length = 0;
|
||
tVertices = BoneSlot._tempVerticleArr;
|
||
if (this.deformData && this.deformData.length > 0) {
|
||
var f = 0;
|
||
for (i = 0, n = tBones.length; i < n;) {
|
||
nn = tBones[i++] + i;
|
||
tRx = 0, tRy = 0;
|
||
for (; i < nn; i++) {
|
||
tMatrix = boneMatrixArray[tBones[i]];
|
||
tX = tWeights[tB] + this.deformData[f++];
|
||
tY = tWeights[tB + 1] + this.deformData[f++];
|
||
tWeight = tWeights[tB + 2];
|
||
tRx += (tX * tMatrix.a + tY * tMatrix.c + tMatrix.tx) * tWeight;
|
||
tRy += (tX * tMatrix.b + tY * tMatrix.d + tMatrix.ty) * tWeight;
|
||
tB += 3;
|
||
}
|
||
tVertices.push(tRx, tRy);
|
||
}
|
||
}
|
||
else {
|
||
for (i = 0, n = tBones.length; i < n;) {
|
||
nn = tBones[i++] + i;
|
||
tRx = 0, tRy = 0;
|
||
for (; i < nn; i++) {
|
||
tMatrix = boneMatrixArray[tBones[i]];
|
||
tX = tWeights[tB];
|
||
tY = tWeights[tB + 1];
|
||
tWeight = tWeights[tB + 2];
|
||
tRx += (tX * tMatrix.a + tY * tMatrix.c + tMatrix.tx) * tWeight;
|
||
tRy += (tX * tMatrix.b + tY * tMatrix.d + tMatrix.ty) * tWeight;
|
||
tB += 3;
|
||
}
|
||
tVertices.push(tRx, tRy);
|
||
}
|
||
}
|
||
this._mVerticleArr = tVertices;
|
||
tIBArray = tTriangles;
|
||
this._mVerticleArr = this.getSaveVerticle(this._mVerticleArr);
|
||
skinSprite.init2(tTexture, tIBArray, this._mVerticleArr, tUvs);
|
||
}
|
||
drawBonePoint(graphics) {
|
||
if (graphics && this._parentMatrix) {
|
||
graphics.drawCircle(this._parentMatrix.tx, this._parentMatrix.ty, 5, "#ff0000");
|
||
}
|
||
}
|
||
getDisplayMatrix() {
|
||
if (this.currDisplayData) {
|
||
return this.currDisplayData.transform.getMatrix();
|
||
}
|
||
return null;
|
||
}
|
||
getMatrix() {
|
||
return this._resultMatrix;
|
||
}
|
||
copy() {
|
||
var tBoneSlot = new BoneSlot();
|
||
tBoneSlot.type = "copy";
|
||
tBoneSlot.name = this.name;
|
||
tBoneSlot.attachmentName = this.attachmentName;
|
||
tBoneSlot.srcDisplayIndex = this.srcDisplayIndex;
|
||
tBoneSlot.parent = this.parent;
|
||
tBoneSlot.displayIndex = this.displayIndex;
|
||
tBoneSlot.templet = this.templet;
|
||
tBoneSlot.currSlotData = this.currSlotData;
|
||
tBoneSlot.currTexture = this.currTexture;
|
||
tBoneSlot.currDisplayData = this.currDisplayData;
|
||
return tBoneSlot;
|
||
}
|
||
}
|
||
BoneSlot._tempMatrix = new Laya.Matrix();
|
||
BoneSlot._tempResultMatrix = new Laya.Matrix();
|
||
BoneSlot.useSameMatrixAndVerticle = true;
|
||
BoneSlot._tempVerticleArr = [];
|
||
|
||
class DeformAniData {
|
||
constructor() {
|
||
this.deformSlotDataList = [];
|
||
}
|
||
}
|
||
|
||
class DeformSlotData {
|
||
constructor() {
|
||
this.deformSlotDisplayList = [];
|
||
}
|
||
}
|
||
|
||
class DeformSlotDisplayData {
|
||
constructor() {
|
||
this.slotIndex = -1;
|
||
this.timeList = [];
|
||
this.vectices = [];
|
||
this.tweenKeyList = [];
|
||
this.frameIndex = 0;
|
||
}
|
||
binarySearch1(values, target) {
|
||
var low = 0;
|
||
var high = values.length - 2;
|
||
if (high == 0)
|
||
return 1;
|
||
var current = high >>> 1;
|
||
while (true) {
|
||
if (values[Math.floor(current + 1)] <= target)
|
||
low = current + 1;
|
||
else
|
||
high = current;
|
||
if (low == high)
|
||
return low + 1;
|
||
current = (low + high) >>> 1;
|
||
}
|
||
return 0;
|
||
}
|
||
apply(time, boneSlot, alpha = 1) {
|
||
time += 0.05;
|
||
if (this.timeList.length <= 0) {
|
||
return;
|
||
}
|
||
var i = 0;
|
||
var tTime = this.timeList[0];
|
||
if (time < tTime) {
|
||
return;
|
||
}
|
||
var tVertexCount = this.vectices[0].length;
|
||
var tVertices = [];
|
||
var tFrameIndex = this.binarySearch1(this.timeList, time);
|
||
this.frameIndex = tFrameIndex;
|
||
if (time >= this.timeList[this.timeList.length - 1]) {
|
||
var lastVertices = this.vectices[this.vectices.length - 1];
|
||
if (alpha < 1) {
|
||
for (i = 0; i < tVertexCount; i++) {
|
||
tVertices[i] += (lastVertices[i] - tVertices[i]) * alpha;
|
||
}
|
||
}
|
||
else {
|
||
for (i = 0; i < tVertexCount; i++) {
|
||
tVertices[i] = lastVertices[i];
|
||
}
|
||
}
|
||
this.deformData = tVertices;
|
||
return;
|
||
}
|
||
var tPrevVertices = this.vectices[this.frameIndex - 1];
|
||
var tNextVertices = this.vectices[this.frameIndex];
|
||
var tPreFrameTime = this.timeList[this.frameIndex - 1];
|
||
var tFrameTime = this.timeList[this.frameIndex];
|
||
if (this.tweenKeyList[tFrameIndex - 1]) {
|
||
alpha = (time - tPreFrameTime) / (tFrameTime - tPreFrameTime);
|
||
}
|
||
else {
|
||
alpha = 0;
|
||
}
|
||
var tPrev;
|
||
for (i = 0; i < tVertexCount; i++) {
|
||
tPrev = tPrevVertices[i];
|
||
tVertices[i] = tPrev + (tNextVertices[i] - tPrev) * alpha;
|
||
}
|
||
this.deformData = tVertices;
|
||
}
|
||
}
|
||
|
||
class DrawOrderData {
|
||
constructor() {
|
||
this.drawOrder = [];
|
||
}
|
||
}
|
||
|
||
class EventData {
|
||
constructor() {
|
||
}
|
||
}
|
||
|
||
class IkConstraint {
|
||
constructor(data, bones) {
|
||
this.isSpine = true;
|
||
this.isDebug = false;
|
||
this._targetBone = bones[data.targetBoneIndex];
|
||
this.isSpine = data.isSpine;
|
||
if (this._bones == null)
|
||
this._bones = [];
|
||
this._bones.length = 0;
|
||
for (var i = 0, n = data.boneIndexs.length; i < n; i++) {
|
||
this._bones.push(bones[data.boneIndexs[i]]);
|
||
}
|
||
this.name = data.name;
|
||
this.mix = data.mix;
|
||
this.bendDirection = data.bendDirection;
|
||
}
|
||
apply() {
|
||
switch (this._bones.length) {
|
||
case 1:
|
||
this._applyIk1(this._bones[0], this._targetBone.resultMatrix.tx, this._targetBone.resultMatrix.ty, this.mix);
|
||
break;
|
||
case 2:
|
||
if (this.isSpine) {
|
||
this._applyIk2(this._bones[0], this._bones[1], this._targetBone.resultMatrix.tx, this._targetBone.resultMatrix.ty, this.bendDirection, this.mix);
|
||
}
|
||
else {
|
||
this._applyIk3(this._bones[0], this._bones[1], this._targetBone.resultMatrix.tx, this._targetBone.resultMatrix.ty, this.bendDirection, this.mix);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
_applyIk1(bone, targetX, targetY, alpha) {
|
||
var pp = bone.parentBone;
|
||
var id = 1 / (pp.resultMatrix.a * pp.resultMatrix.d - pp.resultMatrix.b * pp.resultMatrix.c);
|
||
var x = targetX - pp.resultMatrix.tx;
|
||
var y = targetY - pp.resultMatrix.ty;
|
||
var tx = (x * pp.resultMatrix.d - y * pp.resultMatrix.c) * id - bone.transform.x;
|
||
var ty = (y * pp.resultMatrix.a - x * pp.resultMatrix.b) * id - bone.transform.y;
|
||
var rotationIK = Math.atan2(ty, tx) * IkConstraint.radDeg - 0 - bone.transform.skX;
|
||
if (bone.transform.scX < 0)
|
||
rotationIK += 180;
|
||
if (rotationIK > 180)
|
||
rotationIK -= 360;
|
||
else if (rotationIK < -180)
|
||
rotationIK += 360;
|
||
bone.transform.skX = bone.transform.skY = bone.transform.skX + rotationIK * alpha;
|
||
bone.update();
|
||
}
|
||
updatePos(x, y) {
|
||
if (this._sp) {
|
||
this._sp.pos(x, y);
|
||
}
|
||
}
|
||
_applyIk2(parent, child, targetX, targetY, bendDir, alpha) {
|
||
if (alpha == 0) {
|
||
return;
|
||
}
|
||
var px = parent.resultTransform.x, py = parent.resultTransform.y;
|
||
var psx = parent.transform.scX, psy = parent.transform.scY;
|
||
var csx = child.transform.scX;
|
||
var os1, os2, s2;
|
||
if (psx < 0) {
|
||
psx = -psx;
|
||
os1 = 180;
|
||
s2 = -1;
|
||
}
|
||
else {
|
||
os1 = 0;
|
||
s2 = 1;
|
||
}
|
||
if (psy < 0) {
|
||
psy = -psy;
|
||
s2 = -s2;
|
||
}
|
||
if (csx < 0) {
|
||
csx = -csx;
|
||
os2 = 180;
|
||
}
|
||
else {
|
||
os2 = 0;
|
||
}
|
||
var cx = child.resultTransform.x, cy, cwx, cwy;
|
||
var a = parent.resultMatrix.a, b = parent.resultMatrix.c;
|
||
var c = parent.resultMatrix.b, d = parent.resultMatrix.d;
|
||
var u = Math.abs(psx - psy) <= 0.0001;
|
||
if (!u) {
|
||
cy = 0;
|
||
cwx = a * cx + parent.resultMatrix.tx;
|
||
cwy = c * cx + parent.resultMatrix.ty;
|
||
}
|
||
else {
|
||
cy = child.resultTransform.y;
|
||
cwx = a * cx + b * cy + parent.resultMatrix.tx;
|
||
cwy = c * cx + d * cy + parent.resultMatrix.ty;
|
||
}
|
||
if (this.isDebug) {
|
||
if (!this._sp) {
|
||
this._sp = new Laya.Sprite();
|
||
Laya.ILaya.stage.addChild(this._sp);
|
||
}
|
||
this._sp.graphics.clear();
|
||
this._sp.graphics.drawCircle(targetX, targetY, 15, "#ffff00");
|
||
this._sp.graphics.drawCircle(cwx, cwy, 15, "#ff00ff");
|
||
}
|
||
parent.setRotation(Math.atan2(cwy - parent.resultMatrix.ty, cwx - parent.resultMatrix.tx));
|
||
var pp = parent.parentBone;
|
||
a = pp.resultMatrix.a;
|
||
b = pp.resultMatrix.c;
|
||
c = pp.resultMatrix.b;
|
||
d = pp.resultMatrix.d;
|
||
var id = 1 / (a * d - b * c);
|
||
var x = targetX - pp.resultMatrix.tx, y = targetY - pp.resultMatrix.ty;
|
||
var tx = (x * d - y * b) * id - px;
|
||
var ty = (y * a - x * c) * id - py;
|
||
x = cwx - pp.resultMatrix.tx;
|
||
y = cwy - pp.resultMatrix.ty;
|
||
var dx = (x * d - y * b) * id - px;
|
||
var dy = (y * a - x * c) * id - py;
|
||
var l1 = Math.sqrt(dx * dx + dy * dy);
|
||
var l2 = child.length * csx;
|
||
var a1, a2;
|
||
if (u) {
|
||
l2 *= psx;
|
||
var cos = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2);
|
||
if (cos < -1)
|
||
cos = -1;
|
||
else if (cos > 1)
|
||
cos = 1;
|
||
a2 = Math.acos(cos) * bendDir;
|
||
a = l1 + l2 * cos;
|
||
b = l2 * Math.sin(a2);
|
||
a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
|
||
}
|
||
else {
|
||
a = psx * l2;
|
||
b = psy * l2;
|
||
var aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = Math.atan2(ty, tx);
|
||
c = bb * l1 * l1 + aa * dd - aa * bb;
|
||
var c1 = -2 * bb * l1, c2 = bb - aa;
|
||
d = c1 * c1 - 4 * c2 * c;
|
||
if (d > 0) {
|
||
var q = Math.sqrt(d);
|
||
if (c1 < 0)
|
||
q = -q;
|
||
q = -(c1 + q) / 2;
|
||
var r0 = q / c2, r1 = c / q;
|
||
var r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
|
||
if (r * r <= dd) {
|
||
y = Math.sqrt(dd - r * r) * bendDir;
|
||
a1 = ta - Math.atan2(y, r);
|
||
a2 = Math.atan2(y / psy, (r - l1) / psx);
|
||
}
|
||
}
|
||
var minAngle = 0, minDist = Number.MAX_VALUE, minX = 0, minY = 0;
|
||
var maxAngle = 0, maxDist = 0, maxX = 0, maxY = 0;
|
||
x = l1 + a;
|
||
d = x * x;
|
||
if (d > maxDist) {
|
||
maxAngle = 0;
|
||
maxDist = d;
|
||
maxX = x;
|
||
}
|
||
x = l1 - a;
|
||
d = x * x;
|
||
if (d < minDist) {
|
||
minAngle = Math.PI;
|
||
minDist = d;
|
||
minX = x;
|
||
}
|
||
var angle = Math.acos(-a * l1 / (aa - bb));
|
||
x = a * Math.cos(angle) + l1;
|
||
y = b * Math.sin(angle);
|
||
d = x * x + y * y;
|
||
if (d < minDist) {
|
||
minAngle = angle;
|
||
minDist = d;
|
||
minX = x;
|
||
minY = y;
|
||
}
|
||
if (d > maxDist) {
|
||
maxAngle = angle;
|
||
maxDist = d;
|
||
maxX = x;
|
||
maxY = y;
|
||
}
|
||
if (dd <= (minDist + maxDist) / 2) {
|
||
a1 = ta - Math.atan2(minY * bendDir, minX);
|
||
a2 = minAngle * bendDir;
|
||
}
|
||
else {
|
||
a1 = ta - Math.atan2(maxY * bendDir, maxX);
|
||
a2 = maxAngle * bendDir;
|
||
}
|
||
}
|
||
var os = Math.atan2(cy, cx) * s2;
|
||
var rotation = parent.resultTransform.skX;
|
||
a1 = (a1 - os) * IkConstraint.radDeg + os1 - rotation;
|
||
if (a1 > 180)
|
||
a1 -= 360;
|
||
else if (a1 < -180)
|
||
a1 += 360;
|
||
parent.resultTransform.x = px;
|
||
parent.resultTransform.y = py;
|
||
parent.resultTransform.skX = parent.resultTransform.skY = rotation + a1 * alpha;
|
||
rotation = child.resultTransform.skX;
|
||
rotation = rotation % 360;
|
||
a2 = ((a2 + os) * IkConstraint.radDeg - 0) * s2 + os2 - rotation;
|
||
if (a2 > 180)
|
||
a2 -= 360;
|
||
else if (a2 < -180)
|
||
a2 += 360;
|
||
child.resultTransform.x = cx;
|
||
child.resultTransform.y = cy;
|
||
child.resultTransform.skX = child.resultTransform.skY = child.resultTransform.skY + a2 * alpha;
|
||
parent.update();
|
||
}
|
||
_applyIk3(parent, child, targetX, targetY, bendDir, alpha) {
|
||
if (alpha == 0) {
|
||
return;
|
||
}
|
||
var cwx, cwy;
|
||
const x = child.resultMatrix.a * child.length;
|
||
const y = child.resultMatrix.b * child.length;
|
||
const lLL = x * x + y * y;
|
||
const lL = Math.sqrt(lLL);
|
||
var parentX = parent.resultMatrix.tx;
|
||
var parentY = parent.resultMatrix.ty;
|
||
var childX = child.resultMatrix.tx;
|
||
var childY = child.resultMatrix.ty;
|
||
var dX = childX - parentX;
|
||
var dY = childY - parentY;
|
||
const lPP = dX * dX + dY * dY;
|
||
const lP = Math.sqrt(lPP);
|
||
dX = targetX - parent.resultMatrix.tx;
|
||
dY = targetY - parent.resultMatrix.ty;
|
||
const lTT = dX * dX + dY * dY;
|
||
const lT = Math.sqrt(lTT);
|
||
if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) {
|
||
var rate;
|
||
if (lL + lP <= lT) {
|
||
rate = 1;
|
||
}
|
||
else {
|
||
rate = -1;
|
||
}
|
||
childX = parentX + rate * (targetX - parentX) * lP / lT;
|
||
childY = parentY + rate * (targetY - parentY) * lP / lT;
|
||
}
|
||
else {
|
||
const h = (lPP - lLL + lTT) / (2 * lTT);
|
||
const r = Math.sqrt(lPP - h * h * lTT) / lT;
|
||
const hX = parentX + (dX * h);
|
||
const hY = parentY + (dY * h);
|
||
const rX = -dY * r;
|
||
const rY = dX * r;
|
||
if (bendDir > 0) {
|
||
childX = hX - rX;
|
||
childY = hY - rY;
|
||
}
|
||
else {
|
||
childX = hX + rX;
|
||
childY = hY + rY;
|
||
}
|
||
}
|
||
cwx = childX;
|
||
cwy = childY;
|
||
if (this.isDebug) {
|
||
if (!this._sp) {
|
||
this._sp = new Laya.Sprite();
|
||
Laya.ILaya.stage.addChild(this._sp);
|
||
}
|
||
this._sp.graphics.clear();
|
||
this._sp.graphics.drawCircle(parentX, parentY, 15, "#ff00ff");
|
||
this._sp.graphics.drawCircle(targetX, targetY, 15, "#ffff00");
|
||
this._sp.graphics.drawCircle(cwx, cwy, 15, "#ff00ff");
|
||
}
|
||
var pRotation;
|
||
pRotation = Math.atan2(cwy - parent.resultMatrix.ty, cwx - parent.resultMatrix.tx);
|
||
parent.setRotation(pRotation);
|
||
var pTarMatrix;
|
||
pTarMatrix = IkConstraint._tempMatrix;
|
||
pTarMatrix.identity();
|
||
pTarMatrix.rotate(pRotation);
|
||
pTarMatrix.scale(parent.resultMatrix.getScaleX(), parent.resultMatrix.getScaleY());
|
||
pTarMatrix.translate(parent.resultMatrix.tx, parent.resultMatrix.ty);
|
||
pTarMatrix.copyTo(parent.resultMatrix);
|
||
parent.updateChild();
|
||
var childRotation;
|
||
childRotation = Math.atan2(targetY - cwy, targetX - cwx);
|
||
child.setRotation(childRotation);
|
||
var childTarMatrix;
|
||
childTarMatrix = IkConstraint._tempMatrix;
|
||
childTarMatrix.identity();
|
||
childTarMatrix.rotate(childRotation);
|
||
childTarMatrix.scale(child.resultMatrix.getScaleX(), child.resultMatrix.getScaleY());
|
||
childTarMatrix.translate(cwx, cwy);
|
||
pTarMatrix.copyTo(child.resultMatrix);
|
||
child.updateChild();
|
||
}
|
||
}
|
||
IkConstraint.radDeg = 180 / Math.PI;
|
||
IkConstraint.degRad = Math.PI / 180;
|
||
IkConstraint._tempMatrix = new Laya.Matrix();
|
||
|
||
class IkConstraintData {
|
||
constructor() {
|
||
this.boneNames = [];
|
||
this.bendDirection = 1;
|
||
this.mix = 1;
|
||
this.isSpine = true;
|
||
this.targetBoneIndex = -1;
|
||
this.boneIndexs = [];
|
||
}
|
||
}
|
||
|
||
class PathConstraint {
|
||
constructor(data, bones) {
|
||
this._debugKey = false;
|
||
this._segments = [];
|
||
this._curves = [];
|
||
this.data = data;
|
||
this.position = data.position;
|
||
this.spacing = data.spacing;
|
||
this.rotateMix = data.rotateMix;
|
||
this.translateMix = data.translateMix;
|
||
this.bones = [];
|
||
var tBoneIds = this.data.bones;
|
||
for (var i = 0, n = tBoneIds.length; i < n; i++) {
|
||
this.bones.push(bones[tBoneIds[i]]);
|
||
}
|
||
}
|
||
apply(boneList, graphics) {
|
||
if (!this.target)
|
||
return;
|
||
var tTranslateMix = this.translateMix;
|
||
var tRotateMix = this.translateMix;
|
||
var tRotate = tRotateMix > 0;
|
||
var tSpacingMode = this.data.spacingMode;
|
||
var tLengthSpacing = tSpacingMode == "length";
|
||
var tRotateMode = this.data.rotateMode;
|
||
var tTangents = tRotateMode == "tangent";
|
||
var tScale = tRotateMode == "chainScale";
|
||
var lengths = [];
|
||
var boneCount = this.bones.length;
|
||
var spacesCount = tTangents ? boneCount : boneCount + 1;
|
||
var spaces = [];
|
||
this._spaces = spaces;
|
||
spaces[0] = this.position;
|
||
var spacing = this.spacing;
|
||
if (tScale || tLengthSpacing) {
|
||
for (var i = 0, n = spacesCount - 1; i < n;) {
|
||
var bone = this.bones[i];
|
||
var length = bone.length;
|
||
var x = length * bone.resultMatrix.a;
|
||
var y = length * bone.resultMatrix.b;
|
||
length = Math.sqrt(x * x + y * y);
|
||
if (tScale)
|
||
lengths[i] = length;
|
||
spaces[++i] = tLengthSpacing ? Math.max(0, length + spacing) : spacing;
|
||
}
|
||
}
|
||
else {
|
||
for (i = 1; i < spacesCount; i++) {
|
||
spaces[i] = spacing;
|
||
}
|
||
}
|
||
var positions = this.computeWorldPositions(this.target, boneList, graphics, spacesCount, tTangents, this.data.positionMode == "percent", tSpacingMode == "percent");
|
||
if (this._debugKey) {
|
||
for (i = 0; i < positions.length; i++) {
|
||
graphics.drawCircle(positions[i++], positions[i++], 5, "#00ff00");
|
||
}
|
||
var tLinePos = [];
|
||
for (i = 0; i < positions.length; i++) {
|
||
tLinePos.push(positions[i++], positions[i++]);
|
||
}
|
||
graphics.drawLines(0, 0, tLinePos, "#ff0000");
|
||
}
|
||
var boneX = positions[0];
|
||
var boneY = positions[1];
|
||
var offsetRotation = this.data.offsetRotation;
|
||
var tip = tRotateMode == "chain" && offsetRotation == 0;
|
||
var p;
|
||
for (i = 0, p = 3; i < boneCount; i++, p += 3) {
|
||
bone = this.bones[i];
|
||
bone.resultMatrix.tx += (boneX - bone.resultMatrix.tx) * tTranslateMix;
|
||
bone.resultMatrix.ty += (boneY - bone.resultMatrix.ty) * tTranslateMix;
|
||
x = positions[p];
|
||
y = positions[p + 1];
|
||
var dx = x - boneX, dy = y - boneY;
|
||
if (tScale) {
|
||
length = lengths[i];
|
||
if (length != 0) {
|
||
var s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * tRotateMix + 1;
|
||
bone.resultMatrix.a *= s;
|
||
bone.resultMatrix.c *= s;
|
||
}
|
||
}
|
||
boneX = x;
|
||
boneY = y;
|
||
if (tRotate) {
|
||
var a = bone.resultMatrix.a;
|
||
var b = bone.resultMatrix.c;
|
||
var c = bone.resultMatrix.b;
|
||
var d = bone.resultMatrix.d;
|
||
var r;
|
||
var cos;
|
||
var sin;
|
||
if (tTangents) {
|
||
r = positions[p - 1];
|
||
}
|
||
else if (spaces[i + 1] == 0) {
|
||
r = positions[p + 2];
|
||
}
|
||
else {
|
||
r = Math.atan2(dy, dx);
|
||
}
|
||
r -= Math.atan2(c, a) - offsetRotation / 180 * Math.PI;
|
||
if (tip) {
|
||
cos = Math.cos(r);
|
||
sin = Math.sin(r);
|
||
length = bone.length;
|
||
boneX += (length * (cos * a - sin * c) - dx) * tRotateMix;
|
||
boneY += (length * (sin * a + cos * c) - dy) * tRotateMix;
|
||
}
|
||
if (r > Math.PI) {
|
||
r -= (Math.PI * 2);
|
||
}
|
||
else if (r < -Math.PI) {
|
||
r += (Math.PI * 2);
|
||
}
|
||
r *= tRotateMix;
|
||
cos = Math.cos(r);
|
||
sin = Math.sin(r);
|
||
bone.resultMatrix.a = cos * a - sin * c;
|
||
bone.resultMatrix.c = cos * b - sin * d;
|
||
bone.resultMatrix.b = sin * a + cos * c;
|
||
bone.resultMatrix.d = sin * b + cos * d;
|
||
}
|
||
}
|
||
}
|
||
computeWorldVertices2(boneSlot, boneList, start, count, worldVertices, offset) {
|
||
var tBones = boneSlot.currDisplayData.bones;
|
||
var tWeights = boneSlot.currDisplayData.weights;
|
||
var tTriangles = boneSlot.currDisplayData.triangles;
|
||
var tMatrix;
|
||
var i = 0;
|
||
var v = 0;
|
||
var skip = 0;
|
||
var n = 0;
|
||
var w = 0;
|
||
var b = 0;
|
||
var wx = 0;
|
||
var wy = 0;
|
||
var vx = 0;
|
||
var vy = 0;
|
||
var bone;
|
||
var len;
|
||
if (tBones == null) {
|
||
if (!tTriangles)
|
||
tTriangles = tWeights;
|
||
if (boneSlot.deformData)
|
||
tTriangles = boneSlot.deformData;
|
||
var parentName;
|
||
parentName = boneSlot.parent;
|
||
if (boneList) {
|
||
len = boneList.length;
|
||
for (i = 0; i < len; i++) {
|
||
if (boneList[i].name == parentName) {
|
||
bone = boneList[i];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
var tBoneMt;
|
||
if (bone) {
|
||
tBoneMt = bone.resultMatrix;
|
||
}
|
||
if (!tBoneMt)
|
||
tBoneMt = PathConstraint._tempMt;
|
||
var x = tBoneMt.tx;
|
||
var y = tBoneMt.ty;
|
||
var a = tBoneMt.a, bb = tBoneMt.b, c = tBoneMt.c, d = tBoneMt.d;
|
||
if (bone)
|
||
d *= bone.d;
|
||
for (v = start, w = offset; w < count; v += 2, w += 2) {
|
||
vx = tTriangles[v], vy = tTriangles[v + 1];
|
||
worldVertices[w] = vx * a + vy * bb + x;
|
||
worldVertices[w + 1] = -(vx * c + vy * d + y);
|
||
}
|
||
return;
|
||
}
|
||
for (i = 0; i < start; i += 2) {
|
||
n = tBones[v];
|
||
v += n + 1;
|
||
skip += n;
|
||
}
|
||
var skeletonBones = boneList;
|
||
for (w = offset, b = skip * 3; w < count; w += 2) {
|
||
wx = 0, wy = 0;
|
||
n = tBones[v++];
|
||
n += v;
|
||
for (; v < n; v++, b += 3) {
|
||
tMatrix = skeletonBones[tBones[v]].resultMatrix;
|
||
vx = tWeights[b];
|
||
vy = tWeights[b + 1];
|
||
var weight = tWeights[b + 2];
|
||
wx += (vx * tMatrix.a + vy * tMatrix.c + tMatrix.tx) * weight;
|
||
wy += (vx * tMatrix.b + vy * tMatrix.d + tMatrix.ty) * weight;
|
||
}
|
||
worldVertices[w] = wx;
|
||
worldVertices[w + 1] = wy;
|
||
}
|
||
}
|
||
computeWorldPositions(boneSlot, boneList, graphics, spacesCount, tangents, percentPosition, percentSpacing) {
|
||
var tBones = boneSlot.currDisplayData.bones;
|
||
var tWeights = boneSlot.currDisplayData.weights;
|
||
var tTriangles = boneSlot.currDisplayData.triangles;
|
||
var tVertices = [];
|
||
var i = 0;
|
||
var verticesLength = boneSlot.currDisplayData.verLen;
|
||
var position = this.position;
|
||
var spaces = this._spaces;
|
||
var world = [];
|
||
var out = [];
|
||
var curveCount = verticesLength / 6;
|
||
var prevCurve = -1;
|
||
var pathLength;
|
||
var o, curve;
|
||
var p;
|
||
var space;
|
||
var prev;
|
||
var length;
|
||
{
|
||
curveCount--;
|
||
verticesLength -= 4;
|
||
this.computeWorldVertices2(boneSlot, boneList, 2, verticesLength, tVertices, 0);
|
||
if (this._debugKey) {
|
||
for (i = 0; i < tVertices.length;) {
|
||
graphics.drawCircle(tVertices[i++], tVertices[i++], 10, "#ff0000");
|
||
}
|
||
}
|
||
world = tVertices;
|
||
}
|
||
this._curves.length = curveCount;
|
||
var curves = this._curves;
|
||
pathLength = 0;
|
||
var x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
|
||
var tmpx, tmpy, dddfx, dddfy, ddfx, ddfy, dfx, dfy;
|
||
var w;
|
||
for (i = 0, w = 2; i < curveCount; i++, w += 6) {
|
||
cx1 = world[w];
|
||
cy1 = world[w + 1];
|
||
cx2 = world[w + 2];
|
||
cy2 = world[w + 3];
|
||
x2 = world[w + 4];
|
||
y2 = world[w + 5];
|
||
tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;
|
||
tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;
|
||
dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;
|
||
dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;
|
||
ddfx = tmpx * 2 + dddfx;
|
||
ddfy = tmpy * 2 + dddfy;
|
||
dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;
|
||
dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;
|
||
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
dfx += ddfx;
|
||
dfy += ddfy;
|
||
ddfx += dddfx;
|
||
ddfy += dddfy;
|
||
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
dfx += ddfx;
|
||
dfy += ddfy;
|
||
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
dfx += ddfx + dddfx;
|
||
dfy += ddfy + dddfy;
|
||
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
curves[i] = pathLength;
|
||
x1 = x2;
|
||
y1 = y2;
|
||
}
|
||
if (percentPosition)
|
||
position *= pathLength;
|
||
if (percentSpacing) {
|
||
for (i = 0; i < spacesCount; i++)
|
||
spaces[i] *= pathLength;
|
||
}
|
||
var segments = this._segments;
|
||
var curveLength = 0;
|
||
var segment;
|
||
for (i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
|
||
space = spaces[i];
|
||
position += space;
|
||
p = position;
|
||
if (p < 0) {
|
||
this.addBeforePosition(p, world, 0, out, o);
|
||
continue;
|
||
}
|
||
else if (p > pathLength) {
|
||
this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
|
||
continue;
|
||
}
|
||
for (;; curve++) {
|
||
length = curves[curve];
|
||
if (p > length)
|
||
continue;
|
||
if (curve == 0)
|
||
p /= length;
|
||
else {
|
||
prev = curves[curve - 1];
|
||
p = (p - prev) / (length - prev);
|
||
}
|
||
break;
|
||
}
|
||
if (curve != prevCurve) {
|
||
prevCurve = curve;
|
||
var ii = curve * 6;
|
||
x1 = world[ii];
|
||
y1 = world[ii + 1];
|
||
cx1 = world[ii + 2];
|
||
cy1 = world[ii + 3];
|
||
cx2 = world[ii + 4];
|
||
cy2 = world[ii + 5];
|
||
x2 = world[ii + 6];
|
||
y2 = world[ii + 7];
|
||
tmpx = (x1 - cx1 * 2 + cx2) * 0.03;
|
||
tmpy = (y1 - cy1 * 2 + cy2) * 0.03;
|
||
dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;
|
||
dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;
|
||
ddfx = tmpx * 2 + dddfx;
|
||
ddfy = tmpy * 2 + dddfy;
|
||
dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;
|
||
dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;
|
||
curveLength = Math.sqrt(dfx * dfx + dfy * dfy);
|
||
segments[0] = curveLength;
|
||
for (ii = 1; ii < 8; ii++) {
|
||
dfx += ddfx;
|
||
dfy += ddfy;
|
||
ddfx += dddfx;
|
||
ddfy += dddfy;
|
||
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
segments[ii] = curveLength;
|
||
}
|
||
dfx += ddfx;
|
||
dfy += ddfy;
|
||
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
segments[8] = curveLength;
|
||
dfx += ddfx + dddfx;
|
||
dfy += ddfy + dddfy;
|
||
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
|
||
segments[9] = curveLength;
|
||
segment = 0;
|
||
}
|
||
p *= curveLength;
|
||
for (;; segment++) {
|
||
length = segments[segment];
|
||
if (p > length)
|
||
continue;
|
||
if (segment == 0)
|
||
p /= length;
|
||
else {
|
||
prev = segments[segment - 1];
|
||
p = segment + (p - prev) / (length - prev);
|
||
}
|
||
break;
|
||
}
|
||
this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
|
||
}
|
||
return out;
|
||
}
|
||
addBeforePosition(p, temp, i, out, o) {
|
||
var x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
|
||
out[o] = x1 + p * Math.cos(r);
|
||
out[o + 1] = y1 + p * Math.sin(r);
|
||
out[o + 2] = r;
|
||
}
|
||
addAfterPosition(p, temp, i, out, o) {
|
||
var x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
|
||
out[o] = x1 + p * Math.cos(r);
|
||
out[o + 1] = y1 + p * Math.sin(r);
|
||
out[o + 2] = r;
|
||
}
|
||
addCurvePosition(p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) {
|
||
if (p == 0)
|
||
p = 0.0001;
|
||
var tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
|
||
var ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
|
||
var x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
|
||
out[o] = x;
|
||
out[o + 1] = y;
|
||
if (tangents) {
|
||
out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
|
||
}
|
||
else {
|
||
out[o + 2] = 0;
|
||
}
|
||
}
|
||
}
|
||
PathConstraint.BEFORE = -2;
|
||
PathConstraint.AFTER = -3;
|
||
PathConstraint._tempMt = new Laya.Matrix();
|
||
|
||
class PathConstraintData {
|
||
constructor() {
|
||
this.bones = [];
|
||
}
|
||
}
|
||
|
||
class TfConstraint {
|
||
constructor(data, bones) {
|
||
this._temp = [];
|
||
this._data = data;
|
||
if (this._bones == null) {
|
||
this._bones = [];
|
||
}
|
||
this.target = bones[data.targetIndex];
|
||
var j, n;
|
||
for (j = 0, n = data.boneIndexs.length; j < n; j++) {
|
||
this._bones.push(bones[data.boneIndexs[j]]);
|
||
}
|
||
this.rotateMix = data.rotateMix;
|
||
this.translateMix = data.translateMix;
|
||
this.scaleMix = data.scaleMix;
|
||
this.shearMix = data.shearMix;
|
||
}
|
||
apply() {
|
||
var tTfBone;
|
||
var ta = this.target.resultMatrix.a, tb = this.target.resultMatrix.b, tc = this.target.resultMatrix.c, td = this.target.resultMatrix.d;
|
||
for (var j = 0, n = this._bones.length; j < n; j++) {
|
||
tTfBone = this._bones[j];
|
||
if (this.rotateMix > 0) {
|
||
var a = tTfBone.resultMatrix.a, b = tTfBone.resultMatrix.b, c = tTfBone.resultMatrix.c, d = tTfBone.resultMatrix.d;
|
||
var r = Math.atan2(tc, ta) - Math.atan2(c, a) + this._data.offsetRotation * Math.PI / 180;
|
||
if (r > Math.PI)
|
||
r -= Math.PI * 2;
|
||
else if (r < -Math.PI)
|
||
r += Math.PI * 2;
|
||
r *= this.rotateMix;
|
||
var cos = Math.cos(r), sin = Math.sin(r);
|
||
tTfBone.resultMatrix.a = cos * a - sin * c;
|
||
tTfBone.resultMatrix.b = cos * b - sin * d;
|
||
tTfBone.resultMatrix.c = sin * a + cos * c;
|
||
tTfBone.resultMatrix.d = sin * b + cos * d;
|
||
}
|
||
if (this.translateMix) {
|
||
this._temp[0] = this._data.offsetX;
|
||
this._temp[1] = this._data.offsetY;
|
||
this.target.localToWorld(this._temp);
|
||
tTfBone.resultMatrix.tx += (this._temp[0] - tTfBone.resultMatrix.tx) * this.translateMix;
|
||
tTfBone.resultMatrix.ty += (this._temp[1] - tTfBone.resultMatrix.ty) * this.translateMix;
|
||
tTfBone.updateChild();
|
||
}
|
||
if (this.scaleMix > 0) {
|
||
var bs = Math.sqrt(tTfBone.resultMatrix.a * tTfBone.resultMatrix.a + tTfBone.resultMatrix.c * tTfBone.resultMatrix.c);
|
||
var ts = Math.sqrt(ta * ta + tc * tc);
|
||
var s = bs > 0.00001 ? (bs + (ts - bs + this._data.offsetScaleX) * this.scaleMix) / bs : 0;
|
||
tTfBone.resultMatrix.a *= s;
|
||
tTfBone.resultMatrix.c *= s;
|
||
bs = Math.sqrt(tTfBone.resultMatrix.b * tTfBone.resultMatrix.b + tTfBone.resultMatrix.d * tTfBone.resultMatrix.d);
|
||
ts = Math.sqrt(tb * tb + td * td);
|
||
s = bs > 0.00001 ? (bs + (ts - bs + this._data.offsetScaleY) * this.scaleMix) / bs : 0;
|
||
tTfBone.resultMatrix.b *= s;
|
||
tTfBone.resultMatrix.d *= s;
|
||
}
|
||
if (this.shearMix > 0) {
|
||
b = tTfBone.resultMatrix.b, d = tTfBone.resultMatrix.d;
|
||
var by = Math.atan2(d, b);
|
||
r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(tTfBone.resultMatrix.c, tTfBone.resultMatrix.a));
|
||
if (r > Math.PI)
|
||
r -= Math.PI * 2;
|
||
else if (r < -Math.PI)
|
||
r += Math.PI * 2;
|
||
r = by + (r + this._data.offsetShearY * Math.PI / 180) * this.shearMix;
|
||
s = Math.sqrt(b * b + d * d);
|
||
tTfBone.resultMatrix.b = Math.cos(r) * s;
|
||
tTfBone.resultMatrix.d = Math.sin(r) * s;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
class Skeleton extends Laya.Sprite {
|
||
constructor(templet = null, aniMode = 0) {
|
||
super();
|
||
this._boneMatrixArray = [];
|
||
this._lastTime = 0;
|
||
this._currAniIndex = -1;
|
||
this._pause = true;
|
||
this._aniClipIndex = -1;
|
||
this._clipIndex = -1;
|
||
this._skinIndex = 0;
|
||
this._skinName = "default";
|
||
this._aniMode = 0;
|
||
this._index = -1;
|
||
this._total = -1;
|
||
this._indexControl = false;
|
||
this._eventIndex = 0;
|
||
this._drawOrderIndex = 0;
|
||
this._drawOrder = null;
|
||
this._lastAniClipIndex = -1;
|
||
this._lastUpdateAniClipIndex = -1;
|
||
this._playAudio = true;
|
||
this._soundChannelArr = [];
|
||
if (templet)
|
||
this.init(templet, aniMode);
|
||
}
|
||
init(templet, aniMode = 0) {
|
||
var i = 0, n;
|
||
if (aniMode == 1) {
|
||
this._graphicsCache = [];
|
||
for (i = 0, n = templet.getAnimationCount(); i < n; i++) {
|
||
this._graphicsCache.push([]);
|
||
}
|
||
}
|
||
this._yReverseMatrix = templet.yReverseMatrix;
|
||
this._aniMode = aniMode;
|
||
this._templet = templet;
|
||
this._templet._addReference(1);
|
||
this._player = new AnimationPlayer();
|
||
this._player.cacheFrameRate = templet.rate;
|
||
this._player.templet = templet;
|
||
this._player.play();
|
||
this._parseSrcBoneMatrix();
|
||
this._boneList = templet.mBoneArr;
|
||
this._rootBone = templet.mRootBone;
|
||
this._aniSectionDic = templet.aniSectionDic;
|
||
if (templet.ikArr.length > 0) {
|
||
this._ikArr = [];
|
||
for (i = 0, n = templet.ikArr.length; i < n; i++) {
|
||
this._ikArr.push(new IkConstraint(templet.ikArr[i], this._boneList));
|
||
}
|
||
}
|
||
if (templet.pathArr.length > 0) {
|
||
var tPathData;
|
||
var tPathConstraint;
|
||
if (this._pathDic == null)
|
||
this._pathDic = {};
|
||
var tBoneSlot;
|
||
for (i = 0, n = templet.pathArr.length; i < n; i++) {
|
||
tPathData = templet.pathArr[i];
|
||
tPathConstraint = new PathConstraint(tPathData, this._boneList);
|
||
tBoneSlot = this._boneSlotDic[tPathData.name];
|
||
if (tBoneSlot) {
|
||
tPathConstraint = new PathConstraint(tPathData, this._boneList);
|
||
tPathConstraint.target = tBoneSlot;
|
||
}
|
||
this._pathDic[tPathData.name] = tPathConstraint;
|
||
}
|
||
}
|
||
if (templet.tfArr.length > 0) {
|
||
this._tfArr = [];
|
||
for (i = 0, n = templet.tfArr.length; i < n; i++) {
|
||
this._tfArr.push(new TfConstraint(templet.tfArr[i], this._boneList));
|
||
}
|
||
}
|
||
if (templet.skinDataArray.length > 0) {
|
||
var tSkinData = this._templet.skinDataArray[this._skinIndex];
|
||
this._skinName = tSkinData.name;
|
||
}
|
||
this._player.on(Laya.Event.PLAYED, this, this._onPlay);
|
||
this._player.on(Laya.Event.STOPPED, this, this._onStop);
|
||
this._player.on(Laya.Event.PAUSED, this, this._onPause);
|
||
}
|
||
get url() {
|
||
return this._aniPath;
|
||
}
|
||
set url(path) {
|
||
this.load(path);
|
||
}
|
||
load(path, complete = null, aniMode = 0) {
|
||
this._aniPath = path;
|
||
this._complete = complete;
|
||
this._loadAniMode = aniMode;
|
||
Laya.ILaya.loader.load([{ url: path, type: Laya.ILaya.Loader.BUFFER }], Laya.Handler.create(this, this._onLoaded));
|
||
}
|
||
_onLoaded() {
|
||
var arraybuffer = Laya.ILaya.Loader.getRes(this._aniPath);
|
||
if (arraybuffer == null)
|
||
return;
|
||
if (IAniLib.Templet.TEMPLET_DICTIONARY == null) {
|
||
IAniLib.Templet.TEMPLET_DICTIONARY = {};
|
||
}
|
||
var tFactory;
|
||
tFactory = IAniLib.Templet.TEMPLET_DICTIONARY[this._aniPath];
|
||
if (tFactory) {
|
||
if (tFactory.isParseFail) {
|
||
this._parseFail();
|
||
}
|
||
else {
|
||
if (tFactory.isParserComplete) {
|
||
this._parseComplete();
|
||
}
|
||
else {
|
||
tFactory.on(Laya.Event.COMPLETE, this, this._parseComplete);
|
||
tFactory.on(Laya.Event.ERROR, this, this._parseFail);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
tFactory = new IAniLib.Templet();
|
||
tFactory._setCreateURL(this._aniPath);
|
||
IAniLib.Templet.TEMPLET_DICTIONARY[this._aniPath] = tFactory;
|
||
tFactory.on(Laya.Event.COMPLETE, this, this._parseComplete);
|
||
tFactory.on(Laya.Event.ERROR, this, this._parseFail);
|
||
tFactory.isParserComplete = false;
|
||
tFactory.parseData(null, arraybuffer);
|
||
}
|
||
}
|
||
_parseComplete() {
|
||
var tTemple = IAniLib.Templet.TEMPLET_DICTIONARY[this._aniPath];
|
||
if (tTemple) {
|
||
this.init(tTemple, this._loadAniMode);
|
||
this.play(0, true);
|
||
}
|
||
this._complete && this._complete.runWith(this);
|
||
}
|
||
_parseFail() {
|
||
console.log("[Error]:" + this._aniPath + "解析失败");
|
||
}
|
||
_onPlay() {
|
||
this.event(Laya.Event.PLAYED);
|
||
}
|
||
_onStop() {
|
||
var tEventData;
|
||
var tEventAniArr = this._templet.eventAniArr;
|
||
var tEventArr = tEventAniArr[this._aniClipIndex];
|
||
if (tEventArr && this._eventIndex < tEventArr.length) {
|
||
for (; this._eventIndex < tEventArr.length; this._eventIndex++) {
|
||
tEventData = tEventArr[this._eventIndex];
|
||
if (tEventData.time >= this._player.playStart && tEventData.time <= this._player.playEnd) {
|
||
this.event(Laya.Event.LABEL, tEventData);
|
||
}
|
||
}
|
||
}
|
||
this._drawOrder = null;
|
||
this.event(Laya.Event.STOPPED);
|
||
}
|
||
_onPause() {
|
||
this.event(Laya.Event.PAUSED);
|
||
}
|
||
_parseSrcBoneMatrix() {
|
||
var i = 0, n = 0;
|
||
n = this._templet.srcBoneMatrixArr.length;
|
||
for (i = 0; i < n; i++) {
|
||
this._boneMatrixArray.push(new Laya.Matrix());
|
||
}
|
||
if (this._aniMode == 0) {
|
||
this._boneSlotDic = this._templet.boneSlotDic;
|
||
this._bindBoneBoneSlotDic = this._templet.bindBoneBoneSlotDic;
|
||
this._boneSlotArray = this._templet.boneSlotArray;
|
||
}
|
||
else {
|
||
if (this._boneSlotDic == null)
|
||
this._boneSlotDic = {};
|
||
if (this._bindBoneBoneSlotDic == null)
|
||
this._bindBoneBoneSlotDic = {};
|
||
if (this._boneSlotArray == null)
|
||
this._boneSlotArray = [];
|
||
var tArr = this._templet.boneSlotArray;
|
||
var tBS;
|
||
var tBSArr;
|
||
for (i = 0, n = tArr.length; i < n; i++) {
|
||
tBS = tArr[i];
|
||
tBSArr = this._bindBoneBoneSlotDic[tBS.parent];
|
||
if (tBSArr == null) {
|
||
this._bindBoneBoneSlotDic[tBS.parent] = tBSArr = [];
|
||
}
|
||
this._boneSlotDic[tBS.name] = tBS = tBS.copy();
|
||
tBSArr.push(tBS);
|
||
this._boneSlotArray.push(tBS);
|
||
}
|
||
}
|
||
}
|
||
_emitMissedEvents(startTime, endTime, startIndex = 0) {
|
||
var tEventAniArr = this._templet.eventAniArr;
|
||
var tEventArr = tEventAniArr[this._player.currentAnimationClipIndex];
|
||
if (tEventArr) {
|
||
var i = 0, len;
|
||
var tEventData;
|
||
len = tEventArr.length;
|
||
for (i = startIndex; i < len; i++) {
|
||
tEventData = tEventArr[i];
|
||
if (tEventData.time >= this._player.playStart && tEventData.time <= this._player.playEnd) {
|
||
this.event(Laya.Event.LABEL, tEventData);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
_update(autoKey = true) {
|
||
if (autoKey && this._pause)
|
||
return;
|
||
if (autoKey && this._indexControl) {
|
||
return;
|
||
}
|
||
var tCurrTime = this.timer.currTimer;
|
||
var preIndex = this._player.currentKeyframeIndex;
|
||
var dTime = tCurrTime - this._lastTime;
|
||
if (autoKey) {
|
||
this._player._update(dTime);
|
||
}
|
||
else {
|
||
preIndex = -1;
|
||
}
|
||
this._lastTime = tCurrTime;
|
||
if (!this._player)
|
||
return;
|
||
this._index = this._clipIndex = this._player.currentKeyframeIndex;
|
||
if (this._index < 0)
|
||
return;
|
||
if (dTime > 0 && this._clipIndex == preIndex && this._lastUpdateAniClipIndex == this._aniClipIndex) {
|
||
return;
|
||
}
|
||
this._lastUpdateAniClipIndex = this._aniClipIndex;
|
||
if (preIndex > this._clipIndex && this._eventIndex != 0) {
|
||
this._emitMissedEvents(this._player.playStart, this._player.playEnd, this._eventIndex);
|
||
this._eventIndex = 0;
|
||
}
|
||
var tEventArr = this._templet.eventAniArr[this._aniClipIndex];
|
||
var _soundChannel;
|
||
if (tEventArr && this._eventIndex < tEventArr.length) {
|
||
var tEventData = tEventArr[this._eventIndex];
|
||
if (tEventData.time >= this._player.playStart && tEventData.time <= this._player.playEnd) {
|
||
if (this._player.currentPlayTime >= tEventData.time) {
|
||
this.event(Laya.Event.LABEL, tEventData);
|
||
this._eventIndex++;
|
||
if (this._playAudio && tEventData.audioValue && tEventData.audioValue !== "null" && tEventData.audioValue !== "undefined") {
|
||
_soundChannel = Laya.SoundManager.playSound(this._player.templet._path + tEventData.audioValue, 1, Laya.Handler.create(this, this._onAniSoundStoped));
|
||
Laya.SoundManager.playbackRate = this._player.playbackRate;
|
||
_soundChannel && this._soundChannelArr.push(_soundChannel);
|
||
}
|
||
}
|
||
}
|
||
else if (tEventData.time < this._player.playStart && this._playAudio && tEventData.audioValue && tEventData.audioValue !== "null" && tEventData.audioValue !== "undefined") {
|
||
this._eventIndex++;
|
||
_soundChannel = Laya.SoundManager.playSound(this._player.templet._path + tEventData.audioValue, 1, Laya.Handler.create(this, this._onAniSoundStoped), null, (this._player.currentPlayTime - tEventData.time) / 1000);
|
||
Laya.SoundManager.playbackRate = this._player.playbackRate;
|
||
_soundChannel && this._soundChannelArr.push(_soundChannel);
|
||
}
|
||
else {
|
||
this._eventIndex++;
|
||
}
|
||
}
|
||
var tGraphics;
|
||
if (this._aniMode == 0) {
|
||
tGraphics = this._templet.getGrahicsDataWithCache(this._aniClipIndex, this._clipIndex) || this._createGraphics();
|
||
if (tGraphics && this.graphics != tGraphics) {
|
||
this.graphics = tGraphics;
|
||
}
|
||
}
|
||
else if (this._aniMode == 1) {
|
||
tGraphics = this._getGrahicsDataWithCache(this._aniClipIndex, this._clipIndex) || this._createGraphics();
|
||
if (tGraphics && this.graphics != tGraphics) {
|
||
this.graphics = tGraphics;
|
||
}
|
||
}
|
||
else {
|
||
this._createGraphics();
|
||
}
|
||
}
|
||
_onAniSoundStoped(force) {
|
||
var _channel;
|
||
for (var len = this._soundChannelArr.length, i = 0; i < len; i++) {
|
||
_channel = this._soundChannelArr[i];
|
||
if (_channel.isStopped || force) {
|
||
!_channel.isStopped && _channel.stop();
|
||
this._soundChannelArr.splice(i, 1);
|
||
len--;
|
||
i--;
|
||
}
|
||
}
|
||
}
|
||
_createGraphics(_clipIndex = -1) {
|
||
if (_clipIndex == -1)
|
||
_clipIndex = this._clipIndex;
|
||
var curTime = _clipIndex * this._player.cacheFrameRateInterval;
|
||
var tDrawOrderData;
|
||
var tDrawOrderAniArr = this._templet.drawOrderAniArr;
|
||
var tDrawOrderArr = tDrawOrderAniArr[this._aniClipIndex];
|
||
if (tDrawOrderArr && tDrawOrderArr.length > 0) {
|
||
this._drawOrderIndex = 0;
|
||
tDrawOrderData = tDrawOrderArr[this._drawOrderIndex];
|
||
while (curTime >= tDrawOrderData.time) {
|
||
this._drawOrder = tDrawOrderData.drawOrder;
|
||
this._drawOrderIndex++;
|
||
if (this._drawOrderIndex >= tDrawOrderArr.length) {
|
||
break;
|
||
}
|
||
tDrawOrderData = tDrawOrderArr[this._drawOrderIndex];
|
||
}
|
||
}
|
||
if (this._aniMode == 0 || this._aniMode == 1) {
|
||
this.graphics = GraphicsAni.create();
|
||
}
|
||
else {
|
||
if (this.graphics instanceof GraphicsAni) {
|
||
this.graphics.clear();
|
||
}
|
||
else {
|
||
this.graphics = GraphicsAni.create();
|
||
}
|
||
}
|
||
var tGraphics = this.graphics;
|
||
var bones = this._templet.getNodes(this._aniClipIndex);
|
||
var stopped = this._player.state == 0;
|
||
this._templet.getOriginalData(this._aniClipIndex, this._curOriginalData, null, _clipIndex, stopped ? (curTime + this._player.cacheFrameRateInterval) : curTime);
|
||
var tSectionArr = this._aniSectionDic[this._aniClipIndex];
|
||
var tStartIndex = 0;
|
||
var i = 0, j = 0, k = 0, n = 0;
|
||
var tDBBoneSlot;
|
||
var tDBBoneSlotArr;
|
||
var tParentTransform;
|
||
var tSrcBone;
|
||
var boneCount = this._templet.srcBoneMatrixArr.length;
|
||
var origDt = this._curOriginalData;
|
||
for (i = 0, n = tSectionArr[0]; i < boneCount; i++) {
|
||
tSrcBone = this._boneList[i];
|
||
var resultTrans = tSrcBone.resultTransform;
|
||
tParentTransform = this._templet.srcBoneMatrixArr[i];
|
||
resultTrans.scX = tParentTransform.scX * origDt[tStartIndex++];
|
||
resultTrans.skX = tParentTransform.skX + origDt[tStartIndex++];
|
||
resultTrans.skY = tParentTransform.skY + origDt[tStartIndex++];
|
||
resultTrans.scY = tParentTransform.scY * origDt[tStartIndex++];
|
||
resultTrans.x = tParentTransform.x + origDt[tStartIndex++];
|
||
resultTrans.y = tParentTransform.y + origDt[tStartIndex++];
|
||
if (this._templet.tMatrixDataLen === 8) {
|
||
resultTrans.skewX = tParentTransform.skewX + origDt[tStartIndex++];
|
||
resultTrans.skewY = tParentTransform.skewY + origDt[tStartIndex++];
|
||
}
|
||
}
|
||
var tSlotDic = {};
|
||
var tSlotAlphaDic = {};
|
||
var tBoneData;
|
||
for (n += tSectionArr[1]; i < n; i++) {
|
||
tBoneData = bones[i];
|
||
tSlotDic[tBoneData.name] = origDt[tStartIndex++];
|
||
tSlotAlphaDic[tBoneData.name] = origDt[tStartIndex++];
|
||
tStartIndex += 4;
|
||
}
|
||
var tBendDirectionDic = {};
|
||
var tMixDic = {};
|
||
for (n += tSectionArr[2]; i < n; i++) {
|
||
tBoneData = bones[i];
|
||
tBendDirectionDic[tBoneData.name] = origDt[tStartIndex++];
|
||
tMixDic[tBoneData.name] = origDt[tStartIndex++];
|
||
tStartIndex += 4;
|
||
}
|
||
if (this._pathDic) {
|
||
var tPathConstraint;
|
||
for (n += tSectionArr[3]; i < n; i++) {
|
||
tBoneData = bones[i];
|
||
tPathConstraint = this._pathDic[tBoneData.name];
|
||
if (tPathConstraint) {
|
||
var tByte = new Laya.Byte(tBoneData.extenData);
|
||
switch (tByte.getByte()) {
|
||
case 1:
|
||
tPathConstraint.position = origDt[tStartIndex++];
|
||
break;
|
||
case 2:
|
||
tPathConstraint.spacing = origDt[tStartIndex++];
|
||
break;
|
||
case 3:
|
||
tPathConstraint.rotateMix = origDt[tStartIndex++];
|
||
tPathConstraint.translateMix = origDt[tStartIndex++];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
this._rootBone.update(this._yReverseMatrix || Laya.Matrix.TEMP.identity());
|
||
if (this._ikArr) {
|
||
var tIkConstraint;
|
||
for (i = 0, n = this._ikArr.length; i < n; i++) {
|
||
tIkConstraint = this._ikArr[i];
|
||
if (tIkConstraint.name in tBendDirectionDic) {
|
||
tIkConstraint.bendDirection = tBendDirectionDic[tIkConstraint.name];
|
||
}
|
||
if (tIkConstraint.name in tMixDic) {
|
||
tIkConstraint.mix = tMixDic[tIkConstraint.name];
|
||
}
|
||
tIkConstraint.apply();
|
||
}
|
||
}
|
||
if (this._pathDic) {
|
||
for (var tPathStr in this._pathDic) {
|
||
tPathConstraint = this._pathDic[tPathStr];
|
||
tPathConstraint.apply(this._boneList, tGraphics);
|
||
}
|
||
}
|
||
if (this._tfArr) {
|
||
var tTfConstraint;
|
||
for (i = 0, k = this._tfArr.length; i < k; i++) {
|
||
tTfConstraint = this._tfArr[i];
|
||
tTfConstraint.apply();
|
||
}
|
||
}
|
||
for (i = 0, k = this._boneList.length; i < k; i++) {
|
||
tSrcBone = this._boneList[i];
|
||
tDBBoneSlotArr = this._bindBoneBoneSlotDic[tSrcBone.name];
|
||
tSrcBone.resultMatrix.copyTo(this._boneMatrixArray[i]);
|
||
if (tDBBoneSlotArr) {
|
||
for (j = 0, n = tDBBoneSlotArr.length; j < n; j++) {
|
||
tDBBoneSlot = tDBBoneSlotArr[j];
|
||
if (tDBBoneSlot) {
|
||
tDBBoneSlot.setParentMatrix(tSrcBone.resultMatrix);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
var tDeformDic = {};
|
||
var tDeformAniArr = this._templet.deformAniArr;
|
||
var tDeformAniData;
|
||
if (tDeformAniArr && tDeformAniArr.length > 0) {
|
||
if (this._lastAniClipIndex != this._aniClipIndex) {
|
||
this._lastAniClipIndex = this._aniClipIndex;
|
||
for (i = 0, n = this._boneSlotArray.length; i < n; i++) {
|
||
tDBBoneSlot = this._boneSlotArray[i];
|
||
tDBBoneSlot.deformData = null;
|
||
}
|
||
}
|
||
var tSkinDeformAni = tDeformAniArr[this._aniClipIndex];
|
||
tDeformAniData = (tSkinDeformAni["default"]);
|
||
this._setDeform(tDeformAniData, tDeformDic, this._boneSlotArray, curTime);
|
||
var tSkin;
|
||
for (tSkin in tSkinDeformAni) {
|
||
if (tSkin != "default" && tSkin != this._skinName) {
|
||
tDeformAniData = tSkinDeformAni[tSkin];
|
||
this._setDeform(tDeformAniData, tDeformDic, this._boneSlotArray, curTime);
|
||
}
|
||
}
|
||
tDeformAniData = (tSkinDeformAni[this._skinName]);
|
||
this._setDeform(tDeformAniData, tDeformDic, this._boneSlotArray, curTime);
|
||
}
|
||
var tSlotData2;
|
||
var tSlotData3;
|
||
var tObject;
|
||
if (this._drawOrder) {
|
||
for (i = 0, n = this._drawOrder.length; i < n; i++) {
|
||
tDBBoneSlot = this._boneSlotArray[this._drawOrder[i]];
|
||
tSlotData2 = tSlotDic[tDBBoneSlot.name];
|
||
tSlotData3 = tSlotAlphaDic[tDBBoneSlot.name];
|
||
if (!isNaN(tSlotData2) && tSlotData2 != -2) {
|
||
if (this._templet.attachmentNames) {
|
||
tDBBoneSlot.showDisplayByName(this._templet.attachmentNames[tSlotData2]);
|
||
}
|
||
else {
|
||
tDBBoneSlot.showDisplayByIndex(tSlotData2);
|
||
}
|
||
}
|
||
if (tDeformDic[this._drawOrder[i]]) {
|
||
tObject = tDeformDic[this._drawOrder[i]];
|
||
if (tDBBoneSlot.currDisplayData && tObject[tDBBoneSlot.currDisplayData.attachmentName]) {
|
||
tDBBoneSlot.deformData = tObject[tDBBoneSlot.currDisplayData.attachmentName];
|
||
}
|
||
else {
|
||
tDBBoneSlot.deformData = null;
|
||
}
|
||
}
|
||
else {
|
||
tDBBoneSlot.deformData = null;
|
||
}
|
||
if (!isNaN(tSlotData3)) {
|
||
tDBBoneSlot.draw(tGraphics, this._boneMatrixArray, this._aniMode == 2, tSlotData3);
|
||
}
|
||
else {
|
||
tDBBoneSlot.draw(tGraphics, this._boneMatrixArray, this._aniMode == 2);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for (i = 0, n = this._boneSlotArray.length; i < n; i++) {
|
||
tDBBoneSlot = this._boneSlotArray[i];
|
||
tSlotData2 = tSlotDic[tDBBoneSlot.name];
|
||
tSlotData3 = tSlotAlphaDic[tDBBoneSlot.name];
|
||
if (!isNaN(tSlotData2) && tSlotData2 != -2) {
|
||
if (this._templet.attachmentNames) {
|
||
tDBBoneSlot.showDisplayByName(this._templet.attachmentNames[tSlotData2]);
|
||
}
|
||
else {
|
||
tDBBoneSlot.showDisplayByIndex(tSlotData2);
|
||
}
|
||
}
|
||
if (tDeformDic[i]) {
|
||
tObject = tDeformDic[i];
|
||
if (tDBBoneSlot.currDisplayData && tObject[tDBBoneSlot.currDisplayData.attachmentName]) {
|
||
tDBBoneSlot.deformData = tObject[tDBBoneSlot.currDisplayData.attachmentName];
|
||
}
|
||
else {
|
||
tDBBoneSlot.deformData = null;
|
||
}
|
||
}
|
||
else {
|
||
tDBBoneSlot.deformData = null;
|
||
}
|
||
if (!isNaN(tSlotData3)) {
|
||
tDBBoneSlot.draw(tGraphics, this._boneMatrixArray, this._aniMode == 2, tSlotData3);
|
||
}
|
||
else {
|
||
tDBBoneSlot.draw(tGraphics, this._boneMatrixArray, this._aniMode == 2);
|
||
}
|
||
}
|
||
}
|
||
if (this._aniMode == 0) {
|
||
this._templet.setGrahicsDataWithCache(this._aniClipIndex, _clipIndex, tGraphics);
|
||
this._checkIsAllParsed(this._aniClipIndex);
|
||
}
|
||
else if (this._aniMode == 1) {
|
||
this._setGrahicsDataWithCache(this._aniClipIndex, _clipIndex, tGraphics);
|
||
}
|
||
return tGraphics;
|
||
}
|
||
_checkIsAllParsed(_aniClipIndex) {
|
||
var i, len;
|
||
len = Math.floor(0.01 + this._templet.getAniDuration(_aniClipIndex) / 1000 * this._player.cacheFrameRate);
|
||
for (i = 0; i < len; i++) {
|
||
if (!this._templet.getGrahicsDataWithCache(_aniClipIndex, i))
|
||
return;
|
||
}
|
||
if (!this._templet.getGrahicsDataWithCache(_aniClipIndex, len)) {
|
||
this._createGraphics(len);
|
||
return;
|
||
}
|
||
this._templet.deleteAniData(_aniClipIndex);
|
||
}
|
||
_setDeform(tDeformAniData, tDeformDic, _boneSlotArray, curTime) {
|
||
if (!tDeformAniData)
|
||
return;
|
||
var tDeformSlotData;
|
||
var tDeformSlotDisplayData;
|
||
var tDBBoneSlot;
|
||
var i, n, j;
|
||
if (tDeformAniData) {
|
||
for (i = 0, n = tDeformAniData.deformSlotDataList.length; i < n; i++) {
|
||
tDeformSlotData = tDeformAniData.deformSlotDataList[i];
|
||
for (j = 0; j < tDeformSlotData.deformSlotDisplayList.length; j++) {
|
||
tDeformSlotDisplayData = tDeformSlotData.deformSlotDisplayList[j];
|
||
tDBBoneSlot = _boneSlotArray[tDeformSlotDisplayData.slotIndex];
|
||
tDeformSlotDisplayData.apply(curTime, tDBBoneSlot);
|
||
if (!tDeformDic[tDeformSlotDisplayData.slotIndex]) {
|
||
tDeformDic[tDeformSlotDisplayData.slotIndex] = {};
|
||
}
|
||
tDeformDic[tDeformSlotDisplayData.slotIndex][tDeformSlotDisplayData.attachment] = tDeformSlotDisplayData.deformData;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
getAnimNum() {
|
||
return this._templet.getAnimationCount();
|
||
}
|
||
getAniNameByIndex(index) {
|
||
return this._templet.getAniNameByIndex(index);
|
||
}
|
||
getSlotByName(name) {
|
||
return this._boneSlotDic[name];
|
||
}
|
||
showSkinByName(name, freshSlotIndex = true) {
|
||
this.showSkinByIndex(this._templet.getSkinIndexByName(name), freshSlotIndex);
|
||
}
|
||
showSkinByIndex(skinIndex, freshSlotIndex = true) {
|
||
for (var i = 0; i < this._boneSlotArray.length; i++) {
|
||
this._boneSlotArray[i].showSlotData(null, freshSlotIndex);
|
||
}
|
||
if (this._templet.showSkinByIndex(this._boneSlotDic, skinIndex, freshSlotIndex)) {
|
||
var tSkinData = this._templet.skinDataArray[skinIndex];
|
||
this._skinIndex = skinIndex;
|
||
this._skinName = tSkinData.name;
|
||
}
|
||
this._clearCache();
|
||
}
|
||
showSlotSkinByIndex(slotName, index) {
|
||
if (this._aniMode == 0)
|
||
return;
|
||
var tBoneSlot = this.getSlotByName(slotName);
|
||
if (tBoneSlot) {
|
||
tBoneSlot.showDisplayByIndex(index);
|
||
}
|
||
this._clearCache();
|
||
}
|
||
showSlotSkinByName(slotName, name) {
|
||
if (this._aniMode == 0)
|
||
return;
|
||
var tBoneSlot = this.getSlotByName(slotName);
|
||
if (tBoneSlot) {
|
||
tBoneSlot.showDisplayByName(name);
|
||
}
|
||
this._clearCache();
|
||
}
|
||
replaceSlotSkinName(slotName, oldName, newName) {
|
||
if (this._aniMode == 0)
|
||
return;
|
||
var tBoneSlot = this.getSlotByName(slotName);
|
||
if (tBoneSlot) {
|
||
tBoneSlot.replaceDisplayByName(oldName, newName);
|
||
}
|
||
this._clearCache();
|
||
}
|
||
replaceSlotSkinByIndex(slotName, oldIndex, newIndex) {
|
||
if (this._aniMode == 0)
|
||
return;
|
||
var tBoneSlot = this.getSlotByName(slotName);
|
||
if (tBoneSlot) {
|
||
tBoneSlot.replaceDisplayByIndex(oldIndex, newIndex);
|
||
}
|
||
this._clearCache();
|
||
}
|
||
setSlotSkin(slotName, texture) {
|
||
if (this._aniMode == 0)
|
||
return;
|
||
var tBoneSlot = this.getSlotByName(slotName);
|
||
if (tBoneSlot) {
|
||
tBoneSlot.replaceSkin(texture);
|
||
}
|
||
this._clearCache();
|
||
}
|
||
_clearCache() {
|
||
if (this._aniMode == 1) {
|
||
for (var i = 0, n = this._graphicsCache.length; i < n; i++) {
|
||
for (var j = 0, len = this._graphicsCache[i].length; j < len; j++) {
|
||
var gp = this._graphicsCache[i][j];
|
||
if (gp && gp != this.graphics) {
|
||
GraphicsAni.recycle(gp);
|
||
}
|
||
}
|
||
this._graphicsCache[i].length = 0;
|
||
}
|
||
}
|
||
}
|
||
play(nameOrIndex, loop, force = true, start = 0, end = 0, freshSkin = true, playAudio = true) {
|
||
this._playAudio = playAudio;
|
||
this._indexControl = false;
|
||
var index = -1;
|
||
var duration;
|
||
if (loop) {
|
||
duration = 2147483647;
|
||
}
|
||
else {
|
||
duration = 0;
|
||
}
|
||
if (typeof (nameOrIndex) == 'string') {
|
||
for (var i = 0, n = this._templet.getAnimationCount(); i < n; i++) {
|
||
var animation = this._templet.getAnimation(i);
|
||
if (animation && nameOrIndex == animation.name) {
|
||
index = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
index = nameOrIndex;
|
||
}
|
||
if (index > -1 && index < this.getAnimNum()) {
|
||
this._aniClipIndex = index;
|
||
if (force || this._pause || this._currAniIndex != index) {
|
||
this._currAniIndex = index;
|
||
this._curOriginalData = new Float32Array(this._templet.getTotalkeyframesLength(index));
|
||
this._drawOrder = null;
|
||
this._eventIndex = 0;
|
||
this._player.play(index, this._player.playbackRate, duration, start, end);
|
||
if (freshSkin)
|
||
this._templet.showSkinByIndex(this._boneSlotDic, this._skinIndex);
|
||
if (this._pause) {
|
||
this._pause = false;
|
||
this._lastTime = Laya.ILaya.Browser.now();
|
||
this.timer.frameLoop(1, this, this._update, null, true);
|
||
}
|
||
this._update();
|
||
}
|
||
}
|
||
}
|
||
stop() {
|
||
if (!this._pause) {
|
||
this._pause = true;
|
||
if (this._player) {
|
||
this._player.stop(true);
|
||
}
|
||
if (this._soundChannelArr.length > 0) {
|
||
this._onAniSoundStoped(true);
|
||
}
|
||
this.timer.clear(this, this._update);
|
||
}
|
||
}
|
||
playbackRate(value) {
|
||
if (this._player) {
|
||
this._player.playbackRate = value;
|
||
}
|
||
}
|
||
paused() {
|
||
if (!this._pause) {
|
||
this._pause = true;
|
||
if (this._player) {
|
||
this._player.paused = true;
|
||
}
|
||
if (this._soundChannelArr.length > 0) {
|
||
var _soundChannel;
|
||
for (var len = this._soundChannelArr.length, i = 0; i < len; i++) {
|
||
_soundChannel = this._soundChannelArr[i];
|
||
if (!_soundChannel.isStopped) {
|
||
_soundChannel.pause();
|
||
}
|
||
}
|
||
}
|
||
this.timer.clear(this, this._update);
|
||
}
|
||
}
|
||
resume() {
|
||
this._indexControl = false;
|
||
if (this._pause) {
|
||
this._pause = false;
|
||
if (this._player) {
|
||
this._player.paused = false;
|
||
}
|
||
if (this._soundChannelArr.length > 0) {
|
||
var _soundChannel;
|
||
for (var len = this._soundChannelArr.length, i = 0; i < len; i++) {
|
||
_soundChannel = this._soundChannelArr[i];
|
||
if (_soundChannel.audioBuffer) {
|
||
_soundChannel.resume();
|
||
}
|
||
}
|
||
}
|
||
this._lastTime = Laya.ILaya.Browser.now();
|
||
this.timer.frameLoop(1, this, this._update, null, true);
|
||
}
|
||
}
|
||
_getGrahicsDataWithCache(aniIndex, frameIndex) {
|
||
return this._graphicsCache[aniIndex][frameIndex];
|
||
}
|
||
_setGrahicsDataWithCache(aniIndex, frameIndex, graphics) {
|
||
this._graphicsCache[aniIndex][frameIndex] = graphics;
|
||
}
|
||
destroy(destroyChild = true) {
|
||
super.destroy(destroyChild);
|
||
this._templet._removeReference(1);
|
||
this._templet = null;
|
||
if (this._player)
|
||
this._player.offAll();
|
||
this._player = null;
|
||
this._curOriginalData = null;
|
||
this._boneMatrixArray.length = 0;
|
||
this._lastTime = 0;
|
||
this.timer.clear(this, this._update);
|
||
if (this._soundChannelArr.length > 0) {
|
||
this._onAniSoundStoped(true);
|
||
}
|
||
}
|
||
get index() {
|
||
return this._index;
|
||
}
|
||
set index(value) {
|
||
if (this.player) {
|
||
this._index = value;
|
||
this._player.currentTime = this._index * 1000 / this._player.cacheFrameRate;
|
||
this._indexControl = true;
|
||
if (this._aniClipIndex < 0 || this._aniClipIndex >= this.getAnimNum()) {
|
||
this._aniClipIndex = 0;
|
||
this._currAniIndex = 0;
|
||
this._curOriginalData = new Float32Array(this._templet.getTotalkeyframesLength(this._currAniIndex));
|
||
this._drawOrder = null;
|
||
this._eventIndex = 0;
|
||
}
|
||
this._update(false);
|
||
}
|
||
}
|
||
get total() {
|
||
if (this._templet && this._player) {
|
||
this._total = Math.floor(this._templet.getAniDuration(this._player.currentAnimationClipIndex) / 1000 * this._player.cacheFrameRate);
|
||
}
|
||
else {
|
||
this._total = -1;
|
||
}
|
||
return this._total;
|
||
}
|
||
get player() {
|
||
return this._player;
|
||
}
|
||
get templet() {
|
||
return this._templet;
|
||
}
|
||
}
|
||
Skeleton.useSimpleMeshInCanvas = false;
|
||
IAniLib.Skeleton = Skeleton;
|
||
Laya.ILaya.regClass(Skeleton);
|
||
Laya.ClassUtils.regClass("laya.ani.bone.Skeleton", Skeleton);
|
||
Laya.ClassUtils.regClass("Laya.Skeleton", Skeleton);
|
||
|
||
class SkinData {
|
||
constructor() {
|
||
this.slotArr = [];
|
||
}
|
||
}
|
||
|
||
class SkinSlotDisplayData {
|
||
createTexture(currTexture) {
|
||
if (this.texture)
|
||
return this.texture;
|
||
this.texture = new Laya.Texture(currTexture.bitmap, this.uvs);
|
||
if (this.uvs[0] > this.uvs[4]
|
||
&& this.uvs[1] > this.uvs[5]) {
|
||
this.texture.width = currTexture.height;
|
||
this.texture.height = currTexture.width;
|
||
this.texture.offsetX = -currTexture.offsetX;
|
||
this.texture.offsetY = -currTexture.offsetY;
|
||
this.texture.sourceWidth = currTexture.sourceHeight;
|
||
this.texture.sourceHeight = currTexture.sourceWidth;
|
||
}
|
||
else {
|
||
this.texture.width = currTexture.width;
|
||
this.texture.height = currTexture.height;
|
||
this.texture.offsetX = -currTexture.offsetX;
|
||
this.texture.offsetY = -currTexture.offsetY;
|
||
this.texture.sourceWidth = currTexture.sourceWidth;
|
||
this.texture.sourceHeight = currTexture.sourceHeight;
|
||
}
|
||
return this.texture;
|
||
}
|
||
destory() {
|
||
if (this.texture)
|
||
this.texture.destroy();
|
||
}
|
||
}
|
||
|
||
class SlotData {
|
||
constructor() {
|
||
this.displayArr = [];
|
||
}
|
||
getDisplayByName(name) {
|
||
var tDisplay;
|
||
for (var i = 0, n = this.displayArr.length; i < n; i++) {
|
||
tDisplay = this.displayArr[i];
|
||
if (tDisplay.attachmentName == name) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
class TfConstraintData {
|
||
constructor() {
|
||
this.boneIndexs = [];
|
||
}
|
||
}
|
||
|
||
class Templet extends AnimationTemplet {
|
||
constructor() {
|
||
super(...arguments);
|
||
this._graphicsCache = [];
|
||
this.srcBoneMatrixArr = [];
|
||
this.ikArr = [];
|
||
this.tfArr = [];
|
||
this.pathArr = [];
|
||
this.boneSlotDic = {};
|
||
this.bindBoneBoneSlotDic = {};
|
||
this.boneSlotArray = [];
|
||
this.skinDataArray = [];
|
||
this.skinDic = {};
|
||
this.subTextureDic = {};
|
||
this.isParseFail = false;
|
||
this.drawOrderAniArr = [];
|
||
this.eventAniArr = [];
|
||
this.attachmentNames = null;
|
||
this.deformAniArr = [];
|
||
this.skinSlotDisplayDataArr = [];
|
||
this._isParseAudio = false;
|
||
this._isDestroyed = false;
|
||
this._rate = 30;
|
||
this.isParserComplete = false;
|
||
this.aniSectionDic = {};
|
||
this._textureDic = {};
|
||
this.mBoneArr = [];
|
||
}
|
||
loadAni(url) {
|
||
this._skBufferUrl = url;
|
||
Laya.ILaya.loader.load(url, Laya.Handler.create(this, this.onComplete), null, Laya.ILaya.Loader.BUFFER);
|
||
}
|
||
onComplete(content = null) {
|
||
if (this._isDestroyed) {
|
||
this.destroy();
|
||
return;
|
||
}
|
||
var tSkBuffer = Laya.ILaya.Loader.getRes(this._skBufferUrl);
|
||
if (!tSkBuffer) {
|
||
this.event(Laya.Event.ERROR, "load failed:" + this._skBufferUrl);
|
||
return;
|
||
}
|
||
this._path = this._skBufferUrl.slice(0, this._skBufferUrl.lastIndexOf("/")) + "/";
|
||
this.parseData(null, tSkBuffer);
|
||
}
|
||
parseData(texture, skeletonData, playbackRate = 30) {
|
||
if (!this._path) {
|
||
var s1 = (this._relativeUrl || this.url);
|
||
if (s1) {
|
||
var p1 = s1.lastIndexOf('/');
|
||
if (p1 > 0) {
|
||
this._path = s1.slice(0, p1) + "/";
|
||
}
|
||
else {
|
||
this._path = '';
|
||
}
|
||
}
|
||
}
|
||
this._mainTexture = texture;
|
||
this._rate = playbackRate;
|
||
this.parse(skeletonData);
|
||
}
|
||
buildArmature(aniMode = 0) {
|
||
return new Skeleton(this, aniMode);
|
||
}
|
||
parse(data) {
|
||
super.parse(data);
|
||
this.event(Laya.Event.LOADED, this);
|
||
if (this._aniVersion === Templet.LAYA_ANIMATION_VISION) {
|
||
this._isParseAudio = true;
|
||
}
|
||
else if (this._aniVersion != Templet.LAYA_ANIMATION_160_VISION) {
|
||
console.log("[Error] 版本不一致,请使用IDE版本配套的重新导出" + this._aniVersion + "->" + Templet.LAYA_ANIMATION_VISION);
|
||
}
|
||
if (this._mainTexture) {
|
||
this._parsePublicExtData();
|
||
}
|
||
else {
|
||
this._parseTexturePath();
|
||
}
|
||
}
|
||
_parseTexturePath() {
|
||
if (this._isDestroyed) {
|
||
this.destroy();
|
||
return;
|
||
}
|
||
var i = 0;
|
||
this._loadList = [];
|
||
var tByte = new Laya.Byte(this.getPublicExtData());
|
||
var tX = 0, tY = 0, tWidth = 0, tHeight = 0;
|
||
var tTempleData = 0;
|
||
var tTextureLen = tByte.getInt32();
|
||
var tTextureName = tByte.readUTFString();
|
||
var tTextureNameArr = tTextureName.split("\n");
|
||
var tSrcTexturePath;
|
||
for (i = 0; i < tTextureLen; i++) {
|
||
tSrcTexturePath = this._path + tTextureNameArr[i * 2];
|
||
tTextureName = tTextureNameArr[i * 2 + 1];
|
||
tX = tByte.getFloat32();
|
||
tY = tByte.getFloat32();
|
||
tWidth = tByte.getFloat32();
|
||
tHeight = tByte.getFloat32();
|
||
tTempleData = tByte.getFloat32();
|
||
tTempleData = tByte.getFloat32();
|
||
tTempleData = tByte.getFloat32();
|
||
tTempleData = tByte.getFloat32();
|
||
if (this._loadList.indexOf(tSrcTexturePath) == -1) {
|
||
this._loadList.push(tSrcTexturePath);
|
||
}
|
||
}
|
||
Laya.ILaya.loader.load(this._loadList, Laya.Handler.create(this, this._textureComplete));
|
||
}
|
||
_textureComplete() {
|
||
var tTextureName;
|
||
for (var i = 0, n = this._loadList.length; i < n; i++) {
|
||
tTextureName = this._loadList[i];
|
||
this._textureDic[tTextureName] = Laya.ILaya.Loader.getRes(tTextureName);
|
||
}
|
||
this._parsePublicExtData();
|
||
}
|
||
_parsePublicExtData() {
|
||
var i = 0, j = 0, k = 0, l = 0, n = 0;
|
||
for (i = 0, n = this.getAnimationCount(); i < n; i++) {
|
||
this._graphicsCache.push([]);
|
||
}
|
||
var isSpine;
|
||
isSpine = this._aniClassName != "Dragon";
|
||
var tByte = new Laya.Byte(this.getPublicExtData());
|
||
var tX = 0, tY = 0, tWidth = 0, tHeight = 0;
|
||
var tFrameX = 0, tFrameY = 0, tFrameWidth = 0, tFrameHeight = 0;
|
||
var tTempleData = 0;
|
||
var tTextureLen = tByte.getInt32();
|
||
var tTextureName = tByte.readUTFString();
|
||
var tTextureNameArr = tTextureName.split("\n");
|
||
var tTexture;
|
||
var tSrcTexturePath;
|
||
for (i = 0; i < tTextureLen; i++) {
|
||
tTexture = this._mainTexture;
|
||
tSrcTexturePath = this._path + tTextureNameArr[i * 2];
|
||
tTextureName = tTextureNameArr[i * 2 + 1];
|
||
if (this._mainTexture == null) {
|
||
tTexture = this._textureDic[tSrcTexturePath];
|
||
}
|
||
if (!tTexture) {
|
||
this.event(Laya.Event.ERROR, this);
|
||
this.isParseFail = true;
|
||
return;
|
||
}
|
||
tX = tByte.getFloat32();
|
||
tY = tByte.getFloat32();
|
||
tWidth = tByte.getFloat32();
|
||
tHeight = tByte.getFloat32();
|
||
tTempleData = tByte.getFloat32();
|
||
tFrameX = isNaN(tTempleData) ? 0 : tTempleData;
|
||
tTempleData = tByte.getFloat32();
|
||
tFrameY = isNaN(tTempleData) ? 0 : tTempleData;
|
||
tTempleData = tByte.getFloat32();
|
||
tFrameWidth = isNaN(tTempleData) ? tWidth : tTempleData;
|
||
tTempleData = tByte.getFloat32();
|
||
tFrameHeight = isNaN(tTempleData) ? tHeight : tTempleData;
|
||
this.subTextureDic[tTextureName] = Laya.Texture.create(tTexture, tX, tY, tWidth, tHeight, -tFrameX, -tFrameY, tFrameWidth, tFrameHeight);
|
||
}
|
||
this._mainTexture = tTexture;
|
||
var tAniCount = tByte.getUint16();
|
||
var tSectionArr;
|
||
for (i = 0; i < tAniCount; i++) {
|
||
tSectionArr = [];
|
||
tSectionArr.push(tByte.getUint16());
|
||
tSectionArr.push(tByte.getUint16());
|
||
tSectionArr.push(tByte.getUint16());
|
||
tSectionArr.push(tByte.getUint16());
|
||
this.aniSectionDic[i] = tSectionArr;
|
||
}
|
||
var tBone;
|
||
var tParentBone;
|
||
var tName;
|
||
var tParentName;
|
||
var tBoneLen = tByte.getInt16();
|
||
var tBoneDic = {};
|
||
var tRootBone;
|
||
for (i = 0; i < tBoneLen; i++) {
|
||
tBone = new Bone();
|
||
if (i == 0) {
|
||
tRootBone = tBone;
|
||
}
|
||
else {
|
||
tBone.root = tRootBone;
|
||
}
|
||
tBone.d = isSpine ? -1 : 1;
|
||
tName = tByte.readUTFString();
|
||
tParentName = tByte.readUTFString();
|
||
tBone.length = tByte.getFloat32();
|
||
if (tByte.getByte() == 1) {
|
||
tBone.inheritRotation = false;
|
||
}
|
||
if (tByte.getByte() == 1) {
|
||
tBone.inheritScale = false;
|
||
}
|
||
tBone.name = tName;
|
||
if (tParentName) {
|
||
tParentBone = tBoneDic[tParentName];
|
||
if (tParentBone) {
|
||
tParentBone.addChild(tBone);
|
||
}
|
||
else {
|
||
this.mRootBone = tBone;
|
||
}
|
||
}
|
||
tBoneDic[tName] = tBone;
|
||
this.mBoneArr.push(tBone);
|
||
}
|
||
this.tMatrixDataLen = tByte.getUint16();
|
||
var tLen = tByte.getUint16();
|
||
var boneLength = Math.floor(tLen / this.tMatrixDataLen);
|
||
var tResultTransform;
|
||
var tMatrixArray = this.srcBoneMatrixArr;
|
||
for (i = 0; i < boneLength; i++) {
|
||
tResultTransform = new Transform();
|
||
tResultTransform.scX = tByte.getFloat32();
|
||
tResultTransform.skX = tByte.getFloat32();
|
||
tResultTransform.skY = tByte.getFloat32();
|
||
tResultTransform.scY = tByte.getFloat32();
|
||
tResultTransform.x = tByte.getFloat32();
|
||
tResultTransform.y = tByte.getFloat32();
|
||
if (this.tMatrixDataLen === 8) {
|
||
tResultTransform.skewX = tByte.getFloat32();
|
||
tResultTransform.skewY = tByte.getFloat32();
|
||
}
|
||
tMatrixArray.push(tResultTransform);
|
||
tBone = this.mBoneArr[i];
|
||
tBone.transform = tResultTransform;
|
||
}
|
||
var tIkConstraintData;
|
||
var tIkLen = tByte.getUint16();
|
||
var tIkBoneLen;
|
||
for (i = 0; i < tIkLen; i++) {
|
||
tIkConstraintData = new IkConstraintData();
|
||
tIkBoneLen = tByte.getUint16();
|
||
for (j = 0; j < tIkBoneLen; j++) {
|
||
tIkConstraintData.boneNames.push(tByte.readUTFString());
|
||
tIkConstraintData.boneIndexs.push(tByte.getInt16());
|
||
}
|
||
tIkConstraintData.name = tByte.readUTFString();
|
||
tIkConstraintData.targetBoneName = tByte.readUTFString();
|
||
tIkConstraintData.targetBoneIndex = tByte.getInt16();
|
||
tIkConstraintData.bendDirection = tByte.getFloat32();
|
||
tIkConstraintData.mix = tByte.getFloat32();
|
||
tIkConstraintData.isSpine = isSpine;
|
||
this.ikArr.push(tIkConstraintData);
|
||
}
|
||
var tTfConstraintData;
|
||
var tTfLen = tByte.getUint16();
|
||
var tTfBoneLen;
|
||
for (i = 0; i < tTfLen; i++) {
|
||
tTfConstraintData = new TfConstraintData();
|
||
tTfBoneLen = tByte.getUint16();
|
||
for (j = 0; j < tTfBoneLen; j++) {
|
||
tTfConstraintData.boneIndexs.push(tByte.getInt16());
|
||
}
|
||
tTfConstraintData.name = tByte.getUTFString();
|
||
tTfConstraintData.targetIndex = tByte.getInt16();
|
||
tTfConstraintData.rotateMix = tByte.getFloat32();
|
||
tTfConstraintData.translateMix = tByte.getFloat32();
|
||
tTfConstraintData.scaleMix = tByte.getFloat32();
|
||
tTfConstraintData.shearMix = tByte.getFloat32();
|
||
tTfConstraintData.offsetRotation = tByte.getFloat32();
|
||
tTfConstraintData.offsetX = tByte.getFloat32();
|
||
tTfConstraintData.offsetY = tByte.getFloat32();
|
||
tTfConstraintData.offsetScaleX = tByte.getFloat32();
|
||
tTfConstraintData.offsetScaleY = tByte.getFloat32();
|
||
tTfConstraintData.offsetShearY = tByte.getFloat32();
|
||
this.tfArr.push(tTfConstraintData);
|
||
}
|
||
var tPathConstraintData;
|
||
var tPathLen = tByte.getUint16();
|
||
var tPathBoneLen;
|
||
for (i = 0; i < tPathLen; i++) {
|
||
tPathConstraintData = new PathConstraintData();
|
||
tPathConstraintData.name = tByte.readUTFString();
|
||
tPathBoneLen = tByte.getUint16();
|
||
for (j = 0; j < tPathBoneLen; j++) {
|
||
tPathConstraintData.bones.push(tByte.getInt16());
|
||
}
|
||
tPathConstraintData.target = tByte.readUTFString();
|
||
tPathConstraintData.positionMode = tByte.readUTFString();
|
||
tPathConstraintData.spacingMode = tByte.readUTFString();
|
||
tPathConstraintData.rotateMode = tByte.readUTFString();
|
||
tPathConstraintData.offsetRotation = tByte.getFloat32();
|
||
tPathConstraintData.position = tByte.getFloat32();
|
||
tPathConstraintData.spacing = tByte.getFloat32();
|
||
tPathConstraintData.rotateMix = tByte.getFloat32();
|
||
tPathConstraintData.translateMix = tByte.getFloat32();
|
||
this.pathArr.push(tPathConstraintData);
|
||
}
|
||
var tDeformSlotLen;
|
||
var tDeformSlotDisplayLen;
|
||
var tDSlotIndex;
|
||
var tDAttachment;
|
||
var tDeformTimeLen;
|
||
var tDTime;
|
||
var tDeformVecticesLen;
|
||
var tDeformAniData;
|
||
var tDeformSlotData;
|
||
var tDeformSlotDisplayData;
|
||
var tDeformVectices;
|
||
var tDeformAniLen = tByte.getInt16();
|
||
for (i = 0; i < tDeformAniLen; i++) {
|
||
var tDeformSkinLen = tByte.getUint8();
|
||
var tSkinDic = {};
|
||
this.deformAniArr.push(tSkinDic);
|
||
for (var f = 0; f < tDeformSkinLen; f++) {
|
||
tDeformAniData = new DeformAniData();
|
||
tDeformAniData.skinName = tByte.getUTFString();
|
||
tSkinDic[tDeformAniData.skinName] = tDeformAniData;
|
||
tDeformSlotLen = tByte.getInt16();
|
||
for (j = 0; j < tDeformSlotLen; j++) {
|
||
tDeformSlotData = new DeformSlotData();
|
||
tDeformAniData.deformSlotDataList.push(tDeformSlotData);
|
||
tDeformSlotDisplayLen = tByte.getInt16();
|
||
for (k = 0; k < tDeformSlotDisplayLen; k++) {
|
||
tDeformSlotDisplayData = new DeformSlotDisplayData();
|
||
tDeformSlotData.deformSlotDisplayList.push(tDeformSlotDisplayData);
|
||
tDeformSlotDisplayData.slotIndex = tDSlotIndex = tByte.getInt16();
|
||
tDeformSlotDisplayData.attachment = tDAttachment = tByte.getUTFString();
|
||
tDeformTimeLen = tByte.getInt16();
|
||
for (l = 0; l < tDeformTimeLen; l++) {
|
||
if (tByte.getByte() == 1) {
|
||
tDeformSlotDisplayData.tweenKeyList.push(true);
|
||
}
|
||
else {
|
||
tDeformSlotDisplayData.tweenKeyList.push(false);
|
||
}
|
||
tDTime = tByte.getFloat32();
|
||
tDeformSlotDisplayData.timeList.push(tDTime);
|
||
tDeformVectices = [];
|
||
tDeformSlotDisplayData.vectices.push(tDeformVectices);
|
||
tDeformVecticesLen = tByte.getInt16();
|
||
for (n = 0; n < tDeformVecticesLen; n++) {
|
||
tDeformVectices.push(tByte.getFloat32());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
var tDrawOrderArr;
|
||
var tDrawOrderAniLen = tByte.getInt16();
|
||
var tDrawOrderLen;
|
||
var tDrawOrderData;
|
||
var tDoLen;
|
||
for (i = 0; i < tDrawOrderAniLen; i++) {
|
||
tDrawOrderLen = tByte.getInt16();
|
||
tDrawOrderArr = [];
|
||
for (j = 0; j < tDrawOrderLen; j++) {
|
||
tDrawOrderData = new DrawOrderData();
|
||
tDrawOrderData.time = tByte.getFloat32();
|
||
tDoLen = tByte.getInt16();
|
||
for (k = 0; k < tDoLen; k++) {
|
||
tDrawOrderData.drawOrder.push(tByte.getInt16());
|
||
}
|
||
tDrawOrderArr.push(tDrawOrderData);
|
||
}
|
||
this.drawOrderAniArr.push(tDrawOrderArr);
|
||
}
|
||
var tEventArr;
|
||
var tEventAniLen = tByte.getInt16();
|
||
var tEventLen;
|
||
var tEventData;
|
||
for (i = 0; i < tEventAniLen; i++) {
|
||
tEventLen = tByte.getInt16();
|
||
tEventArr = [];
|
||
for (j = 0; j < tEventLen; j++) {
|
||
tEventData = new EventData();
|
||
tEventData.name = tByte.getUTFString();
|
||
if (this._isParseAudio)
|
||
tEventData.audioValue = tByte.getUTFString();
|
||
tEventData.intValue = tByte.getInt32();
|
||
tEventData.floatValue = tByte.getFloat32();
|
||
tEventData.stringValue = tByte.getUTFString();
|
||
tEventData.time = tByte.getFloat32();
|
||
tEventArr.push(tEventData);
|
||
}
|
||
this.eventAniArr.push(tEventArr);
|
||
}
|
||
var tAttachmentLen = tByte.getInt16();
|
||
if (tAttachmentLen > 0) {
|
||
this.attachmentNames = [];
|
||
for (i = 0; i < tAttachmentLen; i++) {
|
||
this.attachmentNames.push(tByte.getUTFString());
|
||
}
|
||
}
|
||
var tBoneSlotLen = tByte.getInt16();
|
||
var tDBBoneSlot;
|
||
var tDBBoneSlotArr;
|
||
for (i = 0; i < tBoneSlotLen; i++) {
|
||
tDBBoneSlot = new BoneSlot();
|
||
tDBBoneSlot.name = tByte.readUTFString();
|
||
tDBBoneSlot.parent = tByte.readUTFString();
|
||
tDBBoneSlot.attachmentName = tByte.readUTFString();
|
||
tDBBoneSlot.srcDisplayIndex = tDBBoneSlot.displayIndex = tByte.getInt16();
|
||
tDBBoneSlot.templet = this;
|
||
this.boneSlotDic[tDBBoneSlot.name] = tDBBoneSlot;
|
||
tDBBoneSlotArr = this.bindBoneBoneSlotDic[tDBBoneSlot.parent];
|
||
if (tDBBoneSlotArr == null) {
|
||
this.bindBoneBoneSlotDic[tDBBoneSlot.parent] = tDBBoneSlotArr = [];
|
||
}
|
||
tDBBoneSlotArr.push(tDBBoneSlot);
|
||
this.boneSlotArray.push(tDBBoneSlot);
|
||
}
|
||
var tNameString = tByte.readUTFString();
|
||
var tNameArray = tNameString.split("\n");
|
||
var tNameStartIndex = 0;
|
||
var tSkinDataLen = tByte.getUint8();
|
||
var tSkinData, tSlotData, tDisplayData;
|
||
var tSlotDataLen, tDisplayDataLen;
|
||
var tUvLen, tWeightLen, tTriangleLen, tVerticeLen, tLengthLen;
|
||
for (i = 0; i < tSkinDataLen; i++) {
|
||
tSkinData = new SkinData();
|
||
tSkinData.name = tNameArray[tNameStartIndex++];
|
||
tSlotDataLen = tByte.getUint8();
|
||
for (j = 0; j < tSlotDataLen; j++) {
|
||
tSlotData = new SlotData();
|
||
tSlotData.name = tNameArray[tNameStartIndex++];
|
||
tDBBoneSlot = this.boneSlotDic[tSlotData.name];
|
||
tDisplayDataLen = tByte.getUint8();
|
||
for (k = 0; k < tDisplayDataLen; k++) {
|
||
tDisplayData = new SkinSlotDisplayData();
|
||
this.skinSlotDisplayDataArr.push(tDisplayData);
|
||
tDisplayData.name = tNameArray[tNameStartIndex++];
|
||
tDisplayData.attachmentName = tNameArray[tNameStartIndex++];
|
||
tDisplayData.transform = new Transform();
|
||
tDisplayData.transform.scX = tByte.getFloat32();
|
||
tDisplayData.transform.skX = tByte.getFloat32();
|
||
tDisplayData.transform.skY = tByte.getFloat32();
|
||
tDisplayData.transform.scY = tByte.getFloat32();
|
||
tDisplayData.transform.x = tByte.getFloat32();
|
||
tDisplayData.transform.y = tByte.getFloat32();
|
||
tSlotData.displayArr.push(tDisplayData);
|
||
tDisplayData.width = tByte.getFloat32();
|
||
tDisplayData.height = tByte.getFloat32();
|
||
tDisplayData.type = tByte.getUint8();
|
||
tDisplayData.verLen = tByte.getUint16();
|
||
tBoneLen = tByte.getUint16();
|
||
if (tBoneLen > 0) {
|
||
tDisplayData.bones = [];
|
||
for (l = 0; l < tBoneLen; l++) {
|
||
var tBoneId = tByte.getUint16();
|
||
tDisplayData.bones.push(tBoneId);
|
||
}
|
||
}
|
||
tUvLen = tByte.getUint16();
|
||
if (tUvLen > 0) {
|
||
tDisplayData.uvs = [];
|
||
for (l = 0; l < tUvLen; l++) {
|
||
tDisplayData.uvs.push(tByte.getFloat32());
|
||
}
|
||
}
|
||
tWeightLen = tByte.getUint16();
|
||
if (tWeightLen > 0) {
|
||
tDisplayData.weights = [];
|
||
for (l = 0; l < tWeightLen; l++) {
|
||
tDisplayData.weights.push(tByte.getFloat32());
|
||
}
|
||
}
|
||
tTriangleLen = tByte.getUint16();
|
||
if (tTriangleLen > 0) {
|
||
tDisplayData.triangles = [];
|
||
for (l = 0; l < tTriangleLen; l++) {
|
||
tDisplayData.triangles.push(tByte.getUint16());
|
||
}
|
||
}
|
||
tVerticeLen = tByte.getUint16();
|
||
if (tVerticeLen > 0) {
|
||
tDisplayData.vertices = [];
|
||
for (l = 0; l < tVerticeLen; l++) {
|
||
tDisplayData.vertices.push(tByte.getFloat32());
|
||
}
|
||
}
|
||
tLengthLen = tByte.getUint16();
|
||
if (tLengthLen > 0) {
|
||
tDisplayData.lengths = [];
|
||
for (l = 0; l < tLengthLen; l++) {
|
||
tDisplayData.lengths.push(tByte.getFloat32());
|
||
}
|
||
}
|
||
}
|
||
tSkinData.slotArr.push(tSlotData);
|
||
}
|
||
this.skinDic[tSkinData.name] = tSkinData;
|
||
this.skinDataArray.push(tSkinData);
|
||
}
|
||
var tReverse = tByte.getUint8();
|
||
if (tReverse == 1) {
|
||
this.yReverseMatrix = new Laya.Matrix(1, 0, 0, -1, 0, 0);
|
||
if (tRootBone) {
|
||
tRootBone.setTempMatrix(this.yReverseMatrix);
|
||
}
|
||
}
|
||
else {
|
||
if (tRootBone) {
|
||
tRootBone.setTempMatrix(new Laya.Matrix());
|
||
}
|
||
}
|
||
this.showSkinByIndex(this.boneSlotDic, 0);
|
||
this.isParserComplete = true;
|
||
this.event(Laya.Event.COMPLETE, this);
|
||
}
|
||
getTexture(name) {
|
||
var tTexture = this.subTextureDic[name];
|
||
if (!tTexture) {
|
||
tTexture = this.subTextureDic[name.substr(0, name.length - 1)];
|
||
}
|
||
if (tTexture == null) {
|
||
return this._mainTexture;
|
||
}
|
||
return tTexture;
|
||
}
|
||
showSkinByIndex(boneSlotDic, skinIndex, freshDisplayIndex = true) {
|
||
if (skinIndex < 0 && skinIndex >= this.skinDataArray.length)
|
||
return false;
|
||
var i, n;
|
||
var tBoneSlot;
|
||
var tSlotData;
|
||
var tSkinData = this.skinDataArray[skinIndex];
|
||
if (tSkinData) {
|
||
for (i = 0, n = tSkinData.slotArr.length; i < n; i++) {
|
||
tSlotData = tSkinData.slotArr[i];
|
||
if (tSlotData) {
|
||
tBoneSlot = boneSlotDic[tSlotData.name];
|
||
if (tBoneSlot) {
|
||
tBoneSlot.showSlotData(tSlotData, freshDisplayIndex);
|
||
if (freshDisplayIndex && tBoneSlot.attachmentName != "undefined" && tBoneSlot.attachmentName != "null") {
|
||
tBoneSlot.showDisplayByName(tBoneSlot.attachmentName);
|
||
}
|
||
else {
|
||
tBoneSlot.showDisplayByIndex(tBoneSlot.displayIndex);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
getSkinIndexByName(skinName) {
|
||
var tSkinData;
|
||
for (var i = 0, n = this.skinDataArray.length; i < n; i++) {
|
||
tSkinData = this.skinDataArray[i];
|
||
if (tSkinData.name == skinName) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
getGrahicsDataWithCache(aniIndex, frameIndex) {
|
||
if (this._graphicsCache[aniIndex] && this._graphicsCache[aniIndex][frameIndex]) {
|
||
return this._graphicsCache[aniIndex][frameIndex];
|
||
}
|
||
return null;
|
||
}
|
||
_setCreateURL(url) {
|
||
this._skBufferUrl = this._relativeUrl = url;
|
||
super._setCreateURL(url);
|
||
}
|
||
setGrahicsDataWithCache(aniIndex, frameIndex, graphics) {
|
||
this._graphicsCache[aniIndex][frameIndex] = graphics;
|
||
}
|
||
deleteAniData(aniIndex) {
|
||
if (this._anis[aniIndex]) {
|
||
var tAniDataO = this._anis[aniIndex];
|
||
tAniDataO.bone3DMap = null;
|
||
tAniDataO.nodes = null;
|
||
}
|
||
}
|
||
destroy() {
|
||
this._isDestroyed = true;
|
||
var tTexture;
|
||
for (tTexture in this.subTextureDic) {
|
||
if (tTexture) {
|
||
this.subTextureDic[tTexture].destroy();
|
||
}
|
||
}
|
||
for (tTexture in this._textureDic) {
|
||
if (tTexture) {
|
||
this._textureDic[tTexture].destroy();
|
||
}
|
||
}
|
||
var tSkinSlotDisplayData;
|
||
for (var i = 0, n = this.skinSlotDisplayDataArr.length; i < n; i++) {
|
||
tSkinSlotDisplayData = this.skinSlotDisplayDataArr[i];
|
||
tSkinSlotDisplayData.destory();
|
||
}
|
||
this.skinSlotDisplayDataArr.length = 0;
|
||
if (this._relativeUrl) {
|
||
delete Templet.TEMPLET_DICTIONARY[this._relativeUrl];
|
||
}
|
||
super.destroy();
|
||
Laya.ILaya.loader.clearRes(this._skBufferUrl);
|
||
}
|
||
getAniNameByIndex(index) {
|
||
var tAni = this.getAnimation(index);
|
||
if (tAni)
|
||
return tAni.name;
|
||
return null;
|
||
}
|
||
get rate() {
|
||
return this._rate;
|
||
}
|
||
set rate(v) {
|
||
this._rate = v;
|
||
}
|
||
}
|
||
Templet.LAYA_ANIMATION_160_VISION = "LAYAANIMATION:1.6.0";
|
||
Templet.LAYA_ANIMATION_VISION = "LAYAANIMATION:1.7.0";
|
||
IAniLib.Templet = Templet;
|
||
|
||
class MovieClip extends Laya.Sprite {
|
||
constructor(parentMovieClip = null) {
|
||
super();
|
||
this._start = 0;
|
||
this._Pos = 0;
|
||
this._ended = true;
|
||
this._loadedImage = {};
|
||
this._endFrame = -1;
|
||
this.interval = 30;
|
||
this._ids = {};
|
||
this._idOfSprite = [];
|
||
this._reset();
|
||
this._playing = false;
|
||
this._parentMovieClip = parentMovieClip;
|
||
if (!parentMovieClip) {
|
||
this._movieClipList = [this];
|
||
this._isRoot = true;
|
||
this._setBitUp(Laya.Const.DISPLAY);
|
||
}
|
||
else {
|
||
this._isRoot = false;
|
||
this._movieClipList = parentMovieClip._movieClipList;
|
||
this._movieClipList.push(this);
|
||
}
|
||
}
|
||
destroy(destroyChild = true) {
|
||
this._clear();
|
||
super.destroy(destroyChild);
|
||
}
|
||
_setDisplay(value) {
|
||
super._setDisplay(value);
|
||
if (this._isRoot) {
|
||
this._onDisplay(value);
|
||
}
|
||
}
|
||
_onDisplay(value) {
|
||
if (value)
|
||
this.timer.loop(this.interval, this, this.updates, null, true);
|
||
else
|
||
this.timer.clear(this, this.updates);
|
||
}
|
||
updates() {
|
||
if (this._parentMovieClip)
|
||
return;
|
||
var i, len;
|
||
len = this._movieClipList.length;
|
||
for (i = 0; i < len; i++) {
|
||
this._movieClipList[i] && this._movieClipList[i]._update();
|
||
}
|
||
}
|
||
get index() {
|
||
return this._playIndex;
|
||
}
|
||
set index(value) {
|
||
this._playIndex = value;
|
||
if (this._data)
|
||
this._displayFrame(this._playIndex);
|
||
if (this._labels && this._labels[value])
|
||
this.event(Laya.Event.LABEL, this._labels[value]);
|
||
}
|
||
addLabel(label, index) {
|
||
if (!this._labels)
|
||
this._labels = {};
|
||
this._labels[index] = label;
|
||
}
|
||
removeLabel(label) {
|
||
if (!label)
|
||
this._labels = null;
|
||
else if (!this._labels) {
|
||
for (var name in this._labels) {
|
||
if (this._labels[name] === label) {
|
||
delete this._labels[name];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
get count() {
|
||
return this._count;
|
||
}
|
||
get playing() {
|
||
return this._playing;
|
||
}
|
||
_update() {
|
||
if (!this._data)
|
||
return;
|
||
if (!this._playing)
|
||
return;
|
||
this._playIndex++;
|
||
if (this._playIndex >= this._count) {
|
||
if (!this.loop) {
|
||
this._playIndex--;
|
||
this.stop();
|
||
return;
|
||
}
|
||
this._playIndex = 0;
|
||
}
|
||
this._parseFrame(this._playIndex);
|
||
if (this._labels && this._labels[this._playIndex])
|
||
this.event(Laya.Event.LABEL, this._labels[this._playIndex]);
|
||
if (this._endFrame != -1 && this._endFrame == this._playIndex) {
|
||
this._endFrame = -1;
|
||
if (this._completeHandler != null) {
|
||
var handler = this._completeHandler;
|
||
this._completeHandler = null;
|
||
handler.run();
|
||
}
|
||
this.stop();
|
||
}
|
||
}
|
||
stop() {
|
||
this._playing = false;
|
||
}
|
||
gotoAndStop(index) {
|
||
this.index = index;
|
||
this.stop();
|
||
}
|
||
_clear() {
|
||
this.stop();
|
||
this._idOfSprite.length = 0;
|
||
if (!this._parentMovieClip) {
|
||
this.timer.clear(this, this.updates);
|
||
var i, len;
|
||
len = this._movieClipList.length;
|
||
for (i = 0; i < len; i++) {
|
||
if (this._movieClipList[i] != this)
|
||
this._movieClipList[i]._clear();
|
||
}
|
||
this._movieClipList.length = 0;
|
||
}
|
||
if (this._atlasPath) {
|
||
Laya.ILaya.Loader.clearRes(this._atlasPath);
|
||
}
|
||
var key;
|
||
for (key in this._loadedImage) {
|
||
if (this._loadedImage[key]) {
|
||
Laya.ILaya.Loader.clearRes(key);
|
||
this._loadedImage[key] = false;
|
||
}
|
||
}
|
||
this.removeChildren();
|
||
this.graphics = null;
|
||
this._parentMovieClip = null;
|
||
}
|
||
play(index = 0, loop = true) {
|
||
this.loop = loop;
|
||
this._playing = true;
|
||
if (this._data)
|
||
this._displayFrame(index);
|
||
}
|
||
_displayFrame(frameIndex = -1) {
|
||
if (frameIndex != -1) {
|
||
if (this._curIndex > frameIndex)
|
||
this._reset();
|
||
this._parseFrame(frameIndex);
|
||
}
|
||
}
|
||
_reset(rm = true) {
|
||
if (rm && this._curIndex != 1)
|
||
this.removeChildren();
|
||
this._preIndex = this._curIndex = -1;
|
||
this._Pos = this._start;
|
||
}
|
||
_parseFrame(frameIndex) {
|
||
var mc, sp, key, type, tPos, ttype, ifAdd = false;
|
||
var _idOfSprite = this._idOfSprite, _data = this._data, eStr;
|
||
if (this._ended)
|
||
this._reset();
|
||
_data.pos = this._Pos;
|
||
this._ended = false;
|
||
this._playIndex = frameIndex;
|
||
if (this._curIndex > frameIndex && frameIndex < this._preIndex) {
|
||
this._reset(true);
|
||
_data.pos = this._Pos;
|
||
}
|
||
while ((this._curIndex <= frameIndex) && (!this._ended)) {
|
||
type = _data.getUint16();
|
||
switch (type) {
|
||
case 12:
|
||
key = _data.getUint16();
|
||
tPos = this._ids[_data.getUint16()];
|
||
this._Pos = _data.pos;
|
||
_data.pos = tPos;
|
||
if ((ttype = _data.getUint8()) == 0) {
|
||
var pid = _data.getUint16();
|
||
sp = _idOfSprite[key];
|
||
if (!sp) {
|
||
sp = _idOfSprite[key] = new Laya.Sprite();
|
||
var spp = new Laya.Sprite();
|
||
spp.loadImage(this.basePath + pid + ".png");
|
||
this._loadedImage[this.basePath + pid + ".png"] = true;
|
||
sp.addChild(spp);
|
||
spp.size(_data.getFloat32(), _data.getFloat32());
|
||
var mat = _data._getMatrix();
|
||
spp.transform = mat;
|
||
}
|
||
sp.alpha = 1;
|
||
}
|
||
else if (ttype == 1) {
|
||
mc = _idOfSprite[key];
|
||
if (!mc) {
|
||
_idOfSprite[key] = mc = new MovieClip(this);
|
||
mc.interval = this.interval;
|
||
mc._ids = this._ids;
|
||
mc.basePath = this.basePath;
|
||
mc._setData(_data, tPos);
|
||
mc._initState();
|
||
mc.play(0);
|
||
}
|
||
mc.alpha = 1;
|
||
}
|
||
_data.pos = this._Pos;
|
||
break;
|
||
case 3:
|
||
var node = _idOfSprite[_data.getUint16()];
|
||
if (node) {
|
||
this.addChild(node);
|
||
node.zOrder = _data.getUint16();
|
||
ifAdd = true;
|
||
}
|
||
break;
|
||
case 4:
|
||
node = _idOfSprite[_data.getUint16()];
|
||
node && node.removeSelf();
|
||
break;
|
||
case 5:
|
||
_idOfSprite[_data.getUint16()][MovieClip._ValueList[_data.getUint16()]] = (_data.getFloat32());
|
||
break;
|
||
case 6:
|
||
_idOfSprite[_data.getUint16()].visible = (_data.getUint8() > 0);
|
||
break;
|
||
case 7:
|
||
sp = _idOfSprite[_data.getUint16()];
|
||
var mt = sp.transform || Laya.Matrix.create();
|
||
mt.setTo(_data.getFloat32(), _data.getFloat32(), _data.getFloat32(), _data.getFloat32(), _data.getFloat32(), _data.getFloat32());
|
||
sp.transform = mt;
|
||
break;
|
||
case 8:
|
||
_idOfSprite[_data.getUint16()].setPos(_data.getFloat32(), _data.getFloat32());
|
||
break;
|
||
case 9:
|
||
_idOfSprite[_data.getUint16()].setSize(_data.getFloat32(), _data.getFloat32());
|
||
break;
|
||
case 10:
|
||
_idOfSprite[_data.getUint16()].alpha = _data.getFloat32();
|
||
break;
|
||
case 11:
|
||
_idOfSprite[_data.getUint16()].setScale(_data.getFloat32(), _data.getFloat32());
|
||
break;
|
||
case 98:
|
||
eStr = _data.getString();
|
||
this.event(eStr);
|
||
if (eStr == "stop")
|
||
this.stop();
|
||
break;
|
||
case 99:
|
||
this._curIndex = _data.getUint16();
|
||
ifAdd && this.updateZOrder();
|
||
break;
|
||
case 100:
|
||
this._count = this._curIndex + 1;
|
||
this._ended = true;
|
||
if (this._playing) {
|
||
this.event(Laya.Event.FRAME);
|
||
this.event(Laya.Event.END);
|
||
this.event(Laya.Event.COMPLETE);
|
||
}
|
||
this._reset(false);
|
||
break;
|
||
}
|
||
}
|
||
if (this._playing && !this._ended)
|
||
this.event(Laya.Event.FRAME);
|
||
this._Pos = _data.pos;
|
||
}
|
||
_setData(data, start) {
|
||
this._data = data;
|
||
this._start = start + 3;
|
||
}
|
||
set url(path) {
|
||
this.load(path);
|
||
}
|
||
load(url, atlas = false, atlasPath = null) {
|
||
this._url = url;
|
||
if (atlas)
|
||
this._atlasPath = atlasPath ? atlasPath : url.split(".swf")[0] + ".json";
|
||
this.stop();
|
||
this._clear();
|
||
this._movieClipList = [this];
|
||
var urls;
|
||
urls = [{ url: url, type: Laya.ILaya.Loader.BUFFER }];
|
||
if (this._atlasPath) {
|
||
urls.push({ url: this._atlasPath, type: Laya.ILaya.Loader.ATLAS });
|
||
}
|
||
Laya.ILaya.loader.load(urls, Laya.Handler.create(this, this._onLoaded));
|
||
}
|
||
_onLoaded() {
|
||
var data;
|
||
data = Laya.ILaya.Loader.getRes(this._url);
|
||
if (!data) {
|
||
this.event(Laya.Event.ERROR, "file not find");
|
||
return;
|
||
}
|
||
if (this._atlasPath && !Laya.ILaya.Loader.getAtlas(this._atlasPath)) {
|
||
this.event(Laya.Event.ERROR, "Atlas not find");
|
||
return;
|
||
}
|
||
this.basePath = this._atlasPath ? Laya.ILaya.Loader.getAtlas(this._atlasPath).dir : this._url.split(".swf")[0] + "/image/";
|
||
this._initData(data);
|
||
}
|
||
_initState() {
|
||
this._reset();
|
||
this._ended = false;
|
||
var preState = this._playing;
|
||
this._playing = false;
|
||
this._curIndex = 0;
|
||
while (!this._ended)
|
||
this._parseFrame(++this._curIndex);
|
||
this._playing = preState;
|
||
}
|
||
_initData(data) {
|
||
this._data = new Laya.Byte(data);
|
||
var i, len = this._data.getUint16();
|
||
for (i = 0; i < len; i++)
|
||
this._ids[this._data.getInt16()] = this._data.getInt32();
|
||
this.interval = 1000 / this._data.getUint16();
|
||
this._setData(this._data, this._ids[32767]);
|
||
this._initState();
|
||
this.play(0);
|
||
this.event(Laya.Event.LOADED);
|
||
if (!this._parentMovieClip)
|
||
this.timer.loop(this.interval, this, this.updates, null, true);
|
||
}
|
||
playTo(start, end, complete = null) {
|
||
this._completeHandler = complete;
|
||
this._endFrame = end;
|
||
this.play(start, false);
|
||
}
|
||
}
|
||
MovieClip._ValueList = ["x", "y", "width", "height", "scaleX", "scaleY", "rotation", "alpha"];
|
||
|
||
exports.AnimationContent = AnimationContent;
|
||
exports.AnimationNodeContent = AnimationNodeContent;
|
||
exports.AnimationParser01 = AnimationParser01;
|
||
exports.AnimationParser02 = AnimationParser02;
|
||
exports.AnimationPlayer = AnimationPlayer;
|
||
exports.AnimationState = AnimationState;
|
||
exports.AnimationTemplet = AnimationTemplet;
|
||
exports.BezierLerp = BezierLerp;
|
||
exports.Bone = Bone;
|
||
exports.BoneSlot = BoneSlot;
|
||
exports.DeformAniData = DeformAniData;
|
||
exports.DeformSlotData = DeformSlotData;
|
||
exports.DeformSlotDisplayData = DeformSlotDisplayData;
|
||
exports.DrawOrderData = DrawOrderData;
|
||
exports.EventData = EventData;
|
||
exports.GraphicsAni = GraphicsAni;
|
||
exports.IAniLib = IAniLib;
|
||
exports.IkConstraint = IkConstraint;
|
||
exports.IkConstraintData = IkConstraintData;
|
||
exports.KeyFramesContent = KeyFramesContent;
|
||
exports.MeshData = MeshData;
|
||
exports.MovieClip = MovieClip;
|
||
exports.PathConstraint = PathConstraint;
|
||
exports.PathConstraintData = PathConstraintData;
|
||
exports.Skeleton = Skeleton;
|
||
exports.SkinData = SkinData;
|
||
exports.SkinMeshForGraphic = SkinMeshForGraphic;
|
||
exports.SkinSlotDisplayData = SkinSlotDisplayData;
|
||
exports.SlotData = SlotData;
|
||
exports.Templet = Templet;
|
||
exports.TfConstraint = TfConstraint;
|
||
exports.TfConstraintData = TfConstraintData;
|
||
exports.Transform = Transform;
|
||
exports.UVTools = UVTools;
|
||
|
||
}(window.Laya = window.Laya || {}, Laya));
|