@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
@@ -1,5 +1,12 @@
1
+ import { chunk_multiscale_mean } from "../../../shader/chunk/filter/chunk_multiscale_mean.js";
2
+ import { MULTISCALE_MEAN_STRUCT } from "../../../shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js";
1
3
  import { chunk_folded_workgroup_index } from "../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
2
4
  import { chunk_index_to_grid2d } from "../../../shader/chunk/grid/chunk_index_to_grid2d.js";
5
+ import { chunk_f16_round_stochastic } from "../../../shader/chunk/math/chunk_f16_round_stochastic.js";
6
+ import { chunk_rgbe9995_decode } from "../../../shader/chunk/color/rgbe9995/chunk_rgbe9995_decode.js";
7
+ import { F16_MAX_DEFINITION } from "../../../shader/chunk/math/F16_MAX_DEFINITION.js";
8
+ import { chunk_hash_to_float01 } from "../../../shader/chunk/random/chunk_hash_to_float01.js";
9
+ import { chunk_pcg3d } from "../../../shader/chunk/random/pcg/chunk_pcg3d.js";
3
10
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
4
11
  import { ComputeShader } from "../../../shader/ComputeShader.js";
5
12
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
@@ -8,12 +15,17 @@ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
8
15
  import { BRICK_TRACE_MISS, BRICK_TRACE_UNRESOLVED } from "../brick/BRICK_CLIPMAP.js";
