@woosh/meep-engine 3.68.0 → 3.70.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 (584) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
  4. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  5. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
  6. package/package.json +1 -1
  7. package/src/core/bvh8/build/BVH8Converter.d.ts +16 -0
  8. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -1
  9. package/src/core/bvh8/build/BVH8Converter.js +64 -37
  10. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts +25 -0
  11. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts.map +1 -0
  12. package/src/core/bvh8/build/bvh8_assign_slots_greedy.js +68 -0
  13. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -1
  14. package/src/core/bvh8/build/bvh8_from_proxy.js +2 -33
  15. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts +22 -0
  16. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts.map +1 -0
  17. package/src/core/bvh8/build/bvh8_node_fit_slots.js +115 -0
  18. package/src/core/bvh8/bvh8_depth.d.ts +8 -0
  19. package/src/core/bvh8/bvh8_depth.d.ts.map +1 -0
  20. package/src/core/bvh8/bvh8_depth.js +39 -0
  21. package/src/core/math/complex/complex_fft_radix2.d.ts +19 -0
  22. package/src/core/math/complex/complex_fft_radix2.d.ts.map +1 -0
  23. package/src/core/math/complex/complex_fft_radix2.js +71 -0
  24. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
  25. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  26. package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
  27. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
  28. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
  29. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
  30. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
  31. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
  32. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
  33. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
  34. package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
  35. package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
  36. package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
  37. package/src/engine/graphics/trail/TrailKnots.js +137 -0
  38. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
  39. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
  40. package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
  41. package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
  42. package/src/engine/graphics3/EntityRowHold.js +128 -0
  43. package/src/engine/graphics3/GPUFluidSystem.d.ts +17 -4
  44. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  45. package/src/engine/graphics3/GPUFluidSystem.js +113 -16
  46. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
  47. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  48. package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
  49. package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
  50. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  51. package/src/engine/graphics3/Trail3DSystem.js +380 -81
  52. package/src/engine/physics/cloth/playground/wind_main.js +7 -6
  53. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +2 -2
  54. package/src/engine/physics/cloth/wind/AbstractClothWind.js +2 -2
  55. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +3 -3
  56. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  57. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -9
  58. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts +10 -10
  59. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts.map +1 -1
  60. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.js +14 -22
  61. package/src/engine/physics/fluid/FluidAtmosphere.d.ts +16 -2
  62. package/src/engine/physics/fluid/FluidAtmosphere.d.ts.map +1 -1
  63. package/src/engine/physics/fluid/FluidAtmosphere.js +17 -3
  64. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts +1 -2
  65. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts.map +1 -1
  66. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js +1 -2
  67. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts +8 -5
  68. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts.map +1 -1
  69. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.js +60 -17
  70. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
  71. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
  72. package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
  73. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
  74. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  75. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
  76. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +1 -1
  77. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +1 -1
  78. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +33 -47
  79. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  80. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +38 -176
  81. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts +8 -11
  82. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts.map +1 -1
  83. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.js +13 -24
  84. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts +16 -0
  85. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts.map +1 -0
  86. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.js +35 -0
  87. package/src/engine/physics/fluid/fluid_apply_atmosphere.d.ts +1 -1
  88. package/src/engine/physics/fluid/fluid_apply_atmosphere.js +1 -1
  89. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
  90. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
  91. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
  92. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
  93. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
  94. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
  95. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
  96. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
  97. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
  98. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts +28 -0
  99. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts.map +1 -0
  100. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js +29 -0
  101. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts +16 -0
  102. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts.map +1 -0
  103. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.js +49 -0
  104. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts +11 -0
  105. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts.map +1 -0
  106. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js +18 -0
  107. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts +25 -0
  108. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts.map +1 -0
  109. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js +65 -0
  110. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts +56 -0
  111. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts.map +1 -0
  112. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js +313 -0
  113. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts +16 -0
  114. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts.map +1 -0
  115. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js +69 -0
  116. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +1 -1
  117. package/src/generation/foliage/mesh/branch_ring_triangulate.js +1 -1
  118. package/src/shade/playground/bvh_repro/README.md +8 -6
  119. package/src/shade/playground/bvh_repro/index.html +125 -124
  120. package/src/shade/playground/bvh_repro/main.js +259 -254
  121. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  122. package/src/shade/playground/foliage_wind/foliage_world.js +7 -4
  123. package/src/shade/playground/grass_surfaces/main.js +3 -2
  124. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts +23 -13
  125. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts.map +1 -1
  126. package/src/shade/playground/particle_ecs/bonfire_wind.js +30 -33
  127. package/src/shade/playground/skinned_blas_refit/README.md +26 -14
  128. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +14 -9
  129. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  130. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +126 -127
  131. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +95 -95
  132. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts +9 -1
  133. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  134. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +146 -135
  135. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +6 -6
  136. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  137. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +148 -134
  138. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts +11 -8
  139. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  140. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +342 -202
  141. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +12 -13
  142. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  143. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +136 -116
  144. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +4 -4
  145. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  146. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +255 -249
  147. package/src/shade/playground/trails/index.html +50 -0
  148. package/src/shade/playground/trails/main.d.ts +2 -0
  149. package/src/shade/playground/trails/main.d.ts.map +1 -0
  150. package/src/shade/playground/trails/main.js +258 -0
  151. package/src/shade/playground/water_surface/main.js +6 -3
  152. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -2
  153. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
  154. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
  155. package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
  156. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  157. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +7 -8
  158. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
  159. package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
  160. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
  161. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
  162. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
  163. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
  164. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
  165. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
  166. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
  167. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
  168. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  169. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
  170. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
  171. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
  172. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
  173. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts +111 -0
  174. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts.map +1 -0
  175. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.js +162 -0
  176. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +37 -8
  177. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  178. package/src/shade/renderer/fluid/GPUFluidCascade.js +149 -47
  179. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +10 -3
  180. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  181. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +69 -10
  182. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts +19 -0
  183. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts.map +1 -0
  184. package/src/shade/renderer/fluid/chunk_fluid_far_field.js +43 -0
  185. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts +10 -9
  186. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts.map +1 -1
  187. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.js +14 -12
  188. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts +3 -2
  189. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts.map +1 -1
  190. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.js +7 -5
  191. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts +17 -9
  192. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts.map +1 -1
  193. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.js +58 -18
  194. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts +23 -11
  195. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  196. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +371 -335
  197. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.d.ts.map +1 -1
  198. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.js +2 -1
  199. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  200. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +109 -108
  201. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts +5 -3
  202. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts.map +1 -1
  203. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.js +24 -12
  204. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
  205. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
  206. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
  207. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
  208. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
  209. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
  210. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
  211. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
  212. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
  213. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
  214. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
  215. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
  216. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
  217. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  218. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
  219. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts +6 -2
  220. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts.map +1 -1
  221. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.js +10 -5
  222. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +20 -21
  223. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  224. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +453 -427
  225. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
  226. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  227. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +340 -282
  228. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +13 -5
  229. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  230. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +20 -10
  231. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.d.ts +2 -2
  232. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.js +2 -2
  233. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts +5 -3
  234. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  235. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +147 -142
  236. package/src/shade/renderer/fluid/query/GPUFluidQueries.js +2 -2
  237. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  238. package/src/shade/renderer/geometry/GPUGeometryManager.js +5 -7
  239. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +4 -1
  240. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  241. package/src/shade/renderer/geometry/MeshletGeometry.js +4 -1
  242. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +20 -0
  243. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  244. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +35 -3
  245. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts +9 -3
  246. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  247. package/src/shade/renderer/geometry/blas_from_meshlets.js +16 -30
  248. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts +14 -0
  249. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  250. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.js +33 -0
  251. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +18 -21
  252. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -1
  253. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +78 -158
  254. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +18 -39
  255. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  256. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +39 -398
  257. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +6 -7
  258. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  259. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +5 -7
  260. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts +36 -0
  261. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts.map +1 -0
  262. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js +179 -0
  263. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts +30 -0
  264. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts.map +1 -0
  265. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js +207 -0
  266. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts +52 -0
  267. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts.map +1 -0
  268. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js +464 -0
  269. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +12 -0
  270. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  271. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +37 -0
  272. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -1
  273. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +4 -4
  274. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -1
  275. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +2 -2
  276. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  277. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +2 -2
  278. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  279. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +4 -4
  280. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.d.ts.map +1 -1
  281. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.js +2 -2
  282. package/src/shade/renderer/geometry/sr_create_group_RTX.d.ts.map +1 -1
  283. package/src/shade/renderer/geometry/sr_create_group_RTX.js +4 -4
  284. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  285. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
  286. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  287. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -0
  288. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  289. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +372 -376
  290. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +9 -10
  291. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -1
  292. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +10 -11
  293. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +2 -2
  294. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +2 -2
  295. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +12 -8
  296. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
  297. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +109 -60
  298. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +2 -2
  299. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_surfaces.js +2 -2
  300. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.d.ts +2 -2
  301. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.js +70 -70
  302. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts +6 -7
  303. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts.map +1 -1
  304. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js +6 -7
  305. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +3 -3
  306. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +3 -3
  307. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +1 -1
  308. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
  309. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +3 -3
  310. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts +69 -0
  311. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts.map +1 -0
  312. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js +89 -0
  313. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts +41 -0
  314. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts.map +1 -0
  315. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.js +348 -0
  316. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts +34 -0
  317. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts.map +1 -0
  318. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.js +291 -0
  319. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts +31 -0
  320. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts.map +1 -0
  321. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.js +175 -0
  322. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts +27 -0
  323. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts.map +1 -0
  324. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.js +48 -0
  325. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts +26 -0
  326. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts.map +1 -0
  327. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.js +118 -0
  328. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts +22 -0
  329. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts.map +1 -0
  330. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.js +143 -0
  331. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts +36 -0
  332. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts.map +1 -0
  333. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.js +97 -0
  334. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts +49 -0
  335. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts.map +1 -0
  336. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.js +265 -0
  337. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts +37 -0
  338. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts.map +1 -0
  339. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.js +109 -0
  340. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts +15 -0
  341. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts.map +1 -0
  342. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.js +85 -0
  343. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts +26 -0
  344. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts.map +1 -0
  345. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.js +200 -0
  346. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts +19 -0
  347. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts.map +1 -0
  348. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.js +81 -0
  349. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts +14 -0
  350. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts.map +1 -0
  351. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.js +101 -0
  352. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts +19 -0
  353. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts.map +1 -0
  354. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js +361 -0
  355. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
  356. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
  357. package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
  358. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -1
  359. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +5 -6
  360. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  361. package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
  362. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  363. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
  364. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  365. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -0
  366. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
  367. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
  368. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
  369. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
  370. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
  371. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
  372. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
  373. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
  374. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
  375. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
  376. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
  377. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
  378. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
  379. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  380. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
  381. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +8 -4
  382. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  383. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +60 -33
  384. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts +6 -6
  385. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts.map +1 -1
  386. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +23 -53
  387. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts +3 -1
  388. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts.map +1 -1
  389. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js +5 -3
  390. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts +28 -0
  391. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts.map +1 -0
  392. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js +29 -0
  393. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts +25 -0
  394. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts.map +1 -0
  395. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js +97 -0
  396. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts +8 -0
  397. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts.map +1 -1
  398. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js +23 -14
  399. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts +36 -0
  400. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts.map +1 -0
  401. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js +222 -0
  402. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts +20 -0
  403. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts.map +1 -0
  404. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js +30 -0
  405. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts +30 -0
  406. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts.map +1 -0
  407. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js +91 -0
  408. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts +23 -0
  409. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts.map +1 -0
  410. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js +40 -0
  411. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts +22 -0
  412. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts.map +1 -1
  413. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js +121 -70
  414. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts +13 -1
  415. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts.map +1 -1
  416. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.js +117 -61
  417. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts +21 -0
  418. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts.map +1 -1
  419. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.js +111 -72
  420. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +1 -2
  421. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -1
  422. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +83 -54
  423. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts +14 -0
  424. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts.map +1 -1
  425. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js +92 -60
  426. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts +22 -0
  427. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts.map +1 -1
  428. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.js +153 -106
  429. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts +21 -0
  430. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts.map +1 -1
  431. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.js +115 -74
  432. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +5 -2
  433. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  434. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +89 -63
  435. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts +15 -0
  436. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts.map +1 -1
  437. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.js +108 -63
  438. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts +14 -0
  439. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts.map +1 -1
  440. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.js +94 -60
  441. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  442. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +4 -4
  443. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
  444. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
  445. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
  446. package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
  447. package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
  448. package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
  449. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
  450. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
  451. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
  452. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
  453. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
  454. package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
  455. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
  456. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
  457. package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
  458. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
  459. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
  460. package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
  461. package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
  462. package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
  463. package/src/shade/renderer/trails/graph_trails.js +155 -0
  464. package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
  465. package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
  466. package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
  467. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
  468. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
  469. package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
  470. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
  471. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
  472. package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
  473. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
  474. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
  475. package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
  476. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
  477. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
  478. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
  479. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
  480. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
  481. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
  482. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
  483. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
  484. package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
  485. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
  486. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
  487. package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
  488. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
  489. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
  490. package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
  491. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
  492. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
  493. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
  494. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
  495. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
  496. package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
  497. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
  498. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
  499. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
  500. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
  501. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
  502. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
  503. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
  504. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
  505. package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
  506. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
  507. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
  508. package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
  509. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -2
  510. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -1
  511. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -227
  512. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  513. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +7 -4
  514. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +2 -2
  515. package/src/shade/renderer/wind/GPUSceneWind.d.ts +36 -4
  516. package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
  517. package/src/shade/renderer/wind/GPUSceneWind.js +150 -4
  518. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +9 -3
  519. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
  520. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +13 -3
  521. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +6 -6
  522. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +6 -6
  523. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts +39 -0
  524. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts.map +1 -0
  525. package/src/shade/renderer/wind/chunk_fluid_turbulence.js +63 -0
  526. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +10 -7
  527. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  528. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +34 -11
  529. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +2 -2
  530. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +2 -2
  531. package/src/shade/renderer/wind/wind_field_add_resources.d.ts +6 -4
  532. package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
  533. package/src/shade/renderer/wind/wind_field_add_resources.js +9 -6
  534. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
  535. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
  536. package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
  537. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
  538. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
  539. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
  540. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
  541. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
  542. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
  543. package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
  544. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
  545. package/src/engine/graphics/trail/tube/TubeX.js +0 -575
  546. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
  547. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
  548. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
  549. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
  550. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
  551. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
  552. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
  553. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
  554. package/src/engine/graphics3/trail/trail_tube_write_geometry.js +0 -119
  555. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +0 -18
  556. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +0 -1
  557. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +0 -50
  558. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts +0 -23
  559. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +0 -1
  560. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +0 -87
  561. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +0 -42
  562. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +0 -1
  563. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +0 -141
  564. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts +0 -21
  565. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts.map +0 -1
  566. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.js +0 -75
  567. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts +0 -17
  568. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +0 -1
  569. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +0 -247
  570. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts +0 -7
  571. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts.map +0 -1
  572. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js +0 -226
  573. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts +0 -8
  574. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts.map +0 -1
  575. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js +0 -45
  576. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts +0 -3
  577. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts.map +0 -1
  578. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js +0 -105
  579. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts +0 -6
  580. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts.map +0 -1
  581. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.js +0 -86
  582. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts +0 -2
  583. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts.map +0 -1
  584. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +0 -136
