1191 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			1191 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | import GLenum from './GLenum'; | ||
|  | import ActiveInfo from './ActiveInfo'; | ||
|  | import Buffer from './Buffer'; | ||
|  | import Framebuffer from './Framebuffer'; | ||
|  | import Renderbuffer from './Renderbuffer'; | ||
|  | import Texture from './Texture'; | ||
|  | import Program from './Program'; | ||
|  | import Shader from './Shader'; | ||
|  | import ShaderPrecisionFormat from './ShaderPrecisionFormat'; | ||
|  | import UniformLocation from './UniformLocation'; | ||
|  | import GLmethod from './GLmethod'; | ||
|  | 
 | ||
|  | const processArray = (array, checkArrayType = false) => { | ||
|  | 
 | ||
|  |     function joinArray(arr, sep) { | ||
|  |         let res = ''; | ||
|  |         for (let i = 0; i < arr.length; i++) { | ||
|  |             if (i !== 0) { | ||
|  |                 res += sep; | ||
|  |             } | ||
|  |             res += arr[i]; | ||
|  |         } | ||
|  |         return res; | ||
|  |     } | ||
|  | 
 | ||
|  |     let type = 'Float32Array'; | ||
|  |     if (checkArrayType) { | ||
|  |         if (array instanceof Uint8Array) { | ||
|  |             type = 'Uint8Array' | ||
|  |         } else if (array instanceof Uint16Array) { | ||
|  |             type = 'Uint16Array'; | ||
|  |         } else if (array instanceof Uint32Array) { | ||
|  |             type = 'Uint32Array'; | ||
|  |         } else if (array instanceof Float32Array) { | ||
|  |             type = 'Float32Array'; | ||
|  |         } else { | ||
|  |             throw new Error('Check array type failed. Array type is ' + typeof array); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     const ArrayTypes = { | ||
|  |         Uint8Array: 1, | ||
|  |         Uint16Array: 2, | ||
|  |         Uint32Array: 4, | ||
|  |         Float32Array: 14 | ||
|  |     }; | ||
|  |     return ArrayTypes[type] + ',' + btoa(joinArray(array, ',')) | ||
|  | } | ||
|  | 
 | ||
|  | export default class WebGLRenderingContext { | ||
|  | 
 | ||
|  |     // static GBridge = null;
 | ||
|  | 
 | ||
|  |     className = 'WebGLRenderingContext'; | ||
|  | 
 | ||
|  |     constructor(canvas, type, attrs) { | ||
|  |         this._canvas = canvas; | ||
|  |         this._type = type; | ||
|  |         this._version = 'WebGL 1.0'; | ||
|  |         this._attrs = attrs; | ||
|  |         this._map = new Map(); | ||
|  | 
 | ||
|  |         Object.keys(GLenum) | ||
|  |             .forEach(name => Object.defineProperty(this, name, { | ||
|  |                 value: GLenum[name] | ||
|  |             })); | ||
|  |     } | ||
|  | 
 | ||
|  |     get canvas() { | ||
|  |         return this._canvas; | ||
|  |     } | ||
|  | 
 | ||
|  |     activeTexture = function (textureUnit) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.activeTexture + ',' + textureUnit, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     attachShader = function (progarm, shader) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.attachShader + ',' + progarm.id + ',' + shader.id, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     bindAttribLocation = function (program, index, name) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bindAttribLocation + ',' + program.id + ',' + index + ',' + name, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     bindBuffer = function (target, buffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bindBuffer + ',' + target + ',' + (buffer ? buffer.id : 0), | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     bindFramebuffer = function (target, framebuffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bindFramebuffer + ',' + target + ',' + (framebuffer ? framebuffer.id : 0), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     bindRenderbuffer = function (target, renderBuffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bindRenderbuffer + ',' + target + ',' + (renderBuffer ? renderBuffer.id : 0), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     bindTexture = function (target, texture) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bindTexture + ',' + target + ',' + (texture ? texture.id : 0), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     blendColor = function (r, g, b, a) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.blendColor + ',' + target + ',' + r + ',' + g + ',' + b + ',' + a, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     blendEquation = function (mode) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.blendEquation + ',' + mode, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     blendEquationSeparate = function (modeRGB, modeAlpha) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.blendEquationSeparate + ',' + modeRGB + ',' + modeAlpha, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     blendFunc = function (sfactor, dfactor) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.blendFunc + ',' + sfactor + ',' + dfactor, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     blendFuncSeparate = function (srcRGB, dstRGB, srcAlpha, dstAlpha) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.blendFuncSeparate + ',' + srcRGB + ',' + dstRGB + ',' + srcAlpha + ',' + dstAlpha, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     bufferData = function (target, data, usage) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bufferData + ',' + target + ',' + processArray(data, true) + ',' + usage, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     bufferSubData = function (target, offset, data) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.bufferSubData + ',' + target + ',' + offset + ',' + processArray(data, true), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     checkFramebufferStatus = function (target) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.checkFramebufferStatus + ',' + target | ||
|  |         ); | ||
|  |         return Number(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     clear = function (mask) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.clear + ',' + mask | ||
|  |         ); | ||
|  |         this._canvas._needRender = true; | ||
|  |     } | ||
|  | 
 | ||
|  |     clearColor = function (r, g, b, a) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.clearColor + ',' + r + ',' + g + ',' + b, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     clearDepth = function (depth) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.clearDepth + ',' + depth, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     clearStencil = function (s) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.clearStencil + ',' + s | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     colorMask = function (r, g, b, a) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.colorMask + ',' + r + ',' + g + ',' + b + ',' + a | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     compileShader = function (shader) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.compileShader + ',' + shader.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     compressedTexImage2D = function (target, level, internalformat, width, height, border, pixels) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.compressedTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + | ||
|  |             width + ',' + height + ',' + border + ',' + processArray(pixels), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     compressedTexSubImage2D = function (target, level, xoffset, yoffset, width, height, format, pixels) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.compressedTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + | ||
|  |             width + ',' + height + ',' + format + ',' + processArray(pixels), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     copyTexImage2D = function (target, level, internalformat, x, y, width, height, border) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.copyTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + x + ',' + y + ',' + | ||
|  |             width + ',' + height + ',' + border, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     copyTexSubImage2D = function (target, level, xoffset, yoffset, x, y, width, height) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.copyTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + x + ',' + y + ',' + | ||
|  |             width + ',' + height | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     createBuffer = function () { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createBuffer + '' | ||
|  |         ); | ||
|  |         const buffer = new Buffer(result); | ||
|  |         this._map.set(buffer.uuid(), buffer); | ||
|  |         return buffer; | ||
|  |     } | ||
|  | 
 | ||
|  |     createFramebuffer = function () { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createFramebuffer + '' | ||
|  |         ); | ||
|  |         const framebuffer = new Framebuffer(result); | ||
|  |         this._map.set(framebuffer.uuid(), framebuffer); | ||
|  |         return framebuffer; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     createProgram = function () { | ||
|  |         const id = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createProgram + '' | ||
|  |         ); | ||
|  |         const program = new Program(id); | ||
|  |         this._map.set(program.uuid(), program); | ||
|  |         return program; | ||
|  |     } | ||
|  | 
 | ||
|  |     createRenderbuffer = function () { | ||
|  |         const id = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createRenderbuffer + '' | ||
|  |         ) | ||
|  |         const renderBuffer = new Renderbuffer(id); | ||
|  |         this._map.set(renderBuffer.uuid(), renderBuffer); | ||
|  |         return renderBuffer; | ||
|  |     } | ||
|  | 
 | ||
|  |     createShader = function (type) { | ||
|  |         const id = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createShader + ',' + type | ||
|  |         ) | ||
|  |         const shader = new Shader(id, type); | ||
|  |         this._map.set(shader.uuid(), shader); | ||
|  |         return shader; | ||
|  |     } | ||
|  | 
 | ||
