@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
@@ -1,91 +1,102 @@
1
- import { MetricCollection } from "../../development/performance/MetricCollection.js";
2
- import {
3
- MetricCollectionConsoleMonitor
4
- } from "../../development/performance/monitor/MetricCollectionConsoleMonitor.js";
5
- import Entity from "../../ecs/Entity.js";
6
- import GUIElement from "../../ecs/gui/GUIElement.js";
7
- import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
8
- import { EngineHarness } from "../../EngineHarness.js";
9
- import { BehaviorComponent } from "../../intelligence/behavior/ecs/BehaviorComponent.js";
10
- import { BehaviorSystem } from "../../intelligence/behavior/ecs/BehaviorSystem.js";
11
- import { FluidField } from "./FluidField.js";
12
- import { FluidSimulator } from "./FluidSimulator.js";
13
- import { SliceVisualiser } from "./SliceVisualiser.js";
14
-
15
- const harness = new EngineHarness();
16
-
17
- const metrics = new MetricCollection();
18
-
19
- metrics.create({ name: 'sim' })
20
-
21
- /**
22
- *
23
- * @param {Engine} engine
24
- */
25
- function main(engine) {
26
-
27
- const ecd = engine.entityManager.dataset;
28
-
29
- const field = new FluidField();
30
-
31
- field.addAttribute('x');
32
- field.addAttribute('y');
33
- field.addAttribute('z');
34
-
35
- field.resolution = [32, 32, 64];
36
-
37
- field.build();
38
-
39
- field.setAttributeAt(0, 15, 16, 0, -100);
40
- field.setAttributeAt(0, 17, 16, 0, 100);
41
- field.setAttributeAt(1, 16, 15, 0, -100);
42
- field.setAttributeAt(1, 16, 17, 0, 100);
43
-
44
- field.setAttributeAt(2, 15, 16, 0, 100);
45
- field.setAttributeAt(2, 17, 16, 0, 100);
46
- field.setAttributeAt(2, 16, 15, 0, 100);
47
- field.setAttributeAt(2, 16, 17, 0, 100);
48
-
49
-
50
- const sim = new FluidSimulator();
51
-
52
-
53
- const slice_view = new SliceVisualiser();
54
-
55
- slice_view.size.set(432, 1000);
56
- slice_view.scale.setScalar(2);
57
- slice_view.transformOrigin.set(0, 0);
58
-
59
- slice_view.setData(field.buffer, field.resolution);
60
-
61
-
62
- new Entity()
63
- .add(BehaviorComponent.loop(time_delta => {
64
-
65
- const t0 = performance.now();
66
-
67
- sim.step(field, 0.015);
68
-
69
- metrics.get('sim').record(performance.now() - t0);
70
-
71
- slice_view.setData(field.buffer, field.resolution);
72
-
73
- slice_view.draw();
74
-
75
- }))
76
- .build(ecd);
77
-
78
- MetricCollectionConsoleMonitor.from(metrics).start()
79
-
80
- new Entity()
81
- .add(GUIElement.fromView(slice_view))
82
- .build(ecd);
83
-
84
- }
85
-
86
- harness.initialize({
87
- configuration(config, engine) {
88
- config.addSystem(new GUIElementSystem(engine.gameView, engine))
89
- config.addSystem(new BehaviorSystem(engine))
90
- }
91
- }).then(main)
1
+ import { MetricCollection } from "../../development/performance/MetricCollection.js";
2
+ import {
3
+ MetricCollectionConsoleMonitor
4
+ } from "../../development/performance/monitor/MetricCollectionConsoleMonitor.js";
5
+ import Entity from "../../ecs/Entity.js";
6
+ import GUIElement from "../../ecs/gui/GUIElement.js";
7
+ import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
8
+ import { EngineHarness } from "../../EngineHarness.js";
9
+ import { BehaviorComponent } from "../../intelligence/behavior/ecs/BehaviorComponent.js";
10
+ import { BehaviorSystem } from "../../intelligence/behavior/ecs/BehaviorSystem.js";
11
+ import { FluidComponent } from "./ecs/FluidComponent.js";
12
+ import { FluidEffectorsComponent } from "./ecs/FluidEffectorsComponent.js";
13
+ import { FluidSystem } from "./ecs/FluidSystem.js";
14
+ import { GlobalFluidEffector } from "./effector/GlobalFluidEffector.js";
15
+ import { ImpulseFluidEffector } from "./effector/ImpulseFluidEffector.js";
16
+ import { SliceVisualiser } from "./SliceVisualiser.js";
17
+
18
+ const harness = new EngineHarness();
19
+ const metrics = new MetricCollection();
20
+ metrics.create({ name: 'sim' });
21
+
22
+ /**
23
+ * @param {Engine} engine
24
+ */
25
+ function main(engine) {
26
+ const ecd = engine.entityManager.dataset;
27
+
28
+ const RES_X = 32, RES_Y = 32, RES_Z = 8;
29
+
30
+ // Fluid volume entity: holds the field + its world placement. The FluidSystem
31
+ // will step it each fixed update.
32
+ const fluid_component = new FluidComponent();
33
+ fluid_component.field.setResolution(RES_X, RES_Y, RES_Z);
34
+ fluid_component.field.addScalar("dye");
35
+ fluid_component.field.build();
36
+ fluid_component.origin = [0, 0, 0];
37
+ fluid_component.cell_size = 1; // world = grid for this demo
38
+
39
+ // Seed a dye blob in the middle so the advection is visually obvious.
40
+ const field = fluid_component.field;
41
+ for (let z = 1; z < RES_Z - 1; z++) {
42
+ for (let dy = -2; dy <= 2; dy++) {
43
+ for (let dx = -2; dx <= 2; dx++) {
44
+ field.setScalarAtIndex(0,
45
+ (RES_X >> 1) + dx, (RES_Y >> 1) + dy, z,
46
+ 1);
47
+ }
48
+ }
49
+ }
50
+
51
+ new Entity().add(fluid_component).build(ecd);
52
+
53
+ // Effector entity: separate from the fluid volume. With cell_size=1 above, world
54
+ // coords here line up 1:1 with grid coords.
55
+ const effectors = new FluidEffectorsComponent();
56
+
57
+ const gravity = new GlobalFluidEffector();
58
+ gravity.force = [0, -5, 0];
59
+ effectors.addEffector(gravity);
60
+
61
+ const swirl = new ImpulseFluidEffector();
62
+ swirl.position = [RES_X >> 1, RES_Y >> 1, RES_Z >> 1];
63
+ swirl.force = [15, 0, 0];
64
+ swirl.radius = 3;
65
+ effectors.addEffector(swirl);
66
+
67
+ new Entity().add(effectors).build(ecd);
68
+
69
+ // Debug visualisation — a per-frame behavior, separate from the fluid stepping.
70
+ const slice_view = new SliceVisualiser();
71
+ slice_view.size.set(RES_X * 6, RES_Y * 2);
72
+ slice_view.scale.setScalar(2);
73
+ slice_view.transformOrigin.set(0, 0);
74
+ slice_view.setChannels(
75
+ [field.velocity_x, field.velocity_y, field.velocity_z, field.getScalarData("dye")],
76
+ field.getResolution()
77
+ );
78
+
79
+ new Entity()
80
+ .add(BehaviorComponent.loop(() => {
81
+ // FluidSystem.fixedUpdate is what advances the sim; we just observe and
82
+ // time the draw cost here.
83
+ const t0 = performance.now();
84
+ slice_view.draw();
85
+ metrics.get('sim').record(performance.now() - t0);
86
+ }))
87
+ .build(ecd);
88
+
89
+ MetricCollectionConsoleMonitor.from(metrics).start();
90
+
91
+ new Entity()
92
+ .add(GUIElement.fromView(slice_view))
93
+ .build(ecd);
94
+ }
95
+
96
+ harness.initialize({
97
+ configuration(config, engine) {
98
+ config.addSystem(new GUIElementSystem(engine.gameView, engine));
99
+ config.addSystem(new BehaviorSystem(engine));
100
+ config.addSystem(new FluidSystem());
101
+ }
102
+ }).then(main);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Optimal SOR relaxation factor for the 7-point Laplacian on a cell-centered grid
3
+ * with Neumann boundaries (the discretisation {@link v3_grid_solve_pressure} uses).
4
+ *
5
+ * For a Poisson problem on a uniform grid of side `N`, the Jacobi iteration matrix
6
+ * has spectral radius `ρ_J ≈ cos(π/N)`. The classical optimal SOR factor is
7
+ *
8
+ * ω_opt = 2 / (1 + √(1 - ρ_J²)) = 2 / (1 + sin(π/N))
9
+ *
10
+ * On non-cubic grids the slowest-converging mode has a wavelength bounded below by
11
+ * the longest side, so we use `N = max(res_x, res_y, res_z)`. This is slightly
12
+ * conservative on lopsided grids — the true optimum would also account for the
13
+ * shorter axes — but it never overshoots into the divergent ω ≥ 2 region, and the
14
+ * dropoff in convergence rate around the optimum is mild.
15
+ *
16
+ * Reference values:
17
+ * N = 8 → ω ≈ 1.446
18
+ * N = 16 → ω ≈ 1.674
19
+ * N = 32 → ω ≈ 1.821
20
+ * N = 64 → ω ≈ 1.906
21
+ * N = 128 → ω ≈ 1.952
22
+ *
23
+ * Note the value is always in `(1, 2)` — `1 < ω` for `N ≥ 2`, and `ω → 2` as
24
+ * `N → ∞`. A hardcoded 1.7 is roughly correct for 16³ and dramatically too
25
+ * cautious for 128³.
26
+ *
27
+ * @param {number} res_x
28
+ * @param {number} res_y
29
+ * @param {number} res_z
30
+ * @returns {number} ω in (0, 2)
31
+ */
32
+ export function optimal_sor_omega(res_x: number, res_y: number, res_z: number): number;
33
+ //# sourceMappingURL=optimal_sor_omega.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimal_sor_omega.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/optimal_sor_omega.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,yCALW,MAAM,SACN,MAAM,SACN,MAAM,GACJ,MAAM,CASlB"}
@@ -0,0 +1,41 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * Optimal SOR relaxation factor for the 7-point Laplacian on a cell-centered grid
5
+ * with Neumann boundaries (the discretisation {@link v3_grid_solve_pressure} uses).
6
+ *
7
+ * For a Poisson problem on a uniform grid of side `N`, the Jacobi iteration matrix
8
+ * has spectral radius `ρ_J ≈ cos(π/N)`. The classical optimal SOR factor is
9
+ *
10
+ * ω_opt = 2 / (1 + √(1 - ρ_J²)) = 2 / (1 + sin(π/N))
11
+ *
12
+ * On non-cubic grids the slowest-converging mode has a wavelength bounded below by
13
+ * the longest side, so we use `N = max(res_x, res_y, res_z)`. This is slightly
14
+ * conservative on lopsided grids — the true optimum would also account for the
15
+ * shorter axes — but it never overshoots into the divergent ω ≥ 2 region, and the
16
+ * dropoff in convergence rate around the optimum is mild.
17
+ *
18
+ * Reference values:
19
+ * N = 8 → ω ≈ 1.446
20
+ * N = 16 → ω ≈ 1.674
21
+ * N = 32 → ω ≈ 1.821
22
+ * N = 64 → ω ≈ 1.906
23
+ * N = 128 → ω ≈ 1.952
24
+ *
25
+ * Note the value is always in `(1, 2)` — `1 < ω` for `N ≥ 2`, and `ω → 2` as
26
+ * `N → ∞`. A hardcoded 1.7 is roughly correct for 16³ and dramatically too
27
+ * cautious for 128³.
28
+ *
29
+ * @param {number} res_x
30
+ * @param {number} res_y
31
+ * @param {number} res_z
32
+ * @returns {number} ω in (0, 2)
33
+ */
34
+ export function optimal_sor_omega(res_x, res_y, res_z) {
35
+ assert.isPositiveInteger(res_x, "res_x");
36
+ assert.isPositiveInteger(res_y, "res_y");
37
+ assert.isPositiveInteger(res_z, "res_z");
38
+
39
+ const n = Math.max(res_x, res_y, res_z);
40
+ return 2 / (1 + Math.sin(Math.PI / n));
41
+ }
@@ -1,9 +1,24 @@
1
1
  /**
2
+ * Semi-Lagrangian self-advection of a cell-centered 3D velocity field.
2
3
  *
3
- * @param {Float32Array[]} outputs
4
- * @param {Float32Array[]} inputs
5
- * @param {number[]} resolution
6
- * @param {number} time_delta
4
+ * For each cell, traces backward along the current velocity for one timestep, then
5
+ * trilinearly samples each input velocity component at that back-traced position.
6
+ * Stable for arbitrarily large `time_delta` (the trade-off is numerical diffusion;
7
+ * the field gets blurrier each step).
8
+ *
9
+ * Inputs and outputs must be disjoint Float32Arrays of length `res_x * res_y * res_z`.
10
+ * Cells flagged solid (non-zero in `solid`) keep their input value unchanged.
11
+ *
12
+ * @param {Float32Array[]} outputs `[out_x, out_y, out_z]`, mutated.
13
+ * @param {Float32Array[]} inputs `[in_x, in_y, in_z]`, read; expected to alias the
14
+ * "current" velocity field that drives back-tracing.
15
+ * @param {number} res_x
16
+ * @param {number} res_y
17
+ * @param {number} res_z
18
+ * @param {number} time_delta Simulation timestep, in the same units as velocity
19
+ * (grid-cells / second when used standalone).
20
+ * @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
21
+ * domain); non-zero cells are not updated.
7
22
  */
