pbrtools
Version:
laya pbr tools
136 lines (128 loc) • 3.92 kB
text/typescript
function str2Array(str:string):number[]{
//var te = window['TextEncoder'];
var te = require('text-encoding').TextEncoder;
if(te){
return (new te()).encode(str) as number[];
}else{
throw('no TextEncoder support!')
}
}
export class BufferReader{
buff:ArrayBuffer;
readpos=0;
viewer:DataView;
init(buff:ArrayBuffer){
this.buff=buff;
this.viewer = new DataView(buff,0);
}
readString():string{
var l = this.viewer.getUint16(this.readpos,true);
this.readpos+=2;
var strBuff = this.buff.slice(this.readpos,l+this.readpos);
this.readpos+=l;
//var texdec = window['TextDecoder'] as any;
var texdec = require('text-encoding').TextDecoder;
var str='';
if( texdec){
var dec = new texdec();
str = dec.decode(new Uint8Array(strBuff))
}else{
alert('不支持TextDecoder')
}
return str;
//str = String.fromCharCode.apply(null,
}
readU8():number{
var r = this.viewer.getUint8(this.readpos);
this.readpos++;
return r;
}
readU16():number{
var r = this.viewer.getUint16(this.readpos,true);
this.readpos+=2;
return r;
}
readU32():number{
var r = this.viewer.getUint32(this.readpos,true);
this.readpos+=4;
return r;
}
readF32():number{
var r = this.viewer.getFloat32(this.readpos,true);
this.readpos+=4;
return r;
}
seek(pos:number){
this.readpos=pos;
}
}
/**
* 字符串的写按照先uint16 len再utf8内容的方式
*/
export class BufferWriter{
buff:ArrayBuffer;
datav:DataView;
_writePos=0;
nowrite=false;
constructor(sz?:number){
if(sz>0){
this.buff = new ArrayBuffer(sz);
this.datav = new DataView(this.buff);
}
}
getStrSize(str:string){
return 2+str2Array(str).length;
}
wstr(str:string):BufferWriter{
var strarr = str2Array(str);
this.wu16(strarr.length);
if(!this.nowrite){
var udata = new Uint8Array(strarr);
new Uint8Array(this.buff, this._writePos).set(udata);//TODO test
}
this._writePos+=strarr.length;
return this;
};
wu16(n:number):BufferWriter{
if(!this.nowrite) this.datav.setUint16(this._writePos,n,true);
this._writePos+=2;
return this;
};
wu8(n:number):BufferWriter{
if(!this.nowrite) this.datav.setUint8(this._writePos,n);
this._writePos++;
return this;
};
wu32(n:number):BufferWriter{
if(!this.nowrite) this.datav.setUint32(this._writePos,n,true);
this._writePos+=4;
return this;
};
wf32(n:number):BufferWriter{
if(!this.nowrite) this.datav.setFloat32(this._writePos,n,true);
this._writePos+=4;
return this;
};
wab(arraybuffer:ArrayBuffer|DataView, length?:number, offset?:number):BufferWriter {
if(length==undefined || length==null)
length = arraybuffer.byteLength;
if(length==0)return;
offset = offset ? offset : 0;
if (length < 0)
throw "wab error - Out of bounds";
var ab = null;
if (arraybuffer instanceof ArrayBuffer)
ab = arraybuffer;
else if (arraybuffer.buffer)
ab = arraybuffer.buffer;
else
throw "not arraybuffer/dataview ";
if(!this.nowrite){
var uint8array = new Uint8Array(ab, offset, length);
new Uint8Array(this.buff).set(uint8array,this._writePos);
}
this._writePos += length;
//需要对齐么
return this;
}
}