|  |     createTexture = function () { | ||
|  |         const id = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.createTexture + '' | ||
|  |         ); | ||
|  |         const texture = new Texture(id); | ||
|  |         this._map.set(texture.uuid(), texture); | ||
|  |         return texture; | ||
|  |     } | ||
|  | 
 | ||
|  |     cullFace = function (mode) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.cullFace + ',' + mode, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     deleteBuffer = function (buffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteBuffer + ',' + buffer.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     deleteFramebuffer = function (framebuffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteFramebuffer + ',' + framebuffer.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     deleteProgram = function (program) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteProgram + ',' + program.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     deleteRenderbuffer = function (renderbuffer) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteRenderbuffer + ',' + renderbuffer.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     deleteShader = function (shader) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteShader + ',' + shader.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     deleteTexture = function (texture) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.deleteTexture + ',' + texture.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     depthFunc = function (func) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.depthFunc + ',' + func | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     depthMask = function (flag) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.depthMask + ',' + Number(flag), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     depthRange = function (zNear, zFar) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.depthRange + ',' + zNear + ',' + zFar, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     detachShader = function (program, shader) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.detachShader + ',' + program.id + ',' + shader.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     disable = function (cap) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.disable + ',' + cap, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     disableVertexAttribArray = function (index) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.disableVertexAttribArray + ',' + index, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     drawArrays = function (mode, first, count) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.drawArrays + ',' + mode + ',' + first + ',' + count | ||
|  |         ) | ||
|  |         this._canvas._needRender = true; | ||
|  |     } | ||
|  | 
 | ||
