diff --git a/cmuratori/hero/code/code487.hmml b/cmuratori/hero/code/code487.hmml index ff302fa..87a088b 100644 --- a/cmuratori/hero/code/code487.hmml +++ b/cmuratori/hero/code/code487.hmml @@ -1,2 +1,57 @@ -[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Hit-Testing Boxes in 3D" vod_platform=youtube id=g6lM0xhcTX0 annotator=] -[/video] \ No newline at end of file +[video 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]