Handmade Hero»Episode Guide
Assigning Lighting Probe Slots
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
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 Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

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:00Plug Molly Rocket's Discord channel1
🗩
0:00Plug Molly Rocket's Discord channel1
🗩
0:00Plug Molly Rocket's Discord channel1
🗩
1:50Demo our more performant ground cover
🏃
1:50Demo our more performant ground cover
🏃
1:50Demo our more performant ground cover
🏃
3:05Determine to send down lighting probe information, initially gauging the performance of the sampling
🏃
3:05Determine to send down lighting probe information, initially gauging the performance of the sampling
🏃
3:05Determine to send down lighting probe information, initially gauging the performance of the sampling
🏃
6:52Plan to sample pre-fabricated lighting
🗩
6:52Plan to sample pre-fabricated lighting
🗩
6:52Plan to sample pre-fabricated lighting
🗩
10:03Make UpdateAndRenderEntities() draw the light probes as white cubes
10:03Make UpdateAndRenderEntities() draw the light probes as white cubes
10:03Make UpdateAndRenderEntities() draw the light probes as white cubes
10:14See our pure white probes
🏃
10:14See our pure white probes
🏃
10:14See our pure white probes
🏃
10:28Wonder if lighting is enabled
📖
10:28Wonder if lighting is enabled
📖
10:28Wonder if lighting is enabled
📖
11:08Set up to send lighting information to our perfect reflectors
🏃
11:08Set up to send lighting information to our perfect reflectors
🏃
11:08Set up to send lighting information to our perfect reflectors
🏃
12:36Modify lighting_textures for our light probe-based solution, including a voxel lookup
12:36Modify lighting_textures for our light probe-based solution, including a voxel lookup
12:36Modify lighting_textures for our light probe-based solution, including a voxel lookup
19:00Estimate the number of visible light probes
🏃
19:00Estimate the number of visible light probes
🏃
19:00Estimate the number of visible light probes
🏃
19:25Augment lighting_textures with a 128³ LightVoxelIndex
19:25Augment lighting_textures with a 128³ LightVoxelIndex
19:25Augment lighting_textures with a 128³ LightVoxelIndex
23:04Determine to switch the lighting solution away from a push-forward scheme, to a static buffer
📖
23:04Determine to switch the lighting solution away from a push-forward scheme, to a static buffer
📖
23:04Determine to switch the lighting solution away from a push-forward scheme, to a static buffer
📖
25:45Augment game_render_commands with LightProbe data, subsuming lighting_textures
25:45Augment game_render_commands with LightProbe data, subsuming lighting_textures
25:45Augment game_render_commands with LightProbe data, subsuming lighting_textures
28:29Remove PushLighting() and OutputLightingPoints()
28:29Remove PushLighting() and OutputLightingPoints()
28:29Remove PushLighting() and OutputLightingPoints()
31:48Crash on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
31:48Crash on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
31:48Crash on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
32:10Recall what LightingTest() does with the Solution
📖
32:10Recall what LightingTest() does with the Solution
📖
32:10Recall what LightingTest() does with the Solution
📖
33:30Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
33:30Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
33:30Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
33:40Recall that PushLighting() used to help set up the RootBox
📖
33:40Recall that PushLighting() used to help set up the RootBox
📖
33:40Recall that PushLighting() used to help set up the RootBox
📖
34:47Step in to LightingTest() to see that the LightBoxes are not allocated
🏃
34:47Step in to LightingTest() to see that the LightBoxes are not allocated
🏃
34:47Step in to LightingTest() to see that the LightBoxes are not allocated
🏃
35:41Introduce BeginLightingComputation() and rename LightingTest() to EndLightingComputation() for UpdateAndRenderWorld() to call
35:41Introduce BeginLightingComputation() and rename LightingTest() to EndLightingComputation() for UpdateAndRenderWorld() to call
35:41Introduce BeginLightingComputation() and rename LightingTest() to EndLightingComputation() for UpdateAndRenderWorld() to call
41:26Keep open the possibility of making a hardware-based ray tracing solution
🗩
41:26Keep open the possibility of making a hardware-based ray tracing solution
🗩
41:26Keep open the possibility of making a hardware-based ray tracing solution
🗩
42:37Augment game_render_commands with a buffer of lighting_box LightOccluders, and remove LightBox and LightPoint data from render_group
42:37Augment game_render_commands with a buffer of lighting_box LightOccluders, and remove LightBox and LightPoint data from render_group
42:37Augment game_render_commands with a buffer of lighting_box LightOccluders, and remove LightBox and LightPoint data from render_group
46:28Switch PushCube() and EndLightingComputation() over to use our modified data structures
46:28Switch PushCube() and EndLightingComputation() over to use our modified data structures
46:28Switch PushCube() and EndLightingComputation() over to use our modified data structures
51:43Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
51:43Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
51:43Crash again on the GetCenter() call in BuildSpatialPartitionForLighting()
🏃
52:27Begin to make OpenGLInit() allocate our Light buffers
52:27Begin to make OpenGLInit() allocate our Light buffers
52:27Begin to make OpenGLInit() allocate our Light buffers
54:47Hunt in vain for a main memory allocator in the renderer
📖
54:47Hunt in vain for a main memory allocator in the renderer
📖
54:47Hunt in vain for a main memory allocator in the renderer
📖
57:00Augment open_gl with static Light arrays
57:00Augment open_gl with static Light arrays
57:00Augment open_gl with static Light arrays
58:59Make OpenGLBeginFrame() initialise the Light arrays
58:59Make OpenGLBeginFrame() initialise the Light arrays
58:59Make OpenGLBeginFrame() initialise the Light arrays
1:02:13Our GetCenter() crash is resolved
🏃
1:02:13Our GetCenter() crash is resolved
🏃
1:02:13Our GetCenter() crash is resolved
🏃
1:02:39Make BeginLightingComputation() call EnableLighting()
1:02:39Make BeginLightingComputation() call EnableLighting()
1:02:39Make BeginLightingComputation() call EnableLighting()
1:06:03EndLightingComputation takes 14% of our 41ms frame time
🏃
1:06:03EndLightingComputation takes 14% of our 41ms frame time
🏃
1:06:03EndLightingComputation takes 14% of our 41ms frame time
🏃
1:06:32Set up to fill out our light probes
📖
1:06:32Set up to fill out our light probes
📖
1:06:32Set up to fill out our light probes
📖
1:07:57Change UpdateAndRenderEntities() to push our real LightProbeCount onto the debug system, and perform DrawGroundCover() in the main entity loop
1:07:57Change UpdateAndRenderEntities() to push our real LightProbeCount onto the debug system, and perform DrawGroundCover() in the main entity loop
1:07:57Change UpdateAndRenderEntities() to push our real LightProbeCount onto the debug system, and perform DrawGroundCover() in the main entity loop
1:09:47Consider making the light probes persist stably across frames
📖
1:09:47Consider making the light probes persist stably across frames
📖
1:09:47Consider making the light probes persist stably across frames
📖
1:12:12Light probe persistence 1: Locating light probe information according to its index in the entity active set
📖
1:12:12Light probe persistence 1: Locating light probe information according to its index in the entity active set
📖
1:12:12Light probe persistence 1: Locating light probe information according to its index in the entity active set
📖
1:16:26Light probe persistence 2: Keeping a separate list for light probe indices
📖
1:16:26Light probe persistence 2: Keeping a separate list for light probe indices
📖
1:16:26Light probe persistence 2: Keeping a separate list for light probe indices
📖
1:18:32Reacquaint ourselves with the entity registration code
📖
1:18:32Reacquaint ourselves with the entity registration code
📖
1:18:32Reacquaint ourselves with the entity registration code
📖
1:20:04Augment the world with a LightProbeSlots free list
1:20:04Augment the world with a LightProbeSlots free list
1:20:04Augment the world with a LightProbeSlots free list
1:23:44Augment entity with a LightProbeIndex and make CreateWorld() initialise our light probe free list
1:23:44Augment entity with a LightProbeIndex and make CreateWorld() initialise our light probe free list
1:23:44Augment entity with a LightProbeIndex and make CreateWorld() initialise our light probe free list
1:27:36Consider where the light probe free list should live
📖
1:27:36Consider where the light probe free list should live
📖
1:27:36Consider where the light probe free list should live
📖
1:29:55Introduce AssignIndices() and RemoveIndices() for EnsureRegionIsUnpacked() to call
1:29:55Introduce AssignIndices() and RemoveIndices() for EnsureRegionIsUnpacked() to call
1:29:55Introduce AssignIndices() and RemoveIndices() for EnsureRegionIsUnpacked() to call
1:34:26seabass cmuratori You might want to ban the person spamming Twitch chat with stupid crap
🗪
1:34:26seabass cmuratori You might want to ban the person spamming Twitch chat with stupid crap
🗪
1:34:26seabass cmuratori You might want to ban the person spamming Twitch chat with stupid crap
🗪
1:35:16Encourage people not to use Twitch chat
🗩
1:35:16Encourage people not to use Twitch chat
🗩
1:35:16Encourage people not to use Twitch chat
🗩
1:36:48graemephi Subscriber only chat
🗪
1:36:48graemephi Subscriber only chat
🗪
1:36:48graemephi Subscriber only chat
🗪
1:37:19Finish implementing RemoveIndices() and augment entity with a LightProbeClear for FillUnpackedEntity() and UpdateAndRenderEntities() to use
1:37:19Finish implementing RemoveIndices() and augment entity with a LightProbeClear for FillUnpackedEntity() and UpdateAndRenderEntities() to use
1:37:19Finish implementing RemoveIndices() and augment entity with a LightProbeClear for FillUnpackedEntity() and UpdateAndRenderEntities() to use
1:41:22The purpose of clearing light probe slots
🗩
1:41:22The purpose of clearing light probe slots
🗩
1:41:22The purpose of clearing light probe slots
🗩
1:42:49Address Discord spam
🗹
1:42:49Address Discord spam
🗹
1:42:49Address Discord spam
🗹
1:47:32Fix up compile errors, passing the MaxLightProbeCount down to CreateWorld()
🗩
1:47:32Fix up compile errors, passing the MaxLightProbeCount down to CreateWorld()
🗩
1:47:32Fix up compile errors, passing the MaxLightProbeCount down to CreateWorld()
🗩
1:51:57Hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:51:57Hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:51:57Hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:52:34Prevent EnsureRegionIsUnpacked() from calling RemoveIndices(), deleting that function and instead making PackEntity() perform its code
1:52:34Prevent EnsureRegionIsUnpacked() from calling RemoveIndices(), deleting that function and instead making PackEntity() perform its code
1:52:34Prevent EnsureRegionIsUnpacked() from calling RemoveIndices(), deleting that function and instead making PackEntity() perform its code
1:54:31Again hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:54:31Again hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:54:31Again hit our IsLightProbe() assertion in UpdateAndRenderEntities()
🏃
1:55:19Ensure that the UnpackedEntities buffer begins cleared
📖
1:55:19Ensure that the UnpackedEntities buffer begins cleared
📖
1:55:19Ensure that the UnpackedEntities buffer begins cleared
📖
1:56:16Assert in PackEntity() that LightProbeIndex is 0 for non-light probe entities
1:56:16Assert in PackEntity() that LightProbeIndex is 0 for non-light probe entities
1:56:16Assert in PackEntity() that LightProbeIndex is 0 for non-light probe entities
1:56:39Assert in AssignIndices() that LightProbeIndex is 0
1:56:39Assert in AssignIndices() that LightProbeIndex is 0
1:56:39Assert in AssignIndices() that LightProbeIndex is 0
1:57:14Hit our new assertion in AssignIndices()
🏃
1:57:14Hit our new assertion in AssignIndices()
🏃
1:57:14Hit our new assertion in AssignIndices()
🏃
1:58:09Assert in ClearUnpackedEntityCache() that LightProbeIndex is 0, after calling PackEntity()
1:58:09Assert in ClearUnpackedEntityCache() that LightProbeIndex is 0, after calling PackEntity()
1:58:09Assert in ClearUnpackedEntityCache() that LightProbeIndex is 0, after calling PackEntity()
1:58:35Hit our new assertion in AssignIndices(), to see also that LightProbeClear is 1
🏃
1:58:35Hit our new assertion in AssignIndices(), to see also that LightProbeClear is 1
🏃
1:58:35Hit our new assertion in AssignIndices(), to see also that LightProbeClear is 1
🏃
1:58:58Investigate why we are trying to assign an index to an entity that already has one
📖
1:58:58Investigate why we are trying to assign an index to an entity that already has one
📖
1:58:58Investigate why we are trying to assign an index to an entity that already has one
📖
2:00:40Reintroduce RemoveIndices() for PackEntity() and EnsureRegionIsUnpacked() to call
2:00:40Reintroduce RemoveIndices() for PackEntity() and EnsureRegionIsUnpacked() to call
2:00:40Reintroduce RemoveIndices() for PackEntity() and EnsureRegionIsUnpacked() to call
2:01:55Again hit our assertion in AssignIndices()
🏃
2:01:55Again hit our assertion in AssignIndices()
🏃
2:01:55Again hit our assertion in AssignIndices()
🏃
2:04:46Q&A
🗩
2:04:46Q&A
🗩
2:04:46Q&A
🗩
2:07:05somebody_took_my_name Q: Off-topic: How do you parallelize hash functions?2
🗪
2:07:05somebody_took_my_name Q: Off-topic: How do you parallelize hash functions?2
🗪
2:07:05somebody_took_my_name Q: Off-topic: How do you parallelize hash functions?2
🗪
2:10:07xxthebigfoxx Q: How is a hash function like the meowhash useful for game development?
🗪
2:10:07xxthebigfoxx Q: How is a hash function like the meowhash useful for game development?
🗪
2:10:07xxthebigfoxx Q: How is a hash function like the meowhash useful for game development?
🗪
2:10:49pistonminer Q: This is sorta off-topic so if you don't think it's relevant, feel free to disregard. With member functions they're namespaced based on the type, whereas with free functions they're all in the same namespace unless you specifically namespace. (Of course what the compiler generates is identical.) Since you don't use explicit C++ namespaces, as far as I know, do you think this is a problem and, if so, how do you work around it?
🗪
2:10:49pistonminer Q: This is sorta off-topic so if you don't think it's relevant, feel free to disregard. With member functions they're namespaced based on the type, whereas with free functions they're all in the same namespace unless you specifically namespace. (Of course what the compiler generates is identical.) Since you don't use explicit C++ namespaces, as far as I know, do you think this is a problem and, if so, how do you work around it?
🗪
2:10:49pistonminer Q: This is sorta off-topic so if you don't think it's relevant, feel free to disregard. With member functions they're namespaced based on the type, whereas with free functions they're all in the same namespace unless you specifically namespace. (Of course what the compiler generates is identical.) Since you don't use explicit C++ namespaces, as far as I know, do you think this is a problem and, if so, how do you work around it?
🗪
2:11:26thepr1ms Q: Hi Casey, I've missed most of the last few streams. Could you run the game quickly so I can see where we're at?
🗪
2:11:26thepr1ms Q: Hi Casey, I've missed most of the last few streams. Could you run the game quickly so I can see where we're at?
🗪
2:11:26thepr1ms Q: Hi Casey, I've missed most of the last few streams. Could you run the game quickly so I can see where we're at?
🗪
2:11:52EladCiuraru Why not follower only chat?
🗪
2:11:52EladCiuraru Why not follower only chat?
🗪
2:11:52EladCiuraru Why not follower only chat?
🗪
2:14:01sapper123 Q: You could do a 1-day follower limit, or something large
🗪
2:14:01sapper123 Q: You could do a 1-day follower limit, or something large
🗪
2:14:01sapper123 Q: You could do a 1-day follower limit, or something large
🗪
2:14:42culdevu Q: Since we're going off-topic: I was looking at DPI-aware UI and rendering and it seems annoying in win32. I'm usually many years behind trends, so is high-DPI rendering a thing to worry about these days?
🗪
2:14:42culdevu Q: Since we're going off-topic: I was looking at DPI-aware UI and rendering and it seems annoying in win32. I'm usually many years behind trends, so is high-DPI rendering a thing to worry about these days?
🗪
2:14:42culdevu Q: Since we're going off-topic: I was looking at DPI-aware UI and rendering and it seems annoying in win32. I'm usually many years behind trends, so is high-DPI rendering a thing to worry about these days?
🗪
2:15:53Close things down
🗩
2:15:53Close things down
🗩
2:15:53Close things down
🗩