Debugging Grid Raycasting with Visualizations
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:01Recap and set the stage for the day with a few words on indirect lighting
🗩
0:01Recap and set the stage for the day with a few words on indirect lighting
🗩
0:01Recap and set the stage for the day with a few words on indirect lighting
🗩
2:05Demo the old AABB ray cast lighting
🏃
2:05Demo the old AABB ray cast lighting
🏃
2:05Demo the old AABB ray cast lighting
🏃
2:56Toggle on LIGHTING_USE_GRID and fix compile errors
2:56Toggle on LIGHTING_USE_GRID and fix compile errors
2:56Toggle on LIGHTING_USE_GRID and fix compile errors
3:27Demo the new, unfinished grid ray cast lighting
🏃
3:27Demo the new, unfinished grid ray cast lighting
🏃
3:27Demo the new, unfinished grid ray cast lighting
🏃
4:56Grid ray casting: 1) Spatial partitioning
🏃
4:56Grid ray casting: 1) Spatial partitioning
🏃
4:56Grid ray casting: 1) Spatial partitioning
🏃
5:35Grid ray casting: 2) Walk table, which tells you which grid squares to sample
🏃
5:35Grid ray casting: 2) Walk table, which tells you which grid squares to sample
🏃
5:35Grid ray casting: 2) Walk table, which tells you which grid squares to sample
🏃
5:58Grid ray casting: 3) The ray cast routine itself
🏃
5:58Grid ray casting: 3) The ray cast routine itself
🏃
5:58Grid ray casting: 3) The ray cast routine itself
🏃
6:25Grid ray casting: 1a) SIMD packing of the AABB units
🏃
6:25Grid ray casting: 1a) SIMD packing of the AABB units
🏃
6:25Grid ray casting: 1a) SIMD packing of the AABB units
🏃
7:23Determine to debug the spatial partitioning using visualisation, with a few words on unit testing
🗩
7:23Determine to debug the spatial partitioning using visualisation, with a few words on unit testing
🗩
7:23Determine to debug the spatial partitioning using visualisation, with a few words on unit testing
🗩
14:08Make GridRayCast() draw the rays from one grid location, introducing DimIndexFrom()
14:08Make GridRayCast() draw the rays from one grid location, introducing DimIndexFrom()
14:08Make GridRayCast() draw the rays from one grid location, introducing DimIndexFrom()
22:29Introduce a version of PushDebugBox() that takes a rectangle3
22:29Introduce a version of PushDebugBox() that takes a rectangle3
22:29Introduce a version of PushDebugBox() that takes a rectangle3
23:03Hunt the scene for the debug box
🏃
23:03Hunt the scene for the debug box
🏃
23:03Hunt the scene for the debug box
🏃
23:16Change GridRayCast() to draw the rays from grid location 200
23:16Change GridRayCast() to draw the rays from grid location 200
23:16Change GridRayCast() to draw the rays from grid location 200
23:55Hunt the scene for the newly located debug box
🏃
23:55Hunt the scene for the newly located debug box
🏃
23:55Hunt the scene for the newly located debug box
🏃
24:25Try unsuccessfully to break on our PushDebugBox() call in GridRayCast(), and find an InitialGridIndex of 4677
🏃
24:25Try unsuccessfully to break on our PushDebugBox() call in GridRayCast(), and find an InitialGridIndex of 4677
🏃
24:25Try unsuccessfully to break on our PushDebugBox() call in GridRayCast(), and find an InitialGridIndex of 4677
🏃
25:25Change GridRayCast() to draw the rays from grid location 4677
25:25Change GridRayCast() to draw the rays from grid location 4677
25:25Change GridRayCast() to draw the rays from grid location 4677
25:39Break on our PushDebugBox() call in GridRayCast()
🏃
25:39Break on our PushDebugBox() call in GridRayCast()
🏃
25:39Break on our PushDebugBox() call in GridRayCast()
🏃
26:06Note that PushDebugLine() is not thread-safe, which is fine for the grid ray caster
📖
26:06Note that PushDebugLine() is not thread-safe, which is fine for the grid ray caster
📖
26:06Note that PushDebugLine() is not thread-safe, which is fine for the grid ray caster
📖
27:08Check out the debug box
🏃
27:08Check out the debug box
🏃
27:08Check out the debug box
🏃
27:55Make GridRayCast() draw the ray origin, hit and synthetic destination locations
27:55Make GridRayCast() draw the ray origin, hit and synthetic destination locations
27:55Make GridRayCast() draw the ray origin, hit and synthetic destination locations
31:47Check out the rays cast from our 4677 grid location, to see that we are not casting spherically
🏃
31:47Check out the rays cast from our 4677 grid location, to see that we are not casting spherically
🏃
31:47Check out the rays cast from our 4677 grid location, to see that we are not casting spherically
🏃
33:27Scour OutputSphereINL() for bugs
📖
33:27Scour OutputSphereINL() for bugs
📖
33:27Scour OutputSphereINL() for bugs
📖
36:21Note the area untouched by the ray cast
🏃
36:21Note the area untouched by the ray cast
🏃
36:21Note the area untouched by the ray cast
🏃
36:41Consider there to be something wrong other than the SampleDirectionTable values
📖
36:41Consider there to be something wrong other than the SampleDirectionTable values
📖
36:41Consider there to be something wrong other than the SampleDirectionTable values
📖
37:08Note the black colouration of the rays, themselves lit by the lighting system
🏃
37:08Note the black colouration of the rays, themselves lit by the lighting system
🏃
37:08Note the black colouration of the rays, themselves lit by the lighting system
🏃
38:46Scour FullCast() for sampling bugs
📖
38:46Scour FullCast() for sampling bugs
📖
38:46Scour FullCast() for sampling bugs
📖
40:26Fix FullCast() to stride through the SampleDirectionTable in fours
40:26Fix FullCast() to stride through the SampleDirectionTable in fours
40:26Fix FullCast() to stride through the SampleDirectionTable in fours
40:37Admire our more spherical ray distribution
🏃
40:37Admire our more spherical ray distribution
🏃
40:37Admire our more spherical ray distribution
🏃
41:28Note that our rays never hit anything
🏃
41:28Note that our rays never hit anything
🏃
41:28Note that our rays never hit anything
🏃
42:05May GridRayCast() limit the drawing of rays to those pointing upwards
42:05May GridRayCast() limit the drawing of rays to those pointing upwards
42:05May GridRayCast() limit the drawing of rays to those pointing upwards
43:50Admire our upward pointing rays
🏃
43:50Admire our upward pointing rays
🏃
43:50Admire our upward pointing rays
🏃
44:22Make GridRayCast() draw the boxes visited by our rays
44:22Make GridRayCast() draw the boxes visited by our rays
44:22Make GridRayCast() draw the boxes visited by our rays
45:03See no boxes visited by our rays
🏃
45:03See no boxes visited by our rays
🏃
45:03See no boxes visited by our rays
🏃
46:03Make GridRayCast() shrink the ray origin box
46:03Make GridRayCast() shrink the ray origin box
46:03Make GridRayCast() shrink the ray origin box
46:34See both the origin box and the initial walk box
🏃
46:34See both the origin box and the initial walk box
🏃
46:34See both the origin box and the initial walk box
🏃
47:05Note that GridRayCast() terminates prematurely
📖
47:05Note that GridRayCast() terminates prematurely
📖
47:05Note that GridRayCast() terminates prematurely
📖
47:55Step in to GridRayCast()
🏃
47:55Step in to GridRayCast()
🏃
47:55Step in to GridRayCast()
🏃
48:21Disable multithreading of the lighting
48:21Disable multithreading of the lighting
48:21Disable multithreading of the lighting
49:00Wonder why a second thread apparently hit the RayDebugging branch
🏃
49:00Wonder why a second thread apparently hit the RayDebugging branch
🏃
49:00Wonder why a second thread apparently hit the RayDebugging branch
🏃
50:09Step through GridRayCast()
🏃
50:09Step through GridRayCast()
🏃
50:09Step through GridRayCast()
🏃
50:44Fix the CostMetric test in GridRayCast() to let it actually proceed through the walk
50:44Fix the CostMetric test in GridRayCast() to let it actually proceed through the walk
50:44Fix the CostMetric test in GridRayCast() to let it actually proceed through the walk
51:09Step through GridRayCast()
🏃
51:09Step through GridRayCast()
🏃
51:09Step through GridRayCast()
🏃
51:26Switch to -O2 and re-enable multithreading of the lighting
51:26Switch to -O2 and re-enable multithreading of the lighting
51:26Switch to -O2 and re-enable multithreading of the lighting
51:49See that the ray cast is walking through the grid in the wrong direction
🏃
51:49See that the ray cast is walking through the grid in the wrong direction
🏃
51:49See that the ray cast is walking through the grid in the wrong direction
🏃
52:48Scour ComputeWalkTable() for a sign bug
📖
52:48Scour ComputeWalkTable() for a sign bug
📖
52:48Scour ComputeWalkTable() for a sign bug
📖
56:02Fix ComputeWalkTable() to recentre the test At location within the cell as it proceeds
56:02Fix ComputeWalkTable() to recentre the test At location within the cell as it proceeds
56:02Fix ComputeWalkTable() to recentre the test At location within the cell as it proceeds
57:29See that the ray cast continues to walk in the wrong direction
🏃
57:29See that the ray cast continues to walk in the wrong direction
🏃
57:29See that the ray cast continues to walk in the wrong direction
🏃
57:53Continue to scour ComputeWalkTable() for a sign bug
📖
57:53Continue to scour ComputeWalkTable() for a sign bug
📖
57:53Continue to scour ComputeWalkTable() for a sign bug
📖
59:20Follow the WalkTable through GridRayCast()
📖
59:20Follow the WalkTable through GridRayCast()
📖
59:20Follow the WalkTable through GridRayCast()
📖
1:01:00Switch to -Od and disable multithreading of the lighting
1:01:00Switch to -Od and disable multithreading of the lighting
1:01:00Switch to -Od and disable multithreading of the lighting
1:01:58Step in to GridRayCast() to find a WalkTableOffset of 0 for everybody
🏃
1:01:58Step in to GridRayCast() to find a WalkTableOffset of 0 for everybody
🏃
1:01:58Step in to GridRayCast() to find a WalkTableOffset of 0 for everybody
🏃
1:03:22Fix ComputeWalkTable() to increment the DestIndex
1:03:22Fix ComputeWalkTable() to increment the DestIndex
1:03:22Fix ComputeWalkTable() to increment the DestIndex
1:03:40Run (or walk?) a single-threaded -Od build of the game
🏃
1:03:40Run (or walk?) a single-threaded -Od build of the game
🏃
1:03:40Run (or walk?) a single-threaded -Od build of the game
🏃
1:03:54Switch to -O2 and re-enable multithreading of the lighting
1:03:54Switch to -O2 and re-enable multithreading of the lighting
1:03:54Switch to -O2 and re-enable multithreading of the lighting
1:04:29Compiler feature request: Swappable optimised and debug versions of routines
🗹
1:04:29Compiler feature request: Swappable optimised and debug versions of routines
🗹
1:04:29Compiler feature request: Swappable optimised and debug versions of routines
🗹
1:05:30See that the ray cast now walks in the correct general direction, but never diverges from the vertical
🏃
1:05:30See that the ray cast now walks in the correct general direction, but never diverges from the vertical
🏃
1:05:30See that the ray cast now walks in the correct general direction, but never diverges from the vertical
🏃
1:05:49Fix GridRayCast() to increment the WalkTable
1:05:49Fix GridRayCast() to increment the WalkTable
1:05:49Fix GridRayCast() to increment the WalkTable
1:06:31Admire our nice walk table stepping
🏃
1:06:31Admire our nice walk table stepping
🏃
1:06:31Admire our nice walk table stepping
🏃
1:07:56Try to limit GridRayCast() to draw only one ray
1:07:56Try to limit GridRayCast() to draw only one ray
1:07:56Try to limit GridRayCast() to draw only one ray
1:09:09See our single ray
🏃
1:09:09See our single ray
🏃
1:09:09See our single ray
🏃
1:09:31Make FullCast() pass a designated debug ray to GridRayCast()
1:09:31Make FullCast() pass a designated debug ray to GridRayCast()
1:09:31Make FullCast() pass a designated debug ray to GridRayCast()
1:13:23See our single ray, which sadly does not hit
🏃
1:13:23See our single ray, which sadly does not hit
🏃
1:13:23See our single ray, which sadly does not hit
🏃
1:13:35Make FullCast() pass different rays to GridRayCast() using trial and error
🏃
🖮
1:13:35Make FullCast() pass different rays to GridRayCast() using trial and error
🏃
🖮
1:13:35Make FullCast() pass different rays to GridRayCast() using trial and error
🏃
🖮
1:16:16Reacquaint ourselves with GenerateOctahedralLightingPattern() from hhsphere
📖
1:16:16Reacquaint ourselves with GenerateOctahedralLightingPattern() from hhsphere
📖
1:16:16Reacquaint ourselves with GenerateOctahedralLightingPattern() from hhsphere
📖
1:17:40Make FullCast() pass ray 36, the central one in the map, to GridRayCast()
🏃
🖮
1:17:40Make FullCast() pass ray 36, the central one in the map, to GridRayCast()
🏃
🖮
1:17:40Make FullCast() pass ray 36, the central one in the map, to GridRayCast()
🏃
🖮
1:17:49Admire our single ray, which hits
🏃
1:17:49Admire our single ray, which hits
🏃
1:17:49Admire our single ray, which hits
🏃
1:18:31Rerun the game to regenerate the WalkTable, and admire our ray
🏃
1:18:31Rerun the game to regenerate the WalkTable, and admire our ray
🏃
1:18:31Rerun the game to regenerate the WalkTable, and admire our ray
🏃
1:20:01Try and make GridRayCast() colour the boxes differently
1:20:01Try and make GridRayCast() colour the boxes differently
1:20:01Try and make GridRayCast() colour the boxes differently
1:21:04See that the boxes remain the same colour
🏃
1:21:04See that the boxes remain the same colour
🏃
1:21:04See that the boxes remain the same colour
🏃
1:21:12Embark on systemically disabling the lighting for CompileZBiasProgram()
📖
1:21:12Embark on systemically disabling the lighting for CompileZBiasProgram()
📖
1:21:12Embark on systemically disabling the lighting for CompileZBiasProgram()
📖
1:22:15Demo the unlit debug UI
🏃
1:22:15Demo the unlit debug UI
🏃
1:22:15Demo the unlit debug UI
🏃
1:22:28Make CompileZBiasProgram() use a passed in Emission value to apply lighting to the texture, augmenting opengl_program_common with a VertEmission
1:22:28Make CompileZBiasProgram() use a passed in Emission value to apply lighting to the texture, augmenting opengl_program_common with a VertEmission
1:22:28Make CompileZBiasProgram() use a passed in Emission value to apply lighting to the texture, augmenting opengl_program_common with a VertEmission
1:33:06Hit OpenGL error: Index out of range
🏃
1:33:06Hit OpenGL error: Index out of range
🏃
1:33:06Hit OpenGL error: Index out of range
🏃
1:33:47Make OpenGLCreateProgram() set the VertEmission
1:33:47Make OpenGLCreateProgram() set the VertEmission
1:33:47Make OpenGLCreateProgram() set the VertEmission
1:35:03Hit OpenGL error: Undefined variable "Emission"
🏃
1:35:03Hit OpenGL error: Undefined variable "Emission"
🏃
1:35:03Hit OpenGL error: Undefined variable "Emission"
🏃
1:35:45Fix naming of FragEmission in CompileZBiasProgram()
1:35:45Fix naming of FragEmission in CompileZBiasProgram()
1:35:45Fix naming of FragEmission in CompileZBiasProgram()
1:35:54Hit a read access violation inside the OpenGL driver
🏃
1:35:54Hit a read access violation inside the OpenGL driver
🏃
1:35:54Hit a read access violation inside the OpenGL driver
🏃
1:36:37Fix the Emission texture binding in UseProgramBegin()
1:36:37Fix the Emission texture binding in UseProgramBegin()
1:36:37Fix the Emission texture binding in UseProgramBegin()
1:37:02See that the debug UI is now being lit
🏃
1:37:02See that the debug UI is now being lit
🏃
1:37:02See that the debug UI is now being lit
🏃
1:37:15Make WriteQuad() set Emission to 0, and PushQuad() set it to black or white depending on whether lighting is enabled
1:37:15Make WriteQuad() set Emission to 0, and PushQuad() set it to black or white depending on whether lighting is enabled
1:37:15Make WriteQuad() set Emission to 0, and PushQuad() set it to black or white depending on whether lighting is enabled
1:41:01See that the debug UI is correctly unlit again
🏃
1:41:01See that the debug UI is correctly unlit again
🏃
1:41:01See that the debug UI is correctly unlit again
🏃
1:41:21Make PushLineSegment() pass to PushQuad() an Emission value of 1.0f
1:41:21Make PushLineSegment() pass to PushQuad() an Emission value of 1.0f
1:41:21Make PushLineSegment() pass to PushQuad() an Emission value of 1.0f
1:44:02See that our ray walk boxes are now coloured differently
🏃
1:44:02See that our ray walk boxes are now coloured differently
🏃
1:44:02See that our ray walk boxes are now coloured differently
🏃
1:44:46Make GridRayCast() colour the leaf and edge nodes differently
1:44:46Make GridRayCast() colour the leaf and edge nodes differently
1:44:46Make GridRayCast() colour the leaf and edge nodes differently
1:46:13Check out our differently coloured ray walk boxes
🏃
1:46:13Check out our differently coloured ray walk boxes
🏃
1:46:13Check out our differently coloured ray walk boxes
🏃
1:46:40Make GridRayCast() colour the leaf and edge nodes even more differently
1:46:40Make GridRayCast() colour the leaf and edge nodes even more differently
1:46:40Make GridRayCast() colour the leaf and edge nodes even more differently
1:46:58Check out our differently coloured ray walk boxes
🏃
1:46:58Check out our differently coloured ray walk boxes
🏃
1:46:58Check out our differently coloured ray walk boxes
🏃
1:47:49Q&A
🗩
1:47:49Q&A
🗩
1:47:49Q&A
🗩
1:48:03sagian2005 Casey's hair is starting to look a little cartoonish1
🗪
1:48:03sagian2005 Casey's hair is starting to look a little cartoonish1
🗪
1:48:03sagian2005 Casey's hair is starting to look a little cartoonish1
🗪
1:48:33Tease a Wilson cosplay attempt2
📖
1:48:33Tease a Wilson cosplay attempt2
📖
1:48:33Tease a Wilson cosplay attempt2
📖
1:48:52insobot Q: 5+ hour Majora's Mask?
🗪
1:48:52insobot Q: 5+ hour Majora's Mask?
🗪
1:48:52insobot Q: 5+ hour Majora's Mask?
🗪
1:49:08uplinkcoder Q: Performance might have changed since you removed the early-out
🗪
1:49:08uplinkcoder Q: Performance might have changed since you removed the early-out
🗪
1:49:08uplinkcoder Q: Performance might have changed since you removed the early-out
🗪
1:50:36Wrap it up
🗩
1:50:36Wrap it up
🗩
1:50:36Wrap it up
🗩