@@ -1,427 +1,453 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { isPowerOfTwo } from "../../../../core/math/isPowerOfTwo.js";
3
- import { GRID_TILE_SIZE } from "../../shader/chunk/grid/chunk_grid_tile_window.js";
4
- import { fluid_cascade_window_place, fluid_cascade_window_value } from "../fluid_cascade_window.js";
5
- import { FLUID_CASCADE_DEVIATION_CELLS } from "../coupling/chunk_fluid_cascade_epilogue.js";
6
- import { FLUID_MAC_STEP_STRUCT } from "./FLUID_MAC_STEP_STRUCT.js";
7
- import { shader_fluid_mac_advect_correct } from "./shader_fluid_mac_advect_correct.js";
8
- import { shader_fluid_mac_advect_predict } from "./shader_fluid_mac_advect_predict.js";
9
- import { shader_fluid_mac_curl } from "./shader_fluid_mac_curl.js";
10
- import { shader_fluid_mac_divergence } from "./shader_fluid_mac_divergence.js";
11
- import { shader_fluid_mac_gradient } from "./shader_fluid_mac_gradient.js";
12
- import { shader_fluid_cascade_ghosts } from "../coupling/shader_fluid_cascade_ghosts.js";
13
- import { FLUID_CASCADE_GHOST_DEPTH } from "../coupling/FLUID_CASCADE_GHOSTS.js";
14
-
15
- /**
16
- * @typedef {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
17
- * @typedef {import("./FluidMacVelocitySet.js").FluidMacVelocitySet} FluidMacVelocitySet
18
- * @typedef {{u: GPUTextureView, v: GPUTextureView, w: GPUTextureView}} FluidMacVelocityViews a MAC
19
- * velocity field's three component views: a {@link FluidMacVelocitySet}'s, or a frame graph's
20
- * transient textures'
21
- * @typedef {{uniform: GPUBuffer, u: GPUTextureView, v: GPUTextureView, w: GPUTextureView, pressure: GPUBuffer}} FluidCascadeParentBindings
22
- * what a step reads of its parent beyond its window: `uniform`, the parent as
23
- * {@link FLUID_CASCADE_PARENT_STRUCT}; `u`, `v`, `w`, its persistent faces; `pressure`, its pressure.
24
- * A far-field parent binds stand-ins it never reads.
25
- * @typedef {{u: GPUTextureView, v: GPUTextureView, w: GPUTextureView, pressure: GPUBuffer}} FluidCascadeGhostBindings
26
- * a step's ghosts (`shader_fluid_cascade_ghosts`): `u`, `v`, `w`, the velocity shells, transient
27
- * `r32float` textures of each face lattice grown by `FLUID_CASCADE_GHOST_DEPTH` on every side;
28
- * `pressure`, the pressure ghosts over the window grown by one cell.
29
- */
30
-
31
- /**
32
- * Records the MAC passes of one cascade's step (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8): the
33
- * advection (predict, then correct), the right-hand side of the pressure solve, and the gradient
34
- * subtraction that writes the step's end velocity. The pressure solve between the last two is not
35
- * here.
36
- *
37
- * One instance a cascade. {@link place} puts its window, {@link set_step} sets a step's h, dt and far
38
- * field, and each `record_*` records into the encoder a frame-graph pass hands its callback. Each
39
- * record serialises the step's parameters into a transient uniform of its own (pooled by the
40
- * encoder), so a step recorded later in the frame cannot change what an earlier one reads.
41
- *
42
- * The step's order and what moves between the passes, A the cascade's persistent velocity:
43
- *
44
- * record_ghosts(encoder, parent, G) parent → G (the step's ghosts)
45
- * record_curl(encoder, A, solid, C) A → C, the confinement force (with confinement)
46
- * record_advect(encoder, A, F, B, solid, forcing, C, parent, G) A → F (predict), A + F + C + forcing → B (correct)
47
- * record_divergence(encoder, B, solid, rhs, words) B → rhs = div/dt, solid → level 0 words
48
- * (the pressure solve: rhs → pressure, its ghosts G)
49
- * record_gradient(encoder, B, pressure, solid, A, G) B + pressure → A
50
- *
51
- * so A is the only velocity a cascade keeps between steps, and F and B are transients. Beyond the
52
- * window, the advection reads the step's ghosts of the parent's faces and the gradient those of its
53
- * pressure ({@link FluidCascadeGhostBindings}), each written once a step from the parent
54
- * ({@link FluidCascadeParentBindings}).
55
- *
56
- * Every pass dispatches `(nx / 8, ny / 8, nz / 4)` workgroups, the ghosts `ceil((n + 1 + 2·depth) / 4)`
57
- * on each axis, a texel of the largest shell an invocation. Nothing here allocates once placed:
58
- * the parameters, bindings and dispatch arguments are retained and rewritten in place.
59
- */
60
- export class FluidMacPasses {
61
- /**
62
- * Offer the compute pipelines the MAC step passes dispatch — see {@link PipelineEnquiry}.
63
- *
64
- * @param {import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
65
- */
66
- static enquirePipelines(enquiry) {
67
- enquiry.compute.push(
68
- shader_fluid_mac_advect_correct.pipeline,
69
- shader_fluid_mac_advect_predict.pipeline,
70
- shader_fluid_mac_curl.pipeline,
71
- shader_fluid_mac_divergence.pipeline,
72
- shader_fluid_mac_gradient.pipeline,
73
- shader_fluid_cascade_ghosts.pipeline,
74
- );
75
- }
76
-
77
- /** The value of {@link FLUID_MAC_STEP_STRUCT}, rewritten in place. */
78
- #step = {
79
- cells: fluid_cascade_window_value(),
80
- faces_u: fluid_cascade_window_value(),
81
- faces_v: fluid_cascade_window_value(),
82
- faces_w: fluid_cascade_window_value(),
83
- far_velocity: new Float32Array(3),
84
- dt_over_h: 0,
85
- far_velocity_end: new Float32Array(3),
86
- rhs_scale: 0,
87
- keep: 1,
88
- deviation_limit: 0,
89
- band: 0,
90
- confinement_dt: 0,
91
- };
92
-
93
- #placed = false;
94
- #stepped = false;
95
-
96
- /** Stand-in words buffer when {@link record_divergence} is called without an explicit words buffer. */
97
- #stand_in_device = null;
98
- #stand_in_words = null;
99
-
100
- #curl = {
101
- encoder: null,
102
- bindings: { step: null, source_u: null, source_v: null, source_w: null, solid: null, confinement: null },
103
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
104
- };
105
-
106
- #predict = {
107
- encoder: null,
108
- bindings: {
109
- step: null, source_u: null, source_v: null, source_w: null,
110
- ghost_u: null, ghost_v: null, ghost_w: null,
111
- solid: null, forward_u: null, forward_v: null, forward_w: null,
112
- },
113
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
114
- };
115
-
116
- #correct = {
117
- encoder: null,
118
- bindings: {
119
- step: null, parent: null, source_u: null, source_v: null, source_w: null, forward_u: null, forward_v: null, forward_w: null,
120
- parent_u: null, parent_v: null, parent_w: null, ghost_u: null, ghost_v: null, ghost_w: null,
121
- solid: null, forcing: null, confinement: null, out_u: null, out_v: null, out_w: null,
122
- },
123
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
124
- };
125
-
126
- #divergence = {
127
- encoder: null,
128
- bindings: { step: null, velocity_u: null, velocity_v: null, velocity_w: null, solid: null, rhs: null, words: null },
129
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
130
- };
131
-
132
- #ghosts = {
133
- encoder: null,
134
- bindings: {
135
- step: null, parent: null, parent_u: null, parent_v: null, parent_w: null, parent_pressure: null,
136
- ghost_u: null, ghost_v: null, ghost_w: null, ghost_pressure: null,
137
- },
138
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
139
- };
140
-
141
- #gradient = {
142
- encoder: null,
143
- bindings: {
144
- step: null, velocity_u: null, velocity_v: null, velocity_w: null, pressure: null, ghost_pressure: null,
145
- solid: null, out_u: null, out_v: null, out_w: null,
146
- },
147
- group_count_x: 1, group_count_y: 1, group_count_z: 1,
148
- };
149
-
150
- /**
151
- * Where the cascade's window is.
152
- *
153
- * @param {ArrayLike<number>} resolution cells on each axis, each a power of two, at least 8, 8, 4
154
- * @param {ArrayLike<number>} corner the world cell at window-local (0, 0, 0)
155
- */
156
- place(resolution, corner) {
157
- for (let i = 0; i < 3; i++) {
158
- assert.isNonNegativeInteger(resolution[i], 'resolution');
159
- assert.ok(isPowerOfTwo(resolution[i]), 'resolution is a power of two on each axis');
160
- assert.greaterThanOrEqual(resolution[i], GRID_TILE_SIZE[i], 'resolution holds a whole tile on each axis');
161
- assert.isInteger(corner[i], 'corner');
162
- }
163
-
164
- const step = this.#step;
165
-
166
- fluid_cascade_window_place(step.cells, corner, resolution, -1);
167
- fluid_cascade_window_place(step.faces_u, corner, resolution, 0);
168
- fluid_cascade_window_place(step.faces_v, corner, resolution, 1);
169
- fluid_cascade_window_place(step.faces_w, corner, resolution, 2);
170
-
171
- const x = resolution[0] / GRID_TILE_SIZE[0];
172
- const y = resolution[1] / GRID_TILE_SIZE[1];
173
- const z = resolution[2] / GRID_TILE_SIZE[2];
174
-
175
- for (const pass of [this.#curl, this.#predict, this.#correct, this.#divergence, this.#gradient]) {
176
- pass.group_count_x = x;
177
- pass.group_count_y = y;
178
- pass.group_count_z = z;
179
- }
180
-
181
- // the ghosts: a texel of the largest shell an invocation
182
- const ghosts = this.#ghosts;
183
- ghosts.group_count_x = Math.ceil((resolution[0] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
184
- ghosts.group_count_y = Math.ceil((resolution[1] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
185
- ghosts.group_count_z = Math.ceil((resolution[2] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
186
-
187
- this.#placed = true;
188
- }
189
-
190
- /**
191
- * The step about to be recorded, from `t₀` to `t₁` (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §6, §8).
192
- *
193
- * @param {number} h cell size, m
194
- * @param {number} dt time step, s
195
- * @param {ArrayLike<number>} far_velocity `v_far(t₀)`, m/s: what the velocity the step starts from
196
- * is a deviation from
197
- * @param {ArrayLike<number>} far_velocity_end `v_far(t₁)`, m/s
198
- * @param {number} keep `e^(−(Λ(t₁) − Λ(t₀)))`, in [0, 1]
199
- * @param {boolean} band whether the faces of rows 2..5 relax toward the parent
200
- * @param {number} confinement the vorticity confinement's strength ε, per second, ≥ 0: 0 for none,
201
- * and then {@link record_curl} is not recorded for the step
202
- */
203
- set_step(h, dt, far_velocity, far_velocity_end, keep, band, confinement) {
204
- assert.isFinite(h, 'h'); assert.greaterThan(h, 0, 'h');
205
- assert.isFinite(dt, 'dt'); assert.greaterThan(dt, 0, 'dt');
206
- assert.isFinite(keep, 'keep');
207
- assert.greaterThanOrEqual(keep, 0, 'keep');
208
- assert.lessThanOrEqual(keep, 1, 'keep');
209
- assert.isBoolean(band, 'band');
210
- assert.isFinite(confinement, 'confinement');
211
- assert.greaterThanOrEqual(confinement, 0, 'confinement');
212
-
213
- const step = this.#step;
214
-
215
- step.dt_over_h = dt / h;
216
- step.rhs_scale = 1 / (h * dt);
217
- step.keep = keep;
218
- step.deviation_limit = FLUID_CASCADE_DEVIATION_CELLS * h / dt;
219
- step.band = band ? 1 : 0;
220
- step.confinement_dt = confinement * dt;
221
-
222
- for (let i = 0; i < 3; i++) {
223
- assert.isFinite(far_velocity[i], 'far_velocity');
224
- assert.isFinite(far_velocity_end[i], 'far_velocity_end');
225
-
226
- step.far_velocity[i] = far_velocity[i];
227
- step.far_velocity_end[i] = far_velocity_end[i];
228
- }
229
-
230
- this.#stepped = true;
231
- }
232
-
233
- /**
234
- * @param {ShadeGPUCommandContext} encoder
235
- * @returns {GPUBuffer}
236
- */
237
- #uniform(encoder) {
238
- assert.ok(this.#placed, 'placed before recording');
239
- assert.ok(this.#stepped, 'a step set before recording');
240
-
241
- return encoder.allocateTransientValueBuffer(FLUID_MAC_STEP_STRUCT, this.#step, GPUBufferUsage.UNIFORM);
242
- }
243
-
244
- /**
245
- * The step's vorticity confinement, pass 1 (`shader_fluid_mac_curl`): the curl of the persistent
246
- * velocity and the force it makes in every cell, for the correct pass. Recorded only for a step whose
247
- * confinement is not 0, before {@link record_advect}.
248
- *
249
- * @param {ShadeGPUCommandContext} encoder
250
- * @param {FluidMacVelocityViews} source the persistent velocity, toroidal; read
251
- * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
252
- * @param {GPUBuffer} confinement written, `array<f32>` of 3·N cells, window-local
253
- */
254
- record_curl(encoder, source, solid, confinement) {
255
- assert.greaterThan(this.#step.confinement_dt, 0, 'a step with confinement');
256
-
257
- const pass = this.#curl;
258
- const b = pass.bindings;
259
- b.step = this.#uniform(encoder);
260
- b.source_u = source.u; b.source_v = source.v; b.source_w = source.w;
261
- b.solid = solid;
262
- b.confinement = confinement;
263
- pass.encoder = encoder;
264
-
265
- shader_fluid_mac_curl.dispatch(pass);
266
-
267
- pass.encoder = null;
268
- b.confinement = null;
269
- }
270
-
271
- /**
272
- * MacCormack advection of the persistent velocity by itself: predict into `forward`, then correct
273
- * into `out`, which adds the step's confinement and the tick's forcing.
274
- *
275
- * @param {ShadeGPUCommandContext} encoder
276
- * @param {FluidMacVelocityViews} source the persistent velocity, toroidal; read
277
- * @param {FluidMacVelocityViews} forward a transient, window-local; written, then read
278
- * @param {FluidMacVelocityViews} out a transient, window-local; written
279
- * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`: bit 0 solid, bit 1
280
- * (`FLUID_FORCED_FLAG`) forcing written for the cell's faces
281
- * @param {GPUBuffer} forcing the tick's forcing, `array<f32>` over the three face lattices
282
- * (`shader_fluid_mac_advect_correct`); read only where `solid` says it was written
283
- * @param {GPUBuffer} confinement what {@link record_curl} wrote for the step; read only when the
284
- * step's confinement is not 0
285
- * @param {FluidCascadeParentBindings} parent what the relaxation band reads on rows 2..5
286
- * @param {FluidCascadeGhostBindings} ghosts the step's ghosts, written by {@link record_ghosts}
287
- */
288
- record_advect(encoder, source, forward, out, solid, forcing, confinement, parent, ghosts) {
289
- assert.notEqual(source, forward, 'source and forward are different sets');
290
- assert.notEqual(source, out, 'source and out are different sets');
291
- assert.notEqual(forward, out, 'forward and out are different sets');
292
-
293
- const step = this.#uniform(encoder);
294
-
295
- const predict = this.#predict;
296
- const p = predict.bindings;
297
- p.step = step;
298
- p.source_u = source.u; p.source_v = source.v; p.source_w = source.w;
299
- p.ghost_u = ghosts.u; p.ghost_v = ghosts.v; p.ghost_w = ghosts.w;
300
- p.solid = solid;
301
- p.forward_u = forward.u; p.forward_v = forward.v; p.forward_w = forward.w;
302
- predict.encoder = encoder;
303
-
304
- shader_fluid_mac_advect_predict.dispatch(predict);
305
-
306
- const correct = this.#correct;
307
- const c = correct.bindings;
308
- c.step = step;
309
- c.parent = parent.uniform;
310
- c.source_u = source.u; c.source_v = source.v; c.source_w = source.w;
311
- c.forward_u = forward.u; c.forward_v = forward.v; c.forward_w = forward.w;
312
- c.parent_u = parent.u; c.parent_v = parent.v; c.parent_w = parent.w;
313
- c.ghost_u = ghosts.u; c.ghost_v = ghosts.v; c.ghost_w = ghosts.w;
314
- c.solid = solid;
315
- c.forcing = forcing;
316
- c.confinement = confinement;
317
- c.out_u = out.u; c.out_v = out.v; c.out_w = out.w;
318
- correct.encoder = encoder;
319
-
320
- shader_fluid_mac_advect_correct.dispatch(correct);
321
-
322
- predict.encoder = null;
323
- correct.encoder = null;
324
- c.forcing = null;
325
- c.confinement = null;
326
- }
327
-
328
- /**
329
- * The step's ghosts (`shader_fluid_cascade_ghosts`): the parent's identity read at every face of the
330
- * velocity shells and its pressure at every cell one past the window, once, for the step's passes.
331
- *
332
- * @param {ShadeGPUCommandContext} encoder
333
- * @param {FluidCascadeParentBindings} parent
334
- * @param {FluidCascadeGhostBindings} ghosts written
335
- */
336
- record_ghosts(encoder, parent, ghosts) {
337
- const pass = this.#ghosts;
338
- const b = pass.bindings;
339
- b.step = this.#uniform(encoder);
340
- b.parent = parent.uniform;
341
- b.parent_u = parent.u; b.parent_v = parent.v; b.parent_w = parent.w;
342
- b.parent_pressure = parent.pressure;
343
- b.ghost_u = ghosts.u; b.ghost_v = ghosts.v; b.ghost_w = ghosts.w;
344
- b.ghost_pressure = ghosts.pressure;
345
- pass.encoder = encoder;
346
-
347
- shader_fluid_cascade_ghosts.dispatch(pass);
348
-
349
- pass.encoder = null;
350
- }
351
-
352
- /**
353
- * @param {GPUDevice} device
354
- * @param {number} size
355
- * @returns {GPUBuffer}
356
- */
357
- #ensure_stand_in_words(device, size) {
358
- if (this.#stand_in_device === device && this.#stand_in_words !== null && this.#stand_in_words.size === size) {
359
- return this.#stand_in_words;
360
- }
361
-
362
- this.#stand_in_words?.destroy();
363
- this.#stand_in_device = device;
364
- this.#stand_in_words = device.createBuffer({
365
- label: 'Fluid / MAC / stand-in words',
366
- size,
367
- usage: GPUBufferUsage.STORAGE,
368
- });
369
-
370
- return this.#stand_in_words;
371
- }
372
-
373
- /**
374
- * The right-hand side and finest-level weight words of the pressure solve, `div/dt` at every cell,
375
- * 0 in solid cells.
376
- *
377
- * @param {ShadeGPUCommandContext} encoder
378
- * @param {FluidMacVelocityViews} velocity the advected velocity, window-local; read
379
- * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
380
- * @param {GPUBuffer} rhs written, `array<f32>` of N cells, window-local, x fastest
381
- * @param {GPUBuffer} [words] written, `array<u32>` of N cells, the finest level's weight words
382
- */
383
- record_divergence(encoder, velocity, solid, rhs, words = null) {
384
- const pass = this.#divergence;
385
- const b = pass.bindings;
386
- b.step = this.#uniform(encoder);
387
- b.velocity_u = velocity.u; b.velocity_v = velocity.v; b.velocity_w = velocity.w;
388
- b.solid = solid;
389
- b.rhs = rhs;
390
- b.words = words ?? this.#ensure_stand_in_words(encoder.device, rhs.size);
391
- pass.encoder = encoder;
392
-
393
- shader_fluid_mac_divergence.dispatch(pass);
394
-
395
- pass.encoder = null;
396
- b.words = null;
397
- }
398
-
399
- /**
400
- * The pressure gradient taken from the advected velocity, into the persistent velocity.
401
- *
402
- * @param {ShadeGPUCommandContext} encoder
403
- * @param {FluidMacVelocityViews} velocity the advected velocity, window-local; read
404
- * @param {GPUBuffer} pressure kinematic pressure, m²/s², `array<f32>` of N cells, toroidal; read
405
- * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
406
- * @param {FluidMacVelocityViews} out the persistent velocity, toroidal; written
407
- * @param {FluidCascadeGhostBindings} ghosts the step's ghosts: `pressure` is the pressure beyond the window
408
- */
409
- record_gradient(encoder, velocity, pressure, solid, out, ghosts) {
410
- assert.notEqual(velocity, out, 'velocity and out are different sets');
411
- assert.notEqual(pressure, ghosts.pressure, 'the ghosts are not the cascade\'s pressure');
412
-
413
- const pass = this.#gradient;
414
- const b = pass.bindings;
415
- b.step = this.#uniform(encoder);
416
- b.velocity_u = velocity.u; b.velocity_v = velocity.v; b.velocity_w = velocity.w;
417
- b.pressure = pressure;
418
- b.ghost_pressure = ghosts.pressure;
419
- b.solid = solid;
420
- b.out_u = out.u; b.out_v = out.v; b.out_w = out.w;
421
- pass.encoder = encoder;
422
-
423
- shader_fluid_mac_gradient.dispatch(pass);
424
-
425
- pass.encoder = null;
426
- }
427
- }
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { isPowerOfTwo } from "../../../../core/math/isPowerOfTwo.js";
3
+ import { GRID_TILE_SIZE } from "../../shader/chunk/grid/chunk_grid_tile_window.js";
4
+ import { fluid_cascade_window_place, fluid_cascade_window_value } from "../fluid_cascade_window.js";
5
+ import { FLUID_CASCADE_DEVIATION_CELLS } from "../coupling/chunk_fluid_cascade_epilogue.js";
6
+ import { FLUID_MAC_STEP_STRUCT } from "./FLUID_MAC_STEP_STRUCT.js";
7
+ import { shader_fluid_mac_advect_correct } from "./shader_fluid_mac_advect_correct.js";
8
+ import { shader_fluid_mac_advect_predict } from "./shader_fluid_mac_advect_predict.js";
9
+ import { shader_fluid_mac_curl } from "./shader_fluid_mac_curl.js";
10
+ import { shader_fluid_mac_divergence } from "./shader_fluid_mac_divergence.js";
11
+ import { shader_fluid_mac_gradient } from "./shader_fluid_mac_gradient.js";
12
+ import { shader_fluid_cascade_ghosts } from "../coupling/shader_fluid_cascade_ghosts.js";
13
+ import { FLUID_CASCADE_GHOST_DEPTH } from "../coupling/FLUID_CASCADE_GHOSTS.js";
14
+ import { fluid_far_field_value } from "../FLUID_FAR_FIELD_STRUCT.js";
15
+
16
+ /**
17
+ * @typedef {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} ShadeGPUCommandContext
18
+ * @typedef {import("./FluidMacVelocitySet.js").FluidMacVelocitySet} FluidMacVelocitySet
19
+ * @typedef {{u: GPUTextureView, v: GPUTextureView, w: GPUTextureView}} FluidMacVelocityViews a MAC
20
+ * velocity field's three component views: a {@link FluidMacVelocitySet}'s, or a frame graph's
21
+ * transient textures'
22
+ * @typedef {{uniform: GPUBuffer, u: GPUTextureView, v: GPUTextureView, w: GPUTextureView, pressure: GPUBuffer, turbulence: GPUTextureView}} FluidCascadeParentBindings
23
+ * what a step reads of its parent beyond its window: `uniform`, the parent as
24
+ * {@link FLUID_CASCADE_PARENT_STRUCT}; `u`, `v`, `w`, its persistent faces; `pressure`, its pressure;
25
+ * `turbulence`, the far field's turbulence tile, which the step's far field reads too. A far-field
26
+ * parent binds stand-ins it never reads.
27
+ * @typedef {{u: GPUTextureView, v: GPUTextureView, w: GPUTextureView, pressure: GPUBuffer}} FluidCascadeGhostBindings
28
+ * a step's ghosts (`shader_fluid_cascade_ghosts`): `u`, `v`, `w`, the velocity shells, transient
29
+ * `r32float` textures of each face lattice grown by `FLUID_CASCADE_GHOST_DEPTH` on every side;
30
+ * `pressure`, the pressure ghosts over the window grown by one cell.
31
+ */
32
+
33
+ /**
34
+ * Copy a far field value ({@link FLUID_FAR_FIELD_STRUCT}) into another, checking it is finite.
35
+ *
36
+ * @param {{mean: Float32Array, sigma: number, origin: Float32Array, scale: Float32Array}} out
37
+ * @param {{mean: ArrayLike<number>, sigma: number, origin: ArrayLike<number>, scale: ArrayLike<number>}} from
38
+ */
39
+ function copy_far_field(out, from) {
40
+ assert.isFinite(from.sigma, 'sigma');
41
+
42
+ for (let i = 0; i < 3; i++) {
43
+ assert.isFinite(from.mean[i], 'far mean');
44
+ assert.isFinite(from.origin[i], 'far origin');
45
+ assert.isFinite(from.scale[i], 'far scale');
46
+
47
+ out.mean[i] = from.mean[i];
48
+ out.origin[i] = from.origin[i];
49
+ out.scale[i] = from.scale[i];
50
+ }
51
+
52
+ out.sigma = from.sigma;
53
+ out.lod = from.lod ?? 0;
54
+ }
55
+
56
+ /**
57
+ * Records the MAC passes of one cascade's step (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §8): the
58
+ * advection (predict, then correct), the right-hand side of the pressure solve, and the gradient
59
+ * subtraction that writes the step's end velocity. The pressure solve between the last two is not
60
+ * here.
61
+ *
62
+ * One instance a cascade. {@link place} puts its window, {@link set_step} sets a step's h, dt and far
63
+ * field, and each `record_*` records into the encoder a frame-graph pass hands its callback. Each
64
+ * record serialises the step's parameters into a transient uniform of its own (pooled by the
65
+ * encoder), so a step recorded later in the frame cannot change what an earlier one reads.
66
+ *
67
+ * The step's order and what moves between the passes, A the cascade's persistent velocity:
68
+ *
69
+ * record_ghosts(encoder, parent, G) parent → G (the step's ghosts)
70
+ * record_curl(encoder, A, solid, C) A → C, the confinement force (with confinement)
71
+ * record_advect(encoder, A, F, B, solid, forcing, C, parent, G) A → F (predict), A + F + C + forcing → B (correct)
72
+ * record_divergence(encoder, B, solid, rhs, words) B → rhs = div/dt, solid → level 0 words
73
+ * (the pressure solve: rhs → pressure, its ghosts G)
74
+ * record_gradient(encoder, B, pressure, solid, A, G) B + pressure → A
75
+ *
76
+ * so A is the only velocity a cascade keeps between steps, and F and B are transients. Beyond the
77
+ * window, the advection reads the step's ghosts of the parent's faces and the gradient those of its
78
+ * pressure ({@link FluidCascadeGhostBindings}), each written once a step from the parent
79
+ * ({@link FluidCascadeParentBindings}).
80
+ *
81
+ * Every pass dispatches `(nx / 8, ny / 8, nz / 4)` workgroups, the ghosts `ceil((n + 1 + 2·depth) / 4)`
82
+ * on each axis, a texel of the largest shell an invocation. Nothing here allocates once placed:
83
+ * the parameters, bindings and dispatch arguments are retained and rewritten in place.
84
+ */
85
+ export class FluidMacPasses {
86
+ /**
87
+ * Offer the compute pipelines the MAC step passes dispatch — see {@link PipelineEnquiry}.
88
+ *
89
+ * @param {import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
90
+ */
91
+ static enquirePipelines(enquiry) {
92
+ enquiry.compute.push(
93
+ shader_fluid_mac_advect_correct.pipeline,
94
+ shader_fluid_mac_advect_predict.pipeline,
95
+ shader_fluid_mac_curl.pipeline,
96
+ shader_fluid_mac_divergence.pipeline,
97
+ shader_fluid_mac_gradient.pipeline,
98
+ shader_fluid_cascade_ghosts.pipeline,
99
+ );
100
+ }
101
+
102
+ /** The value of {@link FLUID_MAC_STEP_STRUCT}, rewritten in place. */
103
+ #step = {
104
+ cells: fluid_cascade_window_value(),
105
+ faces_u: fluid_cascade_window_value(),
106
+ faces_v: fluid_cascade_window_value(),
107
+ faces_w: fluid_cascade_window_value(),
108
+ far: fluid_far_field_value(),
109
+ far_end: fluid_far_field_value(),
110
+ dt_over_h: 0,
111
+ rhs_scale: 0,
112
+ keep: 1,
113
+ deviation_limit: 0,
114
+ band: 0,
115
+ confinement_dt: 0,
116
+ };
117
+
118
+ #placed = false;
119
+ #stepped = false;
120
+
121
+ /** Stand-in words buffer when {@link record_divergence} is called without an explicit words buffer. */
122
+ #stand_in_device = null;
123
+ #stand_in_words = null;
124
+
125
+ #curl = {
126
+ encoder: null,
127
+ bindings: { step: null, source_u: null, source_v: null, source_w: null, solid: null, confinement: null },
128
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
129
+ };
130
+
131
+ #predict = {
132
+ encoder: null,
133
+ bindings: {
134
+ step: null, source_u: null, source_v: null, source_w: null,
135
+ ghost_u: null, ghost_v: null, ghost_w: null,
136
+ solid: null, forward_u: null, forward_v: null, forward_w: null,
137
+ },
138
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
139
+ };
140
+
141
+ #correct = {
142
+ encoder: null,
143
+ bindings: {
144
+ step: null, parent: null, source_u: null, source_v: null, source_w: null, forward_u: null, forward_v: null, forward_w: null,
145
+ parent_u: null, parent_v: null, parent_w: null, ghost_u: null, ghost_v: null, ghost_w: null,
146
+ solid: null, forcing: null, confinement: null, out_u: null, out_v: null, out_w: null, fluid_turbulence: null,
147
+ },
148
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
149
+ };
150
+
151
+ #divergence = {
152
+ encoder: null,
153
+ bindings: { step: null, velocity_u: null, velocity_v: null, velocity_w: null, solid: null, rhs: null, words: null },
154
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
155
+ };
156
+
157
+ #ghosts = {
158
+ encoder: null,
159
+ bindings: {
160
+ step: null, parent: null, parent_u: null, parent_v: null, parent_w: null, parent_pressure: null,
161
+ ghost_u: null, ghost_v: null, ghost_w: null, ghost_pressure: null, fluid_turbulence: null,
162
+ },
163
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
164
+ };
165
+
166
+ #gradient = {
167
+ encoder: null,
168
+ bindings: {
169
+ step: null, velocity_u: null, velocity_v: null, velocity_w: null, pressure: null, ghost_pressure: null,
170
+ solid: null, out_u: null, out_v: null, out_w: null,
171
+ },
172
+ group_count_x: 1, group_count_y: 1, group_count_z: 1,
173
+ };
174
+
175
+ /**
176
+ * Where the cascade's window is.
177
+ *
178
+ * @param {ArrayLike<number>} resolution cells on each axis, each a power of two, at least 8, 8, 4
179
+ * @param {ArrayLike<number>} corner the world cell at window-local (0, 0, 0)
180
+ */
181
+ place(resolution, corner) {
182
+ for (let i = 0; i < 3; i++) {
183
+ assert.isNonNegativeInteger(resolution[i], 'resolution');
184
+ assert.ok(isPowerOfTwo(resolution[i]), 'resolution is a power of two on each axis');
185
+ assert.greaterThanOrEqual(resolution[i], GRID_TILE_SIZE[i], 'resolution holds a whole tile on each axis');
186
+ assert.isInteger(corner[i], 'corner');
187
+ }
188
+
189
+ const step = this.#step;
190
+
191
+ fluid_cascade_window_place(step.cells, corner, resolution, -1);
192
+ fluid_cascade_window_place(step.faces_u, corner, resolution, 0);
193
+ fluid_cascade_window_place(step.faces_v, corner, resolution, 1);
194
+ fluid_cascade_window_place(step.faces_w, corner, resolution, 2);
195
+
196
+ const x = resolution[0] / GRID_TILE_SIZE[0];
197
+ const y = resolution[1] / GRID_TILE_SIZE[1];
198
+ const z = resolution[2] / GRID_TILE_SIZE[2];
199
+
200
+ for (const pass of [this.#curl, this.#predict, this.#correct, this.#divergence, this.#gradient]) {
201
+ pass.group_count_x = x;
202
+ pass.group_count_y = y;
203
+ pass.group_count_z = z;
204
+ }
205
+
206
+ // the ghosts: a texel of the largest shell an invocation
207
+ const ghosts = this.#ghosts;
208
+ ghosts.group_count_x = Math.ceil((resolution[0] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
209
+ ghosts.group_count_y = Math.ceil((resolution[1] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
210
+ ghosts.group_count_z = Math.ceil((resolution[2] + 1 + 2 * FLUID_CASCADE_GHOST_DEPTH) / 4);
211
+
212
+ this.#placed = true;
213
+ }
214
+
215
+ /**
216
+ * The step about to be recorded, from `t₀` to `t₁` (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §6, §8).
217
+ *
218
+ * @param {number} h cell size, m
219
+ * @param {number} dt time step, s
220
+ * @param {{mean: ArrayLike<number>, sigma: number, origin: ArrayLike<number>, scale: ArrayLike<number>}} far
221
+ * `v_far(t₀)` as {@link FLUID_MAC_STEP_STRUCT} `far` holds it, over the window's cells: what the
222
+ * velocity the step starts from is a deviation from
223
+ * @param {{mean: ArrayLike<number>, sigma: number, origin: ArrayLike<number>, scale: ArrayLike<number>}} far_end
224
+ * `v_far(t₁)`, likewise
225
+ * @param {number} keep `e^(−(Λ(t₁) − Λ(t₀)))`, in [0, 1]
226
+ * @param {boolean} band whether the faces of rows 2..5 relax toward the parent
227
+ * @param {number} confinement the vorticity confinement's strength ε, per second, ≥ 0: 0 for none,
228
+ * and then {@link record_curl} is not recorded for the step
229
+ */
230
+ set_step(h, dt, far, far_end, keep, band, confinement) {
231
+ assert.isFinite(h, 'h'); assert.greaterThan(h, 0, 'h');
232
+ assert.isFinite(dt, 'dt'); assert.greaterThan(dt, 0, 'dt');
233
+ assert.isFinite(keep, 'keep');
234
+ assert.greaterThanOrEqual(keep, 0, 'keep');
235
+ assert.lessThanOrEqual(keep, 1, 'keep');
236
+ assert.isBoolean(band, 'band');
237
+ assert.isFinite(confinement, 'confinement');
238
+ assert.greaterThanOrEqual(confinement, 0, 'confinement');
239
+
240
+ const step = this.#step;
241
+
242
+ step.dt_over_h = dt / h;
243
+ step.rhs_scale = 1 / (h * dt);
244
+ step.keep = keep;
245
+ step.deviation_limit = FLUID_CASCADE_DEVIATION_CELLS * h / dt;
246
+ step.band = band ? 1 : 0;
247
+ step.confinement_dt = confinement * dt;
248
+
249
+ copy_far_field(step.far, far);
250
+ copy_far_field(step.far_end, far_end);
251
+
252
+ this.#stepped = true;
253
+ }
254
+
255
+ /**
256
+ * @param {ShadeGPUCommandContext} encoder
257
+ * @returns {GPUBuffer}
258
+ */
259
+ #uniform(encoder) {
260
+ assert.ok(this.#placed, 'placed before recording');
261
+ assert.ok(this.#stepped, 'a step set before recording');
262
+
263
+ return encoder.allocateTransientValueBuffer(FLUID_MAC_STEP_STRUCT, this.#step, GPUBufferUsage.UNIFORM);
264
+ }
265
+
266
+ /**
267
+ * The step's vorticity confinement, pass 1 (`shader_fluid_mac_curl`): the curl of the persistent
268
+ * velocity and the force it makes in every cell, for the correct pass. Recorded only for a step whose
269
+ * confinement is not 0, before {@link record_advect}.
270
+ *
271
+ * @param {ShadeGPUCommandContext} encoder
272
+ * @param {FluidMacVelocityViews} source the persistent velocity, toroidal; read
273
+ * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
274
+ * @param {GPUBuffer} confinement written, `array<f32>` of 3·N cells, window-local
275
+ */
276
+ record_curl(encoder, source, solid, confinement) {
277
+ assert.greaterThan(this.#step.confinement_dt, 0, 'a step with confinement');
278
+
279
+ const pass = this.#curl;
280
+ const b = pass.bindings;
281
+ b.step = this.#uniform(encoder);
282
+ b.source_u = source.u; b.source_v = source.v; b.source_w = source.w;
283
+ b.solid = solid;
284
+ b.confinement = confinement;
285
+ pass.encoder = encoder;
286
+
287
+ shader_fluid_mac_curl.dispatch(pass);
288
+
289
+ pass.encoder = null;
290
+ b.confinement = null;
291
+ }
292
+
293
+ /**
294
+ * MacCormack advection of the persistent velocity by itself: predict into `forward`, then correct
295
+ * into `out`, which adds the step's confinement and the tick's forcing.
296
+ *
297
+ * @param {ShadeGPUCommandContext} encoder
298
+ * @param {FluidMacVelocityViews} source the persistent velocity, toroidal; read
299
+ * @param {FluidMacVelocityViews} forward a transient, window-local; written, then read
300
+ * @param {FluidMacVelocityViews} out a transient, window-local; written
301
+ * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`: bit 0 solid, bit 1
302
+ * (`FLUID_FORCED_FLAG`) forcing written for the cell's faces
303
+ * @param {GPUBuffer} forcing the tick's forcing, `array<f32>` over the three face lattices
304
+ * (`shader_fluid_mac_advect_correct`); read only where `solid` says it was written
305
+ * @param {GPUBuffer} confinement what {@link record_curl} wrote for the step; read only when the
306
+ * step's confinement is not 0
307
+ * @param {FluidCascadeParentBindings} parent what the relaxation band reads on rows 2..5
308
+ * @param {FluidCascadeGhostBindings} ghosts the step's ghosts, written by {@link record_ghosts}
309
+ */
310
+ record_advect(encoder, source, forward, out, solid, forcing, confinement, parent, ghosts) {
311
+ assert.notEqual(source, forward, 'source and forward are different sets');
312
+ assert.notEqual(source, out, 'source and out are different sets');
313
+ assert.notEqual(forward, out, 'forward and out are different sets');
314
+
315
+ const step = this.#uniform(encoder);
316
+
317
+ const predict = this.#predict;
318
+ const p = predict.bindings;
319
+ p.step = step;
320
+ p.source_u = source.u; p.source_v = source.v; p.source_w = source.w;
321
+ p.ghost_u = ghosts.u; p.ghost_v = ghosts.v; p.ghost_w = ghosts.w;
322
+ p.solid = solid;
323
+ p.forward_u = forward.u; p.forward_v = forward.v; p.forward_w = forward.w;
324
+ predict.encoder = encoder;
325
+
326
+ shader_fluid_mac_advect_predict.dispatch(predict);
327
+
328
+ const correct = this.#correct;
329
+ const c = correct.bindings;
330
+ c.step = step;
331
+ c.parent = parent.uniform;
332
+ c.source_u = source.u; c.source_v = source.v; c.source_w = source.w;
333
+ c.forward_u = forward.u; c.forward_v = forward.v; c.forward_w = forward.w;
334
+ c.parent_u = parent.u; c.parent_v = parent.v; c.parent_w = parent.w;
335
+ c.ghost_u = ghosts.u; c.ghost_v = ghosts.v; c.ghost_w = ghosts.w;
336
+ c.solid = solid;
337
+ c.forcing = forcing;
338
+ c.confinement = confinement;
339
+ c.out_u = out.u; c.out_v = out.v; c.out_w = out.w;
340
+ c.fluid_turbulence = parent.turbulence;
341
+ correct.encoder = encoder;
342
+
343
+ shader_fluid_mac_advect_correct.dispatch(correct);
344
+
345
+ predict.encoder = null;
346
+ correct.encoder = null;
347
+ c.forcing = null;
348
+ c.confinement = null;
349
+ c.fluid_turbulence = null;
350
+ }
351
+
352
+ /**
353
+ * The step's ghosts (`shader_fluid_cascade_ghosts`): the parent's identity read at every face of the
354
+ * velocity shells and its pressure at every cell one past the window, once, for the step's passes.
355
+ *
356
+ * @param {ShadeGPUCommandContext} encoder
357
+ * @param {FluidCascadeParentBindings} parent
358
+ * @param {FluidCascadeGhostBindings} ghosts written
359
+ */
360
+ record_ghosts(encoder, parent, ghosts) {
361
+ const pass = this.#ghosts;
362
+ const b = pass.bindings;
363
+ b.step = this.#uniform(encoder);
364
+ b.parent = parent.uniform;
365
+ b.parent_u = parent.u; b.parent_v = parent.v; b.parent_w = parent.w;
366
+ b.parent_pressure = parent.pressure;
367
+ b.ghost_u = ghosts.u; b.ghost_v = ghosts.v; b.ghost_w = ghosts.w;
368
+ b.ghost_pressure = ghosts.pressure;
369
+ b.fluid_turbulence = parent.turbulence;
370
+ pass.encoder = encoder;
371
+
372
+ shader_fluid_cascade_ghosts.dispatch(pass);
373
+
374
+ pass.encoder = null;
375
+ b.fluid_turbulence = null;
376
+ }
377
+
378
+ /**
379
+ * @param {GPUDevice} device
380
+ * @param {number} size
381
+ * @returns {GPUBuffer}
382
+ */
383
+ #ensure_stand_in_words(device, size) {
384
+ if (this.#stand_in_device === device && this.#stand_in_words !== null && this.#stand_in_words.size === size) {
385
+ return this.#stand_in_words;
386
+ }
387
+
388
+ this.#stand_in_words?.destroy();
389
+ this.#stand_in_device = device;
390
+ this.#stand_in_words = device.createBuffer({
391
+ label: 'Fluid / MAC / stand-in words',
392
+ size,
393
+ usage: GPUBufferUsage.STORAGE,
394
+ });
395
+
396
+ return this.#stand_in_words;
397
+ }
398
+
399
+ /**
400
+ * The right-hand side and finest-level weight words of the pressure solve, `div/dt` at every cell,
401
+ * 0 in solid cells.
402
+ *
403
+ * @param {ShadeGPUCommandContext} encoder
404
+ * @param {FluidMacVelocityViews} velocity the advected velocity, window-local; read
405
+ * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
406
+ * @param {GPUBuffer} rhs written, `array<f32>` of N cells, window-local, x fastest
407
+ * @param {GPUBuffer} [words] written, `array<u32>` of N cells, the finest level's weight words
408
+ */
409
+ record_divergence(encoder, velocity, solid, rhs, words = null) {
410
+ const pass = this.#divergence;
411
+ const b = pass.bindings;
412
+ b.step = this.#uniform(encoder);
413
+ b.velocity_u = velocity.u; b.velocity_v = velocity.v; b.velocity_w = velocity.w;
414
+ b.solid = solid;
415
+ b.rhs = rhs;
416
+ b.words = words ?? this.#ensure_stand_in_words(encoder.device, rhs.size);
417
+ pass.encoder = encoder;
418
+
419
+ shader_fluid_mac_divergence.dispatch(pass);
420
+
421
+ pass.encoder = null;
422
+ b.words = null;
423
+ }
424
+
425
+ /**
426
+ * The pressure gradient taken from the advected velocity, into the persistent velocity.
427
+ *
428
+ * @param {ShadeGPUCommandContext} encoder
429
+ * @param {FluidMacVelocityViews} velocity the advected velocity, window-local; read
430
+ * @param {GPUBuffer} pressure kinematic pressure, m²/s², `array<f32>` of N cells, toroidal; read
431
+ * @param {GPUBuffer} solid the window-local solid flags, `array<u32>`, bit 0
432
+ * @param {FluidMacVelocityViews} out the persistent velocity, toroidal; written
433
+ * @param {FluidCascadeGhostBindings} ghosts the step's ghosts: `pressure` is the pressure beyond the window
434
+ */
435
+ record_gradient(encoder, velocity, pressure, solid, out, ghosts) {
436
+ assert.notEqual(velocity, out, 'velocity and out are different sets');
437
+ assert.notEqual(pressure, ghosts.pressure, 'the ghosts are not the cascade\'s pressure');
438
+
439
+ const pass = this.#gradient;
440
+ const b = pass.bindings;
441
+ b.step = this.#uniform(encoder);
442
+ b.velocity_u = velocity.u; b.velocity_v = velocity.v; b.velocity_w = velocity.w;
443
+ b.pressure = pressure;
444
+ b.ghost_pressure = ghosts.pressure;
445
+ b.solid = solid;
446
+ b.out_u = out.u; b.out_v = out.v; b.out_w = out.w;
447
+ pass.encoder = encoder;
448
+
449
+ shader_fluid_mac_gradient.dispatch(pass);
450
+
451
+ pass.encoder = null;
452
+ }
453
+ }