@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
@@ -13,7 +13,11 @@
13
13
  * {@link slot}, from the device; nothing here writes texels;
14
14
  * - {@link uniform}: the table a reader takes, {@link WIND_FIELD_STRUCT}: every cascade's window and
15
15
  * read record, finest first, and `v_far(t)`;
16
- * - {@link previous_uniform}: the table as the frame before read it, over the same atlas.
16
+ * - {@link previous_uniform}: the table as the frame before read it, over the same atlas;
17
+ * - {@link turbulence}: the far field's turbulence tile, `rgba16float`, which every reader of the field
18
+ * samples where the far field has turbulence. One texel of zeros until the far field first has any,
19
+ * then the engine's tile and its band-limited levels as mips (`fluid_turbulence_tile_levels`), uploaded
20
+ * once and kept.
17
21
  *
18
22
  * **The producer's frame**, before any consumer encodes (at `FrameStart`, ahead of the scene's own
19
23
  * update):
@@ -21,7 +25,8 @@
21
25
  * set_cascades(count, resolution) the stack's shape; allocates tiles
22
26
  * set_cascade_window(c, corner, cell_size) where each cascade's window is
23
27
  * set_cascade_decay(c, decay) k_c, each cascade's read record
24
- * set_far_velocity(velocity) v_far(t)
28
+ * set_far_velocity(velocity) u(t), the far field's mean
29
+ * set_turbulence(sigma, offset, length) its turbulence
25
30
  *
26
31
  * and the scene's update ({@link update}) uploads the table once, if anything changed. Nothing here
27
32
  * allocates once the count is fixed: the setters write a retained copy of the table in place.
