diff --git a/src/Components/TankSteering.h b/src/Components/TankSteering.h index 2c4b123..c47c5c8 100644 --- a/src/Components/TankSteering.h +++ b/src/Components/TankSteering.h @@ -7,7 +7,6 @@ namespace Components { struct TankSteering : Component { - EntityID Player; EntityID Turret; EntityID Barrel; TankSteering* Clone() const override { return new TankSteering(*this); } diff --git a/src/Components/WheelPair.h b/src/Components/WheelPair.h index 4e74a82..24bc598 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 FakeWheelFront; + EntityID FakeWheelBack; virtual WheelPair* Clone() const override { return new WheelPair(*this); } }; diff --git a/src/GUI/Frame.h b/src/GUI/Frame.h index 85f756d..fccd65b 100644 --- a/src/GUI/Frame.h +++ b/src/GUI/Frame.h @@ -32,12 +32,14 @@ public: , Rectangle() , m_Name("UIParent") , m_Layer(0) + , m_Hidden(false) { } // Create a frame as a child Frame(Frame* parent, std::string name) : m_Name(name) , m_Layer(0) + , m_Hidden(false) { SetParent(std::shared_ptr(parent)); } ::RenderQueuePair RenderQueue; @@ -74,6 +76,9 @@ public: std::string Name() const { return m_Name; } void SetName(std::string val) { m_Name = val; } int Layer() const { return m_Layer; } + bool Hidden() const { return m_Hidden; } + void Hide() { m_Hidden = true; } + void Show() { m_Hidden = false; } int Left() const override { @@ -105,6 +110,9 @@ public: void UpdateLayered(double dt) { + if (this->Hidden()) + return; + // Update ourselves this->Update(dt); @@ -115,6 +123,8 @@ public: for (auto &pairChild : children) { auto child = pairChild.second; + if (child->Hidden()) + continue; child->Update(dt); } } @@ -123,6 +133,9 @@ public: void DrawLayered(std::shared_ptr renderer) { + if (this->Hidden()) + return; + // Draw ourselves renderer->SetViewport(AbsoluteRectangle()); this->Draw(renderer); @@ -134,6 +147,8 @@ public: for (auto &pairChild : children) { auto child = pairChild.second; + if (child->Hidden()) + continue; Rectangle rect = child->AbsoluteRectangle(); renderer->SetViewport(rect); child->Draw(renderer); @@ -149,7 +164,8 @@ protected: std::string m_Name; int m_Layer; - + bool m_Hidden; + std::shared_ptr m_Parent; typedef std::multimap> Children_t; // name -> frame std::map m_Children; // layer -> Children_t diff --git a/src/GUI/GameFrame.h b/src/GUI/GameFrame.h index d99bc64..791baa1 100644 --- a/src/GUI/GameFrame.h +++ b/src/GUI/GameFrame.h @@ -18,32 +18,47 @@ public: GameFrame(Frame* parent, std::string name) : Frame(parent, name) { + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &GameFrame::OnKeyUp); + m_World = std::make_shared(EventBroker, ResourceManager); auto worldFrame = new WorldFrame(this, "GameWorldFrame", m_World); { vp1 = new Viewport(worldFrame, "Viewport1", m_World); vp1->X = 0; vp1->Width = 640; - vp1->Height = 720 / 2; //new PlayerHUD(vp1, "PlayerHUD", m_World, 1); vp2 = new Viewport(worldFrame, "Viewport2", m_World); vp2->X = vp1->Right(); vp2->Width = 640; - vp2->Height = 720 / 2; //new PlayerHUD(vp2, "PlayerHUD", m_World, 2); - auto vpc = new Viewport(worldFrame, "ViewportFreeCam", m_World); - vpc->Y = 720 / 2; - vpc->Height = 720 / 2; + m_FreeCamViewport = new Viewport(worldFrame, "ViewportFreeCam", m_World); + m_FreeCamViewport->Show(); } m_World->Initialize(); } private: + EventRelay m_EKeyUp; + std::shared_ptr m_World; Viewport* vp1; Viewport* vp2; + Viewport* m_FreeCamViewport; + + bool OnKeyUp(const Events::KeyUp &event) + { + if (event.KeyCode == GLFW_KEY_1) + { + if (m_FreeCamViewport->Hidden()) + m_FreeCamViewport->Show(); + else + m_FreeCamViewport->Hide(); + } + + return true; + } }; } diff --git a/src/GUI/PlayerHUD.h b/src/GUI/PlayerHUD.h index 648230a..b094d4c 100644 --- a/src/GUI/PlayerHUD.h +++ b/src/GUI/PlayerHUD.h @@ -16,6 +16,13 @@ namespace GUI , m_PlayerID(playerID) { m_HealthOverlay = new HealthOverlay(this, "HealthOverlay", m_World, m_PlayerID); + m_Crosshair = new TextureFrame(this, "Crosshair"); + m_Crosshair->Width = 45; + m_Crosshair->Height = 45; + m_Crosshair->X = this->Width / 2.f - m_Crosshair->Width / 2.f; + m_Crosshair->Y = this->Height / 2.f - m_Crosshair->Height / 2.f; + m_Crosshair->SetTexture("Textures/GUI/crosshair.png"); + m_Crosshair->SetColor(glm::vec4(1.f, 1.f, 1.f, 0.75f)); } protected: @@ -23,6 +30,7 @@ namespace GUI int m_PlayerID; HealthOverlay* m_HealthOverlay; + TextureFrame* m_Crosshair; }; } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 60473be..2ca1bbc 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -53,12 +53,11 @@ void GameWorld::Initialize() RegisterComponents(); -#pragma region FreeCamera auto camera = CreateEntity(); { auto transform = AddComponent(camera); - transform->Position.z = 20.f; - transform->Position.y = 20.f; + transform->Position.z = 150.f; + transform->Position.y = 10.f; //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); auto cameraComp = AddComponent(camera); cameraComp->FarClip = 2000.f; @@ -70,33 +69,102 @@ void GameWorld::Initialize() e.ViewportFrame = "ViewportFreeCam"; EventBroker->Publish(e); } -#pragma endregion + + { + auto road_base = CreateEntity(); + auto transform = AddComponent(road_base); + transform->Position = glm::vec3(0, -50, 0); + auto model = AddComponent(road_base); + model->ModelFile = "Models/TerrainFiveIstles/Roads/BaseRoad.obj"; + auto physics = AddComponent(road_base); + physics->Mass = 10; + physics->Static = true; + physics->CollisionLayer = 1; + + auto groundshape = CreateEntity(road_base); + auto transformshape = AddComponent(groundshape); + auto meshShape = AddComponent(groundshape); + meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/BaseRoad.obj"; + + + CommitEntity(groundshape); + CommitEntity(road_base); + } + + { + auto road_middle = CreateEntity(); + auto transform = AddComponent(road_middle); + transform->Position = glm::vec3(0, -50, 0); + auto model = AddComponent(road_middle); + model->ModelFile = "Models/TerrainFiveIstles/Roads/MiddleRoad.obj"; + auto physics = AddComponent(road_middle); + physics->Mass = 10; + physics->Static = true; + physics->CollisionLayer = 1; + + auto groundshape = CreateEntity(road_middle); + auto transformshape = AddComponent(groundshape); + auto meshShape = AddComponent(groundshape); + meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/MiddleRoad.obj"; + + + CommitEntity(groundshape); + CommitEntity(road_middle); + } + + { + auto road_small = CreateEntity(); + auto transform = AddComponent(road_small); + transform->Position = glm::vec3(0, -50, 0); + auto model = AddComponent(road_small); + model->ModelFile = "Models/TerrainFiveIstles/Roads/SmallRoad.obj"; + auto physics = AddComponent(road_small); + physics->Mass = 10; + physics->Static = true; + physics->CollisionLayer = 1; + + auto groundshape = CreateEntity(road_small); + auto transformshape = AddComponent(groundshape); + auto meshShape = AddComponent(groundshape); + meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/SmallRoad.obj"; + + + CommitEntity(groundshape); + CommitEntity(road_small); + } + - //{ - // auto ground = CreateEntity(); - // auto transform = AddComponent(ground); - // transform->Position = glm::vec3(0, -50, 0); - // //transform->Scale = glm::vec3(400.0f, 10.0f, 400.0f); - // transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); - // auto model = AddComponent(ground); - // model->ModelFile = "Models/TestScene3/testScene.obj"; - // //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; - // - // auto physics = AddComponent(ground); - // physics->Mass = 10; - // physics->Static = true; + { + auto water = CreateEntity(); + auto transform = AddComponent(water); + transform->Position = glm::vec3(0, -35, 0); + transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); + transform->Scale = glm::vec3(5000.f, 10.f, 5000.f); + auto model = AddComponent(water); + model->ModelFile = "Models/Placeholders/PhysicsTest/Cube.obj"; + auto blendmap = AddComponent(water); + blendmap->TextureRed = "Textures/Skybox/Sky34/bottom.jpg"; + blendmap->TextureGreen = "Textures/Skybox/Sky34/bottom.jpg"; + blendmap->TextureBlue = "Textures/Skybox/Sky34/bottom.jpg"; + blendmap->TextureRepeats = 1.f; + + auto physics = AddComponent(water); + physics->Mass = 10; + physics->Static = true; + physics->CollisionLayer = 1; + { + + auto groundshape = CreateEntity(water); + auto box = AddComponent(groundshape); + box->Depth = 250.f; + box->Height = 5.f; + box->Width = 250.f; - // auto groundshape = CreateEntity(ground); - // auto transformshape = AddComponent(groundshape); - // auto meshShape = AddComponent(groundshape); - // //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; - // meshShape->ResourceName = "Models/TestScene3/testScene.obj"; - - // - // CommitEntity(groundshape); - // CommitEntity(ground); - //} + CommitEntity(groundshape); + } + CommitEntity(water); + } { auto ground_middle = CreateEntity(); @@ -107,9 +175,9 @@ void GameWorld::Initialize() model->ModelFile = "Models/TerrainFiveIstles/Middle.obj"; auto blendmap = AddComponent(ground_middle); blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg"; - blendmap->TextureBlueNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; + blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg"; - blendmap->TextureBlueNormal = "Textures/Ground/Grass0126_2_SNM.png"; + blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png"; blendmap->TextureBlue = "Textures/Ground/Cliffs2.png"; blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png"; blendmap->TextureRepeats = 30.f; @@ -137,9 +205,12 @@ void GameWorld::Initialize() auto model = AddComponent(ground_small); model->ModelFile = "Models/TerrainFiveIstles/Small.obj"; auto blendmap = AddComponent(ground_small); - blendmap->TextureRed = "Textures/Ground/Sand.png"; - blendmap->TextureGreen = "Textures/Ground/Grass.png"; - blendmap->TextureBlue = "Textures/Ground/Asphalt.png"; + blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg"; + blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; + blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg"; + blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png"; + blendmap->TextureBlue = "Textures/Ground/Cliffs2.png"; + blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png"; blendmap->TextureRepeats = 30.f; auto physics = AddComponent(ground_small); @@ -165,9 +236,12 @@ void GameWorld::Initialize() auto model = AddComponent(ground_small_mirrored); model->ModelFile = "Models/TerrainFiveIstles/Small.obj"; auto blendmap = AddComponent(ground_small_mirrored); - blendmap->TextureRed = "Textures/Ground/Sand.png"; - blendmap->TextureGreen = "Textures/Ground/Grass.png"; - blendmap->TextureBlue = "Textures/Ground/Asphalt.png"; + blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg"; + blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; + blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg"; + blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png"; + blendmap->TextureBlue = "Textures/Ground/Cliffs2.png"; + blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png"; blendmap->TextureRepeats = 30.f; auto physics = AddComponent(ground_small_mirrored); @@ -193,9 +267,12 @@ void GameWorld::Initialize() auto model = AddComponent(ground_base); model->ModelFile = "Models/TerrainFiveIstles/Base.obj"; auto blendmap = AddComponent(ground_base); - blendmap->TextureRed = "Textures/Ground/Sand.png"; - blendmap->TextureGreen = "Textures/Ground/Grass.png"; - blendmap->TextureBlue = "Textures/Ground/Asphalt.png"; + blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg"; + blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; + blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg"; + blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png"; + blendmap->TextureBlue = "Textures/Ground/Cliffs2.png"; + blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png"; blendmap->TextureRepeats = 30.f; auto physics = AddComponent(ground_base); @@ -221,9 +298,12 @@ void GameWorld::Initialize() auto model = AddComponent(ground_base_mirrored); model->ModelFile = "Models/TerrainFiveIstles/Base.obj"; auto blendmap = AddComponent(ground_base_mirrored); - blendmap->TextureRed = "Textures/Ground/Sand.png"; - blendmap->TextureGreen = "Textures/Ground/Grass.png"; - blendmap->TextureBlue = "Textures/Ground/Asphalt.png"; + blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg"; + blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png"; + blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg"; + blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png"; + blendmap->TextureBlue = "Textures/Ground/Cliffs2.png"; + blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png"; blendmap->TextureRepeats = 30.f; auto physics = AddComponent(ground_base_mirrored); @@ -244,27 +324,40 @@ void GameWorld::Initialize() { /* auto tree = CreateEntity(); auto transform = AddComponent(tree); - transform->Position = glm::vec3(0, -15, 0); + transform->Position = glm::vec3(0, -10, 0); auto model = AddComponent(tree); - model->ModelFile = "Models/Tree/leafs/Leafs.obj"; + model->ModelFile = "Models/Tree/Stem/Stem.obj"; + auto physics = AddComponent(tree); + physics->Mass = 100.f; + physics->Static = false; + physics->CalculateCenterOfMass = true; + { + auto leafs = CreateEntity(tree); + auto transform = AddComponent(leafs); + auto model = AddComponent(leafs); + model->ModelFile = "Models/Tree/Leafs/Leafs.obj"; model->Transparent = true; + CommitEntity(leafs); + } + { + auto shape = CreateEntity(tree); + auto transform = AddComponent(shape); + auto box = AddComponent(shape); + transform->Position = glm::vec3(0.f, 0.f, 2.29552f); + box->Width = 0.296f; + box->Height = 2.511f; + box->Depth = 0.296f; + } + CommitEntity(tree);*/ - -// auto thing = CreateEntity(); -// auto transform = AddComponent(thing); -// transform->Position = glm::vec3(0,15,0); -// transform->Scale = glm::vec3(3); -// // auto model = AddComponent(thing); -// // model->ModelFile = "Models/Barrel/Barrel.obj"; -// auto sprite = AddComponent(thing); -// sprite->SpriteFile = "Textures/Sprites/SeriousParticle.png"; } EntityID tank1 = CreateTank(1); { auto transform = GetComponent(tank1); + transform->Position.z = 50; transform->Position.z = 50.f; Events::SetViewportCamera e; @@ -333,6 +426,69 @@ void GameWorld::Initialize() //} + { + auto gateBase = CreateEntity(); + auto transform = AddComponent(gateBase); + transform->Position = glm::vec3(0, -50, 150); + auto model = AddComponent(gateBase); + model->ModelFile = "Models/Gate/Lift/Lift.obj"; + + auto physics = AddComponent(gateBase); + physics->Static = true; + physics->CollisionLayer = 1; // Terrain-Layer + { + auto leftBaseShape = CreateEntity(gateBase); + auto transform = AddComponent(leftBaseShape); + transform->Position = glm::vec3(8.5f, 3, 0); + auto box = AddComponent(leftBaseShape); + box->Width = 3.f/2; + box->Height = 6.094f/2; + box->Depth = 4.f/2; + CommitEntity(leftBaseShape); + } + { + auto RightBaseShape = CreateEntity(gateBase); + auto transform = AddComponent(RightBaseShape); + transform->Position = glm::vec3(-8.5f, 3, 0); + auto box = AddComponent(RightBaseShape); + box->Width = 3.f/2; + box->Height = 6.094f/2; + box->Depth = 4.f/2; + CommitEntity(RightBaseShape); + } + { + auto LeftTopShape = CreateEntity(gateBase); + auto transform = AddComponent(LeftTopShape); + transform->Position = glm::vec3(7.5485f, 9.385f, 0); + auto box = AddComponent(LeftTopShape); + box->Width = 1.747f/2; + box->Height = 6.851f/2; + box->Depth = 1.767f/2; + CommitEntity(LeftTopShape); + } + { + auto RightTopShape = CreateEntity(gateBase); + auto transform = AddComponent(RightTopShape); + transform->Position = glm::vec3(-7.5485f, 9.385f, 0); + auto box = AddComponent(RightTopShape); + box->Width = 1.747f/2; + box->Height = 6.851f/2; + box->Depth = 1.767f/2; + CommitEntity(RightTopShape); + } + { + auto RampShape = CreateEntity(gateBase); + auto transform = AddComponent(RampShape); + transform->Position = glm::vec3(0, 0.24f, 0); + auto box = AddComponent(RampShape); + box->Width = 14.9f/2; + box->Height = 0.38f/2; + box->Depth = 1.484f/2; + CommitEntity(RampShape); + } + CommitEntity(gateBase); + } + } void GameWorld::Update(double dt) @@ -346,7 +502,6 @@ void GameWorld::RegisterComponents() m_ComponentFactory.Register([]() { return new Components::Template(); }); m_ComponentFactory.Register([]() { return new Components::Player(); }); m_ComponentFactory.Register([]() { return new Components::Flag(); }); - m_ComponentFactory.Register([]() { return new Components::BlendMap(); }); } void GameWorld::RegisterSystems() @@ -362,6 +517,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); }); @@ -381,6 +537,7 @@ void GameWorld::AddSystems() //AddSystem(); AddSystem(); AddSystem(); + AddSystem(); AddSystem(); AddSystem(); AddSystem(); @@ -425,12 +582,6 @@ void GameWorld::BindGamepadButton(Gamepad::Button button, std::string command, f EntityID GameWorld::CreateTank(int playerID) { - auto playerEnt = CreateEntity(); - { - auto player = AddComponent(playerEnt); - player->ID = playerID; - } - auto tank = CreateEntity(); auto transform = AddComponent(tank); transform->Position = glm::vec3(0, 5, 0); @@ -445,7 +596,6 @@ EntityID GameWorld::CreateTank(int playerID) auto player = AddComponent(tank); player->ID = playerID; auto tankSteering = AddComponent(tank); - tankSteering->Player = playerEnt; AddComponent(tank); auto health = AddComponent(tank); health->Amount = 100.f; @@ -519,6 +669,20 @@ EntityID GameWorld::CreateTank(int playerID) } CommitEntity(shot); barrelSteering->ShotTemplate = shot; + + + auto cameraTower = CreateEntity(barrel); + { + auto transform = AddComponent(cameraTower); + transform->Position.z = 16.f; + transform->Position.y = 4.f; + transform->Orientation = glm::quat(glm::vec3(-glm::radians(5.f), 0.f, 0.f)); + auto cameraComp = AddComponent(cameraTower); + cameraComp->FarClip = 2000.f; + //auto freeSteering = AddComponent(cameraTower); + } + + SetProperty(tank, "Camera", cameraTower); } CommitEntity(barrel); tankSteering->Barrel = barrel; @@ -527,18 +691,7 @@ EntityID GameWorld::CreateTank(int playerID) tankSteering->Turret = tower; - auto cameraTower = CreateEntity(tower); - { - auto transform = AddComponent(cameraTower); - transform->Position.z = 16.f; - transform->Position.y = 4.f; - //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); - auto cameraComp = AddComponent(cameraTower); - cameraComp->FarClip = 2000.f; - //auto freeSteering = AddComponent(cameraTower); - } - - SetProperty(tank, "Camera", cameraTower); + } //{ @@ -559,192 +712,17 @@ EntityID GameWorld::CreateTank(int playerID) #pragma region Wheels //Create wheels - float wheelOffset = 0.4f; - float springLength = 0.3f; - float suspensionStrength = 15.f; - - { - 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 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); - } - 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 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); - } - CommitEntity(wheel); - } - - { - 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 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); - } - 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 = true; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 3.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - { - 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); - } - CommitEntity(wheel); - } - - - //Back - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 1.f); - 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 = 1; - 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(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); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 2.95f); - 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 = 1; - 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(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); - } - CommitEntity(wheel); + float wheelOffset = -0.83f; + const float suspensionStrength = 15.f; + const float springLength = 0.3f; + + AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, -1.715f), 0, true); + AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, -1.715f), 0, true); + AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, 2.375), 1, false); + AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, 2.375), 1, false); +#pragma endregion + // auto entity = CreateEntity(tank); // auto transformComponent = AddComponent(entity); // transformComponent->Position = glm::vec3(2, -1.7, 2.0); @@ -770,76 +748,121 @@ EntityID GameWorld::CreateTank(int playerID) // CommitEntity(particleEntity); // emitterComponent->ParticleTemplate = particleEntity; // } - } - - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 1.f); - 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 = 1; - 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(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); - } - CommitEntity(wheel); - } - { - auto wheel = CreateEntity(tank); - auto transform = AddComponent(wheel); - transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 2.95f); - 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 = 1; - 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(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); - } - CommitEntity(wheel); -#pragma endregion - - - } CommitEntity(tank); return tank; } +void GameWorld::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front) +{ + const float separation = 1.77f; + const float suspensionStrength = 15.f; + const float springLength = 0.3f; + + bool steering = front; + + auto wheelFront = CreateEntity(tankEntity); + { + auto transform = AddComponent(wheelFront); + transform->Position = position - glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); + //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); +#ifdef DEBUG + auto model = AddComponent(wheelFront); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; +#endif + auto Wheel = AddComponent(wheelFront); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = axleID; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = steering; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheelFront); + 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(wheelFront); + } + + auto wheelBack = CreateEntity(tankEntity); + { + auto transform = AddComponent(wheelBack); + transform->Position = position + glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); + //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); +#ifdef DEBUG + auto model = AddComponent(wheelBack); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; +#endif + auto Wheel = AddComponent(wheelBack); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = axleID; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = steering; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheelBack); + 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(wheelBack); + } + + auto wheelPair = CreateEntity(tankEntity); + { + { + auto transform = AddComponent(wheelPair); + transform->Position = position; + //transform->Orientation = glm::quat(glm::vec3(0, glm::pi() / 4.f, 0)); + + auto pair = AddComponent(wheelPair); + pair->FakeWheelFront = wheelFront; + pair->FakeWheelBack = wheelBack; + } + + auto modelEntity = CreateEntity(wheelPair); + { + auto transform = AddComponent(modelEntity); + //transform->Position = glm::vec3(0.f, 0.35f, 0.f); + if (front) + { + transform->Position = glm::vec3(0.f, 0.03f, 0.f); + transform->Orientation = glm::quat(glm::vec3(0, glm::pi(), 0)); + } + else + { + transform->Position = glm::vec3(0.f, 0.17f, 0.f); + transform->Scale = glm::vec3(1.f, 1.2f, 1.2f); + } + + auto model = AddComponent(modelEntity); + model->ModelFile = "Models/Tank/tankWheel.obj"; + } + CommitEntity(modelEntity); + } + CommitEntity(wheelPair); +} + EntityID GameWorld::CreateJeep(int playerID) { auto jeep = CreateEntity(); diff --git a/src/GameWorld.h b/src/GameWorld.h index 85353c6..aae2472 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" @@ -33,7 +34,6 @@ #include "Components/Template.h" #include "Components/Transform.h" #include "Components/Viewport.h" -#include "Components/BlendMap.h" #include "Components/Physics.h" #include "Components/SphereShape.h" @@ -48,6 +48,7 @@ #include "Components/Health.h" #include "Components/Trigger.h" #include "Components/Flag.h" +#include "Components/WheelPair.h" class GameWorld : public World { @@ -58,9 +59,6 @@ public: void Initialize(); - EntityID CreateTank(int playerID); - EntityID CreateJeep(int playerID); - void RegisterSystems() override; void AddSystems() override; void RegisterComponents() override; @@ -72,6 +70,10 @@ private: void BindMouseButton(int button, std::string command, float value); void BindGamepadAxis(Gamepad::Axis axis, std::string command, float value); void BindGamepadButton(Gamepad::Button button, std::string command, float value); + + EntityID CreateTank(int playerID); + void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering); + EntityID CreateJeep(int playerID); }; #endif // GameWorld_h__ diff --git a/src/Physics/VehicleSetup.cpp b/src/Physics/VehicleSetup.cpp index e319834..3568a26 100644 --- a/src/Physics/VehicleSetup.cpp +++ b/src/Physics/VehicleSetup.cpp @@ -183,7 +183,6 @@ void VehicleSetup::setupComponent(const hkpVehicleData& data, hkpVehicleDefaultE engine.m_maxRPM = vehicleComponent.MaxRPM; - engine.m_torqueFactorAtMinRPM = 0.8f; engine.m_torqueFactorAtMaxRPM = 0.8f; engine.m_resistanceFactorAtMinRPM = 0.05f; @@ -200,7 +199,7 @@ void VehicleSetup::setupComponent(const hkpVehicleData& data, hkpVehicleDefaultT transmission.m_downshiftRPM = 3500.0f; //HACK: Should be in VehicleComponent transmission.m_upshiftRPM = 7000.0f; - transmission.m_clutchDelayTime = 0.0f; + transmission.m_clutchDelayTime = 1.5f; transmission.m_reverseGearRatio = 1.0f; transmission.m_gearsRatio[0] = 3.0f; transmission.m_gearsRatio[1] = 2.25f; diff --git a/src/RenderQueue.h b/src/RenderQueue.h index 932dd69..2636f84 100644 --- a/src/RenderQueue.h +++ b/src/RenderQueue.h @@ -14,6 +14,9 @@ struct RenderJob { friend class RenderQueue; + glm::mat4 ModelMatrix; + float Depth; + protected: uint64_t Hash; @@ -37,7 +40,6 @@ struct ModelJob : RenderJob GLuint VAO; unsigned int StartIndex; unsigned int EndIndex; - glm::mat4 ModelMatrix; float Transparent; void CalculateHash() override @@ -67,7 +69,6 @@ struct SpriteJob : RenderJob GLuint Texture; glm::vec4 Color; - glm::mat4 ModelMatrix; void CalculateHash() override { @@ -82,31 +83,30 @@ public: void Add(T &job) { job.CalculateHash(); - m_Jobs.push_front(std::shared_ptr(new T(job))); + Jobs.push_front(std::shared_ptr(new T(job))); } void Sort() { - m_Jobs.sort(); + Jobs.sort(); } void Clear() { - m_Jobs.clear(); + Jobs.clear(); } std::forward_list>::const_iterator begin() { - return m_Jobs.begin(); + return Jobs.begin(); } std::forward_list>::const_iterator end() { - return m_Jobs.end(); + return Jobs.end(); } -private: - std::forward_list> m_Jobs; + std::forward_list> Jobs; }; struct RenderQueuePair diff --git a/src/Renderer.cpp b/src/Renderer.cpp index e6aa0ad..142f7ec 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -18,7 +18,7 @@ Renderer::Renderer(std::shared_ptr<::ResourceManager> resourceManager) CAtt = 1.0f; LAtt = 0.0f; QAtt = 3.0f; - m_ShadowMapRes = 2048*2; + m_ShadowMapRes = 1; m_SunPosition = glm::vec3(0.f, 1.0f, 0.5f); m_SunTarget = glm::vec3(0, 0, 0); m_SunProjection_height = glm::vec2(-40.f, 40.f); @@ -163,7 +163,7 @@ void Renderer::LoadContent() FrameBufferTextures(); m_sphereModel = ResourceManager->Load("Model", "Models/Placeholders/PhysicsTest/Sphere.obj"); - m_Skybox = std::make_shared("Textures/Skybox/Sunset", "jpg"); + m_Skybox = std::make_shared("Textures/Skybox/sky36", "jpg"); } void Renderer::Draw(double dt) @@ -369,6 +369,17 @@ void Renderer::DrawWorld(RenderQueuePair &rq) glDepthMask(GL_TRUE); glEnable(GL_SCISSOR_TEST); + //Sort forward rendering items by z value. + for(auto job : rq.Forward) + { + glm::mat4 cameraProjection = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height); + glm::mat4 cameraMatrix = cameraProjection * m_Camera->ViewMatrix(); + + glm::vec3 spritePos = glm::vec3(cameraMatrix * job->ModelMatrix * glm::vec4(1, 1, 1, 0)); + job->Depth = spritePos.z; + } + rq.Forward.Jobs.sort(Renderer::DepthSort); + //DrawShadowMap(rq.Deferred); /* @@ -392,6 +403,7 @@ void Renderer::DrawWorld(RenderQueuePair &rq) glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); + DrawSkybox(); DrawFBOScene(rq.Deferred); /* @@ -511,6 +523,8 @@ void Renderer::ForwardRendering(RenderQueue &rq) continue; } + + auto spriteJob = std::dynamic_pointer_cast(job); if (spriteJob) { @@ -593,12 +607,16 @@ void Renderer::Swap() void Renderer::DrawSkybox() { //glBindFramebuffer(GL_FRAMEBUFFER, 0); - //glViewport(0, 0, m_Width, m_Height); - //glScissor(0, 0, m_Width, m_Height); + glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); + glScissor(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_ShaderProgramSkybox.Bind(); - glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix((float)m_Width / m_Height) * glm::toMat4(glm::inverse(m_Camera->Orientation())); + + //glm::mat4 cameraProjection = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height); + //glm::mat4 cameraMatrix = cameraProjection * m_Camera->ViewMatrix(); + + glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height) * glm::inverse(glm::toMat4(m_Camera->Orientation())); glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramSkybox.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(cameraMatrix)); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); m_Skybox->Draw(); diff --git a/src/Renderer.h b/src/Renderer.h index 445601f..dacc6db 100755 --- a/src/Renderer.h +++ b/src/Renderer.h @@ -201,7 +201,8 @@ private: void CreateNormalMapTangent(); void ForwardRendering(RenderQueue &rq); - + static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) { return (i->Depth < j->Depth); } + GLuint CreateQuad(); void DrawDebugShadowMap(); GLuint CreateAABB(); diff --git a/src/Shaders/Skybox.frag.glsl b/src/Shaders/Skybox.frag.glsl index 195fa21..0c97492 100755 --- a/src/Shaders/Skybox.frag.glsl +++ b/src/Shaders/Skybox.frag.glsl @@ -12,5 +12,4 @@ out vec4 FragColor; void main() { FragColor = texture(CubemapTexture, Input.TextureCoord); - //FragColor = vec4(1.0, 1.0, 1.0, 0.0); } \ No newline at end of file diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 889d213..4d8b8ed 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -138,6 +138,7 @@ void Systems::PhysicsSystem::Initialize() e.Layer2 = EXPLOSION_LAYER; EventBroker->Publish(e); }*/ + } void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) @@ -155,6 +156,8 @@ void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) void Systems::PhysicsSystem::Update(double dt) { + + for (auto pair : *m_World->GetEntities()) { EntityID entity = pair.first; @@ -171,23 +174,36 @@ void Systems::PhysicsSystem::Update(double dt) { hkVector4 position; hkQuaternion rotation; + hkVector4 velocity; if (parent) { auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position); rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation); + velocity = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Velocity); } else { position = GLMVEC3_TO_HKVECTOR4(transformComponent->Position); rotation = GLMQUAT_TO_HKQUATERNION(transformComponent->Orientation); + velocity = GLMVEC3_TO_HKVECTOR4(transformComponent->Velocity); } m_PhysicsWorld->markForWrite(); m_RigidBodies[entity]->setPositionAndRotation(position, rotation); + m_RigidBodies[entity]->setLinearVelocity(velocity); m_PhysicsWorld->unmarkForWrite(); } +/* + + glm::vec3 pos1 = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[m_World->m_Terrain]->getPosition()); + pos1 += glm::vec3(1, 1, 1)*(float)dt; + hkVector4 pos = GLMVEC3_TO_HKVECTOR4(pos1); + + m_PhysicsWorld->markForWrite(); + m_RigidBodies[m_World->m_Terrain]->setPositionAndRotation(pos, GLMQUAT_TO_HKQUATERNION(glm::quat())); + m_PhysicsWorld->unmarkForWrite();*/ } static const double timestep = 1 / 60.0; @@ -240,11 +256,12 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p else if(m_RigidBodies.find(entity) != m_RigidBodies.end()) { auto transformComponentParent = m_World->GetComponent(parent); - transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition()); transformComponent->Orientation = HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation()); + transformComponent->Velocity = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getLinearVelocity()); // TODO: No support for Scale, MIGHT be possible + // HACK: WTF IS THIS? if (transformComponentParent) { transformComponent->Position -= transformComponentParent->Position; @@ -319,7 +336,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) } - // Create a hkpListShape* of all the childEntities collected in m_ShapeArrays hkpListShape* listShape = new hkpListShape(shapeArray.begin(), shapeArray.getSize(), hkpShapeContainer::REFERENCE_POLICY_INCREMENT); // Save the listShape for further use @@ -377,6 +393,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) } // Create RigidBody hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo); + m_RigidBodies[entity] = rigidBody; + m_RigidBodyEntities[rigidBody] = entity; auto vehicleComponent = m_World->GetComponent(entity); if (vehicleComponent && m_Vehicles.find(entity) == m_Vehicles.end()) @@ -393,7 +411,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) VehicleSetup vehicleSetup; // Create the basic vehicle. - m_Vehicles[entity] = new hkpVehicleInstance(rigidBody); + m_Vehicles[entity] = new hkpVehicleInstance(m_RigidBodies[entity]); m_PhysicsWorld->markForWrite(); vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels); // Add the vehicle's entities and phantoms to the world @@ -402,8 +420,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) rigidBody->addContactListener( m_collisionResolution ); } m_Vehicles[entity]->addToWorld(m_PhysicsWorld); - m_RigidBodies[entity] = rigidBody; - m_RigidBodyEntities[rigidBody] = entity; // The vehicle is an action @@ -423,8 +439,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) rigidBody->addContactListener( m_collisionResolution ); } m_PhysicsWorld->addEntity(rigidBody); - m_RigidBodies[entity] = rigidBody; - m_RigidBodyEntities[rigidBody] = entity; + m_PhysicsWorld->unmarkForWrite(); shape->removeReference(); @@ -576,7 +591,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) if(triggerComponent) { auto parentTransformComponent = m_World->GetComponent(entityParent); - PhantomCallbackShape* phantom = new PhantomCallbackShape(this); hkpBvShape* phantomShape = new hkpBvShape(boxShape, phantom); @@ -707,11 +721,40 @@ void HK_CALL Systems::PhysicsSystem::HavokErrorReport(const char* msg, void*) bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) { auto vehicleComponent = m_World->GetComponent(event.Entity); + if (vehicleComponent && m_Vehicles.find(event.Entity) != m_Vehicles.end() && m_RigidBodies.find(event.Entity) != m_RigidBodies.end()) { hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus; - deviceStatus->m_positionX = event.PositionX; - deviceStatus->m_positionY = event.PositionY; + auto transformComponent = m_World->GetComponent(event.Entity); + + float steeringX = event.PositionX; + + glm::vec3 velocityNormalized = glm::normalize(HKVECTOR4_TO_GLMVEC3(m_RigidBodies[event.Entity]->getLinearVelocity())); + glm::vec3 forward = glm::normalize(transformComponent->Orientation * glm::vec3(0, 0, -1)); + float dotProduct = glm::dot(forward, velocityNormalized); + + if(dotProduct < 0) + { + steeringX = (1 - (glm::clamp(abs(m_Vehicles[event.Entity]->calcKMPH() /vehicleComponent->TopSpeed), 0.f, 0.7f))) * steeringX; + } + + + if(abs(m_Vehicles[event.Entity]->calcKMPH()) < 2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180)) + { + deviceStatus->m_positionY = -0.4f; + deviceStatus->m_positionX = steeringX; + } +// else if(m_Vehicles[event.Entity]->calcKMPH() > -2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180)) +// { +// deviceStatus->m_positionY = 0.4f;; +// deviceStatus->m_positionX = -steeringX; +// } + else + { + deviceStatus->m_positionX = steeringX; + deviceStatus->m_positionY = event.PositionY; + } + if(event.PositionY > 0) { deviceStatus->m_reverseButtonPressed = true; @@ -728,6 +771,9 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) { m_PhysicsWorld->markForWrite(); m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity)); + + auto transformComponent = m_World->GetComponent(event.Entity); + transformComponent->Velocity = event.Velocity; m_PhysicsWorld->unmarkForWrite(); } return true; @@ -813,4 +859,4 @@ bool Systems::PhysicsSystem::OnDisableCollisions( const Events::DisableCollision m_PhysicsWorld->setCollisionFilter(m_CollisionFilter); m_PhysicsWorld->unmarkForWrite(); return true; -} \ No newline at end of file +} diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp index e101f30..99acd91 100755 --- a/src/Systems/RenderSystem.cpp +++ b/src/Systems/RenderSystem.cpp @@ -15,6 +15,7 @@ void Systems::RenderSystem::RegisterComponents(ComponentFactory* cf) cf->Register([]() { return new Components::PointLight(); }); cf->Register([]() { return new Components::DirectionalLight(); }); cf->Register([]() { return new Components::Viewport(); }); + cf->Register([]() { return new Components::BlendMap(); }); } void Systems::RenderSystem::OnEntityCommit(EntityID entity) diff --git a/src/Systems/RenderSystem.h b/src/Systems/RenderSystem.h index e6350db..0829f29 100755 --- a/src/Systems/RenderSystem.h +++ b/src/Systems/RenderSystem.h @@ -20,6 +20,7 @@ #include "Renderer.h" #include "RenderQueue.h" #include "Events/SetViewportCamera.h" +#include "Components/BlendMap.h" namespace Systems { diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index bf72fc7..94f4f25 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -33,7 +33,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit if(!tankSteeringComponent) return; - auto playerComponent = m_World->GetComponent(tankSteeringComponent->Player); + auto playerComponent = m_World->GetComponent(entity); if (!playerComponent) return; @@ -62,6 +62,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit if(barrelSteeringComponent) { + auto tankTransform = m_World->GetComponent(entity); auto transformComponent = m_World->GetComponent(tankSteeringComponent->Barrel); auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(tankSteeringComponent->Barrel); glm::quat orientation = glm::angleAxis(barrelSteeringComponent->TurnSpeed * inputController->BarrelDirection * (float)dt, barrelSteeringComponent->Axis); @@ -76,7 +77,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit cloneTransform->Orientation = absoluteTransform.Orientation * cloneTransform->Orientation; Events::SetVelocity eSetVelocity; eSetVelocity.Entity = clone; - eSetVelocity.Velocity = absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed); + eSetVelocity.Velocity = tankTransform->Velocity + absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed); EventBroker->Publish(eSetVelocity); m_TimeSinceLastShot[tankSteeringComponent->Barrel] = 0; @@ -87,7 +88,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit Events::ApplyPointImpulse ePointImpulse ; ePointImpulse.Entity = entity; ePointImpulse.Position = absoluteTransform.Position; - ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 1670.f; + ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 6.f * 1670.f; EventBroker->Publish(ePointImpulse); } @@ -280,13 +281,12 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E if (event.Command == "horizontal") { m_Horizontal = val; - m_Vertical = -0.4f; } else if (event.Command == "vertical") { m_Vertical = -val; } - + else if (event.Command == "handbrake") { Handbrake = val > 0; diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index f3115a6..8c996fa 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -30,6 +30,8 @@ #include "Components/FrameTimer.h" #include "Events/Damage.h" +#include "Components/Vehicle.h" +#include "Components/Player.h" namespace Systems { diff --git a/src/Systems/TriggerSystem.cpp b/src/Systems/TriggerSystem.cpp index 41ea333..166a509 100644 --- a/src/Systems/TriggerSystem.cpp +++ b/src/Systems/TriggerSystem.cpp @@ -82,7 +82,7 @@ void Systems::TriggerSystem::Flag( EntityID entity, EntityID phantomEntity ) m_World->RemoveComponent(phantomEntity); m_World->SetEntityParent(phantomEntity, entity); auto phantomTransform = m_World->GetComponent(phantomEntity); - phantomTransform->Position = glm::vec3(1.f, 0.1f, 2.f); + phantomTransform->Position = glm::vec3(-1.5f, 0.1f, 2.f); } diff --git a/src/Systems/WheelPairSystem.cpp b/src/Systems/WheelPairSystem.cpp new file mode 100644 index 0000000..b8b6c4a --- /dev/null +++ b/src/Systems/WheelPairSystem.cpp @@ -0,0 +1,33 @@ +#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 transformFakeFront = m_World->GetComponent(wheelPair->FakeWheelFront); + if (!transformFakeFront) + return; + auto transformFakeBack = m_World->GetComponent(wheelPair->FakeWheelBack); + if (!transformFakeBack) + return; + + glm::vec3 thing = transformFakeBack->Position - transformFakeFront->Position; + + float height = ((transformFakeFront->Position + transformFakeBack->Position) / 2.f).y; + float angle = std::atan2f(thing.y, thing.z); + + transform->Position.y = height; + transform->Orientation = glm::quat(glm::eulerAngles(transform->Orientation) * glm::vec3(0, 1, 1) + glm::vec3(-angle, 0, 0)); +} \ 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 c64c59a..849554f 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -122,6 +122,7 @@ + @@ -228,6 +229,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 965f3be..6aa9e62 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -75,6 +75,7 @@ Gameplay\Systems + @@ -484,6 +485,9 @@ GUI + + Physics\Systems + Rendering\Components