From 3644cb6def4f681c99959e5729e78ea353441fad Mon Sep 17 00:00:00 2001
From: Kris Kowal
Date: Fri, 6 Jul 2012 12:34:53 -0700
Subject: Normalize to unix line terminators
---
js/helper-classes/RDGE/src/core/script/renderer.js | 3370 ++++++++++----------
1 file changed, 1685 insertions(+), 1685 deletions(-)
(limited to 'js/helper-classes/RDGE/src/core/script/renderer.js')
diff --git a/js/helper-classes/RDGE/src/core/script/renderer.js b/js/helper-classes/RDGE/src/core/script/renderer.js
index cac0c33f..2d0c6f1e 100755
--- a/js/helper-classes/RDGE/src/core/script/renderer.js
+++ b/js/helper-classes/RDGE/src/core/script/renderer.js
@@ -1,1685 +1,1685 @@
-/*
-Copyright (c) 2012, Motorola Mobility, Inc
-All Rights Reserved.
-BSD License.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- - Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- - Neither the name of Motorola Mobility nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
- */
-
-var RDGE = RDGE || {};
-
-// runtime globals
-RDGE.rdgeConstants = (function () {
- return {
- // clear flags
- colorBuffer: 0x00004000,
- depthBuffer: 0x00000100,
- stencilBuffer: 0x00000400,
-
- // primitive types
- POINTS: 0,
- LINES: 1,
- LINE_LOOP: 2,
- LINE_STRIP: 3,
- TRIANGLES: 4,
- TRIANGLE_STRIP: 5,
- TRIANGLE_FAN: 6,
-
- // primitive data types
- BYTE: 0x1400,
- UNSIGNED_BYTE: 0x1401,
- SHORT: 0x1402,
- UNSIGNED_SHORT: 0x1403,
- INT: 0x1404,
- UNSIGNED_INT: 0x1405,
- FLOAT: 0x1406,
-
- // pre-defined vertex element type
- VS_ELEMENT_FLOAT4: 4,
- VS_ELEMENT_POS: 3,
- VS_ELEMENT_NORM: 3,
- VS_ELEMENT_FLOAT3: 3,
- VS_ELEMENT_FLOAT2: 2,
- VS_ELEMENT_UV: 2,
- VS_ELEMENT_FLOAT: 1,
- MAX_ELEM_TYPES: 7,
-
- // GL Definition of buffer types
- BUFFER_STATIC: 0x88E0,
- BUFFER_DYNAMIC: 0x88E4,
- BUFFER_STREAM: 0x88E8,
-
- // render constants
- MAX_MATERIAL_LIGHTS: 4,
-
- // Material categories determine sorting materials support the following categories
- categoryEnumeration:
- {
- 'BACKGROUND': 0,
- 'OPAQUE': 1,
- 'TRANSPARENT': 2,
- 'ADDITIVE': 3,
- 'TRANSLUCENT': 4,
- 'FOREGROUND': 5,
- 'MAX_CAT': 6
- },
-
- // Node types supported by the scene graph
- nodeType:
- {
- 'TRNODE': 0,
- 'MESHNODE': 1,
- 'MATNODE': 2,
- 'LIGHTNODE': 3
- }
- };
-})();
-
-RDGE._renderer = function (canvas) {
- /*
- * Initialize the context associated with this canvas
- */
- try {
- this.ctx = canvas.getContext("experimental-webgl", { preserveDrawingBuffer: true }); // true, true, false, true, true);
-
- if (!this.ctx) {
- this.ctx = canvas.getContext("webgl", { preserveDrawingBuffer: true });
- }
- if (!this.ctx) {
- this.ctx = canvas.getContext("webkit-3d", { preserveDrawingBuffer: true });
- }
- if (!this.ctx) {
- this.ctx = canvas.getContext("moz-webgl", { preserveDrawingBuffer: true });
- }
- }
- catch (err) { }
- if (!this.ctx) {
- window.console.log("Could not create GL context");
- return null;
- }
-
- // set viewport for the first time
- this.ctx.viewport(0, 0, canvas.width, canvas.height);
-
- // Add a console output to the renderer
- this.console = ("console" in window) ? window.console : { log: function () { } };
-
- /*
- * Set the default clear color
- */
- this.ctx.clearColor(1, 0, 0, 1);
-
- /*
- * the clear color of this renderer
- */
- this.clearColor = [1, 0, 0, 1];
-
- /*
- * The clear flags clear color and depth buffers by default
- */
- this.clearFlags = this.ctx.COLOR_BUFFER_BIT | this.ctx.DEPTH_BUFFER_BIT
-
- /*
- * clear flags
- */
- this.colorBuffer = this.ctx.COLOR_BUFFER_BIT;
- this.depthBuffer = this.ctx.DEPTH_BUFFER_BIT;
- this.stencilBuffer = this.ctx.STENCIL_BUFFER_BIT;
-
- /*
- * buffer types
- */
- this.BUFFER_STATIC = 0;
- this.BUFFER_DYNAMIC = 1;
- this.BUFFER_STREAM = 2;
-
- /*
- * primitive types
- */
- this.POINTS = 0;
- this.LINES = 1;
- this.LINE_LOOP = 2;
- this.LINE_STRIP = 3;
- this.TRIANGLES = 4;
- this.TRIANGLE_STRIP = 5;
- this.TRIANGLE_FAN = 6;
-
- /*
- * primitive data types
- */
- this.BYTE = 0x1400;
- this.UNSIGNED_BYTE = 0x1401;
- this.SHORT = 0x1402;
- this.UNSIGNED_SHORT = 0x1403;
- this.INT = 0x1404;
- this.UNSIGNED_INT = 0x1405;
- this.FLOAT = 0x1406;
-
- /*
- * pre-defined vertex element type
- */
- this.VS_ELEMENT_FLOAT4 = 4;
- this.VS_ELEMENT_POS = 3;
- this.VS_ELEMENT_NORM = 3;
- this.VS_ELEMENT_FLOAT3 = 3;
- this.VS_ELEMENT_FLOAT2 = 2;
- this.VS_ELEMENT_UV = 2;
- this.VS_ELEMENT_FLOAT = 1;
- this.MAX_ELEM_TYPES = 7;
-
- // GL Definition of buffer types
- this.BUFFER_STATIC = 0x88E0;
- this.BUFFER_DYNAMIC = 0x88E4;
- this.BUFFER_STREAM = 0x88E8;
-
- // render constants
- this.MAX_MATERIAL_LIGHTS = 4;
-
- // max system textures
- this.usedTextureUnits = 5;
-
- /*
- * the renderers current viewport
- */
- this.vpX = 0;
- this.vpY = 0;
- this.vpWidth = canvas.width;
- this.vpHeight = canvas.height;
-
- /*
- * the camera manager - contains the camera stack for this render context
- */
- this.cameraMan = new RDGE.cameraManager();
-
- /*
- * a list of device buffers that are owned by this render context
- */
- this.buffers = [];
-
-
- /*
- * State wrappers
- */
- this.cullBackFace = function () {
- this.ctx.cullFace(this.ctx.Back);
- };
-
- this.cullFrontFace = function () {
- this.ctx.cullFace(this.ctx.FRONT);
- };
-
- this.disableCulling = function () {
- this.ctx.disable(this.ctx.CULL_FACE);
- };
-
- this.enableCulling = function () {
- this.ctx.enable(this.ctx.CULL_FACE);
- };
-
- this.enablePolyOffsetFill = function () {
- this.ctx.enable(this.ctx.POLYGON_OFFSET_FILL);
- };
-
- this.disablePolyOffsetFill = function () {
- this.ctx.enable(this.ctx.POLYGON_OFFSET_FILL);
- };
-
- this.enablePointSprites = function () {
- // this.ctx.enable(0x8642);
- };
-
- this.disablePointSprites = function () {
- // this.ctx.enable(0x8642);
- };
-
- this.setClearColor = function (color) {
- this.clearColor = color.slice();
- this.ctx.clearColor(color[0], color[1], color[2], color[3]);
- };
-
- /*
- * flags that specify how to clear the scene, can be OR'ed together
- */
- this.setClearFlags = function (flags) {
- this.clearFlags = flags;
- };
-
- /*
- * called by the system to clear the video buffer according to pre-set flags
- */
- this._clear = function () {
- this.ctx.clear(this.clearFlags);
- };
-
- /*
- * clears the video buffer with flags provided
- */
- this.clear = function (flags) {
- this.ctx.clear(flags);
- };
-
- /*
- * flush the video buffer
- */
- this.flush = function () {
- this.ctx.flush();
- };
-
- /*
- * Sets the current viewport
- */
- this.setViewPort = function (x, y, width, height) {
- this.vpX = x;
- this.vpY = y;
- this.vpWidth = width;
- this.vpHeight = height;
- this.ctx.viewport(this.vpX, this.vpY, this.vpWidth, this.vpHeight);
- };
-
- /*
- * access the camera manager associated with the renderer
- */
- this.cameraManager = function () {
- return this.cameraMan;
- };
-
- /*
- * Sets of texture maps owned by the renderer
- */
- this.textureMap = [];
- this.rttMap = [];
-
- /*
- * gets the texture by name or creates the texture requested
- * @param name - the name of the texture to try and get
- * @param wrap - optional "CLAMP or "REPEAT", default is clamp
- * @param mips - optional true/false value to create mipmaps, the default is true
- */
- this.getTextureByName = function (name, wrap, mips) {
- var ext = name.split('.')[1];
-
- if (!ext)
- ext = ".png";
- else
- ext = "";
-
- var tex = this.textureMap[name];
-
- if (tex === undefined) {
- // load the texture
- name = RDGE.globals.engine.remapAssetFolder( name );
- tex = this.createTexture(name + ext, wrap, mips);
- this.textureMap[name] = tex;
- tex.lookUpName = name;
- tex.previouslyReferenced = false;
- }
- else {
- //console.log( "texture already loaded: " + name );
- tex.previouslyReferenced = true;
- }
-
- return tex;
- };
-
- /*
- * creates a texture from the given URL
- * @param url - the resource location
- * @param wrap - optional "CLAMP or "REPEAT", default is clamp
- * @param mips - optional true/false value to create mipmaps, the default is true
- */
- this.unloadedTextureCount = 0;
- _texparams = function (wrap, mips) {
- this.wrap = wrap, this.mips = mips
- };
- this.createTexture = function (url, wrap, mips) {
- var texture = this.ctx.createTexture();
- this.unloadedTextureCount++;
-
- if (wrap === undefined)
- wrap = "CLAMP";
- if (mips === undefined)
- mips = true;
-
- if (texture) {
- texture.image = new Image();
- texture.image.src = url;
- texture.image.context = RDGE.globals.engine.getContext();
- texture.texparams = new _texparams(wrap, mips);
- texture.image.onload = function () {
- var stateMan = this.context.ctxStateManager;
- stateMan.RDGEInitState.loadTexture(texture);
- this.context.renderer.unloadedTextureCount--;
- //console.log( "loaded texture: " + texture.lookUpName + ",to: " + this.context.renderer._world._worldCount + ", textures remaining to load: " + this.context.renderer.unloadedTextureCount );
- if (texture.callback) texture.callback(texture);
- if (this.context.renderer.unloadedTextureCount < 0)
- console.log("more textures loaded then created...");
- };
- texture.image.onerror = function () {
- this.context.renderer.unloadedTextureCount--;
- if (texture.callback) texture.callback(texture);
- //console.log( "Error loading texture: " + texture.image.src );
- if (this.context.renderer.unloadedTextureCount < 0)
- console.log("more textures loaded then created...");
- };
- }
- return texture;
- };
-
- /*
- * commits a texture to video memory
- * @param - the texture object created by a call to create texture
- */
- this.commitTexture = function (texture) {
- this.ctx.bindTexture(this.ctx.TEXTURE_2D, texture);
- this.ctx.texImage2D(this.ctx.TEXTURE_2D, 0, this.ctx.RGBA, this.ctx.RGBA, this.ctx.UNSIGNED_BYTE, texture.image);
-
- if (texture.texparams.mips)
- this.ctx.generateMipmap(this.ctx.TEXTURE_2D);
-
- this.ctx.texParameteri(this.ctx.TEXTURE_2D, this.ctx.TEXTURE_MAG_FILTER, this.ctx.LINEAR);
- this.ctx.texParameteri(this.ctx.TEXTURE_2D, this.ctx.TEXTURE_MIN_FILTER, texture.texparams.mips ? this.ctx.LINEAR_MIPMAP_LINEAR : this.ctx.LINEAR);
- this.ctx.texParameteri(this.ctx.TEXTURE_2D, this.ctx.TEXTURE_WRAP_S, texture.texparams.wrap === "REPEAT" ? this.ctx.REPEAT : this.ctx.CLAMP_TO_EDGE);
- this.ctx.texParameteri(this.ctx.TEXTURE_2D, this.ctx.TEXTURE_WRAP_T, texture.texparams.wrap === "REPEAT" ? this.ctx.REPEAT : this.ctx.CLAMP_TO_EDGE);
-
- this.ctx.bindTexture(this.ctx.TEXTURE_2D, null);
- };
-
- this.verify = function (label) {
- var error = this.ctx.getError();
- if (error != 0) {
- window.console.log("GLError ( " + label + ") : " + error);
- }
- };
-
- this.createRenderTargetTexture = function (lookUpName, width, height, generateMips) {
- var ctx = this.ctx;
- // create framebuffer
- var renderTargetFrameBuffer = ctx.createFramebuffer();
- ctx.bindFramebuffer(ctx.FRAMEBUFFER, renderTargetFrameBuffer);
-
- // setup parameters (width, hight, filtering)
- renderTargetFrameBuffer.width = width;
- renderTargetFrameBuffer.height = height;
-
- // create the texture
- var renderTarget = ctx.createTexture();
- ctx.bindTexture(ctx.TEXTURE_2D, renderTarget);
-
- try {
- // Do it the way the spec requires
- ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, renderTargetFrameBuffer.width, renderTargetFrameBuffer.height, 0, ctx.RGBA, ctx.UNSIGNED_BYTE, null);
- } catch (exception) {
- // Workaround for what appears to be a Minefield bug.
- var textureStorage = new WebctxUnsignedByteArray(renderTargetFrameBuffer.width * renderTargetFrameBuffer.height * 4);
- ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, renderTargetFrameBuffer.width, renderTargetFrameBuffer.height, 0, ctx.RGBA, ctx.UNSIGNED_BYTE, textureStorage);
- }
-
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, generateMips ? ctx.LINEAR_MIPMAP_NEAREST : ctx.LINEAR);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE);
- ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, ctx.CLAMP_TO_EDGE);
-
- if (generateMips) {
- ctx.generateMipmap(ctx.TEXTURE_2D);
- }
-
- // set frame buffer storage and texture
- var renderBuffer = ctx.createRenderbuffer();
- ctx.bindRenderbuffer(ctx.RENDERBUFFER, renderBuffer);
- ctx.renderbufferStorage(ctx.RENDERBUFFER, ctx.DEPTH_COMPONENT16, renderTargetFrameBuffer.width, renderTargetFrameBuffer.height);
-
- // bind
- var error = ctx.getError(ctx.bindFramebuffer(ctx.FRAMEBUFFER, renderTargetFrameBuffer));
- error = ctx.getError(ctx.bindRenderbuffer(ctx.RENDERBUFFER, renderBuffer));
- error = ctx.getError(ctx.renderbufferStorage(ctx.RENDERBUFFER, ctx.DEPTH_COMPONENT16, renderTargetFrameBuffer.width, renderTargetFrameBuffer.height));
-
- ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);
-
- // bind texture handle and renderBuffer to frame buffer
- error = ctx.getError(ctx.framebufferTexture2D(ctx.FRAMEBUFFER, ctx.COLOR_ATTACHMENT0, ctx.TEXTURE_2D, renderTarget, 0));
-
- error = ctx.getError(ctx.framebufferRenderbuffer(ctx.FRAMEBUFFER, ctx.DEPTH_ATTACHMENT, ctx.RENDERBUFFER, renderBuffer));
-
- ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);
-
- /*
- var status=ctx.checkFramebufferStatus(ctx.FRAMEBUFFER);
- switch(status) {
- case ctx.FRAMEBUFFER_COMPLETE:
- break;
- case ctx.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- ctx.console.log("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
- return null;
- case ctx.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- ctx.console.log("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
- return null;
- case ctx.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
- ctx.console.log("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
- return null;
- case ctx.FRAMEBUFFER_UNSUPPORTED:
- ctx.console.log("Incomplete framebuffer: FRAMEBUFFER_UNSUPPORTED");
- return null;
- default:
- ctx.console.log("Incomplete framebuffer: "+status);
- return null;
- }
- */
-
- // unbind
- ctx.bindTexture(ctx.TEXTURE_2D, null);
- ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);
- ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);
-
- renderTarget.id = "RT_" + RDGE.nodeIdGen.getId();
-
- renderTarget.frameBuffer = renderTargetFrameBuffer;
-
- if (this.textureMap[lookUpName])
- window.console.log("Notification: render target: " + lookUpName + " has overwritten an existing render target");
-
- // add to lookup map
- this.textureMap[lookUpName] = renderTarget;
-
- return renderTarget;
- };
-
- /*
- * The default shader setup
- */
- this.defaultShaderDefintion = {
- 'shaders': {
- 'defaultVShader': "assets/shaders/test_vshader.glsl",
- 'defaultFShader': "assets/shaders/test_fshader.glsl"
- },
- 'techniques': {
- 'defaultTechnique': [{
- 'vshader': 'defaultVShader',
- 'fshader': 'defaultFShader',
- // attributes
- 'attributes':
- {
- 'vert': { 'type': 'vec3' },
- 'normal': { 'type': 'vec3' },
- 'texcoord': { 'type': 'vec2' }
- },
- // parameters
- 'params':
- {
- },
-
- // render states
- 'states':
- {
- 'depthEnable': true,
- 'blendEnable': false,
- 'culling': true,
- 'cullFace': "BACK"
- }
- }]
- }
- };
-};
-
-/*
-* Shader definitions
-*/
-
-/*
-* The default shader setup
-*/
-RDGE.rdgeDefaultShaderDefintion = {
- 'shaders': {
- //'defaultVShader':"assets/shaders/test_vshader.glsl",
- //'defaultFShader':"assets/shaders/test_fshader.glsl"
- 'defaultVShader': "assets/shaders/Basic.vert.glsl",
- 'defaultFShader': "assets/shaders/Basic.frag.glsl"
- },
- 'techniques': {
- 'defaultTechnique': [{
- 'vshader': 'defaultVShader',
- 'fshader': 'defaultFShader',
- // attributes
- 'attributes':
- {
- 'vert': { 'type': 'vec3' },
- 'normal': { 'type': 'vec3' },
- 'texcoord': { 'type': 'vec2' }
- },
- // parameters
- 'params':
- {
- },
-
- // render states
- 'states':
- {
- 'depthEnable': true,
- 'blendEnable': false,
- 'culling': true,
- 'cullFace': "BACK"
- }
- }]
- }
-};
-
-/*
-* The default depth map shader techniques
-*/
-// currently not used in Ninja
-// RDGE.rdgeDepthMapShaderDef = {
-// 'shaders': {
-// 'depthMapVShader': "assets/shaders/depthMap_vshader.glsl",
-// 'depthMapFShader': "assets/shaders/depthMap_fshader.glsl"
-// },
-// 'techniques':
-// {
-// 'shadowDepthMap':
-// [{
-// 'vshader': 'depthMapVShader',
-// 'fshader': 'depthMapFShader',
-// // attributes
-// 'attributes':
-// { 'vert': { 'type': 'vec3' },
-// 'normal': { 'type': 'vec3' },
-// 'texcoord': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params': {},
-// // render states
-// 'states':
-// { 'depthEnable': true,
-// 'blendEnable': false,
-// 'culling': true,
-// 'cullFace': "BACK"
-// }
-// }],
-// 'depthMap':
-// [{
-// 'vshader': 'depthMapVShader',
-// 'fshader': 'depthMapFShader',
-// // attributes
-// 'attributes':
-// { 'vert': { 'type': 'vec3' },
-// 'normal': { 'type': 'vec3' },
-// 'texcoord': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params': {},
-// // render states
-// 'states':
-// { 'depthEnable': true,
-// 'blendEnable': false,
-// 'culling': true,
-// 'cullFace': "BACK"
-// }
-// }]
-//
-// }
-// };
-
-/*
-* capture normals in view space
-*/
-// currently not used in Ninja
-// RDGE.rdgeViewSpaceNormalsShader = {
-// 'shaders': {
-// 'normalsVShader': "assets/shaders/norm_depth_vshader.glsl",
-// 'normalsFShader': "assets/shaders/norm_depth_fshader.glsl"
-// },
-// 'techniques':
-// {
-// 'depthMapWNormal':
-// [{
-// 'vshader': 'normalsVShader',
-// 'fshader': 'normalsFShader',
-// // attributes
-// 'attributes':
-// { 'vert': { 'type': 'vec3' },
-// 'normal': { 'type': 'vec3'}
-// },
-// // parameters
-// 'params': {},
-// // render states
-// 'states':
-// { 'depthEnable': true,
-// 'blendEnable': false,
-// 'culling': true,
-// 'cullFace': "BACK"
-// }
-// }]
-//
-// }
-// };
-
-/*
-* basic screen squad shader definition
-*/
-// currently not used in Ninja
-// RDGE.rdgeScreenQuadShaderDef = {
-// 'shaders': {
-// // Texture coordinates are setup so that the full texture
-// // is mapped completely onto the screen
-// 'screenQuadVShader': "\
-// attribute vec3 a_pos;\
-// attribute vec2 a_uv;\
-// uniform float u_inv_viewport_width;\
-// uniform float u_inv_viewport_height;\
-// varying vec2 vTexcoord;\
-// void main()\
-// {\
-// gl_Position = vec4(a_pos.xy, 0.0, 1.0);\
-// \
-// vTexcoord.x = 0.5 * (1.0 + a_pos.x + u_inv_viewport_width);\
-// vTexcoord.y = 0.5 * (1.0 - a_pos.y + u_inv_viewport_height);\
-// }",
-// 'screenQuadFShader': "\
-// precision highp float;\
-// uniform sampler2D u_mainRT;\
-// uniform sampler2D u_glowFinal;\
-// uniform sampler2D u_ssaoRT;\
-// uniform sampler2D u_shadowMap;\
-// varying vec2 vTexcoord;\
-// void main()\
-// {\
-// vec2 tex = vec2(vTexcoord.x, 1.0 - vTexcoord.y);\
-// vec4 glowTexel = texture2D(u_glowFinal, tex);\
-// vec4 ssaoTexel = texture2D(u_ssaoRT, tex);\
-// vec4 smapCoef = texture2D(u_shadowMap, tex);\
-// ssaoTexel.a = 0.0;\
-// vec4 texel = texture2D(u_mainRT, tex);\
-// gl_FragColor = vec4(texel.r*((1.0 - glowTexel.r)*smapCoef.r), texel.g*((1.0 - glowTexel.g)*smapCoef.g), texel.b*((1.0 - glowTexel.b)*smapCoef.b), texel.a) + glowTexel - ssaoTexel;\
-// }"
-// },
-// 'techniques': {
-// // rendering control
-// 'screenQuad': [{
-// 'vshader': 'screenQuadVShader',
-// 'fshader': 'screenQuadFShader',
-//
-// // attributes
-// 'attributes': {
-// 'a_pos': { 'type': 'vec3' },
-// 'a_uv': { 'type': 'vec2' }
-// },
-// 'params': {
-// 'u_mainRT': { 'type': "tex2d" },
-// 'u_glowFinal': { 'type': "tex2d", 'data': "assets/images/black" },
-// 'u_ssaoRT': { 'type': "tex2d", 'data': "assets/images/black" },
-// 'u_shadowMap': { 'type': "tex2d", 'data': "assets/images/white" }
-// },
-// // render states
-// 'states': {
-// 'blendEnabled': true,
-// 'srcBlend': 'SRC_ALPHA',
-// 'dstcBlend': 'ONE_MINUS_SRC_ALPHA'
-// }
-// }]
-// }
-// };
-
-/*
-* creates the glow map
-*/
-// currently not used in Ninja
-// RDGE.rdgeGlowMapShader = {
-// 'shaders': {
-// 'createGlowVShader': "assets/shaders/glowMap_vshader.glsl",
-// 'createGlowFShader': "assets/shaders/glowMap_fshader.glsl"
-// },
-// 'techniques': {
-// 'createGlowMap': [
-// {
-// 'vshader': 'createGlowVShader',
-// 'fshader': 'createGlowFShader',
-// // attributes
-// 'attributes':
-// {
-// 'vert': { 'type': 'vec3' },
-// 'normal': { 'type': 'vec3' },
-// 'texcoord': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params':
-// {
-// },
-//
-// // render states
-// 'states':
-// {
-// 'depthEnable': true,
-// 'blendEnable': false,
-// 'culling': true,
-// 'cullFace': "BACK"
-// }
-// }
-// ]
-// }
-// };
-
-/*
-* Gaussian blur shader
-*/
-// currently not used in Ninja
-// RDGE.rdgeGaussianBlurShader = {
-// 'shaders': {
-// 'blurVShader': "assets/shaders/separableBlur_vshader.glsl",
-// 'blurFShader': "assets/shaders/separableBlur_fshader.glsl"
-// },
-// 'techniques': {
-// 'gaussianBlur': [
-// {
-// 'vshader': 'blurVShader',
-// 'fshader': 'blurFShader',
-// // attributes
-// 'attributes':
-// {
-// 'vert': { 'type': 'vec3' },
-// 'texcoord': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params':
-// {
-// 'vCoeffs': { 'type': 'vec3', 'data': [5.0 / 16.0, 6.0 / 16.0, 5.0 / 16.0] },
-// 'vOffset': { 'type': 'vec2', 'data': [0.00617, 0.00617] },
-// 'u_weight': { 'type': 'float', 'data': [1.0] },
-// 'sTexture': { 'type': "tex2d" }
-// },
-// // render states
-// 'states':
-// {
-// 'culling': false
-// }
-// }
-// ]
-// }
-// };
-
-/*
-* Screen space ambient occlusion shader
-*/
-// currently not used in Ninja
-// RDGE.rdgeSSAOShader = {
-// 'shaders': {
-// 'blurVShader': "assets/shaders/ssao_vshader.glsl",
-// 'blurFShader': "assets/shaders/ssaohr_fshader.glsl"
-// },
-// 'techniques': {
-// 'ssao': [
-// {
-// 'vshader': 'blurVShader',
-// 'fshader': 'blurFShader',
-// // attributes
-// 'attributes':
-// {
-// 'vert': { 'type': 'vec3' },
-// 'texcoord': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params':
-// {
-// 'u_normalsRT': { 'type': "tex2d" },
-// 'u_depthMap': { 'type': "tex2d" },
-// 'sRandMap': { 'type': "tex2d", 'data': "assets/images/random_normal.png", 'wrap': "REPEAT", 'mips': false },
-// 'u_cameraFTR': { 'type': 'vec3' },
-// 'u_artVals': { 'type': 'vec4', 'data': [0.36, 0.75, 0.60, 0.05] }, // sample radius, intensity, distScale, bias
-// 'u_randMapSize': { 'type': 'float', 'data': [64.0] },
-// 'u_screenSize': { 'type': 'vec2', 'data': [1024, 1024] }
-// },
-// // render states
-// 'states':
-// {
-// 'culling': false
-// }
-// }
-// ]
-// }
-// };
-
-/*
-* Shadow map generation
-*/
-// currently not used in Ninja
-// RDGE.rdgeShadowMapShader = {
-// 'shaders': {
-// 'shadowMapVShader': "assets/shaders/shadowMap_vshader.glsl",
-// 'shadowMapFShader': "assets/shaders/shadowMap_fshader.glsl"
-// },
-// 'techniques': {
-// 'shadowMap': [
-// {
-// 'vshader': 'shadowMapVShader',
-// 'fshader': 'shadowMapFShader',
-// // attributes
-// 'attributes':
-// {
-// 'a_pos': { 'type': 'vec3' },
-// 'a_uv': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params':
-// {
-// 'u_lightSize': { 'type': 'float', 'data': [7.93] },
-// // color is inverted, alpha represents intensity and is not inverted
-// 'u_shadowColor': { 'type': 'vec4', 'data': [0.922, 0.7373, 0.4824, 0.5] }
-// },
-// // render states
-// 'states':
-// {
-// 'depthEnable': true,
-// 'blendEnable': false,
-// 'culling': true,
-// 'cullFace': "BACK"
-// }
-// }
-// ]
-// }
-// };
-
-/*
-* Noise blur filter
-*/
-// currently not used in Ninja
-// RDGE.rdgeNoiseBlurShader = {
-// 'shaders': {
-// 'blurVShader': "assets/shaders/noiseBlur_vshader.glsl",
-// 'blurFShader': "assets/shaders/noiseBlur_fshader.glsl"
-// },
-// 'techniques': {
-// 'blur': [
-// {
-// 'vshader': 'blurVShader',
-// 'fshader': 'blurFShader',
-// // attributes
-// 'attributes':
-// {
-// 'a_pos': { 'type': 'vec3' },
-// 'a_uv': { 'type': 'vec2' }
-// },
-// // parameters
-// 'params':
-// {
-// 'u_blurSourceMap': { 'type': "tex2d" }
-// },
-// // render states
-// 'states':
-// {
-// 'culling': false
-// }
-// }
-// ]
-// }
-// };
-
-/*
-* defines a primitive using java script native types
-*/
-RDGE.rdgePrimitiveDefinition = function () {
- /*
- * The type of primitive
- * supported types are
- * renderer.POINTS
- * renderer.LINES
- * renderer.LINE_LOOP
- * renderer.LINE_STRIP
- * renderer.TRIANGLES
- * renderer.TRIANGLE_STRIP
- * renderer.TRIANGLE_FAN
- */
- this.type = RDGE.rdgeConstants.TRIANGLE_STRIP;
-
- /*
- * Define vertex elements size in bytes and order the element appears in the stream
- * Predefined size types:
- * renderer.VS_ELEMENT_FLOAT4
- * renderer.VS_ELEMENT_FLOAT3
- * renderer.VS_ELEMENT_FLOAT2
- * renderer.VS_ELEMENT_FLOAT
- * renderer.VS_ELEMENT_UINT16
- * renderer.VS_ELEMENT_UINT8
- */
- this.vertexDefinition =
- {
- // usage example: two ways of declaring a float 3 stream
- //"vert" :{ 'type':renderer.VS_ELEMENT_POS, 'bufferIndex':indexIntoBufferStream, 'usage': renderer.BUFFER_STATIC }
- //"a_pos" :{ 'type':renderer.VS_ELEMENT_POS, 'bufferIndex':indexIntoBufferStream, 'usage': renderer.BUFFER_STATIC }
- };
-
- /*
- * Arrays of buffer data listed in the order given by the vertex definition
- */
- this.bufferStreams =
- [
-
- ];
-
- /*
- * An array indicating the the stream usage listed in the order given by the vertex definition
- * Valid usage values: renderer.BUFFER_STATIC The data store contents will be specified once by the application, and used many times
- * renderer.BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
- * renderer.BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
- */
- this.streamUsage =
- [
-
- ];
-
- /*
- * indicates the the stream usage of the index buffer
- * Valid usage values: renderer.BUFFER_STATIC The data store contents will be specified once by the application, and used many times
- * renderer.BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
- * renderer.BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
- */
- this.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM;
-
- /*
- * a references to an array of indices
- */
- this.indexBuffer =
- [
- ];
-
- /*
- * the number of sets of geometry in this primitive
- */
- this.setCount = 0;
-
- /*
- * Offset of a primitive in an index buffer
- * if the primitive represents a set each set array has a corresponding index offset
- */
- this.indexOffsets =
- [
- ];
-
- //////////////////////////////////////////////////////////////
- // OUTPUT VALUES //
- //////////////////////////////////////////////////////////////
-
- /*
- * the number of coordinates's that make this primitive
- * auto populated with a call to renderer.createPrimitive
- */
- this.posCount = 0;
-
- /*
- * the number of triangle that make up this primitive
- * auto populated with a call to renderer.createPrimitive
- */
- this.triCount = 0;
-
- /*
- * the number of indices in the primitive
- * auto populated with a call to renderer.createPrimitive
- */
- this.indexCount = 0;
-
- /*
- * size of an index value in bytes
- */
- this.indexElementSize = RDGE.rdgeConstants.UNSIGNED_SHORT;
-
- /*
- * bufferHanldes are created when passing a primitive to renderer.createPrimitive
- * An array of handles to buffers in vram, listed in the order given by the vertex definition
- */
- this.bufferHandles =
- [
- ];
-
- /*
- * An index into the buffers table for the render context that created the buffer
- */
- this.buffersID = -1;
-
- /*
- * Handle to index buffer object
- */
- this.indexHandle = null;
-
-
- /*
- * ------------------- Double buffer Setup-----------------------------
- */
-
- /*
- * user flag used to create a double buffered primitive
- * Double buffer flag - when double buffered a .front() and .back() buffer
- * are available as well as a call .flip() to flip the buffers
- */
- this.useDoubleBuffer = false;
-
- /*
- * The double buffer offset tells the renderer where in its 'bufferID' array for this primitive the 'doubled' buffers begin
- */
- this.doubleBufferOffset = 0;
-
- /*
- * Keeps track of which buffer is the front buffer or active buffer
- */
- this.frontBufferIndex = 0;
-
- /*
- * Helper function for retrieving the buffer for editing - successfully calling this makes the buffer dirty and will trigger a buffer swap
- * @param bufIndex - buffer stream index
- * @return buffer stream requested, or null if invalid index is given
- */
- this.update = function (bufIndex) {
- if (!this.bufferStreams[bufIndex])
- return null;
-
- this.bufferStreams[bufIndex].dirty = true;
- return this.bufferStreams[bufIndex];
- };
-
-
- /*
- * Flips the front and back buffers
- */
- this.flip = function (renderer) {
- if (this.useDoubleBuffer === true) {
- // if a back buffer is dirty update it
- for (var i = 0, len = this.bufferStreams.length; i < len; ++i) {
- if (this.bufferStreams[i].dirty) {
- this.bufferStreams[i].dirty = false;
- renderer.updateBuffer(renderer.buffers[this.buffersID][this.frontBufferIndex * this.doubleBufferOffset + i], this.bufferStreams[i], this.streamUsage[i]);
- this.frontBufferIndex = 1 - this.frontBufferIndex;
- }
- }
- }
- };
-};
-
-
-// generate an id for the renderer to map a render buffer to primitive
-RDGE._renderer.prototype._rendererID = 0;
-RDGE._renderer.prototype.getBufferID = function () {
- return RDGE._renderer.prototype._rendererID++;
-};
-/*
-* @param bufferSizeOrData: an array of indices, or the size in bytes to preallocate
-* @param bufferUsage: BUFFER_STATIC The data store contents will be specified once by the application, and used many times
-* BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
-* BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
-* @return an unsigned short index buffer object
-*/
-RDGE._renderer.prototype.createIndexBufferUINT16 = function (bufferSizeOrData, bufferUsage) {
- var bufferObject = this.ctx.createBuffer();
- bufferObject.type = bufferSizeOrData.type;
- this.ctx.bindBuffer(this.ctx.ELEMENT_ARRAY_BUFFER, bufferObject);
- this.ctx.bufferData(this.ctx.ELEMENT_ARRAY_BUFFER, (typeof k == "number")
- ? bufferSizeOrData
- : new Uint16Array(bufferSizeOrData), bufferUsage);
- return bufferObject;
-};
-
-/*
-* @param bufferSizeOrData: an array of indices, or the size in bytes to preallocate
-* @param bufferUsage: BUFFER_STATIC The data store contents will be specified once by the application, and used many times
-* BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
-* BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
-* @return an unsigned byte index buffer object
-*/
-RDGE._renderer.prototype.createIndexBufferUINT8 = function (bufferSizeOrData, bufferUsage) {
- var bufferObject = this.ctx.createBuffer();
- bufferObject.type = bufferSizeOrData.type;
- this.ctx.bindBuffer(this.ctx.ELEMENT_ARRAY_BUFFER, bufferObject);
- this.ctx.bufferData(this.ctx.ELEMENT_ARRAY_BUFFER, (typeof k == "number")
- ? bufferSizeOrData
- : new Uint8Array(bufferSizeOrData), bufferUsage);
- return bufferObject;
-};
-
-/*
-* @param bufferSizeOrData: a buffer of data the represents a stream in a vertex, or the size in bytes to preallocate
-* @param bufferUsage: BUFFER_STATIC The data store contents will be specified once by the application, and used many times
-* BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
-* BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
-* @return an unsigned byte index buffer object
-*/
-RDGE._renderer.prototype.createBufferFLOAT32 = function (bufferSizeOrData, bufferUsage) {
- var bufferObject = this.ctx.createBuffer();
- bufferObject.type = bufferSizeOrData.type;
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, bufferObject);
- this.ctx.bufferData(this.ctx.ARRAY_BUFFER, (typeof k == "number")
- ? bufferSizeOrData
- : new Float32Array(bufferSizeOrData), bufferUsage);
- return bufferObject;
-};
-
-/*
-* @param bufferSizeOrData: a buffer of data the represents a stream in a vertex, or the size in bytes to preallocate
-* @param bufferUsage: BUFFER_STATIC The data store contents will be specified once by the application, and used many times
-* BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
-* BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
-* @return an unsigned byte index buffer object
-*/
-RDGE._renderer.prototype.createBufferINT32 = function (bufferSizeOrData, bufferUsage) {
- var bufferObject = this.ctx.createBuffer();
- bufferObject.type = bufferSizeOrData.type;
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, bufferObject);
- this.ctx.bufferData(this.ctx.ARRAY_BUFFER, (typeof k == "number")
- ? bufferSizeOrData
- : new Int32Array(bufferSizeOrData), bufferUsage);
- return bufferObject;
-};
-
-/*
-* @param bufferSizeOrData: a buffer of data the represents a stream in a vertex, or the size in bytes to preallocate
-* @param bufferUsage: BUFFER_STATIC The data store contents will be specified once by the application, and used many times
-* BUFFER_DYNAMIC The data store contents will be respecified repeatedly by the application, and used many times
-* BUFFER_STREAM The data store contents will be specified once by the application, and used at most a few times
-* @return an unsigned byte index buffer object
-*/
-RDGE._renderer.prototype.createBufferINT16 = function (bufferSizeOrData, bufferUsage) {
- var bufferObject = this.ctx.createBuffer();
- bufferObject.type = bufferSizeOrData.type;
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, bufferObject);
- this.ctx.bufferData(this.ctx.ARRAY_BUFFER, (typeof k == "number")
- ? bufferSizeOrData
- : new Int16Array(bufferSizeOrData), bufferUsage);
- return bufferObject;
-};
-
-RDGE._renderer.prototype.updateBuffer = function (dstBuffer, srcBuffer, bufferUsage, vertexOffset) {
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, dstBuffer);
- if (bufferUsage === RDGE.rdgeConstants.BUFFER_DYNAMIC) {
- // use bufferSubData
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, vertexOffset || 0, new Float32Array(srcBuffer));
- }
- else {
- // re-create the buffer
- this.ctx.bufferData(this.ctx.ARRAY_BUFFER, new Float32Array(srcBuffer), bufferUsage);
- }
-};
-
-/*
-* @param primitiveDef defines a primitive using java script types, creates the video ram objects and attaches them to the primitive passed in
-*/
-RDGE._renderer.prototype.createPrimitive = function (primitiveDef) {
- if (!primitiveDef.built) {
- // store the buffer handle with the renderer as it is context specific, creating an ID to look up the buffer at render time
- primitiveDef.buffersID = this.getBufferID();
- primitiveDef.built = true;
- }
- else if (this.buffers[primitiveDef.buffersID]) {
- // already created
- return;
- }
-
- // this mapping in the array holds an array of buffers
- this.buffers[primitiveDef.buffersID] = [];
- this.buffers[primitiveDef.buffersID].ctxId = this.id;
-
- // set up buffers
- this.updatePrimitive(primitiveDef);
-};
-
-/*
-* @param primitiveDef defines a primitive using java script types, creates the video ram objects and attaches them to the primitive passed in
-*/
-RDGE._renderer.prototype.updatePrimitive = function (prim) {
- if (!prim.built) {
- this.createPrimitive(prim);
- return;
- }
-
- var bufIdxVisited = [];
-
- for (var e in prim.vertexDefinition) {
- var vert_element = prim.vertexDefinition[e];
-
- if (bufIdxVisited.indexOf(vert_element.bufferIndex) > -1)
- continue;
- bufIdxVisited.push(vert_element.bufferIndex);
-
- vert_element.debugName = e + " buffer";
-
- // flag the positional data
- if (vert_element.type == this.VS_ELEMENT_POS) {
- prim.posCount = prim.bufferStreams[vert_element.bufferIndex].length;
-
- // save a reference to the coordinates for later
- prim.positions = prim.bufferStreams[vert_element.bufferIndex];
- }
-
- // if we have not already created the buffer - do so now
- if (this.buffers[prim.buffersID][vert_element.bufferIndex] == undefined) {
- prim.bufferStreams[vert_element.bufferIndex].type = e + " PrimaryBuffer";
-
- if (prim.forceVertexCount) {
- this.buffers[prim.buffersID][vert_element.bufferIndex] = this.createBufferFLOAT32(4 * prim.forceVertexCount, vert_element.bufferUsage);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, new Float32Array(prim.bufferStreams[vert_element.bufferIndex]), vert_element.bufferUsage);
- }
- else {
- this.buffers[prim.buffersID][vert_element.bufferIndex] = this.createBufferFLOAT32(prim.bufferStreams[vert_element.bufferIndex], vert_element.bufferUsage);
- }
- }
- else {
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.buffers[prim.buffersID][vert_element.bufferIndex]);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, new Float32Array(prim.bufferStreams[vert_element.bufferIndex]), vert_element.bufferUsage);
- }
-
- // double up the buffer
- if (prim.useDoubleBuffer === true) {
- prim.doubleBufferOffset = prim.bufferStreams.length
-
- // debug data
- prim.bufferStreams[vert_element.bufferIndex].type = e + " SecondaryBuffer";
-
- // store double buffer at the doubleBuffer offset
- if (this.buffers[prim.buffersID][prim.doubleBufferOffset + vert_element.bufferIndex] == undefined) {
- if (prim.forceVertexCount) {
- this.buffers[prim.buffersID][prim.doubleBufferOffset + vert_element.bufferIndex] = this.createBufferFLOAT32(4 * prim.prim.forceVertexCount, vert_element.bufferUsage);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, new Float32Array(prim.bufferStreams[vert_element.bufferIndex]), vert_element.bufferUsage);
- }
- else {
- this.buffers[prim.buffersID][prim.doubleBufferOffset + vert_element.bufferIndex] = this.createBufferFLOAT32(prim.bufferStreams[vert_element.bufferIndex], vert_element.bufferUsage);
- }
- }
- else {
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.buffers[prim.buffersID][prim.doubleBufferOffset + vert_element.bufferIndex]);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, new Float32Array(prim.bufferStreams[vert_element.bufferIndex]), vert_element.bufferUsage);
- }
- }
- }
-
- if (prim.indexBuffer.length > 0) {
- var indexBufLength = prim.indexBuffer.length;
- prim.indexBuffer.debugName = "index Buffer";
-
- if (this.buffers[prim.buffersID].indexHandle == undefined) {
- if (prim.forceIndexCount) {
- this.buffers[prim.buffersID].indexHandle = this.createIndexBufferUINT16(2 * prim.forceIndexCount, prim.indexUsage);
- this.ctx.bufferSubData(this.ctx.ELEMENT_ARRAY_BUFFER, 0, new Float32Array(prim.indexBuffer), prim.indexUsage);
- }
- else {
- this.buffers[prim.buffersID].indexHandle = this.createIndexBufferUINT16(prim.indexBuffer, prim.indexUsage);
- }
- }
- else {
- this.ctx.bindBuffer(this.ctx.ELEMENT_ARRAY_BUFFER, this.buffers[prim.buffersID].indexHandle);
- this.ctx.bufferSubData(this.ctx.ELEMENT_ARRAY_BUFFER, 0, new Float32Array(prim.indexBuffer), prim.indexUsage);
- }
-
- prim.indexCount = indexBufLength;
- prim.triCount = indexBufLength / 3;
- }
- else {
- prim.triCount = prim.posCount / 3;
- }
-};
-
-/*
-* @param prim the primitive to delete from the GL context
-*/
-RDGE._renderer.prototype.deletePrimitive = function (prim) {
- var buffers = this.buffers[prim.buffersID];
-
- if (buffers) {
- var self = this;
-
- buffers.forEach(function (thisBuffer) {
- self.ctx.deleteBuffer(thisBuffer);
- });
-
- delete this.buffers[prim.buffersID];
- }
-};
-
-/*
-* @param prim the primitive for which to retrieve the GL VBO handle
-* @param bufferIndex which buffer name to retrieve
-*/
-RDGE._renderer.prototype.getPrimitiveBuffer = function (prim, bufferIndex) {
- return this.buffers[prim.buffersID][bufferIndex];
-};
-
-RDGE._renderer.prototype.drawPrimitive = function (prim, program, attribs) {
- if (prim.indexCount) {
- this.drawIndexedPrimitive(prim, program, attribs)
- }
- else {
- this.drawNonIndexedPrimitive(prim, program, attribs)
- }
-
- if (prim.useDoubleBuffer === true) {
- // after drawing flip the buffer
- prim.flip(this);
- }
-};
-
-/*
-* Draws a single primitive using indices
-* @param: prim a single primitive
-*/
-RDGE._renderer.prototype.drawIndexedPrimitive = function (prim, program, attribs) {
- var bufferIndex = 0;
- var loc = 0;
- var buffersId = prim.buffersID;
- var name = "";
- var attrCount = attribs.length
- var attrIdx = 0;
- var dbOffset = prim.frontBufferIndex * prim.doubleBufferOffset;
-
- var ctx = RDGE.globals.engine.getContext();
-
- for (; attrIdx < attrCount; ++attrIdx) {
- loc = attribs[attrIdx].loc;
- name = attribs[attrIdx].name;
-
- if (!prim.vertexDefinition[name])
- continue;
-
- bufferIndex = prim.vertexDefinition[name].bufferIndex;
-
- this.ctx.enableVertexAttribArray(loc);
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.buffers[buffersId][dbOffset + bufferIndex]);
- this.ctx.vertexAttribPointer(loc, prim.vertexDefinition[name].type, this.FLOAT, false, 0, 0);
- }
-
- this.ctx.bindBuffer(this.ctx.ELEMENT_ARRAY_BUFFER, this.buffers[buffersId].indexHandle);
-
- this.ctx.drawElements(prim.type, prim.indexCount, prim.indexElementSize, 0);
-
- for (attrIdx = 0; attrIdx < attrCount; ++attrIdx) {
- this.ctx.disableVertexAttribArray(attribs[attrIdx].loc);
- }
-};
-
-/*
-* Draws a single primitive using indices in wireframe mode
-* @param: prim a single primitive
-*/
-RDGE._renderer.prototype.drawIndexedPrimitiveWireFrame = function (prim, program, attribs) {
- var bufferIndex = 0;
- var loc = 0;
- var buffersId = prim.buffersID;
- var name = "";
- var attrCount = attribs.length
- var attrIdx = 0;
- var dbOffset = prim.frontBufferIndex * prim.doubleBufferOffset;
-
- for (; attrIdx < attrCount; ++attrIdx) {
- loc = attribs[attrIdx].loc;
- name = attribs[attrIdx].name;
-
- if (!prim.vertexDefinition[name])
- continue;
-
- bufferIndex = prim.vertexDefinition[name].bufferIndex;
-
- this.ctx.enableVertexAttribArray(loc);
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.buffers[buffersId][dbOffset + bufferIndex]);
- this.ctx.vertexAttribPointer(loc, prim.vertexDefinition[name].type, this.FLOAT, false, 0, 0);
- }
-
- this.ctx.bindBuffer(this.ctx.ELEMENT_ARRAY_BUFFER, this.buffers[buffersId].indexHandle);
-
- this.ctx.drawElements(this.LINE_LOOP, prim.indexCount, prim.indexElementSize, 0);
-
- for (attrIdx = 0; attrIdx < attrCount; ++attrIdx) {
- this.ctx.disableVertexAttribArray(attribs[attrIdx].loc);
- }
-};
-
-/*
-* Draws a single primitive (non-indexed primitive)
-* @param: prim a single primitive
-*/
-RDGE._renderer.prototype.drawNonIndexedPrimitive = function (prim, program, attribs) {
- var bufferIndex = 0;
- var loc = 0;
- var buffersId = prim.buffersID;
- var name = "";
- var attrCount = attribs.length
- var attrIdx = 0;
- var dbOffset = prim.frontBufferIndex * prim.doubleBufferOffset;
-
- for (; attrIdx < attrCount; ++attrIdx) {
- loc = attribs[attrIdx].loc;
- name = attribs[attrIdx].name;
-
- bufferIndex = prim.vertexDefinition[name].bufferIndex;
-
- if (!prim.vertexDefinition[name])
- continue;
-
- this.ctx.enableVertexAttribArray(loc);
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.buffers[buffersId][dbOffset + bufferIndex]);
- this.ctx.vertexAttribPointer(loc, prim.vertexDefinition[name].type, this.FLOAT, false, 0, 0);
- }
-
- this.ctx.drawArrays(prim.type, 0, prim.triCount);
-
- for (attrIdx = 0; attrIdx < attrCount; ++attrIdx) {
- this.ctx.disableVertexAttribArray(attribs[attrIdx].loc);
- }
-};
-
-/*
-* Not yet supported but stubbed out here
-*/
-RDGE._renderer.prototype.drawIndexedPrimitiveSet = function (prim) {
- window.alert("drawIndexedPrimitiveSet is not implemented");
- for (var i = 0; i < prim.setCount; ++i) {
- this.ctx.drawElements(prim.type[i], mesh.numIndices[i], prim.indexElementSize[i], prim.indexOffsets[i]);
- }
-};
-
-// currently not used in Ninja
-/*
-RDGE.renderDebug = function (maxLines) {
- this.renderer = RDGE.globals.engine.getContext().renderer;
- this.ctx = RDGE.globals.engine.getContext().renderer.ctx;
- this.hidden = false;
- this.maxLines = maxLines;
- this.lineBuffer = [];
- this.posBufferData = new Float32Array(3 * this.maxLines);
- this.colorBufferData = new Float32Array(4 * this.maxLines);
- this.posBufferObject = renderer.createBufferFLOAT32(this.posBufferData, this.renderer.BUFFER_DYNAMIC);
- this.colorBufferObject = renderer.createBufferFLOAT32(this.colorBufferData, this.renderer.BUFFER_DYNAMIC);
- this.shader = new RDGE.jshader();
- this.shader.def = {
- 'shaders': {
- 'defaultVShader': "\
- uniform mat4 u_mvMatrix;\
- uniform mat4 u_projMatrix;\
- attribute vec3 a_pos;\
- attribute vec4 a_color;\
- varying vec4 v_color;\
- void main() {\
- gl_Position = u_projMatrix * u_mvMatrix * vec4(a_pos,1.0);\
- v_color = a_color;\
- }",
- 'defaultFShader': "\
- precision mediump float;\
- varying vec4 v_color;\
- void main() {\
- gl_FragColor = v_color;\
- gl_FragColor.a = 1.0;\
- }"
- },
- 'techniques': {
- 'defaultTechnique': [{
- 'vshader': 'defaultVShader',
- 'fshader': 'defaultFShader',
- 'attributes': {
- 'a_pos': { 'type': 'vec3' },
- 'a_color': { 'type': 'vec4' }
- },
-
- 'params': {
- 'u_projMat': { 'type': 'mat4' },
- 'u_viewMat': { 'type': 'mat4' }
- }
- }]
- }
- }
- this.shader.init();
-};
-
-RDGE.renderDebug.prototype.hide = function () {
- this.hidden = true;
-};
-
-RDGE.renderDebug.prototype.show = function () {
- this.hidden = false;
-};
-
-RDGE.renderDebug.prototype.line = function (p0, p1, c0, c1) {
- if (this.hidden) {
- return;
- }
-
- if (c0 == undefined) {
- c0 = [1.0, 1.0, 1.0, 1.0];
- }
- if (c1 == undefined) {
- c1 = c0;
- }
- this.lineBuffer.push([p0, p1, c0, c1]);
-};
-
-RDGE.renderDebug.prototype.box = function (min, max, c) {
- this.line([min[0], min[1], min[2]], [max[0], min[1], min[2]], c, c);
- this.line([max[0], min[1], min[2]], [max[0], max[1], min[2]], c, c);
- this.line([max[0], max[1], min[2]], [min[0], max[1], min[2]], c, c);
- this.line([min[0], max[1], min[2]], [min[0], min[1], min[2]], c, c);
- this.line([min[0], min[1], max[2]], [max[0], min[1], max[2]], c, c);
- this.line([max[0], min[1], max[2]], [max[0], max[1], max[2]], c, c);
- this.line([max[0], max[1], max[2]], [min[0], max[1], max[2]], c, c);
- this.line([min[0], max[1], max[2]], [min[0], min[1], max[2]], c, c);
-
- this.line([max[0], min[1], min[2]], [max[0], min[1], max[2]], c, c);
- this.line([max[0], max[1], min[2]], [max[0], max[1], max[2]], c, c);
- this.line([min[0], max[1], min[2]], [min[0], max[1], max[2]], c, c);
- this.line([min[0], min[1], min[2]], [min[0], min[1], max[2]], c, c);
-};
-
-RDGE.renderDebug.prototype.frustum = function (p, c) {
- this.line(p[0], p[1], c, c);
- this.line(p[1], p[2], c, c);
- this.line(p[2], p[3], c, c);
- this.line(p[3], p[4], c, c);
- this.line(p[4], p[5], c, c);
- this.line(p[5], p[6], c, c);
- this.line(p[6], p[7], c, c);
-};
-
-RDGE.renderDebug.prototype.sphere = function (p, r, c) {
- var rho = 0.0;
- var rho_step = Math.PI / 8.0;
-
- var phi = 0.0;
- var phi_step = 2.0 * Math.PI / 8.0;
- while (rho < Math.PI) {
- var srho = Math.sin(rho);
- var crho = Math.cos(rho);
- while (phi < 2.0 * Math.PI) {
- var sphi = Math.sin(phi);
- var cphi = Math.cos(phi);
-
- var x0 = p[0] + cphi * srho * r;
- var y0 = p[1] + crho * r;
- var z0 = p[2] + sphi * srho * r;
- phi += phi_step;
-
- sphi = Math.sin(phi);
- cphi = Math.cos(phi);
- var x1 = p[0] + cphi * srho * r;
- var y1 = p[1] + crho * r;
- var z1 = p[2] + sphi * srho * r;
- phi += phi_step;
-
- this.line([x0, y0, z0],
- [x1, y1, z1], c);
- }
- rho += rho_step;
- }
-};
-
-RDGE.renderDebug.prototype.flush = function () {
- var drawCalls = 0;
- var activeCam = this.renderer.cameraManager().getActiveCamera();
-
- RDGE.mat4.inplace_copy(this.ctx.projectionMatrix, activeCam.proj);
- RDGE.mat4.inplace_copy(this.ctx.mvMatrix, activeCam.view);
- while (this.lineBuffer.length > 0) {
- var count = Math.min(this.lineBuffer.length, this.maxLines);
- var index = 0;
- while (count > 0) {
- var line = this.lineBuffer.shift();
- var i6 = index * 6;
- var i8 = index * 8;
- this.posBufferData[i6 + 0] = line[0][0];
- this.posBufferData[i6 + 1] = line[0][1];
- this.posBufferData[i6 + 2] = line[0][2];
- this.posBufferData[i6 + 3] = line[1][0];
- this.posBufferData[i6 + 4] = line[1][1];
- this.posBufferData[i6 + 5] = line[1][2];
- this.colorBufferData[i8 + 0] = line[2][0];
- this.colorBufferData[i8 + 1] = line[2][1];
- this.colorBufferData[i8 + 2] = line[2][2];
- this.colorBufferData[i8 + 3] = line[2][3];
- this.colorBufferData[i8 + 4] = line[3][0];
- this.colorBufferData[i8 + 5] = line[3][1];
- this.colorBufferData[i8 + 6] = line[3][2];
- this.colorBufferData[i8 + 7] = line[3][3];
- count--;
- index++;
- if (count <= 0) {
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.posBufferObject);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, null);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, this.posBufferData);
-
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.colorBufferObject);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, null);
- this.ctx.bufferSubData(this.ctx.ARRAY_BUFFER, 0, this.colorBufferData);
-
- this.ctx.disable(this.ctx.DEPTH_TEST);
- this.shader.begin();
- this.shader.beginPass(0);
- this.ctx.enableVertexAttribArray(0);
- this.ctx.enableVertexAttribArray(1);
-
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.posBufferObject);
- this.ctx.vertexAttribPointer(0, 3, this.ctx.FLOAT, false, 0, 0);
-
- this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER, this.colorBufferObject);
- this.ctx.vertexAttribPointer(1, 4, this.ctx.FLOAT, false, 0, 0);
-
- this.ctx.drawArrays(this.ctx.LINES, 0, index * 2);
- this.shader.endPass();
- this.shader.end();
- this.ctx.enable(this.ctx.DEPTH_TEST);
- drawCalls++;
- this.ctx.finish();
- this.ctx.flush();
- break;
- }
- }
- }
-};
-*/
+/*
+Copyright (c) 2012, Motorola Mobility, Inc
+All Rights Reserved.
+BSD License.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ - Neither the name of Motorola Mobility nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var