[video output=day461 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Checking for File Date Changes" vod_platform=youtube id=k6K7smNtM8A annotator=Miblo]
[0:00][Recap and set the stage for the day integrating our PNG reader into the game][:"asset loading" :speech]
[2:53][Consult our current :"asset loading" code with a view to storing assets more smartly][:"asset loading" :research]
[8:04][Walk through our asset struct, and consider removing asset_memory_header][:"asset loading" :research]
[10:11][Walk through our hha_asset and game_assets structs, with a few words on tagging and tag array expandability][:"asset loading" :research]
[16:39][Dive into watching files for changes, introducing watched_file][:"asset loading"]
[19:05][Consider the structure of character_template.png and take a look at character_mummy.png in Paint 3D][:art :drawing]
[22:05][Add AssetIndices structural information to watched_file][:"asset loading"]
[27:38][Set up watched_file for hashing into a list, consider moving to fixed sized blocks for performant texture :memory use, and store the source location in assets][:"asset loading" :"data structure"]
[33:13][Determine to reload assets on a key-press, with a few words on dedicating a core of a developer's machine to reloading][:speech]
[35:40][Introduce CheckForArtChanges(), renaming watched_file to asset_source_file][:"asset loading"]
[39:06][Open character_skeleton.png in Paint 3D, and try and paint in 3D][:drawing]
[42:46][Check out character_orphan_09.png in GIMP and consider annotating it with additional information][:"asset loading" :drawing]
[45:08][Set up to store our additional information in the hha file][:"asset loading"]
[47:59][Enable CheckForArtChanges() to hash file names using a newly introduced UpdateStringHash()][:"data structure"]
[54:44][Null-termination vs Length + Pointer][:blackboard :"string manipulation"]
[58:33][:Parsing regions of strings][:blackboard :"string manipulation"]
[1:04:18][Introduce buffer struct and Advance()][:"string manipulation"]
[1:09:16][Ask after @Mr4thDimention, noting that ~4coder sometimes jumps to the second error in the stream][:speech]
[1:10:06][Continue to propagate our buffer struct to all interested parties][:"string manipulation"]
[1:12:11][:Run the PNG reader to make sure nothing broke]
[1:12:51][Fix WriteImageTopDownRGBA() to output the alpha layer the right way up][:parsing]
[1:14:11][:Run it to see that the alpha is the right way up][:parsing]
[1:14:56][Enable CheckForArtChanges() to parse out pieces of our file names][:"asset loading" :parsing :"string manipulation"]
[1:20:18][Set up CheckForArtChanges() to match loaded files against known files, making the :"platform layer" lowercase file names using a newly introduced ToLowercase()][:"string manipulation"]
[1:29:48][Enable CheckForArtChanges() to initialise unknown files][:"asset loading"]
[1:33:19][Set up CheckForArtChanges() to process individual assets, calling a stubbed out UpdateAssetPackageFromPNG()][:"asset loading"]
[1:42:03][Enable CheckForArtChanges() to (de)allocate :memory for each block][:"asset loading"]
[1:44:12][Change CheckForArtChanges() to use a temporary :memory arena with a view to implementing UpdateAssetPackageFromPNG() tomorrow][:"asset loading"]
[1:46:33][Q&A][:speech]
[1:47:19][@dustygazongas][Q: Thoughts on the use of persistent :memory, e.g. Intel Optane, in game programming?]
[1:48:52][@mmozeiko][Q: Are you sure always lowering filename to lowercase is a good solution? Because case-sensitivity is a feature of filesystem, not whole OS. On NTFS you can enable case-sensitivity individually per folder. You can mount NTFS disk on Linux / Mac. And on Apple HFS+ or APFS can be both - case sensitive or case insensitive, depends on how you format it]
[1:49:59][@longboolean][Q: I can't remember, are the bitmap assets stored next to the audio and font glyph assets in memory? May be relevant if those are not the same size as the bitmaps?][:"asset loading"]
[1:51:24][@puremouron][Q: What's the mnemonic device used in "umm"? I get that it's a size_t, but what does umm stand for? Quite a few people on the stream ask]
[1:52:53][@bkboggy][Q: Thoughts on use of Vulkan for a 2.5D game like this? Is it an overkill or is there a benefit?]
[1:57:02][@somebody_took_my_name][Q: I think you meant to add to String->Count when Scan\[0\] != '_', just below the code on screen (CheckForArtChanges)][:"string manipulation"]
[1:57:37][Fix typo in CheckForArtChanges()][:"string manipulation"]
[1:58:27][@sopvop][Q: I've been listening to early episodes of Jeff and Casey podcast and want to ask if you feel guilty for giving EA all the advice which they definitely follow?]
[1:59:10][@centhusiast][Q: Thanks a lot for all these great educational materials. They are very inspiring! Could you explain why OpenGL is a state machine?]
[1:59:43][@Brian][Q: Why Scan\[1\] == 0 and not Scan\[0\] == 0?][:"string manipulation"]
[2:03:02][@tavqua][Q: Is the answer still no to doing my Comp Sci homework for me?]
[2:03:11][@Brian][Q: Ah, okay. Sorry, I missed the *Scan check first, which of course would mean that Scan\[0\] == 0 would never happen]
[2:03:17][@vtlmks][Q: A bit off-topic, but are there any intrinsics for bit-interleaving? I can't find on the Intel intrinsics webpage, but was thinking that they might not have named it "interleave" or some such]
[2:03:53][@bkboggy][Q: Once the game is completed (and I know it may take a long while to get there) are there any plans to do similar educational series? If so, what would it be?]
[2:04:01][@kelimion][Q: Should those pieces also be passed to UpdateAssetPackagrFromPNG()? As far as I can tell you're :parsing them out but not using them]
[2:04:53][@vtlmks][Q: Yes, every other bit[ref
    site=Intel
    page="Intrinsics Guide"
    url=https://software.intel.com/sites/landingpage/IntrinsicsGuide/]]
[2:12:25][@Brian][Q: I seemed to have missed a lot of the :memory arena work, but when you create a temp memory arena, where do you pass in the original memory that you've allocated? Normally I would think global variable, but if in the game layer, that would get reset when you reloaded, correct?]
[2:12:53][@jeffpheonix][Q: I don't know if this has been asked before, but would you consider having your VODs do reruns on days you aren't going to stream?]
[2:13:20][@strihex][Q: On my day to day I find myself using std\:\:string very often. Should I write my own string library or what other options would you recommend? If so how do I handle allocations (a single huge allocation doesn't seem to be the right choice since I'm not writing a game)][:memory :"string manipulation"]
[2:15:11][@gg_nate][Q: On the topic of VODs, i was curious why you don't have your past broadcasts saved on twitch. Say someone misses something you said / wrote and wants to go back and listen / watch quickly there's no way to do that until the VOD is uploaded on YouTube]
[2:15:29][@zakedodead][Q: In a semi-related thought to GG_Nate , have you ever considered using a program that overlays the twitch chat into OBS? I see entertainment focused streamers using them and it's really nice for when they reference something from chat and you're watching the YouTube upload of the stream]
[2:15:49][@gg_nate][Q: Months ago when you were implementing intrinsics, you added one that uses an SSE4.2 instruction. This isn't supported by most older AMD chips (like mine). Will you consider a work-around for this?]
[2:16:24][Wind it down with a plug of the new Watch page[ref
    site="Handmade Hero"
    page="Watch"
    url=https://handmadehero.org/watch] and its integrated Annotated Guide and hotlinks][:speech]
[/video]