9
16
  import {
10
17
  chunk_probe_clipmap,
18
+ chunk_probe_clipmap_guide,
19
+ chunk_probe_clipmap_ray_layout,
11
20
  chunk_probe_clipmap_ray_texel,
12
21
  PROBE_DEPTH_HISTORY_RESOURCE,
22
+ PROBE_ESTIMATORS_RESOURCE,
23
+ PROBE_GUIDE_READ_RESOURCE,
13
24
  PROBE_MAPS_WRITE_RESOURCE,
14
25
  PROBE_ORIGINS_READ_RESOURCE,
15
26
  PROBE_RADIANCE_HISTORY_RESOURCE,
16
27
  PROBE_RAY_STRUCT,
28
+ PROBE_RAY_SUMS_READ_RESOURCE,
17
29
  PROBE_RAYS_READ_RESOURCE,
18
30
  PROBE_RECORDS_READ_RESOURCE,
19
31
  PROBE_STATES_READ_RESOURCE,
@@ -21,7 +33,9 @@ import {
21
33
  } from "./chunk_probe_clipmap.js";
22
34
  import {
23
35
  PROBE_BACK_FACE_DEPTH,
36
+ PROBE_CHANGE_SIGNIFICANCE,
24
37
  PROBE_DEPTH_LIMIT,
38
+ PROBE_DEPTH_TEXEL_RAYS,
25
39
  PROBE_RADIANCE_SAMPLES_LIMIT,
26
40
  PROBE_THREAD_WORKGROUP_SIZE
27
41
  } from "./PROBE_CLIPMAP.js";
@@ -32,7 +46,7 @@ import {
32
46
  export const PROBE_ACCUMULATE_SETTINGS = WebGPUStruct.from({
33
47
  /** probes a frame updates at most: the trace list's bound */
34
48
  trace_capacity: u32,
35
- /** rays an update casts, R */
49
+ /** rays a uniform update casts, R; a guided update casts its probe's own (`probe_ray_sums`) */
36
50
  rays_per_probe: u32,
37
51
  /** octahedral radiance texels a side, n_r */
38
52
  radiance_resolution: u32,
@@ -42,10 +56,12 @@ export const PROBE_ACCUMULATE_SETTINGS = WebGPUStruct.from({
42
56
  radiance_tiles_per_row: u32,
43
57
  /** tiles a row of the depth atlas */
44
58
  depth_tiles_per_row: u32,
45
- /** the frame's time on the records' clock, seconds */
46
- time: f32,
47
- /** the blend's response time, τ, seconds */
48
- response_time: f32,
59
+ /** the frame, of the frames the clipmap has recorded */
60
+ frame: u32,
61
+ /** the short mean's response, τ, in frames; the depth's blend's */
62
+ response_frames: f32,
63
+ /** updates between a probe's uniform ones, `PROBE_UNIFORM_PERIOD` */
64
+ uniform_period: u32,
49
65
  }, "ProbeAccumulateSettings");
50
66
 
51
67
  const resources = new ShaderResourceSetDescriptor();
@@ -56,11 +72,14 @@ resources.createGroup()
56
72
  .add(PROBE_TRACE_READ_RESOURCE)
57
73
  .add(PROBE_ORIGINS_READ_RESOURCE)
58
74
  .add(PROBE_RAYS_READ_RESOURCE)
75
+ .add(PROBE_RAY_SUMS_READ_RESOURCE)
59
76
  .add(PROBE_STATES_READ_RESOURCE)
60
77
  .add(PROBE_RECORDS_READ_RESOURCE)
78
+ .add(PROBE_GUIDE_READ_RESOURCE)
61
79
  .add(PROBE_MAPS_WRITE_RESOURCE)
62
80
  .add(PROBE_RADIANCE_HISTORY_RESOURCE)
63
- .add(PROBE_DEPTH_HISTORY_RESOURCE);
81
+ .add(PROBE_DEPTH_HISTORY_RESOURCE)
82
+ .add(PROBE_ESTIMATORS_RESOURCE);
64
83
 
65
84
  /**
66
85
  * Accumulate (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.8): a thread a texel of each listed probe's maps,
@@ -68,19 +87,49 @@ resources.createGroup()
68
87
  * gathers its own rays and writes the texel, blended with its history, to the probe's maps in
69
88
  * `probe_maps` (`probe_clipmap_maps_words`): two words a radiance texel, rgba as half floats; then a
70
89
  * word a radiance texel, its rays this update, resolved in the low half and back faces in the high,
71
- * which classification sums; then a word a depth texel, its moments as half floats.
90
+ * which classification sums; then a word a depth texel, its moments as half floats; then a word a
91
+ * radiance texel, how far its sample fell from its mean in its own deviation, luminance, held to
92
+ * `PROBE_CHANGE_SIGNIFICANCE`, and one for its blending one, as half floats, which the probe's ray request
93
+ * sums (zero where no sample was blended).
72
94
  *
73
- * - **Radiance**: the mean of the texel's resolved rays, a back face's being zero, blended by
74
- * α = max(1/(a+1), 1 − e^(−Δt·p/τ)). a is the texel's own count of the updates that reached it, held
75
- * in its alpha; p the updates between a texel's rays, n_r²/R below one ray a texel. Counting a texel
76
- * rather than the probe keeps α right where an update covers a subset: a texel's first ray is taken
77
- * whole whenever it comes. A texel no ray reached keeps its history.
78
- * - **Depth**: the moments (d, d²) of the rays landing in the texel, in spacings: a miss √3, a back
79
- * face 0.2·t (DDGI 2021's shortening), a hit t, every sample held to √3 (D9). Blended by the probe's
80
- * α = max(1/(n+1), 1 − e^(−Δt/τ)), n its updates. At most 64 rays a texel, which the settings hold
81
- * R to (R ≤ 64·n_d²).
95
+ * - **A texel's rays**: on a uniform update (`PROBE_UNIFORM_PERIOD`), `probe_clipmap_texel_ray`'s. On a
96
+ * guided one, the run that begins at its walk position in the probe's guide, at most
97
+ * `PROBE_TEXEL_RAYS` of them. A guided texel's rays are spread evenly over it however many it takes,
98
+ * so their mean needs no weight for the guide's choice.
99
+ * - **Radiance**: the mean of the texel's resolved rays, a back face's being zero, is a sample of the
100
+ * texel's multi-scale mean (`chunk_multiscale_mean`), its estimator in `probe_estimators` and its mean
101
+ * in the atlas.
102
+ * - Δt and τ are frames: Δt since the probe's last update, τ `response_frames`.
103
+ * - The short mean blends by β = max(1/(a+1), 1 − e^(−Δt·p/τ)), its variance by the same with 2τ. a is
104
+ * the texel's own count of the updates that reached it, held in its alpha; p the updates between a
105
+ * texel's rays: one over the share of updates that reach it, averaged over the uniform period
106
+ * (`probe_clipmap_guide_rate`), n_r²/R below one ray a texel when every update is uniform. A texel
107
+ * the guide passes over thus blends what it takes as fully as its rarity asks. Counting a texel
108
+ * rather than the probe keeps β right where an update covers a subset.
109
+ * - The mean blends by at least 1/(a+1) until the count reaches its limit: a young texel is its running
110
+ * mean, which the estimator's blend reduction, nothing at its seed, would otherwise hold back. Past it
111
+ * the estimator alone, down to 1/8192 an update on a noisy texel.
112
+ * - Samples are clipped once the variance's window has passed, when 1/(a+1) is no longer its blend:
113
+ * before that it holds no spread to clip to.
114
+ * - A texel's first sample seeds both means. A texel no ray reached keeps its history.
115
+ * - **Depth**: the moments (d, d²) of the rays landing in the texel, in spacings: a miss the limit, a
116
+ * back face 0.2·t (DDGI 2021's shortening), a hit t, every sample held to the limit, the farthest a
117
+ * cage tests a relocated probe, (1 + 0.45)·√3 (`PROBE_DEPTH_LIMIT`, D9). On a uniform update the
118
+ * sample is the plain mean, blended by the probe's α = max(1/(n+1), 1 − e^(−Δt/τ)), n its updates. At
119
+ * most 64 rays a texel, which the settings hold R to (R ≤ 64·n_d²).
120
+ * - On a guided update the sample is a mean of means: each radiance texel inside the depth texel gives
121
+ * its own mean, since the guide gives the brighter ones more rays, at most 64/f² of its rays,
122
+ * evenly strided. It is taken only when every one of them took rays. The guide gives a dark one,
123
+ * a back face's or a shadowed wall's, none, and the lit ones' depths are not the whole texel's: its
124
+ * depth comes from the uniform updates.
125
+ * - The time term's period is one over the share of updates that reach the depth texel, a uniform
126
+ * update counting as reaching every one, a guided one as often as its least reached radiance texel.
82
127
  * - **A new probe's history is another probe's**, its slot's last owner: on its first update a texel
83
128
  * no ray reached is cleared, radiance to nothing seen, depth to the moments of a miss.
129
+ * - **Stored rounded stochastically** onto halves (`f16_round_stochastic`), with noise fresh for each
130
+ * texel and update. Rounded by the store, a blend whose step is under a ULP would stop short of its
131
+ * target by up to a ULP/α, and below it, since both devices measured round toward zero: on a room
132
+ * glowing evenly, 1.5% at 60 Hz and 5.9% at 240 Hz. Rounded stochastically it moves in expectation.
84
133
  *
85
134
  * @type {ComputeShader}
86
135
  */
@@ -91,7 +140,44 @@ export const shader_probe_clipmap_accumulate = ComputeShader.from({
91
140
  //language=WGSL
92
141
  `
93
142
  fn probe_accumulate_light(ray: ${PROBE_RAY_STRUCT.wgsl_ref}) -> vec3<f32> {
94
- return vec3<f32>(unpack2x16float(ray.light_rg), unpack2x16float(ray.light_b).x);
143
+ return rgbe9995_decode(ray.light);
144
+ }
145
+
146
+ // uniform noise in [0, 1) for a texel's store, fresh each update
147
+ fn probe_accumulate_store_noise(slot: u32, texel: u32, updates: u32) -> vec3<f32> {
148
+ let hash = pcg3d(vec3<u32>(slot, texel, updates));
149
+
150
+ return vec3<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y), hash_to_float01(hash.z));
151
+ }
152
+
153
+ // a texel's estimator from its words, its mean the atlas's
154
+ fn probe_accumulate_estimator(mean: vec3<f32>, words: vec4<u32>) -> ${MULTISCALE_MEAN_STRUCT.wgsl_ref} {
155
+ let rg = unpack2x16float(words.x);
156
+ let b_r = unpack2x16float(words.y);
157
+ let deviation = vec3<f32>(b_r.y, unpack2x16float(words.z));
158
+ let tail = unpack2x16float(words.w);
159
+
160
+ return ${MULTISCALE_MEAN_STRUCT.make({
161
+ mean: 'mean',
162
+ short_mean: 'vec3<f32>(rg, b_r.x)',
163
+ variance: 'deviation * deviation',
164
+ reduction: 'tail.x',
165
+ inconsistency: 'tail.y',
166
+ })};
167
+ }
168
+
169
+ // a texel's estimator as its words: the means and the deviation rounded stochastically, as the maps are, by
170
+ // noise of their own after the texel's; the inconsistency held to a half
171
+ fn probe_accumulate_estimator_words(e: ${MULTISCALE_MEAN_STRUCT.wgsl_ref}, slot: u32, key: u32, updates: u32) -> vec4<u32> {
172
+ let short_mean = f16_round_stochastic(vec4<f32>(e.short_mean, 0.0), vec4<f32>(probe_accumulate_store_noise(slot, key, updates), 0.0));
173
+ let deviation = f16_round_stochastic(vec4<f32>(sqrt(e.variance), 0.0), vec4<f32>(probe_accumulate_store_noise(slot, key + 1u, updates), 0.0));
174
+
175
+ return vec4<u32>(
176
+ pack2x16float(short_mean.rg),
177
+ pack2x16float(vec2<f32>(short_mean.b, deviation.r)),
178
+ pack2x16float(deviation.gb),
179
+ pack2x16float(vec2<f32>(e.reduction, min(e.inconsistency, F16_MAX))),
180
+ );
95
181
  }
96
182
 
97
183
  // a ray's depth sample, in spacings: past a miss's, as far as a sample goes
@@ -105,6 +191,27 @@ fn probe_accumulate_depth(ray: ${PROBE_RAY_STRUCT.wgsl_ref}, spacing: f32) -> f3
105
191
  return min(select(t, ${PROBE_BACK_FACE_DEPTH} * t, (ray.flags & PROBE_RAY_BACK_FACE) != 0u), ${PROBE_DEPTH_LIMIT});
106
192
  }
107
193
 
194
+ // a guided update's rays of a radiance texel, for the probe whose guide starts at word base: the first
195
+ // one, and how many, at most PROBE_TEXEL_RAYS
196
+ fn probe_accumulate_guided_rays(base: u32, texel: u32, updates: u32, rays: u32, n: u32) -> vec2<u32> {
197
+ let texels = n * n;
198
+ let position = probe_clipmap_guide_texel(texel, updates, n);
199
+ let first = probe_guide[base + position];
200
+ let end = select(rays, probe_guide[base + position + 1u], position + 1u < texels);
201
+
202
+ return vec2<u32>(first, min(select(0u, end - first, end > first), PROBE_TEXEL_RAYS));
203
+ }
204
+
205
+ // the rays a guided update gives a radiance texel, R·(w + e)/W
206
+ fn probe_accumulate_expected_rays(base: u32, texel: u32, rays: u32, n: u32) -> f32 {
207
+ let texels = n * n;
208
+ let total = probe_guide[base + 2u * texels + 2u * n];
209
+ let share = probe_guide[base + 2u * texels + 2u * n + 1u];
210
+
211
+ // the guide passes always leave a total; a guide they never wrote gives nothing
212
+ return select(0.0, f32(rays) * f32(probe_guide[base + texels + texel] + share) / f32(total), total > 0u);
213
+ }
214
+
108
215
  @compute @workgroup_size(${PROBE_THREAD_WORKGROUP_SIZE})
109
216
  fn main(
110
217
  @builtin(workgroup_id) workgroup_id: vec3<u32>,
@@ -125,21 +232,28 @@ fn main(
125
232
  let i = thread % per_probe;
126
233
  let slot = probe_trace.elements[k];
127
234
 
128
- let rays = settings.rays_per_probe;
129
- let first_ray = k * rays;
235
+ // the update's rays: the probe's first among the frame's, and how many
236
+ let span = probe_clipmap_probe_rays(k);
237
+ let rays = span.y;
238
+ let first_ray = span.x;
130
239
  let updates = probe_state_updates(probe_states[slot].x);
131
- let elapsed = max(settings.time - probe_records[slot].traced_time, 0.0);
240
+ let elapsed = f32(settings.frame - probe_records[slot].traced_frame);
132
241
  let rounds = max(rays / texels, 1u);
133
242
 
134
243
  let maps = k * probe_clipmap_maps_words(n, m);
244
+ let guided = probe_clipmap_guided(probe_states[slot].x, settings.uniform_period, settings.rays_per_probe, texels);
245
+ let base = k * probe_clipmap_guide_words(n);
135
246
 
136
247
  if (i < texels) {
137
248
  var sum = vec3<f32>(0.0);
138
249
  var count = 0u;
139
250
  var back_faces = 0u;
140
251
 
141
- for (var round = 0u; round < rounds; round++) {
142
- let ray = probe_clipmap_texel_ray(i, round, updates, rays, texels);
252
+ let run = probe_accumulate_guided_rays(base, i, updates, rays, n);
253
+ let gathered = select(rounds, run.y, guided);
254
+
255
+ for (var round = 0u; round < gathered; round++) {
256
+ let ray = select(probe_clipmap_texel_ray(i, round, updates, rays, texels), run.x + round, guided);
143
257
 
144
258
  if (ray == PROBE_CLIPMAP_NONE) {
145
259
  continue;
@@ -160,17 +274,51 @@ fn main(
160
274
  let history = select(textureLoad(probe_radiance, tile + vec2<u32>(i % n, i / n), 0), vec4<f32>(0.0), updates == 0u);
161
275
 
162
276
  var texel = history;
277
+ // how far the sample fell from the texel's mean in its own deviation, luminance, and that it blended
278
+ // one: the probe's ray request reads their sums. A texel's part is held to PROBE_CHANGE_SIGNIFICANCE,
279
+ // so that one bright sample is one texel's at most
280
+ var change = vec2<f32>(0.0);
163
281
 
164
282
  if (count > 0u) {
165
- let period = max(1.0, f32(texels) / f32(rays));
166
- let alpha = max(1.0 / (history.a + 1.0), 1.0 - exp(-elapsed * period / settings.response_time));
283
+ let sample = sum / f32(count);
284
+ let estimator = slot * texels + i;
285
+ let rate = probe_clipmap_guide_rate(probe_accumulate_expected_rays(base, i, rays, n), settings.rays_per_probe, texels, settings.uniform_period);
286
+
287
+ var e = multiscale_mean_seed(sample);
288
+
289
+ if (history.a > 0.0) {
290
+ // the gap in response times, a texel's own: its period is one over its share of updates
291
+ let gap = elapsed / (rate * settings.response_frames);
292
+ let ramp = 1.0 / (history.a + 1.0);
293
+ let variance_time = 1.0 - exp(-0.5 * gap);
294
+ let before = probe_accumulate_estimator(history.rgb, probe_estimators[estimator]);
295
+ // the estimator's own floor on the variance
296
+ let deviation = rgb_to_luminance(sqrt(max(vec3<f32>(1e-5), before.variance)));
297
+
298
+ change = vec2<f32>(clamp(rgb_to_luminance(sample - history.rgb) / deviation, -${PROBE_CHANGE_SIGNIFICANCE}.0, ${PROBE_CHANGE_SIGNIFICANCE}.0), 1.0);
299
+
300
+ e = multiscale_mean_add(
301
+ before,
302
+ sample,
303
+ max(ramp, 1.0 - exp(-gap)),
304
+ max(ramp, variance_time),
305
+ select(0.0, ramp, history.a < ${PROBE_RADIANCE_SAMPLES_LIMIT}.0),
306
+ ramp <= variance_time,
307
+ );
308
+ }
309
+
310
+ texel = vec4<f32>(e.mean, min(history.a + 1.0, ${PROBE_RADIANCE_SAMPLES_LIMIT}.0));
167
311
 
168
- texel = vec4<f32>(mix(history.rgb, sum / f32(count), alpha), min(history.a + 1.0, ${PROBE_RADIANCE_SAMPLES_LIMIT}.0));
312
+ probe_estimators[estimator] = probe_accumulate_estimator_words(e, slot, per_probe + 2u * i, updates);
169
313
  }
170
314
 
171
- probe_maps[maps + 2u * i] = pack2x16float(texel.rg);
172
- probe_maps[maps + 2u * i + 1u] = pack2x16float(texel.ba);
315
+ // the count is whole, which any noise keeps
316
+ let stored = f16_round_stochastic(texel, vec4<f32>(probe_accumulate_store_noise(slot, i, updates), 0.0));
317
+
318
+ probe_maps[maps + 2u * i] = pack2x16float(stored.rg);
319
+ probe_maps[maps + 2u * i + 1u] = pack2x16float(stored.ba);
173
320
  probe_maps[maps + 2u * texels + i] = count | (back_faces << 16u);
321
+ probe_maps[maps + 3u * texels + m * m + i] = pack2x16float(change);
174
322
 
175
323
  return;
176
324
  }
@@ -181,8 +329,50 @@ fn main(
181
329
 
182
330
  var sum = vec2<f32>(0.0);
183
331
  var count = 0u;
332
+ // the share of guided updates that reach this texel: its least reached radiance texel's
333
+ var reach = 1.0;
334
+
335
+ if (n >= m && guided) {
336
+ // the radiance texels inside this one, each a mean of its own
337
+ let f = n / m;
338
+ let budget = max(${PROBE_DEPTH_TEXEL_RAYS}u / (f * f), 1u);
184
339
 
185
- if (n >= m) {
340
+ for (var v = 0u; v < f; v++) {
341
+ for (var u = 0u; u < f; u++) {
342
+ let texel = (at.y * f + v) * n + at.x * f + u;
343
+ let run = probe_accumulate_guided_rays(base, texel, updates, rays, n);
344
+ let stride = max((run.y + budget - 1u) / budget, 1u);
345
+
346
+ reach = min(reach, min(probe_accumulate_expected_rays(base, texel, rays, n), 1.0));
347
+
348
+ var texel_sum = vec2<f32>(0.0);
349
+ var texel_count = 0u;
350
+
351
+ for (var q = 0u; q < run.y; q += stride) {
352
+ let record = probe_rays[first_ray + run.x + q];
353
+
354
+ if ((record.flags & PROBE_RAY_KIND_MASK) == ${BRICK_TRACE_UNRESOLVED}u) {
355
+ continue;
356
+ }
357
+
358
+ let d = probe_accumulate_depth(record, spacing);
359
+
360
+ texel_sum += vec2<f32>(d, d * d);
361
+ texel_count++;
362
+ }
363
+
364
+ if (texel_count > 0u) {
365
+ sum += texel_sum / f32(texel_count);
366
+ count++;
367
+ }
368
+ }
369
+ }
370
+
371
+ // a radiance texel the guide gave no ray, a dark one: the lit ones' depths are not the whole texel's
372
+ if (count < f * f) {
373
+ count = 0u;
374
+ }
375
+ } else if (n >= m) {
186
376
  // the radiance texels inside this one: their rays land in it
187
377
  let f = n / m;
188
378
 
@@ -190,6 +380,8 @@ fn main(
190
380
  for (var u = 0u; u < f; u++) {
191
381
  let texel = (at.y * f + v) * n + at.x * f + u;
192
382
 
383
+ reach = min(reach, min(probe_accumulate_expected_rays(base, texel, rays, n), 1.0));
384
+
193
385
  for (var round = 0u; round < rounds; round++) {
194
386
  let ray = probe_clipmap_texel_ray(texel, round, updates, rays, texels);
195
387
 
@@ -214,9 +406,14 @@ fn main(
214
406
  // the radiance texel this one is inside: those of its rays whose direction lands here
215
407
  let f = m / n;
216
408
  let texel = (at.y / f) * n + at.x / f;
409
+ let run = probe_accumulate_guided_rays(base, texel, updates, rays, n);
410
+ let gathered = select(rounds, run.y, guided);
217
411
 
218
- for (var round = 0u; round < rounds; round++) {
219
- let ray = probe_clipmap_texel_ray(texel, round, updates, rays, texels);
412
+ // of the radiance texel's rays, the share whose direction lands here
413
+ reach = min(probe_accumulate_expected_rays(base, texel, rays, n) / f32(f * f), 1.0);
414
+
415
+ for (var round = 0u; round < gathered; round++) {
416
+ let ray = select(probe_clipmap_texel_ray(texel, round, updates, rays, texels), run.x + round, guided);
220
417
 
221
418
  if (ray == PROBE_CLIPMAP_NONE) {
222
419
  continue;
@@ -242,20 +439,35 @@ fn main(
242
439
  var moments = textureLoad(probe_depth, tile + at, 0).rg;
243
440
 
244
441
  if (count > 0u) {
245
- let alpha = max(1.0 / f32(updates + 1u), 1.0 - exp(-elapsed / settings.response_time));
442
+ // a uniform update reaches every depth texel, a guided one those its rays land in
443
+ let period = f32(settings.uniform_period);
444
+ let rate = (1.0 + (period - 1.0) * reach) / period;
445
+ let alpha = max(1.0 / f32(updates + 1u), 1.0 - exp(-elapsed / (rate * settings.response_frames)));
246
446
 
247
447
  moments = mix(moments, sum / f32(count), alpha);
248
448
  } else if (updates == 0u) {
249
449
  moments = vec2<f32>(${PROBE_DEPTH_LIMIT}, ${PROBE_DEPTH_LIMIT} * ${PROBE_DEPTH_LIMIT});
250
450
  }
251
451
 
252
- probe_maps[maps + 3u * texels + j] = pack2x16float(moments);
452
+ let noise = probe_accumulate_store_noise(slot, texels + j, updates);
453
+ let stored = f16_round_stochastic(vec4<f32>(moments, 0.0, 0.0), vec4<f32>(noise.xy, 0.0, 0.0));
454
+
455
+ probe_maps[maps + 3u * texels + j] = pack2x16float(stored.xy);
253
456
  }
254
457
  `, [
255
458
  chunk_probe_clipmap,
459
+ chunk_probe_clipmap_ray_layout,
256
460
  chunk_probe_clipmap_ray_texel,
461
+ chunk_probe_clipmap_guide,
257
462
  chunk_folded_workgroup_index,
258
463
  chunk_index_to_grid2d,
464
+ chunk_f16_round_stochastic,
465
+ chunk_pcg3d,
466
+ chunk_hash_to_float01,
467
+ chunk_multiscale_mean,
468
+ F16_MAX_DEFINITION,
469
+ chunk_rgbe9995_decode,
259
470
  PROBE_RAY_STRUCT.declaration_chunk,
471
+ MULTISCALE_MEAN_STRUCT.declaration_chunk,
260
472
  ]),
261
473
  });
@@ -17,12 +17,19 @@ export const PROBE_ADMIT_SETTINGS: WebGPUStruct;
17
17
  * Admit (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3): a thread a point wanted this frame, dispatched
18
18
  * through `PROBE_DISPATCH_ADMIT`.
19
19
  *
20
- * A point that has a probe has its wanted time brought to the frame's. One that has none pops a slot:
20
+ * A point that has a probe has its wanted frame brought to this one. One that has none pops a slot:
21
21
  * the slot becomes a NEW probe at the point the cascade's window holds in that storage cell, with
22
22
  * nothing traced, its indirection entry names it, and it goes on the frame's active list. A pop the
23
23
  * free list cannot serve is counted, and the host grows the capacity on it (§7.10's pattern); the
24
24
  * point is wanted again the next frame.
25
25
  *
26
+ * Either way the probe is marked the screen's when its entry carries `PROBE_WANTED_SCREEN`, and the
27
+ * hits' when it does not, which decides whether its hits want in turn.
28
+ *
29
+ * A probe this frame's want leaves waiting for an update, that was not before, is counted into
30
+ * `PROBE_COUNTER_WAITING` beside retire's: one an update served since it was last wanted, and a NEW one.
31
+ * A probe that already waited, NEW or wanted since its last update, retire counted.
32
+ *
26
33
  * Retire ran first, so an entry that names a slot names the probe of this very point: the window holds
27
34
  * one point a storage cell, and a probe whose point left was freed.
28
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"shader_probe_clipmap_admit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js"],"names":[],"mappings":"AAuBA;;GAEG;AACH,2CAFU,YAAY,CAKU;AAUhC;;;;;GAKG;AACH,iDAFU,aAAa,CAqBpB;AAEH;;GAEG;AACH,mCAFU,YAAY,CAWG;AAgBzB;;;;;;;;;;;;;;GAcG;AACH,yCAFU,aAAa,CA6DpB;6BAhK0B,sCAAsC;8BAHrC,kCAAkC"}
1
+ {"version":3,"file":"shader_probe_clipmap_admit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js"],"names":[],"mappings":"AAwBA;;GAEG;AACH,2CAFU,YAAY,CAKU;AAUhC;;;;;GAKG;AACH,iDAFU,aAAa,CAqBpB;AAEH;;GAEG;AACH,mCAFU,YAAY,CAWG;AAgBzB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,yCAFU,aAAa,CAsEpB;6BAhL0B,sCAAsC;8BAHrC,kCAAkC"}
@@ -2,10 +2,11 @@ import { chunk_collection_u32_append } from "../../../gpu_primitive/chunk_collec
2
2
  import { chunk_folded_dispatch } from "../../../gpu_primitive/indirect/chunk_folded_dispatch.js";
3
3
  import { chunk_slot_stack } from "../../../gpu_primitive/slot_stack/chunk_slot_stack.js";
4
4
  import { chunk_folded_workgroup_index } from "../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
5
+ import { chunk_subgroup_atomic_add } from "../../../shader/chunk/subgroup/chunk_subgroup_atomic_add.js";
5
6
  import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
6
7
  import { ComputeShader } from "../../../shader/ComputeShader.js";
7
8
  import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
8
- import { f32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
+ import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
10
  import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
10
11
  import {
11
12
  chunk_probe_clipmap,
@@ -74,8 +75,8 @@ export const PROBE_ADMIT_SETTINGS = WebGPUStruct.from({
74
75
  resolution: u32,
75
76
  /** keys over every cascade: what the wanted list holds at most */
76
77
  key_count: u32,
77
- /** the frame's time, seconds since the clipmap was made */
78
- time: f32,
78
+ /** the frame, of the frames the clipmap has recorded */
79
+ frame: u32,
79
80
  }, "ProbeAdmitSettings");
80
81
 
81
82
  const resources = new ShaderResourceSetDescriptor();
@@ -96,12 +97,19 @@ resources.createGroup()
96
97
  * Admit (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3): a thread a point wanted this frame, dispatched
97
98
  * through `PROBE_DISPATCH_ADMIT`.
98
99
  *
99
- * A point that has a probe has its wanted time brought to the frame's. One that has none pops a slot:
100
+ * A point that has a probe has its wanted frame brought to this one. One that has none pops a slot:
100
101
  * the slot becomes a NEW probe at the point the cascade's window holds in that storage cell, with
101
102
  * nothing traced, its indirection entry names it, and it goes on the frame's active list. A pop the
102
103
  * free list cannot serve is counted, and the host grows the capacity on it (§7.10's pattern); the
103
104
  * point is wanted again the next frame.
104
105
  *
106
+ * Either way the probe is marked the screen's when its entry carries `PROBE_WANTED_SCREEN`, and the
107
+ * hits' when it does not, which decides whether its hits want in turn.
108
+ *
109
+ * A probe this frame's want leaves waiting for an update, that was not before, is counted into
110
+ * `PROBE_COUNTER_WAITING` beside retire's: one an update served since it was last wanted, and a NEW one.
111
+ * A probe that already waited, NEW or wanted since its last update, retire counted.
112
+ *
105
113
  * Retire ran first, so an entry that names a slot names the probe of this very point: the window holds
106
114
  * one point a storage cell, and a probe whose point left was freed.
107
115
  *
@@ -122,17 +130,25 @@ fn main(
122
130
 
123
131
  var slot = 0u;
124
132
  var admitted = false;
133
+ var waits = false;
125
134
 
126
135
  if (index < min(probe_wanted.count, settings.key_count)) {
127
136
  let resolution = settings.resolution;
128
- let key = probe_wanted.elements[index];
137
+ let wanted = probe_wanted.elements[index];
138
+ let key = wanted & ~PROBE_WANTED_SCREEN;
139
+ let screen = (wanted & PROBE_WANTED_SCREEN) != 0u;
129
140
  let cascade = probe_clipmap_key_cascade(key, resolution);
130
141
  let storage = probe_clipmap_key_storage(key, resolution);
131
142
  let texel = probe_clipmap_indirection_texel(cascade, storage, resolution);
132
143
  let entry = textureLoad(probe_indirection, texel).x;
133
144
 
134
145
  if (entry != PROBE_CLIPMAP_NONE) {
135
- probe_records[entry].wanted_time = settings.time;
146
+ let waited = probe_state_kind(probe_states[entry].x) == PROBE_STATE_NEW || probe_records[entry].wanted_frame > probe_records[entry].traced_frame;
147
+
148
+ probe_records[entry].wanted_frame = settings.frame;
149
+ probe_records[entry].flags = (probe_records[entry].flags & ~PROBE_RECORD_SCREEN) | select(0u, PROBE_RECORD_SCREEN, screen);
150
+
151
+ waits = !waited;
136
152
  } else {
137
153
  slot = slot_stack_pop(&probe_counters[PROBE_COUNTER_FREE], &probe_free, settings.capacity);
138
154
 
@@ -141,12 +157,10 @@ fn main(
141
157
  } else {
142
158
  // field by field: nothing of the slot's last probe stays
143
159
  probe_records[slot].cell = probe_clipmap_window_point(storage, probe_levels[cascade].corner, resolution);
144
- probe_records[slot].cascade = cascade;
145
- probe_records[slot].wanted_time = settings.time;
146
- probe_records[slot].traced_time = settings.time;
147
- probe_records[slot].back_face = 0.0;
148
- probe_records[slot].sh.CoCg = vec2<f32>(0.0);
149
- probe_records[slot].sh.Y = vec4<f32>(0.0);
160
+ probe_records[slot].flags = probe_record_flags(0.0, screen, cascade);
161
+ probe_records[slot].wanted_frame = settings.frame;
162
+ probe_records[slot].traced_frame = settings.frame;
163
+ probe_records[slot].sh = vec3<u32>(0u);
150
164
 
151
165
  // at its lattice point until its first update relocates it
152
166
  probe_states[slot] = vec2<u32>(probe_state(PROBE_STATE_NEW, 0u), 0u);
@@ -154,10 +168,12 @@ fn main(
154
168
  textureStore(probe_indirection, texel, vec4<u32>(slot, 0u, 0u, 0u));
155
169
 
156
170
  admitted = true;
171
+ waits = true;
157
172
  }
158
173
  }
159
174
  }
160
175
 
176
+ subgroup_atomic_add_u32(&probe_counters[PROBE_COUNTER_WAITING], select(0u, 1u, waits));
161
177
  collection_u32_append(&probe_active_write, admitted, slot, settings.capacity);
162
178
  }
163
179
  `, [
@@ -165,5 +181,6 @@ fn main(
165
181
  chunk_folded_workgroup_index,
166
182
  chunk_slot_stack,
167
183
  chunk_collection_u32_append,
184
+ chunk_subgroup_atomic_add,
168
185
  ]),
169
186
  });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The probe clipmap's deferred diffuse (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §9.2, §9.6): each pixel's
3
+ * irradiance from the probes `probe_clipmap_sample_sh` picks around it, with the frame's STBN for the
4
+ * pick, resolved at its bent normal and multiplied by π, the resolve giving E/π. A pixel no probe weighs
5
+ * anything for takes the environment's irradiance, as the IBL pass would give it. AO multiplies it, as in
6
+ * the IBL pass.
7
+ *
8
+ * @type {ImageShader}
9
+ */
10
+ export const shader_probe_clipmap_diffuse: ImageShader;
11
+ import { ImageShader } from "../../../shader/ImageShader.js";
12
+ //# sourceMappingURL=shader_probe_clipmap_diffuse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_probe_clipmap_diffuse.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js"],"names":[],"mappings":"AAgFA;;;;;;;;GAQG;AACH,2CAFU,WAAW,CAalB;4BAtFyB,gCAAgC"}