[video output=day487 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Hit-Testing Boxes in 3D" vod_platform=youtube id=g6lM0xhcTX0 annotator=Miblo]
[0:01][Recap and set the stage for the day][:speech]
[0:30][:Run the game and point out the discombobulation of the cat artwork][:"asset system"]
[1:33][View the intro_art_v2.hha file in TabView][:admin :"asset system"]
[2:34][The three things to do: 1. Use the alignment points; 2a. Get alignment data into our metadata file; 2b. Edit results in real time][:"asset system" :speech]
[5:42][Set up to provide a way to edit placement points][:"asset system" :run]
[7:27][Consider reconceptualising the :"debug system" as an integral part of the shipped game][:run]
[9:19][Set up to integrate the entity picking code into the game][:"entity system" :ui]
[12:47][Begin to enable UpdateAndRenderEntities() to handle picking of all sprites][:"debug visualisation" :"entity system"]
[14:19][:Run the game to see our sprite :"debug visualisation"][:"entity system"]
[14:48][Change UpdateAndRenderEntities() to use PushRectOutline() for the sprite :"debug visualisation"][:"entity system"]
[16:27][:Run the game to see the more sensible, if incorrectly scaled sprite :"debug visualisation"][:"entity system"]
[17:00][Remove the EntityTransform.OffsetP addition from the WorldP computation in UpdateAndRenderEntities()][:"debug visualisation" :"entity system"]
[18:26][:Run the game to see the better positioned sprite :"debug visualisation"][:"entity system"]
[18:49][Adjust the dimensions of the sprite :"debug visualisation"][:"entity system"]
[20:12][:Run the game to see the cat's sprites correctly visualised][:"debug visualisation" :"entity system"]
[20:47][Create a sprite-picking mouse cursor in UpdateAndRenderEntities()][:"entity system" :"input handling" :ui]
[32:30][:Run the game to find that the sprite-picking mouse cursor sort of works][:"entity system" :"input handling" :ui]
[33:05][Decouple the use of WorldP and Piece->Offset in UpdateAndRenderEntities() to correctly locate entities and render their :"debug visualisation"][:"entity system" :"input handling" :ui]
[35:22][:Run the game to find that the sprite-picking is pretty close, but that the Y is wrong][:"entity system" :"input handling" :ui]
[36:42][Enable UpdateAndRenderEntities() to draw a line connecting the cursor and the picked entity][:"entity system" :"input handling" :ui]
[40:10][:Run the game to see our cursor–entity connection, but with incorrect projection to the entity][:"entity system" :"input handling" :ui]
[42:03][Create a picking ray in UpdateAndRenderEntities()][:"debug visualisation" :"entity system" :"input handling" :ui]
[49:59][:Run the game to find that the picking ray is pegged to the correct location][:"debug visualisation" :"entity system" :"input handling" :ui]
[50:22][Enable UpdateAndRenderEntities() to draw and highlight the outline of picking boxes using PushVolumeOutline()][:"debug visualisation" :"entity system" :"input handling" :ui]
[54:34][:Run the game to see outlines around all volumes][:"debug visualisation" :"entity system" :"input handling" :ui]
[54:48][Introduce RayIntersectsBox() based on RayCast()][:geometry]
[1:02:57][:Run the game to find that the picking is working][:"debug visualisation" :"entity system" :geometry :"input handling" :ui]
[1:03:20][Enable RayIntersectsBox() and UpdateAndRenderEntities() to highlight only the nearest intersection][:"debug visualisation" :"entity system" :geometry :"input handling" :ui]
[1:07:33][:Run the game to find that it only picks the closest hit][:"debug visualisation" :"entity system" :geometry :"input handling" :ui]
[1:07:54][Enable UpdateAndRenderEntities() to support sprite picking][:"debug visualisation" :"entity system" :"input handling" :ui]
[1:09:38][:Run the game to find that sprites may be picked, and consider how to proceed, including the problem of disambiguating layered (transparent) sprites][:"debug visualisation" :"entity system" :"input handling" :ui]
[1:14:43][@insobot][16 minutes into the Q&A, -1 until end. (based on NOTE)]
[1:15:57][Look forward to further improving the :lighting][:run]
[1:17:09][Consider displaying errors recorded for a picked bitmap][:"asset system" :"entity system" :speech :ui]
[1:22:22][Augment hha_annotation with an error stream and propagate this addition to WriteHHA_V2() and PrintContents()][:"asset system" :"error handling" :parsing]
[1:32:12][Check out local.hha in TabView to see no mention of error streams][:admin :"asset system" :"error handling" :parsing]
[1:33:04][Consider where to write asset import error messages][:"asset system" :"error handling" :speech]
[1:36:51][Enable WriteImageToHHA() to write out asset and file errors, introducing WriteAssetStream()][:"asset system" :"error handling" :"file io"]
[1:46:00][Trigger an asset reimport and check out local.hha in TabView to see the Errors field, but with no content][:admin :"asset system" :"error handling"]
[1:47:21][Fix typo in PrintContents()][:"asset system" :"error handling" :parsing]
[1:47:33][Trigger another asset import and see errors, with slightly incorrect printout][:admin :"asset system" :"error handling" :parsing]
[1:48:17][Fix PrintContents() to correctly parse out the errors][:"asset system" :"error handling" :parsing]
[1:50:02][Reimport and check out local.hha in TabView to see that all is correct][:admin :"asset system" :"error handling" :parsing]
[1:50:23][Add newlines to the asset and file error messages][:"asset system" :"error handling"]
[1:51:19][Reimport and check out local.hha in TabView to cleanly see our errors][:admin :"asset system" :"error handling"]
[1:52:25][Q&A][:speech]
[1:53:12][@desuused][Q: Is it possible to account for sprite opacity when selecting items, for the selection to be more intuitive? Is it useful to generate a more slim triangulation for sprites?][:"debug visualisation" :"entity system" :"input handling" :ui]
[1:55:36][@frostyninja][Q: Instead of fussing with selecting the individual sprite parts, wouldn't it be handier to list them in a picked entity HUD][:"debug visualisation" :"entity system" :"input handling" :ui]
[1:55:50][@somebody_took_my_name][Q: Is the .Count inclusive with strings? In other words, do you really need the nested ifs in the line printer?][:parsing]
[1:56:08][@desuused][Q: You spent a lot of time optimizing the hash function, but is it worth it? Most of the time you calculate hashes when doing I/O, which will always be significantly slower, so you'll save more time if you calculate the hash in parallel with I/O. This way MeowHash and SHA512 would have the same impact on runtime, despite MeowHash being 80 times faster][:"file io" :hashing :performance]
[2:00:26][@somebody_took_my_name][Q: You check for At == Count, but I should think that by then you would already be past the last character in the stream][:parsing]
[2:01:20][Simplify the error printing in PrintContents()][:parsing]
[2:01:52][Check out local.hha in TabView to find that the error printing remains correct][:admin :parsing]
[2:02:57][:Hashing :performance, in terms of (not) being :memory or I/O bound][:"file io" :speech]
[2:09:14][Wrap it up][:speech]
[/video]
