@woosh/meep-engine 3.58.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 (818) hide show
  1. package/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  3. package/editor/particles/effect/ParticleEffectDocument.js +450 -43
  4. package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
  5. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
  6. package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
  7. package/editor/particles/effect/make_starter_particle_effect.js +17 -17
  8. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
  9. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  10. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
  11. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  12. package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
  13. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
  14. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  15. package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
  16. package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
  17. package/editor/view/particles/effect/particle-editor.css +77 -68
  18. package/package.json +1 -1
  19. package/src/engine/Engine.d.ts.map +1 -1
  20. package/src/engine/Engine.js +2 -2
  21. package/src/engine/ecs/EntityManager.d.ts +29 -5
  22. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  23. package/src/engine/ecs/EntityManager.js +37 -1
  24. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  25. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
  26. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +74 -17
  27. package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
  28. package/src/engine/graphics/ecs/particles/ParticleEffect.js +156 -25
  29. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
  30. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
  31. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
  32. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
  33. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
  34. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
  35. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
  36. package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
  37. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
  38. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  39. package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
  40. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
  41. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
  42. package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
  43. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
  44. package/src/engine/graphics/trail/tube/TubeX.js +5 -3
  45. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
  46. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
  47. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
  49. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  50. package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
  51. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
  52. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
  53. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  54. package/src/generation/foliage/FOLIAGE_DESIGN.md +26 -5
  55. package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +35 -0
  56. package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +2 -1
  57. package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
  58. package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
  59. package/src/generation/foliage/analysis/tree_crown_opacity.js +2 -1
  60. package/src/generation/foliage/analysis/tree_render_cost.d.ts +5 -3
  61. package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -1
  62. package/src/generation/foliage/analysis/tree_render_cost.js +8 -7
  63. package/src/generation/foliage/asset/TreeAsset.d.ts +17 -0
  64. package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
  65. package/src/generation/foliage/asset/TreeAsset.js +20 -0
  66. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
  67. package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
  68. package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
  69. package/src/generation/foliage/asset/generate_tree.d.ts +10 -0
  70. package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
  71. package/src/generation/foliage/asset/generate_tree.js +57 -29
  72. package/src/generation/foliage/asset/place_tree.d.ts +2 -1
  73. package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
  74. package/src/generation/foliage/asset/place_tree.js +2 -1
  75. package/src/generation/foliage/asset/tree_lod_plan.d.ts +4 -2
  76. package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -1
  77. package/src/generation/foliage/asset/tree_lod_plan.js +12 -14
  78. package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
  79. package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
  80. package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
  81. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
  82. package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
  83. package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
  84. package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
  85. package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
  86. package/src/generation/foliage/config/TreeGrowth.js +18 -0
  87. package/src/generation/foliage/config/TreeLODConfig.d.ts +6 -0
  88. package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
  89. package/src/generation/foliage/config/TreeLODConfig.js +7 -0
  90. package/src/generation/foliage/index.d.ts +3 -0
  91. package/src/generation/foliage/index.js +3 -0
  92. package/src/generation/foliage/material/foliage_tile.d.ts +6 -6
  93. package/src/generation/foliage/material/foliage_tile.js +3 -3
  94. package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
  95. package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
  96. package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
  97. package/src/generation/foliage/mesh/foliage_collect_attachments.js +2 -2
  98. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
  99. package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
  100. package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
  101. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +8 -7
  102. package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -1
  103. package/src/generation/foliage/mesh/tree_cluster_representatives.js +85 -40
  104. package/src/generation/foliage/mesh/tree_clusters.d.ts +26 -5
  105. package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -1
  106. package/src/generation/foliage/mesh/tree_clusters.js +52 -39
  107. package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
  108. package/src/generation/foliage/mesh/tree_mesh_build_bark.js +32 -54
  109. package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
  110. package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
  111. package/src/generation/foliage/presets/make_tree_species_preset.js +157 -3
  112. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +19 -0
  113. package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
  114. package/src/generation/foliage/skeleton/TreeSkeleton.js +41 -0
  115. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
  116. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
  117. package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
  118. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
  119. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
  120. package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
  121. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
  122. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
  123. package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
  124. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
  125. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
  126. package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
  127. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
  128. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
  129. package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
  130. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
  131. package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
  132. package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2034
  133. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
  134. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
  135. package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
  136. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +10 -0
  137. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
  138. package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +27 -56
  139. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
  140. package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
  141. package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
  142. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
  143. package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
  144. package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
  145. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  146. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
  147. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
  148. package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
  149. package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
  150. package/src/shade/playground/particle_ecs/README.md +9 -8
  151. package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
  152. package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
  153. package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
  154. package/src/shade/playground/particle_editor/README.md +14 -11
  155. package/src/shade/playground/particle_system/particle_prototype.js +18 -18
  156. package/src/shade/playground/particle_system/particle_scene.js +13 -13
  157. package/src/shade/playground/probe_clipmap/README.md +42 -0
  158. package/src/shade/playground/probe_clipmap/index.html +190 -0
  159. package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
  160. package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
  161. package/src/shade/playground/probe_clipmap/main.js +365 -0
  162. package/src/shade/renderer/Renderer.d.ts +3 -1
  163. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  164. package/src/shade/renderer/Renderer.js +97 -43
  165. package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
  166. package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
  167. package/src/shade/renderer/extension/ViewTextures.js +2 -1
  168. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
  169. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
  170. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
  171. package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
  172. package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
  173. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
  174. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  175. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
  176. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
  177. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
  178. package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
  179. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
  180. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
  182. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
  183. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
  185. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
  186. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
  187. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
  188. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
  189. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
  190. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
  191. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
  192. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
  194. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
  195. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  196. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
  197. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
  198. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  199. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
  200. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
  201. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
  203. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
  204. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
  205. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
  206. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  207. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
  208. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
  209. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
  210. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
  211. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
  212. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
  213. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
  214. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
  215. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
  216. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
  217. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
  218. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
  219. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
  220. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
  222. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
  223. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
  224. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
  225. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  226. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
  227. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  228. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
  229. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
  231. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
  232. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  233. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
  234. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
  235. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
  236. package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
  237. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
  238. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
  239. package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
  240. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
  241. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
  242. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
  243. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
  244. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
  245. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
  246. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
  247. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
  248. package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
  249. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
  250. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
  251. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
  252. package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
  253. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
  254. package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
  255. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
  256. package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
  257. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +20 -5
  258. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
  259. package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +111 -11
  260. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +1596 -52
  261. package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
  262. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
  263. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
  264. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
  265. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
  266. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
  267. package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
  268. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +18 -3
  269. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
  270. package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +21 -4
  271. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -2
  272. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
  273. package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -1
  274. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
  275. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
  276. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
  277. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
  278. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
  279. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
  280. package/src/shade/renderer/global_illumination/probe_clipmap/brick/{mesh/chunk_mesh_brick_object.d.ts → chunk_brick_object.d.ts} +8 -8
  281. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
  282. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
  283. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
  284. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
  285. package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
  286. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
  287. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
  288. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
  289. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -15
  290. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
  291. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -17
  292. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
  293. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +3 -4
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +6 -8
  298. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
  299. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
  300. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
  301. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
  302. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
  303. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
  304. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
  305. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
  306. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
  307. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
  308. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
  309. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
  310. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
  311. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
  312. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
  313. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
  314. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
  315. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
  316. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
  317. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
  318. package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
  319. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +32 -15
  320. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
  321. package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +380 -57
  322. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +156 -8
  323. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
  324. package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +189 -13
  325. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +193 -9
  326. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
  327. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +458 -32
  328. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
  329. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
  330. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
  331. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
  332. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
  333. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
  334. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
  335. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
  336. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +189 -0
  337. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
  338. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
  339. package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
  340. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +40 -10
  341. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
  342. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +244 -32
  343. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +8 -1
  344. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
  345. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +29 -12
  346. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
  347. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
  348. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
  349. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
  350. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
  351. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
  352. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
  353. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
  354. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
  355. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
  356. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
  357. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
  358. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +37 -0
  359. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
  360. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +316 -0
  361. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
  362. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
  363. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
  364. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
  365. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
  366. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
  367. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
  368. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
  369. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
  370. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
  371. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +15 -2
  372. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
  373. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +54 -9
  374. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
  375. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
  376. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
  377. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +6 -9
  378. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
  379. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +26 -37
  380. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
  381. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
  382. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +101 -38
  383. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
  384. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
  385. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
  386. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +5 -9
  387. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
  388. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +9 -110
  389. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +28 -0
  390. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
  391. package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
  392. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
  393. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
  394. package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
  395. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
  396. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
  397. package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
  398. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
  399. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
  400. package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
  401. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
  402. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
  403. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
  404. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
  405. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
  406. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
  407. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
  408. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
  409. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
  410. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
  411. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
  412. package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
  413. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
  414. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
  415. package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
  416. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
  417. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  418. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
  419. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
  420. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  421. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
  422. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
  423. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
  424. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
  425. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
  426. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
  427. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
  428. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
  429. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  430. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
  431. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
  432. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
  433. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
  434. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
  435. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
  436. package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
  437. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
  438. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
  439. package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
  440. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
  441. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
  442. package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
  443. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
  444. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
  445. package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
  446. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
  447. package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
  448. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  449. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
  450. package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
  451. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
  452. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
  453. package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
  454. package/src/shade/renderer/particles/DESIGN.md +151 -42
  455. package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
  456. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
  457. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  458. package/src/shade/renderer/particles/GPUParticleSystem.js +46 -8
  459. package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
  460. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  461. package/src/shade/renderer/particles/ParticleConstants.js +25 -6
  462. package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
  463. package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
  464. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
  465. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
  466. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
  467. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
  468. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  469. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
  470. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
  471. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
  472. package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
  473. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
  474. package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
  475. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
  476. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
  477. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
  478. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  479. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
  480. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
  481. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  482. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
  483. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
  484. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
  485. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
  486. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  487. package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
  488. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
  489. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
  490. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
  491. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
  492. package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
  493. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
  494. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  495. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
  496. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
  497. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
  498. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
  499. package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
  500. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
  501. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  502. package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
  503. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  504. package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
  505. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -2
  506. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  507. package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -32
  508. package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
  509. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  510. package/src/shade/renderer/particles/graph_particles.js +27 -4
  511. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
  512. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  513. package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
  514. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
  515. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  516. package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
  517. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
  518. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  519. package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
  520. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
  521. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  522. package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
  523. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
  524. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  525. package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
  526. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
  527. package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
  528. package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
  529. package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
  530. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
  531. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  532. package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
  533. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
  534. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
  535. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
  536. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
  537. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
  538. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
  539. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
  540. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
  541. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  542. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
  543. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
  544. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
  545. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
  546. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  547. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
  548. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
  549. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
  550. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  551. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
  552. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
  553. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  554. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  555. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
  556. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  557. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
  558. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
  559. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  560. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  561. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  562. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  563. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
  564. package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
  565. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  566. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
  567. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
  568. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  569. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
  570. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
  571. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
  572. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
  573. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
  574. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  575. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
  576. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
  577. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
  578. package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
  579. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
  580. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
  581. package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
  582. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
  583. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  584. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
  585. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
  586. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  587. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
  588. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
  589. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
  590. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
  591. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
  592. package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
  593. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
  594. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
  595. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
  596. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  597. package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
  598. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  599. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
  600. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
  601. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
  602. package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
  603. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
  604. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
  605. package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
  606. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
  607. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
  608. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
  609. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
  610. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
  611. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
  612. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
  613. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
  614. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
  615. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
  616. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
  617. package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
  618. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
  619. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
  620. package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
  621. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
  622. package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
  623. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
  624. package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
  625. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
  626. package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
  627. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
  628. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  629. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
  630. package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
  631. package/src/shade/renderer/postprocess/PostProcess.js +2 -1
  632. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
  633. package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
  634. package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
  635. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
  636. package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
  637. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  638. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  639. package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
  640. package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
  641. package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
  642. package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
  643. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
  644. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
  645. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -3
  646. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -2
  647. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
  648. package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -3
  649. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
  650. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +17 -11
  651. package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
  652. package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
  653. package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
  654. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
  655. package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
  656. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  657. package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
  658. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
  659. package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +26 -17
  660. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -3
  661. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
  662. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -4
  663. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
  664. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
  665. package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
  666. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
  667. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  668. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
  669. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
  670. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  671. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +28 -15
  672. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
  673. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
  674. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
  675. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
  676. package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
  677. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
  678. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  679. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
  680. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
  681. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
  682. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
  683. package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
  684. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  685. package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
  686. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
  687. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
  688. package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
  689. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
  690. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
  691. package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
  692. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
  693. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
  694. package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
  695. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
  696. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
  697. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
  698. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
  699. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
  700. package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
  701. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
  702. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
  703. package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
  704. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
  705. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
  706. package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
  707. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
  708. package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
  709. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
  710. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
  711. package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
  712. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
  713. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
  714. package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
  715. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
  716. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
  717. package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
  718. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
  719. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
  720. package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
  721. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
  722. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
  723. package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
  724. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
  725. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
  726. package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
  727. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
  728. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
  729. package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
  730. package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
  731. package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
  732. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
  733. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  734. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
  735. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
  736. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
  737. package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
  738. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +15 -2
  739. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
  740. package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +57 -3
  741. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
  742. package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
  743. package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
  744. package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
  745. package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
  746. package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
  747. package/src/shade/renderer/water/chunk_water_gi.d.ts +13 -3
  748. package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
  749. package/src/shade/renderer/water/chunk_water_gi.js +47 -5
  750. package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
  751. package/src/shade/renderer/water/shader_water.d.ts +3 -2
  752. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  753. package/src/shade/renderer/water/shader_water.js +9 -3
  754. package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
  755. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
  756. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
  757. package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
  758. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  759. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +39 -18
  760. package/src/view/elements/progress/segmented/GhostTrail.d.ts +56 -0
  761. package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
  762. package/src/view/elements/progress/segmented/GhostTrail.js +98 -0
  763. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
  764. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
  765. package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
  766. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
  767. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
  768. package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
  769. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
  770. package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
  771. package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
  772. package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
  773. package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
  774. package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
  775. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +155 -10
  776. package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
  777. package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +427 -101
  778. package/src/view/elements/progress/segmented/playground/index.html +78 -0
  779. package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
  780. package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
  781. package/src/view/elements/progress/segmented/playground/main.js +173 -0
  782. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
  783. package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
  784. package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
  785. package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
  786. package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
  787. package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
  788. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
  789. package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
  790. package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
  791. package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
  792. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
  793. package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
  794. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
  795. package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
  796. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
  797. package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
  798. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
  799. package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
  800. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
  801. package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
  802. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts.map +0 -1
  803. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.js +0 -42
  804. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
  805. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
  806. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -247
  807. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
  808. package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
  809. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
  810. package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
  811. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
  812. package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
  813. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
  814. package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
  815. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
  816. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
  817. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
  818. package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
