@woosh/meep-engine 2.138.19 → 2.139.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 (496) hide show
  1. package/package.json +2 -1
  2. package/src/core/collection/PairUint32Map.d.ts +100 -0
  3. package/src/core/collection/PairUint32Map.d.ts.map +1 -0
  4. package/src/core/collection/PairUint32Map.js +321 -0
  5. package/src/core/collection/Uint32Map.d.ts +119 -0
  6. package/src/core/collection/Uint32Map.d.ts.map +1 -0
  7. package/src/core/collection/Uint32Map.js +345 -0
  8. package/src/core/collection/array/array_shuffle.d.ts +10 -3
  9. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  10. package/src/core/collection/array/array_shuffle.js +27 -22
  11. package/src/core/collection/heap/FibonacciHeap.d.ts +195 -0
  12. package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -0
  13. package/src/core/collection/heap/FibonacciHeap.js +586 -0
  14. package/src/core/collection/heap/Uint32Heap.js +1 -1
  15. package/src/core/collection/heap/Uint32Heap4.d.ts +169 -0
  16. package/src/core/collection/heap/Uint32Heap4.d.ts.map +1 -0
  17. package/src/core/collection/heap/Uint32Heap4.js +490 -0
  18. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +27 -0
  19. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +1 -0
  20. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +88 -0
  21. package/src/core/geom/3d/shape/BoxShape3D.d.ts +61 -0
  22. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -0
  23. package/src/core/geom/3d/shape/BoxShape3D.js +158 -0
  24. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +11 -0
  25. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  26. package/src/core/geom/3d/shape/CapsuleShape3D.js +12 -0
  27. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts +37 -9
  28. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts.map +1 -1
  29. package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -98
  30. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts +10 -0
  31. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts.map +1 -1
  32. package/src/core/geom/3d/shape/UnitSphereShape3D.js +11 -0
  33. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +61 -0
  34. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -0
  35. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +148 -0
  36. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts +39 -0
  37. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts.map +1 -0
  38. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +147 -0
  39. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +15 -0
  40. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +1 -0
  41. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +22 -0
  42. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts +2 -0
  43. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts.map +1 -0
  44. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.js +673 -0
  45. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts +26 -0
  46. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -0
  47. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +222 -0
  48. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts +34 -0
  49. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts.map +1 -0
  50. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -0
  51. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts +36 -0
  52. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -0
  53. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -0
  54. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts +33 -0
  55. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -0
  56. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -0
  57. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts +68 -0
  58. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -0
  59. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +365 -0
  60. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +31 -0
  61. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts.map +1 -0
  62. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +112 -0
  63. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +22 -0
  64. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts.map +1 -0
  65. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +55 -0
  66. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +32 -0
  67. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts.map +1 -0
  68. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -0
  69. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts +22 -0
  70. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts.map +1 -1
  71. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +49 -0
  72. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts +134 -0
  73. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts.map +1 -1
  74. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +276 -3
  75. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +17 -0
  76. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -0
  77. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +135 -0
  78. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts +14 -0
  79. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts.map +1 -0
  80. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +177 -0
  81. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts.map +1 -1
  82. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +20 -4
  83. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  84. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +5 -3
  85. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  86. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +9 -0
  87. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.d.ts.map +1 -1
  88. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -45
  89. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.d.ts.map +1 -1
  90. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.js +7 -1
  91. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts +8 -6
  92. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
  93. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +8 -6
  94. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +22 -0
  95. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts.map +1 -0
  96. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +73 -0
  97. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  98. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +51 -1
  99. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts +10 -0
  100. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -0
  101. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -0
  102. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts +28 -0
  103. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -0
  104. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +227 -0
  105. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts +13 -0
  106. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts.map +1 -0
  107. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -0
  108. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +11 -0
  109. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +1 -0
  110. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +20 -0
  111. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +20 -0
  112. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +1 -0
  113. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +38 -0
  114. package/src/core/graph/csr/CSRGraph.d.ts +168 -0
  115. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -0
  116. package/src/core/graph/csr/CSRGraph.js +319 -0
  117. package/src/core/graph/metis/cluster_mesh_metis.d.ts +12 -0
  118. package/src/core/graph/metis/cluster_mesh_metis.d.ts.map +1 -1
  119. package/src/core/graph/metis/cluster_mesh_metis.js +12 -0
  120. package/src/core/graph/metis/metis.d.ts +19 -0
  121. package/src/core/graph/metis/metis.d.ts.map +1 -1
  122. package/src/core/graph/metis/metis.js +20 -0
  123. package/src/core/graph/metis/metis_cluster_bs.d.ts +11 -0
  124. package/src/core/graph/metis/metis_cluster_bs.d.ts.map +1 -1
  125. package/src/core/graph/metis/metis_cluster_bs.js +11 -0
  126. package/src/core/graph/metis/metis_options.d.ts +17 -2
  127. package/src/core/graph/metis/metis_options.d.ts.map +1 -1
  128. package/src/core/graph/metis/metis_options.js +17 -2
  129. package/src/core/graph/metis/native/MetisGraph.d.ts +144 -0
  130. package/src/core/graph/metis/native/MetisGraph.d.ts.map +1 -0
  131. package/src/core/graph/metis/native/MetisGraph.js +212 -0
  132. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts +72 -0
  133. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts.map +1 -0
  134. package/src/core/graph/metis/native/bisection/BisectionScratch.js +101 -0
  135. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts +37 -0
  136. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts.map +1 -0
  137. package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -0
  138. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts +15 -0
  139. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts.map +1 -0
  140. package/src/core/graph/metis/native/bisection/compute_2way_params.js +84 -0
  141. package/src/core/graph/metis/native/bisection/fm_2way.d.ts +30 -0
  142. package/src/core/graph/metis/native/bisection/fm_2way.d.ts.map +1 -0
  143. package/src/core/graph/metis/native/bisection/fm_2way.js +290 -0
  144. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts +23 -0
  145. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts.map +1 -0
  146. package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -0
  147. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts +28 -0
  148. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts.map +1 -0
  149. package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -0
  150. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts +20 -0
  151. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts.map +1 -0
  152. package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -0
  153. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts +24 -0
  154. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts.map +1 -0
  155. package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -0
  156. package/src/core/graph/metis/native/coarsen/match_shem.d.ts +41 -0
  157. package/src/core/graph/metis/native/coarsen/match_shem.d.ts.map +1 -0
  158. package/src/core/graph/metis/native/coarsen/match_shem.js +175 -0
  159. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts +24 -0
  160. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts.map +1 -0
  161. package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -0
  162. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts +29 -0
  163. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts.map +1 -0
  164. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -0
  165. package/src/core/graph/metis/native/metis_partition_kway.d.ts +41 -0
  166. package/src/core/graph/metis/native/metis_partition_kway.d.ts.map +1 -0
  167. package/src/core/graph/metis/native/metis_partition_kway.js +126 -0
  168. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts +62 -0
  169. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts.map +1 -0
  170. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js +261 -0
  171. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts +45 -0
  172. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts.map +1 -0
  173. package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -0
  174. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts +18 -0
  175. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -0
  176. package/src/core/graph/metis/native/refine/compute_kway_params.js +138 -0
  177. package/src/core/graph/metis/native/refine/fm_kway.d.ts +63 -0
  178. package/src/core/graph/metis/native/refine/fm_kway.d.ts.map +1 -0
  179. package/src/core/graph/metis/native/refine/fm_kway.js +462 -0
  180. package/src/core/graph/metis/native/refine/project_kway.d.ts +22 -0
  181. package/src/core/graph/metis/native/refine/project_kway.d.ts.map +1 -0
  182. package/src/core/graph/metis/native/refine/project_kway.js +43 -0
  183. package/src/core/graph/metis/native/refine/refine_kway.d.ts +34 -0
  184. package/src/core/graph/metis/native/refine/refine_kway.d.ts.map +1 -0
  185. package/src/core/graph/metis/native/refine/refine_kway.js +43 -0
  186. package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts +2 -2
  187. package/src/core/math/linalg/eigen/matrix_householder_in_place.js +2 -2
  188. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +6 -4
  189. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -1
  190. package/src/core/math/linalg/eigen/matrix_qr_in_place.js +69 -23
  191. package/src/engine/EngineHarness.d.ts +3 -1
  192. package/src/engine/EngineHarness.d.ts.map +1 -1
  193. package/src/engine/EngineHarness.js +6 -4
  194. package/src/engine/control/first-person/DESIGN.md +30 -6
  195. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -0
  196. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +102 -9
  197. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  198. package/src/engine/control/first-person/FirstPersonPlayerController.js +38 -3
  199. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +533 -4
  200. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  201. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +315 -6
  202. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +220 -22
  203. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  204. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +858 -241
  205. package/src/engine/control/first-person/TODO.md +127 -0
  206. package/src/engine/control/first-person/abilities/Ability.d.ts +101 -0
  207. package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -0
  208. package/src/engine/control/first-person/abilities/Ability.js +119 -0
  209. package/src/engine/control/first-person/abilities/AbilitySet.d.ts +86 -0
  210. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -0
  211. package/src/engine/control/first-person/abilities/AbilitySet.js +185 -0
  212. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +62 -0
  213. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -0
  214. package/src/engine/control/first-person/abilities/LedgeGrab.js +199 -0
  215. package/src/engine/control/first-person/abilities/Mantle.d.ts +45 -0
  216. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -0
  217. package/src/engine/control/first-person/abilities/Mantle.js +188 -0
  218. package/src/engine/control/first-person/abilities/Slide.d.ts +33 -0
  219. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -0
  220. package/src/engine/control/first-person/abilities/Slide.js +158 -0
  221. package/src/engine/control/first-person/abilities/WallJump.d.ts +45 -0
  222. package/src/engine/control/first-person/abilities/WallJump.d.ts.map +1 -0
  223. package/src/engine/control/first-person/abilities/WallJump.js +131 -0
  224. package/src/engine/control/first-person/abilities/WallRun.d.ts +44 -0
  225. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -0
  226. package/src/engine/control/first-person/abilities/WallRun.js +180 -0
  227. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts +49 -0
  228. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts.map +1 -0
  229. package/src/engine/control/first-person/composer/EyeOffsetStack.js +60 -0
  230. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts +100 -0
  231. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts.map +1 -0
  232. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.js +133 -0
  233. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts +10 -0
  234. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts.map +1 -0
  235. package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -0
  236. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts +61 -0
  237. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts.map +1 -0
  238. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.js +109 -0
  239. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts +40 -0
  240. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts.map +1 -0
  241. package/src/engine/control/first-person/mastery/MasteryEvaluator.js +45 -0
  242. package/src/engine/control/first-person/mastery/MasteryScore.d.ts +68 -0
  243. package/src/engine/control/first-person/mastery/MasteryScore.d.ts.map +1 -0
  244. package/src/engine/control/first-person/mastery/MasteryScore.js +100 -0
  245. package/src/engine/control/first-person/mastery/MasterySet.d.ts +60 -0
  246. package/src/engine/control/first-person/mastery/MasterySet.d.ts.map +1 -0
  247. package/src/engine/control/first-person/mastery/MasterySet.js +86 -0
  248. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +58 -0
  249. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -0
  250. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +83 -0
  251. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +69 -0
  252. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -0
  253. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +109 -0
  254. package/src/engine/control/first-person/math/Spring.d.ts +56 -0
  255. package/src/engine/control/first-person/math/Spring.d.ts.map +1 -0
  256. package/src/engine/control/first-person/math/Spring.js +71 -0
  257. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts +26 -0
  258. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts.map +1 -0
  259. package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -0
  260. package/src/engine/control/first-person/math/computeMassRatios.d.ts +35 -0
  261. package/src/engine/control/first-person/math/computeMassRatios.d.ts.map +1 -0
  262. package/src/engine/control/first-person/math/computeMassRatios.js +44 -0
  263. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts +31 -1
  264. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts.map +1 -1
  265. package/src/engine/control/first-person/pose/FirstPersonPose.js +49 -3
  266. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts +7 -0
  267. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts.map +1 -0
  268. package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -0
  269. package/src/engine/control/first-person/prototype_first_person_controller.js +550 -119
  270. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts +58 -0
  271. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts.map +1 -0
  272. package/src/engine/control/first-person/sensors/FirstPersonSensors.js +77 -0
  273. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +80 -0
  274. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -0
  275. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +196 -0
  276. package/src/engine/control/first-person/test/buildTestPlayer.d.ts +20 -0
  277. package/src/engine/control/first-person/test/buildTestPlayer.d.ts.map +1 -0
  278. package/src/engine/control/first-person/test/buildTestPlayer.js +28 -0
  279. package/src/engine/ecs/EntityManager.d.ts +2 -2
  280. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  281. package/src/engine/ecs/EntityManager.js +13 -8
  282. package/src/engine/ecs/System.d.ts.map +1 -1
  283. package/src/engine/ecs/System.js +2 -2
  284. package/src/engine/graphics/camera/testClippingPlaneComputation.js +0 -2
  285. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  286. package/src/engine/graphics/ecs/light/Light.js +27 -0
  287. package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
  288. package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
  289. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  290. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
  291. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
  292. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
  293. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
  294. package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
  295. package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
  296. package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
  297. package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
  298. package/src/engine/physics/PLAN.md +236 -0
  299. package/src/engine/physics/body/BodyStorage.d.ts +187 -0
  300. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
  301. package/src/engine/physics/body/BodyStorage.js +427 -0
  302. package/src/engine/physics/broadphase/PairList.d.ts +62 -0
  303. package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
  304. package/src/engine/physics/broadphase/PairList.js +97 -0
  305. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts +30 -0
  306. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts.map +1 -0
  307. package/src/engine/physics/broadphase/aabb_transform_oriented.js +93 -0
  308. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
  309. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
  310. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
  311. package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
  312. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
  313. package/src/engine/physics/broadphase/generate_pairs.js +101 -0
  314. package/src/engine/physics/contact/ManifoldStore.d.ts +226 -0
  315. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
  316. package/src/engine/physics/contact/ManifoldStore.js +499 -0
  317. package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
  318. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
  319. package/src/engine/physics/ecs/BodyKind.js +24 -0
  320. package/src/engine/physics/ecs/Collider.d.ts +98 -0
  321. package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
  322. package/src/engine/physics/ecs/Collider.js +136 -0
  323. package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
  324. package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
  325. package/src/engine/physics/ecs/ColliderFlags.js +15 -0
  326. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
  327. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
  328. package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
  329. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
  330. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
  331. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
  332. package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
  333. package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
  334. package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
  335. package/src/engine/physics/ecs/PhysicsSystem.d.ts +520 -0
  336. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
  337. package/src/engine/physics/ecs/PhysicsSystem.js +1159 -0
  338. package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
  339. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
  340. package/src/engine/physics/ecs/RigidBody.js +240 -0
  341. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
  342. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
  343. package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
  344. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
  345. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
  346. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
  347. package/src/engine/physics/ecs/SleepState.d.ts +11 -0
  348. package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
  349. package/src/engine/physics/ecs/SleepState.js +12 -0
  350. package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
  351. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
  352. package/src/engine/physics/events/ContactEventBuffer.js +83 -0
  353. package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
  354. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
  355. package/src/engine/physics/events/diff_manifolds.js +50 -0
  356. package/src/engine/physics/fluid/FluidField.d.ts +294 -16
  357. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  358. package/src/engine/physics/fluid/FluidField.js +510 -66
  359. package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
  360. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  361. package/src/engine/physics/fluid/FluidSimulator.js +455 -95
  362. package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
  363. package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
  364. package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
  365. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
  366. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
  367. package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
  368. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
  369. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
  370. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
  371. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
  372. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
  373. package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
  374. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
  375. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
  376. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
  377. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
  378. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  379. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
  380. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
  381. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
  382. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
  383. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
  384. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  385. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
  386. package/src/engine/physics/fluid/prototype.js +102 -91
  387. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
  388. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
  389. package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
  390. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
  391. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  392. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
  393. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
  394. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  395. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
  396. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
  397. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
  398. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
  399. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
  400. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
  401. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
  402. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
  403. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
  404. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
  405. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
  406. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
  407. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
  408. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
  409. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
  410. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
  411. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
  412. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
  413. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
  414. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
  415. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
  416. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
  417. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts +20 -0
  418. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts.map +1 -0
  419. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.js +83 -0
  420. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +26 -0
  421. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
  422. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +70 -0
  423. package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
  424. package/src/engine/physics/gjk/expanding_polytope_algorithm.js +8 -10
  425. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +29 -0
  426. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
  427. package/src/engine/physics/inertia/world_inverse_inertia.js +79 -0
  428. package/src/engine/physics/integration/integrate_position.d.ts +16 -0
  429. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
  430. package/src/engine/physics/integration/integrate_position.js +48 -0
  431. package/src/engine/physics/integration/integrate_velocity.d.ts +25 -0
  432. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
  433. package/src/engine/physics/integration/integrate_velocity.js +79 -0
  434. package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
  435. package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
  436. package/src/engine/physics/integration/quat_integrate.js +62 -0
  437. package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
  438. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
  439. package/src/engine/physics/island/IslandBuilder.js +411 -0
  440. package/src/engine/physics/island/union_find.d.ts +51 -0
  441. package/src/engine/physics/island/union_find.d.ts.map +1 -0
  442. package/src/engine/physics/island/union_find.js +76 -0
  443. package/src/engine/physics/narrowphase/PosedShape.d.ts +59 -0
  444. package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
  445. package/src/engine/physics/narrowphase/PosedShape.js +110 -0
  446. package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
  447. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
  448. package/src/engine/physics/narrowphase/box_box_manifold.js +543 -0
  449. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
  450. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
  451. package/src/engine/physics/narrowphase/capsule_contacts.js +508 -0
  452. package/src/engine/physics/narrowphase/narrowphase_step.d.ts +11 -0
  453. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
  454. package/src/engine/physics/narrowphase/narrowphase_step.js +382 -0
  455. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
  456. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
  457. package/src/engine/physics/narrowphase/sphere_box_contact.js +130 -0
  458. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
  459. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
  460. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
  461. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
  462. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
  463. package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
  464. package/src/engine/physics/queries/raycast.d.ts +20 -0
  465. package/src/engine/physics/queries/raycast.d.ts.map +1 -0
  466. package/src/engine/physics/queries/raycast.js +249 -0
  467. package/src/engine/physics/solver/friction_cone.d.ts +16 -0
  468. package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
  469. package/src/engine/physics/solver/friction_cone.js +37 -0
  470. package/src/engine/physics/solver/solve_contacts.d.ts +36 -0
  471. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
  472. package/src/engine/physics/solver/solve_contacts.js +598 -0
  473. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
  474. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
  475. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
  476. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
  477. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
  478. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
  479. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
  480. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
  481. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
  482. package/src/engine/ecs/components/Motion.d.ts +0 -21
  483. package/src/engine/ecs/components/Motion.d.ts.map +0 -1
  484. package/src/engine/ecs/components/Motion.js +0 -27
  485. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
  486. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
  487. package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
  488. package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
  489. package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
  490. package/src/engine/ecs/systems/MotionSystem.js +0 -29
  491. package/src/engine/physics/fluid/Fluid.d.ts +0 -26
  492. package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
  493. package/src/engine/physics/fluid/Fluid.js +0 -221
  494. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
  495. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
  496. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.js +0 -8