8
- export function v3_grid_apply_advection_forward(outputs: Float32Array[], inputs: Float32Array[], resolution: number[], time_delta: number): void;
23
+ export function v3_grid_apply_advection_forward(outputs: Float32Array[], inputs: Float32Array[], res_x: number, res_y: number, res_z: number, time_delta: number, solid: Uint8Array): void;
9
24
  //# sourceMappingURL=v3_grid_apply_advection_forward.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3_grid_apply_advection_forward.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,yDALW,YAAY,EAAE,UACd,YAAY,EAAE,cACd,MAAM,EAAE,cACR,MAAM,QAsDhB"}
1
+ {"version":3,"file":"v3_grid_apply_advection_forward.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,yDAXW,YAAY,EAAE,UACd,YAAY,EAAE,SAEd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SAEN,UAAU,QA6DpB"}
@@ -1,61 +1,83 @@
1
+ import { assert } from "../../../../core/assert.js";
1
2
  import { scs3d_sample_linear } from "../../../graphics/texture/3d/scs3d_sample_linear.js";
2
3
 
3
4
  /**
5
+ * Semi-Lagrangian self-advection of a cell-centered 3D velocity field.
4
6
  *
5
- * @param {Float32Array[]} outputs
6
- * @param {Float32Array[]} inputs
7
- * @param {number[]} resolution
8
- * @param {number} time_delta
7
+ * For each cell, traces backward along the current velocity for one timestep, then
8
+ * trilinearly samples each input velocity component at that back-traced position.
9
+ * Stable for arbitrarily large `time_delta` (the trade-off is numerical diffusion;
10
+ * the field gets blurrier each step).
11
+ *
12
+ * Inputs and outputs must be disjoint Float32Arrays of length `res_x * res_y * res_z`.
13
+ * Cells flagged solid (non-zero in `solid`) keep their input value unchanged.
14
+ *
15
+ * @param {Float32Array[]} outputs `[out_x, out_y, out_z]`, mutated.
16
+ * @param {Float32Array[]} inputs `[in_x, in_y, in_z]`, read; expected to alias the
17
+ * "current" velocity field that drives back-tracing.
18
+ * @param {number} res_x
19
+ * @param {number} res_y
20
+ * @param {number} res_z
21
+ * @param {number} time_delta Simulation timestep, in the same units as velocity
22
+ * (grid-cells / second when used standalone).
23
+ * @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
24
+ * domain); non-zero cells are not updated.
9
25
  */
