@woosh/meep-engine 3.69.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 (398) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/bvh8/build/BVH8Converter.d.ts +16 -0
  5. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -1
  6. package/src/core/bvh8/build/BVH8Converter.js +64 -37
  7. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts +25 -0
  8. package/src/core/bvh8/build/bvh8_assign_slots_greedy.d.ts.map +1 -0
  9. package/src/core/bvh8/build/bvh8_assign_slots_greedy.js +68 -0
  10. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -1
  11. package/src/core/bvh8/build/bvh8_from_proxy.js +2 -33
  12. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts +22 -0
  13. package/src/core/bvh8/build/bvh8_node_fit_slots.d.ts.map +1 -0
  14. package/src/core/bvh8/build/bvh8_node_fit_slots.js +115 -0
  15. package/src/core/bvh8/bvh8_depth.d.ts +8 -0
  16. package/src/core/bvh8/bvh8_depth.d.ts.map +1 -0
  17. package/src/core/bvh8/bvh8_depth.js +39 -0
  18. package/src/core/math/complex/complex_fft_radix2.d.ts +19 -0
  19. package/src/core/math/complex/complex_fft_radix2.d.ts.map +1 -0
  20. package/src/core/math/complex/complex_fft_radix2.js +71 -0
  21. package/src/engine/graphics3/GPUFluidSystem.d.ts +17 -4
  22. package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
  23. package/src/engine/graphics3/GPUFluidSystem.js +113 -16
  24. package/src/engine/physics/cloth/playground/wind_main.js +7 -6
  25. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +2 -2
  26. package/src/engine/physics/cloth/wind/AbstractClothWind.js +2 -2
  27. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +3 -3
  28. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  29. package/src/engine/physics/cloth/wind/ClothFluidWind.js +7 -9
  30. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts +10 -10
  31. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.d.ts.map +1 -1
  32. package/src/engine/physics/cloth/wind/ClothGPUFluidWind.js +14 -22
  33. package/src/engine/physics/fluid/FluidAtmosphere.d.ts +16 -2
  34. package/src/engine/physics/fluid/FluidAtmosphere.d.ts.map +1 -1
  35. package/src/engine/physics/fluid/FluidAtmosphere.js +17 -3
  36. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts +1 -2
  37. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.d.ts.map +1 -1
  38. package/src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js +1 -2
  39. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts +8 -5
  40. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.d.ts.map +1 -1
  41. package/src/engine/physics/fluid/ecs/FluidEffectorsSystem.js +60 -17
  42. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +1 -1
  43. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +1 -1
  44. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +33 -47
  45. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  46. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +38 -176
  47. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts +8 -11
  48. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.d.ts.map +1 -1
  49. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationAdapter.js +13 -24
  50. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts +16 -0
  51. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.d.ts.map +1 -0
  52. package/src/engine/physics/fluid/effector/GlobalFluidEffectorSerializationUpgrader_0_1.js +35 -0
  53. package/src/engine/physics/fluid/fluid_apply_atmosphere.d.ts +1 -1
  54. package/src/engine/physics/fluid/fluid_apply_atmosphere.js +1 -1
  55. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts +28 -0
  56. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.d.ts.map +1 -0
  57. package/src/engine/physics/fluid/turbulence/FLUID_TURBULENCE_TILE.js +29 -0
  58. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts +16 -0
  59. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.d.ts.map +1 -0
  60. package/src/engine/physics/fluid/turbulence/fluid_atmosphere_velocity_at.js +49 -0
  61. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts +11 -0
  62. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.d.ts.map +1 -0
  63. package/src/engine/physics/fluid/turbulence/fluid_turbulence_inverse_tile_size.js +18 -0
  64. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts +25 -0
  65. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.d.ts.map +1 -0
  66. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_data.js +65 -0
  67. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts +56 -0
  68. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.d.ts.map +1 -0
  69. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_generate.js +313 -0
  70. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts +16 -0
  71. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.d.ts.map +1 -0
  72. package/src/engine/physics/fluid/turbulence/fluid_turbulence_tile_sample.js +69 -0
  73. package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +1 -1
  74. package/src/generation/foliage/mesh/branch_ring_triangulate.js +1 -1
  75. package/src/shade/playground/bvh_repro/README.md +8 -6
  76. package/src/shade/playground/bvh_repro/index.html +125 -124
  77. package/src/shade/playground/bvh_repro/main.js +259 -254
  78. package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -1
  79. package/src/shade/playground/foliage_wind/foliage_world.js +7 -4
  80. package/src/shade/playground/grass_surfaces/main.js +3 -2
  81. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts +23 -13
  82. package/src/shade/playground/particle_ecs/bonfire_wind.d.ts.map +1 -1
  83. package/src/shade/playground/particle_ecs/bonfire_wind.js +30 -33
  84. package/src/shade/playground/skinned_blas_refit/README.md +26 -14
  85. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts +14 -9
  86. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  87. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +126 -127
  88. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +95 -95
  89. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts +9 -1
  90. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  91. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +146 -135
  92. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +6 -6
  93. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
  94. package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +148 -134
  95. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts +11 -8
  96. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.d.ts.map +1 -1
  97. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +342 -202
  98. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +12 -13
  99. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  100. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +136 -116
  101. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +4 -4
  102. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
  103. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +255 -249
  104. package/src/shade/playground/water_surface/main.js +6 -3
  105. package/src/shade/renderer/animation/GPUAnimationManager.js +2 -2
  106. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  107. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +7 -8
  108. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts +111 -0
  109. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.d.ts.map +1 -0
  110. package/src/shade/renderer/fluid/FLUID_FAR_FIELD_STRUCT.js +162 -0
  111. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +37 -8
  112. package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
  113. package/src/shade/renderer/fluid/GPUFluidCascade.js +149 -47
  114. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +10 -3
  115. package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
  116. package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +69 -10
  117. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts +19 -0
  118. package/src/shade/renderer/fluid/chunk_fluid_far_field.d.ts.map +1 -0
  119. package/src/shade/renderer/fluid/chunk_fluid_far_field.js +43 -0
  120. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts +10 -9
  121. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.d.ts.map +1 -1
  122. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_PARENT_STRUCT.js +14 -12
  123. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts +3 -2
  124. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.d.ts.map +1 -1
  125. package/src/shade/renderer/fluid/coupling/FLUID_CASCADE_RESTRICT_STRUCT.js +7 -5
  126. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts +17 -9
  127. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.d.ts.map +1 -1
  128. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_epilogue.js +58 -18
  129. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts +23 -11
  130. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
  131. package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +371 -335
  132. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.d.ts.map +1 -1
  133. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_fill.js +2 -1
  134. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.d.ts.map +1 -1
  135. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_ghosts.js +109 -108
  136. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts +5 -3
  137. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.d.ts.map +1 -1
  138. package/src/shade/renderer/fluid/coupling/shader_fluid_cascade_restrict.js +24 -12
  139. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts +6 -2
  140. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.d.ts.map +1 -1
  141. package/src/shade/renderer/fluid/mac/FLUID_MAC_STEP_STRUCT.js +10 -5
  142. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +20 -21
  143. package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
  144. package/src/shade/renderer/fluid/mac/FluidMacPasses.js +453 -427
  145. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  146. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +2 -1
  147. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +13 -5
  148. package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
  149. package/src/shade/renderer/fluid/publish/FluidWindPublish.js +20 -10
  150. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.d.ts +2 -2
  151. package/src/shade/renderer/fluid/publish/chunk_fluid_wind_publish_cell.js +2 -2
  152. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts +5 -3
  153. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.d.ts.map +1 -1
  154. package/src/shade/renderer/fluid/publish/shader_fluid_wind_publish.js +147 -142
  155. package/src/shade/renderer/fluid/query/GPUFluidQueries.js +2 -2
  156. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  157. package/src/shade/renderer/geometry/GPUGeometryManager.js +5 -7
  158. package/src/shade/renderer/geometry/MeshletGeometry.d.ts +4 -1
  159. package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
  160. package/src/shade/renderer/geometry/MeshletGeometry.js +4 -1
  161. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +20 -0
  162. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +35 -3
  164. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts +9 -3
  165. package/src/shade/renderer/geometry/blas_from_meshlets.d.ts.map +1 -1
  166. package/src/shade/renderer/geometry/blas_from_meshlets.js +16 -30
  167. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts +14 -0
  168. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.d.ts.map +1 -0
  169. package/src/shade/renderer/geometry/bvh/BLAS8_REFIT_TARGET_STRUCT.js +33 -0
  170. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts +18 -21
  171. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.d.ts.map +1 -1
  172. package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +78 -158
  173. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +18 -39
  174. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  175. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +39 -398
  176. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +6 -7
  177. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  178. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +5 -7
  179. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts +36 -0
  180. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/bvh/bvh8_build_for_meshlets.js +179 -0
  182. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts +30 -0
  183. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/bvh/meshlet_batch_to_clustered_bvh.js +207 -0
  185. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts +52 -0
  186. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/bvh/shader_blas8_refit_batch.js +464 -0
  188. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts +12 -0
  189. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +37 -0
  191. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.d.ts.map +1 -1
  192. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_classify.js +4 -4
  193. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/sdf/bake/shader_mesh_sdf_evaluate.js +2 -2
  195. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.d.ts.map +1 -1
  196. package/src/shade/renderer/geometry/sdf/chunk_blas_query_band_sdf.js +2 -2
  197. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  198. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +4 -4
  199. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.d.ts.map +1 -1
  200. package/src/shade/renderer/geometry/sdf/surface/shader_mesh_surface_trace.js +2 -2
  201. package/src/shade/renderer/geometry/sr_create_group_RTX.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/sr_create_group_RTX.js +4 -4
  203. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
  204. package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -0
  205. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
  206. package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -0
  207. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
  208. package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +372 -376
  209. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +9 -10
  210. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -1
  211. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +10 -11
  212. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +2 -2
  213. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +2 -2
  214. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +12 -8
  215. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -1
  216. package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +109 -60
  217. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_sdf.js +2 -2
  218. package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_mesh_surfaces.js +2 -2
  219. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.d.ts +2 -2
  220. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUFFER_LAYOUT.js +70 -70
  221. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts +6 -7
  222. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.d.ts.map +1 -1
  223. package/src/shade/renderer/gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js +6 -7
  224. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +3 -3
  225. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +3 -3
  226. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +1 -1
  227. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
  228. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +3 -3
  229. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts +69 -0
  230. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.d.ts.map +1 -0
  231. package/src/shade/renderer/gpu_primitive/bvh8/BVH8_TREE_BUFFER_LAYOUT.js +89 -0
  232. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts +41 -0
  233. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.d.ts.map +1 -0
  234. package/src/shade/renderer/gpu_primitive/bvh8/bvh8_encode_from_bvh2.js +348 -0
  235. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts +34 -0
  236. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.d.ts.map +1 -0
  237. package/src/shade/renderer/gpu_primitive/bvh8/check_bvh8_tree.js +291 -0
  238. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts +31 -0
  239. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.d.ts.map +1 -0
  240. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_assign.js +175 -0
  241. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts +27 -0
  242. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.d.ts.map +1 -0
  243. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_depth.js +48 -0
  244. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts +26 -0
  245. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.d.ts.map +1 -0
  246. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_gather.js +118 -0
  247. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts +22 -0
  248. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.d.ts.map +1 -0
  249. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_node.js +143 -0
  250. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts +36 -0
  251. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.d.ts.map +1 -0
  252. package/src/shade/renderer/gpu_primitive/bvh8/chunk_bvh8_encode_sums.js +97 -0
  253. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts +49 -0
  254. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.d.ts.map +1 -0
  255. package/src/shade/renderer/gpu_primitive/bvh8/graph_bvh8_encode_from_bvh2.js +265 -0
  256. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts +37 -0
  257. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.d.ts.map +1 -0
  258. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_assign.js +109 -0
  259. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts +15 -0
  260. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.d.ts.map +1 -0
  261. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count.js +85 -0
  262. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts +26 -0
  263. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.d.ts.map +1 -0
  264. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_count_single_workgroup.js +200 -0
  265. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts +19 -0
  266. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.d.ts.map +1 -0
  267. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_parents.js +81 -0
  268. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts +14 -0
  269. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.d.ts.map +1 -0
  270. package/src/shade/renderer/gpu_primitive/bvh8/shader_bvh8_encode_write.js +101 -0
  271. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts +19 -0
  272. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.d.ts.map +1 -0
  273. package/src/shade/renderer/gpu_primitive/bvh8/verify_gpu_bvh8_encode.js +361 -0
  274. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -1
  275. package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +5 -6
  276. package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
  277. package/src/shade/renderer/lightmap/GPULightMap.js +1 -0
  278. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  279. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -0
  280. package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
  281. package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -0
  282. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +8 -4
  283. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  284. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +60 -33
  285. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts +6 -6
  286. package/src/shade/renderer/scene/verify_gpu_tlas_build.d.ts.map +1 -1
  287. package/src/shade/renderer/scene/verify_gpu_tlas_build.js +23 -53
  288. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts +3 -1
  289. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.d.ts.map +1 -1
  290. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_INODE_STRUCT.js +5 -3
  291. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts +28 -0
  292. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.d.ts.map +1 -0
  293. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/BVH8_MAX_DEPTH.js +29 -0
  294. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts +25 -0
  295. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.d.ts.map +1 -0
  296. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_grid.js +97 -0
  297. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts +8 -0
  298. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.d.ts.map +1 -1
  299. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_intersect.js +23 -14
  300. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts +36 -0
  301. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.d.ts.map +1 -0
  302. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_node_slot_distances.js +222 -0
  303. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts +20 -0
  304. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.d.ts.map +1 -0
  305. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_direction_rcp.js +30 -0
  306. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts +30 -0
  307. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.d.ts.map +1 -0
  308. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_tree_read.js +91 -0
  309. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts +23 -0
  310. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.d.ts.map +1 -0
  311. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_waiting_slots.js +40 -0
  312. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts +22 -0
  313. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.d.ts.map +1 -1
  314. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js +121 -70
  315. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts +13 -1
  316. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.d.ts.map +1 -1
  317. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_blas_occluded.js +117 -61
  318. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts +21 -0
  319. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.d.ts.map +1 -1
  320. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest.js +111 -72
  321. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +1 -2
  322. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -1
  323. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +83 -54
  324. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts +14 -0
  325. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.d.ts.map +1 -1
  326. package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_occluded.js +92 -60
  327. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts +22 -0
  328. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.d.ts.map +1 -1
  329. package/src/shade/renderer/shader/chunk/sdf/chunk_point_query_blas_nearest.js +153 -106
  330. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts +21 -0
  331. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.d.ts.map +1 -1
  332. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_point_query_nearest.js +115 -74
  333. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts +5 -2
  334. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.d.ts.map +1 -1
  335. package/src/shade/renderer/shader/chunk/sdf/chunk_scene_sdf_raymarch.js +89 -63
  336. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts +15 -0
  337. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.d.ts.map +1 -1
  338. package/src/shade/renderer/shader/chunk/sdf/chunk_sdf_query_distance.js +108 -63
  339. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts +14 -0
  340. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.d.ts.map +1 -1
  341. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast.js +94 -60
  342. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  343. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +4 -4
  344. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -2
  345. package/src/shade/renderer/water/query/shader_water_surface_query.d.ts.map +1 -1
  346. package/src/shade/renderer/water/query/shader_water_surface_query.js +227 -227
  347. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  348. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +7 -4
  349. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +2 -2
  350. package/src/shade/renderer/wind/GPUSceneWind.d.ts +36 -4
  351. package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
  352. package/src/shade/renderer/wind/GPUSceneWind.js +150 -4
  353. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts +9 -3
  354. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.d.ts.map +1 -1
  355. package/src/shade/renderer/wind/WIND_FIELD_STRUCT.js +13 -3
  356. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +6 -6
  357. package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +6 -6
  358. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts +39 -0
  359. package/src/shade/renderer/wind/chunk_fluid_turbulence.d.ts.map +1 -0
  360. package/src/shade/renderer/wind/chunk_fluid_turbulence.js +63 -0
  361. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +10 -7
  362. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
  363. package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +34 -11
  364. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +2 -2
  365. package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +2 -2
  366. package/src/shade/renderer/wind/wind_field_add_resources.d.ts +6 -4
  367. package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
  368. package/src/shade/renderer/wind/wind_field_add_resources.js +9 -6
  369. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts +0 -18
  370. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.d.ts.map +0 -1
  371. package/src/shade/renderer/geometry/bvh/BLAS_REFIT_TARGET_STRUCT.js +0 -50
  372. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts +0 -23
  373. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.d.ts.map +0 -1
  374. package/src/shade/renderer/geometry/bvh/bvh2_derive_topology.js +0 -87
  375. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts +0 -42
  376. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.d.ts.map +0 -1
  377. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch.js +0 -141
  378. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts +0 -21
  379. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.d.ts.map +0 -1
  380. package/src/shade/renderer/geometry/bvh/shader_blas_refit_batch_seed.js +0 -75
  381. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts +0 -17
  382. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.d.ts.map +0 -1
  383. package/src/shade/renderer/geometry/meshlet_batch_to_bvh.js +0 -247
  384. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts +0 -7
  385. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.d.ts.map +0 -1
  386. package/src/shade/renderer/shader/chunk/bvh/bvh8/webgpu/chunk_bvh8_ray_query_blas_occlusion.js +0 -226
  387. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts +0 -8
  388. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.d.ts.map +0 -1
  389. package/src/shade/renderer/shader/chunk/light/lpv/chunk_lpv_mask_visibility_via_rays.js +0 -45
  390. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts +0 -3
  391. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.d.ts.map +0 -1
  392. package/src/shade/renderer/shader/chunk/light/sample/chunk_ray_sample_light.js +0 -105
  393. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts +0 -6
  394. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.d.ts.map +0 -1
  395. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_distance.js +0 -86
  396. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts +0 -2
  397. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.d.ts.map +0 -1
  398. package/src/shade/renderer/shadow/sdf/chunk_ray_query_sdf_raycast_traversal_count.js +0 -136