@@ -84,6 +89,18 @@ export class GPUSceneWind {
84
89
  * @returns {number}
85
90
  */
86
91
  get cascade_count(): number;
92
+ /**
93
+ * Whether the field is the far field's mean at every point, this frame and the frame before: no
94
+ * cascades and no turbulence in either. What `WIND_FIELD_UNIFORM` is set from.
95
+ * @returns {boolean}
96
+ */
97
+ get is_uniform(): boolean;
98
+ /**
99
+ * A view of the far field's turbulence tile, as the readers bind it, `fluid_turbulence`: replaced
100
+ * once, the first time the far field has turbulence, so a consumer takes it per frame ({@link bind}).
101
+ * @returns {GPUTextureView}
102
+ */
103
+ get turbulence(): GPUTextureView;
87
104
  /**
88
105
  * The atlas slot of a cascade's tile: the one this frame's readers take.
89
106
  *
@@ -138,11 +155,26 @@ export class GPUSceneWind {
138
155
  */
139
156
  set_cascade_decay(index: number, decay: number): void;
140
157
  /**
141
- * `v_far(t)`: the wind wherever no cascade holds, now.
158
+ * `u(t)`: the far field's mean now, which is the wind wherever no cascade holds when the far field has
159
+ * no turbulence.
142
160
  *
143
161
  * @param {ArrayLike<number>} velocity m/s, x, y, z
144
162
  */
145
163
  set_far_velocity(velocity: ArrayLike<number>): void;
164
+ /**
165
+ * The far field's turbulence now: `σ`, its rms on each axis, m/s, 0 for none; `offset`, how far the
166
+ * mean has carried it, m; `length`, its length scale `L`, m. The far field at a world point `p` is then
167
+ * `u + σ·T((p − offset) ⊙ S⁻¹)`, `S` the tile's size for `L`. The first `σ` that is not 0 uploads the
168
+ * engine's tile, once.
169
+ *
170
+ * The offset is folded into one tile here, in f64, so the table holds a coordinate in `[0, 1)` however
171
+ * far the air has carried the turbulence.
172
+ *
173
+ * @param {number} sigma
174
+ * @param {ArrayLike<number>} offset
175
+ * @param {number} length > 0 when `sigma` is not 0
176
+ */
177
+ set_turbulence(sigma: number, offset: ArrayLike<number>, length: number): void;
146
178
  /**
147
179
  * Upload the tables that changed since their last upload; once a frame, after the producer
148
180
  * and before any consumer encodes. The tiles' texel origins and the atlas's size are taken here,
@@ -151,7 +183,7 @@ export class GPUSceneWind {
151
183
  update(): void;
152
184
  /**
153
185
  * Put the field into a dispatch's bindings, under the names `wind_field_add_resources` declares:
154
- * `wind_field` and `wind_field_atlas`; `wind_field_sampler` is the declaration's default.
186
+ * `wind_field`, `wind_field_atlas` and `fluid_turbulence`; the samplers are the declaration's defaults.
155
187
  *
156
188
  * @param {Object} bindings
157
189
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GPUSceneWind.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/GPUSceneWind.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH;IA2FI;;;;;OAKG;IACH,wDAJW,UAAU,MAAM,CAAC,YACjB,MAAM,GACJ,cAAc,CAoB1B;IA9CD;;OAEG;IACH,+BAiBC;IA4BD;;;;OAIG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;;OAIG;IACH,kCAEC;IAED;;;OAGG;IACH,qCAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;;;OAKG;IACH,YAHW,MAAM,GACJ,MAAM,CAOlB;IAED;;;;;;;;;OASG;IACH,oBAHW,MAAM,GACJ,MAAM,CAkBlB;IAED;;;OAGG;IACH,sBAgBC;IAED;;;;;;;;;OASG;IACH,oBAHW,MAAM,cACN,UAAU,MAAM,CAAC,QAmE3B;IAED;;;;;;;;OAQG;IACH,0BAJW,MAAM,UACN,UAAU,MAAM,CAAC,aACjB,MAAM,QAmBhB;IAED;;;;;;;OAOG;IACH,yBAHW,MAAM,SACN,MAAM,QAYhB;IAED;;;;OAIG;IACH,2BAFW,UAAU,MAAM,CAAC,QAY3B;IAED;;;;OAIG;IACH,eAmBC;IAiED;;;;;OAKG;IACH,0BAGC;IAED;;;;;;OAMG;IACH,kCAIC;IAED;;OAEG;IACH,gBAUC;;CACJ;+BAnjB8B,oCAAoC"}
1
+ {"version":3,"file":"GPUSceneWind.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/GPUSceneWind.js"],"names":[],"mappings":"AAmCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH;IAsHI;;;;;OAKG;IACH,wDAJW,UAAU,MAAM,CAAC,YACjB,MAAM,GACJ,cAAc,CAoB1B;IAzDD;;OAEG;IACH,+BA4BC;IA4BD;;;;OAIG;IACH,4BAEC;IAED;;;OAGG;IACH,yBAEC;IAED;;;;OAIG;IACH,kCAEC;IAED;;;OAGG;IACH,qCAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;;OAIG;IACH,0BAKC;IAED;;;;OAIG;IACH,iCAEC;IAED;;;;;OAKG;IACH,YAHW,MAAM,GACJ,MAAM,CAOlB;IAED;;;;;;;;;OASG;IACH,oBAHW,MAAM,GACJ,MAAM,CAkBlB;IAED;;;OAGG;IACH,sBAgBC;IAED;;;;;;;;;OASG;IACH,oBAHW,MAAM,cACN,UAAU,MAAM,CAAC,QAmE3B;IAED;;;;;;;;OAQG;IACH,0BAJW,MAAM,UACN,UAAU,MAAM,CAAC,aACjB,MAAM,QAmBhB;IAED;;;;;;;OAOG;IACH,yBAHW,MAAM,SACN,MAAM,QAYhB;IAED;;;;;OAKG;IACH,2BAFW,UAAU,MAAM,CAAC,QAY3B;IAED;;;;;;;;;;;;OAYG;IACH,sBAJW,MAAM,UACN,UAAU,MAAM,CAAC,UACjB,MAAM,QA+BhB;IAwCD;;;;OAIG;IACH,eAmBC;IAiED;;;;;OAKG;IACH,0BAIC;IAED;;;;;;OAMG;IACH,kCAIC;IAED;;OAEG;IACH,gBAWC;;CACJ;+BAjsB8B,oCAAoC"}
@@ -1,4 +1,8 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { FLUID_TURBULENCE_TEXELS_PER_LENGTH, FLUID_TURBULENCE_TILE_RESOLUTION } from "../../../engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js";
3
+ import { fluid_turbulence_tile_level_size } from "../../../engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js";
4
+ import { fluid_turbulence_inverse_tile_size } from "../../../engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js";
5
+ import { fluid_turbulence_tile_data_rgba16 } from "../../../engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js";
2
6
  import { CLIPMAP_LEVEL_STRUCT } from "../shader/chunk/clipmap/CLIPMAP_LEVEL_STRUCT.js";
3
7
  import { GPUTileAtlas3D } from "../texture/atlas/GPUTileAtlas3D.js";
4
8
  import { WIND_FIELD_CASCADE_LIMIT, WIND_FIELD_TILE_BORDER, WIND_FIELD_TILE_FORMAT } from "./WIND_FIELD.js";
@@ -17,6 +21,10 @@ const CASCADE_DECAY = WIND_CASCADE_STRUCT.get('decay').offset >>> 2;
17
21
  const FAR_VELOCITY = WIND_FIELD_STRUCT.get('far_velocity').offset >>> 2;
18
22
  const CASCADE_COUNT = WIND_FIELD_STRUCT.get('cascade_count').offset >>> 2;
19
23
  const INVERSE_ATLAS_SIZE = WIND_FIELD_STRUCT.get('inverse_atlas_size').offset >>> 2;
24
+ const TURBULENCE_SIGMA = WIND_FIELD_STRUCT.get('turbulence_sigma').offset >>> 2;
25
+ const TURBULENCE_SCALE = WIND_FIELD_STRUCT.get('turbulence_scale').offset >>> 2;
26
+ const TURBULENCE_ORIGIN = WIND_FIELD_STRUCT.get('turbulence_origin').offset >>> 2;
27
+ const TURBULENCE_INVERSE_TEXEL = WIND_FIELD_STRUCT.get('turbulence_inverse_texel').offset >>> 2;
20
28
 
21
29
  /**
22
30
  * Content of the atlas before any cascade has a resolution: one texel and its skirt, so there is a
@@ -40,7 +48,11 @@ const PLACEHOLDER_CONTENT = [1, 1, 1];
40
48
  * {@link slot}, from the device; nothing here writes texels;
41
49
  * - {@link uniform}: the table a reader takes, {@link WIND_FIELD_STRUCT}: every cascade's window and
42
50
  * read record, finest first, and `v_far(t)`;
43
- * - {@link previous_uniform}: the table as the frame before read it, over the same atlas.
51
+ * - {@link previous_uniform}: the table as the frame before read it, over the same atlas;
52
+ * - {@link turbulence}: the far field's turbulence tile, `rgba16float`, which every reader of the field
53
+ * samples where the far field has turbulence. One texel of zeros until the far field first has any,
54
+ * then the engine's tile and its band-limited levels as mips (`fluid_turbulence_tile_levels`), uploaded
55
+ * once and kept.
44
56
  *
45
57
  * **The producer's frame**, before any consumer encodes (at `FrameStart`, ahead of the scene's own
46
58
  * update):
@@ -48,7 +60,8 @@ const PLACEHOLDER_CONTENT = [1, 1, 1];
48
60
  * set_cascades(count, resolution) the stack's shape; allocates tiles
49
61
  * set_cascade_window(c, corner, cell_size) where each cascade's window is
50
62
  * set_cascade_decay(c, decay) k_c, each cascade's read record
51
- * set_far_velocity(velocity) v_far(t)
63
+ * set_far_velocity(velocity) u(t), the far field's mean
64
+ * set_turbulence(sigma, offset, length) its turbulence
52
65
  *
53
66
  * and the scene's update ({@link update}) uploads the table once, if anything changed. Nothing here
54
67
  * allocates once the count is fixed: the setters write a retained copy of the table in place.
@@ -86,6 +99,21 @@ export class GPUSceneWind {
86
99
  /** @type {GPUBuffer} */
87
100
  #previous_uniform;
88
101
 
102
+ /**
103
+ * The turbulence tile: one texel until {@link set_turbulence} first has a σ, the engine's tile after.
104
+ * @type {GPUTexture}
105
+ */
106
+ #turbulence;
107
+
108
+ /** {@link #turbulence}'s view, as readers bind it. @type {GPUTextureView} */
109
+ #turbulence_view;
110
+
111
+ /** Whether {@link #turbulence} is the engine's tile yet. */
112
+ #turbulence_tiled = false;
113
+
114
+ /** Scratch for the tile's inverse size. */
115
+ #inverse_tile_size = new Float64Array(3);
116
+
89
117
  /**
90
118
  * The table as the shader reads it, written in place by the setters.
91
119
  * @type {ArrayBuffer}
@@ -101,6 +129,7 @@ export class GPUSceneWind {
101
129
  */
102
130
  #previous_bytes = new ArrayBuffer(WIND_FIELD_STRUCT.size);
103
131
  #previous_u32 = new Uint32Array(this.#previous_bytes);
132
+ #previous_f32 = new Float32Array(this.#previous_bytes);
104
133
 
105
134
  #count = 0;
106
135
 
@@ -162,6 +191,17 @@ export class GPUSceneWind {
162
191
  size: WIND_FIELD_STRUCT.size,
163
192
  usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
164
193
  });
