[video output=day338 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Simulation-space Particles" vod_platform=youtube id=lG3j32DTo1E annotator=Miblo]
[0:08][Recap and set the stage for the day]
[1:22][Blackboard: Particle Cache]
[6:07][handmade_particles.h: Remove the notion of a particle system cache]
[7:37][handmade_particles.cpp: Remove GetOrCreateParticleSystem(), TouchParticleSystem() and InitParticleSystem(), rename PlayAround() to UpdateAndRenderFire() and rework InitParticleCache()]
[11:49][Run the game and see that this is all fine, although slower than it should be]
[13:52][handmade_particles.cpp: Consider why UpdateAndRenderFire() is so slow]
[16:31][handmade_particles.h: Introduce particle_4x, simplify particle_system and remove particle_v3, particle_v4 and the operator*()]
[17:55][handmade_particles.cpp: Remove GetParticle() and make UpdateAndRenderFire() work on particle_4x]
[20:23][handmade_particles.h: Introduce operator+=() for v3_4x]
[21:22][Run the game and see that we are now running as fast as expected]
[22:43][handmade_particles.h: Introduce operator*(), operator+() and operator+=() for v4_4x]
[24:48][Run the game and see that we're still good]
[26:05][Reflect on the importance of the profiler]
[28:49][handmade_particles.cpp: Make UpdateAndRenderFire() take a dt and FrameDisplacementInit]
[31:03][handmade_particles.h: Introduce ToV34x()]
[31:57][handmade_particles.cpp: Enable UpdateAndRenderFire() to render particles through the standard path]
[44:04][Run the game, note that we are theortically generating particles and investigate why we aren't seeing them]
[47:09][handmade_world_mode.cpp: Prevent everything but the particles from being rendered, run the game and see them]
[47:42][handmade_particles.cpp: Introduce SpawnFire()]
[49:54][handmade_entity.cpp: Make entities call SpawnFire() when they land]
[50:43][Run the game and see no spawning occurring]
[51:40][handmade_world_mode.cpp: Reduce ScreenIndex to 1, run the game and see that the particle spawning is working just fine]
[52:15][handmade_world_mode.cpp: Generate two horizontally aligned screens, run the game and see what happens to the particles upon leaving a room]
[55:15][handmade_particles.cpp: Make UpdateAndRenderParticleSystems() take the FrameDisplacement]
[56:28][handmade_world_mode.h: Add LastCameraP to the game_mode_world struct and make UpdateAndRenderWorld() compute that LastCameraP]
[58:06][Run the game, see that the particles are not being displaced correctly and investigate why]
[1:01:51][Blackboard: Calculating that displacement]
[1:02:33][handmade_world_mode.cpp: Correctly compute the FrameToFrameCameraDeltaP and LastCameraOffset]
[1:04:34][Run the game and see that our particles may now be correctly displaced]
[1:04:58][handmade_particles.cpp: Tweak SpawnFire() to shorten the lifetime of the particles, run the game and check them out]
[1:06:37][handmade_world_mode.cpp: Remove LastCameraOffset and displace the particles with the WorldTransform]
[1:09:51][Run the game and admire the particles]
[1:10:33][Q&A][:speech]
[1:11:20][@mmozeiko][gcc & clang don't have m128_f32 member for __m128. They need _mm_store_ps or something like ((float*)&A->P.x)\[index\] (or union with float array)]
[1:12:05][handmade_particles.cpp: Use the M macro for rendering the particles and introduce handmade_simd.h]
[1:16:04][@nxsy][soysaucethekid was suggesting to slow down the time to make sure it is now right]
[1:19:52][@thesizik][Not too long ago, you changed world coordinates to be s32 instead of u32. I think they were unsigned originally so that overflow would work correctly to have the world wrap around]
[1:20:27][@cyberpunkhobo][Does the Z position of the particles not get affected by the perspective transform?]
[1:22:58][@thesizik][But when your position goes from INT_MIN to INT_MAX, won't it cause undefined behavior?]
[1:23:49][todo.txt: Update the TODO list]
[1:24:16][@thesizik][Signed integer overflow?]
[1:25:45][Lament the absence of real 3D and close things down][:speech]
[/video]
