Revisiting 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:31Enjoy the door switch tiles and determine to explore combat
🏃
1:31Enjoy the door switch tiles and determine to explore combat
🏃
1:31Enjoy the door switch tiles and determine to explore combat
🏃
4:54Start with asymmetric combat, with enemies floating and the player tile-bound
📖
4:54Start with asymmetric combat, with enemies floating and the player tile-bound
📖
4:54Start with asymmetric combat, with enemies floating and the player tile-bound
📖
8:18Introduce SingleEnemyPattern
8:18Introduce SingleEnemyPattern
8:18Introduce SingleEnemyPattern
12:36See no familiar
🏃
12:36See no familiar
🏃
12:36See no familiar
🏃
13:09Make CreateDungeon() call AddPattern() with our SingleEnemyPattern
13:09Make CreateDungeon() call AddPattern() with our SingleEnemyPattern
13:09Make CreateDungeon() call AddPattern() with our SingleEnemyPattern
14:20We have a familiar
🏃
14:20We have a familiar
🏃
14:20We have a familiar
🏃
14:42Reacquaint ourselves with ExecuteBrain()
📖
14:42Reacquaint ourselves with ExecuteBrain()
📖
14:42Reacquaint ourselves with ExecuteBrain()
📖
16:37Force ExecuteBrain() to run the "!Blocked" path
16:37Force ExecuteBrain() to run the "!Blocked" path
16:37Force ExecuteBrain() to run the "!Blocked" path
17:03Our familiar remains stationary
🏃
17:03Our familiar remains stationary
🏃
17:03Our familiar remains stationary
🏃
17:31Compile in -Od
17:31Compile in -Od
17:31Compile in -Od
18:11Step in to ExecuteBrain()
🏃
18:11Step in to ExecuteBrain()
🏃
18:11Step in to ExecuteBrain()
🏃
19:52Reacquaint ourselves with the movement code in the entity system
📖
19:52Reacquaint ourselves with the movement code in the entity system
📖
19:52Reacquaint ourselves with the movement code in the entity system
📖
21:52Implement the MovementMode_Floating case in UpdateAndRenderEntities()
21:52Implement the MovementMode_Floating case in UpdateAndRenderEntities()
21:52Implement the MovementMode_Floating case in UpdateAndRenderEntities()
23:17Our familiar now moves
🏃
23:17Our familiar now moves
🏃
23:17Our familiar now moves
🏃
23:45Our familiars are subject to collision volumes
🏃
23:45Our familiars are subject to collision volumes
🏃
23:45Our familiars are subject to collision volumes
🏃
24:55Make ExecuteBrain() conditionally run the "!Blocked" path
24:55Make ExecuteBrain() conditionally run the "!Blocked" path
24:55Make ExecuteBrain() conditionally run the "!Blocked" path
25:14Familiars can still float and interact with us through walls
🏃
25:14Familiars can still float and interact with us through walls
🏃
25:14Familiars can still float and interact with us through walls
🏃
25:29Reacquaint ourselves with the "Blocked" code in ExecuteBrain()
📖
25:29Reacquaint ourselves with the "Blocked" code in ExecuteBrain()
📖
25:29Reacquaint ourselves with the "Blocked" code in ExecuteBrain()
📖
28:52Make UpdateAndRenderEntities() draw the collision volumes
28:52Make UpdateAndRenderEntities() draw the collision volumes
28:52Make UpdateAndRenderEntities() draw the collision volumes
29:21Our walls have collision volumes
🏃
29:21Our walls have collision volumes
🏃
29:21Our walls have collision volumes
🏃
29:42Make ExecuteBrain() set MovementMode_Floating for the familiar
29:42Make ExecuteBrain() set MovementMode_Floating for the familiar
29:42Make ExecuteBrain() set MovementMode_Floating for the familiar
30:03Our familiar follows us again
🏃
30:03Our familiar follows us again
🏃
30:03Our familiar follows us again
🏃
30:21Make SingleEnemyPattern add a collision volume
30:21Make SingleEnemyPattern add a collision volume
30:21Make SingleEnemyPattern add a collision volume
30:48Our familiar has a collision volume
🏃
30:48Our familiar has a collision volume
🏃
30:48Our familiar has a collision volume
🏃
30:55Increase the collision volume dimensions from 0.75³ to 1.25³ in SingleEnemyPattern
30:55Increase the collision volume dimensions from 0.75³ to 1.25³ in SingleEnemyPattern
30:55Increase the collision volume dimensions from 0.75³ to 1.25³ in SingleEnemyPattern
31:11Check our familiar's collision volume
🏃
31:11Check our familiar's collision volume
🏃
31:11Check our familiar's collision volume
🏃
31:13Decrease the collision volume dimensions from 1.25³ to 1³ in SingleEnemyPattern
31:13Decrease the collision volume dimensions from 1.25³ to 1³ in SingleEnemyPattern
31:13Decrease the collision volume dimensions from 1.25³ to 1³ in SingleEnemyPattern
31:18Our familiars fail to collide
🏃
31:18Our familiars fail to collide
🏃
31:18Our familiars fail to collide
🏃
31:40Make SingleEnemyPattern set the EntityFlag_Collides
31:40Make SingleEnemyPattern set the EntityFlag_Collides
31:40Make SingleEnemyPattern set the EntityFlag_Collides
32:10Our familiars can still float through walls
🏃
32:10Our familiars can still float through walls
🏃
32:10Our familiars can still float through walls
🏃
32:34Reacquaint ourselves with EntityFlag_Collides
📖
32:34Reacquaint ourselves with EntityFlag_Collides
📖
32:34Reacquaint ourselves with EntityFlag_Collides
📖
33:41Let CanCollide() ignore the EntityFlag_Collides
33:41Let CanCollide() ignore the EntityFlag_Collides
33:41Let CanCollide() ignore the EntityFlag_Collides
33:54Our familiar collides with the doorway
🏃
33:54Our familiar collides with the doorway
🏃
33:54Our familiar collides with the doorway
🏃
34:17Make SingleEnemyPattern elevate the collision volume off the ground
34:17Make SingleEnemyPattern elevate the collision volume off the ground
34:17Make SingleEnemyPattern elevate the collision volume off the ground
34:32Our familiar still collides with the doorway
🏃
34:32Our familiar still collides with the doorway
🏃
34:32Our familiar still collides with the doorway
🏃
35:22Remove EntityFlag_Collides
35:22Remove EntityFlag_Collides
35:22Remove EntityFlag_Collides
37:12Our familiar may be colliding with the room boundary
🏃
37:12Our familiar may be colliding with the room boundary
🏃
37:12Our familiar may be colliding with the room boundary
🏃
38:10Replace the EntityFlag_Collides with collision responses, starting with SpeculativeCollide() ignoring room boundary collisions
38:10Replace the EntityFlag_Collides with collision responses, starting with SpeculativeCollide() ignoring room boundary collisions
38:10Replace the EntityFlag_Collides with collision responses, starting with SpeculativeCollide() ignoring room boundary collisions
42:30Our familiars collide, but can lock
🏃
42:30Our familiars collide, but can lock
🏃
42:30Our familiars collide, but can lock
🏃
43:35hexadecimalinteger "We can see this dude grinding against the wall, which is nice." -Casey, 2021
🗪
43:35hexadecimalinteger "We can see this dude grinding against the wall, which is nice." -Casey, 2021
🗪
43:35hexadecimalinteger "We can see this dude grinding against the wall, which is nice." -Casey, 2021
🗪
43:53Determine to change the glove movement scheme from a "generalised coordinates" to a "Lagrangian" simulation system
🏃
43:53Determine to change the glove movement scheme from a "generalised coordinates" to a "Lagrangian" simulation system
🏃
43:53Determine to change the glove movement scheme from a "generalised coordinates" to a "Lagrangian" simulation system
🏃
48:46Glove management example: Getting caught on doors
🏃
48:46Glove management example: Getting caught on doors
🏃
48:46Glove management example: Getting caught on doors
🏃
50:06Determine to replace the glove's kinematic movement with an active management system
🏃
50:06Determine to replace the glove's kinematic movement with an active management system
🏃
50:06Determine to replace the glove's kinematic movement with an active management system
🏃
52:56Make AddPlayer() set the Glove's MovementMode to Floating
52:56Make AddPlayer() set the Glove's MovementMode to Floating
52:56Make AddPlayer() set the Glove's MovementMode to Floating
53:29Our glove is still controllable
🏃
53:29Our glove is still controllable
🏃
53:29Our glove is still controllable
🏃
53:50Introduce PDC() – proportional derivative controller – for ExecuteBrainHero() to use on the glove1
53:50Introduce PDC() – proportional derivative controller – for ExecuteBrainHero() to use on the glove1
53:50Introduce PDC() – proportional derivative controller – for ExecuteBrainHero() to use on the glove1
58:27Our glove follows us
🏃
58:27Our glove follows us
🏃
58:27Our glove follows us
🏃
58:48Make ExecuteBrainHero() stiffen the glove's spring
🏃
🖮
58:48Make ExecuteBrainHero() stiffen the glove's spring
🏃
🖮
58:48Make ExecuteBrainHero() stiffen the glove's spring
🏃
🖮
1:00:09Our glove remains close to the hero
🏃
1:00:09Our glove remains close to the hero
🏃
1:00:09Our glove remains close to the hero
🏃
1:00:56Enable ExecuteBrainHero() to throw simulated punches
1:00:56Enable ExecuteBrainHero() to throw simulated punches
1:00:56Enable ExecuteBrainHero() to throw simulated punches
1:05:07Throw punches
🏃
1:05:07Throw punches
🏃
1:05:07Throw punches
🏃
1:06:08Increase GloveFloatHeight from 0.25 to 0.5 in ExecuteBrainHero()
1:06:08Increase GloveFloatHeight from 0.25 to 0.5 in ExecuteBrainHero()
1:06:08Increase GloveFloatHeight from 0.25 to 0.5 in ExecuteBrainHero()
1:06:21Our glove still skates along the ground, and punches are too slack
🏃
1:06:21Our glove still skates along the ground, and punches are too slack
🏃
1:06:21Our glove still skates along the ground, and punches are too slack
🏃
1:07:24Punch speed-based damage
🏃
1:07:24Punch speed-based damage
🏃
1:07:24Punch speed-based damage
🏃
1:08:24Tighten up our glove spring in ExecuteBrainHero()
1:08:24Tighten up our glove spring in ExecuteBrainHero()
1:08:24Tighten up our glove spring in ExecuteBrainHero()
1:08:38Our glove still feels sticky
🏃
1:08:38Our glove still feels sticky
🏃
1:08:38Our glove still feels sticky
🏃
1:09:23Further tighten up our glove spring in ExecuteBrainHero()
1:09:23Further tighten up our glove spring in ExecuteBrainHero()
1:09:23Further tighten up our glove spring in ExecuteBrainHero()
1:09:29Try throwing punches
🏃
1:09:29Try throwing punches
🏃
1:09:29Try throwing punches
🏃
1:10:09Look into MovementMode_Floating
📖
1:10:09Look into MovementMode_Floating
📖
1:10:09Look into MovementMode_Floating
📖
1:11:27Our glove movement behaves oddly
🏃
1:11:27Our glove movement behaves oddly
🏃
1:11:27Our glove movement behaves oddly
🏃
1:11:37Make ExecuteBrainHero() match the Glove's FacingDirection to the body's
1:11:37Make ExecuteBrainHero() match the Glove's FacingDirection to the body's
1:11:37Make ExecuteBrainHero() match the Glove's FacingDirection to the body's
1:11:52Our glove movement feels odd
🏃
1:11:52Our glove movement feels odd
🏃
1:11:52Our glove movement feels odd
🏃
1:12:39Reacquaint ourselves with MoveEntity() and the entity DistanceRemaining
📖
1:12:39Reacquaint ourselves with MoveEntity() and the entity DistanceRemaining
📖
1:12:39Reacquaint ourselves with MoveEntity() and the entity DistanceRemaining
📖
1:15:34Begin to rewrite MoveEntity() without DistanceRemaining
1:15:34Begin to rewrite MoveEntity() without DistanceRemaining
1:15:34Begin to rewrite MoveEntity() without DistanceRemaining
1:21:36Our problems: 1) Determining how far we can go in a particular direction; 2) Sliding against surfaces
📖
1:21:36Our problems: 1) Determining how far we can go in a particular direction; 2) Sliding against surfaces
📖
1:21:36Our problems: 1) Determining how far we can go in a particular direction; 2) Sliding against surfaces
📖
1:24:09Continue to rewrite MoveEntity(), determining the closest point to move to
1:24:09Continue to rewrite MoveEntity(), determining the closest point to move to
1:24:09Continue to rewrite MoveEntity(), determining the closest point to move to
1:27:03Set up the lightboard
🗹
1:27:03Set up the lightboard
🗹
1:27:03Set up the lightboard
🗹
1:29:57Switch the scene
🗹
1:29:57Switch the scene
🗹
1:29:57Switch the scene
🗹
1:30:15Check the sound levels
🗹
1:30:15Check the sound levels
🗹
1:30:15Check the sound levels
🗹
1:30:40Closest point movement and collision detection
🖌
1:30:40Closest point movement and collision detection
🖌
1:30:40Closest point movement and collision detection
🖌
1:31:29Our problem: Gliding along collision volumes
🖌
1:31:29Our problem: Gliding along collision volumes
🖌
1:31:29Our problem: Gliding along collision volumes
🖌
1:35:21Deterministic gliding collision system structure
🖌
1:35:21Deterministic gliding collision system structure
🖌
1:35:21Deterministic gliding collision system structure
🖌
1:38:58Gliding collision as a pathfinding problem
🖌
1:38:58Gliding collision as a pathfinding problem
🖌
1:38:58Gliding collision as a pathfinding problem
🖌
1:41:59The Witness's localised grid for gliding collision
🖌
1:41:59The Witness's localised grid for gliding collision
🖌
1:41:59The Witness's localised grid for gliding collision
🖌
1:44:00Gliding collision as a pathfinding problem (cont.)
🖌
1:44:00Gliding collision as a pathfinding problem (cont.)
🖌
1:44:00Gliding collision as a pathfinding problem (cont.)
🖌
1:49:19Legal path segment picking
🖌
1:49:19Legal path segment picking
🖌
1:49:19Legal path segment picking
🖌
1:52:58Overlap testing
🖌
1:52:58Overlap testing
🖌
1:52:58Overlap testing
🖌
1:56:42Window cleaning, dreaming of a self-erasing board
🗹
🖌
1:56:42Window cleaning, dreaming of a self-erasing board
🗹
🖌
1:56:42Window cleaning, dreaming of a self-erasing board
🗹
🖌
1:58:53Hemispherical gliding collision
🖌
1:58:53Hemispherical gliding collision
🖌
1:58:53Hemispherical gliding collision
🖌
2:02:57Small-scale localised grid for gliding collision
🖌
2:02:57Small-scale localised grid for gliding collision
🖌
2:02:57Small-scale localised grid for gliding collision
🖌
2:06:06Legal position picking, subdividing cells by nine
🖌
2:06:06Legal position picking, subdividing cells by nine
🖌
2:06:06Legal position picking, subdividing cells by nine
🖌
2:11:03Boundary-avoiding subdivision
🖌
2:11:03Boundary-avoiding subdivision
🖌
2:11:03Boundary-avoiding subdivision
🖌
2:12:43Data requirements: "Closest to Dest" and "Connectivity" (Exits)
🖌
2:12:43Data requirements: "Closest to Dest" and "Connectivity" (Exits)
🖌
2:12:43Data requirements: "Closest to Dest" and "Connectivity" (Exits)
🖌
2:18:52Subdividing by changing the collision sphere's enlargement radius
🖌
2:18:52Subdividing by changing the collision sphere's enlargement radius
🖌
2:18:52Subdividing by changing the collision sphere's enlargement radius
🖌
2:21:06Determine to sleep on our collision
🖌
2:21:06Determine to sleep on our collision
🖌
2:21:06Determine to sleep on our collision
🖌
2:21:30We're out of time
🗩
2:21:30We're out of time
🗩
2:21:30We're out of time
🗩
2:22:18Q&A
🗩
2:22:18Q&A
🗩
2:22:18Q&A
🗩
2:22:34mtsmox Q: Wouldn't this allow longer paths than the original, since you could still reach the goal while going a longer route?
🗪
2:22:34mtsmox Q: Wouldn't this allow longer paths than the original, since you could still reach the goal while going a longer route?
🗪
2:22:34mtsmox Q: Wouldn't this allow longer paths than the original, since you could still reach the goal while going a longer route?
🗪
2:24:03alizarinc Q: Has there been any advancement on the 4-simplex case of GJK? Been reading your blog2 about this topic
🗪
2:24:03alizarinc Q: Has there been any advancement on the 4-simplex case of GJK? Been reading your blog2 about this topic
🗪
2:24:03alizarinc Q: Has there been any advancement on the 4-simplex case of GJK? Been reading your blog2 about this topic
🗪
2:24:33volcanicpopsicle Q: Why not just move the character to the closest legal point of the desired end point?
🗪
2:24:33volcanicpopsicle Q: Why not just move the character to the closest legal point of the desired end point?
🗪
2:24:33volcanicpopsicle Q: Why not just move the character to the closest legal point of the desired end point?
🗪
2:25:04technicbeam Q: I've never used a lightboard, so take this with a grain of salt, but if the edges were sealed so water couldn't get there, could you just spray and squeegee it?
🗪
2:25:04technicbeam Q: I've never used a lightboard, so take this with a grain of salt, but if the edges were sealed so water couldn't get there, could you just spray and squeegee it?
🗪
2:25:04technicbeam Q: I've never used a lightboard, so take this with a grain of salt, but if the edges were sealed so water couldn't get there, could you just spray and squeegee it?
🗪
2:25:56volcanicpopsicle Q: I mean not the closest point on the path but closest point in the half sphere. But, yeah, I guess the problem is finding the closest point?
🗪
2:25:56volcanicpopsicle Q: I mean not the closest point on the path but closest point in the half sphere. But, yeah, I guess the problem is finding the closest point?
🗪
2:25:56volcanicpopsicle Q: I mean not the closest point on the path but closest point in the half sphere. But, yeah, I guess the problem is finding the closest point?
🗪
2:26:56volcanicpopsicle That's probably a stupid question
🗪
2:26:56volcanicpopsicle That's probably a stupid question
🗪
2:26:56volcanicpopsicle That's probably a stupid question
🗪
2:28:24puuhs_mama If there is a frame stutter, then the small movement becomes really large?
🗪
2:28:24puuhs_mama If there is a frame stutter, then the small movement becomes really large?
🗪
2:28:24puuhs_mama If there is a frame stutter, then the small movement becomes really large?
🗪
2:29:50dmitriykubyshkin handmade_hero For the lightboard there are already large transparent TVs, so the only question is price and pen tracking which is a solved problem
🗪
2:29:50dmitriykubyshkin handmade_hero For the lightboard there are already large transparent TVs, so the only question is price and pen tracking which is a solved problem
🗪
2:29:50dmitriykubyshkin handmade_hero For the lightboard there are already large transparent TVs, so the only question is price and pen tracking which is a solved problem
🗪
2:31:57nairou2 Q: At any point in your development as a programmer, have you ever dealt with pointer aversion? I tend to avoid storing pointers, using array index lookups every time instead, to avoid the possibility of a bad / null pointer. I feel like I'm limiting myself by doing this, but it also feels valid. Have you dealt with this, and have any advice / opinion on it?
🗪
2:31:57nairou2 Q: At any point in your development as a programmer, have you ever dealt with pointer aversion? I tend to avoid storing pointers, using array index lookups every time instead, to avoid the possibility of a bad / null pointer. I feel like I'm limiting myself by doing this, but it also feels valid. Have you dealt with this, and have any advice / opinion on it?
🗪
2:31:57nairou2 Q: At any point in your development as a programmer, have you ever dealt with pointer aversion? I tend to avoid storing pointers, using array index lookups every time instead, to avoid the possibility of a bad / null pointer. I feel like I'm limiting myself by doing this, but it also feels valid. Have you dealt with this, and have any advice / opinion on it?
🗪
2:37:25centhusiast Q: Is it possible to replace the entire web stack by C? I mean both back-end and front-end
🗪
2:37:25centhusiast Q: Is it possible to replace the entire web stack by C? I mean both back-end and front-end
🗪
2:37:25centhusiast Q: Is it possible to replace the entire web stack by C? I mean both back-end and front-end
🗪
2:38:03exp_ix Q: When your 0th slot is reserved, do your loops start from 1 or 0 then?
🗪
2:38:03exp_ix Q: When your 0th slot is reserved, do your loops start from 1 or 0 then?
🗪
2:38:03exp_ix Q: When your 0th slot is reserved, do your loops start from 1 or 0 then?
🗪
2:38:51stanislav_ts What would you then say to the idea that pointers can be be better because the compiler knows to prefetch the targets of pointers. This is not the case with indices as there are no "pointy" semantics there that the compiler understands
🗪
2:38:51stanislav_ts What would you then say to the idea that pointers can be be better because the compiler knows to prefetch the targets of pointers. This is not the case with indices as there are no "pointy" semantics there that the compiler understands
🗪
2:38:51stanislav_ts What would you then say to the idea that pointers can be be better because the compiler knows to prefetch the targets of pointers. This is not the case with indices as there are no "pointy" semantics there that the compiler understands
🗪
2:40:59filiadelski handmade_hero You better post pictures of that to #food or I will find you
🗪
2:40:59filiadelski handmade_hero You better post pictures of that to #food or I will find you
🗪
2:40:59filiadelski handmade_hero You better post pictures of that to #food or I will find you
🗪
2:41:17stanislav_ts I cannot give an example. It is just somethings that I've heard other people talk about when they give counter arguments for using indices
🗪
2:41:17stanislav_ts I cannot give an example. It is just somethings that I've heard other people talk about when they give counter arguments for using indices
🗪
2:41:17stanislav_ts I cannot give an example. It is just somethings that I've heard other people talk about when they give counter arguments for using indices
🗪
2:42:00Prefetching pointer targets3
📖
2:42:00Prefetching pointer targets3
📖
2:42:00Prefetching pointer targets3
📖
2:49:23filiadelski handmade_hero Pass in -Os for small code?
🗪
2:49:23filiadelski handmade_hero Pass in -Os for small code?
🗪
2:49:23filiadelski handmade_hero Pass in -Os for small code?
🗪
2:49:45mitchty __builtin_prefetch()4 is the way to hint, but still gotta test it
🗪
2:49:45mitchty __builtin_prefetch()4 is the way to hint, but still gotta test it
🗪
2:49:45mitchty __builtin_prefetch()4 is the way to hint, but still gotta test it
🗪
2:50:53mitchty It's __builtin_prefetch(&location, optional)
🗪
2:50:53mitchty It's __builtin_prefetch(&location, optional)
🗪
2:50:53mitchty It's __builtin_prefetch(&location, optional)
🗪
2:51:45mitchty Yep, it's not in the optimizer
🗪
2:51:45mitchty Yep, it's not in the optimizer
🗪
2:51:45mitchty Yep, it's not in the optimizer
🗪
2:51:59GCC vs Clang loop unrolling5
📖
2:51:59GCC vs Clang loop unrolling5
📖
2:51:59GCC vs Clang loop unrolling5
📖
2:59:24mitchty Try -Oz in clang
🗪
2:59:24mitchty Try -Oz in clang
🗪
2:59:24mitchty Try -Oz in clang
🗪
2:59:36GCC vs Clang loop unrolling (cont.)6
📖
2:59:36GCC vs Clang loop unrolling (cont.)6
📖
2:59:36GCC vs Clang loop unrolling (cont.)6
📖
3:01:19Gotta go
🗩
3:01:19Gotta go
🗩
3:01:19Gotta go
🗩