[video output=day605 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Cleaning Up the Lighting Code" vod_platform=youtube id=KcUfAVOC13k annotator=Miblo] [0:00][Recap and set the stage for the day][:speech] [0:40][Copy into handmade_lighting.h the function signatures of our :lighting system functions] [1:21][Describe the two-stage :lighting system structure, noting our desire to have only one function, UpdateLighting()][:research] [3:57][Look into relieving PushLightingRenderValues() of the need to call SetLightBounds()][:lighting :research] [5:50][Consider storing our light voxel in game_render_commands][:lighting :research] [8:29][Move the VoxelMinCorner and VoxelInvTotalDim from render_setup to game_render_commands as LightingVoxelMinCorner and LightingVoxelInvTotalDim, and propagate this change][:"data structure" :lighting] [11:53][Toggle on LIGHTING_USE_FOUR_RAYS][:lighting] [12:30][Break in ComputeWalkTable()][:lighting :run] [13:05][Fix the infinite loop in ComputeWalkTable()][:lighting] [13:17][See a blank screen][:lighting :run] [13:52][Make the new BuildSpatialPartitionForLighting() only operate if LIGHTING_USE_FOUR_RAYS is disabled][:lighting] [14:37][See the old :lighting, albeit broken][:run] [14:56][Build in -O2][:lighting] [15:11][Check out our broken old :lighting][:run] [15:28][Collapse SetUpLightingRegion() into UpdateLighting()][:lighting] [22:05][See a blank screen][:lighting :run] [22:10][Make UpdateAndRenderWorld() call EnableLighting()][:lighting] [24:43][Check out our broken, yet streamlined, old :lighting][:run] [25:22][Clean up and document UpdateLighting()][:lighting] [33:17][Demo the incorrect :lighting computations and the flash when the :camera moves][:run] [33:47][Fix UpdateAndRenderWorld() to pass the incoming Camera.SimulationCenter to UpdateLighting()][:camera :lighting] [35:10][The flash when moving the :camera is fixed][:lighting :run] [35:31][Finish documenting UpdateLighting()][:lighting] [36:48][Determine to debug wrong :lighting results and remove the lighting_box storage from lighting_solution][:"data structure" :lighting :research] [37:41][Prepare to debug wrong :lighting results, removing SplitKd() and trimming out old test cases from RayCast()] [40:48][The game looks the same][:lighting :run] [40:53][Remove more stale :lighting code] [44:26][Demo the wrong :lighting results][:run] [45:24][Scrutinise RayCast() for errors][:lighting :research] [49:13][Scrutinise ComputeVoxelIrradianceAt() and related functions for errors][:lighting :research] [51:16][Scrutinise the :lighting setup code for errors][:research] [55:08][Fix FullCast() to pass the RayD from the Solution->SamplingSpheres to RayCast()][:lighting] [57:59][Admire our more correct, old :lighting][:run] [58:07][Build in -O2][:lighting] [58:18][Admire our more reasonable, old :lighting][:run] [58:55][Provide an easy means of toggling between the new grid-based and the old AABB ray caster, renaming RayCast() to AABBRayCast()][:lighting] [1:08:11][Check out our old AABB ray cast :lighting][:run] [1:08:35][Split BuildSpatialPartitionForLighting() into GridBuildSpatialPartition() and AABBBuildSpatialPartition()][:lighting] [1:10:51][Check out our old AABB ray cast :lighting][:run] [1:11:03][Toggle on LIGHTING_USE_GRID and fix compile errors][:lighting] [1:11:37][Hit our assertion in FlatIndexFrom()][:lighting :run] [1:13:40][Make GridBuildSpatialPartition() clip the SpatialGrid down by a CellDim][:lighting] [1:16:12][Hit our assertion in FlatIndexFrom()][:lighting :run] [1:17:35][Fix GridBuildSpatialPartition() to pass the BoxBounds to GetIndexForP()][:lighting] [1:18:10][Admire our moonlight][:lighting :run] [1:18:36][Build in -O2][:lighting] [1:18:43][Admire our moonlight][:lighting :run] [1:19:31][Toggle off LIGHTING_USE_GRID][:lighting] [1:19:55][Determine to remove the lighting_box storage from lighting_solution][:lighting :run] [1:20:07][Rename Boxes to AABBBoxes in lighting_solution, remove RootLightBoxIndex, and flow InputBoxes separately through the pipeline][:"data structure" :lighting] [1:30:01][Hit a write access violation on the ParentBox in SplitBox()][:lighting :run] [1:30:14][Make AABBBuildSpatialPartition() initialise the AABBBoxCount to 1][:lighting] [1:30:58][:Run successfully][:lighting] [1:31:06][Add a toggle between the AABB and grid ray caster data in lighting_solution][:"data structure" :lighting] [1:33:19][:Run successfully][:lighting] [1:33:41][Build in -O2][:lighting] [1:33:48][:Run successfully][:lighting] [1:34:08][Change the DebugLines in lighting_solution to be allocated][:"debug system" :lighting :memory] [1:37:41][:Run successfully][:lighting] [1:38:00][Consider further areas for cleanup][:lighting :research] [1:42:22][Introduce lighting_update_params][:"data structure" :lighting] [1:45:35][Plan to split the lighting_solution into pieces][:"data structure" :lighting] [1:48:44][Q&A][:speech] [1:49:18][@somebody_took_my_name][Q: Is the MaxNodeIndex supposed to be in bounds or one past the bound?][:lighting] [1:50:10][@guybru5h_vi][Q: Does the :lighting solution support direct lighting like the sun / moon?] [1:51:15][@bulmanator][Q: Are you doing this on the CPU purely for educational reasons or is there something else?] [1:53:26][@billdstrong][Q: We can put mirrors in every level like Labyrinth][:lighting] [1:54:33][@mindmark42][Q: Can you at some point go over the AVX scatter gather intrinsics?[ref site=Intel page="Intel Intrinsics Guide" url=https://software.intel.com/sites/landingpage/IntrinsicsGuide/]][:isa] [1:59:38][@poikonomo][Q: Do you have an idea of how the gameplay will look like or will you wait to finish the engine before getting to it?] [2:00:08][@stuntcoder][Q: (Off-topic) On earlier streams you have trouble with RSI. After decades of typing, I too have RSI. Any tips?][:health] [2:01:24][@dolseth][Q: Probably covered in some other day, but what's the best update-rate to choose for a game? [@naysayer88 Jon] says it's good to have it high so it looks good on high-update screens, but 120 FPS isn't a multiple of 144 FPS. So what do you recommend?] [2:04:20][@cleffing][Q: Why not take a stab at game design when it's done? Just not interested?] [2:05:08][Thank you, everybody][:speech] [/video]