106 lines
3.4 KiB
JavaScript
106 lines
3.4 KiB
JavaScript
|
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
|
||
|
});
|
||
|
};
|