diff --git a/include/Engine/Core/Collision.h b/include/Engine/Collision/Collision.h similarity index 100% rename from include/Engine/Core/Collision.h rename to include/Engine/Collision/Collision.h diff --git a/include/Engine/Collision/CollisionSystem.h b/include/Engine/Collision/CollisionSystem.h new file mode 100644 index 00000000..1aecfacc --- /dev/null +++ b/include/Engine/Collision/CollisionSystem.h @@ -0,0 +1,30 @@ +#ifndef CollisionSystem_h__ +#define CollisionSystem_h__ + +#include +#include + +#include "Common.h" +#include "Core/System.h" +#include "Core/EventBroker.h" +#include "Core/EKeyUp.h" + +class CollisionSystem : public System +{ +public: + CollisionSystem(EventBroker* eventBroker) + : System(eventBroker, "AABB") + { + //TODO: Debug stuff, remove later. + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp); + } + + virtual void Update(World* world, ComponentWrapper& collision, double dt) override; + +private: + + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &event); +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Collision/ETrigger.h b/include/Engine/Collision/ETrigger.h new file mode 100644 index 00000000..aaa5ef06 --- /dev/null +++ b/include/Engine/Collision/ETrigger.h @@ -0,0 +1,39 @@ +#ifndef Events_TriggerEnter_h__ +#define Events_TriggerEnter_h__ + +#include "../Core/EventBroker.h" +#include "../Core/Entity.h" + +namespace Events +{ + +/** Thrown once, when an entity is completely inside a trigger. */ +struct TriggerTouch : Event +{ + /** The id of the entity that touches the trigger. */ + EntityID Entity; + /** The id of the trigger entity. */ + EntityID Trigger; +}; + +/** Thrown once, when an entity has completely left a trigger. */ +struct TriggerLeave : Event +{ + /** The id of the entity that left the trigger. */ + EntityID Entity; + /** The id of the trigger entity. */ + EntityID Trigger; +}; + +/** Thrown when an entity is completely inside a trigger. */ +struct TriggerEnter : Event +{ + /** The id of the entity that entered the trigger. */ + EntityID Entity; + /** The id of the trigger entity. */ + EntityID Trigger; +}; + +} + +#endif diff --git a/include/Engine/Collision/TriggerSystem.h b/include/Engine/Collision/TriggerSystem.h new file mode 100644 index 00000000..94084ee3 --- /dev/null +++ b/include/Engine/Collision/TriggerSystem.h @@ -0,0 +1,23 @@ +#ifndef PlayerSystem_h__ +#define PlayerSystem_h__ + +#include + +#include "Core/System.h" +#include "Core/EventBroker.h" +#include "ETrigger.h" + +class TriggerSystem : public System +{ +public: + TriggerSystem(EventBroker* eventBroker) + : System(eventBroker, "Trigger") + {} + + virtual void Update(World* world, ComponentWrapper& collision, double dt) override; + +private: + +}; + +#endif \ No newline at end of file diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index 12fb870e..fd04fd39 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -6,4 +6,6 @@ + + \ No newline at end of file diff --git a/resources/Schema/Components/AABB.xml b/resources/Schema/Components/AABB.xml new file mode 100644 index 00000000..341d1d0d --- /dev/null +++ b/resources/Schema/Components/AABB.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/Schema/Components/AABB.xsd b/resources/Schema/Components/AABB.xsd new file mode 100644 index 00000000..8fac860e --- /dev/null +++ b/resources/Schema/Components/AABB.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Components/Trigger.xml b/resources/Schema/Components/Trigger.xml new file mode 100644 index 00000000..4c8aad58 --- /dev/null +++ b/resources/Schema/Components/Trigger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/Schema/Components/Trigger.xsd b/resources/Schema/Components/Trigger.xsd new file mode 100644 index 00000000..a8bc8865 --- /dev/null +++ b/resources/Schema/Components/Trigger.xsd @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Engine/Core/Collision.cpp b/src/Engine/Collision/Collision.cpp similarity index 100% rename from src/Engine/Core/Collision.cpp rename to src/Engine/Collision/Collision.cpp diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp new file mode 100644 index 00000000..d1657361 --- /dev/null +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -0,0 +1,16 @@ +#include "Collision/CollisionSystem.h" + + +void CollisionSystem::Update(World * world, ComponentWrapper & collision, double dt) +{ + m_EventBroker->Process(); + (glm::vec3&)collision["Center"] = (glm::vec3)world->GetComponent(collision.EntityID, "Transform")["Position"]; +} + +bool CollisionSystem::OnKeyUp(const Events::KeyUp & event) +{ + if (event.KeyCode == GLFW_KEY_Z) { + + } + return false; +} diff --git a/src/Engine/Collision/TriggerSystem.cpp b/src/Engine/Collision/TriggerSystem.cpp new file mode 100644 index 00000000..4b6c0de4 --- /dev/null +++ b/src/Engine/Collision/TriggerSystem.cpp @@ -0,0 +1,22 @@ +#include "Collision/TriggerSystem.h" +#include "Core/AABB.h" + +void TriggerSystem::Update(World* world, ComponentWrapper& trigger, double dt) +{ + auto players = world->GetComponents("Player"); + if (players == nullptr) { + return; + } + //WTODO: Assumes box exists. + ComponentWrapper& cBox = world->GetComponent(trigger.EntityID, "AABB"); + AABB aabb; + aabb.CreateFromCenter(cBox["BoxCenter"], cBox["BoxSize"]); + for (auto& c : *players) { + + Events::TriggerEnter e; + e.Trigger = trigger.EntityID; + e.Entity = 41; + m_EventBroker->Publish(e); + } +} + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index fa12bbc6..1070d2fa 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -1,4 +1,5 @@ #include "Game.h" +#include "Collision/TriggerSystem.h" Game::Game(int argc, char* argv[]) { @@ -46,8 +47,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); - - + m_SystemPipeline->AddSystem(); m_LastTime = glfwGetTime();