22inline constexpr uint32_t k_material_words_per_brick = k_brick_voxel_count / 4;
24inline constexpr uint32_t k_occupancy_words_per_brick = 16;
26inline constexpr uint32_t k_coarse_bricks = 4;
28inline constexpr uint32_t k_palette_words = k_palette_size * 4;
30static_assert(k_brick_voxel_count % 4 == 0,
"brick material bytes must pack into whole 32-bit words");
31static_assert(
sizeof(BrickOccupancy) == 64,
"occupancy must be eight 64-bit slices");
32static_assert(
sizeof(PaletteEntry) == 16,
"a palette entry must be four 32-bit words");
36 uint32_t brick_dims_x = 0;
37 uint32_t brick_dims_y = 0;
38 uint32_t brick_dims_z = 0;
43 uint32_t coarse_dims_x = 0;
44 uint32_t coarse_dims_y = 0;
45 uint32_t coarse_dims_z = 0;
53 float max_emissive = 1.0f;
56static_assert(
sizeof(
VolumeRecord) == 40,
"VolumeRecord is mirrored by voxel_dda.slang member for member");
58static_assert(offsetof(
VolumeRecord, coarse_offset) == 28);
59static_assert(offsetof(
VolumeRecord, palette_offset) == 32);
60static_assert(offsetof(
VolumeRecord, max_emissive) == 36);
72 const Volume* volume =
nullptr;
73 const Palette* palette =
nullptr;
77 std::vector<VolumeRecord> records;
85 std::vector<uint32_t> palettes;
90 std::vector<VolumeRecord> records;
91 std::vector<uint32_t> palettes;
92 uint32_t grid_words = 0;
93 uint32_t coarse_words = 0;
104 std::vector<PatchRun> runs;
122 uint32_t coarse_words = 0;
123 uint32_t palette_words = 0;
124 uint32_t record_count = 0;
141 std::span<const uint32_t> bricks;
145constexpr auto gridIndex(glm::uvec3 dims, glm::uvec3 brick)
noexcept -> uint32_t {
146 return brick.x + (brick.y * dims.x) + (brick.z * dims.x * dims.y);
150constexpr auto coarseDims(glm::uvec3 brick_dims)
noexcept -> glm::uvec3 {
151 return (brick_dims + (k_coarse_bricks - 1u)) / k_coarse_bricks;
156TOAST_API
auto packPool(
const BrickPool& pool) -> PackedPool;
160TOAST_API
void packOccupancyWords(
const BrickOccupancy& occupancy, uint32_t* out);
164constexpr auto subBrickBit(glm::uvec3 local)
noexcept -> uint32_t {
165 return (local.x & 3u) | ((local.y & 3u) << 2u) | ((local.z & 3u) << 4u);
171 return (local.x & 2u) | ((local.y & 2u) << 2u) | ((local.z & 2u) << 4u);
174inline constexpr uint64_t k_sub_block_mask = 0x0033'0033ull;
177TOAST_API
auto packScene(std::span<const SceneVolume> volumes) -> PackedScene;
180TOAST_API
auto packLayout(std::span<const SceneVolume> volumes) -> SceneLayout;
184TOAST_API
auto layoutMatches(
const PackedScene& retained,
const SceneLayout& layout) -> bool;
190TOAST_API
auto computePatch(
191 PackedScene& retained, uint32_t retained_pool_slots,
const BrickPool& pool, std::span<const SceneVolume> volumes,
192 std::span<const VolumeDirty> dirty, std::span<const uint32_t> appended = {}, uint32_t first_new_palette_word = UINT32_MAX
196TOAST_API
void applyPatch(PackedPool& pool, PackedScene& scene,
const ScenePatch& patch);
199TOAST_API
auto patchWords(
const ScenePatch& patch) -> size_t;
203TOAST_API
auto sampleMaterial(
const PackedPool& pool,
const PackedScene& scene, uint32_t volume, glm::ivec3 voxel) -> uint8_t;
206TOAST_API
auto sampleSolid(
const PackedPool& pool,
const PackedScene& scene, uint32_t volume, glm::ivec3 voxel) -> bool;
210TOAST_API
auto pooledSubBrick(
const PackedPool& pool, uint32_t slot, glm::uvec3 local) -> uint64_t;
213TOAST_API
auto sampleCoarse(
const PackedScene& scene, uint32_t volume, glm::ivec3 cell) -> bool;
216TOAST_API
auto samplePaletteEntry(
const PackedScene& scene, uint32_t volume, uint8_t index) -> PaletteEntry;
Definition brick_pool.hpp:26
Definition voxel_volume.hpp:21
constexpr auto subBrickBit(glm::uvec3 local) noexcept -> uint32_t
Bit of local in its sub-brick.
Definition gpu_layout.hpp:164
constexpr auto subBlockShift(glm::uvec3 local) noexcept -> uint32_t
k_sub_block_mask shifted by this covers the 2x2x2 block holding local
Definition gpu_layout.hpp:170
Entry 0 is the empty voxel and must stay all zero.
Definition palette.hpp:59
Definition gpu_layout.hpp:62
std::vector< uint32_t > occupancy
Eight 4x4x4 sub-bricks per slot in the packOccupancyWords layout.
Definition gpu_layout.hpp:67
std::vector< uint32_t > materials
512 palette bytes per slot little endian
Definition gpu_layout.hpp:64
Definition gpu_layout.hpp:76
std::vector< uint32_t > grids
Concatenated per volume one BrickEntry per brick x fastest.
Definition gpu_layout.hpp:80
std::vector< uint32_t > coarse
Concatenated per volume one bit per 4x4x4 bricks.
Definition gpu_layout.hpp:83
Words replaced in one section of the copy the GPU holds.
Definition gpu_layout.hpp:97
Definition gpu_layout.hpp:103
std::vector< uint32_t > words
The runs back to back.
Definition gpu_layout.hpp:107
A pack minus the per brick arrays.
Definition gpu_layout.hpp:89
Definition gpu_layout.hpp:116
std::vector< TagDelta > tags
Per scene volume.
Definition gpu_layout.hpp:135
uint32_t pool_slots
Slots the pool sections hold afterwards and they only ever grow.
Definition gpu_layout.hpp:118
uint32_t grid_words
Section sizes afterwards in words or records.
Definition gpu_layout.hpp:121
PatchSection records
VolumeRecord words.
Definition gpu_layout.hpp:132
Neither pointer may be null.
Definition gpu_layout.hpp:71
Definition gpu_layout.hpp:110
Grid indices of the bricks of one scene volume that changed since the retained state.
Definition gpu_layout.hpp:139
Mirrored member for member by voxel_dda.slang so only 4-byte scalars.
Definition gpu_layout.hpp:35
uint32_t grid_offset
In entries.
Definition gpu_layout.hpp:41
uint32_t palette_offset
In entries so multiply by four for words.
Definition gpu_layout.hpp:51
uint32_t coarse_offset
In words.
Definition gpu_layout.hpp:48