UNPKG

pbrtools

Version:
106 lines (98 loc) 2.93 kB
/** * 根据描述创建一个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) */