[video output=day602 member=cmuratori stream_platform=twitch stream_username=handmade_hero  project=code title="Early Termination for the Grid Raytracer" vod_platform=youtube id=hOHIzAkMrIw annotator=Miblo]
[0:02][Welcome to the stream][:speech]
[0:44][Grid Raytracing for Light Probes][:blackboard :geometry :lighting]
[3:00][Early Termination of Grid Raytracing][:blackboard :geometry :lighting]
[9:28][Prepare to enable GridRayCast() to early terminate the tRay picking][:geometry :lighting :research]
[12:14][Enable GridRayCast() to early terminate the tRay picking using a CostMetric][:geometry :lighting]
[19:15][Erroneous hit registration due to multiple pieces of :geometry in the same voxel][:blackboard :lighting]
[21:11][Make a note in BuildSpatialPartitionForLighting() to clip boxes to the cells][:geometry :lighting]
[22:30][Continue to enable GridRayCast() to early terminate the tRay picking, introducing a version of ComputeVoxelIrradianceAt() that takes a grid index][:geometry :lighting]
[24:18][Reacquaint ourselves with the Outgoing parameter of ComputeVoxelIrradianceAt()][:lighting :research]
[27:26][Make a note in ComputeVoxelIrradianceAt() to use -Outgoing][:geometry :lighting]
[27:58][Set up the early termination path in GridRayCast() to use the original ComputeVoxelIrradianceAt()][:geometry :lighting]
[41:47][Introduce walk_table_entry for GridRayCast() to use][:"data structure" :geometry :lighting]
[44:42][Make GridRayCast() decrement the CostMetric when testing leaves][:geometry :lighting]
[49:09][Consider the case when our ray doesn't hit anything, using ambient or moon light][:lighting :research]
[52:28][Crash hhlightprof in RayCast()][:lighting :run]
[53:01][Crash an -Od build of hhlightprof in RayCast()][:lighting :run]
[54:28][Update BuildSpatialPartitionForLighting() to build the SpatialPartition with an apron for grid raycasting, introducing GetVoxelIndexForP()][:lighting]
[1:20:31][Break][:admin]
[1:20:54][New Away From Keyboard Screen!][:admin]
[1:23:33][Return with Bunny Fruit Snacks][:admin]
[1:23:57][@somebody_took_my_name][Q: I think there is a bug in GridIndexFrom(), VoxelDim.z is used instead of just Z][:lighting]
[1:24:20][Fix GridIndexFrom() to use the passed in Z, and a typo in GetVoxelIndexForP()][:lighting]
[1:26:08][Continue to update BuildSpatialPartitionForLighting() to build the SpatialPartition for grid raycasting][:lighting]
[1:40:21][Make BuildSpatialPartitionForLighting() clip boxes to the voxels, introducing GetVoxelCellBounds() and Intersect()][:geometry :lighting]
[1:49:56][A few words on balancing code cleanliness and avoidance of work that gets undone][:speech]
[1:52:02][Make ProfileRun() initialise a TempArena to pass to InternalLightingCore() and through to BuildSpatialPartitionForLighting(), removing TestRayCast()][:lighting :memory]
[1:57:19][Make BuildSpatialPartitionForLighting() mark the SPATIAL_GRID_NODE_TERMINATOR apron nodes][:lighting]
[2:02:40][Anticipate building the WalkTable][:lighting :research]
[2:04:47][Sketch out the tTerminate computation in ComputeWalkTable()][:lighting]
[2:06:03][Q&A][:speech]
[2:06:25][@mattiamanzati][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][:lighting]
[2:06:28][Fix typo in BuildSpatialPartitionForLighting()][:lighting]
[2:07:08][@insobot][Q: Salad isn't real saving anyway, don't start with a cloudy day is it quantum computing?]
[2:07:20][@jarput][Q: Did you watch the UE 5 demo? Have you any thoughts about it?]
[2:07:50][@madmike_99][Q: Can you watch the demo live?]
[2:08:42][@guybru5h_vi][Q: What was the original justification for switching to the probe-based GI?][:lighting]
[2:12:24][@mattiamanzati][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:09][@mindmark42][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?][:lighting]
[2:17:13][@tonewexperiences][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:33][@mattiamanzati][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:20][@tinspin][Q: What is my best shot at getting a standalone C++ compiler bundled with my engine?][:language]
[2:20:28][@madmike_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][:language]
[2:21:52][@tinspin][Q: What do you compile with? cl.exe[ref
    site="Clang: a C language family frontend for LLVM"
    url=https://clang.llvm.org]][:language]
[2:24:17][Close this down][:speech]
[/video]