194
+
195
+ // a new texture is 0: no turbulence, and never read while σ is 0
196
+ this.#turbulence = device.createTexture({
197
+ label: 'GPUSceneWind/turbulence placeholder',
198
+ size: [1, 1, 1],
199
+ dimension: '3d',
200
+ format: 'rgba16float',
201
+ usage: GPUTextureUsage.TEXTURE_BINDING,
202
+ });
203
+
204
+ this.#turbulence_view = this.#turbulence.createView();
165
205
  }
166
206
 
167
207
  /**
@@ -231,6 +271,27 @@ export class GPUSceneWind {
231
271
  return this.#count;
232
272
  }
233
273
 
274
+ /**
275
+ * Whether the field is the far field's mean at every point, this frame and the frame before: no
276
+ * cascades and no turbulence in either. What `WIND_FIELD_UNIFORM` is set from.
277
+ * @returns {boolean}
278
+ */
279
+ get is_uniform() {
280
+ return this.#count === 0
281
+ && this.#previous_u32[CASCADE_COUNT] === 0
282
+ && this.#f32[TURBULENCE_SIGMA] === 0
283
+ && this.#previous_f32[TURBULENCE_SIGMA] === 0;
284
+ }
285
+
286
+ /**
287
+ * A view of the far field's turbulence tile, as the readers bind it, `fluid_turbulence`: replaced
288
+ * once, the first time the far field has turbulence, so a consumer takes it per frame ({@link bind}).
289
+ * @returns {GPUTextureView}
290
+ */
291
+ get turbulence() {
292
+ return this.#turbulence_view;
293
+ }
294
+
234
295
  /**
235
296
  * The atlas slot of a cascade's tile: the one this frame's readers take.
236
297
  *
@@ -420,7 +481,8 @@ export class GPUSceneWind {
420
481
  }
421
482
 
422
483
  /**
423
- * `v_far(t)`: the wind wherever no cascade holds, now.
484
+ * `u(t)`: the far field's mean now, which is the wind wherever no cascade holds when the far field has
485
+ * no turbulence.
424
486
  *
425
487
  * @param {ArrayLike<number>} velocity m/s, x, y, z
426
488
  */
