[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Debugging Graph-based Sort" vod_platform=youtube id=bMjnXBR98UY annotator=Miblo] [0:11][Recap and set the stage for the day] [1:40][Run the game and see the current state] [3:51]["Let's use the word "evolucent""][quote 497] [4:06][handmade_render_group.cpp: Make PushRenderElement_() take and set the ScreenArea] [5:01][handmade_render_group.cpp: Make PushRect() set the ScreenArea] [6:54][handmade_render_group.cpp: Make PushBitmap() set a provisional ScreenArea for the sprite] [8:10][Blackboard: The ScreenArea for Regular vs Rotated Sprites] [11:51][handmade_render_group.h: Add ScreenArea to render_group and make Clear() take it] [17:03][handmade_render_group.cpp: Make Perspective() set the ScreenArea] [18:15][Debugger: Run the game, crash in BuildSpriteGraph() and inspect the ScreenArea values] [20:18][handmade_render_group.cpp: Look through GetRenderEntityBasisP() and note that NearClipPlane is set so that 0 is clipped out] [20:59][Debugger: Inspect the values of B] [21:48][handmade_render_group.cpp: Assert in PushRenderElement_() that GetArea(ScreenArea) < 2000 * 2000] [23:28][handmade_math.h: Introduce GetArea()] [24:36][Debugger: Run the game and hit that assertion, then step out and see who called that function] [26:13][handmade_render_group.cpp: Comment out that assertion, run the game and look at the actual bug] [26:28][handmade_render.cpp: Reenable the PushStuct() call in SortEntries()] [26:54][Run the game and see that we're running incredibly slowly] [27:27][handmade_render.cpp: Make BuildSpriteGraph() and WalkSpriteGraph() a TIMED_FUNCTION] [27:58][build.bat: Switch to -O2] [28:24][Run the game and realise that we can't see the debug display because it isn't sorted correctly] [29:06][build.bat: Switch back to -Od] [29:52][Run the game and see that we're getting some pretty non sequitur results] [30:46][handmade.cpp: Switch back to the title sequence in order to see how the sorting routine performs on these] [31:43][Note that the drop shadow of the text is being sorted incorrectly] [33:42][handmade_cutscene.cpp: Try and scramble the order of the first scene's layers] [34:22][Run the game and see that the scene is now incorrectly sorted] [35:25][Debugger: Break into BuildSpriteGraph() and inspect the values for A and B] [35:56][handmade_render.cpp: Prevent BuildSpriteGraph() from comparing NodeIndexA with itself] [36:51][Debugger: Break into BuildSpriteGraph() and see that A and B are now different] [38:50][Debugger: Step through BuildSpriteGraph() and see if it behaves as expected] [41:03][Debugger: Step through WalkSpriteGraph() and RecursiveFromToBack() and see if they behave as expected] [45:37][Debugger: Step through OpenGLRenderCommands() and inspect the SortedIndices array] [47:09][handmade_cutscene.cpp: Make RenderLayeredScene() DebugTag the cutscene layers] [50:34][Debugger: Run the game, step through BuildSpriteGraph() and RecursiveFromToBack() and watch the DebugTag values] [52:30][handmade_cutscene.cpp: Revert the cutscene layers to their original order] [52:55][Debugger: Step through RecursiveFromToBack(), watch the DebugTag values and confirm that the code is doing what we think it is doing] [54:27][handmade_render.cpp: Look through how the sort_sprite_bound flows through the functions] [56:50][handmade_cutscene.cpp: Note the reason why the cutscene was sorting as it was] [58:12][handmade_world_mode.cpp: Make UpdateAndRenderWorld() only generate one screen and disable the Monstar] [1:00:18][handmade_world_mode.cpp: Prevent AddStandardRoom() from calling BeginGroundedEntity()] [1:00:36][Run the game and hit the Assert in OpenGLRenderCommands() because ClipRectCount == 0] [1:01:39][Debugger: Investigate how we ended up with no ClipRects] [1:05:27][handmade_render_group.cpp: Make BeginRenderGroup() rather than Perspective() take the PixelWidth and PixelHeight in order to compute the ScreenArea, and call PushClipRect()] [1:09:26][handmade_world_mode.cpp: Make AddStandardRoom() create one tile] [1:09:57][Run the game and see that our sort appears to handle our Y-sprites just fine, but that our Z-sprites are all messed] [1:10:32][Defer questions until Monday and end it now][:speech] [/video]