[video output=day501 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Importing Orphans" vod_platform=youtube id=7MnGW4k0LLE annotator=Miblo]
[0:00][Welcome to the stream][:speech]
[0:19][Show our correct :camera interpolation, and plan to get our hero back in][:run]
[2:06][Showcase [@aerettberg Anna]'s new :art pack, with heads and bodies in different files][:admin :"asset system"]
[6:53][Tag [@aerettberg Anna]'s new body :art][:admin :"asset system"]
[19:38][Name [@aerettberg Anna]'s orphans][:admin :art :"asset system"]
[31:41][Add our new tags to the asset_tag_id enum and NameTags array][:"asset system"]
[37:49][Introduce ImportBody() and ImportHead() for ParsePieces() to call][:"asset system"]
[45:30][Try to import our new assets][:"asset system" :run]
[46:21][Make AddPlayer() use our newly imported hero assets][:"asset system"]
[53:01][See our hero art in-game, noting that our orientations are backwards][:"asset system" :run]
[54:05][Decrease the HeroSizeC in AddPlayer()][:"asset system"]
[54:48][Check out our smaller hero in-game][:"asset system" :run]
[55:09][Make PushLight() draw our light cube fully transparent][:lighting]
[55:52][See our hero more clearly and move towards fixing our facing direction and body picking][:"asset system" :run]
[57:49][Change AddPlayer() to add a cat][:"asset system"]
[58:44][Find that the cat hero is correctly oriented][:"asset system" :run]
[59:40][Investigate our facing direction issue][:"asset system" :research]
[1:02:37][Try marking AddPlayer() add Laird][:"asset system"]
[1:03:31][Find that Laird is totally correctly oriented][:"asset system" :run]
[1:04:01][Try marking AddPlayer() add the baby][:"asset system"]
[1:04:16][Find that the baby is also correctly oriented][:"asset system" :run]
[1:04:50][Turn off the fire particles in UpdateAndRenderEntities()][:"entity system"]
[1:05:17][Spot some garbage above the baby's head][:art :run]
[1:05:34][Check out the baby's source :art in GIMP, to determine that it must be an asset-import bug][:admin :"asset system"]
[1:07:16][Increase the HeroSizeC in AddPlayer()][:"asset system"]
[1:07:28][Check out our baby hero's appearance in-game, noting that the garbage is no longer above the head][:"asset system"]
[1:09:24][Make AddPlayer() connect the head to the body][:"asset system"]
[1:10:22][Align the baby hero's assets in all orientations][:"asset system" :run]
[1:14:17][Increase the head's Z offset in AddPlayer() to prevent Z-fighting][:"asset system"]
[1:14:58][Find that our baby hero's head and body no longer Z-fight][:"asset system" :run]
[1:16:25][Make AddPlayer() add Viva][:"asset system"]
[1:17:48][Align Viva's assets, but find that we've been given the baby's head again][:"asset system" :run]
[1:18:41][Make AddPlayer() tag the Body (even for the head)][:"asset system"]
[1:19:20][Align Viva's assets][:"asset system" :run]
[1:23:29][Take a walk as Viva][:"asset system" :run]
[1:24:57][Note the incongruous scaling of the orphans in comparison with the walls][:"asset system" :run]
[1:26:01][Decrease the HeroSizeC to 1.25f in AddPlayer()][:"asset system"]
[1:26:13][Consider this better because we're not taller than the wall][:"asset system" :run]
[1:27:26][Check out Viva's :art in GIMP to find that it is wrong][:admin]
[1:29:01][Introduce ReadAssetString() to display annotations in our in-game editor][:"asset system" :ui]
[1:34:04][Check out our new "Info" tab in the asset editor][:"asset system" :run :ui]
[1:34:27][Enable AssetEditor() to print asset annotations in the "Info" tab][:"asset system" :ui]
[1:38:35][See a blank Name in our annotation printout][:"asset system" :run :ui]
[1:39:00][Introduce AnnotationLabel() for AssetEditor() to call and print out various annotations that we expect to be populated][:"asset system" :ui]
[1:43:39][Switch to the "Info" tab and hit our assertion in GetBitmapInfo()][:"asset system" :run :ui]
[1:45:36][Fix GetBitmapInfo() and GetSoundInfo() to handle assets with ID 0][:"asset system"]
[1:46:05][Check out the annotated errors in our Info tab][:"asset system" :run :ui]
[1:47:07][Investigate our apparent texture transfer bug][:hardware :rendering :research]
[1:49:33][Try making BeginTextureOp() fill our required TransferMemory with all white][:hardware :rendering]
[1:52:27][Try in vain to trigger our bug][:hardware :rendering :run]
[1:54:02][Q&A][:speech]
[1:54:56][Introduce AddOrphan() and PlaceOrphan()][:"entity system" :"procedural generation"]
[2:00:38][Visit the orphans in the orphanage][:run]
[2:01:49][@keebrdb][Q: So are you going to create a Level Editor as well?]
[2:02:09][Temporarily expand the :lighting bounds in UpdateAndRenderWorld()]
[2:03:29][Find that the :lighting now covers the screen][:run]
[2:03:49][@amirrajan][Q: Any thoughts of using dlopen et al to do some :"hot reloading" shenanigans to help with the "feedback" loop?]
[2:04:50][@centhusiast][Q: How does the back buffer work when you resize the window? Do you create a new back buffer matching the window size when the window is resized?][:"platform layer"]
[2:05:57][Contract the :lighting bounds a little in UpdateAndRenderWorld()]
[2:06:53][@philliptrudeau][Q: Quick question, what exactly is the difference between a temp arena and a frame arena? Does the temp arena get collected at a sub-frame interval?][:memory]
[2:09:50][@erdomina][Q: Is each character going to have an :animation sequence as NPCs, or are they all playable?][:"entity system"]
[2:11:19][@graemephi][Q: Petition to rename the baby Judas][:"asset system"]
[2:12:03][Stream has ended][:speech]
[/video]