@@ -3,14 +3,29 @@
3
3
  */
4
4
  export const PROBE_SCHEDULE_SETTINGS: WebGPUStruct;
5
5
  /**
6
- * Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.5): one thread, after admit, when the frame's active
7
- * list is whole.
8
- * - The period: with P_w the points wanted this frame, `T = max(1, ⌈P_w / U⌉)` frames, so that every
9
- * wanted probe is updated once a period and the period follows the live count. It goes to
6
+ * Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §8.5): one thread, after admit, when the frame's
7
+ * active list is whole.
8
+ * - The period: with P_w the probes waiting for an update, the NEW and those wanted since their last
9
+ * update, `T = max(1, ⌈P_w / U⌉)` frames, so that every probe a want waits on is updated within a period
10
+ * and the period follows the live count. Retire and admit counted them in
11
+ * `probe_counters[PROBE_COUNTER_WAITING]`, which it empties for the next frame's; the period goes to
10
12
  * `probe_counters[PROBE_COUNTER_PERIOD]` for the due passes.
13
+ * - The next frame's eviction, `probe_eviction`: as many slots as the free ones fall short of the frame's
14
+ * wanted points and the slack, the probes wanted longest ago first. Walking retire's age buckets from the
15
+ * oldest, it asks for each bucket whole while the shortfall takes it, then for what is left of the
16
+ * shortfall from the next; past the youngest bucket it counted anything in, it asks for nothing, so a
17
+ * shortfall the evictable probes cannot cover frees them all and no more. It empties the buckets and
18
+ * the count of a bucket's probes retire evicted.
11
19
  * - A thread an entry of the frame's active list, at `PROBE_DISPATCH_ACTIVE`: the due passes' launch, and
12
20
  * the next frame's retire's, which reads this list.
13
21
  *
22
+ * A hit wants a probe the frame after its probe's update, so a probe hits keep may be wanted on few of
23
+ * its turns. The waiting count is what due lists over a period, where this frame's wanted points would
24
+ * count the probes a pixel wants every frame and miss most of those hits want between their turns.
25
+ *
26
+ * The frame's wanted points are the most a frame can admit, so the next frame's admissions find slots
27
+ * for as many points as this one wanted, and the slack more, before an admission starves.
28
+ *
14
29
  * @type {ComputeShader}
15
30
  */
