cylinders, boxes, spheres
parent
c5e5c18d34
commit
b6ac86ce7e
|
@ -31,7 +31,7 @@ GameLib.Event.LOGGED_IN = 0xd;
|
|||
GameLib.Event.COMPONENT_CREATED = 0xe;
|
||||
GameLib.Event.SCENE_INSTANCE_CREATED = 0xf;
|
||||
GameLib.Event.SCENE_OBJECT_INSTANCE_CREATED = 0x10;
|
||||
GameLib.Event.WORLD_INSTANCE_CREATED = 0x11;
|
||||
GameLib.Event.PHYSICS_WORLD_INSTANCE_CREATED = 0x11;
|
||||
GameLib.Event.RIGID_BODY_INSTANCE_CREATED = 0x12;
|
||||
GameLib.Event.TEXTURE_INSTANCE_CREATED = 0x13;
|
||||
GameLib.Event.TEXTURE_INSTANCE_UPDATED = 0x14;
|
||||
|
@ -69,6 +69,13 @@ GameLib.Event.COMPONENT_DELETED = 0x33;
|
|||
GameLib.Event.COMPONENT_TYPES_UPDATED = 0x34;
|
||||
GameLib.Event.SHAPE_INSTANCE_CREATED = 0x35;
|
||||
GameLib.Event.COMPONENT_LINKED = 0x36;
|
||||
GameLib.Event.SOLVER_INSTANCE_CREATED = 0x37;
|
||||
GameLib.Event.BEFORE_RENDER = 0x38;
|
||||
GameLib.Event.AFTER_RENDER = 0x39;
|
||||
GameLib.Event.ARRAY_ITEM_ADDED = 0x3a;
|
||||
GameLib.Event.INSTANCE_CREATED = 0x3b;
|
||||
GameLib.Event.VISUALIZE = 0x3c;
|
||||
GameLib.Event.STOP_VISUALIZE = 0x3d;
|
||||
|
||||
/**
|
||||
* Returns string name of event ID
|
||||
|
@ -133,6 +140,11 @@ GameLib.Event.GetEventName = function(number) {
|
|||
case 0x34 : return 'component_types_updated';
|
||||
case 0x35 : return 'shape_instance_created';
|
||||
case 0x36 : return 'component_linked';
|
||||
case 0x37 : return 'solver_instance_created';
|
||||
case 0x38 : return 'before_render';
|
||||
case 0x39 : return 'after_render';
|
||||
case 0x3a : return 'array_item_added';
|
||||
case 0x3b : return 'instance_created';
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -161,7 +173,9 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
{
|
||||
mesh: component
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -172,7 +186,9 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
{
|
||||
light: component
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -184,6 +200,8 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
scene: component
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -195,6 +213,8 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
material: component
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -206,6 +226,8 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
texture: component
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -216,7 +238,9 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
{
|
||||
image: component
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -227,8 +251,30 @@ GameLib.Event.EmitInstanceEvents = function(component) {
|
|||
{
|
||||
shape: component
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
component instanceof GameLib.D3.PhysicsWorld
|
||||
) {
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.PHYSICS_WORLD_INSTANCE_CREATED,
|
||||
{
|
||||
world: component
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.INSTANCE_CREATED,
|
||||
{
|
||||
component: component
|
||||
}
|
||||
)
|
||||
};
|
||||
|
||||
// /**
|
||||
|
|
|
@ -130,7 +130,7 @@ GameLib.Component.COMPONENT_ENTITY = 0x20;
|
|||
GameLib.Component.COMPONENT_MESH_SPHERE = 0x21;
|
||||
GameLib.Component.COMPONENT_MESH_PLANE = 0x22;
|
||||
GameLib.Component.COMPONENT_MESH_CURVE = 0x23;
|
||||
GameLib.Component.COMPONENT_WORLD = 0x24;
|
||||
GameLib.Component.COMPONENT_PHYSICS_WORLD = 0x24;
|
||||
GameLib.Component.COMPONENT_BROADPHASE = 0x25;
|
||||
GameLib.Component.COMPONENT_SOLVER = 0x26;
|
||||
GameLib.Component.COMPONENT_RIGID_BODY = 0x27;
|
||||
|
@ -193,7 +193,7 @@ GameLib.Component.GetComponentName = function(number) {
|
|||
case 0x21 : return 'GameLib.D3.Mesh.Sphere';
|
||||
case 0x22 : return 'GameLib.D3.Mesh.Plane';
|
||||
case 0x23 : return 'GameLib.D3.Mesh.Curve';
|
||||
case 0x24 : return 'GameLib.D3.World';
|
||||
case 0x24 : return 'GameLib.D3.PhysicsWorld';
|
||||
case 0x25 : return 'GameLib.D3.Broadphase';
|
||||
case 0x26 : return 'GameLib.D3.Solver';
|
||||
case 0x27 : return 'GameLib.D3.RigidBody';
|
||||
|
|
|
@ -58,7 +58,7 @@ GameLib.D3.API.Face = function(
|
|||
this.materialIndex = materialIndex;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(uvs)) {
|
||||
uvs = [[]];
|
||||
uvs = [[new GameLib.API.Vector2(0,0), new GameLib.API.Vector2(0,0), new GameLib.API.Vector2(0,0)]];
|
||||
}
|
||||
this.uvs = uvs;
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ GameLib.D3.API.Mesh = function(
|
|||
this.skinWeights = skinWeights;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(materials)) {
|
||||
materials = [];
|
||||
materials = [new GameLib.D3.API.Material(null, GameLib.D3.Material.MATERIAL_TYPE_BASIC)];
|
||||
}
|
||||
this.materials = materials;
|
||||
|
||||
|
|
|
@ -6,16 +6,18 @@
|
|||
* @param broadphase
|
||||
* @param solver
|
||||
* @param rigidBodies
|
||||
* @param contactMaterials
|
||||
* @param parentEntity
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.API.World = function(
|
||||
GameLib.D3.API.PhysicsWorld = function(
|
||||
id,
|
||||
name,
|
||||
gravity,
|
||||
broadphase,
|
||||
solver,
|
||||
rigidBodies,
|
||||
contactMaterials,
|
||||
parentEntity
|
||||
) {
|
||||
|
||||
|
@ -25,7 +27,7 @@ GameLib.D3.API.World = function(
|
|||
this.id = id;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(name)) {
|
||||
name = 'World (' + this.id + ')';
|
||||
name = 'Physics World (' + this.id + ')';
|
||||
}
|
||||
this.name = name;
|
||||
|
||||
|
@ -49,28 +51,34 @@ GameLib.D3.API.World = function(
|
|||
}
|
||||
this.rigidBodies = rigidBodies;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(contactMaterials)) {
|
||||
contactMaterials = [];
|
||||
}
|
||||
this.contactMaterials = contactMaterials;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentEntity)) {
|
||||
parentEntity = null;
|
||||
}
|
||||
this.parentEntity = parentEntity;
|
||||
};
|
||||
|
||||
GameLib.D3.API.World.prototype = Object.create(GameLib.Component.prototype);
|
||||
GameLib.D3.API.World.prototype.constructor = GameLib.D3.API.World;
|
||||
GameLib.D3.API.PhysicsWorld.prototype = Object.create(GameLib.Component.prototype);
|
||||
GameLib.D3.API.PhysicsWorld.prototype.constructor = GameLib.D3.API.PhysicsWorld;
|
||||
|
||||
/**
|
||||
* Creates an API World from an Object World
|
||||
* @param objectWorld
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.API.World.FromObject = function(objectWorld) {
|
||||
return new GameLib.D3.API.World(
|
||||
GameLib.D3.API.PhysicsWorld.FromObject = function(objectWorld) {
|
||||
return new GameLib.D3.API.PhysicsWorld(
|
||||
objectWorld.id,
|
||||
objectWorld.name,
|
||||
objectWorld.gravity,
|
||||
GameLib.API.Vector3.FromObject(objectWorld.gravity),
|
||||
objectWorld.broadphase,
|
||||
objectWorld.solver,
|
||||
objectWorld.rigidBodies,
|
||||
objectWorld.contactMaterials,
|
||||
objectWorld.parentEntity
|
||||
);
|
||||
};
|
|
@ -4,6 +4,8 @@
|
|||
* @param name
|
||||
* @param chassis
|
||||
* @param wheels
|
||||
* @param raycastWheels
|
||||
* @param parentWorld
|
||||
* @param parentEntity
|
||||
* @constructor
|
||||
*/
|
||||
|
@ -12,6 +14,8 @@ GameLib.D3.API.RaycastVehicle = function(
|
|||
name,
|
||||
chassis,
|
||||
wheels,
|
||||
raycastWheels,
|
||||
parentWorld,
|
||||
parentEntity
|
||||
) {
|
||||
|
||||
|
@ -35,6 +39,16 @@ GameLib.D3.API.RaycastVehicle = function(
|
|||
}
|
||||
this.wheels = wheels;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(raycastWheels)) {
|
||||
raycastWheels = [];
|
||||
}
|
||||
this.raycastWheels = raycastWheels;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentWorld)) {
|
||||
parentWorld = null;
|
||||
}
|
||||
this.parentWorld = parentWorld;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentEntity)) {
|
||||
parentEntity = null;
|
||||
}
|
||||
|
@ -55,6 +69,8 @@ GameLib.D3.API.RaycastVehicle.FromObject = function(objectRaycastVehicle) {
|
|||
objectRaycastVehicle.name,
|
||||
objectRaycastVehicle.chassis,
|
||||
objectRaycastVehicle.wheels,
|
||||
objectRaycastVehicle.raycastWheels,
|
||||
objectRaycastVehicle.parentWorld,
|
||||
objectRaycastVehicle.parentEntity
|
||||
);
|
||||
};
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
* @param fixedRotation
|
||||
* @param shapes
|
||||
* @param kinematic
|
||||
* @param parentMesh
|
||||
* @param parentEntity
|
||||
* @constructor
|
||||
*/
|
||||
|
@ -40,6 +41,7 @@ GameLib.D3.API.RigidBody = function(
|
|||
fixedRotation,
|
||||
shapes,
|
||||
kinematic,
|
||||
parentMesh,
|
||||
parentEntity
|
||||
) {
|
||||
|
||||
|
@ -132,7 +134,12 @@ GameLib.D3.API.RigidBody = function(
|
|||
kinematic = false;
|
||||
}
|
||||
this.kinematic = kinematic;
|
||||
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentMesh)) {
|
||||
parentMesh = null;
|
||||
}
|
||||
this.parentMesh = parentMesh;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(parentEntity)) {
|
||||
parentEntity = null;
|
||||
}
|
||||
|
@ -167,6 +174,7 @@ GameLib.D3.API.RigidBody.FromObject = function(objectRigidBody) {
|
|||
objectRigidBody.fixedRotation,
|
||||
objectRigidBody.shapes,
|
||||
objectRigidBody.kinematic,
|
||||
objectRigidBody.parentMesh,
|
||||
objectRigidBody.parentEntity
|
||||
);
|
||||
};
|
||||
|
|
|
@ -69,21 +69,21 @@ GameLib.D3.Face = function Face(
|
|||
|
||||
}
|
||||
|
||||
this.vertexNormals = this.vertexNormals.map(function(vertexNormal){
|
||||
if (vertexNormal instanceof GameLib.Vector3) {
|
||||
return vertexNormal;
|
||||
}
|
||||
|
||||
if (vertexNormal instanceof GameLib.API.Vector3) {
|
||||
return new GameLib.Vector3(
|
||||
this.graphics,
|
||||
vertexNormal,
|
||||
this
|
||||
)
|
||||
}
|
||||
|
||||
console.warn('unknown vertex normal type', vertexNormal);
|
||||
}.bind(this));
|
||||
// this.vertexNormals = this.vertexNormals.map(function(vertexNormal){
|
||||
// if (vertexNormal instanceof GameLib.Vector3) {
|
||||
// return vertexNormal;
|
||||
// }
|
||||
//
|
||||
// if (vertexNormal instanceof GameLib.API.Vector3) {
|
||||
// return new GameLib.Vector3(
|
||||
// this.graphics,
|
||||
// vertexNormal,
|
||||
// this
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// console.warn('unknown vertex normal type', vertexNormal);
|
||||
// }.bind(this));
|
||||
|
||||
this.normal = new GameLib.Vector3(
|
||||
this.implementation,
|
||||
|
|
|
@ -223,6 +223,8 @@ GameLib.D3.Mesh.MESH_TYPE_SKINNED = 0x1;
|
|||
GameLib.D3.Mesh.MESH_TYPE_CURVE = 0x2;
|
||||
GameLib.D3.Mesh.MESH_TYPE_SPHERE = 0x3;
|
||||
GameLib.D3.Mesh.MESH_TYPE_PLANE = 0x4;
|
||||
GameLib.D3.Mesh.MESH_TYPE_BOX = 0x5;
|
||||
GameLib.D3.Mesh.MESH_TYPE_CYLINDER = 0x6;
|
||||
|
||||
GameLib.D3.Mesh.prototype.createInstanceGeometry = function(instanceGeometry) {
|
||||
|
||||
|
@ -436,10 +438,13 @@ GameLib.D3.Mesh.prototype.createInstanceGeometry = function(instanceGeometry) {
|
|||
);
|
||||
geometry.verticesNeedUpdate = true;
|
||||
|
||||
/**
|
||||
* UV data
|
||||
*/
|
||||
geometry.faceVertexUvs = [standardUvs];
|
||||
|
||||
/**
|
||||
* UV data - but only if it exists
|
||||
*/
|
||||
if (standardUvs.length > 0) {
|
||||
geometry.faceVertexUvs = [standardUvs];
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-compute normals - we don't do this for buffer geometry because it assigns to every vertex normal the face
|
||||
|
@ -569,7 +574,9 @@ GameLib.D3.Mesh.prototype.updateInstance = function() {
|
|||
this.instance.renderOrder = this.renderOrder;
|
||||
|
||||
if (this.helper) {
|
||||
this.helper.updateInstance();
|
||||
this.removeHelper();
|
||||
this.createHelper();
|
||||
// this.helper.updateInstance();
|
||||
}
|
||||
|
||||
this.computeBoundingBox(this.instance.geometry);
|
||||
|
@ -714,43 +721,43 @@ GameLib.D3.Mesh.prototype.updateVerticesFromGeometryInstance = function(geometry
|
|||
x: geometryInstance.faceVertexUvs[0][faceIndex][2].x,
|
||||
y: geometryInstance.faceVertexUvs[0][faceIndex][2].y
|
||||
}
|
||||
]]
|
||||
// new GameLib.Color(
|
||||
// this.graphics,
|
||||
// new GameLib.API.Color(
|
||||
// face.color.r,
|
||||
// face.color.g,
|
||||
// face.color.b
|
||||
// )
|
||||
// ),
|
||||
// face.vertexColors.map(function(vertexColor){
|
||||
// return new GameLib.Color(
|
||||
// this.graphics,
|
||||
// new GameLib.API.Color(
|
||||
// vertexColor.r,
|
||||
// vertexColor.g,
|
||||
// vertexColor.b
|
||||
// )
|
||||
// )
|
||||
// }.bind(this)),
|
||||
// face.vertexNormals.map(function(vertexNormal){
|
||||
// return new GameLib.Vector3(
|
||||
// this.graphics,
|
||||
// new GameLib.API.Vector3(
|
||||
// vertexNormal.x,
|
||||
// vertexNormal.y,
|
||||
// vertexNormal.z
|
||||
// )
|
||||
// )
|
||||
// }.bind(this)),
|
||||
// new GameLib.Vector3(
|
||||
// this.graphics,
|
||||
// new GameLib.API.Vector3(
|
||||
// face.normal.x,
|
||||
// face.normal.y,
|
||||
// face.normal.z
|
||||
// )
|
||||
// )
|
||||
]],
|
||||
new GameLib.Color(
|
||||
this.graphics,
|
||||
new GameLib.API.Color(
|
||||
face.color.r,
|
||||
face.color.g,
|
||||
face.color.b
|
||||
)
|
||||
),
|
||||
face.vertexColors.map(function(vertexColor){
|
||||
return new GameLib.Color(
|
||||
this.graphics,
|
||||
new GameLib.API.Color(
|
||||
vertexColor.r,
|
||||
vertexColor.g,
|
||||
vertexColor.b
|
||||
)
|
||||
)
|
||||
}.bind(this)),
|
||||
face.vertexNormals.map(function(vertexNormal){
|
||||
return new GameLib.Vector3(
|
||||
this.graphics,
|
||||
new GameLib.API.Vector3(
|
||||
vertexNormal.x,
|
||||
vertexNormal.y,
|
||||
vertexNormal.z
|
||||
)
|
||||
)
|
||||
}.bind(this)),
|
||||
new GameLib.Vector3(
|
||||
this.graphics,
|
||||
new GameLib.API.Vector3(
|
||||
face.normal.x,
|
||||
face.normal.y,
|
||||
face.normal.z
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -1025,8 +1032,17 @@ GameLib.D3.Mesh.prototype.applyLocalPositionRotationScale = function() {
|
|||
|
||||
var geometry = this.createInstanceGeometry();
|
||||
|
||||
/**
|
||||
* The face normals got re-calculated - so update again the faces
|
||||
*/
|
||||
this.updateVerticesFromGeometryInstance(this.instance.geometry);
|
||||
|
||||
this.instance.geometry = geometry;
|
||||
|
||||
this.position.x = 0;
|
||||
this.position.y = 0;
|
||||
this.position.z = 0;
|
||||
|
||||
this.localPosition.x = 0;
|
||||
this.localPosition.y = 0;
|
||||
this.localPosition.z = 0;
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
/**
|
||||
* Mesh Superset - The apiMesh properties get moved into the Mesh object itself, and then the instance is created
|
||||
* @param graphics GameLib.D3.Graphics
|
||||
* @param apiMesh GameLib.D3.API.Mesh
|
||||
* @param width
|
||||
* @param height
|
||||
* @param depth
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.Mesh.Box = function (
|
||||
graphics,
|
||||
apiMesh,
|
||||
width,
|
||||
height,
|
||||
depth
|
||||
) {
|
||||
this.graphics = graphics;
|
||||
this.graphics.isNotThreeThrow();
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(width)) {
|
||||
width = 1;
|
||||
}
|
||||
this.width = width;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(height)) {
|
||||
height = 1;
|
||||
}
|
||||
this.height = height;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(depth)) {
|
||||
depth = 1;
|
||||
}
|
||||
this.depth = depth;
|
||||
|
||||
GameLib.D3.Mesh.call(
|
||||
this,
|
||||
this.graphics,
|
||||
apiMesh
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.D3.Mesh.Box.prototype = Object.create(GameLib.D3.Mesh.prototype);
|
||||
GameLib.D3.Mesh.Box.prototype.constructor = GameLib.D3.Mesh.Box;
|
||||
|
||||
GameLib.D3.Mesh.Box.prototype.createInstance = function() {
|
||||
|
||||
var geometry = null;
|
||||
|
||||
if (this.vertices.length === 0) {
|
||||
geometry = new THREE.BoxGeometry(
|
||||
this.width,
|
||||
this.height,
|
||||
this.depth
|
||||
);
|
||||
|
||||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
}
|
||||
|
||||
var instance = GameLib.D3.Mesh.prototype.createInstance.call(this);
|
||||
|
||||
instance.userData.width = this.width;
|
||||
instance.userData.height = this.height;
|
||||
instance.userData.depth = this.depth;
|
||||
|
||||
return instance;
|
||||
};
|
||||
|
||||
GameLib.D3.Mesh.Box.prototype.updateInstance = function() {
|
||||
|
||||
if (
|
||||
this.instance.userData.width !== this.width ||
|
||||
this.instance.userData.height !== this.height ||
|
||||
this.instance.userData.depth !== this.depth
|
||||
) {
|
||||
var geometry = new THREE.BoxGeometry(
|
||||
this.width,
|
||||
this.height,
|
||||
this.depth
|
||||
);
|
||||
|
||||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
|
||||
geometry = this.createInstanceGeometry();
|
||||
|
||||
this.instance.geometry = geometry;
|
||||
}
|
||||
|
||||
GameLib.D3.Mesh.prototype.updateInstance.call(this);
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a GameLib.D3.Mesh to a GameLib.D3.API.Mesh
|
||||
* @returns {GameLib.D3.API.Mesh}
|
||||
*/
|
||||
GameLib.D3.Mesh.Box.prototype.toApiObject = function() {
|
||||
|
||||
var apiMesh = GameLib.D3.Mesh.prototype.toApiObject.call(this);
|
||||
|
||||
apiMesh.width = this.width;
|
||||
apiMesh.height = this.height;
|
||||
apiMesh.depth = this.depth;
|
||||
|
||||
return apiMesh;
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a standard object mesh to a GameLib.D3.Mesh
|
||||
* @param graphics GameLib.D3.Graphics
|
||||
* @param objectMesh {Object}
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.Mesh.Box.FromObject = function(graphics, objectMesh) {
|
||||
|
||||
var apiMesh = GameLib.D3.API.Mesh.FromObject(objectMesh);
|
||||
|
||||
return new GameLib.D3.Mesh.Box(
|
||||
graphics,
|
||||
apiMesh,
|
||||
objectMesh.width,
|
||||
objectMesh.height,
|
||||
objectMesh.depth
|
||||
);
|
||||
|
||||
};
|
|
@ -0,0 +1,188 @@
|
|||
/**
|
||||
* Mesh Superset - The apiMesh properties get moved into the Mesh object itself, and then the instance is created
|
||||
* @param graphics GameLib.D3.Graphics
|
||||
* @param apiMesh GameLib.D3.API.Mesh
|
||||
* @param radiusTop
|
||||
* @param radiusBottom
|
||||
* @param height
|
||||
* @param radiusSegments
|
||||
* @param heightSegments
|
||||
* @param openEnded
|
||||
* @param thetaStart
|
||||
* @param thetaLength
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.Mesh.Cylinder = function (
|
||||
graphics,
|
||||
apiMesh,
|
||||
radiusTop,
|
||||
radiusBottom,
|
||||
height,
|
||||
radiusSegments,
|
||||
heightSegments,
|
||||
openEnded,
|
||||
thetaStart,
|
||||
thetaLength
|
||||
) {
|
||||
this.graphics = graphics;
|
||||
this.graphics.isNotThreeThrow();
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(radiusTop)) {
|
||||
radiusTop = 1;
|
||||
}
|
||||
this.radiusTop = radiusTop;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(radiusBottom)) {
|
||||
radiusBottom = 1;
|
||||
}
|
||||
this.radiusBottom = radiusBottom;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(height)) {
|
||||
height = 5;
|
||||
}
|
||||
this.height = height;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(radiusSegments)) {
|
||||
radiusSegments = 10;
|
||||
}
|
||||
this.radiusSegments = radiusSegments;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(heightSegments)) {
|
||||
heightSegments = 10;
|
||||
}
|
||||
this.heightSegments = heightSegments;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(openEnded)) {
|
||||
openEnded = false;
|
||||
}
|
||||
this.openEnded = openEnded;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(thetaStart)) {
|
||||
thetaStart = 0;
|
||||
}
|
||||
this.thetaStart = thetaStart;
|
||||
|
||||
if (GameLib.Utils.UndefinedOrNull(thetaLength)) {
|
||||
thetaLength = Math.PI * 2;
|
||||
}
|
||||
this.thetaLength = thetaLength;
|
||||
|
||||
GameLib.D3.Mesh.call(
|
||||
this,
|
||||
this.graphics,
|
||||
apiMesh
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.D3.Mesh.Cylinder.prototype = Object.create(GameLib.D3.Mesh.prototype);
|
||||
GameLib.D3.Mesh.Cylinder.prototype.constructor = GameLib.D3.Mesh.Cylinder;
|
||||
|
||||
GameLib.D3.Mesh.Cylinder.prototype.createInstance = function() {
|
||||
|
||||
var geometry = null;
|
||||
|
||||
if (this.vertices.length === 0) {
|
||||
geometry = new THREE.CylinderGeometry(
|
||||
this.radiusTop,
|
||||
this.radiusBottom,
|
||||
this.height,
|
||||
this.radiusSegments,
|
||||
this.heightSegments,
|
||||
this.openEnded,
|
||||
this.thetaStart,
|
||||
this.thetaLength
|
||||
);
|
||||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
}
|
||||
|
||||
var instance = GameLib.D3.Mesh.prototype.createInstance.call(this);
|
||||
|
||||
instance.userData.radiusTop = this.radiusTop;
|
||||
instance.userData.radiusBottom = this.radiusBottom;
|
||||
instance.userData.height = this.height;
|
||||
instance.userData.radiusSegments = this.radiusSegments;
|
||||
instance.userData.heightSegments = this.heightSegments;
|
||||
instance.userData.openEnded = this.openEnded;
|
||||
instance.userData.thetaStart = this.thetaStart;
|
||||
instance.userData.thetaLength = this.thetaLength;
|
||||
|
||||
return instance;
|
||||
};
|
||||
|
||||
GameLib.D3.Mesh.Cylinder.prototype.updateInstance = function() {
|
||||
|
||||
if (
|
||||
this.instance.userData.radiusTop !== this.radiusTop ||
|
||||
this.instance.userData.radiusBottom !== this.radiusBottom ||
|
||||
this.instance.userData.height !== this.height ||
|
||||
this.instance.userData.radiusSegments !== this.radiusSegments ||
|
||||
this.instance.userData.heightSegments !== this.heightSegments ||
|
||||
this.instance.userData.openEnded !== this.openEnded ||
|
||||
this.instance.userData.thetaStart !== this.thetaStart ||
|
||||
this.instance.userData.thetaLength !== this.thetaLength
|
||||
) {
|
||||
var geometry = new THREE.CylinderGeometry(
|
||||
this.radiusTop,
|
||||
this.radiusBottom,
|
||||
this.height,
|
||||
this.radiusSegments,
|
||||
this.heightSegments,
|
||||
this.openEnded,
|
||||
this.thetaStart,
|
||||
this.thetaLength
|
||||
);
|
||||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
|
||||
geometry = this.createInstanceGeometry();
|
||||
|
||||
this.instance.geometry = geometry;
|
||||
}
|
||||
|
||||
GameLib.D3.Mesh.prototype.updateInstance.call(this);
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a GameLib.D3.Mesh to a GameLib.D3.API.Mesh
|
||||
* @returns {GameLib.D3.API.Mesh}
|
||||
*/
|
||||
GameLib.D3.Mesh.Cylinder.prototype.toApiObject = function() {
|
||||
|
||||
var apiMesh = GameLib.D3.Mesh.prototype.toApiObject.call(this);
|
||||
|
||||
apiMesh.radiusTop = this.radiusTop;
|
||||
apiMesh.radiusBottom = this.radiusBottom;
|
||||
apiMesh.height = this.height;
|
||||
apiMesh.radiusSegments = this.radiusSegments;
|
||||
apiMesh.heightSegments = this.heightSegments;
|
||||
apiMesh.openEnded = this.openEnded;
|
||||
apiMesh.thetaStart = this.thetaStart;
|
||||
apiMesh.thetaLength = this.thetaLength;
|
||||
|
||||
return apiMesh;
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a standard object mesh to a GameLib.D3.Mesh
|
||||
* @param graphics GameLib.D3.Graphics
|
||||
* @param objectMesh {Object}
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.Mesh.Cylinder.FromObject = function(graphics, objectMesh) {
|
||||
|
||||
var apiMesh = GameLib.D3.API.Mesh.FromObject(objectMesh);
|
||||
|
||||
return new GameLib.D3.Mesh.Cylinder(
|
||||
graphics,
|
||||
apiMesh,
|
||||
objectMesh.radiusTop,
|
||||
objectMesh.radiusBottom,
|
||||
objectMesh.height,
|
||||
objectMesh.radiusSegments,
|
||||
objectMesh.heightSegments,
|
||||
objectMesh.openEnded,
|
||||
objectMesh.thetaStart,
|
||||
objectMesh.thetaLength
|
||||
);
|
||||
|
||||
};
|
|
@ -6,6 +6,8 @@
|
|||
* @param height
|
||||
* @param widthSegments
|
||||
* @param heightSegments
|
||||
* @param heightMapScale
|
||||
* @param isHeightMap
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.Mesh.Plane = function (
|
||||
|
@ -89,15 +91,15 @@ GameLib.D3.Mesh.Plane.prototype.createInstance = function() {
|
|||
'Material Plane ' + this.id
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* If this is a heightmap - first generate the z-coordinates
|
||||
*/
|
||||
if (this.isHeightMap) {
|
||||
this.generateHeightMapFromBumpMap();
|
||||
}
|
||||
/**
|
||||
* If this is a heightmap - first generate the z-coordinates
|
||||
*/
|
||||
if (this.isHeightMap) {
|
||||
this.generateHeightMapFromBumpMap();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Now construct the mesh instance
|
||||
|
|
|
@ -46,10 +46,7 @@ GameLib.D3.Mesh.Sphere.prototype.createInstance = function() {
|
|||
|
||||
var geometry = null;
|
||||
|
||||
if (this.vertices.length > 0) {
|
||||
geometry = new THREE.Geometry();
|
||||
this.applyVertexDataToInstance(geometry);
|
||||
} else {
|
||||
if (this.vertices.length === 0) {
|
||||
geometry = new THREE.SphereGeometry(
|
||||
this.radius,
|
||||
this.widthSegments,
|
||||
|
@ -58,31 +55,21 @@ GameLib.D3.Mesh.Sphere.prototype.createInstance = function() {
|
|||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
}
|
||||
|
||||
this.applyBones(geometry);
|
||||
|
||||
var instance = null;
|
||||
|
||||
if (this.skeleton) {
|
||||
instance = new THREE.SkinnedMesh(geometry)
|
||||
} else {
|
||||
instance = new THREE.Mesh(geometry);
|
||||
}
|
||||
var instance = GameLib.D3.Mesh.prototype.createInstance.call(this);
|
||||
|
||||
instance.userData.radius = this.radius;
|
||||
instance.userData.widthSegments = this.widthSegments;
|
||||
instance.userData.heightSegments = this.heightSegments;
|
||||
|
||||
this.createInstanceDefaults(instance);
|
||||
|
||||
return instance;
|
||||
};
|
||||
|
||||
GameLib.D3.Mesh.Sphere.prototype.updateInstance = function() {
|
||||
|
||||
if (
|
||||
this.instance.userData.widthSegments !== this.widthSegments ||
|
||||
this.instance.userData.heightSegments !== this.heightSegments ||
|
||||
this.instance.userData.radius !== this.radius
|
||||
this.instance.userData.widthSegments !== this.widthSegments ||
|
||||
this.instance.userData.heightSegments !== this.heightSegments ||
|
||||
this.instance.userData.radius !== this.radius
|
||||
) {
|
||||
var geometry = new THREE.SphereGeometry(
|
||||
this.radius,
|
||||
|
@ -90,9 +77,11 @@ GameLib.D3.Mesh.Sphere.prototype.updateInstance = function() {
|
|||
this.heightSegments
|
||||
);
|
||||
|
||||
this.instance.geometry = geometry;
|
||||
|
||||
this.updateVerticesFromGeometryInstance(geometry);
|
||||
|
||||
geometry = this.createInstanceGeometry();
|
||||
|
||||
this.instance.geometry = geometry;
|
||||
}
|
||||
|
||||
GameLib.D3.Mesh.prototype.updateInstance.call(this);
|
||||
|
@ -115,7 +104,6 @@ GameLib.D3.Mesh.Sphere.prototype.toApiObject = function() {
|
|||
};
|
||||
|
||||
/**
|
||||
* TODO fix all this weird loading shit
|
||||
* Converts a standard object mesh to a GameLib.D3.Mesh
|
||||
* @param graphics GameLib.D3.Graphics
|
||||
* @param objectMesh {Object}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* @param physics
|
||||
* @param apiWorld
|
||||
*/
|
||||
GameLib.D3.World = function(
|
||||
GameLib.D3.PhysicsWorld = function(
|
||||
physics,
|
||||
apiWorld
|
||||
) {
|
||||
|
@ -16,11 +16,11 @@ GameLib.D3.World = function(
|
|||
apiWorld = {};
|
||||
}
|
||||
|
||||
if (apiWorld instanceof GameLib.D3.World) {
|
||||
if (apiWorld instanceof GameLib.D3.PhysicsWorld) {
|
||||
return apiWorld;
|
||||
}
|
||||
|
||||
GameLib.D3.API.World.call(
|
||||
GameLib.D3.API.PhysicsWorld.call(
|
||||
this,
|
||||
apiWorld.id,
|
||||
apiWorld.name,
|
||||
|
@ -28,6 +28,7 @@ GameLib.D3.World = function(
|
|||
apiWorld.broadphase,
|
||||
apiWorld.solver,
|
||||
apiWorld.rigidBodies,
|
||||
apiWorld.contactMaterials,
|
||||
apiWorld.parentEntity
|
||||
);
|
||||
|
||||
|
@ -53,25 +54,50 @@ GameLib.D3.World = function(
|
|||
);
|
||||
}
|
||||
|
||||
this.rigidBodies = this.rigidBodies.map(
|
||||
function(rigidBody) {
|
||||
if (rigidBody instanceof GameLib.D3.API.RigidBody) {
|
||||
return new GameLib.D3.RigidBody(
|
||||
this.physics,
|
||||
rigidBody
|
||||
);
|
||||
}
|
||||
return rigidBody;
|
||||
}.bind(this)
|
||||
);
|
||||
|
||||
this.contactMaterials = this.contactMaterials.map(
|
||||
function(contactMaterial) {
|
||||
if (contactMaterial instanceof GameLib.D3.API.FrictionContactMaterial) {
|
||||
return new GameLib.D3.FrictionContactMaterial(
|
||||
this.physics,
|
||||
contactMaterial
|
||||
);
|
||||
}
|
||||
return contactMaterial;
|
||||
}.bind(this)
|
||||
);
|
||||
|
||||
GameLib.Component.call(
|
||||
this,
|
||||
GameLib.Component.COMPONENT_WORLD,
|
||||
GameLib.Component.COMPONENT_PHYSICS_WORLD,
|
||||
{
|
||||
'broadphase' : GameLib.D3.Broadphase,
|
||||
'solver' : GameLib.D3.Solver,
|
||||
'rigidBodies' : [GameLib.D3.RigidBody]
|
||||
'rigidBodies' : [GameLib.D3.RigidBody],
|
||||
'contactMaterials' : [GameLib.D3.FrictionContactMaterial]
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.D3.World.prototype = Object.create(GameLib.D3.API.World.prototype);
|
||||
GameLib.D3.World.prototype.constructor = GameLib.D3.World;
|
||||
GameLib.D3.PhysicsWorld.prototype = Object.create(GameLib.D3.API.PhysicsWorld.prototype);
|
||||
GameLib.D3.PhysicsWorld.prototype.constructor = GameLib.D3.PhysicsWorld;
|
||||
|
||||
/**
|
||||
* private
|
||||
* @returns {GameLib.D3.World|GameLib.D3.Physics.World|*}
|
||||
* @returns {GameLib.D3.PhysicsWorld|GameLib.D3.Physics.World|*}
|
||||
*/
|
||||
GameLib.D3.World.prototype.createInstance = function() {
|
||||
GameLib.D3.PhysicsWorld.prototype.createInstance = function() {
|
||||
|
||||
if (this.broadphase && this.broadphase.instance &&
|
||||
this.solver && this.solver.instance) {
|
||||
|
@ -80,16 +106,27 @@ GameLib.D3.World.prototype.createInstance = function() {
|
|||
instance.broadphase = this.broadphase.instance;
|
||||
instance.solver = this.solver.instance;
|
||||
instance.gravity = this.gravity.instance;
|
||||
|
||||
this.contactMaterials.map(
|
||||
function(contactMaterial) {
|
||||
if (contactMaterial && contactMaterial.instance) {
|
||||
instance.addContactMaterial(contactMaterial.instance);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
return instance;
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
GameLib.D3.World.prototype.updateInstance = function() {
|
||||
GameLib.D3.PhysicsWorld.prototype.updateInstance = function() {
|
||||
|
||||
if (!this.instance) {
|
||||
console.log('no world instance');
|
||||
|
@ -99,15 +136,17 @@ GameLib.D3.World.prototype.updateInstance = function() {
|
|||
this.instance.broadphase = this.broadphase.instance;
|
||||
this.instance.solver = this.solver.instance;
|
||||
this.instance.gravity = this.gravity.instance;
|
||||
|
||||
//TODO add contact materials
|
||||
};
|
||||
|
||||
/**
|
||||
* GameLib.D3.World to GameLib.D3.API.World
|
||||
* @returns {GameLib.D3.API.World}
|
||||
* GameLib.D3.PhysicsWorld to GameLib.D3.API.PhysicsWorld
|
||||
* @returns {GameLib.D3.API.PhysicsWorld}
|
||||
*/
|
||||
GameLib.D3.World.prototype.toApiObject = function() {
|
||||
GameLib.D3.PhysicsWorld.prototype.toApiObject = function() {
|
||||
|
||||
var apiWorld = new GameLib.D3.API.World(
|
||||
var apiWorld = new GameLib.D3.API.PhysicsWorld(
|
||||
this.id,
|
||||
this.name,
|
||||
this.gravity.toApiObject(),
|
||||
|
@ -116,6 +155,9 @@ GameLib.D3.World.prototype.toApiObject = function() {
|
|||
this.rigidBodies.map(function(body){
|
||||
return GameLib.Utils.IdOrNull(body);
|
||||
}),
|
||||
this.contactMaterials.map(function(contactMaterial){
|
||||
return GameLib.Utils.IdOrNull(contactMaterial);
|
||||
}),
|
||||
GameLib.Utils.IdOrNull(this.parentEntity)
|
||||
);
|
||||
|
||||
|
@ -123,21 +165,21 @@ GameLib.D3.World.prototype.toApiObject = function() {
|
|||
};
|
||||
|
||||
/**
|
||||
* GameLib.D3.World from Object World
|
||||
* GameLib.D3.PhysicsWorld from Object World
|
||||
* @param graphics
|
||||
* @param objectComponent
|
||||
* @returns {GameLib.D3.World}
|
||||
* @returns {GameLib.D3.PhysicsWorld}
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.D3.World.FromObject = function(graphics, objectComponent) {
|
||||
var apiWorld = GameLib.D3.API.World.FromObject(objectComponent);
|
||||
return new GameLib.D3.World(
|
||||
GameLib.D3.PhysicsWorld.FromObject = function(graphics, objectComponent) {
|
||||
var apiWorld = GameLib.D3.API.PhysicsWorld.FromObject(objectComponent);
|
||||
return new GameLib.D3.PhysicsWorld(
|
||||
graphics,
|
||||
apiWorld
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.D3.World.prototype.step = function(deltaTime) {
|
||||
GameLib.D3.PhysicsWorld.prototype.step = function(deltaTime) {
|
||||
|
||||
if (this.isCannon) {
|
||||
this.instance.step(deltaTime);
|
||||
|
@ -150,14 +192,14 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
};
|
||||
|
||||
//
|
||||
// GameLib.D3.World.prototype.step = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.step = function(
|
||||
// fixedStep,
|
||||
// dtStep
|
||||
// ) {
|
||||
//
|
||||
// };
|
||||
//
|
||||
// GameLib.D3.World.prototype.generateWireframeViewTriangleMesh = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.generateWireframeViewTriangleMesh = function(
|
||||
// graphics,
|
||||
// triangleMeshShape,
|
||||
// normalLength,
|
||||
|
@ -264,7 +306,7 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
// * @returns {THREE.Mesh|this.meshes}
|
||||
// * @constructor
|
||||
// */
|
||||
// GameLib.D3.World.prototype.generateWireframeViewConvexPolyMesh = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.generateWireframeViewConvexPolyMesh = function(
|
||||
// graphics,
|
||||
// convexPolyMeshShape,
|
||||
// normalLength,
|
||||
|
@ -362,7 +404,7 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
// * @returns {Object}
|
||||
// * @constructor
|
||||
// */
|
||||
// GameLib.D3.World.prototype.generateTriangleMeshShapeDivided = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.generateTriangleMeshShapeDivided = function(
|
||||
// graphics,
|
||||
// graphicsMesh,
|
||||
// mass,
|
||||
|
@ -453,7 +495,7 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
// }
|
||||
// };
|
||||
//
|
||||
// GameLib.D3.World.prototype.generateConvexPolyShape = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.generateConvexPolyShape = function(
|
||||
// graphics,
|
||||
// mesh
|
||||
// ) {
|
||||
|
@ -521,7 +563,7 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
// * @returns {GameLib.D3.Shape}
|
||||
// * @constructor
|
||||
// */
|
||||
// GameLib.D3.World.prototype.generateTriangleMeshShape = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.generateTriangleMeshShape = function(
|
||||
// graphics,
|
||||
// graphicsMesh
|
||||
// ) {
|
||||
|
@ -608,7 +650,7 @@ GameLib.D3.World.prototype.step = function(deltaTime) {
|
|||
// * @returns {GameLib.D3.RigidBody}
|
||||
// * @constructor
|
||||
// */
|
||||
// GameLib.D3.World.prototype.fixupTriangleMeshShape = function(
|
||||
// GameLib.D3.PhysicsWorld.prototype.fixupTriangleMeshShape = function(
|
||||
// triangleMeshBody,
|
||||
// triangleMeshShapes,
|
||||
// rayscale,
|
|
@ -26,6 +26,8 @@ GameLib.D3.RaycastVehicle = function (
|
|||
apiRaycastVehicle.name,
|
||||
apiRaycastVehicle.chassis,
|
||||
apiRaycastVehicle.wheels,
|
||||
apiRaycastVehicle.raycastWheels,
|
||||
apiRaycastVehicle.parentWorld,
|
||||
apiRaycastVehicle.parentEntity
|
||||
);
|
||||
|
||||
|
@ -37,8 +39,8 @@ GameLib.D3.RaycastVehicle = function (
|
|||
}
|
||||
|
||||
this.wheels = this.wheels.map(function(wheel){
|
||||
if (wheel instanceof GameLib.D3.API.RaycastWheel) {
|
||||
return new GameLib.D3.RaycastWheel(
|
||||
if (wheel instanceof GameLib.D3.API.RigidBody) {
|
||||
return new GameLib.D3.RigidBody(
|
||||
this.physics,
|
||||
wheel
|
||||
)
|
||||
|
@ -47,12 +49,25 @@ GameLib.D3.RaycastVehicle = function (
|
|||
}
|
||||
}.bind(this));
|
||||
|
||||
this.raycastWheels = this.raycastWheels.map(function(raycastWheel){
|
||||
if (raycastWheel instanceof GameLib.D3.API.RaycastWheel) {
|
||||
return new GameLib.D3.RaycastWheel(
|
||||
this.physics,
|
||||
raycastWheel
|
||||
)
|
||||
} else {
|
||||
return raycastWheel;
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
GameLib.Component.call(
|
||||
this,
|
||||
GameLib.Component.COMPONENT_RAYCAST_VEHICLE,
|
||||
{
|
||||
'chassis' : GameLib.D3.RigidBody,
|
||||
'wheels' : [GameLib.D3.RaycastWheel]
|
||||
'chassis' : GameLib.D3.RigidBody,
|
||||
'wheels' : [GameLib.D3.RigidBody],
|
||||
'raycastWheels' : [GameLib.D3.RaycastWheel],
|
||||
'parentWorld' : GameLib.D3.PhysicsWorld
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -75,18 +90,27 @@ GameLib.D3.RaycastVehicle.prototype.createInstance = function() {
|
|||
var instance = false;
|
||||
|
||||
if (this.chassis && this.chassis.instance) {
|
||||
var instance = new CANNON.RaycastVehicle({
|
||||
|
||||
instance = new CANNON.RaycastVehicle({
|
||||
chassisBody: this.chassis.instance
|
||||
});
|
||||
|
||||
this.raycastWheels.map(function(wheel){
|
||||
instance.addWheel(wheel.instance);
|
||||
});
|
||||
|
||||
if (this.parentWorld && this.parentWorld.instance) {
|
||||
instance.addToWorld(this.parentWorld.instance);
|
||||
}
|
||||
}
|
||||
|
||||
return instance;
|
||||
};
|
||||
|
||||
GameLib.D3.RaycastVehicle.prototype.updateInstance = function() {
|
||||
this.instance.chassisBody = this.chassis.instance;
|
||||
// this.instance.chassisBody = this.chassis.instance;
|
||||
//TODO: add / remove wheels?
|
||||
console.log('TODO: add/remove wheels?');
|
||||
console.log('TODO: update raycast vehicle instance');
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -102,6 +126,10 @@ GameLib.D3.RaycastVehicle.prototype.toApiObject = function() {
|
|||
this.wheels.map(function(wheel){
|
||||
return GameLib.Utils.IdOrNull(wheel);
|
||||
}),
|
||||
this.raycastWheels.map(function(raycastWheel){
|
||||
return GameLib.Utils.IdOrNull(raycastWheel);
|
||||
}),
|
||||
GameLib.Utils.IdOrNull(this.parentWorld),
|
||||
GameLib.Utils.IdOrNull(this.parentEntity)
|
||||
);
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ GameLib.D3.RigidBody = function (
|
|||
apiRigidBody.fixedRotation,
|
||||
apiRigidBody.shapes,
|
||||
apiRigidBody.kinematic,
|
||||
apiRigidBody.parentMesh,
|
||||
apiRigidBody.parentEntity
|
||||
);
|
||||
|
||||
|
@ -71,7 +72,8 @@ GameLib.D3.RigidBody = function (
|
|||
this,
|
||||
GameLib.Component.COMPONENT_RIGID_BODY,
|
||||
{
|
||||
'shapes' : [GameLib.D3.Shape]
|
||||
'shapes' : [GameLib.D3.Shape],
|
||||
'parentMesh' : GameLib.D3.Mesh
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -152,6 +154,30 @@ GameLib.D3.RigidBody.prototype.updateInstance = function() {
|
|||
this.instance.kinematic = this.kinematic;
|
||||
};
|
||||
|
||||
GameLib.D3.RigidBody.prototype.setFromParentMesh = function() {
|
||||
|
||||
if (!this.parentMesh || !this.parentMesh.instance) {
|
||||
console.log('no parent mesh or instance');
|
||||
}
|
||||
|
||||
this.instance.position.x = this.parentMesh.position.x;
|
||||
this.instance.position.y = this.parentMesh.position.y;
|
||||
this.instance.position.z = this.parentMesh.position.z;
|
||||
|
||||
// this.parentMesh.quaternion.x = this.parentMesh.instance.quaternion.x;
|
||||
// this.parentMesh.quaternion.y = this.parentMesh.instance.quaternion.y;
|
||||
// this.parentMesh.quaternion.z = this.parentMesh.instance.quaternion.z;
|
||||
// this.parentMesh.quaternion.w = this.parentMesh.instance.quaternion.w;
|
||||
//
|
||||
// this.quaternion.x = this.parentMesh.quaternion.x;
|
||||
// this.quaternion.y = this.parentMesh.quaternion.y;
|
||||
// this.quaternion.z = this.parentMesh.quaternion.z;
|
||||
// this.quaternion.w = this.parentMesh.quaternion.w;
|
||||
|
||||
this.updateInstance();
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* GameLib.D3.RigidBody to GameLib.D3.API.RigidBody
|
||||
* @returns {GameLib.D3.API.RigidBody}
|
||||
|
@ -177,6 +203,7 @@ GameLib.D3.RigidBody.prototype.toApiObject = function() {
|
|||
this.fixedRotation,
|
||||
this.shapes.map(function(shape){return GameLib.Utils.IdOrNull(shape)}),
|
||||
this.kinematic,
|
||||
GameLib.Utils.IdOrNull(this.parentMesh),
|
||||
GameLib.Utils.IdOrNull(this.parentEntity)
|
||||
);
|
||||
|
||||
|
|
|
@ -89,10 +89,6 @@ GameLib.D3.Shape.prototype.updateInstance = function() {
|
|||
throw new Error('Do not instantiate this class directly - use a child class instead');
|
||||
};
|
||||
|
||||
GameLib.D3.Shape.prototype.visualize = function() {
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a GameLib.D3.Shape to a GameLib.D3.API.Shape
|
||||
* @returns {GameLib.D3.API.Shape}
|
||||
|
@ -121,3 +117,21 @@ GameLib.D3.Shape.prototype.toApiObject = function() {
|
|||
GameLib.D3.Shape.FromObject = function(physics, objectShape) {
|
||||
throw ('not implemented');
|
||||
};
|
||||
|
||||
GameLib.D3.Shape.prototype.stopVisualize = function() {
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.STOP_VISUALIZE,
|
||||
{
|
||||
mesh : this.mesh
|
||||
}
|
||||
)
|
||||
};
|
||||
|
||||
GameLib.D3.Shape.prototype.visualize = function() {
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.VISUALIZE,
|
||||
{
|
||||
shape : this
|
||||
}
|
||||
)
|
||||
};
|
|
@ -103,7 +103,35 @@ GameLib.D3.Shape.HeightMap.prototype.setFromMesh = function() {
|
|||
return;
|
||||
}
|
||||
|
||||
this.zValues = this.parentMesh.getHeightData();
|
||||
var dim1Array = Array.prototype.slice.call(this.parentMesh.getHeightData());
|
||||
|
||||
var w = 0;
|
||||
|
||||
var h = 0;
|
||||
|
||||
var width = this.parentMesh.widthSegments + 1;
|
||||
|
||||
var height = this.parentMesh.heightSegments + 1;
|
||||
|
||||
var dim2Array = dim1Array.reduce(
|
||||
function(result, value) {
|
||||
|
||||
result[h].push(value);
|
||||
|
||||
w++;
|
||||
|
||||
if (w === this.parentMesh.widthSegments) {
|
||||
w = 0;
|
||||
h++;
|
||||
result[h] = [];
|
||||
}
|
||||
|
||||
return result;
|
||||
}.bind(this),
|
||||
[[]]
|
||||
);
|
||||
|
||||
this.zValues = dim2Array;
|
||||
|
||||
this.minValue = 0;
|
||||
this.maxValue = (this.parentMesh.widthSegments + 1) * (this.parentMesh.heightSegments + 1);
|
||||
|
|
|
@ -34,16 +34,17 @@ GameLib.System = function(
|
|||
GameLib.System.prototype = Object.create(GameLib.API.System.prototype);
|
||||
GameLib.System.prototype.constructor = GameLib.System;
|
||||
|
||||
GameLib.System.SYSTEM_TYPE_NONE = 0x0;
|
||||
GameLib.System.SYSTEM_TYPE_RENDER = 0x1;
|
||||
GameLib.System.SYSTEM_TYPE_ANIMATION = 0x2;
|
||||
GameLib.System.SYSTEM_TYPE_INPUT = 0x4;
|
||||
GameLib.System.SYSTEM_TYPE_STORAGE = 0x8;
|
||||
GameLib.System.SYSTEM_TYPE_GUI = 0x10;
|
||||
GameLib.System.SYSTEM_TYPE_PHYSICS = 0x20;
|
||||
GameLib.System.SYSTEM_TYPE_LINKING = 0x40;
|
||||
GameLib.System.SYSTEM_TYPE_CUSTOM = 0x80;
|
||||
GameLib.System.SYSTEM_TYPE_ALL = 0xFFFF;
|
||||
GameLib.System.SYSTEM_TYPE_NONE = 0x0;
|
||||
GameLib.System.SYSTEM_TYPE_RENDER = 0x1;
|
||||
GameLib.System.SYSTEM_TYPE_ANIMATION = 0x2;
|
||||
GameLib.System.SYSTEM_TYPE_INPUT = 0x4;
|
||||
GameLib.System.SYSTEM_TYPE_STORAGE = 0x8;
|
||||
GameLib.System.SYSTEM_TYPE_GUI = 0x10;
|
||||
GameLib.System.SYSTEM_TYPE_PHYSICS = 0x20;
|
||||
GameLib.System.SYSTEM_TYPE_LINKING = 0x40;
|
||||
GameLib.System.SYSTEM_TYPE_CUSTOM = 0x80;
|
||||
GameLib.System.SYSTEM_TYPE_VISUALIZATION = 0x100;
|
||||
GameLib.System.SYSTEM_TYPE_ALL = 0xFFFF;
|
||||
|
||||
GameLib.System.prototype.createInstance = function() {
|
||||
//console.log('GameLib.System.prototype.createInstance();');
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* System takes care of updating all the entities (based on their component data)
|
||||
* @param apiSystem GameLib.API.System
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.System.Animation = function(
|
||||
apiSystem
|
||||
) {
|
||||
GameLib.System.call(
|
||||
this,
|
||||
apiSystem
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.System.Animation.prototype = Object.create(GameLib.System.prototype);
|
||||
GameLib.System.Animation.prototype.constructor = GameLib.System.Animation;
|
||||
|
||||
GameLib.System.Animation.prototype.start = function() {
|
||||
console.log('todo: animation system start');
|
||||
};
|
||||
|
||||
|
||||
GameLib.System.Animation.prototype.stop = function() {
|
||||
console.log('todo: animation system stop');
|
||||
};
|
||||
|
|
@ -75,7 +75,7 @@ GameLib.System.GUI.prototype.start = function() {
|
|||
return this.params.closed;
|
||||
},
|
||||
set: function(v) {
|
||||
console.log('override here too');
|
||||
// console.log('override here too');
|
||||
|
||||
this.params.closed = v;
|
||||
if (this.params.closed) {
|
||||
|
@ -451,7 +451,17 @@ GameLib.System.GUI.prototype.buildArrayManagerControl = function(
|
|||
componentTemplate.affected.map(function (component) {
|
||||
if (component[property].indexOf(activeSelection.component) === -1) {
|
||||
component[property].push(activeSelection.component);
|
||||
addArrayItem(activeSelection.component, component[property].length - 1);
|
||||
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.ARRAY_ITEM_ADDED,
|
||||
{
|
||||
component : component,
|
||||
property : property,
|
||||
item : activeSelection.component
|
||||
}
|
||||
);
|
||||
|
||||
// addArrayItem(activeSelection.component, component[property].length - 1);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -631,7 +641,18 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
|
|||
}
|
||||
)
|
||||
);
|
||||
} else if (property === 'meshType') {
|
||||
} else if (property === 'solverType') {
|
||||
controllers.push(
|
||||
folder.add(
|
||||
object,
|
||||
property,
|
||||
{
|
||||
'gs': GameLib.D3.Solver.GS_SOLVER,
|
||||
'split': GameLib.D3.Solver.SPLIT_SOLVER
|
||||
}
|
||||
)
|
||||
);
|
||||
} else if (property === 'meshType') {
|
||||
controllers.push(
|
||||
folder.add(
|
||||
object,
|
||||
|
@ -641,7 +662,9 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
|
|||
'curve' : GameLib.D3.Mesh.MESH_TYPE_CURVE,
|
||||
'skinned' : GameLib.D3.Mesh.MESH_TYPE_SKINNED,
|
||||
'plane' : GameLib.D3.Mesh.MESH_TYPE_PLANE,
|
||||
'sphere' : GameLib.D3.Mesh.MESH_TYPE_SPHERE
|
||||
'sphere' : GameLib.D3.Mesh.MESH_TYPE_SPHERE,
|
||||
'box' : GameLib.D3.Mesh.MESH_TYPE_BOX,
|
||||
'cylinder' : GameLib.D3.Mesh.MESH_TYPE_CYLINDER
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@ -968,6 +991,7 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
|
|||
controllers.push(folder.add(object, property, 0, 10, 0.001));
|
||||
} else if (
|
||||
property === 'widthSegments' ||
|
||||
property === 'radiusSegments' ||
|
||||
property === 'heightSegments'
|
||||
) {
|
||||
controllers.push(folder.add(object, property, 1, 1000, 1));
|
||||
|
@ -990,7 +1014,15 @@ GameLib.System.GUI.prototype.buildControl = function(folder, componentTemplate,
|
|||
property === 'rotationFactor'
|
||||
) {
|
||||
controllers.push(folder.add(object, property, -100, 100, 0.001));
|
||||
} else {
|
||||
} else if (
|
||||
property === 'radius'
|
||||
) {
|
||||
controllers.push(folder.add(object, property, 0, 1000, 0.01));
|
||||
} else if (
|
||||
property === 'thetaLength'
|
||||
) {
|
||||
controllers.push(folder.add(object, property, -Math.PI * 2, Math.PI * 2, 0.01));
|
||||
} else {
|
||||
controllers.push(folder.add(object, property, -10000, 10000, grain));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,8 @@ GameLib.System.Linking = function(
|
|||
this.meshDeletedSubscription = null;
|
||||
this.imageChangedSubscription = null;
|
||||
this.materialTypeChangedSubscription = null;
|
||||
this.shapeInstanceCreatedSubscription = null;
|
||||
this.arrayItemAddedSubscription = null;
|
||||
this.instanceCreatedSubscription = null;
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype = Object.create(GameLib.System.prototype);
|
||||
|
@ -110,10 +111,15 @@ GameLib.System.Linking.prototype.start = function() {
|
|||
this.materialTypeChanged
|
||||
);
|
||||
|
||||
this.shapeInstanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.SHAPE_INSTANCE_CREATED,
|
||||
this.shapeInstanceCreated
|
||||
this.instanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.INSTANCE_CREATED,
|
||||
this.instanceCreated
|
||||
);
|
||||
|
||||
this.arrayItemAddedSubscription = this.subscribe(
|
||||
GameLib.Event.ARRAY_ITEM_ADDED,
|
||||
this.arrayItemAdded
|
||||
)
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.link = function(component, data) {
|
||||
|
@ -242,7 +248,7 @@ GameLib.System.Linking.prototype.resolveDependencies = function(component) {
|
|||
*/
|
||||
var index = parentComponent.dependencies.indexOf(component.id);
|
||||
if (index === -1) {
|
||||
console.warn('dependency mismatch');
|
||||
// console.warn('dependency mismatch');
|
||||
} else {
|
||||
parentComponent.dependencies.splice(index, 1);
|
||||
}
|
||||
|
@ -366,7 +372,7 @@ GameLib.System.Linking.prototype.registerDependencies = function(component) {
|
|||
/**
|
||||
* Don't store duplicate dependencies
|
||||
*/
|
||||
if (this.dependencies[id].indexOf(component === -1)) {
|
||||
if (this.dependencies[id].indexOf(component) === -1) {
|
||||
this.dependencies[id].push(component);
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.UNRESOLVED_DEPENDENCIES_UPDATE,
|
||||
|
@ -506,6 +512,15 @@ GameLib.System.Linking.prototype.imageChanged = function(data) {
|
|||
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.arrayItemAdded = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.arrayItemRemoved = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.instanceCreated = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.meshInstanceCreated = function(data) {
|
||||
|
||||
this.resolveDependencies(data.mesh);
|
||||
|
@ -559,46 +574,16 @@ GameLib.System.Linking.prototype.meshInstanceCreated = function(data) {
|
|||
wheel.parentMesh = data.mesh;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.shapeInstanceCreated = function(data) {
|
||||
|
||||
/**
|
||||
* When a shape instance is created, just check if the parentMesh is loaded somewhere and set it.
|
||||
*
|
||||
* We also do the reverse, when a mesh instance is created, we check if its the parent of any shape.
|
||||
* Link Parent Meshes for rigidbodies
|
||||
*/
|
||||
var meshes = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.Mesh);
|
||||
meshes.map(
|
||||
function(mesh) {
|
||||
if (data.shape.parentMesh === mesh.id) {
|
||||
data.shape.parentMesh = mesh;
|
||||
}
|
||||
var rigidBodies = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RigidBody);
|
||||
rigidBodies.map(function(rigidBody){
|
||||
if (rigidBody.parentMesh === data.mesh.id) {
|
||||
rigidBody.parentMesh = data.mesh;
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* We need to now, find the rigid bodies to which the shape belongs, and add it - also the reverse ?
|
||||
*
|
||||
* this is not ok - because we are not dealing with links to parent objects - these are dependencies which need
|
||||
* to be resolved - an array of dependencies... eeek...
|
||||
*/
|
||||
// var rigidBodies = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RigidBody);
|
||||
// rigidBodies.map(function(rigidBody){
|
||||
//
|
||||
// rigidBody.shapes = rigidBody.shapes.reduce(
|
||||
// function(result, shape) {
|
||||
// if (shape === data.shape.id) {
|
||||
// result.push(data.shape);
|
||||
// }
|
||||
// return result;
|
||||
// },
|
||||
// []
|
||||
// );
|
||||
//
|
||||
// });
|
||||
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
GameLib.System.Linking.prototype.lightInstanceCreated = function(data) {
|
||||
|
@ -867,6 +852,7 @@ GameLib.System.Linking.prototype.stop = function() {
|
|||
this.meshDeletedSubscription.remove();
|
||||
this.imageChangedSubscription.remove();
|
||||
this.materialTypeChangedSubscription.remove();
|
||||
this.shapeInstanceCreatedSubscription.remove();
|
||||
this.instanceCreatedSubscription.remove();
|
||||
this.arrayItemAddedSubscription.remove();
|
||||
};
|
||||
|
||||
|
|
|
@ -12,77 +12,227 @@ GameLib.System.Physics = function(
|
|||
apiSystem
|
||||
);
|
||||
|
||||
this.worldSubscription = null;
|
||||
this.rigidBodySubscription = null;
|
||||
this.worlds = [];
|
||||
this.rigidBodies = [];
|
||||
this.wheels = [];
|
||||
this.vehicles = [];
|
||||
|
||||
this.worldSubscription = null;
|
||||
this.rigidBodySubscription = null;
|
||||
this.beforeRenderSubscription = null;
|
||||
this.afterRenderSubscription = null;
|
||||
|
||||
|
||||
this.shapeInstanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.SHAPE_INSTANCE_CREATED,
|
||||
this.shapeInstanceCreated
|
||||
);
|
||||
|
||||
this.solverInstanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.SOLVER_INSTANCE_CREATED,
|
||||
this.solverInstanceCreated
|
||||
);
|
||||
|
||||
this.physicsWorldInstanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.PHYSICS_WORLD_INSTANCE_CREATED,
|
||||
this.physicsWorldInstanceCreated
|
||||
);
|
||||
|
||||
this.instanceCreatedSubscription = this.subscribe(
|
||||
GameLib.Event.INSTANCE_CREATED,
|
||||
this.instanceCreated
|
||||
);
|
||||
|
||||
this.arrayItemAddedSubscription = this.subscribe(
|
||||
GameLib.Event.ARRAY_ITEM_ADDED,
|
||||
this.arrayItemAdded
|
||||
)
|
||||
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype = Object.create(GameLib.System.prototype);
|
||||
GameLib.System.Physics.prototype.constructor = GameLib.System.Physics;
|
||||
|
||||
GameLib.System.Physics.prototype.updateWorlds = function() {
|
||||
this.worlds = GameLib.EntityManager.Instance.query(
|
||||
[
|
||||
GameLib.D3.World
|
||||
]
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.updateRigidBodies = function() {
|
||||
this.rigidBodyEntities = GameLib.EntityManager.Instance.query(
|
||||
[
|
||||
GameLib.D3.RigidBody
|
||||
]
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.start = function() {
|
||||
|
||||
this.worldSubscription = this.subscribe(
|
||||
GameLib.Event.WORLD_INSTANCE_CREATED,
|
||||
this.updateWorlds
|
||||
this.worlds = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.PhysicsWorld);
|
||||
this.rigidBodies = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RigidBody);
|
||||
this.wheels = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RaycastWheel);
|
||||
this.vehicles = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RaycastVehicle);
|
||||
|
||||
this.worlds.map(
|
||||
function(world) {
|
||||
world.instance.addEventListener(
|
||||
'postStep',
|
||||
function() {
|
||||
|
||||
this.vehicles.map(
|
||||
function(vehicle) {
|
||||
vehicle.instance.wheelInfos.map(
|
||||
function(wheelInfo, index) {
|
||||
vehicle.instance.updateWheelTransform(index);
|
||||
var t = wheelInfo.worldTransform;
|
||||
// vehicle.wheels[index].instance.position.copy(t.position);
|
||||
// vehicle.wheels[index].instance.quaternion.copy(t.quaternion);
|
||||
|
||||
// vehicle.raycastWheels[index].parentMesh.localPosition.x = t.position.x;
|
||||
// vehicle.raycastWheels[index].parentMesh.localPosition.y = t.position.y;
|
||||
// vehicle.raycastWheels[index].parentMesh.localPosition.z = t.position.z;
|
||||
|
||||
// vehicle.raycastWheels[index].parentMesh.updateInstance();
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
}.bind(this)
|
||||
)
|
||||
}.bind(this)
|
||||
);
|
||||
|
||||
this.rigidBodySubscription = this.subscribe(
|
||||
GameLib.Event.RIGID_BODY_INSTANCE_CREATED,
|
||||
this.updateRigidBodies
|
||||
this.beforeRenderSubscription = this.subscribe(
|
||||
GameLib.Event.BEFORE_RENDER,
|
||||
this.beforeRender
|
||||
);
|
||||
|
||||
this.updateWorlds();
|
||||
|
||||
this.updateRigidBodies();
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Update script
|
||||
*/
|
||||
GameLib.System.Physics.prototype.update = function() {
|
||||
GameLib.System.Physics.prototype.beforeRender = function(data) {
|
||||
|
||||
this.worlds.map(
|
||||
function(world) {
|
||||
world.instance.step(1 / 60.0);
|
||||
|
||||
this.rigidBodies.map(
|
||||
function(rigidBody){
|
||||
rigidBody.parentMesh.position.x = rigidBody.instance.position.x;
|
||||
rigidBody.parentMesh.position.y = rigidBody.instance.position.y;
|
||||
rigidBody.parentMesh.position.z = rigidBody.instance.position.z;
|
||||
rigidBody.parentMesh.updateInstance();
|
||||
}
|
||||
)
|
||||
}.bind(this)
|
||||
);
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.solverInstanceCreated = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.arrayItemAdded = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.instanceCreated = function(data) {
|
||||
|
||||
if (data.component instanceof GameLib.D3.RaycastVehicle) {
|
||||
|
||||
var worlds = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.PhysicsWorld);
|
||||
|
||||
/**
|
||||
* First ensure our parent world is linked
|
||||
*/
|
||||
worlds.map(
|
||||
function(world) {
|
||||
if (data.component.parentWorld === world.id) {
|
||||
data.component.parentWorld = world;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
if (!data.component.parentWorld) {
|
||||
console.log('no parent world');
|
||||
} else {
|
||||
data.component.instance.addToWorld(data.component.parentWorld.instance);
|
||||
console.log('raycast vehicle instance added to its parent world');
|
||||
}
|
||||
}
|
||||
|
||||
if (data.component instanceof GameLib.D3.RigidBody) {
|
||||
var meshes = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.Mesh);
|
||||
|
||||
meshes.map(
|
||||
function(mesh) {
|
||||
if (data.component.parentMesh === mesh.id) {
|
||||
data.component.parentMesh = mesh;
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.physicsWorldInstanceCreated = function(data) {
|
||||
|
||||
var raycastVehicles = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RaycastVehicle);
|
||||
|
||||
raycastVehicles.map(
|
||||
function(vehicle) {
|
||||
if (vehicle.parentWorld === data.world.id) {
|
||||
vehicle.parentWorld = data.world;
|
||||
// vehicle.instance.addToWorld(data.world.instance);
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
// var contactMaterials = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.FrictionContactMaterial);
|
||||
//
|
||||
// data.world.contactMaterials.map(
|
||||
// function() {
|
||||
// if ()
|
||||
// }
|
||||
// );
|
||||
|
||||
};
|
||||
|
||||
|
||||
GameLib.System.Physics.prototype.shapeInstanceCreated = function(data) {
|
||||
|
||||
/**
|
||||
* TODO: progress the world according to delta time
|
||||
* When a shape instance is created, just check if the parentMesh is loaded somewhere and set it.
|
||||
*
|
||||
* We also do the reverse, when a mesh instance is created, we check if its the parent of any shape.
|
||||
*/
|
||||
this.worlds.map(function(
|
||||
world
|
||||
){
|
||||
world.step(1 / 60.0);
|
||||
});
|
||||
var meshes = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.Mesh);
|
||||
meshes.map(
|
||||
function(mesh) {
|
||||
if (data.shape.parentMesh === mesh.id) {
|
||||
data.shape.parentMesh = mesh;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
this.rigidBodyEntities.map(
|
||||
/**
|
||||
* We need to now, find the rigid bodies to which the shape belongs, and add it - also the reverse ?
|
||||
*
|
||||
* this is not ok - because we are not dealing with links to parent objects - these are dependencies which need
|
||||
* to be resolved - an array of dependencies... eeek...
|
||||
*/
|
||||
// var rigidBodies = GameLib.EntityManager.Instance.queryComponents(GameLib.D3.RigidBody);
|
||||
// rigidBodies.map(function(rigidBody){
|
||||
//
|
||||
// rigidBody.shapes = rigidBody.shapes.reduce(
|
||||
// function(result, shape) {
|
||||
// if (shape === data.shape.id) {
|
||||
// result.push(data.shape);
|
||||
// }
|
||||
// return result;
|
||||
// },
|
||||
// []
|
||||
// );
|
||||
//
|
||||
// });
|
||||
|
||||
function (rigidBody) {
|
||||
|
||||
/**
|
||||
* TODO: update mesh position based on rigidbody position
|
||||
*/
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
GameLib.System.Physics.prototype.stop = function() {
|
||||
|
||||
this.worlds = [];
|
||||
this.rigidBodyEntities = [];
|
||||
this.worlds = [];
|
||||
this.rigidBodies = [];
|
||||
this.wheels = [];
|
||||
this.vehicles = [];
|
||||
|
||||
if (this.worldSubscription) {
|
||||
this.worldSubscription.remove();
|
||||
|
@ -91,5 +241,20 @@ GameLib.System.Physics.prototype.stop = function() {
|
|||
if (this.rigidBodySubscription) {
|
||||
this.rigidBodySubscription.remove();
|
||||
}
|
||||
|
||||
if (this.beforeRenderSubscription) {
|
||||
this.beforeRenderSubscription.remove();
|
||||
}
|
||||
|
||||
if (this.afterRenderSubscription) {
|
||||
this.afterRenderSubscription.remove();
|
||||
}
|
||||
|
||||
this.shapeInstanceCreatedSubscription.remove();
|
||||
this.solverInstanceCreatedSubscription.remove();
|
||||
this.physicsWorldInstanceCreatedSubscription.remove();
|
||||
this.instanceCreatedSubscription.remove();
|
||||
this.arrayItemAddedSubscription.remove();
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -46,11 +46,22 @@ GameLib.System.Render.prototype.start = function() {
|
|||
* Render subscription script
|
||||
*/
|
||||
GameLib.System.Render.prototype.render = function(data) {
|
||||
this.renderers.map(
|
||||
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.BEFORE_RENDER,
|
||||
data
|
||||
);
|
||||
|
||||
this.renderers.map(
|
||||
function (renderer) {
|
||||
renderer.render(data.delta);
|
||||
}
|
||||
);
|
||||
|
||||
GameLib.Event.Emit(
|
||||
GameLib.Event.AFTER_RENDER,
|
||||
data
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -377,7 +377,7 @@ GameLib.System.Storage.prototype.loadComponent = function(toProcess, includeDepe
|
|||
}
|
||||
|
||||
if (!runtimeComponent) {
|
||||
throw new Error('Could not create a runtime component: ', component);
|
||||
throw new Error('Could not create a runtime component: ' + component.name);
|
||||
}
|
||||
|
||||
if (parentEntity !== null) {
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
/**
|
||||
* System takes care of updating all the entities (based on their component data)
|
||||
* Visualization System takes care of visualizing all objects which are not meshes (like physics data)
|
||||
*
|
||||
* @param apiSystem GameLib.API.System
|
||||
* @param graphics
|
||||
* @param physics
|
||||
* @constructor
|
||||
*/
|
||||
GameLib.System.Visualization = function(
|
||||
apiSystem,
|
||||
graphics,
|
||||
physics
|
||||
) {
|
||||
|
||||
GameLib.System.call(
|
||||
this,
|
||||
apiSystem
|
||||
);
|
||||
|
||||
this.graphics = graphics;
|
||||
this.graphics.isNotThreeThrow();
|
||||
|
||||
this.physics = physics;
|
||||
this.physics.isNotCannonThrow();
|
||||
|
||||
this.visualizationSubscription = null;
|
||||
this.stopVisualizationSubscription = null;
|
||||
|
||||
};
|
||||
|
||||
GameLib.System.Visualization.prototype = Object.create(GameLib.System.prototype);
|
||||
GameLib.System.Visualization.prototype.constructor = GameLib.System.Visualization;
|
||||
|
||||
GameLib.System.Visualization.prototype.start = function() {
|
||||
|
||||
this.visualizationSubscription = this.subscribe(
|
||||
GameLib.Event.VISUALIZE,
|
||||
this.visualize
|
||||
);
|
||||
|
||||
this.stopVisualizationSubscription = this.subscribe(
|
||||
GameLib.Event.STOP_VISUALIZE,
|
||||
this.stopVisualize
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
GameLib.System.Visualization.prototype.visualize = function(data) {
|
||||
|
||||
var shape = this.instance;
|
||||
|
||||
var geometry = new THREE.Geometry();
|
||||
|
||||
var v0 = new CANNON.Vec3();
|
||||
var v1 = new CANNON.Vec3();
|
||||
var v2 = new CANNON.Vec3();
|
||||
for (var xi = 0; xi < shape.data.length - 1; xi++) {
|
||||
for (var yi = 0; yi < shape.data[xi].length - 1; yi++) {
|
||||
for (var k = 0; k < 2; k++) {
|
||||
shape.getConvexTrianglePillar(xi, yi, k===0);
|
||||
v0.copy(shape.pillarConvex.vertices[0]);
|
||||
v1.copy(shape.pillarConvex.vertices[1]);
|
||||
v2.copy(shape.pillarConvex.vertices[2]);
|
||||
v0.vadd(shape.pillarOffset, v0);
|
||||
v1.vadd(shape.pillarOffset, v1);
|
||||
v2.vadd(shape.pillarOffset, v2);
|
||||
geometry.vertices.push(
|
||||
new THREE.Vector3(v0.x, v0.y, v0.z),
|
||||
new THREE.Vector3(v1.x, v1.y, v1.z),
|
||||
new THREE.Vector3(v2.x, v2.y, v2.z)
|
||||
);
|
||||
var i = geometry.vertices.length - 3;
|
||||
geometry.faces.push(new THREE.Face3(i, i+1, i+2));
|
||||
}
|
||||
}
|
||||
}
|
||||
geometry.computeBoundingSphere();
|
||||
geometry.computeFaceNormals();
|
||||
mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial());
|
||||
|
||||
this.mesh = mesh;
|
||||
};
|
||||
|
||||
GameLib.System.Visualization.prototype.stopVisualize = function(data) {
|
||||
};
|
||||
|
||||
GameLib.System.Visualization.prototype.stop = function() {
|
||||
|
||||
if (this.visualizationSubscription) {
|
||||
this.visualizationSubscription.remove();
|
||||
}
|
||||
|
||||
if (this.stopVisualizationSubscription) {
|
||||
this.stopVisualizationSubscription.remove();
|
||||
}
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue