/* 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.
*/ // RDGE namespaces var RDGE = RDGE || {}; RDGE.Model = function (name, mesh) { this.name = name; this.mesh = mesh; this.camera = null; }; /* * Maintains a list of meshes to allow instancing of data */ RDGE.MeshManager = function () { this.contentUrl = "assets_web/mesh/"; this.modelMap = {}; this.readyList = []; // meshes that have data ready this.meshesLoading = true; // indicates that no meshes have loaded or that they are still loading this.postMeshLoadCallbackList = []; this.tempSphere = null; this.requestCounter = 0; }; /* * Pass the scene meshNode stump, loads temp object while real mesh is downloading */ RDGE.MeshManager.prototype.loadMesh = function (meshStump, tempMesh) { // if it exists already, return the mesh requested if ( this.modelMap[meshStump.name] !== undefined ) return this.modelMap[meshStump.name]; meshStump.ready = false; meshStump.addr = this.contentUrl + meshStump.name + "_mesh.json"; meshStump.ctxID = RDGE.globals.engine.getContext().renderer.id; // sets a temp mesh up in place of the final mesh to load if (!tempMesh) { if (this.tempSphere == null) { this.tempSphere = RDGE.renderUtils.makeSphere(RDGE.globals.engine.getContext().renderer.ctx, 25, 5, 5); } tempMesh = this.tempSphere; } // add the temp mesh to the map of loaded meshes this.modelMap[meshStump.name] = tempMesh; // update the request counter - we now have one more mesh to load this.requestCounter++; RDGE.requestMesh(meshStump); return null; }; /* * Deletes the passed mesh from the manager as well as all renderers */ RDGE.MeshManager.prototype.deleteMesh = function (name) { var model = this.modelMap[name]; if (model) { RDGE.globals.engine.ctxMan.forEach(function (context) { context.renderer.deletePrimitive(model.primitive); }); delete this.modelMap[name]; } }; RDGE.MeshManager.prototype.getModelByName = function (name) { return this.modelMap[name]; }; RDGE.MeshManager.prototype.getModelNames = function () { var names = []; for (var index in this.modelMap) { names.push(this.modelList[index].name); } return names; }; RDGE.MeshManager.prototype.processMeshData = function () { var renderer = RDGE.globals.engine.getContext().renderer; // loop through meshes and load ready data for (var index in this.readyList) { // if item is ready load it if (this.readyList[index] && this.readyList[index].ready && renderer.id === this.readyList[index].ctxID) { // pop the item var model = this.readyList[index]; this.readyList.splice(index, 1); var primset = new RDGE.rdgePrimitiveDefinition(); primset.vertexDefinition = { // this shows two ways to map this data to an attribute "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_norm": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT3, 'bufferIndex': 1, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, "a_normal": { '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_texcoord": { 'type': RDGE.rdgeConstants.VS_ELEMENT_FLOAT2, 'bufferIndex': 2, 'bufferUsage': RDGE.rdgeConstants.BUFFER_STATIC }, "a_texcoords": { '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 } }; primset.bufferStreams = [ model.root.data.coords, model.root.data.normals, model.root.data.uvs ]; primset.streamUsage = [ RDGE.rdgeConstants.BUFFER_STATIC, RDGE.rdgeConstants.BUFFER_STATIC, RDGE.rdgeConstants.BUFFER_STATIC ]; primset.indexUsage = RDGE.rdgeConstants.BUFFER_STREAM; primset.indexBuffer = model.root.data.indices; renderer.createPrimitive( primset ); model.root.primitive = primset; // generate a bounding box for this mesh model.root.bbox = new RDGE.box(); var numCoords = model.root.data.coords.length; var idx = 0; while (idx < numCoords - 2) { var thisCoord = [model.root.data.coords[idx+0], model.root.data.coords[idx+1], model.root.data.coords[idx+2]]; model.root.bbox.addVec3(thisCoord); idx += 3; } this.modelMap[model.root.attribs.name] = model.root; // now that the model is load reduce the request count this.requestCounter--; this.onLoaded(model.root.attribs.name); //break; } } }; RDGE.MeshManager.prototype.isReady = function () { return this.readyList.length == 0; }; RDGE.MeshManager.prototype.addOnLoadedCallback = function (callback) { this.postMeshLoadCallbackList.push(callback) }; RDGE.MeshManager.prototype.onLoaded = function (meshName) { for (var index = 0 in this.postMeshLoadCallbackList) { // call the functions this.postMeshLoadCallbackList[index].onMeshLoaded(meshName); } }; RDGE.MeshManager.prototype.exportJSON = function () { for (var m in this.modelMap) { this.modelMap[m].primitive.built = false; } return JSON.stringify(this.modelMap); }; RDGE.MeshManager.prototype.importJSON = function (jsonMeshExport) { try { var tempModelMap = JSON.parse(jsonMeshExport); for (var m in tempModelMap) { if (!this.modelMap[m]) { this.modelMap[m] = tempModelMap[m]; } } window.console.log("meshes imported"); } catch (e) { window.console.error("error importing meshes: " + e.description ); } }; /* * global function for the mesh manager to make mesh file requests */ RDGE.requestMesh = function (mesh) { var request = new XMLHttpRequest(); request.mesh = mesh; request.onreadystatechange = function () { if (request.readyState == 4) { if (request.status == 200 || window.location.href.indexOf("http") == -1) { var mesh = eval("(" + request.responseText + ")"); //retrieve result as an JavaScript object mesh.ready = true; mesh.ctxID = request.mesh.ctxID; RDGE.globals.meshMan.readyList.push(mesh); } else { alert("An error has occured making the request"); } } } request.open("GET", mesh.addr, true); request.send(null); };