PhysicsBody* PhysicsManager::CreatePhysicsBody(Entity* entity, PHYSICS_BODY_TYPE type, COLLIDER_TYPE colliderType, Vector3 position, float mass) { PhysicsBody* body; switch(type) { case PARTICLE: body = new Particle(mass); break; case RIGID_BODY: body = new RigidBody(mass); break; default: return NULL; break; } Collider* collider; SphereCollider* tempSphere; PlaneCollider* tempPlane; BoxCollider* tempBox; Matrix inertiaTensor; float massFactor = 0; switch(colliderType) { case SPHERE: tempSphere = new SphereCollider(); tempSphere->Radius = .5f; collider = tempSphere; massFactor = (2.0f / 5.0f) * mass; inertiaTensor.SetRow(1,massFactor * (.5f * .5f),0 ,0 ,0); inertiaTensor.SetRow(2,0 ,massFactor * (.5f * .5f),0 ,0); inertiaTensor.SetRow(3,0 ,0 ,massFactor * (.5f * .5f),0); inertiaTensor.SetRow(4,0 ,0 ,0 ,1); break; case PLANE: tempPlane = new PlaneCollider(); tempPlane->Normal = Vector3(0,1,0); tempPlane->PlaneOffset = 0; collider = tempPlane; break; case BOX: tempBox = new BoxCollider(); tempBox->halfSize = Vector3(.5f, .5f, .5f); collider = tempBox; massFactor = (1.0f / 12.0f) * mass; inertiaTensor.SetRow(1,massFactor * (1 + 1),0 ,0 ,0); inertiaTensor.SetRow(2,0 ,massFactor * (1 + 1),0 ,0); inertiaTensor.SetRow(3,0 ,0 ,massFactor * (1 + 1),0); inertiaTensor.SetRow(4,0 ,0 ,0 ,1); break; } body->Init(entity, collider); body->SetPosition(position); entity->SetPhysicsBody(body); entity->GetTransform()->SetPosition(position); mObjectsTracked.push_back(body); return body; }