/// class ColorUtil{ static _COLOR_MAP:Object = {"white": '#FFFFFF', "red": '#FF0000', "green": '#00FF00', "blue": '#0000FF', "black": '#000000', "yellow": '#FFFF00', 'gray': '#AAAAAA'}; static getColorNum(str):number { if(!str)return 0; if(typeof(str)=="number") { if(str >= 0xFFFFFF ) return str; return str|0xFF000000; } var len:number; if(str[0]=="#") { var r:string=ColorUtil.getRGBByRGBStr(str); if(r){ return parseInt(r,16); } else return NaN; } else if(str.indexOf("rgb")!=-1){ return ColorUtil.getColNum(str,true); } else if(str.indexOf("hsl")!=-1){ return ColorUtil.getColNum(str,false); } else { var c:string=ColorUtil._COLOR_MAP[str]; return c?ColorUtil.getColorNum(c):NaN; } } static RGBReg:RegExp=new RegExp("rgb([a]{0,1})\\s*[(]([\\d,.\\s-]*)?[)]"); static HSLReg:RegExp=new RegExp("hsl([a]{0,1})\\s*[(]([\\d,.\\s-%]*)?[)]"); static getColNum(c:string,isRgb:boolean):number { var temp:string,i:number,s:number,result:Array=[],st:number; var t:Array=isRgb?ColorUtil.RGBReg.exec(c):ColorUtil.HSLReg.exec(c); if(t) { var r = t[2].split(","); i = 0; s = r.length; while (i < s) { result[i] =parseFloat(r[i]); i++;} var ta:Array=result; if(!isRgb){ ta=ColorUtil.hsl2rgb(result[0]/360,result[1]/100,result[2]/100); } if(i==3&&!t[1]){ return 0xff000000+(ta[0]<<16)+(ta[1]<<8)+ta[2]; } else if(i==4&&t[1]){ return parseInt(Math.floor(0xff*result[3]).toString(16)+"000000",16)+(ta[0]<<16)+(ta[1]<<8)+ta[2]; } return NaN; } else return NaN; } static getRGBByRGBStr(str:string):string { str = str.substr(1); var i:number,len:number=str.length,result:string; switch (len) { case 3: result="ff"; for(i=0;i0xff000000){ color-=0xff000000; } else{ return "rgba("+(color>>16&0xff)+","+(color>>8&0xff)+","+(color&0xff)+","+((color>>24&0xff)/0xff)+")"; } var str:string = color.toString(16); while (str.length < 6) str = "0" + str; return "#" + str; } static hsl2rgb(h:number, s:number, l:number):Array { var r:number, g:number, b:number; if(s == 0){ r = g = b = l; // achromatic }else{ function hue2rgb(p, q, t){ if(t < 0) t += 1; if(t > 1) t -= 1; if(t < 1/6) return p + (q - p) * 6 * t; if(t < 1/2) return q; if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hue2rgb(p, q, h + 1/3); g = hue2rgb(p, q, h); b = hue2rgb(p, q, h - 1/3); } return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; } } class ProgramLocationTable { public _fakeLocationNum:number = 0; public _map:Object = {}; getFakeLocation(fakeProgramID:number, name:string):number { var key:string = fakeProgramID + "-" + name; var fakeID:number = this._map[key]; if (!fakeID) { fakeID = this._fakeLocationNum++; this._map[key] = fakeID; } return fakeID; } } enum FUNCTION_ID { UNIFORMMATRIX2FVEX=0, UNIFORMMATRIX3FVEX, UNIFORMMATRIX4FVEX, ADDSHADERUNIFORM, UPLOADSHADERUNIFORMS, UPLOADSHADERUNIFORMS_BUFFER, USECOMMANDENCODER, LOADDATATOREG, LOADDATATOREGEX, IFLESS0, IFEQUAL0, IFGREATER0, IFLEQUAL0, IFGEQUAL0, IFGNOTEQUAL0, OPERATEREG, STORE, CREATEIMAGEONRENDERTHREAD=64, DELETE_IMAGE_ON_RENDER_THREAD, RELEASE_IMAGE_ON_RENDER_THREAD, SET_IMAGE_RELEASE_SPACE_TIME, SET_PREMULTIPLY_ALPHA, PERFADDDATA, PERFUPDATEDT, SET_MAIN_CONTEXT_SIZE, //------------------------------- GETCONTEXTATTRIBUTES=128, ISCONTEXTLOST, GETSUPPORTEDEXTENSIONS, GETEXTENSION, ACTIVETEXTURE, ATTACHSHADER, BINDATTRIBLOCATION, BINDBUFFER, BINDFRAMEBUFFER, BINDRENDERBUFFER,//第10个 BINDTEXTURE, USETEXTURE, BLENDCOLOR, BLENDEQUATION, BLENDEQUATIONSEPARATE, BLENDFUNC, BLENDFUNCSEPARATE, BUFFERDATA_SIZE, BUFFERDATA_ARRAYBUFFER, BUFFERSUBDATA,//第20个 CHECKFRAMEBUFFERSTATUS, CLEAR, CLEARCOLOR, CLEARDEPTH, CLEARSTENCIL, COLORMASK, COMPILESHADER, COPYTEXIMAGE2D, COPYTEXSUBIMAGE2D, CREATEBUFFER,//第30个 CREATEFRAMEBUFFER, CREATEPROGRAM, CREATERENDERBUFFER, CREATESHADER, CREATETEXTURE, CULLFACE, DELETEBUFFER, DELETEFRAMEBUFFER, DELETEPROGRAM, DELETERENDERBUFFER,//第40个 DELETESHADER, DELETETEXTURE, DEPTHFUNC, DEPTHMASK, DEPTHRANGE, DETACHSHADER, DISABLE, DISABLEVERTEXATTRIBARRAY, DRAWARRAYS, DRAWELEMENTS,//第50个 ENABLE, ENABLEVERTEXATTRIBARRAY, FINISH, FLUSH, FRAMEBUFFERRENDERBUFFER, FRAMEBUFFERTEXTURE2D, FRONTFACE, GENERATEMIPMAP, GETACTIVEATTRIB, GETACTIVEUNIFORM,//第60个 GETATTRIBLOCATION, GETPARAMETER, GETBUFFERPARAMETER, GETERROR, GETFRAMEBUFFERATTACHMENTPARAMETER, GETPROGRAMPARAMETER, GETPROGRAMINFOLOG, GETRENDERBUFFERPARAMETER, GETSHADERPRECISIONFORMAT, GETSHADERPARAMETER,//第70个 GETSHADERINFOLOG, GETSHADERSOURCE, GETTEXPARAMETER, GETUNIFORM, GETUNIFORMLOCATION, GETVERTEXATTRIB, GETVERTEXATTRIBOFFSET, HINT, ISBUFFER, ISENABLED,//第80个 ISFRAMEBUFFER, ISPROGRAM, ISRENDERBUFFER, ISSHADER, ISTEXTURE, LINEWIDTH, LINKPROGRAM, PIXELSTOREI, POLYGONOFFSET, READPIXELS,//第90个 RENDERBUFFERSTORAGE, SAMPLECOVERAGE, SCISSOR, SHADERSOURCE, STENCILFUNC, STENCILFUNCSEPARATE, STENCILMASK, STENCILMASKSEPARATE, STENCILOP, STENCILOPSEPARATE,//第100个 TEXIMAGE2D, TEXPARAMETERF, TEXPARAMETERI, TEXSUBIMAGE2D, UNIFORM1F, UNIFORM1FV, UNIFORM1I, UNIFORM1IV, UNIFORM2F, UNIFORM2FV,//第110个 UNIFORM2I, UNIFORM2IV, UNIFORM3F, UNIFORM3FV, UNIFORM3I, UNIFORM3IV, UNIFORM4F, UNIFORM4FV, UNIFORM4I, UNIFORM4IV,//第120个 UNIFORMMATRIX2FV, UNIFORMMATRIX3FV, UNIFORMMATRIX4FV, USEPROGRAM, VALIDATEPROGRAM, VERTEXATTRIB1F, VERTEXATTRIB1FV, VERTEXATTRIB2F, VERTEXATTRIB2FV, VERTEXATTRIB3F,//第130个 VERTEXATTRIB3FV, VERTEXATTRIB4F, VERTEXATTRIB4FV, VERTEXATTRIBPOINTER, VIEWPORT, CONFIGUREBACKBUFFER, COMPRESSEDTEXIMAGE2D, TEXIMAGE2D_PIXEL, TEXSUBIMAGE2D_PIXEL, CREATEVERTEXARRAY,//第140个 BINDVERTEXARRAY, DELETEVERTEXARRAYS, READPIXELS_ASYNC, COMPRESSEDTEXSUBIMAGE2D, VERTEXATTRIBDIVISOR, DRAWARRAYSINSTANCED, DRAWELEMENTSINSTANCED, TEXIMAGE2DCANVAS, TEXSTORAGE2D, } enum UNIFORM_TYPE { //native用的shaderUniform的函数ID INTERIOR_UNIFORM1F = 0, INTERIOR_UNIFORM1FV, INTERIOR_UNIFORM1I, INTERIOR_UNIFORM1IV, INTERIOR_UNIFORM2F, INTERIOR_UNIFORM2FV, INTERIOR_UNIFORM2I, INTERIOR_UNIFORM2IV, INTERIOR_UNIFORM3F, INTERIOR_UNIFORM3FV, INTERIOR_UNIFORM3I, INTERIOR_UNIFORM3IV, INTERIOR_UNIFORM4F, INTERIOR_UNIFORM4FV, INTERIOR_UNIFORM4I, INTERIOR_UNIFORM4IV, INTERIOR_UNIFORMMATRIX2FV, INTERIOR_UNIFORMMATRIX3FV, INTERIOR_UNIFORMMATRIX4FV, INTERIOR_UNIFORMSAMPLER_2D, INTERIOR_UNIFORMSAMPLER_CUBE, } class BindInfo { constructor() { this.m_bindMap = {} } private m_bindMap:Object; public setBind(pname:any, buffer:any):void { this.m_bindMap[pname] = buffer; } public getBind(pname:any):any { var buffer = this.m_bindMap[pname]; if(!buffer) return null; if(buffer.id == -1) // delete { this.m_bindMap[pname] = null; return null; } return buffer; } } class ANGLEInstancedArrays { constructor(encoder) { this.encoder = encoder; } vertexAttribDivisorANGLE(index:number, divisor:number):void { this.encoder.vertexAttribDivisor(index, divisor); } drawArraysInstancedANGLE(mode:number, first:number, count:number, instanceCount:number):void { this.encoder.drawArraysInstanced(mode, first, count, instanceCount); } drawElementsInstancedANGLE(mode:number, count:number, type:number, offset:number, instanceCount:number):void { this.encoder.drawElementsInstanced(mode, count, type, offset, instanceCount); } public encoder:GLCommandEncoder; } class OESVertexArrayObject { constructor(encoder) { this.encoder = encoder; } createVertexArrayOES():any { return this.encoder.createVertexArray(); } deleteVertexArrayOES(arrayObject:any):void { this.encoder.deleteVertexArray(arrayObject); } isVertexArrayOES(arrayObject:any):boolean { return this.encoder.isVertexArray(arrayObject); } bindVertexArrayOES(arrayObject:any):void { this.encoder.bindVertexArray(arrayObject); } public encoder:GLCommandEncoder; } class OESTextureHalfFloatLinear {} class EXTColorBufferFloat {} class WebGLBuffer { constructor(id) { this.id = id; } public id:number; } class WebGLFrameBuffer { constructor(id) { this.id = id; this.m_bindInfo = new BindInfo(); } public id:number; private m_bindInfo:BindInfo; public setBind(pname:any, buffer:any):void { this.m_bindInfo.setBind(pname, buffer); } public getBind(pname:any):any { return this.m_bindInfo.getBind(pname); } } class WebGLRenderBuffer { constructor(id) { this.id = id; } public id:number; } class WebGLShader { constructor(id,type) { this.id = id; this.type = type; this.compileStatus = 0; this.src = ""; } public id:number; public src:string; public type:number; public compileStatus:number; } class WebGLProgram { constructor(id) { this.id = id; this.linkStatus = 0; this.vsShader = null; this.psShader = null; this.attachedShaderCount = 0; this.m_localMap = {}; } public id:number; public vsShader:WebGLShader; public psShader:WebGLShader; public linkedVSSource:string; public linkedPSSource:string; public linkStatus:number; public attachedShaderCount; private m_localMap:Object; public addLocationPair(fakeLoc:number, name:string) { this.m_localMap[fakeLoc] = name; } public getLocationName(fakeLoc):string { return this.m_localMap[fakeLoc]; } } class WebGLTexture { constructor(id) { this.id = id; } public id:number; } class WebGLVertextArray { constructor(id) { this.id = id; } public id:number; } class CallbackFuncObj { public static s_nID:number=0; constructor() { this.id = CallbackFuncObj.s_nID++; this._nativeObj = new _callbackFuncObj(this.id); } addCallbackFunc(index:number,func:any) { this._vFunc[index] =func; this._nativeObj.addCallbackFunc(index,func); } public id:number; public _vFunc = new Map(); public _nativeObj:_callbackFuncObj; } class fakeIDObj { constructor(id:number=0,frame:number=0) { this.id = id; this.frameCount = frame; } id:number; frameCount:number; } class GLCommandEncoder { private static readonly INT = 0x1404; private static readonly FLOAT = 0x1406; /* Uniform Types */ private static readonly FLOAT_VEC2 = 0x8B50; private static readonly FLOAT_VEC3 = 0x8B51; private static readonly FLOAT_VEC4 = 0x8B52; private static readonly INT_VEC2 = 0x8B53; private static readonly INT_VEC3 = 0x8B54; private static readonly INT_VEC4 = 0x8B55; private static readonly BOOL = 0x8B56; private static readonly BOOL_VEC2 = 0x8B57; private static readonly BOOL_VEC3 = 0x8B58; private static readonly BOOL_VEC4 = 0x8B59; private static readonly FLOAT_MAT2 = 0x8B5A; private static readonly FLOAT_MAT3 = 0x8B5B; private static readonly FLOAT_MAT4 = 0x8B5C; private static readonly SAMPLER_2D = 0x8B5E; private static readonly SAMPLER_CUBE = 0x8B60; private static _fakeIDCount:number = 0; private static _fakeArray=[new fakeIDObj(0,0)]; private static _locTable:ProgramLocationTable = new ProgramLocationTable(); public _idata:Int32Array; public _fdata:Float32Array; public _byteArray:Uint8Array; public _buffer:ArrayBuffer; private _adjustSize:number = 0; private _byteLen:number = 0; private _layagl:any; public _isSyncToRenderThread:Boolean = false; private _readPixelsAsyncCallbackFuncObj = new CallbackFuncObj(); constructor(layagl:any, reserveSize:number, adjustSize:number, isSyncToRenderThread:boolean) { this._isSyncToRenderThread = isSyncToRenderThread; this._layagl = layagl; this._byteLen = reserveSize; this._adjustSize = adjustSize; this._init(isSyncToRenderThread); } _init(isSyncToRenderThread:boolean):void { this._buffer = new ArrayBuffer(this._byteLen); this._idata = new Int32Array(this._buffer); this._fdata = new Float32Array(this._buffer); this._byteArray = new Uint8Array(this._buffer); this._layagl.createArrayBufferRef(this._buffer, LayaGLContext.ARRAY_BUFFER_TYPE_CMD, isSyncToRenderThread); this._idata[0] = 1; } getPtrID():number { return this._buffer["_ptrID"]; } beginEncoding():void { this._layagl.beginCommandEncoding(this); } endEncoding():void { this._layagl.endCommandEncoding(); } clearEncoding():void { this._idata[0] = 1; } getCount():number { return this._idata[0]; } _need(sz:number):void { if ((this._byteLen - (this._idata[0] << 2)) >= sz) return; this._byteLen += (sz > this._adjustSize) ? sz : this._adjustSize; var pre:Int32Array = this._idata; var preConchRef:any = this._buffer["conchRef"]; var prePtrID:number = this._buffer["_ptrID"]; this._buffer = new ArrayBuffer(this._byteLen); this._idata = new Int32Array(this._buffer); this._fdata = new Float32Array(this._buffer); this._byteArray = new Uint8Array(this._buffer); this._buffer["conchRef"] = preConchRef; this._buffer["_ptrID"] = prePtrID; pre && this._idata.set(pre, 0); webglPlus.updateArrayBufferRef(this._buffer["_ptrID"], preConchRef.isSyncToRender(), this._buffer); } add_i(i:number):void { this._need(4); this._idata[this._idata[0]++] = i; } add_f(a:number):void { this._need(4); this._fdata[this._idata[0]++] = a; } add_ff(a:number, b:number):void { this._need(8); var i:number = this._idata[0]; this._fdata[i++] = a; this._fdata[i++] = b; this._idata[0] = i; } add_fff(a:number, b:number, c:number) { this._need(12); var i = this._idata[0]; this._fdata[i++] = a; this._fdata[i++] = b; this._fdata[i++] = c; this._idata[0] = i; } add_ii(a:number, b:number):void { this._need(8); var i:number = this._idata[0]; this._idata[i++] = a; this._idata[i++] = b; this._idata[0] = i; } add_if(a:number, b:number):void { this._need(8); var i:number = this._idata[0]; this._idata[i++] = a; this._fdata[i++] = b; this._idata[0] = i; } add_iii(a:number, b:number, c:number):void { this._need(12); var idata:Int32Array = this._idata; var i:number = this._idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; this._idata[0] = i; } add_iif(a:number, b:number, c:number):void { this._need(12); var idata:Int32Array = this._idata; var i:number = this._idata[0]; idata[i++] = a; idata[i++] = b; this._fdata[i++] = c; this._idata[0] = i; } add_ifi(a:number, b:number, c:number):void { this._need(12); var idata:Int32Array = this._idata; var i:number = this._idata[0]; idata[i++] = a; this._fdata[i++] = b; idata[i++] = c; this._idata[0] = i; } add_iifi(a:number, b:number, c:number, d:number):void { this._need(16); var idata:Int32Array = this._idata; var i:number = this._idata[0]; idata[i++] = a; idata[i++] = b; this._fdata[i++] = c; idata[i++] = d; this._idata[0] = i; } add_iiii(a:number, b:number, c:number, d:number):void { this._need(16); var idata:Int32Array = this._idata; var i:number = this._idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[0] = i; } add_iiif(a:number, b:number, c:number, d:number):void { this._need(16); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; this._fdata[i++] = d; idata[0] = i; } add_iiiif(a:number, b:number, c:number, d:number, e:number):void { this._need(20); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; this._fdata[i++] = e; idata[0] = i; } add_iiiff(a:number, b:number, c:number, d:number,e:number):void { this._need(20); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; this._fdata[i++] = d; this._fdata[i++] = e; idata[0] = i; } add_iiiiff(a:number, b:number, c:number, d:number,e:number,f:number):void { this._need(24); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; this._fdata[i++] = e; this._fdata[i++] = f; idata[0] = i; } add_iiifff(a:number, b:number, c:number, d:number,e:number,f:number):void { this._need(24); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; this._fdata[i++] = d; this._fdata[i++] = e; this._fdata[i++] = f; idata[0] = i; } add_iiiifff(a:number, b:number, c:number, d:number,e:number,f:number,g:number):void { this._need(28); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; this._fdata[i++] = e; this._fdata[i++] = f; this._fdata[i++] = g; idata[0] = i; } add_iiiffff(a:number, b:number, c:number, d:number,e:number,f:number,g:number):void { this._need(28); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; this._fdata[i++] = d; this._fdata[i++] = e; this._fdata[i++] = f; this._fdata[i++] = g; idata[0] = i; } add_iiiiffff(a:number, b:number, c:number, d:number,e:number,f:number,g:number,h:number):void { this._need(32); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; this._fdata[i++] = e; this._fdata[i++] = f; this._fdata[i++] = g; this._fdata[i++] = h; idata[0] = i; } add_iiff(a:number, b:number, c:number, d:number):void { this._need(16); var idata:Int32Array = this._idata; var fdata:Float32Array = this._fdata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; fdata[i++] = c; fdata[i++] = d; idata[0] = i; } add_iifff(a:number, b:number, c:number, d:number, e:number):void { this._need(20); var idata:Int32Array = this._idata; var fdata:Float32Array = this._fdata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; idata[0] = i; } add_iiffff(a:number, b:number, c:number, d:number, e:number, f:number):void { this._need(24); var idata:Int32Array = this._idata; var fdata:Float32Array = this._fdata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; fdata[i++] = f; idata[0] = i; } add_iiiii(a:number, b:number, c:number, d:number, e:number):void { this._need(20); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[0] = i; } add_iiiiii(a:number, b:number, c:number, d:number, e:number, f:number):void { this._need(24); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[0] = i; } add_iiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number):void { this._need(28); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[0] = i; } add_iiiiiiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number,h:number,j:number,k:number,l:number,m:number):void { this._need(48); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[i++] = j; idata[i++] = k; idata[i++] = l; idata[i++] = m; idata[0] = i; } add_iiiiiiiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number,h:number,j:number,k:number,l:number,m:number,n:number):void { this._need(52); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[i++] = j; idata[i++] = k; idata[i++] = l; idata[i++] = m; idata[i++] = n; idata[0] = i; } add_iff(a:number, b:number, c:number):void { this._need(12); var i:number = this._idata[0]; this._idata[i++] = a; this._fdata[i++] = b; this._fdata[i++] = c; this._idata[0] = i; } add_iffi(a:number, b:number, c:number, d:number):void { this._need(16); var i:number = this._idata[0]; this._idata[i++] = a; this._fdata[i++] = b; this._fdata[i++] = c; this._idata[i++] = d; this._idata[0] = i; } add_ifffi(a:number, b:number, c:number, d:number, e:number):void { this._need(20); var i:number = this._idata[0]; this._idata[i++] = a; this._fdata[i++] = b; this._fdata[i++] = c; this._fdata[i++] = d; this._idata[i++] = e; this._idata[0] = i; } add_iffff(a:number, b:number, c:number, d:number, e:number):void { this._need(20); var i:number = this._idata[0]; var fdata:Float32Array = this._fdata; this._idata[i++] = a; fdata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; this._idata[0] = i; } add_iffffi(a:number, b:number, c:number, d:number, e:number, f:number):void { this._need(24); var i:number = this._idata[0]; var fdata:Float32Array = this._fdata; this._idata[i++] = a; fdata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; this._idata[i++] = f; this._idata[0] = i; } add_ifffffi(a:number, b:number, c:number, d:number, e:number, f:number, g:number):void { this._need(28); var i:number = this._idata[0]; var fdata:Float32Array = this._fdata; this._idata[i++] = a; fdata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; fdata[i++] = f; this._idata[i++] = g; this._idata[0] = i; } add_iffffiif(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number):void { this._need(28); var i:number = this._idata[0]; var fdata:Float32Array = this._fdata; this._idata[i++] = a; fdata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; this._idata[i++] = f; this._idata[i++] = g; fdata[i++] = h; this._idata[0] = i; } add_iffffiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number):void { this._need(32); var i:number = this._idata[0]; var fdata:Float32Array = this._fdata; this._idata[i++] = a; fdata[i++] = b; fdata[i++] = c; fdata[i++] = d; fdata[i++] = e; this._idata[i++] = f; this._idata[i++] = g; this._idata[i++] = h; this._idata[0] = i; } add_iiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number):void { this._need(32); var i:number = this._idata[0]; var idata:Int32Array = this._idata; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[0] = i; } add_iiiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number, j:number):void { this._need(36); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[i++] = j; idata[0] = i; } add_iiiiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number, j:number,k:number):void { this._need(40); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[i++] = j; idata[i++] = k; idata[0] = i; } add_iiiiiiiiiii(a:number, b:number, c:number, d:number, e:number, f:number, g:number, h:number, j:number,k:number,l:number):void { this._need(44); var idata:Int32Array = this._idata; var i:number = idata[0]; idata[i++] = a; idata[i++] = b; idata[i++] = c; idata[i++] = d; idata[i++] = e; idata[i++] = f; idata[i++] = g; idata[i++] = h; idata[i++] = j; idata[i++] = k; idata[i++] = l; idata[0] = i; } add_String(str:string, len:number):void { var ab:ArrayBuffer = conch.strTobufer(str); this._need(len + 4); this._idata[this._idata[0]++] = len; if (len == 0) return; var uint8array:Uint8Array = new Uint8Array(ab); this._byteArray.set(uint8array, this._idata[0] * 4); this._idata[0] += len / 4; } wab(arraybuffer:any, length:number, nAlignLength:number, offset?:number):void { offset = offset ? offset : 0; this._need(nAlignLength + 4); //写入长度 this._idata[this._idata[0]++] = length; //写入数据 var uint8array:Uint8Array = null; if (arraybuffer instanceof Float32Array && offset ==0 ) { this._fdata.set(arraybuffer, this._idata[0]); } else { if (arraybuffer instanceof ArrayBuffer) { uint8array = new Uint8Array(arraybuffer, offset, length); } else if (arraybuffer.buffer) { uint8array = new Uint8Array(arraybuffer.buffer, offset+arraybuffer.byteOffset, length); } else { console.log("not arraybuffer/dataview"); return; } this._byteArray.set(uint8array, this._idata[0] * 4); } this._idata[0] += nAlignLength / 4; } copyBuffer(arraybuffer:any, length:number, offset?:number):void { offset = offset ? offset : 0; this._need(length); //写入数据 var ab:any = null; if (arraybuffer instanceof ArrayBuffer) { ab = arraybuffer; } else if (arraybuffer.buffer) { ab = arraybuffer.buffer; } else { console.log("not arraybuffer/dataview "); return; } var uint8array:Uint8Array = new Uint8Array(ab, offset, length); this._byteArray.set(uint8array, this._idata[0] * 4); this._idata[0] += length / 4; } //------------------------------------------------------------------------------ //--------以下是native-webgl函数------------------------------------------------ //------------------------------------------------------------------------------ getContextAttributes():any { return {alpha:false,antialias:false,depth:true,failIfMajorPerformanceCaveat:false,premultipliedAlpha:true,preserveDrawingBuffer:false,stencil:false}; } isContextLost():boolean { console.log("isContextLost can't support"); return false; } getSupportedExtensions():any { let extentions:string[] = this._layagl._nativeObj.getStringEx(0x1F03).split(' '); let version:string = this._layagl._nativeObj.getStringEx(0x1F02); function supports(extention:string) { for (let ext of extentions) { if (ext === extention) { return true; } } return false; } let result:string[] = []; if (supports("GL_EXT_blend_minmax")) result.push("EXT_blend_minmax"); if (supports("GL_EXT_sRGB")) result.push("EXT_sRGB"); if (supports("GL_EXT_frag_depth")) result.push("EXT_frag_depth"); if (supports("GL_OES_texture_float")) result.push("OES_texture_float"); if (supports("GL_OES_texture_float_linear")) result.push("OES_texture_float_linear"); if (supports("GL_OES_texture_half_float")) result.push("OES_texture_half_float"); if (supports("GL_OES_texture_half_float_linear")) result.push("OES_texture_half_float_linear"); if (supports("GL_OES_standard_derivatives")) result.push("OES_standard_derivatives"); if (supports("GL_EXT_shader_texture_lod") || supports("GL_ARB_shader_texture_lod")) result.push("EXT_shader_texture_lod"); if (supports("GL_EXT_texture_filter_anisotropic")) result.push("EXT_texture_filter_anisotropic"); if (supports("GL_OES_vertex_array_object")) result.push("OES_vertex_array_object"); if (supports("GL_OES_element_index_uint")) result.push("OES_element_index_uint"); if (supports("GL_ANGLE_translated_shader_source")) result.push("WEBGL_debug_shaders"); if (supports("GL_AMD_compressed_ATC_texture")) result.push("WEBGL_compressed_texture_atc"); if (supports("GL_IMG_texture_compression_pvrtc")) result.push("WEBGL_compressed_texture_pvrtc"); if (supports("GL_EXT_texture_compression_s3tc") || supports("GL_EXT_texture_compression_dxt1")) result.push("WEBGL_compressed_texture_s3tc"); if (supports("GL_OES_depth_texture") || supports("GL_ARB_depth_texture") || supports("GL_ANGLE_depth_texture")) result.push("WEBGL_depth_texture"); if (version.indexOf("OpenGL ES 3.") != -1) { //result.push("WEBGL_draw_buffers"); result.push("WEBGL_compressed_texture_etc"); } if (supports("ANGLE_instanced_arrays")) result.push("ANGLE_instanced_arrays"); if (supports("GL_EXT_color_buffer_float")) result.push("EXT_color_buffer_float"); if (supports("GL_EXT_color_buffer_half_float")) result.push("EXT_color_buffer_half_float"); if (supports("GL_EXT_disjoint_timer_query")) result.push("EXT_disjoint_timer_query"); if (supports("GL_OES_compressed_ETC1_RGB8_texture")) result.push("WEBGL_compressed_texture_etc1"); if (supports("GL_EXT_texture_compression_s3tc")) result.push("WEBGL_compressed_texture_s3tc"); if (supports("GL_EXT_texture_compression_s3tc_srgb")) result.push("WEBGL_compressed_texture_s3tc_srgb"); /*if (supports("???")) result.push("WEBGL_color_buffer_float"); */ result.push("WEBGL_debug_renderer_info"); result.push("WEBGL_lose_context"); return result; } getExtension(name:string):any { var extention:string = this._layagl._nativeObj.getStringEx(0x1F03);/*GL_EXTENSIONS*/ let extentions:string[] = extention.split(' '); function supports(extention:string) { for (let ext of extentions) { if (ext === extention) { return true; } } return false; } if (name === 'EXT_blend_minmax' && extention.indexOf('GL_EXT_blend_minmax') != -1) { return { MAX_EXT : 32776, MIN_EXT : 32775, }; } else if (name === 'EXT_color_buffer_float' && extention.indexOf('GL_EXT_color_buffer_float') != -1) { return {}; } else if (name === 'EXT_color_buffer_half_float' && extention.indexOf('GL_EXT_color_buffer_half_float') != -1) { return {}; } else if (name === 'EXT_shader_texture_lod' && (extention.indexOf('GL_EXT_shader_texture_lod') != -1 || extention.indexOf('GL_ARB_shader_texture_lod') != -1)) { return {}; } else if (name === 'OES_element_index_uint' && extention.indexOf('GL_OES_element_index_uint') != -1) { return {}; } else if (name === 'EXT_sRGB' && extention.indexOf('GL_EXT_sRGB') != -1) { return { SRGB_EXT : 0x8C40, SRGB_ALPHA_EXT : 0x8C42, SRGB8_ALPHA8_EXT : 0x8C43, FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT : 0x8210 }; } else if (name === 'WEBGL_compressed_texture_pvrtc' && extention.indexOf('GL_IMG_texture_compression_pvrtc') != -1) { return { COMPRESSED_RGBA_PVRTC_2BPPV1_IMG : 35843, COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : 35842, COMPRESSED_RGB_PVRTC_2BPPV1_IMG : 35841, COMPRESSED_RGB_PVRTC_4BPPV1_IMG : 35840, }; } else if (name === 'WEBGL_compressed_texture_etc1' && extention.indexOf('GL_OES_compressed_ETC1_RGB8_texture') != -1) { return {COMPRESSED_RGB_ETC1_WEBGL : 36196}; } else if (name === 'WEBGL_compressed_texture_s3tc' && supports('GL_EXT_texture_compression_s3tc'))//和下面易混淆,所以用supports { return { COMPRESSED_RGBA_S3TC_DXT1_EXT : 33777, COMPRESSED_RGBA_S3TC_DXT3_EXT : 33778, COMPRESSED_RGBA_S3TC_DXT5_EXT : 33779, COMPRESSED_RGB_S3TC_DXT1_EXT : 33776, }; } else if (name === 'WEBGL_compressed_texture_s3tc_srgb' && extention.indexOf('GL_EXT_texture_compression_s3tc_srgb') != -1) { return { COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT : 35917, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT : 35918, COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT : 35919, COMPRESSED_SRGB_S3TC_DXT1_EXT : 35916, }; } else if (name === 'WEBGL_debug_renderer_info') { return { UNMASKED_RENDERER_WEBGL : 37446, UNMASKED_VENDOR_WEBGL : 37445, }; } else if (name === 'EXT_texture_filter_anisotropic' && extention.indexOf('GL_EXT_texture_filter_anisotropic') != -1) { return { MAX_TEXTURE_MAX_ANISOTROPY_EXT : 34047, TEXTURE_MAX_ANISOTROPY_EXT : 34046, }; } else if (name.indexOf('ANGLE_instanced_arrays') != -1 && (conchConfig.glCaps & GL_CAPS.INSTANCEING)) { return new ANGLEInstancedArrays(this); } else if (name.indexOf('OES_vertex_array_object') != -1 && extention.indexOf('GL_OES_vertex_array_object') != -1) { return new OESVertexArrayObject(this); } else if (name.indexOf('OES_texture_half_float') != -1 && extention.indexOf('GL_OES_texture_half_float') != -1) { return {HALF_FLOAT_OES: 36193}; } else if (name.indexOf('OES_texture_half_float_linear') != -1 && extention.indexOf('GL_OES_texture_half_float_linear') != -1) { return new OESTextureHalfFloatLinear(); } else if (name.indexOf('EXT_color_buffer_float') != -1 && extention.indexOf('GL_EXT_color_buffer_float') != -1) { return new EXTColorBufferFloat(); } else if (name.indexOf('WEBGL_depth_texture') != -1 && ((supports("GL_OES_depth_texture") || supports("GL_ARB_depth_texture") || supports("GL_ANGLE_depth_texture")))) { return {UNSIGNED_INT_24_8_WEBGL:34042}; } else { console.log("getExtension " + name + " 尚未支持"); } return null; } activeTexture(texture:number):void { this.add_ii(FUNCTION_ID.ACTIVETEXTURE, texture); } attachShader(program:WebGLProgram, shader:WebGLShader):void { if(shader.type == LayaGLContext.VERTEX_SHADER) { if(program.vsShader) return; program.vsShader = shader; program.attachedShaderCount++; } else if(shader.type == LayaGLContext.FRAGMENT_SHADER) { if(program.psShader) return; program.psShader = shader; program.attachedShaderCount++; } this.add_iii(FUNCTION_ID.ATTACHSHADER, program.id, shader.id); } bindAttribLocation(program:WebGLProgram, index:number, name:string):void { var strLen = this.getStrLength(name); this.add_iii(FUNCTION_ID.BINDATTRIBLOCATION, program.id, index); this.add_String(name, strLen); } bindBuffer(target:number, buffer:WebGLBuffer):void { this.add_iii(FUNCTION_ID.BINDBUFFER, target, buffer?buffer.id:0); } bindFramebuffer(target:number, framebuffer:WebGLFrameBuffer):void { this.add_iii(FUNCTION_ID.BINDFRAMEBUFFER, target, framebuffer?framebuffer.id:0); } bindRenderbuffer(target:number, renderbuffer:WebGLRenderBuffer):void { this.add_iii(FUNCTION_ID.BINDRENDERBUFFER, target, renderbuffer?renderbuffer.id:0); } bindTexture(target:number, texture:WebGLTexture):void { this.add_iii(FUNCTION_ID.BINDTEXTURE, target, texture?texture.id:0); } useTexture(texture:WebGLTexture):void { this.add_ii(FUNCTION_ID.USETEXTURE, texture?texture.id:0); } blendColor(red:number, green:number, blue:number, alpha:number):void { this.add_iffff(FUNCTION_ID.BLENDCOLOR, red, green, blue, alpha); } blendEquation(mode:number):void { this.add_ii(FUNCTION_ID.BLENDEQUATION, mode); } blendEquationSeparate(modeRGB:number, modeAlpha:number):void { this.add_iii(FUNCTION_ID.BLENDEQUATIONSEPARATE, modeRGB, modeAlpha); } blendFunc(sfactor:number, dfactor:number):void { this.add_iii(FUNCTION_ID.BLENDFUNC, sfactor, dfactor); } blendFuncSeparate(srcRGB:number, dstRGB:number, srcAlpha:number, dstAlpha:number):void { this.add_iiiii(FUNCTION_ID.BLENDFUNCSEPARATE, srcRGB, dstRGB, srcAlpha, dstAlpha); } bufferData(target:number, sizeOrArray:any, usage:number):void { if( ArrayBuffer.isView(sizeOrArray) || ( sizeOrArray instanceof ArrayBuffer) ) { var nAlignLength = this.getAlignLength(sizeOrArray); this.add_iii(FUNCTION_ID.BUFFERDATA_ARRAYBUFFER, target, usage); this.wab(sizeOrArray, sizeOrArray.byteLength, nAlignLength); } else { var size:number = sizeOrArray; this.add_iiii(FUNCTION_ID.BUFFERDATA_SIZE, target, size, usage); } } bufferSubData(target:number, offset:number, data:any):void { var nAlignLength = this.getAlignLength(data); this.add_iii(FUNCTION_ID.BUFFERSUBDATA, target, offset); this.wab(data, data.byteLength, nAlignLength); } checkFramebufferStatus(target:any):any { return this._layagl._nativeObj.checkFramebufferStatusEx(target); } clear(mask:number):void { this.add_ii(FUNCTION_ID.CLEAR, mask); } clearColor(red:number, green:number, blue:number, alpha:number):void { this.add_iffff(FUNCTION_ID.CLEARCOLOR, red, green, blue, alpha); } clearDepth(depth:number):void { this.add_if(FUNCTION_ID.CLEARDEPTH, depth); } clearStencil(s:number):void { this.add_ii(FUNCTION_ID.CLEARSTENCIL, s); } colorMask(red:number, green:number, blue:number, alpha:number):void { this.add_iiiii(FUNCTION_ID.COLORMASK, red, green, blue, alpha); } compileShader(shader:WebGLShader):void { this.add_ii(FUNCTION_ID.COMPILESHADER, shader.id); shader.compileStatus = this._layagl._nativeObj.getShaderParameter(shader.src, shader.type, LayaGLContext.COMPILE_STATUS); } copyTexImage2D(target:number, level:number, internalformat:number, x:number, y:number, width:number, height:number, border:number):void { this.add_iiiiiiiii(FUNCTION_ID.COPYTEXIMAGE2D, target, level, internalformat, x, y, width, height, border); } copyTexSubImage2D(target:number, level:number, xoffset:number, yoffset:number, x:number, y:number, width:number, height:number):void { this.add_iiiiiiiii(FUNCTION_ID.COPYTEXSUBIMAGE2D, target, level, xoffset, yoffset, x, y, width, height); } createBuffer():WebGLBuffer { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATEBUFFER, fakeID); return new WebGLBuffer(fakeID); } createFramebuffer():WebGLFrameBuffer { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATEFRAMEBUFFER, fakeID); return new WebGLFrameBuffer(fakeID); } createProgram():WebGLProgram { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATEPROGRAM, fakeID); return new WebGLProgram(fakeID); } createRenderbuffer():WebGLRenderBuffer { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATERENDERBUFFER, fakeID); return new WebGLRenderBuffer(fakeID); } createShader(type:number):WebGLShader { var fakeID:number = this.createFakeID(); this.add_iii(FUNCTION_ID.CREATESHADER, fakeID, type); return new WebGLShader(fakeID,type); } createTexture():WebGLTexture { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATETEXTURE, fakeID); return new WebGLTexture(fakeID); } cullFace(mode:number):void { this.add_ii(FUNCTION_ID.CULLFACE, mode); } deleteBuffer(buffer:WebGLBuffer):void { this.deleteFakeID(buffer.id); this.add_ii(FUNCTION_ID.DELETEBUFFER, buffer.id); } deleteFramebuffer(framebuffer:WebGLFrameBuffer):void { this.deleteFakeID(framebuffer.id); this.add_ii(FUNCTION_ID.DELETEFRAMEBUFFER, framebuffer.id); } deleteProgram(program:WebGLProgram):void { this.deleteFakeID(program.id); this.add_ii(FUNCTION_ID.DELETEPROGRAM, program.id); } deleteRenderbuffer(renderbuffer:WebGLRenderBuffer):void { this.deleteFakeID(renderbuffer.id); this.add_ii(FUNCTION_ID.DELETERENDERBUFFER, renderbuffer.id); } deleteShader(shader:WebGLShader):void { this.deleteFakeID(shader.id); this.add_ii(FUNCTION_ID.DELETESHADER, shader.id); } deleteTexture(texture:WebGLTexture):void { this.deleteFakeID(texture.id); this.add_ii(FUNCTION_ID.DELETETEXTURE, texture.id); } depthFunc(func:number):void { this.add_ii(FUNCTION_ID.DEPTHFUNC, func); } depthMask(flag:number):void { this.add_ii(FUNCTION_ID.DEPTHMASK, flag); } depthRange(zNear:number, zFar:number):void { this.add_iff(FUNCTION_ID.DEPTHRANGE, zNear, zFar); } detachShader(program:WebGLProgram, shader:WebGLShader):void { let shaderid = -1; if(program.vsShader && program.vsShader.id === shader.id) { shaderid = program.vsShader.id; program.vsShader = null; } else if (program.psShader && program.psShader.id === shader.id) { shaderid = program.psShader.id; program.psShader = null; } if(shaderid > 0) { program.attachedShaderCount--; this.add_iii(FUNCTION_ID.DETACHSHADER, program.id, shaderid); } } disable(cap:number):void { this.add_ii(FUNCTION_ID.DISABLE, cap); } disableVertexAttribArray(index:number):void { this.add_ii(FUNCTION_ID.DISABLEVERTEXATTRIBARRAY, index); } drawArrays(mode:number, first:number, count:number):void { this.add_iiii(FUNCTION_ID.DRAWARRAYS, mode, first, count); } drawElements(mode:number, count:number, type:number, offset:number):void { this.add_iiiii(FUNCTION_ID.DRAWELEMENTS, mode, count, type, offset); } enable(cap:number):void { this.add_ii(FUNCTION_ID.ENABLE, cap); } enableVertexAttribArray(index:number):void { this.add_ii(FUNCTION_ID.ENABLEVERTEXATTRIBARRAY, index); } finish():void { this.add_i(FUNCTION_ID.FINISH); } flush():void { this.add_i(FUNCTION_ID.FLUSH); } framebufferRenderbuffer(target:number, attachment:number, renderbuffertarget:number, renderbuffer:WebGLRenderBuffer):void { this.add_iiiii(FUNCTION_ID.FRAMEBUFFERRENDERBUFFER, target, attachment, renderbuffertarget, renderbuffer ? renderbuffer.id : 0); } framebufferTexture2D(target:number, attachment:number, textarget:number, texture:WebGLTexture, level:number):void { this.add_iiiiii(FUNCTION_ID.FRAMEBUFFERTEXTURE2D, target, attachment, textarget, texture ? texture.id : 0, level); } frontFace(mode:number):void { this.add_ii(FUNCTION_ID.FRONTFACE, mode); } generateMipmap(target:number):void { this.add_ii(FUNCTION_ID.GENERATEMIPMAP, target); } getActiveAttrib(program:WebGLProgram, index:number):any { return this._layagl._nativeObj.getActiveAttribEx(program.linkedVSSource,program.linkedPSSource,"",index); } getActiveUniform(program:WebGLProgram, index:number):any { return this._layagl._nativeObj.getActiveUniformEx(program.linkedVSSource,program.linkedPSSource,"",index); } getAttribLocation(program:WebGLProgram, name:string):number { return this._layagl._nativeObj.getAttribLocationEx(program.linkedVSSource,program.linkedPSSource,"",name); } getParameter(pname:number):any { var gl:LayaGLContext = this._layagl; var result:any = 0; switch(pname) { case LayaGLContext.ACTIVE_TEXTURE: case LayaGLContext.ALPHA_BITS: case LayaGLContext.BLEND_DST_ALPHA: case LayaGLContext.BLEND_DST_RGB: case LayaGLContext.BLEND_EQUATION: case LayaGLContext.BLEND_EQUATION_ALPHA: case LayaGLContext.BLEND_EQUATION_RGB: case LayaGLContext.BLEND_SRC_ALPHA: case LayaGLContext.BLEND_SRC_RGB: case LayaGLContext.BLUE_BITS: case LayaGLContext.CULL_FACE_MODE: case LayaGLContext.DEPTH_BITS: case LayaGLContext.DEPTH_FUNC: case LayaGLContext.FRONT_FACE: case LayaGLContext.GENERATE_MIPMAP_HINT: case LayaGLContext.GREEN_BITS: case LayaGLContext.IMPLEMENTATION_COLOR_READ_FORMAT: case LayaGLContext.IMPLEMENTATION_COLOR_READ_TYPE: case LayaGLContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS: case LayaGLContext.MAX_CUBE_MAP_TEXTURE_SIZE: case LayaGLContext.MAX_FRAGMENT_UNIFORM_VECTORS: case LayaGLContext.MAX_RENDERBUFFER_SIZE: case LayaGLContext.MAX_TEXTURE_IMAGE_UNITS: case LayaGLContext.MAX_TEXTURE_SIZE: case LayaGLContext.MAX_VARYING_VECTORS: case LayaGLContext.MAX_VERTEX_ATTRIBS: case LayaGLContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS: case LayaGLContext.MAX_VERTEX_UNIFORM_VECTORS: case LayaGLContext.SAMPLE_BUFFERS: case LayaGLContext.SAMPLES: case LayaGLContext.STENCIL_BACK_FAIL: case LayaGLContext.STENCIL_BACK_FUNC: case LayaGLContext.STENCIL_BACK_PASS_DEPTH_FAIL: case LayaGLContext.STENCIL_BACK_PASS_DEPTH_PASS: case LayaGLContext.STENCIL_BACK_REF: case LayaGLContext.STENCIL_BACK_VALUE_MASK: case LayaGLContext.STENCIL_BACK_WRITEMASK: case LayaGLContext.STENCIL_BITS: case LayaGLContext.STENCIL_CLEAR_VALUE: case LayaGLContext.STENCIL_FAIL: case LayaGLContext.STENCIL_FUNC: case LayaGLContext.STENCIL_PASS_DEPTH_FAIL: case LayaGLContext.STENCIL_PASS_DEPTH_PASS: case LayaGLContext.STENCIL_REF: case LayaGLContext.STENCIL_VALUE_MASK: case LayaGLContext.STENCIL_WRITEMASK: case LayaGLContext.SUBPIXEL_BITS: case LayaGLContext.UNPACK_ALIGNMENT: result = gl._nativeObj.getIntegerv(pname) break; case LayaGLContext.CURRENT_PROGRAM: gl._nativeObj.flushCommand(); result = this._layagl.getBind(pname); break; case LayaGLContext.ARRAY_BUFFER_BINDING: gl._nativeObj.flushCommand(); result = this._layagl.getBind(LayaGLContext.ARRAY_BUFFER); break; case LayaGLContext.ELEMENT_ARRAY_BUFFER_BINDING: gl._nativeObj.flushCommand(); result = this._layagl.getBind(LayaGLContext.ELEMENT_ARRAY_BUFFER) break; case LayaGLContext.RENDERBUFFER_BINDING: gl._nativeObj.flushCommand(); result = this._layagl.getBind(LayaGLContext.RENDERBUFFER) break; case LayaGLContext.TEXTURE_BINDING_2D: gl._nativeObj.flushCommand(); result = this._layagl.getBind(LayaGLContext.TEXTURE_2D); break; case LayaGLContext.TEXTURE_BINDING_CUBE_MAP: gl._nativeObj.flushCommand(); result = this._layagl.getBind(LayaGLContext.TEXTURE_CUBE_MAP); break; case LayaGLContext.BLEND: case LayaGLContext.CULL_FACE: case LayaGLContext.DEPTH_TEST: case LayaGLContext.DEPTH_WRITEMASK: case LayaGLContext.DITHER: case LayaGLContext.SAMPLE_COVERAGE_INVERT: case LayaGLContext.SCISSOR_TEST: case LayaGLContext.STENCIL_TEST: var ret = gl._nativeObj.getBooleanv(pname); if(!ret) result = false; else result = true; break; case LayaGLContext.DEPTH_CLEAR_VALUE: case LayaGLContext.LINE_WIDTH: case LayaGLContext.SAMPLE_COVERAGE_VALUE: result = gl._nativeObj.getFloatv(pname); break; case LayaGLContext.ALIASED_LINE_WIDTH_RANGE: case LayaGLContext.ALIASED_POINT_SIZE_RANGE: case LayaGLContext.BLEND_COLOR: case LayaGLContext.COLOR_CLEAR_VALUE: case LayaGLContext.DEPTH_RANGE: result = gl._nativeObj.getFloatArrayv(pname); break; case LayaGLContext.MAX_VIEWPORT_DIMS: case LayaGLContext.SCISSOR_BOX: case LayaGLContext.VIEWPORT: result = gl._nativeObj.getIntegerArrayv(pname); break; case LayaGLContext.RENDERER: case LayaGLContext.SHADING_LANGUAGE_VERSION: case LayaGLContext.VENDOR: case LayaGLContext.VERSION: result = gl._nativeObj.getStringEx(pname); break; case LayaGLContext.MAX_TEXTURE_MAX_ANISOTROPY_EXT: case LayaGLContext.TEXTURE_MAX_ANISOTROPY_EXT: result = gl._nativeObj.getParameter(pname); break; default: alert("getParameter 尚未支持"); break; } return result; } getBufferParameter(target:number, pname:number):number { return this._layagl._nativeObj.getBufferParameterEx(target, pname); } getError():any { this.add_i(FUNCTION_ID.GETERROR); return 0; } getFramebufferAttachmentParameter(target:number, attachment:number, pname:number):any { var gl = this._layagl; var result:any = null; switch(pname) { case LayaGLContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: var frameBuffer:WebGLFrameBuffer = gl.getBind(target); if(frameBuffer) { var attachBuffer = frameBuffer.getBind(attachment); if(!attachBuffer) result = LayaGLContext.NONE; else if(attachBuffer instanceof WebGLTexture) result = LayaGLContext.TEXTURE; else if(attachBuffer instanceof WebGLRenderBuffer) result = LayaGLContext.RENDERBUFFER; } break; case LayaGLContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: var frameBuffer:WebGLFrameBuffer = gl.getBind(target); if(frameBuffer) { return frameBuffer.getBind(attachment); } break; case LayaGLContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: case LayaGLContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: result = gl._nativeObj.getFramebufferAttachmentParameter(target, attachment, pname); break; default: break; } return result; } getProgramParameter(program:WebGLProgram, pname:any):any { let ret:any; var gl:LayaGLContext = this._layagl; if(pname == LayaGLContext.ATTACHED_SHADERS) return program.attachedShaderCount; if(program.linkStatus == 0 || program.id == -1) { if(program.id == -1) { if(pname == LayaGLContext.DELETE_STATUS || pname == LayaGLContext.LINK_STATUS || pname == LayaGLContext.VALIDATE_STATUS) { return null; } } else if(program.linkStatus == 0) { if(pname == LayaGLContext.DELETE_STATUS || pname == LayaGLContext.LINK_STATUS || pname == LayaGLContext.VALIDATE_STATUS) { return false; } } return 0; } else { ret = this._layagl._nativeObj.getProgramParameterEx(program.linkedVSSource,program.linkedPSSource,"",pname); if(pname == LayaGLContext.DELETE_STATUS || pname == LayaGLContext.LINK_STATUS || pname == LayaGLContext.VALIDATE_STATUS) { return ret == 1 ? true : false; } else { return ret; } } } getProgramInfoLog(program:WebGLProgram):any { if(program.id == -1) return null; if(program.linkStatus) return ""; if(program.attachedShaderCount < 2) { return "missing shaders" + String.fromCharCode(0); } var ret = this._layagl._nativeObj.getProgramInfoLogEx(program.vsShader.src,program.psShader.src,""); if(ret === "invalid shaders") { ret = ret + String.fromCharCode(0); } return ret; } getRenderbufferParameter(target:number, pname:number):number { return this._layagl._nativeObj.getRenderbufferParameterEx(target, pname); } getShaderPrecisionFormat(shaderType:number, precisionType:number):any { return this._layagl._nativeObj.getShaderPrecisionFormat(shaderType,precisionType); } getShaderParameter(shader:WebGLShader, pname:number):any { if(shader && shader.id == -1) return null; if(pname == LayaGLContext.COMPILE_STATUS) { return shader.compileStatus === 0 ? false : true; } return this._layagl._nativeObj.getShaderParameter(shader.src, shader.type,pname); } getShaderInfoLog(shader:WebGLShader):any { return this._layagl._nativeObj.getShaderInfoLogEx(shader.src,shader.type); } getShaderSource(shader:WebGLShader):any { if(!(shader instanceof WebGLShader)) throw new TypeError("parameter 1 is not of type 'WebGLShader'"); if(shader && shader.id !== -1) return shader.src; return null; } getTexParameter(target:any, pname:any):number { return this._layagl._nativeObj.getTexParameterEx(target, pname); } getUniform(program:WebGLProgram, location:number):any { if(!program.linkStatus || program.id == -1) return null; var gl = this._layagl; var curProgram = gl.getBind(LayaGLContext.CURRENT_PROGRAM); var result:any = null; this.useProgram(program); gl._nativeObj.flushCommand(); var locationName = program.getLocationName(location); // ret: [type, ...data] var result = this._layagl._nativeObj.getUniformEx(locationName); var type = result[0]; result.splice(0, 1); if(type == LayaGLContext.BOOL) { for(var i = 0; i < result.length; i++) { if(result[i] === 0) result[i] = false; else result[i] = true; } } if(curProgram) { this.useProgram(curProgram); gl._nativeObj.flushCommand(); } if(result.length == 1) { return result[0]; } else { if(type == LayaGLContext.BOOL) return result; else if(type == LayaGLContext.FLOAT) return new Float32Array(result); else if(type == LayaGLContext.INT) return new Int32Array(result); } return null; } getUniformMutiThread(program:WebGLProgram, location:number):any { console.log("getUniformMutiThread can't support"); return null; } getUniformLocation(program:WebGLProgram, name:string):any { var fakeLoc = GLCommandEncoder._locTable.getFakeLocation(program.id, name); var strLen = this.getStrLength(name); this.add_iii(FUNCTION_ID.GETUNIFORMLOCATION, program.id, fakeLoc); this.add_String(name, strLen); program.addLocationPair(fakeLoc, name); return fakeLoc; } getVertexAttrib(index:number, pname:any):any { var gl = this._layagl; var result:any = 0; switch(pname) { case LayaGLContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: gl._nativeObj.flushCommand(); result = gl.getBind(LayaGLContext.ARRAY_BUFFER); break; case LayaGLContext.VERTEX_ATTRIB_ARRAY_ENABLED: case LayaGLContext.VERTEX_ATTRIB_ARRAY_NORMALIZED: var ret = gl._nativeObj.getVertexAttribEx(index, pname); if(ret === 0) result = false; else result = true; break; case LayaGLContext.VERTEX_ATTRIB_ARRAY_SIZE: case LayaGLContext.VERTEX_ATTRIB_ARRAY_STRIDE: case LayaGLContext.VERTEX_ATTRIB_ARRAY_TYPE: result = gl._nativeObj.getVertexAttribEx(index, pname); break; case LayaGLContext.CURRENT_VERTEX_ATTRIB: result = gl._nativeObj.getVertexAttribExfv(index, pname); break; default: result = 0; break; } return result; } getVertexAttribOffset(index:number, pname:any):any { return this._layagl._nativeObj.getVertexAttribOffset(index, pname); } hint(target:number, mode:number):void { this.add_iii(FUNCTION_ID.HINT, target, mode); } isBuffer(buffer:any):boolean { return (buffer instanceof WebGLBuffer); } isEnabled(cap:any):boolean { var ret = this._layagl._nativeObj.isEnabled(cap); if(!ret) return false; return true; } isFramebuffer(framebuffer:any):boolean { return (framebuffer instanceof WebGLFrameBuffer); } isProgram(program:any):boolean { return (program instanceof WebGLProgram); } isRenderbuffer(renderbuffer:any):boolean { return (renderbuffer instanceof WebGLRenderBuffer); } isShader(shader:any):boolean { return (shader instanceof WebGLShader); } isTexture(texture:any):boolean { return (texture instanceof WebGLTexture); } lineWidth(width:number):void { this.add_if(FUNCTION_ID.LINEWIDTH, width); } linkProgram(program:WebGLProgram):void { this.add_ii(FUNCTION_ID.LINKPROGRAM, program.id); if(program.attachedShaderCount >= 2) { var gl = this._layagl; program.linkStatus = gl._nativeObj.getProgramParameterEx(program.vsShader.src,program.psShader.src,"",LayaGLContext.LINK_STATUS); if(program.linkStatus) { program.linkedVSSource = program.vsShader.src; program.linkedPSSource = program.psShader.src; } } } pixelStorei(pname:number, param:number):void { this.add_iii(FUNCTION_ID.PIXELSTOREI, pname, param); } polygonOffset(factor:number, units:number):void { this.add_iff(FUNCTION_ID.POLYGONOFFSET, factor, units); } readPixels(x:number, y:number, width:number, height:number, format:any, type:any, pixels:any):void { if(!pixels && !(pixels instanceof Uint8Array) && !(pixels instanceof Uint16Array) && !(pixels instanceof Float32Array)) return; var ret = this._layagl._nativeObj.readPixels(x, y, width, height, format, type); //var len = Math.min(pixels.length, ret.length); pixels.set(new Uint8Array(ret)); } readPixelsAsync(x:number, y:number, w:number, h:number, format:any, type:any, callBack:(data:ArrayBuffer)=>void):void { var fakeID:number = this.createFakeID(); this._readPixelsAsyncCallbackFuncObj.addCallbackFunc(fakeID, callBack); this.add_iiiiiiiii(FUNCTION_ID.READPIXELS_ASYNC, x, y, w, h, format, type, this._readPixelsAsyncCallbackFuncObj.id, fakeID); } renderbufferStorage(target:number, internalformat:number, width:number, height:number):void { this.add_iiiii(FUNCTION_ID.RENDERBUFFERSTORAGE, target, internalformat, width, height); } sampleCoverage(value:number, invert:number):void { this.add_ifi(FUNCTION_ID.SAMPLECOVERAGE, value, invert); } scissor(x:number, y:number, width:number, height:number):void { this.add_iiiii(FUNCTION_ID.SCISSOR, x, y, width, height); } shaderSource(shader:WebGLShader, source:string):void { shader.src = source; var strLen = this.getStrLength(source); this.add_ii(FUNCTION_ID.SHADERSOURCE, shader.id); this.add_String(source, strLen); } stencilFunc(func:number, ref:number, mask:number):void { this.add_iiii(FUNCTION_ID.STENCILFUNC, func, ref, mask); } stencilFuncSeparate(face:number, func:number, ref:number, mask:number):void { this.add_iiiii(FUNCTION_ID.STENCILFUNCSEPARATE, face, func, ref, mask); } stencilMask(mask:number):void { this.add_ii(FUNCTION_ID.STENCILMASK, mask); } stencilMaskSeparate(face:number, mask:number):void { this.add_iii(FUNCTION_ID.STENCILMASKSEPARATE, face, mask); } stencilOp(fail:number, zfail:number, zpass:number):void { this.add_iiii(FUNCTION_ID.STENCILOP, fail, zfail, zpass); } stencilOpSeparate(face:number, fail:number, zfail:number, zpass:number):void { this.add_iiiii(FUNCTION_ID.STENCILOPSEPARATE, face, fail, zfail, zpass); } texImage2D(_args):void { var args = arguments; if (args.length == 6) { //目前只支持传入image if (args[5]._nativeObj) { //函数ID,target, level, internalformat, format, type, image this.add_iiiiiii(FUNCTION_ID.TEXIMAGE2D, args[0], args[1], args[2], args[3], args[4], args[5]._nativeObj.conchImgId); } else { this.add_iiiiiiiii(FUNCTION_ID.TEXIMAGE2DCANVAS, args[0], args[1], args[2], args[3], args[4], args[5]._ctx._targets._glTexture.id, args[5].width, args[5].height); } } else if (args.length == 9) { if (args[8] == null) { this.add_iiiiiiiiii(FUNCTION_ID.TEXIMAGE2D_PIXEL, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],0); } else if ( args[8] instanceof ArrayBuffer || ArrayBuffer.isView(args[8]) ) { var ab:ArrayBuffer = args[8]; var nAlignLength = this.getAlignLength(ab); //函数ID,target, level, internalformat, width, height, border, format, type, ArrayBufferView? pixels this.add_iiiiiiiii(FUNCTION_ID.TEXIMAGE2D_PIXEL, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); this.wab(ab, ab.byteLength, nAlignLength); } } } texStorage2D(target:any, levels:any, internalformat:any, width:number, height:number):void { this.add_iiiiii(FUNCTION_ID.TEXSTORAGE2D, target, levels, internalformat, width, height); } texParameterf(target:number, pname:number, param:number):void { this.add_iiif(FUNCTION_ID.TEXPARAMETERF, target, pname, param); } texParameteri(target:number, pname:number, param:number):void { this.add_iiii(FUNCTION_ID.TEXPARAMETERI, target, pname, param); } texSubImage2D(_args):void { var args = arguments; if (args.length == 7) { //目前只支持传入image if (args[6]._nativeObj) { //函数ID,target,level,xoffset,yoffset,format,type,image this.add_iiiiiiii(FUNCTION_ID.TEXSUBIMAGE2D, args[0], args[1], args[2], args[3], args[4], args[5], args[6]._nativeObj.conchImgId); } } else if (args.length == 9) { if (args[8] == null) { this.add_iiiiiiiiii(FUNCTION_ID.TEXSUBIMAGE2D_PIXEL, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],0); } else if ( args[8] instanceof ArrayBuffer || ArrayBuffer.isView(args[8]) ) { var ab:ArrayBuffer = args[8]; var nAlignLength = this.getAlignLength(ab); //函数ID,target,level,xoffset,yoffset,width,height,format,type,pixel this.add_iiiiiiiii(FUNCTION_ID.TEXSUBIMAGE2D_PIXEL, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); this.wab(ab, ab.byteLength, nAlignLength); } } } uniform1f(location:any, x:number):void { this.add_iif(FUNCTION_ID.UNIFORM1F, location, x); } uniform1fv(location:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniform1fv_laya(location,values); } uniform1fv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM1FV, location); this.wab(values, values.byteLength, nAlignLength); } uniform1i(location:any, x:number):void { this.add_iii(FUNCTION_ID.UNIFORM1I, location, x); } uniform1iv(location:any, values:any):void { values = (values instanceof Array )?new Int32Array(values):values; this.uniform1iv_laya(location,values); } uniform1iv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM1IV, location); this.wab(values, values.byteLength,nAlignLength); } uniform2f(location:any, x:number, y:number):void { this.add_iiff(FUNCTION_ID.UNIFORM2F, location, x, y); } uniform2fv(location:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniform2fv_laya(location,values); } uniform2fv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM2FV, location); this.wab(values, values.byteLength, nAlignLength); } uniform2i(location:any, x:number, y:number):void { this.add_iiii(FUNCTION_ID.UNIFORM2I, location, x, y); } uniform2iv(location:any, values:any):void { values = (values instanceof Array )?new Int32Array(values):values; this.uniform2iv_laya(location,values); } uniform2iv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM2IV, location); this.wab(values, values.byteLength, nAlignLength); } uniform3f(location:any, x:number, y:number, z:number):void { this.add_iifff(FUNCTION_ID.UNIFORM3F, location, x, y, z); } uniform3fv(location:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniform3fv_laya(location,values); } uniform3fv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM3FV, location); this.wab(values, values.byteLength, nAlignLength); } uniform3i(location:any, x:number, y:number, z:number):void { this.add_iiiii(FUNCTION_ID.UNIFORM3I, location, x, y, z); } uniform3iv(location:any, values:any):void { values = (values instanceof Array )?new Int32Array(values):values; this.uniform3iv_laya(location,values); } uniform3iv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM3IV, location); this.wab(values, values.byteLength, nAlignLength); } uniform4f(location:any, x:number, y:number, z:number, w:number):void { this.add_iiffff(FUNCTION_ID.UNIFORM4F, location, x, y, z, w); } uniform4fv(location:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniform4fv_laya(location,values); } uniform4fv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM4FV, location); this.wab(values, values.byteLength, nAlignLength); } uniform4i(location:any, x:number, y:number, z:number, w:number):void { this.add_iiiiii(FUNCTION_ID.UNIFORM4I, location, x, y, z, w); } uniform4iv(location:any, values:any):void { values = (values instanceof Array )?new Int32Array(values):values; this.uniform4iv_laya(location,values); } uniform4iv_laya(location:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.UNIFORM4IV, location); this.wab(values, values.byteLength, nAlignLength); } uniformMatrix2fv(location:any, transpose:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniformMatrix2fv_laya(location,transpose,values); } uniformMatrix2fv_laya(location:any, transpose:any, value:any):void { var nAlignLength = this.getAlignLength(value); this.add_iii(FUNCTION_ID.UNIFORMMATRIX2FV, location, transpose); this.wab(value, value.byteLength, nAlignLength); } uniformMatrix3fv(location:any, transpose:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniformMatrix3fv_laya(location,transpose,values); } uniformMatrix3fv_laya(location:any, transpose:any, value:any):void { var nAlignLength = this.getAlignLength(value); this.add_iii(FUNCTION_ID.UNIFORMMATRIX3FV, location, transpose); this.wab(value, value.byteLength, nAlignLength); } uniformMatrix4fv(location:any, transpose:any, values:any):void { values = (values instanceof Array )?new Float32Array(values):values; this.uniformMatrix4fv_laya(location,transpose,values); } uniformMatrix4fv_laya(location:any, transpose:any, value:any):void { var nAlignLength = this.getAlignLength(value); this.add_iii(FUNCTION_ID.UNIFORMMATRIX4FV, location, transpose); this.wab(value, value.byteLength, nAlignLength); } useProgram(program:WebGLProgram):void { this.add_ii(FUNCTION_ID.USEPROGRAM, program ? program.id : 0); } validateProgram(program:WebGLProgram):void { this.add_ii(FUNCTION_ID.VALIDATEPROGRAM, program.id); } vertexAttrib1f(indx:any, x:number):void { this.add_iif(FUNCTION_ID.VERTEXATTRIB1F, indx, x); } vertexAttrib1fv(indx:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.VERTEXATTRIB1FV, indx); this.wab(values, values.byteLength, nAlignLength); } vertexAttrib2f(indx:any, x:number, y:number):void { this.add_iiff(FUNCTION_ID.VERTEXATTRIB2F, indx, x, y); } vertexAttrib2fv(indx:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.VERTEXATTRIB2FV, indx); this.wab(values, values.byteLength, nAlignLength); } vertexAttrib3f(indx:any, x:number, y:number, z:number):void { this.add_iifff(FUNCTION_ID.VERTEXATTRIB3F, indx, x, y, z); } vertexAttrib3fv(indx:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.VERTEXATTRIB3FV, indx); this.wab(values, values.byteLength, nAlignLength); } vertexAttrib4f(indx:any, x:number, y:number, z:number, w:number):void { this.add_iiffff(FUNCTION_ID.VERTEXATTRIB4F, indx, x, y, z, w); } vertexAttrib4fv(indx:any, values:any):void { var nAlignLength = this.getAlignLength(values); this.add_ii(FUNCTION_ID.VERTEXATTRIB4FV, indx); this.wab(values, values.byteLength, nAlignLength); } vertexAttribPointer(indx:any, size:any, type:any, normalized:any, stride:any, offset:number):void { this.add_iiiiiii(FUNCTION_ID.VERTEXATTRIBPOINTER, indx, size, type, normalized, stride, offset); } viewport(x:number, y:number, width:number, height:number):void { this.add_iiiii(FUNCTION_ID.VIEWPORT, x, y, width, height); } configureBackBuffer(width:number, height:number, antiAlias:number, enableDepthAndStencil?:Boolean, wantsBestResolution?:Boolean):void { enableDepthAndStencil=enableDepthAndStencil?enableDepthAndStencil:true; wantsBestResolution=wantsBestResolution?wantsBestResolution:false; console.log("configureBackBuffer can't support"); //add_iiiiii(CONFIGUREBACKBUFFER, width, height, antiAlias, enableDepthAndStencil, wantsBestResolution); } compressedTexImage2D(_args):void { var args=arguments; var nAlignLength = this.getAlignLength(args[6]); this.add_iiiiiii(FUNCTION_ID.COMPRESSEDTEXIMAGE2D, args[0], args[1], args[2], args[3], args[4], args[5]); this.wab(args[6], args[6].byteLength, nAlignLength); } compressedTexSubImage2D(_args):void { var args=arguments; var nAlignLength = this.getAlignLength(args[7]); this.add_iiiiiiii(FUNCTION_ID.COMPRESSEDTEXSUBIMAGE2D, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); this.wab(args[7], args[7].byteLength, nAlignLength); } createVertexArray():WebGLVertextArray { var fakeID:number = this.createFakeID(); this.add_ii(FUNCTION_ID.CREATEVERTEXARRAY, fakeID); return new WebGLVertextArray(fakeID); } bindVertexArray(vao:WebGLVertextArray):void { this.add_ii(FUNCTION_ID.BINDVERTEXARRAY,vao?vao.id:0); } deleteVertexArray(vao:WebGLVertextArray):void { this.deleteFakeID(vao.id); this.add_ii(FUNCTION_ID.DELETEVERTEXARRAYS,vao?vao.id:0); } isVertexArray(vao:any):boolean { return vao.instanceof(WebGLVertextArray); } vertexAttribDivisor(index:number, divisor:number):void { this.add_iii(FUNCTION_ID.VERTEXATTRIBDIVISOR, index, divisor); } drawArraysInstanced(mode:number, first:number, count:number, instanceCount:number):void { this.add_iiiii(FUNCTION_ID.DRAWARRAYSINSTANCED, mode, first, count, instanceCount); } drawElementsInstanced(mode:number, count:number, type:number, offset:number, instanceCount:number):void { this.add_iiiiii(FUNCTION_ID.DRAWELEMENTSINSTANCED, mode, count, type, offset, instanceCount); } uniformMatrix2fvEx(location:any, transpose:any, value:any):void { if (!value["_ptrID"]) { this._layagl.createArrayBufferRef(value, LayaGLContext.ARRAY_BUFFER_TYPE_DATA, true); } var nID:number = value["_ptrID"]; this._layagl.syncBufferToRenderThread(value); this.add_iiii(FUNCTION_ID.UNIFORMMATRIX2FVEX, location, transpose, nID); } uniformMatrix3fvEx(location:any, transpose:any, value:any):void { if (!value["_ptrID"]) { this._layagl.createArrayBufferRef(value, LayaGLContext.ARRAY_BUFFER_TYPE_DATA, true); } var nID:number = value["_ptrID"]; this._layagl.syncBufferToRenderThread(value); this.add_iiii(FUNCTION_ID.UNIFORMMATRIX3FVEX, location, transpose, nID); } uniformMatrix4fvEx(location:any, transpose:any, value:any):void { if (!value["_ptrID"]) { this._layagl.createArrayBufferRef(value, LayaGLContext.ARRAY_BUFFER_TYPE_DATA, true); } var nID:number = value["_ptrID"]; this._layagl.syncBufferToRenderThread(value); this.add_iiii(FUNCTION_ID.UNIFORMMATRIX4FVEX, location, transpose, nID); } addShaderUniform(one:any):void { var funID:number = 0; var isArray:Boolean = one.isArray; switch (one.type) { case GLCommandEncoder.INT: funID = isArray ? UNIFORM_TYPE.INTERIOR_UNIFORM1IV : UNIFORM_TYPE.INTERIOR_UNIFORM1I; break; case GLCommandEncoder.FLOAT: funID = isArray ? UNIFORM_TYPE.INTERIOR_UNIFORM1FV : UNIFORM_TYPE.INTERIOR_UNIFORM1F; break; case GLCommandEncoder.FLOAT_VEC2: funID = isArray ? UNIFORM_TYPE.INTERIOR_UNIFORM2FV : UNIFORM_TYPE.INTERIOR_UNIFORM2F; break; case GLCommandEncoder.FLOAT_VEC3: funID = isArray ? UNIFORM_TYPE.INTERIOR_UNIFORM3FV : UNIFORM_TYPE.INTERIOR_UNIFORM3F; break; case GLCommandEncoder.FLOAT_VEC4: funID = isArray ? UNIFORM_TYPE.INTERIOR_UNIFORM4FV : UNIFORM_TYPE.INTERIOR_UNIFORM4F; break; case GLCommandEncoder.SAMPLER_2D: funID = UNIFORM_TYPE.INTERIOR_UNIFORMSAMPLER_2D; break; case GLCommandEncoder.SAMPLER_CUBE: funID = UNIFORM_TYPE.INTERIOR_UNIFORMSAMPLER_CUBE; break; case GLCommandEncoder.FLOAT_MAT4: funID = UNIFORM_TYPE.INTERIOR_UNIFORMMATRIX4FV; break; case GLCommandEncoder.BOOL: funID = UNIFORM_TYPE.INTERIOR_UNIFORM1I; break; case GLCommandEncoder.FLOAT_MAT2: funID = UNIFORM_TYPE.INTERIOR_UNIFORMMATRIX2FV; break; case GLCommandEncoder.FLOAT_MAT3: funID = UNIFORM_TYPE.INTERIOR_UNIFORMMATRIX3FV; break; default: throw new Error("compile shader err!"); } //同步ArrayBufferList this._layagl.syncBufferToRenderThread(this._buffer); this.add_iiiiii(FUNCTION_ID.ADDSHADERUNIFORM, funID, one.location, one.type, one.dataOffset, one.textureID); } uploadShaderUniforms(commandEncoder:GLCommandEncoder, data:any, type:number):number { if(type==LayaGLContext.UPLOAD_SHADER_UNIFORM_TYPE_ID) { this._layagl.syncBufferToRenderThread(data); this.add_iii(FUNCTION_ID.UPLOADSHADERUNIFORMS, commandEncoder._buffer["_ptrID"], data._ptrID); } else { var nAlignLength = this.getAlignLength(data); this.add_ii(FUNCTION_ID.UPLOADSHADERUNIFORMS_BUFFER, commandEncoder._buffer["_ptrID"]); this.wab(data, data.byteLength, nAlignLength); } return 0; } createFakeID():number { var frameCount:number = this._layagl.getFrameCount(); var fakeArray:any = GLCommandEncoder._fakeArray; for( var i:number=0,n:number=fakeArray.length;i 1) { LayaGLContext.prototype.bindBuffer = LayaGLContext.prototype.bindBufferMutiThread; LayaGLContext.prototype.useProgram = LayaGLContext.prototype.useProgramMutiThread; GLCommandEncoder.prototype.getUniform = GLCommandEncoder.prototype.getUniformMutiThread; } } public constructor(contextType:string) { if (!LayaGLContext.instance) { LayaGLContext.__init__(); LayaGLContext.instance = this; } else { console.log("LayaGL is already exist"); return LayaGLContext.instance; } this._nativeObj = layagl; this._threadMode = this._nativeObj.getThreadMode(); contextType = contextType.toLowerCase(); if(contextType.indexOf("layagl") >=0 ) { // GLCommandEncoder.prototype.uniform1fv=GLCommandEncoder.prototype.uniform1fv_laya; // GLCommandEncoder.prototype.uniform1iv=GLCommandEncoder.prototype.uniform1iv_laya; // GLCommandEncoder.prototype.uniform2fv=GLCommandEncoder.prototype.uniform2fv_laya; // GLCommandEncoder.prototype.uniform2iv=GLCommandEncoder.prototype.uniform2iv_laya; // GLCommandEncoder.prototype.uniform3fv=GLCommandEncoder.prototype.uniform3fv_laya; // GLCommandEncoder.prototype.uniform3iv=GLCommandEncoder.prototype.uniform3iv_laya; // GLCommandEncoder.prototype.uniform4fv=GLCommandEncoder.prototype.uniform4fv_laya; // GLCommandEncoder.prototype.uniform4iv=GLCommandEncoder.prototype.uniform4iv_laya; // GLCommandEncoder.prototype.uniformMatrix2fv=GLCommandEncoder.prototype.uniformMatrix2fv_laya; // GLCommandEncoder.prototype.uniformMatrix3fv=GLCommandEncoder.prototype.uniformMatrix3fv_laya; // GLCommandEncoder.prototype.uniformMatrix4fv=GLCommandEncoder.prototype.uniformMatrix4fv_laya; this._nativeObj.setSyncArrayBufferID(LayaGLContext._syncBufferList["_ptrID"]); this._nativeObj.setFrameAndSyncCountArrayBufferID(LayaGLContext._frameAndSyncCountBuffer["_ptrID"]); this._defaultEncoder = new GLCommandEncoder(this, 102400, 1280, false); this._currentCmdEncoder = this._defaultEncoder; this._saveCommandEncoder.push(this._currentCmdEncoder); this._nativeObj.setRootCommandEncoder(this._currentCmdEncoder._buffer["_ptrID"]); } else { this._nativeObj.setSyncArrayBufferID(LayaGLContext._syncBufferList["_ptrID"]); this._nativeObj.setFrameAndSyncCountArrayBufferID(LayaGLContext._frameAndSyncCountBuffer["_ptrID"]); this._defaultEncoder = new GLCommandEncoder(this, 102400, 1280, false); this._currentCmdEncoder = this._defaultEncoder; this._nativeObj.setRootCommandEncoder(this._defaultEncoder._buffer["_ptrID"]); } } public static getFrameCount():number { return LayaGLContext._frameAndSyncCountBuffer[0]; } public getFrameCount():number { return LayaGLContext._frameAndSyncCountBuffer[0]; } public syncBufferToRenderThread(value:any,index:number=0) { if( LayaGLContext.instance._threadMode == LayaGLContext.THREAD_MODE_SINGLE )return; var bNeedSync:boolean = false; if( !value._refArray ) { if( value.frameCount != LayaGLContext._frameAndSyncCountBuffer[0] ) { value.frameCount = LayaGLContext._frameAndSyncCountBuffer[0]; bNeedSync = true; } } else { var obj:any = value._refArray[index]; if( obj.frameCount != LayaGLContext._frameAndSyncCountBuffer[0] ) { obj.frameCount = LayaGLContext._frameAndSyncCountBuffer[0]; bNeedSync = true; } } if(bNeedSync) { if ( (LayaGLContext._frameAndSyncCountBuffer[1] + 1) > LayaGLContext._syncBufferSize) { var pre:Int32Array = LayaGLContext._syncBufferList; var preConchRef:any = LayaGLContext._syncBufferList["conchRef"]; var prePtrID:number = LayaGLContext._syncBufferList["_ptrID"]; LayaGLContext._syncBufferSize += LayaGLContext._SYNC_ARRAYBUFFER_SIZE_; LayaGLContext._syncBufferList = new Int32Array(LayaGLContext._syncBufferSize); LayaGLContext._syncBufferList["conchRef"] = preConchRef; LayaGLContext._syncBufferList["_ptrID"] = prePtrID; pre && LayaGLContext._syncBufferList.set(pre, 0); webglPlus.updateArrayBufferRef(LayaGLContext._syncBufferList["_ptrID"], false, LayaGLContext._syncBufferList); } var nID = value.getPtrID?value.getPtrID(index):value["_ptrID"]; if(!nID) { alert("syncBufferToRenderThread id error"); debugger; } LayaGLContext._syncBufferList[LayaGLContext._frameAndSyncCountBuffer[1]++] = nID; } } public getDefaultCommandEncoder():GLCommandEncoder { return this._defaultEncoder; } public commit():void { this._saveCommandEncoder.length = 0; this._currentCmdEncoder = this._defaultEncoder; this._saveCommandEncoder.push(this._currentCmdEncoder); } public setBind(pname, buffer):void { this._curBindInfo.setBind(pname, buffer); } public getBind(pname):any { return this._curBindInfo.getBind(pname); } public addGlobalValueDefine(modifyType, type, size, defaultData):number { return this._nativeObj.addGlobalValueDefine(modifyType,type,size,defaultData); } public endGlobalValueDefine():void { this._nativeObj.endGlobalValueDefine(); } public defineShaderMacro(macroString:string, uniformInfo:any):number { //uniformInfo array[{uname:"u_filter1",id:14},{uname:"u_filter2",id:15},..]; var nID:number = LayaGLContext._shader_macro_id_; var sUniformInfo:string = ""; var len:number = uniformInfo.length; for (var i = 0; i < len; i++) { sUniformInfo += uniformInfo[i].uname + "," + uniformInfo[i].id.toString() + ","; } this._nativeObj.defineShaderMacro(nID, macroString, sUniformInfo); LayaGLContext._shader_macro_id_ <<= 1; return nID; } public setCanvasType(type:number) { //TODO } public setSize(w:number,h:number) { if(!isNaN(w)&&!isNaN(h)) { this.width = w; this.height = h; this._nativeObj.setSize(w,h); } } public createCommandEncoder(reserveSize?:number, adjustSize?:number, isSyncToRenderThread?:boolean):GLCommandEncoder { reserveSize=reserveSize?reserveSize:128; adjustSize=adjustSize?adjustSize:64; isSyncToRenderThread=isSyncToRenderThread?isSyncToRenderThread:false; var cmd:GLCommandEncoder = new GLCommandEncoder(this, reserveSize, adjustSize, isSyncToRenderThread ); if(isSyncToRenderThread) { this.syncBufferToRenderThread(cmd); } return cmd; } public beginCommandEncoding(commandEncoder:GLCommandEncoder):void { commandEncoder = commandEncoder ? commandEncoder : this._defaultEncoder; this._saveCommandEncoder.push(commandEncoder); this._currentCmdEncoder = commandEncoder; } public endCommandEncoding():void { this._saveCommandEncoder.pop(); this._currentCmdEncoder = this._saveCommandEncoder[this._saveCommandEncoder.length - 1]; } public getContextAttributes():any { return this._currentCmdEncoder.getContextAttributes(); } get drawingBufferWidth():number { return this.canvas.width; } get drawingBufferHeight():number { return this.canvas.height; } public isContextLost():void { this._currentCmdEncoder.isContextLost(); } public getSupportedExtensions():any { return this._currentCmdEncoder.getSupportedExtensions(); } public getExtension(name:string):any { return this._currentCmdEncoder.getExtension(name); } public activeTexture(texture:number):void { this._currentCmdEncoder.activeTexture(texture); } public attachShader(program:WebGLProgram, shader:WebGLShader):void { this._currentCmdEncoder.attachShader(program, shader); } public getAttachedShaders(program:WebGLProgram): WebGLShader[] { let ret = []; if(program.vsShader) { ret.push(program.vsShader); } if(program.psShader) { ret.push(program.psShader); } return ret; } public bindAttribLocation(program:WebGLProgram, index:number, name:string):void { this._currentCmdEncoder.bindAttribLocation(program, index, name); } public bindBuffer(target:any, buffer:WebGLBuffer):void { this.setBind(target, buffer); this._currentCmdEncoder.bindBuffer(target, buffer); } public bindBufferMutiThread(target:any, buffer:WebGLBuffer):void { this._currentCmdEncoder.bindBuffer(target, buffer); } public bindFramebuffer(target:any, framebuffer:WebGLFrameBuffer):void { this._currentCmdEncoder.bindFramebuffer(target, framebuffer); this.setBind(target, framebuffer); } public bindRenderbuffer(target:any, renderbuffer:WebGLRenderBuffer):void { this._currentCmdEncoder.bindRenderbuffer(target, renderbuffer); this.setBind(target, renderbuffer); } public bindTexture(target:any, texture:WebGLTexture):void { this._currentCmdEncoder.bindTexture(target, texture); this.setBind(target, texture); } public useTexture(texture:WebGLTexture):void { this._currentCmdEncoder.useTexture(texture); } public blendColor(red:any, green:any, blue:any, alpha:number):void { this._currentCmdEncoder.blendColor(red, green, blue, alpha); } public blendEquation(mode:any):void { this._currentCmdEncoder.blendEquation(mode); } public blendEquationSeparate(modeRGB:any, modeAlpha:any):void { this._currentCmdEncoder.blendEquationSeparate(modeRGB, modeAlpha); } public blendFunc(sfactor:any, dfactor:any):void { this._currentCmdEncoder.blendFunc(sfactor, dfactor); } public blendFuncSeparate(srcRGB:any, dstRGB:any, srcAlpha:any, dstAlpha:any):void { this._currentCmdEncoder.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); } public bufferData(target:any, size:any, usage:any):void { this._currentCmdEncoder.bufferData(target, size, usage); } public bufferSubData(target:any, offset:number, data:any):void { this._currentCmdEncoder.bufferSubData(target, offset, data); } public checkFramebufferStatus(target:any):any { return this._currentCmdEncoder.checkFramebufferStatus(target); } public clear(mask:number):void { this._currentCmdEncoder.clear(mask); } public clearColor(red:any, green:any, blue:any, alpha:number):void { this._currentCmdEncoder.clearColor(red, green, blue, alpha); } public clearDepth(depth:any):void { this._currentCmdEncoder.clearDepth(depth); } public clearStencil(s:any):void { this._currentCmdEncoder.clearStencil(s); } public colorMask(red:number, green:number, blue:number, alpha:number):void { this._currentCmdEncoder.colorMask(red, green, blue, alpha); } public compileShader(shader:WebGLShader):void { this._currentCmdEncoder.compileShader(shader); } public copyTexImage2D(target:any, level:any, internalformat:any, x:number, y:number, width:number, height:number, border:any):void { this._currentCmdEncoder.copyTexImage2D(target, level, internalformat, x, y, width, height, border); } public copyTexSubImage2D(target:any, level:any, xoffset:number, yoffset:number, x:number, y:number, width:number, height:number):void { this._currentCmdEncoder.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } public createBuffer():WebGLBuffer { return this._currentCmdEncoder.createBuffer(); } public createFramebuffer():WebGLFrameBuffer { return this._currentCmdEncoder.createFramebuffer(); } public createProgram():WebGLProgram { return this._currentCmdEncoder.createProgram(); } public createRenderbuffer():WebGLRenderBuffer { return this._currentCmdEncoder.createRenderbuffer(); } public createShader(type:any):WebGLShader { return this._currentCmdEncoder.createShader(type); } public createTexture():WebGLTexture { return this._currentCmdEncoder.createTexture(); } public cullFace(mode:any):void { this._currentCmdEncoder.cullFace(mode); } public deleteBuffer(buffer:WebGLBuffer):void { this._currentCmdEncoder.deleteBuffer(buffer); buffer.id = -1; } public deleteFramebuffer(framebuffer:WebGLFrameBuffer):void { this._currentCmdEncoder.deleteFramebuffer(framebuffer); framebuffer.id = -1; } public deleteProgram(program:WebGLProgram):void { this._currentCmdEncoder.deleteProgram(program); program.id = -1; } public deleteRenderbuffer(renderbuffer:WebGLRenderBuffer):void { this._currentCmdEncoder.deleteRenderbuffer(renderbuffer); renderbuffer.id = -1; } public deleteShader(shader:WebGLShader):void { this._currentCmdEncoder.deleteShader(shader); shader.id = -1; shader.src = null; } public deleteTexture(texture:WebGLTexture):void { this._currentCmdEncoder.deleteTexture(texture); texture.id = -1; } public depthFunc(func:any):void { this._currentCmdEncoder.depthFunc(func); } public depthMask(flag:any):void { this._currentCmdEncoder.depthMask(flag); } public depthRange(zNear:any, zFar:any):void { this._currentCmdEncoder.depthRange(zNear, zFar); } public detachShader(program:WebGLProgram, shader:WebGLShader):void { this._currentCmdEncoder.detachShader(program, shader); } public disable(cap:any):void { this._currentCmdEncoder.disable(cap); } public disableVertexAttribArray(index:number):void { this._currentCmdEncoder.disableVertexAttribArray(index); } public drawArrays(mode:any, first:number, count:number):void { this._currentCmdEncoder.drawArrays(mode, first, count); } public drawElements(mode:any, count:number, type:any, offset:number):void { this._currentCmdEncoder.drawElements(mode, count, type, offset); } public enable(cap:any):void { this._currentCmdEncoder.enable(cap); } public enableVertexAttribArray(index:number):void { this._currentCmdEncoder.enableVertexAttribArray(index); } public finish():void { this._currentCmdEncoder.finish(); } public flush():void { this._currentCmdEncoder.flush(); } public framebufferRenderbuffer(target:any, attachment:any, renderbuffertarget:any, renderbuffer:WebGLRenderBuffer):void { this._currentCmdEncoder.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); var frameBuffer:WebGLFrameBuffer = this.getBind(target); if(frameBuffer) { frameBuffer.setBind(attachment, renderbuffer); } } public framebufferTexture2D(target:any, attachment:any, textarget:any, texture:WebGLTexture, level:any):void { this._currentCmdEncoder.framebufferTexture2D(target, attachment, textarget, texture, level); var frameBuffer:WebGLFrameBuffer = this.getBind(target); if(frameBuffer) { frameBuffer.setBind(attachment, texture); } } public frontFace(mode:any):any { return this._currentCmdEncoder.frontFace(mode); } public generateMipmap(target:any):any { return this._currentCmdEncoder.generateMipmap(target); } public getActiveAttrib(program:WebGLProgram, index:number):any { return this._currentCmdEncoder.getActiveAttrib(program, index); } public getActiveUniform(program:WebGLProgram, index:number):any { return this._currentCmdEncoder.getActiveUniform(program, index); } public getAttribLocation(program:WebGLProgram, name:string):any { return this._currentCmdEncoder.getAttribLocation(program, name); } public getParameter(pname:any):any { return this._currentCmdEncoder.getParameter(pname); } public getBufferParameter(target:any, pname:any):any { return this._currentCmdEncoder.getBufferParameter(target, pname); } public getError():any { return this._currentCmdEncoder.getError(); } public getFramebufferAttachmentParameter(target:any, attachment:any, pname:any):any { return this._currentCmdEncoder.getFramebufferAttachmentParameter(target, attachment, pname); } public getProgramParameter(program:WebGLProgram, pname:any):number { return this._currentCmdEncoder.getProgramParameter(program, pname); } public getProgramInfoLog(program:WebGLProgram):any { return this._currentCmdEncoder.getProgramInfoLog(program); } public getRenderbufferParameter(target:any, pname:any):any { return this._currentCmdEncoder.getRenderbufferParameter(target, pname); } public getShaderPrecisionFormat(shaderType:number, precisionType:number):any { return this._currentCmdEncoder.getShaderPrecisionFormat(shaderType,precisionType); } public getShaderParameter(shader:WebGLShader, pname:any):any { return this._currentCmdEncoder.getShaderParameter(shader, pname); } public getShaderInfoLog(shader:WebGLShader):any { return this._currentCmdEncoder.getShaderInfoLog(shader); } public getShaderSource(shader:WebGLShader):any { return this._currentCmdEncoder.getShaderSource(shader); } public getTexParameter(target:any, pname:any):any { return this._currentCmdEncoder.getTexParameter(target, pname); } public getUniform(program:WebGLProgram, location:number):any { return this._currentCmdEncoder.getUniform(program, location); } public getUniformLocation(program:WebGLProgram, name:string):any { return this._currentCmdEncoder.getUniformLocation(program, name); } public getVertexAttrib(index:number, pname:any):any { return this._currentCmdEncoder.getVertexAttrib(index, pname); } public getVertexAttribOffset(index:number, pname:any):any { return this._currentCmdEncoder.getVertexAttribOffset(index, pname); } public hnumber(target:any, mode:any):void { this._currentCmdEncoder.hint(target, mode); } public hint(target:any, mode:any):void { this._currentCmdEncoder.hint(target, mode); } public isBuffer(buffer:any):void { this._currentCmdEncoder.isBuffer(buffer); } public isEnabled(cap:any):boolean { return this._currentCmdEncoder.isEnabled(cap); } public isFramebuffer(framebuffer:any):void { this._currentCmdEncoder.isFramebuffer(framebuffer); } public isProgram(program:any):void { this._currentCmdEncoder.isProgram(program); } public isRenderbuffer(renderbuffer:any):void { this._currentCmdEncoder.isRenderbuffer(renderbuffer); } public isShader(shader:any):void { this._currentCmdEncoder.isShader(shader); } public isTexture(texture:any):void { this._currentCmdEncoder.isTexture(texture); } public lineWidth(width:number):void { this._currentCmdEncoder.lineWidth(width); } public linkProgram(program:WebGLProgram):void { this._currentCmdEncoder.linkProgram(program); } public pixelStorei(pname:any, param:any):void { this._currentCmdEncoder.pixelStorei(pname, param); } public polygonOffset(factor:any, units:any):void { this._currentCmdEncoder.polygonOffset(factor, units); } public readPixels(x:number, y:number, width:number, height:number, format:any, type:any, pixels:any):void { this._currentCmdEncoder.readPixels(x, y, width, height, format, type, pixels); } public readPixelsAsync(x:number, y:number, w:number, h:number, format:any, type:any, callBack:(data:ArrayBuffer)=>void):void { this._currentCmdEncoder.readPixelsAsync(x, y, w, h, format, type, callBack); } public renderbufferStorage(target:any, internalformat:any, width:number, height:number):void { this._currentCmdEncoder.renderbufferStorage(target, internalformat, width, height); } public sampleCoverage(value:any, invert:any):void { this._currentCmdEncoder.sampleCoverage(value, invert); } public scissor(x:number, y:number, width:number, height:number):void { this._currentCmdEncoder.scissor(x, y, width, height); } public shaderSource(shader:WebGLShader, source:any):void { this._currentCmdEncoder.shaderSource(shader, source); } public stencilFunc(func:number, ref:number, mask:number):void { this._currentCmdEncoder.stencilFunc(func, ref, mask); } public stencilFuncSeparate(face:number, func:number, ref:number, mask:number):void { this._currentCmdEncoder.stencilFuncSeparate(face, func, ref, mask); } public stencilMask(mask:any):void { this._currentCmdEncoder.stencilMask(mask); } public stencilMaskSeparate(face:any, mask:any):void { this._currentCmdEncoder.stencilMaskSeparate(face, mask); } public stencilOp(fail:number, zfail:number, zpass:number):void { this._currentCmdEncoder.stencilOp(fail, zfail, zpass); } public stencilOpSeparate(face:number, fail:number, zfail:number, zpass:number):void { this._currentCmdEncoder.stencilOpSeparate(face, fail, zfail, zpass); } public texImage2D(_args):void { var args = arguments; this._currentCmdEncoder.texImage2D.apply(this._currentCmdEncoder, args); } public texStorage2D(target:any, levels:any, internalformat:any, width:number, height:number):void { this._currentCmdEncoder.texStorage2D(target, levels, internalformat, width, height); } public texParameterf(target:any, pname:any, param:any):void { this._currentCmdEncoder.texParameterf(target, pname, param); } public texParameteri(target:any, pname:any, param:any):void { this._currentCmdEncoder.texParameteri(target, pname, param); } public texSubImage2D(_args):void { var args = arguments; this._currentCmdEncoder.texSubImage2D.apply(this._currentCmdEncoder, args); } public uniform1f(location:any, x:number):void { this._currentCmdEncoder.uniform1f(location, x); } public uniform1fv(location:any, v:any):void { this._currentCmdEncoder.uniform1fv(location, v); } public uniform1i(location:any, x:number):void { this._currentCmdEncoder.uniform1i(location, x); } public uniform1iv(location:any, v:any):void { this._currentCmdEncoder.uniform1iv(location, v); } public uniform2f(location:any, x:number, y:number):void { this._currentCmdEncoder.uniform2f(location, x, y); } public uniform2fv(location:any, v:any):void { this._currentCmdEncoder.uniform2fv(location, v); } public uniform2i(location:any, x:number, y:number):void { this._currentCmdEncoder.uniform2i(location, x, y); } public uniform2iv(location:any, v:any):void { this._currentCmdEncoder.uniform2iv(location, v); } public uniform3f(location:any, x:number, y:number, z:number):void { this._currentCmdEncoder.uniform3f(location, x, y, z); } public uniform3fv(location:any, v:any):void { this._currentCmdEncoder.uniform3fv(location, v); } public uniform3i(location:any, x:number, y:number, z:number):void { this._currentCmdEncoder.uniform3i(location, x, y, z); } public uniform3iv(location:any, v:any):void { this._currentCmdEncoder.uniform3iv(location, v); } public uniform4f(location:any, x:number, y:number, z:number, w:number):void { this._currentCmdEncoder.uniform4f(location, x, y, z, w); } public uniform4fv(location:any, v:any):void { this._currentCmdEncoder.uniform4fv(location, v); } public uniform4i(location:any, x:number, y:number, z:number, w:number):void { this._currentCmdEncoder.uniform4i(location, x, y, z, w); } public uniform4iv(location:any, v:any):void { this._currentCmdEncoder.uniform4iv(location, v); } public uniformMatrix2fv(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix2fv(location, transpose, value); } public uniformMatrix3fv(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix3fv(location, transpose, value); } public uniformMatrix4fv(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix4fv(location, transpose, value); } public useProgram(program:WebGLProgram):void { this.setBind(LayaGLContext.CURRENT_PROGRAM, program); this._currentCmdEncoder.useProgram(program); } public useProgramMutiThread(program:WebGLProgram):void { this._currentCmdEncoder.useProgram(program); } public validateProgram(program:WebGLProgram):void { this._currentCmdEncoder.validateProgram(program); } public vertexAttrib1f(indx:any, x:number):void { this._currentCmdEncoder.vertexAttrib1f(indx, x); } public vertexAttrib1fv(indx:any, values:any):void { this._currentCmdEncoder.vertexAttrib1fv(indx, values); } public vertexAttrib2f(indx:any, x:number, y:number):void { this._currentCmdEncoder.vertexAttrib2f(indx, x, y); } public vertexAttrib2fv(indx:any, values:any):void { this._currentCmdEncoder.vertexAttrib2fv(indx, values); } public vertexAttrib3f(indx:any, x:number, y:number, z:number):void { this._currentCmdEncoder.vertexAttrib3f(indx, x, y, z); } public vertexAttrib3fv(indx:any, values:any):void { this._currentCmdEncoder.vertexAttrib3fv(indx, values); } public vertexAttrib4f(indx:any, x:number, y:number, z:number, w:number):void { this._currentCmdEncoder.vertexAttrib4f(indx, x, y, z, w); } public vertexAttrib4fv(indx:any, values:any):void { this._currentCmdEncoder.vertexAttrib4fv(indx, values); } public vertexAttribPointer(indx:any, size:any, type:any, normalized:any, stride:any, offset:number):void { this._currentCmdEncoder.vertexAttribPointer(indx, size, type, normalized, stride, offset); } public viewport(x:number, y:number, width:number, height:number):void { this._currentCmdEncoder.viewport(x, y, width, height); } public configureBackBuffer(width:number, height:number, antiAlias:number, enableDepthAndStencil?:Boolean, wantsBestResolution?:Boolean):void { enableDepthAndStencil=enableDepthAndStencil?enableDepthAndStencil:true; wantsBestResolution=wantsBestResolution?wantsBestResolution:false; this._currentCmdEncoder.configureBackBuffer(width, height, antiAlias, enableDepthAndStencil, wantsBestResolution); } public compressedTexImage2D(_args):void { var args=arguments; this._currentCmdEncoder.compressedTexImage2D.apply(this._currentCmdEncoder, args); } public compressedTexSubImage2D(_args):void { var args=arguments; this._currentCmdEncoder.compressedTexSubImage2D.apply(this._currentCmdEncoder, args); } public createVertexArray():WebGLVertextArray { return this._currentCmdEncoder.createVertexArray(); } public bindVertexArray(vao:WebGLVertextArray):void { this._currentCmdEncoder.bindVertexArray(vao); } public deleteVertexArray(vao:WebGLVertextArray):void { this._currentCmdEncoder.deleteVertexArray(vao); } public isVertexArray(vao:any):boolean { return this._currentCmdEncoder.isVertexArray(vao); } public vertexAttribDivisor(index:number, divisor:number):void { this._currentCmdEncoder.vertexAttribDivisor(index, divisor); } public drawArraysInstanced(mode:number, first:number, count:number, instanceCount:number):void { this._currentCmdEncoder.drawArraysInstanced(mode, first, count, instanceCount); } public drawElementsInstanced(mode:number, count:number, type:number, offset:number, instanceCount:number):void { this._currentCmdEncoder.drawElementsInstanced(mode, count, type, offset, instanceCount); } public uniformMatrix2fvEx(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix2fvEx(location,transpose,value); } public uniformMatrix3fvEx(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix3fvEx(location,transpose,value); } public uniformMatrix4fvEx(location:any, transpose:any, value:any):void { this._currentCmdEncoder.uniformMatrix4fvEx(location,transpose,value); } public addShaderUniform(one:any):void { this._currentCmdEncoder.addShaderUniform(one); } public uploadShaderUniforms(commandEncoder:GLCommandEncoder, data:any,type:number):number { this._currentCmdEncoder.uploadShaderUniforms(commandEncoder, data,type); return 0; } public useCommandEncoder(commandEncoder:GLCommandEncoder):void { this._currentCmdEncoder.useCommandEncoder(commandEncoder); } public loadDataToReg(regNum:number,data:any,offset:number,size:number):void{ this._currentCmdEncoder.loadDataToReg(regNum, data, offset, size); } public loadDataToRegEx(regNum:number,dataID:number,offset:number,size:number):void{ this._currentCmdEncoder.loadDataToRegEx(regNum, dataID, offset, size); } public ifLess0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifLess0(regNum, statementNum); } public ifEqual0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifEqual0(regNum, statementNum); } public ifGreater0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifGreater0(regNum, statementNum); } public ifLEqual0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifLEqual0(regNum, statementNum); } public ifGEqual0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifGEqual0(regNum, statementNum); } public ifGNotEqual0(regNum:number,statementNum:number):void{ this._currentCmdEncoder.ifGNotEqual0(regNum, statementNum); } public operateReg(regOut:number,reg1:number,reg2:number,size:number,operateType:number,dataType:number):void{ this._currentCmdEncoder.operateReg(regOut, reg1, reg2, size, operateType, dataType); } public store(dataID:number, offset:number, regID:number, size:number):void{ this._currentCmdEncoder.store(dataID, offset, regID, size); } public setMainContextSize(width: number, height: number):void { this._nativeObj.setMainContextSize(width, height); } public getCurrentContext() { return this._currentContext; } public getProgramParameterEx(vs:string,ps:string,define:string,pname:number):number { return this._nativeObj.getProgramParameterEx(vs,ps,define,pname); } public getActiveAttribEx(vs:string,ps:string,define:string,index:number):any { return this._nativeObj.getActiveAttribEx(vs,ps,define,index); } public getActiveUniformEx(vs:string,ps:string,define:string,index:number):any { return this._nativeObj.getActiveUniformEx(vs,ps,define,index); } //为了兼容老版本用的,回头删除掉,现在都不用静态函数了 public static createArrayBufferRef(arrayBuffer:any, type:number, syncRender:boolean):any { var bufferConchRef:any = webglPlus.createArrayBufferRef(arrayBuffer, type, syncRender, LayaGLContext.ARRAY_BUFFER_REF_REFERENCE); arrayBuffer["conchRef"] = bufferConchRef; arrayBuffer["_ptrID"] = bufferConchRef.id; return bufferConchRef; } //为了兼容老版本用的,回头删除掉,现在都不用静态函数了 public static createArrayBufferRefs(arrayBuffer:any, type:number, syncRender:boolean, refType:number):any { if( !arrayBuffer._refArray ) { arrayBuffer._refArray = []; arrayBuffer._refNum = 1; arrayBuffer._refArray.length = 1; arrayBuffer.getRefNum=function() { return this._refNum; } arrayBuffer.clearRefNum=function() { this._refNum = 1; } arrayBuffer.getRefSize=function() { return this._refArray.length; } arrayBuffer.getPtrID=function(index) { index = index ? index : 0; return this._refArray[index].ptrID; } } var bufferConchRef:any = null; if( refType == LayaGLContext.ARRAY_BUFFER_REF_REFERENCE) { var refArray:any = arrayBuffer._refArray; if( !refArray[0] ) { bufferConchRef = webglPlus.createArrayBufferRef(arrayBuffer, type, syncRender, refType); refArray[0] = {"ref":bufferConchRef,"ptrID":bufferConchRef.id}; } } else { if( arrayBuffer._refNum < arrayBuffer._refArray.length ) { bufferConchRef = arrayBuffer._refArray[arrayBuffer._refNum].ref; var nPtrID:number = arrayBuffer.getPtrID(arrayBuffer._refNum); webglPlus.syncArrayBufferDataToRuntime(nPtrID,bufferConchRef.isSyncToRender(),arrayBuffer); } else { bufferConchRef = webglPlus.createArrayBufferRef(arrayBuffer, type, syncRender, refType); arrayBuffer._refArray.push( {"ref":bufferConchRef,"ptrID":bufferConchRef.id}); } arrayBuffer._refNum++; } return bufferConchRef; } //为了兼容老版本用的,回头删除掉,现在都不用静态函数了 public static syncBufferToRenderThread(value:any,index:number=0) { if( LayaGLContext.instance._threadMode == LayaGLContext.THREAD_MODE_SINGLE )return; var bNeedSync:boolean = false; if( !value._refArray ) { if( value.frameCount != LayaGLContext._frameAndSyncCountBuffer[0] ) { value.frameCount = LayaGLContext._frameAndSyncCountBuffer[0]; bNeedSync = true; } } else { var obj:any = value._refArray[index]; if( obj.frameCount != LayaGLContext._frameAndSyncCountBuffer[0] ) { obj.frameCount = LayaGLContext._frameAndSyncCountBuffer[0]; bNeedSync = true; } } if(bNeedSync) { if ( (LayaGLContext._frameAndSyncCountBuffer[1] + 1) > LayaGLContext._syncBufferSize) { var pre:Int32Array = LayaGLContext._syncBufferList; var preConchRef:any = LayaGLContext._syncBufferList["conchRef"]; var prePtrID:number = LayaGLContext._syncBufferList["_ptrID"]; LayaGLContext._syncBufferSize += LayaGLContext._SYNC_ARRAYBUFFER_SIZE_; LayaGLContext._syncBufferList = new Int32Array(LayaGLContext._syncBufferSize); LayaGLContext._syncBufferList["conchRef"] = preConchRef; LayaGLContext._syncBufferList["_ptrID"] = prePtrID; pre && LayaGLContext._syncBufferList.set(pre, 0); webglPlus.updateArrayBufferRef(LayaGLContext._syncBufferList["_ptrID"], false, LayaGLContext._syncBufferList); } var nID = value.getPtrID?value.getPtrID(index):value["_ptrID"]; if(!nID) { alert("syncBufferToRenderThread id error"); debugger; } LayaGLContext._syncBufferList[LayaGLContext._frameAndSyncCountBuffer[1]++] = nID; } } } window["WebGLRenderingContext"]=LayaGLContext; window["WebGL2RenderingContext"]=LayaGLContext; window["LayaGLContext"]=LayaGLContext; window["ProgramLocationTable"]=ProgramLocationTable; window["GLCommandEncoder"]=GLCommandEncoder; window["CallbackFuncObj"]=CallbackFuncObj;