[video output=day533 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Importing Particles, Scenery, and Items" vod_platform=youtube id=fxSCbuBRxuc annotator=Miblo]
[0:01][Recap and set the stage for the day sprucing up the :"asset system"][:speech]
[6:38][Crash on the GetFontInfo() call in InitializeUI()][:"asset system" :font :run]
[7:12][Determine to investigate the problem with segoeui.hht][:font :speech]
[9:19][Step in to GetFontInfo() to see that it could not find our :font][:run]
[10:40][Reacquaint ourselves with the tagging of :font assets from ParseFontBlock()][:research]
[14:18][Check out the base_game.hha dump in TabView, to find no :font][:admin]
[17:22][Step in to ParseFontBlock() to find that :parsing fails on encountering a negative floating point kerning value][:font :run]
[19:56][Investigate why we are putting negative values into the HorizontalAdvance table[ref
    site="Windows Dev Center"
    page="GetKerningPairsW function"
    url=https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-getkerningpairsw][ref
    site="Windows Dev Center"
    page="KERNINGPAIR structure"
    url=https://docs.microsoft.com/en-gb/windows/desktop/api/wingdi/ns-wingdi-tagkerningpair]][:font :research]
[25:57][Fix LoadGlyphBitmap() to compute the AlignPercentage and KerningChange in (signed) 32-bit floating point space][:language]
[27:23][Regenerate our Segoe UI assets, to find that SegoeUI.hht contains purely positive Kerning values][:admin :font]
[29:54][Successfully find the :font, and take a close look at its alpha blending and tight kerning][:run]
[34:04][Swap our :font back to Liberation Mono][:admin]
[34:28][Find that Liberation Mono is loaded okay][:font :run]
[34:54][Prevent GAME_UPDATE_AND_RENDER() from playing the music]
[35:27][Determine to address asset tagging, noting that our floors are erroneously stone][:"asset system" :run]
[36:50][Investigate why our stone texture is never getting selected][:"asset system" :research]
[40:38][Add a breakable place in UpdateAndRenderEntities() when matching Tag_Grass][:"asset system"]
[41:34][Break in to UpdateAndRenderEntities() to see how the Grass tag gets matched][:"asset system" :run]
[44:16][Fix GenerateRoom() to only apply the Manmade tag if the room is not outdoors][:"procedural generation"]
[45:23][Find that our grass texture is correctly applied, and determine to furnish the world][:"procedural generation" :run]
[47:11][Peruse our :art and consider respecifying obstacles, splitting them into their own files][:admin]
[51:52][Start to add our obstacles to base_game.hht][:admin :"asset system"]
[53:01][Split out the red armchair into its own file, including a new green variant][:art :drawing]
[1:02:30][Split out the table lamp into its own file][:art :drawing]
[1:04:03][Consider how to categorise the forestry][:art :drawing]
[1:07:12][Split out and arrange the ground cover foliage into separate files][:art :drawing]
[1:15:32][Delete our obsolete :art files, and add our new packs to base_game.hht][:admin :"asset system"]
[1:23:34][Enable ParseTopLevelBlock() to handle "particle" and "scenery" blocks, introducing CreateArtParticleTagGrid(), CreateArtItemTagGrid() and CreateArtSceneryTagGrid()][:"asset system" :parsing]
[1:37:15][Encounter an "unrecognised tag name" :parsing error][:"asset system" :run]
[1:37:46][Add a Hat tag][:"asset system" :parsing]
[1:38:09][Successfully import our assets][:"asset system" :parsing :run]
[1:38:23][Check out the base_game.hha dump in TabView][:admin :"asset system"]
[1:40:11][Make AddPlayer() add a hat][:"asset system"]
[1:41:48][Find that our hero's head sadly lacks a hat][:"asset system" :run]
[1:42:03][Make AddPlayer() connect the hat to the head]
[1:43:21][Find that our hero's head still sadly lacks a hat][:"asset system" :run]
[1:43:35][Add an alignment point for TopOfHead and see the hat appear][:"asset system" :run]
[1:45:58][View the hats to see that their orientations do not match the template][:admin :"asset system"]
[1:46:39][Investigate why the hat is absent when we are facing downwards][:"asset system" :run]
[1:48:11][Note that the FacingDirection is being set the same and that we imported too many assets from item_hat_03.png][:admin :"asset system"]
[1:49:49][Take a close look at item_hat_03.png][:art :drawing]
[1:53:29][Make AddPlayer() add the Cook tag][:"asset system"]
[1:53:54][Check out our cook's appearance and set the alignment points][:"asset system" :run]
[1:57:52][Q&A][:speech]
[1:58:23][@victorn][Q: Was Michael Abrash around during your time at RAD?]
[1:58:41][@frostyninja][Q: Copy pasta snafu with the variant using YIndex instead of XIndex in the scenery tag grid][:"asset system" :parsing]
[1:58:57][Fix typo in CreateArtSceneryTagGrid()][:"asset system" :parsing]
[1:59:05][@thepr1ms][Q: How about "ornaments" for the oriented furniture instead of "scenery"?][:"asset system"]
[1:59:18][@nordicplayer][Q: I'm creating an OpenGL engine in C#. I really enjoy the language and I'm enjoying the process, but should I just go move to C++?][:language]
[2:01:00][@guybru5h_vi][Q: What's your learning method when faced with a new topic? How do you juggle figuring things out yourself vs reading a textbook. My problem is wanting to move quickly but also wanting to learn deeply]
[2:03:40][@theomarest][Q: Do you have an official code style guide anywhere?][:language]
[2:03:56][@alex_deak][Q: Hi from Hungary! I took your advice you gave me last week and started a blog[ref
    site=Variables
    url=https://sandordeak.home.blog/] to get involved in the game industry. It contains a few posts already, and some description of my earlier projects. Maybe worth reading sometime]
[2:08:30][@frostyninja][Q: Hi from Bulgaria (er UK now)! I’m starting an internship in July at a game studio and I’m super excited and I feel I owe you a lot of gratitude for keeping me excited about game dev!]
[2:09:27][@Brian][Q: Greetings [@cmuratori Casey]! You have a distinct coding style and though I realize you may have evolved into it over the years, I was wondering if there was there something specific that directed you? It could even have been you did not like other styles. I know you appreciate good typography too so I wonder if some of your decisions were based on what you like][:language]
[2:12:20][@xxthebigfoxx][Q: You deleted an X]
[2:12:22][Re-fix typo in CreateArtSceneryTagGrid()][:"asset system" :parsing]
[2:12:28][@theomarest][Q: Are u32, f32, etc. aliases or supported by the :language?]
[2:12:59][Thank [@x13pixels George] for fixing our reported ~remedybg bugs][:speech]
[2:15:17][@alexkelbo][Q: When porting to other platforms, do you have to rewrite all your shaders in HLSL and Metal SL? Is there a way to transpile GLSL?][:language]
[2:17:15][Plug [@naysayer88 Jon]'s talk 'Preventing the Collapse of Civilization' from DevGAMM Moscow 2019[ref
    site=YouTube
    page="Jonathan Blow - Preventing the Collapse of Civilization (English only)"
    url=https://www.youtube.com/watch?v=pW-SOdj4Kkk]][:speech]
[2:22:47][Wrap it up][:speech]
[/video]
