GameLib.D3.Game = function ( ) { this.scenes = {}; this.physicsWorlds = []; this.sceneToPhysicsWorldsMap = {}; }; GameLib.D3.Game.prototype.AddScene = function( scene ) { this.scenes[scene.name] = scene; }; GameLib.D3.Game.prototype.AddPhysicsWorld = function( physicsWorld ) { this.physicsWorlds.push(physicsWorld); }; GameLib.D3.Game.prototype.LinkPhysicsWorldToScene = function( physicsWorld, scene ) { this.sceneToPhysicsWorldsMap[scene.name] = this.sceneToPhysicsWorldsMap[scene.name] || []; this.sceneToPhysicsWorldsMap[scene.name].push(physicsWorld); }; GameLib.D3.Game.prototype.GetPhysicsWorldsForScene = function ( scene ) { return this.sceneToPhysicsWorldsMap[scene.name]; }; GameLib.D3.Game.prototype.ProcessPhysics = function ( timestep ) { for(var s in this.sceneToPhysicsWorldsMap) { var physicsWorldArray = this.sceneToPhysicsWorldsMap[s]; var scene = this.scenes[s]; if(scene && physicsWorldArray) { for(var i = 0, l = physicsWorldArray.length; i < l; i++) { var physicsWorld = physicsWorldArray[i]; physicsWorld.Step(timestep); for(var p in physicsWorld.linkedPairs) { var pair = physicsWorld.linkedPairs[p]; var mesh = pair.threeMesh; var body = pair.physicsBody; if(mesh) { if(physicsWorld.engineType === GameLib.D3.Physics.TYPE_CANNON) { var quaternion = new THREE.Quaternion(); quaternion.copy(body.rigidBodyInstance.quaternion); var quaternionCopy = quaternion.clone(); var position = new THREE.Vector3(); position.copy(body.rigidBodyInstance.position); if(mesh.permutate) { if(mesh.permutate.offset) { if(mesh.permutate.offset.quaternion) { var offsetQuaternion = new THREE.Quaternion(); offsetQuaternion.copy(mesh.permutate.offset.quaternion); quaternion = quaternion.multiply(offsetQuaternion).normalize(); } if(mesh.permutate.offset.position) { var offsetPosition = new THREE.Vector3(); offsetPosition.copy(mesh.permutate.offset.position); //position = position.add(offsetPosition); position = position.add(offsetPosition.applyQuaternion(quaternionCopy)); } } } mesh.position.copy(position); mesh.quaternion.copy(quaternion); } } } } } } }; GameLib.D3.Game.prototype.LinkPair = function ( threeMesh, physicsBody, physicsWorld ) { physicsWorld.linkedPairs = physicsWorld.linkedPairs || []; physicsWorld.linkedPairs.push({ threeMesh : threeMesh, physicsBody : physicsBody }); };