diff --git a/src/systems/collision.cpp b/src/systems/collision.cpp index 77d32e3d..00f3b040 100644 --- a/src/systems/collision.cpp +++ b/src/systems/collision.cpp @@ -206,4 +206,23 @@ std::vector CollisionSystem::queryArea(glm::vec2 lowerBound, gl return callback.list; } +std::vector TransformQuery::queryArea(glm::vec2 lowerBound, glm::vec2 upperBound) +{ + std::vector result; + + for (auto [entity, transform, physics] : sp::ecs::Query>()) + { + auto radius = physics ? physics->getSize().x : 0; + + if (transform.getPosition().x + radius < lowerBound.x || transform.getPosition().x - radius > upperBound.x) + continue; + if (transform.getPosition().y + radius < lowerBound.y || transform.getPosition().y - radius > upperBound.y) + continue; + + result.push_back(entity); + } + + return result; +} + } diff --git a/src/systems/collision.h b/src/systems/collision.h index 9b8000ca..39878bfd 100644 --- a/src/systems/collision.h +++ b/src/systems/collision.h @@ -18,9 +18,17 @@ class CollisionSystem static void update(float delta); static void addHandler(CollisionHandler* handler) { handlers.push_back(handler); } + // query all physics-enabled entities in an area static std::vector queryArea(glm::vec2 lowerBound, glm::vec2 upperBound); private: static std::vector handlers; }; -} \ No newline at end of file +class TransformQuery +{ +public: + // query all entities in an area + static std::vector queryArea(glm::vec2 lowerBound, glm::vec2 upperBound); +}; + +}