|  |     drawElements = function (mode, count, type, offset) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.drawElements + ',' + mode + ',' + count + ',' + type + ',' + offset + ';' | ||
|  |         ); | ||
|  |         this._canvas._needRender = true; | ||
|  |     } | ||
|  | 
 | ||
|  |     enable = function (cap) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.enable + ',' + cap, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     enableVertexAttribArray = function (index) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.enableVertexAttribArray + ',' + index, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     flush = function () { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.flush + '' | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     framebufferRenderbuffer = function (target, attachment, textarget, texture, level) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.framebufferRenderbuffer + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     framebufferTexture2D = function (target, attachment, textarget, texture, level) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.framebufferTexture2D + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     frontFace = function (mode) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.frontFace + ',' + mode, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     generateMipmap = function (target) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.generateMipmap + ',' + target, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     getActiveAttrib = function (progarm, index) { | ||
|  |         const resultString = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getActiveAttrib + ',' + progarm.id + ',' + index | ||
|  |         ) | ||
|  |         const [type, size, name] = resultString.split(','); | ||
|  |         return new ActiveInfo({ | ||
|  |             type: Number(type), | ||
|  |             size: Number(size), | ||
|  |             name | ||
|  |         }); | ||
|  |     } | ||
|  | 
 | ||
|  |     getActiveUniform = function (progarm, index) { | ||
|  |         const resultString = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getActiveUniform + ',' + progarm.id + ',' + index | ||
|  |         ); | ||
|  |         const [type, size, name] = resultString.split(','); | ||
|  |         return new ActiveInfo({ | ||
|  |             type: Number(type), | ||
|  |             size: Number(size), | ||
|  |             name | ||
|  |         }) | ||
|  |     } | ||
|  | 
 | ||
|  |     getAttachedShaders = function (progarm) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getAttachedShaders + ',' + progarm.id | ||
|  |         ); | ||
|  |         const [type, ...ids] = result; | ||
|  |         return ids.map(id => this._map.get(Shader.uuid(id))); | ||
|  |     } | ||
|  | 
 | ||
|  |     getAttribLocation = function (progarm, name) { | ||
|  |         return WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getAttribLocation + ',' + progarm.id + ',' + name | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     getBufferParameter = function (target, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getBufferParameter + ',' + target + ',' + pname | ||
|  |         ); | ||
|  |         const [type, res] = getBufferParameter; | ||
|  |         return res; | ||
|  |     } | ||
|  | 
 | ||
