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 ) } }