diff --git a/cmuratori/hero/code/code602.hmml b/cmuratori/hero/code/code602.hmml new file mode 100644 index 0000000..66976c2 --- /dev/null +++ b/cmuratori/hero/code/code602.hmml @@ -0,0 +1,48 @@ +[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]