@@ -436,6 +498,88 @@ export class GPUSceneWind {
436
498
  this.#dirty = true;
437
499
  }
438
500
 
501
+ /**
502
+ * The far field's turbulence now: `σ`, its rms on each axis, m/s, 0 for none; `offset`, how far the
503
+ * mean has carried it, m; `length`, its length scale `L`, m. The far field at a world point `p` is then
504
+ * `u + σ·T((p − offset) ⊙ S⁻¹)`, `S` the tile's size for `L`. The first `σ` that is not 0 uploads the
505
+ * engine's tile, once.
506
+ *
507
+ * The offset is folded into one tile here, in f64, so the table holds a coordinate in `[0, 1)` however
508
+ * far the air has carried the turbulence.
509
+ *
510
+ * @param {number} sigma
511
+ * @param {ArrayLike<number>} offset
512
+ * @param {number} length > 0 when `sigma` is not 0
513
+ */
514
+ set_turbulence(sigma, offset, length) {
515
+ assert.isFinite(sigma, 'sigma');
516
+ assert.greaterThanOrEqual(sigma, 0, 'sigma');
517
+
518
+ const f32 = this.#f32;
519
+
520
+ f32[TURBULENCE_SIGMA] = sigma;
521
+
522
+ if (sigma !== 0) {
523
+ assert.isFinite(length, 'length');
524
+ assert.greaterThan(length, 0, 'length');
525
+
526
+ this.#ensure_turbulence_tile();
527
+
528
+ const inverse = fluid_turbulence_inverse_tile_size(this.#inverse_tile_size, length);
529
+
530
+ f32[TURBULENCE_INVERSE_TEXEL] = FLUID_TURBULENCE_TEXELS_PER_LENGTH / length;
531
+
532
+ for (let axis = 0; axis < 3; axis++) {
533
+ assert.isFinite(offset[axis], 'offset');
534
+
535
+ const origin = -offset[axis] * inverse[axis];
536
+
537
+ f32[TURBULENCE_SCALE + axis] = inverse[axis];
538
+ f32[TURBULENCE_ORIGIN + axis] = origin - Math.floor(origin);
539
+ }
540
+ }
541
+
542
+ this.#dirty = true;
543
+ }
544
+
545
+ /**
546
+ * Replace the placeholder with the engine's tile, once.
547
+ */
548
+ #ensure_turbulence_tile() {
549
+ if (this.#turbulence_tiled) {
550
+ return;
551
+ }
552
+
553
+ const levels = fluid_turbulence_tile_data_rgba16();
554
+
555
+ const texture = this.#device.createTexture({
556
+ label: 'GPUSceneWind/turbulence',
557
+ size: Array.from(FLUID_TURBULENCE_TILE_RESOLUTION),
558
+ dimension: '3d',
559
+ format: 'rgba16float',
560
+ mipLevelCount: levels.length,
561
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
562
+ });
563
+
564
+ const size = [0, 0, 0];
565
+
566
+ for (let level = 0; level < levels.length; level++) {
567
+ fluid_turbulence_tile_level_size(size, FLUID_TURBULENCE_TILE_RESOLUTION, level);
568
+
569
+ this.#device.queue.writeTexture(
570
+ { texture, mipLevel: level },
571
+ levels[level],
572
+ { bytesPerRow: 8 * size[0], rowsPerImage: size[1] },
573
+ size
574
+ );
575
+ }
576
+
577
+ this.#turbulence.destroy();
578
+ this.#turbulence = texture;
579
+ this.#turbulence_view = texture.createView();
580
+ this.#turbulence_tiled = true;
581
+ }
582
+
439
583
  /**
440
584
  * Upload the tables that changed since their last upload; once a frame, after the producer
441
585
  * and before any consumer encodes. The tiles' texel origins and the atlas's size are taken here,
@@ -527,13 +671,14 @@ export class GPUSceneWind {
527
671
 
528
672
  /**
529
673
  * Put the field into a dispatch's bindings, under the names `wind_field_add_resources` declares:
530
- * `wind_field` and `wind_field_atlas`; `wind_field_sampler` is the declaration's default.
674
+ * `wind_field`, `wind_field_atlas` and `fluid_turbulence`; the samplers are the declaration's defaults.
531
675
  *
532
676
  * @param {Object} bindings
533
677
  */