|  |     getError = function () { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getError + '' | ||
|  |         ) | ||
|  |         return result; | ||
|  |     } | ||
|  | 
 | ||
|  |     getExtension = function (name) { | ||
|  |         return null; | ||
|  |     } | ||
|  | 
 | ||
|  |     getFramebufferAttachmentParameter = function (target, attachment, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getFramebufferAttachmentParameter + ',' + target + ',' + attachment + ',' + pname | ||
|  |         ) | ||
|  |         switch (pname) { | ||
|  |             case GLenum.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: | ||
|  |                 return this._map.get(Renderbuffer.uuid(result)) || this._map.get(Texture.uuid(result)) || null; | ||
|  |             default: | ||
|  |                 return result; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     getParameter = function (pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getParameter + ',' + pname | ||
|  |         ) | ||
|  |         switch (pname) { | ||
|  |             case GLenum.VERSION: | ||
|  |                 return this._version; | ||
|  |             case GLenum.ARRAY_BUFFER_BINDING: // buffer
 | ||
|  |             case GLenum.ELEMENT_ARRAY_BUFFER_BINDING: // buffer
 | ||
|  |                 return this._map.get(Buffer.uuid(result)) || null; | ||
|  |             case GLenum.CURRENT_PROGRAM: // program
 | ||
|  |                 return this._map.get(Program.uuid(result)) || null; | ||
|  |             case GLenum.FRAMEBUFFER_BINDING: // framebuffer
 | ||
|  |                 return this._map.get(Framebuffer.uuid(result)) || null; | ||
|  |             case GLenum.RENDERBUFFER_BINDING: // renderbuffer
 | ||
|  |                 return this._map.get(Renderbuffer.uuid(result)) || null; | ||
|  |             case GLenum.TEXTURE_BINDING_2D: // texture
 | ||
|  |             case GLenum.TEXTURE_BINDING_CUBE_MAP: // texture
 | ||
|  |                 return this._map.get(Texture.uuid(result)) || null; | ||
|  |             case GLenum.ALIASED_LINE_WIDTH_RANGE: // Float32Array
 | ||
|  |             case GLenum.ALIASED_POINT_SIZE_RANGE: // Float32Array
 | ||
|  |             case GLenum.BLEND_COLOR: // Float32Array
 | ||
|  |             case GLenum.COLOR_CLEAR_VALUE: // Float32Array
 | ||
|  |             case GLenum.DEPTH_RANGE: // Float32Array
 | ||
|  |             case GLenum.MAX_VIEWPORT_DIMS: // Int32Array
 | ||
|  |             case GLenum.SCISSOR_BOX: // Int32Array
 | ||
|  |             case GLenum.VIEWPORT: // Int32Array            
 | ||
|  |             case GLenum.COMPRESSED_TEXTURE_FORMATS: // Uint32Array
 | ||
|  |             default: | ||
|  |                 const [type, ...res] = result.split(','); | ||
|  |                 if (res.length === 1) { | ||
|  |                     return Number(res[0]); | ||
|  |                 } else { | ||
|  |                     return res.map(Number); | ||
|  |                 } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     getProgramInfoLog = function (progarm) { | ||
|  |         return WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getProgramInfoLog + ',' + progarm.id | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     getProgramParameter = function (program, pname) { | ||
|  |         const res = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getProgramParameter + ',' + program.id + ',' + pname | ||
|  |         ); | ||
|  | 
 | ||
|  |         const [type, result] = res.split(',').map(i => parseInt(i)); | ||
|  | 
 | ||
|  |         if (type === 1) { | ||
|  |             return Boolean(result); | ||
|  |         } else if (type === 2) { | ||
|  |             return result; | ||
|  |         } else { | ||
|  |             throw new Error('Unrecongized program paramater ' + res + ', type: ' + typeof res); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     getRenderbufferParameter = function (target, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getRenderbufferParameter + ',' + target + ',' + pname | ||
|  |         ) | ||
|  |         return result; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     getShaderInfoLog = function (shader) { | ||
|  |         return WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getShaderInfoLog + ',' + shader.id | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     getShaderParameter = function (shader, pname) { | ||
|  |         return WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getShaderParameter + ',' + shader.id + ',' + pname | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     getShaderPrecisionFormat = function (shaderType, precisionType) { | ||
|  |         const [rangeMin, rangeMax, precision] = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getShaderPrecisionFormat + ',' + shaderType + ',' + precisionType | ||
|  |         ); | ||
|  |         const shaderPrecisionFormat = new ShaderPrecisionFormat({ | ||
|  |             rangeMin: Number(rangeMin), | ||
|  |             rangeMax: Number(rangeMax), | ||
|  |             precision: Number(precision) | ||
|  |         }); | ||
|  |         return shaderPrecisionFormat; | ||
|  |     } | ||
|  | 
 | ||
|  |     getShaderSource = function (shader) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getShaderSource + ',' + shader.id | ||
|  |         ); | ||
|  |         return result; | ||
|  |     } | ||
|  | 
 | ||
|  |     getSupportedExtensions = function () { | ||
|  |         return Object.keys({}); | ||
|  |     } | ||
|  | 
 | ||
|  |     getTexParameter = function (target, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getTexParameter + ',' + target + ',' + pname | ||
|  |         ) | ||
|  |         return result; | ||
|  |     } | ||
|  | 
 | ||
|  |     getUniformLocation = function (program, name) { | ||
|  |         const id = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getUniformLocation + ',' + program.id + ',' + name | ||
|  |         ); | ||
|  |         if (id === -1) { | ||
|  |             return null; | ||
|  |         } else { | ||
|  |             return new UniformLocation(Number(id)); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     getVertexAttrib = function (index, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getVertexAttrib + ',' + index + ',' + pname | ||
|  |         ); | ||
|  |         switch (pname) { | ||
|  |             case GLenum.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: | ||
|  |                 return this._map.get(Buffer.uuid(result)) || null; | ||
|  |             case GLenum.CURRENT_VERTEX_ATTRIB: // Float32Array
 | ||
|  |             default: | ||
|  |                 return result; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     getVertexAttribOffset = function (index, pname) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.getVertexAttribOffset + ',' + index + ',' + pname | ||
|  |         ) | ||
|  |         return Number(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isBuffer = function (buffer) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isBuffer + ',' + buffer.id | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isContextLost = function () { | ||
|  |         return false; | ||
|  |     } | ||
|  | 
 | ||
|  |     isEnabled = function (cap) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isEnabled + ',' + cap | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isFramebuffer = function (framebuffer) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isFramebuffer + ',' + framebuffer.id | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isProgram = function (program) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isProgram + ',' + program.id | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isRenderbuffer = function (renderBuffer) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isRenderbuffer + ',' + renderbuffer.id | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isShader = function (shader) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isShader + ',' + shader.id | ||
|  |         ) | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     isTexture = function (texture) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.isTexture + ',' + texture.id | ||
|  |         ); | ||
|  |         return Boolean(result); | ||
|  |     } | ||
|  | 
 | ||
|  |     lineWidth = function (width) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.lineWidth + ',' + width, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     linkProgram = function (program) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.linkProgram + ',' + program.id, | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     pixelStorei = function (pname, param) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.pixelStorei + ',' + pname + ',' + Number(param) | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     polygonOffset = function (factor, units) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.polygonOffset + ',' + factor + ',' + units | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     readPixels = function (x, y, width, height, format, type, pixels) { | ||
|  |         const result = WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.readPixels + ',' + x + ',' + y + ',' + width + ',' + height + ',' + format + ',' + type | ||
|  |         ) | ||
|  |         return result; | ||
|  |     } | ||
|  | 
 | ||
