diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-20 08:13:23 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-05-20 08:35:24 +0200 |
commit | 492950224cb06b08490d81e06af68b5fbbb6aab6 (patch) | |
tree | b0c970aae779be3475af6894cf10322f087165c1 /src | |
parent | 263ab79f393c5b500497448ecaa949a8b8daeb53 (diff) |
c
Diffstat (limited to 'src')
-rw-r--r-- | src/chunk-scenery.cpp | 131 | ||||
-rw-r--r-- | src/chunk.hpp | 1 |
2 files changed, 68 insertions, 64 deletions
diff --git a/src/chunk-scenery.cpp b/src/chunk-scenery.cpp index 16261278..016c7269 100644 --- a/src/chunk-scenery.cpp +++ b/src/chunk-scenery.cpp @@ -12,22 +12,59 @@ namespace floormat { using namespace floormat::Quads; +using topo_sort_data = chunk::topo_sort_data; -auto chunk::ensure_scenery_mesh() noexcept -> scenery_mesh_tuple -{ - Array<object_draw_order> array; - Array<std::array<vertex, 4>> scenery_vertexes; - Array<std::array<UnsignedShort, 6>> scenery_indexes; - return ensure_scenery_mesh({array, scenery_vertexes, scenery_indexes}); -} +namespace { -bool chunk::topo_sort_data::intersects(const topo_sort_data& o) const +auto make_topo_sort_data(object& e, uint32_t mesh_idx) -> topo_sort_data { - return min.x() <= o.max.x() && max.x() >= o.min.x() && - min.y() <= o.max.y() && max.y() >= o.min.y(); + const auto& a = *e.atlas; + const auto& f = a.frame(e.r, e.frame); + const auto world_pos = TILE_SIZE20 * Vector3(e.coord.local()) + Vector3(Vector2(e.offset) + Vector2(e.bbox_offset), 0); + const auto pos = tile_shader::project(world_pos); + const auto px_start = pos - Vector2(e.bbox_offset) - Vector2(f.ground), px_end = px_start + Vector2(f.size); + topo_sort_data data = { + .in = &e, + .min = Vector2i(px_start), + .max = Vector2i(px_end), + .center = Vector2i(pos), + .in_mesh_idx = mesh_idx, + .ord = e.ordinal(), + }; + if (e.type() == object_type::scenery && !e.is_dynamic()) + { + const auto bb_min_ = world_pos - Vector3(Vector2(e.bbox_size/2), 0); + const auto bb_max_ = bb_min_ + Vector3(Vector2(e.bbox_size), 0); + const auto& sc = static_cast<scenery&>(e); + switch (e.r) + { + using enum rotation; + default: + break; + case N: + case S: + case W: + case E: + const auto bb_min = tile_shader::project(Vector3(Vector2(bb_min_[0], bb_max_[1]), 0)); + const auto bb_max = tile_shader::project(Vector3(Vector2(bb_max_[0], bb_min_[1]), 0)); + const auto bb_len = bb_max[0] - bb_min[0]; + if (bb_len >= 1 && f.size[0] > (unsigned)iTILE_SIZE[0]) + { + data.slope = (bb_max[1]-bb_min[1])/bb_len; + data.bb_min = Vector2s(bb_min - px_start); + data.bb_max = Vector2s(bb_max - px_start); + if (sc.scenery_type() != scenery_type::door) + data.mode = topo_sort_data::mode_static; + } + break; + } + } + else if (e.type() == object_type::critter) + data.mode = topo_sort_data::mode_character; + return data; } -static void topo_dfs(Array<chunk::object_draw_order>& array, size_t& output, size_t i, size_t size) // NOLINT(misc-no-recursion) +void topo_dfs(Array<chunk::object_draw_order>& array, size_t& output, size_t i, size_t size) // NOLINT(misc-no-recursion) { using m = typename chunk::topo_sort_data::m; @@ -37,7 +74,7 @@ static void topo_dfs(Array<chunk::object_draw_order>& array, size_t& output, siz const auto& data_i = array[i].data; - for (auto j = 0uz; j < size; j++) + for (auto j = 0u; j < size; j++) { if (i == j) continue; @@ -73,62 +110,30 @@ static void topo_dfs(Array<chunk::object_draw_order>& array, size_t& output, siz output++; } -static void topological_sort(Array<chunk::object_draw_order>& array, size_t size) +void topological_sort(Array<chunk::object_draw_order>& array, size_t size) { size_t output = 0; - for (auto i = 0uz; i < size; i++) + for (auto i = 0u; i < size; i++) if (!array[i].data.visited) topo_dfs(array, output, i, size); fm_assert(output == size); } -auto chunk::make_topo_sort_data(object& e, uint32_t mesh_idx) -> topo_sort_data +} // namespace + +auto chunk::ensure_scenery_mesh() noexcept -> scenery_mesh_tuple +{ + Array<object_draw_order> array; + Array<std::array<vertex, 4>> scenery_vertexes; + Array<std::array<UnsignedShort, 6>> scenery_indexes; + return ensure_scenery_mesh({array, scenery_vertexes, scenery_indexes}); +} + +bool chunk::topo_sort_data::intersects(const topo_sort_data& o) const { - const auto& a = *e.atlas; - const auto& f = a.frame(e.r, e.frame); - const auto world_pos = TILE_SIZE20 * Vector3(e.coord.local()) + Vector3(Vector2(e.offset) + Vector2(e.bbox_offset), 0); - const auto pos = tile_shader::project(world_pos); - const auto px_start = pos - Vector2(e.bbox_offset) - Vector2(f.ground), px_end = px_start + Vector2(f.size); - topo_sort_data data = { - .in = &e, - .min = Vector2i(px_start), - .max = Vector2i(px_end), - .center = Vector2i(pos), - .in_mesh_idx = mesh_idx, - .ord = e.ordinal(), - }; - if (e.type() == object_type::scenery && !e.is_dynamic()) - { - const auto bb_min_ = world_pos - Vector3(Vector2(e.bbox_size/2), 0); - const auto bb_max_ = bb_min_ + Vector3(Vector2(e.bbox_size), 0); - const auto& sc = static_cast<scenery&>(e); - switch (e.r) - { - using enum rotation; - default: - break; - case N: - case S: - case W: - case E: - const auto bb_min = tile_shader::project(Vector3(Vector2(bb_min_[0], bb_max_[1]), 0)); - const auto bb_max = tile_shader::project(Vector3(Vector2(bb_max_[0], bb_min_[1]), 0)); - const auto bb_len = bb_max[0] - bb_min[0]; - if (bb_len >= 1 && f.size[0] > (unsigned)iTILE_SIZE[0]) - { - data.slope = (bb_max[1]-bb_min[1])/bb_len; - data.bb_min = Vector2s(bb_min - px_start); - data.bb_max = Vector2s(bb_max - px_start); - if (sc.scenery_type() != scenery_type::door) - data.mode = topo_sort_data::mode_static; - } - break; - } - } - else if (e.type() == object_type::critter) - data.mode = topo_sort_data::mode_character; - return data; + return min.x() <= o.max.x() && max.x() >= o.min.x() && + min.y() <= o.max.y() && max.y() >= o.min.y(); } auto chunk::ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept -> scenery_mesh_tuple @@ -141,8 +146,8 @@ auto chunk::ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept -> sce { _scenery_modified = false; - const auto count = [&] { - size_t ret = 0; + const auto count = [this] { + uint32_t ret = 0; for (const auto& e : _objects) ret += !e->is_dynamic(); return ret; @@ -151,7 +156,7 @@ auto chunk::ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept -> sce auto& scenery_vertexes = buffers.scenery_vertexes; auto& scenery_indexes = buffers.scenery_indexes; - for (auto i = 0uz; const auto& e : _objects) + for (auto i = 0u; const auto& e : _objects) { if (e->is_dynamic()) continue; @@ -166,7 +171,7 @@ auto chunk::ensure_scenery_mesh(scenery_scratch_buffers buffers) noexcept -> sce const auto d = e->depth_offset(); const float depth = tile_shader::depth_value(pos, d); - for (auto j = 0uz; j < 4; j++) + for (auto j = 0u; j < 4; j++) scenery_vertexes[i][j] = { quad[j], texcoords[j], depth }; scenery_indexes[i] = quad_indexes(i); i++; diff --git a/src/chunk.hpp b/src/chunk.hpp index e5f3cc85..133fb428 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -146,7 +146,6 @@ private: _objects_sorted : 1 = true; void ensure_scenery_buffers(scenery_scratch_buffers bufs); - static topo_sort_data make_topo_sort_data(object& e, uint32_t mesh_idx); struct bbox final { |