@woosh/meep-engine 2.156.0 → 2.157.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 (654) hide show
  1. package/README.md +1 -3
  2. package/editor/view/ecs/components/common/AutoCanvasView.js +100 -53
  3. package/editor/view/ecs/components/common/TextController.js +59 -0
  4. package/editor/view/node-graph/NodeGraphCamera.js +90 -0
  5. package/editor/view/node-graph/NodeGraphEditorView.js +121 -22
  6. package/editor/view/node-graph/NodeGraphSelection.js +89 -0
  7. package/editor/view/node-graph/NodeGraphView.js +669 -453
  8. package/editor/view/node-graph/NodeView.js +211 -135
  9. package/editor/view/node-graph/actions/ConnectionCreateAction.js +53 -0
  10. package/editor/view/node-graph/actions/ConnectionDeleteAction.js +36 -0
  11. package/editor/view/node-graph/actions/NodeDeleteAction.js +88 -0
  12. package/editor/view/node-graph/actions/NodeParameterSetAction.js +52 -0
  13. package/editor/view/node-graph/actions/NodesMoveAction.js +41 -0
  14. package/editor/view/node-graph/actions/SelectionSetAction.js +60 -0
  15. package/editor/view/node-graph/connection_wire_geometry.js +107 -0
  16. package/package.json +1 -1
  17. package/samples/generation/SampleGenerator0.js +8 -1
  18. package/src/core/binary/reinterpret_float32_as_uint32.d.ts +7 -0
  19. package/src/core/binary/reinterpret_float32_as_uint32.d.ts.map +1 -0
  20. package/src/core/binary/reinterpret_float32_as_uint32.js +13 -0
  21. package/src/core/binary/reinterpret_uint32_as_float32.d.ts +7 -0
  22. package/src/core/binary/reinterpret_uint32_as_float32.d.ts.map +1 -0
  23. package/src/core/binary/reinterpret_uint32_as_float32.js +14 -0
  24. package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.d.ts.map +1 -1
  25. package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.js +1 -3
  26. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts +12 -0
  27. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts.map +1 -0
  28. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.js +92 -0
  29. package/src/core/bvh8/BVH8.d.ts +127 -0
  30. package/src/core/bvh8/BVH8.d.ts.map +1 -0
  31. package/src/core/bvh8/BVH8.js +436 -0
  32. package/src/core/bvh8/NOTES.md +63 -0
  33. package/src/core/bvh8/build/BVH8Converter.d.ts +59 -0
  34. package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -0
  35. package/src/core/bvh8/build/BVH8Converter.js +588 -0
  36. package/src/core/bvh8/build/NodeProxy.d.ts +66 -0
  37. package/src/core/bvh8/build/NodeProxy.d.ts.map +1 -0
  38. package/src/core/bvh8/build/NodeProxy.js +308 -0
  39. package/src/core/bvh8/build/TriangleCluster.d.ts +29 -0
  40. package/src/core/bvh8/build/TriangleCluster.d.ts.map +1 -0
  41. package/src/core/bvh8/build/TriangleCluster.js +123 -0
  42. package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts +8 -0
  43. package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts.map +1 -0
  44. package/src/core/bvh8/build/aabb3_compute_merge_cost.js +29 -0
  45. package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts +10 -0
  46. package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts.map +1 -0
  47. package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +18 -0
  48. package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts +10 -0
  49. package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts.map +1 -0
  50. package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -0
  51. package/src/core/bvh8/build/bvh8_from_proxy.d.ts +9 -0
  52. package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -0
  53. package/src/core/bvh8/build/bvh8_from_proxy.js +256 -0
  54. package/src/core/bvh8/build/byte.d.ts +7 -0
  55. package/src/core/bvh8/build/byte.d.ts.map +1 -0
  56. package/src/core/bvh8/build/byte.js +10 -0
  57. package/src/core/bvh8/build/encode_bounds_e.d.ts +9 -0
  58. package/src/core/bvh8/build/encode_bounds_e.d.ts.map +1 -0
  59. package/src/core/bvh8/build/encode_bounds_e.js +12 -0
  60. package/src/core/bvh8/bvh8_convert_to_dot.d.ts +11 -0
  61. package/src/core/bvh8/bvh8_convert_to_dot.d.ts.map +1 -0
  62. package/src/core/bvh8/bvh8_convert_to_dot.js +133 -0
  63. package/src/core/bvh8/bvh8_count_primitives.d.ts +22 -0
  64. package/src/core/bvh8/bvh8_count_primitives.d.ts.map +1 -0
  65. package/src/core/bvh8/bvh8_count_primitives.js +98 -0
  66. package/src/core/bvh8/bvh8_geometry_validate.d.ts +16 -0
  67. package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -0
  68. package/src/core/bvh8/bvh8_geometry_validate.js +149 -0
  69. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts +16 -0
  70. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -0
  71. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +177 -0
  72. package/src/core/bvh8/bvh8_get_node_bounds.d.ts +9 -0
  73. package/src/core/bvh8/bvh8_get_node_bounds.d.ts.map +1 -0
  74. package/src/core/bvh8/bvh8_get_node_bounds.js +35 -0
  75. package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts +10 -0
  76. package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts.map +1 -0
  77. package/src/core/bvh8/bvh8_get_node_child_bounds.js +53 -0
  78. package/src/core/bvh8/bvh8_node_child_surface_area.d.ts +9 -0
  79. package/src/core/bvh8/bvh8_node_child_surface_area.d.ts.map +1 -0
  80. package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -0
  81. package/src/core/bvh8/bvh8_node_count_triangles.d.ts +8 -0
  82. package/src/core/bvh8/bvh8_node_count_triangles.d.ts.map +1 -0
  83. package/src/core/bvh8/bvh8_node_count_triangles.js +28 -0
  84. package/src/core/bvh8/bvh8_quality.d.ts +8 -0
  85. package/src/core/bvh8/bvh8_quality.d.ts.map +1 -0
  86. package/src/core/bvh8/bvh8_quality.js +73 -0
  87. package/src/core/bvh8/bvh8_validate_structure.d.ts +15 -0
  88. package/src/core/bvh8/bvh8_validate_structure.d.ts.map +1 -0
  89. package/src/core/bvh8/bvh8_validate_structure.js +87 -0
  90. package/src/core/collection/Uint32MinHeap.d.ts +56 -0
  91. package/src/core/collection/Uint32MinHeap.d.ts.map +1 -0
  92. package/src/core/collection/Uint32MinHeap.js +109 -0
  93. package/src/core/collection/list/FilteredListProjection.js +1 -1
  94. package/src/{engine/physics/island → core/collection/union-find}/union_find.d.ts +8 -5
  95. package/src/core/collection/union-find/union_find.d.ts.map +1 -0
  96. package/src/{engine/physics/island → core/collection/union-find}/union_find.js +8 -5
  97. package/src/core/dom/isImageBitmap.d.ts +7 -0
  98. package/src/core/dom/isImageBitmap.d.ts.map +1 -0
  99. package/src/core/dom/isImageBitmap.js +12 -0
  100. package/src/core/function/frameThrottle.d.ts +8 -0
  101. package/src/core/function/frameThrottle.d.ts.map +1 -0
  102. package/src/core/function/frameThrottle.js +23 -0
  103. package/src/{engine/physics/narrowphase/clip_against_axis_uv.d.ts → core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts} +3 -3
  104. package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts.map +1 -0
  105. package/src/{engine/physics/narrowphase/clip_against_axis_uv.js → core/geom/2d/polygon/polygon2_clip_axis_halfplane.js} +51 -51
  106. package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts → core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts} +9 -7
  107. package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts.map +1 -0
  108. package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.js → core/geom/3d/aabb/aabb3_transform_oriented_inverse.js} +9 -7
  109. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +12 -0
  110. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +1 -0
  111. package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +46 -0
  112. package/src/core/geom/3d/box/box3_projected_half_extent.d.ts +28 -0
  113. package/src/core/geom/3d/box/box3_projected_half_extent.d.ts.map +1 -0
  114. package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -0
  115. package/src/core/geom/3d/frustum/read_cluster_frustum_corners.js +1 -1
  116. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts +9 -0
  117. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts.map +1 -0
  118. package/src/core/geom/3d/frustum/read_frustum_corner.js +14 -0
  119. package/src/core/geom/3d/gjk/gjk.d.ts.map +1 -0
  120. package/src/{engine/physics → core/geom/3d}/gjk/gjk.js +430 -372
  121. package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.d.ts +8 -5
  122. package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -0
  123. package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.js +520 -544
  124. package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.d.ts +5 -4
  125. package/src/core/geom/3d/gjk/minkowski_support.d.ts.map +1 -0
  126. package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.js +71 -70
  127. package/src/{engine/physics → core/geom/3d}/gjk/mpr.d.ts +3 -3
  128. package/src/core/geom/3d/gjk/mpr.d.ts.map +1 -0
  129. package/src/{engine/physics → core/geom/3d}/gjk/mpr.js +368 -362
  130. package/src/{engine/physics/integration/quat_integrate.d.ts → core/geom/3d/quaternion/quat3_integrate.d.ts} +2 -2
  131. package/src/core/geom/3d/quaternion/quat3_integrate.d.ts.map +1 -0
  132. package/src/{engine/physics/integration/quat_integrate.js → core/geom/3d/quaternion/quat3_integrate.js} +1 -1
  133. package/src/{engine/physics/narrowphase/PosedShape.d.ts → core/geom/3d/shape/PosedShape3D.d.ts} +9 -8
  134. package/src/{engine/physics/narrowphase/PosedShape.d.ts.map → core/geom/3d/shape/PosedShape3D.d.ts.map} +1 -1
  135. package/src/{engine/physics/narrowphase/PosedShape.js → core/geom/3d/shape/PosedShape3D.js} +10 -9
  136. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  137. package/src/core/geom/3d/shape/TransformedShape3D.js +15 -11
  138. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +1 -1
  139. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +1 -1
  140. package/src/core/math/complex/complex_add.d.ts +1 -1
  141. package/src/core/math/complex/complex_add.d.ts.map +1 -1
  142. package/src/core/math/complex/complex_add.js +12 -3
  143. package/src/core/math/complex/complex_div.d.ts +1 -1
  144. package/src/core/math/complex/complex_div.d.ts.map +1 -1
  145. package/src/core/math/complex/complex_div.js +11 -4
  146. package/src/core/math/complex/complex_mul.d.ts +1 -1
  147. package/src/core/math/complex/complex_mul.d.ts.map +1 -1
  148. package/src/core/math/complex/complex_mul.js +10 -3
  149. package/src/core/math/complex/complex_sub.d.ts +1 -1
  150. package/src/core/math/complex/complex_sub.d.ts.map +1 -1
  151. package/src/core/math/complex/complex_sub.js +12 -3
  152. package/src/{engine/physics/fluid/solver/optimal_sor_omega.d.ts → core/math/linalg/sor_optimal_omega.d.ts} +4 -3
  153. package/src/core/math/linalg/sor_optimal_omega.d.ts.map +1 -0
  154. package/src/{engine/physics/fluid/solver/optimal_sor_omega.js → core/math/linalg/sor_optimal_omega.js} +4 -3
  155. package/src/core/math/lookup/ParameterLookupTable.d.ts +123 -0
  156. package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -0
  157. package/src/core/math/lookup/ParameterLookupTable.js +495 -0
  158. package/src/core/math/lookup/ParameterLookupTableFlags.d.ts +5 -0
  159. package/src/core/math/lookup/ParameterLookupTableFlags.d.ts.map +1 -0
  160. package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -0
  161. package/src/core/math/physics/kinematics/computeInterceptPoint.d.ts.map +1 -0
  162. package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.js +79 -79
  163. package/src/core/math/physics/mie/ri_air.d.ts.map +1 -1
  164. package/src/core/math/physics/mie/ri_air.js +1 -3
  165. package/src/core/math/physics/mie/ri_ammonium_sulfate.d.ts.map +1 -1
  166. package/src/core/math/physics/mie/ri_ammonium_sulfate.js +1 -3
  167. package/src/core/math/physics/mie/ri_brine.d.ts.map +1 -1
  168. package/src/core/math/physics/mie/ri_brine.js +1 -3
  169. package/src/core/math/physics/mie/ri_dust.d.ts.map +1 -1
  170. package/src/core/math/physics/mie/ri_dust.js +1 -3
  171. package/src/core/math/physics/mie/ri_pollen.d.ts.map +1 -1
  172. package/src/core/math/physics/mie/ri_pollen.js +1 -3
  173. package/src/core/math/physics/mie/ri_smoke.d.ts.map +1 -1
  174. package/src/core/math/physics/mie/ri_smoke.js +1 -3
  175. package/src/core/math/physics/mie/ri_soot.d.ts.map +1 -1
  176. package/src/core/math/physics/mie/ri_soot.js +1 -3
  177. package/src/core/math/physics/mie/ri_water.d.ts.map +1 -1
  178. package/src/core/math/physics/mie/ri_water.js +1 -3
  179. package/src/core/math/random/random_pick_weighted_index.d.ts +10 -0
  180. package/src/core/math/random/random_pick_weighted_index.d.ts.map +1 -0
  181. package/src/core/math/random/random_pick_weighted_index.js +26 -0
  182. package/src/core/model/node-graph/NodeGraph.d.ts +9 -0
  183. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  184. package/src/core/model/node-graph/NodeGraph.js +38 -0
  185. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +23 -0
  186. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  187. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +54 -0
  188. package/src/core/path/convertPathToURL.d.ts +9 -0
  189. package/src/core/path/convertPathToURL.d.ts.map +1 -0
  190. package/src/core/path/convertPathToURL.js +107 -0
  191. package/src/core/process/worker/WorkerBuilder.js +1 -1
  192. package/src/core/process/worker/extractTransferables.js +1 -1
  193. package/src/engine/animation/curve/draw/build_tangent_editor.d.ts.map +1 -1
  194. package/src/engine/animation/curve/draw/build_tangent_editor.js +8 -1
  195. package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.d.ts.map +1 -1
  196. package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.js +11 -5
  197. package/src/engine/asset/Asset.d.ts.map +1 -1
  198. package/src/engine/asset/Asset.js +16 -6
  199. package/src/engine/asset/AssetManager.d.ts +61 -52
  200. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  201. package/src/engine/asset/AssetManager.js +1411 -1045
  202. package/src/engine/asset/AssetRequest.d.ts +1 -1
  203. package/src/engine/asset/AssetRequest.d.ts.map +1 -1
  204. package/src/engine/asset/AssetRequest.js +1 -1
  205. package/src/engine/asset/AssetRequestScope.d.ts.map +1 -1
  206. package/src/engine/asset/AssetRequestScope.js +7 -0
  207. package/src/engine/asset/PendingAsset.d.ts +32 -1
  208. package/src/engine/asset/PendingAsset.d.ts.map +1 -1
  209. package/src/engine/asset/PendingAsset.js +108 -61
  210. package/src/engine/asset/loaders/ArrayBufferLoader.js +2 -2
  211. package/src/engine/asset/loaders/AssetLoader.d.ts.map +1 -1
  212. package/src/engine/asset/loaders/AssetLoader.js +19 -2
  213. package/src/engine/asset/loaders/GLTFAssetLoader.d.ts.map +1 -1
  214. package/src/engine/asset/loaders/GLTFAssetLoader.js +123 -114
  215. package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts +1 -1
  216. package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts.map +1 -1
  217. package/src/engine/asset/loaders/JavascriptAssetLoader.js +31 -47
  218. package/src/engine/asset/loaders/JsonAssetLoader.js +1 -1
  219. package/src/engine/asset/loaders/SVGAssetLoader.js +2 -2
  220. package/src/engine/asset/loaders/SoundAssetLoader.js +1 -1
  221. package/src/engine/asset/loaders/TextAssetLoader.js +2 -2
  222. package/src/{core → engine/asset/loaders}/font/FontAsset.d.ts +1 -1
  223. package/src/engine/asset/loaders/font/FontAsset.d.ts.map +1 -0
  224. package/src/{core → engine/asset/loaders}/font/FontAsset.js +21 -21
  225. package/src/{core → engine/asset/loaders}/font/FontAssetLoader.d.ts +1 -1
  226. package/src/engine/asset/loaders/font/FontAssetLoader.d.ts.map +1 -0
  227. package/src/{core → engine/asset/loaders}/font/FontAssetLoader.js +20 -20
  228. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts +1 -1
  229. package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
  230. package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +11 -20
  231. package/src/engine/asset/loaders/texture/TextureAssetLoader.d.ts.map +1 -1
  232. package/src/engine/asset/loaders/texture/TextureAssetLoader.js +8 -2
  233. package/src/engine/asset/preloader/AssetPreloader.js +1 -1
  234. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +1 -1
  235. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +1 -1
  236. package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +19 -22
  237. package/src/engine/graphics/FrameThrottle.d.ts +1 -7
  238. package/src/engine/graphics/FrameThrottle.d.ts.map +1 -1
  239. package/src/engine/graphics/FrameThrottle.js +2 -24
  240. package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.d.ts +1 -1
  241. package/src/engine/graphics/debug/shape_to_visual_entity.d.ts.map +1 -0
  242. package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.js +159 -159
  243. package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.d.ts +1 -1
  244. package/src/engine/graphics/debug/visualize_tetrahedral_mesh.d.ts.map +1 -0
  245. package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.js +46 -46
  246. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts +1 -1
  247. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts.map +1 -1
  248. package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -32
  249. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.d.ts.map +1 -1
  250. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +2 -76
  251. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.d.ts.map +1 -1
  252. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -427
  253. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts +1 -4
  254. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts.map +1 -1
  255. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -6
  256. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  257. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts +1 -8
  258. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts.map +1 -1
  259. package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -14
  260. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +1 -11
  261. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +1 -1
  262. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -46
  263. package/src/engine/graphics/sh3/prototypeSH3Probe.js +1 -1
  264. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +27 -0
  265. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -0
  266. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -0
  267. package/src/engine/graphics/texture/isImageBitmap.d.ts +1 -6
  268. package/src/engine/graphics/texture/isImageBitmap.d.ts.map +1 -1
  269. package/src/engine/graphics/texture/isImageBitmap.js +2 -12
  270. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.d.ts +2 -2
  271. package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.d.ts.map +1 -0
  272. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.js +55 -55
  273. package/src/engine/network/NetworkSession.d.ts +12 -1
  274. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  275. package/src/engine/network/NetworkSession.js +52 -1
  276. package/src/engine/network/README.md +45 -0
  277. package/src/engine/network/convertPathToURL.d.ts +1 -8
  278. package/src/engine/network/convertPathToURL.d.ts.map +1 -1
  279. package/src/engine/network/convertPathToURL.js +2 -107
  280. package/src/engine/network/core/quantize/quantize_float.d.ts.map +1 -1
  281. package/src/engine/network/core/quantize/quantize_float.js +7 -0
  282. package/src/engine/network/core/quantize/quantize_position.d.ts.map +1 -1
  283. package/src/engine/network/core/quantize/quantize_position.js +12 -1
  284. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  285. package/src/engine/network/orchestrator/NetworkPeer.js +15 -1
  286. package/src/engine/network/replication/Replicator.d.ts +8 -0
  287. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  288. package/src/engine/network/replication/Replicator.js +48 -0
  289. package/src/engine/network/transport/Channel.d.ts.map +1 -1
  290. package/src/engine/network/transport/Channel.js +46 -12
  291. package/src/engine/network/transport/ReliableCommandPipeline.d.ts +16 -0
  292. package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
  293. package/src/engine/network/transport/ReliableCommandPipeline.js +29 -0
  294. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  295. package/src/engine/network/transport/adapters/NodeUDPTransport.js +7 -1
  296. package/src/engine/network/transport/fragments/packet_size.d.ts +5 -5
  297. package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
  298. package/src/engine/network/transport/fragments/packet_size.js +5 -5
  299. package/src/engine/physics/BULLET_REVIEW.md +1 -1
  300. package/src/engine/physics/JOLT_REVIEW.md +2 -2
  301. package/src/engine/physics/PLAN.md +1094 -945
  302. package/src/engine/physics/RAPIER_REVIEW.md +2 -2
  303. package/src/engine/physics/body/BodyStorage.d.ts +2 -12
  304. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -1
  305. package/src/engine/physics/body/BodyStorage.js +406 -452
  306. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  307. package/src/engine/physics/body/SolverBodyState.js +12 -3
  308. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +28 -3
  309. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  310. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +60 -24
  311. package/src/engine/physics/broadphase/generate_pairs.d.ts +9 -5
  312. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -1
  313. package/src/engine/physics/broadphase/generate_pairs.js +52 -37
  314. package/src/engine/physics/ccd/linear_sweep.d.ts +15 -5
  315. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  316. package/src/engine/physics/ccd/linear_sweep.js +122 -40
  317. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  318. package/src/engine/physics/constraint/solve_constraints.js +830 -805
  319. package/src/engine/physics/contact/ManifoldStore.d.ts +91 -16
  320. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  321. package/src/engine/physics/contact/ManifoldStore.js +204 -60
  322. package/src/engine/physics/ecs/BodyKind.d.ts +7 -3
  323. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
  324. package/src/engine/physics/ecs/BodyKind.js +29 -25
  325. package/src/engine/physics/ecs/Collider.d.ts +7 -0
  326. package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
  327. package/src/engine/physics/ecs/Collider.js +7 -0
  328. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +1 -1
  329. package/src/engine/physics/ecs/PhysicsSystem.d.ts +110 -6
  330. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  331. package/src/engine/physics/ecs/PhysicsSystem.js +467 -45
  332. package/src/engine/physics/ecs/RigidBody.d.ts +20 -5
  333. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -1
  334. package/src/engine/physics/ecs/RigidBody.js +307 -286
  335. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +6 -3
  336. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -1
  337. package/src/engine/physics/ecs/RigidBodyFlags.js +31 -28
  338. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +12 -4
  339. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -1
  340. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +19 -5
  341. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts +10 -0
  342. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts.map +1 -0
  343. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -0
  344. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts +28 -0
  345. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts.map +1 -0
  346. package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -0
  347. package/src/engine/physics/events/ContactEventBuffer.d.ts +11 -0
  348. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -1
  349. package/src/engine/physics/events/ContactEventBuffer.js +40 -0
  350. package/src/engine/physics/events/diff_manifolds.d.ts +30 -13
  351. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -1
  352. package/src/engine/physics/events/diff_manifolds.js +87 -50
  353. package/src/engine/physics/fluid/FluidField.d.ts +45 -17
  354. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  355. package/src/engine/physics/fluid/FluidField.js +53 -23
  356. package/src/engine/physics/fluid/FluidSimulator.d.ts +141 -5
  357. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  358. package/src/engine/physics/fluid/FluidSimulator.js +336 -43
  359. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +114 -0
  360. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +4 -3
  361. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  362. package/src/engine/physics/fluid/ecs/FluidComponent.js +4 -3
  363. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  364. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts +41 -0
  365. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts.map +1 -0
  366. package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.js +124 -0
  367. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +27 -8
  368. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  369. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +67 -18
  370. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts +42 -0
  371. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts.map +1 -0
  372. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +136 -0
  373. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts +37 -0
  374. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -0
  375. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +169 -0
  376. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts +36 -0
  377. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -0
  378. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +100 -0
  379. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +6 -0
  380. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  381. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +6 -0
  382. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +7 -2
  383. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  384. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +17 -12
  385. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts +42 -0
  386. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -0
  387. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -0
  388. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +32 -22
  389. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -1
  390. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +43 -26
  391. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts +31 -0
  392. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts.map +1 -0
  393. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -0
  394. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +26 -19
  395. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -1
  396. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +46 -42
  397. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +38 -10
  398. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -1
  399. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +158 -75
  400. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +22 -17
  401. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
  402. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -96
  403. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +30 -1
  404. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
  405. package/src/engine/physics/inertia/world_inverse_inertia.js +160 -116
  406. package/src/engine/physics/integration/integrate_position.js +97 -97
  407. package/src/engine/physics/island/IslandBuilder.d.ts +49 -8
  408. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
  409. package/src/engine/physics/island/IslandBuilder.js +93 -14
  410. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
  411. package/src/engine/physics/narrowphase/box_box_manifold.js +683 -673
  412. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
  413. package/src/engine/physics/narrowphase/box_triangle_contact.js +899 -749
  414. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +27 -0
  415. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  416. package/src/engine/physics/narrowphase/capsule_contacts.js +624 -459
  417. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
  418. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +58 -38
  419. package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
  420. package/src/engine/physics/narrowphase/compute_penetration.js +369 -325
  421. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +3 -1
  422. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  423. package/src/engine/physics/narrowphase/convex_convex_manifold.js +568 -422
  424. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +6 -3
  425. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
  426. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +66 -10
  427. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +4 -1
  428. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  429. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +97 -94
  430. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
  431. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  432. package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1739
  433. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +14 -7
  434. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
  435. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -69
  436. package/src/engine/physics/persistence/solver_caches.d.ts +20 -0
  437. package/src/engine/physics/persistence/solver_caches.d.ts.map +1 -0
  438. package/src/engine/physics/persistence/solver_caches.js +309 -0
  439. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  440. package/src/engine/physics/queries/overlap_shape.js +187 -184
  441. package/src/engine/physics/queries/raycast.d.ts +3 -2
  442. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  443. package/src/engine/physics/queries/raycast.js +37 -11
  444. package/src/engine/physics/queries/shape_cast.d.ts +18 -5
  445. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  446. package/src/engine/physics/queries/shape_cast.js +417 -393
  447. package/src/engine/physics/solver/solve_contacts.d.ts +22 -6
  448. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  449. package/src/engine/physics/solver/solve_contacts.js +1482 -1338
  450. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  451. package/src/engine/physics/vehicle/RaycastVehicle.js +344 -339
  452. package/src/engine/ui/DraggableAspect.d.ts +12 -3
  453. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  454. package/src/engine/ui/DraggableAspect.js +115 -83
  455. package/src/generation/COORDINATES.md +54 -0
  456. package/src/generation/GridTaskGroup.js +2 -2
  457. package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -0
  458. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts +9 -1
  459. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts.map +1 -1
  460. package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -59
  461. package/src/generation/automata/CellularAutomata.d.ts +6 -3
  462. package/src/generation/automata/CellularAutomata.d.ts.map +1 -1
  463. package/src/generation/automata/CellularAutomata.js +22 -19
  464. package/src/generation/filtering/CellFilter.d.ts +17 -0
  465. package/src/generation/filtering/CellFilter.d.ts.map +1 -1
  466. package/src/generation/filtering/CellFilter.js +117 -77
  467. package/src/generation/filtering/CellFilterCellMatcher.d.ts.map +1 -1
  468. package/src/generation/filtering/CellFilterCellMatcher.js +2 -0
  469. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts +5 -0
  470. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts.map +1 -1
  471. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +15 -0
  472. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts +0 -1
  473. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts.map +1 -1
  474. package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -50
  475. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts +0 -1
  476. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts.map +1 -1
  477. package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -59
  478. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts +0 -1
  479. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts.map +1 -1
  480. package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -33
  481. package/src/generation/filtering/numeric/CellFilterCache.d.ts +1 -0
  482. package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
  483. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts +3 -2
  484. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts.map +1 -1
  485. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +9 -35
  486. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts +0 -1
  487. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts.map +1 -1
  488. package/src/generation/filtering/numeric/complex/CellFilterCurvature.js +19 -43
  489. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts +0 -1
  490. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts.map +1 -1
  491. package/src/generation/filtering/numeric/complex/CellFilterFXAA.js +2 -6
  492. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.d.ts.map +1 -1
  493. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +9 -12
  494. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.d.ts.map +1 -1
  495. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +2 -1
  496. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts +0 -1
  497. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts.map +1 -1
  498. package/src/generation/filtering/numeric/complex/CellFilterSobel.js +2 -6
  499. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts +5 -4
  500. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts.map +1 -1
  501. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.js +5 -4
  502. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts +17 -0
  503. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts.map +1 -0
  504. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -0
  505. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.d.ts.map +1 -1
  506. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +7 -1
  507. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.d.ts.map +1 -1
  508. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +7 -10
  509. package/src/generation/filtering/numeric/util/sampler_from_filter.d.ts.map +1 -1
  510. package/src/generation/filtering/numeric/util/sampler_from_filter.js +2 -1
  511. package/src/generation/grid/GridData.d.ts.map +1 -1
  512. package/src/generation/grid/GridData.js +14 -1
  513. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts +10 -3
  514. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts.map +1 -1
  515. package/src/generation/grid/actions/ContinuousGridCellAction.js +18 -3
  516. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts +11 -1
  517. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts.map +1 -1
  518. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.js +13 -3
  519. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +1 -1
  520. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +2 -2
  521. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts +1 -1
  522. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
  523. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +4 -6
  524. package/src/generation/grid/coords/grid_to_texel.d.ts +9 -0
  525. package/src/generation/grid/coords/grid_to_texel.d.ts.map +1 -0
  526. package/src/generation/grid/coords/grid_to_texel.js +10 -0
  527. package/src/generation/grid/coords/texel_to_grid.d.ts +9 -0
  528. package/src/generation/grid/coords/texel_to_grid.d.ts.map +1 -0
  529. package/src/generation/grid/coords/texel_to_grid.js +10 -0
  530. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts +2 -2
  531. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts.map +1 -1
  532. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +10 -6
  533. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  534. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +20 -21
  535. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts +7 -0
  536. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts.map +1 -1
  537. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +18 -10
  538. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.d.ts.map +1 -1
  539. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +16 -7
  540. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts +5 -3
  541. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts.map +1 -1
  542. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +26 -23
  543. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.d.ts.map +1 -1
  544. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +10 -1
  545. package/src/generation/grid/generation/grid/select/CellSupplierBestN.d.ts.map +1 -1
  546. package/src/generation/grid/generation/grid/select/CellSupplierBestN.js +4 -0
  547. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts +15 -8
  548. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  549. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +89 -92
  550. package/src/generation/markers/GridActionRuleSet.d.ts.map +1 -1
  551. package/src/generation/markers/GridActionRuleSet.js +10 -2
  552. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +11 -0
  553. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  554. package/src/generation/markers/GridCellActionPlaceMarker.js +20 -3
  555. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +3 -1
  556. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  557. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +9 -2
  558. package/src/generation/markers/MarkerNode.d.ts +8 -3
  559. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  560. package/src/generation/markers/MarkerNode.js +12 -5
  561. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
  562. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts +1 -1
  563. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts.map +1 -1
  564. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.js +1 -1
  565. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts +1 -1
  566. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts.map +1 -1
  567. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  568. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts +1 -1
  569. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  570. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +2 -2
  571. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts +1 -1
  572. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts.map +1 -1
  573. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.js +2 -2
  574. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
  575. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.js +6 -4
  576. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.d.ts.map +1 -1
  577. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.js +1 -3
  578. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.d.ts.map +1 -1
  579. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +12 -11
  580. package/src/generation/markers/matcher/MarkerNodeMatcherAnd.js +2 -2
  581. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts +4 -1
  582. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts.map +1 -1
  583. package/src/generation/markers/transform/MarkerNodeTransformer.js +4 -1
  584. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  585. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +1 -3
  586. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts +5 -0
  587. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  588. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +15 -0
  589. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.d.ts.map +1 -1
  590. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.js +1 -3
  591. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  592. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +2 -4
  593. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  594. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +1 -3
  595. package/src/generation/placement/GridCellPlacementRule.d.ts.map +1 -1
  596. package/src/generation/placement/GridCellPlacementRule.js +1 -3
  597. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
  598. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -10
  599. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.d.ts.map +1 -1
  600. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +6 -4
  601. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.d.ts.map +1 -1
  602. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.js +1 -3
  603. package/src/generation/rules/CellMatcher.d.ts +3 -1
  604. package/src/generation/rules/CellMatcher.d.ts.map +1 -1
  605. package/src/generation/rules/CellMatcher.js +3 -1
  606. package/src/generation/rules/CellMatcherFromFilter.d.ts.map +1 -1
  607. package/src/generation/rules/CellMatcherFromFilter.js +1 -3
  608. package/src/generation/rules/CellMatcherLayerBitMaskTest.d.ts.map +1 -1
  609. package/src/generation/rules/CellMatcherLayerBitMaskTest.js +6 -20
  610. package/src/generation/test_support/executeTaskTreeSync.d.ts +9 -0
  611. package/src/generation/test_support/executeTaskTreeSync.d.ts.map +1 -0
  612. package/src/generation/test_support/executeTaskTreeSync.js +78 -0
  613. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts +2 -1
  614. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts.map +1 -1
  615. package/src/generation/theme/TerrainLayerRuleAggregator.js +9 -6
  616. package/src/generation/theme/Theme.d.ts +1 -1
  617. package/src/generation/theme/Theme.d.ts.map +1 -1
  618. package/src/generation/theme/Theme.js +2 -2
  619. package/src/generation/theme/ThemeEngine.d.ts +3 -3
  620. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  621. package/src/generation/theme/ThemeEngine.js +26 -16
  622. package/src/generation/theme/cell/CellProcessingRule.d.ts +3 -3
  623. package/src/generation/theme/cell/CellProcessingRule.d.ts.map +1 -1
  624. package/src/generation/theme/cell/CellProcessingRule.js +6 -10
  625. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts +1 -1
  626. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts.map +1 -1
  627. package/src/generation/theme/cell/CellProcessingRuleSet.js +2 -2
  628. package/src/view/common/ListView.js +1 -1
  629. package/src/view/elements/BottomLeftResizeHandleView.d.ts.map +1 -1
  630. package/src/view/elements/BottomLeftResizeHandleView.js +13 -5
  631. package/src/core/font/FontAsset.d.ts.map +0 -1
  632. package/src/core/font/FontAssetLoader.d.ts.map +0 -1
  633. package/src/core/geom/3d/shape/util/shape_to_visual_entity.d.ts.map +0 -1
  634. package/src/core/geom/3d/tetrahedra/visualize_tetrahedral_mesh.d.ts.map +0 -1
  635. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +0 -1
  636. package/src/engine/physics/computeInterceptPoint.d.ts.map +0 -1
  637. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +0 -1
  638. package/src/engine/physics/gjk/gjk.d.ts.map +0 -1
  639. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +0 -1
  640. package/src/engine/physics/gjk/minkowski_support.d.ts.map +0 -1
  641. package/src/engine/physics/gjk/mpr.d.ts.map +0 -1
  642. package/src/engine/physics/integration/quat_integrate.d.ts.map +0 -1
  643. package/src/engine/physics/island/union_find.d.ts.map +0 -1
  644. package/src/engine/physics/narrowphase/clip_against_axis_uv.d.ts.map +0 -1
  645. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +0 -1
  646. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts +0 -21
  647. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts.map +0 -1
  648. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +0 -68
  649. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts +0 -10
  650. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts.map +0 -1
  651. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.js +0 -17
  652. /package/src/{engine/physics → core/geom/3d}/gjk/NOTES.md +0 -0
  653. /package/src/{engine/physics → core/geom/3d}/gjk/gjk.d.ts +0 -0
  654. /package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.d.ts +0 -0
