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 --- js/helper-classes/RDGE/src/core/script/engine.js | 482 +++++++++++++++++++++++ 1 file changed, 482 insertions(+) create mode 100644 js/helper-classes/RDGE/src/core/script/engine.js (limited to 'js/helper-classes/RDGE/src/core/script/engine.js') diff --git a/js/helper-classes/RDGE/src/core/script/engine.js b/js/helper-classes/RDGE/src/core/script/engine.js new file mode 100644 index 00000000..6fe964c7 --- /dev/null +++ b/js/helper-classes/RDGE/src/core/script/engine.js @@ -0,0 +1,482 @@ +/* +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. +
*/ + + +/* + * Manage state instances + */ +stateManager = function() +{ + // a stack of states + this.stateStack = []; + + // number of states on the stack + this.stateTop = undefined; + + // the states of the context + this.RDGEInitState = null; + this.RDGERunState = null; + + this.currentState = function() + { + if(this.stateTop != undefined) + return this.stateStack[this.stateTop]; + + return null; + } + + /* + * Push new IRuntime state - engine executes the new state + */ + this.PushState = function(state, flags) + { + if(state!=null && typeof state.Init == 'function') + { + if(this.stateTop != undefined) + this.stateStack[this.stateTop].LeaveState(); + + if(flags == undefined || flags != "noInit") + state.Init(); + + this.stateTop = this.stateStack.push(state) - 1; + } + } + + /* + * Remove IRuntime state from stack, engine executes previous state + */ + this.PopState = function() + { + state = this.stateStack.pop(); + if(state!=null) + { + state.Shutdown(); + } + + this.stateTop = this.stateTop > 0 ? this.stateTop - 1 : 0; + + if(this.stateStack[this.stateTop]) + { + this.stateStack[this.stateTop].ReInit(); + } + } + + /* + * Remove all states from the stack + */ + this.PopAll = function() + { + while(this.stateStack[this.stateTop] != null) + { + this.PopState(); + } + } + + this.tick = function(dt) + { + if(this.stateStack[this.stateTop]!=null) + { + this.stateStack[this.stateTop].Update(dt); + this.stateStack[this.stateTop].Resize(); + this.stateStack[this.stateTop].Draw(); + } + } +} + +g_enableBenchmarks = true; +function Engine() +{ + // map of scene graphs to names + this.sceneMap = []; + + // number of states on the stack + this.stateTop = undefined; + + // size of the browser window + this.lastWindowWidth = window.innerWidth; + this.lastWindowHeight = window.innerHeight; + + this.defaultContext = null; + + this.lightManager = null; + + clearColor = [0.0, 0.0, 0.0, 0.0]; + + panelObjectManager = new objectManager(); + + this.initializeComplete = false; + + this.RDGECanvas = null; + + /* + * a map of canvas names to renderer + */ + this.canvasToRendererMap = {}; + + /* + * states to canvas map - maps a state stack to the canvas context it belongs to + */ + this.canvasNameToStateStack = {}; + + /* + * the list of context's that are active + */ + this.canvasCtxList = []; + + /* + * regex object to verify runtime object is not some sort of exploit + */ + invalidObj = new RegExp("([()]|function)"); + + isValidObj = function( name ) + { + // do a quick test make sure user isn't trying to execute a function + if(invalidObj.test(name)) + { + window.console.error("invalid object name passed to RDGE, " + name + " - looks like a function"); + return false; + } + + return true; + } + + /* + * The context definition - every context shares these parameters + */ + contextDef = function() + { + this.id = null; + this.renderer = null; + this.ctxStateManager = null; + this.startUpState = null; + this.sceneGraphMap = []; + this.currentScene = null; + this.getScene = function() + { + return this.sceneGraphMap[this.currentScene]; + } + this.debug = + { + 'frameCounter' : 0, + 'mat4CallCount': 0 + } + } + + // maintains the contexts + contextManager = new objectManager(); + this.ctxMan = contextManager; + + // the context currently being updated + contextManager.currentCtx = null; + + contextManager._addObject = contextManager.addObject; + contextManager.contextMap = {}; + + contextManager.addObject = function( context ) + { + this.contextMap[context.id] = context; + return this._addObject(context); + } + + contextManager.start = function() + { + var len = this.objects.length; + for(var i = 0; i < len; ++i) + { + // set the current context + contextManager.currentCtx = this.objects[i]; + this.objects[i].ctxStateManager.PushState(this.objects[i].startUpState); + } + } + + contextManager.forEach = function(cb) + { + var len = this.objects.length; + for(var i = 0; i < len; ++i) + { + cb(this.objects[i]); + } + } + + this.getContext = function( optCanvasID ) + { + if(!optCanvasID) + { + return contextManager.currentCtx; + } + else + { + return contextManager.contextMap[optCanvasID]; + } + } + + /* + * give the contextID (canvas id) of the context to set + */ + this.setContext = function( contextID ) + { + contextManager.currentCtx = contextManager.contextMap[contextID]; + } + + this.tickContext = function(contextID) { + var savedCtx = contextManager.currentCtx; + contextManager.currentCtx = contextManager.contextMap[contextID]; + this.objects[i].ctxStateManager.tick(dt); + contextManager.currentCtx = savedCtx; + + } + +} + +/* + * Initialize the RDGE web engine + */ +Engine.prototype.init = function(userInitState, userRunState, canvasObject) +{ + this.GlInit(canvasObject); + + globalParamFuncSet = function(param) + { + this.data = param.data; + this.type =param.type; + + this.set = function(v) + { + var len = this.data ? this.data.length : 0; + for(var i=0;i