@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,167 @@
1
+ /**
2
+ * Partitions this frame's awake dynamic bodies + touched non-sensor contacts
3
+ * into connected components ("islands") via union-find. The solver iterates
4
+ * each island independently (so impulses converge inside an island without
5
+ * waiting for global passes) and the sleep test will eventually use island
6
+ * granularity for atomic whole-island sleep.
7
+ *
8
+ * Static and Kinematic bodies are not merged into islands — they act as
9
+ * constraint anchors. A 1000-block stack on a static floor is therefore one
10
+ * island of 1000 dynamic bodies, not 1001 — the floor anchors the island but
11
+ * does not enlarge it. Multiple separate piles all resting on the same static
12
+ * floor remain *separate* islands so each can sleep/wake independently.
13
+ *
14
+ * Sensor contacts are skipped entirely: they don't transmit constraint
15
+ * forces, so two bodies linked only by a sensor pair are not in the same
16
+ * structural island.
17
+ *
18
+ * Determinism contract:
19
+ * - Union-find uses union-by-min-index + path halving, so the canonical
20
+ * root of any component is the smallest body index of any of its members.
21
+ * - Islands are emitted sorted ascending by root index.
22
+ * - Bodies within an island are emitted sorted ascending by body index.
23
+ * - Contacts within an island are emitted sorted ascending by manifold slot id.
24
+ *
25
+ * Output layout is CSR-like — `body_offsets[i]..body_offsets[i+1]` indexes
26
+ * into `body_data` for island `i`, similarly for contacts.
27
+ *
28
+ * @author Alex Goldring
29
+ * @copyright Company Named Limited (c) 2026
30
+ */
31
+ export class IslandBuilder {
32
+ /**
33
+ * @param {RigidBody} rb
34
+ * @param {Array} collider_list collider list for the body (or undefined)
35
+ * @returns {boolean}
36
+ * @private
37
+ */
38
+ private static __body_is_sensor;
39
+ /**
40
+ * Union-find parent table, indexed by body index (NOT packed id).
41
+ * Sized to `storage.high_water_mark` at `build` time; reallocated by
42
+ * doubling when the body pool grows past current capacity.
43
+ * @type {Uint32Array}
44
+ */
45
+ parent: Uint32Array;
46
+ /**
47
+ * Per-body island id. `island_of_body[idx] === -1` means the body
48
+ * is not in any island this frame (static, kinematic, or unallocated).
49
+ * @type {Int32Array}
50
+ */
51
+ island_of_body: Int32Array;
52
+ /**
53
+ * Number of islands this frame.
54
+ * @type {number}
55
+ */
56
+ island_count: number;
57
+ /**
58
+ * CSR offsets into `body_data`. Length is `island_count + 1`. Bodies
59
+ * for island `i` live in `body_data[body_offsets[i]..body_offsets[i+1])`.
60
+ * @type {Uint32Array}
61
+ */
62
+ body_offsets: Uint32Array;
63
+ /**
64
+ * Flattened body indices, grouped by island, sorted ascending within
65
+ * each island.
66
+ * @type {Uint32Array}
67
+ */
68
+ body_data: Uint32Array;
69
+ /**
70
+ * Total number of body entries across all islands (= sum of island sizes).
71
+ * @type {number}
72
+ */
73
+ body_total: number;
74
+ /**
75
+ * CSR offsets into `contact_data`. Length is `island_count + 1`.
76
+ * Manifold slot ids for island `i` live in
77
+ * `contact_data[contact_offsets[i]..contact_offsets[i+1])`.
78
+ * @type {Uint32Array}
79
+ */
80
+ contact_offsets: Uint32Array;
81
+ /**
82
+ * Flattened manifold slot ids, grouped by island, sorted ascending
83
+ * within each island.
84
+ * @type {Uint32Array}
85
+ */
86
+ contact_data: Uint32Array;
87
+ /**
88
+ * Total number of contact entries across all islands.
89
+ * @type {number}
90
+ */
91
+ contact_total: number;
92
+ /**
93
+ * Scratch: root body index → island id, or -1 if unassigned.
94
+ * Sized in lockstep with `parent`.
95
+ * @private
96
+ * @type {Int32Array}
97
+ */
98
+ private __root_to_island;
99
+ /**
100
+ * Scratch: list of distinct root indices observed this frame, used
101
+ * to sort them ascending before assigning island ids.
102
+ * @private
103
+ * @type {Uint32Array}
104
+ */
105
+ private __scratch_roots;
106
+ /**
107
+ * Scratch write-cursors, one per island.
108
+ * @private
109
+ * @type {Uint32Array}
110
+ */
111
+ private __cursors;
112
+ /**
113
+ * (Re)build islands from `manifolds`' currently-touched non-sensor slots
114
+ * and the bodies in `storage`'s awake list.
115
+ *
116
+ * @param {BodyStorage} storage
117
+ * @param {ManifoldStore} manifolds
118
+ * @param {RigidBody[]} bodies sparse, indexed by body index
119
+ * @param {Array[]} body_collider_lists sparse, indexed by body index
120
+ */
121
+ build(storage: BodyStorage, manifolds: ManifoldStore, bodies: RigidBody[], body_collider_lists: any[][]): void;
122
+ /**
123
+ * Fill `body_offsets` + `body_data` with awake dynamic bodies grouped
124
+ * by island, sorted ascending within each island.
125
+ * @private
126
+ */
127
+ private __build_body_csr;
128
+ /**
129
+ * Fill `contact_offsets` + `contact_data` with touched non-sensor manifold
130
+ * slot ids grouped by island. A contact belongs to its dynamic
131
+ * participant's island (if both sides are dynamic they share an island
132
+ * by construction). Static-vs-static contacts are skipped.
133
+ * @private
134
+ */
135
+ private __build_contact_csr;
136
+ /**
137
+ * Resolve which island a manifold slot belongs to.
138
+ *
139
+ * Returns `-1` if the manifold is not touched this frame, is a sensor
140
+ * pair, or both bodies are non-dynamic (static-static, which the solver
141
+ * wouldn't act on anyway).
142
+ *
143
+ * @private
144
+ */
145
+ private __island_of_slot;
146
+ /**
147
+ * @private
148
+ * @param {number} n
149
+ */
150
+ private __ensure_body_capacity;
151
+ /**
152
+ * @private
153
+ * @param {number} n
154
+ */
155
+ private __ensure_island_count_capacity;
156
+ /**
157
+ * @private
158
+ * @param {number} n
159
+ */
160
+ private __ensure_body_data_capacity;
161
+ /**
162
+ * @private
163
+ * @param {number} n
164
+ */
165
+ private __ensure_contact_data_capacity;
166
+ }
167
+ //# sourceMappingURL=IslandBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IslandBuilder.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/island/IslandBuilder.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAyFI;;;;;OAKG;IACH,gCAUC;IAtGG;;;;;OAKG;IACH,QAFU,WAAW,CAEY;IAEjC;;;;OAIG;IACH,gBAFU,UAAU,CAEoB;IAExC;;;OAGG;IACH,cAFU,MAAM,CAEK;IAErB;;;;OAIG;IACH,cAFU,WAAW,CAEiB;IAEtC;;;;OAIG;IACH,WAFU,WAAW,CAEe;IAEpC;;;OAGG;IACH,YAFU,MAAM,CAEG;IAEnB;;;;;OAKG;IACH,iBAFU,WAAW,CAEoB;IAEzC;;;;OAIG;IACH,cAFU,WAAW,CAEkB;IAEvC;;;OAGG;IACH,eAFU,MAAM,CAEM;IAEtB;;;;;OAKG;IACH,yBAA0C;IAE1C;;;;;OAKG;IACH,wBAA0C;IAE1C;;;;OAIG;IACH,kBAAmC;IAqBvC;;;;;;;;OAQG;IACH,8DAHW,WAAW,uBACX,OAAO,QAuEjB;IAED;;;;OAIG;IACH,yBA+CC;IAED;;;;;;OAMG;IACH,4BAwCC;IAED;;;;;;;;OAQG;IACH,yBAcC;IAID;;;OAGG;IACH,+BAQC;IAED;;;OAGG;IACH,uCAOC;IAED;;;OAGG;IACH,oCAIC;IAED;;;OAGG;IACH,uCAIC;CACJ"}
@@ -0,0 +1,411 @@
1
+ import { body_id_index } from "../body/BodyStorage.js";
2
+ import { BodyKind } from "../ecs/BodyKind.js";
3
+ import { ColliderFlags } from "../ecs/ColliderFlags.js";
4
+ import { RigidBodyFlags } from "../ecs/RigidBodyFlags.js";
5
+ import { uf_find, uf_init, uf_union } from "./union_find.js";
6
+
7
+ /**
8
+ * Partitions this frame's awake dynamic bodies + touched non-sensor contacts
9
+ * into connected components ("islands") via union-find. The solver iterates
10
+ * each island independently (so impulses converge inside an island without
11
+ * waiting for global passes) and the sleep test will eventually use island
12
+ * granularity for atomic whole-island sleep.
13
+ *
14
+ * Static and Kinematic bodies are not merged into islands — they act as
15
+ * constraint anchors. A 1000-block stack on a static floor is therefore one
16
+ * island of 1000 dynamic bodies, not 1001 — the floor anchors the island but
17
+ * does not enlarge it. Multiple separate piles all resting on the same static
18
+ * floor remain *separate* islands so each can sleep/wake independently.
19
+ *
20
+ * Sensor contacts are skipped entirely: they don't transmit constraint
21
+ * forces, so two bodies linked only by a sensor pair are not in the same
22
+ * structural island.
23
+ *
24
+ * Determinism contract:
25
+ * - Union-find uses union-by-min-index + path halving, so the canonical
26
+ * root of any component is the smallest body index of any of its members.
27
+ * - Islands are emitted sorted ascending by root index.
28
+ * - Bodies within an island are emitted sorted ascending by body index.
29
+ * - Contacts within an island are emitted sorted ascending by manifold slot id.
30
+ *
31
+ * Output layout is CSR-like — `body_offsets[i]..body_offsets[i+1]` indexes
32
+ * into `body_data` for island `i`, similarly for contacts.
33
+ *
34
+ * @author Alex Goldring
35
+ * @copyright Company Named Limited (c) 2026
36
+ */
37
+ export class IslandBuilder {
38
+
39
+ constructor() {
40
+ /**
41
+ * Union-find parent table, indexed by body index (NOT packed id).
42
+ * Sized to `storage.high_water_mark` at `build` time; reallocated by
43
+ * doubling when the body pool grows past current capacity.
44
+ * @type {Uint32Array}
45
+ */
46
+ this.parent = new Uint32Array(16);
47
+
48
+ /**
49
+ * Per-body island id. `island_of_body[idx] === -1` means the body
50
+ * is not in any island this frame (static, kinematic, or unallocated).
51
+ * @type {Int32Array}
52
+ */
53
+ this.island_of_body = new Int32Array(16);
54
+
55
+ /**
56
+ * Number of islands this frame.
57
+ * @type {number}
58
+ */
59
+ this.island_count = 0;
60
+
61
+ /**
62
+ * CSR offsets into `body_data`. Length is `island_count + 1`. Bodies
63
+ * for island `i` live in `body_data[body_offsets[i]..body_offsets[i+1])`.
64
+ * @type {Uint32Array}
65
+ */
66
+ this.body_offsets = new Uint32Array(2);
67
+
68
+ /**
69
+ * Flattened body indices, grouped by island, sorted ascending within
70
+ * each island.
71
+ * @type {Uint32Array}
72
+ */
73
+ this.body_data = new Uint32Array(16);
74
+
75
+ /**
76
+ * Total number of body entries across all islands (= sum of island sizes).
77
+ * @type {number}
78
+ */
79
+ this.body_total = 0;
80
+
81
+ /**
82
+ * CSR offsets into `contact_data`. Length is `island_count + 1`.
83
+ * Manifold slot ids for island `i` live in
84
+ * `contact_data[contact_offsets[i]..contact_offsets[i+1])`.
85
+ * @type {Uint32Array}
86
+ */
87
+ this.contact_offsets = new Uint32Array(2);
88
+
89
+ /**
90
+ * Flattened manifold slot ids, grouped by island, sorted ascending
91
+ * within each island.
92
+ * @type {Uint32Array}
93
+ */
94
+ this.contact_data = new Uint32Array(16);
95
+
96
+ /**
97
+ * Total number of contact entries across all islands.
98
+ * @type {number}
99
+ */
100
+ this.contact_total = 0;
101
+
102
+ /**
103
+ * Scratch: root body index → island id, or -1 if unassigned.
104
+ * Sized in lockstep with `parent`.
105
+ * @private
106
+ * @type {Int32Array}
107
+ */
108
+ this.__root_to_island = new Int32Array(16);
109
+
110
+ /**
111
+ * Scratch: list of distinct root indices observed this frame, used
112
+ * to sort them ascending before assigning island ids.
113
+ * @private
114
+ * @type {Uint32Array}
115
+ */
116
+ this.__scratch_roots = new Uint32Array(16);
117
+
118
+ /**
119
+ * Scratch write-cursors, one per island.
120
+ * @private
121
+ * @type {Uint32Array}
122
+ */
123
+ this.__cursors = new Uint32Array(2);
124
+ }
125
+
126
+ /**
127
+ * @param {RigidBody} rb
128
+ * @param {Array} collider_list collider list for the body (or undefined)
129
+ * @returns {boolean}
130
+ * @private
131
+ */
132
+ static __body_is_sensor(rb, collider_list) {
133
+ if ((rb.flags & RigidBodyFlags.IsSensor) !== 0) return true;
134
+ if (collider_list !== undefined && collider_list.length > 0) {
135
+ // v1 approximation: any collider on the body marked as sensor
136
+ // turns the whole body's contacts into sensor contacts for the
137
+ // purposes of island building. Matches the solver's
138
+ // pair_is_sensor check on the primary collider.
139
+ if ((collider_list[0].collider.flags & ColliderFlags.IsSensor) !== 0) return true;
140
+ }
141
+ return false;
142
+ }
143
+
144
+ /**
145
+ * (Re)build islands from `manifolds`' currently-touched non-sensor slots
146
+ * and the bodies in `storage`'s awake list.
147
+ *
148
+ * @param {BodyStorage} storage
149
+ * @param {ManifoldStore} manifolds
150
+ * @param {RigidBody[]} bodies sparse, indexed by body index
151
+ * @param {Array[]} body_collider_lists sparse, indexed by body index
152
+ */
153
+ build(storage, manifolds, bodies, body_collider_lists) {
154
+ const hwm = storage.high_water_mark;
155
+ this.__ensure_body_capacity(hwm);
156
+
157
+ const parent = this.parent;
158
+ uf_init(parent, hwm);
159
+
160
+ // --- Pass 1: union dynamic-dynamic pairs from touched non-sensor manifolds.
161
+ const live_count = manifolds.count;
162
+ for (let i = 0; i < live_count; i++) {
163
+ const slot = manifolds.live_at(i);
164
+ if (!manifolds.is_touched(slot)) continue;
165
+ const idxA = body_id_index(manifolds.bodyA(slot));
166
+ const idxB = body_id_index(manifolds.bodyB(slot));
167
+ const rbA = bodies[idxA];
168
+ const rbB = bodies[idxB];
169
+ if (rbA === undefined || rbB === undefined) continue;
170
+ if (IslandBuilder.__body_is_sensor(rbA, body_collider_lists[idxA])) continue;
171
+ if (IslandBuilder.__body_is_sensor(rbB, body_collider_lists[idxB])) continue;
172
+ if (rbA.kind === BodyKind.Dynamic && rbB.kind === BodyKind.Dynamic) {
173
+ uf_union(parent, idxA, idxB);
174
+ }
175
+ }
176
+
177
+ // --- Pass 2: collect distinct roots over awake dynamic bodies.
178
+ const island_of_body = this.island_of_body;
179
+ // Cheap reset: only the indices we may write are below hwm.
180
+ for (let i = 0; i < hwm; i++) island_of_body[i] = -1;
181
+
182
+ const root_to_island = this.__root_to_island;
183
+ for (let i = 0; i < hwm; i++) root_to_island[i] = -1;
184
+
185
+ const awake_count = storage.awake_count;
186
+ const scratch_roots = this.__scratch_roots;
187
+ let root_count = 0;
188
+ for (let ai = 0; ai < awake_count; ai++) {
189
+ const idx = storage.awake_at(ai);
190
+ const rb = bodies[idx];
191
+ if (rb === undefined) continue;
192
+ if (rb.kind !== BodyKind.Dynamic) continue;
193
+ const r = uf_find(parent, idx);
194
+ if (root_to_island[r] === -1) {
195
+ scratch_roots[root_count++] = r;
196
+ // Tag as collected — actual id assigned after sort.
197
+ root_to_island[r] = -2;
198
+ }
199
+ }
200
+
201
+ // Sort distinct roots ascending so island id 0 has the smallest root.
202
+ if (root_count > 1) {
203
+ scratch_roots.subarray(0, root_count).sort();
204
+ }
205
+ for (let i = 0; i < root_count; i++) {
206
+ root_to_island[scratch_roots[i]] = i;
207
+ }
208
+ this.island_count = root_count;
209
+
210
+ // Assign island id to every awake dynamic body.
211
+ for (let ai = 0; ai < awake_count; ai++) {
212
+ const idx = storage.awake_at(ai);
213
+ const rb = bodies[idx];
214
+ if (rb === undefined) continue;
215
+ if (rb.kind !== BodyKind.Dynamic) continue;
216
+ const r = uf_find(parent, idx);
217
+ island_of_body[idx] = root_to_island[r];
218
+ }
219
+
220
+ this.__build_body_csr(storage, bodies, awake_count, root_count);
221
+ this.__build_contact_csr(manifolds, bodies, body_collider_lists, root_count);
222
+ }
223
+
224
+ /**
225
+ * Fill `body_offsets` + `body_data` with awake dynamic bodies grouped
226
+ * by island, sorted ascending within each island.
227
+ * @private
228
+ */
229
+ __build_body_csr(storage, bodies, awake_count, island_count) {
230
+ this.__ensure_island_count_capacity(island_count);
231
+ const offsets = this.body_offsets;
232
+ for (let i = 0; i <= island_count; i++) offsets[i] = 0;
233
+
234
+ // Count pass: offsets[i + 1] starts as the number of bodies in island i.
235
+ let total = 0;
236
+ for (let ai = 0; ai < awake_count; ai++) {
237
+ const idx = storage.awake_at(ai);
238
+ const rb = bodies[idx];
239
+ if (rb === undefined) continue;
240
+ if (rb.kind !== BodyKind.Dynamic) continue;
241
+ const isl = this.island_of_body[idx];
242
+ if (isl < 0) continue;
243
+ offsets[isl + 1]++;
244
+ total++;
245
+ }
246
+ // Prefix sum → start offsets.
247
+ for (let i = 0; i < island_count; i++) {
248
+ offsets[i + 1] += offsets[i];
249
+ }
250
+ this.body_total = total;
251
+
252
+ this.__ensure_body_data_capacity(total);
253
+
254
+ const cursors = this.__cursors;
255
+ for (let i = 0; i < island_count; i++) cursors[i] = offsets[i];
256
+
257
+ const data = this.body_data;
258
+ for (let ai = 0; ai < awake_count; ai++) {
259
+ const idx = storage.awake_at(ai);
260
+ const rb = bodies[idx];
261
+ if (rb === undefined) continue;
262
+ if (rb.kind !== BodyKind.Dynamic) continue;
263
+ const isl = this.island_of_body[idx];
264
+ if (isl < 0) continue;
265
+ data[cursors[isl]++] = idx;
266
+ }
267
+
268
+ // Sort each island's body slice ascending.
269
+ for (let i = 0; i < island_count; i++) {
270
+ const start = offsets[i];
271
+ const end = offsets[i + 1];
272
+ if (end - start > 1) {
273
+ data.subarray(start, end).sort();
274
+ }
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Fill `contact_offsets` + `contact_data` with touched non-sensor manifold
280
+ * slot ids grouped by island. A contact belongs to its dynamic
281
+ * participant's island (if both sides are dynamic they share an island
282
+ * by construction). Static-vs-static contacts are skipped.
283
+ * @private
284
+ */
285
+ __build_contact_csr(manifolds, bodies, body_collider_lists, island_count) {
286
+ const offsets = this.contact_offsets;
287
+ for (let i = 0; i <= island_count; i++) offsets[i] = 0;
288
+
289
+ // Count pass.
290
+ const live_count = manifolds.count;
291
+ let total = 0;
292
+ for (let i = 0; i < live_count; i++) {
293
+ const slot = manifolds.live_at(i);
294
+ const isl = this.__island_of_slot(manifolds, slot, bodies, body_collider_lists);
295
+ if (isl < 0) continue;
296
+ offsets[isl + 1]++;
297
+ total++;
298
+ }
299
+ for (let i = 0; i < island_count; i++) {
300
+ offsets[i + 1] += offsets[i];
301
+ }
302
+ this.contact_total = total;
303
+
304
+ this.__ensure_contact_data_capacity(total);
305
+
306
+ const cursors = this.__cursors;
307
+ for (let i = 0; i < island_count; i++) cursors[i] = offsets[i];
308
+
309
+ const data = this.contact_data;
310
+ for (let i = 0; i < live_count; i++) {
311
+ const slot = manifolds.live_at(i);
312
+ const isl = this.__island_of_slot(manifolds, slot, bodies, body_collider_lists);
313
+ if (isl < 0) continue;
314
+ data[cursors[isl]++] = slot;
315
+ }
316
+
317
+ // Sort each island's contact slice ascending by slot id.
318
+ for (let i = 0; i < island_count; i++) {
319
+ const start = offsets[i];
320
+ const end = offsets[i + 1];
321
+ if (end - start > 1) {
322
+ data.subarray(start, end).sort();
323
+ }
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Resolve which island a manifold slot belongs to.
329
+ *
330
+ * Returns `-1` if the manifold is not touched this frame, is a sensor
331
+ * pair, or both bodies are non-dynamic (static-static, which the solver
332
+ * wouldn't act on anyway).
333
+ *
334
+ * @private
335
+ */
336
+ __island_of_slot(manifolds, slot, bodies, body_collider_lists) {
337
+ if (!manifolds.is_touched(slot)) return -1;
338
+ const idxA = body_id_index(manifolds.bodyA(slot));
339
+ const idxB = body_id_index(manifolds.bodyB(slot));
340
+ const rbA = bodies[idxA];
341
+ const rbB = bodies[idxB];
342
+ if (rbA === undefined || rbB === undefined) return -1;
343
+ if (IslandBuilder.__body_is_sensor(rbA, body_collider_lists[idxA])) return -1;
344
+ if (IslandBuilder.__body_is_sensor(rbB, body_collider_lists[idxB])) return -1;
345
+ // Pick the dynamic side's island. If both are dynamic they share
346
+ // one by construction (pass-1 union).
347
+ if (rbA.kind === BodyKind.Dynamic) return this.island_of_body[idxA];
348
+ if (rbB.kind === BodyKind.Dynamic) return this.island_of_body[idxB];
349
+ return -1;
350
+ }
351
+
352
+ // --- Resize helpers ------------------------------------------------------
353
+
354
+ /**
355
+ * @private
356
+ * @param {number} n
357
+ */
358
+ __ensure_body_capacity(n) {
359
+ if (this.parent.length < n) {
360
+ const cap = next_pow2(n);
361
+ this.parent = new Uint32Array(cap);
362
+ this.island_of_body = new Int32Array(cap);
363
+ this.__root_to_island = new Int32Array(cap);
364
+ this.__scratch_roots = new Uint32Array(cap);
365
+ }
366
+ }
367
+
368
+ /**
369
+ * @private
370
+ * @param {number} n
371
+ */
372
+ __ensure_island_count_capacity(n) {
373
+ if (this.body_offsets.length < n + 1) {
374
+ const cap = next_pow2(n + 1);
375
+ this.body_offsets = new Uint32Array(cap);
376
+ this.contact_offsets = new Uint32Array(cap);
377
+ this.__cursors = new Uint32Array(cap);
378
+ }
379
+ }
380
+
381
+ /**
382
+ * @private
383
+ * @param {number} n
384
+ */
385
+ __ensure_body_data_capacity(n) {
386
+ if (this.body_data.length < n) {
387
+ this.body_data = new Uint32Array(next_pow2(n));
388
+ }
389
+ }
390
+
391
+ /**
392
+ * @private
393
+ * @param {number} n
394
+ */
395
+ __ensure_contact_data_capacity(n) {
396
+ if (this.contact_data.length < n) {
397
+ this.contact_data = new Uint32Array(next_pow2(n));
398
+ }
399
+ }
400
+ }
401
+
402
+ /**
403
+ * @param {number} n
404
+ * @returns {number}
405
+ */
406
+ function next_pow2(n) {
407
+ if (n <= 1) return 1;
408
+ let p = 1;
409
+ while (p < n) p <<= 1;
410
+ return p;
411
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Disjoint-set-union (union-find) primitives on a flat `Uint32Array` parent
3
+ * table. Stateless helpers — callers own the buffer.
4
+ *
5
+ * Design choices:
6
+ * - **Path halving** rather than full path compression. Halving rewires
7
+ * `parent[x]` to `parent[parent[x]]` as it walks, which is `O(α(n))`
8
+ * amortised (same as full compression) but has a simpler control flow and
9
+ * is deterministic regardless of call order. Full compression's iterative
10
+ * second pass would observe a different mutation pattern depending on
11
+ * which subtree was queried first — fine for correctness, awkward for
12
+ * bit-exact same-runtime determinism.
13
+ * - **Union by min-index** rather than by rank or size. The smaller index
14
+ * always becomes the root. This makes the canonical root of a component
15
+ * a deterministic function of the bodies in it (the smallest body index
16
+ * of any member), which gives us a natural stable ordering when sorting
17
+ * islands at the end. Slightly worse worst-case tree height than
18
+ * union-by-rank but path halving keeps the amortised cost the same in
19
+ * practice for the body counts we care about (≤ millions).
20
+ *
21
+ * Used by {@link IslandBuilder} to partition awake bodies + contact pairs
22
+ * into connected components (islands) so the solver can iterate each
23
+ * independently and so whole islands can sleep atomically.
24
+ *
25
+ * @author Alex Goldring
26
+ * @copyright Company Named Limited (c) 2026
27
+ */
28
+ /**
29
+ * Initialise `parent` so every node `i ∈ [0, n)` is its own root.
30
+ * @param {Uint32Array} parent
31
+ * @param {number} n
32
+ */
33
+ export function uf_init(parent: Uint32Array, n: number): void;
34
+ /**
35
+ * Find the root of `x` with path halving. Mutates `parent` to compress the
36
+ * walked path by one level per hop.
37
+ * @param {Uint32Array} parent
38
+ * @param {number} x
39
+ * @returns {number} root index
40
+ */
41
+ export function uf_find(parent: Uint32Array, x: number): number;
42
+ /**
43
+ * Union the components containing `x` and `y`. The smaller-indexed root wins,
44
+ * keeping the canonical root deterministic regardless of call order.
45
+ * @param {Uint32Array} parent
46
+ * @param {number} x
47
+ * @param {number} y
48
+ * @returns {number} the root of the unified component
49
+ */
50
+ export function uf_union(parent: Uint32Array, x: number, y: number): number;
51
+ //# sourceMappingURL=union_find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union_find.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/island/union_find.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;;;GAIG;AACH,gCAHW,WAAW,KACX,MAAM,QAIhB;AAED;;;;;;GAMG;AACH,gCAJW,WAAW,KACX,MAAM,GACJ,MAAM,CAYlB;AAED;;;;;;;GAOG;AACH,iCALW,WAAW,KACX,MAAM,KACN,MAAM,GACJ,MAAM,CAalB"}