@@ -1,7 +1,10 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { optimal_sor_omega } from "./solver/optimal_sor_omega.js";
3
- import { v3_grid_apply_advection_forward } from "./solver/v3_grid_apply_advection_forward.js";
2
+ import { sor_optimal_omega } from "../../../core/math/linalg/sor_optimal_omega.js";
3
+ import { v3_grid_advect_maccormack_scalar } from "./solver/v3_grid_advect_maccormack_scalar.js";
4
+ import { v3_grid_advect_maccormack_velocity } from "./solver/v3_grid_advect_maccormack_velocity.js";
5
+ import { v3_grid_advect_sl_velocity } from "./solver/v3_grid_advect_sl_velocity.js";
4
6
  import { v3_grid_apply_diffusion } from "./solver/v3_grid_apply_diffusion.js";
7
+ import { v3_grid_apply_vorticity_confinement } from "./solver/v3_grid_apply_vorticity_confinement.js";
5
8
  import { v3_grid_apply_scalar_advection } from "./solver/v3_grid_apply_scalar_advection.js";
6
9
  import { v3_grid_compute_divergence } from "./solver/v3_grid_compute_divergence.js";
7
10
  import { v3_grid_solve_pressure } from "./solver/v3_grid_solve_pressure.js";
@@ -30,6 +33,27 @@ export const PressureSolver = {
30
33
  MICPCG: "mic-pcg",
31
34
  };