10
- export function v3_grid_apply_advection_forward(outputs, inputs, resolution, time_delta) {
26
+ export function v3_grid_apply_advection_forward(outputs, inputs, res_x, res_y, res_z, time_delta, solid) {
27
+ assert.equal(outputs.length, 3, "outputs is a 3-component array");
28
+ assert.equal(inputs.length, 3, "inputs is a 3-component array");
11
29
 
12
- const res_x = resolution[0];
13
- const res_y = resolution[1];
14
- const res_z = resolution[2];
30
+ const out_x = outputs[0];
31
+ const out_y = outputs[1];
32
+ const out_z = outputs[2];
15
33
 
16
- const input_x = inputs[0];
17
- const input_y = inputs[1];
18
- const input_z = inputs[2];
34
+ const in_x = inputs[0];
35
+ const in_y = inputs[1];
36
+ const in_z = inputs[2];
19
37
 
20
- const slice_size = res_y * res_x;
38
+ const cell_count = res_x * res_y * res_z;
21
39
 
22
- for (
23
- let z = 0;
24
- z < res_z - 1;
25
- z++
26
- ) {
40
+ assert.greaterThanOrEqual(out_x.length, cell_count, "out_x covers grid");
41
+ assert.greaterThanOrEqual(out_y.length, cell_count, "out_y covers grid");
42
+ assert.greaterThanOrEqual(out_z.length, cell_count, "out_z covers grid");
43
+ assert.greaterThanOrEqual(in_x.length, cell_count, "in_x covers grid");
44
+ assert.greaterThanOrEqual(in_y.length, cell_count, "in_y covers grid");
45
+ assert.greaterThanOrEqual(in_z.length, cell_count, "in_z covers grid");
27
46
 
28
- const current_z_slice_offset = z * slice_size;
47
+ assert.notEqual(out_x, in_x, "out_x must not alias in_x");
48
+ assert.notEqual(out_y, in_y, "out_y must not alias in_y");
49
+ assert.notEqual(out_z, in_z, "out_z must not alias in_z");
29
50
 
30
- for (
31
- let y = 0;
32
- y < res_y;
33
- y++
34
- ) {
35
- const current_y_line_offset = y * res_x;
51
+ const slice_size = res_x * res_y;
36
52
 
37
- for (let x = 0; x < res_x; x++) {
53
+ for (let z = 0; z < res_z; z++) {
54
+ const z_off = z * slice_size;
38
55
 
56
+ for (let y = 0; y < res_y; y++) {
57
+ const y_off = y * res_x;
39
58
 
40
- const current_index = current_z_slice_offset + current_y_line_offset + x;
59
+ for (let x = 0; x < res_x; x++) {
60
+ const c = z_off + y_off + x;
61
+
62
+ if (solid[c] !== 0) {
63
+ out_x[c] = in_x[c];
64
+ out_y[c] = in_y[c];
65
+ out_z[c] = in_z[c];
66
+ continue;
67
+ }
41
68
 
42
- const v_x = input_x[current_index]
43
- const v_y = input_y[current_index]
44
- const v_z = input_z[current_index]
69
+ const v_x = in_x[c];
70
+ const v_y = in_y[c];
71
+ const v_z = in_z[c];
45
72
 
46
- // compute previous position of the particle
73
+ // Trace back to where this parcel came from one timestep ago.
47
74
  const s_x = x - v_x * time_delta;
48
75
  const s_y = y - v_y * time_delta;
49
76
  const s_z = z - v_z * time_delta;
50
77
 
51
- // sample values at previous position
52
- const new_x = scs3d_sample_linear(input_x, res_x, res_y, res_z, s_x, s_y, s_z);
53
- const new_y = scs3d_sample_linear(input_y, res_x, res_y, res_z, s_x, s_y, s_z);
54
- const new_z = scs3d_sample_linear(input_z, res_x, res_y, res_z, s_x, s_y, s_z);
55
-
56
- outputs[0][current_index] = new_x;
57
- outputs[1][current_index] = new_y;
58
- outputs[2][current_index] = new_z;
78
+ out_x[c] = scs3d_sample_linear(in_x, res_x, res_y, res_z, s_x, s_y, s_z);
79
+ out_y[c] = scs3d_sample_linear(in_y, res_x, res_y, res_z, s_x, s_y, s_z);
80
+ out_z[c] = scs3d_sample_linear(in_z, res_x, res_y, res_z, s_x, s_y, s_z);
59
81
  }
60
82
  }
61
83
  }
@@ -1,8 +1,29 @@
1
1
  /**
2
+ * Implicit (Gauss-Seidel-like) Jacobi diffusion on a 3D cell-centered scalar grid.
2
3
  *
3
- * @param {Float32Array} output
4
- * @param {Float32Array} input
5
- * @param {number[]} resolution
4
+ * Solves the implicit diffusion equation `(I - a*L) x = x0` for `x`, where L is the
5
+ * discrete Laplacian. Solving implicitly is unconditionally stable for any `a >= 0`,
6
+ * which is why Stam's "Stable Fluids" uses it instead of an explicit step.
7
+ *
8
+ * Each iteration writes into a scratch buffer and swaps; after `iterations` rounds the
9
+ * final result is copied into `output`. Increasing `iterations` increases accuracy at
10
+ * linear cost; 4-20 is the usual range. Boundary cells use Neumann (reflective)
11
+ * conditions — missing neighbours are treated as equal to the cell itself, which
12
+ * reduces the effective denominator.
13
+ *
14
+ * Solid cells (marked non-zero in `solid`) are skipped: their value in `output` is
15
+ * left at the corresponding `x0` value.
16
+ *
17
+ * @param {Float32Array} output Destination (size = res_x * res_y * res_z). Mutated.
18
+ * @param {Float32Array} x0 Source values to diffuse. NOT mutated.
19
+ * @param {Float32Array} scratch Same size as output; used for ping-pong. Mutated.
20
+ * @param {number} res_x
21
+ * @param {number} res_y
22
+ * @param {number} res_z
23
+ * @param {number} a Implicit diffusion coefficient (= dt * diffusion_rate).
24
+ * @param {number} iterations Jacobi iteration count.
25
+ * @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
26
+ * domain); non-zero cells are not updated.
6
27
  */
7
- export function v3_grid_apply_diffusion(output: Float32Array, input: Float32Array, resolution: number[]): void;
28
+ export function v3_grid_apply_diffusion(output: Float32Array, x0: Float32Array, scratch: Float32Array, res_x: number, res_y: number, res_z: number, a: number, iterations: number, solid: Uint8Array): void;
8
29
  //# sourceMappingURL=v3_grid_apply_diffusion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"v3_grid_apply_diffusion.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,gDAJW,YAAY,SACZ,YAAY,cACZ,MAAM,EAAE,QA6ElB"}
1
+ {"version":3,"file":"v3_grid_apply_diffusion.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,gDAXW,YAAY,MACZ,YAAY,WACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,KACN,MAAM,cACN,MAAM,SACN,UAAU,QA2EpB"}
@@ -1,82 +1,102 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
1
3
  /**
4
+ * Implicit (Gauss-Seidel-like) Jacobi diffusion on a 3D cell-centered scalar grid.
5
+ *
6
+ * Solves the implicit diffusion equation `(I - a*L) x = x0` for `x`, where L is the
7
+ * discrete Laplacian. Solving implicitly is unconditionally stable for any `a >= 0`,
8
+ * which is why Stam's "Stable Fluids" uses it instead of an explicit step.
9
+ *
10
+ * Each iteration writes into a scratch buffer and swaps; after `iterations` rounds the
11
+ * final result is copied into `output`. Increasing `iterations` increases accuracy at
12
+ * linear cost; 4-20 is the usual range. Boundary cells use Neumann (reflective)
13
+ * conditions — missing neighbours are treated as equal to the cell itself, which
14
+ * reduces the effective denominator.
2
15
  *
3
- * @param {Float32Array} output
4
- * @param {Float32Array} input
5
- * @param {number[]} resolution
16
+ * Solid cells (marked non-zero in `solid`) are skipped: their value in `output` is
17
+ * left at the corresponding `x0` value.
18
+ *
19
+ * @param {Float32Array} output Destination (size = res_x * res_y * res_z). Mutated.
20
+ * @param {Float32Array} x0 Source values to diffuse. NOT mutated.
21
+ * @param {Float32Array} scratch Same size as output; used for ping-pong. Mutated.
22
+ * @param {number} res_x
23
+ * @param {number} res_y
24
+ * @param {number} res_z
25
+ * @param {number} a Implicit diffusion coefficient (= dt * diffusion_rate).
26
+ * @param {number} iterations Jacobi iteration count.
27
+ * @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
28
+ * domain); non-zero cells are not updated.
6
29
  */
7
- export function v3_grid_apply_diffusion(output, input, resolution) {
8
- let sum = 0;
9
-
10
- const res_x = resolution[0];
11
- const res_y = resolution[1];
12
- const res_z = resolution[2];
13
-
14
-
15
- const slice_size = res_y * res_x;
16
-
17
- // TODO consider taking inspiration from blur filters and performing convolution in 3 separate steps, one per axis. This would require fewer samples in total and potentially offer better cache utilization
18
-
19
- const last_z_slice_offset = (res_z - 1) * slice_size;
20
- const last_y_line_offset = (res_y - 1) * res_x;
21
-
22
- for (
23
- let current_z_slice_offset = 0;
24
- current_z_slice_offset <= last_z_slice_offset;
25
- current_z_slice_offset += slice_size
26
- ) {
27
-
28
- for (
29
- let current_y_line_offset = 0;
30
- current_y_line_offset <= last_y_line_offset;
31
- current_y_line_offset += res_x
32
- ) {
33
-
34
- for (let x = 0; x < res_x; x++) {
35
-
36
- let sample_count = 1;
37
-
38
- sum = 0;
39
-
40
- // sample cells around
41
- if (current_z_slice_offset > 0) {
42
- sample_count++;
43
- sum += input[current_z_slice_offset - slice_size + current_y_line_offset + x]
44
- }
45
-
46
-
47
- if (current_y_line_offset > 0) {
48
- sample_count++;
49
- sum += input[current_z_slice_offset + current_y_line_offset - res_x + x]
50
- }
51
-
52
- if (x > 0) {
53
- sample_count++;
54
- sum += input[current_z_slice_offset + current_y_line_offset + (x - 1)]
55
- }
56
-
57
-
58
- const current = current_z_slice_offset + current_y_line_offset + x;
59
-
60
- sum += input[current];
61
-
62
- if (x < res_x - 1) {
63
- sample_count++;
64
- sum += input[current_z_slice_offset + current_y_line_offset + (x + 1)]
65
- }
66
-
67
- if (current_y_line_offset < last_y_line_offset) {
68
- sample_count++;
69
- sum += input[current_z_slice_offset + current_y_line_offset + res_x + x]
70
- }
30
+ export function v3_grid_apply_diffusion(output, x0, scratch, res_x, res_y, res_z, a, iterations, solid) {
31
+ assert.notEqual(output, x0, "output must differ from x0 (x0 is the source and must not be mutated)");
32
+ assert.notEqual(output, scratch, "output must differ from scratch");
33
+ assert.notEqual(x0, scratch, "x0 must differ from scratch");
34
+ assert.greaterThanOrEqual(output.length, res_x * res_y * res_z, "output covers grid");
35
+ assert.greaterThanOrEqual(x0.length, res_x * res_y * res_z, "x0 covers grid");
36
+ assert.greaterThanOrEqual(scratch.length, res_x * res_y * res_z, "scratch covers grid");
37
+ assert.greaterThanOrEqual(a, 0, "a");
38
+ assert.isNonNegativeInteger(iterations, "iterations");
39
+
40
+ // Seed first iterate with x0.
41
+ output.set(x0);
42
+
43
+ if (iterations === 0 || a === 0) {
44
+ return;
45
+ }
71
46
 
72
- if (current_z_slice_offset < last_z_slice_offset) {
73
- sample_count++;
74
- sum += input[current_z_slice_offset + slice_size + current_y_line_offset + x]
47
+ const slice_size = res_x * res_y;
48
+ const last_x = res_x - 1;
49
+ const last_y = res_y - 1;
50
+ const last_z = res_z - 1;
51
+
52
+ let prev = output;
53
+ let next = scratch;
54
+
55
+ for (let iter = 0; iter < iterations; iter++) {
56
+
57
+ for (let z = 0; z < res_z; z++) {
58
+ const z_off = z * slice_size;
59
+ const has_zm = z > 0;
60
+ const has_zp = z < last_z;
61
+
62
+ for (let y = 0; y < res_y; y++) {
63
+ const y_off = y * res_x;
64
+ const has_ym = y > 0;
65
+ const has_yp = y < last_y;
66
+
67
+ for (let x = 0; x < res_x; x++) {
68
+ const c = z_off + y_off + x;
69
+
70
+ if (solid[c] !== 0) {
71
+ next[c] = x0[c];
72
+ continue;
73
+ }
74
+
75
+ let sum = 0;
76
+ let count = 0;
77
+
78
+ if (x > 0) { sum += prev[c - 1]; count++; }
79
+ if (x < last_x) { sum += prev[c + 1]; count++; }
80
+ if (has_ym) { sum += prev[c - res_x]; count++; }
81
+ if (has_yp) { sum += prev[c + res_x]; count++; }
82
+ if (has_zm) { sum += prev[c - slice_size]; count++; }
83
+ if (has_zp) { sum += prev[c + slice_size]; count++; }
84
+
85
+ // Implicit Jacobi update with Neumann boundary correction:
86
+ // missing neighbours contribute as if equal to the cell, which is
87
+ // equivalent to dropping them from both the numerator and the
88
+ // denominator factor on `a`.
89
+ next[c] = (x0[c] + a * sum) / (1 + a * count);
75
90
  }
76
-
77
- output[current] = sum / sample_count;
78
-
79
91
  }
80
92
  }
93
+
94
+ const tmp = prev;
95
+ prev = next;
96
+ next = tmp;
97
+ }
98
+
99
+ if (prev !== output) {
100
+ output.set(prev);
81
101
  }
82
102
  }