@@ -9,8 +9,8 @@
9
9
  * ({@link fluid_apply_atmosphere}).
10
10
  *
11
11
  * - `TIME`: seconds the effectors system has integrated, at the end of its last tick.
12
- * - `VELOCITY_*`: the far field `v_far = u + g`: `u` relaxes toward the globals'
13
- * drag-weighted mean wind at `DRAG`, and `g` is the sum of their gusts, unfiltered.
12
+ * - `VELOCITY_*`: `u`, the far field's mean: it relaxes toward the globals' drag-weighted
13
+ * mean wind at `DRAG`. Where a reader takes the far field as one vector, this is it.
14
14
  * - `LAMBDA`: `Λ = ∫ D dt`, so air left to the far field over an interval keeps
15
15
  * `e^(−ΔΛ)` of its deviation from it, however `D` varied.
16
16
  * - `FORCED_*`: `P`, the velocity the summed body force has given air the atmosphere
@@ -20,6 +20,15 @@
20
20
  * `F` and `D` varied. Not part of the far field: a term inside CPU fields only.
21
21
  * - `FORCE_*`: `F`, the sum of the globals' body forces, this tick.
22
22
  * - `DRAG`: `D`, the sum of the globals' drags, this tick.
23
+ * - `TURBULENCE_OFFSET_*`: `o = ∫ u dt`, how far the mean has carried the turbulence since the
24
+ * first tick, WORLD units, integrated exactly tick by tick.
25
+ * - `TURBULENCE_SIGMA`: `σ`, the turbulence's rms on each axis, `intensity · |u|`, WORLD units per
26
+ * second; 0 is none.
27
+ * - `TURBULENCE_LENGTH`: `L`, its length scale, WORLD units.
28
+ *
29
+ * The far field at a point `x` is `u + σ·T((x − o) ⊙ S⁻¹)` ({@link fluid_atmosphere_velocity_at}),
30
+ * `T` the unit-rms turbulence tile and `S` its size in the world for `L`. Not part of CPU fields,
31
+ * which take `u` alone.
23
32
  *
