Handmade Hero»Episode Guide
Implementing the Grid Raycast Postamble
?
?

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:00Welcome to the stream with a plug of Slipways1
🗩
0:00Welcome to the stream with a plug of Slipways1
🗩
0:00Welcome to the stream with a plug of Slipways1
🗩
0:48Begin to recap the new grid-based raycasting
🗩
0:48Begin to recap the new grid-based raycasting
🗩
0:48Begin to recap the new grid-based raycasting
🗩
1:42Toggle on LIGHTING_USE_FOUR_RAYS (i.e. the tree-based raycaster)
1:42Toggle on LIGHTING_USE_FOUR_RAYS (i.e. the tree-based raycaster)
1:42Toggle on LIGHTING_USE_FOUR_RAYS (i.e. the tree-based raycaster)
1:57Demo the lighting with the determination to reduce the sampling noise and speed it up
🏃
1:57Demo the lighting with the determination to reduce the sampling noise and speed it up
🏃
1:57Demo the lighting with the determination to reduce the sampling noise and speed it up
🏃
2:56Toggle off LIGHTING_USE_FOUR_RAYS mentioning our refusal to use Apple hardware
2:56Toggle off LIGHTING_USE_FOUR_RAYS mentioning our refusal to use Apple hardware
2:56Toggle off LIGHTING_USE_FOUR_RAYS mentioning our refusal to use Apple hardware
3:27GridRayCast() work: 1) Implement the routine correctly
📖
3:27GridRayCast() work: 1) Implement the routine correctly
📖
3:27GridRayCast() work: 1) Implement the routine correctly
📖
3:50GridRayCast() setup work: 2) Produce the ray-direction lookup tables
📖
3:50GridRayCast() setup work: 2) Produce the ray-direction lookup tables
📖
3:50GridRayCast() setup work: 2) Produce the ray-direction lookup tables
📖
4:01GridRayCast() setup work: 3) Grid up our geometry
📖
4:01GridRayCast() setup work: 3) Grid up our geometry
📖
4:01GridRayCast() setup work: 3) Grid up our geometry
📖
4:09Embark on implementing GridRayCast() correctly
4:09Embark on implementing GridRayCast() correctly
4:09Embark on implementing GridRayCast() correctly
7:22Delete archived videos and disable Storage Sense on the streaming machine
🗹
7:22Delete archived videos and disable Storage Sense on the streaming machine
🗹
7:22Delete archived videos and disable Storage Sense on the streaming machine
🗹
9:10Implement the leaf picking in GridRayCast(), introducing lighting_spatial_grid_node and lighting_spatial_grid_leaf
9:10Implement the leaf picking in GridRayCast(), introducing lighting_spatial_grid_node and lighting_spatial_grid_leaf
9:10Implement the leaf picking in GridRayCast(), introducing lighting_spatial_grid_node and lighting_spatial_grid_leaf
12:48Reflect on our grid-based raycaster, comparing it with the tree-based one
📖
12:48Reflect on our grid-based raycaster, comparing it with the tree-based one
📖
12:48Reflect on our grid-based raycaster, comparing it with the tree-based one
📖
14:32SIMD inefficiency considerations, including packing on-demand
📖
14:32SIMD inefficiency considerations, including packing on-demand
📖
14:32SIMD inefficiency considerations, including packing on-demand
📖
16:52Make a note to do a single-leaf spatial structure version
16:52Make a note to do a single-leaf spatial structure version
16:52Make a note to do a single-leaf spatial structure version
17:30Continued SIMD inefficiency considerations when we have between 1 and 3 pieces of data to work with
📖
17:30Continued SIMD inefficiency considerations when we have between 1 and 3 pieces of data to work with
📖
17:30Continued SIMD inefficiency considerations when we have between 1 and 3 pieces of data to work with
📖
19:02Prepare to implement the tRay picking in GridRayCast() using _mm_minpos_epu16()2,3
📖
19:02Prepare to implement the tRay picking in GridRayCast() using _mm_minpos_epu16()2,3
📖
19:02Prepare to implement the tRay picking in GridRayCast() using _mm_minpos_epu16()2,3
📖
24:25Implement the tRay picking in GridRayCast() using _mm_minpos_epu16()4
24:25Implement the tRay picking in GridRayCast() using _mm_minpos_epu16()4
24:25Implement the tRay picking in GridRayCast() using _mm_minpos_epu16()4
32:00Recall platform-specific bugginess of _mm_set1_epi32()5,6,7
📖
32:00Recall platform-specific bugginess of _mm_set1_epi32()5,6,7
📖
32:00Recall platform-specific bugginess of _mm_set1_epi32()5,6,7
📖
39:21Try _mm_set1_epi32() in GridRayCast()
39:21Try _mm_set1_epi32() in GridRayCast()
39:21Try _mm_set1_epi32() in GridRayCast()
41:28Consider a special floating-point comparison circuit to be unnecessary
📖
41:28Consider a special floating-point comparison circuit to be unnecessary
📖
41:28Consider a special floating-point comparison circuit to be unnecessary
📖
44:40charlesbukowski I can confirm that I am in fact not an IEEE expert
🗪
44:40charlesbukowski I can confirm that I am in fact not an IEEE expert
🗪
44:40charlesbukowski I can confirm that I am in fact not an IEEE expert
🗪
44:44Continue to implement versions of tRay picking in GridRayCast(), with and without _mm_cvtepi32_ps()8
44:44Continue to implement versions of tRay picking in GridRayCast(), with and without _mm_cvtepi32_ps()8
44:44Continue to implement versions of tRay picking in GridRayCast(), with and without _mm_cvtepi32_ps()8
52:57Continue to consider special comparison of the top 16-bits of a floating-point value to be unnecessary
📖
52:57Continue to consider special comparison of the top 16-bits of a floating-point value to be unnecessary
📖
52:57Continue to consider special comparison of the top 16-bits of a floating-point value to be unnecessary
📖
53:57Write the HCompShuffler in GridRayCast()9
53:57Write the HCompShuffler in GridRayCast()9
53:57Write the HCompShuffler in GridRayCast()9
1:01:00Learn that _mm_minpos_epu16(), given duplicated input, is documented to return the first matching value10
📖
1:01:00Learn that _mm_minpos_epu16(), given duplicated input, is documented to return the first matching value10
📖
1:01:00Learn that _mm_minpos_epu16(), given duplicated input, is documented to return the first matching value10
📖
1:03:13Write the ShuffleTable in GridRayCast()11
1:03:13Write the ShuffleTable in GridRayCast()11
1:03:13Write the ShuffleTable in GridRayCast()11
1:06:22Fix compile errors in GridRayCast()
1:06:22Fix compile errors in GridRayCast()
1:06:22Fix compile errors in GridRayCast()
1:06:41Check the assembly of _mm_set1_epi32() in Compiler Explorer12 to find that the compiler generates the full broadcast table, rather than our desired broadcast instruction
📖
1:06:41Check the assembly of _mm_set1_epi32() in Compiler Explorer12 to find that the compiler generates the full broadcast table, rather than our desired broadcast instruction
📖
1:06:41Check the assembly of _mm_set1_epi32() in Compiler Explorer12 to find that the compiler generates the full broadcast table, rather than our desired broadcast instruction
📖
1:08:45Manually write out the full ShuffleTable in GridRayCast(), to abandon _mm_set1_epi32()
1:08:45Manually write out the full ShuffleTable in GridRayCast(), to abandon _mm_set1_epi32()
1:08:45Manually write out the full ShuffleTable in GridRayCast(), to abandon _mm_set1_epi32()
1:11:29Reflect on the efficiency of our tRay picking
📖
1:11:29Reflect on the efficiency of our tRay picking
📖
1:11:29Reflect on the efficiency of our tRay picking
📖
1:12:34Move on to the ray hit extraction
📖
1:12:34Move on to the ray hit extraction
📖
1:12:34Move on to the ray hit extraction
📖
1:15:01Correctly implement the ray hit extraction in GridRayCast()13
1:15:01Correctly implement the ray hit extraction in GridRayCast()13
1:15:01Correctly implement the ray hit extraction in GridRayCast()13
1:21:27Introduce PShufB(), with a rant on C++ vs assembly
💢
1:21:27Introduce PShufB(), with a rant on C++ vs assembly
💢
1:21:27Introduce PShufB(), with a rant on C++ vs assembly
💢
1:25:34Introduce Extract0() for GridRayCast() to use14
1:25:34Introduce Extract0() for GridRayCast() to use14
1:25:34Introduce Extract0() for GridRayCast() to use14
1:28:17Continue to implement the ray hit extraction in GridRayCast(), making it set the TransferPPS in a passed-in value
1:28:17Continue to implement the ray hit extraction in GridRayCast(), making it set the TransferPPS in a passed-in value
1:28:17Continue to implement the ray hit extraction in GridRayCast(), making it set the TransferPPS in a passed-in value
1:58:26Change Extract0() to use _mm_cvtss_f32(), and introduce Extract1() and Extract2(), using _mm_extract_ps()15
1:58:26Change Extract0() to use _mm_cvtss_f32(), and introduce Extract1() and Extract2(), using _mm_extract_ps()15
1:58:26Change Extract0() to use _mm_cvtss_f32(), and introduce Extract1() and Extract2(), using _mm_extract_ps()15
2:01:48Get GridRayCast() in a compilable state
2:01:48Get GridRayCast() in a compilable state
2:01:48Get GridRayCast() in a compilable state
2:04:17Q&A
🗩
2:04:17Q&A
🗩
2:04:17Q&A
🗩
2:04:34x1bzzr Q: Jon said you had opinions on signed / unsigned. He said you said "maybe it's the wrong complication to have". Do you know what he was referring to and, if so, can you elaborate?
🗪
2:04:34x1bzzr Q: Jon said you had opinions on signed / unsigned. He said you said "maybe it's the wrong complication to have". Do you know what he was referring to and, if so, can you elaborate?
🗪
2:04:34x1bzzr Q: Jon said you had opinions on signed / unsigned. He said you said "maybe it's the wrong complication to have". Do you know what he was referring to and, if so, can you elaborate?
🗪
2:07:08sholofly Q: Are you familiar with Home Assistant?
🗪
2:07:08sholofly Q: Are you familiar with Home Assistant?
🗪
2:07:08sholofly Q: Are you familiar with Home Assistant?
🗪
2:07:19hubco Q: Are there alternatives to inline assembly other than intrinsic?
🗪
2:07:19hubco Q: Are there alternatives to inline assembly other than intrinsic?
🗪
2:07:19hubco Q: Are there alternatives to inline assembly other than intrinsic?
🗪
2:08:02bogez57 Q: Hey Casey, on episode 300-ish you mentioned that OpenGL 4.5 is much closer to a good graphics API then something like Vulcan. I'm wondering if other developers you know agree with you on this and if so, then why would something like Vulkan get support? Who exactly makes the design / adoption decisions for these kinds of technologies? Do developers have any say?
🗪
2:08:02bogez57 Q: Hey Casey, on episode 300-ish you mentioned that OpenGL 4.5 is much closer to a good graphics API then something like Vulcan. I'm wondering if other developers you know agree with you on this and if so, then why would something like Vulkan get support? Who exactly makes the design / adoption decisions for these kinds of technologies? Do developers have any say?
🗪
2:08:02bogez57 Q: Hey Casey, on episode 300-ish you mentioned that OpenGL 4.5 is much closer to a good graphics API then something like Vulcan. I'm wondering if other developers you know agree with you on this and if so, then why would something like Vulkan get support? Who exactly makes the design / adoption decisions for these kinds of technologies? Do developers have any say?
🗪
2:10:04mindmark42 Q: Why is it slow for the CPU to do horizontal SIMD operations?
🗪
2:10:04mindmark42 Q: Why is it slow for the CPU to do horizontal SIMD operations?
🗪
2:10:04mindmark42 Q: Why is it slow for the CPU to do horizontal SIMD operations?
🗪
2:10:39"Slow" → What does this mean?
🖌
2:10:39"Slow" → What does this mean?
🖌
2:10:39"Slow" → What does this mean?
🖌
2:12:09Horizontal Operations = High Latency
🖌
2:12:09Horizontal Operations = High Latency
🖌
2:12:09Horizontal Operations = High Latency
🖌
2:15:35_mm_minpos_epu16() and _mm_hadd_epi32() as horizontal operations16
📖
2:15:35_mm_minpos_epu16() and _mm_hadd_epi32() as horizontal operations16
📖
2:15:35_mm_minpos_epu16() and _mm_hadd_epi32() as horizontal operations16
📖
2:17:52hubco Q: Wouldn't you use Vulkan for cross platform?
🗪
2:17:52hubco Q: Wouldn't you use Vulkan for cross platform?
🗪
2:17:52hubco Q: Wouldn't you use Vulkan for cross platform?
🗪
2:19:29Close everything down with a plug of the Meow the Infinite printed comic Kickstarter17 and a further mention of Slipways18
🗩
2:19:29Close everything down with a plug of the Meow the Infinite printed comic Kickstarter17 and a further mention of Slipways18
🗩
2:19:29Close everything down with a plug of the Meow the Infinite printed comic Kickstarter17 and a further mention of Slipways18
🗩