CompoundShape works, i.e parent child physics :)

Center of mass is still bugged.
This commit is contained in:
ViktorLjung
2014-04-06 19:00:58 +02:00
parent 1d0747076f
commit a880e7f3e6
9 changed files with 196 additions and 162 deletions
+86 -130
View File
@@ -5,143 +5,98 @@ void GameWorld::Initialize()
{
World::Initialize();
std::shared_ptr<Components::Transform> transform;
std::shared_ptr<Components::Model> model;
auto camera = CreateEntity();
transform = AddComponent<Components::Transform>(camera, "Transform");
transform->Position.z = 150.f;
transform->Position.y = 100.f;
transform->Orientation = glm::quat(glm::vec3(glm::pi<float>() / 8.f, 0.f, 0.f));
auto cameraComp = AddComponent<Components::Camera>(camera, "Camera");
cameraComp->FarClip = 2000.f;
AddComponent(camera, "Input");
auto freeSteering = AddComponent<Components::FreeSteering>(camera, "FreeSteering");
auto terrain = CreateEntity();
transform = AddComponent<Components::Transform>(terrain, "Transform");
transform->Scale = glm::vec3(1000.0f);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, glm::pi<float>()/20.f));
model = AddComponent<Components::Model>(terrain, "Model");
model->ModelFile = "Models/PhysicsTest/Plane.obj";
auto physics = AddComponent<Components::Physics>(terrain, "Physics");
auto Box = AddComponent<Components::BoxShape>(terrain, "BoxShape");
Box->Width = 1;
Box->Height = 0;
Box->Depth = 1;
physics->Friction = 0.5f;
terrain = CreateEntity();
transform = AddComponent<Components::Transform>(terrain, "Transform");
transform->Scale = glm::vec3(1000.0f);
transform->Position = glm::vec3(-500, 0, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, -glm::pi<float>() / 20.f));
model = AddComponent<Components::Model>(terrain, "Model");
model->ModelFile = "Models/PhysicsTest/Plane.obj";
physics = AddComponent<Components::Physics>(terrain, "Physics");
Box = AddComponent<Components::BoxShape>(terrain, "BoxShape");
Box->Width = 1;
Box->Height = 0;
Box->Depth = 1;
physics->Friction = 0.5f;
auto Boxed = CreateEntity();
transform = AddComponent<Components::Transform>(Boxed, "Transform");
transform->Position.y = 100.f;
transform->Position.x = 4.f;
transform->Scale = glm::vec3(5.0f);
model = AddComponent<Components::Model>(Boxed, "Model");
model->ModelFile = "Models/PhysicsTest/Cube.obj";
physics = AddComponent<Components::Physics>(Boxed, "Physics");
physics->Mass = 10;
physics->Friction = 0.5f;
Box = AddComponent<Components::BoxShape>(Boxed, "BoxShape");
Box->Width = 1;
Box->Height = 1;
Box->Depth = 1;
for (int i = 0; i < 20; i++)
{
auto Sphered = CreateEntity();
transform = AddComponent<Components::Transform>(Sphered, "Transform");
transform->Position.y = 15.f;
transform->Position.x = 4.f;
transform->Scale = glm::vec3(1.0f);
model = AddComponent<Components::Model>(Sphered, "Model");
model->ModelFile = "Models/PhysicsTest/Sphere.obj";
physics = AddComponent<Components::Physics>(Sphered, "Physics");
physics->Mass = 100;
physics->Friction = 0.5f;
auto sphere = AddComponent<Components::SphereShape>(Sphered, "SphereShape");
sphere->Radius = 1;
sphere->RollingFriction = 0.5f;
{
auto tank_top = CreateEntity(Sphered);
transform = AddComponent<Components::Transform>(tank_top, "Transform");
transform->Scale = glm::vec3(1.0f/100.f);
model = AddComponent<Components::Model>(tank_top, "Model");
model->ModelFile = "Models/tank/tank_top.obj";
{
auto tank_barrel = CreateEntity(tank_top);
transform = AddComponent<Components::Transform>(tank_barrel, "Transform");
model = AddComponent<Components::Model>(tank_barrel, "Model");
model->ModelFile = "Models/tank/tank_barrel.obj";
}
}
auto camera = CreateEntity();
auto transform = AddComponent<Components::Transform>(camera, "Transform");
transform->Position.z = 150.f;
transform->Position.y = 100.f;
transform->Orientation = glm::quat(glm::vec3(glm::pi<float>() / 8.f, 0.f, 0.f));
auto cameraComp = AddComponent<Components::Camera>(camera, "Camera");
cameraComp->FarClip = 2000.f;
AddComponent(camera, "Input");
auto freeSteering = AddComponent<Components::FreeSteering>(camera, "FreeSteering");
}
/*auto tank = CreateEntity();
transform = AddComponent<Components::Transform>(tank, "Transform");
transform->Position.y = 10.f;
transform->Position.x = 4.f;
transform->Scale = glm::vec3(.01f);
model = AddComponent<Components::Model>(tank, "Model");
model->ModelFile = "Models/tank/tank_base.obj";
physics = AddComponent<Components::Physics>(tank, "Physics");
physics->Mass = 100;
physics->Friction = 0.5f;*/
/*auto sphere = AddComponent<Components::SphereShape>(tank, "SphereShape");
sphere->Radius = 10.*(1.f / .01f);
sphere->RollingFriction = 0.5f;*/
/*
Box = AddComponent<Components::BoxShape>(tank, "BoxShape");
Box->Width = 100;
Box->Height = 50;
Box->Depth = 100;*/
/*
{
auto tank_top = CreateEntity(tank);
transform = AddComponent<Components::Transform>(tank_top, "Transform");
//transform->Scale = glm::vec3(.0005f);
model = AddComponent<Components::Model>(tank_top, "Model");
model->ModelFile = "Models/tank/tank_top.obj";
auto terrain = CreateEntity();
auto transform = AddComponent<Components::Transform>(terrain, "Transform");
transform->Scale = glm::vec3(1000.0f);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(terrain, "Model");
model->ModelFile = "Models/PhysicsTest/Plane.obj";
auto physics = AddComponent<Components::Physics>(terrain, "Physics");
auto Box = AddComponent<Components::BoxShape>(terrain, "BoxShape");
Box->Width = 1;
Box->Height = 0;
Box->Depth = 1;
physics->Friction = 0.5f;
}
{
auto entity = CreateEntity();
auto transform = AddComponent<Components::Transform>(entity, "Transform");
transform->Scale = glm::vec3(1.0f);
transform->Position = glm::vec3(0, 15, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto physics = AddComponent<Components::Physics>(entity, "Physics");
physics->Mass = 10;
physics->Friction = 0.5;
auto compound = AddComponent<Components::CompoundShape>(entity, "CompoundShape");
{
auto tank_barrel = CreateEntity(tank_top);
transform = AddComponent<Components::Transform>(tank_barrel, "Transform");
//transform->Scale = glm::vec3(.0005f);
model = AddComponent<Components::Model>(tank_barrel, "Model");
model->ModelFile = "Models/tank/tank_barrel.obj";
auto entity0 = CreateEntity(entity);
auto transform = AddComponent<Components::Transform>(entity0, "Transform");
transform->Scale = glm::vec3(1.f);
auto model = AddComponent<Components::Model>(entity0, "Model");
model->ModelFile = "Models/PhysicsTest/Sphere.obj";
auto sphere = AddComponent<Components::SphereShape>(entity0, "SphereShape");
sphere->Radius = 0.5f;
}
{
auto entity1 = CreateEntity(entity);
auto transform = AddComponent<Components::Transform>(entity1, "Transform");
transform->Scale = glm::vec3(1.0f);
transform->Position = glm::vec3(-1, 1, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(entity1, "Model");
model->ModelFile = "Models/PhysicsTest/Cube.obj";
auto box = AddComponent<Components::BoxShape>(entity1, "BoxShape");
box->Width = 0.5;
box->Height = 0.5;
box->Depth = 0.5;
}
}*/
//auto light = CreateEntity();
//transform = AddComponent<Components::Transform>(light, "Transform");
//transform->Position.y = 10.f;
//auto pointLight = AddComponent<Components::PointLight>(light, "PointLight");
//pointLight->Diffuse = glm::vec3(0.1f, 0.1f, 1.0f);
//pointLight->linearAttenuation = 1.0f;
//pointLight->quadraticAttenuation = 1.0f;
{
auto entity = CreateEntity();
auto transform = AddComponent<Components::Transform>(entity, "Transform");
transform->Scale = glm::vec3(1.0f);
transform->Position = glm::vec3(1, 6, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(entity, "Model");
model->ModelFile = "Models/PhysicsTest/Cube.obj";
auto physics = AddComponent<Components::Physics>(entity, "Physics");
physics->Mass = 10;
auto box = AddComponent<Components::BoxShape>(entity, "BoxShape");
box->Width = 0.5;
box->Height = 0.5;
box->Depth = 0.5;
}
}
}
void GameWorld::Update(double dt)
@@ -165,9 +120,10 @@ void GameWorld::RegisterComponents()
m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); });
m_ComponentFactory.Register("FreeSteering", []() { return new Components::FreeSteering(); });
m_ComponentFactory.Register("Physics", []() { return new Components::Physics(); });
m_ComponentFactory.Register("CompoundShape", []() { return new Components::CompoundShape(); });
m_ComponentFactory.Register("SphereShape", []() { return new Components::SphereShape(); });
m_ComponentFactory.Register("BoxShape", []() { return new Components::BoxShape(); });
m_ComponentFactory.Register("Physics", []() { return new Components::Physics(); });
}