16
31
  export const shader_probe_clipmap_schedule: ComputeShader;
@@ -1 +1 @@
1
- {"version":3,"file":"shader_probe_clipmap_schedule.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js"],"names":[],"mappings":"AAcA;;GAEG;AACH,sCAFU,YAAY,CASM;AAY5B;;;;;;;;;;GAUG;AACH,4CAFU,aAAa,CA0BpB;6BAlE0B,sCAAsC;8BAHrC,kCAAkC"}
1
+ {"version":3,"file":"shader_probe_clipmap_schedule.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js"],"names":[],"mappings":"AAeA;;GAEG;AACH,sCAFU,YAAY,CAWM;AAa5B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,4CAFU,aAAa,CA6DpB;6BAxH0B,sCAAsC;8BAHrC,kCAAkC"}
@@ -9,6 +9,7 @@ import {
9
9
  PROBE_ACTIVE_WRITTEN_RESOURCE,
10
10
  PROBE_COUNTERS_RESOURCE,
11
11
  PROBE_DISPATCH_RESOURCE,
12
+ PROBE_EVICTION_WRITE_RESOURCE,
12
13
  PROBE_WANTED_READ_RESOURCE
13
14
  } from "./chunk_probe_clipmap.js";
14
15
 
@@ -22,6 +23,8 @@ export const PROBE_SCHEDULE_SETTINGS = WebGPUStruct.from({
22
23
  key_count: u32,
23
24
  /** probes a frame updates at most, U = ⌊ray_budget / rays_per_probe⌋ */
24
25
  trace_capacity: u32,
26
+ /** slots kept free beyond the frame's wanted points, ⌈capacity · PROBE_FREE_SLACK⌉ */
27
+ slack: u32,
25
28
  }, "ProbeScheduleSettings");
26
29
 
27
30
  const resources = new ShaderResourceSetDescriptor();
@@ -32,17 +35,33 @@ resources.createGroup()
32
35
  .add(PROBE_ACTIVE_WRITTEN_RESOURCE)
33
36
  .add(PROBE_WANTED_READ_RESOURCE)
34
37
  .add(PROBE_COUNTERS_RESOURCE)
38
+ .add(PROBE_EVICTION_WRITE_RESOURCE)
35
39
  .add(PROBE_DISPATCH_RESOURCE);
36
40
 
37
41
  /**
38
- * Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.5): one thread, after admit, when the frame's active
39
- * list is whole.
40
- * - The period: with P_w the points wanted this frame, `T = max(1, ⌈P_w / U⌉)` frames, so that every
41
- * wanted probe is updated once a period and the period follows the live count. It goes to
42
+ * Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §8.5): one thread, after admit, when the frame's
43
+ * active list is whole.
44
+ * - The period: with P_w the probes waiting for an update, the NEW and those wanted since their last
45
+ * update, `T = max(1, ⌈P_w / U⌉)` frames, so that every probe a want waits on is updated within a period
46
+ * and the period follows the live count. Retire and admit counted them in
47
+ * `probe_counters[PROBE_COUNTER_WAITING]`, which it empties for the next frame's; the period goes to
42
48
  * `probe_counters[PROBE_COUNTER_PERIOD]` for the due passes.
49
+ * - The next frame's eviction, `probe_eviction`: as many slots as the free ones fall short of the frame's
50
+ * wanted points and the slack, the probes wanted longest ago first. Walking retire's age buckets from the
51
+ * oldest, it asks for each bucket whole while the shortfall takes it, then for what is left of the
52
+ * shortfall from the next; past the youngest bucket it counted anything in, it asks for nothing, so a
53
+ * shortfall the evictable probes cannot cover frees them all and no more. It empties the buckets and
54
+ * the count of a bucket's probes retire evicted.
43
55
  * - A thread an entry of the frame's active list, at `PROBE_DISPATCH_ACTIVE`: the due passes' launch, and
44
56
  * the next frame's retire's, which reads this list.
45
57
  *
58
+ * A hit wants a probe the frame after its probe's update, so a probe hits keep may be wanted on few of
59
+ * its turns. The waiting count is what due lists over a period, where this frame's wanted points would
60
+ * count the probes a pixel wants every frame and miss most of those hits want between their turns.
61
+ *
62
+ * The frame's wanted points are the most a frame can admit, so the next frame's admissions find slots
63
+ * for as many points as this one wanted, and the slack more, before an admission starves.
64
+ *
46
65
  * @type {ComputeShader}
47
66
  */
