[video output=day444 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Stubbing Out the World Generator" vod_platform=youtube id=-TBSy54d3ZE annotator=Miblo]
[0:06][Recap and set the stage for the day][:speech]
[1:18][:Run the game with a few words on the :art, :camera and world construction][:"procedural generation" :"graph topology"]
[8:02][Explain the existing world struct][:research :"graph topology"]
[10:45][Introduce world_room stuct][:"graph topology"]
[14:31][:Camera Behavior per Room][:blackboard]
[17:16][:Run the game and consider co-op :camera behaviour]
[20:44][Introduce world_room_camera enum for world_room to contain, and add an array of world_room in world][:camera]
[23:33][:Run the game, noting that a :"debug visualisation" of all generated rooms could be helpful][:"procedural generation"]
[25:09][Setup AddStandardRoom() to initialise a WorldRoom][:"procedural generation"]
[31:50][Introduce AddWorldRoom(), with a few words on Asserting even on things that we expect to replace before shipping][:memory]
[34:22][:Run the game with the determination to draw :"debug visualisation" for every generated room][:"procedural generation"]
[35:57][Make UpdateAndRenderWorld() draw :"debug visualisation" lines around all our generated rooms][:"procedural generation"]
[42:13][:Run the game to see that we're nearly correct][:"debug visualisation" :"procedural generation"]
[42:33][Fix typo in the AddWorldRoom() call in AddStandardRoom()][:"procedural generation"]
[43:03][:Run the game to see all our room :"debug visualisation" lines, considering switching to infinite far clip-plane][:"procedural generation" :"graph topology"]
[45:02][Determine to make our current :camera code zoom to rooms better][:run]
[47:03][Create handmade_world_gen.h for all of our existing world generation code][:"procedural generation" :"graph topology"]
[50:48][:Run the game and crash immediately because there's no world][:"procedural generation"]
[51:37][Introduce CreateWorld() for PlayWorld() to call][:"procedural generation"]
[53:22][:Run the game to see our existing world][:"procedural generation"]
[53:35][Determine to build up our world generation code from the usage code backwards][:"procedural generation" :speech]
[55:58][Introduce CreateOrphanage()][:"procedural generation" :"graph topology"]
[58:12][Room][:blackboard :"procedural generation" :"graph topology"]
[1:01:03][Continue to implement CreateOrphanage() calling our fictitious GenRoom() function[ref
    site="Molly Rocket"
    page="Handmade Hero Orphan Concept Art"
    url=https://mollyrocket.com/news_0041]][:"procedural generation" :"graph topology"]
[1:05:03][Room Connectedness, and cycles][:blackboard :"graph topology"]
[1:08:17][Add BackDoorPath and SideAlley in CreateOrphanage(), and connect them up in such a way as to create a cycle][:"graph topology"]
[1:11:02][Introduce the notion of a gen_room_spec for CreateOrphanage() to use][:"entity system" :"procedural generation"]
[1:16:07][Introduce CreateWorld() to call CreateOrphanage() and the currently fictitious Layout(), GenerateWorld() and EndWorldgen(), and gen_orphanage that specifies room connections][:"procedural generation" :"graph topology"]
[1:19:58][Reflect on having constructed our API from the usage code backwards][:speech]
[1:22:31][Implement our world generation types and functions, with an eye on later differentiating between the world's specification and its generation from that spec][:"procedural generation" :"graph topology"]
[1:28:25][Check out our current :memory arena allocation code][:research]
[1:30:41][Consider the sheer amount of memory available these days][:memory :speech]
[1:33:00][Stub out GenSpec(), GenRoom(), Connect(), BeginWorldGen() and EndWorldgen() with :memory management and return values, fixing Clear() to correctly skip the last remaining block[ref
    site="HandmadeHero/cpp/Issues"
    page="Bug in Clear(memory_arena *)"
    url=https://github.com/HandmadeHero/cpp/issues/58]]
[1:39:08][Make CreateWorld() call our new CreateWorld() routine][:"procedural generation"]
[1:39:48][:Run the game and step through our new CreateWorld(), CreateOrphanage(), etc. routine][:memory :"procedural generation"]
[1:42:21][Close "Bug in Clear(memory_arena *)"[ref
    site="HandmadeHero/cpp/Issues"
    page="Bug in Clear(memory_arena *)"
    url=https://github.com/HandmadeHero/cpp/issues/58]][:admin :memory]
[1:42:57][Q&A][:speech]
[1:43:14][@sonoftheright][Q: Any thoughts on Mike Acton joining the Unity dev team?]
[1:46:15][@unknown_20][Q: Is the parenthesis around the returned value used for debugging or just a habit?]
[1:48:08][@kiitos420][Q: Is it a good idea to use events?]
[1:49:22][@frostyninja][Q: Are we going to see the new :art assets soon now? Today was exciting. I can’t wait for worldgen. Should be interesting][:"procedural generation"]
[1:49:33][@vtlmks][Q: Off-topic if you run out of other questions. In C, is there a way to make something similar to function overloading?][:language]
[1:50:15][@unknown_20][@handmade_hero I read somewhere you can #define return and log all your returns that happen]
[1:50:29][@suburbanfilth][Q: What do you think of Golang?][:language]
[1:50:46][@vaualbus][Q: Just as side note on that Nvidia fiasco you had. I found out that in my case I can get Nsight graphics to crash in the same way if I use raw input to get PS4 controller data. As soon as I remove the call that registers raw controllers, Nsight work. Any idea on why that could happen? Maybe Nsight is using something to intercept user input?]
[1:52:06][@x13pixels][Q: I know you did a video on interpolation. Do you know of any good resources for cubic B-splines?]
[1:56:00][Bezier curves, and B-spline orders][:blackboard :mathematics]
[2:00:41][Daisy-chaining Bezier curves to produce more complex curves][:blackboard :mathematics]
[2:04:03][Orders of discontinuity][:blackboard :mathematics]
[2:06:05][Cubic B-spline curves][:blackboard :mathematics]
[2:08:06][@krismeld][Q: I really like the look of the :lighting you have implemented. Will the system be working with many light points?][:rendering]
[2:08:41][@longboolean][Q: So if I am on the same page, if we wanted to make sure that two rooms never touch each other we would still use Connect() plus passing a flag of some kind. Or would you do something else?][:"procedural generation" :"graph topology"]
[2:09:36][@schoenhs][Q: Are there any plans to write tools to author rooms or will everything be done in code?]
[2:10:13][Wrap it up for today][:speech]
[/video]
