3#include <tess/core/shape.h>
4#include <tess/storage/residency.h>
5#include <tess/storage/world.h>
27[[nodiscard]]
constexpr auto axis_end(std::int64_t origin,
28 std::uint64_t extent)
noexcept
32 return box_axis_end(origin, extent);
38template <
typename World>
39void emit_chunk_render_deltas(
const World& world, ChunkKey chunk_key,
41 std::vector<RenderTileDelta>& out) {
42 using Shape =
typename World::shape_type;
45 const auto observed = world.observe_dirty(chunk_key, dirty_mask);
46 const auto mask = observed.mask;
50 const auto& dirty_bounds = observed.bounds;
55 using Traits = ShapeTraits<Shape>;
56 const auto chunk = chunk_coord<Shape>(chunk_key);
57 const auto chunk_begin_x =
58 static_cast<std::int64_t
>(chunk.x * Traits::chunk.x);
59 const auto chunk_begin_y =
60 static_cast<std::int64_t
>(chunk.y * Traits::chunk.y);
61 const auto chunk_begin_z =
62 static_cast<std::int64_t
>(chunk.z * Traits::chunk.z);
63 const auto begin_x = std::max(dirty_bounds.origin.x, chunk_begin_x);
64 const auto begin_y = std::max(dirty_bounds.origin.y, chunk_begin_y);
65 const auto begin_z = std::max(dirty_bounds.origin.z, chunk_begin_z);
67 std::min(detail::axis_end(dirty_bounds.origin.x, dirty_bounds.extent.x),
68 chunk_begin_x +
static_cast<std::int64_t
>(Traits::chunk.x));
70 std::min(detail::axis_end(dirty_bounds.origin.y, dirty_bounds.extent.y),
71 chunk_begin_y +
static_cast<std::int64_t
>(Traits::chunk.y));
73 std::min(detail::axis_end(dirty_bounds.origin.z, dirty_bounds.extent.z),
74 chunk_begin_z +
static_cast<std::int64_t
>(Traits::chunk.z));
75 for (
auto z = begin_z; z < end_z; ++z) {
76 for (
auto y = begin_y; y < end_y; ++y) {
77 for (
auto x = begin_x; x < end_x; ++x) {
78 const auto coord = Coord3{x, y, z};
79 out.push_back(RenderTileDelta{
82 local_tile_id<Shape>(local_coord<Shape>(coord)),
84 observed.content_version,
97template <
typename World>
98void collect_render_tile_deltas(std::vector<RenderTileDelta>& out,
107 if constexpr (std::is_same_v<
typename World::residency_type,
109 for (std::uint64_t key = 0; key < World::chunk_count; ++key) {
110 detail::emit_chunk_render_deltas(world,
ChunkKey{key}, dirty_mask, out);
113 for (
const auto chunk_key : world.resident_chunk_keys()) {
114 detail::emit_chunk_render_deltas(world, chunk_key, dirty_mask, out);
120template <
typename World>
121[[nodiscard]]
auto render_tile_deltas(
const World& world,
DirtyMask dirty_mask)
122 -> std::vector<RenderTileDelta> {
123 std::vector<RenderTileDelta> deltas;
124 collect_render_tile_deltas(deltas, world, dirty_mask);
129template <
typename World>
130void clear_render_delta_dirty(
World& world,
DirtyMask dirty_mask)
noexcept {
134 if constexpr (std::is_same_v<
typename World::residency_type,
136 for (std::uint64_t key = 0; key < World::chunk_count; ++key) {
137 world.clear_dirty(
ChunkKey{key}, dirty_mask);
142 for (
const auto chunk_key : world.resident_chunk_keys()) {
143 world.clear_dirty(chunk_key, dirty_mask);
Definition metadata_types.h:86
Definition metadata_types.h:12
Identifies one dirty tile for a renderer to reread from the world.
Definition render_delta.h:17