24
33
  * @readonly
25
34
  * @enum {number}
@@ -37,13 +46,18 @@ export const FluidAtmosphere = {
37
46
  FORCE_Y: 9,
38
47
  FORCE_Z: 10,
39
48
  DRAG: 11,
49
+ TURBULENCE_OFFSET_X: 12,
50
+ TURBULENCE_OFFSET_Y: 13,
51
+ TURBULENCE_OFFSET_Z: 14,
52
+ TURBULENCE_SIGMA: 15,
53
+ TURBULENCE_LENGTH: 16,
40
54
  };
41
55
 
42
56
  /**
43
57
  * Words in an atmosphere record.
44
58
  * @type {number}
45
59
  */
46
- export const FLUID_ATMOSPHERE_WORDS = 12;
60
+ export const FLUID_ATMOSPHERE_WORDS = 17;
47
61
 
48
62
  /**
49
63
  * Layout of a field's own atmosphere record, {@link FluidField#atmosphere}: the instant
@@ -6,8 +6,7 @@
6
6
  * Every effector class in a saved component needs its adapter in the same registry: the engine's
7
7
  * are {@link GlobalFluidEffectorSerializationAdapter}, {@link ImpulseFluidEffectorSerializationAdapter},
8
8
  * {@link WakeFluidEffectorSerializationAdapter} and {@link VortexFluidEffectorSerializationAdapter}, and
9
- * an effector class of your own needs a `typeName` and an adapter of its own. A global's gust phases
10
- * go with it, so a save resumes the gust where it was.
9
+ * an effector class of your own needs a `typeName` and an adapter of its own.
11
10
  *
12
11
  * Like the other physics adapters this is not in `populateEngineSerializationRegistry`; the host
13
12
  * registers it with the effector adapters.
@@ -1 +1 @@
1
- {"version":3,"file":"FluidEffectorsComponentSerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;GAkBG;AACH;;IAEI,sCAAgC;IAGhC;;OAEG;IACH,eAFU,mCAAiC,IAAI,CAE1B;IAErB;;;OAGG;IACH,+EAEC;IAED;;;OAGG;IACH,uCAFW,uBAAuB,QAWjC;IAED;;;;;OAKG;IACH,yCAFW,uBAAuB,QAWjC;CACJ;gDAvE+C,gEAAgE;wCACxE,8BAA8B"}
1
+ {"version":3,"file":"FluidEffectorsComponentSerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidEffectorsComponentSerializationAdapter.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH;;IAEI,sCAAgC;IAGhC;;OAEG;IACH,eAFU,mCAAiC,IAAI,CAE1B;IAErB;;;OAGG;IACH,+EAEC;IAED;;;OAGG;IACH,uCAFW,uBAAuB,QAWjC;IAED;;;;;OAKG;IACH,yCAFW,uBAAuB,QAWjC;CACJ;gDAtE+C,gEAAgE;wCACxE,8BAA8B"}
@@ -9,8 +9,7 @@ import { FluidEffectorsComponent } from "./FluidEffectorsComponent.js";
9
9
  * Every effector class in a saved component needs its adapter in the same registry: the engine's
10
10
  * are {@link GlobalFluidEffectorSerializationAdapter}, {@link ImpulseFluidEffectorSerializationAdapter},
11
11
  * {@link WakeFluidEffectorSerializationAdapter} and {@link VortexFluidEffectorSerializationAdapter}, and
12
- * an effector class of your own needs a `typeName` and an adapter of its own. A global's gust phases
13
- * go with it, so a save resumes the gust where it was.
12
+ * an effector class of your own needs a `typeName` and an adapter of its own.
14
13
  *
15
14
  * Like the other physics adapters this is not in `populateEngineSerializationRegistry`; the host
16
15
  * registers it with the effector adapters.
@@ -11,22 +11,25 @@
11
11
  *
12
12
  * 3. the fold of every {@link GlobalFluidEffector} into one far field, integrated in f64.
13
13
  *
14
- * Effectors carry state across ticks — a wake's trail advances in its sync, a global's gust in
15
- * its advance — so this has to happen exactly once a tick however many fluid systems apply the
16
- * effectors. It used to be a line in each fluid system, and a scene with two of them advanced
14
+ * Effectors carry state across ticks — a wake's trail advances in its sync — so this has to happen
15
+ * exactly once a tick however many fluid systems apply the effectors. It used to be a line in each fluid system, and a scene with two of them advanced
17
16
  * every wake twice.
18
17
  *
19
18
  * ## The far field
20
19
  *
21
20
  * The globals fold into `D = Σ d` (their drags), `W = Σ (d/D)·w` (the drag-weighted mean of their
22
- * winds), `g = Σ gust` and `F = Σ force`. The far field is `v_far = u + g`:
21
+ * winds), `I = Σ (d/D)·i` and `L = Σ (d/D)·l` (of their turbulence intensities and length scales)
22
+ * and `F = Σ force`. The far field is `u`, its mean, plus turbulence of rms `σ = I·|u|`:
23
23
  *
24
24
  * - `u` relaxes toward `W` exactly, `u ← W + (u − W)·e^(−D·dt)`. Only this system's first fold
25
25
  * seeds it at `W`, so a scene that starts with its globals starts in steady state; a global
26
26
  * that arrives later relaxes the air from where it is, at its drag. With `D = 0` — the last
27
27
  * global gone included — nothing relaxes it and it holds. A scene that never had a global is
28
28
  * still air; calm is authored as a global with wind 0 and a drag.
29
- * - `g` is added, not drag-filtered: the air carries the authored gust.
29
+ * - `I` and `L` are this tick's, and with `D = 0` hold where they were, like `u`.
30
+ * - the turbulence is carried by `u`: its offset `o = ∫ u dt` is integrated exactly over each tick
31
+ * along `u`'s relaxation, `W·dt + (u₀ − W)·(1 − e^(−D·dt))/D`, or `u·dt` with no drag. `o` is this
32
+ * system's own and starts at 0, so a scene loaded from a save starts the eddies over.
30
33
  * - `Λ += D·dt`, so a field brought from one instant to another keeps `e^(−ΔΛ)` of its deviation
31
34
  * from the far field however `D` varied in between.
32
35
  * - `F` is not part of the far field: a world-wide body force would be an unbounded downdraft at
@@ -1 +1 @@
1
- {"version":3,"file":"FluidEffectorsSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidEffectorsSystem.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH;;IAEI,mIAME;IA6DF;;;;;;;;OAQG;IACH,qBAHW,YAAY,GAAC,MAAM,EAAE,UACrB,MAAM,QAQhB;;CAsKJ;uBAhTsB,wBAAwB;wCAIP,8BAA8B;4CAL1B,uDAAuD;4BAEvE,uCAAuC"}
1
+ {"version":3,"file":"FluidEffectorsSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidEffectorsSystem.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH;;IAEI,mIAME;IAyEF;;;;;;;;OAQG;IACH,qBAHW,YAAY,GAAC,MAAM,EAAE,UACrB,MAAM,QAQhB;;CAkMJ;uBA3VsB,wBAAwB;wCAIP,8BAA8B;4CAL1B,uDAAuD;4BAEvE,uCAAuC"}
@@ -20,22 +20,25 @@ import { fluid_sync_effectors_from_transform } from "./fluid_sync_effectors_from
20
20
  *
21
21
  * 3. the fold of every {@link GlobalFluidEffector} into one far field, integrated in f64.
22
22
  *
23
- * Effectors carry state across ticks — a wake's trail advances in its sync, a global's gust in
24
- * its advance — so this has to happen exactly once a tick however many fluid systems apply the
25
- * effectors. It used to be a line in each fluid system, and a scene with two of them advanced
23
+ * Effectors carry state across ticks — a wake's trail advances in its sync — so this has to happen
24
+ * exactly once a tick however many fluid systems apply the effectors. It used to be a line in each fluid system, and a scene with two of them advanced
26
25
  * every wake twice.
27
26
  *
28
27
  * ## The far field
29
28
  *
30
29
  * The globals fold into `D = Σ d` (their drags), `W = Σ (d/D)·w` (the drag-weighted mean of their
31
- * winds), `g = Σ gust` and `F = Σ force`. The far field is `v_far = u + g`:
30
+ * winds), `I = Σ (d/D)·i` and `L = Σ (d/D)·l` (of their turbulence intensities and length scales)
31
+ * and `F = Σ force`. The far field is `u`, its mean, plus turbulence of rms `σ = I·|u|`:
32
32
  *
33
33
  * - `u` relaxes toward `W` exactly, `u ← W + (u − W)·e^(−D·dt)`. Only this system's first fold
34
34
  * seeds it at `W`, so a scene that starts with its globals starts in steady state; a global
35
35
  * that arrives later relaxes the air from where it is, at its drag. With `D = 0` — the last
36
36
  * global gone included — nothing relaxes it and it holds. A scene that never had a global is
37
37
  * still air; calm is authored as a global with wind 0 and a drag.
38
- * - `g` is added, not drag-filtered: the air carries the authored gust.
38
+ * - `I` and `L` are this tick's, and with `D = 0` hold where they were, like `u`.
39
+ * - the turbulence is carried by `u`: its offset `o = ∫ u dt` is integrated exactly over each tick
40
+ * along `u`'s relaxation, `W·dt + (u₀ − W)·(1 − e^(−D·dt))/D`, or `u·dt` with no drag. `o` is this
41
+ * system's own and starts at 0, so a scene loaded from a save starts the eddies over.
39
42
  * - `Λ += D·dt`, so a field brought from one instant to another keeps `e^(−ΔΛ)` of its deviation
40
43
  * from the far field however `D` varied in between.
41
44
  * - `F` is not part of the far field: a world-wide body force would be an unbounded downdraft at
@@ -91,10 +94,22 @@ export class FluidEffectorsSystem extends System {
91
94
  #global_count = 0;
92
95
 
93
96
  /**
94
- * Scratch for one global's gust.
97
+ * `o`, how far `u` has carried the turbulence, WORLD units.
95
98
  * @type {Float64Array}
96
99
  */