32
35
 
36
+ /**
37
+ * Velocity / scalar transport scheme selection.
38
+ *
39
+ * - `"semi-lagrangian"` — first-order back-trace + trilinear gather (Stam
40
+ * 1999). Cheapest; strongly dissipative — a vortex loses half its kinetic
41
+ * energy per second at production settings (see quality.spec.js).
42
+ *
43
+ * - `"maccormack"` — unconditionally stable MacCormack (Selle et al. 2008):
44
+ * a forward and a backward semi-Lagrangian pass with error correction and
45
+ * a monotone min-max limiter. Second-order accurate in space and time at
46
+ * ~2× the advection cost — and advection is the minority of step() cost
47
+ * next to pressure, so the end-to-end price is small. Allocates 3
48
+ * additional N-sized scratch buffers, shared with the reflection scheme.
49
+ *
50
+ * @enum {string}
51
+ */
52
+ export const AdvectionScheme = {
53
+ SEMI_LAGRANGIAN: "semi-lagrangian",
54
+ MACCORMACK: "maccormack",
55
+ };
56
+
33
57
  /**
34
58
  * Cell-centered 3D Stable Fluids solver (Stam, 1999/2003).
35
59
  *
@@ -41,12 +65,16 @@ export const PressureSolver = {
41
65
  * the field). Scratch is cached by cell-count so per-step allocation stays at zero.
42
66
  *
43
67
  * Per step:
44
- * 1. Apply external forces (effectors mutate field velocity).
68
+ * 1. Apply external forces (effectors mutate field velocity), then the
69
+ * optional exponential velocity damping.
45
70
  * 2. Diffuse velocity (viscosity; skipped when `velocity_diffusion_rate == 0`).
46
- * 3. Project (pressure solve + gradient subtract) to enforce ∇·v ≈ 0.
47
- * 4. Self-advect velocity (semi-Lagrangian back-trace).
48
- * 5. Project again (advection introduces small divergence).
49
- * 6. For each scalar attribute on the field: optionally diffuse, then advect.
71
+ * 3-5. Transport block either the Stam reference sequence
72
+ * project₁ advect project₂, or (default) the advection-reflection
73
+ * form of the same two projections (see {@link advection_reflection}).
74
+ * Advection itself is semi-Lagrangian or MacCormack per
75
+ * {@link advection_scheme}.
76
+ * 6. For each scalar attribute on the field: optionally diffuse, then advect
77
+ * with the same scheme.
50
78
  *
51
79
  * Pressure is warm-started from the previous step's solution (`field.pressure`),
52
80
  * which converges much faster than starting from zero once the flow reaches a
@@ -69,6 +97,25 @@ export const PressureSolver = {
69
97
  */
