diff options
Diffstat (limited to 'src/collision.cpp')
-rw-r--r-- | src/collision.cpp | 85 |
1 files changed, 4 insertions, 81 deletions
diff --git a/src/collision.cpp b/src/collision.cpp index 1a9c0b3f..64f33c95 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -1,89 +1,12 @@ #include "collision.hpp" -#include "compat/assert.hpp" -#include "src/chunk.hpp" -#include "compat/LooseQuadtree-impl.h" -#include <utility> +#include <bit> namespace floormat { -void collision_bb_extractor::ExtractBoundingBox(const collision_bbox* x, BB* bbox) +void compact_bb_extractor::ExtractBoundingBox(compact_bb* object, 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); + if constexpr(sizeof(void*) >= 8) + *bbox = std::bit_cast<loose_quadtree::BoundingBox<std::int16_t>>((void*)object); } } // namespace floormat |