From ad2862bf84a167f563434aef4900a5a8760723c0 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sat, 5 Apr 2014 01:24:19 +0200 Subject: [PATCH] A gray tank! :D --- src/Camera.h | 2 + src/Components/FreeSteering.h | 14 ++++ src/GameWorld.cpp | 47 ++++++++++-- src/GameWorld.h | 5 +- src/Renderer.cpp | 9 ++- src/Systems/FreeSteeringSystem.cpp | 61 ++++++++++++++++ src/Systems/FreeSteeringSystem.h | 18 +++++ src/Systems/InputSystem.cpp | 73 +++++++++++++++++++ src/Systems/InputSystem.h | 35 +++++++++ src/Systems/RenderSystem.cpp | 3 +- src/Systems/TransformSystem.cpp | 16 +++- src/Systems/TransformSystem.h | 1 + vs12/Returngeance.sln | 3 - vs12/Returngeance/Returngeance.vcxproj | 5 ++ .../Returngeance/Returngeance.vcxproj.filters | 15 ++++ 15 files changed, 289 insertions(+), 18 deletions(-) create mode 100755 src/Components/FreeSteering.h create mode 100755 src/Systems/FreeSteeringSystem.cpp create mode 100755 src/Systems/FreeSteeringSystem.h create mode 100755 src/Systems/InputSystem.cpp create mode 100755 src/Systems/InputSystem.h diff --git a/src/Camera.h b/src/Camera.h index 2647a54..4680b5b 100755 --- a/src/Camera.h +++ b/src/Camera.h @@ -1,6 +1,8 @@ #ifndef Camera_h__ #define Camera_h__ +//#include "PrecompiledHeader.h" + class Camera { public: diff --git a/src/Components/FreeSteering.h b/src/Components/FreeSteering.h new file mode 100755 index 0000000..2bccc95 --- /dev/null +++ b/src/Components/FreeSteering.h @@ -0,0 +1,14 @@ +#ifndef FreeSteering_h__ +#define FreeSteering_h__ + +#include "Component.h" + +namespace Components +{ + struct FreeSteering : Component + { + float Speed = 35; + }; +} + +#endif // FreeSteering_h__ \ No newline at end of file diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 3cdeb55..58e4d23 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -5,11 +5,41 @@ void GameWorld::Initialize() { World::Initialize(); - auto terrain = CreateEntity(); - auto transform = AddComponent(terrain, "Transform"); + std::shared_ptr transform; + std::shared_ptr model; + + auto camera = CreateEntity(); + transform = AddComponent(camera, "Transform"); + transform->Position.z = 5.f; + auto cameraComp = AddComponent(camera, "Camera"); + AddComponent(camera, "Input"); + auto freeSteering = AddComponent(camera, "FreeSteering"); + + /*auto terrain = CreateEntity(); + transform = AddComponent(terrain, "Transform"); transform->Scale = glm::vec3(.0005f); - auto model = AddComponent(terrain, "Model"); - model->ModelFile = "Models/terrain/terrain.obj"; + model = AddComponent(terrain, "Model"); + model->ModelFile = "Models/terrain/terrain.obj";*/ + + auto tank = CreateEntity(); + transform = AddComponent(tank, "Transform"); + transform->Scale = glm::vec3(.01f); + model = AddComponent(tank, "Model"); + model->ModelFile = "Models/tank/tank_base.obj"; + { + auto tank_top = CreateEntity(tank); + transform = AddComponent(tank_top, "Transform"); + //transform->Scale = glm::vec3(.0005f); + model = AddComponent(tank_top, "Model"); + model->ModelFile = "Models/tank/tank_top.obj"; + { + auto tank_barrel = CreateEntity(tank_top); + transform = AddComponent(tank_barrel, "Transform"); + //transform->Scale = glm::vec3(.0005f); + model = AddComponent(tank_barrel, "Model"); + model->ModelFile = "Models/tank/tank_barrel.obj"; + } + } } void GameWorld::Update(double dt) @@ -31,17 +61,19 @@ void GameWorld::RegisterComponents() m_ComponentFactory.Register("Sprite", []() { return new Components::Sprite(); }); m_ComponentFactory.Register("Template", []() { return new Components::Template(); }); m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); }); + m_ComponentFactory.Register("FreeSteering", []() { return new Components::FreeSteering(); }); } void GameWorld::RegisterSystems() { + m_SystemFactory.Register("TransformSystem", [this]() { return new Systems::TransformSystem(this); }); //m_SystemFactory.Register("LevelGenerationSystem", [this]() { return new Systems::LevelGenerationSystem(this); }); - //m_SystemFactory.Register("InputSystem", [this]() { return new Systems::InputSystem(this, m_Renderer); }); + m_SystemFactory.Register("InputSystem", [this]() { return new Systems::InputSystem(this, m_Renderer); }); //m_SystemFactory.Register("CollisionSystem", [this]() { return new Systems::CollisionSystem(this); }); ////m_SystemFactory.Register("ParticleSystem", [this]() { return new Systems::ParticleSystem(this); }); //m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); }); + m_SystemFactory.Register("FreeSteeringSystem", [this]() { return new Systems::FreeSteeringSystem(this); }); //m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this); }); - m_SystemFactory.Register("TransformSystem", [this]() { return new Systems::TransformSystem(this); }); m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_Renderer); }); } @@ -49,10 +81,11 @@ void GameWorld::AddSystems() { AddSystem("TransformSystem"); //AddSystem("LevelGenerationSystem"); - //AddSystem("InputSystem"); + AddSystem("InputSystem"); //AddSystem("CollisionSystem"); ////AddSystem("ParticleSystem"); //AddSystem("PlayerSystem"); + AddSystem("FreeSteeringSystem"); //AddSystem("SoundSystem"); AddSystem("RenderSystem"); } \ No newline at end of file diff --git a/src/GameWorld.h b/src/GameWorld.h index eb33fcc..61d8c6c 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -4,12 +4,13 @@ #include "World.h" #include "Renderer.h" -//#include "Systems/TransformSystem.h" +#include "Systems/TransformSystem.h" //#include "Systems/CollisionSystem.h" -//#include "Systems/InputSystem.h" +#include "Systems/InputSystem.h" //#include "Systems/LevelGenerationSystem.h" //#include "Systems/ParticleSystem.h" //#include "Systems/PlayerSystem.h" +#include "Systems/FreeSteeringSystem.h" #include "Systems/RenderSystem.h" //#include "Systems/SoundSystem.h" diff --git a/src/Renderer.cpp b/src/Renderer.cpp index 4d952c4..dac65b9 100755 --- a/src/Renderer.cpp +++ b/src/Renderer.cpp @@ -14,7 +14,7 @@ Renderer::Renderer() m_DrawBounds = false; #endif - m_ShadowMapRes = 2048*8; + m_ShadowMapRes = 2048; m_SunPosition = glm::vec3(0, 1.5f, 10); m_SunTarget = glm::vec3(0, 0, 0); m_SunProjection = glm::ortho(-200, 200, -100, 400, -800, 600); @@ -30,9 +30,10 @@ void Renderer::Initialize() } // Create a window - WIDTH = 1920; - HEIGHT = 1080; - glfwWindowHint(GLFW_SAMPLES, 16); + WIDTH = 1280; + HEIGHT = 720; + // Antialiasing + //glfwWindowHint(GLFW_SAMPLES, 16); m_Window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, nullptr); if (!m_Window) { LOG_ERROR("GLFW: Failed to create window"); diff --git a/src/Systems/FreeSteeringSystem.cpp b/src/Systems/FreeSteeringSystem.cpp new file mode 100755 index 0000000..dc54b06 --- /dev/null +++ b/src/Systems/FreeSteeringSystem.cpp @@ -0,0 +1,61 @@ +#include "PrecompiledHeader.h" +#include "FreeSteeringSystem.h" +#include "World.h" + +Systems::FreeSteeringSystem::FreeSteeringSystem(World* world) : System(world) +{ + +} + +void Systems::FreeSteeringSystem::Update(double dt) +{ + +} + +void Systems::FreeSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto steering = m_World->GetComponent(entity, "FreeSteering"); + auto input = m_World->GetComponent(entity, "Input"); + if (steering && input) { + auto transform = m_World->GetComponent(entity, "Transform"); + + glm::vec3 Camera_Right = glm::vec3(glm::vec4(1, 0, 0, 0) * transform->Orientation); + glm::vec3 Camera_Forward = glm::vec3(glm::vec4(0, 0, 1, 0) * transform->Orientation); + + float speed = steering->Speed; + if (input->KeyState[GLFW_KEY_LEFT_SHIFT]) { + speed *= 4.0f; + } + if (input->KeyState[GLFW_KEY_LEFT_ALT]) { + speed /= 4.0f; + } + if (input->KeyState[GLFW_KEY_A]) { + transform->Position -= Camera_Right * (float)dt * speed; + } + else if (input->KeyState[GLFW_KEY_D]) { + transform->Position += Camera_Right * (float)dt * speed; + } + if (input->KeyState[GLFW_KEY_W]) { + transform->Position -= Camera_Forward * (float)dt * speed; + } + if (input->KeyState[GLFW_KEY_S]) { + transform->Position += Camera_Forward * (float)dt * speed; + } + if (input->KeyState[GLFW_KEY_SPACE]) { + transform->Position += glm::vec3(0, 1, 0) * (float)dt * speed; + } + if (input->KeyState[GLFW_KEY_LEFT_CONTROL]) { + transform->Position -= glm::vec3(0, 1, 0) * (float)dt * speed; + } + + if (input->MouseState[GLFW_MOUSE_BUTTON_LEFT]) { + // TOUCHING THIS CODE MIGHT COUSE THE UNIVERSE TO IMPLODE, ALSO DRAGONS + //--------------------------------------------------------------------- + transform->Orientation = glm::angleAxis(input->dY / 300.f, glm::vec3(1, 0, 0)) * transform->Orientation; + + transform->Orientation = transform->Orientation * glm::angleAxis(input->dX / 300.f, glm::vec3(0, 1, 0)); + //--------------------------------------------------------------------- + // TOUCHING THIS CODE MIGHT COUSE THE UNIVERSE TO IMPLODE, ALSO DRAGONS + } + } +} \ No newline at end of file diff --git a/src/Systems/FreeSteeringSystem.h b/src/Systems/FreeSteeringSystem.h new file mode 100755 index 0000000..b4569d9 --- /dev/null +++ b/src/Systems/FreeSteeringSystem.h @@ -0,0 +1,18 @@ +#include + +#include "System.h" +#include "Components/Transform.h" +#include "Components/Input.h" +#include "Components/FreeSteering.h" + +namespace Systems +{ + class FreeSteeringSystem : public System + { + public: + FreeSteeringSystem(World* world); + + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + }; +} \ No newline at end of file diff --git a/src/Systems/InputSystem.cpp b/src/Systems/InputSystem.cpp new file mode 100755 index 0000000..9c86722 --- /dev/null +++ b/src/Systems/InputSystem.cpp @@ -0,0 +1,73 @@ +#include "PrecompiledHeader.h" +#include "InputSystem.h" +#include "World.h" + +void Systems::InputSystem::Update(double dt) +{ + m_LastKeyState = m_CurrentKeyState; + m_LastMouseState = m_CurrentMouseState; + + // Keyboard input + for (int i = 0; i <= GLFW_KEY_LAST; ++i) { + m_CurrentKeyState[i] = glfwGetKey(m_Renderer->GetWindow(), i); + } + + // Mouse buttons + for (int i = 0; i <= GLFW_MOUSE_BUTTON_LAST; ++i) { + m_CurrentMouseState[i] = glfwGetMouseButton(m_Renderer->GetWindow(), i); + } + + // Cursor position + double xpos, ypos; + glfwGetCursorPos(m_Renderer->GetWindow(), &xpos, &ypos); + m_CurrentMouseDeltaX = xpos - m_LastMouseX; + m_CurrentMouseDeltaY = ypos - m_LastMouseY; + m_LastMouseX = xpos; + m_LastMouseY = ypos; + + // Lock mouse while holding LMB + if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT]) { + m_LastMouseX = m_Renderer->WIDTH / 2.f; // xpos; + m_LastMouseY = m_Renderer->HEIGHT / 2.f; // ypos; + glfwSetCursorPos(m_Renderer->GetWindow(), m_LastMouseX, m_LastMouseY); + } + // Hide/show cursor with LMB + if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && !m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT]) { + glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + } + if (!m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT]) { + glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); + } + +#ifdef DEBUG + // Wireframe + if (m_CurrentKeyState[GLFW_KEY_F1] && !m_LastKeyState[GLFW_KEY_F1]) { + m_Renderer->DrawWireframe(!m_Renderer->DrawWireframe()); + } + // Normals + if (m_CurrentKeyState[GLFW_KEY_F2] && !m_LastKeyState[GLFW_KEY_F2]) { + m_Renderer->DrawNormals(!m_Renderer->DrawNormals()); + } + // Bounds + if (m_CurrentKeyState[GLFW_KEY_F3] && !m_LastKeyState[GLFW_KEY_F3]) { + m_Renderer->DrawBounds(!m_Renderer->DrawBounds()); + } +#endif +} + +void Systems::InputSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto input = m_World->GetComponent(entity, "Input"); + if (input == nullptr) + return; + + input->KeyState = m_CurrentKeyState; + input->LastKeyState = m_LastKeyState; + input->MouseState = m_CurrentMouseState; + input->LastMouseState = m_LastMouseState; + input->dX = m_CurrentMouseDeltaX; + input->dY = m_CurrentMouseDeltaY; +} + +std::array Systems::InputSystem::m_CurrentKeyState; +std::array Systems::InputSystem::m_LastKeyState; diff --git a/src/Systems/InputSystem.h b/src/Systems/InputSystem.h new file mode 100755 index 0000000..99cb01f --- /dev/null +++ b/src/Systems/InputSystem.h @@ -0,0 +1,35 @@ +#ifndef InputSystem_h__ +#define InputSystem_h__ + +#include + +#include "System.h" +#include "Renderer.h" +#include "Components/Input.h" + +namespace Systems +{ + +class InputSystem : public System +{ +public: + InputSystem(World* world, std::shared_ptr renderer) + : System(world), m_Renderer(renderer) { } + + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + +private: + std::shared_ptr m_Renderer; + static std::array m_CurrentKeyState; + static std::array m_LastKeyState; + std::array m_CurrentMouseState; + std::array m_LastMouseState; + float m_CurrentMouseDeltaX, m_CurrentMouseDeltaY; + float m_LastMouseX, m_LastMouseY; + +}; + +} + +#endif // InputSystem_h__ diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp index 7aaf17f..bd3ccd7 100755 --- a/src/Systems/RenderSystem.cpp +++ b/src/Systems/RenderSystem.cpp @@ -25,7 +25,8 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa auto model = m_CachedModels[modelComponent->ModelFile]; glm::vec3 position = m_TransformSystem->AbsolutePosition(entity); glm::quat orientation = m_TransformSystem->AbsoluteOrientation(entity); - m_Renderer->AddModelToDraw(model, position, orientation, transformComponent->Scale, modelComponent->Visible, modelComponent->ShadowCaster); + glm::vec3 scale = m_TransformSystem->AbsoluteScale(entity); + m_Renderer->AddModelToDraw(model, position, orientation, scale, modelComponent->Visible, modelComponent->ShadowCaster); } // Debug draw bounds diff --git a/src/Systems/TransformSystem.cpp b/src/Systems/TransformSystem.cpp index d243a9e..1543fb7 100755 --- a/src/Systems/TransformSystem.cpp +++ b/src/Systems/TransformSystem.cpp @@ -45,4 +45,18 @@ glm::quat Systems::TransformSystem::AbsoluteOrientation(EntityID entity) } while (entity != 0); return absOrientation; -} \ No newline at end of file +} + +glm::vec3 Systems::TransformSystem::AbsoluteScale(EntityID entity) +{ + glm::vec3 absScale(1); + + do + { + auto transform = m_World->GetComponent(entity, "Transform"); + absScale *= transform->Scale; + entity = m_World->GetEntityParent(entity); + } while (entity != 0); + + return absScale; +} diff --git a/src/Systems/TransformSystem.h b/src/Systems/TransformSystem.h index b0cc2fa..474ebc3 100755 --- a/src/Systems/TransformSystem.h +++ b/src/Systems/TransformSystem.h @@ -18,6 +18,7 @@ namespace Systems glm::vec3 AbsolutePosition(EntityID entity); glm::quat AbsoluteOrientation(EntityID entity); + glm::vec3 AbsoluteScale(EntityID entity); }; } diff --git a/vs12/Returngeance.sln b/vs12/Returngeance.sln index 0a9dc7f..d25c99e 100755 --- a/vs12/Returngeance.sln +++ b/vs12/Returngeance.sln @@ -19,7 +19,4 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection EndGlobal diff --git a/vs12/Returngeance/Returngeance.vcxproj b/vs12/Returngeance/Returngeance.vcxproj index b6d4b0d..236e071 100755 --- a/vs12/Returngeance/Returngeance.vcxproj +++ b/vs12/Returngeance/Returngeance.vcxproj @@ -95,6 +95,8 @@ + + @@ -108,6 +110,7 @@ + @@ -130,6 +133,8 @@ + + diff --git a/vs12/Returngeance/Returngeance.vcxproj.filters b/vs12/Returngeance/Returngeance.vcxproj.filters index 5208aa9..206b9e8 100755 --- a/vs12/Returngeance/Returngeance.vcxproj.filters +++ b/vs12/Returngeance/Returngeance.vcxproj.filters @@ -19,6 +19,12 @@ Systems + + Systems + + + Systems + @@ -106,6 +112,15 @@ Systems + + Systems + + + Systems + + + Components +