Removing Screen Coordinates from the Render Group
?
?

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:08Recap and set the stage for the day continuing our renderer API cleanup and addressing texture arrays
🗩
0:08Recap and set the stage for the day continuing our renderer API cleanup and addressing texture arrays
🗩
0:08Recap and set the stage for the day continuing our renderer API cleanup and addressing texture arrays
🗩
3:42Run the Renderer Test and consider addressing the API call for rotation
🏃
3:42Run the Renderer Test and consider addressing the API call for rotation
🏃
3:42Run the Renderer Test and consider addressing the API call for rotation
🏃
5:58Consider organising our source files into directories
🗩
5:58Consider organising our source files into directories
🗩
5:58Consider organising our source files into directories
🗩
8:57Move the #include of handmade_memory.h out of handmade_shared.h
8:57Move the #include of handmade_memory.h out of handmade_shared.h
8:57Move the #include of handmade_memory.h out of handmade_shared.h
14:17Move the #include of handmade_simd.h out of handmade_shared.h
14:17Move the #include of handmade_simd.h out of handmade_shared.h
14:17Move the #include of handmade_simd.h out of handmade_shared.h
16:37Move the #include of handmade_intrinsics.h and handmade_math.h out of handmade_shared.h
16:37Move the #include of handmade_intrinsics.h and handmade_math.h out of handmade_shared.h
16:37Move the #include of handmade_intrinsics.h and handmade_math.h out of handmade_shared.h
18:22Migrate all our #include directives in win32_renderer_test.h to the top to clearly indicate all the files needed to use our renderer
18:22Migrate all our #include directives in win32_renderer_test.h to the top to clearly indicate all the files needed to use our renderer
18:22Migrate all our #include directives in win32_renderer_test.h to the top to clearly indicate all the files needed to use our renderer
21:55Further organise and document win32_renderer_test.cpp and win32_renderer.test.h for clarity
21:55Further organise and document win32_renderer_test.cpp and win32_renderer.test.h for clarity
21:55Further organise and document win32_renderer_test.cpp and win32_renderer.test.h for clarity
26:24Pull out some of PlaceRandom() into CountOccupantsIn3x3(), renaming the former to PlaceRandomInOccupied()
26:24Pull out some of PlaceRandom() into CountOccupantsIn3x3(), renaming the former to PlaceRandomInOccupied()
26:24Pull out some of PlaceRandom() into CountOccupantsIn3x3(), renaming the former to PlaceRandomInOccupied()
29:07Enable InitTestScene() to place trees in a quantity proportional to the available area
29:07Enable InitTestScene() to place trees in a quantity proportional to the available area
29:07Enable InitTestScene() to place trees in a quantity proportional to the available area
30:56Introduce PlaceRectangularWall() and IsEmpty(), for InitTestScene() to call
30:56Introduce PlaceRectangularWall() and IsEmpty(), for InitTestScene() to call
30:56Introduce PlaceRectangularWall() and IsEmpty(), for InitTestScene() to call
39:44Run it to see our rectangular walls
🏃
39:44Run it to see our rectangular walls
🏃
39:44Run it to see our rectangular walls
🏃
40:15Make InitTestScene() clamp our rectangular wall to a minimum of 2×2
40:15Make InitTestScene() clamp our rectangular wall to a minimum of 2×2
40:15Make InitTestScene() clamp our rectangular wall to a minimum of 2×2
40:31Run it and consider throwing more sprites into the scene
🏃
40:31Run it and consider throwing more sprites into the scene
🏃
40:31Run it and consider throwing more sprites into the scene
🏃
41:18Create test_cover_grass.bmp
🎨
41:18Create test_cover_grass.bmp
🎨
41:18Create test_cover_grass.bmp
🎨
43:18Enable InitTestScene() to load and PushSimpleScene() to push our test_cover_grass.bmp everywhere, one per tile
43:18Enable InitTestScene() to load and PushSimpleScene() to push our test_cover_grass.bmp everywhere, one per tile
43:18Enable InitTestScene() to load and PushSimpleScene() to push our test_cover_grass.bmp everywhere, one per tile
46:06Run it to see our grass, and shrink it down
🏃
🖮
46:06Run it to see our grass, and shrink it down
🏃
🖮
46:06Run it to see our grass, and shrink it down
🏃
🖮
46:52Enable PushSimpleScene() to randomly displace multiple grass sprites in each tile
46:52Enable PushSimpleScene() to randomly displace multiple grass sprites in each tile
46:52Enable PushSimpleScene() to randomly displace multiple grass sprites in each tile
49:05Run it to see our randomly displaced grass
🏃
49:05Run it to see our randomly displaced grass
🏃
49:05Run it to see our randomly displaced grass
🏃
49:08Crank up our sprite-count per tile
49:08Crank up our sprite-count per tile
49:08Crank up our sprite-count per tile
49:39Run it to see our scene looking bad, and begin to investigate why this is permitted
🏃
49:39Run it to see our scene looking bad, and begin to investigate why this is permitted
🏃
49:39Run it to see our scene looking bad, and begin to investigate why this is permitted
🏃
50:55Assert in PushQuad() that VertexCount <= MaxVertexCount
50:55Assert in PushQuad() that VertexCount <= MaxVertexCount
50:55Assert in PushQuad() that VertexCount <= MaxVertexCount
52:26Run it and do not hit that assertion
🏃
52:26Run it and do not hit that assertion
🏃
52:26Run it and do not hit that assertion
🏃
52:36Add an InvalidCodePath assertion in GetCurrentQuads(), unfortunately in the case that we don't blow out the vertex buffer
52:36Add an InvalidCodePath assertion in GetCurrentQuads(), unfortunately in the case that we don't blow out the vertex buffer
52:36Add an InvalidCodePath assertion in GetCurrentQuads(), unfortunately in the case that we don't blow out the vertex buffer
53:37Run it and hit that assertion, failing loudly
🏃
53:37Run it and hit that assertion, failing loudly
🏃
53:37Run it and hit that assertion, failing loudly
🏃
54:41Bump up the MaxVertexCount in RenderLoop()
54:41Bump up the MaxVertexCount in RenderLoop()
54:41Bump up the MaxVertexCount in RenderLoop()
54:50Run it and unexpectedly hit our new InvalidCodePath in GetCurrentQuads()
🏃
54:50Run it and unexpectedly hit our new InvalidCodePath in GetCurrentQuads()
🏃
54:50Run it and unexpectedly hit our new InvalidCodePath in GetCurrentQuads()
🏃
55:59Step in to GetCurrentQuads() and inspect the Commands
55:59Step in to GetCurrentQuads() and inspect the Commands
55:59Step in to GetCurrentQuads() and inspect the Commands
56:42Fix the location of our InvalidCodePath in GetCurrentQuads(), in the case that we do blow out the vertex buffer
56:42Fix the location of our InvalidCodePath in GetCurrentQuads(), in the case that we do blow out the vertex buffer
56:42Fix the location of our InvalidCodePath in GetCurrentQuads(), in the case that we do blow out the vertex buffer
57:10Run it to see our lower rendering performance
🏃
57:10Run it to see our lower rendering performance
🏃
57:10Run it to see our lower rendering performance
🏃
57:34Crank up our sprite-count per tile to really slow down our test program
57:34Crank up our sprite-count per tile to really slow down our test program
57:34Crank up our sprite-count per tile to really slow down our test program
58:19Set up to test whether the slowdown is in the renderer or our push calls
🗩
58:19Set up to test whether the slowdown is in the renderer or our push calls
🗩
58:19Set up to test whether the slowdown is in the renderer or our push calls
🗩
1:02:30Make RenderLoop() only call PushSimpleScene() once
1:02:30Make RenderLoop() only call PushSimpleScene() once
1:02:30Make RenderLoop() only call PushSimpleScene() once
1:03:57Run it to see that the OpenGL dispatch and rendering takes at least 89.91ms per frame
🏃
1:03:57Run it to see that the OpenGL dispatch and rendering takes at least 89.91ms per frame
🏃
1:03:57Run it to see that the OpenGL dispatch and rendering takes at least 89.91ms per frame
🏃
1:04:58Let RenderLoop() call PushSimpleScene() every loop
1:04:58Let RenderLoop() call PushSimpleScene() every loop
1:04:58Let RenderLoop() call PushSimpleScene() every loop
1:05:15Run it to see that our push buffer calls slow us down to 102.56ms per frame, noting that a fair test would omit camera rotation
🏃
1:05:15Run it to see that our push buffer calls slow us down to 102.56ms per frame, noting that a fair test would omit camera rotation
🏃
1:05:15Run it to see that our push buffer calls slow us down to 102.56ms per frame, noting that a fair test would omit camera rotation
🏃
1:06:42Revert our performance testing code with the determination to work on the API
1:06:42Revert our performance testing code with the determination to work on the API
1:06:42Revert our performance testing code with the determination to work on the API
1:07:32Document RenderLoop(), and change the profiling to only occur if we have a valid frame
1:07:32Document RenderLoop(), and change the profiling to only occur if we have a valid frame
1:07:32Document RenderLoop(), and change the profiling to only occur if we have a valid frame
1:10:22Run it to see that our performance ranges from 20.6 to 36.9ms per frame
🏃
1:10:22Run it to see that our performance ranges from 20.6 to 36.9ms per frame
🏃
1:10:22Run it to see that our performance ranges from 20.6 to 36.9ms per frame
🏃
1:11:04Introduce Win32SetVSync() to support conditionally setting VSync
1:11:04Introduce Win32SetVSync() to support conditionally setting VSync
1:11:04Introduce Win32SetVSync() to support conditionally setting VSync
1:12:17Run it to see that our performance still ranges widely
🏃
1:12:17Run it to see that our performance still ranges widely
🏃
1:12:17Run it to see that our performance still ranges widely
🏃
1:12:50Consult the NVidia Control Panel for VSync information
🗹
1:12:50Consult the NVidia Control Panel for VSync information
🗹
1:12:50Consult the NVidia Control Panel for VSync information
🗹
1:14:30Continue to document RenderLoop()
1:14:30Continue to document RenderLoop()
1:14:30Continue to document RenderLoop()
1:22:53Pull out the profiling code in RenderLoop() to InitFrameStats() and UpdateFrameStats()
1:22:53Pull out the profiling code in RenderLoop() to InitFrameStats() and UpdateFrameStats()
1:22:53Pull out the profiling code in RenderLoop() to InitFrameStats() and UpdateFrameStats()
1:28:38Run it successfully
🏃
1:28:38Run it successfully
🏃
1:28:38Run it successfully
🏃
1:29:04Document the profiling and camera in RenderLoop()
1:29:04Document the profiling and camera in RenderLoop()
1:29:04Document the profiling and camera in RenderLoop()
1:32:21Enable RenderLoop() to test the scene while orbiting and panning the camera
1:32:21Enable RenderLoop() to test the scene while orbiting and panning the camera
1:32:21Enable RenderLoop() to test the scene while orbiting and panning the camera
1:33:32Run it to see our camera orbiting and panning
🏃
1:33:32Run it to see our camera orbiting and panning
🏃
1:33:32Run it to see our camera orbiting and panning
🏃
1:35:01Make PushSimpleScene() confine sprites to their tile
1:35:01Make PushSimpleScene() confine sprites to their tile
1:35:01Make PushSimpleScene() confine sprites to their tile
1:35:28Run it to see our grass sprites confined to their tiles
🏃
1:35:28Run it to see our grass sprites confined to their tiles
🏃
1:35:28Run it to see our grass sprites confined to their tiles
🏃
1:35:38Document our twofold camera test in RenderLoop()
1:35:38Document our twofold camera test in RenderLoop()
1:35:38Document our twofold camera test in RenderLoop()
1:36:46Consider how to package up the camera and render group code from RenderLoop()
🗩
1:36:46Consider how to package up the camera and render group code from RenderLoop()
🗩
1:36:46Consider how to package up the camera and render group code from RenderLoop()
🗩
1:41:23Consider relieving the renderer of using pixel coordinates, in favour of specifying clip rects in −1 to 1 screen space coordinates
🗩
1:41:23Consider relieving the renderer of using pixel coordinates, in favour of specifying clip rects in −1 to 1 screen space coordinates
🗩
1:41:23Consider relieving the renderer of using pixel coordinates, in favour of specifying clip rects in −1 to 1 screen space coordinates
🗩
1:46:31Run the game and note the reason why the debug overlay breaks the alpha compositing
🏃
1:46:31Run the game and note the reason why the debug overlay breaks the alpha compositing
🏃
1:46:31Run the game and note the reason why the debug overlay breaks the alpha compositing
🏃
1:47:39Set up to switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, for the debug system clip rect and the lighting unproject to work in
🏃
1:47:39Set up to switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, for the debug system clip rect and the lighting unproject to work in
🏃
1:47:39Set up to switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, for the debug system clip rect and the lighting unproject to work in
🏃
1:48:17Switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, introducing S32BinormalLerp() and respecifying GetScreenPoint() as GetClipSpacePoint()
1:48:17Switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, introducing S32BinormalLerp() and respecifying GetScreenPoint() as GetClipSpacePoint()
1:48:17Switch the renderer from pixel coordinates to −1 to 1 screen space coordinates, introducing S32BinormalLerp() and respecifying GetScreenPoint() as GetClipSpacePoint()
1:58:51Run it to see that the lighting works, but the debug overlay does not
🏃
1:58:51Run it to see that the lighting works, but the debug overlay does not
🏃
1:58:51Run it to see that the lighting works, but the debug overlay does not
🏃
1:59:59Introduce ClipSpaceFromScreenSpace() to re-enable the debug system clicking
1:59:59Introduce ClipSpaceFromScreenSpace() to re-enable the debug system clicking
1:59:59Introduce ClipSpaceFromScreenSpace() to re-enable the debug system clicking
2:03:57Run it with clicking and clipping back online, and reflect on our improved API
🏃
2:03:57Run it with clicking and clipping back online, and reflect on our improved API
🏃
2:03:57Run it with clicking and clipping back online, and reflect on our improved API
🏃
2:05:41Q&A
🗩
2:05:41Q&A
🗩
2:05:41Q&A
🗩
2:06:30geordish Q: Do you think you will ever get back to 60fps in the debug build, or at least a useable frame rate?
🗪
2:06:30geordish Q: Do you think you will ever get back to 60fps in the debug build, or at least a useable frame rate?
🗪
2:06:30geordish Q: Do you think you will ever get back to 60fps in the debug build, or at least a useable frame rate?
🗪
2:07:45longboolean Q: Do you want the renderer API to have a UI mode, basically a polished version of what the debug display is using now? So no interaction with the lighting system, perhaps using screen space coordinate system, etc. Or is this something that will always be for debug, and 2D stuff will need to be handled by some other means?
🗪
2:07:45longboolean Q: Do you want the renderer API to have a UI mode, basically a polished version of what the debug display is using now? So no interaction with the lighting system, perhaps using screen space coordinate system, etc. Or is this something that will always be for debug, and 2D stuff will need to be handled by some other means?
🗪
2:07:45longboolean Q: Do you want the renderer API to have a UI mode, basically a polished version of what the debug display is using now? So no interaction with the lighting system, perhaps using screen space coordinate system, etc. Or is this something that will always be for debug, and 2D stuff will need to be handled by some other means?
🗪
2:09:09longboolean Q: I mean for the other person who is using your render engine
🗪
2:09:09longboolean Q: I mean for the other person who is using your render engine
🗪
2:09:09longboolean Q: I mean for the other person who is using your render engine
🗪
2:10:08Jim0_o Q: I might have misunderstood but, in the renderer test/demo code I believe you created a function that checked for unoccupied spots but the name said Occupied? PlaceInOccupied I think you called it.
🗪
2:10:08Jim0_o Q: I might have misunderstood but, in the renderer test/demo code I believe you created a function that checked for unoccupied spots but the name said Occupied? PlaceInOccupied I think you called it.
🗪
2:10:08Jim0_o Q: I might have misunderstood but, in the renderer test/demo code I believe you created a function that checked for unoccupied spots but the name said Occupied? PlaceInOccupied I think you called it.
🗪
2:10:15Rename PlaceRandomInOccupied() to PlaceRandomInUnoccupied()
2:10:15Rename PlaceRandomInOccupied() to PlaceRandomInUnoccupied()
2:10:15Rename PlaceRandomInOccupied() to PlaceRandomInUnoccupied()
2:10:59halibetlector Q: On twitter, you said "All user interface design is an adaptive compression problem." What did you mean by that?
🗪
2:10:59halibetlector Q: On twitter, you said "All user interface design is an adaptive compression problem." What did you mean by that?
🗪
2:10:59halibetlector Q: On twitter, you said "All user interface design is an adaptive compression problem." What did you mean by that?
🗪
2:12:57frostyninja Q: Going along with getting rid of unnecessary params, do the camera FOV, aspect ratio and near / far clip need to be passed every frame, or are you going to move them out to a one-time setup call?
🗪
2:12:57frostyninja Q: Going along with getting rid of unnecessary params, do the camera FOV, aspect ratio and near / far clip need to be passed every frame, or are you going to move them out to a one-time setup call?
🗪
2:12:57frostyninja Q: Going along with getting rid of unnecessary params, do the camera FOV, aspect ratio and near / far clip need to be passed every frame, or are you going to move them out to a one-time setup call?
🗪
2:14:04wofiel Q: Minor, but one of your comments had a grammatical error (is → it) around L620?
🗪
2:14:04wofiel Q: Minor, but one of your comments had a grammatical error (is → it) around L620?
🗪
2:14:04wofiel Q: Minor, but one of your comments had a grammatical error (is → it) around L620?
🗪
2:14:34Fix typo in RenderLoop() documentation
2:14:34Fix typo in RenderLoop() documentation
2:14:34Fix typo in RenderLoop() documentation
2:14:47nordicplayer Q: Hey Casey, how can I start with C++?
🗪
2:14:47nordicplayer Q: Hey Casey, how can I start with C++?
🗪
2:14:47nordicplayer Q: Hey Casey, how can I start with C++?
🗪
2:15:54mallesbixie Q: On comments: "use later with to figure out" is a few comments above. The "with" is obsolete
🗪
2:15:54mallesbixie Q: On comments: "use later with to figure out" is a few comments above. The "with" is obsolete
🗪
2:15:54mallesbixie Q: On comments: "use later with to figure out" is a few comments above. The "with" is obsolete
🗪
2:15:59Fix typo in RenderLoop() documentation
2:15:59Fix typo in RenderLoop() documentation
2:15:59Fix typo in RenderLoop() documentation
2:16:52nordicplayer Q: How you manage your dependencies in a C++ project?
🗪
2:16:52nordicplayer Q: How you manage your dependencies in a C++ project?
🗪
2:16:52nordicplayer Q: How you manage your dependencies in a C++ project?
🗪
2:17:25jim0_o Q: Would you consider doing this sort of overhaul on any other parts of the code, like what you've been doing to the renderer?
🗪
2:17:25jim0_o Q: Would you consider doing this sort of overhaul on any other parts of the code, like what you've been doing to the renderer?
🗪
2:17:25jim0_o Q: Would you consider doing this sort of overhaul on any other parts of the code, like what you've been doing to the renderer?
🗪
2:18:55nordicplayer Q: Libraries
🗪
2:18:55nordicplayer Q: Libraries
🗪
2:18:55nordicplayer Q: Libraries
🗪
2:24:35Call it a day1,2
🗩
2:24:35Call it a day1,2
🗩
2:24:35Call it a day1,2
🗩