[video output=day655 member=cmuratori stream_platform=twitch stream_username=handmade_hero  project=code title="Revisiting Entity Movement" vod_platform=youtube id=pITjYkjGha4 annotator=Miblo]
[0:01][Recap and set the stage for the day][:speech]
[0:44][Plug "Twenty Minutes of Reasons to Use the ~RemedyBG Debugger"[ref
    title="Twenty Minutes of Reasons to Use the RemedyBG Debugger"
    author="Molly Rocket"
    publisher=YouTube
    url=https://www.youtube.com/watch?v=r9eQth4Q5jg]][:research]
[1:38][Demo our future desire for a bloom filter and participating media (dust), with a few words on other film artifacts such as halation][:filtering :lighting :run]
[9:18][Determine to build some basic entity interactions][:movement :run]
[14:59][Consider fixing the glove's :movement to discrete patterns][:run]
[23:12][Determine to switch to an entirely transactional :collision system][:research]
[23:31][Thoughts on freedom, constraints and making problems tractable][:research]
[26:13][Real-time transactional :movement and :collision][:research]
[28:31][Demo our need for leading-edge, sustaining action and trailing-edge (attack, sustain and release) events][:movement :run]
[31:26][Remove the voxel-based :collision code, and the floating movement mode][:movement]
[32:36][Previously floating entities (glove and familiar) no longer move][:movement :run]
[33:18][Fully remove MovementMode_Floating][:movement]
[34:11][Consider removing entity_movement_mode entirely][:movement :research]
[35:04][Re-add MovementMode_Floating and remove MovementMode_AngleOffset and MovementMode_AngleAttackSwipe][:movement]
[35:30][Consider removing entity_movement_mode entirely (cont.)][:movement :research]
[38:10][Rename entity_movement_mode to entity_animation][:animation :"entity system"]
[40:58][Plan to separate out transactional :movement from :animation][:research]
[42:21][Introduce UpdateAnimation() to adopt code from UpdateAndRenderEntities()][:animation]
[44:18][@wassimulator][Could you, please, at some point explain what "internal", "external", "function" and "static" before functions do? I vaguely understand what they do but not concretely][:language]
[44:57][Understanding "static"][:language]
[45:25][Understanding "static" for function-local variable persistence][:language]
[47:31][Understanding "static" for global variables and functions][:language]
[50:41][@mmozeiko][In C++11 and up there is no problem with multiple thread and local static variable initialization][:language]
[51:01][@mmozeiko][It guarantees that initialization is thread-safe. Puts lock around it][:language]
[51:17][@mmozeiko][Sure. But it works][:language]
[52:29][@zufaelligertyp][I always imagined local static variables as being the same as global static lifetime-wise. Only difference that the variable is only available in this function / scope. Isn't this how it works in C?][:language]
[54:36][@mmozeiko][If you don't initialize variables with code (like result of function call) then pretty much all compilers will simply put constant value you initialized in global data segment, and there will be no code run on "first time"]
[55:03][Make UpdateAnimation() take a sim_region * and particle_cache *][:animation]
[58:26][Non-floating entities continue to move and animate][:animation :movement :run]
[59:37][@kwmar][Local static variables actually use a thread-local flag they examine if they've been already initialized. If not, then slow part comes. But in VS there is one such guard per local static variable, so if you have 10 of them in a function then you pay 10 times the guard check per function][:language]
[1:00:25][Add an Animation_Floating case to UpdateAnimation()][:animation]
[1:01:41][Floating entities don't move][:animation :movement :run]
[1:02:03][Consider working on Type_brain_familiar][:"entity system" :research]
[1:04:05][@mindmark42][You can still swap your head with ground tiles or at least the buttons, I think][:"entity system"]
[1:04:41][Possess a switch and various entities][:"entity system" :run]
[1:07:15][@philbohun][Does [@cmuratori Casey] have enough subs for a React stream? That would be the comedy of the century]
[1:07:43][Reacquaint ourselves with the entity possession code in ExecuteBrainHero()][:"entity system" :research]
[1:09:12][Toggle off the brained entity swapping code in ExecuteBrainHero()][:"entity system"]
[1:09:27][Entity possession no longer happens][:"entity system" :run]
[1:09:38][Plan pattern-based :movement and glove striking rules, with interruptibility][:research]
[1:15:59][@tinspin][Hi, does anyone in chat know if you can make a Win .exe that runs fine on both 7 & 10 without using compatibility mode?]
[1:16:55][Determine to introduce move queues][:"entity system" :movement :research]
[1:22:20][Introduce move_queue_entry for the entity struct to contain][:"data structure" :"entity system" :movement]
[1:26:17][Is [@j_blow Jon] still streaming Counter-Strike?][:speech]
[1:26:27][@wassimulator][No]
[1:26:30][@nextra24][It's over]
[1:27:18][@nextra24][Multiple days of playoffs, final best-of-three today]
[1:27:46][@nextra24][No, that best-of-three determined the overall winner]
[1:28:07][@wassimulator][Faze won or phase one?]
[1:28:14][Remove move_spec and DefaultMoveSpec()][:"data structure" :movement]
[1:29:19][Plan the glove's tile occupation][:movement :run]
[1:32:07][Remove ddP from entity][:"data structure" :"entity system" :movement]
[1:32:48][Start to make ExecuteBrainHero() move the glove towards its parent entity when at rest][:"entity system" :movement]
[1:35:38][The game runs][:run]
[1:35:40][Plan move queue execution, and glove positioning relative to the player][:movement :research]
[1:38:44][@internationalizationist][Q: Do we have sound effects at the moment?][:audio]
[1:39:31][Hear no sound][:audio :run]
[1:39:36][Reacquaint ourselves with PlaySound() and OutputPlayingSounds()][:audio :research]
[1:41:58][Step through PlaySound(), to find that our sound is not found][:"asset system" :audio :run]
[1:42:59][Investigate why our sounds are not found][:"asset system" :audio :research]
[1:44:24][Break on GetBestMatchSoundFrom()][:"asset system" :audio :run]
[1:46:09][Reacquaint ourselves with ProcessAudioImport() and UpdateAssetDataFromFile()][:"asset system" :audio :research]
[1:50:32][Reacquaint ourselves with AddAssetToHash()][:"asset system" :audio :research]
[1:51:38][@nomad_pixel][Is that a mechanical keyboard? What switches are those?]
[1:53:09][@klblaz][Have you tried keyboards with MX Brown? They are basically the same switch]
[1:53:55][@dandymcgee][What's the difference? They're meant to have the same actuation profile, no?]
[1:54:52][@mdciotti][Zealio Purple switches supposedly have a very similar force curve to the Razer Orange switches. You'd have to build the keyboard yourself, though]
[1:56:49][Reacquaint ourselves with AddAssetToHash() (cont.)][:"asset system" :audio :research]
[1:57:38][Add StopCodeHere lines in AddAssetToHash() if TypeID == Asset_Audio and if Tags\[0\] == Tag_Bloop][:"asset system" :audio]
[1:58:42][Break on StopCodeHere in AddAssetToHash() to find that Tags\[\0\] is Tag_ChannelIndex, not Tag_Bloop][:"asset system" :audio :run]
[1:59:54][Add a MatchElement_Channel to asset_match_vector_element for AddAssetToHash() to use][:"asset system" :audio]
[2:01:53][Hit a read access violation on Tag->ID in AddAssetToHash()][:"asset system" :audio :run]
[2:03:19][Remove MatchElement_Channel from asset_match_vector_element and make AddAssetToHash() store the Tag_ChannelIndex in MatchElement_FacingDirection][:"asset system" :audio]
[2:03:35][Hit a read access violation on Tag->ID in AddAssetToHash()][:"asset system" :audio :run]
[2:03:43][Remove Tag_ChannelIndex case from AddAssetToHash()][:"asset system" :audio]
[2:03:52][Hit a read access violation on Tag->ID in AddAssetToHash()][:"asset system" :audio :run]
[2:03:57][Undo our changes to AddAssetToHash() and asset_match_vector_element][:"asset system" :audio]
[2:04:31][Hit a read access violation on Tag->ID in AddAssetToHash()][:"asset system" :audio :run]
[2:05:07][Step through AddAssetToHash() inspecting the Asset->HHA][:"asset system" :audio :run]
[2:07:28][Check the chat][:speech]
[2:08:22][Thoughts on open-source software as worker exploitation][:speech]
[2:11:33][Investigate our Tag->ID read access violation][:"asset system" :audio :run]
[2:15:01][@nomad_pixel][Can you put a data breakpoint if it's always index 173 or whatever on when something writes to it?][:"asset system" :audio]
[2:15:19][Investigate our Tag->ID read access violation (cont.)][:"asset system" :audio :run]
[2:24:56][Delete base_game.hha and :run the game to rebuild it][:"asset system" :audio]
[2:26:26][:Run the game successfully with the new base_game.hha][:"asset system" :audio]
[2:26:47][Add a MatchElement_Channel to asset_match_vector_element for AddAssetToHash() to use][:"asset system" :audio]
[2:27:43][:Run successfully, with bloops][:"asset system" :audio]
[2:28:18][Toggle off the attack bloops in ExecuteBrainHero()][:"asset system" :audio]
[2:29:31][Toggle on the intro cutscene music in GameUpdateAndRender(), updating to the current :"asset system" code][:audio]
[2:32:58][Our music plays, but tears][:audio :run]
[2:33:36][Note the need to thread the :audio][:research :threading]
[2:36:05][Our music continues to tear][:audio :run]
[2:36:59][Call it there][:speech]
[2:37:26][@teamrandb][Q: If one wanted to spawn a second window, how would one go about tackling it? To give context, let's say one wanted to move most of [~hero Handmade Hero]'s debug menu to a separate window, where the main DebugUI would be on Window 2 while the game is on Window 1. (Like to show the graphs on a separate window.) I'm struggling to figure out how much of the message handling, and the game logic needs to be separated, or if it could "as simple as" two separate buffers, and a WindowID for when we push tasks]
[2:39:03][Call that a day][:speech]
[2:39:23][@bob_from_hearthstone][Is the problem with exploitation of the working class really an open source problem? You still can have a commercial licensing on an open source codebase, right? The problems seem to be more related to the free software where the work put on a software can be taken and monetized without proper rewarding of the workers. (Sorry for bringing the topic back)]
[2:48:17][@gregg_ink][Open source programmers made a choice to give the software for free. That's not exploiting people]
[2:50:00][@khbatus][But open source is good for regular people. Is there something like open source but not free for big corporations?]
[2:50:20][@distractedmosfet][Yeah AGPL, it's actually been around a while but the corps in the space, like Google, hate it and push against it]
[2:51:56][@gregg_ink][By that logic, did [@cmuratori Casey] choose to be exploited by creating [~hero Handmade Hero]?]
[2:54:21][@arkandos_][Q: If I learn something from reading the [~hero Handmade Hero] source, can I use those same techniques in other closed-source projects?]
[2:55:19][@gheoan][@handmade_hero Are you using any open source code in your proprietary code?]
[2:55:36][@kwmar][What about [@nothings Sean]'s toolbox?[ref
    site=GitHub
    page="nothings / stb"
    url=https://github.com/nothings/stb]][:library]
[2:55:52][@amirh12][Don't you use OpenGL?][:library]
[2:56:11][@gregg_ink][Were you not using stb[ref
    site=GitHub
    page="nothings / stb"
    url=https://github.com/nothings/stb] for fonts?][:library]
[2:56:32][@distractedmosfet][OpenGL is an open spec, not open software][:library]
[2:56:59][@slava_radko][@handmade_hero So basically it's fine if I learn from your stream, then close the stream and implement something like you, for example DLL loading and architecture, but implemented myself?]
[2:58:31][@wassimulator][Q: My renderer in AV-Racer uses OpenGL. Are there any practical drawbacks to it? Would you say I should switch to D3D on my next project or something else?][:library]
[2:59:06][@bewwyss][How to calculate how much should go to an open source project if I make profits, in percent, let's say?]
[3:00:05][That's that][:speech]
[/video]
