[video output=day520 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Solving for Debug Camera Parameters" vod_platform=youtube id=yQpCRzF717k annotator=Miblo]
[0:00][Recap and set the stage for the day][:speech]
[2:34][Demo our world level / elevation fogging, and our need for a rigorous Z-bias solution][:camera :rendering :run]
[5:52][Z Occlusion][:blackboard :rendering :sorting]
[10:07][Keeping Z, sliding forward in Y and tilting backwards][:blackboard :rendering :sorting]
[13:06][Set up to get our debug :camera in good shape to develop our Z occlusion solution][:blackboard]
[14:44][Demo the garbage debug :camera][:run]
[15:57][Show off the title screen][:art :run]
[16:29][Reacquaint ourselves with the debug :camera code in UpdateAndRenderWorld()][:research]
[19:17][Set up UpdateAndRenderWorld() to handle debug :camera panning, and more clearly set the Debug and Regular clip planes]
[21:24][Continue to reacquaint ourselves with the debug :camera code in UpdateAndRenderWorld()][:research]
[23:47][Temporarily make PlayWorld() set the DebugCameraDolly][:camera]
[24:47][Find that the debug :camera is now restored][:run]
[25:03][Set up UpdateAndRenderWorld() to position the debug :camera to match the regular camera]
[29:52][Reconstructing a camera's dolly, orbit and pitch from a point[ref
    site=Wikipedia
    page=Tau
    url=https://en.wikipedia.org/wiki/Tau]][:blackboard :geometry :mathematics]
[37:14][Make UpdateAndRenderWorld() reconstruct the debug :camera's dolly from the regular camera's position][:geometry]
[41:33][Using the inner product to isolate the position of a point on only one axis][:blackboard :geometry]
[42:49][Add CameraPan to game_mode_world for UpdateAndRenderWorld() to compute][:camera :geometry]
[45:16][Make UpdateAndRenderWorld() reconstruct the debug :camera's orbit and pitch using ATan2()][:geometry]
[47:20][atan2 assumes that our starting vector points along x][:blackboard :geometry]
[49:57][Change UpdateAndRenderWorld() to feed an x-pointing vector to atan2][:geometry]
[52:37][Crash in FindAlign() with an "Access violation" error][:run]
[53:44][Find that the debug :camera is wrong][:run]
[54:03][Scrutinise our debug :camera construction in UpdateAndRenderWorld()][:geometry :research]
[57:15][Make UpdateAndRenderWorld() compute separate debug :camera values to aid debugging]
[59:11][Step in to UpdateAndRenderWorld() and inspect our debug :camera values][:geometry :run]
[1:05:46][Fix the winding of the DebugCameraPitch computation in UpdateAndRenderWorld()][:camera :geometry]
[1:09:40][Step back in to UpdateAndRenderWorld() and inspect our DebugCameraPitch][:camera :geometry :run]
[1:10:20][Fix the DebugCamera0 computation to use an XRotation(), and negate the PlanarArm length in the DebugCameraPitch computation][:camera :geometry]
[1:11:08][Step back in to UpdateAndRenderWorld() and inspect our DebugCameraPitch][:camera :geometry :run]
[1:12:11][Refrain from negating the PlanarArm length in the DebugCameraPitch computation][:camera :geometry]
[1:12:23][Step back in to UpdateAndRenderWorld() and inspect our DebugCameraPitch][:camera :geometry :run]
[1:12:58][Find that our orbit is −90° off][:camera :geometry :run]
[1:13:14][Fix the DebugCameraOrbit computation][:camera :geometry]
[1:14:32][Find that our debug :camera is now correct][:camera :geometry :run]
[1:15:28][Invert the mouse's X-axis in UpdateAndRenderWorld()][:camera :"input handling"]
[1:15:47][Try out our perfect debug :camera][:geometry :run]
[1:16:28][Naively make UpdateAndRenderWorld() to handle debug :camera panning]
[1:17:26][Try our newly panning debug :camera][:run]
[1:17:46][Invert the panning axes in UpdateAndRenderWorld()][:camera]
[1:17:59][Try our newly panning debug :camera, noting that it breaks when the orbits of our debug and regular cameras are not aligned][:run]
[1:18:46][Enable UpdateAndRenderWorld() to pan the :camera in camera-space]
[1:20:45][Show our :camera panning in camera-space][:run]
[1:21:13][Find that we are inverting the mouse's Y axis][:"input handling" :research]
[1:22:17][Note the correctness of our panning][:camera :"input handling" :run]
[1:22:45][Make UpdateAndRenderWorld() invert our panning and scale its speed by the :camera's distance from the subject]
[1:23:40][Try out our distance-proportional panning :camera][:run]
[1:25:28][Take a close look at our sprites in preparation to try our Z occlusion solution][:"entity system" :run]
[1:27:59][Reacquaint ourselves with SpriteValuesForUpright()][:"entity system" :research]
[1:30:21][Remove ZBias from SpriteValuesForUpright()][:"entity system"]
[1:30:32][Find that we draw just fine without the ZBias][:"entity system" :run]
[1:30:44][Temporarily make SpriteValuesForUpright() displace the sprites in Y][:"entity system"]
[1:32:33][Check out our displaced entities and adjust the alignment points to find that we are displacing in the wrong direction][:"entity system" :run]
[1:33:17][Change SpriteValuesForUpright() to use the (not inverted) WorldDim.y in the sprite displacement][:"entity system"]
[1:33:44][Align the hero's body and head, and find that we now sort beautifully (i.e. no penetration with walls), except during hopping which we are erroneously performing in Y][:"asset system" :"entity system" :run]
[1:37:25][Make UpdateAndRenderEntities() hop the entities in Z][:"entity system"]
[1:39:07][Check out our Z-hopping entities, to find that our hero never penetrates walls][:"entity system" :run]
[1:40:26][Q&A][:speech]
[1:41:35][@Brian][Q: You uploaded the last episode as episode 520, instead of 519]
[1:42:17][@recyrillic][Q: Are we gonna switch to ~remedybg for [~hero Handmade Hero] soon?]
[1:43:41][@garryjohanson][Q: So one of the reasons I became briefly enthusiastic about WinDBG Preview is the ability to record a trace of a running program and then send that trace to someone else and they can look at the exact debug session you were looking at, rather than having to reproduce a bug spending possibly a long period of time. To me that sounds like a silver bullet way to reproduce a bug. Can you think of any reason why I would be wrong to conclude that the feature is a silver bullet for reproducing bugs?]
[1:46:27][@ingenero][Q: So far it seems all the :animation is done programatically, moving static sprites. Is there any plan to include pre-set or artist-created animations?]
[1:47:30][@pythno][Q: I studied the :rendering code for a bit and it seems that the vertices and indices for the cubes (and quads) are generated each frame on the CPU and put into a big VBO which is set to stream_draw. Is this correct and, if yes, what was the decision to do it that way and not even using VAOs? For big models with a lot of polygons would you go a different route?]
[1:49:31][@vapenir][Q: What's your take on profilers vs. DIY in-game :profiling? What are some decent profilers that you know of or have used?]
[1:51:05][@pkey1][Q: What you think about python?][:language]
[1:52:16][@lucid_frost][Q: Do you think there is any value in keeping the concept of registers in the higher level :language?]
[1:52:39][@friedhit][Q: How do you feel about dynamically-typed languages?][:language]
[1:53:08][@useless_pony][Q: I may have asked this before, but have you looked at ponylang? If so, what are your thoughts on it?][:language]
[1:53:46][@vapenir][Q: Does the game load levels from files, and do you plan to include a level editor with the final game?]
[1:55:20][Deep thoughts on modern languages like PLISK, StopLang and ZnO, and their cutting edge provision for :memory composting][:language :speech]
[2:01:34][Wrap it up for the day][:speech]
[/video]