|  |     renderbufferStorage = function (target, internalFormat, width, height) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.renderbufferStorage + ',' + target + ',' + internalFormat + ',' + width + ',' + height, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     sampleCoverage = function (value, invert) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.sampleCoverage + ',' + value + ',' + Number(invert), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     scissor = function (x, y, width, height) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.scissor + ',' + x + ',' + y + ',' + width + ',' + height, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     shaderSource = function (shader, source) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.shaderSource + ',' + shader.id + ',' + source | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilFunc = function (func, ref, mask) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilFunc + ',' + func + ',' + ref + ',' + mask, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilFuncSeparate = function (face, func, ref, mask) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilFuncSeparate + ',' + face + ',' + func + ',' + ref + ',' + mask, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilMask = function (mask) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilMask + ',' + mask, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilMaskSeparate = function (face, mask) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilMaskSeparate + ',' + face + ',' + mask, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilOp = function (fail, zfail, zpass) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilOp + ',' + fail + ',' + zfail + ',' + zpass | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     stencilOpSeparate = function (face, fail, zfail, zpass) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.stencilOp + ',' + face + ',' + fail + ',' + zfail + ',' + zpass, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     texImage2D = function (...args) { | ||
|  |         WebGLRenderingContext.GBridge.texImage2D(this._canvas.id, ...args); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     texParameterf = function (target, pname, param) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.texParameterf + ',' + target + ',' + pname + ',' + param, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     texParameteri = function (target, pname, param) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.texParameteri + ',' + target + ',' + pname + ',' + param | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     texSubImage2D = function (...args) { | ||
|  |         WebGLRenderingContext.GBridge.texSubImage2D(this._canvas.id, ...args); | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform1f = function (location, v0) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform1f + ',' + location.id + ',' + v0 | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform1fv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform1fv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform1i = function (location, v0) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform1i + ',' + location.id + ',' + v0, | ||
|  |             // true
 | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform1iv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform1iv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform2f = function (location, v0, v1) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform2f + ',' + location.id + ',' + v0 + ',' + v1, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform2fv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform2fv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform2i = function (location, v0, v1) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform2i + ',' + location.id + ',' + v0 + ',' + v1, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform2iv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform2iv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform3f = function (location, v0, v1, v2) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform3f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform3fv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform3fv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform3i = function (location, v0, v1, v2) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform3i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform3iv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform3iv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform4f = function (location, v0, v1, v2, v3) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform4f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform4fv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform4fv + ',' + location.id + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform4i = function (location, v0, v1, v2, v3) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform4i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniform4iv = function (location, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniform4iv + ',' + location.id + ',' + processArray(value, true), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniformMatrix2fv = function (location, transpose, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniformMatrix2fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniformMatrix3fv = function (location, transpose, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniformMatrix3fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     uniformMatrix4fv = function (location, transpose, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.uniformMatrix4fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), | ||
|  |             true | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     useProgram = function (progarm) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.useProgram + ',' + progarm.id + '', | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     validateProgram = function (program) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.validateProgram + ',' + program.id, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib1f = function (index, v0) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib1f + ',' + index + ',' + v0, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib2f = function (index, v0, v1) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib2f + ',' + index + ',' + v0 + ',' + v1, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib3f = function (index, v0, v1, v2) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib3f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib4f = function (index, v0, v1, v2, v3) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib4f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib1fv = function (index, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib1fv + ',' + index + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib2fv = function (index, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib2fv + ',' + index + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib3fv = function (index, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib3fv + ',' + index + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttrib4fv = function (index, value) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttrib4fv + ',' + index + ',' + processArray(value), | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     vertexAttribPointer = function (index, size, type, normalized, stride, offset) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.vertexAttribPointer + ',' + index + ',' + size + ',' + type + ',' + Number(normalized) + ',' + stride + ',' + offset, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | 
 | ||
|  |     viewport = function (x, y, width, height) { | ||
|  |         WebGLRenderingContext.GBridge.callNative( | ||
|  |             this._canvas.id, | ||
|  |             GLmethod.viewport + ',' + x + ',' + y + ',' + width + ',' + height, | ||
|  |             true | ||
|  |         ) | ||
|  |     } | ||
|  | } |