Add mesh-holding blocks to shadow drawlist. (#13203)

When mesh chunking and shadows are enabled, make sure that the mesh-holding blocks are added to the shadow drawlist.
Otherwise those portions of the shadows will not be rendered.
This commit is contained in:
lhofhansl 2023-02-16 15:43:08 -10:00 committed by GitHub
parent 4cd6b773bb
commit 2a8becd650
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1121,6 +1121,9 @@ void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir,
// Number of blocks occlusion culled // Number of blocks occlusion culled
u32 blocks_occlusion_culled = 0; u32 blocks_occlusion_culled = 0;
std::set<v3s16> shortlist;
MeshGrid mesh_grid = m_client->getMeshGrid();
for (auto &sector_it : m_sectors) { for (auto &sector_it : m_sectors) {
MapSector *sector = sector_it.second; MapSector *sector = sector_it.second;
if (!sector) if (!sector)
@ -1134,8 +1137,8 @@ void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir,
Loop through blocks in sector Loop through blocks in sector
*/ */
for (MapBlock *block : sectorblocks) { for (MapBlock *block : sectorblocks) {
if (!block->mesh) { if (mesh_grid.cell_size == 1 && !block->mesh) {
// Ignore if mesh doesn't exist // fast out in the case of no mesh chunking
continue; continue;
} }
@ -1144,6 +1147,17 @@ void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir,
if (projection.getDistanceFrom(block_pos) > radius) if (projection.getDistanceFrom(block_pos) > radius)
continue; continue;
if (mesh_grid.cell_size > 1) {
// Block meshes are stored in the corner block of a chunk
// (where all coordinate are divisible by the chunk size)
// Add them to the de-dup set.
shortlist.emplace(mesh_grid.getMeshPos(block->getPos()));
}
if (!block->mesh) {
// Ignore if mesh doesn't exist
continue;
}
blocks_in_range_with_mesh++; blocks_in_range_with_mesh++;
// This block is in range. Reset usage timer. // This block is in range. Reset usage timer.
@ -1155,6 +1169,12 @@ void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir,
} }
} }
} }
for (auto pos : shortlist) {
MapBlock * block = getBlockNoCreateNoEx(pos);
if (block && block->mesh && m_drawlist_shadow.emplace(pos, block).second) {
block->refGrab();
}
}
g_profiler->avg("SHADOW MapBlock meshes in range [#]", blocks_in_range_with_mesh); g_profiler->avg("SHADOW MapBlock meshes in range [#]", blocks_in_range_with_mesh);
g_profiler->avg("SHADOW MapBlocks occlusion culled [#]", blocks_occlusion_culled); g_profiler->avg("SHADOW MapBlocks occlusion culled [#]", blocks_occlusion_culled);