From fb0a659c9ca3479fd6799325498b11f074689936 Mon Sep 17 00:00:00 2001 From: John Mayhew Date: Mon, 2 Apr 2012 14:57:31 -0700 Subject: -Namespaced all RDGE javascript. -Removed the following unused files from the build script /core/script/fx/blur.js /core/script/fx/ssao.js /core/script/animation.js - Fully removed the following from the build and from source control as they are unused or no longer needed /core/script/util/dbgpanel.js /core/script/util/fpsTracker.js /core/script/util/statTracker.js /core/script/input.js /core/script/TextureManager.js /core/script/ubershader.js --- .../RDGE/src/core/script/rendercontext.js | 454 ++++++++++----------- 1 file changed, 227 insertions(+), 227 deletions(-) (limited to 'js/helper-classes/RDGE/src/core/script/rendercontext.js') diff --git a/js/helper-classes/RDGE/src/core/script/rendercontext.js b/js/helper-classes/RDGE/src/core/script/rendercontext.js index 6bc8665b..83c64473 100755 --- a/js/helper-classes/RDGE/src/core/script/rendercontext.js +++ b/js/helper-classes/RDGE/src/core/script/rendercontext.js @@ -4,265 +4,265 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. */ -// render flags, handles, states - -var g_whiteTex = null; -var g_blackTex = null; -var g_blueTex = null; +var RDGE = RDGE || {}; -function RDGEWebTexture() -{ - this.handle; // gl handle - this.unit; // the texture slot/unit - this.type = UNIFORMTYPE.TEXTURE2D; -} +// render flags, handles, states +RDGE.g_whiteTex = null; +RDGE.g_blackTex = null; +RDGE.g_blueTex = null; + +/* These objects appear to be unused so they are currently commented out +RDGE.RDGEWebTexture = function () { + this.handle; // gl handle + this.unit; // the texture slot/unit + this.type = RDGE.UNIFORMTYPE.TEXTURE2D; +}; -function RDGEWebUniformPair(uniform, value, type) { - this.uniform = uniform; - this.value = value; - this.type = type; -} +RDGE.RDGEWebUniformPair = function (uniform, value, type) { + this.uniform = uniform; + this.value = value; + this.type = type; +}; // pass a function that takes no parameters -function defaultState() -{ - return [ function(){gl.disable(gl.CULL_FACE)}, - function(){gl.enable(gl.DEPTH_TEST)}] -} -// this chunk of data contains uniform storage references set the data with RDGEUniform.set (ie RDGEUniform.set("u_name", UNIFORMTYPE.FLOAT4, myData); ) -function CreateMasterList() { - _MasterUniformList = +RDGE.defaultState = function () { + return [function () { gl.disable(gl.CULL_FACE) }, + function () { gl.enable(gl.DEPTH_TEST) } ] +}; +*/ + +// this chunk of data contains uniform storage references set the data with RDGEUniform.set (ie RDGEUniform.set("u_name", RDGE.UNIFORMTYPE.FLOAT4, myData); ) +RDGE.CreateMasterList = function () { + _MasterUniformList = [ - { 'uniform': projMatrixUniform = 0, 'name': "u_projMatrix", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': mvMatrixUniform = 0, 'name': "u_mvMatrix", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': normalMatrixUniform = 0, 'name': "u_normalMatrix", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': worldMatrixUniform = 0, 'name': "u_worldMatrix", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': lightPos = 0, 'name': "u_lightPos", 'type': UNIFORMTYPE.FLOAT3, 'value': new Float32Array(3) }, - { 'uniform': lightDiff = 0, 'name': "u_lightDiff", 'type': UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, - { 'uniform': lightAmb = 0, 'name': "u_lightAmb", 'type': UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, - { 'uniform': colMap = 0, 'name': "colMap", 'type': UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, - { 'uniform': envMap = 0, 'name': "envMap", 'type': UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, - { 'uniform': normalMap = 0, 'name': "normalMap", 'type': UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, - { 'uniform': glowMap = 0, 'name': "glowMap", 'type': UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, - { 'uniform': matAmbient = 0, 'name': "u_matAmbient", 'type': UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, - { 'uniform': matDiffuse = 0, 'name': "u_matDiffuse", 'type': UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, - { 'uniform': matSpecular = 0, 'name': "u_matSpecular", 'type': UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, - { 'uniform': matShininess = 0, 'name': "u_matShininess", 'type': UNIFORMTYPE.FLOAT, 'value': new Float32Array(1) }, - { 'uniform': matEmission = 0, 'name': "u_matEmission", 'type': UNIFORMTYPE.FLOAT, 'value': new Float32Array(4) }, - { 'uniform': frustumFarZ = 0, 'name': "u_frustumFarZ", 'type': UNIFORMTYPE.FLOAT, 'value': new Float32Array(1) }, - { 'uniform': shadowLightWorld = 0, 'name': "u_shadowLightWorld", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': shadowBiasMatrix = 0, 'name': "u_shadowBiasMatrix", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': vShadowLight = 0, 'name': "u_vShadowLight", 'type': UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, - { 'uniform': depthMap = 0, 'name': "depthMap", 'type': UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) } + { 'uniform': projMatrixUniform = 0, 'name': "u_projMatrix", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': mvMatrixUniform = 0, 'name': "u_mvMatrix", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': normalMatrixUniform = 0, 'name': "u_normalMatrix", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': worldMatrixUniform = 0, 'name': "u_worldMatrix", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': lightPos = 0, 'name': "u_lightPos", 'type': RDGE.UNIFORMTYPE.FLOAT3, 'value': new Float32Array(3) }, + { 'uniform': lightDiff = 0, 'name': "u_lightDiff", 'type': RDGE.UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, + { 'uniform': lightAmb = 0, 'name': "u_lightAmb", 'type': RDGE.UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, + { 'uniform': colMap = 0, 'name': "colMap", 'type': RDGE.UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, + { 'uniform': envMap = 0, 'name': "envMap", 'type': RDGE.UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, + { 'uniform': normalMap = 0, 'name': "normalMap", 'type': RDGE.UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, + { 'uniform': glowMap = 0, 'name': "glowMap", 'type': RDGE.UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) }, + { 'uniform': matAmbient = 0, 'name': "u_matAmbient", 'type': RDGE.UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, + { 'uniform': matDiffuse = 0, 'name': "u_matDiffuse", 'type': RDGE.UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, + { 'uniform': matSpecular = 0, 'name': "u_matSpecular", 'type': RDGE.UNIFORMTYPE.FLOAT4, 'value': new Float32Array(4) }, + { 'uniform': matShininess = 0, 'name': "u_matShininess", 'type': RDGE.UNIFORMTYPE.FLOAT, 'value': new Float32Array(1) }, + { 'uniform': matEmission = 0, 'name': "u_matEmission", 'type': RDGE.UNIFORMTYPE.FLOAT, 'value': new Float32Array(4) }, + { 'uniform': frustumFarZ = 0, 'name': "u_frustumFarZ", 'type': RDGE.UNIFORMTYPE.FLOAT, 'value': new Float32Array(1) }, + { 'uniform': shadowLightWorld = 0, 'name': "u_shadowLightWorld", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': shadowBiasMatrix = 0, 'name': "u_shadowBiasMatrix", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': vShadowLight = 0, 'name': "u_vShadowLight", 'type': RDGE.UNIFORMTYPE.MATRIX4, 'value': new Float32Array(16) }, + { 'uniform': depthMap = 0, 'name': "depthMap", 'type': RDGE.UNIFORMTYPE.TEXTURE2D, 'value': new Int32Array(1) } ]; - - return _MasterUniformList; -} - -function RDGEUniformInit() -{ - this.uniformList = CreateMasterList(); - this.uniformMap=[]; - for(var idx = 0; idx < this.uniformList.length; ++idx) - { - this.uniformMap[this.uniformList[idx].name] = this.uniformList[idx]; - } -} -RDGEUniformInit.prototype.SetUni = function(name, _value) -{ - //this.uniformMap[name].value.set(_value); + return _MasterUniformList; +}; - this.uniformMap[name].value = _value; -} +RDGE.RDGEUniformInit = function () { + this.uniformList = RDGE.CreateMasterList(); + this.uniformMap = []; + for (var idx = 0; idx < this.uniformList.length; ++idx) { + this.uniformMap[this.uniformList[idx].name] = this.uniformList[idx]; + } +}; -// Globally available uniform storage -RDGEUniform = new RDGEUniformInit(); - - -function RenderContext() -{ - - this.shaderProg = null; - this.uniforms =[]; - this.textureList =[]; - this.curRenderProc = null; - this.light0Color = [1, 1, 1, 0]; - this.parentID = 0; - this.world = mat4.identity(); - this.hide = false; - enableNormalMapping=true; - this.lights = [ null, null, null, null]; - - // the camera - this.cam; - - // state settings - set functions in the array that set states or 'other' so long as it makes since - this.stateSettings = []; +RDGE.RDGEUniformInit.prototype.SetUni = function (name, _value) { + //this.uniformMap[name].value.set(_value); -} + this.uniformMap[name].value = _value; +}; -RenderContext.prototype.Load = function(ctx) -{ - this.shaderProg = ctx.shaderProg; - this.uniforms = ctx.uniforms.slice(); - this.textureList = ctx.textureList.slice(); - this.stateSettings = ctx.stateSettings.slice(); - this.curRenderProc = ctx.curRenderProc; - this.light0Color = ctx.light0Color.slice(); - this.parentID = ctx.parentID; - this.world = mat4.copy(ctx.world); - this.lights = ctx.lights.slice(); - - // the camera - this.cam = this.cam; - - // state settings - set functions in the array that set states or 'other' so long as it makes since - this.stateSettings = this.stateSettings.slice(); -} +// Globally available uniform storage +RDGE.RDGEUniform = new RDGE.RDGEUniformInit(); + +RDGE.RenderContext = function () { + this.shaderProg = null; + this.uniforms = []; + this.textureList = []; + this.curRenderProc = null; + this.light0Color = [1, 1, 1, 0]; + this.parentID = 0; + this.world = RDGE.mat4.identity(); + this.hide = false; + enableNormalMapping = true; + this.lights = [null, null, null, null]; + + // the camera + this.cam; + + // state settings - set functions in the array that set states or 'other' so long as it makes since + this.stateSettings = []; +}; +RDGE.RenderContext.prototype.Load = function (ctx) { + this.shaderProg = ctx.shaderProg; + this.uniforms = ctx.uniforms.slice(); + this.textureList = ctx.textureList.slice(); + this.stateSettings = ctx.stateSettings.slice(); + this.curRenderProc = ctx.curRenderProc; + this.light0Color = ctx.light0Color.slice(); + this.parentID = ctx.parentID; + this.world = RDGE.mat4.copy(ctx.world); + this.lights = ctx.lights.slice(); + + // the camera + this.cam = this.cam; + + // state settings - set functions in the array that set states or 'other' so long as it makes since + this.stateSettings = this.stateSettings.slice(); +}; -__lastInited = []; // keep list of initialized shaders - -function _SetShader(program) -{ - gl.useProgram(program); - - if(__lastInited[program.shaderID] === undefined) - { - __lastInited[program.shaderID] = true; - // init the uniforms - gl.enableVertexAttribArray(0); - gl.enableVertexAttribArray(1); - gl.enableVertexAttribArray(2); - - var deleteMe = []; - for (var uniIndex = 0; uniIndex < program.RDGEUniform.uniformList.length; uniIndex++) { - - var handle = gl.getUniformLocation(program, program.RDGEUniform.uniformList[uniIndex].name); - if (handle) - program.RDGEUniform.uniformList[uniIndex].uniform = handle; - else { - program.RDGEUniform.uniformList.splice(uniIndex, 1); - uniIndex = Math.max(uniIndex - 1, 0); - } - +RDGE.__lastInited = []; // keep list of initialized shaders + +RDGE._SetShader = function (program) { + gl.useProgram(program); + + if (RDGE.__lastInited[program.shaderID] === undefined) { + RDGE.__lastInited[program.shaderID] = true; + // init the uniforms + gl.enableVertexAttribArray(0); + gl.enableVertexAttribArray(1); + gl.enableVertexAttribArray(2); + + var deleteMe = []; + for (var uniIndex = 0; uniIndex < program.RDGEUniform.uniformList.length; uniIndex++) { + + var handle = gl.getUniformLocation(program, program.RDGEUniform.uniformList[uniIndex].name); + if (handle) + program.RDGEUniform.uniformList[uniIndex].uniform = handle; + else { + program.RDGEUniform.uniformList.splice(uniIndex, 1); + uniIndex = Math.max(uniIndex - 1, 0); + } + } } - - } - } // take a parameterless function -RenderContext.prototype.AddStateSetting = function(functor) -{ - this.stateSettings.push(functor); -} +RDGE.RenderContext.prototype.AddStateSetting = function (functor) { + this.stateSettings.push(functor); +}; // take a parameterless function -RenderContext.prototype.Apply = function() { - - // set shader program to use - shaderProg = null; - if (this.shaderProg != null) { - _SetShader(this.shaderProg); - shaderProg = this.shaderProg; - } - else { - _SetShader(g_Engine.defaultContext.shaderProg); - shaderProg = g_Engine.defaultContext.shaderProg; - } - - // set shader values (name/uniform pair must be in the master list) - - if (this.uniforms.length > 0) { - for (var idx = 0; idx < this.uniforms.length; ++idx) { - shaderProg.RDGEUniform.SetUni(this.uniforms[idx].name, this.uniforms[idx].value); +RDGE.RenderContext.prototype.Apply = function () { + + // set shader program to use + shaderProg = null; + if (this.shaderProg != null) { + RDGE._SetShader(this.shaderProg); + shaderProg = this.shaderProg; + } + else { + RDGE._SetShader(RDGE.globals.engine.defaultContext.shaderProg); + shaderProg = RDGE.globals.engine.defaultContext.shaderProg; } - } - // set the diffuse color - shaderProg.RDGEUniform.SetUni("u_lightDiff", this.light0Color); + // set shader values (name/uniform pair must be in the master list) + if (this.uniforms.length > 0) { + for (var idx = 0; idx < this.uniforms.length; ++idx) { + shaderProg.RDGEUniform.SetUni(this.uniforms[idx].name, this.uniforms[idx].value); + } + } - for (var setIdx = 0; setIdx < this.stateSettings.length; ++setIdx) { - // call state funcs - this.stateSettings[setIdx](); - } + // set the diffuse color + shaderProg.RDGEUniform.SetUni("u_lightDiff", this.light0Color); - this.bindTextures(); + for (var setIdx = 0; setIdx < this.stateSettings.length; ++setIdx) { + // call state funcs + this.stateSettings[setIdx](); + } -} + this.bindTextures(); +}; -RenderContext.prototype.bindTextures = function() { - - var ctx = g_Engine.getContext().renderer.ctx; -// gl.activeTexture(gl.TEXTURE0); -// gl.bindTexture(gl.TEXTURE_CUBE_MAP, g_whiteTex); -// gl.activeTexture(gl.TEXTURE0); -// gl.bindTexture(gl.TEXTURE_2D, g_whiteTex); - -// gl.activeTexture(gl.TEXTURE2); -// gl.bindTexture(gl.TEXTURE_CUBE_MAP, g_blueTex); -// gl.activeTexture(gl.TEXTURE2); -// gl.bindTexture(gl.TEXTURE_2D, g_blueTex); - -// gl.activeTexture(gl.TEXTURE3); -// gl.bindTexture(gl.TEXTURE_CUBE_MAP, g_blackTex); -// gl.activeTexture(gl.TEXTURE3); -// gl.bindTexture(gl.TEXTURE_2D, g_blackTex); - - for (var uniIndex = 0; uniIndex < this.textureList.length; uniIndex++) { - var bind = this.textureList[uniIndex]; - - switch (bind.type) { - case UNIFORMTYPE.TEXTURE2D: - ctx.activeTexture(ctx.TEXTURE0 + bind.unit); - ctx.bindTexture(ctx.TEXTURE_2D, bind.handle); - break; - case UNIFORMTYPE.TEXTURECUBE: - ctx.activeTexture(ctx.TEXTURE0 + bind.unit); - ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, bind.handle); - break; - default: - // gl.console.log("!!!! - trying to bind unknown texture type"); - break; +RDGE.RenderContext.prototype.bindTextures = function () { + + var ctx = RDGE.globals.engine.getContext().renderer.ctx; + // gl.activeTexture(gl.TEXTURE0); + // gl.bindTexture(gl.TEXTURE_CUBE_MAP, RDGE.g_whiteTex); + // gl.activeTexture(gl.TEXTURE0); + // gl.bindTexture(gl.TEXTURE_2D, RDGE.g_whiteTex); + + // gl.activeTexture(gl.TEXTURE2); + // gl.bindTexture(gl.TEXTURE_CUBE_MAP, RDGE.g_blueTex); + // gl.activeTexture(gl.TEXTURE2); + // gl.bindTexture(gl.TEXTURE_2D, RDGE.g_blueTex); + + // gl.activeTexture(gl.TEXTURE3); + // gl.bindTexture(gl.TEXTURE_CUBE_MAP, RDGE.g_blackTex); + // gl.activeTexture(gl.TEXTURE3); + // gl.bindTexture(gl.TEXTURE_2D, RDGE.g_blackTex); + + for (var uniIndex = 0; uniIndex < this.textureList.length; uniIndex++) { + var bind = this.textureList[uniIndex]; + + switch (bind.type) { + case RDGE.UNIFORMTYPE.TEXTURE2D: + ctx.activeTexture(ctx.TEXTURE0 + bind.unit); + ctx.bindTexture(ctx.TEXTURE_2D, bind.handle); + break; + case RDGE.UNIFORMTYPE.TEXTURECUBE: + ctx.activeTexture(ctx.TEXTURE0 + bind.unit); + ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, bind.handle); + break; + default: + // gl.console.log("!!!! - trying to bind unknown texture type"); + break; + } + } + + if (!enableNormalMapping) { + ctx.activeTexture(ctx.TEXTURE2); + ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, RDGE.g_blueTex); + ctx.activeTexture(ctx.TEXTURE2); + ctx.bindTexture(ctx.TEXTURE_2D, RDGE.g_blueTex); } - } - - if (!enableNormalMapping) { - ctx.activeTexture(ctx.TEXTURE2); - ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, g_blueTex); - ctx.activeTexture(ctx.TEXTURE2); - ctx.bindTexture(ctx.TEXTURE_2D, g_blueTex); - } }; -var funcmap = {}; -funcmap[UNIFORMTYPE.INT] = function(a, b) {gl.uniform1iv(a, b);}; -funcmap[UNIFORMTYPE.FLOAT] = function(a, b) {gl.uniform1fv(a, b);}; -funcmap[UNIFORMTYPE.FLOAT2] = function(a, b) {gl.uniform2fv(a, b);}; -funcmap[UNIFORMTYPE.FLOAT3] = function(a, b) {gl.uniform3fv(a, b);}; -funcmap[UNIFORMTYPE.FLOAT4] = function(a, b) {gl.uniform4fv(a, b);}; -funcmap[UNIFORMTYPE.MATRIX3] = function(a, b) {gl.uniformMatrix3fv(a, false, b);}; -funcmap[UNIFORMTYPE.MATRIX4] = function(a, b) {gl.uniformMatrix4fv(a, false, b);}; -funcmap[UNIFORMTYPE.TEXTURE2D] = function(a, b) { - gl.activeTexture(gl.TEXTURE0 + b); - gl.uniform1iv(a, b); +RDGE.funcmap = {}; + +RDGE.funcmap[RDGE.UNIFORMTYPE.INT] = function (a, b) { + gl.uniform1iv(a, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.FLOAT] = function (a, b) { + gl.uniform1fv(a, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.FLOAT2] = function (a, b) { + gl.uniform2fv(a, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.FLOAT3] = function (a, b) { + gl.uniform3fv(a, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.FLOAT4] = function (a, b) { + gl.uniform4fv(a, b); }; -funcmap[UNIFORMTYPE.TEXTURECUBE] = function(a, b) { - gl.activeTexture(gl.TEXTURE0 + b); - gl.uniform1iv(a, b); +RDGE.funcmap[RDGE.UNIFORMTYPE.MATRIX3] = function (a, b) { + gl.uniformMatrix3fv(a, false, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.MATRIX4] = function (a, b) { + gl.uniformMatrix4fv(a, false, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.TEXTURE2D] = function (a, b) { + gl.activeTexture(gl.TEXTURE0 + b); + gl.uniform1iv(a, b); +}; +RDGE.funcmap[RDGE.UNIFORMTYPE.TEXTURECUBE] = function (a, b) { + gl.activeTexture(gl.TEXTURE0 + b); + gl.uniform1iv(a, b); }; -function _bindUniforms(shaderProg) { - var len = shaderProg.RDGEUniform.uniformList.length; - var uniforms = shaderProg.RDGEUniform.uniformList; - - for (var uniIndex = 0; uniIndex < len; uniIndex++) { - var bind = uniforms[uniIndex]; - funcmap[bind.type](bind.uniform, bind.value); - } +RDGE._bindUniforms = function (shaderProg) { + var len = shaderProg.RDGEUniform.uniformList.length; + var uniforms = shaderProg.RDGEUniform.uniformList; + + for (var uniIndex = 0; uniIndex < len; uniIndex++) { + var bind = uniforms[uniIndex]; + RDGE.funcmap[bind.type](bind.uniform, bind.value); + } }; -- cgit v1.2.3