@woosh/meep-engine 3.42.0 → 3.44.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 (345) hide show
  1. package/editor/prototypeEditorShell.d.ts.map +1 -1
  2. package/editor/prototypeEditorShell.js +4 -2
  3. package/package.json +91 -96
  4. package/src/engine/Clock.d.ts +15 -0
  5. package/src/engine/Clock.d.ts.map +1 -1
  6. package/src/engine/Clock.js +29 -5
  7. package/src/engine/Engine.d.ts.map +1 -1
  8. package/src/engine/Engine.js +11 -19
  9. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts +57 -0
  10. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.d.ts.map +1 -0
  11. package/src/engine/graphics/ecs/mesh-v2/MeshSkin.js +84 -0
  12. package/src/engine/graphics3/AnimationGraphSystem.d.ts +23 -13
  13. package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
  14. package/src/engine/graphics3/AnimationGraphSystem.js +61 -64
  15. package/src/engine/graphics3/AnimationSystem.d.ts +24 -15
  16. package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
  17. package/src/engine/graphics3/AnimationSystem.js +67 -61
  18. package/src/engine/graphics3/MeshSkinSystem.d.ts +56 -0
  19. package/src/engine/graphics3/MeshSkinSystem.d.ts.map +1 -0
  20. package/src/engine/graphics3/MeshSkinSystem.js +317 -0
  21. package/src/engine/graphics3/MeshSystem.d.ts +15 -35
  22. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/MeshSystem.js +21 -298
  24. package/src/engine/graphics3/RowChains.d.ts +76 -0
  25. package/src/engine/graphics3/RowChains.d.ts.map +1 -0
  26. package/src/engine/graphics3/RowChains.js +347 -0
  27. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -0
  28. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  29. package/src/engine/graphics3/ShadedGeometrySystem.js +329 -309
  30. package/src/engine/graphics3/animation/AnimationClips.d.ts +56 -0
  31. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -0
  32. package/src/engine/graphics3/animation/AnimationClips.js +79 -0
  33. package/src/engine/graphics3/animation/ClipListPlayer.d.ts +13 -14
  34. package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
  35. package/src/engine/graphics3/animation/ClipListPlayer.js +262 -263
  36. package/src/engine/graphics3/animation/write_clip_playback.d.ts +3 -3
  37. package/src/engine/graphics3/animation/write_clip_playback.js +4 -4
  38. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +5 -0
  39. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  40. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +80 -75
  41. package/src/engine/graphics3/prefab/PrefabInstance.d.ts +4 -24
  42. package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -1
  43. package/src/engine/graphics3/prefab/PrefabInstance.js +60 -80
  44. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +16 -3
  45. package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
  46. package/src/engine/graphics3/prefab/prefab_instantiate.js +49 -12
  47. package/src/engine/graphics3/prefab/prefab_place.d.ts +31 -17
  48. package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -1
  49. package/src/engine/graphics3/prefab/prefab_place.js +175 -130
  50. package/src/engine/graphics3/register_clips.d.ts +64 -0
  51. package/src/engine/graphics3/register_clips.d.ts.map +1 -0
  52. package/src/engine/graphics3/register_clips.js +114 -0
  53. package/src/engine/physics/cloth/MEASUREMENTS.md +795 -0
  54. package/src/engine/physics/cloth/PLAN.md +339 -9
  55. package/src/engine/physics/cloth/build/ClothProxy.d.ts +113 -61
  56. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -1
  57. package/src/engine/physics/cloth/build/ClothProxy.js +142 -77
  58. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts +22 -0
  59. package/src/engine/physics/cloth/build/cloth_bind_in_frame.d.ts.map +1 -0
  60. package/src/engine/physics/cloth/build/cloth_bind_in_frame.js +75 -0
  61. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +43 -30
  62. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
  63. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +357 -284
  64. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts +62 -0
  65. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.d.ts.map +1 -0
  66. package/src/engine/physics/cloth/build/cloth_proxy_from_mesh.js +280 -0
  67. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +1 -1
  68. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +1 -1
  69. package/src/engine/physics/cloth/ecs/Cloth.d.ts +17 -9
  70. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  71. package/src/engine/physics/cloth/ecs/Cloth.js +220 -212
  72. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +6 -0
  73. package/src/engine/physics/cloth/ecs/ClothHold.d.ts +91 -0
  74. package/src/engine/physics/cloth/ecs/ClothHold.d.ts.map +1 -0
  75. package/src/engine/physics/cloth/ecs/ClothHold.js +103 -0
  76. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +254 -48
  77. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  78. package/src/engine/physics/cloth/ecs/ClothInstance.js +277 -47
  79. package/src/engine/physics/cloth/ecs/ClothPin.d.ts +73 -0
  80. package/src/engine/physics/cloth/ecs/ClothPin.d.ts.map +1 -0
  81. package/src/engine/physics/cloth/ecs/ClothPin.js +92 -0
  82. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts +36 -0
  83. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.d.ts.map +1 -0
  84. package/src/engine/physics/cloth/ecs/ClothPinSerializationAdapter.js +61 -0
  85. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +23 -17
  86. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
  87. package/src/engine/physics/cloth/ecs/ClothRig.js +29 -27
  88. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +12 -14
  89. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  90. package/src/engine/physics/cloth/ecs/ClothSystem.js +20 -15
  91. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +57 -36
  92. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  93. package/src/engine/physics/cloth/ecs/ClothWorld.js +816 -179
  94. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +12 -13
  95. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  96. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +20 -14
  97. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +63 -11
  98. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
  99. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +321 -84
  100. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +9 -7
  101. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  102. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +9 -7
  103. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +3 -3
  104. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +30 -30
  105. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts +37 -0
  106. package/src/engine/physics/cloth/ecs/cloth_geodesic.d.ts.map +1 -0
  107. package/src/engine/physics/cloth/ecs/cloth_geodesic.js +142 -0
  108. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts +97 -0
  109. package/src/engine/physics/cloth/ecs/cloth_holds.d.ts.map +1 -0
  110. package/src/engine/physics/cloth/ecs/cloth_holds.js +608 -0
  111. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +2 -2
  112. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -1
  113. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +160 -9
  114. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +17 -22
  115. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  116. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +55 -117
  117. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -6
  118. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  119. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +44 -15
  120. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +5 -0
  121. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  122. package/src/engine/physics/cloth/ecs/cloth_write_back.js +60 -16
  123. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
  124. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +65 -58
  125. package/src/engine/physics/cloth/playground/collide_main.js +1 -1
  126. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
  127. package/src/engine/physics/cloth/playground/garment_build.js +17 -5
  128. package/src/engine/physics/cloth/playground/garment_main.js +1 -1
  129. package/src/engine/physics/cloth/playground/rig_build.d.ts.map +1 -1
  130. package/src/engine/physics/cloth/playground/rig_build.js +302 -296
  131. package/src/engine/physics/cloth/solver/ClothState.d.ts +45 -7
  132. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  133. package/src/engine/physics/cloth/solver/ClothState.js +63 -7
  134. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +6 -1
  135. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  136. package/src/engine/physics/cloth/solver/cloth_contact_find.js +7 -2
  137. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts +114 -0
  138. package/src/engine/physics/cloth/solver/cloth_hold_line.d.ts.map +1 -0
  139. package/src/engine/physics/cloth/solver/cloth_hold_line.js +362 -0
  140. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +6 -2
  141. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
  142. package/src/engine/physics/cloth/solver/cloth_self_find.js +13 -13
  143. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +24 -12
  144. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  145. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +24 -12
  146. package/src/engine/physics/cloth/solver/cloth_step.d.ts +16 -0
  147. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/solver/cloth_step.js +183 -20
  149. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +1 -0
  150. package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/solver/cloth_step_instance.js +10 -3
  152. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts +1 -1
  153. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.d.ts.map +1 -1
  154. package/src/engine/physics/cloth/solver/constraint/cloth_leash_row.js +353 -346
  155. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +7 -5
  156. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
  157. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +7 -5
  158. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +9 -9
  159. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  160. package/src/engine/physics/cloth/wind/cloth_sample_air.js +26 -26
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/engine/simulation/Ticker.d.ts +13 -0
  163. package/src/engine/simulation/Ticker.d.ts.map +1 -1
  164. package/src/engine/simulation/Ticker.js +43 -8
  165. package/src/shade/RENDERER_CONTRACT.md +8 -2
  166. package/src/shade/playground/mesh_row_ceiling/main.js +2 -1
  167. package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
  168. package/src/shade/playground/skinned_blas_refit/main.js +11 -19
  169. package/src/shade/playground/skinned_blas_refit/place_character.d.ts +6 -3
  170. package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
  171. package/src/shade/playground/skinned_blas_refit/place_character.js +90 -90
  172. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  173. package/src/shade/playground/skinned_mesh_soup/main.js +502 -509
  174. package/src/shade/playground/texture_encode/README.md +129 -109
  175. package/src/shade/playground/texture_encode/main.js +1430 -1430
  176. package/src/shade/playground/vgeo_runtime/README.md +5 -4
  177. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  178. package/src/shade/renderer/Renderer.js +6 -5
  179. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +45 -14
  180. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  181. package/src/shade/renderer/animation/GPUAnimationManager.js +316 -64
  182. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +5 -0
  183. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  184. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -1
  185. package/src/shade/renderer/atmosphere/GPUSky.d.ts +12 -0
  186. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  187. package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
  188. package/src/shade/renderer/geometry/BoxGeometry.d.ts +1 -11
  189. package/src/shade/renderer/geometry/BoxGeometry.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/BoxGeometry.js +6 -13
  191. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts +19 -0
  192. package/src/shade/renderer/geometry/CapsuleGeometry.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/CapsuleGeometry.js +24 -0
  194. package/src/shade/renderer/geometry/ConeGeometry.d.ts +20 -0
  195. package/src/shade/renderer/geometry/ConeGeometry.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/ConeGeometry.js +33 -0
  197. package/src/shade/renderer/geometry/CylinderGeometry.d.ts +21 -0
  198. package/src/shade/renderer/geometry/CylinderGeometry.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/CylinderGeometry.js +35 -0
  200. package/src/shade/renderer/geometry/PlaneGeometry.d.ts +17 -0
  201. package/src/shade/renderer/geometry/PlaneGeometry.d.ts.map +1 -0
  202. package/src/shade/renderer/geometry/PlaneGeometry.js +22 -0
  203. package/src/shade/renderer/geometry/TorusGeometry.d.ts +18 -0
  204. package/src/shade/renderer/geometry/TorusGeometry.d.ts.map +1 -0
  205. package/src/shade/renderer/geometry/TorusGeometry.js +23 -0
  206. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts +21 -0
  207. package/src/shade/renderer/geometry/UVSphereGeometry.d.ts.map +1 -0
  208. package/src/shade/renderer/geometry/UVSphereGeometry.js +34 -0
  209. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts +19 -0
  210. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.d.ts.map +1 -0
  211. package/src/shade/renderer/geometry/primitives/make_capsule_geometry.js +205 -0
  212. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts +21 -0
  213. package/src/shade/renderer/geometry/primitives/make_cone_geometry.d.ts.map +1 -0
  214. package/src/shade/renderer/geometry/primitives/make_cone_geometry.js +36 -0
  215. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts +1 -1
  216. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/primitives/make_cylinder_geometry.js +44 -9
  218. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts +20 -0
  219. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.d.ts.map +1 -0
  220. package/src/shade/renderer/geometry/primitives/make_uv_sphere_geometry.js +190 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  222. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -2
  223. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +26 -8
  224. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
  225. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +56 -39
  226. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +7 -0
  227. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  228. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +46 -4
  229. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.d.ts.map +1 -1
  230. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js +4 -2
  231. package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +2 -2
  232. package/src/shade/renderer/gpu_primitive/sort/defs.js +79 -79
  233. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +1 -1
  234. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  235. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +7 -3
  236. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
  237. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
  238. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  239. package/src/shade/renderer/particles/DESIGN.md +13 -9
  240. package/src/shade/renderer/particles/GPUParticleSystem.js +1 -1
  241. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +4 -3
  242. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  243. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +200 -194
  244. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  245. package/src/shade/renderer/particles/graph_particles.js +6 -2
  246. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
  247. package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
  248. package/src/shade/renderer/particles/warmup/graph_particle_warmup.d.ts.map +1 -1
  249. package/src/shade/renderer/particles/warmup/graph_particle_warmup.js +334 -329
  250. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  251. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  252. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +7 -2
  253. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
  254. package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +16 -4
  255. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
  256. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
  257. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
  258. package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
  259. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  260. package/src/shade/renderer/scene/GPUSceneContext.js +23 -1
  261. package/src/shade/renderer/texture/COMPRESSED_TEXTURE_PLAN_2026_09_01.md +2444 -2345
  262. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.d.ts.map +1 -1
  263. package/src/shade/renderer/texture/encode/chunk_astc_encode_block_4x4_rgb.js +312 -310
  264. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts +3 -3
  265. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.d.ts.map +1 -1
  266. package/src/shade/renderer/texture/encode/chunk_bc1_encode_block.js +383 -375
  267. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.d.ts.map +1 -1
  268. package/src/shade/renderer/texture/encode/chunk_bc6h_encode_block_mode11.js +349 -346
  269. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts +58 -0
  270. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.d.ts.map +1 -0
  271. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block.js +536 -0
  272. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts +21 -7
  273. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.d.ts.map +1 -1
  274. package/src/shade/renderer/texture/encode/chunk_bc7_encode_block_mode6.js +291 -327
  275. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts +25 -0
  276. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.d.ts.map +1 -0
  277. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode1.js +99 -0
  278. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts +5 -3
  279. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.d.ts.map +1 -1
  280. package/src/shade/renderer/texture/encode/chunk_bc7_pack_mode6.js +47 -71
  281. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts +10 -0
  282. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.d.ts.map +1 -0
  283. package/src/shade/renderer/texture/encode/chunk_bc7_partition_2.js +50 -0
  284. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts +4 -5
  285. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
  286. package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +7 -8
  287. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +4 -1
  288. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
  289. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
  290. package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
  291. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
  292. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
  294. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
  295. package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
  296. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
  297. package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
  298. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
  299. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
  300. package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
  301. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
  302. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  303. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
  304. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
  305. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
  306. package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
  307. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
  308. package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
  309. package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
  310. package/src/shade/renderer/water/chunk_water_transport.js +7 -5
  311. package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
  312. package/src/shade/renderer/water/medium/GPUWaterBodies.js +8 -2
  313. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts +3 -2
  314. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
  315. package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +3 -2
  316. package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
  317. package/src/shade/renderer/water/shader_water.js +3 -1
  318. package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -1
  319. package/src/shade/renderer/water/surface/GPUWaterSurface.js +3 -1
  320. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -3
  321. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -1
  322. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +17 -7
  323. package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
  324. package/src/shade/renderer/water/surface/graph_water_tessellation.js +11 -4
  325. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  326. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +93 -30
  327. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  328. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +13 -5
  329. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +29 -8
  330. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  331. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +155 -30
  332. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +6 -1
  333. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  334. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +157 -39
  335. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +91 -21
  336. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  337. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +442 -70
  338. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +11 -3
  339. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  340. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +3 -0
  341. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  342. package/src/shade/wgsl/validate_wgsl_source.js +74 -3
  343. package/src/engine/graphics3/register_instance_animation.d.ts +0 -114
  344. package/src/engine/graphics3/register_instance_animation.d.ts.map +0 -1
  345. package/src/engine/graphics3/register_instance_animation.js +0 -201
