Handmade Hero»Episode Guide
Modifying Lighting to Use a Spatial Hierarchy
?
?

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:07Recap and set the stage for the day, optimising the lighting
🗩
0:07Recap and set the stage for the day, optimising the lighting
🗩
0:07Recap and set the stage for the day, optimising the lighting
🗩
2:37Consider the intractability of O(n²) algorithms
🗩
2:37Consider the intractability of O(n²) algorithms
🗩
2:37Consider the intractability of O(n²) algorithms
🗩
7:10Consider the kinds of numbers at play in our lighting system, and possible ways to optimise it as it is
🖌
7:10Consider the kinds of numbers at play in our lighting system, and possible ways to optimise it as it is
🖌
7:10Consider the kinds of numbers at play in our lighting system, and possible ways to optimise it as it is
🖌
10:50Standard raycasting acceleration structure, bucketing up lighting elements
🖌
10:50Standard raycasting acceleration structure, bucketing up lighting elements
🖌
10:50Standard raycasting acceleration structure, bucketing up lighting elements
🖌
14:38Ordered traversal of this acceleration structure
🖌
14:38Ordered traversal of this acceleration structure
🖌
14:38Ordered traversal of this acceleration structure
🖌
17:29k-d tree
🖌
17:29k-d tree
🖌
17:29k-d tree
🖌
20:42Multiresolution tree, aggregating lighting elements to produce a plausible, approximate solution
🖌
20:42Multiresolution tree, aggregating lighting elements to produce a plausible, approximate solution
🖌
20:42Multiresolution tree, aggregating lighting elements to produce a plausible, approximate solution
🖌
25:30Consider unifying the spatial partitioning for use by all systems
🗩
25:30Consider unifying the spatial partitioning for use by all systems
🗩
25:30Consider unifying the spatial partitioning for use by all systems
🗩
30:01Create handmade_lighting.h and handmade_lighting.cpp
30:01Create handmade_lighting.h and handmade_lighting.cpp
30:01Create handmade_lighting.h and handmade_lighting.cpp
33:39A few words on separating code into files
🗩
33:39A few words on separating code into files
🗩
33:39A few words on separating code into files
🗩
35:24Continue to populate handmade_lighting.h and #include our new files
35:24Continue to populate handmade_lighting.h and #include our new files
35:24Continue to populate handmade_lighting.h and #include our new files
38:11Run the game to see our lighting solution running not multiresolution, and consider how to split it into pieces
🏃
38:11Run the game to see our lighting solution running not multiresolution, and consider how to split it into pieces
🏃
38:11Run the game to see our lighting solution running not multiresolution, and consider how to split it into pieces
🏃
44:31Augment lighting_box and lighting_solution to support child nodes, and propagate this to LightingTest() and RayCast()
44:31Augment lighting_box and lighting_solution to support child nodes, and propagate this to LightingTest() and RayCast()
44:31Augment lighting_box and lighting_solution to support child nodes, and propagate this to LightingTest() and RayCast()
56:27Run the game and consult the lighting solution data in the profiler
🏃
56:27Run the game and consult the lighting solution data in the profiler
🏃
56:27Run the game and consult the lighting solution data in the profiler
🏃
58:57Begin to enable RayCast() to operate on a spatial partition
58:57Begin to enable RayCast() to operate on a spatial partition
58:57Begin to enable RayCast() to operate on a spatial partition
1:04:00Simplify raycast_result and reorganise RayCast() to handle this
1:04:00Simplify raycast_result and reorganise RayCast() to handle this
1:04:00Simplify raycast_result and reorganise RayCast() to handle this
1:08:38Run the game to see that that didn't much affect our speed
🏃
1:08:38Run the game to see that that didn't much affect our speed
🏃
1:08:38Run the game to see that that didn't much affect our speed
🏃
1:08:57Introduce a new RayCast(), rename the existing one to RayCastRecurse() and continue to enable it to operate on a spatial partition, calling itself recursively
1:08:57Introduce a new RayCast(), rename the existing one to RayCastRecurse() and continue to enable it to operate on a spatial partition, calling itself recursively
1:08:57Introduce a new RayCast(), rename the existing one to RayCastRecurse() and continue to enable it to operate on a spatial partition, calling itself recursively
1:14:10A few words on ray intersection of a convex vs concave solid
🗩
1:14:10A few words on ray intersection of a convex vs concave solid
🗩
1:14:10A few words on ray intersection of a convex vs concave solid
🗩
1:14:50Finish implementing RayCastRecurse()
1:14:50Finish implementing RayCastRecurse()
1:14:50Finish implementing RayCastRecurse()
1:16:22Introduce BuildSpatialPartitionForLighting()
1:16:22Introduce BuildSpatialPartitionForLighting()
1:16:22Introduce BuildSpatialPartitionForLighting()
1:22:30Run the game to see that we're doing okay
🏃
1:22:30Run the game to see that we're doing okay
🏃
1:22:30Run the game to see that we're doing okay
🏃
1:23:05Checking against the backface, to handle the case when a ray originates inside a cube
🖌
1:23:05Checking against the backface, to handle the case when a ray originates inside a cube
🖌
1:23:05Checking against the backface, to handle the case when a ray originates inside a cube
🖌
1:25:48Run the game to confirm that it seems to be working okay
🏃
1:25:48Run the game to confirm that it seems to be working okay
🏃
1:25:48Run the game to confirm that it seems to be working okay
🏃
1:26:52insobot 86 minutes into the main stream. 34 until Q&A. (based on NOTE)
🗪
1:26:52insobot 86 minutes into the main stream. 34 until Q&A. (based on NOTE)
🗪
1:26:52insobot 86 minutes into the main stream. 34 until Q&A. (based on NOTE)
🗪
1:27:08Consider how to build a basic spatial partition
🗩
1:27:08Consider how to build a basic spatial partition
🗩
1:27:08Consider how to build a basic spatial partition
🗩
1:29:33Run the game to see that ComputeLightPropagation takes 148,634,510 cycles
🏃
1:29:33Run the game to see that ComputeLightPropagation takes 148,634,510 cycles
🏃
1:29:33Run the game to see that ComputeLightPropagation takes 148,634,510 cycles
🏃
1:30:04Add BoxTable indirection to lighting_solution, and introduce GetBox()
1:30:04Add BoxTable indirection to lighting_solution, and introduce GetBox()
1:30:04Add BoxTable indirection to lighting_solution, and introduce GetBox()
1:32:43Enable BuildSpatialPartitionForLighting() to loop over our BoxTable
1:32:43Enable BuildSpatialPartitionForLighting() to loop over our BoxTable
1:32:43Enable BuildSpatialPartitionForLighting() to loop over our BoxTable
1:33:43Run the game to see black
🏃
1:33:43Run the game to see black
🏃
1:33:43Run the game to see black
🏃
1:33:54Fix BuildSpatialPartitionForLighting() to loop over the BoxTable after BoxCount has been incremented
1:33:54Fix BuildSpatialPartitionForLighting() to loop over the BoxTable after BoxCount has been incremented
1:33:54Fix BuildSpatialPartitionForLighting() to loop over the BoxTable after BoxCount has been incremented
1:34:21Run the game to see that that's fine and did not appreciably affect our performance
🏃
1:34:21Run the game to see that that's fine and did not appreciably affect our performance
🏃
1:34:21Run the game to see that that's fine and did not appreciably affect our performance
🏃
1:34:44Note that our indirection table allows a single child node to be placed in multiple places
🗩
1:34:44Note that our indirection table allows a single child node to be placed in multiple places
🗩
1:34:44Note that our indirection table allows a single child node to be placed in multiple places
🗩
1:35:39Introduce AddOverlappingBoxes() and SplitBox()
1:35:39Introduce AddOverlappingBoxes() and SplitBox()
1:35:39Introduce AddOverlappingBoxes() and SplitBox()
1:43:14Run the game and note that we are testing against a spatial hierarchy
🏃
1:43:14Run the game and note that we are testing against a spatial hierarchy
🏃
1:43:14Run the game and note that we are testing against a spatial hierarchy
🏃
1:43:43Make PlayWorld() generate 32 screens
1:43:43Make PlayWorld() generate 32 screens
1:43:43Make PlayWorld() generate 32 screens
1:44:13Run the game to see our slowdown
🏃
1:44:13Run the game to see our slowdown
🏃
1:44:13Run the game to see our slowdown
🏃
1:50:06Q&A
🗩
1:50:06Q&A
🗩
1:50:06Q&A
🗩
1:50:43praet_a51 Q: Can you try lighting as it is in a release build?
🗪
1:50:43praet_a51 Q: Can you try lighting as it is in a release build?
🗪
1:50:43praet_a51 Q: Can you try lighting as it is in a release build?
🗪
1:50:56Try to build in release mode
1:50:56Try to build in release mode
1:50:56Try to build in release mode
1:51:17Run the game to see that the O(n²) is too slow
🏃
1:51:17Run the game to see that the O(n²) is too slow
🏃
1:51:17Run the game to see that the O(n²) is too slow
🏃
1:51:39Make PlayWorld() produce fewer rooms
1:51:39Make PlayWorld() produce fewer rooms
1:51:39Make PlayWorld() produce fewer rooms
1:51:51Run the game to see the fine framerate
🏃
1:51:51Run the game to see the fine framerate
🏃
1:51:51Run the game to see the fine framerate
🏃
1:52:44Miblo Q: You mentioned something about the need to handle concave and convex solids differently when raycasting, due to (I believe) the possibility of entering and leaving a single face of a concave solid multiple times. Any chance you could explain a little more how this could affect us if we had concave solids?
🗪
1:52:44Miblo Q: You mentioned something about the need to handle concave and convex solids differently when raycasting, due to (I believe) the possibility of entering and leaving a single face of a concave solid multiple times. Any chance you could explain a little more how this could affect us if we had concave solids?
🗪
1:52:44Miblo Q: You mentioned something about the need to handle concave and convex solids differently when raycasting, due to (I believe) the possibility of entering and leaving a single face of a concave solid multiple times. Any chance you could explain a little more how this could affect us if we had concave solids?
🗪
1:53:01Optimally raycasting a split convex solid, based on its front face
🖌
1:53:01Optimally raycasting a split convex solid, based on its front face
🖌
1:53:01Optimally raycasting a split convex solid, based on its front face
🖌
1:57:58Raycasting a split concave solid
🖌
1:57:58Raycasting a split concave solid
🖌
1:57:58Raycasting a split concave solid
🖌
2:02:35Raycasting against back faces of concave solids may work the same
🖌
2:02:35Raycasting against back faces of concave solids may work the same
🖌
2:02:35Raycasting against back faces of concave solids may work the same
🖌
2:06:16enyo_enev Q: Why did we skip the part with placing cubes over entities such as trees and the hero? And also they should receive light in some way, right?
🗪
2:06:16enyo_enev Q: Why did we skip the part with placing cubes over entities such as trees and the hero? And also they should receive light in some way, right?
🗪
2:06:16enyo_enev Q: Why did we skip the part with placing cubes over entities such as trees and the hero? And also they should receive light in some way, right?
🗪
2:06:43zennmystic Q: We just noticed your 4coder and Milton are colour coordinated. What are the values?
🗪
🎲
2:06:43zennmystic Q: We just noticed your 4coder and Milton are colour coordinated. What are the values?
🗪
🎲
2:06:43zennmystic Q: We just noticed your 4coder and Milton are colour coordinated. What are the values?
🗪
🎲
2:07:45That's it for today
🗩
2:07:45That's it for today
🗩
2:07:45That's it for today
🗩