@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,232 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { INVALID_NEIGHBOUR } from "./TetrahedralMesh.js";
3
+
4
+ /**
5
+ * For a tet stored as (v0, v1, v2, v3), the vertices of the face opposite
6
+ * vertex i, in counter-clockwise order viewed from outside the tet (i.e. the
7
+ * standard outward-facing winding for a positively-oriented tet whose signed
8
+ * volume is positive under the engine's `compute_tetrahedron_volume`).
9
+ *
10
+ * Derived from the volume formula vol = (1/6)·det[v0-v3, v1-v3, v2-v3]:
11
+ * - Face opposite v3 is the canonical case (v0, v1, v2).
12
+ * - Other faces follow by even-permutation parity to keep the implied tet
13
+ * (face, opposite_vertex) positively wound.
14
+ */
15
+ const FACE_VERTICES_BY_OPPOSITE = [
16
+ [1, 3, 2], // opposite v0
17
+ [0, 2, 3], // opposite v1
18
+ [0, 3, 1], // opposite v2
19
+ [0, 1, 2], // opposite v3
20
+ ];
21
+
22
+ /**
23
+ * Perform a 2-3 flip on two tetrahedra that share a face.
24
+ *
25
+ * Input two tets t1, t2 sharing a triangle face. The flip removes that face
26
+ * and replaces it with a new edge connecting the two "apex" vertices (the
27
+ * vertex of each tet that's NOT on the shared face). The shared bipyramid is
28
+ * re-tetrahedralised into three new tets, each containing the new edge plus
29
+ * one edge of the original shared face.
30
+ *
31
+ * Counts go from (2 tets, 5 vertices total, 1 internal face) to (3 tets, 5
32
+ * vertices, 3 internal faces). No vertex IDs change; the operation is purely
33
+ * topological — it doesn't touch the points array.
34
+ *
35
+ * Geometric validity (positive volume of each new tet under any specific
36
+ * embedding) is the caller's responsibility. The flip preserves orientation
37
+ * — if t1 was positively wound the new tets are too — but the new edge
38
+ * (d, e) must actually lie inside the convex region formed by the original
39
+ * two tets for the result to be a valid embedding. Outside Delaunay /
40
+ * constraint-recovery contexts this is the caller's domain knowledge.
41
+ *
42
+ * Implementation notes:
43
+ * - t1's storage slot is reused for one of the new tets ("T_alpha")
44
+ * - t2's slot for another ("T_beta")
45
+ * - one fresh slot is allocated for the third ("T_gamma")
46
+ * - all four external neighbour back-pointers around each of t1 and t2
47
+ * are rewritten to point at the right new tet/slot
48
+ *
49
+ * @param {TetrahedralMesh} mesh
50
+ * @param {number} t1
51
+ * @param {number} t2 must share a face with t1
52
+ * @param {Uint32Array|number[]} out output storage; out[0..2] receive the 3
53
+ * new tet IDs. Caller provides — the function performs no allocation.
54
+ * Must have length ≥ 3.
55
+ */
56
+ export function tetrahedral_mesh_flip_23(mesh, t1, t2, out) {
57
+ assert.defined(mesh, 'mesh');
58
+ assert.equal(mesh.isTetrahedralMesh, true, 'mesh.isTetrahedralMesh !== true');
59
+ assert.isNonNegativeInteger(t1, 't1');
60
+ assert.isNonNegativeInteger(t2, 't2');
61
+ assert.notEqual(t1, t2, 't1 must not equal t2');
62
+ assert.defined(out, 'out');
63
+
64
+ // -----------------------------------------------------------------
65
+ // Step 1: locate the shared face.
66
+ // -----------------------------------------------------------------
67
+ let shared_i1 = -1;
68
+ let shared_i2 = -1;
69
+ for (let i = 0; i < 4; i++) {
70
+ const enc = mesh.getNeighbour(t1, i);
71
+ if (enc === INVALID_NEIGHBOUR) continue;
72
+ if ((enc >>> 2) === t2) {
73
+ shared_i1 = i;
74
+ shared_i2 = enc & 3;
75
+ break;
76
+ }
77
+ }
78
+ if (shared_i1 < 0) {
79
+ throw new Error(`tets ${t1} and ${t2} do not share a face`);
80
+ }
81
+
82
+ // -----------------------------------------------------------------
83
+ // Step 2: identify the 5 distinct vertices.
84
+ // d = apex of t1 (opposite the shared face)
85
+ // e = apex of t2
86
+ // (p, q, r) = shared face vertices, in CCW order seen from outside t1
87
+ // (i.e. the standard "outward face" ordering)
88
+ // -----------------------------------------------------------------
89
+ const d = mesh.getVertexIndex(t1, shared_i1);
90
+ const e = mesh.getVertexIndex(t2, shared_i2);
91
+
92
+ const face_t1 = FACE_VERTICES_BY_OPPOSITE[shared_i1];
93
+ const pos_p_in_t1 = face_t1[0];
94
+ const pos_q_in_t1 = face_t1[1];
95
+ const pos_r_in_t1 = face_t1[2];
96
+
97
+ const p = mesh.getVertexIndex(t1, pos_p_in_t1);
98
+ const q = mesh.getVertexIndex(t1, pos_q_in_t1);
99
+ const r = mesh.getVertexIndex(t1, pos_r_in_t1);
100
+
101
+ // Find where p, q, r live in t2's vertex array. Needed to look up which
102
+ // of t2's external neighbours sits opposite each of p, q, r.
103
+ let pos_p_in_t2 = -1, pos_q_in_t2 = -1, pos_r_in_t2 = -1;
104
+ for (let i = 0; i < 4; i++) {
105
+ const v = mesh.getVertexIndex(t2, i);
106
+ if (v === p) pos_p_in_t2 = i;
107
+ else if (v === q) pos_q_in_t2 = i;
108
+ else if (v === r) pos_r_in_t2 = i;
109
+ }
110
+ if (pos_p_in_t2 < 0 || pos_q_in_t2 < 0 || pos_r_in_t2 < 0) {
111
+ throw new Error(
112
+ `tets ${t1} and ${t2} are recorded as neighbours but their shared face vertices don't match — mesh integrity broken`
113
+ );
114
+ }
115
+
116
+ // -----------------------------------------------------------------
117
+ // Step 3: snapshot external neighbours BEFORE we start writing.
118
+ // t1's faces opposite p, q, r are external (the face opposite d is t2).
119
+ // Same for t2.
120
+ // -----------------------------------------------------------------
121
+ const ext_p_t1 = mesh.getNeighbour(t1, pos_p_in_t1);
122
+ const ext_q_t1 = mesh.getNeighbour(t1, pos_q_in_t1);
123
+ const ext_r_t1 = mesh.getNeighbour(t1, pos_r_in_t1);
124
+ const ext_p_t2 = mesh.getNeighbour(t2, pos_p_in_t2);
125
+ const ext_q_t2 = mesh.getNeighbour(t2, pos_q_in_t2);
126
+ const ext_r_t2 = mesh.getNeighbour(t2, pos_r_in_t2);
127
+
128
+ // -----------------------------------------------------------------
129
+ // Step 4: allocate the third slot. Reuse t1 → T_alpha, t2 → T_beta.
130
+ // -----------------------------------------------------------------
131
+ const T_alpha = t1;
132
+ const T_beta = t2;
133
+ const T_gamma = mesh.allocate();
134
+
135
+ // -----------------------------------------------------------------
136
+ // Step 5: write vertices in canonical positive-volume order.
137
+ // T_alpha = (r, q, d, e) — covers edge (q, r), missing p
138
+ // T_beta = (p, r, d, e) — covers edge (r, p), missing q
139
+ // T_gamma = (q, p, d, e) — covers edge (p, q), missing r
140
+ // Each ordering was derived (and verified) to keep the new tet's signed
141
+ // volume the same sign as the original t1/t2 under the engine's
142
+ // convention.
143
+ // -----------------------------------------------------------------
144
+ mesh.setVertexIndex(T_alpha, 0, r);
145
+ mesh.setVertexIndex(T_alpha, 1, q);
146
+ mesh.setVertexIndex(T_alpha, 2, d);
147
+ mesh.setVertexIndex(T_alpha, 3, e);
148
+
149
+ mesh.setVertexIndex(T_beta, 0, p);
150
+ mesh.setVertexIndex(T_beta, 1, r);
151
+ mesh.setVertexIndex(T_beta, 2, d);
152
+ mesh.setVertexIndex(T_beta, 3, e);
153
+
154
+ mesh.setVertexIndex(T_gamma, 0, q);
155
+ mesh.setVertexIndex(T_gamma, 1, p);
156
+ mesh.setVertexIndex(T_gamma, 2, d);
157
+ mesh.setVertexIndex(T_gamma, 3, e);
158
+
159
+ // -----------------------------------------------------------------
160
+ // Step 6: internal neighbour links between the three new tets.
161
+ //
162
+ // Walking each new tet's faces:
163
+ // T_alpha = (r, q, d, e):
164
+ // slot 0 (opp r) face {q,d,e} — shared with T_gamma's slot 1 (opp p)
165
+ // slot 1 (opp q) face {r,d,e} — shared with T_beta's slot 0 (opp p)
166
+ // slot 2 (opp d) face {r,q,e} — external, was opposite p in t2
167
+ // slot 3 (opp e) face {r,q,d} — external, was opposite p in t1
168
+ //
169
+ // T_beta = (p, r, d, e):
170
+ // slot 0 (opp p) face {r,d,e} — shared with T_alpha's slot 1 (opp q)
171
+ // slot 1 (opp r) face {p,d,e} — shared with T_gamma's slot 0 (opp q)
172
+ // slot 2 (opp d) face {p,r,e} — external, was opposite q in t2
173
+ // slot 3 (opp e) face {p,r,d} — external, was opposite q in t1
174
+ //
175
+ // T_gamma = (q, p, d, e):
176
+ // slot 0 (opp q) face {p,d,e} — shared with T_beta's slot 1 (opp r)
177
+ // slot 1 (opp p) face {q,d,e} — shared with T_alpha's slot 0 (opp r)
178
+ // slot 2 (opp d) face {q,p,e} — external, was opposite r in t2
179
+ // slot 3 (opp e) face {q,p,d} — external, was opposite r in t1
180
+ // -----------------------------------------------------------------
181
+ mesh.setNeighbour(T_alpha, 0, (T_gamma << 2) | 1);
182
+ mesh.setNeighbour(T_alpha, 1, (T_beta << 2) | 0);
183
+ mesh.setNeighbour(T_beta, 0, (T_alpha << 2) | 1);
184
+ mesh.setNeighbour(T_beta, 1, (T_gamma << 2) | 0);
185
+ mesh.setNeighbour(T_gamma, 0, (T_beta << 2) | 1);
186
+ mesh.setNeighbour(T_gamma, 1, (T_alpha << 2) | 0);
187
+
188
+ // -----------------------------------------------------------------
189
+ // Step 7: external neighbour links. The new tet inherits the SAME
190
+ // encoded value the old tet held — the neighbour tet ID and its
191
+ // back-slot don't change. Only the new tet's own slot needs the value.
192
+ // -----------------------------------------------------------------
193
+ mesh.setNeighbour(T_alpha, 2, ext_p_t2);
194
+ mesh.setNeighbour(T_alpha, 3, ext_p_t1);
195
+ mesh.setNeighbour(T_beta, 2, ext_q_t2);
196
+ mesh.setNeighbour(T_beta, 3, ext_q_t1);
197
+ mesh.setNeighbour(T_gamma, 2, ext_r_t2);
198
+ mesh.setNeighbour(T_gamma, 3, ext_r_t1);
199
+
200
+ // -----------------------------------------------------------------
201
+ // Step 8: rewrite the external neighbours' back-pointers. Each one
202
+ // currently points at t1 or t2; now they should point at the
203
+ // corresponding new tet and slot.
204
+ // -----------------------------------------------------------------
205
+ rewrite_back_pointer(mesh, ext_p_t2, T_alpha, 2);
206
+ rewrite_back_pointer(mesh, ext_p_t1, T_alpha, 3);
207
+ rewrite_back_pointer(mesh, ext_q_t2, T_beta, 2);
208
+ rewrite_back_pointer(mesh, ext_q_t1, T_beta, 3);
209
+ rewrite_back_pointer(mesh, ext_r_t2, T_gamma, 2);
210
+ rewrite_back_pointer(mesh, ext_r_t1, T_gamma, 3);
211
+
212
+ out[0] = T_alpha;
213
+ out[1] = T_beta;
214
+ out[2] = T_gamma;
215
+ }
216
+
217
+ /**
218
+ * Given an encoded neighbour reference (as stored in a tet's neighbour slot)
219
+ * that used to point at some old tet, rewrite the OTHER end of that link so
220
+ * it points at `new_tet` at `new_slot` instead. The low 2 bits of the
221
+ * encoded value tell us the slot in the external tet that holds the
222
+ * back-pointer.
223
+ *
224
+ * No-op if the encoded reference is INVALID_NEIGHBOUR (the old tet had no
225
+ * neighbour on that face).
226
+ */
227
+ function rewrite_back_pointer(mesh, encoded, new_tet, new_slot) {
228
+ if (encoded === INVALID_NEIGHBOUR) return;
229
+ const ext_tet = encoded >>> 2;
230
+ const back_slot = encoded & 3;
231
+ mesh.setNeighbour(ext_tet, back_slot, (new_tet << 2) | new_slot);
232
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Perform a 3-2 flip: three tetrahedra sharing a common edge collapse into
3
+ * two tetrahedra sharing the triangle face that was previously bounded by
4
+ * the edge. Inverse of the 2-3 flip.
5
+ *
6
+ * The three input tets must share exactly one edge (v_a, v_b); together
7
+ * they form a triangular bipyramid whose central edge is (v_a, v_b) and
8
+ * whose equator is the triangle (v_X, v_Y, v_missing) — the three "ring"
9
+ * vertices, one in each pair of adjacent input tets. After the flip, the
10
+ * (v_a, v_b) edge is gone and the (v_X, v_Y, v_missing) face is the only
11
+ * interior face left.
12
+ *
13
+ * Slot reuse: t1's storage becomes the v_a-side new tet, t2's becomes the
14
+ * v_b-side new tet, t3's slot is freed.
15
+ *
16
+ * As with the 2-3 flip, geometric validity (positive volume of each new
17
+ * tet under any specific embedding) is NOT checked — the new tets'
18
+ * orientations follow the canonical winding of t1, so if t1 had a positive
19
+ * signed volume the new tets do too. The caller is responsible for
20
+ * ensuring the flip is geometrically meaningful for its use case (the
21
+ * bipyramid must be convex, which is implicit in "three tets share an
22
+ * edge").
23
+ *
24
+ * @param {TetrahedralMesh} mesh
25
+ * @param {number} t1 — first of three tets sharing the central edge
26
+ * @param {number} t2 — second; must share the same edge as t1
27
+ * @param {number} t3 — third; must share the same edge as t1 and t2
28
+ * @param {Uint32Array|number[]} out — caller-provided storage. out[0]
29
+ * receives the v_a-side new tet ID, out[1] the v_b-side. Must have
30
+ * length ≥ 2.
31
+ */
32
+ export function tetrahedral_mesh_flip_32(mesh: TetrahedralMesh, t1: number, t2: number, t3: number, out: Uint32Array | number[]): void;
33
+ //# sourceMappingURL=tetrahedral_mesh_flip_32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_flip_32.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,oEAPW,MAAM,MACN,MAAM,MACN,MAAM,OACN,WAAW,GAAC,MAAM,EAAE,QAqM9B"}
@@ -0,0 +1,255 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { INVALID_NEIGHBOUR } from "./TetrahedralMesh.js";
3
+
4
+ /**
5
+ * Face-vertex layout for a positively-oriented tet: for vertex slot i, the
6
+ * face opposite has these slot indices in counter-clockwise-from-outside
7
+ * order. Identical to the table in tetrahedral_mesh_flip_23.js; kept local
8
+ * for module independence.
9
+ */
10
+ const FACE_VERTICES_BY_OPPOSITE = [
11
+ [1, 3, 2], // opposite v0
12
+ [0, 2, 3], // opposite v1
13
+ [0, 3, 1], // opposite v2
14
+ [0, 1, 2], // opposite v3
15
+ ];
16
+
17
+ /**
18
+ * Perform a 3-2 flip: three tetrahedra sharing a common edge collapse into
19
+ * two tetrahedra sharing the triangle face that was previously bounded by
20
+ * the edge. Inverse of the 2-3 flip.
21
+ *
22
+ * The three input tets must share exactly one edge (v_a, v_b); together
23
+ * they form a triangular bipyramid whose central edge is (v_a, v_b) and
24
+ * whose equator is the triangle (v_X, v_Y, v_missing) — the three "ring"
25
+ * vertices, one in each pair of adjacent input tets. After the flip, the
26
+ * (v_a, v_b) edge is gone and the (v_X, v_Y, v_missing) face is the only
27
+ * interior face left.
28
+ *
29
+ * Slot reuse: t1's storage becomes the v_a-side new tet, t2's becomes the
30
+ * v_b-side new tet, t3's slot is freed.
31
+ *
32
+ * As with the 2-3 flip, geometric validity (positive volume of each new
33
+ * tet under any specific embedding) is NOT checked — the new tets'
34
+ * orientations follow the canonical winding of t1, so if t1 had a positive
35
+ * signed volume the new tets do too. The caller is responsible for
36
+ * ensuring the flip is geometrically meaningful for its use case (the
37
+ * bipyramid must be convex, which is implicit in "three tets share an
38
+ * edge").
39
+ *
40
+ * @param {TetrahedralMesh} mesh
41
+ * @param {number} t1 — first of three tets sharing the central edge
42
+ * @param {number} t2 — second; must share the same edge as t1
43
+ * @param {number} t3 — third; must share the same edge as t1 and t2
44
+ * @param {Uint32Array|number[]} out — caller-provided storage. out[0]
45
+ * receives the v_a-side new tet ID, out[1] the v_b-side. Must have
46
+ * length ≥ 2.
47
+ */
48
+ export function tetrahedral_mesh_flip_32(mesh, t1, t2, t3, out) {
49
+ assert.defined(mesh, 'mesh');
50
+ assert.equal(mesh.isTetrahedralMesh, true, 'mesh.isTetrahedralMesh !== true');
51
+ assert.isNonNegativeInteger(t1, 't1');
52
+ assert.isNonNegativeInteger(t2, 't2');
53
+ assert.isNonNegativeInteger(t3, 't3');
54
+ assert.notEqual(t1, t2, 't1 must not equal t2');
55
+ assert.notEqual(t1, t3, 't1 must not equal t3');
56
+ assert.notEqual(t2, t3, 't2 must not equal t3');
57
+ assert.defined(out, 'out');
58
+
59
+ // -----------------------------------------------------------------
60
+ // Step 1: find the edge (v_a, v_b) shared by all three tets.
61
+ // -----------------------------------------------------------------
62
+ const t1_verts = [
63
+ mesh.getVertexIndex(t1, 0),
64
+ mesh.getVertexIndex(t1, 1),
65
+ mesh.getVertexIndex(t1, 2),
66
+ mesh.getVertexIndex(t1, 3),
67
+ ];
68
+
69
+ let v_a = -1;
70
+ let v_b = -1;
71
+ for (let i = 0; i < 4; i++) {
72
+ const v = t1_verts[i];
73
+ if (mesh.tetContainsVertex(t2, v) && mesh.tetContainsVertex(t3, v)) {
74
+ if (v_a === -1) v_a = v;
75
+ else if (v_b === -1) v_b = v;
76
+ else throw new Error(`tets ${t1}, ${t2}, ${t3} share more than two vertices — input is not a valid 3-2 configuration`);
77
+ }
78
+ }
79
+ if (v_b === -1) {
80
+ throw new Error(`tets ${t1}, ${t2}, ${t3} do not share a common edge`);
81
+ }
82
+
83
+ // -----------------------------------------------------------------
84
+ // Step 2: identify the three ring vertices.
85
+ // t1 has (v_X, v_Y); the third ring vertex (v_missing) is in t2 and t3.
86
+ // The order (v_X, v_Y) within t1 is determined by t1's face opposite
87
+ // v_b in CCW-from-outside order — see step 3.
88
+ // -----------------------------------------------------------------
89
+ let slot_a_in_t1 = -1;
90
+ let slot_b_in_t1 = -1;
91
+ for (let i = 0; i < 4; i++) {
92
+ if (t1_verts[i] === v_a) slot_a_in_t1 = i;
93
+ else if (t1_verts[i] === v_b) slot_b_in_t1 = i;
94
+ }
95
+
96
+ // -----------------------------------------------------------------
97
+ // Step 3: derive ring order from t1's canonical winding.
98
+ //
99
+ // t1's face opposite v_b reads (in CCW-from-outside order) as a triple
100
+ // containing v_a and t1's two ring vertices. Reading the triple as a
101
+ // cycle (V0 → V1 → V2 → V0) and taking the two ring vertices in the
102
+ // order they appear after v_a gives them in CCW-from-v_a's-view ring
103
+ // direction. v_missing then sits between v_Y and v_X in that same CCW
104
+ // cycle (i.e. it's v_X's CCW-prev, or equivalently v_Y's CCW-next).
105
+ // -----------------------------------------------------------------
106
+ const face_opp_b = FACE_VERTICES_BY_OPPOSITE[slot_b_in_t1];
107
+ const face_v = [
108
+ mesh.getVertexIndex(t1, face_opp_b[0]),
109
+ mesh.getVertexIndex(t1, face_opp_b[1]),
110
+ mesh.getVertexIndex(t1, face_opp_b[2]),
111
+ ];
112
+ let pos_a_in_face = -1;
113
+ for (let i = 0; i < 3; i++) {
114
+ if (face_v[i] === v_a) { pos_a_in_face = i; break; }
115
+ }
116
+ const v_X = face_v[(pos_a_in_face + 1) % 3];
117
+ const v_Y = face_v[(pos_a_in_face + 2) % 3];
118
+
119
+ // -----------------------------------------------------------------
120
+ // Step 4: find v_missing — the ring vertex in t2 or t3 but not in t1.
121
+ // Then label which of (t2, t3) is "v_X-side" (carries the (v_X, v_missing)
122
+ // ring) vs "v_Y-side" (carries (v_Y, v_missing)). Needed so we know
123
+ // which input tet supplies which external face.
124
+ // -----------------------------------------------------------------
125
+ let v_missing = -1;
126
+ {
127
+ // v_missing is in t2 (it's the t2 vertex that's not v_a, v_b, and
128
+ // not in t1).
129
+ for (let i = 0; i < 4; i++) {
130
+ const v = mesh.getVertexIndex(t2, i);
131
+ if (v !== v_a && v !== v_b && v !== v_X && v !== v_Y) {
132
+ v_missing = v;
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ if (v_missing === -1) {
138
+ throw new Error(`tets ${t1}, ${t2}, ${t3} do not form a valid 3-2 configuration (couldn't identify ring vertex)`);
139
+ }
140
+
141
+ let v_X_side_tet;
142
+ let v_Y_side_tet;
143
+ if (mesh.tetContainsVertex(t2, v_X)) {
144
+ // t2 has v_X and v_missing → v_X-side
145
+ v_X_side_tet = t2;
146
+ v_Y_side_tet = t3;
147
+ } else {
148
+ v_X_side_tet = t3;
149
+ v_Y_side_tet = t2;
150
+ }
151
+
152
+ // Sanity: the labeling implies specific membership. If not, the input
153
+ // is malformed.
154
+ if (!mesh.tetContainsVertex(v_X_side_tet, v_X) || !mesh.tetContainsVertex(v_X_side_tet, v_missing) ||
155
+ !mesh.tetContainsVertex(v_Y_side_tet, v_Y) || !mesh.tetContainsVertex(v_Y_side_tet, v_missing)) {
156
+ throw new Error(`tets ${t1}, ${t2}, ${t3} do not form a valid 3-2 ring around edge (${v_a}, ${v_b})`);
157
+ }
158
+
159
+ // -----------------------------------------------------------------
160
+ // Step 5: find the slot of v_a and v_b in each of the 3 input tets.
161
+ // Needed to read the external face neighbours (face opp v_a / v_b).
162
+ // -----------------------------------------------------------------
163
+ const slot_a_in_X = find_slot(mesh, v_X_side_tet, v_a);
164
+ const slot_b_in_X = find_slot(mesh, v_X_side_tet, v_b);
165
+ const slot_a_in_Y = find_slot(mesh, v_Y_side_tet, v_a);
166
+ const slot_b_in_Y = find_slot(mesh, v_Y_side_tet, v_b);
167
+
168
+ // -----------------------------------------------------------------
169
+ // Step 6: snapshot the 6 external neighbours.
170
+ // 3 faces opp v_b → become external faces of new_tet_a (v_a-side)
171
+ // 3 faces opp v_a → become external faces of new_tet_b (v_b-side)
172
+ // -----------------------------------------------------------------
173
+ const ext_b_t1 = mesh.getNeighbour(t1, slot_b_in_t1); // → new_tet_a opp v_missing
174
+ const ext_b_X = mesh.getNeighbour(v_X_side_tet, slot_b_in_X); // → new_tet_a opp v_Y
175
+ const ext_b_Y = mesh.getNeighbour(v_Y_side_tet, slot_b_in_Y); // → new_tet_a opp v_X
176
+ const ext_a_t1 = mesh.getNeighbour(t1, slot_a_in_t1); // → new_tet_b opp v_missing
177
+ const ext_a_X = mesh.getNeighbour(v_X_side_tet, slot_a_in_X); // → new_tet_b opp v_Y
178
+ const ext_a_Y = mesh.getNeighbour(v_Y_side_tet, slot_a_in_Y); // → new_tet_b opp v_X
179
+
180
+ // -----------------------------------------------------------------
181
+ // Step 7: reuse t1 → new_tet_a, t2 → new_tet_b; free t3.
182
+ // -----------------------------------------------------------------
183
+ const new_tet_a = t1;
184
+ const new_tet_b = t2;
185
+ mesh.delete(t3);
186
+
187
+ // -----------------------------------------------------------------
188
+ // Step 8: vertex layouts (canonical positive volume).
189
+ // new_tet_a = (v_X, v_missing, v_Y, v_a) → face opp v_a is
190
+ // (v_X, v_missing, v_Y) CCW from outside (= CCW from v_b view)
191
+ // new_tet_b = (v_X, v_Y, v_missing, v_b) → face opp v_b is
192
+ // (v_X, v_Y, v_missing) CCW from outside (= CCW from v_a view)
193
+ // -----------------------------------------------------------------
194
+ mesh.setVertexIndex(new_tet_a, 0, v_X);
195
+ mesh.setVertexIndex(new_tet_a, 1, v_missing);
196
+ mesh.setVertexIndex(new_tet_a, 2, v_Y);
197
+ mesh.setVertexIndex(new_tet_a, 3, v_a);
198
+
199
+ mesh.setVertexIndex(new_tet_b, 0, v_X);
200
+ mesh.setVertexIndex(new_tet_b, 1, v_Y);
201
+ mesh.setVertexIndex(new_tet_b, 2, v_missing);
202
+ mesh.setVertexIndex(new_tet_b, 3, v_b);
203
+
204
+ // -----------------------------------------------------------------
205
+ // Step 9: neighbour links.
206
+ //
207
+ // new_tet_a = (v_X, v_missing, v_Y, v_a):
208
+ // slot 0 (opp v_X) face {v_missing, v_Y, v_a} — ext, from v_Y_side
209
+ // slot 1 (opp v_missing) face {v_X, v_Y, v_a} — ext, from t1
210
+ // slot 2 (opp v_Y) face {v_X, v_missing, v_a} — ext, from v_X_side
211
+ // slot 3 (opp v_a) face {v_X, v_missing, v_Y} — INTERNAL ↔ new_tet_b
212
+ //
213
+ // new_tet_b = (v_X, v_Y, v_missing, v_b):
214
+ // slot 0 (opp v_X) face {v_Y, v_missing, v_b} — ext, from v_Y_side
215
+ // slot 1 (opp v_Y) face {v_X, v_missing, v_b} — ext, from v_X_side
216
+ // slot 2 (opp v_missing) face {v_X, v_Y, v_b} — ext, from t1
217
+ // slot 3 (opp v_b) face {v_X, v_Y, v_missing} — INTERNAL ↔ new_tet_a
218
+ // -----------------------------------------------------------------
219
+ mesh.setNeighbour(new_tet_a, 0, ext_b_Y);
220
+ mesh.setNeighbour(new_tet_a, 1, ext_b_t1);
221
+ mesh.setNeighbour(new_tet_a, 2, ext_b_X);
222
+ mesh.setNeighbour(new_tet_a, 3, (new_tet_b << 2) | 3);
223
+
224
+ mesh.setNeighbour(new_tet_b, 0, ext_a_Y);
225
+ mesh.setNeighbour(new_tet_b, 1, ext_a_X);
226
+ mesh.setNeighbour(new_tet_b, 2, ext_a_t1);
227
+ mesh.setNeighbour(new_tet_b, 3, (new_tet_a << 2) | 3);
228
+
229
+ // -----------------------------------------------------------------
230
+ // Step 10: rewrite the 6 external neighbours' back-pointers.
231
+ // -----------------------------------------------------------------
232
+ rewrite_back_pointer(mesh, ext_b_Y, new_tet_a, 0);
233
+ rewrite_back_pointer(mesh, ext_b_t1, new_tet_a, 1);
234
+ rewrite_back_pointer(mesh, ext_b_X, new_tet_a, 2);
235
+ rewrite_back_pointer(mesh, ext_a_Y, new_tet_b, 0);
236
+ rewrite_back_pointer(mesh, ext_a_X, new_tet_b, 1);
237
+ rewrite_back_pointer(mesh, ext_a_t1, new_tet_b, 2);
238
+
239
+ out[0] = new_tet_a;
240
+ out[1] = new_tet_b;
241
+ }
242
+
243
+ function find_slot(mesh, tet, vertex_id) {
244
+ for (let i = 0; i < 4; i++) {
245
+ if (mesh.getVertexIndex(tet, i) === vertex_id) return i;
246
+ }
247
+ throw new Error(`vertex ${vertex_id} not found in tet ${tet}`);
248
+ }
249
+
250
+ function rewrite_back_pointer(mesh, encoded, new_tet, new_slot) {
251
+ if (encoded === INVALID_NEIGHBOUR) return;
252
+ const ext_tet = encoded >>> 2;
253
+ const back_slot = encoded & 3;
254
+ mesh.setNeighbour(ext_tet, back_slot, (new_tet << 2) | new_slot);
255
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Driver: improve the shape quality of an existing tetrahedral mesh by
3
+ * locally smoothing low-quality tets and applying 2-3 / 3-2 flips that
4
+ * monotonically increase the per-tet minimum quality.
5
+ *
6
+ * Algorithm — one pass:
7
+ * 1. Scan every live tet, compute its radius-ratio quality.
8
+ * 2. For each tet below `target_quality`, try in order:
9
+ * a. Laplacian smoothing on each non-boundary vertex. Accept the
10
+ * move only if the worst-of-the-1-ring quality strictly improves;
11
+ * otherwise revert the position.
12
+ * b. 2-3 flip across each of the tet's 4 internal faces. Tentatively
13
+ * apply the flip, score the 3 new tets; accept only if the
14
+ * minimum-of-three exceeds the original min-of-two. Otherwise
15
+ * apply the inverse 3-2 flip to roll back.
16
+ * 3. Repeat until no operation in a pass improves anything, or
17
+ * `max_passes` is reached.
18
+ *
19
+ * The "do then maybe undo" pattern for flips keeps the driver simple: no
20
+ * separate "preview the flip" code path. The cost is a wasted reverse-flip
21
+ * per rejected candidate. In practice most candidate flips on bad tets are
22
+ * either clearly beneficial (accepted) or clearly bad (rejected after one
23
+ * round-trip), so the overhead is small.
24
+ *
25
+ * Mesh topology and points are mutated in place. Surface vertices (any
26
+ * vertex incident to a face with INVALID_NEIGHBOUR) are NEVER moved by
27
+ * smoothing — moving them would change the surface shape, which is
28
+ * usually a hard constraint for the caller.
29
+ *
30
+ * @param {TetrahedralMesh} mesh — mutated in place
31
+ * @param {Float32Array|number[]} points — flat (x,y,z) positions, mutated
32
+ * @param {{
33
+ * target_quality?: number,
34
+ * max_passes?: number,
35
+ * smoothing_weight?: number,
36
+ * enable_flips?: boolean,
37
+ * enable_smoothing?: boolean,
38
+ * }} [options]
39
+ * @returns {{
40
+ * passes_run: number,
41
+ * smoothings_committed: number,
42
+ * smoothings_reverted: number,
43
+ * flips_23_committed: number,
44
+ * flips_23_rejected: number,
45
+ * flips_32_committed: number,
46
+ * flips_32_rejected: number,
47
+ * initial_min_quality: number,
48
+ * final_min_quality: number,
49
+ * }}
50
+ */
51
+ export function tetrahedral_mesh_improve_quality(mesh: TetrahedralMesh, points: Float32Array | number[], options?: {
52
+ target_quality?: number;
53
+ max_passes?: number;
54
+ smoothing_weight?: number;
55
+ enable_flips?: boolean;
56
+ enable_smoothing?: boolean;
57
+ }): {
58
+ passes_run: number;
59
+ smoothings_committed: number;
60
+ smoothings_reverted: number;
61
+ flips_23_committed: number;
62
+ flips_23_rejected: number;
63
+ flips_32_committed: number;
64
+ flips_32_rejected: number;
65
+ initial_min_quality: number;
66
+ final_min_quality: number;
67
+ };
68
+ //# sourceMappingURL=tetrahedral_mesh_improve_quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_improve_quality.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js"],"names":[],"mappings":"AA2CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,gFApBW,YAAY,GAAC,MAAM,EAAE;qBAEV,MAAM;iBACV,MAAM;uBACA,MAAM;mBACV,OAAO;uBACH,OAAO;IAElB;IACZ,UAAc,EAAE,MAAM,CAAC;IACvB,oBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAqB,EAAE,MAAM,CAAC;CAC3B,CA8OH"}