97
- #gust = new Float64Array(3);
100
+ #turbulence_offset = new Float64Array(3);
101
+
102
+ /**
103
+ * `I`, the folded turbulence intensity, held with `D = 0`.
104
+ * @type {number}
105
+ */
106
+ #turbulence_intensity = 0;
107
+
108
+ /**
109
+ * `L`, the folded length scale, held with `D = 0`; 0 before any global with drag.
110
+ * @type {number}
111
+ */
112
+ #turbulence_length = 0;
98
113
 
99
114
  /**
100
115
  * `u`, the far field's steady part, WORLD units per second.
@@ -207,10 +222,8 @@ export class FluidEffectorsSystem extends System {
207
222
  #fold(dt) {
208
223
  const globals = this.#globals;
209
224
  const count = this.#global_count;
210
- const gust = this.#gust;
211
225
 
212
226
  let D = 0;
213
- let gx = 0, gy = 0, gz = 0;
214
227
  let fx = 0, fy = 0, fz = 0;
215
228
 
216
229
  for (let i = 0; i < count; i++) {
@@ -224,19 +237,16 @@ export class FluidEffectorsSystem extends System {
224
237
  fx += force[0];
225
238
  fy += force[1];
226
239
  fz += force[2];
227
-
228
- effector.compute_gust(gust);
229
- gx += gust[0];
230
- gy += gust[1];
231
- gz += gust[2];
232
240
  }
233
241
 
234
242
  const steady = this.#steady;
243
+ const offset = this.#turbulence_offset;
235
244
 
236
245
  // With no drag (no global at all included) nothing relaxes the air: `u` holds.
237
246
  if (D > 0) {
238
247
  // Weights d/D, so one global's mean wind is its own wind exactly.
239
248
  let wx = 0, wy = 0, wz = 0;
249
+ let intensity = 0, length = 0;
240
250
 
241
251
  for (let i = 0; i < count; i++) {
242
252
  const effector = globals[i];
@@ -251,11 +261,24 @@ export class FluidEffectorsSystem extends System {
251
261
  wx += weight * wind[0];
252
262
  wy += weight * wind[1];
253
263
  wz += weight * wind[2];
264
+
265
+ intensity += weight * effector.turbulence_intensity;
266
+ length += weight * effector.turbulence_length;
254
267
  }
255
268
 
269
+ this.#turbulence_intensity = intensity;
270
+ this.#turbulence_length = length;
271
+
256
272
  if (this.#first_fold_done) {
257
273
  const keep = Math.exp(-D * dt);
258
274
 
275
+ // ∫ u dt over the tick, along the relaxation, before u moves
276
+ const carried = (1 - keep) / D;
277
+
278
+ offset[0] += wx * dt + (steady[0] - wx) * carried;
279
+ offset[1] += wy * dt + (steady[1] - wy) * carried;
280
+ offset[2] += wz * dt + (steady[2] - wz) * carried;
281
+
259
282
  steady[0] = wx + (steady[0] - wx) * keep;
260
283
  steady[1] = wy + (steady[1] - wy) * keep;
261
284
  steady[2] = wz + (steady[2] - wz) * keep;
@@ -264,7 +287,16 @@ export class FluidEffectorsSystem extends System {
264
287
  steady[0] = wx;
265
288
  steady[1] = wy;
266
289
  steady[2] = wz;
290
+
291
+ offset[0] += wx * dt;
292
+ offset[1] += wy * dt;
293
+ offset[2] += wz * dt;
267
294
  }
295
+ } else {
296
+ // nothing relaxes u: it carries the turbulence as it stands
297
+ offset[0] += steady[0] * dt;
298
+ offset[1] += steady[1] * dt;
299
+ offset[2] += steady[2] * dt;
268
300
  }
269
301
 
270
302
  this.#first_fold_done = true;
@@ -292,9 +324,9 @@ export class FluidEffectorsSystem extends System {
292
324
  const atmosphere = this.#atmosphere;
293
325
 
294
326
  atmosphere[FluidAtmosphere.TIME] += dt;
295
- atmosphere[FluidAtmosphere.VELOCITY_X] = steady[0] + gx;
296
- atmosphere[FluidAtmosphere.VELOCITY_Y] = steady[1] + gy;
297
- atmosphere[FluidAtmosphere.VELOCITY_Z] = steady[2] + gz;
327
+ atmosphere[FluidAtmosphere.VELOCITY_X] = steady[0];
328
+ atmosphere[FluidAtmosphere.VELOCITY_Y] = steady[1];
329
+ atmosphere[FluidAtmosphere.VELOCITY_Z] = steady[2];
298
330
  atmosphere[FluidAtmosphere.LAMBDA] += D * dt;
299
331
  atmosphere[FluidAtmosphere.FORCED_X] = forced[0];
300
332
  atmosphere[FluidAtmosphere.FORCED_Y] = forced[1];
@@ -303,5 +335,16 @@ export class FluidEffectorsSystem extends System {
303
335
  atmosphere[FluidAtmosphere.FORCE_Y] = fy;
304
336
  atmosphere[FluidAtmosphere.FORCE_Z] = fz;
305
337
  atmosphere[FluidAtmosphere.DRAG] = D;
338
+
339
+ // no length scale, no tile to lay out: no turbulence
340
+ const length = this.#turbulence_length;
341
+ const speed = Math.sqrt(steady[0] * steady[0] + steady[1] * steady[1] + steady[2] * steady[2]);
342
+ const sigma = length > 0 && this.#turbulence_intensity > 0 ? this.#turbulence_intensity * speed : 0;
343
+
344
+ atmosphere[FluidAtmosphere.TURBULENCE_OFFSET_X] = offset[0];
345
+ atmosphere[FluidAtmosphere.TURBULENCE_OFFSET_Y] = offset[1];
346
+ atmosphere[FluidAtmosphere.TURBULENCE_OFFSET_Z] = offset[2];
347
+ atmosphere[FluidAtmosphere.TURBULENCE_SIGMA] = sigma;
348
+ atmosphere[FluidAtmosphere.TURBULENCE_LENGTH] = length;
306
349
  }
307
350
  }
@@ -53,7 +53,7 @@ export class AbstractFluidEffector {
53
53
  * The per-tick hook: called by {@link FluidEffectorsSystem} exactly once per fixed
54
54
  * step for every effector, with or without a `Transform64` on its entity, after
55
55
  * {@link syncFromTransform} and before any fluid system applies it. Default: no-op.
56
- * Effectors whose state evolves with time on their own (a gust's phases) override
56
+ * Effectors whose state evolves with time on their own override
57
57
  * this to advance it; `apply` then reads that state, and every field stepped this
58
58
  * tick sees the same.
59
59
  *
@@ -60,7 +60,7 @@ export class AbstractFluidEffector {
60
60
  * The per-tick hook: called by {@link FluidEffectorsSystem} exactly once per fixed
61
61
  * step for every effector, with or without a `Transform64` on its entity, after
62
62
  * {@link syncFromTransform} and before any fluid system applies it. Default: no-op.
63
- * Effectors whose state evolves with time on their own (a gust's phases) override
63
+ * Effectors whose state evolves with time on their own override
64
64
  * this to advance it; `apply` then reads that state, and every field stepped this
65
65
  * tick sees the same.
66
66
  *
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * dv/dt = force + drag · (wind − v)
6
6
  *
7
- * plus a gust carried on top of the wind.
7
+ * with turbulence carried on top of the wind.
8
8
  *
9
9
  * One effector covers the whole family of "push everything" behaviours —
10
10
  * pick the regime by which fields you set:
@@ -28,9 +28,9 @@
28
28
  * is the solver-level stability knob that exists even when no effectors
29
29
  * are wired.)
30
30
  *
31
- * - **`gust`** — weather on top of the wind: three sinusoids per axis, bounded
32
- * by `gust` per axis, which the air carries rather than relaxes toward. See
33
- * {@link gust}.
31
+ * - **`turbulence_intensity`** — weather on top of the wind: a field of eddies, the
32
+ * wind's speed times the intensity in rms, carried along by the wind. See
33
+ * {@link turbulence_intensity}.
34
34
  *
35
35
  * `wind` only enters through the drag term — with `drag = 0` it is inert by
36
36
  * construction (the model degenerates to dv/dt = force).
@@ -38,20 +38,21 @@
38
38
  * ## The far field
39
39
  *
40
40
  * In a scene, globals act through {@link FluidEffectorsSystem}: once a tick it folds
41
- * every global into one far field — `D = Σ drag`, the drag-weighted mean of the
42
- * winds, the sum of the gusts and the sum of the forces — and integrates
43
- * `v_far = u + g`, where `u` relaxes toward the mean wind at `D` and `g` is the summed
44
- * gust, unfiltered. {@link FluidSystem} and {@link WorkerFluidSystem} then bring every
45
- * field to that far field once a step through the atmosphere identity
46
- * (`fluid_apply_atmosphere`), so several globals act as one, whatever order they are
47
- * in. A global has no `apply` of its own: it acts only through the far field, and
41
+ * every global into one far field — `D = Σ drag`, the drag-weighted means of the
42
+ * winds, of the turbulence intensities and of the length scales, and the sum of the
43
+ * forces — and integrates `u`, the far field's mean, toward the mean wind at `D`. The
44
+ * far field is `u` plus its turbulence, `σ = intensity · |u|` in rms, carried by `u`.
45
+ * {@link FluidSystem} and {@link WorkerFluidSystem} then bring every field to the mean
46
+ * once a step through the atmosphere identity (`fluid_apply_atmosphere`); the GPU fluid
47
+ * brings every cascade to the whole far field, turbulence and all. Several globals act
48
+ * as one, whatever order they are in. A global has no `apply` of its own: it acts only through the far field, and
48
49
  * `FluidSimulator#step` refuses one handed to it in its effector list.
49
50
  *
50
51
  * `force` is not part of the far field: it is a term inside CPU fields, applied exactly
51
52
  * in the same step.
52
53
  *
53
- * All quantities are WORLD-space: `force` in units/s², `wind` and `gust` in units/s,
54
- * `drag` in 1/s. The `world_to_grid` matrix's linear part converts the vectors per
54
+ * All quantities are WORLD-space: `force` in units/s², `wind` in units/s, `drag` in
55
+ * 1/s, `turbulence_length` in units. The `world_to_grid` matrix's linear part converts the vectors per
55
56
  * field, so one instance produces the same world-space atmosphere on fields of any
56
57
  * `cell_size` — gravity stays gravity.
57
58
  *
@@ -84,49 +85,34 @@ export class GlobalFluidEffector extends AbstractFluidEffector {
84
85
  */