@@ -0,0 +1,278 @@
1
+ import { AABB3 } from "../../../../core/geom/3d/aabb/AABB3.js";
2
+ import { aabb3_intersects_aabb3 } from "../../../../core/geom/3d/aabb/aabb3_intersects_aabb3.js";
3
+ import { ResourceAccessKind } from "../../../../core/model/ResourceAccessKind.js";
4
+ import { ResourceAccessSpecification } from "../../../../core/model/ResourceAccessSpecification.js";
5
+ import { System } from "../../../ecs/System.js";
6
+ import { Transform } from "../../../ecs/transform/Transform.js";
7
+ import { FluidComponent } from "./FluidComponent.js";
8
+ import { FluidEffectorsComponent } from "./FluidEffectorsComponent.js";
9
+ import { FluidSimulator } from "../FluidSimulator.js";
10
+
11
+ /**
12
+ * ECS system that steps every {@link FluidComponent} on a fixed timestep.
13
+ *
14
+ * Effectors live on a separate {@link FluidEffectorsComponent}, decoupled from any
15
+ * specific fluid field. Each step the system:
16
+ *
17
+ * 1. **Re-anchor moving fields.** For every (FluidComponent, Transform) tuple,
18
+ * compute the desired grid origin as
19
+ * `quantize(transform.position, cell_size) + offset`
20
+ * where the grid is then centred at that point. On the first sync this is just
21
+ * snapped (no shift), on subsequent syncs the integer cell delta is computed and
22
+ * the field is shifted to follow — fluid data moves with the world so the volume
23
+ * appears stationary while the grid hops between cells.
24
+ * 2. Walks every (FluidEffectorsComponent, Transform) entity and calls
25
+ * {@link AbstractFluidEffector.syncFromTransform} on each effector so position-
26
+ * bearing effectors (wakes, splats) follow their owning entity.
27
+ * 3. For each enabled {@link FluidComponent}:
28
+ * a. Builds the world-to-grid matrix from the component's `origin` + `cell_size`.
29
+ * b. Broad-phase filters effectors via {@link AbstractFluidEffector.getBoundingBox}
30
+ * vs {@link FluidComponent.getBoundingBox} — only effectors whose world-space
31
+ * AABB intersects the field's AABB are passed through.
32
+ * c. Calls the owned simulator's `step(field, dt, visible_effectors, world_to_grid)`.
33
+ *
34
+ * The broad-phase is cheap (AABB-AABB intersect, 6 comparisons) and skips the expensive
35
+ * per-cell splat work for effectors that wouldn't have hit anything anyway. Gather +
36
+ * filter happens per field; effectors that overlap multiple fields are evaluated
37
+ * multiple times — fine for the typical "few fields" case, optimise to a cached
38
+ * per-effector AABB pass if you find yourself with many fields.
39
+ *
40
+ * Uses `fixedUpdate` rather than `update` because fluid stability and the warm-started
41
+ * pressure solve both depend on consistent dt. Variable timesteps cause visible
42
+ * pulsing as projection convergence varies.
43
+ */
44
+ export class FluidSystem extends System {
45
+
46
+ dependencies = [FluidComponent];
47
+
48
+ /**
49
+ * Components the system traverses each step but does not own as the linking
50
+ * tuple. Lets the engine validate registration order and schedule reads.
51
+ *
52
+ * - `FluidEffectorsComponent` — read every step to gather effectors and to
53
+ * deliver Transform sync hooks.
54
+ * - `Transform` — read every step (paired with FluidEffectorsComponent) so
55
+ * position-bearing effectors can follow their entity.
56
+ */
57
+ components_used = [
58
+ // FluidComponent is also in `dependencies`, but reanchor + step write to it
59
+ // (origin, anchored, field buffers). Declared again with explicit Write.
60
+ ResourceAccessSpecification.from(FluidComponent, ResourceAccessKind.Read | ResourceAccessKind.Write),
61
+ ResourceAccessSpecification.from(FluidEffectorsComponent, ResourceAccessKind.Read),
62
+ ResourceAccessSpecification.from(Transform, ResourceAccessKind.Read),
63
+ ];
64
+
65
+ /**
66
+ * Single simulator drives every fluid field — it carries only transient scratch,
67
+ * which {@link FluidSimulator.#ensure_scratch} grows to fit the largest field
68
+ * encountered.
69
+ * @type {FluidSimulator}
70
+ */
71
+ simulator = new FluidSimulator();
72
+
73
+ /**
74
+ * Per-field filtered effector list, rebuilt at the top of each field's step.
75
+ * Held as an instance field so we don't allocate per frame.
76
+ * @type {AbstractFluidEffector[]}
77
+ */
78
+ #visible_effectors = [];
79
+
80
+ /**
81
+ * Reusable column-major 4×4 buffer for the world-to-grid matrix; rewritten per
82
+ * field per step.
83
+ * @type {Float32Array}
84
+ */
85
+ #world_to_grid = new Float32Array(16);
86
+
87
+ /**
88
+ * Reusable AABB scratch for the current field being stepped.
89
+ * @type {AABB3}
90
+ */
91
+ #field_aabb = new AABB3();
92
+
93
+ /**
94
+ * Reusable AABB scratch reused for every effector during broad-phase filtering.
95
+ * @type {AABB3}
96
+ */
97
+ #effector_aabb = new AABB3();
98
+
99
+ /**
100
+ * @param {number} time_delta_seconds
101
+ */
102
+ fixedUpdate(time_delta_seconds) {
103
+ const em = this.entityManager;
104
+ if (em === null) {
105
+ return;
106
+ }
107
+ const ecd = em.dataset;
108
+ if (ecd === null) {
109
+ return;
110
+ }
111
+
112
+ // 1. Re-anchor moving fields. Field origin tracks quantize(transform) + offset;
113
+ // when the quantization changes, the field is shifted to follow the world.
114
+ ecd.traverseEntities([FluidComponent, Transform], FluidSystem.#reanchor_field);
115
+
116
+ // 2. Sync every effector that wants to follow its entity's Transform.
117
+ ecd.traverseEntities([FluidEffectorsComponent, Transform], FluidSystem.#sync_effectors_from_transform);
118
+
119
+ // 2. Step each fluid field, with broad-phase effector filtering per field.
120
+ const sim = this.simulator;
121
+ const world_to_grid = this.#world_to_grid;
122
+ const field_aabb = this.#field_aabb;
123
+ const effector_aabb = this.#effector_aabb;
124
+ const visible = this.#visible_effectors;
125
+
126
+ ecd.traverseComponents(FluidComponent, function (component) {
127
+ if (!component.enabled) {
128
+ return;
129
+ }
130
+
131
+ component.getBoundingBox(field_aabb);
132
+ FluidSystem.#build_world_to_grid(world_to_grid, component);
133
+
134
+ visible.length = 0;
135
+ ecd.traverseComponents(FluidEffectorsComponent, function (effectors_component) {
136
+ const arr = effectors_component.effectors;
137
+ for (let i = 0; i < arr.length; i++) {
138
+ const e = arr[i];
139
+ e.getBoundingBox(effector_aabb);
140
+ if (aabb3_intersects_aabb3(
141
+ effector_aabb.x0, effector_aabb.y0, effector_aabb.z0,
142
+ effector_aabb.x1, effector_aabb.y1, effector_aabb.z1,
143
+ field_aabb.x0, field_aabb.y0, field_aabb.z0,
144
+ field_aabb.x1, field_aabb.y1, field_aabb.z1
145
+ )) {
146
+ visible.push(e);
147
+ }
148
+ }
149
+ });
150
+
151
+ sim.step(component.field, time_delta_seconds, visible, world_to_grid);
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Visitor for the (effectors, transform) traversal — calls syncFromTransform on
157
+ * every effector in the component.
158
+ * @param {FluidEffectorsComponent} effectors_component
159
+ * @param {Transform} transform
160
+ */
161
+ static #sync_effectors_from_transform(effectors_component, transform) {
162
+ const effectors = effectors_component.effectors;
163
+ for (let i = 0; i < effectors.length; i++) {
164
+ effectors[i].syncFromTransform(transform);
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Visitor for the (FluidComponent, Transform) traversal — keeps the field's
170
+ * grid origin locked to a cell-aligned position near the transform.
171
+ *
172
+ * Centre formula: `q * cell_size + offset`, where `q` is the cell index along
173
+ * each axis. Origin is then the centre minus half the grid extent so the centre
174
+ * lands at the geometric middle of the grid.
175
+ *
176
+ * Hysteresis: instead of recomputing `q` from the raw position every frame
177
+ * (which would re-shift on every boundary crossing for a Transform jittering on
178
+ * a cell edge), we recover the current `q` from the existing origin and only
179
+ * advance to a new cell when the raw position has drifted more than
180
+ * `0.5 + hysteresis` cells from it. Crossing the threshold snaps to the new
181
+ * nearest cell, so a single large move still produces a single discrete shift.
182
+ *
183
+ * First sync (`anchored = false`): snap origin to the desired value, no shift.
184
+ * Subsequent syncs: per-axis hysteretic quantization, then `field.shift` if the
185
+ * integer delta is non-zero.
186
+ *
187
+ * @param {FluidComponent} component
188
+ * @param {Transform} transform
189
+ */
190
+ static #reanchor_field(component, transform) {
191
+ const cs = component.cell_size;
192
+ const p = transform.position;
193
+ const offset = component.offset;
194
+ const hyst = component.hysteresis;
195
+
196
+ const res = component.field.getResolution();
197
+ const half_extent_x = (res[0] - 1) * cs * 0.5;
198
+ const half_extent_y = (res[1] - 1) * cs * 0.5;
199
+ const half_extent_z = (res[2] - 1) * cs * 0.5;
200
+
201
+ const origin = component.origin;
202
+
203
+ if (!component.anchored) {
204
+ // First sync — adopt the freshly-quantized origin without shifting.
205
+ // Subsequent frames will see integer-cs differences and shift instead.
206
+ const q_x = Math.round(p.x / cs);
207
+ const q_y = Math.round(p.y / cs);
208
+ const q_z = Math.round(p.z / cs);
209
+ origin[0] = q_x * cs + offset[0] - half_extent_x;
210
+ origin[1] = q_y * cs + offset[1] - half_extent_y;
211
+ origin[2] = q_z * cs + offset[2] - half_extent_z;
212
+ component.anchored = true;
213
+ return;
214
+ }
215
+
216
+ // Recover the current quantized cell index per axis from the existing origin.
217
+ // origin_axis = q_curr * cs + offset - half_extent →
218
+ // q_curr = (origin_axis + half_extent - offset) / cs.
219
+ // Round defends against floating drift; the value should already be integer.
220
+ const q_curr_x = Math.round((origin[0] + half_extent_x - offset[0]) / cs);
221
+ const q_curr_y = Math.round((origin[1] + half_extent_y - offset[1]) / cs);
222
+ const q_curr_z = Math.round((origin[2] + half_extent_z - offset[2]) / cs);
223
+
224
+ // Raw (fractional) cell coordinate the Transform sits at right now.
225
+ const raw_x = p.x / cs;
226
+ const raw_y = p.y / cs;
227
+ const raw_z = p.z / cs;
228
+
229
+ // Hysteretic re-quantize: only adopt a new cell when raw has drifted past
230
+ // 0.5 + hyst from the current one. Snap to the new nearest, not the threshold.
231
+ const threshold = 0.5 + hyst;
232
+ const q_new_x = Math.abs(raw_x - q_curr_x) > threshold ? Math.round(raw_x) : q_curr_x;
233
+ const q_new_y = Math.abs(raw_y - q_curr_y) > threshold ? Math.round(raw_y) : q_curr_y;
234
+ const q_new_z = Math.abs(raw_z - q_curr_z) > threshold ? Math.round(raw_z) : q_curr_z;
235
+
236
+ const shift_x = q_new_x - q_curr_x;
237
+ const shift_y = q_new_y - q_curr_y;
238
+ const shift_z = q_new_z - q_curr_z;
239
+
240
+ if (shift_x === 0 && shift_y === 0 && shift_z === 0) {
241
+ return;
242
+ }
243
+
244
+ component.field.shift(shift_x, shift_y, shift_z);
245
+ origin[0] = q_new_x * cs + offset[0] - half_extent_x;
246
+ origin[1] = q_new_y * cs + offset[1] - half_extent_y;
247
+ origin[2] = q_new_z * cs + offset[2] - half_extent_z;
248
+ }
249
+
250
+ /**
251
+ * Write the world-to-grid affine for a FluidComponent into `out`. Axis-aligned,
252
+ * uniform-scale, so the matrix is sparse:
253
+ *
254
+ * [ 1/cs 0 0 -ox/cs ]
255
+ * [ 0 1/cs 0 -oy/cs ]
256
+ * [ 0 0 1/cs -oz/cs ]
257
+ * [ 0 0 0 1 ]
258
+ *
259
+ * Stored column-major (matches the convention of {@link v3_matrix4_multiply}).
260
+ *
261
+ * @param {Float32Array} out length-16
262
+ * @param {FluidComponent} component
263
+ */
264
+ static #build_world_to_grid(out, component) {
265
+ const inv_cs = 1 / component.cell_size;
266
+ const ox = component.origin[0];
267
+ const oy = component.origin[1];
268
+ const oz = component.origin[2];
269
+
270
+ out[0] = inv_cs; out[1] = 0; out[2] = 0; out[3] = 0;
271
+ out[4] = 0; out[5] = inv_cs; out[6] = 0; out[7] = 0;
272
+ out[8] = 0; out[9] = 0; out[10] = inv_cs; out[11] = 0;
273
+ out[12] = -ox * inv_cs;
274
+ out[13] = -oy * inv_cs;
275
+ out[14] = -oz * inv_cs;
276
+ out[15] = 1;
277
+ }
278
+ }
@@ -1,6 +1,67 @@
1
1
  /**
2
- * Base interface for injecting external forces into the simulation
2
+ * External force source applied to a {@link FluidField} once per simulation step.
3
+ *
4
+ * Subclasses override {@link apply} to mutate the field's velocity (and, optionally,
5
+ * scalar attributes). The simulator calls `apply(field, dt, world_to_grid)` for every
6
+ * effector at the start of each step, before diffusion / projection / advection.
7
+ *
8
+ * Effectors are configured in WORLD coordinates. The `world_to_grid` matrix supplied
9
+ * to {@link apply} converts a world-space point into the target field's grid space.
10
+ * The same effector instance can therefore be applied to any number of fluid fields
11
+ * across a single step — the system iterates fields and re-supplies the matching
12
+ * matrix each time.
13
+ *
14
+ * Effectors should be idempotent given the same `dt`, field state, and
15
+ * `world_to_grid` — they are pure functions of (their own configured state, field,
16
+ * dt, matrix). They must not retain references to field buffers between calls (the
17
+ * field's buffer references are stable, but caching them across resolution changes
18
+ * would break).
3
19
  */
4
20
  export class AbstractFluidEffector {
21
+ /**
22
+ * @param {FluidField} field
23
+ * @param {number} dt seconds
24
+ * @param {Float32Array|number[]} world_to_grid Column-major 4×4 affine sending
25
+ * world-space points into the target
26
+ * field's grid space.
27
+ */
28
+ apply(field: FluidField, dt: number, world_to_grid: Float32Array | number[]): void;
29
+ /**
30
+ * Optional hook called by {@link FluidSystem} once per step on each effector whose
31
+ * entity also has a `Transform` component. Default: no-op. Effectors that should
32
+ * follow an entity override this to pull world-space position / orientation /
33
+ * velocity off the transform.
34
+ *
35
+ * @param {Transform} transform
36
+ */
37
+ syncFromTransform(transform: Transform): void;
38
+ /**
39
+ * Strict value equality. The base implementation collapses to reference equality
40
+ * — every concrete effector class overrides this to compare its own configured
41
+ * state.
42
+ * @param {AbstractFluidEffector} other
43
+ * @return {boolean}
44
+ */
45
+ equals(other: AbstractFluidEffector): boolean;
46
+ /**
47
+ * Fast hash. The base implementation returns a constant — concrete effectors
48
+ * override to hash their own state. Should stay cheap (a few `combine_hash` calls
49
+ * over scalar fields).
50
+ * @return {number}
51
+ */
52
+ hash(): number;
53
+ /**
54
+ * Write the effector's world-space axis-aligned bounding box into `out`. Used by
55
+ * {@link FluidSystem} as a broad-phase culling primitive: if the effector's box
56
+ * doesn't intersect a fluid field's box, the effector is skipped for that field
57
+ * entirely.
58
+ *
59
+ * The base implementation writes infinite bounds — i.e. "could affect anything".
60
+ * Safe (never produces false negatives) but defeats the broad-phase. Concrete
61
+ * effectors override with tight bounds.
62
+ *
63
+ * @param {AABB3} out destination, mutated in place
64
+ */
65
+ getBoundingBox(out: AABB3): void;
5
66
  }
6
67
  //# sourceMappingURL=AbstractFluidEffector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/AbstractFluidEffector.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;CAEC"}
1
+ {"version":3,"file":"AbstractFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/AbstractFluidEffector.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IACI;;;;;;OAMG;IACH,6BALW,MAAM,iBACN,YAAY,GAAC,MAAM,EAAE,QAO/B;IAED;;;;;;;OAOG;IACH,8CAEC;IAED;;;;;;OAMG;IACH,cAHW,qBAAqB,GACpB,OAAO,CAIlB;IAED;;;;;OAKG;IACH,QAFY,MAAM,CAIjB;IAED;;;;;;;;;;;OAWG;IACH,iCAEC;CACJ"}
@@ -1,6 +1,81 @@
1
- /**
2
- * Base interface for injecting external forces into the simulation
3
- */
4
- export class AbstractFluidEffector {
5
-
6
- }
1
+ /**
2
+ * External force source applied to a {@link FluidField} once per simulation step.
3
+ *
4
+ * Subclasses override {@link apply} to mutate the field's velocity (and, optionally,
5
+ * scalar attributes). The simulator calls `apply(field, dt, world_to_grid)` for every
6
+ * effector at the start of each step, before diffusion / projection / advection.
7
+ *
8
+ * Effectors are configured in WORLD coordinates. The `world_to_grid` matrix supplied
9
+ * to {@link apply} converts a world-space point into the target field's grid space.
10
+ * The same effector instance can therefore be applied to any number of fluid fields
11
+ * across a single step — the system iterates fields and re-supplies the matching
12
+ * matrix each time.
13
+ *
14
+ * Effectors should be idempotent given the same `dt`, field state, and
15
+ * `world_to_grid` — they are pure functions of (their own configured state, field,
16
+ * dt, matrix). They must not retain references to field buffers between calls (the
17
+ * field's buffer references are stable, but caching them across resolution changes
18
+ * would break).
19
+ */
20
+ export class AbstractFluidEffector {
21
+ /**
22
+ * @param {FluidField} field
23
+ * @param {number} dt seconds
24
+ * @param {Float32Array|number[]} world_to_grid Column-major 4×4 affine sending
25
+ * world-space points into the target
26
+ * field's grid space.
27
+ */
28
+ apply(field, dt, world_to_grid) {
29
+ // Default no-op so a partially-built effector doesn't crash the sim. Subclasses
30
+ // must override to do useful work.
31
+ }
32
+
33
+ /**
34
+ * Optional hook called by {@link FluidSystem} once per step on each effector whose
35
+ * entity also has a `Transform` component. Default: no-op. Effectors that should
36
+ * follow an entity override this to pull world-space position / orientation /
37
+ * velocity off the transform.
38
+ *
39
+ * @param {Transform} transform
40
+ */
41
+ syncFromTransform(transform) {
42
+ // override as needed
43
+ }
44
+
45
+ /**
46
+ * Strict value equality. The base implementation collapses to reference equality
47
+ * — every concrete effector class overrides this to compare its own configured
48
+ * state.
49
+ * @param {AbstractFluidEffector} other
50
+ * @return {boolean}
51
+ */
52
+ equals(other) {
53
+ return other === this;
54
+ }
55
+
56
+ /**
57
+ * Fast hash. The base implementation returns a constant — concrete effectors
58
+ * override to hash their own state. Should stay cheap (a few `combine_hash` calls
59
+ * over scalar fields).
60
+ * @return {number}
61
+ */
62
+ hash() {
63
+ return 0;
64
+ }
65
+
66
+ /**
67
+ * Write the effector's world-space axis-aligned bounding box into `out`. Used by
68
+ * {@link FluidSystem} as a broad-phase culling primitive: if the effector's box
69
+ * doesn't intersect a fluid field's box, the effector is skipped for that field
70
+ * entirely.
71
+ *
72
+ * The base implementation writes infinite bounds — i.e. "could affect anything".
73
+ * Safe (never produces false negatives) but defeats the broad-phase. Concrete
74
+ * effectors override with tight bounds.
75
+ *
76
+ * @param {AABB3} out destination, mutated in place
77
+ */
78
+ getBoundingBox(out) {
79
+ out.setInfiniteBounds();
80
+ }
81
+ }
@@ -1,12 +1,25 @@
1
1
  /**
2
- * Affects fluid everywhere inside the field uniformly
2
+ * Adds the same acceleration to every fluid cell each step (gravity, ambient wind).
3
+ *
4
+ * `force` is in WORLD units per second squared. The `world_to_grid` matrix is applied
5
+ * (as a direction transform — translation ignored) inside {@link apply} to convert
6
+ * the force into the target field's grid-cell units before depositing. The same
7
+ * GlobalFluidEffector applied to fields with different `cell_size` therefore produces
8
+ * the same world-space acceleration on each — gravity stays gravity.
9
+ *
10
+ * Solid cells are left untouched — the projection step would zero them anyway, but
11
+ * skipping the write is slightly cheaper and keeps the solid mask authoritative for
12
+ * effectors as well as the solver.
3
13
  */
4
14
  export class GlobalFluidEffector extends AbstractFluidEffector {
5
15
  /**
6
- * 3d force vector
7
- * @type {number[]}
16
+ * Acceleration vector in WORLD units per second squared (e.g. `[0, -9.8, 0]` for
17
+ * Earth gravity in metres-and-seconds). Per-step deposit into the velocity field
18
+ * is `world_to_grid · force × dt`.
19
+ *
20
+ * @type {[number, number, number]}
8
21
  */
9
- force: number[];
22
+ force: [number, number, number];
10
23
  }
11
24
  import { AbstractFluidEffector } from "./AbstractFluidEffector.js";
12
25
  //# sourceMappingURL=GlobalFluidEffector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/GlobalFluidEffector.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,EAAE,CAEA;CACrB;sCAXqC,4BAA4B"}
1
+ {"version":3,"file":"GlobalFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/GlobalFluidEffector.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH;IAEI;;;;;;OAMG;IACH,OAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEhB;CA8ErB;sCAtGqC,4BAA4B"}
@@ -1,12 +1,105 @@
1
- import { AbstractFluidEffector } from "./AbstractFluidEffector.js";
2
-
3
- /**
4
- * Affects fluid everywhere inside the field uniformly
5
- */
6
- export class GlobalFluidEffector extends AbstractFluidEffector{
7
- /**
8
- * 3d force vector
9
- * @type {number[]}
10
- */
11
- force = [0, 0, 0];
12
- }
1
+ import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
2
+ import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
3
+ import { AbstractFluidEffector } from "./AbstractFluidEffector.js";
4
+
5
+ /**
6
+ * Adds the same acceleration to every fluid cell each step (gravity, ambient wind).
7
+ *
8
+ * `force` is in WORLD units per second squared. The `world_to_grid` matrix is applied
9
+ * (as a direction transform — translation ignored) inside {@link apply} to convert
10
+ * the force into the target field's grid-cell units before depositing. The same
11
+ * GlobalFluidEffector applied to fields with different `cell_size` therefore produces
12
+ * the same world-space acceleration on each — gravity stays gravity.
13
+ *
14
+ * Solid cells are left untouched — the projection step would zero them anyway, but
15
+ * skipping the write is slightly cheaper and keeps the solid mask authoritative for
16
+ * effectors as well as the solver.
17
+ */
18
+ export class GlobalFluidEffector extends AbstractFluidEffector {
19
+
20
+ /**
21
+ * Acceleration vector in WORLD units per second squared (e.g. `[0, -9.8, 0]` for
22
+ * Earth gravity in metres-and-seconds). Per-step deposit into the velocity field
23
+ * is `world_to_grid · force × dt`.
24
+ *
25
+ * @type {[number, number, number]}
26
+ */
27
+ force = [0, 0, 0];
28
+
29
+ /**
30
+ * @param {FluidField} field
31
+ * @param {number} dt
32
+ * @param {Float32Array|number[]} world_to_grid Column-major 4×4 affine; only the
33
+ * linear (upper-left 3×3) part is
34
+ * used since force is a direction.
35
+ */
36
+ apply(field, dt, world_to_grid) {
37
+ const wfx = this.force[0];
38
+ const wfy = this.force[1];
39
+ const wfz = this.force[2];
40
+
41
+ if (wfx === 0 && wfy === 0 && wfz === 0) {
42
+ return;
43
+ }
44
+
45
+ // Direction-transform: apply the linear part of world_to_grid (translation in
46
+ // m[12..14] is for points, not directions). For the axis-aligned uniform-scale
47
+ // matrices built by FluidSystem this collapses to division by cell_size, so
48
+ // world m/s² becomes grid cells/s².
49
+ const m = world_to_grid;
50
+ const fx = (m[0] * wfx + m[4] * wfy + m[8] * wfz) * dt;
51
+ const fy = (m[1] * wfx + m[5] * wfy + m[9] * wfz) * dt;
52
+ const fz = (m[2] * wfx + m[6] * wfy + m[10] * wfz) * dt;
53
+
54
+ const vx = field.velocity_x;
55
+ const vy = field.velocity_y;
56
+ const vz = field.velocity_z;
57
+ const solid = field.solid;
58
+ const n = vx.length;
59
+
60
+ for (let i = 0; i < n; i++) {
61
+ if (solid[i] !== 0) {
62
+ continue;
63
+ }
64
+ vx[i] += fx;
65
+ vy[i] += fy;
66
+ vz[i] += fz;
67
+ }
68
+ }
69
+
70
+ /**
71
+ * @param {AbstractFluidEffector} other
72
+ * @return {boolean}
73
+ */
74
+ equals(other) {
75
+ if (other === this) {
76
+ return true;
77
+ }
78
+ if (!(other instanceof GlobalFluidEffector)) {
79
+ return false;
80
+ }
81
+ return this.force[0] === other.force[0]
82
+ && this.force[1] === other.force[1]
83
+ && this.force[2] === other.force[2];
84
+ }
85
+
86
+ /**
87
+ * @return {number}
88
+ */
89
+ hash() {
90
+ return combine_hash(
91
+ computeHashFloat(this.force[0]),
92
+ computeHashFloat(this.force[1]),
93
+ computeHashFloat(this.force[2])
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Position-free — applies to every cell of any field. Infinite bounds means the
99
+ * broad-phase will never cull this effector.
100
+ * @param {AABB3} out
101
+ */
102
+ getBoundingBox(out) {
103
+ out.setInfiniteBounds();
104
+ }
105
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Splats a velocity impulse into a spherical region around a world-space position
3
+ * each step. Useful for fans, jets, point explosions, and unit-testing the projection
4
+ * step.
5
+ *
6
+ * Falloff is quadratic in the normalized distance — `(1 - r/R)²` — giving a smooth
7
+ * brush profile with zero gradient at the boundary, which projects more cleanly than a
8
+ * hard sphere.
9
+ *
10
+ * Everything is in WORLD units: {@link position} (point), {@link force} (direction
11
+ * vector), {@link radius} (scalar length). The `world_to_grid` matrix supplied to
12
+ * {@link apply} converts them at splat time. Works at any user-supplied radius
13
+ * including sub-cell: the effective kernel radius is internally floored at 1 grid
14
+ * cell so a small world-space radius still produces a roughly one-cell-wide splat
15
+ * instead of silently missing every cell.
16
+ *
17
+ * For moving sources that should leave a trail, see {@link WakeFluidEffector}.
18
+ */
19
+ export class ImpulseFluidEffector extends AbstractFluidEffector {
20
+ /**
21
+ * Position in world coordinates.
22
+ * @type {[number, number, number]}
23
+ */
24
+ position: [number, number, number];
25
+ /**
26
+ * Acceleration vector in WORLD units per second squared. Per-step deposit is
27
+ * `world_to_grid · force × dt × falloff_weight`. Same world-units convention as
28
+ * {@link GlobalFluidEffector.force} — gravity stays gravity across fields with
29
+ * different `cell_size`.
30
+ * @type {[number, number, number]}
31
+ */
32
+ force: [number, number, number];
33
+ /**
34
+ * Influence radius in WORLD units. Cells past `radius` from the splat point are
35
+ * unaffected by the falloff. Internally floored to 1 grid cell so sub-cell
36
+ * world-radii still hit cells (the alternative is silently dropping the splat
37
+ * at fractional positions — see class docstring).
38
+ * @type {number}
39
+ */
40
+ radius: number;
41
+ }
42
+ import { AbstractFluidEffector } from "./AbstractFluidEffector.js";
43
+ //# sourceMappingURL=ImpulseFluidEffector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImpulseFluidEffector.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/effector/ImpulseFluidEffector.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;GAiBG;AACH;IAEI;;;OAGG;IACH,UAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEb;IAErB;;;;;;OAMG;IACH,OAFU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAEhB;IAElB;;;;;;OAMG;IACH,QAFU,MAAM,CAEL;CAgKd;sCA9MqC,4BAA4B"}