Added some further asserts to the greedymesher

I want it to remain functional throughout the transition.
This commit is contained in:
Rebekah 2024-02-15 06:10:33 -05:00
parent 0b817aabb7
commit df26c64e64
Signed by: oneechanhax
GPG Key ID: 183EB7902964DAE5

View File

@ -645,23 +645,24 @@ public:
case MesherComplexity::kGreedy: { // https://www.youtube.com/watch?v=4xs66m1Of4A - Greedy Meshing Voxels Fast - Optimism in Design Handmade Seattle 2022
std::cout << "Greedy" << std::endl;
std::bitset<_chunk_array_size> chunk_finished_checksum;
const auto FindOpenSpace = [&]() -> std::pair<std::size_t, std::optional<decltype(chunk_finished_checksum)::reference>> {
const auto IsBlockMarkedOff = [&](std::size_t vox) -> bool { return chunk_finished_checksum[vox]; };
const auto FindOpenSpace = [&]() -> std::optional<std::size_t> {
for (std::size_t x = 0; x < cChunkDef::Width; x++) {
for (std::size_t y = 0; y < cChunkDef::Width; y++) {
auto vox = this->GetVoxelFromPosInChunk({ x, y });
if (!chunk_finished_checksum[vox.pos])
return { vox.pos, chunk_finished_checksum[vox.pos] };
if (!IsBlockMarkedOff(vox.pos))
return vox.pos;
}
}
return { std::size_t(-1), {} };
return std::optional<std::size_t>();
};
while (!chunk_finished_checksum.all()) {
const auto unmeshed_face = FindOpenSpace();
if (!unmeshed_face.second.has_value())
if (!unmeshed_face.has_value())
throw std::logic_error("Greedy ChunkMesher checksum thinks there is a unmeshed chunk but unable to find it!");
LocalVoxel cube;
cube.pos = unmeshed_face.first;
cube.pos = unmeshed_face.value();
const auto type = this->GetVoxelType(cube);
if (type == ENUM_BLOCK_TYPE::E_BLOCK_AIR) {
chunk_finished_checksum[cube.pos] = true;
@ -685,7 +686,7 @@ public:
auto below_block_type = this->GetVoxelType(block_to_check);
if (below_block_type != type)
break;
if (chunk_finished_checksum[block_to_check.pos])
if (IsBlockMarkedOff(block_to_check.pos))
break;
alike_counter++;
if (alike_counter >= max_size)
@ -712,6 +713,7 @@ public:
auto below_block_type = this->GetVoxelType(side_block_to_check);
if (below_block_type != type)
break;
assert(!IsBlockMarkedOff(side_block_to_check.pos));
// here we go again, dip down to this max length
auto additional_same_blocks_south_count = SearchLineSouthForSameTypes(side_axis_crawl.cur, same_blocks_south_count);
@ -744,7 +746,9 @@ public:
for (std::size_t y = 0; y < size.y; y++) {
auto block_to_clear = origin + ChunkVecType(x, y);
std::cout << " ------Marking Block Finished: {" << (int)block_to_clear.x << ", " << (int)block_to_clear.y << "}" << std::endl;
chunk_finished_checksum[this->GetVoxelFromPosInChunk(block_to_clear).pos] = true;
auto voxel_pos = this->GetVoxelFromPosInChunk(block_to_clear);
assert(!IsBlockMarkedOff(voxel_pos.pos));
chunk_finished_checksum[voxel_pos.pos] = true;
}
}
};