From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- .../RDGE/src/core/script/rendercontext.js | 268 +++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 js/helper-classes/RDGE/src/core/script/rendercontext.js (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 new file mode 100644 index 00000000..6bc8665b --- /dev/null +++ b/js/helper-classes/RDGE/src/core/script/rendercontext.js @@ -0,0 +1,268 @@ +/* +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); + } +}; -- cgit v1.2.3