From 0db4ebea95ac4607dbf2d792d0147d83648ec521 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 29 May 2014 17:45:15 +0200 Subject: [PATCH] WIP WheelPair --- src/Components/WheelPair.h | 3 +- src/GameWorld.cpp | 134 ++++++++++-------- src/GameWorld.h | 2 + src/Systems/WheelPairSystem.cpp | 35 +++++ src/Systems/WheelPairSystem.h | 22 +++ vs11/Returngeance/Returngeance.vcxproj | 2 + .../Returngeance/Returngeance.vcxproj.filters | 4 + 7 files changed, 144 insertions(+), 58 deletions(-) create mode 100644 src/Systems/WheelPairSystem.cpp create mode 100644 src/Systems/WheelPairSystem.h diff --git a/src/Components/WheelPair.h b/src/Components/WheelPair.h index 4e74a82..973b5b5 100644 --- a/src/Components/WheelPair.h +++ b/src/Components/WheelPair.h @@ -8,7 +8,8 @@ namespace Components struct WheelPair : Component { - // Flag for pair wheels + EntityID FakeWheel1; + EntityID FakeWheel2; virtual WheelPair* Clone() const override { return new WheelPair(*this); } }; diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 659e628..0cf3e5e 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -247,6 +247,7 @@ void GameWorld::RegisterSystems() //m_SystemFactory.Register([this]() { return new Systems::PlayerSystem(this); }); m_SystemFactory.Register([this]() { return new Systems::FreeSteeringSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::TankSteeringSystem(this, EventBroker, ResourceManager); }); + m_SystemFactory.Register([this]() { return new Systems::WheelPairSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::SoundSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::PhysicsSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::TriggerSystem(this, EventBroker, ResourceManager); }); @@ -266,6 +267,7 @@ void GameWorld::AddSystems() //AddSystem(); AddSystem(); AddSystem(); + AddSystem(); AddSystem(); AddSystem(); AddSystem(); @@ -444,67 +446,82 @@ EntityID GameWorld::CreateTank(int playerID) float springLength = 0.3f; float suspensionStrength = 15.f; +#pragma region Pair R1 { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 3.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; + auto wheel1 = CreateEntity(tank); { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); + auto transform = AddComponent(wheel1); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel1); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel1); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel1); + auto shapetransform = AddComponent(shape); + shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; + auto boxShape = AddComponent(shape); + boxShape->Width = 0.7f; + boxShape->Height = 0.34f; + boxShape->Depth = 0.7f; + CommitEntity(shape); + } + CommitEntity(wheel1); } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - auto model = AddComponent(wheel); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; - auto Wheel = AddComponent(wheel); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = 0; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = false; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 3.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; + auto wheel2 = CreateEntity(tank); { - auto shape = CreateEntity(wheel); - auto shapetransform = AddComponent(shape); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); + auto transform = AddComponent(wheel2); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel2); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel2); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel2); + auto shapetransform = AddComponent(shape); + shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; + auto boxShape = AddComponent(shape); + boxShape->Width = 0.7f; + boxShape->Height = 0.34f; + boxShape->Depth = 0.7f; + CommitEntity(shape); + } + CommitEntity(wheel2); } - CommitEntity(wheel); - } + auto wheelPair = CreateEntity(tank); + { + auto transform = AddComponent(wheelPair); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -1.715f); + auto pair = AddComponent(wheelPair); + pair->FakeWheel1 = wheel1; + pair->FakeWheel2 = wheel2; + auto model = AddComponent(wheel2); + model->ModelFile = "Models/Tank/tankWheel.obj"; + } + } +#pragma endregion +#pragma region Pair L1 { auto wheel = CreateEntity(tank); auto transform = AddComponent(wheel); @@ -566,7 +583,8 @@ EntityID GameWorld::CreateTank(int playerID) CommitEntity(wheel); } - +#pragma endregion +#pragma region Pair R2 //Back { auto wheel = CreateEntity(tank); @@ -650,7 +668,8 @@ EntityID GameWorld::CreateTank(int playerID) CommitEntity(particleEntity); } - +#pragma endregion +#pragma region Pair L2 { auto wheel = CreateEntity(tank); auto transform = AddComponent(wheel); @@ -709,6 +728,7 @@ EntityID GameWorld::CreateTank(int playerID) CommitEntity(shape); } CommitEntity(wheel); +#pragma endregion #pragma endregion auto entity = CreateEntity(tank); diff --git a/src/GameWorld.h b/src/GameWorld.h index b777975..faf7ec4 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -20,6 +20,7 @@ #include "Systems/TriggerSystem.h" #include "Systems/TimerSystem.h" #include "Systems/DamageSystem.h" +#include "Systems/WheelPairSystem.h" #include "Components/Camera.h" #include "Components/DirectionalLight.h" @@ -47,6 +48,7 @@ #include "Components/Health.h" #include "Components/Trigger.h" #include "Components/Flag.h" +#include "Components/WheelPair.h" class GameWorld : public World { diff --git a/src/Systems/WheelPairSystem.cpp b/src/Systems/WheelPairSystem.cpp new file mode 100644 index 0000000..f0cea10 --- /dev/null +++ b/src/Systems/WheelPairSystem.cpp @@ -0,0 +1,35 @@ +#include "PrecompiledHeader.h" +#include "WheelPairSystem.h" +#include "World.h" + +void Systems::WheelPairSystem::RegisterComponents(ComponentFactory* cf) +{ + cf->Register([]() { return new Components::WheelPair(); }); +} + +void Systems::WheelPairSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto wheelPair = m_World->GetComponent(entity); + if (!wheelPair) + return; + + auto transform = m_World->GetComponent(entity); + if (!transform) + return; + auto transformFake1 = m_World->GetComponent(wheelPair->FakeWheel1); + if (!transformFake1) + return; + auto transformFake2 = m_World->GetComponent(wheelPair->FakeWheel2); + if (!transformFake2) + return; + + glm::vec3 thing = transformFake2->Position - transformFake1->Position; + glm::vec3 forward = glm::normalize(glm::vec3(thing.x, 0, thing.z)); + glm::vec3 up = glm::vec3(0, 1, 0); + + float angle = glm::acos(glm::dot(glm::normalize(thing), forward)); + float height = (thing / 2.f).y; + + transform->Position.y = height; + //transform->Orientation = glm::quat(glm::vec3()) +} \ No newline at end of file diff --git a/src/Systems/WheelPairSystem.h b/src/Systems/WheelPairSystem.h new file mode 100644 index 0000000..a2bd224 --- /dev/null +++ b/src/Systems/WheelPairSystem.h @@ -0,0 +1,22 @@ +#ifndef Systems_WheelPairSystem_h__ +#define Systems_WheelPairSystem_h__ + +#include "World.h" +#include "System.h" +#include "Components/Transform.h" +#include "Components/WheelPair.h" + +namespace Systems +{ + class WheelPairSystem : public System + { + public: + + WheelPairSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager) + : System(world, eventBroker, resourceManager) { } + + void RegisterComponents(ComponentFactory* cf) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + }; +} +#endif // Systems_WheelPairSystem_h__ diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 21e0951..137e26e 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -122,6 +122,7 @@ + @@ -226,6 +227,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 2430d0c..7238a0e 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -75,6 +75,7 @@ Gameplay\Systems + @@ -478,6 +479,9 @@ GUI + + Physics\Systems +