diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2022-12-06 17:27:44 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-12-06 17:29:25 +0100 |
commit | 646f9d9774d72e9459f50726b200a586d7e07614 (patch) | |
tree | b3f0357c62e252298cbe6c5a8ed314373ac2d5cd /src/chunk.hpp | |
parent | d73d869bc195bf8dbb7525ce12acf2c2fde56084 (diff) |
src/chunk: stick bboxes into the pointer on 64-bit
Diffstat (limited to 'src/chunk.hpp')
-rw-r--r-- | src/chunk.hpp | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/src/chunk.hpp b/src/chunk.hpp index a560fa21..2d2a5c75 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -11,15 +11,22 @@ namespace loose_quadtree { template<typename Number, typename Object, typename BBExtractor> class LooseQuadtree; template<typename Number, typename Object, typename BBExtractor> struct Query; +template<typename Number> struct BoundingBox; +template<typename Number> struct TrivialBBExtractor; } // namespace loose_quadtree namespace floormat { struct anim_atlas; -struct collision_iterator; +template<typename Num, typename BB, typename BBE> struct collision_iterator; +template<typename Num, typename BB, typename BBE> struct collision_query; struct collision_bbox; -struct collision_bb_extractor; -struct collision_query; +struct compact_bb; +struct compact_bb_extractor; + +enum class collision : std::uint8_t { + view, shoot, move, +}; struct chunk final { @@ -69,12 +76,18 @@ struct chunk final wall_mesh_tuple ensure_wall_mesh() noexcept; tile_atlas* wall_atlas_at(std::size_t i) const noexcept; - using lqt = loose_quadtree::LooseQuadtree<std::int16_t, collision_bbox, collision_bb_extractor>; - lqt& ensure_passability() noexcept; + void ensure_passability() noexcept; + + static constexpr inline bool lqt_compact_bb = sizeof(void*) >= 8; + //static constexpr inline bool lqt_compact_bb = false; + using BB = std::conditional_t<lqt_compact_bb, compact_bb, loose_quadtree::BoundingBox<std::int16_t>>; + using BBE = std::conditional_t<lqt_compact_bb, compact_bb_extractor, loose_quadtree::TrivialBBExtractor<std::int16_t>>; + using lqt = loose_quadtree::LooseQuadtree<std::int16_t, BB, BBE>; + using Query = collision_query<std::int16_t, BB, BBE>; - collision_query query_collisions(Vector2s position, Vector2us size) const; - collision_query query_collisions(local_coords p, Vector2us size, Vector2s offset = {}) const; - collision_query query_collisions(Vector4s vec) const; + Query query_collisions(Vector2s position, Vector2us size, collision type) const; + Query query_collisions(local_coords p, Vector2us size, Vector2s offset, collision type) const; + Query query_collisions(Vector4s vec, collision type) const; private: std::array<std::shared_ptr<tile_atlas>, TILE_COUNT> _ground_atlases; @@ -86,8 +99,10 @@ private: std::array<std::shared_ptr<anim_atlas>, TILE_COUNT> _scenery_atlases; std::array<scenery, TILE_COUNT> _scenery_variants = {}; - std::unique_ptr<lqt> _static_lqt; - std::vector<collision_bbox> _lqt_bboxes; + template<bool> struct insert_into_lqt; + + std::unique_ptr<lqt> _lqt_move, _lqt_shoot, _lqt_view; + std::vector<std::conditional_t<lqt_compact_bb, void**, loose_quadtree::BoundingBox<std::int16_t>>> _bboxes; GL::Mesh ground_mesh{NoCreate}, wall_mesh{NoCreate}; mutable bool _maybe_empty : 1 = true, @@ -95,6 +110,10 @@ private: _walls_modified : 1 = true, _scenery_modified : 1 = true, _pass_modified : 1 = true; + + lqt& lqt_from_collision_type(collision type) const noexcept; + static std::unique_ptr<lqt> make_lqt(); + void cleanup_lqt(); }; } // namespace floormat |