[video output=day608 member=cmuratori stream_platform=twitch stream_username=handmade_hero  project=code title="Visualizing Lighting Values" vod_platform=youtube id=rVJw10RkR9c annotator=Miblo]
[0:01][Note Twitch's latest twitchiness[ref
    site="Handmade Hero"
    page=Watch
    url=https://handmadehero.org/watch]][:speech]
[1:26][Determine to do a :lighting quality pass][:speech]
[4:50][Debugging the :lighting: 1) Trial-and-error eyeballing][:speech]
[5:28][Debugging the :lighting: 2) Create and validate against our own definition of correct lighting behaviour][:speech]
[7:48][Regret not having gained much experience with :lighting][:speech]
[8:27][Demo our ability to debug the raycaster][:"debug visualisation" :lighting :run]
[10:19][ComputeLightPropagationWork cycle use: 82%][:lighting :performance :run]
[11:23][Approaching :lighting transfer][:run]
[13:52][Approaching :lighting transfer: Draw lines through the centre of each grid cube, derived from the octahedral map, with brighter directions drawn longer][:"debug visualisation" :run]
[15:59][Try increasing the W modification from ×0.75 to ×0.1 in BuildDiffuseLightMaps()][:lighting]
[16:23][Demo the slow, but feeding back, :lighting transfer, with the determination to step the lighting frame-by-frame][:run]
[17:49][Determine to draw those octahedral lines in a smaller secondary debug bounds][:"debug visualisation" :lighting :run]
[19:34][Introduce DebugDrawOctahedralValues() for UpdateLighting() to call][:"debug visualisation" :lighting]
[21:05][Note that the diffuse blur is probably providing too much power to the system][:lighting :speech]
[22:23][Make DebugDrawOctahedralValues() draw out our desired debug bounds][:"debug visualisation" :lighting]
[29:44][Introduce a version of * that takes a v3s and s32, and fix compile errors][:"debug visualisation" :lighting :mathematics]
[31:00][Check out our debug boxes][:"debug visualisation" :lighting :run]
[31:37][Make DebugDrawOctahedralValues() draw our octahedral lines][:"debug visualisation" :lighting]
[39:13][Check out our octahedral lines][:"debug visualisation" :lighting :run]
[40:00][Make PushLightingRenderValues() Clamp01() the Color][:lighting]
[42:46][The octahedral lines do not remain white][:"debug visualisation" :lighting :run]
[43:10][Fix PushLightingRenderValues() to Clamp01() the Line->Color and pass the resulting Color to PushLineSegment()][:"debug visualisation" :lighting]
[43:24][Our octahedral lines still do not remain white][:"debug visualisation" :lighting :run]
[43:49][Fix PushLightingRenderValues() to pass the clamped Color to PushLineSegment() for both ends][:"debug visualisation" :lighting]
[44:01][Our octahedral lines now remain white][:"debug visualisation" :lighting :run]
[44:20][Determine to support stepping the lighting frame-by-frame][:run]
[44:58][Prevent UpdateAndRenderWorld() from calling UpdateLighting()][:lighting]
[46:08][We get no :lighting][:run]
[46:19][Make UpdateAndRenderWorld() call UpdateLighting() when we press F9][:"input handling" :lighting]
[47:58][Step the :lighting frame-by-frame with F9][:"input handling" :lighting :run]
[49:25][Delete moonlight variables from GridRayCast()][:lighting]
[50:41][Our system contains no moonlight, yet our octahedral maps are seeing more light from above][:"debug visualisation" :lighting :run]
[52:11][Make PushLight() draw the light][:"debug visualisation" :lighting]
[53:55][Check out our lights, and see that our octahedral maps are not really responding to them][:"debug visualisation" :lighting :run]
[55:38][Move the DebugGridIndex and DebugRayIndex DEBUG_VALUE() initialisers from UpdateLighting() to PushLightingRenderValues()][:"debug system" :lighting]
[56:43][Edit our DebugGridIndex and DebugRayIndex to 17912 and 100][:"debug system" :"debug visualisation" :lighting :run]
[58:30][Make UpdateLighting() set DebugGridIndex and DebugRayIndex to 17912 + (SpatialGrid.CellCount.x × SpatialGrid.CellCount.y) and 100][:"debug system" :lighting]
[58:55][Edit our DebugGridIndex and DebugRayIndex to 17912 and 99][:"debug system" :"debug visualisation" :lighting :run]
[1:02:10][Make UpdateLighting() set DebugGridIndex to 17912][:"debug system" :lighting]
[1:02:31][Edit our DebugRayIndex to 156, and wonder if we are writing back into the wrong parts of the octahedral map][:"debug system" :"debug visualisation" :lighting :run]
[1:04:21][Make UpdateLighting() set DebugRayIndex to 156][:"debug system" :lighting]
[1:04:30][Edit our DebugRayIndex to 155][:"debug system" :"debug visualisation" :lighting :run]
[1:05:35][Make UpdateLighting() set DebugRayIndex to 155][:"debug system" :lighting]
[1:05:42][Try making FullCast() pass an Ignored buffer to GridRayCast(), to rule out the :"debug system" interfering with the SpecAtlas][:lighting]
[1:08:57][Our problem remains][:"debug visualisation" :lighting :run]
[1:09:38][Make FullCast() draw the ExpectedDirection that our rays point into their octahedral map][:lighting]
[1:15:38][Our rays and octahedral directions are closely aligned][:"debug visualisation" :lighting :run]
[1:16:52][Try increasing the W modification from ×0.1 to ×0.75 in BuildDiffuseLightMaps()][:lighting]
[1:17:16][Step through the :lighting][:"debug visualisation" :run]
[1:17:43][Make DebugDrawOctahedralValues() increase the length of our octahedral lines][:"debug visualisation" :lighting]
[1:18:34][Step through the :lighting][:"debug visualisation" :run]
[1:19:07][Make DebugDrawOctahedralValues() draw the diffuse atlas lines, introducing DebugDrawColorDir()][:"debug visualisation" :lighting]
[1:22:03][Step through the :lighting, to see that the diffuse atlas grows quickly][:"debug visualisation" :run]
[1:23:06][Temporarily prevent DebugDrawOctahedralValues() from drawing the diffuse atlas lines][:"debug visualisation" :lighting]
[1:23:19][Step through the :lighting, and note the upwards bias][:"debug visualisation" :run]
[1:23:54][Prevent GridRayCast() from transferring the light for non-hits][:lighting]
[1:27:16][Our SpecAtlas is getting light from the wrong directions][:"debug visualisation" :lighting :run]
[1:28:14][Prevent GridRayCast() from transferring the light for hits][:lighting]
[1:28:32][We correctly see no light][:"debug visualisation" :lighting :run]
[1:29:00][Our bug possibilities: 1) False hit reports; 2) Incorrectly writing the direction; 3) Incorrect debug drawing][:lighting :speech]
[1:30:41][Scrutinise FullCast() for write-back errors][:lighting :research]
[1:33:38][Check out our apparent ray hit][:"debug visualisation" :lighting :run]
[1:33:56][Prevent GridRayCast() from transferring the light for non-hits][:lighting]
[1:34:21][Our target ray is correctly not drawn][:"debug visualisation" :lighting :run]
[1:34:55][Move the debug line drawing branch in GridRayCast() outside of the SomethingHit condition][:"debug visualisation" :lighting]
[1:35:25][Check out our misinformed octahedral lines][:"debug visualisation" :lighting :run]
[1:37:00][Edit our DebugGridIndex to 17788][:"debug system" :"debug visualisation" :lighting :run]
[1:38:08][Make UpdateLighting() set DebugGridIndex to 17788][:"debug system" :lighting]
[1:38:29][Edit our DebugRayIndex, hopefully towards a light][:"debug system" :"debug visualisation" :lighting :run]
[1:42:01][Try decreasing the W modification from ×0.75 to ×0.1 in BuildDiffuseLightMaps()][:lighting]
[1:42:51][Edit our DebugRayIndex to 325, directly towards a light][:"debug system" :"debug visualisation" :lighting :run]
[1:43:31][Make UpdateLighting() set DebugRayIndex to 325][:"debug system" :lighting]
[1:44:16][Check out our direct hit][:"debug visualisation" :lighting :run]
[1:45:16][Rename ControlMask to FPControlMask in SetDefaultFPBehavior()[ref
    site=GitHub
    page="HandmadeHero / cpp / ControlMask in SetDefaultFPBehaviour"
    url=https://github.com/HandmadeHero/cpp/issues/118]][:"platform layer"]
[1:46:40][@uplinkcoder][Q: Maybe just have one light source?][:lighting]
[1:47:07][Temporarily prevent GenerateRoom() from adding lamps][:lighting :"procedural generation"]
[1:47:26][Check out our one light][:lighting :run]
[1:47:53][Try increasing the W modification from ×0.1 to ×0.75 in BuildDiffuseLightMaps()][:lighting]
[1:48:00][Our octahedral maps are still seeing light from the wrong directions][:"debug visualisation" :lighting :run]
[1:48:38][A few words on languages with non-helpful "error-catching" features][:language :run]
[1:50:56][Consider our problem to be an indexing one][:"debug visualisation" :lighting :run]
[1:53:12][Q&A][:speech]
[1:53:29][@uplinkcoder][Q: Try moving the light][:lighting]
[1:53:42][Step through the :lighting][:"debug visualisation" :run]
[1:53:57][Make UpdateAndRenderWorld() offset the debug light in X][:lighting]
[1:54:23][See how that affects our octahedral lines][:"debug visualisation" :lighting :run]
[1:55:01][Make UpdateAndRenderWorld() offset the debug light the opposite direction in X][:lighting]
[1:55:17][See how that affects our octahedral lines][:"debug visualisation" :lighting :run]
[1:56:32][Prevent UpdateAndRenderWorld() from offsetting the debug light][:lighting]
[1:57:02][@miltondts][Q: Why are there two lit areas in the map with only one light source?][:lighting]
[1:57:14][The :lighting gets tiled around the world][:run]
[1:58:37][Disable LIGHTING_USE_GRID][:lighting]
[1:58:53][Our :"debug visualisation" is wrong][:lighting :run]
[1:59:27][Let UpdateAndRenderWorld() call UpdateLighting() every frame][:lighting]
[1:59:40][Our :"debug visualisation" is wrong][:lighting :run]
[2:00:01][Scrutinise DebugDrawOctahedralValues() and related functions for bugs][:"debug visualisation" :lighting :research]
[2:06:11][Check out our octahedral lines while moving the light][:"debug visualisation" :lighting :run]
[2:07:41][Let LIGHT_ATLAS_ASSERT() actually Assert()][:language]
[2:09:51][Happily fail to hit any LIGHT_ATLAS_ASSERT()][:"debug visualisation" :lighting :run]
[2:11:03][@uplinkcoder][Q: PushDebugLine() parameter order maybe?][:"debug visualisation" :lighting]
[2:12:05][@uplinkcoder][Q: Direction inverted?][:"debug visualisation" :lighting]
[2:12:11][Eyeball the octahedral lines, not seeing inversion][:"debug visualisation" :lighting :run]
[2:13:35][Briefly scrutinise DirectionFromTxTy() for bugs][:lighting :research]
[2:14:29][@vaualbus][Q: Does this not pass through the thing we did for having the 3D texture? Maybe we are tilting the line in the shader][:"debug visualisation" :lighting]
[2:15:17][Thank you, everyone][:speech]
[/video]
