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;
}