85
86
  drag: number;
86
87
  /**
87
- * Peak gust speed on top of the wind, WORLD units per second: a bound, `|g| ≤ gust`
88
- * on every axis, since the component amplitudes 4/7, 2/7 and 1/7 sum to one. Cloth reads it
89
- * through the far field (`ClothGPUFluidWind`, `ClothFluidWind`); the gust cloth once kept
90
- * itself had this meaning, unchanged.
88
+ * Turbulence intensity, `σ_u / |U|`: the rms of the far field's eddies on each axis, as a share
89
+ * of the far field's mean speed `|U|`. 0, the default, is no turbulence. Over grass and crops
90
+ * the near-ground wind measures 0.15 to 0.2; MIL-F-8785C's low-altitude model gives 0.19 at
91
+ * 20 ft.
91
92
  *
92
- * Per axis the gust is three sinusoids at 1, 2.41 and 5.83 times the base
93
- * frequency `1 / gust_period`, the axes a third of a turn apart, so it turns as
94
- * well as pulses:
95
- *
96
- * g_axis = gust · Σ_k a_k · sin(2π·phase_k + (k+1)·φ_axis)
97
- *
98
- * The air carries the gust; it does not relax toward it, so `drag` does not filter
99
- * it. `0` (default) is no gust.
93
+ * The eddies are isotropic von Kármán turbulence, frozen and carried by the mean wind
94
+ * (Taylor's hypothesis), from one repeating tile (`FLUID_TURBULENCE_TILE_RESOLUTION`). The
95
+ * fluid then shapes them: the ground's shear stretches them into streaks, a canopy's drag
96
+ * rolls them up. Read through `GPUFluidSystem#far_field_at`; `far_field` is the mean.
100
97
  *
101
98
  * @type {number}
102
99
  */
