3#include <tess/core/shape.h>
4#include <tess/storage/metadata_types.h>
13enum class ChunkActivity : std::uint8_t {
17static_assert(
sizeof(ChunkActivity) ==
sizeof(std::uint8_t));
30 std::uint32_t entity_count = 0;
55[[nodiscard]]
constexpr std::uint32_t popcount(
ActiveMask mask)
noexcept {
58 return static_cast<std::uint32_t
>(std::popcount(mask.value));
64[[nodiscard]]
constexpr std::int64_t box_axis_end(
65 std::int64_t origin, std::uint64_t extent)
noexcept {
66 constexpr auto max = std::numeric_limits<std::int64_t>::max();
67 if (extent >
static_cast<std::uint64_t
>(max)) {
70 const auto delta =
static_cast<std::int64_t
>(extent);
71 return origin > max - delta ? max : origin + delta;
74[[nodiscard]]
constexpr std::int64_t box_min(std::int64_t lhs,
75 std::int64_t rhs)
noexcept {
76 return lhs < rhs ? lhs : rhs;
79[[nodiscard]]
constexpr std::int64_t box_max(std::int64_t lhs,
80 std::int64_t rhs)
noexcept {
81 return lhs < rhs ? rhs : lhs;
84[[nodiscard]]
constexpr Box3 union_box(Box3 lhs, Box3 rhs)
noexcept {
85 const auto min_x = box_min(lhs.origin.x, rhs.origin.x);
86 const auto min_y = box_min(lhs.origin.y, rhs.origin.y);
87 const auto min_z = box_min(lhs.origin.z, rhs.origin.z);
88 const auto max_x = box_max(box_axis_end(lhs.origin.x, lhs.extent.x),
89 box_axis_end(rhs.origin.x, rhs.extent.x));
90 const auto max_y = box_max(box_axis_end(lhs.origin.y, lhs.extent.y),
91 box_axis_end(rhs.origin.y, rhs.extent.y));
92 const auto max_z = box_max(box_axis_end(lhs.origin.z, lhs.extent.z),
93 box_axis_end(rhs.origin.z, rhs.extent.z));
95 Coord3{min_x, min_y, min_z},
99 abs_delta(max_x, min_x),
100 abs_delta(max_y, min_y),
101 abs_delta(max_z, min_z),
112inline void meta_mark_dirty(DirtyMask& dirty_mask, Box3& dirty_bounds,
113 ChunkMeta& meta, DirtyMask mask,
114 Box3 bounds)
noexcept {
118 if (dirty_mask.empty()) {
119 dirty_bounds = bounds;
121 dirty_bounds = union_box(dirty_bounds, bounds);
124 ++meta.content_version;
127inline void meta_mark_content_changed(ChunkMeta& meta)
noexcept {
128 ++meta.content_version;
131inline void meta_clear_dirty(DirtyMask& dirty_mask, Box3& dirty_bounds,
132 DirtyMask mask)
noexcept {
137 if (dirty_mask.empty()) {
142[[nodiscard]]
inline DirtyObservation meta_observe_dirty(
143 DirtyMask dirty_mask, Box3 dirty_bounds,
const ChunkMeta& meta,
144 DirtyMask mask, ResidencyGeneration residency_generation = {})
noexcept {
145 return DirtyObservation{
148 meta.content_version,
149 residency_generation,
153inline bool meta_clear_dirty_observed(
154 DirtyMask& dirty_mask, Box3& dirty_bounds,
const ChunkMeta& meta,
155 DirtyObservation observed,
156 ResidencyGeneration residency_generation = {})
noexcept {
161 if (residency_generation != observed.residency_generation) {
164 if (meta.content_version != observed.content_version) {
167 meta_clear_dirty(dirty_mask, dirty_bounds, observed.mask);
171inline void meta_mark_active(ActiveMask& active_mask,
172 ActiveMask mask)
noexcept {
179inline void meta_clear_active(ActiveMask& active_mask,
180 ActiveMask mask)
noexcept {
184 active_mask &= ~mask;
Definition metadata_types.h:49
Definition metadata_types.h:86
Definition metadata_types.h:12
Definition chunk_meta.h:46
Definition metadata_types.h:118
Definition metadata_types.h:102