Handmade Hero»Episode Guide
Experimenting with Voxelized 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:01Recap and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
0:01Recap and set the stage for the day
🗩
1:02Demo our collision boxes
🏃
1:02Demo our collision boxes
🏃
1:02Demo our collision boxes
🏃
1:36Positive-sense (where you can go) collision detection
🗩
1:36Positive-sense (where you can go) collision detection
🗩
1:36Positive-sense (where you can go) collision detection
🗩
4:05Collision tasks: 1. Change MoveEntity() to look for and pick the nearest legal position
🗩
4:05Collision tasks: 1. Change MoveEntity() to look for and pick the nearest legal position
🗩
4:05Collision tasks: 1. Change MoveEntity() to look for and pick the nearest legal position
🗩
5:15Collision tasks: 2. Upgrade to support simultaneous motion
🗩
5:15Collision tasks: 2. Upgrade to support simultaneous motion
🗩
5:15Collision tasks: 2. Upgrade to support simultaneous motion
🗩
7:22Make MoveEntity() use the DesiredPosition, with no concern for collision
7:22Make MoveEntity() use the DesiredPosition, with no concern for collision
7:22Make MoveEntity() use the DesiredPosition, with no concern for collision
8:01Our familiar "penetrates" us and walls
🏃
8:01Our familiar "penetrates" us and walls
🏃
8:01Our familiar "penetrates" us and walls
🏃
8:48Plan to introduce "requested physics" stuff for MoveEntity() to take
8:48Plan to introduce "requested physics" stuff for MoveEntity() to take
8:48Plan to introduce "requested physics" stuff for MoveEntity() to take
10:01Plan to replace the all entities iteration in MoveEntity() with a spatial partition
10:01Plan to replace the all entities iteration in MoveEntity() with a spatial partition
10:01Plan to replace the all entities iteration in MoveEntity() with a spatial partition
12:38Rearrange and clear out the cruft from MoveEntity()
12:38Rearrange and clear out the cruft from MoveEntity()
12:38Rearrange and clear out the cruft from MoveEntity()
15:15Collision from a game design perspective
🗩
15:15Collision from a game design perspective
🗩
15:15Collision from a game design perspective
🗩
16:56Demo conversation zooming
🏃
16:56Demo conversation zooming
🏃
16:56Demo conversation zooming
🏃
17:37Collision from a game design perspective (cont.)
🗩
17:37Collision from a game design perspective (cont.)
🗩
17:37Collision from a game design perspective (cont.)
🗩
18:11Remove SpeculativeCollide() and add EventOnCollision and PreventMotionOnCollision entity_flags
18:11Remove SpeculativeCollide() and add EventOnCollision and PreventMotionOnCollision entity_flags
18:11Remove SpeculativeCollide() and add EventOnCollision and PreventMotionOnCollision entity_flags
19:14Reject dynamic event-based collision, in favour of deterministic entity_flags
🗩
19:14Reject dynamic event-based collision, in favour of deterministic entity_flags
🗩
19:14Reject dynamic event-based collision, in favour of deterministic entity_flags
🗩
23:13Remove HandleCollision() and CanOverlap()
23:13Remove HandleCollision() and CanOverlap()
23:13Remove HandleCollision() and CanOverlap()
24:06Determine to make MoveEntity() search in subdivided space
🗩
24:06Determine to make MoveEntity() search in subdivided space
🗩
24:06Determine to make MoveEntity() search in subdivided space
🗩
25:374coder theming
🗹
25:374coder theming
🗹
25:374coder theming
🗹
27:16jarput Purple means it couldn't find the variable in the theme file
🗪
27:16jarput Purple means it couldn't find the variable in the theme file
🗪
27:16jarput Purple means it couldn't find the variable in the theme file
🗪
27:33tarriest_python handmade_hero I wrote this addition you can disable it with // f4_disable_cursor_token_occurance = true; in config.4coder
🗪
27:33tarriest_python handmade_hero I wrote this addition you can disable it with // f4_disable_cursor_token_occurance = true; in config.4coder
🗪
27:33tarriest_python handmade_hero I wrote this addition you can disable it with // f4_disable_cursor_token_occurance = true; in config.4coder
🗪
27:50tarriest_python The color option is: fleury_color_token_minor_highlight = 0xC0797979; in the theme
🗪
27:50tarriest_python The color option is: fleury_color_token_minor_highlight = 0xC0797979; in the theme
🗪
27:50tarriest_python The color option is: fleury_color_token_minor_highlight = 0xC0797979; in the theme
🗪
27:554coder: Set fleury_color_token_minor_highlight = 0xff2f2f37
🗹
27:554coder: Set fleury_color_token_minor_highlight = 0xff2f2f37
🗹
27:554coder: Set fleury_color_token_minor_highlight = 0xff2f2f37
🗹
29:15Make MoveEntity() search in subdivided space, initially a fixed-size grid, introducing MoveEntityLocally()
29:15Make MoveEntity() search in subdivided space, initially a fixed-size grid, introducing MoveEntityLocally()
29:15Make MoveEntity() search in subdivided space, initially a fixed-size grid, introducing MoveEntityLocally()
35:09Write a voxel iterator in MoveEntityLocally()
35:09Write a voxel iterator in MoveEntityLocally()
35:09Write a voxel iterator in MoveEntityLocally()
36:44Make MoveEntityLocally() perform the collision test in each voxel
36:44Make MoveEntityLocally() perform the collision test in each voxel
36:44Make MoveEntityLocally() perform the collision test in each voxel
37:29Determine to extend our voxel search with an apron to permit screw-up recovery
🗩
37:29Determine to extend our voxel search with an apron to permit screw-up recovery
🗩
37:29Determine to extend our voxel search with an apron to permit screw-up recovery
🗩
39:35Extend our voxel search with an apron in MoveEntityLocally()
39:35Extend our voxel search with an apron in MoveEntityLocally()
39:35Extend our voxel search with an apron in MoveEntityLocally()
43:26Introduce v3 overloaded / and * operators, and replace Hadamard() with * overloads
43:26Introduce v3 overloaded / and * operators, and replace Hadamard() with * overloads
43:26Introduce v3 overloaded / and * operators, and replace Hadamard() with * overloads
50:43victor_cminus There's f4_backspace_token_boundry and f4_delete_token_boundry you can try
🗪
50:43victor_cminus There's f4_backspace_token_boundry and f4_delete_token_boundry you can try
🗪
50:43victor_cminus There's f4_backspace_token_boundry and f4_delete_token_boundry you can try
🗪
50:544coder bindings
🗹
50:544coder bindings
🗹
50:544coder bindings
🗹
51:17Backspace and Del are much better
🗹
51:17Backspace and Del are much better
🗹
51:17Backspace and Del are much better
🗹
51:39Can we delete just a character at a time from the "Open" line?
🗹
51:39Can we delete just a character at a time from the "Open" line?
🗹
51:39Can we delete just a character at a time from the "Open" line?
🗹
51:53Replace Hadamard() with * overloads (cont.)
51:53Replace Hadamard() with * overloads (cont.)
51:53Replace Hadamard() with * overloads (cont.)
52:52somebody_took_my_name I believe the lister thing is this param in the config: lister_whole_word_backspace_when_modified
🗪
52:52somebody_took_my_name I believe the lister thing is this param in the config: lister_whole_word_backspace_when_modified
🗪
52:52somebody_took_my_name I believe the lister thing is this param in the config: lister_whole_word_backspace_when_modified
🗪
53:104coder: Set lister_whole_word_backspace_when_modified = true
🗹
53:104coder: Set lister_whole_word_backspace_when_modified = true
🗹
53:104coder: Set lister_whole_word_backspace_when_modified = true
🗹
54:28The Hadamard changes did not break anything
🏃
54:28The Hadamard changes did not break anything
🏃
54:28The Hadamard changes did not break anything
🏃
54:51Consider how to determine where in the voxel we can move
📖
54:51Consider how to determine where in the voxel we can move
📖
54:51Consider how to determine where in the voxel we can move
📖
57:30Initialise a Vacant voxel in MoveEntityLocally()
57:30Initialise a Vacant voxel in MoveEntityLocally()
57:30Initialise a Vacant voxel in MoveEntityLocally()
58:57Introduce IterateVoxel(), voxel_iter and related IsValid() and NextInOrder() functions
58:57Introduce IterateVoxel(), voxel_iter and related IsValid() and NextInOrder() functions
58:57Introduce IterateVoxel(), voxel_iter and related IsValid() and NextInOrder() functions
1:03:00Respecify Vacant as Occupied in MoveEntityLocally(), and set it up to set Occupied to true
1:03:00Respecify Vacant as Occupied in MoveEntityLocally(), and set it up to set Occupied to true
1:03:00Respecify Vacant as Occupied in MoveEntityLocally(), and set it up to set Occupied to true
1:04:02Set up MoveEntityLocally() to test if the entire voxel, one level up, is completely unoccupied
1:04:02Set up MoveEntityLocally() to test if the entire voxel, one level up, is completely unoccupied
1:04:02Set up MoveEntityLocally() to test if the entire voxel, one level up, is completely unoccupied
1:05:32neitchzehrer Can the amount of time the "entering second hour" notice is displayed be adjusted?
🗪
1:05:32neitchzehrer Can the amount of time the "entering second hour" notice is displayed be adjusted?
🗪
1:05:32neitchzehrer Can the amount of time the "entering second hour" notice is displayed be adjusted?
🗪
1:07:03Make MoveEntityLocally() test the entire Occupied array
1:07:03Make MoveEntityLocally() test the entire Occupied array
1:07:03Make MoveEntityLocally() test the entire Occupied array
1:09:47thesandvichmaker handmade_hero You don’t seem to have virtual whitespace enabled in 4coder. Is that deliberate?
🗪
1:09:47thesandvichmaker handmade_hero You don’t seem to have virtual whitespace enabled in 4coder. Is that deliberate?
🗪
1:09:47thesandvichmaker handmade_hero You don’t seem to have virtual whitespace enabled in 4coder. Is that deliberate?
🗪
1:10:12Enable MoveEntityLocally() to find the best closest position, permitting movement to the desired position
1:10:12Enable MoveEntityLocally() to find the best closest position, permitting movement to the desired position
1:10:12Enable MoveEntityLocally() to find the best closest position, permitting movement to the desired position
1:16:11In-cell movement works
🏃
1:16:11In-cell movement works
🏃
1:16:11In-cell movement works
🏃
1:16:44Set up to make MoveEntityLocally() do a point-in-box test
📖
1:16:44Set up to make MoveEntityLocally() do a point-in-box test
📖
1:16:44Set up to make MoveEntityLocally() do a point-in-box test
📖
1:18:06Break
🗹
1:18:06Break
🗹
1:18:06Break
🗹
1:22:10Return with refilled water
🗹
1:22:10Return with refilled water
🗹
1:22:10Return with refilled water
🗹
1:22:51Make MoveEntityLocally() call RectanglesIntersect() to do its point-in-box test
1:22:51Make MoveEntityLocally() call RectanglesIntersect() to do its point-in-box test
1:22:51Make MoveEntityLocally() call RectanglesIntersect() to do its point-in-box test
1:25:54This doesn't work yet
🏃
1:25:54This doesn't work yet
🏃
1:25:54This doesn't work yet
🏃
1:26:01Double-check MoveEntityLocally()
📖
1:26:01Double-check MoveEntityLocally()
📖
1:26:01Double-check MoveEntityLocally()
📖
1:26:22We can punch through walls
🏃
1:26:22We can punch through walls
🏃
1:26:22We can punch through walls
🏃
1:26:39Triple-check MoveEntity() and MoveEntityLocally()
📖
1:26:39Triple-check MoveEntity() and MoveEntityLocally()
📖
1:26:39Triple-check MoveEntity() and MoveEntityLocally()
📖
1:29:04Temporarily make MoveEntityLocally() default to preventing movement
1:29:04Temporarily make MoveEntityLocally() default to preventing movement
1:29:04Temporarily make MoveEntityLocally() default to preventing movement
1:29:18Our glove does not move
🏃
1:29:18Our glove does not move
🏃
1:29:18Our glove does not move
🏃
1:29:20Scour MoveEntityLocally() for errors
📖
1:29:20Scour MoveEntityLocally() for errors
📖
1:29:20Scour MoveEntityLocally() for errors
📖
1:31:29Step through MoveEntityLocally()
🏃
1:31:29Step through MoveEntityLocally()
🏃
1:31:29Step through MoveEntityLocally()
🏃
1:32:35Molly Hi
🗪
🗩
1:32:35Molly Hi
🗪
🗩
1:32:35Molly Hi
🗪
🗩
1:34:50We forgot to test the entity_flags
📖
1:34:50We forgot to test the entity_flags
📖
1:34:50We forgot to test the entity_flags
📖
1:35:37Molly *cuddles*
🗪
🗩
1:35:37Molly *cuddles*
🗪
🗩
1:35:37Molly *cuddles*
🗪
🗩
1:36:51Make MoveEntityLocally() test entity_flags, renaming PreventMotionOnCollision to AllowsMotionOnCollision, and making GenerateRoom() and AddConversation() set entity_flags
1:36:51Make MoveEntityLocally() test entity_flags, renaming PreventMotionOnCollision to AllowsMotionOnCollision, and making GenerateRoom() and AddConversation() set entity_flags
1:36:51Make MoveEntityLocally() test entity_flags, renaming PreventMotionOnCollision to AllowsMotionOnCollision, and making GenerateRoom() and AddConversation() set entity_flags
1:40:04Our entities can move, notably our proportional derivative controlled glove
🏃
1:40:04Our entities can move, notably our proportional derivative controlled glove
🏃
1:40:04Our entities can move, notably our proportional derivative controlled glove
🏃
1:41:21Double-check our occupation test in MoveEntityLocally()
📖
1:41:21Double-check our occupation test in MoveEntityLocally()
📖
1:41:21Double-check our occupation test in MoveEntityLocally()
📖
1:43:17We never collide
🏃
1:43:17We never collide
🏃
1:43:17We never collide
🏃
1:44:10Double-check RectanglesIntersect()
📖
1:44:10Double-check RectanglesIntersect()
📖
1:44:10Double-check RectanglesIntersect()
📖
1:45:01Make MoveEntityLocally() draw occupation state
1:45:01Make MoveEntityLocally() draw occupation state
1:45:01Make MoveEntityLocally() draw occupation state
1:48:56We seem to be detecting collision
🏃
1:48:56We seem to be detecting collision
🏃
1:48:56We seem to be detecting collision
🏃
1:50:28Try making MoveEntityLocally() default to preventing movement
1:50:28Try making MoveEntityLocally() default to preventing movement
1:50:28Try making MoveEntityLocally() default to preventing movement
1:50:42We detect collision and prevent movement
🏃
1:50:42We detect collision and prevent movement
🏃
1:50:42We detect collision and prevent movement
🏃
1:51:41Apologise to speedrunners
1:51:41Apologise to speedrunners
1:51:41Apologise to speedrunners
1:51:55We collide, allowing tunnelling and recovery
🏃
1:51:55We collide, allowing tunnelling and recovery
🏃
1:51:55We collide, allowing tunnelling and recovery
🏃
1:55:24Make MoveEntity() subdivide the voxelized collision search
1:55:24Make MoveEntity() subdivide the voxelized collision search
1:55:24Make MoveEntity() subdivide the voxelized collision search
2:04:48Our glove no longer moves, but the familiar does
🏃
2:04:48Our glove no longer moves, but the familiar does
🏃
2:04:48Our glove no longer moves, but the familiar does
🏃
2:07:05Consider how to handle the glove's interpenetration
📖
2:07:05Consider how to handle the glove's interpenetration
📖
2:07:05Consider how to handle the glove's interpenetration
📖
2:08:42Prevent MoveEntityLocally() from drawing the occupation state
2:08:42Prevent MoveEntityLocally() from drawing the occupation state
2:08:42Prevent MoveEntityLocally() from drawing the occupation state
2:08:53Our performance has degraded
🏃
2:08:53Our performance has degraded
🏃
2:08:53Our performance has degraded
🏃
2:09:27Add an assertion on the StepCount in MoveEntity()
2:09:27Add an assertion on the StepCount in MoveEntity()
2:09:27Add an assertion on the StepCount in MoveEntity()
2:09:47Hit our assertion in MoveEntity()
🏃
2:09:47Hit our assertion in MoveEntity()
🏃
2:09:47Hit our assertion in MoveEntity()
🏃
2:10:35Inspect our values in MoveEntity()
🏃
2:10:35Inspect our values in MoveEntity()
🏃
2:10:35Inspect our values in MoveEntity()
🏃
2:11:19Make MoveEntity() cap the voxel subdivision StepCount to 5
2:11:19Make MoveEntity() cap the voxel subdivision StepCount to 5
2:11:19Make MoveEntity() cap the voxel subdivision StepCount to 5
2:12:12Our performance remains poor
🏃
2:12:12Our performance remains poor
🏃
2:12:12Our performance remains poor
🏃
2:13:03Q&A
🗩
2:13:03Q&A
🗩
2:13:03Q&A
🗩
2:13:16centhusiast Q:I am always wondering why we use CPU optimization if the rendering is done by GPU. Maybe it is a silly question
🗪
2:13:16centhusiast Q:I am always wondering why we use CPU optimization if the rendering is done by GPU. Maybe it is a silly question
🗪
2:13:16centhusiast Q:I am always wondering why we use CPU optimization if the rendering is done by GPU. Maybe it is a silly question
🗪
2:13:43Disable the lighting in UpdateLighting()
2:13:43Disable the lighting in UpdateLighting()
2:13:43Disable the lighting in UpdateLighting()
2:14:30Our unlit performance in -O2 is fine
🏃
2:14:30Our unlit performance in -O2 is fine
🏃
2:14:30Our unlit performance in -O2 is fine
🏃
2:14:36Our unlit performance in -Od is slow
🏃
2:14:36Our unlit performance in -Od is slow
🏃
2:14:36Our unlit performance in -Od is slow
🏃
2:15:25Re-enable the lighting in UpdateLighting()
2:15:25Re-enable the lighting in UpdateLighting()
2:15:25Re-enable the lighting in UpdateLighting()
2:15:37UpdateAndRenderEntities() takes 10% of our frame time
🏃
2:15:37UpdateAndRenderEntities() takes 10% of our frame time
🏃
2:15:37UpdateAndRenderEntities() takes 10% of our frame time
🏃
2:16:17Make MoveEntity() a TIMED_FUNCTION
2:16:17Make MoveEntity() a TIMED_FUNCTION
2:16:17Make MoveEntity() a TIMED_FUNCTION
2:16:47MoveEntity() takes 5% of our frame time
🏃
2:16:47MoveEntity() takes 5% of our frame time
🏃
2:16:47MoveEntity() takes 5% of our frame time
🏃
2:17:19Disable MoveEntity()
2:17:19Disable MoveEntity()
2:17:19Disable MoveEntity()
2:17:41ComputeLightPropagationWork() takes 90% of our frame time
🏃
2:17:41ComputeLightPropagationWork() takes 90% of our frame time
🏃
2:17:41ComputeLightPropagationWork() takes 90% of our frame time
🏃
2:18:04Disable the lighting in UpdateLighting()
2:18:04Disable the lighting in UpdateLighting()
2:18:04Disable the lighting in UpdateLighting()
2:18:11UpdateAndRenderEntities() takes 69% of our frame time
🏃
2:18:11UpdateAndRenderEntities() takes 69% of our frame time
🏃
2:18:11UpdateAndRenderEntities() takes 69% of our frame time
🏃
2:19:03Re-enable the lighting in UpdateLighting()
2:19:03Re-enable the lighting in UpdateLighting()
2:19:03Re-enable the lighting in UpdateLighting()
2:19:17mindmark42 Q: Doesn't the OrigP need to be updated each step?
🗪
2:19:17mindmark42 Q: Doesn't the OrigP need to be updated each step?
🗪
2:19:17mindmark42 Q: Doesn't the OrigP need to be updated each step?
🗪