diff --git a/cmuratori/hero/code/code446.hmml b/cmuratori/hero/code/code446.hmml index f94c9bc..a74c32f 100644 --- a/cmuratori/hero/code/code446.hmml +++ b/cmuratori/hero/code/code446.hmml @@ -1,3 +1,43 @@ [video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Generating Possible Room Volumes" vod_platform=youtube id=BnS1WgMOAYc annotator=Miblo] -[0:00][\[Annotations to be written…\]] +[0:02][Recap and set the stage for the day generating possible room volumes][:"graph topology" :"procedural generation" :speech] +[1:52][Describe our current world layout code in CreateOrphanage() with a note that we are using an undirected graph][:"graph topology" :"procedural generation" :research] +[4:15][:Run the game to show our current world] +[5:03][A few words on starting to devise solutions and to open black boxes][:speech] +[7:25][Inter-room Layout][:blackboard :"graph topology" :"procedural generation"] +[9:29][Dynamically resizable rooms][:blackboard :"graph topology" :"procedural generation"] +[12:39][Recall dad's work at DEC around the time of the DEC Alpha[ref + site=Wikipedia + page="DEC Alpha" + url=https://en.wikipedia.org/wiki/DEC_Alpha], chip layout, and "rip up and replace"][:fabrication :hardware :research] +[18:47][Speculative layout, and the notion of starting off with a totally brute force solution, before trying to reduce the search space of that solution][:blackboard :"graph topology" :"procedural generation"] +[26:30][Setup to tackle our layout problem with an eye toward impermanence][:blackboard :"graph topology" :"procedural generation"] +[29:01][Specify our world generation rules for Layout() to follow][:"graph topology" :"procedural generation" :research] +[31:47][Introduce gen_room_stack for Layout() to use, with a few words on the use of the compiler's vs our own stack management by recursive functions][:"graph topology" :memory :"procedural generation"] +[45:30][Introduce GetOtherRoom() for Layout() to call][:"graph topology" :"procedural generation"] +[49:52][Determine to enable Layout() to figure out where to place and connect rooms in a trial-and-error fashion, with four connections per room, connecting two rooms after both are placed][:"graph topology" :"procedural generation" :speech] +[54:10][Continue enabling Layout() to place and connect rooms in separate passes, introducing PushConnectedRooms()][:"graph topology" :"procedural generation"] +[1:00:28][Enumerating shapes of rooms that satisfy connections][:blackboard :"graph topology" :"procedural generation"] +[1:10:26][Union and intersection][:blackboard :geometry :"graph topology" :"procedural generation"] +[1:16:08][Determining the largest rectangle that touches other rectangles in our union][:blackboard :geometry :"procedural generation"] +[1:19:42][Metropolis–Hastings algorithm[ref + site=Wikipedia + page="Metropolis–Hastings algorithm" + url=https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm]][:research :statistics] +[1:25:28][The problem of stably iterating over multiple, changeable brute force possibilities][:speech] +[1:26:42][Enable Layout() to unionise our rooms, clipping that union to the largest spaces to accommodate a connecting room and placing a room there using PlaceRoom()][:geometry :"procedural generation"] +[1:39:22][Minimum / maximum bounding rectangle room requirements to satisfy connections][:blackboard :geometry :"procedural generation"] +[1:43:23][Remove the union gathering phase from Layout(), in favour of room clipping based on the dimensions stored in gen_volume, introducing IsMinimumDimensionsForRoom()][:geometry :"procedural generation"] +[1:57:44][Constraining our possible room placements][:blackboard :geometry :"procedural generation"] +[1:59:20][Enable PlaceRoom() to clip our rooms in all dimensions][:geometry :"procedural generation"] +[2:08:49][Introduce InfinityVolume() containing the whole world for Layout() to call before PlaceRoom() clips out our desired region][:geometry :"procedural generation"] +[2:14:37][Introduce GetMaximumVolumeFor(), and consider using a room spec to constrain our dimensions][:geometry :"procedural generation"] +[2:18:05][Min / Max Intervals for Reasonable Length Picking][:blackboard :geometry :"procedural generation"] +[2:22:05][Enable PlaceRoom() to pick reasonable room dimensions][:geometry :"procedural generation"] +[2:28:49][#if 0 most of today's code, with a view to getting the existing code to work with our newly formulated notion of parameterised room volumes][:geometry :"procedural generation"] +[2:34:06][:Run the game to see that all is okay][:geometry :"procedural generation"] +[2:34:34][Q&A][:speech] +[2:35:20][@LongBoolean][Q: I think one of your >= should be <=, also some < to >, around line 180, 190-ish, I think...] +[2:38:40][Fix PlaceRoom() to correctly clip our new room][:geometry :"procedural generation"] +[2:41:42][@bigmofo1][Q: Why you did not place important rooms randomly, then generate more rooms to join them? This seems more efficient than generating all the rooms upfront before placing them][:"procedural generation"] +[2:44:45][Wrap it up][:speech] [/video]