70
98
  export const PRESSURE_ITERATIONS_FLOOR = 8;
71
99
 
100
+ /**
101
+ * Relative convergence tolerance handed to the MIC-PCG pressure solve: the
102
+ * solver stops as soon as `max|r| <= tolerance * max|−div|`. The iteration
103
+ * cap from {@link FluidSimulator#resolvePressureIterations} is sized for the
104
+ * cold-start worst case; warm-started production frames converge much
105
+ * earlier, and without a tolerance exit every warm frame would pay the full
106
+ * cold-start budget for no quality gain.
107
+ *
108
+ * 1e-3 sits below visual-fluids noticeability and below the collocated
109
+ * operator-mismatch floor that dominates post-projection divergence (see
110
+ * quality.spec.js) — iterating past it buys nothing visible.
111
+ *
112
+ * SOR has no equivalent exit: it never computes its residual (doing so would
113
+ * add a pass per sweep), so its cost is governed by the iteration count alone.
114
+ *
115
+ * @type {number}
116
+ */
117
+ export const PCG_RELATIVE_TOLERANCE = 1e-3;
118
+
72
119
  export class FluidSimulator {
73
120
 
74
121
  /**
@@ -97,6 +144,28 @@ export class FluidSimulator {
97
144
  */
98
145
  scalar_diffusion_iterations = 4;
99
146
 
147
+ /**
148
+ * Exponential velocity damping rate, per second. Each step multiplies the
149
+ * whole velocity field by `exp(-velocity_damping * dt)` right after
150
+ * effectors run. `0` (default) disables — no pass is made.
151
+ *
152
+ * Why it exists: the solver has no other dissipation mechanism that bounds
153
+ * energy under sustained forcing. Incompressible projection cannot oppose
154
+ * a uniform body force (a uniform field is divergence-free), so a constant
155
+ * {@link GlobalFluidEffector} accelerates the fluid without limit — there
156
+ * is no terminal state. A small damping rate gives constant forcing a
157
+ * terminal velocity of approximately `acceleration / velocity_damping`
158
+ * and makes transient gusts decay back to calm, which is what wind-field
159
+ * use cases want (drive with {@link AmbientWindFluidEffector} for a
160
+ * specific ambient target instead of a force).
161
+ *
162
+ * The exponential form is frame-rate independent: two half-steps damp
163
+ * exactly as much as one full step.
164
+ *
165
+ * @type {number}
166
+ */
167
+ velocity_damping = 0;
168
+
100
169
  /**
101
170
  * Which pressure solver to use. `PressureSolver.SOR` (default) is the
102
171
  * baseline red-black Successive Over-Relaxation. `PressureSolver.MICPCG`
@@ -115,6 +184,77 @@ export class FluidSimulator {
115
184
  */
116
185
  pressure_solver = PressureSolver.SOR;
117
186
 
187
+ /**
188
+ * Vorticity-confinement strength ε, per second (Fedkiw et al. 2001). Each
189
+ * step deposits `ε·dt·(N × ω)` as a velocity increment, sharpening vortex
190
+ * cores that coarse grids and dissipative transport smear away. `0`
191
+ * (default) disables — no pass is made.
192
+ *
193
+ * Confinement ADDS energy by design; pair non-zero values with
194
+ * {@link velocity_damping} so gusts still decay. Visual-smoke territory
195
+ * starts around `ε ≈ 5–30` at 60 Hz (epsilon_dt 0.1–0.5).
196
+ *
197
+ * Cost when enabled: two extra O(N) passes (curl + force) using existing
198
+ * scratch — no allocations.
199
+ *
200
+ * @type {number}
201
+ */
202
+ vorticity_confinement = 0;
203
+
204
+ /**
205
+ * Which transport scheme advects velocity and scalars — see
206
+ * {@link AdvectionScheme}.
207
+ *
208
+ * **Default semi-Lagrangian — MacCormack is gated on a MAC-staggered
209
+ * grid.** On the current collocated discretization the projection has an
210
+ * operator-mismatch floor (high-frequency divergence it cannot see, let
211
+ * alone remove — quality.spec.js scenario 7), and MacCormack's
212
+ * anti-diffusive corrector amplifies exactly that residue instead of
213
+ * letting first-order smearing absorb it. Measured on the sealed-vortex
214
+ * scenario: kinetic energy transiently grows to **1.9×** within 10 s
215
+ * (vs SL's monotone decay), and a passive scalar's total mass inflates
216
+ * **1.8×** in one second of orbiting. The kernels are correct in
217
+ * isolation (their specs transport clean fields sharply and monotonely) —
218
+ * it is the interaction with the collocated pressure floor that is
219
+ * unstable. Flip this on once the grid is staggered.
220
+ *
221
+ * @type {string}
222
+ */
223
+ advection_scheme = AdvectionScheme.SEMI_LAGRANGIAN;
224
+
225
+ /**
226
+ * Replace the plain "project → advect → project" sequence with the
227
+ * advection-reflection scheme (Zehnder, Narain, Thomaszewski 2018):
228
+ *
229
+ * ũ = advect(u, u, dt/2) — half-step self-advection
230
+ * u½ = project(ũ)
231
+ * û = 2·u½ − ũ — energy-preserving reflection
232
+ * u′ = advect(û, u½, dt/2) — transport the REFLECTED field
233
+ * along the PROJECTED one
234
+ * u₁ = project(u′)
235
+ *
236
+ * Same two pressure solves as the default double-projection Stam step,
237
+ * and two half-dt advections instead of one full-dt one — measured cost
238
+ * +20% of step() at 32×8×32. The reflection replaces the
239
+ * energy-DISSIPATING first projection with an energy-PRESERVING
240
+ * reflection about the divergence-free subspace.
241
+ *
242
+ * Default ON: with semi-Lagrangian advection this is measured stable
243
+ * (sealed-vortex kinetic energy never exceeds 0.99× its initial over
244
+ * 10 s) while retaining visibly more swirl — peak vorticity 0.73 vs 0.62
245
+ * after one second (quality.spec.js scenario 2b). With MacCormack it
246
+ * compounds the collocated-floor amplification (3.4× energy growth) —
247
+ * see {@link advection_scheme}; that combination should wait for MAC
248
+ * staggering.
249
+ *
250
+ * Only consulted when {@link project_before_advection} is true — the
251
+ * scheme is defined around the mid-step projection. With
252
+ * `project_before_advection = false` this flag is ignored.
253
+ *
254
+ * @type {boolean}
255
+ */
256
+ advection_reflection = true;
257
+
118
258
  /**
119
259
  * Run the pressure projection *before* self-advection in addition to after.
120
260
  *
@@ -200,6 +340,14 @@ export class FluidSimulator {
200
340
  /** @type {Float32Array|null} */ #pcg_As = null;
201
341
  /** @type {Float32Array|null} */ #pcg_precon = null;
202
342
 
343
+ // Auxiliary velocity trio (allocated lazily): MacCormack's forward-pass
344
+ // scratch AND the reflection scheme's ũ snapshot — the two uses never
345
+ // overlap in time within a step.
346
+ #aux_scratch_cells = 0;
347
+ /** @type {Float32Array|null} */ #aux_x = null;
348
+ /** @type {Float32Array|null} */ #aux_y = null;
349
+ /** @type {Float32Array|null} */ #aux_z = null;
350
+
203
351
  /**
204
352
  * Grow the cached scratch buffers if the requested size exceeds what's allocated.
205
353
  * Idempotent and monotonic — never shrinks. Called at the top of {@link step} and
@@ -236,6 +384,59 @@ export class FluidSimulator {
236
384
  this.#pcg_precon = new Float32Array(cell_count);
237
385
  }
238
386
 
387
+ /**
388
+ * Lazily allocate the auxiliary velocity trio (3 N-sized Float32 buffers)
389
+ * used by MacCormack advection and the reflection scheme. Idempotent and
390
+ * monotonic.
391
+ * @param {number} cell_count
392
+ */
393
+ #ensure_aux_scratch(cell_count) {
394
+ if (this.#aux_scratch_cells >= cell_count) {
395
+ return;
396
+ }
397
+ this.#aux_scratch_cells = cell_count;
398
+ this.#aux_x = new Float32Array(cell_count);
399
+ this.#aux_y = new Float32Array(cell_count);
400
+ this.#aux_z = new Float32Array(cell_count);
401
+ }
402
+
403
+ /**
404
+ * Advect the field's velocity from `sources` along the given carrier, into
405
+ * the field's velocity buffers, using the configured
406
+ * {@link advection_scheme}. The carrier may alias the field's own velocity
407
+ * arrays (it is point-read only); sources must not.
408
+ *
409
+ * @param {FluidField} field
410
+ * @param {number[]} res
411
+ * @param {number} dt
412
+ * @param {Float32Array[]} sources `[src_x, src_y, src_z]`
413
+ * @param {Float32Array} carrier_x
414
+ * @param {Float32Array} carrier_y
415
+ * @param {Float32Array} carrier_z
416
+ */
417
+ #advect_velocity(field, res, dt, sources, carrier_x, carrier_y, carrier_z) {
418
+ const outputs = [field.velocity_x, field.velocity_y, field.velocity_z];
419
+ if (this.advection_scheme === AdvectionScheme.MACCORMACK) {
420
+ this.#ensure_aux_scratch(field.cellCount());
421
+ v3_grid_advect_maccormack_velocity(
422
+ outputs, sources,
423
+ carrier_x, carrier_y, carrier_z,
424
+ [this.#aux_x, this.#aux_y, this.#aux_z],
425
+ res[0], res[1], res[2],
426
+ dt,
427
+ field.solid
428
+ );
429
+ } else {
430
+ v3_grid_advect_sl_velocity(
431
+ outputs, sources,
432
+ carrier_x, carrier_y, carrier_z,
433
+ res[0], res[1], res[2],
434
+ dt,
435
+ field.solid
436
+ );
437
+ }
438
+ }
439
+
239
440
  /**
240
441
  * Re-allocate the divergence scratch buffer if its element type doesn't match
241
442
  * the field's pressure type. Lets `half_precision_pressure` on the field carry
@@ -282,9 +483,24 @@ export class FluidSimulator {
282
483
  * because tests and external code may need to project on demand (e.g., after
283
484
  * splatting an out-of-band impulse). `field.pressure` is read as the warm-start
284
485
  * initial guess and written with the new solution.
486
+ *
487
+ * Refreshes the field's solid-neighbour mask itself, so direct callers never
488
+ * have to remember invalidation after mutating solids. {@link step} refreshes
489
+ * the mask once for the whole step and uses the private no-recompute variant
490
+ * for both of its projections.
491
+ *
285
492
  * @param {FluidField} field
286
493
  */