@@ -1 +1 @@
1
- {"version":3,"file":"graph_vgeo_expand_instances_to_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH;IAX+B,KAAK;IACT,YAAY,EAA5B,MAAM;IACU,eAAe,EAA/B,MAAM;IACkB,IAAI;IACO,OAAO;IACb,MAAM;IACjC,MAAM,CA4TlB"}
1
+ {"version":3,"file":"graph_vgeo_expand_instances_to_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH;IAX+B,KAAK;IACT,YAAY,EAA5B,MAAM;IACU,eAAe,EAA/B,MAAM;IACkB,IAAI;IACO,OAAO;IACb,MAAM;IACjC,MAAM,CA6TlB"}
@@ -5,8 +5,12 @@ import {
5
5
  graph_build_indirect_dispatch_command,
6
6
  INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
7
7
  } from "../../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
8
- import { graph_prefix_scan_csdldf } from "../../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
8
+ import {
9
+ graph_prefix_scan_csdldf,
10
+ prefix_scan_csdldf_output_descriptor
11
+ } from "../../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
9
12
  import { RasterizationCollectionType } from "../../../rasterize/expand/RasterizationCollectionType.js";
13
+ import { graph_create_buffer } from "../../../shader/graph/graph_create_buffer.js";
10
14
  import { shader_vgeo_cut_collect } from "./cut/shader_vgeo_cut_collect.js";
