diff options
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/chunk-bbox.cpp | 55 | ||||
| -rw-r--r-- | src/chunk.hpp | 17 | ||||
| -rw-r--r-- | src/collision.cpp | 2 | ||||
| -rw-r--r-- | src/collision.hpp | 2 |
5 files changed, 33 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d4bb284..5d40cd7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,10 @@ set_directory_properties(PROPERTIES INTERFACE_CORRADE_CXX_STANDARD ${CMAKE_CXX_S add_subdirectory(external) +if(CMAKE_SIZEOF_VOID_P GREATER_EQUAL 8) + add_definitions(-DFLOORMAT_64) +endif() + if(MSVC) add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/FIcompat/prelude.hpp>) else() diff --git a/src/chunk-bbox.cpp b/src/chunk-bbox.cpp index 50bbd56a..8d99515b 100644 --- a/src/chunk-bbox.cpp +++ b/src/chunk-bbox.cpp @@ -7,41 +7,6 @@ namespace floormat { -template<> -struct chunk::lqt_ops<false> -{ - using BB = loose_quadtree::BoundingBox<std::int16_t>; - using TBBE = loose_quadtree::TrivialBBExtractor<std::int16_t>; - static BB* insert(const BB& bbox, std::vector<BB>& vec) - { - vec.push_back(bbox); - return &vec.back(); - } - static void clear_vec(std::vector<BB>& vec) - { - vec.clear(); - } - static void reserve_vec(std::vector<BB>& vec, std::size_t size) - { - vec.reserve(size); - } -}; - -template<> -struct chunk::lqt_ops<true> -{ - using BB = loose_quadtree::BoundingBox<std::int16_t>; - static compact_bb* insert(const BB& bbox, unsigned char&) - { - if constexpr(sizeof(void*) >= sizeof(BB)) - return std::bit_cast<compact_bb*>(bbox); - else - return {}; - } - static void clear_vec(unsigned char&) {} - static void reserve_vec(unsigned char&, std::size_t) {} -}; - struct collision_bbox final { using BB = loose_quadtree::BoundingBox<std::int16_t>; @@ -77,16 +42,15 @@ void chunk::ensure_passability() noexcept if (!_lqt_view) _lqt_view = make_lqt(); - using ops = lqt_ops<lqt_compact_bb>; - _lqt_move->Clear(); _lqt_shoot->Clear(); _lqt_view->Clear(); - ops::clear_vec(_bboxes); std::vector<collision_bbox> bboxes; - if constexpr(!lqt_compact_bb) - bboxes.reserve(TILE_COUNT*4); +#ifndef FLOORMAT_64 + _bboxes.clear(); + bboxes.reserve(TILE_COUNT*4); +#endif constexpr auto whole_tile = [](std::size_t k, pass_mode p) constexpr -> collision_bbox { auto start = tile_start(k); @@ -120,11 +84,18 @@ void chunk::ensure_passability() noexcept bboxes.push_back(wall_west(i, p)); } - ops::reserve_vec(_bboxes, bboxes.size()); +#ifndef FLOORMAT_64 + _bboxes.reserve(bboxes.size()); +#endif for (const collision_bbox& bbox : bboxes) { - auto* ptr = ops::insert(bbox, _bboxes); +#ifdef FLOORMAT_64 + auto* ptr = std::bit_cast<compact_bb*>(collision_bbox::BB(bbox)); +#else + _bboxes.push_back(bbox); + auto* ptr = &_bboxes.back(); +#endif switch (bbox.pass_mode) { diff --git a/src/chunk.hpp b/src/chunk.hpp index c061d070..2cf7278e 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -18,11 +18,15 @@ template<typename Number> struct TrivialBBExtractor; namespace floormat { struct anim_atlas; + template<typename Num, typename BB, typename BBE> struct collision_iterator; template<typename Num, typename BB, typename BBE> struct collision_query; struct collision_bbox; + +#ifdef FLOORMAT_64 struct compact_bb; struct compact_bb_extractor; +#endif enum class collision : std::uint8_t { view, shoot, move, @@ -80,10 +84,13 @@ struct chunk final 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>>; +#ifdef FLOORMAT_64 + using BB = compact_bb; + using BBE = compact_bb_extractor; +#else + using BB = loose_quadtree::BoundingBox<std::int16_t>; + using BBE = loose_quadtree::TrivialBBExtractor<std::int16_t>; +#endif using lqt = loose_quadtree::LooseQuadtree<std::int16_t, BB, BBE>; using Query = collision_query<std::int16_t, BB, BBE>; @@ -104,7 +111,7 @@ private: template<bool> struct lqt_ops; std::unique_ptr<lqt> _lqt_move, _lqt_shoot, _lqt_view; - std::conditional_t<lqt_compact_bb, unsigned char, std::vector<loose_quadtree::BoundingBox<std::int16_t>>> _bboxes; + std::vector<loose_quadtree::BoundingBox<std::int16_t>> _bboxes; GL::Mesh ground_mesh{NoCreate}, wall_mesh{NoCreate}; mutable bool _maybe_empty : 1 = true, diff --git a/src/collision.cpp b/src/collision.cpp index 64f33c95..42ed2344 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -3,10 +3,12 @@ namespace floormat { +#ifdef FLOORMAT_64 void compact_bb_extractor::ExtractBoundingBox(compact_bb* object, BB* bbox) { if constexpr(sizeof(void*) >= 8) *bbox = std::bit_cast<loose_quadtree::BoundingBox<std::int16_t>>((void*)object); } +#endif } // namespace floormat diff --git a/src/collision.hpp b/src/collision.hpp index 31be7c1f..20ebedb8 100644 --- a/src/collision.hpp +++ b/src/collision.hpp @@ -5,6 +5,7 @@ namespace floormat { +#ifdef FLOORMAT_64 struct compact_bb; struct compact_bb_extractor final @@ -12,6 +13,7 @@ struct compact_bb_extractor final using BB = loose_quadtree::BoundingBox<std::int16_t>; [[maybe_unused]] static void ExtractBoundingBox(compact_bb* object, BB* bbox); }; +#endif template<typename Num, typename BB, typename BBE> struct collision_iterator final |
