Handmade Hero»Episode Guide
Adding Raycasting to the Lighting
?
?

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:17Recap and set the stage for the day
0:17Recap and set the stage for the day
0:17Recap and set the stage for the day
1:35Run the game and consider how we can improve the lighting quality
1:35Run the game and consider how we can improve the lighting quality
1:35Run the game and consider how we can improve the lighting quality
3:36Determine to work on directional shadowing or light bleeding
3:36Determine to work on directional shadowing or light bleeding
3:36Determine to work on directional shadowing or light bleeding
7:55Light transference between reflectors
7:55Light transference between reflectors
7:55Light transference between reflectors
13:04Blackboard: Cube mapped reflectors
13:04Blackboard: Cube mapped reflectors
13:04Blackboard: Cube mapped reflectors
17:16Gesture wildlyα
17:16Gesture wildlyα
17:16Gesture wildlyα
17:50Blackboard: The magic of the Z-buffer
17:50Blackboard: The magic of the Z-buffer
17:50Blackboard: The magic of the Z-buffer
20:14Blackboard: Emulating the effects of a Z-buffer in the lighting system
20:14Blackboard: Emulating the effects of a Z-buffer in the lighting system
20:14Blackboard: Emulating the effects of a Z-buffer in the lighting system
23:42Blackboard: Casting cones
23:42Blackboard: Casting cones
23:42Blackboard: Casting cones
26:23Blackboard: Ray / Plane Intersection
26:23Blackboard: Ray / Plane Intersection
26:23Blackboard: Ray / Plane Intersection
34:54Blackboard: Modelling reflectors as disks for the purposes of shadowing
34:54Blackboard: Modelling reflectors as disks for the purposes of shadowing
34:54Blackboard: Modelling reflectors as disks for the purposes of shadowing
42:16Determine to pick one reflector on which to do the computations
42:16Determine to pick one reflector on which to do the computations
42:16Determine to pick one reflector on which to do the computations
44:17Welcome votes to be freely cast in the chatβ
44:17Welcome votes to be freely cast in the chatβ
44:17Welcome votes to be freely cast in the chatβ
44:29On democracy...γ
44:29On democracy...γ
44:29On democracy...γ
44:52...and oppressionδ
44:52...and oppressionδ
44:52...and oppressionδ
44:58handmade_render_group.cpp: Enable LightingTest() to pick and highlight a reflector for us to use
44:58handmade_render_group.cpp: Enable LightingTest() to pick and highlight a reflector for us to use
44:58handmade_render_group.cpp: Enable LightingTest() to pick and highlight a reflector for us to use
49:43Run the game and find our picked reflector
49:43Run the game and find our picked reflector
49:43Run the game and find our picked reflector
52:10handmade_render_group.cpp: Enable LightingTest() to isolate our test reflector in the compute lighting path
52:10handmade_render_group.cpp: Enable LightingTest() to isolate our test reflector in the compute lighting path
52:10handmade_render_group.cpp: Enable LightingTest() to isolate our test reflector in the compute lighting path
54:35Run the game and see that our test reflector didn't bleed out any light
54:35Run the game and see that our test reflector didn't bleed out any light
54:35Run the game and see that our test reflector didn't bleed out any light
56:10handmade_render_group.cpp: Enable LightingTest() to strengthen the yellow of our test reflector and run the game
56:10handmade_render_group.cpp: Enable LightingTest() to strengthen the yellow of our test reflector and run the game
56:10handmade_render_group.cpp: Enable LightingTest() to strengthen the yellow of our test reflector and run the game
57:17handmade_render_group.cpp: Enable LightingTest() to cast rays from our test reflector out into the scene
57:17handmade_render_group.cpp: Enable LightingTest() to cast rays from our test reflector out into the scene
57:17handmade_render_group.cpp: Enable LightingTest() to cast rays from our test reflector out into the scene
1:02:18Blackboard: Casting rays from the reflector
1:02:18Blackboard: Casting rays from the reflector
1:02:18Blackboard: Casting rays from the reflector
1:03:08handmade_render_group.cpp: Continue to enable LightingTest() to cast rays from our reflector
1:03:08handmade_render_group.cpp: Continue to enable LightingTest() to cast rays from our reflector
1:03:08handmade_render_group.cpp: Continue to enable LightingTest() to cast rays from our reflector
1:06:02Blackboard: Computing the intersection point of a ray with the plane of a reflector
1:06:02Blackboard: Computing the intersection point of a ray with the plane of a reflector
1:06:02Blackboard: Computing the intersection point of a ray with the plane of a reflector
1:07:24handmade_render_group.cpp: Start to enable LightingTest() to determine whether reflectors intersect
1:07:24handmade_render_group.cpp: Start to enable LightingTest() to determine whether reflectors intersect
1:07:24handmade_render_group.cpp: Start to enable LightingTest() to determine whether reflectors intersect
1:09:54Blackboard: Determining whether reflectors intersect
1:09:54Blackboard: Determining whether reflectors intersect
1:09:54Blackboard: Determining whether reflectors intersect
1:10:27handmade_render_group.cpp: Finish enabling LightingTest() to determine whether reflectors intersect and then compute shadowing for them
1:10:27handmade_render_group.cpp: Finish enabling LightingTest() to determine whether reflectors intersect and then compute shadowing for them
1:10:27handmade_render_group.cpp: Finish enabling LightingTest() to determine whether reflectors intersect and then compute shadowing for them
1:15:57Run the game to see that our test reflector is black
1:15:57Run the game to see that our test reflector is black
1:15:57Run the game to see that our test reflector is black
1:16:55handmade_world_mode.cp: Toggle off the hero's body and run the game again to see that our light does not affect the reflector
1:16:55handmade_world_mode.cp: Toggle off the hero's body and run the game again to see that our light does not affect the reflector
1:16:55handmade_world_mode.cp: Toggle off the hero's body and run the game again to see that our light does not affect the reflector
1:18:04handmade_world_mode.cpp: Increase the radius passed to PushLight() by UpdateAndRenderWorld()
1:18:04handmade_world_mode.cpp: Increase the radius passed to PushLight() by UpdateAndRenderWorld()
1:18:04handmade_world_mode.cpp: Increase the radius passed to PushLight() by UpdateAndRenderWorld()
1:19:18Step in to LightingTest() to inspect what it does
1:19:18Step in to LightingTest() to inspect what it does
1:19:18Step in to LightingTest() to inspect what it does
1:20:20handmade_render_group.cpp: Make LightingTest() only cast rays out of the front of our reflector
1:20:20handmade_render_group.cpp: Make LightingTest() only cast rays out of the front of our reflector
1:20:20handmade_render_group.cpp: Make LightingTest() only cast rays out of the front of our reflector
1:21:15Run the game to see that our light does light up our test reflector
1:21:15Run the game to see that our light does light up our test reflector
1:21:15Run the game to see that our light does light up our test reflector
1:21:54handmade_render_group.cpp: Try running the ray casting on everybody
1:21:54handmade_render_group.cpp: Try running the ray casting on everybody
1:21:54handmade_render_group.cpp: Try running the ray casting on everybody
1:22:38Run the game to see everyone apparently unlit
1:22:38Run the game to see everyone apparently unlit
1:22:38Run the game to see everyone apparently unlit
1:23:13handmade_render_group.cpp: Make LightingTest() cast out eight rays in many directions
1:23:13handmade_render_group.cpp: Make LightingTest() cast out eight rays in many directions
1:23:13handmade_render_group.cpp: Make LightingTest() cast out eight rays in many directions
1:25:24Run the game to see reflectors getting lit up
1:25:24Run the game to see reflectors getting lit up
1:25:24Run the game to see reflectors getting lit up
1:26:49handmade_render_group.cpp: Enable LightingTest() to perform cone-based ray tracing
1:26:49handmade_render_group.cpp: Enable LightingTest() to perform cone-based ray tracing
1:26:49handmade_render_group.cpp: Enable LightingTest() to perform cone-based ray tracing
1:27:56Run the game to see more pick-up of the light
1:27:56Run the game to see more pick-up of the light
1:27:56Run the game to see more pick-up of the light
1:28:55Blackboard: Needing to determine how much of a cone is being intersected
1:28:55Blackboard: Needing to determine how much of a cone is being intersected
1:28:55Blackboard: Needing to determine how much of a cone is being intersected
1:31:53handmade_render_group.cpp: Make LightingTest() generate 32 rays pointing in random directions
1:31:53handmade_render_group.cpp: Make LightingTest() generate 32 rays pointing in random directions
1:31:53handmade_render_group.cpp: Make LightingTest() generate 32 rays pointing in random directions
1:35:33Run the game to see the ray traced lighting, and increase the number of rays
1:35:33Run the game to see the ray traced lighting, and increase the number of rays
1:35:33Run the game to see the ray traced lighting, and increase the number of rays
1:38:20handmade_render_group.cpp: Reduce the number of rays to 16
1:38:20handmade_render_group.cpp: Reduce the number of rays to 16
1:38:20handmade_render_group.cpp: Reduce the number of rays to 16
1:40:17Step in to LightingTest() and inspect the rays
1:40:17Step in to LightingTest() and inspect the rays
1:40:17Step in to LightingTest() and inspect the rays
1:42:29handmade_render_group.cpp: Enable LightingTest() to cast narrow cones, and run the game
1:42:29handmade_render_group.cpp: Enable LightingTest() to cast narrow cones, and run the game
1:42:29handmade_render_group.cpp: Enable LightingTest() to cast narrow cones, and run the game
1:43:49handmade_render_group.cpp: Enable LightingTest() to direct rays more cleverly
1:43:49handmade_render_group.cpp: Enable LightingTest() to direct rays more cleverly
1:43:49handmade_render_group.cpp: Enable LightingTest() to direct rays more cleverly
1:46:56Run the game and note that we are getting a real shadowing solution now
1:46:56Run the game and note that we are getting a real shadowing solution now
1:46:56Run the game and note that we are getting a real shadowing solution now
1:48:22handmade_brain.cpp: Make ExecuteBrain() clamp the spring down
1:48:22handmade_brain.cpp: Make ExecuteBrain() clamp the spring down
1:48:22handmade_brain.cpp: Make ExecuteBrain() clamp the spring down
1:50:49Run the game and look at our lighting solution
1:50:49Run the game and look at our lighting solution
1:50:49Run the game and look at our lighting solution
1:52:09handmade_world_mode.cpp: Make AddStandardRoom() build a second wall
1:52:09handmade_world_mode.cpp: Make AddStandardRoom() build a second wall
1:52:09handmade_world_mode.cpp: Make AddStandardRoom() build a second wall
1:53:05Run the game to see how the walls occlude and reflect the light, with different numbers of lighting passes
1:53:05Run the game to see how the walls occlude and reflect the light, with different numbers of lighting passes
1:53:05Run the game to see how the walls occlude and reflect the light, with different numbers of lighting passes
1:56:06handmade_world_mode.cpp: Make AddStandardRoom() build different coloured walls
1:56:06handmade_world_mode.cpp: Make AddStandardRoom() build different coloured walls
1:56:06handmade_world_mode.cpp: Make AddStandardRoom() build different coloured walls
1:56:47Run the game to see how the two walls behave in the light
1:56:47Run the game to see how the two walls behave in the light
1:56:47Run the game to see how the two walls behave in the light
1:57:44handmade_render_group.cpp: Make LightingTest() increase the max emission
1:57:44handmade_render_group.cpp: Make LightingTest() increase the max emission
1:57:44handmade_render_group.cpp: Make LightingTest() increase the max emission
1:58:17Run the game to see the brighter light
1:58:17Run the game to see the brighter light
1:58:17Run the game to see the brighter light
2:00:18Q&A
🗩
2:00:18Q&A
🗩
2:00:18Q&A
🗩
2:01:08qwindoo Are there engine features or ideas that emerged during the Handmade Hero streams and that you've since "backported" to the 1935 engine?
🗪
2:01:08qwindoo Are there engine features or ideas that emerged during the Handmade Hero streams and that you've since "backported" to the 1935 engine?
🗪
2:01:08qwindoo Are there engine features or ideas that emerged during the Handmade Hero streams and that you've since "backported" to the 1935 engine?
🗪
2:02:45Miblo For the random series you picked (at random) 1234. Could it have made any sense to pick 360 there, for 360 degrees, or would absolutely any number do?
🗪
2:02:45Miblo For the random series you picked (at random) 1234. Could it have made any sense to pick 360 there, for 360 degrees, or would absolutely any number do?
🗪
2:02:45Miblo For the random series you picked (at random) 1234. Could it have made any sense to pick 360 there, for 360 degrees, or would absolutely any number do?
🗪
2:05:39paulygon104 Probably the ingest server hiccuped or something
🗪
2:05:39paulygon104 Probably the ingest server hiccuped or something
🗪
2:05:39paulygon104 Probably the ingest server hiccuped or something
🗪
2:07:12mtsmox I think you can keep files open in visual studio by clicking the icon next to the close icon
🗪
2:07:12mtsmox I think you can keep files open in visual studio by clicking the icon next to the close icon
🗪
2:07:12mtsmox I think you can keep files open in visual studio by clicking the icon next to the close icon
🗪
2:09:49bigfellahull Tools > Options > Environment > Tabs and Windows > deselect allow new files to be opened in preview tab
🗪
2:09:49bigfellahull Tools > Options > Environment > Tabs and Windows > deselect allow new files to be opened in preview tab
🗪
2:09:49bigfellahull Tools > Options > Environment > Tabs and Windows > deselect allow new files to be opened in preview tab
🗪
2:10:36bigfellahull Not related to lighting but I've been catching up with the multithreaded sim regions tonight and noticed that we never unset the entity active flag if an entity is not contained in the updatable bounds
🗪
2:10:36bigfellahull Not related to lighting but I've been catching up with the multithreaded sim regions tonight and noticed that we never unset the entity active flag if an entity is not contained in the updatable bounds
🗪
2:10:36bigfellahull Not related to lighting but I've been catching up with the multithreaded sim regions tonight and noticed that we never unset the entity active flag if an entity is not contained in the updatable bounds
🗪
2:11:58handmade_sim_region.cpp: Enable BeginWorldChange() to clear the EntityFlag->Active
2:11:58handmade_sim_region.cpp: Enable BeginWorldChange() to clear the EntityFlag->Active
2:11:58handmade_sim_region.cpp: Enable BeginWorldChange() to clear the EntityFlag->Active
2:13:27handmade_world_mode.cpp: Let PlayWorld() call AddMonstar() and run the game
2:13:27handmade_world_mode.cpp: Let PlayWorld() call AddMonstar() and run the game
2:13:27handmade_world_mode.cpp: Let PlayWorld() call AddMonstar() and run the game
2:13:58handmade_world_mode.cpp: Let PlayWorld() put the snake in the world, and run the game to say hello to it
2:13:58handmade_world_mode.cpp: Let PlayWorld() put the snake in the world, and run the game to say hello to it
2:13:58handmade_world_mode.cpp: Let PlayWorld() put the snake in the world, and run the game to say hello to it
2:15:51handmade_entity.h and *.cpp: Add a Light entity_visible_piece_flag and make UpdateAndRenderEntities() call PushLight()
2:15:51handmade_entity.h and *.cpp: Add a Light entity_visible_piece_flag and make UpdateAndRenderEntities() call PushLight()
2:15:51handmade_entity.h and *.cpp: Add a Light entity_visible_piece_flag and make UpdateAndRenderEntities() call PushLight()
2:18:32handmade_world_mode.cpp: Introduce AddPieceLight()
2:18:32handmade_world_mode.cpp: Introduce AddPieceLight()
2:18:32handmade_world_mode.cpp: Introduce AddPieceLight()
2:20:47handmade_world_mode.cpp: Make AddSnakeSegment() call AddPieceLight()
2:20:47handmade_world_mode.cpp: Make AddSnakeSegment() call AddPieceLight()
2:20:47handmade_world_mode.cpp: Make AddSnakeSegment() call AddPieceLight()
2:22:09Run the game to see the lit up snake
2:22:09Run the game to see the lit up snake
2:22:09Run the game to see the lit up snake
2:24:16Run the game and note that our lighting scheme does not incur a cost per light source
2:24:16Run the game and note that our lighting scheme does not incur a cost per light source
2:24:16Run the game and note that our lighting scheme does not incur a cost per light source
2:25:54handmade_render_group.cpp: Enable LightingTest() to distribute light with no occlusion after some iterations, and run the game
2:25:54handmade_render_group.cpp: Enable LightingTest() to distribute light with no occlusion after some iterations, and run the game
2:25:54handmade_render_group.cpp: Enable LightingTest() to distribute light with no occlusion after some iterations, and run the game
2:28:43Brian ctray license question. May I continuously update my GitHub branch of your timer (ctray) code from Handmade Hero, until you say otherwise, meaning you are preemptively giving unlicense / public domain to any further code in that folder? Would you prefer I ask every time for permission so you don't need to worry? I can do whichever is more convenient to you
🗪
2:28:43Brian ctray license question. May I continuously update my GitHub branch of your timer (ctray) code from Handmade Hero, until you say otherwise, meaning you are preemptively giving unlicense / public domain to any further code in that folder? Would you prefer I ask every time for permission so you don't need to worry? I can do whichever is more convenient to you
🗪
2:28:43Brian ctray license question. May I continuously update my GitHub branch of your timer (ctray) code from Handmade Hero, until you say otherwise, meaning you are preemptively giving unlicense / public domain to any further code in that folder? Would you prefer I ask every time for permission so you don't need to worry? I can do whichever is more convenient to you
🗪
2:29:14Close it down
🗩
2:29:14Close it down
🗩
2:29:14Close it down
🗩