Handmade Hero»Episode Guide
Debugging Voxel Motion Stepping
?
?

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:50Plug Star Code Galaxy1 and its nonlinear teach–challenge structure
📖
1:50Plug Star Code Galaxy1 and its nonlinear teach–challenge structure
📖
1:50Plug Star Code Galaxy1 and its nonlinear teach–challenge structure
📖
5:59Show the start of MoveEntity()
📖
5:59Show the start of MoveEntity()
📖
5:59Show the start of MoveEntity()
📖
6:40Run in -Od
🏃
6:40Run in -Od
🏃
6:40Run in -Od
🏃
7:00The collision code sadly permits tunnelling
🏃
7:00The collision code sadly permits tunnelling
🏃
7:00The collision code sadly permits tunnelling
🏃
8:22insofaras blow raid
🗪
8:22insofaras blow raid
🗪
8:22insofaras blow raid
🗪
8:58Admire the notes feature of Jon's programming language
🗩
8:58Admire the notes feature of Jon's programming language
🗩
8:58Admire the notes feature of Jon's programming language
🗩
12:15Walk through MoveEntity()
📖
12:15Walk through MoveEntity()
📖
12:15Walk through MoveEntity()
📖
14:14Defining collision around the minimum thickness to obstruct motion
📖
14:14Defining collision around the minimum thickness to obstruct motion
📖
14:14Defining collision around the minimum thickness to obstruct motion
📖
16:12Walk through MoveEntity() (cont.)
📖
16:12Walk through MoveEntity() (cont.)
📖
16:12Walk through MoveEntity() (cont.)
📖
17:47Bug in MoveEntity(): It determines collision based on location in space
📖
17:47Bug in MoveEntity(): It determines collision based on location in space
📖
17:47Bug in MoveEntity(): It determines collision based on location in space
📖
19:10TODO(casey): This may be incorrect, let's see
19:10TODO(casey): This may be incorrect, let's see
19:10TODO(casey): This may be incorrect, let's see
19:56Walk through MoveEntity() (cont.)
📖
19:56Walk through MoveEntity() (cont.)
📖
19:56Walk through MoveEntity() (cont.)
📖
20:45Molly Meow
🗪
20:45Molly Meow
🗪
20:45Molly Meow
🗪
22:52Walk through MoveEntity() (cont.)
📖
22:52Walk through MoveEntity() (cont.)
📖
22:52Walk through MoveEntity() (cont.)
📖
25:09Remove CenterP declaration from MoveEntity()
25:09Remove CenterP declaration from MoveEntity()
25:09Remove CenterP declaration from MoveEntity()
25:27Walk through MoveEntity() (cont.)
📖
25:27Walk through MoveEntity() (cont.)
📖
25:27Walk through MoveEntity() (cont.)
📖
27:52Walk through UpdateBest()
📖
27:52Walk through UpdateBest()
📖
27:52Walk through UpdateBest()
📖
29:11Walk through MoveEntity() (cont.)
📖
29:11Walk through MoveEntity() (cont.)
📖
29:11Walk through MoveEntity() (cont.)
📖
29:45Comment out the StartCollide declaration in MoveEntity()
29:45Comment out the StartCollide declaration in MoveEntity()
29:45Comment out the StartCollide declaration in MoveEntity()
30:23Walk through MoveEntity() (cont.)
📖
30:23Walk through MoveEntity() (cont.)
📖
30:23Walk through MoveEntity() (cont.)
📖
31:18Temporarily make MoveEntity() finish by positioning the entity at the BestCell's center, rather than using RefineVoxelPlacement()
31:18Temporarily make MoveEntity() finish by positioning the entity at the BestCell's center, rather than using RefineVoxelPlacement()
31:18Temporarily make MoveEntity() finish by positioning the entity at the BestCell's center, rather than using RefineVoxelPlacement()
31:47Run in -Od
🏃
31:47Run in -Od
🏃
31:47Run in -Od
🏃
32:27The movement looks too smooth
🏃
32:27The movement looks too smooth
🏃
32:27The movement looks too smooth
🏃
34:26Make MoveEntity() draw the final BestCell
34:26Make MoveEntity() draw the final BestCell
34:26Make MoveEntity() draw the final BestCell
35:20Our collision cells are tiny
🏃
35:20Our collision cells are tiny
🏃
35:20Our collision cells are tiny
🏃
37:13Make MoveEntity() draw the intermediary BestCell
37:13Make MoveEntity() draw the intermediary BestCell
37:13Make MoveEntity() draw the intermediary BestCell
37:46The BestCell doesn't get updated
🏃
37:46The BestCell doesn't get updated
🏃
37:46The BestCell doesn't get updated
🏃
38:16Make MoveEntity() instead draw the intermediary Cell
38:16Make MoveEntity() instead draw the intermediary Cell
38:16Make MoveEntity() instead draw the intermediary Cell
38:42We have collision voxel trails, and interpenetration of walls
🏃
38:42We have collision voxel trails, and interpenetration of walls
🏃
38:42We have collision voxel trails, and interpenetration of walls
🏃
40:00Inspect MoveEntity() for unseemliness
📖
40:00Inspect MoveEntity() for unseemliness
📖
40:00Inspect MoveEntity() for unseemliness
📖
41:55Make UpdateBest() only consider not Occupied cells
41:55Make UpdateBest() only consider not Occupied cells
41:55Make UpdateBest() only consider not Occupied cells
44:58Our collision behaviour hasn't changed
🏃
44:58Our collision behaviour hasn't changed
🏃
44:58Our collision behaviour hasn't changed
🏃
45:07Make UpdateBest() draw cells based on their consideration and occupancy
45:07Make UpdateBest() draw cells based on their consideration and occupancy
45:07Make UpdateBest() draw cells based on their consideration and occupancy
47:10A flash of red may precede interpenetration
🏃
47:10A flash of red may precede interpenetration
🏃
47:10A flash of red may precede interpenetration
🏃
48:17Scour MoveEntity() and CollidesAtP() for bugs
📖
48:17Scour MoveEntity() and CollidesAtP() for bugs
📖
48:17Scour MoveEntity() and CollidesAtP() for bugs
📖
51:37Remove OccupiedCount from MoveEntity()
51:37Remove OccupiedCount from MoveEntity()
51:37Remove OccupiedCount from MoveEntity()
51:53Scour MoveEntity() for bugs (cont.)
📖
51:53Scour MoveEntity() for bugs (cont.)
📖
51:53Scour MoveEntity() for bugs (cont.)
📖
56:40jskrist It looks like the test volume is so small that it is only colliding at the wall boundary, and when the test cell pushes far enough into the wall, it is no longer detecting a collision
🗪
56:40jskrist It looks like the test volume is so small that it is only colliding at the wall boundary, and when the test cell pushes far enough into the wall, it is no longer detecting a collision
🗪
56:40jskrist It looks like the test volume is so small that it is only colliding at the wall boundary, and when the test cell pushes far enough into the wall, it is no longer detecting a collision
🗪
59:05mindmark42 Doesn't CollidesAtP() need to grow each collision volume with the moving entity's collision volume?
🗪
59:05mindmark42 Doesn't CollidesAtP() need to grow each collision volume with the moving entity's collision volume?
🗪
59:05mindmark42 Doesn't CollidesAtP() need to grow each collision volume with the moving entity's collision volume?
🗪
59:40Plan to capture collision
🏃
59:40Plan to capture collision
🏃
59:40Plan to capture collision
🏃
1:00:18Hunt the code for the F-key handling
📖
1:00:18Hunt the code for the F-key handling
📖
1:00:18Hunt the code for the F-key handling
📖
1:01:29Add a DevMode_collision action on F9
1:01:29Add a DevMode_collision action on F9
1:01:29Add a DevMode_collision action on F9
1:02:20Introduce CollisionEditor() for UpdateAndRenderEditor() to call, augmenting game_mode_world with TimeStepScale
1:02:20Introduce CollisionEditor() for UpdateAndRenderEditor() to call, augmenting game_mode_world with TimeStepScale
1:02:20Introduce CollisionEditor() for UpdateAndRenderEditor() to call, augmenting game_mode_world with TimeStepScale
1:06:31Time does not flow
🏃
1:06:31Time does not flow
🏃
1:06:31Time does not flow
🏃
1:06:40Make PlayWorld() initialise TimeStepScale to 1.0f
1:06:40Make PlayWorld() initialise TimeStepScale to 1.0f
1:06:40Make PlayWorld() initialise TimeStepScale to 1.0f
1:07:30Time flows but F9 doesn't work
🏃
1:07:30Time flows but F9 doesn't work
🏃
1:07:30Time flows but F9 doesn't work
🏃
1:07:44Elevate DevMode_collision into the editor section of dev_mode
1:07:44Elevate DevMode_collision into the editor section of dev_mode
1:07:44Elevate DevMode_collision into the editor section of dev_mode
1:08:55F9 is still a little weird
🏃
1:08:55F9 is still a little weird
🏃
1:08:55F9 is still a little weird
🏃
1:09:04Set DevMode_last_editor to DevMode_collision
1:09:04Set DevMode_last_editor to DevMode_collision
1:09:04Set DevMode_last_editor to DevMode_collision
1:09:18Slow down the TimeStep in Collision Recorder
🏃
1:09:18Slow down the TimeStep in Collision Recorder
🏃
1:09:18Slow down the TimeStep in Collision Recorder
🏃
1:10:22Our configuration of collision boxes seems wrong
🏃
1:10:22Our configuration of collision boxes seems wrong
🏃
1:10:22Our configuration of collision boxes seems wrong
🏃
1:11:11Consider our collision box configuration
📖
1:11:11Consider our collision box configuration
📖
1:11:11Consider our collision box configuration
📖
1:12:52Make UpdateBest() pass the Dir as the colour to PushVolumeOutline()
1:12:52Make UpdateBest() pass the Dir as the colour to PushVolumeOutline()
1:12:52Make UpdateBest() pass the Dir as the colour to PushVolumeOutline()
1:14:17Try to interpret our collision box configuration
🏃
1:14:17Try to interpret our collision box configuration
🏃
1:14:17Try to interpret our collision box configuration
🏃
1:16:15Make MoveEntity() draw the starting BestCell
1:16:15Make MoveEntity() draw the starting BestCell
1:16:15Make MoveEntity() draw the starting BestCell
1:16:42Interpret our collision box configuration
🏃
1:16:42Interpret our collision box configuration
🏃
1:16:42Interpret our collision box configuration
🏃
1:17:44Try to provoke stickiness
🏃
1:17:44Try to provoke stickiness
🏃
1:17:44Try to provoke stickiness
🏃
1:18:42Make MoveEntity() finish by calling RefineVoxelPlacement()
1:18:42Make MoveEntity() finish by calling RefineVoxelPlacement()
1:18:42Make MoveEntity() finish by calling RefineVoxelPlacement()
1:19:04Determine to set up a test case
🏃
1:19:04Determine to set up a test case
🏃
1:19:04Determine to set up a test case
🏃
1:19:16Make CreateWorld() place the player in their bedroom
1:19:16Make CreateWorld() place the player in their bedroom
1:19:16Make CreateWorld() place the player in their bedroom
1:19:53Try to penetrate the bedroom wall at different timesteps
🏃
1:19:53Try to penetrate the bedroom wall at different timesteps
🏃
1:19:53Try to penetrate the bedroom wall at different timesteps
🏃
1:22:05Investigate why ToP is erroneously affecting the collision detection
📖
1:22:05Investigate why ToP is erroneously affecting the collision detection
📖
1:22:05Investigate why ToP is erroneously affecting the collision detection
📖
1:23:57Add a lerp sanitation assertion in RefineVoxelPlacement()
1:23:57Add a lerp sanitation assertion in RefineVoxelPlacement()
1:23:57Add a lerp sanitation assertion in RefineVoxelPlacement()
1:24:44Never hit that assertion
🏃
1:24:44Never hit that assertion
🏃
1:24:44Never hit that assertion
🏃
1:24:57Make RefineVoxelPlacement() draw the lerp test in cyan (can place) or magenta (cannot place)
1:24:57Make RefineVoxelPlacement() draw the lerp test in cyan (can place) or magenta (cannot place)
1:24:57Make RefineVoxelPlacement() draw the lerp test in cyan (can place) or magenta (cannot place)
1:26:58Check out our refinement placement
🏃
1:26:58Check out our refinement placement
🏃
1:26:58Check out our refinement placement
🏃
1:27:41Add a "Single Stepping" boolean button to CollisionEditor(), augmenting game_mode_world with SingleStep
1:27:41Add a "Single Stepping" boolean button to CollisionEditor(), augmenting game_mode_world with SingleStep
1:27:41Add a "Single Stepping" boolean button to CollisionEditor(), augmenting game_mode_world with SingleStep
1:33:41Single Stepping does not work
🏃
1:33:41Single Stepping does not work
🏃
1:33:41Single Stepping does not work
🏃
1:33:51Change CollisionEditor() to draw a Red / Green "Single Stepping" button
1:33:51Change CollisionEditor() to draw a Red / Green "Single Stepping" button
1:33:51Change CollisionEditor() to draw a Red / Green "Single Stepping" button
1:37:33Our "Single Stepping" button works
🏃
1:37:33Our "Single Stepping" button works
🏃
1:37:33Our "Single Stepping" button works
🏃
1:37:53Add a "Step" boolean button to CollisionEditor(), augmenting game_mode_world with StepLatch
1:37:53Add a "Step" boolean button to CollisionEditor(), augmenting game_mode_world with StepLatch
1:37:53Add a "Step" boolean button to CollisionEditor(), augmenting game_mode_world with StepLatch
1:39:38Enable MoveEntity() to step through the movement, augmenting sim_region with DEBUGPreventMovement
1:39:38Enable MoveEntity() to step through the movement, augmenting sim_region with DEBUGPreventMovement
1:39:38Enable MoveEntity() to step through the movement, augmenting sim_region with DEBUGPreventMovement
1:43:57Try out Single Stepping
🏃
1:43:57Try out Single Stepping
🏃
1:43:57Try out Single Stepping
🏃
1:46:42Revert UpdateBest() to draw cells based on their consideration and occupancy
1:46:42Revert UpdateBest() to draw cells based on their consideration and occupancy
1:46:42Revert UpdateBest() to draw cells based on their consideration and occupancy
1:47:02Collision seems entirely based on direction
🏃
1:47:02Collision seems entirely based on direction
🏃
1:47:02Collision seems entirely based on direction
🏃
1:47:48Toggle off the combined and individual z and y Occupied checking in MoveEntity()
1:47:48Toggle off the combined and individual z and y Occupied checking in MoveEntity()
1:47:48Toggle off the combined and individual z and y Occupied checking in MoveEntity()
1:48:45The x Occupied check is rock solid
🏃
1:48:45The x Occupied check is rock solid
🏃
1:48:45The x Occupied check is rock solid
🏃
1:49:28Toggle on the z and y Occupied checking in MoveEntity(), leaving only the combined checking off
1:49:28Toggle on the z and y Occupied checking in MoveEntity(), leaving only the combined checking off
1:49:28Toggle on the z and y Occupied checking in MoveEntity(), leaving only the combined checking off
1:49:53The individual x, y, z Occupied checking permits tunnelling
🏃
1:49:53The individual x, y, z Occupied checking permits tunnelling
🏃
1:49:53The individual x, y, z Occupied checking permits tunnelling
🏃
1:50:11Toggle off the z and y Occupied checking in MoveEntity()
1:50:11Toggle off the z and y Occupied checking in MoveEntity()
1:50:11Toggle off the z and y Occupied checking in MoveEntity()
1:50:24The x Occupied check remains rock solid
🏃
1:50:24The x Occupied check remains rock solid
🏃
1:50:24The x Occupied check remains rock solid
🏃
1:50:47Toggle on the y Occupied checking in MoveEntity()
1:50:47Toggle on the y Occupied checking in MoveEntity()
1:50:47Toggle on the y Occupied checking in MoveEntity()
1:50:59We can tunnel easily
🏃
1:50:59We can tunnel easily
🏃
1:50:59We can tunnel easily
🏃
1:51:36Toggle off the x Occupied checking in MoveEntity()
1:51:36Toggle off the x Occupied checking in MoveEntity()
1:51:36Toggle off the x Occupied checking in MoveEntity()
1:52:01The y Occupied check remains rock solid
🏃
1:52:01The y Occupied check remains rock solid
🏃
1:52:01The y Occupied check remains rock solid
🏃
1:53:00Introduce GetClosestPointInBoxConservative()
1:53:00Introduce GetClosestPointInBoxConservative()
1:53:00Introduce GetClosestPointInBoxConservative()
1:57:36Our glove can only move in Y
🏃
1:57:36Our glove can only move in Y
🏃
1:57:36Our glove can only move in Y
🏃
1:57:58Toggle on the x Occupied checking in MoveEntity()
1:57:58Toggle on the x Occupied checking in MoveEntity()
1:57:58Toggle on the x Occupied checking in MoveEntity()
1:58:18We can still tunnel easily
🏃
1:58:18We can still tunnel easily
🏃
1:58:18We can still tunnel easily
🏃
1:58:58Try Single Stepping
🏃
1:58:58Try Single Stepping
🏃
1:58:58Try Single Stepping
🏃
2:00:14Produce a collision test case
🏃
2:00:14Produce a collision test case
🏃
2:00:14Produce a collision test case
🏃
2:00:50Toggle off the y Occupied checking in MoveEntity()
2:00:50Toggle off the y Occupied checking in MoveEntity()
2:00:50Toggle off the y Occupied checking in MoveEntity()
2:01:04Hopping pushes the glove through the wall
🏃
2:01:04Hopping pushes the glove through the wall
🏃
2:01:04Hopping pushes the glove through the wall
🏃
2:02:24The x Occupied check remains rock solid
🏃
2:02:24The x Occupied check remains rock solid
🏃
2:02:24The x Occupied check remains rock solid
🏃
2:03:00Toggle on the combined and off the individual x, y and z Occupied checking in MoveEntity()
2:03:00Toggle on the combined and off the individual x, y and z Occupied checking in MoveEntity()
2:03:00Toggle on the combined and off the individual x, y and z Occupied checking in MoveEntity()
2:03:16We are punching up
🏃
2:03:16We are punching up
🏃
2:03:16We are punching up
🏃
2:04:29We clearly tunnel through walls
🏃
2:04:29We clearly tunnel through walls
🏃
2:04:29We clearly tunnel through walls
🏃
2:05:29Investigate our corner collision test
📖
2:05:29Investigate our corner collision test
📖
2:05:29Investigate our corner collision test
📖
2:06:43Spot the bug
📖
2:06:43Spot the bug
📖
2:06:43Spot the bug
📖
2:07:14mallesbixie Sure...
🗪
2:07:14mallesbixie Sure...
🗪
2:07:14mallesbixie Sure...
🗪
2:07:52Let MoveEntity() compute the occupancy of all surrounding cells
2:07:52Let MoveEntity() compute the occupancy of all surrounding cells
2:07:52Let MoveEntity() compute the occupancy of all surrounding cells
2:08:12Our combined corner Occupied checking is rock solid
🏃
2:08:12Our combined corner Occupied checking is rock solid
🏃
2:08:12Our combined corner Occupied checking is rock solid
🏃
2:08:29Toggle on the individual x, y and z Occupied checking in MoveEntity()
2:08:29Toggle on the individual x, y and z Occupied checking in MoveEntity()
2:08:29Toggle on the individual x, y and z Occupied checking in MoveEntity()
2:08:39Our collision is much more stable
🏃
2:08:39Our collision is much more stable
🏃
2:08:39Our collision is much more stable
🏃
2:11:31Determine to improve gliding
🏃
2:11:31Determine to improve gliding
🏃
2:11:31Determine to improve gliding
🏃
2:13:01Q&A
🗩
2:13:01Q&A
🗩
2:13:01Q&A
🗩
2:13:12jskrist Can you still hop / push the glove into the wall?
🗪
2:13:12jskrist Can you still hop / push the glove into the wall?
🗪
2:13:12jskrist Can you still hop / push the glove into the wall?
🗪
2:13:14Hopping no longer pushes the glove through the wall
🏃
2:13:14Hopping no longer pushes the glove through the wall
🏃
2:13:14Hopping no longer pushes the glove through the wall
🏃
2:16:10buildervanished handmade_hero Shouldn't you also add Eps to the min side in the conservative test?
🗪
2:16:10buildervanished handmade_hero Shouldn't you also add Eps to the min side in the conservative test?
🗪
2:16:10buildervanished handmade_hero Shouldn't you also add Eps to the min side in the conservative test?
🗪
2:17:29TODO(casey): RectanglesIntersect should probably be changed to be properly >= and < instead of >= and <= ??
2:17:29TODO(casey): RectanglesIntersect should probably be changed to be properly >= and < instead of >= and <= ??
2:17:29TODO(casey): RectanglesIntersect should probably be changed to be properly >= and < instead of >= and <= ??
2:18:18fat_dratini handmade_hero What kind of pathfinding would you use for the glove's return path? A* or do you use something simpler?
🗪
2:18:18fat_dratini handmade_hero What kind of pathfinding would you use for the glove's return path? A* or do you use something simpler?
🗪
2:18:18fat_dratini handmade_hero What kind of pathfinding would you use for the glove's return path? A* or do you use something simpler?
🗪
2:18:58miscellus handmade_hero What would you do differently for collision detection in non AABB geometry?
🗪
2:18:58miscellus handmade_hero What would you do differently for collision detection in non AABB geometry?
🗪
2:18:58miscellus handmade_hero What would you do differently for collision detection in non AABB geometry?
🗪
2:19:26centhusiast Q: I think this C model of programming is a bit time consuming in that we need to compile and look at the result and go back and forth to fix a problem. Do you think what would be a better model of programming and I also don't mean the scripting language
🗪
2:19:26centhusiast Q: I think this C model of programming is a bit time consuming in that we need to compile and look at the result and go back and forth to fix a problem. Do you think what would be a better model of programming and I also don't mean the scripting language
🗪
2:19:26centhusiast Q: I think this C model of programming is a bit time consuming in that we need to compile and look at the result and go back and forth to fix a problem. Do you think what would be a better model of programming and I also don't mean the scripting language
🗪
2:19:42Demo hot reloading
🏃
2:19:42Demo hot reloading
🏃
2:19:42Demo hot reloading
🏃
2:21:56emperormetallix In retrospect, would it have been worth it to make a visualiser for collision code before actually writing it?
🗪
2:21:56emperormetallix In retrospect, would it have been worth it to make a visualiser for collision code before actually writing it?
🗪
2:21:56emperormetallix In retrospect, would it have been worth it to make a visualiser for collision code before actually writing it?
🗪
2:23:11The glove can stick and fail to glide
🏃
2:23:11The glove can stick and fail to glide
🏃
2:23:11The glove can stick and fail to glide
🏃
2:24:20Make MoveEntity() only tell UpdateBest() that Occupied is true if all (rather than any) sides are occupied
2:24:20Make MoveEntity() only tell UpdateBest() that Occupied is true if all (rather than any) sides are occupied
2:24:20Make MoveEntity() only tell UpdateBest() that Occupied is true if all (rather than any) sides are occupied
2:25:03Gliding happens more nicely
🏃
2:25:03Gliding happens more nicely
🏃
2:25:03Gliding happens more nicely
🏃
2:28:01TODO(casey): Handle getting "unembedded"
2:28:01TODO(casey): Handle getting "unembedded"
2:28:01TODO(casey): Handle getting "unembedded"
2:28:28mindmark42 Q: Would collision cylinders have rounded caps or flat?
🗪
2:28:28mindmark42 Q: Would collision cylinders have rounded caps or flat?
🗪
2:28:28mindmark42 Q: Would collision cylinders have rounded caps or flat?
🗪
2:28:59d0g_me4t Q: Couldn't you simply clamp to X,Y. What does having Z axis movement on the glove in this problem space accomplish?
🗪
2:28:59d0g_me4t Q: Couldn't you simply clamp to X,Y. What does having Z axis movement on the glove in this problem space accomplish?
🗪
2:28:59d0g_me4t Q: Couldn't you simply clamp to X,Y. What does having Z axis movement on the glove in this problem space accomplish?
🗪
2:29:06Demo movement in Z
🏃
2:29:06Demo movement in Z
🏃
2:29:06Demo movement in Z
🏃
2:30:53jskrist The collision could have a max z delta
🗪
2:30:53jskrist The collision could have a max z delta
🗪
2:30:53jskrist The collision could have a max z delta
🗪
2:32:12Wrap it up with a glimpse into the future
🗩
2:32:12Wrap it up with a glimpse into the future
🗩
2:32:12Wrap it up with a glimpse into the future
🗩