summaryrefslogtreecommitdiffhomepage
path: root/src/chunk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/chunk.cpp')
-rw-r--r--src/chunk.cpp91
1 files changed, 4 insertions, 87 deletions
diff --git a/src/chunk.cpp b/src/chunk.cpp
index f40480ee..cb9760e1 100644
--- a/src/chunk.cpp
+++ b/src/chunk.cpp
@@ -1,8 +1,6 @@
#include "chunk.hpp"
-#include "compat/LooseQuadtree-impl.h"
-#include "src/collision.hpp"
#include "src/tile-atlas.hpp"
-#include <Magnum/Math/Vector4.h>
+#include "compat/LooseQuadtree-impl.h"
namespace floormat {
@@ -42,94 +40,13 @@ void chunk::mark_modified() noexcept
mark_scenery_modified();
}
-static constexpr auto tile_size2us = Vector2us(iTILE_SIZE2);
-
-static constexpr Vector2s tile_start(std::size_t k)
-{
- const auto i = std::uint8_t(k);
- const local_coords coord{i};
- constexpr auto tile_size2s = Vector2s(tile_size2us), half = tile_size2s/2;
- return tile_size2s * Vector2s(coord.x, coord.y) - half;
-}
-
-auto chunk::ensure_passability() noexcept -> lqt&
-{
- auto& qt = *_static_lqt;
-
- if (!_pass_modified)
- return qt;
- _pass_modified = false;
-
- qt.Clear();
- _lqt_bboxes.clear();
- _lqt_bboxes.reserve(32);
-
- constexpr auto whole_tile = [](std::size_t k, pass_mode p) constexpr -> collision_bbox {
- auto start = tile_start(k);
- return { start[0], start[1], tile_size2us[0], tile_size2us[1], p };
- };
-
- constexpr auto wall_north = [](std::size_t k, pass_mode p) constexpr -> collision_bbox {
- auto start = tile_start(k) - Vector2s(0, 1);
- return { start[0], start[1], tile_size2us[0], 2, p };
- };
-
- constexpr auto wall_west = [](std::size_t k, pass_mode p) constexpr -> collision_bbox {
- auto start = tile_start(k) - Vector2s(1, 0);
- return { start[0], start[1], 2, tile_size2us[1], p };
- };
-
- for (std::size_t i = 0; i < TILE_COUNT; i++)
- {
- const auto tile = const_cast<chunk&>(*this)[i];
- if (auto s = tile.scenery())
- if (auto p = s.frame.passability; p != pass_mode::pass)
- _lqt_bboxes.push_back(whole_tile(i, p));
- if (auto atlas = tile.ground_atlas())
- if (auto p = atlas->pass_mode(pass_mode::pass); p != pass_mode::pass)
- _lqt_bboxes.push_back(whole_tile(i, p));
- if (auto atlas = tile.wall_north_atlas())
- if (auto p = atlas->pass_mode(pass_mode::blocked); p != pass_mode::pass)
- _lqt_bboxes.push_back(wall_north(i, p));
- if (auto atlas = tile.wall_west_atlas())
- if (auto p = atlas->pass_mode(pass_mode::blocked); p != pass_mode::pass)
- _lqt_bboxes.push_back(wall_west(i, p));
- }
-
- for (auto& bbox : _lqt_bboxes)
- qt.Insert(&bbox);
-
- return qt;
-}
-
-using namespace loose_quadtree;
-
-collision_query chunk::query_collisions(Vector4s vec) const
-{
- const_cast<chunk&>(*this).ensure_passability();
- BoundingBox<std::int16_t> bbox { vec[0], vec[1], vec[2], vec[3] };
- return { _static_lqt->QueryIntersectsRegion(bbox) };
-}
-
-collision_query chunk::query_collisions(Vector2s position, Vector2us size) const
-{
- const_cast<chunk&>(*this).ensure_passability();
- constexpr auto half = sTILE_SIZE2/2;
- const auto start = position - half;
- return query_collisions(Vector4s{start[0], start[1], (Short)size[0], (Short)size[1] });
-}
+chunk::chunk() noexcept = default;
-collision_query chunk::query_collisions(local_coords p, Vector2us size, Vector2s offset) const
+chunk::~chunk() noexcept
{
- const_cast<chunk&>(*this).ensure_passability();
- const auto pos = Vector2s(p.x, p.y) * sTILE_SIZE2 + offset;
- const auto start = pos - Vector2s(size/2);
- BoundingBox<std::int16_t> bbox { start[0], start[1], (Short)size[0], (Short)size[1] };
- return { _static_lqt->QueryIntersectsRegion(bbox) };
+ cleanup_lqt();
}
-chunk::chunk() noexcept : _static_lqt { std::make_unique<lqt>() } {}
-chunk::~chunk() noexcept = default;
chunk::chunk(chunk&&) noexcept = default;
chunk& chunk::operator=(chunk&&) noexcept = default;