@woosh/meep-engine 2.138.20 → 2.140.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 (584) hide show
  1. package/package.json +1 -1
  2. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.d.ts +3 -3
  3. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.d.ts.map +1 -1
  4. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.js +4 -4
  5. package/src/core/collection/PairUint32Map.d.ts +100 -0
  6. package/src/core/collection/PairUint32Map.d.ts.map +1 -0
  7. package/src/core/collection/PairUint32Map.js +321 -0
  8. package/src/core/collection/Uint32Map.d.ts +119 -0
  9. package/src/core/collection/Uint32Map.d.ts.map +1 -0
  10. package/src/core/collection/Uint32Map.js +345 -0
  11. package/src/core/collection/array/array_shuffle.d.ts +10 -3
  12. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  13. package/src/core/collection/array/array_shuffle.js +27 -22
  14. package/src/core/collection/heap/FibonacciHeap.d.ts +195 -0
  15. package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -0
  16. package/src/core/collection/heap/FibonacciHeap.js +586 -0
  17. package/src/core/collection/heap/Uint32Heap.js +1 -1
  18. package/src/core/collection/heap/Uint32Heap4.d.ts +169 -0
  19. package/src/core/collection/heap/Uint32Heap4.d.ts.map +1 -0
  20. package/src/core/collection/heap/Uint32Heap4.js +490 -0
  21. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +30 -0
  22. package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -0
  23. package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +93 -0
  24. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +27 -0
  25. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +1 -0
  26. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +88 -0
  27. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +54 -0
  28. package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts.map +1 -0
  29. package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +69 -0
  30. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +24 -2
  31. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  32. package/src/core/geom/3d/shape/AbstractShape3D.js +24 -1
  33. package/src/core/geom/3d/shape/BoxShape3D.d.ts +61 -0
  34. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -0
  35. package/src/core/geom/3d/shape/BoxShape3D.js +158 -0
  36. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +11 -0
  37. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  38. package/src/core/geom/3d/shape/CapsuleShape3D.js +12 -0
  39. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +148 -0
  40. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -0
  41. package/src/core/geom/3d/shape/HeightMapShape3D.js +451 -0
  42. package/src/core/geom/3d/shape/MeshShape3D.d.ts +210 -0
  43. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -0
  44. package/src/core/geom/3d/shape/MeshShape3D.js +593 -0
  45. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  46. package/src/core/geom/3d/shape/TransformedShape3D.js +46 -2
  47. package/src/core/geom/3d/shape/Triangle3D.d.ts +95 -0
  48. package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -0
  49. package/src/core/geom/3d/shape/Triangle3D.js +318 -0
  50. package/src/core/geom/3d/shape/UnionShape3D.js +13 -0
  51. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts +37 -9
  52. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts.map +1 -1
  53. package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -98
  54. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts +10 -0
  55. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts.map +1 -1
  56. package/src/core/geom/3d/shape/UnitSphereShape3D.js +11 -0
  57. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts +30 -0
  58. package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts.map +1 -0
  59. package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +64 -0
  60. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +61 -0
  61. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -0
  62. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +148 -0
  63. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts +39 -0
  64. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts.map +1 -0
  65. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +147 -0
  66. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +15 -0
  67. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +1 -0
  68. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +22 -0
  69. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts +2 -0
  70. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts.map +1 -0
  71. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.js +671 -0
  72. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.d.ts +28 -0
  73. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.d.ts.map +1 -0
  74. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js +48 -0
  75. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts +26 -0
  76. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -0
  77. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +222 -0
  78. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts +34 -0
  79. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts.map +1 -0
  80. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -0
  81. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts +36 -0
  82. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -0
  83. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -0
  84. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts +33 -0
  85. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -0
  86. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -0
  87. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts +68 -0
  88. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -0
  89. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +387 -0
  90. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +35 -0
  91. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts.map +1 -0
  92. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +140 -0
  93. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +31 -0
  94. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts.map +1 -0
  95. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +97 -0
  96. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +32 -0
  97. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts.map +1 -0
  98. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -0
  99. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts +41 -0
  100. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts.map +1 -1
  101. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +124 -13
  102. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts +134 -0
  103. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts.map +1 -1
  104. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +276 -3
  105. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +17 -0
  106. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -0
  107. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +135 -0
  108. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts +14 -0
  109. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts.map +1 -0
  110. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +177 -0
  111. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts.map +1 -1
  112. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +20 -4
  113. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  114. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +5 -3
  115. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  116. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +9 -0
  117. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.d.ts.map +1 -1
  118. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -45
  119. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.d.ts.map +1 -1
  120. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.js +7 -1
  121. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts +8 -6
  122. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
  123. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +8 -6
  124. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +22 -0
  125. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts.map +1 -0
  126. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +73 -0
  127. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  128. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +51 -1
  129. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts +10 -0
  130. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -0
  131. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -0
  132. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts +28 -0
  133. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -0
  134. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +227 -0
  135. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts +13 -0
  136. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts.map +1 -0
  137. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -0
  138. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +11 -0
  139. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +1 -0
  140. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +20 -0
  141. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +20 -0
  142. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +1 -0
  143. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +38 -0
  144. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts +2 -2
  145. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts.map +1 -1
  146. package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +1 -1
  147. package/src/core/geom/vec3/v3_dot_array_array.d.ts +3 -3
  148. package/src/core/geom/vec3/v3_dot_array_array.d.ts.map +1 -1
  149. package/src/core/geom/vec3/v3_dot_array_array.js +2 -2
  150. package/src/core/geom/vec3/v3_negate_array.d.ts +3 -3
  151. package/src/core/geom/vec3/v3_negate_array.d.ts.map +1 -1
  152. package/src/core/geom/vec3/v3_negate_array.js +2 -2
  153. package/src/core/geom/vec3/v3_quat3_apply.d.ts +29 -0
  154. package/src/core/geom/vec3/v3_quat3_apply.d.ts.map +1 -0
  155. package/src/core/geom/vec3/v3_quat3_apply.js +39 -0
  156. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +30 -0
  157. package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts.map +1 -0
  158. package/src/core/geom/vec3/v3_quat3_apply_inverse.js +41 -0
  159. package/src/core/geom/vec3/v3_triple_cross_product.d.ts +32 -0
  160. package/src/core/geom/vec3/v3_triple_cross_product.d.ts.map +1 -0
  161. package/src/core/geom/vec3/v3_triple_cross_product.js +45 -0
  162. package/src/core/graph/csr/CSRGraph.d.ts +168 -0
  163. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -0
  164. package/src/core/graph/csr/CSRGraph.js +319 -0
  165. package/src/core/graph/metis/cluster_mesh_metis.d.ts +12 -0
  166. package/src/core/graph/metis/cluster_mesh_metis.d.ts.map +1 -1
  167. package/src/core/graph/metis/cluster_mesh_metis.js +12 -0
  168. package/src/core/graph/metis/metis.d.ts +19 -0
  169. package/src/core/graph/metis/metis.d.ts.map +1 -1
  170. package/src/core/graph/metis/metis.js +20 -0
  171. package/src/core/graph/metis/metis_cluster_bs.d.ts +11 -0
  172. package/src/core/graph/metis/metis_cluster_bs.d.ts.map +1 -1
  173. package/src/core/graph/metis/metis_cluster_bs.js +11 -0
  174. package/src/core/graph/metis/metis_options.d.ts +17 -2
  175. package/src/core/graph/metis/metis_options.d.ts.map +1 -1
  176. package/src/core/graph/metis/metis_options.js +17 -2
  177. package/src/core/graph/metis/native/MetisGraph.d.ts +144 -0
  178. package/src/core/graph/metis/native/MetisGraph.d.ts.map +1 -0
  179. package/src/core/graph/metis/native/MetisGraph.js +212 -0
  180. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts +72 -0
  181. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts.map +1 -0
  182. package/src/core/graph/metis/native/bisection/BisectionScratch.js +101 -0
  183. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts +37 -0
  184. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts.map +1 -0
  185. package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -0
  186. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts +15 -0
  187. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts.map +1 -0
  188. package/src/core/graph/metis/native/bisection/compute_2way_params.js +84 -0
  189. package/src/core/graph/metis/native/bisection/fm_2way.d.ts +30 -0
  190. package/src/core/graph/metis/native/bisection/fm_2way.d.ts.map +1 -0
  191. package/src/core/graph/metis/native/bisection/fm_2way.js +290 -0
  192. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts +23 -0
  193. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts.map +1 -0
  194. package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -0
  195. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts +28 -0
  196. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts.map +1 -0
  197. package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -0
  198. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts +20 -0
  199. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts.map +1 -0
  200. package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -0
  201. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts +24 -0
  202. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts.map +1 -0
  203. package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -0
  204. package/src/core/graph/metis/native/coarsen/match_shem.d.ts +41 -0
  205. package/src/core/graph/metis/native/coarsen/match_shem.d.ts.map +1 -0
  206. package/src/core/graph/metis/native/coarsen/match_shem.js +175 -0
  207. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts +24 -0
  208. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts.map +1 -0
  209. package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -0
  210. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts +29 -0
  211. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts.map +1 -0
  212. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -0
  213. package/src/core/graph/metis/native/metis_partition_kway.d.ts +41 -0
  214. package/src/core/graph/metis/native/metis_partition_kway.d.ts.map +1 -0
  215. package/src/core/graph/metis/native/metis_partition_kway.js +126 -0
  216. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts +62 -0
  217. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts.map +1 -0
  218. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js +261 -0
  219. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts +45 -0
  220. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts.map +1 -0
  221. package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -0
  222. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts +18 -0
  223. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -0
  224. package/src/core/graph/metis/native/refine/compute_kway_params.js +138 -0
  225. package/src/core/graph/metis/native/refine/fm_kway.d.ts +63 -0
  226. package/src/core/graph/metis/native/refine/fm_kway.d.ts.map +1 -0
  227. package/src/core/graph/metis/native/refine/fm_kway.js +462 -0
  228. package/src/core/graph/metis/native/refine/project_kway.d.ts +22 -0
  229. package/src/core/graph/metis/native/refine/project_kway.d.ts.map +1 -0
  230. package/src/core/graph/metis/native/refine/project_kway.js +43 -0
  231. package/src/core/graph/metis/native/refine/refine_kway.d.ts +34 -0
  232. package/src/core/graph/metis/native/refine/refine_kway.d.ts.map +1 -0
  233. package/src/core/graph/metis/native/refine/refine_kway.js +43 -0
  234. package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts +2 -2
  235. package/src/core/math/linalg/eigen/matrix_householder_in_place.js +2 -2
  236. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +6 -4
  237. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -1
  238. package/src/core/math/linalg/eigen/matrix_qr_in_place.js +69 -23
  239. package/src/engine/EngineHarness.d.ts +3 -1
  240. package/src/engine/EngineHarness.d.ts.map +1 -1
  241. package/src/engine/EngineHarness.js +3 -0
  242. package/src/engine/control/first-person/DESIGN.md +30 -6
  243. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -0
  244. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +115 -9
  245. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  246. package/src/engine/control/first-person/FirstPersonPlayerController.js +211 -176
  247. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +601 -8
  248. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  249. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +349 -8
  250. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +319 -23
  251. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  252. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +1789 -799
  253. package/src/engine/control/first-person/TODO.md +173 -0
  254. package/src/engine/control/first-person/abilities/Ability.d.ts +101 -0
  255. package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -0
  256. package/src/engine/control/first-person/abilities/Ability.js +119 -0
  257. package/src/engine/control/first-person/abilities/AbilitySet.d.ts +86 -0
  258. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -0
  259. package/src/engine/control/first-person/abilities/AbilitySet.js +185 -0
  260. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +62 -0
  261. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -0
  262. package/src/engine/control/first-person/abilities/LedgeGrab.js +199 -0
  263. package/src/engine/control/first-person/abilities/Mantle.d.ts +45 -0
  264. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -0
  265. package/src/engine/control/first-person/abilities/Mantle.js +188 -0
  266. package/src/engine/control/first-person/abilities/Slide.d.ts +33 -0
  267. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -0
  268. package/src/engine/control/first-person/abilities/Slide.js +166 -0
  269. package/src/engine/control/first-person/abilities/WallJump.d.ts +45 -0
  270. package/src/engine/control/first-person/abilities/WallJump.d.ts.map +1 -0
  271. package/src/engine/control/first-person/abilities/WallJump.js +131 -0
  272. package/src/engine/control/first-person/abilities/WallRun.d.ts +44 -0
  273. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -0
  274. package/src/engine/control/first-person/abilities/WallRun.js +180 -0
  275. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts +49 -0
  276. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts.map +1 -0
  277. package/src/engine/control/first-person/composer/EyeOffsetStack.js +60 -0
  278. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts +100 -0
  279. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts.map +1 -0
  280. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.js +133 -0
  281. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts +10 -0
  282. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts.map +1 -0
  283. package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -0
  284. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts +61 -0
  285. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts.map +1 -0
  286. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.js +109 -0
  287. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts +40 -0
  288. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts.map +1 -0
  289. package/src/engine/control/first-person/mastery/MasteryEvaluator.js +45 -0
  290. package/src/engine/control/first-person/mastery/MasteryScore.d.ts +68 -0
  291. package/src/engine/control/first-person/mastery/MasteryScore.d.ts.map +1 -0
  292. package/src/engine/control/first-person/mastery/MasteryScore.js +100 -0
  293. package/src/engine/control/first-person/mastery/MasterySet.d.ts +60 -0
  294. package/src/engine/control/first-person/mastery/MasterySet.d.ts.map +1 -0
  295. package/src/engine/control/first-person/mastery/MasterySet.js +86 -0
  296. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +58 -0
  297. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -0
  298. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +83 -0
  299. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +69 -0
  300. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -0
  301. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +109 -0
  302. package/src/engine/control/first-person/math/Spring.d.ts +56 -0
  303. package/src/engine/control/first-person/math/Spring.d.ts.map +1 -0
  304. package/src/engine/control/first-person/math/Spring.js +71 -0
  305. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts +26 -0
  306. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts.map +1 -0
  307. package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -0
  308. package/src/engine/control/first-person/math/computeMassRatios.d.ts +35 -0
  309. package/src/engine/control/first-person/math/computeMassRatios.d.ts.map +1 -0
  310. package/src/engine/control/first-person/math/computeMassRatios.js +44 -0
  311. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts +31 -1
  312. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts.map +1 -1
  313. package/src/engine/control/first-person/pose/FirstPersonPose.js +49 -3
  314. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts +7 -0
  315. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts.map +1 -0
  316. package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -0
  317. package/src/engine/control/first-person/prototype_first_person_controller.js +637 -120
  318. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts +58 -0
  319. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts.map +1 -0
  320. package/src/engine/control/first-person/sensors/FirstPersonSensors.js +77 -0
  321. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +80 -0
  322. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -0
  323. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +196 -0
  324. package/src/engine/control/first-person/test/buildTestPlayer.d.ts +20 -0
  325. package/src/engine/control/first-person/test/buildTestPlayer.d.ts.map +1 -0
  326. package/src/engine/control/first-person/test/buildTestPlayer.js +36 -0
  327. package/src/engine/graphics/camera/testClippingPlaneComputation.js +0 -2
  328. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  329. package/src/engine/graphics/ecs/light/Light.js +27 -0
  330. package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
  331. package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
  332. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  333. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
  334. package/src/engine/graphics/geometry/CapsuleGeometry.d.ts +42 -0
  335. package/src/engine/graphics/geometry/CapsuleGeometry.d.ts.map +1 -0
  336. package/src/engine/graphics/geometry/CapsuleGeometry.js +171 -0
  337. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
  338. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
  339. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
  340. package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
  341. package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
  342. package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
  343. package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
  344. package/src/engine/physics/BULLET_REVIEW.md +945 -0
  345. package/src/engine/physics/CANNON_REVIEW.md +1300 -0
  346. package/src/engine/physics/JOLT_REVIEW.md +913 -0
  347. package/src/engine/physics/PLAN.md +461 -0
  348. package/src/engine/physics/RAPIER_REVIEW.md +934 -0
  349. package/src/engine/physics/REVIEW_001_ACTION_PLAN.md +642 -0
  350. package/src/engine/physics/body/BodyStorage.d.ts +187 -0
  351. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
  352. package/src/engine/physics/body/BodyStorage.js +427 -0
  353. package/src/engine/physics/broadphase/PairList.d.ts +62 -0
  354. package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
  355. package/src/engine/physics/broadphase/PairList.js +97 -0
  356. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
  357. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
  358. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
  359. package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
  360. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
  361. package/src/engine/physics/broadphase/generate_pairs.js +101 -0
  362. package/src/engine/physics/contact/ManifoldStore.d.ts +299 -0
  363. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
  364. package/src/engine/physics/contact/ManifoldStore.js +608 -0
  365. package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
  366. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
  367. package/src/engine/physics/ecs/BodyKind.js +24 -0
  368. package/src/engine/physics/ecs/Collider.d.ts +98 -0
  369. package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
  370. package/src/engine/physics/ecs/Collider.js +136 -0
  371. package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
  372. package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
  373. package/src/engine/physics/ecs/ColliderFlags.js +15 -0
  374. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
  375. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
  376. package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
  377. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
  378. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
  379. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
  380. package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
  381. package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
  382. package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
  383. package/src/engine/physics/ecs/PhysicsSystem.d.ts +628 -0
  384. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
  385. package/src/engine/physics/ecs/PhysicsSystem.js +1301 -0
  386. package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
  387. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
  388. package/src/engine/physics/ecs/RigidBody.js +240 -0
  389. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
  390. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
  391. package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
  392. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
  393. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
  394. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
  395. package/src/engine/physics/ecs/SleepState.d.ts +11 -0
  396. package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
  397. package/src/engine/physics/ecs/SleepState.js +12 -0
  398. package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
  399. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
  400. package/src/engine/physics/events/ContactEventBuffer.js +83 -0
  401. package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
  402. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
  403. package/src/engine/physics/events/diff_manifolds.js +50 -0
  404. package/src/engine/physics/fluid/FluidField.d.ts +294 -16
  405. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  406. package/src/engine/physics/fluid/FluidField.js +510 -66
  407. package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
  408. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  409. package/src/engine/physics/fluid/FluidSimulator.js +456 -95
  410. package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
  411. package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
  412. package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
  413. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
  414. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
  415. package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
  416. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
  417. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
  418. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
  419. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
  420. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
  421. package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
  422. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
  423. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
  424. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
  425. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
  426. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  427. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
  428. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
  429. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
  430. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
  431. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
  432. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  433. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
  434. package/src/engine/physics/fluid/prototype.js +102 -91
  435. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
  436. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
  437. package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
  438. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
  439. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  440. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
  441. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
  442. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  443. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
  444. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
  445. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
  446. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
  447. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
  448. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
  449. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
  450. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
  451. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
  452. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
  453. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
  454. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
  455. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
  456. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
  457. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
  458. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
  459. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
  460. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
  461. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
  462. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
  463. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
  464. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
  465. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +48 -0
  466. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
  467. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +92 -0
  468. package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts +6 -6
  469. package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
  470. package/src/engine/physics/gjk/expanding_polytope_algorithm.js +76 -32
  471. package/src/engine/physics/gjk/gjk.d.ts +28 -2
  472. package/src/engine/physics/gjk/gjk.d.ts.map +1 -1
  473. package/src/engine/physics/gjk/gjk.js +421 -378
  474. package/src/engine/physics/gjk/minkowski_support.d.ts +37 -0
  475. package/src/engine/physics/gjk/minkowski_support.d.ts.map +1 -0
  476. package/src/engine/physics/gjk/minkowski_support.js +75 -0
  477. package/src/engine/physics/gjk/mpr.d.ts +56 -0
  478. package/src/engine/physics/gjk/mpr.d.ts.map +1 -0
  479. package/src/engine/physics/gjk/mpr.js +344 -0
  480. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +44 -0
  481. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
  482. package/src/engine/physics/inertia/world_inverse_inertia.js +77 -0
  483. package/src/engine/physics/integration/integrate_position.d.ts +34 -0
  484. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
  485. package/src/engine/physics/integration/integrate_position.js +79 -0
  486. package/src/engine/physics/integration/integrate_velocity.d.ts +55 -0
  487. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
  488. package/src/engine/physics/integration/integrate_velocity.js +160 -0
  489. package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
  490. package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
  491. package/src/engine/physics/integration/quat_integrate.js +62 -0
  492. package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
  493. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
  494. package/src/engine/physics/island/IslandBuilder.js +411 -0
  495. package/src/engine/physics/island/union_find.d.ts +51 -0
  496. package/src/engine/physics/island/union_find.d.ts.map +1 -0
  497. package/src/engine/physics/island/union_find.js +76 -0
  498. package/src/engine/physics/narrowphase/PosedShape.d.ts +51 -0
  499. package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
  500. package/src/engine/physics/narrowphase/PosedShape.js +108 -0
  501. package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
  502. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
  503. package/src/engine/physics/narrowphase/box_box_manifold.js +639 -0
  504. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts +30 -0
  505. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -0
  506. package/src/engine/physics/narrowphase/box_triangle_contact.js +811 -0
  507. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
  508. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
  509. package/src/engine/physics/narrowphase/capsule_contacts.js +462 -0
  510. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts +71 -0
  511. package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -0
  512. package/src/engine/physics/narrowphase/capsule_triangle_contact.js +375 -0
  513. package/src/engine/physics/narrowphase/compute_penetration.d.ts +91 -0
  514. package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -0
  515. package/src/engine/physics/narrowphase/compute_penetration.js +396 -0
  516. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts +35 -0
  517. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +1 -0
  518. package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.js +80 -0
  519. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts +31 -0
  520. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts.map +1 -0
  521. package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +55 -0
  522. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +42 -0
  523. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -0
  524. package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +204 -0
  525. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +42 -0
  526. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -0
  527. package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +94 -0
  528. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts +37 -0
  529. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts.map +1 -0
  530. package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +37 -0
  531. package/src/engine/physics/narrowphase/narrowphase_step.d.ts +17 -0
  532. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
  533. package/src/engine/physics/narrowphase/narrowphase_step.js +1422 -0
  534. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
  535. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
  536. package/src/engine/physics/narrowphase/sphere_box_contact.js +123 -0
  537. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
  538. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
  539. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
  540. package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts +48 -0
  541. package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts.map +1 -0
  542. package/src/engine/physics/narrowphase/sphere_triangle_contact.js +143 -0
  543. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
  544. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
  545. package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
  546. package/src/engine/physics/queries/overlap_shape.d.ts +51 -0
  547. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -0
  548. package/src/engine/physics/queries/overlap_shape.js +183 -0
  549. package/src/engine/physics/queries/raycast.d.ts +20 -0
  550. package/src/engine/physics/queries/raycast.d.ts.map +1 -0
  551. package/src/engine/physics/queries/raycast.js +249 -0
  552. package/src/engine/physics/queries/shape_cast.d.ts +56 -0
  553. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -0
  554. package/src/engine/physics/queries/shape_cast.js +387 -0
  555. package/src/engine/physics/solver/friction_cone.d.ts +16 -0
  556. package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
  557. package/src/engine/physics/solver/friction_cone.js +37 -0
  558. package/src/engine/physics/solver/solve_contacts.d.ts +122 -0
  559. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
  560. package/src/engine/physics/solver/solve_contacts.js +1016 -0
  561. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
  562. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
  563. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
  564. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
  565. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
  566. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
  567. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
  568. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
  569. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
  570. package/src/engine/ecs/components/Motion.d.ts +0 -21
  571. package/src/engine/ecs/components/Motion.d.ts.map +0 -1
  572. package/src/engine/ecs/components/Motion.js +0 -27
  573. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
  574. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
  575. package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
  576. package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
  577. package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
  578. package/src/engine/ecs/systems/MotionSystem.js +0 -29
  579. package/src/engine/physics/fluid/Fluid.d.ts +0 -26
  580. package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
  581. package/src/engine/physics/fluid/Fluid.js +0 -221
  582. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
  583. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
  584. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.js +0 -8