48
67
  export const shader_probe_clipmap_schedule = ComputeShader.from({
@@ -53,10 +72,45 @@ export const shader_probe_clipmap_schedule = ComputeShader.from({
53
72
  `
54
73
  @compute @workgroup_size(1)
55
74
  fn main() {
56
- let wanted = min(probe_wanted.count, settings.key_count);
75
+ let waiting = atomicLoad(&probe_counters[PROBE_COUNTER_WAITING]);
57
76
  let traced = max(settings.trace_capacity, 1u);
58
77
 
59
- atomicStore(&probe_counters[PROBE_COUNTER_PERIOD], max((wanted + traced - 1u) / traced, 1u));
78
+ atomicStore(&probe_counters[PROBE_COUNTER_WAITING], 0u);
79
+ atomicStore(&probe_counters[PROBE_COUNTER_PERIOD], max((waiting + traced - 1u) / traced, 1u));
80
+
81
+ // the slots short of the frame's wanted points and the slack
82
+ let wanted = min(probe_wanted.count, settings.key_count);
83
+ let room = wanted + settings.slack;
84
+ let free = atomicLoad(&probe_counters[PROBE_COUNTER_FREE]);
85
+
86
+ var lacking = select(0u, room - free, room > free);
87
+ var buckets = 0u;
88
+ var remaining = 0u;
89
+
90
+ for (var k = 0u; k < PROBE_AGE_BUCKETS; k++) {
91
+ let at = PROBE_COUNTER_AGES + PROBE_AGE_BUCKETS - 1u - k;
92
+ let aged = atomicLoad(&probe_counters[at]);
93
+
94
+ atomicStore(&probe_counters[at], 0u);
95
+
96
+ // a bucket nothing was counted in is taken only for an older one: what ages into a bucket below every
97
+ // probe counted is not asked for
98
+ if (lacking > 0u && aged > 0u) {
99
+ if (aged <= lacking) {
100
+ lacking -= aged;
101
+ buckets = k + 1u;
102
+ } else {
103
+ buckets = k;
104
+ remaining = lacking;
105
+ lacking = 0u;
106
+ }
107
+ }
108
+ }
109
+
110
+ probe_eviction.buckets = buckets;
111
+ probe_eviction.remaining = remaining;
112
+
113
+ atomicStore(&probe_counters[PROBE_COUNTER_EVICTED], 0u);
60
114
 
61
115
  let live = min(probe_active_write.count, settings.capacity);
62
116
  let folded = folded_dispatch((live + PROBE_THREAD_WORKGROUP_SIZE - 1u) / PROBE_THREAD_WORKGROUP_SIZE);
@@ -1,11 +1,8 @@
1
1
  /**
2
- * @type {WebGPUStruct}
3
- */
4
- export const PROBE_SHADE_SETTINGS: WebGPUStruct;
5
- /**
6
- * Shade (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.7): a thread a ray of the frame's updates, R a listed
7
- * probe, dispatched through `PROBE_DISPATCH_RAYS` after trace. The radiance the ray brings back goes
8
- * over its light, three half floats:
2
+ * Shade (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.7): a thread a ray of the frame's updates, dispatched
3
+ * through `PROBE_DISPATCH_RAYS` after trace, its probe the one trace wrote into its flags; a record of no
4
+ * ray (`PROBE_RAY_NONE`) is past the frame's last. The radiance the ray brings back goes over its light,
5
+ * three half floats:
9
6
  *
10
7
  * - a **miss** sees the environment along its direction, `sample_environment_color`;
11
8
  * - a **front-face hit** is `emissive + ρ_d·E_dir/π` (D7), its surface from `probe_clipmap_hit_surface`
@@ -14,11 +11,11 @@ export const PROBE_SHADE_SETTINGS: WebGPUStruct;
14
11
  * - an **unresolved** ray and a **back face** bring nothing back: accumulation discards the one and
15
12
  * counts the other (§8.4, §8.8).
16
13
  *
17
- * The local lights and the next bounce join E at S5 (§13).
14
+ * A front-face hit's diffuse albedo goes over its `row`, `pack4x8unorm`, and every other ray's row to
15
+ * zero: the light pass adds ρ_d·(E_loc + E_ind)/π after it (S5).
18
16
  *
19
17
  * @type {ComputeShader}
20
18
  */
21
19
  export const shader_probe_clipmap_shade: ComputeShader;
22
- import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
23
20
  import { ComputeShader } from "../../../shader/ComputeShader.js";
24
21
  //# sourceMappingURL=shader_probe_clipmap_shade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_probe_clipmap_shade.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js"],"names":[],"mappings":"AAyCA;;GAEG;AACH,mCAFU,YAAY,CAOG;AAyBzB;;;;;;;;;;;;;;;GAeG;AACH,yCAFU,aAAa,CAoDpB;6BA1H0B,sCAAsC;8BAHrC,kCAAkC"}
1
+ {"version":3,"file":"shader_probe_clipmap_shade.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;;;;;;;;GAiBG;AACH,yCAFU,aAAa,CAyDpB;8BAhH2B,kCAAkC"}
@@ -9,14 +9,14 @@ import { MESH_SDF_BRICK_VOXELS } from "../../../geometry/sdf/MESH_SDF.js";
9
9
  import { MESH_SDF_HEADERS_RESOURCE, MESH_SDF_INDIRECTION_RESOURCE } from "../../../geometry/sdf/MESH_SDF_RESOURCES.js";
10
10
  import { ENVIRONMENT_MAP_SAMPLER_RESOURCE } from "../../../light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.js";
11
11
  import { SCENE_DATABASE_RESOURCE } from "../../../scene/SCENE_DATABASE_RESOURCE.js";
12
+ import { chunk_rgbe9995_decode } from "../../../shader/chunk/color/rgbe9995/chunk_rgbe9995_decode.js";
13
+ import { chunk_rgbe9995_encode } from "../../../shader/chunk/color/rgbe9995/chunk_rgbe9995_encode.js";
12
14
  import { chunk_uv_octahedral_unit_decode } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
13
15
  import { chunk_folded_workgroup_index } from "../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
14
16
  import { RECIPROCAL_PI_DECLARATION } from "../../../shader/chunk/math/RECIPROCAL_PI_DECLARATION.js";
15
17
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
16
18
  import { ComputeShader } from "../../../shader/ComputeShader.js";
17
19
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
18
- import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
19
- import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
20
20
  import { BRICK_TRACE_HIT, BRICK_TRACE_MISS } from "../brick/BRICK_CLIPMAP.js";
21
21
  import { BRICK_LEVELS_RESOURCE } from "../brick/chunk_brick_clipmap_trace.js";
22
22
  import {
@@ -26,33 +26,15 @@ import {
26
26
  } from "./chunk_probe_clipmap_hit_surface.js";
27
27
  import {
28
28
  chunk_probe_clipmap,
29
+ chunk_probe_clipmap_ray_origin,
29
30
  PROBE_ORIGINS_READ_RESOURCE,
30
31
  PROBE_RAYS_WRITE_RESOURCE,
31
32
  PROBE_TRACE_READ_RESOURCE
32
33
  } from "./chunk_probe_clipmap.js";
33
34
  import { PROBE_THREAD_WORKGROUP_SIZE } from "./PROBE_CLIPMAP.js";
34
35
 
35
- /**
36
- * The largest finite half float: radiance past it would be infinite in the ray's record and in the
37
- * atlas after it, and an infinity times a zero weight is a NaN in every sum it reaches.
38
- * @type {number}
39
- */
40
- const HALF_MAX = 65504;
41
-
42
- /**
43
- * @type {WebGPUStruct}
44
- */
45
- export const PROBE_SHADE_SETTINGS = WebGPUStruct.from({
46
- /** probes a frame updates at most: the trace list's bound */
47
- trace_capacity: u32,
48
- /** rays an update casts, R */
49
- rays_per_probe: u32,
50
- }, "ProbeShadeSettings");
51
-
52
36
  const resources = new ShaderResourceSetDescriptor();
53
37
 
54
- resources.setImmediate("settings", PROBE_SHADE_SETTINGS);
55
-
56
38
  resources.createGroup()
57
39
  .add(PROBE_TRACE_READ_RESOURCE)
58
40
  .add(PROBE_ORIGINS_READ_RESOURCE)
@@ -73,9 +55,10 @@ resources.createGroup()
73
55
  .add(MESH_CARD_EMISSIVE_RESOURCE);
74
56
 
75
57
  /**
76
- * Shade (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.7): a thread a ray of the frame's updates, R a listed
77
- * probe, dispatched through `PROBE_DISPATCH_RAYS` after trace. The radiance the ray brings back goes
78
- * over its light, three half floats:
58
+ * Shade (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.7): a thread a ray of the frame's updates, dispatched
59
+ * through `PROBE_DISPATCH_RAYS` after trace, its probe the one trace wrote into its flags; a record of no
60
+ * ray (`PROBE_RAY_NONE`) is past the frame's last. The radiance the ray brings back goes over its light,
61
+ * three half floats:
79
62
  *
80
63
  * - a **miss** sees the environment along its direction, `sample_environment_color`;
81
64
  * - a **front-face hit** is `emissive + ρ_d·E_dir/π` (D7), its surface from `probe_clipmap_hit_surface`
@@ -84,7 +67,8 @@ resources.createGroup()
84
67
  * - an **unresolved** ray and a **back face** bring nothing back: accumulation discards the one and
85
68
  * counts the other (§8.4, §8.8).
86
69
  *
87
- * The local lights and the next bounce join E at S5 (§13).
70
+ * A front-face hit's diffuse albedo goes over its `row`, `pack4x8unorm`, and every other ray's row to
71
+ * zero: the light pass adds ρ_d·(E_loc + E_ind)/π after it (S5).
88
72
  *
89
73
  * @type {ComputeShader}
90
74
  */
@@ -100,42 +84,47 @@ fn main(
100
84
  @builtin(local_invocation_index) lane: u32,
101
85
  ) {
102
86
  let ray = folded_workgroup_index(workgroup_id) * PROBE_THREAD_WORKGROUP_SIZE + lane;
103
- let rays = settings.rays_per_probe;
87
+ let record = probe_rays[ray];
88
+ let kind = record.flags & PROBE_RAY_KIND_MASK;
104
89
 
105
- if (ray >= min(probe_trace.count, settings.trace_capacity) * rays) {
90
+ if (kind == PROBE_RAY_NONE) {
106
91
  return;
107
92
  }
108
-
109
- let record = probe_rays[ray];
110
- let kind = record.flags & PROBE_RAY_KIND_MASK;
111
93
  let direction = uv_octahedral_unit_decode(unpack2x16unorm(record.direction));
112
94
 
113
95
  var radiance = vec3<f32>(0.0);
96
+ var albedo = vec3<f32>(0.0);
114
97
 
115
98
  if (kind == ${BRICK_TRACE_MISS}u) {
116
99
  radiance = sample_environment_color(tEnvironment, sEnvironment, direction);
117
100
  } else if (kind == ${BRICK_TRACE_HIT}u && (record.flags & PROBE_RAY_BACK_FACE) == 0u) {
118
- let position = probe_origins[ray / rays].xyz + record.t * direction;
101
+ let k = record.flags >> PROBE_RAY_PROBE_SHIFT;
102
+ let origin = probe_clipmap_ray_origin(probe_origins[k], probe_trace.elements[k], record.direction);
103
+ let position = origin + record.t * direction;
119
104
  let normal = uv_octahedral_unit_decode(unpack2x16unorm(record.normal));
120
- let voxel = brick_levels[record.flags >> PROBE_RAY_CASCADE_SHIFT].cell_size / ${MESH_SDF_BRICK_VOXELS}.0;
105
+ let voxel = brick_levels[(record.flags >> PROBE_RAY_CASCADE_SHIFT) & PROBE_RAY_CASCADE_MASK].cell_size / ${MESH_SDF_BRICK_VOXELS}.0;
121
106
 
122
107
  let surface = probe_clipmap_hit_surface(record.row, position, normal, voxel);
123
- let direct = vec3<f32>(unpack2x16float(record.light_rg), unpack2x16float(record.light_b).x);
108
+ let direct = rgbe9995_decode(record.light);
124
109
 
125
110
  radiance = surface.emissive + surface.albedo * direct * RECIPROCAL_PI;
111
+ albedo = surface.albedo;
126
112
  }
127
113
 
128
- let held = min(radiance, vec3<f32>(${HALF_MAX}.0));
129
-
130
- probe_rays[ray].light_rg = pack2x16float(held.rg);
131
- probe_rays[ray].light_b = pack2x16float(vec2<f32>(held.b, 0.0));
114
+ // held to RGB9E5's largest value, which the half-float atlas also holds: an infinity there times a
115
+ // zero weight would be a NaN in every sum it reaches
116
+ probe_rays[ray].light = rgbe9995_encode(radiance);
117
+ probe_rays[ray].row = pack4x8unorm(vec4<f32>(albedo, 0.0));
132
118
  }
133
119
  `, [
134
120
  chunk_probe_clipmap,
121
+ chunk_probe_clipmap_ray_origin,
135
122
  chunk_folded_workgroup_index,
136
123
  chunk_uv_octahedral_unit_decode,
137
124
  chunk_sample_environment_color,
138
125
  chunk_probe_clipmap_hit_surface,
126
+ chunk_rgbe9995_decode,
127
+ chunk_rgbe9995_encode,
139
128
  RECIPROCAL_PI_DECLARATION,
140
129
  ]),
141
130
  });
@@ -3,27 +3,34 @@
3
3
  */
4
4
  export const PROBE_TRACE_SETTINGS: WebGPUStruct;
5
5
  /**
6
- * Trace (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.6): a thread a ray of the frame's updates, R a listed
7
- * probe, dispatched through `PROBE_DISPATCH_RAYS`.
6
+ * Trace (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.6): a thread a ray of the frame's updates, dispatched
7
+ * through `PROBE_DISPATCH_RAYS`. The rays are laid out by listed probe (`probe_ray_sums`): a ray finds
8
+ * its probe by bisecting the sums, and its place among the probe's rays from the probe's first. A thread
9
+ * past the frame's last ray writes a record of no ray (`PROBE_RAY_NONE`), where the passes after stop.
8
10
  *
9
- * - **Texel**: `probe_clipmap_ray_texel`, all of them an update, or a spread subset below R = n_r².
11
+ * - **Texel**: on a uniform update (`PROBE_UNIFORM_PERIOD`), `probe_clipmap_ray_texel`: all of them,
12
+ * or a spread subset below R = n_r². On a guided one, the walk position whose rays the ray is among
13
+ * in the probe's guide (`chunk_probe_clipmap_guide`), found by bisecting the first rays. A texel's rays
14
+ * then follow one another, in the walk's order.
10
15
  * - **Direction**: the texel's octahedral square, jittered by STBN at the texel, moved by the slot's
11
16
  * hash so that neighbouring probes do not jitter alike, and at the update count: one stratified,
12
- * jittered ray a texel, LPV's own pattern.
13
- * - **Origin**: the probe where relocation left it, `probe_origins`; t_min one voxel of the brick
14
- * cascade there.
17
+ * jittered ray a texel, LPV's own pattern. A guided texel's later rays rotate that jitter by R2
18
+ * (`probe_clipmap_guided_ray_jitter`).
19
+ * - **Origin**: a point of a small ball around the probe where relocation left it, `probe_origins`, one a
20
+ * ray (`probe_clipmap_ray_origin`); t_min one voxel of the brick cascade there.
15
21
  * - **Direct light**: a hit off a front face takes E_dir = Σ colour·max(0, n·l)·visibility over the
16
- * directional lights (§8.7). The visibility is the brick clipmap's soft shadow toward each of the
17
- * first {@link PROBE_SHADOWED_SUNS} lights that cast shadows, in the table's order, from a voxel off
18
- * the hit along its normal, outside the half-voxel expand; lights past them are unshadowed at hits. A
19
- * surface turned from a light marches no shadow toward it, since the light gives it nothing.
20
- * - Measured on Sponza at 1280×720 with 131,072 rays, the shadows are about half of the pass on the
21
- * AMD iGPU (7.9 ms against 4.2 without them) and most of it on the RTX 4090 (355 µs against 62). Most
22
- * hits are on walls nearly parallel to a high sun, whose shadow rays graze them.
22
+ * directional lights (§8.7). The visibility is a shadow ray, traced through the brick clipmap as the
23
+ * ray itself was, toward each of the first {@link PROBE_SHADOWED_SUNS} lights that cast shadows, in the
24
+ * table's order; lights past them are unshadowed at hits. It starts a voxel off the hit along its
25
+ * normal, outside the half-voxel expand, and heads for a point of the light's disk drawn as the path
26
+ * tracer draws it (`cone_sample_direction`), from the ray's slot and direction, so that the probe's
27
+ * blend of its rays integrates the penumbra. The light is seen whole if the ray misses, and not at all
28
+ * if it hits or spends its steps: what the march could not answer is no light, not all of it. A
29
+ * surface turned from a light traces no ray toward it, since the light gives it nothing.
23
30
  * - **Back face**: a hit whose field's gradient is along the ray, so it came from inside a solid.
24
31
  *
25
32
  * Writes the ray's `PROBE_RAY_STRUCT`, with the `meshes` row of the hit's surface and E_dir as its
26
- * light, which shade turns into the ray's radiance.
33
+ * light, which shade turns into the ray's radiance, and its probe's place in the list in its flags.
27
34
  *
28
35
  * @type {ComputeShader}
29
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"shader_probe_clipmap_trace.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js"],"names":[],"mappings":"AAuCA;;GAEG;AACH,mCAFU,YAAY,CAaG;AAsBzB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,yCAFU,aAAa,CAwGpB;6BA5L0B,sCAAsC;8BAHrC,kCAAkC"}
1
+ {"version":3,"file":"shader_probe_clipmap_trace.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js"],"names":[],"mappings":"AA+CA;;GAEG;AACH,mCAFU,YAAY,CAeG;AAwBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,yCAFU,aAAa,CAoJpB;6BAzP0B,sCAAsC;8BAHrC,kCAAkC"}
@@ -2,12 +2,14 @@ import { MESH_SDF_BRICK_VOXELS } from "../../../geometry/sdf/MESH_SDF.js";
2
2
  import { LIGHT_DATA_RESOURCE } from "../../../light/LIGHT_DATA_RESOURCE.js";
3
3
  import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
4
4
  import { LIGHT_FLAGS } from "../../../light/model/io/LIGHT_FLAGS.js";
5
+ import { chunk_cone_sample_direction } from "../../../shader/chunk/geometry/cone/chunk_cone_sample_direction.js";
5
6
  import { chunk_uv_octahedral_unit_decode } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_decode.js";
6
7
  import { chunk_uv_octahedral_unit_encode } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
8
+ import { chunk_rgbe9995_encode } from "../../../shader/chunk/color/rgbe9995/chunk_rgbe9995_encode.js";
7
9
  import { chunk_folded_workgroup_index } from "../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
8
10
  import { chunk_directional_lights_iteration_mask } from "../../../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
9
- import { chunk_stbn_sample_vec2 } from "../../../shader/chunk/noise/chunk_stbn_sample_vec2.js";
10
- import { chunk_hash_lowbias32 } from "../../../shader/chunk/random/chunk_hash_lowbias32.js";
11
+ import { chunk_hash_to_float01 } from "../../../shader/chunk/random/chunk_hash_to_float01.js";
12
+ import { chunk_pcg3d } from "../../../shader/chunk/random/pcg/chunk_pcg3d.js";
11
13
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
12
14
  import { ComputeShader } from "../../../shader/ComputeShader.js";
13
15
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
@@ -22,13 +24,19 @@ import {
22
24
  BRICK_OCCUPANCY_TEXTURE_RESOURCE,
23
25
  BRICK_SAMPLER_RESOURCE,
24
26
  chunk_brick_clipmap_object,
25
- chunk_brick_clipmap_soft_shadow,
26
27
  chunk_brick_clipmap_trace
27
28
  } from "../brick/chunk_brick_clipmap_trace.js";
28
29
  import {
29
30
  chunk_probe_clipmap,
31
+ chunk_probe_clipmap_guide,
32
+ chunk_probe_clipmap_guided_ray_jitter,
33
+ chunk_probe_clipmap_ray_jitter,
34
+ chunk_probe_clipmap_ray_layout,
35
+ chunk_probe_clipmap_ray_origin,
30
36
  chunk_probe_clipmap_ray_texel,
37
+ PROBE_GUIDE_READ_RESOURCE,
31
38
  PROBE_ORIGINS_READ_RESOURCE,
39
+ PROBE_RAY_SUMS_READ_RESOURCE,
32
40
  PROBE_RAYS_WRITE_RESOURCE,
33
41
  PROBE_STATES_READ_RESOURCE,
34
42
  PROBE_TRACE_READ_RESOURCE
@@ -43,7 +51,7 @@ const DIRECTIONAL = LIGHT_DATABASE_SPEC.get('light_directional');
43
51
  export const PROBE_TRACE_SETTINGS = WebGPUStruct.from({
44
52
  /** probes a frame updates at most: the trace list's bound */
45
53
  trace_capacity: u32,
46
- /** rays an update casts, R, a power of two */
54
+ /** rays a uniform update casts, R, a power of two; a guided update casts its probe's own (`probe_ray_sums`) */
47
55
  rays_per_probe: u32,
48
56
  /** octahedral radiance texels a side, n_r, a power of two */
49
57
  radiance_resolution: u32,
@@ -51,6 +59,8 @@ export const PROBE_TRACE_SETTINGS = WebGPUStruct.from({
51
59
  brick_cascade_count: u32,
52
60
  /** how far a ray goes before it is a miss, metres: across the coarsest window */
53
61
  t_max: f32,
62
+ /** updates between a probe's uniform ones, `PROBE_UNIFORM_PERIOD` */
63
+ uniform_period: u32,
54
64
  }, "ProbeTraceSettings");
55
65
 
56
66
  const resources = new ShaderResourceSetDescriptor();
@@ -62,6 +72,8 @@ resources.createGroup()
62
72
  .add(PROBE_TRACE_READ_RESOURCE)
63
73
  .add(PROBE_ORIGINS_READ_RESOURCE)
64
74
  .add(PROBE_RAYS_WRITE_RESOURCE)
75
+ .add(PROBE_RAY_SUMS_READ_RESOURCE)
76
+ .add(PROBE_GUIDE_READ_RESOURCE)
65
77
  .add(STBN_VEC2_RESOURCE)
66
78
  .add(LIGHT_DATA_RESOURCE);
67
79
 
@@ -74,27 +86,34 @@ resources.createGroup()
74
86
  .add(BRICK_OBJECTS_RESOURCE);
75
87
 
76
88
  /**
77
- * Trace (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.6): a thread a ray of the frame's updates, R a listed
78
- * probe, dispatched through `PROBE_DISPATCH_RAYS`.
89
+ * Trace (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.6): a thread a ray of the frame's updates, dispatched
90
+ * through `PROBE_DISPATCH_RAYS`. The rays are laid out by listed probe (`probe_ray_sums`): a ray finds
91
+ * its probe by bisecting the sums, and its place among the probe's rays from the probe's first. A thread
92
+ * past the frame's last ray writes a record of no ray (`PROBE_RAY_NONE`), where the passes after stop.
79
93
  *
80
- * - **Texel**: `probe_clipmap_ray_texel`, all of them an update, or a spread subset below R = n_r².
94
+ * - **Texel**: on a uniform update (`PROBE_UNIFORM_PERIOD`), `probe_clipmap_ray_texel`: all of them,
95
+ * or a spread subset below R = n_r². On a guided one, the walk position whose rays the ray is among
96
+ * in the probe's guide (`chunk_probe_clipmap_guide`), found by bisecting the first rays. A texel's rays
97
+ * then follow one another, in the walk's order.
81
98
  * - **Direction**: the texel's octahedral square, jittered by STBN at the texel, moved by the slot's
82
99
  * hash so that neighbouring probes do not jitter alike, and at the update count: one stratified,
83
- * jittered ray a texel, LPV's own pattern.
84
- * - **Origin**: the probe where relocation left it, `probe_origins`; t_min one voxel of the brick
85
- * cascade there.
100
+ * jittered ray a texel, LPV's own pattern. A guided texel's later rays rotate that jitter by R2
101
+ * (`probe_clipmap_guided_ray_jitter`).
102
+ * - **Origin**: a point of a small ball around the probe where relocation left it, `probe_origins`, one a
103
+ * ray (`probe_clipmap_ray_origin`); t_min one voxel of the brick cascade there.
86
104
  * - **Direct light**: a hit off a front face takes E_dir = Σ colour·max(0, n·l)·visibility over the
87
- * directional lights (§8.7). The visibility is the brick clipmap's soft shadow toward each of the
88
- * first {@link PROBE_SHADOWED_SUNS} lights that cast shadows, in the table's order, from a voxel off
89
- * the hit along its normal, outside the half-voxel expand; lights past them are unshadowed at hits. A
90
- * surface turned from a light marches no shadow toward it, since the light gives it nothing.
91
- * - Measured on Sponza at 1280×720 with 131,072 rays, the shadows are about half of the pass on the
92
- * AMD iGPU (7.9 ms against 4.2 without them) and most of it on the RTX 4090 (355 µs against 62). Most
93
- * hits are on walls nearly parallel to a high sun, whose shadow rays graze them.
105
+ * directional lights (§8.7). The visibility is a shadow ray, traced through the brick clipmap as the
106
+ * ray itself was, toward each of the first {@link PROBE_SHADOWED_SUNS} lights that cast shadows, in the
107
+ * table's order; lights past them are unshadowed at hits. It starts a voxel off the hit along its
108
+ * normal, outside the half-voxel expand, and heads for a point of the light's disk drawn as the path
109
+ * tracer draws it (`cone_sample_direction`), from the ray's slot and direction, so that the probe's
110
+ * blend of its rays integrates the penumbra. The light is seen whole if the ray misses, and not at all
111
+ * if it hits or spends its steps: what the march could not answer is no light, not all of it. A
112
+ * surface turned from a light traces no ray toward it, since the light gives it nothing.
94
113
  * - **Back face**: a hit whose field's gradient is along the ray, so it came from inside a solid.
95
114
  *
96
115
  * Writes the ray's `PROBE_RAY_STRUCT`, with the `meshes` row of the hit's surface and E_dir as its
97
- * light, which shade turns into the ray's radiance.
116
+ * light, which shade turns into the ray's radiance, and its probe's place in the list in its flags.
98
117
  *
99
118
  * @type {ComputeShader}
100
119
  */
@@ -104,37 +123,71 @@ export const shader_probe_clipmap_trace = ComputeShader.from({
104
123
  body: CodeChunk.from(
105
124
  //language=WGSL
106
125
  `
126
+ // the walk position among whose rays a ray of the probe falls, its guide starting at word base: the last
127
+ // whose first ray is at most it
128
+ fn probe_trace_guided_position(base: u32, ray: u32, texels: u32) -> u32 {
129
+ var low = 0u;
130
+ var high = texels;
131
+
132
+ // the first ray of position 0 is 0, so the low end always qualifies; log2(n_r²) steps
133
+ while (high - low > 1u) {
134
+ let middle = low + ((high - low) >> 1u);
135
+
136
+ if (probe_guide[base + middle] <= ray) {
137
+ low = middle;
138
+ } else {
139
+ high = middle;
140
+ }
141
+ }
142
+
143
+ return low;
144
+ }
145
+
107
146
  @compute @workgroup_size(${PROBE_THREAD_WORKGROUP_SIZE})
108
147
  fn main(
109
148
  @builtin(workgroup_id) workgroup_id: vec3<u32>,
110
149
  @builtin(local_invocation_index) lane: u32,
111
150
  ) {
112
151
  let ray = folded_workgroup_index(workgroup_id) * PROBE_THREAD_WORKGROUP_SIZE + lane;
113
- let rays = settings.rays_per_probe;
152
+ let k = probe_clipmap_ray_probe(ray);
153
+
154
+ if (k >= probe_ray_sums.count) {
155
+ probe_rays[ray].row = 0u;
156
+ probe_rays[ray].flags = PROBE_RAY_NONE;
114
157
 
115
- if (ray >= min(probe_trace.count, settings.trace_capacity) * rays) {
116
158
  return;
117
159
  }
118
160
 
119
- let slot = probe_trace.elements[ray / rays];
120
- let i = ray % rays;
161
+ // the update's rays, and this one's place among them
162
+ let span = probe_clipmap_probe_rays(k);
163
+ let rays = span.y;
164
+ let i = ray - span.x;
165
+
166
+ let slot = probe_trace.elements[k];
121
167
 
122
168
  let n = settings.radiance_resolution;
123
169
  let texels = n * n;
124
170
  let state = probe_states[slot];
125
171
  let updates = probe_state_updates(state.x);
126
172
 
127
- let texel = probe_clipmap_ray_texel(i, updates, rays, texels);
128
- let round = select(0u, i / texels, rays >= texels);
129
- let per_texel = max(rays / texels, 1u);
173
+ var texel: u32;
174
+ var jitter: vec2<f32>;
130
175
 
131
- let scramble = hash_lowbias32(slot);
132
- let noise_xy = vec2<u32>(texel % n, texel / n) + vec2<u32>(scramble & 127u, (scramble >> 7u) & 127u);
133
- let jitter = stbn_sample_vec2(vec3<u32>(noise_xy, updates * per_texel + round));
176
+ if (probe_clipmap_guided(state.x, settings.uniform_period, settings.rays_per_probe, texels)) {
177
+ let base = k * probe_clipmap_guide_words(n);
178
+ let position = probe_trace_guided_position(base, i, texels);
179
+
180
+ texel = probe_clipmap_guide_texel(position, updates, n);
181
+ jitter = probe_clipmap_guided_ray_jitter(slot, texel, i - probe_guide[base + position], updates, rays, n);
182
+ } else {
183
+ texel = probe_clipmap_ray_texel(i, updates, rays, texels);
184
+ jitter = probe_clipmap_ray_jitter(slot, texel, i, updates, rays, n);
185
+ }
134
186
 
135
187
  let direction = uv_octahedral_unit_decode((vec2<f32>(f32(texel % n), f32(texel / n)) + jitter) / f32(n));
188
+ let packed = pack2x16unorm(uv_octahedral_unit_encode(direction));
136
189
 
137
- let origin = probe_origins[ray / rays].xyz;
190
+ let origin = probe_clipmap_ray_origin(probe_origins[k], slot, packed);
138
191
 
139
192
  let cascade_count = settings.brick_cascade_count;
140
193
  let start = brick_clipmap_start(origin, cascade_count);
@@ -165,10 +218,15 @@ fn main(
165
218
  var visible = 1.0;
166
219
 
167
220
  if ((light.flags & ${LIGHT_FLAGS.CASTS_SHADOW_BIT}u) != 0u && shadowed < ${PROBE_SHADOWED_SUNS}u) {
168
- // a surface turned from the light takes none of it whatever the shadow, so it marches none;
221
+ // a surface turned from the light takes none of it whatever the shadow, so it traces none;
169
222
  // the light keeps its place among the shadowed all the same
170
223
  if (n_dot_l > 0.0) {
171
- visible = brick_clipmap_soft_shadow(lifted, -light.direction, 0.0, settings.t_max, sin(light.disk_radius), cascade_count);
224
+ // a point of the disk of its own for each light, apart from the origin's draw
225
+ let hash = pcg3d(vec3<u32>(slot, packed, 0x3C6EF372u + shadowed));
226
+ let toward = cone_sample_direction(-light.direction, light.disk_radius, vec2<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y)));
227
+ let shadow = brick_clipmap_trace(lifted, toward, 0.0, settings.t_max, cascade_count);
228
+
229
+ visible = select(0.0, 1.0, shadow.kind == BRICK_TRACE_MISS);
172
230
  }
173
231
 
174
232
  shadowed++;
@@ -179,25 +237,30 @@ fn main(
179
237
  }
180
238
 
181
239
  probe_rays[ray].t = hit.t;
182
- probe_rays[ray].direction = pack2x16unorm(uv_octahedral_unit_encode(direction));
240
+ probe_rays[ray].direction = packed;
183
241
  probe_rays[ray].normal = select(0u, pack2x16unorm(uv_octahedral_unit_encode(hit.normal)), is_hit);
184
242
  probe_rays[ray].row = brick_clipmap_object(hit);
185
- probe_rays[ray].flags = hit.kind | select(0u, PROBE_RAY_BACK_FACE, back_face) | (select(0u, hit.cascade, is_hit) << PROBE_RAY_CASCADE_SHIFT);
186
- probe_rays[ray].light_rg = pack2x16float(direct.rg);
187
- probe_rays[ray].light_b = pack2x16float(vec2<f32>(direct.b, 0.0));
243
+ probe_rays[ray].flags = hit.kind | select(0u, PROBE_RAY_BACK_FACE, back_face) | (select(0u, hit.cascade, is_hit) << PROBE_RAY_CASCADE_SHIFT) | (k << PROBE_RAY_PROBE_SHIFT);
244
+ probe_rays[ray].light = rgbe9995_encode(direct);
188
245
  }
189
246
  `, [
190
247
  chunk_probe_clipmap,
248
+ chunk_probe_clipmap_ray_layout,
191
249
  chunk_probe_clipmap_ray_texel,
250
+ chunk_probe_clipmap_ray_jitter,
251
+ chunk_probe_clipmap_ray_origin,
252
+ chunk_probe_clipmap_guide,
253
+ chunk_probe_clipmap_guided_ray_jitter,
192
254
  chunk_folded_workgroup_index,
193
- chunk_hash_lowbias32,
194
- chunk_stbn_sample_vec2,
195
255
  chunk_uv_octahedral_unit_decode,
196
256
  chunk_uv_octahedral_unit_encode,
197
257
  chunk_brick_clipmap_trace,
198
258
  chunk_brick_clipmap_object,
199
- chunk_brick_clipmap_soft_shadow,
259
+ chunk_cone_sample_direction,
260
+ chunk_pcg3d,
261
+ chunk_hash_to_float01,
200
262
  chunk_directional_lights_iteration_mask,
263
+ chunk_rgbe9995_encode,
201
264
  DIRECTIONAL.chunk_read,
202
265
  ]),
203
266
  });