Handmade Hero»Episode Guide
Debugging Voxel Collision Bounds
?
?

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:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
1:03Demo our incomplete collision detector
🏃
1:03Demo our incomplete collision detector
🏃
1:03Demo our incomplete collision detector
🏃
3:29Reacquaint ourselves with the collision detector in MoveEntity()
📖
3:29Reacquaint ourselves with the collision detector in MoveEntity()
📖
3:29Reacquaint ourselves with the collision detector in MoveEntity()
📖
5:19Thoughts on allowing for buggy gameplay code
🗩
5:19Thoughts on allowing for buggy gameplay code
🗩
5:19Thoughts on allowing for buggy gameplay code
🗩
9:03Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
9:03Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
9:03Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
11:44A* and Dijkstra's algorithm
🗩
11:44A* and Dijkstra's algorithm
🗩
11:44A* and Dijkstra's algorithm
🗩
16:49thesandvichmaker handmade_hero Dijkstra?
🗪
16:49thesandvichmaker handmade_hero Dijkstra?
🗪
16:49thesandvichmaker handmade_hero Dijkstra?
🗪
17:02fda0 Dijkstra's algorithm seems like a bad name when the guy created, like, 50 algorithms
🗪
17:02fda0 Dijkstra's algorithm seems like a bad name when the guy created, like, 50 algorithms
🗪
17:02fda0 Dijkstra's algorithm seems like a bad name when the guy created, like, 50 algorithms
🗪
18:48Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
18:48Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
18:48Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
20:19TODO(casey): We should probably store corners and only test when they are untested
20:19TODO(casey): We should probably store corners and only test when they are untested
20:19TODO(casey): We should probably store corners and only test when they are untested
22:12Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
22:12Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
22:12Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
23:03dedknd Photolithography machines manufacturer ASML is also Dutch, supplying TSMC and Samsung
🗪
23:03dedknd Photolithography machines manufacturer ASML is also Dutch, supplying TSMC and Samsung
🗪
23:03dedknd Photolithography machines manufacturer ASML is also Dutch, supplying TSMC and Samsung
🗪
23:07thesandvichmaker If you tell me your name and date of birth my brain will actually process what you sound like
🗪
23:07thesandvichmaker If you tell me your name and date of birth my brain will actually process what you sound like
🗪
23:07thesandvichmaker If you tell me your name and date of birth my brain will actually process what you sound like
🗪
23:30thesandvichmaker Dutch national pride
🗪
23:30thesandvichmaker Dutch national pride
🗪
23:30thesandvichmaker Dutch national pride
🗪
26:35TODO(casey): We need to think through the way we handle embedding…
26:35TODO(casey): We need to think through the way we handle embedding…
26:35TODO(casey): We need to think through the way we handle embedding…
27:37Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
27:37Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
27:37Reacquaint ourselves with the collision detector in MoveEntity() (cont.)
📖
29:01Investigate why the glove did not move
📖
29:01Investigate why the glove did not move
📖
29:01Investigate why the glove did not move
📖
30:05The glove's collision search doesn't go beyond the "home" voxel
🏃
30:05The glove's collision search doesn't go beyond the "home" voxel
🏃
30:05The glove's collision search doesn't go beyond the "home" voxel
🏃
31:22Make MoveEntity() diagram the full voxel span
31:22Make MoveEntity() diagram the full voxel span
31:22Make MoveEntity() diagram the full voxel span
33:13The glove's collision search doesn't touch the full voxel span
🏃
33:13The glove's collision search doesn't touch the full voxel span
🏃
33:13The glove's collision search doesn't touch the full voxel span
🏃
34:06Make MoveEntity() diagram the line from FromP to ToP
34:06Make MoveEntity() diagram the line from FromP to ToP
34:06Make MoveEntity() diagram the line from FromP to ToP
34:23The glove's full voxel span does not encompass the whole line from FromP to ToP
🏃
34:23The glove's full voxel span does not encompass the whole line from FromP to ToP
🏃
34:23The glove's full voxel span does not encompass the whole line from FromP to ToP
🏃
35:10Make MoveEntity() colour in grey the line from FromP to ToP
35:10Make MoveEntity() colour in grey the line from FromP to ToP
35:10Make MoveEntity() colour in grey the line from FromP to ToP
35:16Clean out old code from MoveEntity() and correctly set the VoxelEndingCorner
35:16Clean out old code from MoveEntity() and correctly set the VoxelEndingCorner
35:16Clean out old code from MoveEntity() and correctly set the VoxelEndingCorner
39:25The glove's full voxel span correctly encompasses the whole line from FromP to ToP
🏃
39:25The glove's full voxel span correctly encompasses the whole line from FromP to ToP
🏃
39:25The glove's full voxel span correctly encompasses the whole line from FromP to ToP
🏃
39:58Start to investigate why the flood search doesn't work
📖
39:58Start to investigate why the flood search doesn't work
📖
39:58Start to investigate why the flood search doesn't work
📖
40:48Make MoveEntity() diagram the tested voxel
40:48Make MoveEntity() diagram the tested voxel
40:48Make MoveEntity() diagram the tested voxel
41:52The glove's collision search tests one cell
🏃
41:52The glove's collision search tests one cell
🏃
41:52The glove's collision search tests one cell
🏃
42:04Investigate why MoveEntity() never calls PushVoxelStack() in the "Flip" loop
📖
42:04Investigate why MoveEntity() never calls PushVoxelStack() in the "Flip" loop
📖
42:04Investigate why MoveEntity() never calls PushVoxelStack() in the "Flip" loop
📖
44:00Step in to MoveEntity()
🏃
44:00Step in to MoveEntity()
🏃
44:00Step in to MoveEntity()
🏃
44:34Flip the Occupied tests in MoveEntity()
44:34Flip the Occupied tests in MoveEntity()
44:34Flip the Occupied tests in MoveEntity()
45:20Step in to MoveEntity() to find that it now calls PushVoxelStack()
🏃
45:20Step in to MoveEntity() to find that it now calls PushVoxelStack()
🏃
45:20Step in to MoveEntity() to find that it now calls PushVoxelStack()
🏃
45:33Our glove's collision flood search now permits movement
🏃
45:33Our glove's collision flood search now permits movement
🏃
45:33Our glove's collision flood search now permits movement
🏃
45:48Our collision erroneously permits embedding and corner roll-off doesn't happen
🏃
45:48Our collision erroneously permits embedding and corner roll-off doesn't happen
🏃
45:48Our collision erroneously permits embedding and corner roll-off doesn't happen
🏃
47:09Increase the collision search space by one voxel in MoveEntity()
47:09Increase the collision search space by one voxel in MoveEntity()
47:09Increase the collision search space by one voxel in MoveEntity()
47:50Our corner roll-off now works
🏃
47:50Our corner roll-off now works
🏃
47:50Our corner roll-off now works
🏃
48:00We must fix embedding and performance
🏃
48:00We must fix embedding and performance
🏃
48:00We must fix embedding and performance
🏃
48:29Plan to fix embedding
📖
48:29Plan to fix embedding
📖
48:29Plan to fix embedding
📖
49:48Plan to fix embedding: 1) Track tested voxel corners
📖
49:48Plan to fix embedding: 1) Track tested voxel corners
📖
49:48Plan to fix embedding: 1) Track tested voxel corners
📖
49:58Plan to fix embedding: 2) Track embedding, to prevent movement to an embedded cell
📖
49:58Plan to fix embedding: 2) Track embedding, to prevent movement to an embedded cell
📖
49:58Plan to fix embedding: 2) Track embedding, to prevent movement to an embedded cell
📖
51:00Disable the embedding recovery code in MoveEntity()
51:00Disable the embedding recovery code in MoveEntity()
51:00Disable the embedding recovery code in MoveEntity()
51:17Our collision still permits embedding
🏃
51:17Our collision still permits embedding
🏃
51:17Our collision still permits embedding
🏃
51:25Scrutinise MoveEntity() for code that permits embedding
📖
51:25Scrutinise MoveEntity() for code that permits embedding
📖
51:25Scrutinise MoveEntity() for code that permits embedding
📖
53:38Make MoveEntity() test for embedding before considering a cell
53:38Make MoveEntity() test for embedding before considering a cell
53:38Make MoveEntity() test for embedding before considering a cell
54:29Our collision still permits embedding
🏃
54:29Our collision still permits embedding
🏃
54:29Our collision still permits embedding
🏃
55:09Scrutinise MoveEntity() for code that permits embedding
📖
55:09Scrutinise MoveEntity() for code that permits embedding
📖
55:09Scrutinise MoveEntity() for code that permits embedding
📖
55:39Fix the embedding test loop in MoveEntity() to use Cell.Min
55:39Fix the embedding test loop in MoveEntity() to use Cell.Min
55:39Fix the embedding test loop in MoveEntity() to use Cell.Min
56:11Our collision now prevents embedding
🏃
56:11Our collision now prevents embedding
🏃
56:11Our collision now prevents embedding
🏃
56:39Our glove gets stuck on a corner
🏃
56:39Our glove gets stuck on a corner
🏃
56:39Our glove gets stuck on a corner
🏃
57:31Relieve MoveEntity() of testing for embedding before considering a cell
57:31Relieve MoveEntity() of testing for embedding before considering a cell
57:31Relieve MoveEntity() of testing for embedding before considering a cell
57:47Our collision continues to prevent embedding, but we can get stuck in the doorway
🏃
57:47Our collision continues to prevent embedding, but we can get stuck in the doorway
🏃
57:47Our collision continues to prevent embedding, but we can get stuck in the doorway
🏃
59:31Optimising the collision routine
📖
59:31Optimising the collision routine
📖
59:31Optimising the collision routine
📖
1:00:37Let MoveEntity() early-out of the collision voxel pushing loop if BestDistanceSq == 0
1:00:37Let MoveEntity() early-out of the collision voxel pushing loop if BestDistanceSq == 0
1:00:37Let MoveEntity() early-out of the collision voxel pushing loop if BestDistanceSq == 0
1:01:15Our glove can get embedded in the hero
🏃
1:01:15Our glove can get embedded in the hero
🏃
1:01:15Our glove can get embedded in the hero
🏃
1:01:42Our collision flood search tests all voxels in a clear straight line
🏃
1:01:42Our collision flood search tests all voxels in a clear straight line
🏃
1:01:42Our collision flood search tests all voxels in a clear straight line
🏃
1:03:20Determine to push collision voxels closest-first
📖
1:03:20Determine to push collision voxels closest-first
📖
1:03:20Determine to push collision voxels closest-first
📖
1:04:31Determine to improve our early-out condition in MoveEntity()
📖
1:04:31Determine to improve our early-out condition in MoveEntity()
📖
1:04:31Determine to improve our early-out condition in MoveEntity()
📖
1:05:32Change MoveEntity() to early-out if the BestCellI and TargetCellI match, introducing ClampToVoxelDim()
1:05:32Change MoveEntity() to early-out if the BestCellI and TargetCellI match, introducing ClampToVoxelDim()
1:05:32Change MoveEntity() to early-out if the BestCellI and TargetCellI match, introducing ClampToVoxelDim()
1:08:37Our collision is more efficient
🏃
1:08:37Our collision is more efficient
🏃
1:08:37Our collision is more efficient
🏃
1:09:12Rephrase the collision voxel expansion in MoveEntity()
1:09:12Rephrase the collision voxel expansion in MoveEntity()
1:09:12Rephrase the collision voxel expansion in MoveEntity()
1:10:00The glove can penetrate right through the wall
🏃
1:10:00The glove can penetrate right through the wall
🏃
1:10:00The glove can penetrate right through the wall
🏃
1:10:34Scan MoveEntity() for code that permits through-embedding
📖
1:10:34Scan MoveEntity() for code that permits through-embedding
📖
1:10:34Scan MoveEntity() for code that permits through-embedding
📖
1:11:00The glove can penetrate right through the wall when turning
🏃
1:11:00The glove can penetrate right through the wall when turning
🏃
1:11:00The glove can penetrate right through the wall when turning
🏃
1:11:40Scrutinise MoveEntity() for code that permits embedding
📖
1:11:40Scrutinise MoveEntity() for code that permits embedding
📖
1:11:40Scrutinise MoveEntity() for code that permits embedding
📖
1:12:33Try to single-step the collision detector
🏃
1:12:33Try to single-step the collision detector
🏃
1:12:33Try to single-step the collision detector
🏃
1:14:53Walk into the wall, getting the glove embedded
🏃
1:14:53Walk into the wall, getting the glove embedded
🏃
1:14:53Walk into the wall, getting the glove embedded
🏃
1:15:43Introduce Round() for MoveEntity() to use when setting VoxelStartingCorner and VoxelEndingCorner1
1:15:43Introduce Round() for MoveEntity() to use when setting VoxelStartingCorner and VoxelEndingCorner1
1:15:43Introduce Round() for MoveEntity() to use when setting VoxelStartingCorner and VoxelEndingCorner1
1:20:20Our glove's and the expanded collision search voxels are not aligned
🏃
1:20:20Our glove's and the expanded collision search voxels are not aligned
🏃
1:20:20Our glove's and the expanded collision search voxels are not aligned
🏃
1:21:15Investigate our voxel misalignment in MoveEntity()
📖
1:21:15Investigate our voxel misalignment in MoveEntity()
📖
1:21:15Investigate our voxel misalignment in MoveEntity()
📖
1:22:08Revert MoveEntity() to use Floor() when setting VoxelStartingCorner and VoxelEndingCorner
1:22:08Revert MoveEntity() to use Floor() when setting VoxelStartingCorner and VoxelEndingCorner
1:22:08Revert MoveEntity() to use Floor() when setting VoxelStartingCorner and VoxelEndingCorner
1:22:48Increase the VoxelMaxCorner by 2× the CellDim
1:22:48Increase the VoxelMaxCorner by 2× the CellDim
1:22:48Increase the VoxelMaxCorner by 2× the CellDim
1:23:35Our performance has tanked
🏃
1:23:35Our performance has tanked
🏃
1:23:35Our performance has tanked
🏃
1:24:05Reduce VOXEL_STACK_DIM from 16 to 8
1:24:05Reduce VOXEL_STACK_DIM from 16 to 8
1:24:05Reduce VOXEL_STACK_DIM from 16 to 8
1:24:26Our collision voxels remain misaligned
🏃
1:24:26Our collision voxels remain misaligned
🏃
1:24:26Our collision voxels remain misaligned
🏃
1:25:50Change MoveEntity() to include the starting point, factoring in a DeltaPClamp to the VoxelEndingCorner
1:25:50Change MoveEntity() to include the starting point, factoring in a DeltaPClamp to the VoxelEndingCorner
1:25:50Change MoveEntity() to include the starting point, factoring in a DeltaPClamp to the VoxelEndingCorner
1:31:44Our collision search bounds and embedding are improved
🏃
1:31:44Our collision search bounds and embedding are improved
🏃
1:31:44Our collision search bounds and embedding are improved
🏃
1:32:56Continue to optimise the collision routine, augmenting voxel_stack with Repulsion and introducing voxel_corners and CheckCorners() for MoveEntity() to use
1:32:56Continue to optimise the collision routine, augmenting voxel_stack with Repulsion and introducing voxel_corners and CheckCorners() for MoveEntity() to use
1:32:56Continue to optimise the collision routine, augmenting voxel_stack with Repulsion and introducing voxel_corners and CheckCorners() for MoveEntity() to use
1:52:49Hit an assertion on CornerI in CheckCorners()
🏃
1:52:49Hit an assertion on CornerI in CheckCorners()
🏃
1:52:49Hit an assertion on CornerI in CheckCorners()
🏃
1:53:32Rephrase assertions in CheckCorners()
1:53:32Rephrase assertions in CheckCorners()
1:53:32Rephrase assertions in CheckCorners()
1:54:06Add assertions in CheckCorners on the incoming CellI dimensions
1:54:06Add assertions in CheckCorners on the incoming CellI dimensions
1:54:06Add assertions in CheckCorners on the incoming CellI dimensions
1:55:18Hit an assertion on CellI in CheckCorners()
🏃
1:55:18Hit an assertion on CellI in CheckCorners()
🏃
1:55:18Hit an assertion on CellI in CheckCorners()
🏃
1:55:28Investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:55:28Investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:55:28Investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:56:52Respecify MaxVoxelDim as MaxDeltaDim in MoveEntity()
1:56:52Respecify MaxVoxelDim as MaxDeltaDim in MoveEntity()
1:56:52Respecify MaxVoxelDim as MaxDeltaDim in MoveEntity()
1:57:33Hit an assertion on CellI in CheckCorners()
🏃
1:57:33Hit an assertion on CellI in CheckCorners()
🏃
1:57:33Hit an assertion on CellI in CheckCorners()
🏃
1:57:43Continue to investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:57:43Continue to investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:57:43Continue to investigate our out-of-bounds collision voxel push in MoveEntity()
📖
1:58:18Change MoveEntity() to use FloorToV3S() when setting VoxelDim
1:58:18Change MoveEntity() to use FloorToV3S() when setting VoxelDim
1:58:18Change MoveEntity() to use FloorToV3S() when setting VoxelDim
1:58:34Hit an assertion on CellI in CheckCorners()
🏃
1:58:34Hit an assertion on CellI in CheckCorners()
🏃
1:58:34Hit an assertion on CellI in CheckCorners()
🏃
1:58:49Add assertions on the VoxelDim in MoveEntity()
1:58:49Add assertions on the VoxelDim in MoveEntity()
1:58:49Add assertions on the VoxelDim in MoveEntity()
1:59:24Hit an assertion on VoxelDim in MoveEntity()
🏃
1:59:24Hit an assertion on VoxelDim in MoveEntity()
🏃
1:59:24Hit an assertion on VoxelDim in MoveEntity()
🏃
1:59:44Run in -Od, hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
1:59:44Run in -Od, hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
1:59:44Run in -Od, hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
2:01:53Fix our assertions on the VoxelDim in MoveEntity()
2:01:53Fix our assertions on the VoxelDim in MoveEntity()
2:01:53Fix our assertions on the VoxelDim in MoveEntity()
2:02:08Hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
2:02:08Hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
2:02:08Hit an assertion on VoxelDim in MoveEntity() and inspect the values
🏃
2:03:27Decrease the MaxDeltaDim by 3 per axis in MoveEntity()
2:03:27Decrease the MaxDeltaDim by 3 per axis in MoveEntity()
2:03:27Decrease the MaxDeltaDim by 3 per axis in MoveEntity()
2:03:39No longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:03:39No longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:03:39No longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:04:02Run in -O2, and no longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:04:02Run in -O2, and no longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:04:02Run in -O2, and no longer hit that assertion on VoxelDim in MoveEntity()
🏃
2:04:34Corner roll-off now works, we no longer embed, but we can still get stuck on corners
🏃
2:04:34Corner roll-off now works, we no longer embed, but we can still get stuck on corners
🏃
2:04:34Corner roll-off now works, we no longer embed, but we can still get stuck on corners
🏃
2:07:04TODO(casey): Do initial check to see if we're embedded...
2:07:04TODO(casey): Do initial check to see if we're embedded...
2:07:04TODO(casey): Do initial check to see if we're embedded...
2:07:52Q&A
🗩
2:07:52Q&A
🗩
2:07:52Q&A
🗩
2:09:24insobot Q: Polling raw input make it reasonable to give it a coincidence that we do not worry about the nail salon?
🗪
2:09:24insobot Q: Polling raw input make it reasonable to give it a coincidence that we do not worry about the nail salon?
🗪
2:09:24insobot Q: Polling raw input make it reasonable to give it a coincidence that we do not worry about the nail salon?
🗪
2:10:28thesandvichmaker handmade_hero, insobot has cheered me up, but I've been real down on programming lately. Have you ever had a phase where you were just totally over computers?
🗪
2:10:28thesandvichmaker handmade_hero, insobot has cheered me up, but I've been real down on programming lately. Have you ever had a phase where you were just totally over computers?
🗪
2:10:28thesandvichmaker handmade_hero, insobot has cheered me up, but I've been real down on programming lately. Have you ever had a phase where you were just totally over computers?
🗪
2:16:24mindmark42 Q: Do you think it is safe to assume if a CPU has AVX2 it has FMA, or should I always check the cpuflags? I'm not sure where to look if such a thing is true2
🗪
2:16:24mindmark42 Q: Do you think it is safe to assume if a CPU has AVX2 it has FMA, or should I always check the cpuflags? I'm not sure where to look if such a thing is true2
🗪
2:16:24mindmark42 Q: Do you think it is safe to assume if a CPU has AVX2 it has FMA, or should I always check the cpuflags? I'm not sure where to look if such a thing is true2
🗪
2:21:19mindmark42 Ya, I was wondering if all AVX2 CPUs on the market have the FMA extensions because all two of mine have them3,4
🗪
2:21:19mindmark42 Ya, I was wondering if all AVX2 CPUs on the market have the FMA extensions because all two of mine have them3,4
🗪
2:21:19mindmark42 Ya, I was wondering if all AVX2 CPUs on the market have the FMA extensions because all two of mine have them3,4
🗪
2:29:22We're done
🗩
2:29:22We're done
🗩
2:29:22We're done
🗩