[video output=day645 member=cmuratori stream_platform=twitch stream_username=handmade_hero  project=code title="Switching to Voxel Centers for Collision" vod_platform=youtube id=UCdJhmFhwHc annotator=Miblo]
[0:00][Recap and set the stage for the day][:collision :speech]
[1:14][Consider: 1) Giving entities a "participates in :collision" bitfield][:speech]
[1:44][Consider: 2) Is the world generator erroneously creating entities without a :collision volume?][:speech]
[1:52][Consider: 3) Finishing the :collision system, with embedding recovery and spatial partitioning][:speech]
[5:24][Demo our unoptimised :collision :performance][:run]
[7:19][Step through the diagrams of a :collision embedding bug][:"debug visualisation" :run]
[9:20][Consider making the :collision checks symmetric][:run]
[14:03][Consider snapping the entity's position to the voxel center before testing for :collision][:run]
[14:50][Reproduce an embedding bug between the glove and familiar][:collision :run]
[16:32][Set up to perform :collision on discrete boundaries][:research]
[18:03][Consider switching to voxel centers for :collision][:research]
[20:50][Switch to voxel centers for :collision, modifying voxel_stack][:"data structure"]
[22:41][A few words on feeling stupider vs smarter than you are][:speech]
[23:43][Respecify voxel_corners as voxel_center][:collision :"data structure"]
[24:15][Consider our :collision testing to be faster and symmetric, once it's switched over][:research]
[25:06][Switch MoveEntity() to use voxel centers for :collision, changing AlignToMovementVoxel() to use Round()]
[33:31][Introduce GetMovementVoxelIndex() for MoveEntity() to use, and remove voxel_grid from voxel_stack][:collision :"data structure"]
[37:34][@tim7775][The problem with feeling stupid is that it can make you want to quit. While feeling smart makes you want to keep going]
[38:33][Continue switching MoveEntity() to use voxel centers, relieving it of checking corners][:collision]
[42:11][Make PushVoxelStack() call CollidesAtP()][:collision]
[50:23][Augment voxel_stack with a MinCenterP for MoveEntity() to set][:collision :"data structure"]
[51:42][Introduce GetVoxelCenterP() for MoveEntity() to call, removing the voxel iterator][:collision]
[54:08][Change PushVoxelStack() to call IsInArrayBounds() and use HaveTested][:collision]
[59:11][Remove CheckCorners() and change MoveEntity() to call GetVoxelCenterP()][:collision]
[1:00:02][Introduce GetVoxelBounds() for MoveEntity() to call][:collision]
[1:02:04][Consider cleaning up this code][:collision :research]
[1:02:55][Our voxel center-based :collision runs first time][:run]
[1:04:04][Let UpdateAndRenderEntities() call PushCube(), to draw the walls][:"entity system"]
[1:04:46][Try out our voxel center-based :collision][:run]
[1:05:19][Determine to clean up this code][:collision :research]
[1:07:15][Make MoveEntity() pass GetVoxelCenterP() as FromP to RefineVoxelPlacement()][:collision]
[1:08:39][Clean up the PushVoxelStack() branch in MoveEntity()][:collision]
[1:12:38][Enable PushVoxelStack() to handle embedding recovery][:collision]
[1:21:12][Replace the voxel_stack's b8 HaveTested with u8 OccupyCode, for MoveEntity() to pass to PushVoxelStack(), introducing GetOccupyCode()][:collision :"data structure"]
[1:24:02][Enable PushVoxelStack() to handle embedding recovery (cont.)][:collision]
[1:26:23][Remove embedding repulsion code from MoveEntity(), and search for the nearest unoccupied position around the initial embedded position, introducing occupy_code][:collision]
[1:31:01][Try out our :collision and embedding recovery][:run]
[1:32:40][Make CollidesAtP() call AlignToMovementVoxel() on each TestEntity][:collision]
[1:33:49][Try out our :collision detector][:run]
[1:35:27][Make CollisionEditor() create a "Disable Diagrams" button][:collision :"debug visualisation" :ui]
[1:37:22][Try out our "Disable Diagrams" button][:collision :"debug visualisation" :run :ui]
[1:37:41][Augment diagram_group with CaptureFrameCount and make CollisionEditor() create a "Capture Frames" slider to set this value][:collision :"data structure" :"debug visualisation" :ui]
[1:40:22][Try out our "Capture Frames" slider][:collision :"debug visualisation" :run :ui]
[1:41:17][Try out our :collision detector][:run]
[1:42:52][Q&A][:speech]
[1:43:18][@technicbeam][Chat was too quiet this stream]
[1:44:05][@mindmark42][Q: Can you explain the issue with two objects colliding again? Does using voxel centers fix it?][:collision]
[1:46:26][@sagian2005][Q: Do you have chat set to subscriber only again?]
[1:46:41][@wallfacer7][How much verticality is there going to be? Because gameplay-wise you may end up restricting :collision to a plane, and then maybe this would all be a lot simpler]
[1:47:08][@purpleeleven][Q: Won't that result in clipping?][:collision]
[1:48:00][@purpleeleven][If you check based on the center then adjust the position, then you can have sprites appearing inside walls][:collision]
[1:49:41][@sagian2005][Q: Did you know you can set enum types now. Just '\: type' after the name. It still has to be integral][:language]
[1:50:38][Try using \: u8 on occupy_code][:language]
[1:52:16][@headless_corpse][Q: Do you recommend this book "Tricks of the Windows Game Programming Gurus" by André Lamothe in 2021?[ref
    author="André LaMothe"
    title="Tricks of the Windows Game Programming Gurus, 2nd Edition"
    isbn="9780672323690"
    publisher="Sams Publishing"
    url=https://www.informit.com/store/tricks-of-the-windows-game-programming-gurus-9780672323690]]
[1:52:59][@sagian2005][Q: What is the reason that things like SimRegion get passed around instead of plucking it from a global variable? Is it just preference? Are there cache considerations?]
[1:55:14][Wrap it up with a plug of Meow the Infinite: Book Two[ref
    site=Kickstarter
    page="Meow the Infinite: Book Two"
    url=https://www.kickstarter.com/projects/annarettberg/meow-the-infinite-book-two] and further streams][:speech]
[1:58:46][@dj_turfie][Man, I've been loving these lightboard code talks. I would pay good money for more of these. I think you've got a good concept here!]
[2:00:08][@memfault][Q: Does [~hero Handmade Hero] work on Linux or do I need to follow on Windows?][:"operating system"]
[2:00:45][Plug Star Code Galaxy[ref
    site="Star Code Galaxy"
    url=https://starcodegalaxy.com/]][:speech]
[2:05:49][Wrap it up with a plug of an upcoming :cryptocurrency interview with Alex Gladstein][:speech]
[/video]
