[video output=day322 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Handling Multiple Display Aspect Ratios" vod_platform=youtube id=EKxPnlQ2ipI annotator=Miblo]
[0:10][Recap and set the stage for the day]
[0:35][Consult the issues[ref
    site="GitHub"
    page="HandmadeHero/cpp Issues"
    url="https://github.com/HandmadeHero/cpp/issues"]]
[2:11][Determine to fix the "Wrong glViewport parameters" issue]
[3:52][Run the game and demo the resizing situation]
[5:01][handmade_opengl.cpp: Make OpenGLDisplayBitmap() and OpenGLRenderCommands() pass the WindowWidth and WindowHeight to glViewport()]
[6:27][Run the game and see how it now looks]
[9:00][Blackboard: Aspect Ratio Resize]
[11:03][Blackboard: No aspect ratio support]
[12:57][Blackboard: Aspect-awareness]
[16:48][Blackboard: Black bar]
[18:12][Blackboard: Our two cases]
[19:38][handmade_render.cpp: Introduce AspectRatioFit()]
[23:43][Blackboard: Calculating aspect ratios]
[27:16][handmade_render.cpp: Make AspectRatioFit() calculate the optimal dimensions based on that fundamental aspect ratio]
[34:22][handmade_opengl.cpp: Make OpenGLRenderCommands() take the DrawRegion and pass it to glViewport()]
[35:41][handmade_math.h: Introduce GetWidth() and GetHeight()]
[39:20][handmade_opengl.cpp: Introduce OpenGLBindFramebuffer()]
[40:54][Run the game and see that it looks the same]
[41:06][win32_handmade.cpp: Make Win32DisplayBufferInWindow() call AspectRatioFit() to set the DrawRegion]
[42:08][Run the game and try out the new resizing]
[43:24][handmade_opengl.cpp: Make OpenGLDisplayBitmap() take the DrawRegion and pass it to OpenGLBindFramebuffer()]
[45:04][Run the game and see that it just works]
[45:33][handmade_opengl.cpp: Make OpenGLDisplayBitmap() clear to the ClearColor and prevent OpenGLRenderCommands() from drawing the outlines]
[47:53][Run the game, see how it all is and close that issue]
[49:33][Determine to fix the "Incorrect Unproject" issue]
[51:53][win32_handmade.cpp: DrawRegion WinMain()]
[53:17][win32_handmade.cpp: Remove the win32_rendering_type enum in favour of a single GlobalSoftwareRendering]
[54:21][Run the game and ensure that toggling the software renderer still works]
[54:43][win32_handmade.cpp: Make WinMain() compute DrawRegion early on and make all the appropriate functions take it]
[56:52][win32_handmade.cpp: Make WinMain() map the mouse position to the DrawRegion]
[58:56][Run the game and see if the mouse cursor is now working okay]
[1:00:01][win32_handmade.cpp: Make WinMain() base the mouse position on the RenderCommands dimensions]
[1:00:31][Run the game and see that the mouse cursor is still failing]
[1:01:59][Debugger: Resize the window, step in to WinMain() and inspect the MouseU and MouseV]
[1:03:21][win32_handmade.cpp: Make WinMain() correctly compute the MouseY]
[1:03:56][Run the game and see that the mouse coordinates are now being passed correctly]
[1:04:18][Q&A][:speech]
[1:05:22][Close that issue]
[1:06:39][@cubercaleb][(Before today) I have a 1600x900 monitor and when I change the code to render at that resolution, both the UI picking and the collision detection for the player get all sorts of messed up, but I haven't tested that since you removed the free moving stuff]
[1:06:57][@hayai][Can you make it so that holding shift while resizing the window makes it just scale at the intended aspect ratio?]
[1:07:52][@shinny_magikarp][Casey, you forgot to change "UseHeight" to "UseWidth" on the second case of the black bar size's definition]
[1:08:09][@deravadom][Two parter, if that's okay: A) I'd like to start working on a homemade 3D game engine of my own. How much of what you have done here transfers over? B) When do you define how long a second is in the game? How does the lighting work in regards to time?]
[1:09:08][@danyguag][How would you suggest a younger developer to get into OpenGL and all of its useful extensions?[ref
    site="NVIDIA GameWorks"
    page="OpenGL like Vulkan"
    url="https://developer.nvidia.com/opengl-vulkan"]]
[1:11:08][@rohit_n][Did you ever go through the NSight plugin on stream?]
[1:11:29][@snoringtortoise][Off-topic: Which keyboard layout do you use? Have you tried the various layouts? I've read that QWERTY can be a bit less efficient for programming, what do you think?]
[1:11:57][@danyguag][I have some experience in OpenGL but not with the extensions]
[1:17:07][win32_handmade.cpp: Make Win32MainWindowCallback() handle fixed aspect ratio window resizing based on Raymond Chen's advice[ref
    site="The Old New Thing"
    page="Use WM_WINDOWPOSCHANGING to intercept window state changes"
    url="https://blogs.msdn.microsoft.com/oldnewthing/20080116-00/?p=23803"]]
[1:23:56][Blackboard: Calculating that new window height]
[1:25:58][Run the game and try resizing the window]
[1:26:31][win32_handmade.cpp: Make Win32MainWindowCallback() only do aspect ratio constrained resize if the shift key is held down]
[1:27:30][Run the game and try resizing with the shift key held down]
[1:29:57][Debugger: Break into Win32MainWindowCallback() to determine what the cx and cy are, and investigate what is happening with the flicker]
[1:35:59][Debugger: Run the game and observe our WM_WINDOWPOSCHANGING output]
[1:37:35][win32_handmade.cpp: Make Win32MainWindowCallback() set the NewPos based on which coordinate is closer]
[1:38:53][Run the game and see if that helps]
[1:40:10][win32_handmade.cpp: Make Win32MainWindowCallback() output the aspect ratio]
[1:40:57][Run the game and observe that aspect ratio]
[1:41:46][win32_handmade.cpp: Make Win32MainWindowCallback() adjust the aspect ratio to ignore the window decorations]
[1:43:16][Blackboard: Computing the aspect ratio for the ClientRect]
[1:46:59][Run the game and see what that does]
[1:48:56][Blackboard: Double-check the maths]
[1:49:16][win32_handmade.cpp: Make Win32MainWindowCallback() compute the NewCx and NewCy differently]
[1:50:41][win32_handmade.cpp: Make Win32MainWindowCallback() set GetWindowRect, run the game and see that it works]
[1:52:03][@hayai][Yes, it helps]
[1:52:14][@cubercaleb][For AdjustWindowRect you should pass WS_OVERLAPPEDWINDOW which is different from WS_OVERLAPPED, although perhaps you meant that?]
[1:52:43][Wrap it up][:speech]
[/video]