103
- gust: number;
100
+ turbulence_intensity: number;
104
101
  /**
105
- * Period of the gust's slowest component, seconds. Four is a breeze that
106
- * arrives and leaves a few times a minute; a fraction of a second is a flutter.
107
- * A value that is not positive reads as 1.
102
+ * The turbulence's length scale `L`, WORLD units, > 0: the von Kármán spectrum's, whose most
103
+ * energetic wavelength is about `4.05·L` and whose longitudinal integral scale is `0.747·L`.
104
+ * The tile repeats every `16·L` across and `4·L` up, and holds wavelengths down to `L/4`.
108
105
  *
109
- * The phases are integrated in {@link advance}, not computed from a clock, so
110
- * editing the period changes how fast the gust moves from now on and never makes
111
- * it jump.
106
+ * The default, 58.6 m, is MIL-F-8785C's low-altitude integral scale at 20 ft (43.8 m),
107
+ * divided by 0.747. Smaller scales reach down to a canopy's own eddies at the cost of a
108
+ * shorter repeat.
112
109
  *
113
- * @type {number}
114
- */
115
- gust_period: number;
116
- /**
117
- * The gust's three phases, in turns, each in `[0, 1)`: state, advanced once a tick
118
- * by {@link advance}. Written by hand only to restore a saved gust.
110
+ * Changing it rescales the eddies about the world's origin, so the air there jumps; it is a
111
+ * property of a scene's weather, set once.
119
112
  *
120
- * @type {Float64Array}
121
- */
122
- gust_phase: Float64Array;
123
- /**
124
- * The gust at the current phases, WORLD units per second.
125
- *
126
- * @param {Float64Array|number[]} out written at 0..2
127
- * @returns {Float64Array|number[]} `out`
113
+ * @type {number}
128
114
  */
