diff options
Diffstat (limited to 'src/chunk.cpp')
-rw-r--r-- | src/chunk.cpp | 91 |
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; |