287
494
  project(field) {
495
+ field.recomputeSolidNeighbourMask();
496
+ this.#project_with_current_mask(field);
497
+ }
498
+
499
+ /**
500
+ * Projection body — assumes `field.solid_neighbour_mask` is already fresh.
501
+ * @param {FluidField} field
502
+ */
503
+ #project_with_current_mask(field) {
288
504
  this.#ensure_scratch(field.cellCount());
289
505
  this.#ensure_divergence_matches(field);
290
506
 
@@ -296,12 +512,6 @@ export class FluidSimulator {
296
512
  return;
297
513
  }
298
514
 
299
- // Pre-bake the per-cell neighbourhood mask consumed by the pressure SOR
300
- // loop. One O(N) byte-pass amortized across `iterations` SOR sweeps;
301
- // saves six boundary checks plus six solid-neighbour checks per cell per
302
- // iteration. See FluidField.solid_neighbour_mask.
303
- field.recomputeSolidNeighbourMask();
304
-
305
515
  v3_grid_compute_divergence(
306
516
  this.#divergence,
307
517
  field.velocity_x, field.velocity_y, field.velocity_z,
@@ -314,8 +524,8 @@ export class FluidSimulator {
314
524
  v3_grid_solve_pressure_pcg(
315
525
  field.pressure, this.#divergence,
316
526
  res[0], res[1], res[2],
317
- iterations,
318
- field.solid_neighbour_mask,
527
+ iterations, PCG_RELATIVE_TOLERANCE,
528
+ field.solid_neighbour_mask, field.pressure_diag,
319
529
  this.#pcg_r, this.#pcg_z, this.#pcg_s, this.#pcg_As, this.#pcg_precon
320
530
  );
321
531
  } else {
@@ -323,8 +533,8 @@ export class FluidSimulator {
323
533
  field.pressure, this.#divergence,
324
534
  res[0], res[1], res[2],
325
535
  iterations,
326
- optimal_sor_omega(res[0], res[1], res[2]),
327
- field.solid_neighbour_mask
536
+ sor_optimal_omega(res[0], res[1], res[2]),
537
+ field.solid_neighbour_mask, field.pressure_diag
328
538
  );
329
539
  }
330
540
 
@@ -394,6 +604,41 @@ export class FluidSimulator {
394
604
  effectors[i].apply(field, time_delta, world_to_grid);
395
605
  }
396
606
 
607
+ // 1b. Velocity damping — the solver's only energy sink under sustained
608
+ // forcing. Solid cells are included in the multiply (their velocity
609
+ // is 0, so damping them is a no-op and the loop stays branch-free).
610
+ if (this.velocity_damping > 0) {
611
+ const decay = Math.exp(-this.velocity_damping * time_delta);
612
+ const vx = field.velocity_x;
613
+ const vy = field.velocity_y;
614
+ const vz = field.velocity_z;
615
+ for (let i = 0; i < cell_count; i++) {
616
+ vx[i] *= decay;
617
+ vy[i] *= decay;
618
+ vz[i] *= decay;
619
+ }
620
+ }
621
+
622
+ // 1c. Vorticity confinement — an additional force term that sharpens
623
+ // vortex cores (see the knob's docstring). Uses the prev trio and
624
+ // the diffusion scratch as working memory; both are overwritten by
625
+ // later phases anyway.
626
+ if (this.vorticity_confinement > 0) {
627
+ v3_grid_apply_vorticity_confinement(
628
+ field.velocity_x, field.velocity_y, field.velocity_z,
629
+ this.#prev_x, this.#prev_y, this.#prev_z, this.#diffusion_scratch,
630
+ res[0], res[1], res[2],
631
+ this.vorticity_confinement * time_delta,
632
+ field.solid
633
+ );
634
+ }
635
+
636
+ // Refresh the pre-baked solid-neighbour mask ONCE for the whole step —
637
+ // after effectors (a custom effector may splat solids), before anything
638
+ // that consumes it. Both projections below reuse it, saving an O(N)
639
+ // byte pass versus recomputing per projection.
640
+ field.recomputeSolidNeighbourMask();
641
+
397
642
  const solid = field.solid;
398
643
 
399
644
  // 2. Velocity diffusion (viscosity). Cheap to skip when disabled.
@@ -403,28 +648,64 @@ export class FluidSimulator {
403
648
  this.#diffuse_velocity_component(field.velocity_z, this.#prev_z, res, solid);
404
649
  }
405
650
 
406
- // 3. Project to enforce incompressibility before advection. Skipping this
407
- // is a perf knob (~halves the pressure cost) at the price of advection
408
- // seeing a slightly-divergent input. See `project_before_advection`.
409
- if (this.project_before_advection) {
410
- this.project(field);
411
- }
651
+ // 3-5. Transport block: project + self-advect (+ optional reflection).
652
+ const prev = [this.#prev_x, this.#prev_y, this.#prev_z];
653
+
654
+ if (this.project_before_advection && this.advection_reflection) {
655
+ // Advection-reflection (Zehnder et al. 2018), half-step form — see
656
+ // the `advection_reflection` docstring. Same two projections as the
657
+ // plain path; two half-dt advections instead of one full-dt one.
658
+ const half_dt = 0.5 * time_delta;
659
+ const n = cell_count;
660
+
661
+ // ũ = advect(u, u, dt/2)
662
+ this.#prev_x.set(field.velocity_x);
663
+ this.#prev_y.set(field.velocity_y);
664
+ this.#prev_z.set(field.velocity_z);
665
+ this.#advect_velocity(field, res, half_dt, prev, this.#prev_x, this.#prev_y, this.#prev_z);
666
+
667
+ // Snapshot ũ (after the advect — MacCormack uses the same aux trio
668
+ // as its forward scratch during the kernel).
669
+ this.#ensure_aux_scratch(n);
670
+ this.#aux_x.set(field.velocity_x);
671
+ this.#aux_y.set(field.velocity_y);
672
+ this.#aux_z.set(field.velocity_z);
673
+
674
+ // u½ = project(ũ)
675
+ this.#project_with_current_mask(field);
676
+
677
+ // û = 2·u½ − ũ — the reflection about the divergence-free subspace.
678
+ const ax = this.#aux_x, ay = this.#aux_y, az = this.#aux_z;
679
+ const fx = field.velocity_x, fy = field.velocity_y, fz = field.velocity_z;
680
+ const px = this.#prev_x, py = this.#prev_y, pz = this.#prev_z;
681
+ for (let i = 0; i < n; i++) {
682
+ px[i] = 2 * fx[i] - ax[i];
683
+ py[i] = 2 * fy[i] - ay[i];
684
+ pz[i] = 2 * fz[i] - az[i];
685
+ }
412
686
 
413
- // 4. Self-advect velocity (semi-Lagrangian back-trace through the projected field).
414
- this.#prev_x.set(field.velocity_x);
415
- this.#prev_y.set(field.velocity_y);
416
- this.#prev_z.set(field.velocity_z);
687
+ // u′ = advect(û, u½, dt/2). Output aliases the carrier (the field's
688
+ // own velocity) — allowed, the carrier is point-read only.
689
+ this.#advect_velocity(field, res, half_dt, prev, fx, fy, fz);
417
690
 
418
- v3_grid_apply_advection_forward(
419
- [field.velocity_x, field.velocity_y, field.velocity_z],
420
- [this.#prev_x, this.#prev_y, this.#prev_z],
421
- res[0], res[1], res[2],
422
- time_delta,
423
- solid
424
- );
691
+ // u₁ = project(u′)
692
+ this.#project_with_current_mask(field);
693
+ } else {
694
+ // Stam reference sequence: project₁ (optional) → advect → project₂.
695
+ if (this.project_before_advection) {
696
+ this.#project_with_current_mask(field);
697
+ }
425
698
 
426
- // 5. Re-project after advection.
427
- this.project(field);
699
+ this.#prev_x.set(field.velocity_x);
700
+ this.#prev_y.set(field.velocity_y);
701
+ this.#prev_z.set(field.velocity_z);
702
+ this.#advect_velocity(field, res, time_delta, prev, this.#prev_x, this.#prev_y, this.#prev_z);
703
+
704
+ // Re-project after advection. Solids cannot have changed since the
705
+ // top-of-step mask refresh (only the simulator has touched the
706
+ // field), so the mask is still fresh.
707
+ this.#project_with_current_mask(field);
708
+ }
428
709
 
429
710
  // 6. Transport each passive scalar by the now-finalized velocity field.
430
711
  const scalars = field.getScalarAttributes();
@@ -443,13 +724,25 @@ export class FluidSimulator {
443
724
  }
444
725
 
445
726
  this.#scalar_scratch.set(attr.data);
446
- v3_grid_apply_scalar_advection(
447
- attr.data, this.#scalar_scratch,
448
- field.velocity_x, field.velocity_y, field.velocity_z,
449
- res[0], res[1], res[2],
450
- time_delta,
451
- solid
452
- );
727
+ if (this.advection_scheme === AdvectionScheme.MACCORMACK) {
728
+ // #diffusion_scratch is free here (the optional diffusion above
729
+ // has fully consumed it) — reuse it as the forward-pass buffer.
730
+ v3_grid_advect_maccormack_scalar(
731
+ attr.data, this.#scalar_scratch, this.#diffusion_scratch,
732
+ field.velocity_x, field.velocity_y, field.velocity_z,
733
+ res[0], res[1], res[2],
734
+ time_delta,
735
+ solid
736
+ );
737
+ } else {
738
+ v3_grid_apply_scalar_advection(
739
+ attr.data, this.#scalar_scratch,
740
+ field.velocity_x, field.velocity_y, field.velocity_z,
741
+ res[0], res[1], res[2],
742
+ time_delta,
743
+ solid
744
+ );
745
+ }
453
746
  }
454
747
  }
455
748
  }
