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 --- .../RDGE/src/core/script/renderUtils.js | 792 ++++++++++----------- 1 file changed, 396 insertions(+), 396 deletions(-) (limited to 'js/helper-classes/RDGE/src/core/script/renderUtils.js') diff --git a/js/helper-classes/RDGE/src/core/script/renderUtils.js b/js/helper-classes/RDGE/src/core/script/renderUtils.js index a25b3dec..4e98cb1a 100755 --- a/js/helper-classes/RDGE/src/core/script/renderUtils.js +++ b/js/helper-classes/RDGE/src/core/script/renderUtils.js @@ -1,396 +1,396 @@ -/* -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 || {}; -RDGE.renderUtils = RDGE.renderUtils || {}; - -/* -* Creates an indexed box primitive -* @return a rdge primitive -*/ -RDGE.renderUtils.createBox = function () { - var renderer = RDGE.globals.engine.getContext().renderer; - - var coords = - [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, // front - 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, // right - 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, // top - -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, // left - -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, // bottom - 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1]; // back - - var normals = - [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // front - 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // right - 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // top - -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // left - 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, // bottom - 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]; // back - - var uvs = - [1, 1, 0, 1, 0, 0, 1, 0, // front - 0, 1, 0, 0, 1, 0, 1, 1, // right - 1, 0, 1, 1, 0, 1, 0, 0, // top - 1, 1, 0, 1, 0, 0, 1, 0, // left - 0, 0, 1, 0, 1, 1, 0, 1, // bottom - 0, 0, 1, 0, 1, 1, 0, 1]; // back - - var indices = - [0, 1, 2, 0, 2, 3, // front - 4, 5, 6, 4, 6, 7, // right - 8, 9, 10, 8, 10, 11, // top - 12, 13, 14, 12, 14, 15, // left - 16, 17, 18, 16, 18, 19, // bottom - 20, 21, 22, 20, 22, 23]; // back - - - var prim = new RDGE.rdgePrimitiveDefinition(); - - prim.vertexDefinition = - { - "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - - "normal": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_nrm": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - - "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } - }; - - prim.bufferStreams = - [ - coords, - normals, - uvs - ]; - - prim.streamUsage = - [ - RDGE.rdgeConstants.BUFFER_STATIC, - RDGE.rdgeConstants.BUFFER_STATIC, - RDGE.rdgeConstants.BUFFER_STATIC - ]; - - prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; - prim.indexBuffer = indices; - - prim.type = RDGE.rdgeConstants.TRIANGLES; - - renderer.createPrimitive(prim); - - return prim; -}; - -// -// makeSphere -// -// Create a sphere with the passed number of latitude and longitude bands and the passed radius. -// Sphere has vertices, normals and texCoords. Create VBOs for each as well as the index array. -// Return an object with the following properties: -// -// normalObject WebGLBuffer object for normals -// texCoordObject WebGLBuffer object for texCoords -// vertexObject WebGLBuffer object for vertices -// indexObject WebGLBuffer object for indices -// numIndices The number of indices in the indexObject -// -RDGE.renderUtils.makeSphere = function (ctx, radius, lats, longs) { - var geometryData = []; - var normalData = []; - var texCoordData = []; - var indexData = []; - - for (var latNumber = 0; latNumber <= lats; ++latNumber) { - for (var longNumber = 0; longNumber <= longs; ++longNumber) { - var theta = latNumber * Math.PI / lats; - var phi = longNumber * 2 * Math.PI / longs; - var sinTheta = Math.sin(theta); - var sinPhi = Math.sin(phi); - var cosTheta = Math.cos(theta); - var cosPhi = Math.cos(phi); - - var x = cosPhi * sinTheta; - var y = cosTheta; - var z = sinPhi * sinTheta; - var u = 1 - (longNumber / longs); - var v = latNumber / lats; - - normalData.push(x); - normalData.push(y); - normalData.push(z); - texCoordData.push(u); - texCoordData.push(v); - geometryData.push(radius * x); - geometryData.push(radius * y); - geometryData.push(radius * z); - } - } - - for (var latNumber = 0; latNumber < lats; ++latNumber) { - for (var longNumber = 0; longNumber < longs; ++longNumber) { - var first = (latNumber * (longs + 1)) + longNumber; - var second = first + longs + 1; - indexData.push(first); - indexData.push(second); - indexData.push(first + 1); - - indexData.push(second); - indexData.push(second + 1); - indexData.push(first + 1); - } - } - - var retval = {}; - - retval.normalObject = ctx.createBuffer(); - ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); - ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); - - retval.texCoordObject = ctx.createBuffer(); - ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); - ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); - - retval.vertexObject = ctx.createBuffer(); - ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); - ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); - - retval.numIndices = indexData.length; - retval.indexObject = ctx.createBuffer(); - ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); - ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); - - return retval; -}; - -/* -* Creates a plane as a grid of triangles/quads, orients the plane according the the plane normal -* note: the center of the plane is always assumed to be the origin. -*/ -RDGE.renderUtils.createPlane = function (numCols, numRows, width, height, uTileCount, vTileCount, planeNormal) { - var renderer = RDGE.globals.engine.getContext().renderer; - - var pn = [0, 1, 0]; - if (!planeNormal) - pn = planeNormal; - - var coords = new Array(numCols * numRows * 3); - var normals = new Array(numCols * numRows * 3); - var uvs = new Array(numCols * numRows * 2); - var indices = new Array(numCols * numRows); - - // setup the vertices's in a grid and on the plane - var coordIdx = 0; - var uvIdx = 0; - - for (var row = 0; row < numRows; ++row) { - for (var col = 0; col < numCols; ++col) { - coords[coordIdx] = col * width - (numCols - 1) * width * 0.5; - coords[coordIdx + 1] = 0; - coords[coordIdx + 2] = row * height - (numRows - 1) * height * 0.5; - - normals[coordIdx] = planeNormal[0]; - normals[coordIdx + 1] = planeNormal[1]; - normals[coordIdx + 2] = planeNormal[2]; - - uvs[uvIdx] = col / numCols * uTileCount; - uvs[uvIdx + 1] = row / numRows * vTileCount; - - coordIdx += 3; - uvIdx += 2; - } - } - - // take the grid of vertices's and create triangles - var k = 0; - for (var row = 0; row < numRows; ++row) { - for (var col = 0; col < numCols; ++col) { - // layout both triangles of the quad - indices[k + 2] = row * numCols + col; - indices[k + 1] = row * numCols + (col + 1); - indices[k] = (row + 1) * numCols + col; - - indices[k + 5] = (row + 1) * numCols + col; - indices[k + 4] = row * numCols + (col + 1); - indices[k + 3] = (row + 1) * numCols + (col + 1); - - k += 6; - } - } - - // reorient to plane normal - - var prim = new RDGE.rdgePrimitiveDefinition(); - - prim.vertexDefinition = - { - "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - - "normal": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_nrm": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - - "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } - }; - - prim.bufferStreams = - [ - coords, - normals, - uvs - ]; - - prim.streamUsage = - [ - RDGE.rdgeConstants.BUFFER_STATIC, - RDGE.rdgeConstants.BUFFER_STATIC, - RDGE.rdgeConstants.BUFFER_STATIC - ]; - - prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; - prim.indexBuffer = indices; - - prim.type = RDGE.rdgeConstants.TRIANGLES; - - renderer.createPrimitive(prim); - - return prim; -}; - -// creates a cubic volume of points -RDGE.renderUtils.createCubeVolume = function (numCols_x, numLayers_y, numRows_z, x_interval, y_interval, z_interval, optPointsOut) { - var renderer = RDGE.globals.engine.getContext().renderer; - - var coords = new Array(numCols_x * numRows_z * numLayers_y * 3); - var indices = new Array(numCols_x * numRows_z * numLayers_y); - - var layerSize = numCols_x * numRows_z * 3; - - var coordIdx = 0; - var idx = 0; - - for (var layer = 0; layer < numLayers_y; ++layer) { - for (var row = 0; row < numRows_z; ++row) { - for (var col = 0; col < numCols_x; ++col) { - coords[coordIdx] = col * x_interval - (numCols_x - 1) * x_interval * 0.5; - coords[coordIdx + 1] = layer * y_interval - (numLayers_y - 1) * y_interval * 0.5; - coords[coordIdx + 2] = row * z_interval - (numRows_z - 1) * z_interval * 0.5; - - coordIdx += 3; - - indices.push(idx++); - } - } - } - - if (optPointsOut) { - optPointsOut = coords.slice(); - } - - var prim = new RDGE.rdgePrimitiveDefinition(); - - prim.vertexDefinition = - { - "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } - }; - - prim.bufferStreams = - [ - coords - ]; - - prim.streamUsage = - [ - RDGE.rdgeConstants.BUFFER_DYNAMIC - ]; - - prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; - prim.indexBuffer = indices; - - prim.type = RDGE.rdgeConstants.POINTS; - - prim.useDoubleBuffer = true; - - renderer.createPrimitive(prim); - - return prim; -}; - -RDGE.renderUtils.createScreenAlignedQuad = function () { - var renderer = RDGE.globals.engine.getContext().renderer; - - // Screen aligned quad - var coords = [ - -1.0, 1.0, 0.0, - 1.0, 1.0, 0.0, - -1.0, -1.0, 0.0, - - -1.0, -1.0, 0.0, - 1.0, 1.0, 0.0, - 1.0, -1.0, 0.0 - ]; - - var uvs = [0.0, 0.0, - 0.0, 1.0, - 1.0, 1.0, - 1.0, 1.0, - 1.0, 0.0, - 0.0, 0.0]; - - var prim = new RDGE.rdgePrimitiveDefinition(); - - prim.vertexDefinition = - { - "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - - "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, - "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } - }; - - prim.bufferStreams = - [ - coords, - uvs - ]; - - prim.streamUsage = - [ - RDGE.rdgeConstants.BUFFER_STATIC, - RDGE.rdgeConstants.BUFFER_STATIC - ]; - - prim.type = RDGE.rdgeConstants.TRIANGLES; - - renderer.createPrimitive(prim); - - return prim; -}; +/* +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 || {}; +RDGE.renderUtils = RDGE.renderUtils || {}; + +/* +* Creates an indexed box primitive +* @return a rdge primitive +*/ +RDGE.renderUtils.createBox = function () { + var renderer = RDGE.globals.engine.getContext().renderer; + + var coords = + [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, // front + 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, // right + 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, // top + -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, // left + -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, // bottom + 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1]; // back + + var normals = + [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // front + 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // right + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // top + -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // left + 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, // bottom + 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]; // back + + var uvs = + [1, 1, 0, 1, 0, 0, 1, 0, // front + 0, 1, 0, 0, 1, 0, 1, 1, // right + 1, 0, 1, 1, 0, 1, 0, 0, // top + 1, 1, 0, 1, 0, 0, 1, 0, // left + 0, 0, 1, 0, 1, 1, 0, 1, // bottom + 0, 0, 1, 0, 1, 1, 0, 1]; // back + + var indices = + [0, 1, 2, 0, 2, 3, // front + 4, 5, 6, 4, 6, 7, // right + 8, 9, 10, 8, 10, 11, // top + 12, 13, 14, 12, 14, 15, // left + 16, 17, 18, 16, 18, 19, // bottom + 20, 21, 22, 20, 22, 23]; // back + + + var prim = new RDGE.rdgePrimitiveDefinition(); + + prim.vertexDefinition = + { + "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + + "normal": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_nrm": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + + "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } + }; + + prim.bufferStreams = + [ + coords, + normals, + uvs + ]; + + prim.streamUsage = + [ + RDGE.rdgeConstants.BUFFER_STATIC, + RDGE.rdgeConstants.BUFFER_STATIC, + RDGE.rdgeConstants.BUFFER_STATIC + ]; + + prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; + prim.indexBuffer = indices; + + prim.type = RDGE.rdgeConstants.TRIANGLES; + + renderer.createPrimitive(prim); + + return prim; +}; + +// +// makeSphere +// +// Create a sphere with the passed number of latitude and longitude bands and the passed radius. +// Sphere has vertices, normals and texCoords. Create VBOs for each as well as the index array. +// Return an object with the following properties: +// +// normalObject WebGLBuffer object for normals +// texCoordObject WebGLBuffer object for texCoords +// vertexObject WebGLBuffer object for vertices +// indexObject WebGLBuffer object for indices +// numIndices The number of indices in the indexObject +// +RDGE.renderUtils.makeSphere = function (ctx, radius, lats, longs) { + var geometryData = []; + var normalData = []; + var texCoordData = []; + var indexData = []; + + for (var latNumber = 0; latNumber <= lats; ++latNumber) { + for (var longNumber = 0; longNumber <= longs; ++longNumber) { + var theta = latNumber * Math.PI / lats; + var phi = longNumber * 2 * Math.PI / longs; + var sinTheta = Math.sin(theta); + var sinPhi = Math.sin(phi); + var cosTheta = Math.cos(theta); + var cosPhi = Math.cos(phi); + + var x = cosPhi * sinTheta; + var y = cosTheta; + var z = sinPhi * sinTheta; + var u = 1 - (longNumber / longs); + var v = latNumber / lats; + + normalData.push(x); + normalData.push(y); + normalData.push(z); + texCoordData.push(u); + texCoordData.push(v); + geometryData.push(radius * x); + geometryData.push(radius * y); + geometryData.push(radius * z); + } + } + + for (var latNumber = 0; latNumber < lats; ++latNumber) { + for (var longNumber = 0; longNumber < longs; ++longNumber) { + var first = (latNumber * (longs + 1)) + longNumber; + var second = first + longs + 1; + indexData.push(first); + indexData.push(second); + indexData.push(first + 1); + + indexData.push(second); + indexData.push(second + 1); + indexData.push(first + 1); + } + } + + var retval = {}; + + retval.normalObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.normalObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(normalData), ctx.STATIC_DRAW); + + retval.texCoordObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.texCoordObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(texCoordData), ctx.STATIC_DRAW); + + retval.vertexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ARRAY_BUFFER, retval.vertexObject); + ctx.bufferData(ctx.ARRAY_BUFFER, new Float32Array(geometryData), ctx.STATIC_DRAW); + + retval.numIndices = indexData.length; + retval.indexObject = ctx.createBuffer(); + ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, retval.indexObject); + ctx.bufferData(ctx.ELEMENT_ARRAY_BUFFER, new Uint16Array(indexData), ctx.STREAM_DRAW); + + return retval; +}; + +/* +* Creates a plane as a grid of triangles/quads, orients the plane according the the plane normal +* note: the center of the plane is always assumed to be the origin. +*/ +RDGE.renderUtils.createPlane = function (numCols, numRows, width, height, uTileCount, vTileCount, planeNormal) { + var renderer = RDGE.globals.engine.getContext().renderer; + + var pn = [0, 1, 0]; + if (!planeNormal) + pn = planeNormal; + + var coords = new Array(numCols * numRows * 3); + var normals = new Array(numCols * numRows * 3); + var uvs = new Array(numCols * numRows * 2); + var indices = new Array(numCols * numRows); + + // setup the vertices's in a grid and on the plane + var coordIdx = 0; + var uvIdx = 0; + + for (var row = 0; row < numRows; ++row) { + for (var col = 0; col < numCols; ++col) { + coords[coordIdx] = col * width - (numCols - 1) * width * 0.5; + coords[coordIdx + 1] = 0; + coords[coordIdx + 2] = row * height - (numRows - 1) * height * 0.5; + + normals[coordIdx] = planeNormal[0]; + normals[coordIdx + 1] = planeNormal[1]; + normals[coordIdx + 2] = planeNormal[2]; + + uvs[uvIdx] = col / numCols * uTileCount; + uvs[uvIdx + 1] = row / numRows * vTileCount; + + coordIdx += 3; + uvIdx += 2; + } + } + + // take the grid of vertices's and create triangles + var k = 0; + for (var row = 0; row < numRows; ++row) { + for (var col = 0; col < numCols; ++col) { + // layout both triangles of the quad + indices[k + 2] = row * numCols + col; + indices[k + 1] = row * numCols + (col + 1); + indices[k] = (row + 1) * numCols + col; + + indices[k + 5] = (row + 1) * numCols + col; + indices[k + 4] = row * numCols + (col + 1); + indices[k + 3] = (row + 1) * numCols + (col + 1); + + k += 6; + } + } + + // reorient to plane normal + + var prim = new RDGE.rdgePrimitiveDefinition(); + + prim.vertexDefinition = + { + "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + + "normal": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_nrm": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + + "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } + }; + + prim.bufferStreams = + [ + coords, + normals, + uvs + ]; + + prim.streamUsage = + [ + RDGE.rdgeConstants.BUFFER_STATIC, + RDGE.rdgeConstants.BUFFER_STATIC, + RDGE.rdgeConstants.BUFFER_STATIC + ]; + + prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; + prim.indexBuffer = indices; + + prim.type = RDGE.rdgeConstants.TRIANGLES; + + renderer.createPrimitive(prim); + + return prim; +}; + +// creates a cubic volume of points +RDGE.renderUtils.createCubeVolume = function (numCols_x, numLayers_y, numRows_z, x_interval, y_interval, z_interval, optPointsOut) { + var renderer = RDGE.globals.engine.getContext().renderer; + + var coords = new Array(numCols_x * numRows_z * numLayers_y * 3); + var indices = new Array(numCols_x * numRows_z * numLayers_y); + + var layerSize = numCols_x * numRows_z * 3; + + var coordIdx = 0; + var idx = 0; + + for (var layer = 0; layer < numLayers_y; ++layer) { + for (var row = 0; row < numRows_z; ++row) { + for (var col = 0; col < numCols_x; ++col) { + coords[coordIdx] = col * x_interval - (numCols_x - 1) * x_interval * 0.5; + coords[coordIdx + 1] = layer * y_interval - (numLayers_y - 1) * y_interval * 0.5; + coords[coordIdx + 2] = row * z_interval - (numRows_z - 1) * z_interval * 0.5; + + coordIdx += 3; + + indices.push(idx++); + } + } + } + + if (optPointsOut) { + optPointsOut = coords.slice(); + } + + var prim = new RDGE.rdgePrimitiveDefinition(); + + prim.vertexDefinition = + { + "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } + }; + + prim.bufferStreams = + [ + coords + ]; + + prim.streamUsage = + [ + RDGE.rdgeConstants.BUFFER_DYNAMIC + ]; + + prim.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; + prim.indexBuffer = indices; + + prim.type = RDGE.rdgeConstants.POINTS; + + prim.useDoubleBuffer = true; + + renderer.createPrimitive(prim); + + return prim; +}; + +RDGE.renderUtils.createScreenAlignedQuad = function () { + var renderer = RDGE.globals.engine.getContext().renderer; + + // Screen aligned quad + var coords = [ + -1.0, 1.0, 0.0, + 1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + + -1.0, -1.0, 0.0, + 1.0, 1.0, 0.0, + 1.0, -1.0, 0.0 + ]; + + var uvs = [0.0, 0.0, + 0.0, 1.0, + 1.0, 1.0, + 1.0, 1.0, + 1.0, 0.0, + 0.0, 0.0]; + + var prim = new RDGE.rdgePrimitiveDefinition(); + + prim.vertexDefinition = + { + "vert": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_pos": { 'type': RDGE.rdgeConstants.VS_ELEMENT_POS, 'bufferIndex': 0, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + + "texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, + "a_uv": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC } + }; + + prim.bufferStreams = + [ + coords, + uvs + ]; + + prim.streamUsage = + [ + RDGE.rdgeConstants.BUFFER_STATIC, + RDGE.rdgeConstants.BUFFER_STATIC + ]; + + prim.type = RDGE.rdgeConstants.TRIANGLES; + + renderer.createPrimitive(prim); + + return prim; +}; -- cgit v1.2.3