pbrtools
Version:
laya pbr tools
114 lines (113 loc) • 5.29 kB
JavaScript
"use strict";
const buffer_1 = require("./buffer");
const fs = require("fs");
class KeyFramesContent {
constructor() {
this.startTime = 0;
this.duration = 0;
}
}
class AnimationNodeContent {
constructor() {
this.parentIndex = -1;
this.keyframeWidth = 0;
this.lerpType = 0;
this.playTime = 0;
this.dataOffset = 0;
}
}
class AnimationContent {
constructor() {
this.playTime = 0;
this.totalKeyframesLength = 0;
}
}
class aniLoader {
constructor() {
this._aniMap = {};
}
load(src) {
var fbuff = fs.readFileSync(src);
this.buffR = new buffer_1.BufferReader();
this.buffR.init(fbuff.buffer);
var reader = this.buffR;
var version = reader.readString();
this.aniClsName = reader.readString();
var strList = reader.readString().split('\n'); //所有骨骼名称
var aniCount = reader.readU8(); //有多少套动画
var publicDataPos = reader.readU32(); //公用数据POS
var publicExtDataPos = reader.readU32(); //公用扩展数据POS
var publicData;
if (publicDataPos > 0)
publicData = fbuff.buffer.slice(publicDataPos, publicExtDataPos);
if (publicExtDataPos > 0)
this._publicExtData = fbuff.buffer.slice(publicExtDataPos, fbuff.buffer.byteLength);
var publicRead = new buffer_1.BufferReader();
publicRead.init(publicData);
var useParent = !!this.buffR.readU8(); //问题:难道还能不用parent?
this._anis = [];
this._anis.length = aniCount;
for (var i = 0; i < aniCount; i++) {
var ani = this._anis[i] = new AnimationContent();
ani.nodes = [];
var name = ani.name = strList[this.buffR.readU16()];
this._aniMap[name] = i;
ani.bone3DMap = {};
ani.playTime = this.buffR.readF32();
var boneCount = ani.nodes.length = this.buffR.readU8(); //本动画的骨骼数目。本动画?
ani.totalKeyframesLength = 0;
for (var j = 0; j < boneCount; j++) {
var node = ani.nodes[j] = new AnimationNodeContent();
node.childs = [];
var nameIndex = this.buffR.readU16();
if (nameIndex > 0) {
node.name = strList[nameIndex];
ani.bone3DMap[node.name] = j;
}
node.keyFrame = [];
node.parentIndex = this.buffR.readU16();
node.parentIndex == -1 ? node.parent = null : ani.nodes[node.parentIndex];
node.lerpType = this.buffR.readU8(); //该节点插值类型:0为不插值,1为逐节点插值,2为私有插值
var keyframeParamsOffset = this.buffR.readU32(); //相对于数据扩展区的偏移地址
publicRead.readpos = keyframeParamsOffset; //移到数据区
var keyframeDataCount = node.keyframeWidth = publicRead.readU16(); //keyframe数据宽度
ani.totalKeyframesLength += keyframeDataCount;
if (node.lerpType === 0 || node.lerpType === 1) {
node.interpolationMethod = new Array(keyframeDataCount);
node.interpolationMethod.forEach((v, ii) => {
node.interpolationMethod[ii] = aniLoader.interpolation[publicRead.readU8()];
});
}
if (node.parent != null)
node.parent.childs.push(node);
var privateDataLen = this.buffR.readU16(); //
if (privateDataLen > 0) {
node.extenData = this.buffR.buff.slice(this.buffR.readpos, this.buffR.readpos + privateDataLen); //
this.buffR.readpos += privateDataLen;
}
var keyframeCount = this.buffR.readU16();
node.keyFrame.length = keyframeCount;
var startTime = 0;
for (var k = 0, n = keyframeCount; k < n; k++) {
var keyFrame = node.keyFrame[k] = new KeyFramesContent();
keyFrame.duration = this.buffR.readF32();
keyFrame.startTime = startTime;
if (node.lerpType === 2) {
throw 'not imp';
}
keyFrame.data = new Float32Array(keyframeDataCount);
keyFrame.dData = new Float32Array(keyframeDataCount);
keyFrame.nextData = new Float32Array(keyframeDataCount);
for (var l = 0; l < keyframeDataCount; l++) {
keyFrame.data[l] = this.buffR.readF32();
}
startTime += keyFrame.duration;
console.log('starttm=' + startTime);
}
node.playTime = ani.playTime; //节点总时间可能比总时长大,次处修正
}
}
}
}
aniLoader.interpolation = [];
new aniLoader().load('E:/layaair/layaair/publish/LayaAirPublish/samples/as/3d/bin/h5/threeDimen/models/dude/dude.lsani');