summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/chunk-bbox.cpp55
-rw-r--r--src/chunk.hpp17
-rw-r--r--src/collision.cpp2
-rw-r--r--src/collision.hpp2
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