Providing Convenient Camera Controls
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next timestamp
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu and Index Controls

a
w
s
d
h j k l


Esc Close menu / unfocus timestamp

Quotes and References Menus and Index

Enter Jump to timestamp

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:00Recap and set the stage for the day continuing the renderer API cleanup
🗩
0:00Recap and set the stage for the day continuing the renderer API cleanup
🗩
0:00Recap and set the stage for the day continuing the renderer API cleanup
🗩
1:25Determine to switch platform_renderer to use a table of function pointers, to enable loading of renderers from DLLs
🗩
1:25Determine to switch platform_renderer to use a table of function pointers, to enable loading of renderers from DLLs
🗩
1:25Determine to switch platform_renderer to use a table of function pointers, to enable loading of renderers from DLLs
🗩
3:41Switch platform_renderer to use function pointers
3:41Switch platform_renderer to use function pointers
3:41Switch platform_renderer to use function pointers
9:57Demo C++ virtual function calls
🗩
9:57Demo C++ virtual function calls
🗩
9:57Demo C++ virtual function calls
🗩
13:18Enable RenderLoop() to use the functions pointed to in platform_renderer, introducing Win32LoadOpenGLRenderer()
13:18Enable RenderLoop() to use the functions pointed to in platform_renderer, introducing Win32LoadOpenGLRenderer()
13:18Enable RenderLoop() to use the functions pointed to in platform_renderer, introducing Win32LoadOpenGLRenderer()
17:24Run the Renderer Test to see everything working fine
🏃
17:24Run the Renderer Test to see everything working fine
🏃
17:24Run the Renderer Test to see everything working fine
🏃
17:38Switch Handmade Hero to use our function pointers in platform_renderer
17:38Switch Handmade Hero to use our function pointers in platform_renderer
17:38Switch Handmade Hero to use our function pointers in platform_renderer
18:11Run the game
🏃
18:11Run the game
🏃
18:11Run the game
🏃
18:54Export Win32LoadRenderer() – renamed from Win32LoadOpenGLRenderer() – to a DLL
18:54Export Win32LoadRenderer() – renamed from Win32LoadOpenGLRenderer() – to a DLL
18:54Export Win32LoadRenderer() – renamed from Win32LoadOpenGLRenderer() – to a DLL
25:43C++ name mangling
🗩
25:43C++ name mangling
🗩
25:43C++ name mangling
🗩
26:52Try to enable the compiler to export Win32LoadRenderer() by applying extern "C"
26:52Try to enable the compiler to export Win32LoadRenderer() by applying extern "C"
26:52Try to enable the compiler to export Win32LoadRenderer() by applying extern "C"
28:15Investigate why the compiler could not find Win32LoadRenderer(), using dumpbin
🗹
28:15Investigate why the compiler could not find Win32LoadRenderer(), using dumpbin
🗹
28:15Investigate why the compiler could not find Win32LoadRenderer(), using dumpbin
🗹
29:58Stop marking Win32LoadRenderer() as internal (static), to enable the compiler to find it
29:58Stop marking Win32LoadRenderer() as internal (static), to enable the compiler to find it
29:58Stop marking Win32LoadRenderer() as internal (static), to enable the compiler to find it
31:52Link all the necessary libraries to our DLL
31:52Link all the necessary libraries to our DLL
31:52Link all the necessary libraries to our DLL
33:35Check our newly generated win32_handmade_opengl.dll in dumpbin and depends, to see Win32LoadRenderer in there
🗹
33:35Check our newly generated win32_handmade_opengl.dll in dumpbin and depends, to see Win32LoadRenderer in there
🗹
33:35Check our newly generated win32_handmade_opengl.dll in dumpbin and depends, to see Win32LoadRenderer in there
🗹
35:30Enable RenderLoop() to load in our renderer DLL, introducing Win32LoadRendererDLL()1
35:30Enable RenderLoop() to load in our renderer DLL, introducing Win32LoadRendererDLL()1
35:30Enable RenderLoop() to load in our renderer DLL, introducing Win32LoadRendererDLL()1
44:46Remove opengl32.lib from our CommonLinkerFlags
44:46Remove opengl32.lib from our CommonLinkerFlags
44:46Remove opengl32.lib from our CommonLinkerFlags
45:14Step through RenderLoop() and into the Renderer Test running in our external .dll
🏃
45:14Step through RenderLoop() and into the Renderer Test running in our external .dll
🏃
45:14Step through RenderLoop() and into the Renderer Test running in our external .dll
🏃
46:17Enable RenderLoop() to pop up a dialog box if we failed to find a renderer2
46:17Enable RenderLoop() to pop up a dialog box if we failed to find a renderer2
46:17Enable RenderLoop() to pop up a dialog box if we failed to find a renderer2
48:46Delete win32_handmade_opengl.dll and run the Renderer Test to see our dialog box
🏃
48:46Delete win32_handmade_opengl.dll and run the Renderer Test to see our dialog box
🏃
48:46Delete win32_handmade_opengl.dll and run the Renderer Test to see our dialog box
🏃
49:28Introduce Win32InitDefaultRenderer() to wrap up the renderer DLL loading
49:28Introduce Win32InitDefaultRenderer() to wrap up the renderer DLL loading
49:28Introduce Win32InitDefaultRenderer() to wrap up the renderer DLL loading
51:54Switch Handmade Hero over to use our external renderer DLL
51:54Switch Handmade Hero over to use our external renderer DLL
51:54Switch Handmade Hero over to use our external renderer DLL
53:19Run the game using the external DLL, with a few words on the potential to create other renderers
🏃
53:19Run the game using the external DLL, with a few words on the potential to create other renderers
🏃
53:19Run the game using the external DLL, with a few words on the potential to create other renderers
🏃
54:16Determine to clean up the camera and sprite pushing API, and general code organisation
🗩
54:16Determine to clean up the camera and sprite pushing API, and general code organisation
🗩
54:16Determine to clean up the camera and sprite pushing API, and general code organisation
🗩
55:08Dive into cleaning up the camera API
55:08Dive into cleaning up the camera API
55:08Dive into cleaning up the camera API
1:02:25Introduce Translation() for our camera setup code to initialise the matrix
1:02:25Introduce Translation() for our camera setup code to initialise the matrix
1:02:25Introduce Translation() for our camera setup code to initialise the matrix
1:03:54Run the Renderer Test with the camera working just as before
🏃
1:03:54Run the Renderer Test with the camera working just as before
🏃
1:03:54Run the Renderer Test with the camera working just as before
🏃
1:04:26Fold the CameraOffset into the camera matrix initialisation
1:04:26Fold the CameraOffset into the camera matrix initialisation
1:04:26Fold the CameraOffset into the camera matrix initialisation
1:06:57Run the Renderer Test using our single camera matrix operation
🏃
1:06:57Run the Renderer Test using our single camera matrix operation
🏃
1:06:57Run the Renderer Test using our single camera matrix operation
🏃
1:07:25Simplify the camera setup code out into BuildCameraObjectMatrix() and GetStandardCameraParams()
1:07:25Simplify the camera setup code out into BuildCameraObjectMatrix() and GetStandardCameraParams()
1:07:25Simplify the camera setup code out into BuildCameraObjectMatrix() and GetStandardCameraParams()
1:14:05Run the Renderer Test to see the exact same result
🏃
1:14:05Run the Renderer Test to see the exact same result
🏃
1:14:05Run the Renderer Test to see the exact same result
🏃
1:14:29Continue to simplify the camera code out into ViewFromCamera()
1:14:29Continue to simplify the camera code out into ViewFromCamera()
1:14:29Continue to simplify the camera code out into ViewFromCamera()
1:16:44Run the Renderer Test, noting the simplicity of our camera API while retaining all the power
🏃
1:16:44Run the Renderer Test, noting the simplicity of our camera API while retaining all the power
🏃
1:16:44Run the Renderer Test, noting the simplicity of our camera API while retaining all the power
🏃
1:17:40Make SetCameraTransform() take fog_params and alpha_clip_params
1:17:40Make SetCameraTransform() take fog_params and alpha_clip_params
1:17:40Make SetCameraTransform() take fog_params and alpha_clip_params
1:27:43Run the Renderer Test to verify that we work with the fog and alpha defaults
🏃
1:27:43Run the Renderer Test to verify that we work with the fog and alpha defaults
🏃
1:27:43Run the Renderer Test to verify that we work with the fog and alpha defaults
🏃
1:27:57Try setting some fog_params in ViewFromCamera()
1:27:57Try setting some fog_params in ViewFromCamera()
1:27:57Try setting some fog_params in ViewFromCamera()
1:30:37Run the Renderer Test to see our fog, and play with the params, encountering some bugs with the sprite outlines
🏃
🖮
1:30:37Run the Renderer Test to see our fog, and play with the params, encountering some bugs with the sprite outlines
🏃
🖮
1:30:37Run the Renderer Test to see our fog, and play with the params, encountering some bugs with the sprite outlines
🏃
🖮
1:34:38Augment the camera struct with FogStart and FogEnd
1:34:38Augment the camera struct with FogStart and FogEnd
1:34:38Augment the camera struct with FogStart and FogEnd
1:38:47Run our fogged Renderer Test
🏃
1:38:47Run our fogged Renderer Test
🏃
1:38:47Run our fogged Renderer Test
🏃
1:39:04Augment the camera struct with ClipAlphaStart and ClipAlphaEnd for ViewFromCamera() to use
1:39:04Augment the camera struct with ClipAlphaStart and ClipAlphaEnd for ViewFromCamera() to use
1:39:04Augment the camera struct with ClipAlphaStart and ClipAlphaEnd for ViewFromCamera() to use
1:42:07Run the Renderer Test to see our alpha clipping
🏃
1:42:07Run the Renderer Test to see our alpha clipping
🏃
1:42:07Run the Renderer Test to see our alpha clipping
🏃
1:42:51Reflect on our newly simplified camera API, and consider getting rid of the render_group
🗩
1:42:51Reflect on our newly simplified camera API, and consider getting rid of the render_group
🗩
1:42:51Reflect on our newly simplified camera API, and consider getting rid of the render_group
🗩
1:46:23nxsy Q: 1:30pm
🗪
1:46:23nxsy Q: 1:30pm
🗪
1:46:23nxsy Q: 1:30pm
🗪
1:47:10Consider the reason for render_group
🗩
1:47:10Consider the reason for render_group
🗩
1:47:10Consider the reason for render_group
🗩
1:49:16Switch Handmade Hero over to our new camera API
1:49:16Switch Handmade Hero over to our new camera API
1:49:16Switch Handmade Hero over to our new camera API
1:49:57Run the game, noting that we've lost our fog and alpha clip
🏃
1:49:57Run the game, noting that we've lost our fog and alpha clip
🏃
1:49:57Run the game, noting that we've lost our fog and alpha clip
🏃
1:50:51Make UpdateAndRenderWorld() set the fog and alpha clip
1:50:51Make UpdateAndRenderWorld() set the fog and alpha clip
1:50:51Make UpdateAndRenderWorld() set the fog and alpha clip
1:52:48Run the game with our fog and alpha clip working
🏃
1:52:48Run the game with our fog and alpha clip working
🏃
1:52:48Run the game with our fog and alpha clip working
🏃
1:52:59Document our window setup
1:52:59Document our window setup
1:52:59Document our window setup
1:54:59Run the Renderer Test preserving the 16:9 aspect ratio
🏃
1:54:59Run the Renderer Test preserving the 16:9 aspect ratio
🏃
1:54:59Run the Renderer Test preserving the 16:9 aspect ratio
🏃
1:55:09Try setting the draw region to fill the entire window
1:55:09Try setting the draw region to fill the entire window
1:55:09Try setting the draw region to fill the entire window
1:55:24Run the Renderer Test to see that we correctly draw to the entire window
🏃
1:55:24Run the Renderer Test to see that we correctly draw to the entire window
🏃
1:55:24Run the Renderer Test to see that we correctly draw to the entire window
🏃
1:55:53Document the camera testing and texture downloading
1:55:53Document the camera testing and texture downloading
1:55:53Document the camera testing and texture downloading
2:00:17Q&A
🗩
2:00:17Q&A
🗩
2:00:17Q&A
🗩
2:01:12naysayer88 Q: How can I program a really good Windows Update system like Windows has that makes sure you update all the time especially if you are not home or are watching a movie right now?
🗪
2:01:12naysayer88 Q: How can I program a really good Windows Update system like Windows has that makes sure you update all the time especially if you are not home or are watching a movie right now?
🗪
2:01:12naysayer88 Q: How can I program a really good Windows Update system like Windows has that makes sure you update all the time especially if you are not home or are watching a movie right now?
🗪
2:04:31vateferfout Q: (Off-topic) You mentioned in the pre-stream fetching the cache misses. Do you mind explaining how it's done?
🗪
2:04:31vateferfout Q: (Off-topic) You mentioned in the pre-stream fetching the cache misses. Do you mind explaining how it's done?
🗪
2:04:31vateferfout Q: (Off-topic) You mentioned in the pre-stream fetching the cache misses. Do you mind explaining how it's done?
🗪
2:04:50cynokron Q: Why do you want to remove the render group? What is the alternative? My following is a bit spotty so I am sorry if this is obvious from watching previous streams
🗪
2:04:50cynokron Q: Why do you want to remove the render group? What is the alternative? My following is a bit spotty so I am sorry if this is obvious from watching previous streams
🗪
2:04:50cynokron Q: Why do you want to remove the render group? What is the alternative? My following is a bit spotty so I am sorry if this is obvious from watching previous streams
🗪
2:05:31tkscootlive Q: What is your opinion on the Vulkan API? Is it overkill to use it for a little indie game or is it worth the thousands of setup code lines?
🗪
💢
2:05:31tkscootlive Q: What is your opinion on the Vulkan API? Is it overkill to use it for a little indie game or is it worth the thousands of setup code lines?
🗪
💢
2:05:31tkscootlive Q: What is your opinion on the Vulkan API? Is it overkill to use it for a little indie game or is it worth the thousands of setup code lines?
🗪
💢
2:09:09vateferfout Q: I mean memory cache misses
🗪
2:09:09vateferfout Q: I mean memory cache misses
🗪
2:09:09vateferfout Q: I mean memory cache misses
🗪
2:09:38uhee Q: What steps are you going to do to optimize the renderer?
🗪
2:09:38uhee Q: What steps are you going to do to optimize the renderer?
🗪
2:09:38uhee Q: What steps are you going to do to optimize the renderer?
🗪
2:10:21accidentalrebel Q: I'm making DOS games for fun. Have you had experience making games during the DOS era?
🗪
2:10:21accidentalrebel Q: I'm making DOS games for fun. Have you had experience making games during the DOS era?
🗪
2:10:21accidentalrebel Q: I'm making DOS games for fun. Have you had experience making games during the DOS era?
🗪
2:11:11vateferfout Q: Sorry, I'll rephrase it. Is there a function that lets you know how many L1, L2, etc. cache misses happened since, for example, the last time you called the function?
🗪
🏃
2:11:11vateferfout Q: Sorry, I'll rephrase it. Is there a function that lets you know how many L1, L2, etc. cache misses happened since, for example, the last time you called the function?
🗪
🏃
2:11:11vateferfout Q: Sorry, I'll rephrase it. Is there a function that lets you know how many L1, L2, etc. cache misses happened since, for example, the last time you called the function?
🗪
🏃
2:14:53mattiamanzati Q: After ending up with the renderer part, which do you thing is the next macro-step on Handmade Hero?
🗪
2:14:53mattiamanzati Q: After ending up with the renderer part, which do you thing is the next macro-step on Handmade Hero?
🗪
2:14:53mattiamanzati Q: After ending up with the renderer part, which do you thing is the next macro-step on Handmade Hero?
🗪
2:15:11cynokron Q: Do you ever see Linux as a consumer machine? I'd personally rather use Linux to play games than Windows or Mac, but in your Vulkan rant Linux was not mentioned at all
🗪
2:15:11cynokron Q: Do you ever see Linux as a consumer machine? I'd personally rather use Linux to play games than Windows or Mac, but in your Vulkan rant Linux was not mentioned at all
🗪
2:15:11cynokron Q: Do you ever see Linux as a consumer machine? I'd personally rather use Linux to play games than Windows or Mac, but in your Vulkan rant Linux was not mentioned at all
🗪
2:15:58mmozeiko Q: On Linux you can do that with "perf" utility. It does not require anything extra, kernel already provides this information
🗪
2:15:58mmozeiko Q: On Linux you can do that with "perf" utility. It does not require anything extra, kernel already provides this information
🗪
2:15:58mmozeiko Q: On Linux you can do that with "perf" utility. It does not require anything extra, kernel already provides this information
🗪
2:17:03Wrap it up3,4
🗩
2:17:03Wrap it up3,4
🗩
2:17:03Wrap it up3,4
🗩