You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Branch:
master
1.3
1.4
1.5
AJenbo-patch-1
FindSlotUnderCursor
LineClear
LineClear-test
M_RoundWalk
access
amiga-fix
codeql
cpp20-using-enum
dependabot/github_actions/jidicula/clang-format-action-4.17.0
dev-app-icon
development
dun-data2
dyn-players
dyn-players-param
dyn-players-param2
fabiensanglard
fix-spectral-hack
glebm-patch-1
hubui
install
inv
julealgon/Enhancements/DamageStruct
master
maxexp
mpqfs
mutiny
next
player-max
ps2
psp
render
substitution
surface-to-cel
test
v1.0
w98-profile
wii
xad
xbrz
yuripourre-enhance-description
0.1.0
0.2.0
0.3.0
0.3.1
0.4.0
0.5.0
1.0.0
1.0.1
1.0.2
1.0.3
1.1.0
1.2.0
1.2.1
1.3.0
1.4.0
1.4.1
1.5.0
1.5.1
1.5.2
1.5.3
1.5.4
1.5.5
${ noResults }
devilutionX/test/fixtures/timedemo/WarriorLevel1to2
* lighting: fix long-standing issue with invisible objects This fixes an issue with lighting, where objects in a straight line of sight parallel to the X or Y coordinate lines become invisible. Issue #6641 perfectly illustrates the bug (see video attached to the bug). What's worse, the objects are invisible to the observer (player) regardless of the distance to that objects. The main requirement of a bug reproduction is line of sight parallel to the X or Y coordinate lines. The actual bug lies in the visibility checks of adjacent tiles of a point, hit by the cast ray. We've cast an approximated ray on an integer 2D grid, so we need to check if a ray can pass through the diagonally adjacent tiles. For example, consider this case: #? ↗ # x The ray is cast from the observer 'x', and reaches the '?', but diagonally adjacent tiles '#' do not pass the light, so the '?' should not be visible for the 2D observer. The trick is to perform two additional visibility checks for the diagonally adjacent tiles, but only for the rays that are not parallel to the X or Y coordinate lines. Parallel rays, which have a 0 in one of their coordinate components, do not require any additional adjacent visibility checks, and the tile, hit by the ray, is always considered visible. For the rays that parallel to the X or Y coordinate lines, the adjacent visibility check always degenerated to the actual ray point visibility check, which is considered invisible if it does not allow light to pass through, and this is the actual bug. To fix the issue, ensure the tile is always considered visible if the ray that hits it is parallel to the X or Y coordinate lines. To better demonstrate the problem, here's a straightforward simulation written in Python: https://gist.github.com/rouming/25c555720f93735442c2053426e73bf5 The code simulates lighting from the DevilitionX implementation, by placing the observer 'x' in the center of the grid. The observer is surrounded by walls and 5 random obstacles, '.' are marked as visible, were hit by the cast rays. The first matrix output shows the bug: no walls and obstacles are visible in the line of sight parallel to the X and Y coordinate lines. In contrast, the second matrix output (with the fix applied) does not exhibit this problem. Also, note the box corners are not visible due to the adjacent visibility checks, which are functioning correctly. Fixes: #6641 Signed-off-by: Roman Penyaev <r.peniaev@gmail.com> * lighting: rename variables and add explicit comments for clarity This patch improves clarity and readability without affecting functionality: 1. Renames `VisionCrawlTable` to `VisionRays` and `crawl` to `rayPoint` for better clarity on the purpose of these structures. 2. Renames `factors` to `quadrants` to reflect the actual purpose of the mirror operation along the X or Y coordinate lines. 3. Adds more explicit comments to simplify the understanding of the ray casting algorithm. Signed-off-by: Roman Penyaev <r.peniaev@gmail.com> * test/WarriorLevel1to2: update timedemo Recent visibility fix impacts game state and causes the timedemo to behave completely differently, resulting in a butterfly effect: https://youtu.be/nhpuuHSKGgk. This patch updates the timedemo, which was recorded with the visibility fixes applied, ensuring the tests pass successfully. Here's the latest timedemo video for the future generations: https://youtu.be/udGcWmarYNI Signed-off-by: Roman Penyaev <r.peniaev@gmail.com> --------- Signed-off-by: Roman Penyaev <r.peniaev@gmail.com> |
11 months ago | |
|---|---|---|
| .. | ||
| demo_0.dmo | lighting: fix long-standing issue with invisible objects (#7901) | 11 months ago |
| demo_0_reference_spawn_0.sv | lighting: fix long-standing issue with invisible objects (#7901) | 11 months ago |
| spawn_0.sv | lighting: fix long-standing issue with invisible objects (#7901) | 11 months ago |