@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,48 @@
1
+ import { assert } from "../../../assert.js";
2
+
3
+ /**
4
+ * Build a `Map<vertex_id, tet_id[]>` enumerating every live tet that
5
+ * contains each vertex. One full pass over the mesh; the result lets
6
+ * subsequent per-vertex queries run in O(deg) instead of O(N).
7
+ *
8
+ * Useful when the caller is about to perform many per-vertex queries —
9
+ * e.g. boundary-status checks or 1-ring quality evaluations across a whole
10
+ * mesh during a quality-improvement pass. Without the cache, each query
11
+ * has to scan every live tet (see
12
+ * {@link tetrahedral_mesh_find_tets_attached_to_vertex} and
13
+ * {@link tetrahedral_mesh_vertex_is_boundary}), which compounds to O(N²)
14
+ * over a full pass.
15
+ *
16
+ * The map is a SNAPSHOT: it reflects mesh state at build time. Any flips,
17
+ * deletions or appends that happen afterwards will leave it stale. Callers
18
+ * must either rebuild after each mutation or accept the staleness (for
19
+ * boundary checks the cache is flip-invariant, so a once-per-pass rebuild
20
+ * is safe; for queries that need the exact current 1-ring, the caller
21
+ * should filter through `mesh.exists` and rebuild after mutations they
22
+ * care about).
23
+ *
24
+ * Cost: O(N) where N is `mesh.count`.
25
+ *
26
+ * @param {TetrahedralMesh} mesh
27
+ * @returns {Map<number, number[]>}
28
+ */
29
+ export function tetrahedral_mesh_build_vertex_to_tets_map(mesh) {
30
+ assert.defined(mesh, 'mesh');
31
+
32
+ /** @type {Map<number, number[]>} */
33
+ const map = new Map();
34
+
35
+ mesh.forEach((tet, m) => {
36
+ for (let i = 0; i < 4; i++) {
37
+ const v = m.getVertexIndex(tet, i);
38
+ let bucket = map.get(v);
39
+ if (bucket === undefined) {
40
+ bucket = [];
41
+ map.set(v, bucket);
42
+ }
43
+ bucket.push(tet);
44
+ }
45
+ });
46
+
47
+ return map;
48
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Carve a Delaunay tetrahedralization so only the tets inside the input
3
+ * surface remain. Operates on a TetrahedralMesh whose vertex IDs are aligned
4
+ * with the surface's vertex IDs — both index into the same flat positions
5
+ * array used by `compute_delaunay_tetrahedral_mesh`.
6
+ *
7
+ * Algorithm: build a BVH over the surface triangles, then for every tet,
8
+ * classify its centroid as inside or outside via parity ray-casting against
9
+ * the BVH. Exterior tets are disconnected and deleted.
10
+ *
11
+ * Pure ray-cast classification is intentional. A flood-fill optimisation over
12
+ * tet adjacency would be cheaper but is unsafe when the Delaunay's diagonals
13
+ * differ from the surface's (always the case for coarse meshes like a cube,
14
+ * common for finer meshes): leaked surface triangles let the fill cross from
15
+ * interior to exterior unchecked, deleting tets that should be kept.
16
+ *
17
+ * @param {TetrahedralMesh} tet_mesh mutated in place
18
+ * @param {ArrayLike<number>|Float32Array} positions same flat (x,y,z) array used in the Delaunay pass
19
+ * @param {BinaryTopology} surface watertight surface mesh defining inside/outside
20
+ * @returns {{deleted: number, kept: number}}
21
+ */
22
+ export function tetrahedral_mesh_carve_outside_surface(tet_mesh: TetrahedralMesh, positions: ArrayLike<number> | Float32Array, surface: BinaryTopology): {
23
+ deleted: number;
24
+ kept: number;
25
+ };
26
+ //# sourceMappingURL=tetrahedral_mesh_carve_outside_surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_carve_outside_surface.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js"],"names":[],"mappings":"AAoJA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6FAJW,UAAU,MAAM,CAAC,GAAC,YAAY;aAElB,MAAM;UAAQ,MAAM;EAsD1C"}
@@ -0,0 +1,222 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { BVH, NULL_NODE } from "../../../bvh2/bvh3/BVH.js";
3
+ import { bvh_query_user_data_ray } from "../../../bvh2/bvh3/query/bvh_query_user_data_ray.js";
4
+ import { SurfacePoint3 } from "../SurfacePoint3.js";
5
+ import { computeTriangleRayIntersection } from "../triangle/computeTriangleRayIntersection.js";
6
+
7
+ // Three irrational, mutually unrelated ray directions used for majority-vote
8
+ // inside/outside classification. A single ray is fragile: when it grazes a
9
+ // triangle edge or vertex shared between several faces, Möller-Trumbore's
10
+ // strict inequalities can count 0 or 2 hits instead of 1, flipping parity
11
+ // and wrongly classifying a tet. Three independent rays defang this — at
12
+ // least two must agree, and the geometric chance of two independent
13
+ // irrational rays both grazing shared features is vanishingly small for
14
+ // real-world meshes (Suzanne, sphere, torus, bunny, …).
15
+ //
16
+ // Each row must be roughly unit-length so the AABB-vs-ray slab test in the
17
+ // BVH query doesn't degenerate. Hand-picked rather than randomised so the
18
+ // algorithm is fully deterministic.
19
+ const RAY_DIRECTIONS = [
20
+ 0.97123, 0.18927, 0.14431,
21
+ 0.34219, 0.91283, -0.22971,
22
+ -0.51237, 0.27894, 0.81235,
23
+ ];
24
+ const RAY_COUNT = RAY_DIRECTIONS.length / 3;
25
+
26
+ /**
27
+ * Build a BVH over the surface triangles. Each leaf's user_data is the
28
+ * source face ID.
29
+ *
30
+ * @param {BVH} bvh
31
+ * @param {BinaryTopology} surface
32
+ */
33
+ function build_surface_bvh(bvh, surface) {
34
+ bvh.release_all();
35
+
36
+ const face_count = surface.faces.size;
37
+ const v = [0, 0, 0];
38
+
39
+ for (let f = 0; f < face_count; f++) {
40
+ if (!surface.faces.is_allocated(f)) continue;
41
+
42
+ const l0 = surface.face_read_loop(f);
43
+ const l1 = surface.loop_read_next(l0);
44
+ const l2 = surface.loop_read_next(l1);
45
+
46
+ const v0 = surface.loop_read_vertex(l0);
47
+ const v1 = surface.loop_read_vertex(l1);
48
+ const v2 = surface.loop_read_vertex(l2);
49
+
50
+ surface.vertex_read_coordinate(v, 0, v0);
51
+ let minx = v[0], miny = v[1], minz = v[2];
52
+ let maxx = v[0], maxy = v[1], maxz = v[2];
53
+
54
+ surface.vertex_read_coordinate(v, 0, v1);
55
+ if (v[0] < minx) minx = v[0]; else if (v[0] > maxx) maxx = v[0];
56
+ if (v[1] < miny) miny = v[1]; else if (v[1] > maxy) maxy = v[1];
57
+ if (v[2] < minz) minz = v[2]; else if (v[2] > maxz) maxz = v[2];
58
+
59
+ surface.vertex_read_coordinate(v, 0, v2);
60
+ if (v[0] < minx) minx = v[0]; else if (v[0] > maxx) maxx = v[0];
61
+ if (v[1] < miny) miny = v[1]; else if (v[1] > maxy) maxy = v[1];
62
+ if (v[2] < minz) minz = v[2]; else if (v[2] > maxz) maxz = v[2];
63
+
64
+ const node = bvh.allocate_node();
65
+ bvh.node_set_user_data(node, f);
66
+ bvh.node_set_aabb_primitive(node, minx, miny, minz, maxx, maxy, maxz);
67
+ bvh.insert_leaf(node);
68
+ }
69
+ }
70
+
71
+ const ray_hit = new SurfacePoint3();
72
+ const ray_candidates = [];
73
+ const va = [0, 0, 0];
74
+ const vb = [0, 0, 0];
75
+ const vc = [0, 0, 0];
76
+
77
+ /**
78
+ * Cast a single ray and return the parity of triangle-intersection count
79
+ * (true ⇔ odd ⇔ inside, under the assumption of a closed surface).
80
+ */
81
+ function single_ray_parity_inside(bvh, root, surface, ox, oy, oz, dx, dy, dz) {
82
+ const candidate_count = bvh_query_user_data_ray(
83
+ bvh, root,
84
+ ray_candidates, 0,
85
+ ox, oy, oz,
86
+ dx, dy, dz
87
+ );
88
+
89
+ let hits = 0;
90
+ for (let i = 0; i < candidate_count; i++) {
91
+ const f = ray_candidates[i];
92
+ const l0 = surface.face_read_loop(f);
93
+ const l1 = surface.loop_read_next(l0);
94
+ const l2 = surface.loop_read_next(l1);
95
+
96
+ surface.vertex_read_coordinate(va, 0, surface.loop_read_vertex(l0));
97
+ surface.vertex_read_coordinate(vb, 0, surface.loop_read_vertex(l1));
98
+ surface.vertex_read_coordinate(vc, 0, surface.loop_read_vertex(l2));
99
+
100
+ const hit = computeTriangleRayIntersection(
101
+ ray_hit,
102
+ ox, oy, oz,
103
+ dx, dy, dz,
104
+ va[0], va[1], va[2],
105
+ vb[0], vb[1], vb[2],
106
+ vc[0], vc[1], vc[2]
107
+ );
108
+
109
+ if (hit) hits++;
110
+ }
111
+
112
+ return (hits & 1) === 1;
113
+ }
114
+
115
+ /**
116
+ * Classify a point as inside or outside the surface using a majority vote
117
+ * across `RAY_COUNT` independent parity ray-casts. Robust against the
118
+ * edge/vertex grazing pathologies that defeat single-ray parity.
119
+ *
120
+ * @param {BVH} bvh
121
+ * @param {BinaryTopology} surface
122
+ * @param {number} ox
123
+ * @param {number} oy
124
+ * @param {number} oz
125
+ * @returns {boolean}
126
+ */
127
+ function point_is_inside_surface(bvh, surface, ox, oy, oz) {
128
+ const root = bvh.root;
129
+ if (root === NULL_NODE) {
130
+ return false;
131
+ }
132
+
133
+ let inside_votes = 0;
134
+
135
+ for (let r = 0; r < RAY_COUNT; r++) {
136
+ const dx = RAY_DIRECTIONS[r * 3];
137
+ const dy = RAY_DIRECTIONS[r * 3 + 1];
138
+ const dz = RAY_DIRECTIONS[r * 3 + 2];
139
+
140
+ if (single_ray_parity_inside(bvh, root, surface, ox, oy, oz, dx, dy, dz)) {
141
+ inside_votes++;
142
+ }
143
+ }
144
+
145
+ // Strict majority (more than half).
146
+ return inside_votes * 2 > RAY_COUNT;
147
+ }
148
+
149
+ /**
150
+ * Carve a Delaunay tetrahedralization so only the tets inside the input
151
+ * surface remain. Operates on a TetrahedralMesh whose vertex IDs are aligned
152
+ * with the surface's vertex IDs — both index into the same flat positions
153
+ * array used by `compute_delaunay_tetrahedral_mesh`.
154
+ *
155
+ * Algorithm: build a BVH over the surface triangles, then for every tet,
156
+ * classify its centroid as inside or outside via parity ray-casting against
157
+ * the BVH. Exterior tets are disconnected and deleted.
158
+ *
159
+ * Pure ray-cast classification is intentional. A flood-fill optimisation over
160
+ * tet adjacency would be cheaper but is unsafe when the Delaunay's diagonals
161
+ * differ from the surface's (always the case for coarse meshes like a cube,
162
+ * common for finer meshes): leaked surface triangles let the fill cross from
163
+ * interior to exterior unchecked, deleting tets that should be kept.
164
+ *
165
+ * @param {TetrahedralMesh} tet_mesh mutated in place
166
+ * @param {ArrayLike<number>|Float32Array} positions same flat (x,y,z) array used in the Delaunay pass
167
+ * @param {BinaryTopology} surface watertight surface mesh defining inside/outside
168
+ * @returns {{deleted: number, kept: number}}
169
+ */
170
+ export function tetrahedral_mesh_carve_outside_surface(tet_mesh, positions, surface) {
171
+ assert.defined(tet_mesh, 'tet_mesh');
172
+ assert.equal(tet_mesh.isTetrahedralMesh, true, 'tet_mesh.isTetrahedralMesh !== true');
173
+ assert.defined(surface, 'surface');
174
+ assert.equal(surface.isBinaryTopology, true, 'surface.isBinaryTopology !== true');
175
+
176
+ const surface_bvh = new BVH();
177
+ build_surface_bvh(surface_bvh, surface);
178
+
179
+ const live_tets = tet_mesh.getLive();
180
+ const live_count = live_tets.length;
181
+
182
+ let deleted = 0;
183
+ let kept = 0;
184
+
185
+ // Classify each tet by its centroid. The centroid is guaranteed strictly
186
+ // interior to the tet, so the parity ray-cast against the surface gives
187
+ // an unambiguous answer (never on the surface itself).
188
+ //
189
+ // Face-centroid multi-sampling was considered but rejected: face
190
+ // centroids of large boundary tets land EXACTLY on a surface triangle,
191
+ // making the parity test ambiguous (the ray-triangle test reports a hit
192
+ // or a miss depending on rounding), which corrupted coarse-mesh results
193
+ // (e.g. a unit cube tetrahedralized into ~5 tets lost ~17 % of its
194
+ // volume). The current single-point classifier converges correctly for
195
+ // both coarse convex meshes (cube, sphere) and complex non-convex ones
196
+ // (Suzanne, torus) at the cost of a few-percent discretization gap that
197
+ // shrinks with resolution.
198
+ for (let i = 0; i < live_count; i++) {
199
+ const tet = live_tets[i];
200
+
201
+ let cx = 0, cy = 0, cz = 0;
202
+ for (let j = 0; j < 4; j++) {
203
+ const v3 = tet_mesh.getVertexIndex(tet, j) * 3;
204
+ cx += positions[v3];
205
+ cy += positions[v3 + 1];
206
+ cz += positions[v3 + 2];
207
+ }
208
+ cx *= 0.25;
209
+ cy *= 0.25;
210
+ cz *= 0.25;
211
+
212
+ if (point_is_inside_surface(surface_bvh, surface, cx, cy, cz)) {
213
+ kept++;
214
+ } else {
215
+ tet_mesh.disconnect(tet);
216
+ tet_mesh.delete(tet);
217
+ deleted++;
218
+ }
219
+ }
220
+
221
+ return { deleted, kept };
222
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Collect every tet sharing the edge (v_a, v_b), starting from a tet that's
3
+ * already known to contain the edge. Walks the ring of tets around the edge
4
+ * by following face-neighbours through the two faces of each tet that
5
+ * contain both endpoints.
6
+ *
7
+ * Output is written to `result[result_offset..result_offset + count - 1]`
8
+ * in walk order; the starting tet is first. For an INTERIOR edge (every
9
+ * face neighbour exists) the walk forms a closed cycle visiting each
10
+ * incident tet once; the function returns the count and `out_closed[0]`
11
+ * is set to 1. For a BOUNDARY edge (one or both walk directions hit
12
+ * INVALID_NEIGHBOUR) the walk continues from `start_tet` in the OTHER
13
+ * direction; the function still returns every tet it visited, but
14
+ * `out_closed[0]` is set to 0 so callers that need a proper ring (e.g.
15
+ * the 3-2 flip, which is only valid on closed rings) can reject the input.
16
+ *
17
+ * Cost: O(ring_size), one or two neighbour-hops per tet — much cheaper than
18
+ * scanning the whole mesh, which is why callers should prefer this over
19
+ * {@link tetrahedral_mesh_find_tets_attached_to_vertex} when they already
20
+ * have a starting tet.
21
+ *
22
+ * @param {number[]} result
23
+ * @param {number} result_offset
24
+ * @param {TetrahedralMesh} mesh
25
+ * @param {number} start_tet — must contain both v_a and v_b
26
+ * @param {number} v_a
27
+ * @param {number} v_b
28
+ * @param {number[]} out_closed — 1-element array; set to 1 if the walk
29
+ * closed (interior edge), 0 if either direction hit a boundary face.
30
+ * Callers that need a closed-ring guarantee must inspect this.
31
+ * @returns {number} number of tets written (always ≥ 1 — the start_tet)
32
+ */
33
+ export function tetrahedral_mesh_find_tets_around_edge(result: number[], result_offset: number, mesh: TetrahedralMesh, start_tet: number, v_a: number, v_b: number, out_closed: number[]): number;
34
+ //# sourceMappingURL=tetrahedral_mesh_find_tets_around_edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_find_tets_around_edge.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,+DAXW,MAAM,EAAE,iBACR,MAAM,oCAEN,MAAM,OACN,MAAM,OACN,MAAM,cACN,MAAM,EAAE,GAGN,MAAM,CA+DlB"}
@@ -0,0 +1,146 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { INVALID_NEIGHBOUR } from "./TetrahedralMesh.js";
3
+
4
+ /**
5
+ * Collect every tet sharing the edge (v_a, v_b), starting from a tet that's
6
+ * already known to contain the edge. Walks the ring of tets around the edge
7
+ * by following face-neighbours through the two faces of each tet that
8
+ * contain both endpoints.
9
+ *
10
+ * Output is written to `result[result_offset..result_offset + count - 1]`
11
+ * in walk order; the starting tet is first. For an INTERIOR edge (every
12
+ * face neighbour exists) the walk forms a closed cycle visiting each
13
+ * incident tet once; the function returns the count and `out_closed[0]`
14
+ * is set to 1. For a BOUNDARY edge (one or both walk directions hit
15
+ * INVALID_NEIGHBOUR) the walk continues from `start_tet` in the OTHER
16
+ * direction; the function still returns every tet it visited, but
17
+ * `out_closed[0]` is set to 0 so callers that need a proper ring (e.g.
18
+ * the 3-2 flip, which is only valid on closed rings) can reject the input.
19
+ *
20
+ * Cost: O(ring_size), one or two neighbour-hops per tet — much cheaper than
21
+ * scanning the whole mesh, which is why callers should prefer this over
22
+ * {@link tetrahedral_mesh_find_tets_attached_to_vertex} when they already
23
+ * have a starting tet.
24
+ *
25
+ * @param {number[]} result
26
+ * @param {number} result_offset
27
+ * @param {TetrahedralMesh} mesh
28
+ * @param {number} start_tet — must contain both v_a and v_b
29
+ * @param {number} v_a
30
+ * @param {number} v_b
31
+ * @param {number[]} out_closed — 1-element array; set to 1 if the walk
32
+ * closed (interior edge), 0 if either direction hit a boundary face.
33
+ * Callers that need a closed-ring guarantee must inspect this.
34
+ * @returns {number} number of tets written (always ≥ 1 — the start_tet)
35
+ */
36
+ export function tetrahedral_mesh_find_tets_around_edge(
37
+ result, result_offset,
38
+ mesh, start_tet, v_a, v_b,
39
+ out_closed
40
+ ) {
41
+ assert.defined(result, 'result');
42
+ assert.defined(mesh, 'mesh');
43
+ assert.isNonNegativeInteger(start_tet, 'start_tet');
44
+ assert.isNonNegativeInteger(v_a, 'v_a');
45
+ assert.isNonNegativeInteger(v_b, 'v_b');
46
+ assert.notEqual(v_a, v_b, 'v_a and v_b must be distinct');
47
+ assert.defined(out_closed, 'out_closed');
48
+
49
+ // Find slots of v_a and v_b in the starting tet.
50
+ let slot_a_start = -1;
51
+ let slot_b_start = -1;
52
+ for (let i = 0; i < 4; i++) {
53
+ const v = mesh.getVertexIndex(start_tet, i);
54
+ if (v === v_a) slot_a_start = i;
55
+ else if (v === v_b) slot_b_start = i;
56
+ }
57
+ if (slot_a_start < 0 || slot_b_start < 0) {
58
+ throw new Error(`start_tet ${start_tet} does not contain both vertices ${v_a} and ${v_b}`);
59
+ }
60
+
61
+ // The 2 "other" slots in start_tet are the slots of the 2 vertices that
62
+ // are NOT on the edge. The faces OPPOSITE these 2 slots both contain
63
+ // the edge (v_a, v_b); each leads to a different ring neighbour.
64
+ let first_step_slot = -1;
65
+ let second_step_slot = -1;
66
+ for (let i = 0; i < 4; i++) {
67
+ if (i === slot_a_start || i === slot_b_start) continue;
68
+ if (first_step_slot < 0) first_step_slot = i;
69
+ else second_step_slot = i;
70
+ }
71
+
72
+ let cursor = result_offset;
73
+ result[cursor++] = start_tet;
74
+
75
+ // Walk forward via first_step_slot.
76
+ const forward = walk(
77
+ mesh, v_a, v_b, start_tet, first_step_slot, result, /* state */ { cursor }
78
+ );
79
+ cursor = forward.cursor;
80
+
81
+ if (forward.closed) {
82
+ // Ring closed with one walk — visited every incident tet.
83
+ out_closed[0] = 1;
84
+ return cursor - result_offset;
85
+ }
86
+
87
+ // Forward walk hit a boundary face. The ring is open on at least one
88
+ // side; walk backward from start_tet via the OTHER step slot too.
89
+ const backward = walk(
90
+ mesh, v_a, v_b, start_tet, second_step_slot, result, { cursor }
91
+ );
92
+ cursor = backward.cursor;
93
+
94
+ // Two walks were needed → the edge is on the boundary, ring is open.
95
+ out_closed[0] = 0;
96
+ return cursor - result_offset;
97
+ }
98
+
99
+ /**
100
+ * Walk the ring of tets sharing edge (v_a, v_b), starting at `from_tet` and
101
+ * leaving through `from_slot`. Appends visited tets (not including
102
+ * `from_tet`) to `result` at `state.cursor`, updating the cursor. Returns
103
+ * `{ cursor, closed }` — `closed` is true if the walk returned to
104
+ * `from_tet` (interior edge), false if it hit a boundary face.
105
+ */
106
+ function walk(mesh, v_a, v_b, from_tet, from_slot, result, state) {
107
+ let curr_tet = from_tet;
108
+ let exit_slot = from_slot;
109
+
110
+ while (true) {
111
+ const enc = mesh.getNeighbour(curr_tet, exit_slot);
112
+ if (enc === INVALID_NEIGHBOUR) {
113
+ return { cursor: state.cursor, closed: false };
114
+ }
115
+
116
+ const next_tet = enc >>> 2;
117
+ if (next_tet === from_tet) {
118
+ return { cursor: state.cursor, closed: true };
119
+ }
120
+
121
+ result[state.cursor++] = next_tet;
122
+
123
+ // Find slots of v_a, v_b in next_tet, and the back-slot (the face
124
+ // we just walked through). The next "exit" is the only remaining
125
+ // slot — i.e., {0,1,2,3} \ {slot_a, slot_b, back_slot}.
126
+ let slot_a_next = -1;
127
+ let slot_b_next = -1;
128
+ for (let i = 0; i < 4; i++) {
129
+ const v = mesh.getVertexIndex(next_tet, i);
130
+ if (v === v_a) slot_a_next = i;
131
+ else if (v === v_b) slot_b_next = i;
132
+ }
133
+ const back_slot = enc & 3;
134
+
135
+ let next_exit = -1;
136
+ for (let i = 0; i < 4; i++) {
137
+ if (i !== slot_a_next && i !== slot_b_next && i !== back_slot) {
138
+ next_exit = i;
139
+ break;
140
+ }
141
+ }
142
+
143
+ curr_tet = next_tet;
144
+ exit_slot = next_exit;
145
+ }
146
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Perform a 2-3 flip on two tetrahedra that share a face.
3
+ *
4
+ * Input two tets t1, t2 sharing a triangle face. The flip removes that face
5
+ * and replaces it with a new edge connecting the two "apex" vertices (the
6
+ * vertex of each tet that's NOT on the shared face). The shared bipyramid is
7
+ * re-tetrahedralised into three new tets, each containing the new edge plus
8
+ * one edge of the original shared face.
9
+ *
10
+ * Counts go from (2 tets, 5 vertices total, 1 internal face) to (3 tets, 5
11
+ * vertices, 3 internal faces). No vertex IDs change; the operation is purely
12
+ * topological — it doesn't touch the points array.
13
+ *
14
+ * Geometric validity (positive volume of each new tet under any specific
15
+ * embedding) is the caller's responsibility. The flip preserves orientation
16
+ * — if t1 was positively wound the new tets are too — but the new edge
17
+ * (d, e) must actually lie inside the convex region formed by the original
18
+ * two tets for the result to be a valid embedding. Outside Delaunay /
19
+ * constraint-recovery contexts this is the caller's domain knowledge.
20
+ *
21
+ * Implementation notes:
22
+ * - t1's storage slot is reused for one of the new tets ("T_alpha")
23
+ * - t2's slot for another ("T_beta")
24
+ * - one fresh slot is allocated for the third ("T_gamma")
25
+ * - all four external neighbour back-pointers around each of t1 and t2
26
+ * are rewritten to point at the right new tet/slot
27
+ *
28
+ * @param {TetrahedralMesh} mesh
29
+ * @param {number} t1
30
+ * @param {number} t2 must share a face with t1
31
+ * @param {Uint32Array|number[]} out output storage; out[0..2] receive the 3
32
+ * new tet IDs. Caller provides — the function performs no allocation.
33
+ * Must have length ≥ 3.
34
+ */
35
+ export function tetrahedral_mesh_flip_23(mesh: TetrahedralMesh, t1: number, t2: number, out: Uint32Array | number[]): void;
36
+ //# sourceMappingURL=tetrahedral_mesh_flip_23.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_flip_23.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,oEANW,MAAM,MACN,MAAM,OACN,WAAW,GAAC,MAAM,EAAE,QAmK9B"}