diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/chunk-collision.cpp | 5 | ||||
-rw-r--r-- | src/chunk-walls.cpp | 19 | ||||
-rw-r--r-- | src/chunk.hpp | 4 | ||||
-rw-r--r-- | src/wall-atlas.cpp | 1 | ||||
-rw-r--r-- | src/wall-atlas.hpp | 2 |
5 files changed, 22 insertions, 9 deletions
diff --git a/src/chunk-collision.cpp b/src/chunk-collision.cpp index 8b27fd83..611754bc 100644 --- a/src/chunk-collision.cpp +++ b/src/chunk-collision.cpp @@ -4,6 +4,7 @@ #include "src/RTree-search.hpp" #include "src/chunk-scenery.hpp" #include "src/tile-bbox.hpp" +#include "src/wall-atlas.hpp" #include <bit> #include <Corrade/Containers/StructuredBindings.h> #include <Corrade/Containers/Pair.h> @@ -53,13 +54,13 @@ void chunk::ensure_passability() noexcept if (const auto* atlas = tile.wall_north_atlas().get()) { auto [min, max] = wall_north(i); - auto id = make_id(collision_type::geometry, atlas->pass_mode(pass_mode::blocked), TILE_COUNT+i+1); + auto id = make_id(collision_type::geometry, atlas->info().passability, TILE_COUNT+i+1); _rtree.Insert(min.data(), max.data(), id); } if (const auto* atlas = tile.wall_west_atlas().get()) { auto [min, max] = wall_west(i); - auto id = make_id(collision_type::geometry, atlas->pass_mode(pass_mode::blocked), TILE_COUNT*2+i+1); + auto id = make_id(collision_type::geometry, atlas->info().passability, TILE_COUNT*2+i+1); _rtree.Insert(min.data(), max.data(), id); } } diff --git a/src/chunk-walls.cpp b/src/chunk-walls.cpp index 01cc39b6..6e9fd51b 100644 --- a/src/chunk-walls.cpp +++ b/src/chunk-walls.cpp @@ -190,9 +190,19 @@ GL::Mesh chunk::make_wall_mesh() { CORRADE_ASSUME(G < Group_::COUNT); - if (G == Group_::corner_L && D != Direction_::N || - G == Group_::corner_R && D != Direction_::W) [[unlikely]] - continue; + switch (G) + { + case Wall::Group_::corner_L: + if (D != Direction_::N || !_walls->atlases[k+1]) + continue; + break; + case Wall::Group_::corner_R: + if (D != Direction_::W || !_walls->atlases[k-1]) + continue; + break; + default: + break; + } const auto& group = dir.*member; if (!group.is_defined) @@ -225,7 +235,8 @@ GL::Mesh chunk::make_wall_mesh() auto index_view = make_indexes(N); GL::Mesh mesh{GL::MeshPrimitive::Triangles}; - mesh.addVertexBuffer(GL::Buffer{vertex_view}, 0, tile_shader::Position{}, tile_shader::TextureCoordinates{}, tile_shader::Depth{}) + mesh.addVertexBuffer(GL::Buffer{vertex_view}, 0, + tile_shader::Position{}, tile_shader::TextureCoordinates{}, tile_shader::Depth{}) .setIndexBuffer(GL::Buffer{index_view}, 0, GL::MeshIndexType::UnsignedShort) .setCount(int32_t(6 * N)); fm_debug_assert((size_t)mesh.count() == N*6); diff --git a/src/chunk.hpp b/src/chunk.hpp index d9daf436..2331bef8 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -79,7 +79,7 @@ struct chunk final }; struct wall_mesh_tuple final { GL::Mesh& mesh; - const ArrayView<const uint16_t> ids; + const ArrayView<const uint_fast16_t> indexes; const size_t size; }; struct topo_sort_data; @@ -134,7 +134,7 @@ private: { std::array<std::shared_ptr<wall_atlas>, 2*TILE_COUNT> atlases; std::array<variant_t, 2*TILE_COUNT> variants; - std::array<uint16_t, max_wall_quad_count> mesh_indexes; + std::array<uint_fast16_t, max_wall_quad_count> mesh_indexes; }; Pointer<ground_stuff> _ground; diff --git a/src/wall-atlas.cpp b/src/wall-atlas.cpp index 3b2ff9d7..8e6bd13c 100644 --- a/src/wall-atlas.cpp +++ b/src/wall-atlas.cpp @@ -65,6 +65,7 @@ wall_atlas::wall_atlas(wall_atlas_def def, String path, const ImageView2D& img) for (auto [dir_name, dir] : wall_atlas::directions) { const auto* D = direction((size_t)dir); + fm_soft_assert(def.direction_mask[(size_t)dir] == !!D); if (!D) continue; for (auto [group_name, gmemb, gr] : Direction::groups) diff --git a/src/wall-atlas.hpp b/src/wall-atlas.hpp index 6ace0f7c..b73704fe 100644 --- a/src/wall-atlas.hpp +++ b/src/wall-atlas.hpp @@ -120,7 +120,7 @@ class wall_atlas final Direction* get_Direction(Direction_ num) const; public: - fm_DECLARE_DELETED_MOVE_ASSIGNMENT(wall_atlas); + fm_DECLARE_DEFAULT_MOVE_ASSIGNMENT_(wall_atlas); wall_atlas() noexcept; ~wall_atlas() noexcept; wall_atlas(wall_atlas_def def, String path, const ImageView2D& img); |