11
15
  import { shader_vgeo_cut_queue_prepare } from "./cut/shader_vgeo_cut_queue_prepare.js";
12
16
  import { shader_vgeo_cut_queue_remainder } from "./cut/shader_vgeo_cut_queue_remainder.js";
@@ -186,7 +190,8 @@ export function graph_vgeo_expand_instances_to_meshlets({
186
190
  */
187
191
  const prefix_sums = graph_prefix_scan_csdldf({
188
192
  graph,
189
- data: collect_data.claim_widths,
193
+ input: collect_data.claim_widths,
194
+ output: graph_create_buffer(graph, "vg claim offsets", prefix_scan_csdldf_output_descriptor(instance_capacity)),
190
195
  element_max_count: instance_capacity,
191
196
  });
192
197
 
@@ -1,25 +1,43 @@
1
+ /**
2
+ * A transient {@link graph_prefix_scan_csdldf} output for up to `element_max_count` elements: the count, padded to 16
3
+ * bytes, then the sums in whole vec4 blocks. The scan writes the count itself, so nothing needs clearing.
4
+ *
5
+ * @param {number} element_max_count
6
+ * @returns {BufferResourceDescriptor}
7
+ */
8
+ export function prefix_scan_csdldf_output_descriptor(element_max_count: number): BufferResourceDescriptor;
1
9
  /**
2
10
  * Indirect pass.
3
- * Input data is expected to be counts in form:
11
+ * Inclusive prefix sums of `input` into `output`.
12
+ * Both are expected in the form:
4
13
  * ```wgsl
5
14
  * struct InputData{
6
15
  * count:u32,
7
16
  * elements: array<u32> // counts: [count0, count1, count2, ... countN-1]
8
17
  * }
9
18
  * ```
10
- * Data is modified in-place, elements are replaced with prefix sums.
11
- * Make sure to set `element_max_count` to be at least equal to the number of elements in the input, otherwise an incomplete scan will be performed.
12
- * The penalty for `element_max_count` being too big is fairly small, requiring more memory for the pass and a larger `bufferClear` region.
19
+ * `output` receives the input's count and, for each of its elements, the sum of the elements up to and including it.
20
+ * `input` is never written: the scan's fallback re-reads a tile's inputs while other tiles are writing their sums, so
21
+ * the two cannot be one buffer.
22
+ *
23
+ * The work follows the input's count, read on the device; `element_max_count` sizes only the memory — the spine, and
24
+ * what `output` must hold — so make it at least the most elements the input can carry, otherwise an incomplete scan will
25
+ * be performed. Where a count records demand and runs past a soft limit — a culled collection does — that is what the
26
+ * buffer holds, not the limit. The penalty for `element_max_count` being too big is fairly small: a larger spine to clear.
13
27
  *
14
28
  * @param {Object} options
15
29
  * @param {FrameGraph} options.graph
16
- * @param {number} options.data buffer resource ID, array<u32> first position must be "count". The buffer must be 16-byte aligned.
30
+ * @param {number} options.input buffer resource ID, array<u32> first position must be "count". The buffer must be 16-byte aligned.
31
+ * @param {number} options.output buffer resource ID of the same layout, at least `16 + ⌈element_max_count / 4⌉ · 16` bytes;
32
+ * see {@link prefix_scan_csdldf_output_descriptor}
17
33
  * @param {number} [options.element_max_count=1,048,576] how many elements might be in the input, this is a limit
18
- * @returns {number} buffer resource ID with prefix sums, this is rewritten input. The first position (count) is untouched.
34
+ * @returns {number} buffer resource ID of the written output
19
35
  */
20
- export function graph_prefix_scan_csdldf({ graph, data, element_max_count, }: {
36
+ export function graph_prefix_scan_csdldf({ graph, input, output, element_max_count, }: {
21
37
  graph: FrameGraph;
22
- data: number;
38
+ input: number;
39
+ output: number;
23
40
  element_max_count?: number;
24
41
  }): number;
42
+ import { BufferResourceDescriptor } from "../../../../device/graph/BufferResourceDescriptor.js";
25
43
  //# sourceMappingURL=graph_prefix_scan_csdldf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAL+B,KAAK;IACT,IAAI,EAApB,MAAM;IACW,iBAAiB,GAAlC,MAAM;IACJ,MAAM,CAgFlB"}
1
+ {"version":3,"file":"graph_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js"],"names":[],"mappings":"AAeA;;;;;;GAMG;AACH,wEAHW,MAAM,GACJ,wBAAwB,CAMpC;AAGD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAP+B,KAAK;IACT,KAAK,EAArB,MAAM;IACU,MAAM,EAAtB,MAAM;IAEW,iBAAiB,GAAlC,MAAM;IACJ,MAAM,CAwElB;yCA3HwC,sDAAsD"}
@@ -3,51 +3,74 @@ import { round_up } from "../../../../../core/math/round_up.js";
3
3
  import { warn_limited } from "../../../../util/warn_limited.js";
4
4
  import { BufferResourceDescriptor } from "../../../../device/graph/BufferResourceDescriptor.js";
5
5
  import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
+ import { INDIRECT_COMPUTE_COMMAND_DESCRIPTOR } from "../../indirect/IndirectComputeCommandBuildPass.js";
6
7
  import {
7
- build_indirect_compute_dispatch_command,
8
- INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
9
- } from "../../indirect/IndirectComputeCommandBuildPass.js";
10
- import { PREFIX_SCAN_CSDLDF_PARTITION_SIZE, shader_prefix_scan_csdldf } from "./shader_prefix_scan_csdldf.js";
8
+ WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION
9
+ } from "../../indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js";
10
+ import {
11
+ PREFIX_SCAN_CSDLDF_PARTITION_SIZE,
12
+ shader_prefix_scan_csdldf,
13
+ shader_prefix_scan_csdldf_prepare
14
+ } from "./shader_prefix_scan_csdldf.js";
15
+
16
+ /**
17
+ * A transient {@link graph_prefix_scan_csdldf} output for up to `element_max_count` elements: the count, padded to 16
18
+ * bytes, then the sums in whole vec4 blocks. The scan writes the count itself, so nothing needs clearing.
19
+ *
20
+ * @param {number} element_max_count
21
+ * @returns {BufferResourceDescriptor}
22
+ */
23
+ export function prefix_scan_csdldf_output_descriptor(element_max_count) {
24
+ assert.isNonNegativeInteger(element_max_count, 'element_max_count');
25
+
26
+ return BufferResourceDescriptor.from(16 + Math.max(1, Math.ceil(element_max_count / 4)) * 16, GPUBufferUsage.STORAGE);
27
+ }
11
28
 
12
29
 
13
30
  /**
14
31
  * Indirect pass.
15
- * Input data is expected to be counts in form:
32
+ * Inclusive prefix sums of `input` into `output`.
33
+ * Both are expected in the form:
16
34
  * ```wgsl
17
35
  * struct InputData{
18
36
  * count:u32,
19
37
  * elements: array<u32> // counts: [count0, count1, count2, ... countN-1]
20
38
  * }
21
39
  * ```
22
- * Data is modified in-place, elements are replaced with prefix sums.
23
- * Make sure to set `element_max_count` to be at least equal to the number of elements in the input, otherwise an incomplete scan will be performed.
24
- * The penalty for `element_max_count` being too big is fairly small, requiring more memory for the pass and a larger `bufferClear` region.
40
+ * `output` receives the input's count and, for each of its elements, the sum of the elements up to and including it.
41
+ * `input` is never written: the scan's fallback re-reads a tile's inputs while other tiles are writing their sums, so
42
+ * the two cannot be one buffer.
43
+ *
44
+ * The work follows the input's count, read on the device; `element_max_count` sizes only the memory — the spine, and
45
+ * what `output` must hold — so make it at least the most elements the input can carry, otherwise an incomplete scan will
46
+ * be performed. Where a count records demand and runs past a soft limit — a culled collection does — that is what the
47
+ * buffer holds, not the limit. The penalty for `element_max_count` being too big is fairly small: a larger spine to clear.
25
48
  *
26
49
  * @param {Object} options
27
50
  * @param {FrameGraph} options.graph
28
- * @param {number} options.data buffer resource ID, array<u32> first position must be "count". The buffer must be 16-byte aligned.
51
+ * @param {number} options.input buffer resource ID, array<u32> first position must be "count". The buffer must be 16-byte aligned.
52
+ * @param {number} options.output buffer resource ID of the same layout, at least `16 + ⌈element_max_count / 4⌉ · 16` bytes;
53
+ * see {@link prefix_scan_csdldf_output_descriptor}
29
54
  * @param {number} [options.element_max_count=1,048,576] how many elements might be in the input, this is a limit
30
- * @returns {number} buffer resource ID with prefix sums, this is rewritten input. The first position (count) is untouched.
55
+ * @returns {number} buffer resource ID of the written output
31
56
  */
32
57
  export function graph_prefix_scan_csdldf({
33
58
  graph,
34
- data,
59
+ input,
60
+ output,
35
61
  element_max_count = 1048576,
36
62
  }) {
37
63
 
38
64
  assert.isNonNegativeInteger(element_max_count, 'element_max_count');
39
65
 
40
- if (element_max_count <= 0) {
41
- console.warn("element_max_count <= 0, returning input");
42
-
43
- return data;
44
- }
45
-
46
66
  // TODO run a special prefix scan if element_max_count fits into a single group
47
67
 
48
-
49
68
  const group_count = Math.ceil(element_max_count / PREFIX_SCAN_CSDLDF_PARTITION_SIZE);
50
69
 
70
+ if (group_count > WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION) {
71
+ warn_limited(`group_count(=${group_count} > MAX_DISPATCH_SIZE(=${WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION}). Prefix scan likely incomplete`);
72
+ }
73
+
51
74
  const pass_data = {};
52
75
 
53
76
  /**
@@ -58,41 +81,35 @@ export function graph_prefix_scan_csdldf({
58
81
  */
59
82
  function execute(pass_data, resources, context) {
60
83
 
61
- const data = resources.get(pass_data.data);
62
- const partition_descriptor_buffer = resources.get(pass_data.partition_descriptor_buffer);
63
- const command = resources.get(pass_data.command);
64
-
65
84
  const encoder = context.encoder;
66
85
 
67
- const MAX_DISPATCH_SIZE = encoder.device.limits.maxComputeWorkgroupsPerDimension;
86
+ const scan_in = resources.get(pass_data.input);
87
+ const scan_out = resources.get(pass_data.output);
88
+ const command = resources.get(pass_data.command);
68
89
 
69
- if (group_count > MAX_DISPATCH_SIZE) {
70
- warn_limited(`group_count(=${group_count} > MAX_DISPATCH_SIZE(=${MAX_DISPATCH_SIZE}). Prefix scan likely incomplete`);
71
- }
90
+ assert.notEqual(scan_in, scan_out, 'input and output must be different buffers');
91
+ assert.greaterThanOrEqual(scan_out.size, 16 + Math.ceil(element_max_count / 4) * 16, 'output is too small for element_max_count');
72
92
 
73
- build_indirect_compute_dispatch_command(
74
- PREFIX_SCAN_CSDLDF_PARTITION_SIZE,
93
+ shader_prefix_scan_csdldf_prepare.dispatch({
75
94
  encoder,
76
- data,
77
- 0,
78
- command,
79
- 0,
80
- );
95
+ bindings: { scan_in, scan_out, command },
96
+ });
81
97
 
82
98
  shader_prefix_scan_csdldf.dispatchIndirect({
83
99
  encoder,
84
100
  command,
85
101
  bindings: {
86
- scan_in: data,
87
- spine: partition_descriptor_buffer,
102
+ scan_in,
103
+ scan_out,
104
+ spine: resources.get(pass_data.partition_descriptor_buffer),
88
105
  }
89
106
  });
90
107
  }
91
108
 
92
109
  const pass = graph.add("prefix sum", pass_data, execute);
93
110
 
94
- pass.read(data);
95
- pass_data.data = pass.write(data);
111
+ pass_data.input = pass.read(input);
112
+ pass_data.output = pass.write(pass.read(output));
96
113
 
97
114
  pass_data.command = pass.create("command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
98
115
 
@@ -106,5 +123,5 @@ export function graph_prefix_scan_csdldf({
106
123
  )
107
124
  );
108
125
 
109
- return pass_data.data;
110
- }
126
+ return pass_data.output;
127
+ }
@@ -23,5 +23,12 @@ export const PREFIX_SCAN_CSDLDF_HEADER_WORDS: number;
23
23
  * @type {ComputeShader}
24
24
  */
25
25
  export const shader_prefix_scan_csdldf: ComputeShader;
26
+ /**
27
+ * One thread ahead of {@link shader_prefix_scan_csdldf}: the scan's dispatch, a workgroup per partition of the input's
28
+ * count, and the output's count. The output gets its count here rather than from the scan's first tile because an input
29
+ * of no elements dispatches no tile at all.
30
+ * @type {ComputeShader}
31
+ */
32
+ export const shader_prefix_scan_csdldf_prepare: ComputeShader;
26
33
  import { ComputeShader } from "../../../shader/ComputeShader.js";
27
34
  //# sourceMappingURL=shader_prefix_scan_csdldf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;AAOtD;;;;;;;;;;GAUG;AACH,8CAFU,MAAM,CAE6E;AA0S7F;;;;;GAKG;AACH,wCAFU,aAAa,CAMpB;8BA9U2B,kCAAkC"}
1
+ {"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;AAOtD;;;;;;;;;;GAUG;AACH,8CAFU,MAAM,CAE6E;AAmT7F;;;;;GAKG;AACH,wCAFU,aAAa,CAMpB;AAQH;;;;;GAKG;AACH,gDAFU,aAAa,CAkBpB;8BArX2B,kCAAkC"}
@@ -1,4 +1,7 @@
1
1
  import { WebGPUExtensionType } from "../../../../descriptor/WebGPUExtensionType.js";
2
+ import {
3
+ WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION
4
+ } from "../../indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js";
2
5
  import { atomic_u32, u32, vec4u } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
6
  import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
4
7
  import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
@@ -32,9 +35,18 @@ const DATA_STRUCT = WebGPUStruct.from({
32
35
  */
33
36
  export const PREFIX_SCAN_CSDLDF_HEADER_WORDS = DATA_STRUCT.get("elements").offset / u32.size;
34
37
 
38
+ /*
39
+ The input is bound read-only and the sums go to a buffer of their own, as in both references: a tile that does not see
40
+ its predecessor's flag within MAX_SPIN_COUNT re-reduces the predecessor's elements itself (the fallback), so those
41
+ elements must still be the inputs while any tile of the dispatch runs. Scanned in place, a predecessor that had already
42
+ written its sums handed the fallback a mix of inputs and sums, and the tiles after it carried the difference: on an
43
+ RTX 4090 one scan of 3,100 came back wrong (196,608 elements, tiles 5–12 all off by 33,721,938), and with
44
+ MAX_SPIN_COUNT at 1, 65 of 500.
45
+ */
35
46
  const resources = new ShaderResourceSetDescriptor();
36
47
  resources.createGroup()
37
- .addStorageBuffer("scan_in", DATA_STRUCT, true)
48
+ .addStorageBuffer("scan_in", DATA_STRUCT)
49
+ .addStorageBuffer("scan_out", DATA_STRUCT, true)
38
50
  .addStorageBuffer("spine", WebGPUArray.from(WebGPUArray.from(atomic_u32, 2)), true)
39
51
 
40
52
  const body = CodeChunk.from(
@@ -93,7 +105,7 @@ fn main(
93
105
  @builtin(subgroup_invocation_id) lane_id: u32,
94
106
  @builtin(subgroup_size) lane_count: u32,
95
107
  ) {
96
-
108
+
97
109
  let vec_size = divide_round_up_u32(scan_in.count, 4);
98
110
  let work_tiles = divide_round_up_u32(scan_in.count, ${PREFIX_SCAN_CSDLDF_PARTITION_SIZE});
99
111
 
@@ -306,7 +318,7 @@ fn main(
306
318
  let prev = wg_broadcast + select(0u, wg_partials[subgroup_id - 1u], subgroup_id != 0u); //wg_broadcast is 0 for tile_id 0
307
319
  if(tile_id < work_tiles - 1u){
308
320
  for(var k = 0u; k < VEC4_SPT; k += 1u){
309
- scan_in.elements[i] = t_scan[k] + prev;
321
+ scan_out.elements[i] = t_scan[k] + prev;
310
322
  i += lane_count;
311
323
  }
312
324
  }
@@ -314,7 +326,7 @@ fn main(
314
326
  if(tile_id == work_tiles - 1u){
315
327
  for(var k = 0u; k < VEC4_SPT; k += 1u){
316
328
  if(i < vec_size){
317
- scan_in.elements[i] = t_scan[k] + prev;
329
+ scan_out.elements[i] = t_scan[k] + prev;
318
330
  }
319
331
  i += lane_count;
320
332
  }
@@ -338,4 +350,34 @@ export const shader_prefix_scan_csdldf = ComputeShader.from({
338
350
  label: "Prefix Scan / CSDLDF",
339
351
  body,
340
352
  resources,
353
+ });
354
+
355
+ const prepare_resources = new ShaderResourceSetDescriptor();
356
+ prepare_resources.createGroup()
357
+ .addStorageBuffer("scan_in", DATA_STRUCT)
358
+ .addStorageBuffer("scan_out", DATA_STRUCT, true)
359
+ .addStorageBuffer("command", WebGPUArray.u32, true);
360
+
361
+ /**
362
+ * One thread ahead of {@link shader_prefix_scan_csdldf}: the scan's dispatch, a workgroup per partition of the input's
363
+ * count, and the output's count. The output gets its count here rather than from the scan's first tile because an input
364
+ * of no elements dispatches no tile at all.
365
+ * @type {ComputeShader}
366
+ */
367
+ export const shader_prefix_scan_csdldf_prepare = ComputeShader.from({
368
+ label: "Prefix Scan / CSDLDF prepare",
369
+ resources: prepare_resources,
370
+ body: CodeChunk.from(
371
+ //language=WGSL
372
+ `
373
+ @compute @workgroup_size(1)
374
+ fn main() {
375
+ let count = scan_in.count;
376
+ scan_out.count = count;
377
+ // the scan reads its tile from workgroup_id.x alone; past one dimension's guaranteed width it is incomplete
378
+ command[0] = min(divide_round_up_u32(count, ${PREFIX_SCAN_CSDLDF_PARTITION_SIZE}u), ${WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION}u);
379
+ command[1] = 1u;
380
+ command[2] = 1u;
381
+ }
382
+ `, [chunk_divide_round_up_u32]),
341
383
  });
@@ -1 +1 @@
1
- {"version":3,"file":"test_prefix_sum.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,0EA8DC"}
1
+ {"version":3,"file":"test_prefix_sum.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/test_prefix_sum.js"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,0EA+DC"}
@@ -12,7 +12,8 @@ import { WGSLAttributes } from "../../../shader/type/WGSLAttributes.js";
12
12
  import { WGSLStructField } from "../../../shader/type/WGSLStructField.js";
13
13
  import { graph_inspect_gpu_buffer } from "../../../buffer/graph_inspect_gpu_buffer.js";
14
14
  import { graph_import_typed_buffer } from "../../../shader/graph/graph_import_typed_buffer.js";
15
- import { graph_prefix_scan_csdldf } from "./graph_prefix_scan_csdldf.js";
15
+ import { graph_create_buffer } from "../../../shader/graph/graph_create_buffer.js";
16
+ import { graph_prefix_scan_csdldf, prefix_scan_csdldf_output_descriptor } from "./graph_prefix_scan_csdldf.js";
16
17
 
17
18
  function cpu_prefix_sum(input) {
18
19
  const output = new Uint32Array(input.length);
@@ -57,7 +58,8 @@ export async function test_prefix_sum(graphics) {
57
58
 
58
59
  const prefix_sum = graph_prefix_scan_csdldf({
59
60
  graph,
60
- data,
61
+ input: data,
62
+ output: graph_create_buffer(graph, "prefix sum", prefix_scan_csdldf_output_descriptor(input.length)),
61
63
  element_max_count: input.length,
62
64
  });
63
65
 
@@ -63,8 +63,8 @@ export const MAX_SUBGROUPS_PER_WORKGROUP: number;
63
63
  * Words of `{count: u32, elements: array<vec4u>}` header that sit in front of the spine's elements.
64
64
  *
65
65
  * {@link graph_prefix_scan_csdldf} reads its element count from word 0 and its `elements` member is
66
- * `@align(16)`, so the first count word lives at word 4. The histogram and scatter shaders bind the
67
- * same buffer flat and have to step over the header by hand.
66
+ * `@align(16)`, so the first count word lives at word 4. The histogram shader binds the spine flat and
67
+ * the scatter its scan, laid out the same, and both have to step over the header by hand.
68
68
  * @type {number}
69
69
  */
70
70
  export const SPINE_HEADER_WORDS: number;
@@ -1,79 +1,79 @@
1
- /**
2
- * Shared configuration for the key-value radix sort.
3
- *
4
- * The sort is LSD reduce-then-scan: four 8-bit digit passes, each of them a per-tile histogram,
5
- * a spine scan through {@link graph_prefix_scan_csdldf}, and a rank-and-scatter. The numbers below
6
- * are what the three stages have to agree on, so they live in one place rather than in each
7
- * shader's template literal.
8
- */
9
-
10
- /**
11
- * Number of digit bins. 8-bit digits — one `u32` key is covered by {@link RADIX_PASSES} of them.
12
- * @type {number}
13
- */
14
- export const RADIX = 256;
15
-
16
- /**
17
- * `log2(RADIX)` — also the number of binary split rounds the scatter's in-tile sort runs.
18
- * @type {number}
19
- */
20
- export const RADIX_LOG = 8;
21
-
22
- /**
23
- * (key width) / RADIX_LOG. Four passes over a 32-bit key.
24
- *
25
- * Even, which is what puts the result back in the caller's buffers rather than in the ping-pong
26
- * scratch — see {@link graph_radix_sort}.
27
- * @type {number}
28
- */
29
- export const RADIX_PASSES = 4;
30
-
31
- /**
32
- * Threads per workgroup, in both the histogram and the scatter.
33
- *
34
- * 256 is `maxComputeInvocationsPerWorkgroup`'s default value, and it is also exactly {@link RADIX},
35
- * which is what lets the scatter run "one thread per bin" over its local histogram with no strided
36
- * loop.
37
- * @type {number}
38
- */
39
- export const SORT_WORKGROUP_SIZE = 256;
40
-
41
- /**
42
- * Keys each thread carries through a tile.
43
- * @type {number}
44
- */
45
- export const SORT_KEYS_PER_THREAD = 4;
46
-
47
- /**
48
- * Keys one workgroup processes. Also the granularity of the spine: the spine holds one 256-bin
49
- * histogram per tile.
50
- * @type {number}
51
- */
52
- export const SORT_TILE_SIZE = SORT_WORKGROUP_SIZE * SORT_KEYS_PER_THREAD;
53
-
54
- /**
55
- * The smallest subgroup size WebGPU permits, and therefore the largest number of subgroups a
56
- * workgroup can be split into: `SORT_WORKGROUP_SIZE / MIN_SUBGROUP_SIZE`.
57
- *
58
- * Subgroup size is a runtime value in [4, 128]; nothing here may bake a width in. What the bound
59
- * buys is a *compile-time* trip count for the loop that scans the per-subgroup partials — a loop
60
- * that contains barriers, and whose bound therefore has to be provably uniform. Iterations past
61
- * the real subgroup count do nothing.
62
- * @type {number}
63
- */
64
- export const MIN_SUBGROUP_SIZE = 4;
65
-
66
- /**
67
- * @type {number}
68
- */
69
- export const MAX_SUBGROUPS_PER_WORKGROUP = SORT_WORKGROUP_SIZE / MIN_SUBGROUP_SIZE;
70
-
71
- /**
72
- * Words of `{count: u32, elements: array<vec4u>}` header that sit in front of the spine's elements.
73
- *
74
- * {@link graph_prefix_scan_csdldf} reads its element count from word 0 and its `elements` member is
75
- * `@align(16)`, so the first count word lives at word 4. The histogram and scatter shaders bind the
76
- * same buffer flat and have to step over the header by hand.
77
- * @type {number}
78
- */
79
- export const SPINE_HEADER_WORDS = 4;
1
+ /**
2
+ * Shared configuration for the key-value radix sort.
3
+ *
4
+ * The sort is LSD reduce-then-scan: four 8-bit digit passes, each of them a per-tile histogram,
5
+ * a spine scan through {@link graph_prefix_scan_csdldf}, and a rank-and-scatter. The numbers below
6
+ * are what the three stages have to agree on, so they live in one place rather than in each
7
+ * shader's template literal.
8
+ */
9
+
10
+ /**
11
+ * Number of digit bins. 8-bit digits — one `u32` key is covered by {@link RADIX_PASSES} of them.
12
+ * @type {number}
13
+ */
14
+ export const RADIX = 256;
15
+
16
+ /**
17
+ * `log2(RADIX)` — also the number of binary split rounds the scatter's in-tile sort runs.
18
+ * @type {number}
19
+ */
20
+ export const RADIX_LOG = 8;
21
+
22
+ /**
23
+ * (key width) / RADIX_LOG. Four passes over a 32-bit key.
24
+ *
25
+ * Even, which is what puts the result back in the caller's buffers rather than in the ping-pong
26
+ * scratch — see {@link graph_radix_sort}.
27
+ * @type {number}
28
+ */
29
+ export const RADIX_PASSES = 4;
30
+
31
+ /**
32
+ * Threads per workgroup, in both the histogram and the scatter.
33
+ *
34
+ * 256 is `maxComputeInvocationsPerWorkgroup`'s default value, and it is also exactly {@link RADIX},
35
+ * which is what lets the scatter run "one thread per bin" over its local histogram with no strided
36
+ * loop.
37
+ * @type {number}
38
+ */
39
+ export const SORT_WORKGROUP_SIZE = 256;
40
+
41
+ /**
42
+ * Keys each thread carries through a tile.
43
+ * @type {number}
44
+ */
45
+ export const SORT_KEYS_PER_THREAD = 4;
46
+
47
+ /**
48
+ * Keys one workgroup processes. Also the granularity of the spine: the spine holds one 256-bin
49
+ * histogram per tile.
50
+ * @type {number}
51
+ */
52
+ export const SORT_TILE_SIZE = SORT_WORKGROUP_SIZE * SORT_KEYS_PER_THREAD;
53
+
54
+ /**
55
+ * The smallest subgroup size WebGPU permits, and therefore the largest number of subgroups a
56
+ * workgroup can be split into: `SORT_WORKGROUP_SIZE / MIN_SUBGROUP_SIZE`.
57
+ *
58
+ * Subgroup size is a runtime value in [4, 128]; nothing here may bake a width in. What the bound
59
+ * buys is a *compile-time* trip count for the loop that scans the per-subgroup partials — a loop
60
+ * that contains barriers, and whose bound therefore has to be provably uniform. Iterations past
61
+ * the real subgroup count do nothing.
62
+ * @type {number}
63
+ */
64
+ export const MIN_SUBGROUP_SIZE = 4;
65
+
66
+ /**
67
+ * @type {number}
68
+ */
69
+ export const MAX_SUBGROUPS_PER_WORKGROUP = SORT_WORKGROUP_SIZE / MIN_SUBGROUP_SIZE;
70
+
71
+ /**
72
+ * Words of `{count: u32, elements: array<vec4u>}` header that sit in front of the spine's elements.
73
+ *
74
+ * {@link graph_prefix_scan_csdldf} reads its element count from word 0 and its `elements` member is
75
+ * `@align(16)`, so the first count word lives at word 4. The histogram shader binds the spine flat and
76
+ * the scatter its scan, laid out the same, and both have to step over the header by hand.
77
+ * @type {number}
78
+ */
79
+ export const SPINE_HEADER_WORDS = 4;
@@ -13,7 +13,7 @@
13
13
  * bin-major;
14
14
  * 2. {@link graph_prefix_scan_csdldf}, reused as-is — one running scan over the whole spine
15
15
  * therefore yields the global start of every digit and the per-tile offset within it together.
16
- * That scan is inclusive-only and in-place, so the scatter recovers the exclusive value by
16
+ * That scan is inclusive-only, so the scatter recovers the exclusive value by
17
17
  * subtracting the tile's own count (which it has, having re-derived the tile histogram to rank
18
18
  * its keys anyway);
19
19
  * 3. {@link shader_radix_sort_scatter} — rank within the tile, then scatter.
@@ -1 +1 @@
1
- {"version":3,"file":"graph_radix_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IAN+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,aAAa,EAA7B,MAAM;IACJ;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,MAAM,EAAC,MAAM,CAAA;CAAC,CA4JxC"}
1
+ {"version":3,"file":"graph_radix_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IAN+B,KAAK;IACT,IAAI,EAApB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,aAAa,EAA7B,MAAM;IACJ;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,MAAM,EAAC,MAAM,CAAA;CAAC,CA+JxC"}
@@ -2,7 +2,8 @@ import { assert } from "../../../../core/assert.js";
2
2
  import { round_up } from "../../../../core/math/round_up.js";
3
3
  import { warn_limited } from "../../../util/warn_limited.js";
4
4
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
5
- import { graph_prefix_scan_csdldf } from "../prefix_sum/v1/graph_prefix_scan_csdldf.js";
5
+ import { graph_create_buffer } from "../../shader/graph/graph_create_buffer.js";
6
+ import { graph_prefix_scan_csdldf, prefix_scan_csdldf_output_descriptor } from "../prefix_sum/v1/graph_prefix_scan_csdldf.js";
6
7
  import { RADIX, RADIX_LOG, RADIX_PASSES, SORT_TILE_SIZE, SPINE_HEADER_WORDS } from "./defs.js";
7
8
  import { shader_radix_sort_histogram } from "./shader_radix_sort_histogram.js";
8
9
  import { shader_radix_sort_scatter } from "./shader_radix_sort_scatter.js";
@@ -22,7 +23,7 @@ import { shader_radix_sort_scatter } from "./shader_radix_sort_scatter.js";
22
23
  * bin-major;
23
24
  * 2. {@link graph_prefix_scan_csdldf}, reused as-is — one running scan over the whole spine
24
25
  * therefore yields the global start of every digit and the per-tile offset within it together.
25
- * That scan is inclusive-only and in-place, so the scatter recovers the exclusive value by
26
+ * That scan is inclusive-only, so the scatter recovers the exclusive value by
26
27
  * subtracting the tile's own count (which it has, having re-derived the tile histogram to rank
27
28
  * its keys anyway);
28
29
  * 3. {@link shader_radix_sort_scatter} — rank within the tile, then scatter.
@@ -71,6 +72,8 @@ export function graph_radix_sort({
71
72
  0, spine_size
72
73
  );
73
74
 
75
+ const SCANNED_SPINE_DESCRIPTOR = prefix_scan_csdldf_output_descriptor(spine_element_count);
76
+
74
77
  // aligned on a 1k boundary to lower memory fragmentation, as the deleted port did
75
78
  const PING_PONG_DESCRIPTOR = BufferResourceDescriptor.from(
76
79
  round_up(element_count * Uint32Array.BYTES_PER_ELEMENT, 1024),
@@ -163,7 +166,8 @@ export function graph_radix_sort({
163
166
 
164
167
  const scanned_spine = graph_prefix_scan_csdldf({
165
168
  graph,
166
- data: histogram_data.spine,
169
+ input: histogram_data.spine,
170
+ output: graph_create_buffer(graph, `radix sort/scanned spine ${pass_index}`, SCANNED_SPINE_DESCRIPTOR),
167
171
  element_max_count: spine_element_count,
168
172
  });
169
173
 
@@ -1 +1 @@
1
- {"version":3,"file":"shader_lightmap_denoise_sh.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,2CAFU,SAAS,CAkCjB;AAyHF,qDAOE;0BAvLwB,oCAAoC;4BAClC,6BAA6B"}
1
+ {"version":3,"file":"shader_lightmap_denoise_sh.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,2CAFU,SAAS,CAyCjB;AAyHF,qDAOE;0BA9LwB,oCAAoC;4BAClC,6BAA6B"}
@@ -39,8 +39,15 @@ fn estimate_sh_similarity(
39
39
  // extract dominant luma direction
40
40
  // Metro encodes SH coeffcients in axis-aligned way (L11, L1_1, L10) with L00 being in forth position (w)
41
41
 
42
- let a_luma_direction = a.Y.xyz / a.Y.w;
43
- let b_luma_direction = b.Y.xyz / b.Y.w;
42
+ // Zero DC is black and has no dominant direction.
43
+ var a_luma_direction = vec3<f32>(0.0);
44
+ var b_luma_direction = vec3<f32>(0.0);
45
+ if (a.Y.w != 0.0) {
46
+ a_luma_direction = a.Y.xyz / a.Y.w;
47
+ }
48
+ if (b.Y.w != 0.0) {
49
+ b_luma_direction = b.Y.xyz / b.Y.w;
50
+ }
44
51
 
45
52
  const DIRECTION_PHI = 10.0;
46
53
 
@@ -189,4 +196,4 @@ export const shader_lightmap_denoise_sh = ImageShader.from({
189
196
  resources,
190
197
  }),
191
198
  targets: LIGHTMAP_SH_COLOR_TARGETS_DESCRIPTOR
192
- })
199
+ })