summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chunk-collision.cpp5
-rw-r--r--src/chunk-walls.cpp19
-rw-r--r--src/chunk.hpp4
-rw-r--r--src/wall-atlas.cpp1
-rw-r--r--src/wall-atlas.hpp2
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);