Fix horizon culling causing terrain tiles to disappear #189
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Root cause:
The horizon culling in SurfaceNode::isVisible() was calling Horizon::isVisible() with radius=0, treating each tile's horizon culling point as an infinitesimal point rather than accounting for the tile's actual spatial extent. This caused tiles near the horizon boundary to be incorrectly culled even when part of the tile should have been visible.
Additionally, Horizon::isVisible() had a potential numerical precision issue where the calculation
sqrt(dot(VT,VT) - a*a)could produce NaN if floating-point errors caused the value under the sqrt to go negative.The fix:
SurfaceNode.h: Pass the tile's bounding sphere radius to the horizon visibility test, making culling more conservative by accounting for the tile's actual size
Horizon.cpp: Add numerical safeguards to prevent NaN propagation: