@woosh/meep-engine 3.59.0 → 3.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/package.json +1 -1
  2. package/src/shade/playground/probe_clipmap/index.html +12 -0
  3. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
  4. package/src/shade/playground/probe_clipmap/main.js +5 -0
  5. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  6. package/src/shade/renderer/Renderer.js +4 -6
  7. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
  8. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  9. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
  10. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
  11. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  12. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
  13. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
  14. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
  15. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
  16. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
  17. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
  18. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
  19. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
  20. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
  21. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
  22. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
  23. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
  24. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
  25. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
  26. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
  27. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
  28. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
  29. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
  30. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
  31. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
  32. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
  33. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
  34. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
  35. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
  36. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
  37. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
  38. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
  39. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
  40. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
  41. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
  42. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
  43. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
  44. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
  45. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +3 -9
  46. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  47. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +13 -31
  48. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +764 -48
  49. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
  50. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
  51. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  52. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
  53. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
  54. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  55. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
  56. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +11 -3
  57. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
  58. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +13 -4
  59. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -18
  60. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  61. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -10
  62. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
  63. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
  64. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
  65. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
  66. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  67. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
  68. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
  69. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
  70. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
  71. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -8
  72. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
  73. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -9
  74. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
  75. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
  76. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
  77. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -1
  78. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
  79. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -1
  80. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
  81. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
  82. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
  83. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
  84. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
  85. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
  86. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
  87. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
  88. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
  89. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
  90. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
  91. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
  92. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
  93. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
  94. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
  95. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
  96. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
  97. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
  98. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
  99. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
  100. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
  101. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +21 -18
  102. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +254 -73
  104. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +149 -8
  105. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  106. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +181 -13
  107. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +179 -7
  108. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +412 -31
  110. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +4 -4
  111. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
  112. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +4 -3
  113. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +36 -10
  114. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  115. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +218 -29
  116. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +5 -1
  117. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  118. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +24 -14
  119. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
  120. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  121. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
  122. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
  123. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
  124. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
  125. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +18 -7
  126. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
  127. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +157 -51
  128. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
  129. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
  130. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
  131. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
  132. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
  133. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
  134. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
  135. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
  136. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
  137. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
  138. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +16 -3
  139. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
  140. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +55 -10
  141. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
  142. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  143. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
  144. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +4 -8
  145. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  146. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +21 -36
  147. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
  148. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  149. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +100 -30
  150. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
  151. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
  152. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
  153. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +3 -2
  154. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
  155. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +12 -12
  156. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
  157. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
  158. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
  159. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
  160. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
  161. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
  162. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
  163. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
  164. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
  165. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
  166. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
  167. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
  168. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
  169. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
  170. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
  171. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
  172. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
  173. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
  174. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
  175. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
  176. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
  177. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
  178. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
  179. package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
  180. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
  181. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  182. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
  183. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
  184. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  185. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
  186. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
  187. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
  188. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
  189. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
  190. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
  191. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
  192. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
  193. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  194. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
  195. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
  196. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
  197. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
  198. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
  199. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
  200. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
  201. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
  202. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
  203. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  204. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
  205. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
  206. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
  207. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
  208. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
  209. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
  210. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
  211. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
  212. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
  213. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
  214. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
  215. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
  216. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
  217. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
  218. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
  219. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
  220. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
  221. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
  222. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
  223. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
  224. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
  225. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
  226. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
  227. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
  228. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
  229. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
  230. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
  231. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
  232. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
  233. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
  234. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
  235. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
  236. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  237. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
  238. package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
  239. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
  241. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
  242. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  243. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
  244. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
  245. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
  246. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
  247. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
  248. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
  249. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
  250. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
  251. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
  252. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
  253. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
  254. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
  255. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
  256. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  257. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
  258. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  259. package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
  260. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  261. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +39 -18
  262. package/src/view/elements/progress/segmented/GhostTrail.d.ts +56 -0
  263. package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
  264. package/src/view/elements/progress/segmented/GhostTrail.js +98 -0
  265. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
  266. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
  267. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
  268. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
  269. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
  270. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
  271. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
  272. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
  273. package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
  274. package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
  275. package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
  276. package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
  277. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +155 -10
  278. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  279. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +427 -101
  280. package/src/view/elements/progress/segmented/playground/index.html +78 -0
  281. package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
  282. package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
  283. package/src/view/elements/progress/segmented/playground/main.js +173 -0
  284. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
  285. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
  286. package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
  287. package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
  288. package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
  289. package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
  290. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
  291. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
  292. package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
  293. package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -238
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +0 -99
  298. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +0 -1
  299. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +0 -139
  300. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +0 -65
  301. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +0 -1
  302. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +0 -393
  303. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +0 -17
  304. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +0 -1
  305. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +0 -36
  306. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +0 -29
  307. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +0 -1
  308. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +0 -108
  309. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +0 -31
  310. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +0 -1
  311. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +0 -113
  312. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +0 -36
  313. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +0 -1
  314. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +0 -85
  315. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +0 -23
  316. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +0 -1
  317. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +0 -273
  318. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +0 -13
  319. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +0 -1
  320. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +0 -151
  321. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +0 -13
  322. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +0 -1
  323. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +0 -133
  324. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +0 -22
  325. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +0 -1
  326. package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +0 -135
@@ -1,188 +1,387 @@
1
- import { FrameGraph } from "../../../../engine/graphics/render/frame_graph/FrameGraph.js";
2
- import { ShadeGPUCommandContext } from "../../../device/ShadeGPUCommandContext.js";
3
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
4
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
5
- import { graph_inspect_gpu_buffer } from "../../buffer/graph_inspect_gpu_buffer.js";
6
- import { graph_import_typed_buffer } from "../../shader/graph/graph_import_typed_buffer.js";
7
- import { SORT_TILE_SIZE } from "./defs.js";
8
- import { graph_radix_sort } from "./graph_radix_sort.js";
9
-
10
- /**
11
- * The element counts one run covers. The interesting ones are all at tile boundaries — the scatter's
12
- * tail tile is padded, and a count one either side of an exact multiple is what exercises the
13
- * padding guard from both directions.
14
- *
15
- * @type {number[]}
16
- */
17
- const ELEMENT_COUNTS = [
18
- 2, 3, 255, 256, 257,
19
- SORT_TILE_SIZE - 1, SORT_TILE_SIZE, SORT_TILE_SIZE + 1,
20
- SORT_TILE_SIZE * 4 + 13,
21
- 100003,
22
- ];
23
-
24
- /**
25
- * @param {number} seed
26
- * @returns {function(): number} LCG, so a failing run is reproducible
27
- */
28
- function make_random(seed) {
29
- let state = seed >>> 0;
30
-
31
- return () => (state = (state * 1664525 + 1013904223) >>> 0);
32
- }
33
-
34
- /**
35
- * The key distribution for one case. Three shapes, because a radix sort fails differently under
36
- * each: dense duplicates stress stability and the in-tile split's equal-digit runs, a single
37
- * repeated key makes every tile one bin, and full-range keys are the only ones that reach the top
38
- * digit pass at all.
39
- *
40
- * @param {number} element_count
41
- * @param {number} variant
42
- * @returns {Uint32Array}
43
- */
44
- function make_keys(element_count, variant) {
45
- const random = make_random(0x9e3779b9 ^ (element_count * 31 + variant));
46
-
47
- const keys = new Uint32Array(element_count);
48
-
49
- for (let i = 0; i < element_count; i++) {
50
- if (variant === 0) {
51
- keys[i] = random() % 1000;
52
- } else if (variant === 1) {
53
- keys[i] = 0x2a2a2a2a;
54
- } else {
55
- keys[i] = random();
56
- }
57
- }
58
-
59
- return keys;
60
- }
61
-
62
- /**
63
- * @param {Uint32Array} input_keys
64
- * @param {Uint32Array|number[]} sorted_keys
65
- * @param {Uint32Array|number[]} sorted_values
66
- * @returns {string[]} one entry per distinct problem found, empty when the sort is correct
67
- */
68
- function problems_with(input_keys, sorted_keys, sorted_values) {
69
- const element_count = input_keys.length;
70
-
71
- const problems = [];
72
-
73
- for (let i = 1; i < element_count; i++) {
74
- if (sorted_keys[i] < sorted_keys[i - 1]) {
75
- problems.push(`keys not ascending at [${i}]: ${sorted_keys[i - 1]} -> ${sorted_keys[i]}`);
76
- break;
77
- }
78
- }
79
-
80
- const seen = new Uint8Array(element_count);
81
- for (let i = 0; i < element_count; i++) {
82
- const value = sorted_values[i];
83
-
84
- if (value >= element_count || seen[value] === 1) {
85
- problems.push(`payload is not a permutation at [${i}]: ${value}`);
86
- break;
87
- }
88
-
89
- seen[value] = 1;
90
- }
91
-
92
- for (let i = 0; i < element_count; i++) {
93
- if (input_keys[sorted_values[i]] !== sorted_keys[i]) {
94
- problems.push(`key/payload pairing broken at [${i}]: payload ${sorted_values[i]} `
95
- + `had key ${input_keys[sorted_values[i]]}, sorted key is ${sorted_keys[i]}`);
96
- break;
97
- }
98
- }
99
-
100
- // payload is the input index, so a stable sort leaves equal keys with ascending payloads
101
- for (let i = 1; i < element_count; i++) {
102
- if (sorted_keys[i] === sorted_keys[i - 1] && sorted_values[i] < sorted_values[i - 1]) {
103
- problems.push(`not stable at [${i}]: key ${sorted_keys[i]} came from index `
104
- + `${sorted_values[i - 1]} then ${sorted_values[i]}`);
105
- break;
106
- }
107
- }
108
-
109
- return problems;
110
- }
111
-
112
- /**
113
- * On-device verification of {@link graph_radix_sort}: sorts deterministic key/payload sets across
114
- * tile-boundary element counts and three key distributions, reads the results back, and checks on
115
- * the CPU that the keys are ascending, that the payload is a permutation of the input indices, that
116
- * every payload still sits next to ITS key, and that equal keys kept their input order.
117
- *
118
- * Logs one `[SORT]` PASS/FAIL line per case.
119
- *
120
- * @param {GraphicsContext} graphics
121
- */
122
- export function verify_radix_sort(graphics) {
123
-
124
- const graph = new FrameGraph();
125
- const cmd = ShadeGPUCommandContext.create(graphics, 'verify/radix sort');
126
-
127
- const usage = GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE;
128
-
129
- for (const element_count of ELEMENT_COUNTS) {
130
- for (let variant = 0; variant < 3; variant++) {
131
-
132
- const input_keys = make_keys(element_count, variant);
133
- const input_values = new Uint32Array(element_count);
134
- for (let i = 0; i < element_count; i++) {
135
- input_values[i] = i;
136
- }
137
-
138
- const type = WebGPUArray.from(u32, element_count);
139
- const label = `n=${element_count} variant=${variant}`;
140
-
141
- const keys = graph_import_typed_buffer({
142
- graph, type, value: input_keys, label: `verify sort keys ${label}`, usage
143
- });
144
- const values = graph_import_typed_buffer({
145
- graph, type, value: input_values, label: `verify sort values ${label}`, usage
146
- });
147
-
148
- const sorted = graph_radix_sort({ graph, keys, values, element_count });
149
-
150
- let sorted_keys;
151
- let sorted_values;
152
-
153
- function validate() {
154
- if (sorted_keys === undefined || sorted_values === undefined) {
155
- // wait for both readbacks
156
- return;
157
- }
158
-
159
- const problems = problems_with(input_keys, sorted_keys, sorted_values);
160
-
161
- if (problems.length === 0) {
162
- console.log(`%c[SORT] PASS ${label}`, 'color: #0c0');
163
- } else {
164
- console.error(`[SORT] FAIL ${label}:\n ${problems.join('\n ')}`);
165
- }
166
- }
167
-
168
- graph_inspect_gpu_buffer({
169
- graph, type, buffer: sorted.keys,
170
- callback([data]) {
171
- sorted_keys = data;
172
- validate();
173
- }
174
- });
175
-
176
- graph_inspect_gpu_buffer({
177
- graph, type, buffer: sorted.values,
178
- callback([data]) {
179
- sorted_values = data;
180
- validate();
181
- }
182
- });
183
- }
184
- }
185
-
186
- cmd.encodeGraph(graph);
187
- cmd.finish();
188
- }
1
+ import { FrameGraph } from "../../../../engine/graphics/render/frame_graph/FrameGraph.js";
2
+ import { ShadeGPUCommandContext } from "../../../device/ShadeGPUCommandContext.js";
3
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
4
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
5
+ import { graph_inspect_gpu_buffer } from "../../buffer/graph_inspect_gpu_buffer.js";
6
+ import { graph_import_typed_buffer } from "../../shader/graph/graph_import_typed_buffer.js";
7
+ import { SORT_TILE_SIZE } from "./defs.js";
8
+ import { graph_radix_sort } from "./graph_radix_sort.js";
9
+
10
+ /**
11
+ * The element counts one run covers. The interesting ones are all at tile boundaries — the scatter's
12
+ * tail tile is padded, and a count one either side of an exact multiple is what exercises the
13
+ * padding guard from both directions.
14
+ *
15
+ * @type {number[]}
16
+ */
17
+ const ELEMENT_COUNTS = [
18
+ 2, 3, 255, 256, 257,
19
+ SORT_TILE_SIZE - 1, SORT_TILE_SIZE, SORT_TILE_SIZE + 1,
20
+ SORT_TILE_SIZE * 4 + 13,
21
+ 100003,
22
+ ];
23
+
24
+ /**
25
+ * Sorts by part of the key. Every key carries random bits above `key_bits`, which the order must not
26
+ * see; an odd number of digit passes leaves the result in the sort's own scratch.
27
+ *
28
+ * @type {{element_count: number, key_bits: number}[]}
29
+ */
30
+ const KEY_WIDTH_CASES = [
31
+ { element_count: 3, key_bits: 1 },
32
+ { element_count: SORT_TILE_SIZE * 4 + 13, key_bits: 8 },
33
+ { element_count: SORT_TILE_SIZE * 4 + 13, key_bits: 20 },
34
+ { element_count: SORT_TILE_SIZE * 4 + 13, key_bits: 24 },
35
+ { element_count: 100003, key_bits: 24 },
36
+ { element_count: 100003, key_bits: 30 },
37
+ ];
38
+
39
+ /**
40
+ * Sorts over a count the device holds, the `u32` at byte 4 of a buffer of its own, in buffers that
41
+ * hold `element_max_count`. Where the result is in the caller's buffers (an even number of digit
42
+ * passes), the entries past the count must be as they went in.
43
+ *
44
+ * @type {{element_max_count: number, count: number, key_bits: number, variant: number}[]}
45
+ */
46
+ const DEVICE_COUNT_CASES = [
47
+ { element_max_count: 100003, count: 0, key_bits: 32, variant: 2 },
48
+ { element_max_count: 100003, count: 1, key_bits: 32, variant: 2 },
49
+ { element_max_count: 100003, count: SORT_TILE_SIZE * 4 + 13, key_bits: 32, variant: 0 },
50
+ { element_max_count: 100003, count: 100003, key_bits: 32, variant: 2 },
51
+ // past what the memory holds: the first element_max_count are sorted
52
+ { element_max_count: 5000, count: 9000, key_bits: 32, variant: 2 },
53
+ // the probe rays' budget, by a 24-bit key
54
+ { element_max_count: 131072, count: 0, key_bits: 24, variant: 2 },
55
+ { element_max_count: 131072, count: 70001, key_bits: 24, variant: 0 },
56
+ { element_max_count: 131072, count: 131072, key_bits: 24, variant: 2 },
57
+ { element_max_count: 131072, count: 70001, key_bits: 16, variant: 0 },
58
+ ];
59
+
60
+ /**
61
+ * @param {number} seed
62
+ * @returns {function(): number} LCG, so a failing run is reproducible
63
+ */
64
+ function make_random(seed) {
65
+ let state = seed >>> 0;
66
+
67
+ return () => (state = (state * 1664525 + 1013904223) >>> 0);
68
+ }
69
+
70
+ /**
71
+ * @param {number} key_bits
72
+ * @returns {number} the key's low `key_bits` set
73
+ */
74
+ function key_mask_of(key_bits) {
75
+ return 2 ** key_bits - 1;
76
+ }
77
+
78
+ /**
79
+ * The key distribution for one case. Three shapes, because a radix sort fails differently under
80
+ * each: dense duplicates stress stability and the in-tile split's equal-digit runs, a single
81
+ * repeated key makes every tile one bin, and full-range keys are the only ones that reach the top
82
+ * digit pass at all.
83
+ *
84
+ * Whatever the shape, the bits above `key_bits` are random, so a sort that looked at them would
85
+ * order by them. They come from a generator of their own, so a whole-key case is the keys it always
86
+ * was.
87
+ *
88
+ * @param {number} element_count
89
+ * @param {number} variant
90
+ * @param {number} key_bits
91
+ * @returns {Uint32Array}
92
+ */
93
+ function make_keys(element_count, variant, key_bits) {
94
+ const random = make_random(0x9e3779b9 ^ (element_count * 31 + variant));
95
+ const noise = make_random(0x85ebca6b ^ (element_count * 31 + variant + key_bits));
96
+
97
+ const key_mask = key_mask_of(key_bits);
98
+
99
+ const keys = new Uint32Array(element_count);
100
+
101
+ for (let i = 0; i < element_count; i++) {
102
+ let key;
103
+
104
+ if (variant === 0) {
105
+ key = random() % 1000;
106
+ } else if (variant === 1) {
107
+ key = 0x2a2a2a2a;
108
+ } else {
109
+ key = random();
110
+ }
111
+
112
+ keys[i] = ((key & key_mask) | (noise() & ~key_mask)) >>> 0;
113
+ }
114
+
115
+ return keys;
116
+ }
117
+
118
+ /**
119
+ * @param {Uint32Array} input_keys the keys that were sorted, and no more
120
+ * @param {number} key_mask the bits of a key the order is by
121
+ * @param {Uint32Array|number[]} sorted_keys at least as many as `input_keys`
122
+ * @param {Uint32Array|number[]} sorted_values at least as many as `input_keys`
123
+ * @returns {string[]} one entry per distinct problem found, empty when the sort is correct
124
+ */
125
+ function problems_with(input_keys, key_mask, sorted_keys, sorted_values) {
126
+ const element_count = input_keys.length;
127
+
128
+ const problems = [];
129
+
130
+ const order = i => (sorted_keys[i] & key_mask) >>> 0;
131
+
132
+ for (let i = 1; i < element_count; i++) {
133
+ if (order(i) < order(i - 1)) {
134
+ problems.push(`keys not ascending at [${i}]: ${order(i - 1)} -> ${order(i)}`);
135
+ break;
136
+ }
137
+ }
138
+
139
+ const seen = new Uint8Array(element_count);
140
+ for (let i = 0; i < element_count; i++) {
141
+ const value = sorted_values[i];
142
+
143
+ if (value >= element_count || seen[value] === 1) {
144
+ problems.push(`payload is not a permutation at [${i}]: ${value}`);
145
+ break;
146
+ }
147
+
148
+ seen[value] = 1;
149
+ }
150
+
151
+ // the whole key travels with its payload, the bits the order ignores included
152
+ for (let i = 0; i < element_count; i++) {
153
+ if (input_keys[sorted_values[i]] !== sorted_keys[i]) {
154
+ problems.push(`key/payload pairing broken at [${i}]: payload ${sorted_values[i]} `
155
+ + `had key ${input_keys[sorted_values[i]]}, sorted key is ${sorted_keys[i]}`);
156
+ break;
157
+ }
158
+ }
159
+
160
+ // payload is the input index, so a stable sort leaves equal keys with ascending payloads
161
+ for (let i = 1; i < element_count; i++) {
162
+ if (order(i) === order(i - 1) && sorted_values[i] < sorted_values[i - 1]) {
163
+ problems.push(`not stable at [${i}]: key ${order(i)} came from index `
164
+ + `${sorted_values[i - 1]} then ${sorted_values[i]}`);
165
+ break;
166
+ }
167
+ }
168
+
169
+ return problems;
170
+ }
171
+
172
+ /**
173
+ * @param {Uint32Array} input_keys
174
+ * @param {Uint32Array} input_values
175
+ * @param {number} from the first entry the sort must not have written
176
+ * @param {Uint32Array|number[]} sorted_keys
177
+ * @param {Uint32Array|number[]} sorted_values
178
+ * @returns {string[]}
179
+ */
180
+ function problems_past(input_keys, input_values, from, sorted_keys, sorted_values) {
181
+ for (let i = from; i < input_keys.length; i++) {
182
+ if (sorted_keys[i] !== input_keys[i] || sorted_values[i] !== input_values[i]) {
183
+ return [`written past the count at [${i}]: (${sorted_keys[i]}, ${sorted_values[i]}), `
184
+ + `was (${input_keys[i]}, ${input_values[i]})`];
185
+ }
186
+ }
187
+
188
+ return [];
189
+ }
190
+
191
+ /**
192
+ * Read a sort's result back and check it.
193
+ *
194
+ * @param {Object} options
195
+ * @param {FrameGraph} options.graph
196
+ * @param {string} options.label
197
+ * @param {{keys:number, values:number}} options.sorted
198
+ * @param {number} options.capacity entries in each buffer
199
+ * @param {Uint32Array} options.input_keys the whole of the caller's keys, `capacity` of them
200
+ * @param {Uint32Array} options.input_values the whole of the caller's values
201
+ * @param {number} options.sorted_count how many of them were sorted
202
+ * @param {number} options.key_mask
203
+ * @param {boolean} options.check_past whether the entries past `sorted_count` must be untouched — they
204
+ * are where the result is in the caller's buffers
205
+ */
206
+ function check_sorted({
207
+ graph,
208
+ label,
209
+ sorted,
210
+ capacity,
211
+ input_keys,
212
+ input_values,
213
+ sorted_count,
214
+ key_mask,
215
+ check_past,
216
+ }) {
217
+ const type = WebGPUArray.from(u32, capacity);
218
+
219
+ let sorted_keys;
220
+ let sorted_values;
221
+
222
+ function validate() {
223
+ if (sorted_keys === undefined || sorted_values === undefined) {
224
+ // wait for both readbacks
225
+ return;
226
+ }
227
+
228
+ const problems = problems_with(input_keys.subarray(0, sorted_count), key_mask, sorted_keys, sorted_values);
229
+
230
+ if (check_past) {
231
+ problems.push(...problems_past(input_keys, input_values, sorted_count, sorted_keys, sorted_values));
232
+ }
233
+
234
+ if (problems.length === 0) {
235
+ console.log(`%c[SORT] PASS ${label}`, 'color: #0c0');
236
+ } else {
237
+ console.error(`[SORT] FAIL ${label}:\n ${problems.join('\n ')}`);
238
+ }
239
+ }
240
+
241
+ graph_inspect_gpu_buffer({
242
+ graph, type, buffer: sorted.keys, count: 1,
243
+ callback([data]) {
244
+ sorted_keys = data;
245
+ validate();
246
+ }
247
+ });
248
+
249
+ graph_inspect_gpu_buffer({
250
+ graph, type, buffer: sorted.values, count: 1,
251
+ callback([data]) {
252
+ sorted_values = data;
253
+ validate();
254
+ }
255
+ });
256
+ }
257
+
258
+ /**
259
+ * @param {number} element_count
260
+ * @returns {Uint32Array} `[0, element_count)`, so a payload names the input it came from
261
+ */
262
+ function make_indices(element_count) {
263
+ const values = new Uint32Array(element_count);
264
+
265
+ for (let i = 0; i < element_count; i++) {
266
+ values[i] = i;
267
+ }
268
+
269
+ return values;
270
+ }
271
+
272
+ /**
273
+ * On-device verification of {@link graph_radix_sort}: sorts deterministic key/payload sets across
274
+ * tile-boundary element counts and three key distributions, reads the results back, and checks on
275
+ * the CPU that the keys are ascending, that the payload is a permutation of the input indices, that
276
+ * every payload still sits next to ITS key, and that equal keys kept their input order. Then the same
277
+ * by part of the key, with random bits above it, and over counts that live on the device — where the
278
+ * entries past the count must also come back as they went in.
279
+ *
280
+ * Logs one `[SORT]` PASS/FAIL line per case.
281
+ *
282
+ * @param {GraphicsContext} graphics
283
+ */
284
+ export function verify_radix_sort(graphics) {
285
+
286
+ const graph = new FrameGraph();
287
+ const cmd = ShadeGPUCommandContext.create(graphics, 'verify/radix sort');
288
+
289
+ const usage = GPUBufferUsage.COPY_SRC | GPUBufferUsage.STORAGE;
290
+
291
+ /**
292
+ * @param {Uint32Array} data
293
+ * @param {string} label
294
+ * @returns {number}
295
+ */
296
+ function upload(data, label) {
297
+ return graph_import_typed_buffer({
298
+ graph, type: WebGPUArray.from(u32, data.length), value: data, label, usage
299
+ });
300
+ }
301
+
302
+ for (const element_count of ELEMENT_COUNTS) {
303
+ for (let variant = 0; variant < 3; variant++) {
304
+
305
+ const input_keys = make_keys(element_count, variant, 32);
306
+ const input_values = make_indices(element_count);
307
+
308
+ const label = `n=${element_count} variant=${variant}`;
309
+
310
+ const sorted = graph_radix_sort({
311
+ graph,
312
+ keys: upload(input_keys, `verify sort keys ${label}`),
313
+ values: upload(input_values, `verify sort values ${label}`),
314
+ element_count,
315
+ });
316
+
317
+ check_sorted({
318
+ graph, label, sorted,
319
+ capacity: element_count,
320
+ input_keys, input_values,
321
+ sorted_count: element_count,
322
+ key_mask: key_mask_of(32),
323
+ check_past: false,
324
+ });
325
+ }
326
+ }
327
+
328
+ for (const { element_count, key_bits } of KEY_WIDTH_CASES) {
329
+ for (let variant = 0; variant < 3; variant++) {
330
+
331
+ const input_keys = make_keys(element_count, variant, key_bits);
332
+ const input_values = make_indices(element_count);
333
+
334
+ const label = `n=${element_count} key_bits=${key_bits} variant=${variant}`;
335
+
336
+ const sorted = graph_radix_sort({
337
+ graph,
338
+ keys: upload(input_keys, `verify sort keys ${label}`),
339
+ values: upload(input_values, `verify sort values ${label}`),
340
+ element_count,
341
+ key_bits,
342
+ });
343
+
344
+ check_sorted({
345
+ graph, label, sorted,
346
+ capacity: element_count,
347
+ input_keys, input_values,
348
+ sorted_count: element_count,
349
+ key_mask: key_mask_of(key_bits),
350
+ check_past: false,
351
+ });
352
+ }
353
+ }
354
+
355
+ for (const { element_max_count, count, key_bits, variant } of DEVICE_COUNT_CASES) {
356
+
357
+ const input_keys = make_keys(element_max_count, variant, key_bits);
358
+ const input_values = make_indices(element_max_count);
359
+
360
+ const label = `device count=${count} of ${element_max_count} key_bits=${key_bits} variant=${variant}`;
361
+
362
+ const sorted = graph_radix_sort({
363
+ graph,
364
+ keys: upload(input_keys, `verify sort keys ${label}`),
365
+ values: upload(input_values, `verify sort values ${label}`),
366
+ count_buffer: upload(Uint32Array.of(0xdeadbeef, count, 0xdeadbeef, 0xdeadbeef), `verify sort count ${label}`),
367
+ count_offset: 4,
368
+ element_max_count,
369
+ key_bits,
370
+ });
371
+
372
+ const pass_count = Math.ceil(key_bits / 8);
373
+
374
+ check_sorted({
375
+ graph, label, sorted,
376
+ capacity: element_max_count,
377
+ input_keys, input_values,
378
+ sorted_count: Math.min(count, element_max_count),
379
+ key_mask: key_mask_of(key_bits),
380
+ // an even number of passes ends in the caller's buffers, and their tail is the caller's
381
+ check_past: pass_count % 2 === 0,
382
+ });
383
+ }
384
+
385
+ cmd.encodeGraph(graph);
386
+ cmd.finish();
387
+ }
@@ -169,7 +169,7 @@ fn main(
169
169
  );
