Handmade Hero»Episode Guide
Switching to Voxel Centers for Collision
?
?

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:14Consider: 1) Giving entities a "participates in collision" bitfield
🗩
1:14Consider: 1) Giving entities a "participates in collision" bitfield
🗩
1:14Consider: 1) Giving entities a "participates in collision" bitfield
🗩
1:44Consider: 2) Is the world generator erroneously creating entities without a collision volume?
🗩
1:44Consider: 2) Is the world generator erroneously creating entities without a collision volume?
🗩
1:44Consider: 2) Is the world generator erroneously creating entities without a collision volume?
🗩
1:52Consider: 3) Finishing the collision system, with embedding recovery and spatial partitioning
🗩
1:52Consider: 3) Finishing the collision system, with embedding recovery and spatial partitioning
🗩
1:52Consider: 3) Finishing the collision system, with embedding recovery and spatial partitioning
🗩
5:24Demo our unoptimised collision performance
🏃
5:24Demo our unoptimised collision performance
🏃
5:24Demo our unoptimised collision performance
🏃
7:19Step through the diagrams of a collision embedding bug
🏃
7:19Step through the diagrams of a collision embedding bug
🏃
7:19Step through the diagrams of a collision embedding bug
🏃
9:20Consider making the collision checks symmetric
🏃
9:20Consider making the collision checks symmetric
🏃
9:20Consider making the collision checks symmetric
🏃
14:03Consider snapping the entity's position to the voxel center before testing for collision
🏃
14:03Consider snapping the entity's position to the voxel center before testing for collision
🏃
14:03Consider snapping the entity's position to the voxel center before testing for collision
🏃
14:50Reproduce an embedding bug between the glove and familiar
🏃
14:50Reproduce an embedding bug between the glove and familiar
🏃
14:50Reproduce an embedding bug between the glove and familiar
🏃
16:32Set up to perform collision on discrete boundaries
📖
16:32Set up to perform collision on discrete boundaries
📖
16:32Set up to perform collision on discrete boundaries
📖
18:03Consider switching to voxel centers for collision
📖
18:03Consider switching to voxel centers for collision
📖
18:03Consider switching to voxel centers for collision
📖
20:50Switch to voxel centers for collision, modifying voxel_stack
20:50Switch to voxel centers for collision, modifying voxel_stack
20:50Switch to voxel centers for collision, modifying voxel_stack
22:41A few words on feeling stupider vs smarter than you are
🗩
22:41A few words on feeling stupider vs smarter than you are
🗩
22:41A few words on feeling stupider vs smarter than you are
🗩
23:43Respecify voxel_corners as voxel_center
23:43Respecify voxel_corners as voxel_center
23:43Respecify voxel_corners as voxel_center
24:15Consider our collision testing to be faster and symmetric, once it's switched over
📖
24:15Consider our collision testing to be faster and symmetric, once it's switched over
📖
24:15Consider our collision testing to be faster and symmetric, once it's switched over
📖
25:06Switch MoveEntity() to use voxel centers for collision, changing AlignToMovementVoxel() to use Round()
25:06Switch MoveEntity() to use voxel centers for collision, changing AlignToMovementVoxel() to use Round()
25:06Switch MoveEntity() to use voxel centers for collision, changing AlignToMovementVoxel() to use Round()
33:31Introduce GetMovementVoxelIndex() for MoveEntity() to use, and remove voxel_grid from voxel_stack
33:31Introduce GetMovementVoxelIndex() for MoveEntity() to use, and remove voxel_grid from voxel_stack
33:31Introduce GetMovementVoxelIndex() for MoveEntity() to use, and remove voxel_grid from voxel_stack
37:34tim7775 The problem with feeling stupid is that it can make you want to quit. While feeling smart makes you want to keep going
🗪
37:34tim7775 The problem with feeling stupid is that it can make you want to quit. While feeling smart makes you want to keep going
🗪
37:34tim7775 The problem with feeling stupid is that it can make you want to quit. While feeling smart makes you want to keep going
🗪
38:33Continue switching MoveEntity() to use voxel centers, relieving it of checking corners
38:33Continue switching MoveEntity() to use voxel centers, relieving it of checking corners
38:33Continue switching MoveEntity() to use voxel centers, relieving it of checking corners
42:11Make PushVoxelStack() call CollidesAtP()
42:11Make PushVoxelStack() call CollidesAtP()
42:11Make PushVoxelStack() call CollidesAtP()
50:23Augment voxel_stack with a MinCenterP for MoveEntity() to set
50:23Augment voxel_stack with a MinCenterP for MoveEntity() to set
50:23Augment voxel_stack with a MinCenterP for MoveEntity() to set
51:42Introduce GetVoxelCenterP() for MoveEntity() to call, removing the voxel iterator
51:42Introduce GetVoxelCenterP() for MoveEntity() to call, removing the voxel iterator
51:42Introduce GetVoxelCenterP() for MoveEntity() to call, removing the voxel iterator
54:08Change PushVoxelStack() to call IsInArrayBounds() and use HaveTested
54:08Change PushVoxelStack() to call IsInArrayBounds() and use HaveTested
54:08Change PushVoxelStack() to call IsInArrayBounds() and use HaveTested
59:11Remove CheckCorners() and change MoveEntity() to call GetVoxelCenterP()
59:11Remove CheckCorners() and change MoveEntity() to call GetVoxelCenterP()
59:11Remove CheckCorners() and change MoveEntity() to call GetVoxelCenterP()
1:00:02Introduce GetVoxelBounds() for MoveEntity() to call
1:00:02Introduce GetVoxelBounds() for MoveEntity() to call
1:00:02Introduce GetVoxelBounds() for MoveEntity() to call
1:02:04Consider cleaning up this code
📖
1:02:04Consider cleaning up this code
📖
1:02:04Consider cleaning up this code
📖
1:02:55Our voxel center-based collision runs first time
🏃
1:02:55Our voxel center-based collision runs first time
🏃
1:02:55Our voxel center-based collision runs first time
🏃
1:04:04Let UpdateAndRenderEntities() call PushCube(), to draw the walls
1:04:04Let UpdateAndRenderEntities() call PushCube(), to draw the walls
1:04:04Let UpdateAndRenderEntities() call PushCube(), to draw the walls
1:04:46Try out our voxel center-based collision
🏃
1:04:46Try out our voxel center-based collision
🏃
1:04:46Try out our voxel center-based collision
🏃
1:05:19Determine to clean up this code
📖
1:05:19Determine to clean up this code
📖
1:05:19Determine to clean up this code
📖
1:07:15Make MoveEntity() pass GetVoxelCenterP() as FromP to RefineVoxelPlacement()
1:07:15Make MoveEntity() pass GetVoxelCenterP() as FromP to RefineVoxelPlacement()
1:07:15Make MoveEntity() pass GetVoxelCenterP() as FromP to RefineVoxelPlacement()
1:08:39Clean up the PushVoxelStack() branch in MoveEntity()
1:08:39Clean up the PushVoxelStack() branch in MoveEntity()
1:08:39Clean up the PushVoxelStack() branch in MoveEntity()
1:12:38Enable PushVoxelStack() to handle embedding recovery
1:12:38Enable PushVoxelStack() to handle embedding recovery
1:12:38Enable PushVoxelStack() to handle embedding recovery
1:21:12Replace the voxel_stack's b8 HaveTested with u8 OccupyCode, for MoveEntity() to pass to PushVoxelStack(), introducing GetOccupyCode()
1:21:12Replace the voxel_stack's b8 HaveTested with u8 OccupyCode, for MoveEntity() to pass to PushVoxelStack(), introducing GetOccupyCode()
1:21:12Replace the voxel_stack's b8 HaveTested with u8 OccupyCode, for MoveEntity() to pass to PushVoxelStack(), introducing GetOccupyCode()
1:24:02Enable PushVoxelStack() to handle embedding recovery (cont.)
1:24:02Enable PushVoxelStack() to handle embedding recovery (cont.)
1:24:02Enable PushVoxelStack() to handle embedding recovery (cont.)
1:26:23Remove embedding repulsion code from MoveEntity(), and search for the nearest unoccupied position around the initial embedded position, introducing occupy_code
1:26:23Remove embedding repulsion code from MoveEntity(), and search for the nearest unoccupied position around the initial embedded position, introducing occupy_code
1:26:23Remove embedding repulsion code from MoveEntity(), and search for the nearest unoccupied position around the initial embedded position, introducing occupy_code
1:31:01Try out our collision and embedding recovery
🏃
1:31:01Try out our collision and embedding recovery
🏃
1:31:01Try out our collision and embedding recovery
🏃
1:32:40Make CollidesAtP() call AlignToMovementVoxel() on each TestEntity
1:32:40Make CollidesAtP() call AlignToMovementVoxel() on each TestEntity
1:32:40Make CollidesAtP() call AlignToMovementVoxel() on each TestEntity
1:33:49Try out our collision detector
🏃
1:33:49Try out our collision detector
🏃
1:33:49Try out our collision detector
🏃
1:35:27Make CollisionEditor() create a "Disable Diagrams" button
1:35:27Make CollisionEditor() create a "Disable Diagrams" button
1:35:27Make CollisionEditor() create a "Disable Diagrams" button
1:37:22Try out our "Disable Diagrams" button
🏃
1:37:22Try out our "Disable Diagrams" button
🏃
1:37:22Try out our "Disable Diagrams" button
🏃
1:37:41Augment diagram_group with CaptureFrameCount and make CollisionEditor() create a "Capture Frames" slider to set this value
1:37:41Augment diagram_group with CaptureFrameCount and make CollisionEditor() create a "Capture Frames" slider to set this value
1:37:41Augment diagram_group with CaptureFrameCount and make CollisionEditor() create a "Capture Frames" slider to set this value
1:40:22Try out our "Capture Frames" slider
🏃
1:40:22Try out our "Capture Frames" slider
🏃
1:40:22Try out our "Capture Frames" slider
🏃
1:41:17Try out our collision detector
🏃
1:41:17Try out our collision detector
🏃
1:41:17Try out our collision detector
🏃
1:42:52Q&A
🗩
1:42:52Q&A
🗩
1:42:52Q&A
🗩
1:43:18technicbeam Chat was too quiet this stream
🗪
1:43:18technicbeam Chat was too quiet this stream
🗪
1:43:18technicbeam Chat was too quiet this stream
🗪
1:44:05mindmark42 Q: Can you explain the issue with two objects colliding again? Does using voxel centers fix it?
🗪
1:44:05mindmark42 Q: Can you explain the issue with two objects colliding again? Does using voxel centers fix it?
🗪
1:44:05mindmark42 Q: Can you explain the issue with two objects colliding again? Does using voxel centers fix it?
🗪
1:46:26sagian2005 Q: Do you have chat set to subscriber only again?
🗪
1:46:26sagian2005 Q: Do you have chat set to subscriber only again?
🗪
1:46:26sagian2005 Q: Do you have chat set to subscriber only again?
🗪
1:46:41wallfacer7 How much verticality is there going to be? Because gameplay-wise you may end up restricting collision to a plane, and then maybe this would all be a lot simpler
🗪
1:46:41wallfacer7 How much verticality is there going to be? Because gameplay-wise you may end up restricting collision to a plane, and then maybe this would all be a lot simpler
🗪
1:46:41wallfacer7 How much verticality is there going to be? Because gameplay-wise you may end up restricting collision to a plane, and then maybe this would all be a lot simpler
🗪
1:47:08purpleeleven Q: Won't that result in clipping?
🗪
1:47:08purpleeleven Q: Won't that result in clipping?
🗪
1:47:08purpleeleven Q: Won't that result in clipping?
🗪
1:48:00purpleeleven If you check based on the center then adjust the position, then you can have sprites appearing inside walls
🗪
1:48:00purpleeleven If you check based on the center then adjust the position, then you can have sprites appearing inside walls
🗪
1:48:00purpleeleven If you check based on the center then adjust the position, then you can have sprites appearing inside walls
🗪
1:49:41sagian2005 Q: Did you know you can set enum types now. Just ': type' after the name. It still has to be integral
🗪
1:49:41sagian2005 Q: Did you know you can set enum types now. Just ': type' after the name. It still has to be integral
🗪
1:49:41sagian2005 Q: Did you know you can set enum types now. Just ': type' after the name. It still has to be integral
🗪
1:50:38Try using : u8 on occupy_code
1:50:38Try using : u8 on occupy_code
1:50:38Try using : u8 on occupy_code
1:52:16headless_corpse Q: Do you recommend this book "Tricks of the Windows Game Programming Gurus" by André Lamothe in 2021?1
🗪
1:52:16headless_corpse Q: Do you recommend this book "Tricks of the Windows Game Programming Gurus" by André Lamothe in 2021?1
🗪
1:52:16headless_corpse Q: Do you recommend this book "Tricks of the Windows Game Programming Gurus" by André Lamothe in 2021?1
🗪
1:52:59sagian2005 Q: What is the reason that things like SimRegion get passed around instead of plucking it from a global variable? Is it just preference? Are there cache considerations?
🗪
1:52:59sagian2005 Q: What is the reason that things like SimRegion get passed around instead of plucking it from a global variable? Is it just preference? Are there cache considerations?
🗪
1:52:59sagian2005 Q: What is the reason that things like SimRegion get passed around instead of plucking it from a global variable? Is it just preference? Are there cache considerations?
🗪
1:55:14Wrap it up with a plug of Meow the Infinite: Book Two2 and further streams
🗩
1:55:14Wrap it up with a plug of Meow the Infinite: Book Two2 and further streams
🗩
1:55:14Wrap it up with a plug of Meow the Infinite: Book Two2 and further streams
🗩
1:58:46dj_turfie Man, I've been loving these lightboard code talks. I would pay good money for more of these. I think you've got a good concept here!
🗪
1:58:46dj_turfie Man, I've been loving these lightboard code talks. I would pay good money for more of these. I think you've got a good concept here!
🗪
1:58:46dj_turfie Man, I've been loving these lightboard code talks. I would pay good money for more of these. I think you've got a good concept here!
🗪
2:00:08memfault Q: Does Handmade Hero work on Linux or do I need to follow on Windows?
🗪
2:00:08memfault Q: Does Handmade Hero work on Linux or do I need to follow on Windows?
🗪
2:00:08memfault Q: Does Handmade Hero work on Linux or do I need to follow on Windows?
🗪
2:00:45Plug Star Code Galaxy3
🗩
2:00:45Plug Star Code Galaxy3
🗩
2:00:45Plug Star Code Galaxy3
🗩
2:05:49Wrap it up with a plug of an upcoming cryptocurrency interview with Alex Gladstein
🗩
2:05:49Wrap it up with a plug of an upcoming cryptocurrency interview with Alex Gladstein
🗩
2:05:49Wrap it up with a plug of an upcoming cryptocurrency interview with Alex Gladstein
🗩