Handmade Hero»Episode Guide
Placing Adjacent Rooms
?
?

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 continuing on procedural generation of level layout
🗩
0:00Recap and set the stage for the day continuing on procedural generation of level layout
🗩
0:00Recap and set the stage for the day continuing on procedural generation of level layout
🗩
1:47#if 1 our half-written layout code from yesterday, and implement PushRoom() and PopRoom()
1:47#if 1 our half-written layout code from yesterday, and implement PushRoom() and PopRoom()
1:47#if 1 our half-written layout code from yesterday, and implement PushRoom() and PopRoom()
12:36Fix up typos in PlaceRoom() and implement CanBeDirection() and HasEntries()
12:36Fix up typos in PlaceRoom() and implement CanBeDirection() and HasEntries()
12:36Fix up typos in PlaceRoom() and implement CanBeDirection() and HasEntries()
16:32Create handmade_box.h to contain a new box_surface_mask as a generalised box directional mask based on the existing GetBoxSurface() from the lighting system, for CanBeDirection() also to use
16:32Create handmade_box.h to contain a new box_surface_mask as a generalised box directional mask based on the existing GetBoxSurface() from the lighting system, for CanBeDirection() also to use
16:32Create handmade_box.h to contain a new box_surface_mask as a generalised box directional mask based on the existing GetBoxSurface() from the lighting system, for CanBeDirection() also to use
35:09Enable Connect() and CanBeDirection() to use the box_surface_mask to connect rooms
35:09Enable Connect() and CanBeDirection() to use the box_surface_mask to connect rooms
35:09Enable Connect() and CanBeDirection() to use the box_surface_mask to connect rooms
39:37Introduce GetBoxMaskComplement()
39:37Introduce GetBoxMaskComplement()
39:37Introduce GetBoxMaskComplement()
44:04Rename CanBeDirection() to CouldGoDirection(), and make it flip the incoming mask using GetBoxMaskComplement() if it isn't the mask of Connection->B
44:04Rename CanBeDirection() to CouldGoDirection(), and make it flip the incoming mask using GetBoxMaskComplement() if it isn't the mask of Connection->B
44:04Rename CanBeDirection() to CouldGoDirection(), and make it flip the incoming mask using GetBoxMaskComplement() if it isn't the mask of Connection->B
46:50Introduce PlaceRoomInVolume() for Layout() to call, in order to special-case the placement of the first room
46:50Introduce PlaceRoomInVolume() for Layout() to call, in order to special-case the placement of the first room
46:50Introduce PlaceRoomInVolume() for Layout() to call, in order to special-case the placement of the first room
52:10Augment gen_room with a RoomName string to aid debugging, and #define two versions of GenRoom() for release and debug builds
52:10Augment gen_room with a RoomName string to aid debugging, and #define two versions of GenRoom() for release and debug builds
52:10Augment gen_room with a RoomName string to aid debugging, and #define two versions of GenRoom() for release and debug builds
56:04Step through Layout() to see that the Stack wasn't correctly built
🏃
56:04Step through Layout() to see that the Stack wasn't correctly built
🏃
56:04Step through Layout() to see that the Stack wasn't correctly built
🏃
57:22Fix PushConnectedRooms() to push the correct room
57:22Fix PushConnectedRooms() to push the correct room
57:22Fix PushConnectedRooms() to push the correct room
57:48Step back into Layout() to see what happens
🏃
57:48Step back into Layout() to see what happens
🏃
57:48Step back into Layout() to see what happens
🏃
1:02:25Introduce GetSurfaceMask() for CouldGoDirection() to call
1:02:25Introduce GetSurfaceMask() for CouldGoDirection() to call
1:02:25Introduce GetSurfaceMask() for CouldGoDirection() to call
1:03:45Jump back into CouldGoDirection() and through PlaceRoom()
🏃
1:03:45Jump back into CouldGoDirection() and through PlaceRoom()
🏃
1:03:45Jump back into CouldGoDirection() and through PlaceRoom()
🏃
1:04:51Fix PlaceRoom() to clip the rooms to the correct dimensions
1:04:51Fix PlaceRoom() to clip the rooms to the correct dimensions
1:04:51Fix PlaceRoom() to clip the rooms to the correct dimensions
1:06:49Continue to step through PlaceRoom() to see how it works
🏃
1:06:49Continue to step through PlaceRoom() to see how it works
🏃
1:06:49Continue to step through PlaceRoom() to see how it works
🏃
1:08:48Make Layout() set the FirstRoom to one unit high
1:08:48Make Layout() set the FirstRoom to one unit high
1:08:48Make Layout() set the FirstRoom to one unit high
1:09:16Continue to step through PlaceRoom() into IsMinimumDimensionsForRoom(), to see that it may overflow
🏃
1:09:16Continue to step through PlaceRoom() into IsMinimumDimensionsForRoom(), to see that it may overflow
🏃
1:09:16Continue to step through PlaceRoom() into IsMinimumDimensionsForRoom(), to see that it may overflow
🏃
1:11:06Make InfinityVolume() produce a smaller volume to avoid overflowing signed int, and IsMinimumDimensionsForRoom() compute the dimensions individually for ease of inspection
1:11:06Make InfinityVolume() produce a smaller volume to avoid overflowing signed int, and IsMinimumDimensionsForRoom() compute the dimensions individually for ease of inspection
1:11:06Make InfinityVolume() produce a smaller volume to avoid overflowing signed int, and IsMinimumDimensionsForRoom() compute the dimensions individually for ease of inspection
1:12:25Step in to IsMinimumDimensionsForRoom() and inspect its values to consider that PlaceRoom() may be clipping the room incorrectly
🏃
1:12:25Step in to IsMinimumDimensionsForRoom() and inspect its values to consider that PlaceRoom() may be clipping the room incorrectly
🏃
1:12:25Step in to IsMinimumDimensionsForRoom() and inspect its values to consider that PlaceRoom() may be clipping the room incorrectly
🏃
1:16:23Make InfinityVolume() cast its computed min dimensions to signed integers
1:16:23Make InfinityVolume() cast its computed min dimensions to signed integers
1:16:23Make InfinityVolume() cast its computed min dimensions to signed integers
1:17:00Step into InfinityVolume() to see that the Min dimensions now correctly remain negative
🏃
1:17:00Step into InfinityVolume() to see that the Min dimensions now correctly remain negative
🏃
1:17:00Step into InfinityVolume() to see that the Min dimensions now correctly remain negative
🏃
1:17:05Force S32Min and S32Max to be signed integers
1:17:05Force S32Min and S32Max to be signed integers
1:17:05Force S32Min and S32Max to be signed integers
1:17:41Continue to step through PlaceRoom()
🏃
1:17:41Continue to step through PlaceRoom()
🏃
1:17:41Continue to step through PlaceRoom()
🏃
1:18:16Enable PlaceRoom() to keep chaining up rooms for every room connection
1:18:16Enable PlaceRoom() to keep chaining up rooms for every room connection
1:18:16Enable PlaceRoom() to keep chaining up rooms for every room connection
1:20:20Continue to step through PlaceRoom() to see that the room clipping is incorrect
🏃
1:20:20Continue to step through PlaceRoom() to see that the room clipping is incorrect
🏃
1:20:20Continue to step through PlaceRoom() to see that the room clipping is incorrect
🏃
1:22:29Make PlaceRoom() more correctly clip and handle rooms that cannot be placed, introducing InvertedInfinityVolume()
1:22:29Make PlaceRoom() more correctly clip and handle rooms that cannot be placed, introducing InvertedInfinityVolume()
1:22:29Make PlaceRoom() more correctly clip and handle rooms that cannot be placed, introducing InvertedInfinityVolume()
1:29:27Step into PlaceRoom() to see that MinVol.MaxZ may be off by 1
🏃
1:29:27Step into PlaceRoom() to see that MinVol.MaxZ may be off by 1
🏃
1:29:27Step into PlaceRoom() to see that MinVol.MaxZ may be off by 1
🏃
1:36:56Make PlaceRoom() consistently clip the new room's Min and Max dimensions such that it exactly abuts the other room or the interior apron, introducing ClipMin() and ClipMax()
1:36:56Make PlaceRoom() consistently clip the new room's Min and Max dimensions such that it exactly abuts the other room or the interior apron, introducing ClipMin() and ClipMax()
1:36:56Make PlaceRoom() consistently clip the new room's Min and Max dimensions such that it exactly abuts the other room or the interior apron, introducing ClipMin() and ClipMax()
2:02:13Overlapping rooms
🖌
2:02:13Overlapping rooms
🖌
2:02:13Overlapping rooms
🖌
2:05:28Continue to make PlaceRoom() correctly clip to the interior apron
2:05:28Continue to make PlaceRoom() correctly clip to the interior apron
2:05:28Continue to make PlaceRoom() correctly clip to the interior apron
2:08:11Step into PlaceRoom() to see what it produces
🏃
2:08:11Step into PlaceRoom() to see what it produces
🏃
2:08:11Step into PlaceRoom() to see what it produces
🏃
2:09:03Prevent PlaceRoom() from expanding the InteriorApron in Z
2:09:03Prevent PlaceRoom() from expanding the InteriorApron in Z
2:09:03Prevent PlaceRoom() from expanding the InteriorApron in Z
2:09:15Step back into PlaceRoom() to see that the dimensions are looking more sane
🏃
2:09:15Step back into PlaceRoom() to see that the dimensions are looking more sane
🏃
2:09:15Step back into PlaceRoom() to see that the dimensions are looking more sane
🏃
2:10:34Make PlaceRoom() offset both the other dimensions only by the interior apron (i.e. without a further +/- 1 offset)
2:10:34Make PlaceRoom() offset both the other dimensions only by the interior apron (i.e. without a further +/- 1 offset)
2:10:34Make PlaceRoom() offset both the other dimensions only by the interior apron (i.e. without a further +/- 1 offset)
2:14:35Step in to PlaceRoom() to determine that the clipping should actually be asymmetric
🏃
2:14:35Step in to PlaceRoom() to determine that the clipping should actually be asymmetric
🏃
2:14:35Step in to PlaceRoom() to determine that the clipping should actually be asymmetric
🏃
2:14:59Make PlaceRoom() offset the other max dimension by 1
2:14:59Make PlaceRoom() offset the other max dimension by 1
2:14:59Make PlaceRoom() offset the other max dimension by 1
2:15:10Step in to PlaceRoom() to determine that this room is correctly placed
🏃
2:15:10Step in to PlaceRoom() to determine that this room is correctly placed
🏃
2:15:10Step in to PlaceRoom() to determine that this room is correctly placed
🏃
2:15:43Take a look at our world
🏃
2:15:43Take a look at our world
🏃
2:15:43Take a look at our world
🏃
2:16:12Simplify CreateOrphanage() to only create two adjoining rooms
2:16:12Simplify CreateOrphanage() to only create two adjoining rooms
2:16:12Simplify CreateOrphanage() to only create two adjoining rooms
2:17:56Step through Layout() to see how it places our two rooms
🏃
2:17:56Step through Layout() to see how it places our two rooms
🏃
2:17:56Step through Layout() to see how it places our two rooms
🏃
2:20:18Make PlaceRoom() leave the loops
2:20:18Make PlaceRoom() leave the loops
2:20:18Make PlaceRoom() leave the loops
2:21:42Run the game to see our two placed rooms
🏃
2:21:42Run the game to see our two placed rooms
🏃
2:21:42Run the game to see our two placed rooms
🏃
2:22:37Fix PlaceRoom() to exactly abut the rooms
2:22:37Fix PlaceRoom() to exactly abut the rooms
2:22:37Fix PlaceRoom() to exactly abut the rooms
2:24:35Run the game to see that the rooms abut
🏃
2:24:35Run the game to see that the rooms abut
🏃
2:24:35Run the game to see that the rooms abut
🏃
2:24:47Increase the InteriorApron in PlaceRoom()
2:24:47Increase the InteriorApron in PlaceRoom()
2:24:47Increase the InteriorApron in PlaceRoom()
2:24:54Check out our room abutment with more space
🏃
2:24:54Check out our room abutment with more space
🏃
2:24:54Check out our room abutment with more space
🏃
2:25:05Reduce the maximum room size
2:25:05Reduce the maximum room size
2:25:05Reduce the maximum room size
2:25:17Check out the smaller rooms
🏃
2:25:17Check out the smaller rooms
🏃
2:25:17Check out the smaller rooms
🏃
2:26:38Enable PlaceRoom() to knock out the entire abutment of adjoining rooms, introducing Union() and Intersect()
2:26:38Enable PlaceRoom() to knock out the entire abutment of adjoining rooms, introducing Union() and Intersect()
2:26:38Enable PlaceRoom() to knock out the entire abutment of adjoining rooms, introducing Union() and Intersect()
2:34:53Run the game to see that we knocked it out backwards
🏃
2:34:53Run the game to see that we knocked it out backwards
🏃
2:34:53Run the game to see that we knocked it out backwards
🏃
2:35:14Fix PlaceRoom() to correctly position the door
2:35:14Fix PlaceRoom() to correctly position the door
2:35:14Fix PlaceRoom() to correctly position the door
2:35:45Run the game and traverse between the rooms
🏃
2:35:45Run the game and traverse between the rooms
🏃
2:35:45Run the game and traverse between the rooms
🏃
2:36:44Q&A
🗩
2:36:44Q&A
🗩
2:36:44Q&A
🗩
2:38:17drzool Q: Would nomenclature like: Low / High / Width be helpful?
🗪
2:38:17drzool Q: Would nomenclature like: Low / High / Width be helpful?
🗪
2:38:17drzool Q: Would nomenclature like: Low / High / Width be helpful?
🗪
2:38:36nxsy Q: Would using a range of low values and a range of high values for dimensions be easier than having two volumes?
🗪
2:38:36nxsy Q: Would using a range of low values and a range of high values for dimensions be easier than having two volumes?
🗪
2:38:36nxsy Q: Would using a range of low values and a range of high values for dimensions be easier than having two volumes?
🗪
2:38:54floorislava Q: Why are you appending 'x' to some of the types?
🗪
2:38:54floorislava Q: Why are you appending 'x' to some of the types?
🗪
2:38:54floorislava Q: Why are you appending 'x' to some of the types?
🗪
2:40:15vkar2 Q: Didn't you want to avoid recursion?
🗪
2:40:15vkar2 Q: Didn't you want to avoid recursion?
🗪
2:40:15vkar2 Q: Didn't you want to avoid recursion?
🗪
2:41:46qwindoo Q: Could the hero walk outside the rooms in this setup (in the gray / void zone)?
🗪
2:41:46qwindoo Q: Could the hero walk outside the rooms in this setup (in the gray / void zone)?
🗪
2:41:46qwindoo Q: Could the hero walk outside the rooms in this setup (in the gray / void zone)?
🗪
2:42:50nxsy Q: Low can be between -30 and 5, and high can be between -4 and 20. As opposed to a min volume of -4 and 5 and a max volume of -30 and 20. (In one dimension). Makes it easier to fit in my brain, at least
🗪
2:42:50nxsy Q: Low can be between -30 and 5, and high can be between -4 and 20. As opposed to a min volume of -4 and 5 and a max volume of -30 and 20. (In one dimension). Makes it easier to fit in my brain, at least
🗪
2:42:50nxsy Q: Low can be between -30 and 5, and high can be between -4 and 20. As opposed to a min volume of -4 and 5 and a max volume of -30 and 20. (In one dimension). Makes it easier to fit in my brain, at least
🗪
2:43:48foocat Q: Do you think that languages that interact with the GPU directly (like Nvidia's CUDA or AMD HIP) would be useful for game programming?
🗪
2:43:48foocat Q: Do you think that languages that interact with the GPU directly (like Nvidia's CUDA or AMD HIP) would be useful for game programming?
🗪
2:43:48foocat Q: Do you think that languages that interact with the GPU directly (like Nvidia's CUDA or AMD HIP) would be useful for game programming?
🗪
2:45:04thejimjames40 Q: (Off-topic) Do you miss some features that exist in C but are absent in C++?
🗪
2:45:04thejimjames40 Q: (Off-topic) Do you miss some features that exist in C but are absent in C++?
🗪
2:45:04thejimjames40 Q: (Off-topic) Do you miss some features that exist in C but are absent in C++?
🗪
2:46:31internal_static_void_ Q: Thoughts on DXR?
🗪
2:46:31internal_static_void_ Q: Thoughts on DXR?
🗪
2:46:31internal_static_void_ Q: Thoughts on DXR?
🗪
2:46:380lpbm Q: will you ever get back to the nicely aligned grass / rocks bitmaps, map them over the current tiles maybe?
🗪
2:46:380lpbm Q: will you ever get back to the nicely aligned grass / rocks bitmaps, map them over the current tiles maybe?
🗪
2:46:380lpbm Q: will you ever get back to the nicely aligned grass / rocks bitmaps, map them over the current tiles maybe?
🗪
2:47:31tmtow Q: Sorry, I could not exactly follow, but can you guess at what makes the interval computations tiresome?
🗪
2:47:31tmtow Q: Sorry, I could not exactly follow, but can you guess at what makes the interval computations tiresome?
🗪
2:47:31tmtow Q: Sorry, I could not exactly follow, but can you guess at what makes the interval computations tiresome?
🗪
2:51:29uebel_andre Q: Do you feel it'd be worth it to abstract away subsystems (input, audio, lifecycle) with an Event system?
🗪
2:51:29uebel_andre Q: Do you feel it'd be worth it to abstract away subsystems (input, audio, lifecycle) with an Event system?
🗪
2:51:29uebel_andre Q: Do you feel it'd be worth it to abstract away subsystems (input, audio, lifecycle) with an Event system?
🗪
2:51:58vaualbus Q: Can we try all the rooms now?
🗪
2:51:58vaualbus Q: Can we try all the rooms now?
🗪
2:51:58vaualbus Q: Can we try all the rooms now?
🗪
2:52:08Let CreateOrphanage() try and create the whole building
2:52:08Let CreateOrphanage() try and create the whole building
2:52:08Let CreateOrphanage() try and create the whole building
2:52:42Run the game to show that it's always connecting rooms at the further side, and will inevitably fail when it would need to connect along another side
🏃
2:52:42Run the game to show that it's always connecting rooms at the further side, and will inevitably fail when it would need to connect along another side
🏃
2:52:42Run the game to show that it's always connecting rooms at the further side, and will inevitably fail when it would need to connect along another side
🏃
2:54:37jim0_o Q: Have you ever made a visualization tool for working stuff like this out? (I'm thinking of something like live-code-editing combined with showing values on screen and lerping between previous and new values showing how the changes affect the scene when the code reloads.)
🗪
2:54:37jim0_o Q: Have you ever made a visualization tool for working stuff like this out? (I'm thinking of something like live-code-editing combined with showing values on screen and lerping between previous and new values showing how the changes affect the scene when the code reloads.)
🗪
2:54:37jim0_o Q: Have you ever made a visualization tool for working stuff like this out? (I'm thinking of something like live-code-editing combined with showing values on screen and lerping between previous and new values showing how the changes affect the scene when the code reloads.)
🗪
2:55:02vaualbus Q: Also, after all of this code on rendering and this, is code reloading still working?
🗪
2:55:02vaualbus Q: Also, after all of this code on rendering and this, is code reloading still working?
🗪
2:55:02vaualbus Q: Also, after all of this code on rendering and this, is code reloading still working?
🗪
2:55:42Demonstrate the hot code reloading by making LightingTest() return immediately
🏃
2:55:42Demonstrate the hot code reloading by making LightingTest() return immediately
🏃
2:55:42Demonstrate the hot code reloading by making LightingTest() return immediately
🏃
2:56:59devblacky Q: Are you doing custom memory management?
🗪
2:56:59devblacky Q: Are you doing custom memory management?
🗪
2:56:59devblacky Q: Are you doing custom memory management?
🗪
2:58:08Wrap it up
🗩
2:58:08Wrap it up
🗩
2:58:08Wrap it up
🗩