534
678
  bind(bindings) {
535
679
  bindings.wind_field = this.#uniform;
536
680
  bindings.wind_field_atlas = this.#atlas.texture;
681
+ bindings.fluid_turbulence = this.#turbulence_view;
537
682
  }
538
683
 
539
684
  /**
@@ -562,5 +707,6 @@ export class GPUSceneWind {
562
707
  this.#atlas.destroy();
563
708
  this.#uniform.destroy();
564
709
  this.#previous_uniform.destroy();
710
+ this.#turbulence.destroy();
565
711
  }
566
712
  }
@@ -18,7 +18,7 @@ export const WIND_LEVEL_ARRAY: WebGPUArray;
18
18
  export const WIND_CASCADE_ARRAY: WebGPUArray;
19
19
  /**
20
20
  * The published wind field as a shader reads it: the uniform `wind_field`
21
- * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §11). 800 bytes.
21
+ * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §11). 832 bytes.
22
22
  *
23
23
  * Cascade `c` (finest first, below `cascade_count`) is two rows at index `c`:
24
24
  * - `levels[c]`: its window as a clipmap level (`CLIPMAP_LEVEL_STRUCT`) — the world cell at
@@ -29,10 +29,16 @@ export const WIND_CASCADE_ARRAY: WebGPUArray;
29
29
  *
30
30
  * Rows at and past `cascade_count` are never read.
31
31
  *
32
- * - `far_velocity`: `v_far(t)`, m/s, the far field now: the wind everywhere no cascade holds, and
33
- * what every cascade's deviation decays toward.
32
+ * - `far_velocity`: `u(t)`, m/s, the far field's mean now.
34
33
  * - `inverse_atlas_size`: one over the atlas texture's texels along x, y and z, so a texel coordinate
35
34
  * times it is the normalised one a sample takes.
35
+ * - `turbulence_sigma`, `turbulence_scale`, `turbulence_origin`: the far field's turbulence now, so
36
+ * the far field at a world point `p` is `v_far(t, p) = far_velocity + σ·T(p ⊙ scale + origin)`
37
+ * (`chunk_fluid_turbulence`): `σ` in m/s, 0 for none; `scale` one over the tile's size in the
38
+ * world; `origin` the tile coordinate of the world's origin, the turbulence's offset folded into one
39
+ * tile; `inverse_texel` one over the tile's texel in the world, `8 / L`, from which a read inside a
40
+ * cascade takes the tile's level for the cascade's cell (`fluid_turbulence_lod`). `v_far(t, p)` is the wind everywhere no cascade holds, and what every cascade's deviation
41
+ * decays toward.
36
42
  *
37
43
  * @type {WebGPUStruct}
38
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"WIND_FIELD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/WIND_FIELD_STRUCT.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,kCAFU,YAAY,CAgBJ;AAElB;;;;GAIG;AACH,+BAFU,WAAW,CAE4E;AAEjG;;;GAGG;AACH,iCAFU,WAAW,CAE6E;AAElG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gCAFU,YAAY,CAQN;6BAhEa,gCAAgC;4BADjC,+BAA+B"}
1
+ {"version":3,"file":"WIND_FIELD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/WIND_FIELD_STRUCT.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,kCAFU,YAAY,CAgBJ;AAElB;;;;GAIG;AACH,+BAFU,WAAW,CAE4E;AAEjG;;;GAGG;AACH,iCAFU,WAAW,CAE6E;AAElG;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,gCAFU,YAAY,CAYN;6BA1Ea,gCAAgC;4BADjC,+BAA+B"}
@@ -41,7 +41,7 @@ export const WIND_CASCADE_ARRAY = WebGPUArray.from(WIND_CASCADE_STRUCT, WIND_FIE
41
41
 
42
42
  /**
43
43
  * The published wind field as a shader reads it: the uniform `wind_field`
44
- * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §11). 800 bytes.
44
+ * (GPU_FLUID_CASCADES_PROPOSAL_2026_10_16.md §11). 832 bytes.
45
45
  *
46
46
  * Cascade `c` (finest first, below `cascade_count`) is two rows at index `c`:
47
47
  * - `levels[c]`: its window as a clipmap level (`CLIPMAP_LEVEL_STRUCT`) — the world cell at
@@ -52,10 +52,16 @@ export const WIND_CASCADE_ARRAY = WebGPUArray.from(WIND_CASCADE_STRUCT, WIND_FIE
52
52
  *
53
53
  * Rows at and past `cascade_count` are never read.
54
54
  *
55
- * - `far_velocity`: `v_far(t)`, m/s, the far field now: the wind everywhere no cascade holds, and
56
- * what every cascade's deviation decays toward.
55
+ * - `far_velocity`: `u(t)`, m/s, the far field's mean now.
57
56
  * - `inverse_atlas_size`: one over the atlas texture's texels along x, y and z, so a texel coordinate
58
57
  * times it is the normalised one a sample takes.
58
+ * - `turbulence_sigma`, `turbulence_scale`, `turbulence_origin`: the far field's turbulence now, so
59
+ * the far field at a world point `p` is `v_far(t, p) = far_velocity + σ·T(p ⊙ scale + origin)`
60
+ * (`chunk_fluid_turbulence`): `σ` in m/s, 0 for none; `scale` one over the tile's size in the
61
+ * world; `origin` the tile coordinate of the world's origin, the turbulence's offset folded into one
62
+ * tile; `inverse_texel` one over the tile's texel in the world, `8 / L`, from which a read inside a
63
+ * cascade takes the tile's level for the cascade's cell (`fluid_turbulence_lod`). `v_far(t, p)` is the wind everywhere no cascade holds, and what every cascade's deviation
64
+ * decays toward.
59
65
  *
60
66
  * @type {WebGPUStruct}
61
67
  */
