summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-05-20 08:13:23 +0200
committerStanislaw Halik <sthalik@misaki.pl>2024-05-20 08:35:24 +0200
commit492950224cb06b08490d81e06af68b5fbbb6aab6 (patch)
treeb0c970aae779be3475af6894cf10322f087165c1 /src
parent263ab79f393c5b500497448ecaa949a8b8daeb53 (diff)
c
Diffstat (limited to 'src')
-rw-r--r--src/chunk-scenery.cpp131
-rw-r--r--src/chunk.hpp1
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
{