129
- compute_gust(out: Float64Array | number[]): Float64Array | number[];
115
+ turbulence_length: number;
130
116
  }
131
117
  export namespace GlobalFluidEffector {
132
118
  let typeName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/GlobalFluidEffector.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH;IAEI;;;;;OAKG;IACH,OAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEhB;IAElB;;;;;OAKG;IACH,MAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEjB;IAEjB;;;;;;;OAOG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;;;;;;;;;;;OAgBG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;;;;;OAUG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;;OAKG;IACH,YAFU,YAAY,CAEW;IAsBjC;;;;;OAKG;IACH,kBAHW,YAAY,GAAC,MAAM,EAAE,GACnB,YAAY,GAAC,MAAM,EAAE,CAoCjC;CAqEJ;;kBAIS,MAAM;;sCAxQsB,4BAA4B"}
1
+ {"version":3,"file":"GlobalFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/GlobalFluidEffector.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH;IAEI;;;;;OAKG;IACH,OAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEhB;IAElB;;;;;OAKG;IACH,MAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEjB;IAEjB;;;;;;;OAOG;IACH,MAFU,MAAM,CAEP;IAET;;;;;;;;;;;;OAYG;IACH,sBAFU,MAAM,CAES;IAEzB;;;;;;;;;;;;;OAaG;IACH,mBAFU,MAAM,CAES;CAyD5B;;kBAIS,MAAM;;sCAtLsB,4BAA4B"}