forked from electronicarts/CnC_Generals_Zero_Hour
-
Notifications
You must be signed in to change notification settings - Fork 222
bugfix(heightmap): Fix ray casting in BaseHeightMapRenderObjClass::Cast_Ray (2) #2869
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
xezon
wants to merge
4
commits into
TheSuperHackers:main
Choose a base branch
from
xezon:xezon/fix-cast-ray
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+50
−24
Open
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When a close camera ray starts inside the narrowed terrain box, the first iteration records that endpoint, but later
StartBadresults intentionally do not increment its counter. The other endpoint can clip normally, yet this check returnsfalsewhen the inside endpoint remains at one hit. That skips triangle testing and leaves close-range terrain picking unable to find valid terrain intersections.Prompt To Fix With AI
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@greptileai I tested camera with sub 1 height above terrain and it worked correctly. I do not understand the observation. Please elaborate and explain in more detail.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair point — let me trace through the specific scenario more carefully.
When the issue I described applies:
On iteration 0, the initial box's Z max is
mapMaxHeight(the global map maximum). If the camera is below that,StartBad = truefor the forward ray. The new code allows this on iteration 0, so P0HitCount reaches 1.On iteration 1, the narrowed box is built from the actual terrain heights of the specific cells between P0 and P1. If the camera is 1 unit above the terrain directly below it, and the terrain in those cells is at height H, then the narrowed box's Z max is approximately H. The camera at H+1 is above the narrowed box →
StartBad = false→ P0HitCount reaches 2. This is why your test works.The edge case where it could fail:
If the camera is in a depression (low terrain below it) while adjacent cells have significantly higher terrain, the narrowed box's Z max could be set by those taller neighbors — placing the narrowed box's ceiling above the camera again. In that case
StartBad = trueon iteration 1, P0HitCount stays at 1, and theP0HitCount < 2guard returns false.So the failure would require: camera low above terrain in a valley, with tall terrain in nearby cells driving the narrowed box ceiling higher than the camera. Your flat-terrain test wouldn't hit this.
That said, it's genuinely a narrow edge case. If this scenario isn't realistic in Generals maps, the concern is largely academic.