diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2022-12-06 01:27:07 +0100 |
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-12-06 01:35:31 +0100 |
| commit | 8a514050c611b3dd8ba5c21ffe413af369954b30 (patch) | |
| tree | 845bdc5023d1c0ad05fa95648bfc0cf9f2797130 /src/collision.cpp | |
| parent | 0a6612286bfa8c2503c757da2b39da37aa05deaf (diff) | |
src: add collision iterator adapter
Diffstat (limited to 'src/collision.cpp')
| -rw-r--r-- | src/collision.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/collision.cpp b/src/collision.cpp new file mode 100644 index 00000000..1a9c0b3f --- /dev/null +++ b/src/collision.cpp @@ -0,0 +1,89 @@ +#include "collision.hpp" +#include "compat/assert.hpp" +#include "src/chunk.hpp" +#include "compat/LooseQuadtree-impl.h" +#include <utility> + +namespace floormat { + +void collision_bb_extractor::ExtractBoundingBox(const collision_bbox* x, BB* bbox) +{ + *bbox = { x->left, x->top, std::int16_t(x->width), std::int16_t(x->height) }; +} + +collision_iterator::collision_iterator() noexcept : q{nullptr} {} +collision_iterator::collision_iterator(Query* q) noexcept : q{q} {} + +collision_iterator::~collision_iterator() noexcept +{ + if (q) + while (!q->EndOfQuery()) + q->Next(); +} + +collision_iterator& collision_iterator::operator++() noexcept +{ + fm_debug_assert(q != nullptr && !q->EndOfQuery()); + q->Next(); + return *this; +} + +auto collision_iterator::operator++(int) noexcept -> const collision_bbox* +{ + fm_debug_assert(q != nullptr && !q->EndOfQuery()); + auto* bbox = q->GetCurrent(); + fm_debug_assert(bbox != nullptr); + operator++(); + return bbox; +} + +auto collision_iterator::operator*() const noexcept -> const collision_bbox& +{ + return *operator->(); +} + +auto collision_iterator::operator->() const noexcept -> const collision_bbox* +{ + fm_debug_assert(q != nullptr && !q->EndOfQuery()); + auto* ptr = q->GetCurrent(); + fm_debug_assert(ptr != nullptr); + return ptr; +} + +bool collision_iterator::operator==(const collision_iterator& other) const noexcept +{ + if (q && !other.q) [[likely]] + return q->EndOfQuery(); + else if (!q && !other.q) + return true; + else if (!q) + return other.q->EndOfQuery(); + else + return q == other.q; +} + +collision_iterator::operator bool() const noexcept +{ + return q && !q->EndOfQuery(); +} + +collision_query::collision_query(collision_query::Query&& q) noexcept : q{std::move(q)} {} +collision_iterator collision_query::begin() noexcept { return collision_iterator{&q}; } +collision_iterator collision_query::end() noexcept { return collision_iterator{nullptr}; } + +collision_bbox::operator BB() const noexcept +{ + return BB{left, top, (Short)width, (Short)height}; +} + +bool collision_bbox::intersects(BB bb) const noexcept +{ + return BB(*this).Intersects(bb); +} + +bool collision_bbox::intersects(collision_bbox bb) const noexcept +{ + return BB(*this).Intersects(bb); +} + +} // namespace floormat |