170
170
 
171
171
  let material = materials[mesh.material];
172
- var texture_sample_orm = indirect_sample_texture(material.texture_orm, material.sampler_orm, geometry_uv).rgba;
172
+ var texture_sample_orm = indirect_sample_texture(material.texture_orm, material.sampler_orm, geometry_uv, 0.0).rgba;
173
173
 
174
174
 
175
175
  let roughness = saturate(texture_sample_orm.g * material.roughness_factor);
@@ -171,7 +171,7 @@ fn main(
171
171
  );
172
172
 
173
173
  let material = materials[mesh.material];
174
- var texture_sample_orm = indirect_sample_texture(material.texture_orm, material.sampler_orm, geometry_uv).rgba;
174
+ var texture_sample_orm = indirect_sample_texture(material.texture_orm, material.sampler_orm, geometry_uv, 0.0).rgba;
175
175
 
176
176
 
177
177
  let roughness = texture_sample_orm.g * material.roughness_factor;
@@ -1 +1 @@
1
- {"version":3,"file":"GPUResidentMaterialContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/material/resident/GPUResidentMaterialContext.js"],"names":[],"mappings":"AAkIA;IAqMI;;;;OAIG;IACH,yCAFW,eAAe,EAwDzB;IA9PD;;;;OAIG;IACH,wBAAkC;IA4BlC;;;OAGG;IACH,6BAEC;IAQD;;;OAGG;IACH,kCAEC;IAQD;;;OAGG;IACH,yCAEC;IAoBD;;OAEG;IACH,sCAEC;IAED;;;OAGG;IACH,kCAIC;IAmED;;;;;OAKG;IACH,0BAEC;IAOD;;;;;;OAMG;IACH,8BAEC;IA4JD;;;;;;;;;OASG;IACH,0BAHW,aAAa,GACX,YAAY,CAqBxB;IAgBD;;;;OAIG;IACH,wBAHW,YAAY,GACV,WAAW,CAIvB;IAGD,uBAiIC;IA6DD,wBA8EC;IAED;;;;OAIG;IACH,sCAFW,eAAe,QAUzB;IAoCD,eAWC;IAGD,gBAMC;;CACJ;8BA/0BY,OAAO,0BAA0B,EAAE,eAAe;8BAClD,OAAO,gCAAgC,EAAE,eAAe;2BACxD,OAAO,+BAA+B,EAAE,YAAY;4BACpD,OAAO,qBAAqB,EAAE,aAAa;oCAC3C,OAAO,6BAA6B,EAAE,qBAAqB;kCAC3D,OAAO,qCAAqC,EAAE,mBAAmB;kCAlB5C,oCAAoC;AAYtE;;;;;;;GAOG;AAEH;IACI,WAAM;IAEN;;;OAGG;IACH,SAFU,MAAM,CAEJ;IAEZ;;OAEG;IACH,QAFU,qBAAqB,CAExB;IAEP;;OAEG;IACH,gBAFU,WAAW,CAEP;IAEd;;OAEG;IACH,aAFU,WAAW,CAEV;IAEX;;;;OAIG;IACH,gBAFU,WAAW,GAAC,IAAI,CAEZ;IACd;;OAEG;IACH,kBAFU,WAAW,CAEL;IAEhB;;;OAGG;IACH,aAFU,MAAM,CAEe;CAClC;AAqBD;IACI,WAAO;IAEP;;OAEG;IACH,QAFU,YAAY,CAEf;CACV"}
1
+ {"version":3,"file":"GPUResidentMaterialContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/material/resident/GPUResidentMaterialContext.js"],"names":[],"mappings":"AAmIA;IAqMI;;;;OAIG;IACH,yCAFW,eAAe,EAyDzB;IA/PD;;;;OAIG;IACH,wBAAkC;IA4BlC;;;OAGG;IACH,6BAEC;IAQD;;;OAGG;IACH,kCAEC;IAQD;;;OAGG;IACH,yCAEC;IAoBD;;OAEG;IACH,sCAEC;IAED;;;OAGG;IACH,kCAIC;IAmED;;;;;OAKG;IACH,0BAEC;IAOD;;;;;;OAMG;IACH,8BAEC;IA6JD;;;;;;;;;OASG;IACH,0BAHW,aAAa,GACX,YAAY,CAqBxB;IAgBD;;;;OAIG;IACH,wBAHW,YAAY,GACV,WAAW,CAIvB;IAGD,uBA4DC;IAkJD,wBA8EC;IAED;;;;OAIG;IACH,sCAFW,eAAe,QAUzB;IAoCD,eAWC;IAGD,gBAMC;;CACJ;8BAh2BY,OAAO,0BAA0B,EAAE,eAAe;8BAClD,OAAO,gCAAgC,EAAE,eAAe;2BACxD,OAAO,+BAA+B,EAAE,YAAY;4BACpD,OAAO,qBAAqB,EAAE,aAAa;oCAC3C,OAAO,6BAA6B,EAAE,qBAAqB;kCAC3D,OAAO,qCAAqC,EAAE,mBAAmB;kCAnB5C,oCAAoC;AAatE;;;;;;;GAOG;AAEH;IACI,WAAM;IAEN;;;OAGG;IACH,SAFU,MAAM,CAEJ;IAEZ;;OAEG;IACH,QAFU,qBAAqB,CAExB;IAEP;;OAEG;IACH,gBAFU,WAAW,CAEP;IAEd;;OAEG;IACH,aAFU,WAAW,CAEV;IAEX;;;;OAIG;IACH,gBAFU,WAAW,GAAC,IAAI,CAEZ;IACd;;OAEG;IACH,kBAFU,WAAW,CAEL;IAEhB;;;OAGG;IACH,aAFU,MAAM,CAEe;CAClC;AAqBD;IACI,WAAO;IAEP;;OAEG;IACH,QAFU,YAAY,CAEf;CACV"}