@woosh/meep-engine 2.156.0 → 2.158.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 (695) 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} +26 -8
  134. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -0
  135. package/src/{engine/physics/narrowphase/PosedShape.js → core/geom/3d/shape/PosedShape3D.js} +60 -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/ecs/trail2d/Trail2D.d.ts.map +1 -1
  250. package/src/engine/graphics/ecs/trail2d/Trail2D.js +21 -0
  251. package/src/engine/graphics/ecs/trail2d/Trail2DFlags.d.ts +1 -0
  252. package/src/engine/graphics/ecs/trail2d/Trail2DFlags.js +9 -1
  253. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.d.ts.map +1 -1
  254. package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +2 -76
  255. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.d.ts.map +1 -1
  256. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -427
  257. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts +1 -4
  258. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts.map +1 -1
  259. package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -6
  260. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
  261. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts +1 -8
  262. package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts.map +1 -1
  263. package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -14
  264. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +1 -11
  265. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +1 -1
  266. package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -46
  267. package/src/engine/graphics/sh3/prototypeSH3Probe.js +1 -1
  268. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +27 -0
  269. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -0
  270. package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -0
  271. package/src/engine/graphics/texture/isImageBitmap.d.ts +1 -6
  272. package/src/engine/graphics/texture/isImageBitmap.d.ts.map +1 -1
  273. package/src/engine/graphics/texture/isImageBitmap.js +2 -12
  274. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.d.ts +2 -2
  275. package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.d.ts.map +1 -0
  276. package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.js +55 -55
  277. package/src/engine/network/NetworkSession.d.ts +12 -1
  278. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  279. package/src/engine/network/NetworkSession.js +52 -1
  280. package/src/engine/network/README.md +45 -0
  281. package/src/engine/network/convertPathToURL.d.ts +1 -8
  282. package/src/engine/network/convertPathToURL.d.ts.map +1 -1
  283. package/src/engine/network/convertPathToURL.js +2 -107
  284. package/src/engine/network/core/quantize/quantize_float.d.ts.map +1 -1
  285. package/src/engine/network/core/quantize/quantize_float.js +7 -0
  286. package/src/engine/network/core/quantize/quantize_position.d.ts.map +1 -1
  287. package/src/engine/network/core/quantize/quantize_position.js +12 -1
  288. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  289. package/src/engine/network/orchestrator/NetworkPeer.js +15 -1
  290. package/src/engine/network/replication/Replicator.d.ts +8 -0
  291. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  292. package/src/engine/network/replication/Replicator.js +48 -0
  293. package/src/engine/network/transport/Channel.d.ts.map +1 -1
  294. package/src/engine/network/transport/Channel.js +46 -12
  295. package/src/engine/network/transport/ReliableCommandPipeline.d.ts +16 -0
  296. package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
  297. package/src/engine/network/transport/ReliableCommandPipeline.js +29 -0
  298. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  299. package/src/engine/network/transport/adapters/NodeUDPTransport.js +7 -1
  300. package/src/engine/network/transport/fragments/packet_size.d.ts +5 -5
  301. package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
  302. package/src/engine/network/transport/fragments/packet_size.js +5 -5
  303. package/src/engine/physics/BULLET_REVIEW.md +1 -1
  304. package/src/engine/physics/JOLT_REVIEW.md +2 -2
  305. package/src/engine/physics/PLAN.md +1094 -945
  306. package/src/engine/physics/RAPIER_REVIEW.md +2 -2
  307. package/src/engine/physics/body/BodyStorage.d.ts +2 -12
  308. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -1
  309. package/src/engine/physics/body/BodyStorage.js +406 -452
  310. package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
  311. package/src/engine/physics/body/SolverBodyState.js +12 -3
  312. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +28 -3
  313. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
  314. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +60 -24
  315. package/src/engine/physics/broadphase/generate_pairs.d.ts +9 -5
  316. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -1
  317. package/src/engine/physics/broadphase/generate_pairs.js +52 -37
  318. package/src/engine/physics/ccd/linear_sweep.d.ts +15 -5
  319. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  320. package/src/engine/physics/ccd/linear_sweep.js +122 -40
  321. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  322. package/src/engine/physics/constraint/solve_constraints.js +830 -805
  323. package/src/engine/physics/contact/ManifoldStore.d.ts +91 -16
  324. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
  325. package/src/engine/physics/contact/ManifoldStore.js +204 -60
  326. package/src/engine/physics/ecs/BodyKind.d.ts +7 -3
  327. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
  328. package/src/engine/physics/ecs/BodyKind.js +29 -25
  329. package/src/engine/physics/ecs/Collider.d.ts +7 -0
  330. package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
  331. package/src/engine/physics/ecs/Collider.js +7 -0
  332. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +1 -1
  333. package/src/engine/physics/ecs/PhysicsSystem.d.ts +110 -6
  334. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  335. package/src/engine/physics/ecs/PhysicsSystem.js +467 -45
  336. package/src/engine/physics/ecs/RigidBody.d.ts +20 -5
  337. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -1
  338. package/src/engine/physics/ecs/RigidBody.js +307 -286
  339. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +6 -3
  340. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -1
  341. package/src/engine/physics/ecs/RigidBodyFlags.js +31 -28
  342. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +12 -4
  343. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -1
  344. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +19 -5
  345. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts +10 -0
  346. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts.map +1 -0
  347. package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -0
  348. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts +28 -0
  349. package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts.map +1 -0
  350. package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -0
  351. package/src/engine/physics/events/ContactEventBuffer.d.ts +11 -0
  352. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -1
  353. package/src/engine/physics/events/ContactEventBuffer.js +40 -0
  354. package/src/engine/physics/events/diff_manifolds.d.ts +30 -13
  355. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -1
  356. package/src/engine/physics/events/diff_manifolds.js +87 -50
  357. package/src/engine/physics/fluid/FluidField.d.ts +98 -26
  358. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  359. package/src/engine/physics/fluid/FluidField.js +684 -570
  360. package/src/engine/physics/fluid/FluidSimulator.d.ts +157 -6
  361. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  362. package/src/engine/physics/fluid/FluidSimulator.js +450 -83
  363. package/src/engine/physics/fluid/REVIEW_02_PLAN.md +243 -0
  364. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +4 -3
  365. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  366. package/src/engine/physics/fluid/ecs/FluidComponent.js +4 -3
  367. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +72 -0
  368. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -0
  369. package/src/engine/physics/fluid/ecs/FluidObstacle.js +97 -0
  370. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +117 -0
  371. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -0
  372. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +348 -0
  373. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  374. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +62 -12
  375. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  376. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +135 -38
  377. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  378. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +85 -38
  379. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +27 -8
  380. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  381. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +171 -68
  382. package/src/engine/physics/fluid/prototype.js +25 -1
  383. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts +42 -0
  384. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts.map +1 -0
  385. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +136 -0
  386. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts +37 -0
  387. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -0
  388. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +169 -0
  389. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts +36 -0
  390. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -0
  391. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +100 -0
  392. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +6 -0
  393. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  394. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +6 -0
  395. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +7 -2
  396. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  397. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +17 -12
  398. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts +42 -0
  399. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -0
  400. package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -0
  401. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +32 -22
  402. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -1
  403. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +43 -26
  404. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts +31 -0
  405. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts.map +1 -0
  406. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -0
  407. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +30 -0
  408. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -0
  409. package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +92 -0
  410. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +26 -19
  411. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -1
  412. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +46 -42
  413. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +38 -10
  414. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -1
  415. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +158 -75
  416. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +22 -17
  417. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
  418. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -96
  419. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.d.ts +42 -0
  420. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.d.ts.map +1 -0
  421. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +319 -0
  422. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts +53 -0
  423. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -0
  424. package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +236 -0
  425. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts +46 -0
  426. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -0
  427. package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +217 -0
  428. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.d.ts +40 -0
  429. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.d.ts.map +1 -0
  430. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.js +165 -0
  431. package/src/engine/physics/fluid/solver/v3_mac_clip_trace.d.ts +44 -0
  432. package/src/engine/physics/fluid/solver/v3_mac_clip_trace.d.ts.map +1 -0
  433. package/src/engine/physics/fluid/solver/v3_mac_clip_trace.js +95 -0
  434. package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.d.ts +38 -0
  435. package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.d.ts.map +1 -0
  436. package/src/engine/physics/fluid/solver/v3_mac_compute_divergence.js +77 -0
  437. package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.d.ts +52 -0
  438. package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.d.ts.map +1 -0
  439. package/src/engine/physics/fluid/solver/v3_mac_compute_face_solid.js +131 -0
  440. package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.d.ts +38 -0
  441. package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.d.ts.map +1 -0
  442. package/src/engine/physics/fluid/solver/v3_mac_subtract_pressure_gradient.js +104 -0
  443. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +30 -1
  444. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
  445. package/src/engine/physics/inertia/world_inverse_inertia.js +160 -116
  446. package/src/engine/physics/integration/integrate_position.js +97 -97
  447. package/src/engine/physics/island/IslandBuilder.d.ts +49 -8
  448. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
  449. package/src/engine/physics/island/IslandBuilder.js +93 -14
  450. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
  451. package/src/engine/physics/narrowphase/box_box_manifold.js +683 -673
  452. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
  453. package/src/engine/physics/narrowphase/box_triangle_contact.js +899 -749
  454. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +27 -0
  455. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  456. package/src/engine/physics/narrowphase/capsule_contacts.js +624 -459
  457. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
  458. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +58 -38
  459. package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
  460. package/src/engine/physics/narrowphase/compute_penetration.js +369 -325
  461. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +3 -1
  462. package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
  463. package/src/engine/physics/narrowphase/convex_convex_manifold.js +568 -422
  464. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +6 -3
  465. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
  466. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +66 -10
  467. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +4 -1
  468. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
  469. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +97 -94
  470. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
  471. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  472. package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1739
  473. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +14 -7
  474. package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
  475. package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -69
  476. package/src/engine/physics/persistence/solver_caches.d.ts +20 -0
  477. package/src/engine/physics/persistence/solver_caches.d.ts.map +1 -0
  478. package/src/engine/physics/persistence/solver_caches.js +309 -0
  479. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  480. package/src/engine/physics/queries/overlap_shape.js +187 -184
  481. package/src/engine/physics/queries/raycast.d.ts +3 -2
  482. package/src/engine/physics/queries/raycast.d.ts.map +1 -1
  483. package/src/engine/physics/queries/raycast.js +37 -11
  484. package/src/engine/physics/queries/shape_cast.d.ts +18 -5
  485. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  486. package/src/engine/physics/queries/shape_cast.js +417 -393
  487. package/src/engine/physics/solver/solve_contacts.d.ts +22 -6
  488. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  489. package/src/engine/physics/solver/solve_contacts.js +1482 -1338
  490. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  491. package/src/engine/physics/vehicle/RaycastVehicle.js +344 -339
  492. package/src/engine/ui/DraggableAspect.d.ts +12 -3
  493. package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
  494. package/src/engine/ui/DraggableAspect.js +115 -83
  495. package/src/generation/COORDINATES.md +54 -0
  496. package/src/generation/GridTaskGroup.js +2 -2
  497. package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -0
  498. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts +9 -1
  499. package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts.map +1 -1
  500. package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -59
  501. package/src/generation/automata/CellularAutomata.d.ts +6 -3
  502. package/src/generation/automata/CellularAutomata.d.ts.map +1 -1
  503. package/src/generation/automata/CellularAutomata.js +22 -19
  504. package/src/generation/filtering/CellFilter.d.ts +17 -0
  505. package/src/generation/filtering/CellFilter.d.ts.map +1 -1
  506. package/src/generation/filtering/CellFilter.js +117 -77
  507. package/src/generation/filtering/CellFilterCellMatcher.d.ts.map +1 -1
  508. package/src/generation/filtering/CellFilterCellMatcher.js +2 -0
  509. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts +5 -0
  510. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts.map +1 -1
  511. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +15 -0
  512. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts +0 -1
  513. package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts.map +1 -1
  514. package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -50
  515. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts +0 -1
  516. package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts.map +1 -1
  517. package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -59
  518. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts +0 -1
  519. package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts.map +1 -1
  520. package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -33
  521. package/src/generation/filtering/numeric/CellFilterCache.d.ts +1 -0
  522. package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
  523. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts +3 -2
  524. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts.map +1 -1
  525. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +9 -35
  526. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts +0 -1
  527. package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts.map +1 -1
  528. package/src/generation/filtering/numeric/complex/CellFilterCurvature.js +19 -43
  529. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts +0 -1
  530. package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts.map +1 -1
  531. package/src/generation/filtering/numeric/complex/CellFilterFXAA.js +2 -6
  532. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.d.ts.map +1 -1
  533. package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +9 -12
  534. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.d.ts.map +1 -1
  535. package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +2 -1
  536. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts +0 -1
  537. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts.map +1 -1
  538. package/src/generation/filtering/numeric/complex/CellFilterSobel.js +2 -6
  539. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts +5 -4
  540. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts.map +1 -1
  541. package/src/generation/filtering/numeric/math/CellFilterInverseLerp.js +5 -4
  542. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts +17 -0
  543. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts.map +1 -0
  544. package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -0
  545. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.d.ts.map +1 -1
  546. package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +7 -1
  547. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.d.ts.map +1 -1
  548. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +7 -10
  549. package/src/generation/filtering/numeric/util/sampler_from_filter.d.ts.map +1 -1
  550. package/src/generation/filtering/numeric/util/sampler_from_filter.js +2 -1
  551. package/src/generation/grid/GridData.d.ts.map +1 -1
  552. package/src/generation/grid/GridData.js +14 -1
  553. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts +10 -3
  554. package/src/generation/grid/actions/ContinuousGridCellAction.d.ts.map +1 -1
  555. package/src/generation/grid/actions/ContinuousGridCellAction.js +18 -3
  556. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts +11 -1
  557. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts.map +1 -1
  558. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.js +13 -3
  559. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +1 -1
  560. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +2 -2
  561. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts +1 -1
  562. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
  563. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +4 -6
  564. package/src/generation/grid/coords/grid_to_texel.d.ts +9 -0
  565. package/src/generation/grid/coords/grid_to_texel.d.ts.map +1 -0
  566. package/src/generation/grid/coords/grid_to_texel.js +10 -0
  567. package/src/generation/grid/coords/texel_to_grid.d.ts +9 -0
  568. package/src/generation/grid/coords/texel_to_grid.d.ts.map +1 -0
  569. package/src/generation/grid/coords/texel_to_grid.js +10 -0
  570. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts +2 -2
  571. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts.map +1 -1
  572. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +10 -6
  573. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  574. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +20 -21
  575. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts +7 -0
  576. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts.map +1 -1
  577. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +18 -10
  578. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.d.ts.map +1 -1
  579. package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +16 -7
  580. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts +5 -3
  581. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts.map +1 -1
  582. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +26 -23
  583. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.d.ts.map +1 -1
  584. package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +10 -1
  585. package/src/generation/grid/generation/grid/select/CellSupplierBestN.d.ts.map +1 -1
  586. package/src/generation/grid/generation/grid/select/CellSupplierBestN.js +4 -0
  587. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts +15 -8
  588. package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
  589. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +89 -92
  590. package/src/generation/markers/GridActionRuleSet.d.ts.map +1 -1
  591. package/src/generation/markers/GridActionRuleSet.js +10 -2
  592. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +11 -0
  593. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  594. package/src/generation/markers/GridCellActionPlaceMarker.js +20 -3
  595. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +3 -1
  596. package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
  597. package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +9 -2
  598. package/src/generation/markers/MarkerNode.d.ts +8 -3
  599. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  600. package/src/generation/markers/MarkerNode.js +12 -5
  601. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
  602. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts +1 -1
  603. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts.map +1 -1
  604. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.js +1 -1
  605. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts +1 -1
  606. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts.map +1 -1
  607. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  608. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts +1 -1
  609. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  610. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +2 -2
  611. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts +1 -1
  612. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts.map +1 -1
  613. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.js +2 -2
  614. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
  615. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.js +6 -4
  616. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.d.ts.map +1 -1
  617. package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.js +1 -3
  618. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.d.ts.map +1 -1
  619. package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +12 -11
  620. package/src/generation/markers/matcher/MarkerNodeMatcherAnd.js +2 -2
  621. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts +4 -1
  622. package/src/generation/markers/transform/MarkerNodeTransformer.d.ts.map +1 -1
  623. package/src/generation/markers/transform/MarkerNodeTransformer.js +4 -1
  624. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  625. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +1 -3
  626. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts +5 -0
  627. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  628. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +15 -0
  629. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.d.ts.map +1 -1
  630. package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.js +1 -3
  631. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  632. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +2 -4
  633. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  634. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +1 -3
  635. package/src/generation/placement/GridCellPlacementRule.d.ts.map +1 -1
  636. package/src/generation/placement/GridCellPlacementRule.js +1 -3
  637. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
  638. package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -10
  639. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.d.ts.map +1 -1
  640. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +6 -4
  641. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.d.ts.map +1 -1
  642. package/src/generation/placement/action/random/weighted/WeightedGridCellAction.js +1 -3
  643. package/src/generation/rules/CellMatcher.d.ts +3 -1
  644. package/src/generation/rules/CellMatcher.d.ts.map +1 -1
  645. package/src/generation/rules/CellMatcher.js +3 -1
  646. package/src/generation/rules/CellMatcherFromFilter.d.ts.map +1 -1
  647. package/src/generation/rules/CellMatcherFromFilter.js +1 -3
  648. package/src/generation/rules/CellMatcherLayerBitMaskTest.d.ts.map +1 -1
  649. package/src/generation/rules/CellMatcherLayerBitMaskTest.js +6 -20
  650. package/src/generation/test_support/executeTaskTreeSync.d.ts +9 -0
  651. package/src/generation/test_support/executeTaskTreeSync.d.ts.map +1 -0
  652. package/src/generation/test_support/executeTaskTreeSync.js +78 -0
  653. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts +2 -1
  654. package/src/generation/theme/TerrainLayerRuleAggregator.d.ts.map +1 -1
  655. package/src/generation/theme/TerrainLayerRuleAggregator.js +9 -6
  656. package/src/generation/theme/Theme.d.ts +1 -1
  657. package/src/generation/theme/Theme.d.ts.map +1 -1
  658. package/src/generation/theme/Theme.js +2 -2
  659. package/src/generation/theme/ThemeEngine.d.ts +3 -3
  660. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  661. package/src/generation/theme/ThemeEngine.js +26 -16
  662. package/src/generation/theme/cell/CellProcessingRule.d.ts +3 -3
  663. package/src/generation/theme/cell/CellProcessingRule.d.ts.map +1 -1
  664. package/src/generation/theme/cell/CellProcessingRule.js +6 -10
  665. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts +1 -1
  666. package/src/generation/theme/cell/CellProcessingRuleSet.d.ts.map +1 -1
  667. package/src/generation/theme/cell/CellProcessingRuleSet.js +2 -2
  668. package/src/view/common/ListView.js +1 -1
  669. package/src/view/elements/BottomLeftResizeHandleView.d.ts.map +1 -1
  670. package/src/view/elements/BottomLeftResizeHandleView.js +13 -5
  671. package/src/core/font/FontAsset.d.ts.map +0 -1
  672. package/src/core/font/FontAssetLoader.d.ts.map +0 -1
  673. package/src/core/geom/3d/shape/util/shape_to_visual_entity.d.ts.map +0 -1
  674. package/src/core/geom/3d/tetrahedra/visualize_tetrahedral_mesh.d.ts.map +0 -1
  675. package/src/core/process/action/AsynchronousDelayAction.d.ts.map +0 -1
  676. package/src/engine/physics/computeInterceptPoint.d.ts.map +0 -1
  677. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +0 -1
  678. package/src/engine/physics/gjk/gjk.d.ts.map +0 -1
  679. package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +0 -1
  680. package/src/engine/physics/gjk/minkowski_support.d.ts.map +0 -1
  681. package/src/engine/physics/gjk/mpr.d.ts.map +0 -1
  682. package/src/engine/physics/integration/quat_integrate.d.ts.map +0 -1
  683. package/src/engine/physics/island/union_find.d.ts.map +0 -1
  684. package/src/engine/physics/narrowphase/PosedShape.d.ts.map +0 -1
  685. package/src/engine/physics/narrowphase/clip_against_axis_uv.d.ts.map +0 -1
  686. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +0 -1
  687. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts +0 -21
  688. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts.map +0 -1
  689. package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +0 -68
  690. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts +0 -10
  691. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts.map +0 -1
  692. package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.js +0 -17
  693. /package/src/{engine/physics → core/geom/3d}/gjk/NOTES.md +0 -0
  694. /package/src/{engine/physics → core/geom/3d}/gjk/gjk.d.ts +0 -0
  695. /package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.d.ts +0 -0
