[video output=day597 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Basic Kd-tree Construction" vod_platform=youtube id=OzoG0cuV5_A annotator=Miblo] [0:01][Recap our Snuffleupagus oriented k-d tree implementation, and set the stage for the day][:"data structure" :lighting :speech] [2:04][Introduce SplitKd() to replace SplitBox()][:"data structure" :lighting] [2:52][Determine to divide up the :lighting box hierarchy the same as before][:"data structure" :research] [3:54][Note that the current splitting code allows overlapping rectangles][:"data structure" :lighting :research] [8:03][Begin to change RayCast() to handle overlapping rectangles][:"data structure" :lighting] [10:30][Undo our changes to RayCast()][:"data structure" :lighting] [11:43][Begin to make RayCast() use the FirstLeafIndex to permit overlapping rectangles][:"data structure" :lighting] [14:43][Undo our changes to RayCast()][:"data structure" :lighting] [15:05][Implement SplitKd() to split boxes in half along the k-d axis][:"data structure" :lighting] [32:35][Consider packing the FirstLeafIndex, LeafCount and KdIndex into the Sides value][:"data structure" :lighting :research] [33:54][Make SplitKd() pack the FirstLeafIndex, LeafCount and KdIndex into the Sides value][:"data structure" :lighting] [38:37][Permit SplitKd() to push U16Max KdNodes, and clean up compile errors][:"data structure" :lighting] [41:20][Enable SplitKd() to perform the actual split, adding to both sides if we split down the middle][:"data structure" :lighting] [51:02][Make BuildSpatialPartitionForLighting() call SplitKd(), defining a LIGHTING_USE_OLD_KD switch][:"data structure" :lighting] [53:50][:Run hhlightprof successfully with the old k-d way][:"data structure" :lighting] [54:17][Toggle off LIGHTING_USE_OLD_KD and fix compile errors, augmenting lighting_solution with a RootKdValue][:"data structure" :lighting] [56:54][:Run hhlightprof and hit a read access violation][:"data structure" :lighting] [57:09][:Run hhlightprof and hit a read access violation on the KdNodes][:"data structure" :lighting] [57:26][Make ProfileRun() allocate space for the KdNodes][:"data structure" :lighting :memory] [58:29][:Run hhlightprof and apparently infinitely loop on SplitKd()][:"data structure" :lighting] [59:10][Remove FirstLeafIndex, LeafCount and KdIndex from kd_tree_node, storing the KdIndex in the Sides value and introducing UNPACK_NEXT_KD_INDEX()][:"data structure" :lighting] [1:05:12][Scour SplitKd() for bugs][:"data structure" :lighting :research] [1:09:43][Step through SplitKd() to our feedback loop situation, and inspect the values][:"data structure" :lighting :run] [1:12:36][~RemedyBG feature request: User-programmable data type watch summary / representation][:admin] [1:18:38][Again step through SplitKd() and inspect the BoxBounds][:"data structure" :lighting :run] [1:20:33][Enable SplitKd() to handle non-split leaves][:"data structure" :lighting] [1:22:39][:Run hhlightprof without crashing][:"data structure" :lighting] [1:22:53][Step through RayCast() and inspect its values, until hitting a write access violation][:"data structure" :lighting :run] [1:25:20][:Run hhlightprof without completing the first ray cast pass][:"data structure" :lighting] [1:26:13][Again step through RayCast() and inspect its values][:"data structure" :lighting :run] [1:27:43][:Run hhlightprof in -O2 to completion of the first ray cast pass][:"data structure" :lighting] [1:29:11][Switch to -Od and toggle on LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:29:24][:Run hhlightprof to completion][:"data structure" :lighting] [1:29:35][Toggle off LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:29:45][Scour RayCast() for bugs][:"data structure" :lighting :research] [1:30:43][Try restricting RayCast() to only traverse down the StartSide][:"data structure" :lighting] [1:31:04][:Run hhlightprof to (non-instant) completion][:"data structure" :lighting] [1:31:11][Continue to scour RayCast() for bugs][:"data structure" :lighting :research] [1:32:37][:Run hhlightprof in -O2][:"data structure" :lighting] [1:33:00][Make RayCast() increment the TotalPartitionsTested before pushing on the StartSide][:"data structure" :lighting] [1:33:40][:Run hhlightprof in -O2][:"data structure" :lighting] [1:33:56][Toggle on LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:34:08][:Run hhlightprof to find that the new k-d implementation tests many more leaves][:"data structure" :lighting] [1:34:53][Toggle off LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:36:08][Try making SplitKd() build a more usable k-d tree][:"data structure" :lighting] [1:38:15][:Run hhlightprof without completing][:"data structure" :lighting] [1:38:41][Make ProfileRun() print out the KD Mode][:"data structure" :lighting] [1:41:15][:Run hhlightprof][:"data structure" :lighting] [1:41:21][Toggle on LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:41:35][:Run hhlightprof to see that the new k-d implementation does not add many more leaves][:"data structure" :lighting] [1:41:49][Scour RayCast() for bugs][:"data structure" :lighting :research] [1:43:21][Try preventing RayCast() from descending the tree][:"data structure" :lighting] [1:43:27][Old k-d hhlightprof leaves tested: 496197][:"data structure" :lighting :run] [1:43:55][Toggle off LIGHTING_USE_OLD_KD][:"data structure" :lighting] [1:44:09][New k-d hhlightprof leaves tested: 5773056][:"data structure" :lighting :run] [1:45:10][Step through RayCast() in -Od to find 32 unsplit leaves][:"data structure" :lighting :run] [1:46:24][Scour SplitKd() for bugs][:"data structure" :lighting :research] [1:50:14][Try making SplitKd() split boxes that are on the PlaneD][:"data structure" :lighting] [1:51:02][Step through SplitKd() to find that almost all boxes straddle the centre of the bounds][:"data structure" :lighting :run] [1:53:09][Scour BuildSpatialPartitionForLighting() and SplitKd() for bugs][:"data structure" :lighting :research] [1:55:11][Step through SplitKd() to find a 35 unit long box][:"data structure" :lighting :run] [1:56:17][Scour ProfileRun() for bugs in transforming the box bounds][:"data structure" :lighting :research] [1:57:22][Continue to step through SplitKd() to find identical BoxMax values for all boxes][:"data structure" :lighting :run] [1:58:25][Step through the box bounds transformation in ProfileRun(), and on to SplitKd()][:"data structure" :lighting :run] [2:01:48][Realise we incorrectly index into the Box, thanks to ~RemedyBG][:"data structure" :lighting :run] [2:02:56][Fix SplitKd() to index into the Box using DimIndex rather than KdIndex][:"data structure" :lighting] [2:03:19][:Run hhlightprof in -Od][:"data structure" :lighting] [2:03:44][-O2 k-d hhlightprof leaves tested: 375920][:"data structure" :lighting :run] [2:04:18][Let RayCast() traverse the whole tree][:"data structure" :lighting] [2:04:32][:Run hhlightprof until… the heat death of the universe?][:"data structure" :lighting] [/video]