From e2417be8c726043f94542d17552d9770af77226d Mon Sep 17 00:00:00 2001 From: William Moberg Date: Tue, 15 Dec 2015 15:36:28 +0100 Subject: [PATCH] Very simple CollisionSystem made, 'Z','Y' to toggle on/off. --- include/Engine/Collision/CollisionSystem.h | 5 +-- resources/Schema/Entities/Test.xml | 7 ++-- src/Engine/Collision/CollisionSystem.cpp | 38 +++++++++++++++++++--- src/Game/Game.cpp | 2 ++ src/Game/PlayerSystem.cpp | 6 ++-- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/include/Engine/Collision/CollisionSystem.h b/include/Engine/Collision/CollisionSystem.h index 1aecfacc..e7a862f7 100644 --- a/include/Engine/Collision/CollisionSystem.h +++ b/include/Engine/Collision/CollisionSystem.h @@ -14,15 +14,16 @@ class CollisionSystem : public System public: CollisionSystem(EventBroker* eventBroker) : System(eventBroker, "AABB") + , zPress(false) { //TODO: Debug stuff, remove later. EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp); } - virtual void Update(World* world, ComponentWrapper& collision, double dt) override; + virtual void Update(World* world, ComponentWrapper& cAABB, double dt) override; private: - + bool zPress; EventRelay m_EKeyUp; bool OnKeyUp(const Events::KeyUp &event); }; diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index ef194ad0..0233ff95 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -14,23 +14,24 @@ - + Models/ScaleWidget.obj - - + Models/RotationWidget.obj + + diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp index d1657361..e1fcb0a2 100644 --- a/src/Engine/Collision/CollisionSystem.cpp +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -1,16 +1,46 @@ +#include "Collision/Collision.h" #include "Collision/CollisionSystem.h" +#include "Core/AABB.h" - -void CollisionSystem::Update(World * world, ComponentWrapper & collision, double dt) +void CollisionSystem::Update(World * world, ComponentWrapper & cAABB, double dt) { + //cAABB is any entity that should be collideable. m_EventBroker->Process(); - (glm::vec3&)collision["Center"] = (glm::vec3)world->GetComponent(collision.EntityID, "Transform")["Position"]; + //Currently the box is translated according to the models Transform matrix, + //but not scaled (or rotated since it's AABB). This should be fine, if we don't + //want to shrink or scale up an collideable object after creation. + cAABB["BoxCenter"] = (glm::vec3)world->GetComponent(cAABB.EntityID, "Transform")["Position"]; + AABB thisBox; + thisBox.CreateFromCenter(cAABB["BoxCenter"], cAABB["BoxSize"]); + //Here c should be an object that moves, currently only players. + if (zPress) { + return; + } + for (auto& mover : *world->GetComponents("Player")) { + if (cAABB.EntityID == mover.EntityID) { + continue; + } + AABB otherBox; + ComponentWrapper& aabbComp = world->GetComponent(mover.EntityID, "AABB"); + otherBox.CreateFromCenter(aabbComp["BoxCenter"], aabbComp["BoxSize"]); + if (Collision::AABBVsAABB(thisBox, otherBox)) { + ComponentWrapper& trans = world->GetComponent(mover.EntityID, "Transform"); + //TODO: Move entity to correct position on collision instead of this. Special treatment if both are movers. + glm::vec3 newPos = trans["Position"]; + float moveSpeed = 0.12f; + newPos += moveSpeed * glm::normalize(newPos - thisBox.Center()); + trans["Position"] = newPos; + aabbComp["BoxCenter"] = newPos; + } + } } bool CollisionSystem::OnKeyUp(const Events::KeyUp & event) { if (event.KeyCode == GLFW_KEY_Z) { - + zPress = true; + } else if (event.KeyCode == GLFW_KEY_X) { + zPress = false; } return false; } diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 1070d2fa..ee5a29b0 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -1,5 +1,6 @@ #include "Game.h" #include "Collision/TriggerSystem.h" +#include "Collision/CollisionSystem.h" Game::Game(int argc, char* argv[]) { @@ -47,6 +48,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); m_LastTime = glfwGetTime(); diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 4f86a2de..727ddea3 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -59,18 +59,18 @@ bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) bool PlayerSystem::OnTouch(const Events::TriggerTouch &event) { - LOG_INFO("Player %i touched widget (entity %i).", event.Entity, event.Trigger); + LOG_INFO("Player entity %i touched widget (entity %i).", event.Entity, event.Trigger); return false; } bool PlayerSystem::OnEnter(const Events::TriggerEnter &event) { - LOG_INFO("Player %i entered widget (entity %i).", event.Entity, event.Trigger); + LOG_INFO("Player entity %i entered widget (entity %i).", event.Entity, event.Trigger); return false; } bool PlayerSystem::OnLeave(const Events::TriggerLeave &event) { - LOG_INFO("Player %i left widget (entity %i).", event.Entity, event.Trigger); + LOG_INFO("Player entity %i left widget (entity %i).", event.Entity, event.Trigger); return false; } \ No newline at end of file