@@ -0,0 +1,243 @@
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 2 | stage 3+4 | **stage 5 (MAC)** | notes |
11
+ |---|---|---|---|---|---|
12
+ | projection linear residual, SOR | 1.21 | 0.67 | 0.67 | 0.92 | 8 sweeps @ 16³; RHS grew 14.5→17.8 with face differencing |
13
+ | projection linear residual, PCG | 3.34e-2 | 1.16e-2 | 1.16e-2 | 1.39e-2 | iteration/tolerance-capped |
14
+ | cold post-div | 11.2 | 9.1 | 9.1 | **0.91 / 1.4e-2** | SOR / PCG. Now EQUALS the linear residual: D∘G ≡ L, the operator floor is gone |
15
+ | warm post-div, SOR | 9.22 | 0.70 | 0.35 | **9.6e-3** | 1000× vs stage 0 |
16
+ | warm post-div, PCG | 1.84 | 0.70 | 0.35 | **3.1e-5** | |
17
+ | vortex KE retention (60 steps) | 0.498 | 0.495 | 0.527 | 0.530 | sealed box, default SL+reflection |
18
+ | vortex peak-ω retention | 0.606 | 0.624 | 0.725 | **0.736** | |
19
+ | wall penetration (seed 8) | 5.72 | 6.96 | 6.65 | **0 (exact)** | MAC pins wall-face normal velocity outright |
20
+ | scalar mass retention | 0.231 | 0.849 | 0.837 | 0.818 | residual loss = gather SL + traces through the shell |
21
+ | diffusion wall leak | 16.9 | 0 | 0 | 0 | stage-1 fix holds |
22
+ | sealed-box gravity max\|vy\| | 1.24 | 1.24 | 0.97 | **0.070** | near-exact hydrostatic balance |
23
+ | checkerboard residual (10 steps) | 0.593 | 0.627 | 0.587 | **0.058** | pure compressive mode; collocated was blind to it |
24
+ | damped gravity terminal \|v\| | — | 4.92 = analytic | 4.92 | 4.92 | bounded forcing (was unbounded growth) |
25
+ | atmosphere terminal velocity | — | 8.00/8 | 8.00/8 | (8.00, −5.00) = analytic | GlobalFluidEffector wind+force+drag holds `wind + force/drag` exactly |
26
+ | step() 32×8×32 / 32³ / 64³ (ms) | 1.16 / 4.38 / 54.0 | 1.44 / 5.11 / — | 1.25 / 3.91 / 42.7 | 2.56 / 7.39 / 68.5 | MAC ≈ 2× collocated: 3 lattices + cross-component carriers; levers listed under follow-ups |
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 ambient-wind drive — relaxes toward a target wind velocity instead of
62
+ integrating constant acceleration (no unbounded accumulation; frame-rate
63
+ independent). Shipped first as a separate `AmbientWindFluidEffector`,
64
+ later UNIFIED into `GlobalFluidEffector` as the `wind` + `drag` fields of
65
+ the atmosphere model `dv/dt = force + drag·(wind − v)` (exact-ODE
66
+ integrator, terminal velocity `wind + force/drag`) — one global effector
67
+ instead of two competing ones.
68
+ - [x] **Stage 3 — transport quality.** (213 tests green.)
69
+ - Fused 3-channel trilinear sampler (`scs3d_sample_linear3`); generalized
70
+ SL velocity kernel with separate carrier; MacCormack velocity + scalar
71
+ kernels with Selle's monotone limiter; `AdvectionScheme` enum;
72
+ `advection_reflection` step structure (Zehnder 2018, half-step form).
73
+ - **Measured scheme matrix** (sealed vortex, ke / peak-ω retention @ 1 s;
74
+ step ms @ 32×8×32):
75
+ | combo | ke | ω | ms | 10 s stability |
76
+ |---|---|---|---|---|
77
+ | SL (Stam baseline) | 0.495 | 0.624 | 0.92 | stable |
78
+ | **SL + reflection (DEFAULT)** | 0.527 | 0.725 | 1.10 | stable (peak 0.99) |
79
+ | MacCormack | 0.773 | 0.640 | 1.35 | **unstable** (peak 1.91) |
80
+ | MacCormack + reflection | 1.016 | 1.081 | 2.49 | **unstable** (peak 3.44) |
81
+ - **Key negative finding:** on the collocated grid, MacCormack's
82
+ anti-diffusive corrector amplifies the projection's operator-floor
83
+ residue — transient energy growth ×1.9–3.4 within 10 s, and passive
84
+ scalar total mass inflates ×1.8 in one second. Damping 0.2 does not tame
85
+ it. The kernels are correct in isolation (specs); the INTERACTION with
86
+ the collocated pressure floor is the problem. **MacCormack is therefore
87
+ default-off and gated on MAC staggering** — this is the strongest
88
+ argument yet for stage 5.
89
+ - Defaults: `advection_scheme = SEMI_LAGRANGIAN`,
90
+ `advection_reflection = true`. Reflection alone is a clean win: stable,
91
+ +20% step cost, warm steady-state divergence halves again (0.71 → 0.35),
92
+ sealed-gravity settles better (1.24 → 0.97).
93
+ - [x] **Stage 4 — perf polish (bench-gated).** (219 tests green; quality gate
94
+ bit-identical.)
95
+ - SOR interior fast path (`mask === 63` → branch-free constant-diagonal
96
+ body, no diag read): measured **37% faster** per solve at 64³, noise-level
97
+ at 32×8×32, bit-identical results. Adopted.
98
+ - Rejected by measurement (stage-0 probe): division → reciprocal-table in
99
+ the SOR update was 14% SLOWER in V8. Recorded so nobody retries it.
100
+ - `vorticity_confinement` knob (Fedkiw 2001), default off — two O(N) passes
101
+ on existing scratch when enabled; pairs with `velocity_damping`.
102
+ - Final step() medians (this machine): 32×8×32 = 1.25 ms, 32³ = 3.91 ms,
103
+ 64³ = 42.7 ms — at 32³ and up faster than the stage-0 baseline despite
104
+ reflection being on.
105
+ - [x] **Stage 5 — MAC staggering migration (user-approved).** 223 tests green.
106
+ - Layout: `velocity_x/y/z` are face lattices ((rx+1)·ry·rz etc.); new derived
107
+ `face_solid_x/y/z` pin masks (either adjacent cell solid → face velocity is
108
+ a boundary condition). `setVelocityAt`/`addVelocityAt` write both faces per
109
+ axis; `sampleVelocity` interpolates per staggered lattice. Public
110
+ signatures unchanged.
111
+ - Kernels: new `v3_mac_*` divergence / gradient / SL + MacCormack advection
112
+ (velocity + scalar) / face-solid / vorticity confinement. The pressure
113
+ solvers and the mask/diag builder needed ZERO changes — stage 2's
114
+ open-boundary diagonal already was the MAC system. The legacy `v3_grid_*`
115
+ collocated kernels remain as standalone utilities with their specs.
116
+ - Exactness confirmed by the gate: cold post-divergence == linear residual
117
+ (D∘G ≡ L); wall-face penetration exactly 0; hydrostatic balance to 0.07;
118
+ the compressive checkerboard is annihilated (0.59 → 0.058).
119
+ - Scheme matrix on MAC: MC velocity is now long-horizon STABLE (10 s peak
120
+ 0.96 vs collocated 1.9×), but (a) MC+reflection still pumps (3.6×) and
121
+ (b) MC SCALAR transport still inflates mass ~1.7× — back-traces sample
122
+ through solid walls and the corrector amplifies the bleed. Defaults stay
123
+ SL + reflection; MacCormack documented opt-in.
124
+ - Perf: 2.56 / 7.39 / 68.5 ms at 32×8×32 / 32³ / 64³ (~2× collocated). The
125
+ SL kernel's cross-component carrier reconstruction was optimized from
126
+ general trilinear to the exact fixed 4-tap MAC average (−31..39% step),
127
+ pinned by a trilinear-reference equivalence spec.
128
+
129
+ ## Phase A (post-MAC) — solid-aware traces + MacCormack default. DONE.
130
+
131
+ - Back-traces (and MacCormack probes) are CLIPPED against solid cells
132
+ (`v3_mac_clip_trace`, bisection); scalar samples are solid-MASKED with
133
+ weight renormalization (`v3_grid_sample_scalar_masked`). Kills momentum
134
+ tunnelling through thin walls (spec-pinned) and wall dye bleed.
135
+ - **Negative finding, gate-corrected:** MacCormack SCALAR mass inflation
136
+ (1.71×) was NOT wall sampling — bit-identical before/after the fix. It is
137
+ the corrector re-adding ~double the gather bias: intrinsic
138
+ non-conservation. Scalars are therefore ALWAYS semi-Lagrangian
139
+ (hard-coded; `advection_scheme` selects the VELOCITY scheme only).
140
+ - MC + reflection re-probed WITH clipping: still pumps (10 s peak 3.7×) —
141
+ intrinsic to the pairing, stays barred.
142
+ - **Defaults: `advection_scheme = MACCORMACK` (velocity),
143
+ `advection_reflection = false`.** Gate: vortex KE retention 0.53 → 0.80
144
+ on the default path; sealed gravity 0.070 → 0.047; warm divergence
145
+ settles at 2.96e-2 / 2.8e-4 (SOR/PCG — one mid-step projection fewer than
146
+ SL+refl's 9.6e-3 / 3.1e-5; still ~300× below pre-MAC).
147
+ - **Perf lesson (measured 8.6×!):** V8 refuses to inline loop-bearing
148
+ callees — calling `v3_mac_clip_trace` per face made the SL kernel 8.6×
149
+ slower. Hot kernels now inline the straight-line "end cell solid?" test
150
+ and call the bisection helper only on wall hits (performance contract
151
+ documented on the helper). Final step(): MC default 2.74 ms @ 32×8×32 /
152
+ 10.4 ms @ 32³; SL+refl 1.97 / 7.35.
153
+
154
+ ## Phase B — FluidObstacleSystem. DONE.
155
+
156
+ - `FluidObstacle` component (inflation knob) + `FluidObstacleSystem`:
157
+ voxelizes each (FluidObstacle, Collider, Transform) entity's shape into
158
+ every overlapping FluidComponent's solid mask per tick, via
159
+ `PosedShape3D.signed_distance_at_point` (new posed point queries on
160
+ PosedShape3D, spec'd). Rigid pose — Transform.scale ignored, matching the
161
+ physics collider convention. Cell solid iff sdf(centre) <= inflation;
162
+ iteration clipped to the shape AABB.
163
+ - Ownership contract: with >= 1 obstacle the system clears + rebuilds EVERY
164
+ field's mask each tick (moving obstacles leave no stale walls); with none
165
+ it touches nothing. Register BEFORE FluidSystem.
166
+ - 8 system tests incl. rotation, inflation-for-thin-walls, origin offset,
167
+ broad-phase, and a same-tick FluidSystem integration check.
168
+
169
+ ## Phase C — moving-solid face velocity BCs. DONE.
170
+
171
+ - **Pinned faces are the wall's normal-velocity BC**, not dead storage:
172
+ - `v3_mac_compute_face_solid` takes the velocity arrays and zeroes a face
173
+ only on the unpinned→pinned TRANSITION (static-wall default).
174
+ Pinned→pinned recomputes preserve the stored BC; pinned→unpinned keeps
175
+ the wall velocity behind as the uncovered fluid's wake seed. Spec'd
176
+ (`v3_mac_compute_face_solid.spec.js`).
177
+ - `v3_mac_compute_divergence` reads pinned faces at face value (the
178
+ face_solid params are gone) — this is the entire transmission mechanism:
179
+ a stamped wall face shows up as inflow/outflow in the adjacent fluid
180
+ cell and the projection does the rest.
181
+ - The pressure gradient, advection, damping and effectors all SKIP pinned
182
+ faces, so a stamped BC survives the whole step bit-exactly (asserted in
183
+ quality 8).
184
+ - `FluidObstacleSystem` second pass: per obstacle, the wall velocity is
185
+ **`RigidBody.linearVelocity`** (world m/s — the obstacle tuple is the full
186
+ physics tuple FluidObstacle+Collider+RigidBody+Transform); cells it
187
+ voxelized get all six face slots stamped with the grid-units velocity.
188
+ The system refreshes each field's masks BEFORE stamping so the transition
189
+ zeroing is consumed there and the stamped values stick through the
190
+ simulator's own per-step refresh.
191
+ - **Velocity source rationale** (replaced the initial Transform-delta
192
+ finite difference in the same session): pose differencing turns teleports
193
+ (spawn snaps, network corrections) into one-tick air detonations — the
194
+ exact failure mode BodyKind.KinematicPosition was deferred over in the
195
+ contact solver. Reading the body instead: air and contacts agree on wall
196
+ speed, first tick stamps (no `_prev` warm-up), no system-private pose
197
+ state to lose on snapshot restore, sleeping bodies stamp nothing (solver
198
+ zeroes velocities on sleep), and `angularVelocity` sits ready for the
199
+ ω×r follow-up. Pose-animated colliders read as stationary walls that
200
+ teleport — for air just as for contacts; movers go through
201
+ KinematicVelocity/Dynamic. Teleport spec pins the no-blast contract.
202
+ - **Stop transition**: a wall that stops must stamp ONE more pass (zeros)
203
+ over its faces — pinned values persist by design, so without it the
204
+ divergence sees phantom inflow forever (`_was_moving` flag; obstacles
205
+ that never move never pay). Piston spec covers move → push → stop.
206
+ - Rotation-induced surface velocity (ω × r) is NOT modelled — a spinner
207
+ reads as a translating wall only (documented on the system).
208
+ - Ordering contract: PhysicsSystem → FluidObstacleSystem → FluidSystem.
209
+ - Gate: scenario 8 (piston slab, faces stamped +4, 10 steps) — mean u ahead
210
+ 2.08 baked, wake side 2.60 sign-checked; BC face value asserted == 4
211
+ after 10 steps. Static scenarios all unchanged.
212
+
213
+ ## Follow-ups (ordered by leverage)
214
+
215
+ 1. **Obstacle voxelization change detection** — static scenes currently pay
216
+ the full clear+rebuild every tick.
217
+ 2. **MC + reflection** — only via the second-order advection-reflection
218
+ formulation (Narain et al. 2019, implicit-midpoint form); the naive
219
+ pairing re-injects corrector overshoots (3.7×, with or without clipping).
220
+ 3. **bench.spec.js MAC refresh** — the `.skip` suites run, but the
221
+ per-primitive sections still measure the legacy collocated kernels.
222
+ 4. **ω × r surface velocity for rotating obstacles** — needs per-cell wall
223
+ velocity instead of one translation vector per obstacle; same stamping
224
+ machinery, finer-grained source.
225
+
226
+ ## Review findings driving this (2026-06-12 session)
227
+
228
+ 1. WakeFluidEffector mutates trail state in `apply()` → second field in the
229
+ same step sees a zero segment (confirmed: A=240, B=0).
230
+ 2. `v3_grid_apply_diffusion` gathers from solid neighbours → dye leak 16.9/100
231
+ through a wall in one step (confirmed).
232
+ 3. `FluidSystem` re-anchor shifts clear solids, then step runs immediately —
233
+ one tick with no walls per cell crossing.
234
+ 4. Closed Neumann edges + one-sided boundary divergence: uniform body force
235
+ produces zero discrete divergence → projection never opposes it → velocity
236
+ grows without bound (confirmed: −5/−10/−15 over 30/60/90 steps). No damping
237
+ term exists anywhere.
238
+ 5. Collocated grid: compact Laplacian ≠ div∘grad → checkerboard null mode
239
+ (interior div exactly 0 for ±1 mode, confirmed) + operator floor (cold
240
+ post-div 11.2 of 14.5 even with exact linear solve).
241
+ 6. Advection backtrace samples through/inside solids.
242
+ 7. PCG always runs the full SOR-scaled iteration budget (no tolerance exit);
243
+ 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
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Marks an entity's {@link Collider} as a fluid obstacle: each fixed update,
3
+ * {@link FluidObstacleSystem} voxelizes the collider's shape (via its signed
4
+ * distance function, under the entity's rigid `Transform` pose) into the solid
5
+ * mask of every overlapping {@link FluidComponent}, and stamps the entity's
6
+ * {@link RigidBody} velocity onto the wall faces as the moving-wall boundary
7
+ * condition. Wind stops at — and is pushed by — the bodies the physics
8
+ * already knows about; no separate fluid geometry to author.
9
+ *
10
+ * Requirements on the entity (the same tuple {@link PhysicsSystem} uses, so
11
+ * any physical body qualifies as-is):
12
+ * - a `Collider` whose shape implements
13
+ * {@link AbstractShape3D#signed_distance_at_point} (all analytic
14
+ * primitives do; mesh-ish shapes that don't will throw at voxelization),
15
+ * - a `RigidBody` — the wall-velocity source (see the system doc for the
16
+ * exact semantics). Static walls use `BodyKind.Static` as usual.
17
+ * - a `Transform` for the world pose. Following the collider convention,
18
+ * the pose is RIGID — `Transform.scale` is ignored, exactly as the
19
+ * physics narrowphase ignores it.
20
+ *
21
+ * Entities missing any part of the tuple are not obstacles and are skipped —
22
+ * standard ECS tuple semantics, nothing throws.
23
+ *
24
+ * This component is pure data; the behaviour lives on the system.
25
+ */
26
+ export class FluidObstacle {
27
+ /**
28
+ * Voxelization threshold in WORLD units: a fluid cell becomes solid when
29
+ * the signed distance from its centre to the shape is `<= inflation`.
30
+ *
31
+ * `0` (default) marks exactly the cells whose centres lie inside the
32
+ * shape. Positive values grow the voxel footprint outward — useful for
33
+ * thin obstacles that would otherwise slip between cell centres (a wall
34
+ * thinner than one cell needs `inflation >= cell_size / 2` to voxelize
35
+ * reliably), or to give the fluid a safety margin around fast movers.
36
+ * Negative values shrink it.
37
+ *
38
+ * @type {number}
39
+ */
40
+ inflation: number;
41
+ /**
42
+ * True when the previous tick stamped a non-zero wall velocity. A body
43
+ * that stops (or sleeps — the solver zeroes velocities on sleep) must
44
+ * stamp once more with zeros to clear its stale moving BC, because
45
+ * pinned faces preserve their values across mask recomputes by design.
46
+ * System-private.
47
+ * @type {boolean}
48
+ */
49
+ _was_moving: boolean;
50
+ /**
51
+ * @param {FluidObstacle} other
52
+ * @return {boolean}
53
+ */
54
+ equals(other: FluidObstacle): boolean;
55
+ /**
56
+ * @return {number}
57
+ */
58
+ hash(): number;
59
+ toJSON(): {
60
+ inflation: number;
61
+ };
62
+ fromJSON(json: any): void;
63
+ /**
64
+ * @readonly
65
+ * @type {boolean}
66
+ */
67
+ readonly isFluidObstacle: boolean;
68
+ }
69
+ export namespace FluidObstacle {
70
+ let typeName: string;
71
+ }
72
+ //# sourceMappingURL=FluidObstacle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FluidObstacle.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidObstacle.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;IAEI;;;;;;;;;;;;OAYG;IACH,WAFU,MAAM,CAEF;IAEd;;;;;;;OAOG;IACH,aAFU,OAAO,CAEG;IAEpB;;;OAGG;IACH,cAHW,aAAa,GACZ,OAAO,CAUlB;IAED;;OAEG;IACH,QAFY,MAAM,CAIjB;IAED;;MAIC;IAED,0BAEC;IASL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;CAZtC;;kBAIS,MAAM"}
@@ -0,0 +1,97 @@
1
+ import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
2
+
3
+ /**
4
+ * Marks an entity's {@link Collider} as a fluid obstacle: each fixed update,
5
+ * {@link FluidObstacleSystem} voxelizes the collider's shape (via its signed
6
+ * distance function, under the entity's rigid `Transform` pose) into the solid
7
+ * mask of every overlapping {@link FluidComponent}, and stamps the entity's
8
+ * {@link RigidBody} velocity onto the wall faces as the moving-wall boundary
9
+ * condition. Wind stops at — and is pushed by — the bodies the physics
10
+ * already knows about; no separate fluid geometry to author.
11
+ *
12
+ * Requirements on the entity (the same tuple {@link PhysicsSystem} uses, so
13
+ * any physical body qualifies as-is):
14
+ * - a `Collider` whose shape implements
15
+ * {@link AbstractShape3D#signed_distance_at_point} (all analytic
16
+ * primitives do; mesh-ish shapes that don't will throw at voxelization),
17
+ * - a `RigidBody` — the wall-velocity source (see the system doc for the
18
+ * exact semantics). Static walls use `BodyKind.Static` as usual.
19
+ * - a `Transform` for the world pose. Following the collider convention,
20
+ * the pose is RIGID — `Transform.scale` is ignored, exactly as the
21
+ * physics narrowphase ignores it.
22
+ *
23
+ * Entities missing any part of the tuple are not obstacles and are skipped —
24
+ * standard ECS tuple semantics, nothing throws.
25
+ *
26
+ * This component is pure data; the behaviour lives on the system.
27
+ */
28
+ export class FluidObstacle {
29
+
30
+ /**
31
+ * Voxelization threshold in WORLD units: a fluid cell becomes solid when
32
+ * the signed distance from its centre to the shape is `<= inflation`.
33
+ *
34
+ * `0` (default) marks exactly the cells whose centres lie inside the
35
+ * shape. Positive values grow the voxel footprint outward — useful for
36
+ * thin obstacles that would otherwise slip between cell centres (a wall
37
+ * thinner than one cell needs `inflation >= cell_size / 2` to voxelize
38
+ * reliably), or to give the fluid a safety margin around fast movers.
39
+ * Negative values shrink it.
40
+ *
41
+ * @type {number}
42
+ */
43
+ inflation = 0;
44
+
45
+ /**
46
+ * True when the previous tick stamped a non-zero wall velocity. A body
47
+ * that stops (or sleeps — the solver zeroes velocities on sleep) must
48
+ * stamp once more with zeros to clear its stale moving BC, because
49
+ * pinned faces preserve their values across mask recomputes by design.
50
+ * System-private.
51
+ * @type {boolean}
52
+ */
53
+ _was_moving = false;
54
+
55
+ /**
56
+ * @param {FluidObstacle} other
57
+ * @return {boolean}
58
+ */
59
+ equals(other) {
60
+ if (other === this) {
61
+ return true;
62
+ }
63
+ if (other === null || other === undefined || other.isFluidObstacle !== true) {
64
+ return false;
65
+ }
66
+ return this.inflation === other.inflation;
67
+ }
68
+
69
+ /**
70
+ * @return {number}
71
+ */
72
+ hash() {
73
+ return computeHashFloat(this.inflation);
74
+ }
75
+
76
+ toJSON() {
77
+ return {
78
+ inflation: this.inflation,
79
+ };
80
+ }
81
+
82
+ fromJSON(json) {
83
+ if (json.inflation !== undefined) this.inflation = json.inflation;
84
+ }
85
+ }
86
+
87
+ /**
88
+ * @readonly
89
+ * @type {string}
90
+ */
91
+ FluidObstacle.typeName = "FluidObstacle";
92
+
93
+ /**
94
+ * @readonly
95
+ * @type {boolean}
96
+ */
97
+ FluidObstacle.prototype.isFluidObstacle = true;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ECS system that voxelizes collider geometry into fluid solid masks and
3
+ * stamps rigid-body velocities onto the walls as moving-wall boundary
4
+ * conditions.
5
+ *
6
+ * Every fixed update, each entity carrying ({@link FluidObstacle},
7
+ * {@link Collider}, {@link RigidBody}, {@link Transform}) — the same tuple
8
+ * {@link PhysicsSystem} simulates, plus the marker — is swept against every
9
+ * {@link FluidComponent}: the collider's shape — posed rigidly at the
10
+ * transform's position/rotation via {@link PosedShape3D} — is sampled at the
11
+ * centre of every fluid cell inside its world AABB, and cells whose signed
12
+ * distance is `<= obstacle.inflation` become solid. The fluid then treats
13
+ * those cells exactly like hand-authored walls: faces pinned, pressure
14
+ * Neumann, traces clipped.
15
+ *
16
+ * **Ownership contract**: while at least one obstacle exists, this system
17
+ * OWNS the solid mask of every fluid field — masks are cleared and rebuilt
18
+ * from scratch each tick, so moving obstacles leave no stale walls behind.
19
+ * Hand-written `setSolidAt` state will be wiped; mix the two styles only by
20
+ * expressing the static geometry as obstacle entities too (a `BoxShape3D`
21
+ * collider is cheaper to author than a splat loop anyway). With NO obstacles
22
+ * present the system leaves every mask untouched.
23
+ *
24
+ * **Moving walls — the wall-velocity specification**:
25
+ *
26
+ * - The velocity source is `RigidBody.linearVelocity` (world m/s) — the
27
+ * SAME value the contact solver resolves against, so air and contacts
28
+ * always agree on how fast a wall moves. It is stamped onto every face
29
+ * of every cell the obstacle voxelized (converted to grid units per
30
+ * field); the projection's divergence reads pinned faces at face value,
31
+ * so a moving collider genuinely pushes and drags the air around it.
32
+ * - Pose is still read from `Transform`; velocity is NOT derived from
33
+ * pose deltas. A teleported body (spawn snap, network correction)
34
+ * relocates its walls but stamps no velocity — no one-tick air blast.
35
+ * This mirrors the engine's own contact-solver rule: see
36
+ * {@link BodyKind}.KinematicPosition, deferred for exactly this reason.
37
+ * Consequently pose-animated colliders read as stationary walls that
38
+ * teleport, for air just as for contacts — drive movers through
39
+ * `BodyKind.KinematicVelocity` (or Dynamic) to displace air.
40
+ * - `BodyKind.Static` bodies have zero velocity and stamp nothing.
41
+ * Sleeping bodies stamp nothing either — the solver zeroes velocities
42
+ * on sleep.
43
+ * - A body that stops stamps ONE extra pass of zeros
44
+ * (`FluidObstacle._was_moving`): pinned faces preserve their values
45
+ * across mask recomputes by design, so without it a stale moving BC
46
+ * would drive phantom inflow forever.
47
+ * - A retreating wall leaves its velocity behind on unpinned faces as the
48
+ * wake seed for the fluid that takes its place.
49
+ * - Rotation-induced surface velocity (ω × r from
50
+ * `RigidBody.angularVelocity`) is not modelled yet — fast spinners read
51
+ * as translating walls only (follow-up in REVIEW_02_PLAN.md).
52
+ *
53
+ * **Ordering**: register AFTER {@link PhysicsSystem} (so this tick's solved
54
+ * velocities and integrated poses are read) and BEFORE {@link FluidSystem}
55
+ * (so the simulation step sees this tick's walls and wall velocities).
56
+ * Engine systems run in registration order.
57
+ *
58
+ * Cost: clearing is O(cells) per field; voxelization is one
59
+ * `signed_distance_at_point` per cell inside each obstacle's AABB ∩ field.
60
+ * Static scenes pay the same as moving ones — change detection is a
61
+ * follow-up (REVIEW_02_PLAN.md) if profiling ever points here.
62
+ */
63
+ export class FluidObstacleSystem extends System<any, any, any, any, any> {
64
+ /**
65
+ * @param {FluidComponent} fluid
66
+ */
67
+ static "__#143@#refresh_masks"(fluid: FluidComponent): void;
68
+ /**
69
+ * @param {FluidComponent} fluid
70
+ */
71
+ static "__#143@#clear_field"(fluid: FluidComponent): void;
72
+ /**
73
+ * Mark every cell of `fluid` whose centre lies within `inflation` of the
74
+ * posed shape as solid. Iteration is clipped to the shape's world AABB
75
+ * (grown by `inflation`), so far-away obstacles cost nothing.
76
+ *
77
+ * @param {FluidComponent} fluid
78
+ * @param {PosedShape3D} posed
79
+ * @param {Float64Array} aabb world AABB of the posed shape
80
+ * @param {number} inflation world-units SDF threshold
81
+ * @param {Float64Array} point length-3 scratch
82
+ */
83
+ static "__#143@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
84
+ /**
85
+ * Write the obstacle's translation velocity onto every face of every cell
86
+ * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
87
+ * refresh, so the values stick (already-pinned faces keep their stored
88
+ * velocity through subsequent recomputes).
89
+ *
90
+ * Velocity is converted to grid units (cells/second) per field. Where
91
+ * obstacles overlap, the later-visited one wins on shared faces — both
92
+ * claims are walls, the disagreement is sub-cell.
93
+ *
94
+ * @param {FluidComponent} fluid
95
+ * @param {PosedShape3D} posed
96
+ * @param {Float64Array} aabb
97
+ * @param {number} inflation
98
+ * @param {Float64Array} point
99
+ * @param {number} wvx world-units-per-second obstacle velocity
100
+ * @param {number} wvy
101
+ * @param {number} wvz
102
+ */
103
+ static "__#143@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
104
+ constructor();
105
+ dependencies: (typeof FluidObstacle)[];
106
+ components_used: (ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof Transform> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
107
+ #private;
108
+ }
109
+ import { System } from "../../../ecs/System.js";
110
+ import { FluidObstacle } from "./FluidObstacle.js";
111
+ import { RigidBody } from "../../ecs/RigidBody.js";
112
+ import { ResourceAccessSpecification } from "../../../../core/model/ResourceAccessSpecification.js";
113
+ import { Collider } from "../../ecs/Collider.js";
114
+ import { Transform } from "../../../ecs/transform/Transform.js";
115
+ import { FluidComponent } from "./FluidComponent.js";
116
+ import { PosedShape3D } from "../../../../core/geom/3d/shape/PosedShape3D.js";
117
+ //# sourceMappingURL=FluidObstacleSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FluidObstacleSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidObstacleSystem.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH;IA+GI;;OAEG;IACH,sCAFW,cAAc,QAIxB;IAED;;OAEG;IACH,oCAFW,cAAc,QAOxB;IAED;;;;;;;;;;OAUG;IACH,iCANW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,QAiDtB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,4CATW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,OACZ,MAAM,OACN,MAAM,OACN,MAAM,QAqEhB;IAxVe,cAAmB;IAwEnC,uCAA+B;IAE/B,2QAOE;;CAwQL;uBAxVsB,wBAAwB;8BAKjB,oBAAoB;0BAFxB,wBAAwB;4CAJN,uDAAuD;yBAG1E,uBAAuB;0BADtB,qCAAqC;+BAGhC,qBAAqB;6BAPvB,gDAAgD"}