/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(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; function RDGEWebTexture() { this.handle; // gl handle this.unit; // the texture slot/unit this.type = UNIFORMTYPE.TEXTURE2D; } function RDGEWebUniformPair(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 = [ { '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) } ]; 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); this.uniformMap[name].value = _value; } // 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 = []; } 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(); } __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); } } } } // take a parameterless function 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); } } // set the diffuse color shaderProg.RDGEUniform.SetUni("u_lightDiff", this.light0Color); 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; } } 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); }; funcmap[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); } };