diff options
author | x2048 <codeforsmile@gmail.com> | 2023-01-06 22:31:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-06 22:31:06 +0100 |
commit | 2715cc8bf68a2cc8cd583cd5b0bb732ee13a1b49 (patch) | |
tree | cd9c735604cc8ca5c7b6a84cdf5e44058a9d0e11 /src/client/mapblock_mesh.cpp | |
parent | 059f62d7d60b0aab9af47740f5d5101aa25b7077 (diff) | |
download | minetest-2715cc8bf68a2cc8cd583cd5b0bb732ee13a1b49.tar.xz |
Occlusion culling algorithm based on recursive descend (#13104)
Co-authored-by: DS <vorunbekannt75@web.de>
Diffstat (limited to 'src/client/mapblock_mesh.cpp')
-rw-r--r-- | src/client/mapblock_mesh.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 9e141e290..7eba29624 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -1582,3 +1582,31 @@ video::SColor encode_light(u16 light, u8 emissive_light) float b = (day + night) / 2; return video::SColor(r, b, b, b); } + +u8 get_solid_sides(MeshMakeData *data) +{ + v3s16 blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; + const NodeDefManager *ndef = data->m_client->ndef(); + + u8 result = 0x3F; // all sides solid; + + for (s16 i = 0; i < MAP_BLOCKSIZE && result != 0; i++) + for (s16 j = 0; j < MAP_BLOCKSIZE && result != 0; j++) { + v3s16 positions[6] = { + v3s16(0, i, j), + v3s16(MAP_BLOCKSIZE - 1, i, j), + v3s16(i, 0, j), + v3s16(i, MAP_BLOCKSIZE - 1, j), + v3s16(i, j, 0), + v3s16(i, j, MAP_BLOCKSIZE - 1) + }; + + for (u8 k = 0; k < 6; k++) { + const MapNode &top = data->m_vmanip.getNodeRefUnsafe(blockpos_nodes + positions[k]); + if (ndef->get(top).solidness != 2) + result &= ~(1 << k); + } + } + + return result; +} |