pbrtools
Version:
laya pbr tools
106 lines (98 loc) • 2.93 kB
text/typescript
/**
* 根据描述创建一个buffer或者描述一个buffer
* 通过描述中的属性来访问或者修改buffer的内容。
*/
class binDataStruct{
buff:ArrayBuffer;
desc:string[];
static typeinfo={
u8:[1,Uint8Array], //size,class
u16:[2,Uint16Array],
u32:[4,Uint32Array],
f32:[4,Float32Array]
//不要扩展vec2,3,4,mat之类的,不是一个层级的
}
constructor(desc:string[]){
this.desc=desc;
var sz = this.calcBufSz(desc);
this.buff = new ArrayBuffer(sz);
this.cook(desc,this.buff,0);
}
/**
* 返回[type,num]
*/
_gettype(str:string):[string,number]{
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:string[],buff:ArrayBuffer,off:number){
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:string[]){
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:ArrayBuffer,off:number){
this.cook(this.desc,buff,off);
}
}
/**
* 根据描述字符串读写数据
*/
class strDataStruct{
constructor(){
}
desc(str:string){
}
size():number{
return 0;
}
fromBuff(buff:ArrayBuffer, off:number){
}
toBuff(buff:ArrayBuffer,off:number){
}
}
/*
//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)
*/