Handmade Hero»Episode Guide
Early Termination for the Grid Raytracer
?
?

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:02Welcome to the stream
🗩
0:02Welcome to the stream
🗩
0:02Welcome to the stream
🗩
0:44Grid Raytracing for Light Probes
🖌
0:44Grid Raytracing for Light Probes
🖌
0:44Grid Raytracing for Light Probes
🖌
3:00Early Termination of Grid Raytracing
🖌
3:00Early Termination of Grid Raytracing
🖌
3:00Early Termination of Grid Raytracing
🖌
9:28Prepare to enable GridRayCast() to early terminate the tRay picking
📖
9:28Prepare to enable GridRayCast() to early terminate the tRay picking
📖
9:28Prepare to enable GridRayCast() to early terminate the tRay picking
📖
12:14Enable GridRayCast() to early terminate the tRay picking using a CostMetric
12:14Enable GridRayCast() to early terminate the tRay picking using a CostMetric
12:14Enable GridRayCast() to early terminate the tRay picking using a CostMetric
19:15Erroneous hit registration due to multiple pieces of geometry in the same voxel
🖌
19:15Erroneous hit registration due to multiple pieces of geometry in the same voxel
🖌
19:15Erroneous hit registration due to multiple pieces of geometry in the same voxel
🖌
21:11Make a note in BuildSpatialPartitionForLighting() to clip boxes to the cells
21:11Make a note in BuildSpatialPartitionForLighting() to clip boxes to the cells
21:11Make a note in BuildSpatialPartitionForLighting() to clip boxes to the cells
22:30Continue to enable GridRayCast() to early terminate the tRay picking, introducing a version of ComputeVoxelIrradianceAt() that takes a grid index
22:30Continue to enable GridRayCast() to early terminate the tRay picking, introducing a version of ComputeVoxelIrradianceAt() that takes a grid index
22:30Continue to enable GridRayCast() to early terminate the tRay picking, introducing a version of ComputeVoxelIrradianceAt() that takes a grid index
24:18Reacquaint ourselves with the Outgoing parameter of ComputeVoxelIrradianceAt()
📖
24:18Reacquaint ourselves with the Outgoing parameter of ComputeVoxelIrradianceAt()
📖
24:18Reacquaint ourselves with the Outgoing parameter of ComputeVoxelIrradianceAt()
📖
27:26Make a note in ComputeVoxelIrradianceAt() to use -Outgoing
27:26Make a note in ComputeVoxelIrradianceAt() to use -Outgoing
27:26Make a note in ComputeVoxelIrradianceAt() to use -Outgoing
27:58Set up the early termination path in GridRayCast() to use the original ComputeVoxelIrradianceAt()
27:58Set up the early termination path in GridRayCast() to use the original ComputeVoxelIrradianceAt()
27:58Set up the early termination path in GridRayCast() to use the original ComputeVoxelIrradianceAt()
41:47Introduce walk_table_entry for GridRayCast() to use
41:47Introduce walk_table_entry for GridRayCast() to use
41:47Introduce walk_table_entry for GridRayCast() to use
44:42Make GridRayCast() decrement the CostMetric when testing leaves
44:42Make GridRayCast() decrement the CostMetric when testing leaves
44:42Make GridRayCast() decrement the CostMetric when testing leaves
49:09Consider the case when our ray doesn't hit anything, using ambient or moon light
📖
49:09Consider the case when our ray doesn't hit anything, using ambient or moon light
📖
49:09Consider the case when our ray doesn't hit anything, using ambient or moon light
📖
52:28Crash hhlightprof in RayCast()
🏃
52:28Crash hhlightprof in RayCast()
🏃
52:28Crash hhlightprof in RayCast()
🏃
53:01Crash an -Od build of hhlightprof in RayCast()
🏃
53:01Crash an -Od build of hhlightprof in RayCast()
🏃
53:01Crash an -Od build of hhlightprof in RayCast()
🏃
54:28Update BuildSpatialPartitionForLighting() to build the SpatialPartition with an apron for grid raycasting, introducing GetVoxelIndexForP()
54:28Update BuildSpatialPartitionForLighting() to build the SpatialPartition with an apron for grid raycasting, introducing GetVoxelIndexForP()
54:28Update BuildSpatialPartitionForLighting() to build the SpatialPartition with an apron for grid raycasting, introducing GetVoxelIndexForP()
1:20:31Break
🗹
1:20:31Break
🗹
1:20:31Break
🗹
1:20:54New Away From Keyboard Screen!
🗹
1:20:54New Away From Keyboard Screen!
🗹
1:20:54New Away From Keyboard Screen!
🗹
1:23:33Return with Bunny Fruit Snacks
🗹
1:23:33Return with Bunny Fruit Snacks
🗹
1:23:33Return with Bunny Fruit Snacks
🗹
1:23:57somebody_took_my_name Q: I think there is a bug in GridIndexFrom(), VoxelDim.z is used instead of just Z
🗪
1:23:57somebody_took_my_name Q: I think there is a bug in GridIndexFrom(), VoxelDim.z is used instead of just Z
🗪
1:23:57somebody_took_my_name Q: I think there is a bug in GridIndexFrom(), VoxelDim.z is used instead of just Z
🗪
1:24:20Fix GridIndexFrom() to use the passed in Z, and a typo in GetVoxelIndexForP()
1:24:20Fix GridIndexFrom() to use the passed in Z, and a typo in GetVoxelIndexForP()
1:24:20Fix GridIndexFrom() to use the passed in Z, and a typo in GetVoxelIndexForP()
1:26:08Continue to update BuildSpatialPartitionForLighting() to build the SpatialPartition for grid raycasting
1:26:08Continue to update BuildSpatialPartitionForLighting() to build the SpatialPartition for grid raycasting
1:26:08Continue to update BuildSpatialPartitionForLighting() to build the SpatialPartition for grid raycasting
1:40:21Make BuildSpatialPartitionForLighting() clip boxes to the voxels, introducing GetVoxelCellBounds() and Intersect()
1:40:21Make BuildSpatialPartitionForLighting() clip boxes to the voxels, introducing GetVoxelCellBounds() and Intersect()
1:40:21Make BuildSpatialPartitionForLighting() clip boxes to the voxels, introducing GetVoxelCellBounds() and Intersect()
1:49:56A few words on balancing code cleanliness and avoidance of work that gets undone
🗩
1:49:56A few words on balancing code cleanliness and avoidance of work that gets undone
🗩
1:49:56A few words on balancing code cleanliness and avoidance of work that gets undone
🗩
1:52:02Make ProfileRun() initialise a TempArena to pass to InternalLightingCore() and through to BuildSpatialPartitionForLighting(), removing TestRayCast()
1:52:02Make ProfileRun() initialise a TempArena to pass to InternalLightingCore() and through to BuildSpatialPartitionForLighting(), removing TestRayCast()
1:52:02Make ProfileRun() initialise a TempArena to pass to InternalLightingCore() and through to BuildSpatialPartitionForLighting(), removing TestRayCast()
1:57:19Make BuildSpatialPartitionForLighting() mark the SPATIAL_GRID_NODE_TERMINATOR apron nodes
1:57:19Make BuildSpatialPartitionForLighting() mark the SPATIAL_GRID_NODE_TERMINATOR apron nodes
1:57:19Make BuildSpatialPartitionForLighting() mark the SPATIAL_GRID_NODE_TERMINATOR apron nodes
2:02:40Anticipate building the WalkTable
📖
2:02:40Anticipate building the WalkTable
📖
2:02:40Anticipate building the WalkTable
📖
2:04:47Sketch out the tTerminate computation in ComputeWalkTable()
2:04:47Sketch out the tTerminate computation in ComputeWalkTable()
2:04:47Sketch out the tTerminate computation in ComputeWalkTable()
2:06:03Q&A
🗩
2:06:03Q&A
🗩
2:06:03Q&A
🗩
2:06:25mattiamanzati Q: While you typed in the check for the apron filling with special value, in checking the last max I think you put an X instead of a Z
🗪
2:06:25mattiamanzati Q: While you typed in the check for the apron filling with special value, in checking the last max I think you put an X instead of a Z
🗪
2:06:25mattiamanzati Q: While you typed in the check for the apron filling with special value, in checking the last max I think you put an X instead of a Z
🗪
2:06:28Fix typo in BuildSpatialPartitionForLighting()
2:06:28Fix typo in BuildSpatialPartitionForLighting()
2:06:28Fix typo in BuildSpatialPartitionForLighting()
2:07:08insobot Q: Salad isn't real saving anyway, don't start with a cloudy day is it quantum computing?
🗪
2:07:08insobot Q: Salad isn't real saving anyway, don't start with a cloudy day is it quantum computing?
🗪
2:07:08insobot Q: Salad isn't real saving anyway, don't start with a cloudy day is it quantum computing?
🗪
2:07:20jarput Q: Did you watch the UE 5 demo? Have you any thoughts about it?
🗪
2:07:20jarput Q: Did you watch the UE 5 demo? Have you any thoughts about it?
🗪
2:07:20jarput Q: Did you watch the UE 5 demo? Have you any thoughts about it?
🗪
2:07:50madmike_99 Q: Can you watch the demo live?
🗪
2:07:50madmike_99 Q: Can you watch the demo live?
🗪
2:07:50madmike_99 Q: Can you watch the demo live?
🗪
2:08:42guybru5h_vi Q: What was the original justification for switching to the probe-based GI?
🗪
2:08:42guybru5h_vi Q: What was the original justification for switching to the probe-based GI?
🗪
2:08:42guybru5h_vi Q: What was the original justification for switching to the probe-based GI?
🗪
2:12:24mattiamanzati Q: Did I remember correctly that our lighting partitions aren't fixed in world size, but are fixed in number among x / y / z? Does that mean that eventually we can't have the ideal situation where the lighting voxel is aligned with world blocks, and light voxel size is a multiplier / subdivider of the game grid size, so that most of the lighting occluder voxels are not partially filled but mostly filled?
🗪
2:12:24mattiamanzati Q: Did I remember correctly that our lighting partitions aren't fixed in world size, but are fixed in number among x / y / z? Does that mean that eventually we can't have the ideal situation where the lighting voxel is aligned with world blocks, and light voxel size is a multiplier / subdivider of the game grid size, so that most of the lighting occluder voxels are not partially filled but mostly filled?
🗪
2:12:24mattiamanzati Q: Did I remember correctly that our lighting partitions aren't fixed in world size, but are fixed in number among x / y / z? Does that mean that eventually we can't have the ideal situation where the lighting voxel is aligned with world blocks, and light voxel size is a multiplier / subdivider of the game grid size, so that most of the lighting occluder voxels are not partially filled but mostly filled?
🗪
2:15:09mindmark42 Q: Could you put moon blocks in the apron so you always hit something instead of using a special index? Maybe that might help your multi-condition loop?
🗪
2:15:09mindmark42 Q: Could you put moon blocks in the apron so you always hit something instead of using a special index? Maybe that might help your multi-condition loop?
🗪
2:15:09mindmark42 Q: Could you put moon blocks in the apron so you always hit something instead of using a special index? Maybe that might help your multi-condition loop?
🗪
2:17:13tonewexperiences Q: Can you move the play button on the page a bit down because on first glance the horizontal line of "L" lets it look like it has a partial drop shadow which drives me mad
🗪
2:17:13tonewexperiences Q: Can you move the play button on the page a bit down because on first glance the horizontal line of "L" lets it look like it has a partial drop shadow which drives me mad
🗪
2:17:13tonewexperiences Q: Can you move the play button on the page a bit down because on first glance the horizontal line of "L" lets it look like it has a partial drop shadow which drives me mad
🗪
2:17:33mattiamanzati Q: Uuuh, so essentially every LightingVoxelDim is consistent across frames even if camera zooms in / out? I thought that VoxelDim was calculated by taking WorldRegionToRenderSize divided by max number of lighting voxels per axis
🗪
2:17:33mattiamanzati Q: Uuuh, so essentially every LightingVoxelDim is consistent across frames even if camera zooms in / out? I thought that VoxelDim was calculated by taking WorldRegionToRenderSize divided by max number of lighting voxels per axis
🗪
2:17:33mattiamanzati Q: Uuuh, so essentially every LightingVoxelDim is consistent across frames even if camera zooms in / out? I thought that VoxelDim was calculated by taking WorldRegionToRenderSize divided by max number of lighting voxels per axis
🗪
2:18:20tinspin Q: What is my best shot at getting a standalone C++ compiler bundled with my engine?
🗪
2:18:20tinspin Q: What is my best shot at getting a standalone C++ compiler bundled with my engine?
🗪
2:18:20tinspin Q: What is my best shot at getting a standalone C++ compiler bundled with my engine?
🗪
2:20:28madmike_99 Q: Do you think "const" is useful for function arguments in certain cases or is it kind of whatever? Sorry if you get asked this often
🗪
2:20:28madmike_99 Q: Do you think "const" is useful for function arguments in certain cases or is it kind of whatever? Sorry if you get asked this often
🗪
2:20:28madmike_99 Q: Do you think "const" is useful for function arguments in certain cases or is it kind of whatever? Sorry if you get asked this often
🗪
2:21:52tinspin Q: What do you compile with? cl.exe1
🗪
2:21:52tinspin Q: What do you compile with? cl.exe1
🗪
2:21:52tinspin Q: What do you compile with? cl.exe1
🗪
2:24:17Close this down
🗩
2:24:17Close this down
🗩
2:24:17Close this down
🗩