@@ -65,4 +71,8 @@ export const WIND_FIELD_STRUCT = WebGPUStruct.from({
65
71
  far_velocity: vec3f,
66
72
  cascade_count: u32,
67
73
  inverse_atlas_size: vec3f,
74
+ turbulence_sigma: f32,
75
+ turbulence_scale: vec3f,
76
+ turbulence_inverse_texel: f32,
77
+ turbulence_origin: vec3f,
68
78
  }, "WindField");
@@ -1,14 +1,14 @@
1
1
  /**
2
- * Whether the published wind field is uniform: it holds no cascades, so the wind is
3
- * `wind_field.far_velocity` at every point — `GPUSceneWind.cascade_count` is 0, which is every scene
4
- * no producer fills (one without a GPU fluid). Decided by `chunk_wind_field_sample`, whose uniform
2
+ * Whether the published wind field is uniform: it holds no cascades and its far field no turbulence,
3
+ * so the wind is `wind_field.far_velocity` at every point — `GPUSceneWind.is_uniform`, which is every
4
+ * scene no producer fills (one without a GPU fluid). Decided by `chunk_wind_field_sample`, whose uniform
5
5
  * alternative is the far field and nothing else, and by `chunk_participating_media_noise`, whose
6
6
  * uniform alternative is the scroll alone: with no departure from the far field anywhere, the flow
7
7
  * map has nothing to carry.
8
8
  *
9
- * A pass sets it from the field it binds, `scene.wind.cascade_count === 0`, the frame it binds it; a
10
- * pass that also reads the field's history (`chunk_wind_field_sample_previous`) sets it only when
11
- * `scene.wind.previous_cascade_count` is 0 too, since both reads are the one alternative.
9
+ * A pass sets it from the field it binds, `scene.wind.is_uniform`, the frame it binds it; that holds
10
+ * only when the field as the frame before read it was uniform too, so a pass that also reads the
11
+ * history (`chunk_wind_field_sample_previous`) takes the same rule.
12
12
  * `false`, the default, is the field read as it is, cascades or none, so a pass that never sets it
13
13
  * reads the wind exactly as it always did.
14
14
  *
@@ -1,16 +1,16 @@
1
1
  import { ShaderSwitch } from "../shader/compiler/ShaderSwitch.js";
2
2
 
3
3
  /**
4
- * Whether the published wind field is uniform: it holds no cascades, so the wind is
5
- * `wind_field.far_velocity` at every point — `GPUSceneWind.cascade_count` is 0, which is every scene
6
- * no producer fills (one without a GPU fluid). Decided by `chunk_wind_field_sample`, whose uniform
4
+ * Whether the published wind field is uniform: it holds no cascades and its far field no turbulence,
5
+ * so the wind is `wind_field.far_velocity` at every point — `GPUSceneWind.is_uniform`, which is every
6
+ * scene no producer fills (one without a GPU fluid). Decided by `chunk_wind_field_sample`, whose uniform
7
7
  * alternative is the far field and nothing else, and by `chunk_participating_media_noise`, whose
8
8
  * uniform alternative is the scroll alone: with no departure from the far field anywhere, the flow
9
9
  * map has nothing to carry.
10
10
  *
11
- * A pass sets it from the field it binds, `scene.wind.cascade_count === 0`, the frame it binds it; a
12
- * pass that also reads the field's history (`chunk_wind_field_sample_previous`) sets it only when
13
- * `scene.wind.previous_cascade_count` is 0 too, since both reads are the one alternative.
11
+ * A pass sets it from the field it binds, `scene.wind.is_uniform`, the frame it binds it; that holds
12
+ * only when the field as the frame before read it was uniform too, so a pass that also reads the
13
+ * history (`chunk_wind_field_sample_previous`) takes the same rule.
14
14
  * `false`, the default, is the field read as it is, cascades or none, so a pass that never sets it
15
15
  * reads the wind exactly as it always did.
16
16
  *
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Declare the turbulence tile's bindings in a resource group, under the names
3
+ * {@link chunk_fluid_turbulence} reads:
4
+ * - `fluid_turbulence`: the tile, `texture_3d<f32>`, filterable, `rgba16float`, the engine's tile
5
+ * (`fluid_turbulence_tile_data`) as `GPUSceneWind#turbulence` holds it;
6
+ * - `fluid_turbulence_sampler`: {@link FLUID_TURBULENCE_SAMPLER_DESCRIPTOR}, the declaration's default,
7
+ * so a host binds only the texture.
8
+ *
9
+ * @param {import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor} group
10
+ * @returns {import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor} group
11
+ */
12
+ export function fluid_turbulence_add_resources(group: import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor): import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor;
13
+ /**
14
+ * The sampler the far field's turbulence tile is read with: trilinear and repeating on every axis,
15
+ * the tile being one period of an infinite field, and linear between its levels.
16
+ *
17
+ * @type {SamplerDescriptor}
18
+ */
19
+ export const FLUID_TURBULENCE_SAMPLER_DESCRIPTOR: SamplerDescriptor;
20
+ /**
21
+ * `fluid_turbulence_at(q, lod)`: the far field's unit-rms turbulence at tile coordinate `q` (one tile
22
+ * is 1 on each axis, repeating), band-limited to level `lod`: one trilinear tap of `fluid_turbulence`
23
+ * between two of its levels. A caller scales it by `σ` and places `q` from a world point by the far
24
+ * field's offset and length scale.
25
+ *
26
+ * `fluid_turbulence_lod(cell, inverse_texel)`: the level a lattice of cell `cell` reads, the tile's
27
+ * texel being `1 / inverse_texel`: `log2(cell / texel)`, and 0 for a cell no larger than a texel. Level
28
+ * `ℓ` holds the wavelengths of two of its texels and longer (`fluid_turbulence_tile_generate_levels`), so
29
+ * a lattice reads what its cells can hold: nothing aliased into it, and a footprint of about a texel a
30
+ * cell, which is what a tap's cache wants.
31
+ *
32
+ * Bindings as {@link fluid_turbulence_add_resources} declares them.
33
+ *
34
+ * @type {CodeChunk}
35
+ */
36
+ export const chunk_fluid_turbulence: CodeChunk;
37
+ import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
38
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
39
+ //# sourceMappingURL=chunk_fluid_turbulence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk_fluid_turbulence.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/chunk_fluid_turbulence.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;GAUG;AACH,sDAHW,OAAO,qDAAqD,EAAE,6BAA6B,GACzF,OAAO,qDAAqD,EAAE,6BAA6B,CAMvG;AA9BD;;;;;GAKG;AACH,kDAFU,iBAAiB,CASvB;AAmBJ;;;;;;;;;;;;;;;GAeG;AACH,qCAFU,SAAS,CAajB;kCA9DgC,+CAA+C;0BACvD,iCAAiC"}
@@ -0,0 +1,63 @@
1
+ import { SamplerDescriptor } from "../../descriptor/texture/SamplerDescriptor.js";
2
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
3
+
4
+ /**
5
+ * The sampler the far field's turbulence tile is read with: trilinear and repeating on every axis,
6
+ * the tile being one period of an infinite field, and linear between its levels.
7
+ *
8
+ * @type {SamplerDescriptor}
9
+ */
10
+ export const FLUID_TURBULENCE_SAMPLER_DESCRIPTOR = Object.freeze(SamplerDescriptor.from({
11
+ magFilter: "linear",
12
+ minFilter: "linear",
13
+ mipmapFilter: "linear",
14
+ addressModeU: "repeat",
15
+ addressModeV: "repeat",
16
+ addressModeW: "repeat",
17
+ }));
18
+
19
+ /**
20
+ * Declare the turbulence tile's bindings in a resource group, under the names
21
+ * {@link chunk_fluid_turbulence} reads:
22
+ * - `fluid_turbulence`: the tile, `texture_3d<f32>`, filterable, `rgba16float`, the engine's tile
23
+ * (`fluid_turbulence_tile_data`) as `GPUSceneWind#turbulence` holds it;
24
+ * - `fluid_turbulence_sampler`: {@link FLUID_TURBULENCE_SAMPLER_DESCRIPTOR}, the declaration's default,
25
+ * so a host binds only the texture.
26
+ *
27
+ * @param {import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor} group
28
+ * @returns {import("../shader/resource/ShaderResourceGroupDescriptor.js").ShaderResourceGroupDescriptor} group
29
+ */
30
+ export function fluid_turbulence_add_resources(group) {
31
+ return group
32
+ .addTexture("fluid_turbulence", "float", "3d")
33
+ .addSampler("fluid_turbulence_sampler", "filtering", FLUID_TURBULENCE_SAMPLER_DESCRIPTOR);
34
+ }
35
+
36
+ /**
37
+ * `fluid_turbulence_at(q, lod)`: the far field's unit-rms turbulence at tile coordinate `q` (one tile
38
+ * is 1 on each axis, repeating), band-limited to level `lod`: one trilinear tap of `fluid_turbulence`
39
+ * between two of its levels. A caller scales it by `σ` and places `q` from a world point by the far
40
+ * field's offset and length scale.
41
+ *
42
+ * `fluid_turbulence_lod(cell, inverse_texel)`: the level a lattice of cell `cell` reads, the tile's
43
+ * texel being `1 / inverse_texel`: `log2(cell / texel)`, and 0 for a cell no larger than a texel. Level
44
+ * `ℓ` holds the wavelengths of two of its texels and longer (`fluid_turbulence_tile_generate_levels`), so
45
+ * a lattice reads what its cells can hold: nothing aliased into it, and a footprint of about a texel a
46
+ * cell, which is what a tap's cache wants.
47
+ *
48
+ * Bindings as {@link fluid_turbulence_add_resources} declares them.
49
+ *
50
+ * @type {CodeChunk}
51
+ */
52
+ export const chunk_fluid_turbulence = CodeChunk.from(
53
+ //language=WGSL
54
+ `
55
+ fn fluid_turbulence_at(q: vec3<f32>, lod: f32) -> vec3<f32> {
56
+ return textureSampleLevel(fluid_turbulence, fluid_turbulence_sampler, q, lod).xyz;
57
+ }
58
+
59
+ fn fluid_turbulence_lod(cell: f32, inverse_texel: f32) -> f32 {
60
+ return max(0.0, log2(cell * inverse_texel));
61
+ }
62
+ `
63
+ );
@@ -3,21 +3,24 @@
3
3
  * `chunk_wind_field_sample` links for a field as it is ({@link WIND_FIELD_UNIFORM} `false`), any
