@woosh/meep-engine 2.138.20 → 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 (491) hide show
  1. package/package.json +1 -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 +3 -0
  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/graphics/camera/testClippingPlaneComputation.js +0 -2
  280. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  281. package/src/engine/graphics/ecs/light/Light.js +27 -0
  282. package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
  283. package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
  284. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  285. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
  286. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
  287. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
  288. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
  289. package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
  290. package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
  291. package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
  292. package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
  293. package/src/engine/physics/PLAN.md +236 -0
  294. package/src/engine/physics/body/BodyStorage.d.ts +187 -0
  295. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
  296. package/src/engine/physics/body/BodyStorage.js +427 -0
  297. package/src/engine/physics/broadphase/PairList.d.ts +62 -0
  298. package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
  299. package/src/engine/physics/broadphase/PairList.js +97 -0
  300. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts +30 -0
  301. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts.map +1 -0
  302. package/src/engine/physics/broadphase/aabb_transform_oriented.js +93 -0
  303. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
  304. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
  305. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
  306. package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
  307. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
  308. package/src/engine/physics/broadphase/generate_pairs.js +101 -0
  309. package/src/engine/physics/contact/ManifoldStore.d.ts +226 -0
  310. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
  311. package/src/engine/physics/contact/ManifoldStore.js +499 -0
  312. package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
  313. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
  314. package/src/engine/physics/ecs/BodyKind.js +24 -0
  315. package/src/engine/physics/ecs/Collider.d.ts +98 -0
  316. package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
  317. package/src/engine/physics/ecs/Collider.js +136 -0
  318. package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
  319. package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
  320. package/src/engine/physics/ecs/ColliderFlags.js +15 -0
  321. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
  322. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
  323. package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
  324. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
  325. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
  326. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
  327. package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
  328. package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
  329. package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
  330. package/src/engine/physics/ecs/PhysicsSystem.d.ts +520 -0
  331. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
  332. package/src/engine/physics/ecs/PhysicsSystem.js +1159 -0
  333. package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
  334. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
  335. package/src/engine/physics/ecs/RigidBody.js +240 -0
  336. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
  337. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
  338. package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
  339. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
  340. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
  341. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
  342. package/src/engine/physics/ecs/SleepState.d.ts +11 -0
  343. package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
  344. package/src/engine/physics/ecs/SleepState.js +12 -0
  345. package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
  346. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
  347. package/src/engine/physics/events/ContactEventBuffer.js +83 -0
  348. package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
  349. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
  350. package/src/engine/physics/events/diff_manifolds.js +50 -0
  351. package/src/engine/physics/fluid/FluidField.d.ts +294 -16
  352. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  353. package/src/engine/physics/fluid/FluidField.js +510 -66
  354. package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
  355. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  356. package/src/engine/physics/fluid/FluidSimulator.js +455 -95
  357. package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
  358. package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
  359. package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
  360. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
  361. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
  362. package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
  363. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
  364. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
  365. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
  366. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
  367. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
  368. package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
  369. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
  370. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
  371. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
  372. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
  373. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  374. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
  375. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
  376. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
  377. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
  378. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
  379. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  380. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
  381. package/src/engine/physics/fluid/prototype.js +102 -91
  382. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
  383. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
  384. package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
  385. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
  386. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  387. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
  388. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
  389. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  390. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
  391. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
  392. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
  393. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
  394. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
  395. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
  396. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
  397. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
  398. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
  399. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
  400. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
  401. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
  402. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
  403. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
  404. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
  405. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
  406. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
  407. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
  408. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
  409. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
  410. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
  411. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
  412. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts +20 -0
  413. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts.map +1 -0
  414. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.js +83 -0
  415. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +26 -0
  416. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
  417. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +70 -0
  418. package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
  419. package/src/engine/physics/gjk/expanding_polytope_algorithm.js +8 -10
  420. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +29 -0
  421. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
  422. package/src/engine/physics/inertia/world_inverse_inertia.js +79 -0
  423. package/src/engine/physics/integration/integrate_position.d.ts +16 -0
  424. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
  425. package/src/engine/physics/integration/integrate_position.js +48 -0
  426. package/src/engine/physics/integration/integrate_velocity.d.ts +25 -0
  427. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
  428. package/src/engine/physics/integration/integrate_velocity.js +79 -0
  429. package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
  430. package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
  431. package/src/engine/physics/integration/quat_integrate.js +62 -0
  432. package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
  433. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
  434. package/src/engine/physics/island/IslandBuilder.js +411 -0
  435. package/src/engine/physics/island/union_find.d.ts +51 -0
  436. package/src/engine/physics/island/union_find.d.ts.map +1 -0
  437. package/src/engine/physics/island/union_find.js +76 -0
  438. package/src/engine/physics/narrowphase/PosedShape.d.ts +59 -0
  439. package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
  440. package/src/engine/physics/narrowphase/PosedShape.js +110 -0
  441. package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
  442. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
  443. package/src/engine/physics/narrowphase/box_box_manifold.js +543 -0
  444. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
  445. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
  446. package/src/engine/physics/narrowphase/capsule_contacts.js +508 -0
  447. package/src/engine/physics/narrowphase/narrowphase_step.d.ts +11 -0
  448. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
  449. package/src/engine/physics/narrowphase/narrowphase_step.js +382 -0
  450. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
  451. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
  452. package/src/engine/physics/narrowphase/sphere_box_contact.js +130 -0
  453. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
  454. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
  455. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
  456. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
  457. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
  458. package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
  459. package/src/engine/physics/queries/raycast.d.ts +20 -0
  460. package/src/engine/physics/queries/raycast.d.ts.map +1 -0
  461. package/src/engine/physics/queries/raycast.js +249 -0
  462. package/src/engine/physics/solver/friction_cone.d.ts +16 -0
  463. package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
  464. package/src/engine/physics/solver/friction_cone.js +37 -0
  465. package/src/engine/physics/solver/solve_contacts.d.ts +36 -0
  466. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
  467. package/src/engine/physics/solver/solve_contacts.js +598 -0
  468. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
  469. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
  470. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
  471. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
  472. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
  473. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
  474. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
  475. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
  476. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
  477. package/src/engine/ecs/components/Motion.d.ts +0 -21
  478. package/src/engine/ecs/components/Motion.d.ts.map +0 -1
  479. package/src/engine/ecs/components/Motion.js +0 -27
  480. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
  481. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
  482. package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
  483. package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
  484. package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
  485. package/src/engine/ecs/systems/MotionSystem.js +0 -29
  486. package/src/engine/physics/fluid/Fluid.d.ts +0 -26
  487. package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
  488. package/src/engine/physics/fluid/Fluid.js +0 -221
  489. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
  490. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
  491. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.js +0 -8
