Handmade Hero»Episode Guide
Switching from Center-Radius to Min-Max
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:03Plug the Meow the Infinite printed comic Kickstarter1
📖
0:03Plug the Meow the Infinite printed comic Kickstarter1
📖
0:03Plug the Meow the Infinite printed comic Kickstarter1
📖
0:25Recap our creation of hhlightprof
🗩
0:25Recap our creation of hhlightprof
🗩
0:25Recap our creation of hhlightprof
🗩
1:26Demo hhlightprof (7.150223 total seconds elapsed)
🏃
1:26Demo hhlightprof (7.150223 total seconds elapsed)
🏃
1:26Demo hhlightprof (7.150223 total seconds elapsed)
🏃
2:31Describe the two distinct ray casting / box categorisation routines in RayCast()
📖
2:31Describe the two distinct ray casting / box categorisation routines in RayCast()
📖
2:31Describe the two distinct ray casting / box categorisation routines in RayCast()
📖
4:46Describe the lighting_box structure, with the determination to reduce extraneous computations by storing the BoxMin and BoxMax
📖
4:46Describe the lighting_box structure, with the determination to reduce extraneous computations by storing the BoxMin and BoxMax
📖
4:46Describe the lighting_box structure, with the determination to reduce extraneous computations by storing the BoxMin and BoxMax
📖
6:50Replace P and Radius with BoxMin and BoxMax in lighting_box, and begin to propagate this change
6:50Replace P and Radius with BoxMin and BoxMax in lighting_box, and begin to propagate this change
6:50Replace P and Radius with BoxMin and BoxMax in lighting_box, and begin to propagate this change
7:28Why compute the BoxMin and BoxMax part way down the lighting pipeline?
🗩
7:28Why compute the BoxMin and BoxMax part way down the lighting pipeline?
🗩
7:28Why compute the BoxMin and BoxMax part way down the lighting pipeline?
🗩
8:44Continue to update the lighting routines to use BoxMin and BoxMax
8:44Continue to update the lighting routines to use BoxMin and BoxMax
8:44Continue to update the lighting routines to use BoxMin and BoxMax
16:23Run hhlightprof to find that the light boxes and boxrefs don't match, because our storage format has changed
🏃
16:23Run hhlightprof to find that the light boxes and boxrefs don't match, because our storage format has changed
🏃
16:23Run hhlightprof to find that the light boxes and boxrefs don't match, because our storage format has changed
🏃
17:02Enable hhlightprof to transform the old Center-Radius dump to the new Min-Max format
17:02Enable hhlightprof to transform the old Center-Radius dump to the new Min-Max format
17:02Enable hhlightprof to transform the old Center-Radius dump to the new Min-Max format
18:49hhlightprof total seconds elapsed (with the same results as earlier): 6.702761
🏃
18:49hhlightprof total seconds elapsed (with the same results as earlier): 6.702761
🏃
18:49hhlightprof total seconds elapsed (with the same results as earlier): 6.702761
🏃
19:21Make a note to remove the dump transform from hhlightprof
19:21Make a note to remove the dump transform from hhlightprof
19:21Make a note to remove the dump transform from hhlightprof
19:47Reflect on our data storage / computation improvement
📖
19:47Reflect on our data storage / computation improvement
📖
19:47Reflect on our data storage / computation improvement
📖
20:34Further RayCast() optimisations
📖
20:34Further RayCast() optimisations
📖
20:34Further RayCast() optimisations
📖
22:17Further RayCast() optimisations: 1) How do we want to store our tree?
📖
22:17Further RayCast() optimisations: 1) How do we want to store our tree?
📖
22:17Further RayCast() optimisations: 1) How do we want to store our tree?
📖
22:40Further RayCast() optimisations: 2) What does our tree want to look like (e.g. k-d tree)?
📖
22:40Further RayCast() optimisations: 2) What does our tree want to look like (e.g. k-d tree)?
📖
22:40Further RayCast() optimisations: 2) What does our tree want to look like (e.g. k-d tree)?
📖
23:11Further RayCast() optimisations: 3) Do we want the ray casting and the box categorisation in the same loop?
📖
23:11Further RayCast() optimisations: 3) Do we want the ray casting and the box categorisation in the same loop?
📖
23:11Further RayCast() optimisations: 3) Do we want the ray casting and the box categorisation in the same loop?
📖
23:59Determine to investigate the efficiency of our information streaming
📖
23:59Determine to investigate the efficiency of our information streaming
📖
23:59Determine to investigate the efficiency of our information streaming
📖
24:54Separate the ray casting and box categorisation loops in RayCast()
24:54Separate the ray casting and box categorisation loops in RayCast()
24:54Separate the ray casting and box categorisation loops in RayCast()
26:17Augment lighting_work with a lighting_box_pack ScratchSpace array
26:17Augment lighting_work with a lighting_box_pack ScratchSpace array
26:17Augment lighting_work with a lighting_box_pack ScratchSpace array
27:26Make InternalLightingCore() initialise our new ScratchSpace, and make ProfileRun() in hhlightprof allocate space for it
27:26Make InternalLightingCore() initialise our new ScratchSpace, and make ProfileRun() in hhlightprof allocate space for it
27:26Make InternalLightingCore() initialise our new ScratchSpace, and make ProfileRun() in hhlightprof allocate space for it
30:56Memory per thread
📖
30:56Memory per thread
📖
30:56Memory per thread
📖
32:59Make a note to add memory per thread
32:59Make a note to add memory per thread
32:59Make a note to add memory per thread
33:50A few words on memory per thread
📖
33:50A few words on memory per thread
📖
33:50A few words on memory per thread
📖
34:55Run hhlightprof with the same results
🏃
34:55Run hhlightprof with the same results
🏃
34:55Run hhlightprof with the same results
🏃
35:07Temporarily make RayCast() push lighting boxes onto the ScratchSpace
35:07Temporarily make RayCast() push lighting boxes onto the ScratchSpace
35:07Temporarily make RayCast() push lighting boxes onto the ScratchSpace
36:00Run hhlightprof with the same results
🏃
36:00Run hhlightprof with the same results
🏃
36:00Run hhlightprof with the same results
🏃
36:07Revert RayCast() to push boxes onto the old stack array
36:07Revert RayCast() to push boxes onto the old stack array
36:07Revert RayCast() to push boxes onto the old stack array
36:40CTAssert() lighting_box_pack
36:40CTAssert() lighting_box_pack
36:40CTAssert() lighting_box_pack
36:59Make RayCast() do the box pushing and box categorisation in two passes
36:59Make RayCast() do the box pushing and box categorisation in two passes
36:59Make RayCast() do the box pushing and box categorisation in two passes
42:56Run hhlightprof with different results
🏃
42:56Run hhlightprof with different results
🏃
42:56Run hhlightprof with different results
🏃
43:14Scour RayCast() for bugs
📖
43:14Scour RayCast() for bugs
📖
43:14Scour RayCast() for bugs
📖
44:48Use consistent language in both loops for accessing lighting_box_pack
44:48Use consistent language in both loops for accessing lighting_box_pack
44:48Use consistent language in both loops for accessing lighting_box_pack
45:05Continue to scour RayCast() for bugs
📖
45:05Continue to scour RayCast() for bugs
📖
45:05Continue to scour RayCast() for bugs
📖
45:55Remove the compiled-out code in RayCast()
45:55Remove the compiled-out code in RayCast()
45:55Remove the compiled-out code in RayCast()
46:04Continue to scour RayCast() for bugs
📖
46:04Continue to scour RayCast() for bugs
📖
46:04Continue to scour RayCast() for bugs
📖
46:33Run hhlightprof still with different results from originally
🏃
46:33Run hhlightprof still with different results from originally
🏃
46:33Run hhlightprof still with different results from originally
🏃
47:01Toggle RayCast() back to the old one-pass code
47:01Toggle RayCast() back to the old one-pass code
47:01Toggle RayCast() back to the old one-pass code
47:09Run hhlightprof with the same results as originally
🏃
47:09Run hhlightprof with the same results as originally
🏃
47:09Run hhlightprof with the same results as originally
🏃
47:12Toggle RayCast() to the new two-pass code
47:12Toggle RayCast() to the new two-pass code
47:12Toggle RayCast() to the new two-pass code
47:16Continue to hunt for inconsistencies between the one-pass and two-pass code in RayCast()
📖
47:16Continue to hunt for inconsistencies between the one-pass and two-pass code in RayCast()
📖
47:16Continue to hunt for inconsistencies between the one-pass and two-pass code in RayCast()
📖
48:33Fix the box pushing loop to only push a box if necessary
48:33Fix the box pushing loop to only push a box if necessary
48:33Fix the box pushing loop to only push a box if necessary
49:17Run hhlightprof with different results from originally
🏃
49:17Run hhlightprof with different results from originally
🏃
49:17Run hhlightprof with different results from originally
🏃
50:08Continue to scour RayCast() for bugs
📖
50:08Continue to scour RayCast() for bugs
📖
50:08Continue to scour RayCast() for bugs
📖
51:01Assert in the box categorisation loop that the previously pushed box is a LeafContainer
51:01Assert in the box categorisation loop that the previously pushed box is a LeafContainer
51:01Assert in the box categorisation loop that the previously pushed box is a LeafContainer
51:23Run hhlightprof without hitting that assertion
🏃
51:23Run hhlightprof without hitting that assertion
🏃
51:23Run hhlightprof without hitting that assertion
🏃
51:29Continue to scour RayCast() for bugs
📖
51:29Continue to scour RayCast() for bugs
📖
51:29Continue to scour RayCast() for bugs
📖
54:22redunlocked Q: The while(Depth) loop doesn't wrap the second loop
🗪
54:22redunlocked Q: The while(Depth) loop doesn't wrap the second loop
🗪
54:22redunlocked Q: The while(Depth) loop doesn't wrap the second loop
🗪
54:56Continue to scour RayCast() for bugs
📖
54:56Continue to scour RayCast() for bugs
📖
54:56Continue to scour RayCast() for bugs
📖
55:14Make hhlightprof stream out to files the box leaves and partitions, introducing RECORD_LEAF_BOX() and RECORD_PARTITION_BOX()
55:14Make hhlightprof stream out to files the box leaves and partitions, introducing RECORD_LEAF_BOX() and RECORD_PARTITION_BOX()
55:14Make hhlightprof stream out to files the box leaves and partitions, introducing RECORD_LEAF_BOX() and RECORD_PARTITION_BOX()
59:53Run hhlightprof
🏃
59:53Run hhlightprof
🏃
59:53Run hhlightprof
🏃
1:00:34Make hhlightprof only stream out the first run of box leaves and partitions
1:00:34Make hhlightprof only stream out the first run of box leaves and partitions
1:00:34Make hhlightprof only stream out the first run of box leaves and partitions
1:00:54Run hhlightprof
🏃
1:00:54Run hhlightprof
🏃
1:00:54Run hhlightprof
🏃
1:00:59Rename our box leaves and partitions files to new*
🗹
1:00:59Rename our box leaves and partitions files to new*
🗹
1:00:59Rename our box leaves and partitions files to new*
🗹
1:01:33Toggle RayCast() back to the old one-pass code
1:01:33Toggle RayCast() back to the old one-pass code
1:01:33Toggle RayCast() back to the old one-pass code
1:01:44Run hhlightprof
🏃
1:01:44Run hhlightprof
🏃
1:01:44Run hhlightprof
🏃
1:01:48Rename our box leaves and partitions files to old*
🗹
1:01:48Rename our box leaves and partitions files to old*
🗹
1:01:48Rename our box leaves and partitions files to old*
🗹
1:02:02Try to compare our partitions in Meld
🗹
1:02:02Try to compare our partitions in Meld
🗹
1:02:02Try to compare our partitions in Meld
🗹
1:03:54Install Beyond Compare2
🗹
1:03:54Install Beyond Compare2
🗹
1:03:54Install Beyond Compare2
🗹
1:04:59Compare our box leaves in Beyond Compare, to see differences
🗹
1:04:59Compare our box leaves in Beyond Compare, to see differences
🗹
1:04:59Compare our box leaves in Beyond Compare, to see differences
🗹
1:06:13Compare our partitions in Beyond Compare, to see differences
🗹
1:06:13Compare our partitions in Beyond Compare, to see differences
🗹
1:06:13Compare our partitions in Beyond Compare, to see differences
🗹
1:07:09Toggle RayCast() to the new two-pass code
1:07:09Toggle RayCast() to the new two-pass code
1:07:09Toggle RayCast() to the new two-pass code
1:07:16Scour RayCast() for a reason why we're pushing more boxes
📖
1:07:16Scour RayCast() for a reason why we're pushing more boxes
📖
1:07:16Scour RayCast() for a reason why we're pushing more boxes
📖
1:08:17Consult our box leaves differences in Beyond Compare
🗹
1:08:17Consult our box leaves differences in Beyond Compare
🗹
1:08:17Consult our box leaves differences in Beyond Compare
🗹
1:10:16Continue to scour RayCast() for a reason why we're pushing more boxes
📖
1:10:16Continue to scour RayCast() for a reason why we're pushing more boxes
📖
1:10:16Continue to scour RayCast() for a reason why we're pushing more boxes
📖
1:10:36Assert in RayCast() that the partitioning loop does not receive a non-leaf container
1:10:36Assert in RayCast() that the partitioning loop does not receive a non-leaf container
1:10:36Assert in RayCast() that the partitioning loop does not receive a non-leaf container
1:10:55Toggle off the box / partition streaming in hhlightprof
1:10:55Toggle off the box / partition streaming in hhlightprof
1:10:55Toggle off the box / partition streaming in hhlightprof
1:11:54Run hhlightprof without hitting that assertion
🏃
1:11:54Run hhlightprof without hitting that assertion
🏃
1:11:54Run hhlightprof without hitting that assertion
🏃
1:11:57Puzzle over our bug in RayCast()
📖
1:11:57Puzzle over our bug in RayCast()
📖
1:11:57Puzzle over our bug in RayCast()
📖
1:13:01Make ProfileRun() print out the total input and output boxes
1:13:01Make ProfileRun() print out the total input and output boxes
1:13:01Make ProfileRun() print out the total input and output boxes
1:14:05Run hhlightprof to find a mismatch between the total boxes counts
🏃
1:14:05Run hhlightprof to find a mismatch between the total boxes counts
🏃
1:14:05Run hhlightprof to find a mismatch between the total boxes counts
🏃
1:14:28Consult our box leaves differences in Beyond Compare
🗹
1:14:28Consult our box leaves differences in Beyond Compare
🗹
1:14:28Consult our box leaves differences in Beyond Compare
🗹
1:15:26Restrict our dumping to one ray's worth of work
1:15:26Restrict our dumping to one ray's worth of work
1:15:26Restrict our dumping to one ray's worth of work
1:18:00Run hhlightprof
🏃
1:18:00Run hhlightprof
🏃
1:18:00Run hhlightprof
🏃
1:18:15Enable RECORD_RAYCAST_STACK
1:18:15Enable RECORD_RAYCAST_STACK
1:18:15Enable RECORD_RAYCAST_STACK
1:18:24Run hhlightprof
🏃
1:18:24Run hhlightprof
🏃
1:18:24Run hhlightprof
🏃
1:18:30Rename our box leaves and partitions files to new*
🗹
1:18:30Rename our box leaves and partitions files to new*
🗹
1:18:30Rename our box leaves and partitions files to new*
🗹
1:19:05Toggle RayCast() back to the old one-pass code
1:19:05Toggle RayCast() back to the old one-pass code
1:19:05Toggle RayCast() back to the old one-pass code
1:19:15Run hhlightprof
🏃
1:19:15Run hhlightprof
🏃
1:19:15Run hhlightprof
🏃
1:19:16Find our box leaves and partitions dumps to match
🗹
1:19:16Find our box leaves and partitions dumps to match
🗹
1:19:16Find our box leaves and partitions dumps to match
🗹
1:19:31Increase our dumping to sixteen rays' worth of work
1:19:31Increase our dumping to sixteen rays' worth of work
1:19:31Increase our dumping to sixteen rays' worth of work
1:20:13Run hhlightprof
🏃
1:20:13Run hhlightprof
🏃
1:20:13Run hhlightprof
🏃
1:20:19Consult our box leaves and partitions files to see partition box indices lower than the input box count
🗹
1:20:19Consult our box leaves and partitions files to see partition box indices lower than the input box count
🗹
1:20:19Consult our box leaves and partitions files to see partition box indices lower than the input box count
🗹
1:22:50Reacquaint ourselves with SplitBox()
📖
1:22:50Reacquaint ourselves with SplitBox()
📖
1:22:50Reacquaint ourselves with SplitBox()
📖
1:25:44Disable RECORD_RAYCAST_STACK
1:25:44Disable RECORD_RAYCAST_STACK
1:25:44Disable RECORD_RAYCAST_STACK
1:25:55hhlightprof total seconds elapsed: 6.682471
🏃
1:25:55hhlightprof total seconds elapsed: 6.682471
🏃
1:25:55hhlightprof total seconds elapsed: 6.682471
🏃
1:26:08Prepare to remove the indirect table-read from SplitBox()
1:26:08Prepare to remove the indirect table-read from SplitBox()
1:26:08Prepare to remove the indirect table-read from SplitBox()
1:28:23Change SplitBox() to split boxes directly into storage, removing AddBoxReferences() and AddBoxReference()
1:28:23Change SplitBox() to split boxes directly into storage, removing AddBoxReferences() and AddBoxReference()
1:28:23Change SplitBox() to split boxes directly into storage, removing AddBoxReferences() and AddBoxReference()
1:36:38Update BuildSpatialPartitionForLighting() to use AddBoxStorage() instead of AddBoxReference()
1:36:38Update BuildSpatialPartitionForLighting() to use AddBoxStorage() instead of AddBoxReference()
1:36:38Update BuildSpatialPartitionForLighting() to use AddBoxStorage() instead of AddBoxReference()
1:37:36Run hhlightprof with a high max error / texel
🏃
1:37:36Run hhlightprof with a high max error / texel
🏃
1:37:36Run hhlightprof with a high max error / texel
🏃
1:38:00Check all GetBox() calls, and SplitBox() for bugs
📖
1:38:00Check all GetBox() calls, and SplitBox() for bugs
📖
1:38:00Check all GetBox() calls, and SplitBox() for bugs
📖
1:40:28Fix AddBoxStorage() to correctly store the box index
1:40:28Fix AddBoxStorage() to correctly store the box index
1:40:28Fix AddBoxStorage() to correctly store the box index
1:40:45hhlightprof total seconds elapsed: 6.460956
🏃
1:40:45hhlightprof total seconds elapsed: 6.460956
🏃
1:40:45hhlightprof total seconds elapsed: 6.460956
🏃
1:41:31Make a note to remove the BoxRefTable from lighting_solution, removing all mentions of them
1:41:31Make a note to remove the BoxRefTable from lighting_solution, removing all mentions of them
1:41:31Make a note to remove the BoxRefTable from lighting_solution, removing all mentions of them
1:42:45hhlightprof total seconds elapsed: 6.449993
🏃
1:42:45hhlightprof total seconds elapsed: 6.449993
🏃
1:42:45hhlightprof total seconds elapsed: 6.449993
🏃
1:43:34Enable RECORD_RAYCAST_STACK
1:43:34Enable RECORD_RAYCAST_STACK
1:43:34Enable RECORD_RAYCAST_STACK
1:43:53Run hhlightprof
🏃
1:43:53Run hhlightprof
🏃
1:43:53Run hhlightprof
🏃
1:44:02Consult our box leaves and partitions files to see high partition box indices, as expected, and rename the files to new*
🗹
1:44:02Consult our box leaves and partitions files to see high partition box indices, as expected, and rename the files to new*
🗹
1:44:02Consult our box leaves and partitions files to see high partition box indices, as expected, and rename the files to new*
🗹
1:44:17Toggle RayCast() to the new two-pass code
1:44:17Toggle RayCast() to the new two-pass code
1:44:17Toggle RayCast() to the new two-pass code
1:44:26Run hhlightprof
🏃
1:44:26Run hhlightprof
🏃
1:44:26Run hhlightprof
🏃
1:44:31Rename our box leaves and partitions files to new*, and diff them in Beyond Compare
🗹
1:44:31Rename our box leaves and partitions files to new*, and diff them in Beyond Compare
🗹
1:44:31Rename our box leaves and partitions files to new*, and diff them in Beyond Compare
🗹
1:45:26Make RayCast() record box partition pushes, introducing RECORD_PARTITION_PUSH()
1:45:26Make RayCast() record box partition pushes, introducing RECORD_PARTITION_PUSH()
1:45:26Make RayCast() record box partition pushes, introducing RECORD_PARTITION_PUSH()
1:48:55Toggle RayCast() back to the old one-pass code
1:48:55Toggle RayCast() back to the old one-pass code
1:48:55Toggle RayCast() back to the old one-pass code
1:49:11Run hhlightprof and rename the files to old*
🗹
🏃
1:49:11Run hhlightprof and rename the files to old*
🗹
🏃
1:49:11Run hhlightprof and rename the files to old*
🗹
🏃
1:49:52Fix RayCast() to call RECORD_PARTITION_PUSH() in the correct place
1:49:52Fix RayCast() to call RECORD_PARTITION_PUSH() in the correct place
1:49:52Fix RayCast() to call RECORD_PARTITION_PUSH() in the correct place
1:50:08Run hhlightprof and see our pushes in the files
🗹
🏃
1:50:08Run hhlightprof and see our pushes in the files
🗹
🏃
1:50:08Run hhlightprof and see our pushes in the files
🗹
🏃
1:50:31Make RECORD_RAYCAST_END() append a newline after each ray
1:50:31Make RECORD_RAYCAST_END() append a newline after each ray
1:50:31Make RECORD_RAYCAST_END() append a newline after each ray
1:50:52Run hhlightprof, see our rays and rename the files to old*
🗹
🏃
1:50:52Run hhlightprof, see our rays and rename the files to old*
🗹
🏃
1:50:52Run hhlightprof, see our rays and rename the files to old*
🗹
🏃
1:51:18Toggle RayCast() to the new two-pass code
1:51:18Toggle RayCast() to the new two-pass code
1:51:18Toggle RayCast() to the new two-pass code
1:51:34Run hhlightprof and rename the files to new*
🗹
🏃
1:51:34Run hhlightprof and rename the files to new*
🗹
🏃
1:51:34Run hhlightprof and rename the files to new*
🗹
🏃
1:51:43Diff our partitions files in Beyond Compare, to see different treatment of boxes 1638 and 1844
🗹
1:51:43Diff our partitions files in Beyond Compare, to see different treatment of boxes 1638 and 1844
🗹
1:51:43Diff our partitions files in Beyond Compare, to see different treatment of boxes 1638 and 1844
🗹
1:54:17Set up a breakpoint on box 1638 in RayCast(), and switch the build to -Od
1:54:17Set up a breakpoint on box 1638 in RayCast(), and switch the build to -Od
1:54:17Set up a breakpoint on box 1638 in RayCast(), and switch the build to -Od
1:55:54Toggle RayCast() back to the old one-pass code, and comment out the __debugbreak()
1:55:54Toggle RayCast() back to the old one-pass code, and comment out the __debugbreak()
1:55:54Toggle RayCast() back to the old one-pass code, and comment out the __debugbreak()
1:56:07Run hhlightprof and compare these box leaves and partitions with the existing old ones
🗹
🏃
1:56:07Run hhlightprof and compare these box leaves and partitions with the existing old ones
🗹
🏃
1:56:07Run hhlightprof and compare these box leaves and partitions with the existing old ones
🗹
🏃
1:56:26Reinstate the __debugbreak() in RayCast()
1:56:26Reinstate the __debugbreak() in RayCast()
1:56:26Reinstate the __debugbreak() in RayCast()
1:56:36Run to our __debugbreak() and inspect the values
🏃
1:56:36Run to our __debugbreak() and inspect the values
🏃
1:56:36Run to our __debugbreak() and inspect the values
🏃
1:57:43Determine to check that the leaf count is not larger than our available size
📖
1:57:43Determine to check that the leaf count is not larger than our available size
📖
1:57:43Determine to check that the leaf count is not larger than our available size
📖
1:59:00Make ProfileRun() save the GlobalMaxWorkStackDepth for RayCast() to assert the LeafCount against, toggling RayCast() back to the old one-pass code
📖
1:59:00Make ProfileRun() save the GlobalMaxWorkStackDepth for RayCast() to assert the LeafCount against, toggling RayCast() back to the old one-pass code
📖
1:59:00Make ProfileRun() save the GlobalMaxWorkStackDepth for RayCast() to assert the LeafCount against, toggling RayCast() back to the old one-pass code
📖
2:00:19Toggle RayCast() back to the old one-pass code
2:00:19Toggle RayCast() back to the old one-pass code
2:00:19Toggle RayCast() back to the old one-pass code
2:00:31Run hhlightprof and hit an assertion
🏃
2:00:31Run hhlightprof and hit an assertion
🏃
2:00:31Run hhlightprof and hit an assertion
🏃
2:01:40Toggle off the __debugbreak() in RayCast()
2:01:40Toggle off the __debugbreak() in RayCast()
2:01:40Toggle off the __debugbreak() in RayCast()
2:02:07Run hhlightprof without hitting our LeafCount assertion
🏃
2:02:07Run hhlightprof without hitting our LeafCount assertion
🏃
2:02:07Run hhlightprof without hitting our LeafCount assertion
🏃
2:02:14Step through RayCast() to see a consistently low LeafCount
🏃
2:02:14Step through RayCast() to see a consistently low LeafCount
🏃
2:02:14Step through RayCast() to see a consistently low LeafCount
🏃
2:02:50Consider ProfileRun() to be allocating enough memory
📖
2:02:50Consider ProfileRun() to be allocating enough memory
📖
2:02:50Consider ProfileRun() to be allocating enough memory
📖
2:03:29Remove our LeafCount assertion from RayCast(), and reinstate the __debugbreak() calls on box 1638
2:03:29Remove our LeafCount assertion from RayCast(), and reinstate the __debugbreak() calls on box 1638
2:03:29Remove our LeafCount assertion from RayCast(), and reinstate the __debugbreak() calls on box 1638
2:04:14Run to our __debugbreak() and inspect Box 1638
🏃
2:04:14Run to our __debugbreak() and inspect Box 1638
🏃
2:04:14Run to our __debugbreak() and inspect Box 1638
🏃
2:04:29RemedyBG feature request: Save Watch Window to File
🗹
2:04:29RemedyBG feature request: Save Watch Window to File
🗹
2:04:29RemedyBG feature request: Save Watch Window to File
🗹
2:04:49Continue to inspect Box 1638, and save off its Min and Max
🏃
2:04:49Continue to inspect Box 1638, and save off its Min and Max
🏃
2:04:49Continue to inspect Box 1638, and save off its Min and Max
🏃
2:07:27Realise that our two-loop RayCast() will necessarily test more boxes for partitioning because we pushed more leaves onto the stack
🏃
2:07:27Realise that our two-loop RayCast() will necessarily test more boxes for partitioning because we pushed more leaves onto the stack
🏃
2:07:27Realise that our two-loop RayCast() will necessarily test more boxes for partitioning because we pushed more leaves onto the stack
🏃
2:08:43Remove the two-pass streaming from RayCast(), because we want to early-out
2:08:43Remove the two-pass streaming from RayCast(), because we want to early-out
2:08:43Remove the two-pass streaming from RayCast(), because we want to early-out
2:09:01Plan to go forward with k-d tree, testing the near side before the far side, and early-out if we hit
📖
2:09:01Plan to go forward with k-d tree, testing the near side before the far side, and early-out if we hit
📖
2:09:01Plan to go forward with k-d tree, testing the near side before the far side, and early-out if we hit
📖
2:09:52Remove the __debugbreak() calls from RayCast()
2:09:52Remove the __debugbreak() calls from RayCast()
2:09:52Remove the __debugbreak() calls from RayCast()
2:10:11Remove the ScratchBuffer from lighting_work
2:10:11Remove the ScratchBuffer from lighting_work
2:10:11Remove the ScratchBuffer from lighting_work
2:11:15Run hhlightprof successfully
🏃
2:11:15Run hhlightprof successfully
🏃
2:11:15Run hhlightprof successfully
🏃
2:11:24Run the game successfully
🏃
2:11:24Run the game successfully
🏃
2:11:24Run the game successfully
🏃
2:12:01Q&A
🗩
2:12:01Q&A
🗩
2:12:01Q&A
🗩
2:12:38somebody_took_my_name Q: Just wanted to let you know we have an IsMemoryEqual() function. Nice debug work today
🗪
2:12:38somebody_took_my_name Q: Just wanted to let you know we have an IsMemoryEqual() function. Nice debug work today
🗪
2:12:38somebody_took_my_name Q: Just wanted to let you know we have an IsMemoryEqual() function. Nice debug work today
🗪
2:13:48xxthebigfoxx Q: Off-topic, but I noticed your last blog post is dated 2019
🗪
2:13:48xxthebigfoxx Q: Off-topic, but I noticed your last blog post is dated 2019
🗪
2:13:48xxthebigfoxx Q: Off-topic, but I noticed your last blog post is dated 2019
🗪
2:14:45x1bzzr Q: Why is it that software companies increasingly seem to not care about performance? I've heard you talk about the technical reasons, but I still don't understand why companies would give up on having better software quality than their competitors. Is it because education is bad? Is it because non-performance oriented software is being normalized to the point people don't care about it? Is it because hardware has been compensating for the lack of software performance?
🗪
2:14:45x1bzzr Q: Why is it that software companies increasingly seem to not care about performance? I've heard you talk about the technical reasons, but I still don't understand why companies would give up on having better software quality than their competitors. Is it because education is bad? Is it because non-performance oriented software is being normalized to the point people don't care about it? Is it because hardware has been compensating for the lack of software performance?
🗪
2:14:45x1bzzr Q: Why is it that software companies increasingly seem to not care about performance? I've heard you talk about the technical reasons, but I still don't understand why companies would give up on having better software quality than their competitors. Is it because education is bad? Is it because non-performance oriented software is being normalized to the point people don't care about it? Is it because hardware has been compensating for the lack of software performance?
🗪
2:17:20recursivechat Q: Do you have a git repo for any of your code? Not necessarily Handmade Hero code but something small that I could read to see what sort of "patterns" you use to write good code
🗪
2:17:20recursivechat Q: Do you have a git repo for any of your code? Not necessarily Handmade Hero code but something small that I could read to see what sort of "patterns" you use to write good code
🗪
2:17:20recursivechat Q: Do you have a git repo for any of your code? Not necessarily Handmade Hero code but something small that I could read to see what sort of "patterns" you use to write good code
🗪
2:19:04mattiamanzati Q: About my question before the stream started, I am looking for a doubly linked list structure, and usually that's done through a structure with a first and last entry pointers, and those have a structure with a next, prev and value pointers. (Let's call this entry_structure.) In order to add an item to the end of the list you need to create a new entry_structure, set the prev pointer to the previous last entry, and UPDATE THE LAST entry_structure in order to have next point to the new last item. Is there any other structure that represents a doubly linked list without this prerequisite?
🗪
2:19:04mattiamanzati Q: About my question before the stream started, I am looking for a doubly linked list structure, and usually that's done through a structure with a first and last entry pointers, and those have a structure with a next, prev and value pointers. (Let's call this entry_structure.) In order to add an item to the end of the list you need to create a new entry_structure, set the prev pointer to the previous last entry, and UPDATE THE LAST entry_structure in order to have next point to the new last item. Is there any other structure that represents a doubly linked list without this prerequisite?
🗪
2:19:04mattiamanzati Q: About my question before the stream started, I am looking for a doubly linked list structure, and usually that's done through a structure with a first and last entry pointers, and those have a structure with a next, prev and value pointers. (Let's call this entry_structure.) In order to add an item to the end of the list you need to create a new entry_structure, set the prev pointer to the previous last entry, and UPDATE THE LAST entry_structure in order to have next point to the new last item. Is there any other structure that represents a doubly linked list without this prerequisite?
🗪
2:21:02xsinxdx Q: Are there any scalability / usability issues when using enums vs something like a hash table for indexing assets?
🗪
2:21:02xsinxdx Q: Are there any scalability / usability issues when using enums vs something like a hash table for indexing assets?
🗪
2:21:02xsinxdx Q: Are there any scalability / usability issues when using enums vs something like a hash table for indexing assets?
🗪
2:23:10buildervanished Q: Do you know of some sane way of learning a bit of DirectX 11 other than trial and error while scavenging information on MSDN?
🗪
2:23:10buildervanished Q: Do you know of some sane way of learning a bit of DirectX 11 other than trial and error while scavenging information on MSDN?
🗪
2:23:10buildervanished Q: Do you know of some sane way of learning a bit of DirectX 11 other than trial and error while scavenging information on MSDN?
🗪
2:23:20mindmark42 Q: How would you recommend writing assembly directly for a function if the complier refuses to optimize it the way you want?
🗪
2:23:20mindmark42 Q: How would you recommend writing assembly directly for a function if the complier refuses to optimize it the way you want?
🗪
2:23:20mindmark42 Q: How would you recommend writing assembly directly for a function if the complier refuses to optimize it the way you want?
🗪
2:24:17chronic_quagga Q: How important is it, in game development and in general, to be concerned with microarchitecture-level optimizations and using metrics from CPU performance counters?
🗪
2:24:17chronic_quagga Q: How important is it, in game development and in general, to be concerned with microarchitecture-level optimizations and using metrics from CPU performance counters?
🗪
2:24:17chronic_quagga Q: How important is it, in game development and in general, to be concerned with microarchitecture-level optimizations and using metrics from CPU performance counters?
🗪
2:24:51theintrojuicer Q: How many lines of code are there in the Handmade Hero project?
🗪
2:24:51theintrojuicer Q: How many lines of code are there in the Handmade Hero project?
🗪
2:24:51theintrojuicer Q: How many lines of code are there in the Handmade Hero project?
🗪
2:25:1634,292 lines of code
🗹
2:25:1634,292 lines of code
🗹
2:25:1634,292 lines of code
🗹
2:25:47thordura Q: If you do another programming discussion with Jon, do you think it would be valuable do a discussion about entity systems?
🗪
2:25:47thordura Q: If you do another programming discussion with Jon, do you think it would be valuable do a discussion about entity systems?
🗪
2:25:47thordura Q: If you do another programming discussion with Jon, do you think it would be valuable do a discussion about entity systems?
🗪
2:26:14kniffel5 Q: Visual Studio 19 has support for x86 but not x64 assembly. Why's one in it, but the other isn't? Are they so different from each other?
🗪
2:26:14kniffel5 Q: Visual Studio 19 has support for x86 but not x64 assembly. Why's one in it, but the other isn't? Are they so different from each other?
🗪
2:26:14kniffel5 Q: Visual Studio 19 has support for x86 but not x64 assembly. Why's one in it, but the other isn't? Are they so different from each other?
🗪
2:27:16thordura Q: I meant like what you guys consider is a good go-to approach to entities
🗪
2:27:16thordura Q: I meant like what you guys consider is a good go-to approach to entities
🗪
2:27:16thordura Q: I meant like what you guys consider is a good go-to approach to entities
🗪
2:28:02Wonder if we heard back from mattiamanzati about the doubly linked list question
📖
2:28:02Wonder if we heard back from mattiamanzati about the doubly linked list question
📖
2:28:02Wonder if we heard back from mattiamanzati about the doubly linked list question
📖
2:29:21Wander around the orphanage
🏃
2:29:21Wander around the orphanage
🏃
2:29:21Wander around the orphanage
🏃
2:29:59sagian2005 Q: I think they wanted to know if there is something that acts like a doubly linked list that isn't actually a doubly linked list
🗪
2:29:59sagian2005 Q: I think they wanted to know if there is something that acts like a doubly linked list that isn't actually a doubly linked list
🗪
2:29:59sagian2005 Q: I think they wanted to know if there is something that acts like a doubly linked list that isn't actually a doubly linked list
🗪
2:30:42Wrap it up with a plug of the Meow the Infinite printed comic Kickstarter3 and the determination to raid Jon's stream4
🗩
2:30:42Wrap it up with a plug of the Meow the Infinite printed comic Kickstarter3 and the determination to raid Jon's stream4
🗩
2:30:42Wrap it up with a plug of the Meow the Infinite printed comic Kickstarter3 and the determination to raid Jon's stream4
🗩