diff --git a/include/Engine/Core/EventBroker.h b/include/Engine/Core/EventBroker.h index 29d82c17..f04c7715 100644 --- a/include/Engine/Core/EventBroker.h +++ b/include/Engine/Core/EventBroker.h @@ -17,119 +17,119 @@ class EventBroker; class BaseEventRelay { -friend class EventBroker; + friend class EventBroker; protected: - BaseEventRelay(std::string contextTypeName, std::string eventTypeName) - : m_ContextTypeName(contextTypeName) - , m_EventTypeName(eventTypeName) - , m_Broker(nullptr) - { } - ~BaseEventRelay(); + BaseEventRelay(std::string contextTypeName, std::string eventTypeName) + : m_ContextTypeName(contextTypeName) + , m_EventTypeName(eventTypeName) + , m_Broker(nullptr) + { } + ~BaseEventRelay(); public: - virtual bool Receive(const std::shared_ptr event) = 0; + virtual bool Receive(const std::shared_ptr event) = 0; protected: - std::string m_ContextTypeName; - std::string m_EventTypeName; - EventBroker* m_Broker; + std::string m_ContextTypeName; + std::string m_EventTypeName; + EventBroker* m_Broker; }; template class EventRelay : public BaseEventRelay { public: - typedef std::function CallbackType; + typedef std::function CallbackType; - EventRelay() - : m_Callback(nullptr) - , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) - { } - EventRelay(CallbackType callback) - : m_Callback(callback) - , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) - { } + EventRelay() + : m_Callback(nullptr) + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) + { } + EventRelay(CallbackType callback) + : m_Callback(callback) + , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) + { } protected: - bool Receive(const std::shared_ptr event) override; + bool Receive(const std::shared_ptr event) override; private: - CallbackType m_Callback; + CallbackType m_Callback; }; template bool EventRelay::Receive(const std::shared_ptr event) { - if (m_Callback != nullptr) { - return m_Callback(*static_cast(event.get())); - } else { - return false; - } + if (m_Callback != nullptr) { + return m_Callback(*static_cast(event.get())); + } else { + return false; + } } class EventBroker { -template friend class EventRelay; + template friend class EventRelay; public: - EventBroker() - { - m_EventQueueRead = std::make_shared(); - m_EventQueueWrite = std::make_shared(); - } + EventBroker() + { + m_EventQueueRead = std::make_shared(); + m_EventQueueWrite = std::make_shared(); + } - void Subscribe(BaseEventRelay &relay); - template - void Publish(const EventType &event); - /* - Process all events in a given context. - Returns: Number of events processed - */ - template - int Process(); - int Process(std::string contextTypeName); - void Swap(); - void Clear(); - void Unsubscribe(BaseEventRelay &relay); + void Subscribe(BaseEventRelay &relay); + template + void Publish(const EventType &event); + /* + Process all events in a given context. + Returns: Number of events processed + */ + template + int Process(); + int Process(std::string contextTypeName); + void Swap(); + void Clear(); + void Unsubscribe(BaseEventRelay &relay); private: - bool m_IsProcessing = false; + bool m_IsProcessing = false; - typedef std::string ContextTypeName_t; // typeid(ContextType).name() - typedef std::string EventTypeName_t; // typeid(EventType).name() + typedef std::string ContextTypeName_t; // typeid(ContextType).name() + typedef std::string EventTypeName_t; // typeid(EventType).name() - typedef std::unordered_multimap EventRelays_t; - typedef std::unordered_map ContextRelays_t; - ContextRelays_t m_ContextRelays; - std::vector m_RelaysToSubscribe; - std::vector m_RelaysToUnsubscribe; + typedef std::unordered_multimap EventRelays_t; + typedef std::unordered_map ContextRelays_t; + ContextRelays_t m_ContextRelays; + std::vector m_RelaysToSubscribe; + std::vector m_RelaysToUnsubscribe; - typedef std::list>> EventQueue_t; - std::shared_ptr m_EventQueueRead; - std::shared_ptr m_EventQueueWrite; + typedef std::list>> EventQueue_t; + std::shared_ptr m_EventQueueRead; + std::shared_ptr m_EventQueueWrite; - void subscribeImmediate(BaseEventRelay& relay); - void unsubscribeImmediate(BaseEventRelay& relay); + void subscribeImmediate(BaseEventRelay& relay); + void unsubscribeImmediate(BaseEventRelay& relay); }; template void EventBroker::Publish(const EventType &event) { - /*auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); - for (auto it = itpair.first; it != itpair.second; ++it) - { - it->second->Receive(event); - }*/ + /*auto itpair = m_Subscribers.equal_range(typeid(EventType).name()); + for (auto it = itpair.first; it != itpair.second; ++it) + { + it->second->Receive(event); + }*/ - m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); + m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); } template int EventBroker::Process() { - const std::string contextTypeName = typeid(ContextType).name(); - return Process(contextTypeName); + const std::string contextTypeName = typeid(ContextType).name(); + return Process(contextTypeName); } #endif diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index 8e8c71b9..37719c51 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -10,16 +10,16 @@ class System friend class SystemPipeline; public: - System(const EventBroker* eventBroker, std::string componentType) + System(EventBroker* eventBroker, std::string componentType) : m_EventBroker(eventBroker) , m_ComponentType(componentType) { } virtual void Update(World* world, ComponentWrapper& component, double dt) = 0; -private: - const EventBroker* m_EventBroker; +protected: std::string m_ComponentType; + EventBroker* m_EventBroker; }; #endif \ No newline at end of file diff --git a/include/Engine/Core/SystemPipeline.h b/include/Engine/Core/SystemPipeline.h index 24f98121..e4b8bb1f 100644 --- a/include/Engine/Core/SystemPipeline.h +++ b/include/Engine/Core/SystemPipeline.h @@ -9,7 +9,7 @@ class SystemPipeline { public: - SystemPipeline(const EventBroker* eventBroker) + SystemPipeline(EventBroker* eventBroker) : m_EventBroker(eventBroker) { } ~SystemPipeline() @@ -51,7 +51,7 @@ public: } private: - const EventBroker* m_EventBroker; + EventBroker* m_EventBroker; std::unordered_map> m_Systems; }; diff --git a/include/Game/Game.h b/include/Game/Game.h index 500ecf3a..bc66d62f 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -13,6 +13,7 @@ #include "Core/EntityXMLFile.h" #include "Core/SystemPipeline.h" #include "RaptorCopterSystem.h" +#include "PlayerSystem.h" class Game { diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h new file mode 100644 index 00000000..18752ac6 --- /dev/null +++ b/include/Game/PlayerSystem.h @@ -0,0 +1,44 @@ +#ifndef PlayerSystem_h__ +#define PlayerSystem_h__ + +#include +#include + +#include "Common.h" +#include "Core/System.h" +#include "Core/EventBroker.h" +#include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" + +struct KeyInput +{ + bool Forward = false; + bool Left = false; + bool Back = false; + bool Right = false; +}; + +class PlayerSystem : public System +{ +public: + PlayerSystem(EventBroker* eventBroker) + : System(eventBroker, "Player") + { + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); + } + + virtual void Update(World* world, ComponentWrapper& player, double dt) override; + +private: + float m_Speed = 5; + glm::vec3 m_Direction; + KeyInput input; + + EventRelay m_EKeyDown; + bool OnKeyDown(const Events::KeyDown &event); + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &event); +}; + +#endif \ No newline at end of file diff --git a/include/Game/RaptorCopterSystem.h b/include/Game/RaptorCopterSystem.h index 55647004..cdd6dd90 100644 --- a/include/Game/RaptorCopterSystem.h +++ b/include/Game/RaptorCopterSystem.h @@ -4,10 +4,12 @@ class RaptorCopterSystem : public System { public: - RaptorCopterSystem(const EventBroker* eventBroker) + RaptorCopterSystem(EventBroker* eventBroker) : System(eventBroker, "RaptorCopter") { } + virtual void Initialize() { } + virtual void Update(World* world, ComponentWrapper& raptorCopter, double dt) override { ComponentWrapper& transform = world->GetComponent(raptorCopter.EntityID, "Transform"); diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 535e109b..0d95de03 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -6,4 +6,5 @@ LoadMap= Fullscreen=false VSYNC=false Width=1280 -Height=720 \ No newline at end of file +Height=720 +FOV=45 \ No newline at end of file diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index d4160700..12fb870e 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/Player.xml b/resources/Schema/Components/Player.xml new file mode 100644 index 00000000..91a3bb4e --- /dev/null +++ b/resources/Schema/Components/Player.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/resources/Schema/Components/Player.xsd b/resources/Schema/Components/Player.xsd new file mode 100644 index 00000000..78c5866b --- /dev/null +++ b/resources/Schema/Components/Player.xsd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 2c3ea18e..78494ce1 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -31,6 +31,19 @@ + + + + + + + + + + Models/Core/UnitCube.obj + + + @@ -48,7 +61,7 @@ - + Models/Core/UnitRaptor.obj @@ -59,8 +72,8 @@ - - + + 20 @@ -71,19 +84,7 @@ - - - - - Models/Core/UnitCylinder.obj - - - - - - - - + @@ -96,7 +97,7 @@ - + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 695ae7d1..92f7dc31 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -14,6 +14,7 @@ + diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 81d7391e..4b82647c 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -30,7 +30,7 @@ glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity) do { ComponentWrapper transform = world->GetComponent(entity, "Transform"); - position += AbsoluteOrientation(world, entity) * (glm::vec3)transform["Position"]; + position += (glm::vec3)transform["Position"]; entity = world->GetParent(entity); } while (entity != 0); diff --git a/src/Game/CMakeLists.txt b/src/Game/CMakeLists.txt index c21aaa8a..18b80f93 100644 --- a/src/Game/CMakeLists.txt +++ b/src/Game/CMakeLists.txt @@ -19,6 +19,7 @@ file(GLOB SOURCE_FILES set(SOURCE_FILES ${SOURCE_FILES} "Game.cpp" + "PlayerSystem.cpp" ) set(LIBRARIES diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 318d21b3..3ab5d204 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -2,39 +2,40 @@ Game::Game(int argc, char* argv[]) { - ResourceManager::RegisterType("ConfigFile"); - ResourceManager::RegisterType("Model"); - ResourceManager::RegisterType("Texture"); + ResourceManager::RegisterType("ConfigFile"); + ResourceManager::RegisterType("Model"); + ResourceManager::RegisterType("Texture"); ResourceManager::RegisterType("EntityXMLFile"); ResourceManager::RegisterType("ShaderProgram"); - m_Config = ResourceManager::Load("Config.ini"); - LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); + m_Config = ResourceManager::Load("Config.ini"); + LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); - // Create the core event broker - m_EventBroker = new EventBroker(); + // Create the core event broker + m_EventBroker = new EventBroker(); m_RenderQueueFactory = new RenderQueueFactory(); - // Create the renderer - m_Renderer = new Renderer(m_EventBroker); - m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); - m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); - m_Renderer->SetResolution(Rectangle( - 0, - 0, - m_Config->Get("Video.Width", 1280), - m_Config->Get("Video.Height", 720) - )); - m_Renderer->Initialize(); + // Create the renderer + m_Renderer = new Renderer(m_EventBroker); + m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); + m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); + m_Renderer->SetResolution(Rectangle( + 0, + 0, + m_Config->Get("Video.Width", 1280), + m_Config->Get("Video.Height", 720) + )); + m_Renderer->Initialize(); + m_Renderer->Camera()->SetFOV(glm::radians(m_Config->Get("Video.FOV", 90.f))); - // Create input manager - m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker); + // Create input manager + m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker); - // Create the root level GUI frame - m_FrameStack = new GUI::Frame(m_EventBroker); - m_FrameStack->Width = m_Renderer->Resolution().Width; - m_FrameStack->Height = m_Renderer->Resolution().Height; + // Create the root level GUI frame + m_FrameStack = new GUI::Frame(m_EventBroker); + m_FrameStack->Width = m_Renderer->Resolution().Width; + m_FrameStack->Height = m_Renderer->Resolution().Height; // Create a world m_World = new World(); @@ -42,31 +43,34 @@ Game::Game(int argc, char* argv[]) if (!mapToLoad.empty()) { ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); } - + // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); - m_LastTime = glfwGetTime(); + + + m_LastTime = glfwGetTime(); testIntialize(); } Game::~Game() { - delete m_FrameStack; - delete m_EventBroker; + delete m_FrameStack; + delete m_EventBroker; } void Game::Tick() { - double currentTime = glfwGetTime(); - double dt = currentTime - m_LastTime; - m_LastTime = currentTime; + double currentTime = glfwGetTime(); + double dt = currentTime - m_LastTime; + m_LastTime = currentTime; - m_EventBroker->Swap(); - m_InputManager->Update(dt); - m_EventBroker->Swap(); + m_EventBroker->Swap(); + m_InputManager->Update(dt); + m_EventBroker->Swap(); // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); @@ -75,12 +79,12 @@ void Game::Tick() m_RenderQueueFactory->Update(m_World); GLERROR("Game::Tick m_RenderQueueFactory->Update"); - m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); + m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); GLERROR("Game::Tick m_Renderer->Draw"); - m_EventBroker->Swap(); - m_EventBroker->Clear(); + m_EventBroker->Swap(); + m_EventBroker->Clear(); - glfwPollEvents(); + glfwPollEvents(); } diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp new file mode 100644 index 00000000..736ea105 --- /dev/null +++ b/src/Game/PlayerSystem.cpp @@ -0,0 +1,58 @@ +#include "PlayerSystem.h" + + +void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) +{ + if (input.Forward) { + m_Direction.z = -1; + } else if (input.Back) { + m_Direction.z = 1; + } else { + m_Direction.z = 0; + } + if (input.Left) { + m_Direction.x = -1; + } else if (input.Right) { + m_Direction.x = 1; + } else { + m_Direction.x = 0; + } + m_EventBroker->Process(); + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; + (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; +} + +bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) +{ + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = true; + } + if (event.KeyCode == GLFW_KEY_A) { + input.Left = true; + } + if (event.KeyCode == GLFW_KEY_S) { + input.Back = true; + } + if (event.KeyCode == GLFW_KEY_D) { + input.Right = true; + } + return true; +} + +bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) +{ + if (event.KeyCode == GLFW_KEY_W) { + input.Forward = false; + } + if (event.KeyCode == GLFW_KEY_A) { + input.Left = false; + } + if (event.KeyCode == GLFW_KEY_S) { + input.Back = false; + } + if (event.KeyCode == GLFW_KEY_D) { + input.Right = false; + } + return false; +}