@@ -0,0 +1,101 @@
1
+ import { IndexedFloatMaxHeap } from "../refine/IndexedFloatMaxHeap.js";
2
+
3
+ /**
4
+ * Pre-allocated scratch reused by every recursive `bisect_graph` call during
5
+ * the initial-partition phase.
6
+ *
7
+ * Recursive bisection produces O(k) subgraphs that each need their own
8
+ * refinement state and FM scratch — but only at sizes <= the coarsest vertex
9
+ * count. Sharing one set of arrays scoped to that maximum eliminates O(k)
10
+ * typed-array allocations and the corresponding GC pressure.
11
+ *
12
+ * Contents:
13
+ *
14
+ * - **Compute-2way state**: `boundary_vertices`, `boundary_position_of_vertex`,
15
+ * `internal_degree`, `external_degree`, `partition_weights[2]`.
16
+ *
17
+ * - **FM-2way state**: `fm_heaps` (one per side of the bisection),
18
+ * `fm_moved_pass_index`, `fm_swap_history`, `fm_insertion_order`.
19
+ *
20
+ * - **Bisect snapshot**: `best_partition_snapshot` for grow+FM trial selection.
21
+ *
22
+ * - **`vertex_partition_pool`**: a stack of vertex_partition arrays. Each
23
+ * recursive call takes a slot (via `take_vertex_partition_slot`) and
24
+ * releases it on return. New slots are allocated lazily, capped at
25
+ * `log2(k)` total — the maximum recursion depth.
26
+ *
27
+ * The two FM heaps are sized to `max_vertex_count` at construction. Their
28
+ * internal `__slot_of_id` table can hold any id in `[0, max_vertex_count)`, so
29
+ * subgraphs of any size below that work without expanding. `clear()` resets
30
+ * heap state in O(size), not O(capacity).
31
+ *
32
+ * `fm_moved_pass_index` starts initialised to -1. fm_2way's per-pass cleanup
33
+ * resets touched entries back to -1, so the invariant is preserved across
34
+ * calls — no need to refill the whole array between bisect_graph invocations.
35
+ */
36
+ export class BisectionScratch {
37
+ /**
38
+ * @param {number} max_vertex_count typically the coarsest graph's vertex count
39
+ */
40
+ constructor(max_vertex_count) {
41
+ this.max_vertex_count = max_vertex_count;
42
+
43
+ // --- 2-way refinement state shared with compute_2way_params ---
44
+
45
+ this.boundary_vertices = new Uint32Array(max_vertex_count);
46
+ this.boundary_position_of_vertex = new Int32Array(max_vertex_count);
47
+ this.internal_degree = new Uint32Array(max_vertex_count);
48
+ this.external_degree = new Uint32Array(max_vertex_count);
49
+ this.partition_weights = new Uint32Array(2);
50
+ this.best_partition_snapshot = new Uint32Array(max_vertex_count);
51
+
52
+ // --- FM_2way scratch ---
53
+
54
+ this.fm_heaps = [
55
+ new IndexedFloatMaxHeap(max_vertex_count, Math.min(max_vertex_count, 1024)),
56
+ new IndexedFloatMaxHeap(max_vertex_count, Math.min(max_vertex_count, 1024))
57
+ ];
58
+ this.fm_moved_pass_index = new Int32Array(max_vertex_count);
59
+ this.fm_moved_pass_index.fill(-1);
60
+ this.fm_swap_history = new Uint32Array(max_vertex_count);
61
+ this.fm_insertion_order = new Uint32Array(max_vertex_count);
62
+
63
+ // --- vertex_partition stack pool ---
64
+
65
+ /** @type {Uint32Array[]} */
66
+ this.vertex_partition_pool = [];
67
+ this.vertex_partition_pool_top = 0;
68
+ }
69
+
70
+ /**
71
+ * Borrow a vertex_partition slot from the pool. The first `vertex_count`
72
+ * entries are zero-filled; values past `vertex_count` may hold stale data
73
+ * from a sibling subgraph and must not be read.
74
+ *
75
+ * Returned slot remains owned by the scratch; release with
76
+ * `release_vertex_partition_slot` once you're done with it.
77
+ *
78
+ * @param {number} vertex_count subgraph's vertex_count
79
+ * @returns {Uint32Array}
80
+ */
81
+ take_vertex_partition_slot(vertex_count) {
82
+ const slot_index = this.vertex_partition_pool_top;
83
+ let slot = this.vertex_partition_pool[slot_index];
84
+ if (slot === undefined) {
85
+ slot = new Uint32Array(this.max_vertex_count);
86
+ this.vertex_partition_pool.push(slot);
87
+ } else {
88
+ slot.fill(0, 0, vertex_count);
89
+ }
90
+ this.vertex_partition_pool_top = slot_index + 1;
91
+ return slot;
92
+ }
93
+
94
+ /**
95
+ * Pop the top vertex_partition slot off the pool. Pairs with
96
+ * `take_vertex_partition_slot` — call exactly once per take.
97
+ */
98
+ release_vertex_partition_slot() {
99
+ this.vertex_partition_pool_top--;
100
+ }
101
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Bisect a graph into two partitions with `target_weight_for_partition_0` weight
3
+ * landing in partition 0. Runs `bisection_trial_count` independent BFS-grow + FM
4
+ * trials and keeps the best (lowest-cut) result.
5
+ *
6
+ * Mirrors `Init2WayPartition` from libmetis/initpart.c, single-constraint cut
7
+ * branch only.
8
+ *
9
+ * **All scratch state is taken from the supplied `BisectionScratch`**:
10
+ * - the 2-way refinement arrays (`internal_degree`, `external_degree`,
11
+ * boundary list, `partition_weights[2]`),
12
+ * - the FM heaps and pass-local arrays,
13
+ * - the best-cut snapshot,
14
+ * - and `vertex_partition` itself, which the caller borrows from the
15
+ * scratch's stack pool and releases after using the result.
16
+ *
17
+ * The k-way bookkeeping arrays (`neighbor_partition_*`, `neighbor_partition_pool`)
18
+ * are NOT set up here — bisection doesn't need them. They get allocated by
19
+ * `allocate_partition_state(k)` once recursive bisection is done and the graph
20
+ * moves into k-way refinement.
21
+ *
22
+ * On return, `graph.vertex_partition[]` contains 0/1 in `[0, vertex_count)` and
23
+ * `graph.current_cut` is the bisection cut. The vertex_partition slot may be
24
+ * sized larger than vertex_count — only the prefix is meaningful.
25
+ *
26
+ * @param {import('../MetisGraph.js').MetisGraph} graph
27
+ * @param {Uint32Array} vertex_partition pre-zeroed slot from the scratch pool;
28
+ * typically obtained via `scratch.take_vertex_partition_slot(graph.vertex_count)`
29
+ * @param {number} target_weight_for_partition_0
30
+ * @param {number} bisection_trial_count number of independent grow+FM trials
31
+ * @param {number} fm_pass_count FM passes per trial
32
+ * @param {number} ub_factor balance tolerance for `grow_bisection`
33
+ * @param {function():number} random
34
+ * @param {import('./BisectionScratch.js').BisectionScratch} scratch
35
+ */
36
+ export function bisect_graph(graph: import('../MetisGraph.js').MetisGraph, vertex_partition: Uint32Array, target_weight_for_partition_0: number, bisection_trial_count: number, fm_pass_count: number, ub_factor: number, random: () => number, scratch: import('./BisectionScratch.js').BisectionScratch): void;
37
+ //# sourceMappingURL=bisect_graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bisect_graph.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/bisect_graph.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,oCAVW,OAAO,kBAAkB,EAAE,UAAU,oBACrC,WAAW,iCAEX,MAAM,yBACN,MAAM,iBACN,MAAM,aACN,MAAM,gBACK,MAAM,WACjB,OAAO,uBAAuB,EAAE,gBAAgB,QA6C1D"}
@@ -0,0 +1,100 @@
1
+ import { compute_2way_params } from "./compute_2way_params.js";
2
+ import { fm_2way } from "./fm_2way.js";
3
+ import { grow_bisection } from "./grow_bisection.js";
4
+
5
+ /**
6
+ * Bisect a graph into two partitions with `target_weight_for_partition_0` weight
7
+ * landing in partition 0. Runs `bisection_trial_count` independent BFS-grow + FM
8
+ * trials and keeps the best (lowest-cut) result.
9
+ *
10
+ * Mirrors `Init2WayPartition` from libmetis/initpart.c, single-constraint cut
11
+ * branch only.
12
+ *
13
+ * **All scratch state is taken from the supplied `BisectionScratch`**:
14
+ * - the 2-way refinement arrays (`internal_degree`, `external_degree`,
15
+ * boundary list, `partition_weights[2]`),
16
+ * - the FM heaps and pass-local arrays,
17
+ * - the best-cut snapshot,
18
+ * - and `vertex_partition` itself, which the caller borrows from the
19
+ * scratch's stack pool and releases after using the result.
20
+ *
21
+ * The k-way bookkeeping arrays (`neighbor_partition_*`, `neighbor_partition_pool`)
22
+ * are NOT set up here — bisection doesn't need them. They get allocated by
23
+ * `allocate_partition_state(k)` once recursive bisection is done and the graph
24
+ * moves into k-way refinement.
25
+ *
26
+ * On return, `graph.vertex_partition[]` contains 0/1 in `[0, vertex_count)` and
27
+ * `graph.current_cut` is the bisection cut. The vertex_partition slot may be
28
+ * sized larger than vertex_count — only the prefix is meaningful.
29
+ *
30
+ * @param {import('../MetisGraph.js').MetisGraph} graph
31
+ * @param {Uint32Array} vertex_partition pre-zeroed slot from the scratch pool;
32
+ * typically obtained via `scratch.take_vertex_partition_slot(graph.vertex_count)`
33
+ * @param {number} target_weight_for_partition_0
34
+ * @param {number} bisection_trial_count number of independent grow+FM trials
35
+ * @param {number} fm_pass_count FM passes per trial
36
+ * @param {number} ub_factor balance tolerance for `grow_bisection`
37
+ * @param {function():number} random
38
+ * @param {import('./BisectionScratch.js').BisectionScratch} scratch
39
+ */
40
+ export function bisect_graph(
41
+ graph,
42
+ vertex_partition,
43
+ target_weight_for_partition_0,
44
+ bisection_trial_count,
45
+ fm_pass_count,
46
+ ub_factor,
47
+ random,
48
+ scratch
49
+ ) {
50
+ attach_scratch(graph, vertex_partition, scratch);
51
+
52
+ let best_cut = -1;
53
+ const best_partition = scratch.best_partition_snapshot;
54
+ const vertex_count = graph.vertex_count;
55
+
56
+ for (let trial = 0; trial < bisection_trial_count; trial++) {
57
+ grow_bisection(graph, target_weight_for_partition_0, ub_factor, random);
58
+ compute_2way_params(graph);
59
+ fm_2way(graph, target_weight_for_partition_0, fm_pass_count, random, scratch);
60
+
61
+ if (best_cut === -1 || graph.current_cut < best_cut) {
62
+ best_cut = graph.current_cut;
63
+ // Snapshot only the active subgraph range — best_partition is
64
+ // sized to max_vertex_count and may have stale values past
65
+ // vertex_count from a sibling's earlier bisection.
66
+ for (let v = 0; v < vertex_count; v++) {
67
+ best_partition[v] = vertex_partition[v];
68
+ }
69
+ }
70
+
71
+ if (best_cut === 0) {
72
+ break;
73
+ }
74
+ }
75
+
76
+ // Restore the best partition if a later trial wasn't the winner.
77
+ if (best_cut !== graph.current_cut) {
78
+ for (let v = 0; v < vertex_count; v++) {
79
+ vertex_partition[v] = best_partition[v];
80
+ }
81
+ compute_2way_params(graph);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Wire the graph's bisection-state fields to point at the supplied
87
+ * vertex_partition slot and the shared scratch arrays.
88
+ *
89
+ * @param {import('../MetisGraph.js').MetisGraph} graph
90
+ * @param {Uint32Array} vertex_partition pre-zeroed slot owned by the scratch pool
91
+ * @param {import('./BisectionScratch.js').BisectionScratch} scratch
92
+ */
93
+ function attach_scratch(graph, vertex_partition, scratch) {
94
+ graph.vertex_partition = vertex_partition;
95
+ graph.partition_weights = scratch.partition_weights;
96
+ graph.boundary_vertices = scratch.boundary_vertices;
97
+ graph.boundary_position_of_vertex = scratch.boundary_position_of_vertex;
98
+ graph.internal_degree = scratch.internal_degree;
99
+ graph.external_degree = scratch.external_degree;
100
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * From a freshly-assigned bisection `vertex_partition[]` (containing only 0
3
+ * and 1), populate the 2-way refinement bookkeeping: per-partition weights,
4
+ * per-vertex internal/external degree, boundary list, and total cut.
5
+ *
6
+ * Mirrors `Compute2WayPartitionParams` from libmetis/refine.c.
7
+ *
8
+ * For 2-way refinement, the neighbour-partition list is trivially "the other
9
+ * partition", so we don't allocate any cnbr pool — only the parallel
10
+ * `internal_degree[v]` and `external_degree[v]` arrays are needed.
11
+ *
12
+ * @param {import('../MetisGraph.js').MetisGraph} graph
13
+ */
14
+ export function compute_2way_params(graph: import('../MetisGraph.js').MetisGraph): void;
15
+ //# sourceMappingURL=compute_2way_params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute_2way_params.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/compute_2way_params.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,2CAFW,OAAO,kBAAkB,EAAE,UAAU,QAsE/C"}
@@ -0,0 +1,84 @@
1
+ import { assert } from "../../../../assert.js";
2
+
3
+ /**
4
+ * From a freshly-assigned bisection `vertex_partition[]` (containing only 0
5
+ * and 1), populate the 2-way refinement bookkeeping: per-partition weights,
6
+ * per-vertex internal/external degree, boundary list, and total cut.
7
+ *
8
+ * Mirrors `Compute2WayPartitionParams` from libmetis/refine.c.
9
+ *
10
+ * For 2-way refinement, the neighbour-partition list is trivially "the other
11
+ * partition", so we don't allocate any cnbr pool — only the parallel
12
+ * `internal_degree[v]` and `external_degree[v]` arrays are needed.
13
+ *
14
+ * @param {import('../MetisGraph.js').MetisGraph} graph
15
+ */
16
+ export function compute_2way_params(graph) {
17
+ const vertex_count = graph.vertex_count;
18
+ const edge_addresses = graph.edge_addresses;
19
+ const adjacency = graph.adjacency;
20
+ const edge_weights = graph.edge_weights;
21
+ const vertex_weights = graph.vertex_weights;
22
+ const vertex_partition = graph.vertex_partition;
23
+ const partition_weights = graph.partition_weights;
24
+ const internal_degree = graph.internal_degree;
25
+ const external_degree = graph.external_degree;
26
+ const boundary_vertices = graph.boundary_vertices;
27
+ const boundary_position_of_vertex = graph.boundary_position_of_vertex;
28
+
29
+ assert.equal(vertex_partition !== null, true, 'graph.vertex_partition must be allocated');
30
+ assert.equal(partition_weights.length, 2, 'partition_weights must be sized for 2 partitions');
31
+
32
+ partition_weights[0] = 0;
33
+ partition_weights[1] = 0;
34
+ // internal_degree and external_degree do not need pre-clearing — every
35
+ // vertex in [0, vertex_count) gets written in the per-vertex loop below,
36
+ // and we never read past vertex_count.
37
+ // boundary_position_of_vertex IS read conditionally (only boundary vertices
38
+ // get set), so it does need a clear — but bounded to the active subgraph
39
+ // range, since the scratch may be sized for a larger ancestor graph.
40
+ boundary_position_of_vertex.fill(-1, 0, vertex_count);
41
+
42
+ for (let v = 0; v < vertex_count; v++) {
43
+ partition_weights[vertex_partition[v]] += vertex_weights[v];
44
+ }
45
+
46
+ let boundary_count = 0;
47
+ let cut_doubled = 0;
48
+
49
+ for (let vertex = 0; vertex < vertex_count; vertex++) {
50
+ const my_partition = vertex_partition[vertex];
51
+
52
+ let v_internal_degree = 0;
53
+ let v_external_degree = 0;
54
+
55
+ const edge_start = edge_addresses[vertex];
56
+ const edge_end = edge_addresses[vertex + 1];
57
+ for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
58
+ const neighbor_partition = vertex_partition[adjacency[edge_offset]];
59
+ const edge_weight = edge_weights[edge_offset];
60
+ if (neighbor_partition === my_partition) {
61
+ v_internal_degree += edge_weight;
62
+ } else {
63
+ v_external_degree += edge_weight;
64
+ }
65
+ }
66
+
67
+ internal_degree[vertex] = v_internal_degree;
68
+ external_degree[vertex] = v_external_degree;
69
+
70
+ if (v_external_degree > 0 || edge_start === edge_end) {
71
+ // Add isolated vertices too — they're "boundary" in the degenerate sense
72
+ // that moving them is free. Matches METIS behaviour.
73
+ if (v_external_degree > 0) {
74
+ cut_doubled += v_external_degree;
75
+ boundary_vertices[boundary_count] = vertex;
76
+ boundary_position_of_vertex[vertex] = boundary_count;
77
+ boundary_count++;
78
+ }
79
+ }
80
+ }
81
+
82
+ graph.current_cut = cut_doubled >> 1;
83
+ graph.boundary_count = boundary_count;
84
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 2-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
3
+ *
4
+ * Maintains two max-heaps keyed by per-vertex gain (`external_degree − internal_degree`),
5
+ * one per side of the bisection. Each pass:
6
+ * 1. Insert every boundary vertex into the queue for its current side.
7
+ * 2. Repeatedly pop from whichever side is more overweight, move the vertex,
8
+ * and update neighbours. Track running cut and remember the best snapshot.
9
+ * 3. Stop when both queues drain, or when `LIMIT_NONIMPROVING_MOVES` moves
10
+ * pass without finding a better cut.
11
+ * 4. Roll back any moves made after the best-cut snapshot.
12
+ *
13
+ * Each vertex is locked after moving once (it can't move back in the same pass).
14
+ * Locking is reset between passes.
15
+ *
16
+ * Mirrors `FM_2WayCutRefine` from libmetis/fm.c.
17
+ *
18
+ * All scratch state (heaps, moved-index, swap history, insertion order) is
19
+ * shared via the `BisectionScratch` passed in by the caller, sized to the
20
+ * coarsest graph's vertex_count. This eliminates per-trial allocation.
21
+ *
22
+ * @param {import('../MetisGraph.js').MetisGraph} graph
23
+ * @param {number} target_weight_for_partition_0
24
+ * @param {number} pass_count
25
+ * @param {function():number} random seeded RNG used to shuffle boundary
26
+ * insertion order so ties break differently each pass
27
+ * @param {import('./BisectionScratch.js').BisectionScratch} scratch
28
+ */
29
+ export function fm_2way(graph: import('../MetisGraph.js').MetisGraph, target_weight_for_partition_0: number, pass_count: number, random: () => number, scratch: import('./BisectionScratch.js').BisectionScratch): void;
30
+ //# sourceMappingURL=fm_2way.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fm_2way.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/fm_2way.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,+BAPW,OAAO,kBAAkB,EAAE,UAAU,iCACrC,MAAM,cACN,MAAM,gBACK,MAAM,WAEjB,OAAO,uBAAuB,EAAE,gBAAgB,QAuQ1D"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * 2-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
3
+ *
4
+ * Maintains two max-heaps keyed by per-vertex gain (`external_degree − internal_degree`),
5
+ * one per side of the bisection. Each pass:
6
+ * 1. Insert every boundary vertex into the queue for its current side.
7
+ * 2. Repeatedly pop from whichever side is more overweight, move the vertex,
8
+ * and update neighbours. Track running cut and remember the best snapshot.
9
+ * 3. Stop when both queues drain, or when `LIMIT_NONIMPROVING_MOVES` moves
10
+ * pass without finding a better cut.
11
+ * 4. Roll back any moves made after the best-cut snapshot.
12
+ *
13
+ * Each vertex is locked after moving once (it can't move back in the same pass).
14
+ * Locking is reset between passes.
15
+ *
16
+ * Mirrors `FM_2WayCutRefine` from libmetis/fm.c.
17
+ *
18
+ * All scratch state (heaps, moved-index, swap history, insertion order) is
19
+ * shared via the `BisectionScratch` passed in by the caller, sized to the
20
+ * coarsest graph's vertex_count. This eliminates per-trial allocation.
21
+ *
22
+ * @param {import('../MetisGraph.js').MetisGraph} graph
23
+ * @param {number} target_weight_for_partition_0
24
+ * @param {number} pass_count
25
+ * @param {function():number} random seeded RNG used to shuffle boundary
26
+ * insertion order so ties break differently each pass
27
+ * @param {import('./BisectionScratch.js').BisectionScratch} scratch
28
+ */
29
+ export function fm_2way(graph, target_weight_for_partition_0, pass_count, random, scratch) {
30
+ const vertex_count = graph.vertex_count;
31
+ const edge_addresses = graph.edge_addresses;
32
+ const adjacency = graph.adjacency;
33
+ const edge_weights = graph.edge_weights;
34
+ const vertex_weights = graph.vertex_weights;
35
+ const vertex_partition = graph.vertex_partition;
36
+ const partition_weights = graph.partition_weights;
37
+ const internal_degree = graph.internal_degree;
38
+ const external_degree = graph.external_degree;
39
+ const boundary_vertices = graph.boundary_vertices;
40
+ const boundary_position_of_vertex = graph.boundary_position_of_vertex;
41
+
42
+ if (vertex_count === 0 || graph.boundary_count === 0) {
43
+ return;
44
+ }
45
+
46
+ const target_weight_0 = target_weight_for_partition_0;
47
+ const target_weight_1 = graph.total_vertex_weight - target_weight_for_partition_0;
48
+
49
+ // METIS heuristic: stop a pass after this many moves with no improvement.
50
+ const limit_nonimproving_moves = Math.min(Math.max(Math.floor(0.01 * vertex_count), 15), 100);
51
+
52
+ // METIS uses this for a "close enough to mincut" tolerance when picking
53
+ // the best snapshot — avoids overreacting to small noise in pwgt-balance.
54
+ const avg_vertex_weight = Math.min(
55
+ Math.floor((partition_weights[0] + partition_weights[1]) / 20),
56
+ Math.floor(2 * (partition_weights[0] + partition_weights[1]) / vertex_count)
57
+ );
58
+
59
+ const queues = scratch.fm_heaps;
60
+ const moved_pass_index = scratch.fm_moved_pass_index;
61
+ const swap_history = scratch.fm_swap_history;
62
+ const insertion_order = scratch.fm_insertion_order;
63
+
64
+ const initial_partition_0_diff = Math.abs(target_weight_0 - partition_weights[0]);
65
+
66
+ for (let pass = 0; pass < pass_count; pass++) {
67
+ queues[0].clear();
68
+ queues[1].clear();
69
+
70
+ let best_cut = graph.current_cut;
71
+ let best_partition_diff = Math.abs(target_weight_0 - partition_weights[0]);
72
+ let best_cut_swap_index = -1;
73
+ let running_cut = best_cut;
74
+ let initial_cut_this_pass = best_cut;
75
+
76
+ let boundary_count = graph.boundary_count;
77
+
78
+ // Insert boundary vertices in random order so ties break differently each pass.
79
+ for (let i = 0; i < boundary_count; i++) {
80
+ insertion_order[i] = i;
81
+ }
82
+ // Fisher–Yates shuffle of insertion_order[0..boundary_count)
83
+ for (let i = boundary_count - 1; i > 0; i--) {
84
+ const j = (random() * (i + 1)) | 0;
85
+ if (j !== i) {
86
+ const tmp = insertion_order[i];
87
+ insertion_order[i] = insertion_order[j];
88
+ insertion_order[j] = tmp;
89
+ }
90
+ }
91
+ for (let i = 0; i < boundary_count; i++) {
92
+ const vertex = boundary_vertices[insertion_order[i]];
93
+ const gain = external_degree[vertex] - internal_degree[vertex];
94
+ queues[vertex_partition[vertex]].insert(vertex, gain);
95
+ }
96
+
97
+ let swap_count = 0;
98
+ for (; swap_count < vertex_count; swap_count++) {
99
+ // Pick the side that's more overweight (or equivalently, more under-target).
100
+ const from_side = (target_weight_0 - partition_weights[0]) < (target_weight_1 - partition_weights[1]) ? 0 : 1;
101
+ const to_side = 1 - from_side;
102
+
103
+ const high_gain_vertex = queues[from_side].pop_max();
104
+ if (high_gain_vertex === -1) {
105
+ break;
106
+ }
107
+
108
+ const gain = external_degree[high_gain_vertex] - internal_degree[high_gain_vertex];
109
+ running_cut -= gain;
110
+
111
+ partition_weights[from_side] -= vertex_weights[high_gain_vertex];
112
+ partition_weights[to_side] += vertex_weights[high_gain_vertex];
113
+
114
+ const new_partition_diff = Math.abs(target_weight_0 - partition_weights[0]);
115
+
116
+ const improves_cut_within_balance = (
117
+ running_cut < best_cut &&
118
+ new_partition_diff <= initial_partition_0_diff + avg_vertex_weight
119
+ );
120
+ const matches_cut_but_better_balance = (
121
+ running_cut === best_cut &&
122
+ new_partition_diff < best_partition_diff
123
+ );
124
+
125
+ if (improves_cut_within_balance || matches_cut_but_better_balance) {
126
+ best_cut = running_cut;
127
+ best_partition_diff = new_partition_diff;
128
+ best_cut_swap_index = swap_count;
129
+ } else if (swap_count - best_cut_swap_index > limit_nonimproving_moves) {
130
+ // Pass has gone too long without improvement — undo this last move and stop.
131
+ running_cut += gain;
132
+ partition_weights[from_side] += vertex_weights[high_gain_vertex];
133
+ partition_weights[to_side] -= vertex_weights[high_gain_vertex];
134
+ break;
135
+ }
136
+
137
+ vertex_partition[high_gain_vertex] = to_side;
138
+ moved_pass_index[high_gain_vertex] = swap_count;
139
+ swap_history[swap_count] = high_gain_vertex;
140
+
141
+ // After the move, swap id/ed for the moved vertex:
142
+ // edges that used to be external (going to `to_side`) are now internal,
143
+ // and vice versa.
144
+ {
145
+ const tmp = internal_degree[high_gain_vertex];
146
+ internal_degree[high_gain_vertex] = external_degree[high_gain_vertex];
147
+ external_degree[high_gain_vertex] = tmp;
148
+ }
149
+
150
+ // Maybe drop the moved vertex from the boundary.
151
+ if (external_degree[high_gain_vertex] === 0 && edge_addresses[high_gain_vertex] < edge_addresses[high_gain_vertex + 1]) {
152
+ const bp = boundary_position_of_vertex[high_gain_vertex];
153
+ if (bp !== -1) {
154
+ const last = boundary_count - 1;
155
+ if (bp !== last) {
156
+ const moved_to_bp = boundary_vertices[last];
157
+ boundary_vertices[bp] = moved_to_bp;
158
+ boundary_position_of_vertex[moved_to_bp] = bp;
159
+ }
160
+ boundary_position_of_vertex[high_gain_vertex] = -1;
161
+ boundary_count = last;
162
+ }
163
+ }
164
+
165
+ // Update id/ed of neighbours, their boundary membership, and their queue positions.
166
+ const edge_start = edge_addresses[high_gain_vertex];
167
+ const edge_end = edge_addresses[high_gain_vertex + 1];
168
+ for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
169
+ const neighbor = adjacency[edge_offset];
170
+ const ewgt = edge_weights[edge_offset];
171
+ const signed_ewgt = (to_side === vertex_partition[neighbor]) ? ewgt : -ewgt;
172
+ internal_degree[neighbor] += signed_ewgt;
173
+ external_degree[neighbor] -= signed_ewgt;
174
+
175
+ const n_was_on_boundary = boundary_position_of_vertex[neighbor] !== -1;
176
+
177
+ if (n_was_on_boundary) {
178
+ if (external_degree[neighbor] === 0) {
179
+ // Drop from boundary
180
+ const bp = boundary_position_of_vertex[neighbor];
181
+ const last = boundary_count - 1;
182
+ if (bp !== last) {
183
+ const moved_to_bp = boundary_vertices[last];
184
+ boundary_vertices[bp] = moved_to_bp;
185
+ boundary_position_of_vertex[moved_to_bp] = bp;
186
+ }
187
+ boundary_position_of_vertex[neighbor] = -1;
188
+ boundary_count = last;
189
+ if (moved_pass_index[neighbor] === -1) {
190
+ queues[vertex_partition[neighbor]].remove(neighbor);
191
+ }
192
+ } else {
193
+ // Still on boundary, update queue priority
194
+ if (moved_pass_index[neighbor] === -1) {
195
+ const updated_gain = external_degree[neighbor] - internal_degree[neighbor];
196
+ queues[vertex_partition[neighbor]].update(neighbor, updated_gain);
197
+ }
198
+ }
199
+ } else {
200
+ if (external_degree[neighbor] > 0) {
201
+ // New boundary vertex
202
+ boundary_vertices[boundary_count] = neighbor;
203
+ boundary_position_of_vertex[neighbor] = boundary_count;
204
+ boundary_count++;
205
+ if (moved_pass_index[neighbor] === -1) {
206
+ const initial_gain = external_degree[neighbor] - internal_degree[neighbor];
207
+ queues[vertex_partition[neighbor]].insert(neighbor, initial_gain);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+
214
+ // Reset moved-status for vertices we touched this pass. Preserves the
215
+ // "all -1" invariant for the shared moved_pass_index across calls.
216
+ for (let i = 0; i < swap_count; i++) {
217
+ moved_pass_index[swap_history[i]] = -1;
218
+ }
219
+
220
+ // Roll back any moves made after best_cut_swap_index.
221
+ for (let i = swap_count - 1; i > best_cut_swap_index; i--) {
222
+ const vertex = swap_history[i];
223
+ const flipped_from = vertex_partition[vertex];
224
+ const flipped_to = 1 - flipped_from;
225
+ vertex_partition[vertex] = flipped_to;
226
+
227
+ // Swap id/ed back
228
+ {
229
+ const tmp = internal_degree[vertex];
230
+ internal_degree[vertex] = external_degree[vertex];
231
+ external_degree[vertex] = tmp;
232
+ }
233
+
234
+ // Maybe re-add or remove from boundary based on new ed
235
+ if (external_degree[vertex] === 0 && boundary_position_of_vertex[vertex] !== -1 && edge_addresses[vertex] < edge_addresses[vertex + 1]) {
236
+ const bp = boundary_position_of_vertex[vertex];
237
+ const last = boundary_count - 1;
238
+ if (bp !== last) {
239
+ const moved_to_bp = boundary_vertices[last];
240
+ boundary_vertices[bp] = moved_to_bp;
241
+ boundary_position_of_vertex[moved_to_bp] = bp;
242
+ }
243
+ boundary_position_of_vertex[vertex] = -1;
244
+ boundary_count = last;
245
+ } else if (external_degree[vertex] > 0 && boundary_position_of_vertex[vertex] === -1) {
246
+ boundary_vertices[boundary_count] = vertex;
247
+ boundary_position_of_vertex[vertex] = boundary_count;
248
+ boundary_count++;
249
+ }
250
+
251
+ partition_weights[flipped_from] -= vertex_weights[vertex];
252
+ partition_weights[flipped_to] += vertex_weights[vertex];
253
+
254
+ // Update neighbours
255
+ const edge_start = edge_addresses[vertex];
256
+ const edge_end = edge_addresses[vertex + 1];
257
+ for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
258
+ const neighbor = adjacency[edge_offset];
259
+ const ewgt = edge_weights[edge_offset];
260
+ const signed_ewgt = (flipped_to === vertex_partition[neighbor]) ? ewgt : -ewgt;
261
+ internal_degree[neighbor] += signed_ewgt;
262
+ external_degree[neighbor] -= signed_ewgt;
263
+
264
+ if (boundary_position_of_vertex[neighbor] !== -1 && external_degree[neighbor] === 0) {
265
+ const bp = boundary_position_of_vertex[neighbor];
266
+ const last = boundary_count - 1;
267
+ if (bp !== last) {
268
+ const moved_to_bp = boundary_vertices[last];
269
+ boundary_vertices[bp] = moved_to_bp;
270
+ boundary_position_of_vertex[moved_to_bp] = bp;
271
+ }
272
+ boundary_position_of_vertex[neighbor] = -1;
273
+ boundary_count = last;
274
+ }
275
+ if (boundary_position_of_vertex[neighbor] === -1 && external_degree[neighbor] > 0) {
276
+ boundary_vertices[boundary_count] = neighbor;
277
+ boundary_position_of_vertex[neighbor] = boundary_count;
278
+ boundary_count++;
279
+ }
280
+ }
281
+ }
282
+
283
+ graph.current_cut = best_cut;
284
+ graph.boundary_count = boundary_count;
285
+
286
+ if (best_cut_swap_index <= 0 || best_cut === initial_cut_this_pass) {
287
+ break;
288
+ }
289
+ }
290
+ }