@@ -0,0 +1,114 @@
1
+ # Fluid review 02 — quality-gated solver upgrades
2
+
3
+ Working doc for the staged execution of the 2026-06-12 fluid review. Each stage
4
+ must leave `quality.spec.js` green; when a stage improves a metric its baseline
5
+ is tightened in the same change. Constraints: single-core JS, real-time ECS,
6
+ public API of effectors + `FluidField` frozen (state shape may change).
7
+
8
+ ## Quality gate baselines (quality.spec.js)
9
+
10
+ | metric | stage 0 (baseline) | stage 1 | stage 2 | stage 3 | notes |
11
+ |---|---|---|---|---|---|
12
+ | projection linear residual, SOR | 1.21 | 1.21 | 0.67 | | RHS max\|div\| ≈ 14.5, 16³, 8 sweeps |
13
+ | projection linear residual, PCG | 3.34e-2 | 3.34e-2 | 1.16e-2 | | iteration-capped, not noise |
14
+ | cold post-div (operator floor) | 11.2 | 11.2 | 9.1 | | collocated floor — the MAC metric |
15
+ | warm post-div, SOR | 9.22 | 9.22 | **0.70** | **0.35** | open edges vent + reflection projects cleaner |
16
+ | warm post-div, PCG | 1.84 | 1.84 | **0.70** | **0.35** | tolerance exit: same quality, fewer iters |
17
+ | vortex KE retention (60 steps) | 0.498 | 0.498 | 0.495 | **0.527** | sealed-box scenario, default scheme |
18
+ | vortex peak-ω retention | 0.606 | 0.606 | 0.624 | **0.725** | reflection keeps swirl alive |
19
+ | wall penetration (seed 8) | 5.72 | 5.72 | 6.96 | 6.65 | collocated solid BC weakness — the MAC metric |
20
+ | scalar mass retention | 0.231 | 0.231 | **0.849** | 0.837 | real walls project consistently near boundary |
21
+ | diffusion wall leak | 16.9 | **0** | 0 | 0 | fixed: no-flux on both wall sides |
22
+ | sealed-box gravity max\|vy\| | 1.24 | 1.24 | 1.24 | **0.97** | semi-hydrostatic |
23
+ | checkerboard residual (10 steps) | 0.593 | 0.593 | 0.627 | 0.587 | projection-invisible null mode |
24
+ | damped gravity terminal \|v\| | — | — | 4.92 = analytic | 4.92 | bounded forcing (was unbounded growth) |
25
+ | ambient wind target tracking | — | — | 8.00/8 | 8.00/8 | AmbientWindFluidEffector holds target |
26
+ | step() 32×8×32 (ms) | 1.16 | | 1.44 | 1.10* | *SL+refl after stage-3 sampler fusion; stage-4 still owes SOR work |
27
+
28
+ Perf reference (review probe, this machine): step() 32×8×32 = 1.16 ms,
29
+ 32³ = 4.4 ms, 64³ = 54 ms. Division→reciprocal-table in SOR measured 14%
30
+ SLOWER in V8 — do not do it.
31
+
32
+ ## Stages
33
+
34
+ - [x] **Stage 0 — quality gate.** `quality.spec.js`: 8 deterministic scenarios,
35
+ baselines baked, runs by default (no timing). Deep sweeps stay in
36
+ `bench.spec.js`.
37
+ - [x] **Stage 1 — bug fixes.** (183 fluid tests green; quality gate unchanged
38
+ except the leak metric dropping to exactly 0.)
39
+ - Wake effector: trail advance moves out of `apply()` for transform-managed
40
+ effectors (multi-field contract).
41
+ - Diffusion: no-flux at solid neighbours (walls stop acting as
42
+ sources/sinks); neighbour mask recomputed once at top of `step()`.
43
+ - `FluidField.shift`: migrate the solid mask (zero-fill exposed cells)
44
+ instead of clearing it — removes the one-tick wall-less window after every
45
+ re-anchor shift.
46
+ - PCG: relative-tolerance early exit (cap unchanged).
47
+ - [x] **Stage 2 — boundary semantics + forcing stability.** (195 fluid tests
48
+ green. New `FluidField.pressure_diag` derived buffer carries the per-cell
49
+ Laplacian diagonal; mask kernel bakes both in one pass.)
50
+ - Domain edges are OPEN (ghost p = 0): out-of-bounds faces count in the
51
+ Laplacian diagonal and read zero pressure; solid faces stay reflecting
52
+ (Neumann). Sealed boxes are built explicitly with solid cells (see
53
+ `seal_box` in quality.spec.js).
54
+ - PCG null-space mean-subtraction made conditional — only for fully sealed
55
+ fields (open systems are non-singular; subtracting the mean there would
56
+ solve a different RHS). Disconnected sealed pockets remain a documented
57
+ limitation.
58
+ - `velocity_damping` knob on the simulator (exponential, default 0) — the
59
+ solver's only energy sink under sustained forcing; gives constant forces
60
+ a terminal velocity.
61
+ - New `AmbientWindFluidEffector` — relaxes toward a target wind velocity
62
+ instead of integrating constant acceleration (no unbounded accumulation;
63
+ frame-rate independent).
64
+ - [x] **Stage 3 — transport quality.** (213 tests green.)
65
+ - Fused 3-channel trilinear sampler (`scs3d_sample_linear3`); generalized
66
+ SL velocity kernel with separate carrier; MacCormack velocity + scalar
67
+ kernels with Selle's monotone limiter; `AdvectionScheme` enum;
68
+ `advection_reflection` step structure (Zehnder 2018, half-step form).
69
+ - **Measured scheme matrix** (sealed vortex, ke / peak-ω retention @ 1 s;
70
+ step ms @ 32×8×32):
71
+ | combo | ke | ω | ms | 10 s stability |
72
+ |---|---|---|---|---|
73
+ | SL (Stam baseline) | 0.495 | 0.624 | 0.92 | stable |
74
+ | **SL + reflection (DEFAULT)** | 0.527 | 0.725 | 1.10 | stable (peak 0.99) |
75
+ | MacCormack | 0.773 | 0.640 | 1.35 | **unstable** (peak 1.91) |
76
+ | MacCormack + reflection | 1.016 | 1.081 | 2.49 | **unstable** (peak 3.44) |
77
+ - **Key negative finding:** on the collocated grid, MacCormack's
78
+ anti-diffusive corrector amplifies the projection's operator-floor
79
+ residue — transient energy growth ×1.9–3.4 within 10 s, and passive
80
+ scalar total mass inflates ×1.8 in one second. Damping 0.2 does not tame
81
+ it. The kernels are correct in isolation (specs); the INTERACTION with
82
+ the collocated pressure floor is the problem. **MacCormack is therefore
83
+ default-off and gated on MAC staggering** — this is the strongest
84
+ argument yet for stage 5.
85
+ - Defaults: `advection_scheme = SEMI_LAGRANGIAN`,
86
+ `advection_reflection = true`. Reflection alone is a clean win: stable,
87
+ +20% step cost, warm steady-state divergence halves again (0.71 → 0.35),
88
+ sealed-gravity settles better (1.24 → 0.97).
89
+ - [ ] **Stage 4 — perf polish (bench-gated).**
90
+ - SOR interior fast path (mask == 63 branchless) — keep only if measured win.
91
+ - Optional vorticity-confinement knob (Fedkiw 2001), default off.
92
+ - [ ] **Stage 5 — MAC staggering decision.** Present quality deltas (operator
93
+ floor, wall penetration, checkerboard) + consumer impact; **user decides**
94
+ before any layout change (it alters how `velocity_*` arrays are interpreted
95
+ by external readers).
96
+
97
+ ## Review findings driving this (2026-06-12 session)
98
+
99
+ 1. WakeFluidEffector mutates trail state in `apply()` → second field in the
100
+ same step sees a zero segment (confirmed: A=240, B=0).
101
+ 2. `v3_grid_apply_diffusion` gathers from solid neighbours → dye leak 16.9/100
102
+ through a wall in one step (confirmed).
103
+ 3. `FluidSystem` re-anchor shifts clear solids, then step runs immediately —
104
+ one tick with no walls per cell crossing.
105
+ 4. Closed Neumann edges + one-sided boundary divergence: uniform body force
106
+ produces zero discrete divergence → projection never opposes it → velocity
107
+ grows without bound (confirmed: −5/−10/−15 over 30/60/90 steps). No damping
108
+ term exists anywhere.
109
+ 5. Collocated grid: compact Laplacian ≠ div∘grad → checkerboard null mode
110
+ (interior div exactly 0 for ±1 mode, confirmed) + operator floor (cold
111
+ post-div 11.2 of 14.5 even with exact linear solve).
112
+ 6. Advection backtrace samples through/inside solids.
113
+ 7. PCG always runs the full SOR-scaled iteration budget (no tolerance exit);
114
+ mean-subtraction assumes a single connected fluid component.
@@ -56,9 +56,10 @@ export class FluidComponent {
56
56
  /**
57
57
  * Half-cell extra margin (in cells) the Transform must cross before the field
58
58
  * re-quantizes to the next cell. Without it, a Transform jittering right on the
59
- * boundary between two cells would re-shift every frame, repeatedly clearing the
60
- * solid mask and patching velocity edges — visible as flicker in the fluid and
61
- * thrashing in any solid-voxelizer downstream of the shift.
59
+ * boundary between two cells would re-shift every frame, sloshing every buffer
60
+ * back and forth and re-extrapolating the exposed edges each time — visible as
61
+ * flicker in the fluid and thrashing in any solid-voxelizer downstream of the
62
+ * shift.
62
63
  *
63
64
  * Mechanism: the system keeps the current quantized cell `q` and only re-quantizes
64
65
  * when `|transform.position / cell_size - q| > 0.5 + hysteresis`. Crossing the
@@ -1 +1 @@
1
- {"version":3,"file":"FluidComponent.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidComponent.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAEI;;OAEG;IACH,OAFU,UAAU,CAEK;IAEzB;;;;;;;OAOG;IACH,QAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEf;IAEnB;;;;;;;;OAQG;IACH,QAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEf;IAEnB;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAFU,MAAM,CAEC;IAEjB;;;;OAIG;IACH,SAFU,OAAO,CAEF;IAEf;;;;;OAKG;IACH,UAFU,OAAO,CAEA;IAEjB;;;;;;;OAOG;IACH,iBANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAQhC;IAED;;;;;;;OAOG;IACH,iBANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAOhC;IAED;;;;;;;;;;;;;;OAcG;IACH,2BANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAQhC;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACL,MAAM,CAQjB;IAED;;;OAGG;IACH,cAHW,cAAc,GACb,OAAO,CAoBlB;IAED;;OAEG;IACH,QAFY,MAAM,CAgBjB;IAED;;;;;;;;OAQG;IACH,iCAYC;IAGL,0BAAyC;CAFxC;2BAzO0B,kBAAkB"}
1
+ {"version":3,"file":"FluidComponent.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidComponent.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAEI;;OAEG;IACH,OAFU,UAAU,CAEK;IAEzB;;;;;;;OAOG;IACH,QAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEf;IAEnB;;;;;;;;OAQG;IACH,QAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEf;IAEnB;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAFU,MAAM,CAEC;IAEjB;;;;OAIG;IACH,SAFU,OAAO,CAEF;IAEf;;;;;OAKG;IACH,UAFU,OAAO,CAEA;IAEjB;;;;;;;OAOG;IACH,iBANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAQhC;IAED;;;;;;;OAOG;IACH,iBANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAOhC;IAED;;;;;;;;;;;;;;OAcG;IACH,2BANW,YAAY,GAAC,MAAM,EAAE,MACrB,MAAM,MACN,MAAM,MACN,MAAM,GACL,YAAY,GAAC,MAAM,EAAE,CAQhC;IAED;;;;;;;OAOG;IACH,0BANW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACL,MAAM,CAQjB;IAED;;;OAGG;IACH,cAHW,cAAc,GACb,OAAO,CAoBlB;IAED;;OAEG;IACH,QAFY,MAAM,CAgBjB;IAED;;;;;;;;OAQG;IACH,iCAYC;IAGL,0BAAyC;CAFxC;2BA1O0B,kBAAkB"}
@@ -65,9 +65,10 @@ export class FluidComponent {
65
65
  /**
66
66
  * Half-cell extra margin (in cells) the Transform must cross before the field
67
67
  * re-quantizes to the next cell. Without it, a Transform jittering right on the
68
- * boundary between two cells would re-shift every frame, repeatedly clearing the
69
- * solid mask and patching velocity edges — visible as flicker in the fluid and
70
- * thrashing in any solid-voxelizer downstream of the shift.
68
+ * boundary between two cells would re-shift every frame, sloshing every buffer
69
+ * back and forth and re-extrapolating the exposed edges each time — visible as
70
+ * flicker in the fluid and thrashing in any solid-voxelizer downstream of the
71
+ * shift.
71
72
  *
72
73
  * Mechanism: the system keeps the current quantized cell `q` and only re-quantizes
73
74
  * when `|transform.position / cell_size - q| > 0.5 + hysteresis`. Crossing the
@@ -38,7 +38,7 @@ export class FluidSystem extends System<any, any, any, any, any> {
38
38
  * @param {FluidEffectorsComponent} effectors_component
39
39
  * @param {Transform} transform
40
40
  */
41
- static "__#139@#sync_effectors_from_transform"(effectors_component: FluidEffectorsComponent, transform: Transform): void;
41
+ static "__#141@#sync_effectors_from_transform"(effectors_component: FluidEffectorsComponent, transform: Transform): void;
42
42
  /**
43
43
  * Visitor for the (FluidComponent, Transform) traversal — keeps the field's
44
44
  * grid origin locked to a cell-aligned position near the transform.
@@ -61,7 +61,7 @@ export class FluidSystem extends System<any, any, any, any, any> {
61
61
  * @param {FluidComponent} component
62
62
  * @param {Transform} transform
63
63
  */
64
- static "__#139@#reanchor_field"(component: FluidComponent, transform: Transform): void;
64
+ static "__#141@#reanchor_field"(component: FluidComponent, transform: Transform): void;
65
65
  /**
66
66
  * Write the world-to-grid affine for a FluidComponent into `out`. Axis-aligned,
67
67
  * uniform-scale, so the matrix is sparse:
@@ -76,7 +76,7 @@ export class FluidSystem extends System<any, any, any, any, any> {
76
76
  * @param {Float32Array} out length-16
77
77
  * @param {FluidComponent} component
78
78
  */
79
- static "__#139@#build_world_to_grid"(out: Float32Array, component: FluidComponent): void;
79
+ static "__#141@#build_world_to_grid"(out: Float32Array, component: FluidComponent): void;
80
80
  constructor();
81
81
  dependencies: (typeof FluidComponent)[];
82
82
  /**