From 3f7474aa26510495937d3d4f694e0085587e8152 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Thu, 6 May 2021 21:53:53 +0100 Subject: [PATCH] Index hero/code633 --- cmuratori/hero/code/code633.hmml | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 cmuratori/hero/code/code633.hmml diff --git a/cmuratori/hero/code/code633.hmml b/cmuratori/hero/code/code633.hmml new file mode 100644 index 0000000..8f4c3ae --- /dev/null +++ b/cmuratori/hero/code/code633.hmml @@ -0,0 +1,104 @@ +[video output=day633 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Narrowing in on a Collision Scheme" vod_platform=youtube id=8-qq8FANzhs annotator=Miblo] +[0:00][Recap and set the stage for the day][:speech] +[0:25][Demo the current state of :movement][:run] +[1:00][Simple and stable :collision detection and resolution][:speech] +[2:14][Re-enable the MoveEntityLocally() loop in MoveEntity()][:collision] +[2:23][We lack :collision][:run] +[2:37][Double-check MoveEntity()][:collision :research] +[3:07][Our glove penetrates the wall][:collision :run] +[3:17][Make MoveEntityLocally() draw occupation state][:collision :"debug visualisation"] +[3:29][We detect :collision but then tunnel through the familiar][:run] +[3:41][Double-check MoveEntityLocally()][:collision :research] +[4:55][Increase the StepCount from 5 to 10 in MoveEntity()][:collision] +[5:03][We clearly see :collision detection in red][:run] +[5:21][Reacquaint ourselves with MoveEntityLocally() and MoveEntity()][:collision :research] +[8:29][The utility of stating a universally minimum thickness, as MOTION_DISPLACEMENT_SIZE][:collision :geometry :speech] +[10:39][Reacquaint ourselves with MoveEntityLocally() and MoveEntity() (cont.)][:collision :research] +[11:52][Prevent MoveEntity() from capping the StepCount][:collision] +[12:02][We still detect collisions, but tunnel][:collision :run] +[12:14][Scour MoveEntityLocally() for bugs][:collision :research] +[16:19][Delete VoxelI from MoveEntityLocally()][:collision] +[16:34][Scour MoveEntityLocally() for bugs (cont.)][:collision :research] +[16:43][Disable the BestP computation loop in MoveEntityLocally()][:collision] +[16:58][Entities can erroneously move][:collision :run] +[17:26][Scour MoveEntity() for bugs][:collision :research] +[18:08][Prevent MoveEntity() from modifying Entity->P][:collision] +[18:28][Entities can no longer move, as desired][:collision :run] +[18:34][Re-enable the BestP computation loop in MoveEntityLocally()][:collision] +[18:45][Entities now collide, but can get embedded][:collision :run] +[20:16][Conceptualising the voxelised :collision search, to prevent / recover from embedding][:research] +[28:06][Make MoveEntityLocally() test the occupation state of only the one voxel en route to the target][:collision] +[31:15][Non-embedded entities collide nicely][:collision :run] +[33:32][A familiar has got stuck underground][:collision :run] +[34:02][Consider pathfinding our :collision through a stack of voxels][:collision :research] +[37:22][Enable MoveEntityLocally() to detect and resolve embedding][:collision] +[39:05][Our initially embedded glove may now move, but can tunnel][:collision :run] +[39:44][Investigate our tunneling issue][:collision :research] +[40:47][Make MoveEntityLocally() test the occupation state of all eight surrounding voxels][:collision] +[40:58][We still tunnel][:collision :run] +[41:05][Consider drawing more :collision information][:"debug visualisation" :research] +[42:24][Make MoveEntityLocally() test the occupation state of only the one voxel en route to the target][:collision] +[42:46][Consider drawing more :collision information (cont.)][:"debug visualisation" :research] +[44:15][Take a closer look at our glove vs familiar :collision][:run] +[44:57][Wonder why it fails our AnyOpen check][:collision :research] +[45:45][Make MoveEntityLocally() test the occupation state of all eight surrounding voxels][:collision] +[46:02][We still tunnel][:collision :run] +[46:15][Prevent MoveEntityLocally() from using the target position if embedded][:collision] +[46:25][We can't test tunneling][:collision :run] +[46:32][Make AddPlayer() elevate the glove][:"entity system"] +[47:14][We can test it, and no longer tunnel][:collision :run] +[49:29][Let MoveEntityLocally() use the target position if embedded][:collision] +[49:43][We tunnel trivially][:collision :run] +[49:55][Make MoveEntityLocally() set AnyOpen using an OccupiedCount][:collision] +[51:35][We still tunnel][:collision :run] +[51:50][Wonder how MoveEntityLocally() detects embedding so often][:collision :research] +[53:04][Increase the ApronSize to the full MOTION_DISPLACEMENT_SIZE in MoveEntityLocally()][:collision] +[53:11][We still tunnel, but less easily][:collision :run] +[54:20][How are two frames disagreeing on which :collision volumes are occupied?][:research] +[56:41][Make MoveEntity() only allow one micro-move, i.e. one call to MoveEntityLocally()][:collision] +[57:11][We still tunnel][:collision :run] +[57:58][Delete VolumeDim and VolumeP from MoveEntityLocally()][:collision] +[58:08][Consider drawing more :collision information][:"debug visualisation" :research] +[1:01:20][Should we start visualisation now?][:"debug visualisation" :speech] +[1:01:45][@suspect__zero][The game looks like it lags hard when the punch flies around. Is that because of the debugging tools being active?][:performance] +[1:04:55][Compile in -Od] +[1:05:16][Show off the :performance in -Od][:run] +[1:05:32][Use #pragma optimize("gt", on) and #pragma optimize("", on) around handmade_lighting.cpp][:language :lighting :performance] +[1:07:28][ComputeLightPropagationWork() takes 78% of our frame time][:lighting :performance :run] +[1:07:52][Toggle off MoveEntity()][:collision] +[1:08:25][Gauge our :performance in -Od][:lighting :run] +[1:09:03][Use #pragma optimize("gt", on) and #pragma optimize("", on) around handmade_light_atlas.cpp][:language :lighting :performance] +[1:10:23][Gauge our :performance in -Od][:lighting :run] +[1:10:45][Remove the #prama optimize() and re-enable MoveEntity()][:collision :language :performance] +[1:11:52][Step through MoveEntityLocally()][:collision :run] +[1:12:48][Initialise a TestP in MoveEntityLocally()][:collision] +[1:13:29][Step through MoveEntityLocally() watching the TestP and other values][:collision :run] +[1:15:24][Set a break point in the !AnyOpen path][:collision :run] +[1:16:47][Tunnel through, without hitting that break point][:collision :run] +[1:18:18][Compile in -O2] +[1:18:27][@bearexplicit][It pushed the skeleton up over the glove?][:collision] +[1:18:36][The glove is not tunneling, but passing beneath the familiar][:collision :run] +[1:21:09][Make MoveEntityLocally() test the occupation state of only the one voxel en route to the target][:collision] +[1:21:27][Our glove and familiar are stuck][:collision :run] +[1:22:16][Enable MoveEntityLocally() to clip away the voxel search directions behind our direction of motion][:collision] +[1:26:48][Our glove may be blocked from moving upwards, but may perhaps move sideways][:collision :run] +[1:27:11][Consider clipping the :collision box][:research] +[1:31:35][Start to make MoveEntityLocally() clip the :collision box] +[1:35:52][Consider making MoveEntityLocally() permit movement within the voxel interior][:collision :research] +[1:36:46][Enable MoveEntityLocally() to (dis)allow movement on a direction-by-direction basis][:collision] +[1:43:23][Our glove and familiar get unstuck][:collision :run] +[1:43:39][Make a note to pathfind through the voxel][:collision] +[1:44:09][@macielda][Q: The second if has a problem: it should be Dir.y not Dir.z][:collision] +[1:44:27][Our :movement is slow][:collision :run] +[1:44:52][Let MoveEntity() allow all micro-moves, i.e. multiple calls to MoveEntityLocally()][:collision] +[1:45:00][Our :movement is normal][:collision :run] +[1:45:44][That's it for today][:speech] +[1:46:16][Q&A][:speech] +[1:47:08][@mindmark42][Q: Can you explain this direction check a bit more?][:collision] +[1:48:33][@ommos61][Q: Have you forgotten to upload Day 632 to YouTube?] +[1:49:06][@mindmark42][Q: So it can't move backwards?][:collision] +[1:50:07][@gheoan][After discovering the glove was moving under the skull you are now trying to prevent that?][:collision] +[1:50:19][@sagian2005][Q: If you're trapped and have the vector in, why can't you just follow the vector back out?][:collision] +[1:51:57][@thesandvichmaker][Q: (Semi off-topic) With the live code reloading, I made a thing where global variables in the dll can be saved and restored when you reload the dll. Have you tried that before? I thought it's kind of neat][:"hot reloading"] +[1:53:16][Wrap it on up][:speech] +[/video]