@@ -0,0 +1,508 @@
1
+ import { line3_closest_points_segment_segment } from "../../../core/geom/3d/line/line3_closest_points_segment_segment.js";
2
+ import { line3_compute_segment_nearest_point_to_point_t } from "../../../core/geom/3d/line/line3_compute_segment_nearest_point_to_point_t.js";
3
+ import { sphere_box_contact } from "./sphere_box_contact.js";
4
+
5
+ /**
6
+ * Closed-form narrowphase helpers for the capsule family. A capsule is the
7
+ * Minkowski sum of a line segment and a sphere of radius `r`, so contact
8
+ * resolution reduces to:
9
+ * - capsule-sphere → point-on-segment distance, then sphere-style normal
10
+ * - capsule-capsule → segment-segment closest pair
11
+ * - capsule-box → segment-vs-OBB closest point (iterative)
12
+ *
13
+ * Output convention (matches the rest of the narrowphase family):
14
+ * out[0..2] : normal pointing from B toward A
15
+ * out[3] : penetration depth (positive)
16
+ * out[4..6] : world contact on A's surface
17
+ * out[7..9] : world contact on B's surface
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+
23
+ const scratch_st = new Float64Array(2);
24
+
25
+ /**
26
+ * Rotate a body-local vector into world space via the quaternion identity
27
+ * `v' = q · v · q*`. Writes (rx, ry, rz) into the destination at offset.
28
+ *
29
+ * @param {number[]|Float64Array} out
30
+ * @param {number} off
31
+ * @param {number} vx
32
+ * @param {number} vy
33
+ * @param {number} vz
34
+ * @param {number} qx
35
+ * @param {number} qy
36
+ * @param {number} qz
37
+ * @param {number} qw
38
+ */
39
+ function rotate_local_to_world(out, off, vx, vy, vz, qx, qy, qz, qw) {
40
+ const ix = qw * vx + qy * vz - qz * vy;
41
+ const iy = qw * vy + qz * vx - qx * vz;
42
+ const iz = qw * vz + qx * vy - qy * vx;
43
+ const iw = -qx * vx - qy * vy - qz * vz;
44
+ out[off] = ix * qw + iw * (-qx) + iy * (-qz) - iz * (-qy);
45
+ out[off + 1] = iy * qw + iw * (-qy) + iz * (-qx) - ix * (-qz);
46
+ out[off + 2] = iz * qw + iw * (-qz) + ix * (-qy) - iy * (-qx);
47
+ }
48
+
49
+ /**
50
+ * Inverse-rotate a world vector into body space via the conjugate quaternion.
51
+ *
52
+ * @param {number[]|Float64Array} out
53
+ * @param {number} off
54
+ * @param {number} vx
55
+ * @param {number} vy
56
+ * @param {number} vz
57
+ * @param {number} qx
58
+ * @param {number} qy
59
+ * @param {number} qz
60
+ * @param {number} qw
61
+ */
62
+ function rotate_world_to_local(out, off, vx, vy, vz, qx, qy, qz, qw) {
63
+ const cx = -qx, cy = -qy, cz = -qz;
64
+ const tx = qw * vx + cy * vz - cz * vy;
65
+ const ty = qw * vy + cz * vx - cx * vz;
66
+ const tz = qw * vz + cx * vy - cy * vx;
67
+ const tw = -cx * vx - cy * vy - cz * vz;
68
+ out[off] = tx * qw + tw * qx + ty * qz - tz * qy;
69
+ out[off + 1] = ty * qw + tw * qy + tz * qx - tx * qz;
70
+ out[off + 2] = tz * qw + tw * qz + tx * qy - ty * qx;
71
+ }
72
+
73
+ const scratch_seg = new Float64Array(6);
74
+
75
+ /**
76
+ * Compute the two world endpoints of a capsule's central segment given its
77
+ * pose. The capsule is Y-aligned in body frame; the segment runs from
78
+ * `(0, -h/2, 0)` to `(0, +h/2, 0)`. Writes endpoints into `out` as
79
+ * `[ax, ay, az, bx, by, bz]`.
80
+ *
81
+ * @param {number[]|Float64Array} out length >= 6
82
+ * @param {number} cx capsule centre x
83
+ * @param {number} cy
84
+ * @param {number} cz
85
+ * @param {number} qx quaternion x
86
+ * @param {number} qy
87
+ * @param {number} qz
88
+ * @param {number} qw
89
+ * @param {number} half_height
90
+ */
91
+ export function capsule_world_segment(out, cx, cy, cz, qx, qy, qz, qw, half_height) {
92
+ rotate_local_to_world(out, 0, 0, -half_height, 0, qx, qy, qz, qw);
93
+ rotate_local_to_world(out, 3, 0, half_height, 0, qx, qy, qz, qw);
94
+ out[0] += cx; out[1] += cy; out[2] += cz;
95
+ out[3] += cx; out[4] += cy; out[5] += cz;
96
+ }
97
+
98
+ // --- capsule vs sphere ------------------------------------------------------
99
+
100
+ /**
101
+ * Capsule (A) vs sphere (B) contact, closed-form via point-segment distance.
102
+ *
103
+ * @param {number[]|Float64Array} out length >= 10
104
+ * @param {number} a_cx capsule centre x
105
+ * @param {number} a_cy
106
+ * @param {number} a_cz
107
+ * @param {number} a_qx capsule rotation
108
+ * @param {number} a_qy
109
+ * @param {number} a_qz
110
+ * @param {number} a_qw
111
+ * @param {number} a_radius
112
+ * @param {number} a_half_h capsule half-height (not including caps)
113
+ * @param {number} b_cx sphere centre x
114
+ * @param {number} b_cy
115
+ * @param {number} b_cz
116
+ * @param {number} b_radius
117
+ * @returns {boolean} true on overlap
118
+ */
119
+ export function capsule_sphere_contact(
120
+ out,
121
+ a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_radius, a_half_h,
122
+ b_cx, b_cy, b_cz, b_radius
123
+ ) {
124
+ capsule_world_segment(scratch_seg, a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_half_h);
125
+ const sax = scratch_seg[0], say = scratch_seg[1], saz = scratch_seg[2];
126
+ const sbx = scratch_seg[3], sby = scratch_seg[4], sbz = scratch_seg[5];
127
+
128
+ const t = line3_compute_segment_nearest_point_to_point_t(sax, say, saz, sbx, sby, sbz, b_cx, b_cy, b_cz);
129
+
130
+ const px = sax + (sbx - sax) * t;
131
+ const py = say + (sby - say) * t;
132
+ const pz = saz + (sbz - saz) * t;
133
+
134
+ const dx = px - b_cx;
135
+ const dy = py - b_cy;
136
+ const dz = pz - b_cz;
137
+ const dist_sqr = dx * dx + dy * dy + dz * dz;
138
+ const sum = a_radius + b_radius;
139
+ if (dist_sqr >= sum * sum) return false;
140
+
141
+ const dist = Math.sqrt(dist_sqr);
142
+ let nx, ny, nz;
143
+ if (dist > 0) {
144
+ const inv = 1 / dist;
145
+ nx = dx * inv; ny = dy * inv; nz = dz * inv;
146
+ } else {
147
+ // Sphere centre exactly on the capsule segment — pick a deterministic tie-break.
148
+ nx = 1; ny = 0; nz = 0;
149
+ }
150
+
151
+ out[0] = nx; out[1] = ny; out[2] = nz; // normal from B to A
152
+ out[3] = sum - dist;
153
+ // World contact on A (capsule): segment point pushed back by capsule radius along -normal
154
+ out[4] = px - nx * a_radius;
155
+ out[5] = py - ny * a_radius;
156
+ out[6] = pz - nz * a_radius;
157
+ // World contact on B (sphere): sphere centre pushed along +normal by sphere radius
158
+ out[7] = b_cx + nx * b_radius;
159
+ out[8] = b_cy + ny * b_radius;
160
+ out[9] = b_cz + nz * b_radius;
161
+ return true;
162
+ }
163
+
164
+ // --- capsule vs capsule -----------------------------------------------------
165
+
166
+ const scratch_seg_b = new Float64Array(6);
167
+
168
+ /**
169
+ * Two capsules (A and B). Reduces to segment-segment closest pair + radius.
170
+ *
171
+ * @param {number[]|Float64Array} out length >= 10
172
+ * @returns {boolean} true on overlap
173
+ */
174
+ export function capsule_capsule_contact(
175
+ out,
176
+ a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_radius, a_half_h,
177
+ b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw, b_radius, b_half_h
178
+ ) {
179
+ capsule_world_segment(scratch_seg, a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_half_h);
180
+ capsule_world_segment(scratch_seg_b, b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw, b_half_h);
181
+
182
+ const a0x = scratch_seg[0], a0y = scratch_seg[1], a0z = scratch_seg[2];
183
+ const a1x = scratch_seg[3], a1y = scratch_seg[4], a1z = scratch_seg[5];
184
+ const b0x = scratch_seg_b[0], b0y = scratch_seg_b[1], b0z = scratch_seg_b[2];
185
+ const b1x = scratch_seg_b[3], b1y = scratch_seg_b[4], b1z = scratch_seg_b[5];
186
+
187
+ line3_closest_points_segment_segment(
188
+ scratch_st,
189
+ a0x, a0y, a0z, a1x, a1y, a1z,
190
+ b0x, b0y, b0z, b1x, b1y, b1z
191
+ );
192
+
193
+ const s = scratch_st[0];
194
+ const t = scratch_st[1];
195
+
196
+ const pax = a0x + (a1x - a0x) * s;
197
+ const pay = a0y + (a1y - a0y) * s;
198
+ const paz = a0z + (a1z - a0z) * s;
199
+ const pbx = b0x + (b1x - b0x) * t;
200
+ const pby = b0y + (b1y - b0y) * t;
201
+ const pbz = b0z + (b1z - b0z) * t;
202
+
203
+ const dx = pax - pbx;
204
+ const dy = pay - pby;
205
+ const dz = paz - pbz;
206
+ const dist_sqr = dx * dx + dy * dy + dz * dz;
207
+ const sum = a_radius + b_radius;
208
+ if (dist_sqr >= sum * sum) return false;
209
+
210
+ const dist = Math.sqrt(dist_sqr);
211
+ let nx, ny, nz;
212
+ if (dist > 0) {
213
+ const inv = 1 / dist;
214
+ nx = dx * inv; ny = dy * inv; nz = dz * inv;
215
+ } else {
216
+ // Segments touch — fall back to the world-frame direction from B's
217
+ // segment centre toward A's segment centre as a tie-break.
218
+ const acx = (a0x + a1x) * 0.5;
219
+ const acy = (a0y + a1y) * 0.5;
220
+ const acz = (a0z + a1z) * 0.5;
221
+ const bcx = (b0x + b1x) * 0.5;
222
+ const bcy = (b0y + b1y) * 0.5;
223
+ const bcz = (b0z + b1z) * 0.5;
224
+ const ddx = acx - bcx, ddy = acy - bcy, ddz = acz - bcz;
225
+ const dd_sqr = ddx * ddx + ddy * ddy + ddz * ddz;
226
+ if (dd_sqr > 0) {
227
+ const inv2 = 1 / Math.sqrt(dd_sqr);
228
+ nx = ddx * inv2; ny = ddy * inv2; nz = ddz * inv2;
229
+ } else {
230
+ nx = 1; ny = 0; nz = 0;
231
+ }
232
+ }
233
+
234
+ out[0] = nx; out[1] = ny; out[2] = nz;
235
+ out[3] = sum - dist;
236
+ out[4] = pax - nx * a_radius;
237
+ out[5] = pay - ny * a_radius;
238
+ out[6] = paz - nz * a_radius;
239
+ out[7] = pbx + nx * b_radius;
240
+ out[8] = pby + ny * b_radius;
241
+ out[9] = pbz + nz * b_radius;
242
+ return true;
243
+ }
244
+
245
+ // --- capsule vs oriented box ------------------------------------------------
246
+
247
+ const scratch_a0_local = new Float64Array(3);
248
+ const scratch_a1_local = new Float64Array(3);
249
+
250
+ /**
251
+ * Capsule (A) vs oriented box (B). Brings the capsule segment into box-local
252
+ * space, then refines via 2 fixed-point iterations between:
253
+ * - closest point on the segment to the current box-side candidate
254
+ * - clamped point on the box closest to the current segment-side candidate
255
+ *
256
+ * Two iterations suffice for the cases this engine targets (sphere-like cap
257
+ * geometry against axis-aligned-in-local box). When the segment passes
258
+ * through the box, the "inside" branch picks the smallest-overlap face
259
+ * deterministically, mirroring {@link sphere_box_contact}.
260
+ *
261
+ * @param {number[]|Float64Array} out length >= 10
262
+ * @returns {boolean}
263
+ */
264
+ export function capsule_box_contact(
265
+ out,
266
+ a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_radius, a_half_h,
267
+ b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw, b_hx, b_hy, b_hz
268
+ ) {
269
+ // Bring the capsule's segment endpoints into box-local space.
270
+ rotate_world_to_local(scratch_a0_local, 0, -0, -a_half_h, 0, a_qx, a_qy, a_qz, a_qw);
271
+ // Note: we constructed the segment ends in body frame as (0, ±h, 0). We
272
+ // need them in world first, then box-local. Build world here directly
273
+ // for clarity.
274
+ capsule_world_segment(scratch_seg, a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_half_h);
275
+ // World → box-local: subtract box centre, then rotate by conjugate of box quat.
276
+ const w_a0x = scratch_seg[0] - b_cx, w_a0y = scratch_seg[1] - b_cy, w_a0z = scratch_seg[2] - b_cz;
277
+ const w_a1x = scratch_seg[3] - b_cx, w_a1y = scratch_seg[4] - b_cy, w_a1z = scratch_seg[5] - b_cz;
278
+ rotate_world_to_local(scratch_a0_local, 0, w_a0x, w_a0y, w_a0z, b_qx, b_qy, b_qz, b_qw);
279
+ rotate_world_to_local(scratch_a1_local, 0, w_a1x, w_a1y, w_a1z, b_qx, b_qy, b_qz, b_qw);
280
+
281
+ const a0lx = scratch_a0_local[0], a0ly = scratch_a0_local[1], a0lz = scratch_a0_local[2];
282
+ const a1lx = scratch_a1_local[0], a1ly = scratch_a1_local[1], a1lz = scratch_a1_local[2];
283
+
284
+ // Fixed-point iteration: start with t at the closest point to the box centre.
285
+ let t = line3_compute_segment_nearest_point_to_point_t(a0lx, a0ly, a0lz, a1lx, a1ly, a1lz, 0, 0, 0);
286
+ let plx = a0lx + (a1lx - a0lx) * t;
287
+ let ply = a0ly + (a1ly - a0ly) * t;
288
+ let plz = a0lz + (a1lz - a0lz) * t;
289
+
290
+ for (let iter = 0; iter < 2; iter++) {
291
+ // Clamp current segment point to the box → closest box-surface point.
292
+ const qlx = plx < -b_hx ? -b_hx : (plx > b_hx ? b_hx : plx);
293
+ const qly = ply < -b_hy ? -b_hy : (ply > b_hy ? b_hy : ply);
294
+ const qlz = plz < -b_hz ? -b_hz : (plz > b_hz ? b_hz : plz);
295
+
296
+ // Re-find closest segment point to that box point.
297
+ t = line3_compute_segment_nearest_point_to_point_t(
298
+ a0lx, a0ly, a0lz, a1lx, a1ly, a1lz,
299
+ qlx, qly, qlz
300
+ );
301
+ plx = a0lx + (a1lx - a0lx) * t;
302
+ ply = a0ly + (a1ly - a0ly) * t;
303
+ plz = a0lz + (a1lz - a0lz) * t;
304
+ }
305
+
306
+ // Final box-side point.
307
+ const qlx = plx < -b_hx ? -b_hx : (plx > b_hx ? b_hx : plx);
308
+ const qly = ply < -b_hy ? -b_hy : (ply > b_hy ? b_hy : ply);
309
+ const qlz = plz < -b_hz ? -b_hz : (plz > b_hz ? b_hz : plz);
310
+ const inside = qlx === plx && qly === ply && qlz === plz;
311
+
312
+ let nlx, nly, nlz, dist;
313
+ if (!inside) {
314
+ const ex = plx - qlx, ey = ply - qly, ez = plz - qlz;
315
+ const d_sqr = ex * ex + ey * ey + ez * ez;
316
+ if (d_sqr >= a_radius * a_radius) return false;
317
+ dist = Math.sqrt(d_sqr);
318
+ if (dist > 0) {
319
+ const inv = 1 / dist;
320
+ nlx = ex * inv; nly = ey * inv; nlz = ez * inv;
321
+ } else {
322
+ nlx = 1; nly = 0; nlz = 0;
323
+ }
324
+ } else {
325
+ // Segment point is inside the box. Pick smallest-overlap face.
326
+ const dxf = b_hx - Math.abs(plx);
327
+ const dyf = b_hy - Math.abs(ply);
328
+ const dzf = b_hz - Math.abs(plz);
329
+ if (dxf <= dyf && dxf <= dzf) {
330
+ nlx = plx >= 0 ? 1 : -1; nly = 0; nlz = 0; dist = -dxf;
331
+ } else if (dyf <= dzf) {
332
+ nlx = 0; nly = ply >= 0 ? 1 : -1; nlz = 0; dist = -dyf;
333
+ } else {
334
+ nlx = 0; nly = 0; nlz = plz >= 0 ? 1 : -1; dist = -dzf;
335
+ }
336
+ }
337
+
338
+ // Normal (box → capsule axis point) into world.
339
+ rotate_local_to_world(out, 0, nlx, nly, nlz, b_qx, b_qy, b_qz, b_qw);
340
+ const nx = out[0], ny = out[1], nz = out[2];
341
+ out[3] = a_radius - dist;
342
+
343
+ // Capsule-side contact: world segment point pushed back by radius.
344
+ rotate_local_to_world(out, 4, plx, ply, plz, b_qx, b_qy, b_qz, b_qw);
345
+ out[4] += b_cx - nx * a_radius;
346
+ out[5] += b_cy - ny * a_radius;
347
+ out[6] += b_cz - nz * a_radius;
348
+
349
+ // Box-side contact: world projection of the box-surface point.
350
+ rotate_local_to_world(out, 7, qlx, qly, qlz, b_qx, b_qy, b_qz, b_qw);
351
+ out[7] += b_cx;
352
+ out[8] += b_cy;
353
+ out[9] += b_cz;
354
+
355
+ return true;
356
+ }
357
+
358
+ // --- capsule vs oriented box, multi-point manifold --------------------------
359
+
360
+ /**
361
+ * Output stride per contact in {@link capsule_box_multi_contacts}.
362
+ * Matches the candidate-buffer layout used by `narrowphase_step`.
363
+ *
364
+ * 0..2 : world contact on capsule side
365
+ * 3..5 : world contact on box side
366
+ * 6..8 : normal from box (B) toward capsule (A)
367
+ * 9 : depth (positive = penetration)
368
+ *
369
+ * @type {number}
370
+ */
371
+ export const CAPSULE_BOX_CONTACT_STRIDE = 10;
372
+
373
+ /**
374
+ * Maximum contact points {@link capsule_box_multi_contacts} can emit.
375
+ * - 1 from the closest-point-on-segment vs OBB query (primary)
376
+ * - up to 2 from the cap-centre sphere-vs-OBB queries (one per endpoint)
377
+ * @type {number}
378
+ */
379
+ export const CAPSULE_BOX_MAX_CONTACTS = 3;
380
+
381
+ const scratch_primary = new Float64Array(10);
382
+ const scratch_endpoint = new Float64Array(10);
383
+
384
+ /**
385
+ * Two world positions are treated as the same contact when their squared
386
+ * distance is below this threshold. Picked so that a capsule resting flat
387
+ * doesn't double up the primary closest-segment-point contact with whichever
388
+ * endpoint it happens to coincide with.
389
+ *
390
+ * Looser than the manifold's warm-start match tolerance (≈0.02) because we
391
+ * specifically want to dedupe contacts at the *same* point; small lateral
392
+ * shifts of the capsule produce distinct contacts that should both be kept.
393
+ * @type {number}
394
+ */
395
+ const DEDUPE_DIST_SQR = 1e-6;
396
+
397
+ /**
398
+ * Multi-point capsule-vs-OBB contact generation. Emits up to
399
+ * {@link CAPSULE_BOX_MAX_CONTACTS} contacts into `out` in the
400
+ * `(wax, way, waz, wbx, wby, wbz, nx, ny, nz, depth)` stride layout.
401
+ *
402
+ * The motivation: a capsule lying flat on a face needs more than one
403
+ * contact to rest stably — a single contact at the segment's closest point
404
+ * is positionally ambiguous (every interior segment point is equidistant
405
+ * from the face), and the body wobbles around whichever point the
406
+ * iterative closest-point solver happened to converge on. Two contacts at
407
+ * the cap centres pin the capsule's rotation about its long axis.
408
+ *
409
+ * Algorithm:
410
+ * 1. Closest-point-on-segment vs OBB → primary contact (same as
411
+ * {@link capsule_box_contact}).
412
+ * 2. Treat each cap centre as a sphere of cap-radius and run
413
+ * {@link sphere_box_contact} → up to two additional contacts.
414
+ * 3. Dedupe spatially against the primary so a capsule touching with one
415
+ * cap doesn't emit two contacts at the same point.
416
+ *
417
+ * @param {Float64Array} out length >= CAPSULE_BOX_MAX_CONTACTS * CAPSULE_BOX_CONTACT_STRIDE
418
+ * @param {number} a_cx capsule centre x
419
+ * @param {number} a_cy
420
+ * @param {number} a_cz
421
+ * @param {number} a_qx capsule rotation
422
+ * @param {number} a_qy
423
+ * @param {number} a_qz
424
+ * @param {number} a_qw
425
+ * @param {number} a_radius
426
+ * @param {number} a_half_h
427
+ * @param {number} b_cx box centre x
428
+ * @param {number} b_cy
429
+ * @param {number} b_cz
430
+ * @param {number} b_qx
431
+ * @param {number} b_qy
432
+ * @param {number} b_qz
433
+ * @param {number} b_qw
434
+ * @param {number} b_hx
435
+ * @param {number} b_hy
436
+ * @param {number} b_hz
437
+ * @returns {number} number of contacts emitted, in `[0, CAPSULE_BOX_MAX_CONTACTS]`
438
+ */
439
+ export function capsule_box_multi_contacts(
440
+ out,
441
+ a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_radius, a_half_h,
442
+ b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw, b_hx, b_hy, b_hz
443
+ ) {
444
+ // 1. Primary contact: closest segment point vs OBB.
445
+ const primary_ok = capsule_box_contact(
446
+ scratch_primary,
447
+ a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_radius, a_half_h,
448
+ b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw, b_hx, b_hy, b_hz
449
+ );
450
+ if (!primary_ok) return 0;
451
+
452
+ // Repack scratch_primary (normal, depth, A, B) into the candidate stride
453
+ // (A, B, normal, depth) at out[0..10).
454
+ const p_nx = scratch_primary[0], p_ny = scratch_primary[1], p_nz = scratch_primary[2];
455
+ const p_depth = scratch_primary[3];
456
+ const p_ax = scratch_primary[4], p_ay = scratch_primary[5], p_az = scratch_primary[6];
457
+ const p_bx = scratch_primary[7], p_by = scratch_primary[8], p_bz = scratch_primary[9];
458
+ out[0] = p_ax; out[1] = p_ay; out[2] = p_az;
459
+ out[3] = p_bx; out[4] = p_by; out[5] = p_bz;
460
+ out[6] = p_nx; out[7] = p_ny; out[8] = p_nz;
461
+ out[9] = p_depth;
462
+ let count = 1;
463
+
464
+ // 2. Endpoint contacts: treat each cap centre as a sphere of cap-radius.
465
+ capsule_world_segment(scratch_seg, a_cx, a_cy, a_cz, a_qx, a_qy, a_qz, a_qw, a_half_h);
466
+ const ep_x = [scratch_seg[0], scratch_seg[3]];
467
+ const ep_y = [scratch_seg[1], scratch_seg[4]];
468
+ const ep_z = [scratch_seg[2], scratch_seg[5]];
469
+
470
+ for (let i = 0; i < 2; i++) {
471
+ const ok = sphere_box_contact(
472
+ scratch_endpoint,
473
+ ep_x[i], ep_y[i], ep_z[i], a_radius,
474
+ b_cx, b_cy, b_cz, b_qx, b_qy, b_qz, b_qw,
475
+ b_hx, b_hy, b_hz
476
+ );
477
+ if (!ok) continue;
478
+
479
+ const e_nx = scratch_endpoint[0], e_ny = scratch_endpoint[1], e_nz = scratch_endpoint[2];
480
+ const e_depth = scratch_endpoint[3];
481
+ const e_ax = scratch_endpoint[4], e_ay = scratch_endpoint[5], e_az = scratch_endpoint[6];
482
+ const e_bx = scratch_endpoint[7], e_by = scratch_endpoint[8], e_bz = scratch_endpoint[9];
483
+
484
+ // Dedupe against every already-emitted contact (primary, then any
485
+ // prior endpoint we've already accepted). The capsule-side world
486
+ // point uniquely identifies a contact for this purpose — two distinct
487
+ // box-surface points always have distinct capsule-side projections
488
+ // along the local-A axis.
489
+ let duplicate = false;
490
+ for (let k = 0; k < count; k++) {
491
+ const ko = k * CAPSULE_BOX_CONTACT_STRIDE;
492
+ const dx = e_ax - out[ko];
493
+ const dy = e_ay - out[ko + 1];
494
+ const dz = e_az - out[ko + 2];
495
+ if (dx * dx + dy * dy + dz * dz < DEDUPE_DIST_SQR) { duplicate = true; break; }
496
+ }
497
+ if (duplicate) continue;
498
+
499
+ const o = count * CAPSULE_BOX_CONTACT_STRIDE;
500
+ out[o] = e_ax; out[o + 1] = e_ay; out[o + 2] = e_az;
501
+ out[o + 3] = e_bx; out[o + 4] = e_by; out[o + 5] = e_bz;
502
+ out[o + 6] = e_nx; out[o + 7] = e_ny; out[o + 8] = e_nz;
503
+ out[o + 9] = e_depth;
504
+ count++;
505
+ }
506
+
507
+ return count;
508
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * For every pair in `pair_list`, do a cross-product over A's collider list ×
3
+ * B's collider list, accumulate candidate contacts, reduce to ≤4, and write
4
+ * to the manifold slot.
5
+ *
6
+ * @param {PairList} pair_list
7
+ * @param {ManifoldStore} manifolds
8
+ * @param {PhysicsSystem} system supplies per-body collider lists + transforms
9
+ */
10
+ export function narrowphase_step(pair_list: PairList, manifolds: ManifoldStore, system: PhysicsSystem): void;
11
+ //# sourceMappingURL=narrowphase_step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrowphase_step.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/narrowphase/narrowphase_step.js"],"names":[],"mappings":"AAsUA;;;;;;;;GAQG;AACH,6GA8CC"}