summaryrefslogtreecommitdiffhomepage
path: root/src/collision.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2022-12-06 01:27:07 +0100
committerStanislaw Halik <sthalik@misaki.pl>2022-12-06 01:35:31 +0100
commit8a514050c611b3dd8ba5c21ffe413af369954b30 (patch)
tree845bdc5023d1c0ad05fa95648bfc0cf9f2797130 /src/collision.cpp
parent0a6612286bfa8c2503c757da2b39da37aa05deaf (diff)
src: add collision iterator adapter
Diffstat (limited to 'src/collision.cpp')
-rw-r--r--src/collision.cpp89
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