diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 6171e2116..4484b08d5 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -350,18 +350,21 @@ void RemoteClient::GetNextBlocks ( if (!block->getIsUnderground() && !block->getDayNightDiff()) continue; } + } - /* - Check occlusion cache first. - */ - if (m_blocks_occ.find(p) != m_blocks_occ.end()) - continue; + /* + Check occlusion cache first. + */ + if (m_blocks_occ.find(p) != m_blocks_occ.end()) + continue; - if (m_occ_cull && !block_not_found && - env->getMap().isBlockOccluded(block, cam_pos_nodes, d >= d_cull_opt)) { - m_blocks_occ.insert(p); - continue; - } + /* + Note that we do this even before the block is loaded as this does not depend on its contents. + */ + if (m_occ_cull && + env->getMap().isBlockOccluded(p * MAP_BLOCKSIZE, cam_pos_nodes, d >= d_cull_opt)) { + m_blocks_occ.insert(p); + continue; } /* diff --git a/src/map.cpp b/src/map.cpp index f63732cf4..2402b971c 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1155,7 +1155,7 @@ bool Map::isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, return false; } -bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check) +bool Map::isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_check) { // Check occlusion for center and all 8 corners of the mapblock // Overshoot a little for less flickering @@ -1172,7 +1172,7 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_chec v3s16(-1, -1, -1) * bs2, }; - v3s16 pos_blockcenter = block->getPosRelative() + (MAP_BLOCKSIZE / 2); + v3s16 pos_blockcenter = pos_relative + (MAP_BLOCKSIZE / 2); // Starting step size, value between 1m and sqrt(3)m float step = BS * 1.2f; @@ -1203,7 +1203,7 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_chec // Additional occlusion check, see comments in that function v3s16 check; - if (determineAdditionalOcclusionCheck(cam_pos_nodes, block->getBox(), check)) { + if (determineAdditionalOcclusionCheck(cam_pos_nodes, MapBlock::getBox(pos_relative), check)) { // node is always on a side facing the camera, end_offset can be lower if (!isOccluded(cam_pos_nodes, check, step, stepfac, start_offset, -1.0f, needed_count)) diff --git a/src/map.h b/src/map.h index 543e2e89b..4133bc4a5 100644 --- a/src/map.h +++ b/src/map.h @@ -305,7 +305,12 @@ public: } } - bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check = false); + bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check = false) + { + return isBlockOccluded(block->getPosRelative(), cam_pos_nodes, simple_check); + } + bool isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_check = false); + protected: IGameDef *m_gamedef; diff --git a/src/mapblock.h b/src/mapblock.h index 9a91a05cf..73aeaade7 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -216,10 +216,14 @@ public: return m_pos_relative; } - inline core::aabbox3d getBox() + inline core::aabbox3d getBox() { + return getBox(getPosRelative()); + } + + static inline core::aabbox3d getBox(const v3s16 &pos_relative) { - return core::aabbox3d(getPosRelative(), - getPosRelative() + return core::aabbox3d(pos_relative, + pos_relative + v3s16(MAP_BLOCKSIZE, MAP_BLOCKSIZE, MAP_BLOCKSIZE) - v3s16(1,1,1)); }