[video output=day535 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Minor Art Update, Reenabling Particles, Glove Fixes" vod_platform=youtube id=Ba8W1dpqaRU annotator=Miblo]
[0:02][Recap and set the stage for the day incorporating [@aerettberg Anna]'s :art updates[ref
    site=GitHub
    page="HandmadeHero / cpp"
    url=https://github.com/HandmadeHero/cpp/issues]][:speech]
[3:34][Start to merge in [@aerettberg Anna]'s :art updates using Meld][:admin]
[4:54][Plug Beyond Compare[ref
    site="Scooter Software: Home of Beyond Compare"
    url=http://www.scootersoftware.com/]][:speech]
[5:44][Use Meld to merge in [@aerettberg Anna]'s :art updates without diffing the .png files][:admin]
[7:31][A few words on permissive conformance][:speech]
[9:08][Continue to merge in [@aerettberg Anna]'s :art updates, using her filenames][:admin]
[10:47][Tag our updated :art files in base_game.hht][:admin :"asset system"]
[20:10][Add tags for Stars, Smoke, Cover, Particle and Fire][:"asset system" :parsing]
[22:07][Tag our updated scenery :art in base_game.hht][:admin :"asset system"]
[24:41][Add tags for Table, Rug and Sofa, and deprecate Evergreen][:"asset system" :parsing]
[26:33][Oh hello, @Molly!][:speech]
[30:02][Tag our updated tree :art in base_game.hht][:admin :"asset system"]
[32:31][Enable GenerateRoom() to plant more tree variants][:"asset system" :"procedural generation"]
[33:53][Import our new :art, close the "hero body has left/right directions reversed" issue[ref
    site="GitHub"
    page="HandmadeHero / cpp / hero body has left/right directions reversed"
    url=https://github.com/HandmadeHero/cpp/issues/95] and note that the tree variants are not being picked fairly][:"asset system" :run]
[35:55][Close fixed :art issues[ref
    site=GitHub
    page="HandmadeHero / cpp"
    url=https://github.com/HandmadeHero/cpp/issues]][:admin]
[36:37][Fair picking of asset variants][:"asset system" :speech]
[41:25][Close the "Re-enable sound data loading / caching" issue[ref
    site="GitHub"
    page="HandmadeHero / cpp / Re-enable sound data loading / caching"
    url=https://github.com/HandmadeHero/cpp/issues/80]][:admin]
[41:55][Auto-spreading of asset variants][:"asset system" :speech]
[42:53][Open "Need to automatically assign variant values" issue[ref
    site="GitHub"
    page="HandmadeHero / cpp / Need to automatically assign variant values"
    url=https://github.com/HandmadeHero/cpp/issues/100]][:admin :"asset system"]
[43:38][Set up to re-enable particles][:"particle system" :run]
[44:48][Get UpdateAndRenderFire() working again[ref
    site=Wikipedia
    page="Material point method"
    url=https://en.wikipedia.org/wiki/Material_point_method]][:"particle system"]
[49:25][Check out our particles in-game][:"particle system" :run]
[49:36][Make InitParticleCache() pick smoke particles][:"particle system"]
[50:33][See no smoke particles][:"particle system" :run]
[51:02][Make InitParticleCache() pick from particle assets][:"particle system"]
[51:12][Check out our smoke particles, noting their inconsistent displacement during :camera transitions][:"particle system" :run]
[52:27][Trim down particle_4x and add a Size for SpawnFire() to set()][:"particle system"]
[55:39][Try changing the M() macro to use the _mm_extract_ps() instruction, before reverting it because this instruction must take an immediate][:isa]
[57:57][Make SpawnFire() shrink our particles, and again note their inconsistent displacement][:"particle system" :programming :run]
[59:02][Set up to consistently displace particles as the :camera transitions][:camera :"particle system" :research]
[1:01:14][Prevent UpdateAndRenderWorld() from :lighting the hero]
[1:01:32][Check out our unlit hero][:lighting :run]
[1:01:45][Enable UpdateAndRenderWorld() to displace the particles more correctly during :camera transition][:"particle system"]
[1:05:33][See that the particles are almost correctly displaced, only wrong on the first frame of a :camera transition][:"particle system" :run]
[1:06:05][Fix UpdateAndRenderFire() to apply particle displacement after rendering it for this frame][:"particle system"]
[1:07:30][See that the particles are stably displaced][:"particle system" :run]
[1:07:52][Tweak SpawnFire() to fade the particles faster][:"particle system"]
[1:08:10][Check out our faster fading particles][:"particle system" :run]
[1:09:29][Try making UpdateAndRenderFire() square the alpha to try and make particles fade perceptually linearly][:rendering]
[1:10:12][Check out the squared alpha fading][:rendering :run]
[1:10:29][Try making UpdateAndRenderFire() square-root the alpha][:rendering]
[1:10:44][Check out the square-rooted fading][:rendering :run]
[1:10:55][Try making UpdateAndRenderFire() cube the alpha][:rendering]
[1:11:04][Check out the cubed fading][:rendering :run]
[1:11:11][Settle of making UpdateAndRenderFire() square the alpha]
[1:11:17][Admire our squared alpha fade][:rendering :run]
[1:11:28][Make SpawnFire() disperse the smoke a little wider][:"particle system"]
[1:12:02][Check out the weakly dispersed smoke][:"particle system" :run]
[1:12:14][Make SpawnFire() disperse the smoke wider still][:"particle system"]
[1:12:26][Check out the more dispersed smoke][:"particle system" :run]
[1:12:31][Change SpawnFire() to use the same XDir and YDir when both positioning and moving the particles][:"particle system"]
[1:13:39][Find that we're spawning four identical particles][:"particle system" :run]
[1:13:53][Fix SpawnFire() to produce four different particles per instruction][:"particle system"]
[1:15:42][Check out our dispersed particles][:"particle system" :run]
[1:16:05][Slow down the particles in SpawnFire()][:"particle system"]
[1:16:15][Admire our particles and :art and consider tackling the variant problem][:"asset system" :"particle system" :run]
[1:17:07][Prevent GenerateRoom() from sticking that errant chair in the doorway][:"procedural generation"]
[1:17:52][Successfully traverse the orphanage down to the dungeons][:"procedural generation" :run]
[1:19:06][Consider what small thing we could do next][:speech]
[1:21:05][Slow down the punch speed in UpdateAndRenderEntities()][:animation]
[1:22:29][Try punching, and note that the glove drops down to the floor][:animation :run]
[1:23:12][Make ExecuteBrainHero() elevate the glove to its regular Z position while punching][:animation :"entity system"]
[1:24:52][Check out the more correct punching height][:animation :"entity system" :run]
[1:25:19][Make ExecuteBrainHero() predicate the glove's hover position on the hero's facing direction][:animation :"entity system"]
[1:26:15][Find that the glove is directly in front of the hero][:animation :"entity system" :run]
[1:26:52][Make ExecuteBrainHero() position the glove beside the hero's head][:animation :"entity system"]
[1:27:11][Check out the glove's sideways position][:animation :"entity system" :run]
[1:27:30][Make ExecuteBrainHero() lower the glove's hover height][:animation :"entity system"]
[1:28:01][Check out the glove's lower position][:animation :"entity system" :run]
[1:28:36][Make ExecuteBrainHero() preserve the glove's position at the end of its swing][:animation :"entity system"]
[1:29:30][Check out the glove's preserved position][:animation :"entity system" :run]
[1:30:28][Try slowing down the punch speed in UpdateAndRenderEntities()][:animation :"entity system" :programming :run]
[1:30:56][Give the snake some hit points][:"entity system"]
[1:32:31][Hunt down the snake to see its three hit points][:"entity system" :run]
[1:33:17][Toggle on the :collision volume :"debug visualisation" in UpdateAndRenderEntities()]
[1:33:42][Check out the hero's :collision volume][:"debug visualisation" :run]
[1:34:28][Make AddPlayer() create a :collision volume for the glove][:"entity system"]
[1:35:42][Check out the glove's :collision volume][:"debug visualisation" :run]
[1:36:02][Make AddSnake() create a :collision volume][:"entity system"]
[1:36:51][Check out the snake's :collision volume, and try to herd him up the stairs][:"debug visualisation" :movement :run]
[1:38:31][Determine to make our punch damage the snake, preventing UpdateAndRenderEntities() from calling MoveEntity()][:"entity system"]
[1:42:42][Find that everything remains fine][:"entity system" :run]
[1:42:58][Set up UpdateAndRenderEntities() to perform overlap testing of entities][:"entity system"]
[1:44:50][Q&A][:speech]
[1:45:16][@vtlmks][Q: The AmigaOS used vblank interrupt (irq 3) for the scheduler, and the DEFAULT_QUANTUM was 4][:hardware :timing]
[1:48:02][@vtlmks][Q: 4 frames then changed to next task using prioritized round-robin][:hardware :timing]
[1:49:13][@ormone88][Q: Will collisions be solved in a physically-based way, or in a "hacky" way?][:collision :physics]
[1:51:34][@philpowers][NTSC is \~30FPS, not 60, no?[ref
    site=Wikipedia
    page=PAL
    url=https://en.wikipedia.org/wiki/PAL]][:hardware]
[1:54:40][Close the "Hat 3 (flower) seems to be out-of-order" issue[ref
    site="GitHub"
    page="HandmadeHero / cpp / Hat 3 (flower) seems to be out-of-order"
    url=https://github.com/HandmadeHero/cpp/issues/97]][:admin :art]
[1:55:22][Wrap it up][:speech]
[/video]
