pbrtools
Version:
laya pbr tools
105 lines (102 loc) • 2.85 kB
JavaScript
/**
* 根据描述创建一个buffer或者描述一个buffer
* 通过描述中的属性来访问或者修改buffer的内容。
*/
class binDataStruct {
constructor(desc) {
this.desc = desc;
var sz = this.calcBufSz(desc);
this.buff = new ArrayBuffer(sz);
this.cook(desc, this.buff, 0);
}
/**
* 返回[type,num]
*/
_gettype(str) {
var st = str.indexOf('[');
var ed = str.indexOf(']');
if (st < 0) {
return [str, 1];
}
if (ed < 0)
throw 'error no ]' + str;
return [str.substr(0, st), parseInt(str.substr(st + 1, ed - st - 1))];
}
cook(desc, buff, off) {
var off = off;
desc.forEach((v) => {
var av = v.split(',');
if (av.length < 2)
throw 'error ' + v;
var ti = this._gettype(av[1]);
var cls = binDataStruct.typeinfo[ti[0]][1];
var num = ti[1];
var isarr = num > 1;
//问题:如果某个uint32或者f32没有按照4对齐会报错。
if (!isarr) {
var dt = new cls(buff, off, 1);
Object.defineProperty(this, av[0], {
set: function (v) { dt[0] = v; },
get: function () { return dt[0]; },
enumerable: true,
configurable: true
});
}
else {
this[av[0]] = new cls(buff, off, num);
}
off += binDataStruct.typeinfo[ti[0]][0] * num;
;
});
}
calcBufSz(desc) {
var sz = 0;
desc.forEach((v) => {
var av = v.split(',');
if (av.length < 2)
throw 'error ' + v;
var ti = this._gettype(av[1]);
var tp = ti[0];
var num = ti[1];
sz += binDataStruct.typeinfo[tp][0] * num;
});
return sz;
}
attachBuff(buff, off) {
this.cook(this.desc, buff, off);
}
}
binDataStruct.typeinfo = {
u8: [1, Uint8Array],
u16: [2, Uint16Array],
u32: [4, Uint32Array],
f32: [4, Float32Array]
};
/**
* 根据描述字符串读写数据
*/
class strDataStruct {
constructor() {
}
desc(str) {
}
size() {
return 0;
}
fromBuff(buff, off) {
}
toBuff(buff, off) {
}
}
/*
//var,type,defvalue
var bf = new binDataStruct(['id,u16','padd,u16','dataoff,u32','datasize,u32']) as any;
bf.datasize=22;
//test
bf = new binDataStruct(['id,u32','dt,u32[4]']) as any;
bf.dt[0]=10;
bf.dt[1]=11;
var bb = new Uint8Array([1,2,3]);
var c=new binDataStruct(['a,u8','b,u8','c,u8'])
c.attachBuff(bb.buffer,0)
*/