Handmade Hero»Episode Guide
Large to Small Voxel Transfer
?
?

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:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
0:00Recap and set the stage for the day
🗩
1:19Some thoughts on experimental vs clean code
🗩
1:19Some thoughts on experimental vs clean code
🗩
1:19Some thoughts on experimental vs clean code
🗩
3:37Describe our new light_voxel_cell lighting scheme
🗩
3:37Describe our new light_voxel_cell lighting scheme
🗩
3:37Describe our new light_voxel_cell lighting scheme
🗩
6:14Align our lighting voxel grid to the world, augmenting game_mode_world with a FundamentalUnit, and making InitLighting() derive our VoxCellDim from that FundamentalUnit
6:14Align our lighting voxel grid to the world, augmenting game_mode_world with a FundamentalUnit, and making InitLighting() derive our VoxCellDim from that FundamentalUnit
6:14Align our lighting voxel grid to the world, augmenting game_mode_world with a FundamentalUnit, and making InitLighting() derive our VoxCellDim from that FundamentalUnit
12:29See a black screen
🏃
12:29See a black screen
🏃
12:29See a black screen
🏃
12:38Toggle off the lighting in CompileZBiasProgram()
12:38Toggle off the lighting in CompileZBiasProgram()
12:38Toggle off the lighting in CompileZBiasProgram()
12:59Our world generation remains good, but our AlphaMin needs adjusting
🏃
12:59Our world generation remains good, but our AlphaMin needs adjusting
🏃
12:59Our world generation remains good, but our AlphaMin needs adjusting
🏃
15:47Reduce AlphaMin from 2.75 to 2.25 in PlayWorld()
🏃
🖮
15:47Reduce AlphaMin from 2.75 to 2.25 in PlayWorld()
🏃
🖮
15:47Reduce AlphaMin from 2.75 to 2.25 in PlayWorld()
🏃
🖮
17:58Reacquaint ourselves with the entity hopping code
17:58Reacquaint ourselves with the entity hopping code
17:58Reacquaint ourselves with the entity hopping code
21:31Augment the entity struct with a GroundP for UpdateAndRenderEntities() to record, to help stabilise the camera in Z as the player hops around
21:31Augment the entity struct with a GroundP for UpdateAndRenderEntities() to record, to help stabilise the camera in Z as the player hops around
21:31Augment the entity struct with a GroundP for UpdateAndRenderEntities() to record, to help stabilise the camera in Z as the player hops around
24:33See no change to our alpha fading
🏃
24:33See no change to our alpha fading
🏃
24:33See no change to our alpha fading
🏃
24:52Make UpdateCameraForEntityMovement() use our new GroundP
24:52Make UpdateCameraForEntityMovement() use our new GroundP
24:52Make UpdateCameraForEntityMovement() use our new GroundP
25:25Find that our alpha fading remains stable during hopping
🏃
25:25Find that our alpha fading remains stable during hopping
🏃
25:25Find that our alpha fading remains stable during hopping
🏃
26:57Plan to stabilise our alpha / fog across traversables
26:57Plan to stabilise our alpha / fog across traversables
26:57Plan to stabilise our alpha / fog across traversables
29:29Admire our floor heights
🏃
29:29Admire our floor heights
🏃
29:29Admire our floor heights
🏃
30:09Make BeginLightingComputation() compute and draw our LargeVoxelRect and HotVoxelRect
30:09Make BeginLightingComputation() compute and draw our LargeVoxelRect and HotVoxelRect
30:09Make BeginLightingComputation() compute and draw our LargeVoxelRect and HotVoxelRect
43:18Check out our lighting voxels
🏃
43:18Check out our lighting voxels
🏃
43:18Check out our lighting voxels
🏃
43:58Halve the VoxCellDim in InitLighting()
43:58Halve the VoxCellDim in InitLighting()
43:58Halve the VoxCellDim in InitLighting()
44:18Check out our smaller lighting voxels
🏃
44:18Check out our smaller lighting voxels
🏃
44:18Check out our smaller lighting voxels
🏃
44:57Make BeginLightingComputation() centre our lighting voxels
44:57Make BeginLightingComputation() centre our lighting voxels
44:57Make BeginLightingComputation() centre our lighting voxels
45:41See that our HotVoxelRect does not quite cover our whole view
🏃
45:41See that our HotVoxelRect does not quite cover our whole view
🏃
45:41See that our HotVoxelRect does not quite cover our whole view
🏃
46:14Double the VoxCellDim in InitLighting()
46:14Double the VoxCellDim in InitLighting()
46:14Double the VoxCellDim in InitLighting()
46:33See that our HotVoxelRect covers our whole view
🏃
46:33See that our HotVoxelRect covers our whole view
🏃
46:33See that our HotVoxelRect covers our whole view
🏃
47:40Enable the checkerboard lighting
47:40Enable the checkerboard lighting
47:40Enable the checkerboard lighting
47:51Consider our lighting voxel to be too sparse
🏃
47:51Consider our lighting voxel to be too sparse
🏃
47:51Consider our lighting voxel to be too sparse
🏃
48:09Increase the resolution of our lighting voxel
48:09Increase the resolution of our lighting voxel
48:09Increase the resolution of our lighting voxel
49:00Consider our lighting voxel resolution to suffice
🏃
49:00Consider our lighting voxel resolution to suffice
🏃
49:00Consider our lighting voxel resolution to suffice
🏃
49:39Make EndLightingComputation() draw our checkerboard more clearly
49:39Make EndLightingComputation() draw our checkerboard more clearly
49:39Make EndLightingComputation() draw our checkerboard more clearly
50:20Admire our clearer checkerboard, and still consider our lighting voxel resolution to suffice
🏃
50:20Admire our clearer checkerboard, and still consider our lighting voxel resolution to suffice
🏃
50:20Admire our clearer checkerboard, and still consider our lighting voxel resolution to suffice
🏃
51:47Make EndLightingComputation() alternate our checkerboard colours in Z
51:47Make EndLightingComputation() alternate our checkerboard colours in Z
51:47Make EndLightingComputation() alternate our checkerboard colours in Z
52:11Find it tough to gauge the lighting voxel resolution in Z
🏃
52:11Find it tough to gauge the lighting voxel resolution in Z
🏃
52:11Find it tough to gauge the lighting voxel resolution in Z
🏃
52:55Make EndLightingComputation() produce a full 3D checkerboard, disabling trilinear filtering in OpenGLInit()
52:55Make EndLightingComputation() produce a full 3D checkerboard, disabling trilinear filtering in OpenGLInit()
52:55Make EndLightingComputation() produce a full 3D checkerboard, disabling trilinear filtering in OpenGLInit()
57:35See that our checkerboard encompasses our whole view and the lighting voxel is locked to the world, and consider handling offset simulation centre
🏃
57:35See that our checkerboard encompasses our whole view and the lighting voxel is locked to the world, and consider handling offset simulation centre
🏃
57:35See that our checkerboard encompasses our whole view and the lighting voxel is locked to the world, and consider handling offset simulation centre
🏃
59:45Toggle on lighting transfer in EndLightingComputation()
59:45Toggle on lighting transfer in EndLightingComputation()
59:45Toggle on lighting transfer in EndLightingComputation()
1:00:16See black
🏃
1:00:16See black
🏃
1:00:16See black
🏃
1:00:33Establish "Hot" / "Large" voxel nomenclature in EndLightingComputation()
1:00:33Establish "Hot" / "Large" voxel nomenclature in EndLightingComputation()
1:00:33Establish "Hot" / "Large" voxel nomenclature in EndLightingComputation()
1:03:03Still see black
🏃
1:03:03Still see black
🏃
1:03:03Still see black
🏃
1:03:11Begin to make EndLightingComputation() handle Large–to–Hot voxel lighting transfer
1:03:11Begin to make EndLightingComputation() handle Large–to–Hot voxel lighting transfer
1:03:11Begin to make EndLightingComputation() handle Large–to–Hot voxel lighting transfer
1:08:24Find that the copying of our large voxel to the graphics card is working, but our falloff is too steep and the checkerboard alternates with black
🏃
1:08:24Find that the copying of our large voxel to the graphics card is working, but our falloff is too steep and the checkerboard alternates with black
🏃
1:08:24Find that the copying of our large voxel to the graphics card is working, but our falloff is too steep and the checkerboard alternates with black
🏃
1:08:49Investigate the checkerboard blackness in IrradiancePack() and CompileZBiasProgram()
📖
1:08:49Investigate the checkerboard blackness in IrradiancePack() and CompileZBiasProgram()
📖
1:08:49Investigate the checkerboard blackness in IrradiancePack() and CompileZBiasProgram()
📖
1:10:39Make EndLightingComputation() alternate our checkerboard between (7, 7, 7) and (6, 6, 6)
1:10:39Make EndLightingComputation() alternate our checkerboard between (7, 7, 7) and (6, 6, 6)
1:10:39Make EndLightingComputation() alternate our checkerboard between (7, 7, 7) and (6, 6, 6)
1:11:18See the checkerboard exhibit misalignment of our voxels
🏃
1:11:18See the checkerboard exhibit misalignment of our voxels
🏃
1:11:18See the checkerboard exhibit misalignment of our voxels
🏃
1:11:59Fix our lighting falloff in EndLightingComputation()
1:11:59Fix our lighting falloff in EndLightingComputation()
1:11:59Fix our lighting falloff in EndLightingComputation()
1:14:23See our spotlight
🏃
1:14:23See our spotlight
🏃
1:14:23See our spotlight
🏃
1:14:33Enable trilinear filtering in OpenGLInit()
1:14:33Enable trilinear filtering in OpenGLInit()
1:14:33Enable trilinear filtering in OpenGLInit()
1:15:16Admire our smooth lighting falloff
🏃
1:15:16Admire our smooth lighting falloff
🏃
1:15:16Admire our smooth lighting falloff
🏃
1:15:46Make EndLightingComputation() cast a ray from the voxel centre to the light
1:15:46Make EndLightingComputation() cast a ray from the voxel centre to the light
1:15:46Make EndLightingComputation() cast a ray from the voxel centre to the light
1:24:31Consider our ray caster to be doing something around the edges
🏃
1:24:31Consider our ray caster to be doing something around the edges
🏃
1:24:31Consider our ray caster to be doing something around the edges
🏃
1:25:13Reacquaint ourselves with RayCast()
📖
1:25:13Reacquaint ourselves with RayCast()
📖
1:25:13Reacquaint ourselves with RayCast()
📖
1:29:43Leave the ray cast LightDF along and fix the falloff in EndLightingComputation()
1:29:43Leave the ray cast LightDF along and fix the falloff in EndLightingComputation()
1:29:43Leave the ray cast LightDF along and fix the falloff in EndLightingComputation()
1:30:30Our smooth spotlight is back
🏃
1:30:30Our smooth spotlight is back
🏃
1:30:30Our smooth spotlight is back
🏃
1:30:43Set the ray cast LightDF to 0
1:30:43Set the ray cast LightDF to 0
1:30:43Set the ray cast LightDF to 0
1:30:49Consider our ray casting code to never hit anything
🏃
1:30:49Consider our ray casting code to never hit anything
🏃
1:30:49Consider our ray casting code to never hit anything
🏃
1:31:40Make EndLightingComputation() call BuildSpatialPartitionForLighting()
1:31:40Make EndLightingComputation() call BuildSpatialPartitionForLighting()
1:31:40Make EndLightingComputation() call BuildSpatialPartitionForLighting()
1:32:38Admire the freaky answers from our ray casting
🏃
1:32:38Admire the freaky answers from our ray casting
🏃
1:32:38Admire the freaky answers from our ray casting
🏃
1:33:39Augment raycast_result with tRay for callers of RayCast(), such as EndLightingComputation(), to use
1:33:39Augment raycast_result with tRay for callers of RayCast(), such as EndLightingComputation(), to use
1:33:39Augment raycast_result with tRay for callers of RayCast(), such as EndLightingComputation(), to use
1:39:38Consider our RayCast() to be buggy
🏃
1:39:38Consider our RayCast() to be buggy
🏃
1:39:38Consider our RayCast() to be buggy
🏃
1:40:32Debug our RayCast(), making EndLightingComputation() draw our rays
1:40:32Debug our RayCast(), making EndLightingComputation() draw our rays
1:40:32Debug our RayCast(), making EndLightingComputation() draw our rays
1:41:51See no rays
🏃
1:41:51See no rays
🏃
1:41:51See no rays
🏃
1:42:04Move the debug visualisation drawing code to the end of EndLightingComputation()
1:42:04Move the debug visualisation drawing code to the end of EndLightingComputation()
1:42:04Move the debug visualisation drawing code to the end of EndLightingComputation()
1:42:20Still see no rays, noting that it almost works
🏃
1:42:20Still see no rays, noting that it almost works
🏃
1:42:20Still see no rays, noting that it almost works
🏃
1:43:12Enable UpdateDebugLines in InitLighting()
1:43:12Enable UpdateDebugLines in InitLighting()
1:43:12Enable UpdateDebugLines in InitLighting()
1:44:48Hit our assertion in PushDebugLine()
🏃
1:44:48Hit our assertion in PushDebugLine()
🏃
1:44:48Hit our assertion in PushDebugLine()
🏃
1:45:27Restrict our ray cast drawing in EndLightingComputation()
1:45:27Restrict our ray cast drawing in EndLightingComputation()
1:45:27Restrict our ray cast drawing in EndLightingComputation()
1:48:19See our rays
🏃
1:48:19See our rays
🏃
1:48:19See our rays
🏃
1:48:54Make EndLightingComputation() only draw rays that hit something
1:48:54Make EndLightingComputation() only draw rays that hit something
1:48:54Make EndLightingComputation() only draw rays that hit something
1:49:30See our rays which hit something
🏃
1:49:30See our rays which hit something
🏃
1:49:30See our rays which hit something
🏃
1:50:31Make EndLightingComputation() draw the rays from the light source
1:50:31Make EndLightingComputation() draw the rays from the light source
1:50:31Make EndLightingComputation() draw the rays from the light source
1:50:51See our rays emanating from the light source
🏃
1:50:51See our rays emanating from the light source
🏃
1:50:51See our rays emanating from the light source
🏃
1:51:20Disable the ray drawing in EndLightingComputation()
1:51:20Disable the ray drawing in EndLightingComputation()
1:51:20Disable the ray drawing in EndLightingComputation()
1:52:36Q&A
🗩
1:52:36Q&A
🗩
1:52:36Q&A
🗩
1:53:10sagian2005 Q: Shouldn't WorldChunkDimInMeters use FundamentalUnit?
🗪
1:53:10sagian2005 Q: Shouldn't WorldChunkDimInMeters use FundamentalUnit?
🗪
1:53:10sagian2005 Q: Shouldn't WorldChunkDimInMeters use FundamentalUnit?
🗪
1:53:26Make PlayWorld() derive the WorldChunkDimInMeters from the FundamentalUnit
1:53:26Make PlayWorld() derive the WorldChunkDimInMeters from the FundamentalUnit
1:53:26Make PlayWorld() derive the WorldChunkDimInMeters from the FundamentalUnit
1:53:41steamymcfly Q: How about increasing the voxel density and see if that reduces the acne?
🗪
1:53:41steamymcfly Q: How about increasing the voxel density and see if that reduces the acne?
🗪
1:53:41steamymcfly Q: How about increasing the voxel density and see if that reduces the acne?
🗪
1:54:20internationalizationist Q: I am your big fan, and have always been delighted with your… grouchy, in a good (very good) sense. I believe that this is a very useful quality that allows you to look at things and the world with a sober look. Just… I still can’t understand how to develop this quality in myself. Can you advise something? A book? Production OOP programming? Work as Web developer? If you do not mind the time, please give a detailed answer. Thank you!
🗪
1:54:20internationalizationist Q: I am your big fan, and have always been delighted with your… grouchy, in a good (very good) sense. I believe that this is a very useful quality that allows you to look at things and the world with a sober look. Just… I still can’t understand how to develop this quality in myself. Can you advise something? A book? Production OOP programming? Work as Web developer? If you do not mind the time, please give a detailed answer. Thank you!
🗪
1:54:20internationalizationist Q: I am your big fan, and have always been delighted with your… grouchy, in a good (very good) sense. I believe that this is a very useful quality that allows you to look at things and the world with a sober look. Just… I still can’t understand how to develop this quality in myself. Can you advise something? A book? Production OOP programming? Work as Web developer? If you do not mind the time, please give a detailed answer. Thank you!
🗪
2:13:24caseyismyhero1337 Q: Yo Casey, my man, since you're doing everything in C, did you make your website1 also in C? And if so, is it possible to build an entire website from scratch in plain C using no libraries too?
🗪
2:13:24caseyismyhero1337 Q: Yo Casey, my man, since you're doing everything in C, did you make your website1 also in C? And if so, is it possible to build an entire website from scratch in plain C using no libraries too?
🗪
2:13:24caseyismyhero1337 Q: Yo Casey, my man, since you're doing everything in C, did you make your website1 also in C? And if so, is it possible to build an entire website from scratch in plain C using no libraries too?
🗪
2:15:58khrob Q: Do you ever try and measure how much of your current outlook is affected by rose tinted memories? There were great things about using computers in 1992, but I remember having to constantly do things like mess with himem.sys to try and get the most basic of things working… (Not arguing that the current state of things isn't woeful)
🗪
2:15:58khrob Q: Do you ever try and measure how much of your current outlook is affected by rose tinted memories? There were great things about using computers in 1992, but I remember having to constantly do things like mess with himem.sys to try and get the most basic of things working… (Not arguing that the current state of things isn't woeful)
🗪
2:15:58khrob Q: Do you ever try and measure how much of your current outlook is affected by rose tinted memories? There were great things about using computers in 1992, but I remember having to constantly do things like mess with himem.sys to try and get the most basic of things working… (Not arguing that the current state of things isn't woeful)
🗪
2:20:29goban handmade_hero, I feel like this was a pretty recent shift in the zeitgeist too, I remember just 5, 10 years ago everyone was much more excited about tech
🗪
2:20:29goban handmade_hero, I feel like this was a pretty recent shift in the zeitgeist too, I remember just 5, 10 years ago everyone was much more excited about tech
🗪
2:20:29goban handmade_hero, I feel like this was a pretty recent shift in the zeitgeist too, I remember just 5, 10 years ago everyone was much more excited about tech
🗪
2:21:00steamymcfly Q: Which Windows is the best version?
🗪
2:21:00steamymcfly Q: Which Windows is the best version?
🗪
2:21:00steamymcfly Q: Which Windows is the best version?
🗪
2:21:14internationalizationist Q: (About grouch) But when you do something, you do it qualitatively, because you know what quality is. It's cool from a programmer's point of view, that's all I want to say
🗪
2:21:14internationalizationist Q: (About grouch) But when you do something, you do it qualitatively, because you know what quality is. It's cool from a programmer's point of view, that's all I want to say
🗪
2:21:14internationalizationist Q: (About grouch) But when you do something, you do it qualitatively, because you know what quality is. It's cool from a programmer's point of view, that's all I want to say
🗪
2:23:10Brian Q: The state of programming is pretty sad. I was doing some investigating the other day and needed to use Process Monitor to spy on devenv. Randomly looking around, I noticed a big number of events sequentially all calling ReadFile and noticed devenv, it loading a 180k byte config file in 42 calls, each reading about 4k chunks from this file, setting the offset each time
🗪
2:23:10Brian Q: The state of programming is pretty sad. I was doing some investigating the other day and needed to use Process Monitor to spy on devenv. Randomly looking around, I noticed a big number of events sequentially all calling ReadFile and noticed devenv, it loading a 180k byte config file in 42 calls, each reading about 4k chunks from this file, setting the offset each time
🗪
2:23:10Brian Q: The state of programming is pretty sad. I was doing some investigating the other day and needed to use Process Monitor to spy on devenv. Randomly looking around, I noticed a big number of events sequentially all calling ReadFile and noticed devenv, it loading a 180k byte config file in 42 calls, each reading about 4k chunks from this file, setting the offset each time
🗪
2:28:03k2t0f12d Q: What is one thing in programming or tech that can excite you and you think is an improvement (if any)?2
🗪
2:28:03k2t0f12d Q: What is one thing in programming or tech that can excite you and you think is an improvement (if any)?2
🗪
2:28:03k2t0f12d Q: What is one thing in programming or tech that can excite you and you think is an improvement (if any)?2
🗪
2:33:55internationalizationist Q: (Again off-topic) I think I upset you with that question, sorry
🗪
2:33:55internationalizationist Q: (Again off-topic) I think I upset you with that question, sorry
🗪
2:33:55internationalizationist Q: (Again off-topic) I think I upset you with that question, sorry
🗪
2:34:12oliverthebestcat Q: (Off-topic) Do you have any advice for applying for AAA engineering jobs? I've worked on a few indie titles, porting them to consoles (mostly Unity games). I think a lack of C++ work experience is hurting me, but it's hard to get that work experience without previous C++ experience. Any advice?
🗪
2:34:12oliverthebestcat Q: (Off-topic) Do you have any advice for applying for AAA engineering jobs? I've worked on a few indie titles, porting them to consoles (mostly Unity games). I think a lack of C++ work experience is hurting me, but it's hard to get that work experience without previous C++ experience. Any advice?
🗪
2:34:12oliverthebestcat Q: (Off-topic) Do you have any advice for applying for AAA engineering jobs? I've worked on a few indie titles, porting them to consoles (mostly Unity games). I think a lack of C++ work experience is hurting me, but it's hard to get that work experience without previous C++ experience. Any advice?
🗪
2:35:55bulmanator Q: Do you do anything specific to motivate yourself in the world of awful software?
🗪
2:35:55bulmanator Q: Do you do anything specific to motivate yourself in the world of awful software?
🗪
2:35:55bulmanator Q: Do you do anything specific to motivate yourself in the world of awful software?
🗪
2:43:51charsd_ handmade_hero Are you describing technocracy?
🗪
2:43:51charsd_ handmade_hero Are you describing technocracy?
🗪
2:43:51charsd_ handmade_hero Are you describing technocracy?
🗪
2:46:10charsd_ handmade_hero One way to force that idea of excellence is through some form of authoritarianism, but many wouldn't like that
🗪
2:46:10charsd_ handmade_hero One way to force that idea of excellence is through some form of authoritarianism, but many wouldn't like that
🗪
2:46:10charsd_ handmade_hero One way to force that idea of excellence is through some form of authoritarianism, but many wouldn't like that
🗪
2:47:47longboolean Q: What are you talking about Casey, everything we do at our organization is excellent by our definition. No problems here. None at all. And if there are it's not my fault
🗪
2:47:47longboolean Q: What are you talking about Casey, everything we do at our organization is excellent by our definition. No problems here. None at all. And if there are it's not my fault
🗪
2:47:47longboolean Q: What are you talking about Casey, everything we do at our organization is excellent by our definition. No problems here. None at all. And if there are it's not my fault
🗪
2:53:52stewiez1 Arguing about capitalism vs socialism is going backwards
🗪
2:53:52stewiez1 Arguing about capitalism vs socialism is going backwards
🗪
2:53:52stewiez1 Arguing about capitalism vs socialism is going backwards
🗪
2:55:07It has been a pleasure
🗩
2:55:07It has been a pleasure
🗩
2:55:07It has been a pleasure
🗩