4
4
  * number of cascades, none included.
5
5
  *
6
- * Reads `wind_field` ({@link WIND_FIELD_STRUCT}), `wind_field_atlas` and `wind_field_sampler`, as
7
- * {@link wind_field_add_resources} declares them. `wind_field_sample_in(field, position_ws)` is the
6
+ * Reads `wind_field` ({@link WIND_FIELD_STRUCT}), `wind_field_atlas`, `wind_field_sampler` and the
7
+ * turbulence tile, as {@link wind_field_add_resources} declares them. `wind_field_sample_in(field, position_ws)` is the
8
8
  * same read through any table over that atlas, the previous frame's for one.
9
9
  *
10
10
  * **The read:**
11
11
  * - the cascades' windows are walked finest first, each by `clipmap_level_select`, and the first holding
12
12
  * the point answers, with how far into its edge band of {@link WIND_FIELD_BAND_WIDTH} cells the point is;
13
- * - a cascade's read is the atmosphere identity, `v_far(t) + tap · k_c`: one trilinear tap of its tile,
14
- * which holds `v − v_far(t_s,c)` at cell centres, times its decay;
13
+ * - the far field at the point, `v_far(t, p)`: its mean, plus its turbulence's one tap when it has any
14
+ * (`wind_field_far`), band-limited inside a cascade to the cascade's cell, as the cascade's own far
15
+ * field is, and whole beyond every cascade;
16
+ * - a cascade's read is the atmosphere identity, `v_far(t, p) + tap · k_c`: one trilinear tap of its
17
+ * tile, which holds `v − v_far(t_s,c)` at cell centres, times its decay;
15
18
  * - in the band, a second read blends in linearly, all of it on the window's face: the parent's
16
- * identity read, or `v_far(t)` for the coarsest; deeper than the band, one read;
17
- * - outside every cascade, `v_far(t)`.
19
+ * identity read, or `v_far(t, p)` for the coarsest; deeper than the band, one read;
20
+ * - outside every cascade, `v_far(t, p)`.
18
21
  *
19
22
  * The blend and the decay are taken now, at the sample, so a cascade that last stepped ticks ago reads
20
- * the far field's current gust and drag. Air at the far field publishes a deviation of 0 and reads
23
+ * the far field's current mean, turbulence and drag. Air at the far field publishes a deviation of 0 and reads
21
24
  * back `v_far(t)` exactly, on every cascade, in every band, at every instant: the blend is written as
22
25
  * `inner + (outer − inner)·w`, which leaves equal reads as they are.
23
26
  *
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_wind_field_sample_cascades.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/chunk_wind_field_sample_cascades.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,+CAFU,SAAS,CAgEjB;0BAxGwB,iCAAiC"}
1
+ {"version":3,"file":"chunk_wind_field_sample_cascades.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/wind/chunk_wind_field_sample_cascades.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,+CAFU,SAAS,CAmFjB;0BA/HwB,iCAAiC"}