@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,671 @@
1
+ /**
2
+ * prototype_tetrahedrize_mesh.js
3
+ *
4
+ * Drag-and-drop a GLTF/GLB file. Every mesh inside the scene is converted to a
5
+ * BinaryTopology, tetrahedralized via `compute_tetrahedral_mesh_from_surface`,
6
+ * and rendered as a pile of slightly shrunken tetrahedra so the volumetric
7
+ * structure is visible. Each input geometry is shown in its own solid colour
8
+ * to make them easy to tell apart.
9
+ *
10
+ * This module is intentionally self-contained — no engine harness, no ECS,
11
+ * just bare three.js + the tetrahedralization pipeline.
12
+ *
13
+ * Reference prototypes:
14
+ * - prototypeTetrahedraBuilder.js (tet mesh creation patterns)
15
+ * - prototypeMeshSimplification.js (raw three.js bootstrap, drop-file handling style)
16
+ * - prototypeBinaryTopology.js (BinaryTopology construction from indexed geometry)
17
+ */
18
+
19
+ import {
20
+ AmbientLight,
21
+ BufferAttribute,
22
+ BufferGeometry,
23
+ DirectionalLight,
24
+ Float32BufferAttribute,
25
+ Group,
26
+ Mesh,
27
+ MeshStandardMaterial,
28
+ PerspectiveCamera,
29
+ Scene,
30
+ Vector3 as ThreeVector3,
31
+ WebGLRenderer
32
+ } from "three";
33
+ import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
34
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
35
+ import { BinaryTopology } from "../topology/struct/binary/BinaryTopology.js";
36
+ import {
37
+ bt_mesh_from_indexed_geometry
38
+ } from "../topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
39
+ import {
40
+ triangle_mesh_compute_signed_volume
41
+ } from "../triangle/triangle_mesh_compute_signed_volume.js";
42
+ import { compute_tetrahedral_mesh_from_surface } from "./compute_tetrahedral_mesh_from_surface.js";
43
+ import { compute_tetrahedron_quality } from "./compute_tetrahedron_quality.js";
44
+ import { compute_tetrahedron_volume } from "./compute_tetrahedron_volume.js";
45
+ import { tetrahedral_mesh_improve_quality } from "./tetrahedral_mesh_improve_quality.js";
46
+ import { TetrahedralMesh } from "./TetrahedralMesh.js";
47
+
48
+ // Quality threshold below which we count a tet as a sliver. Matches the
49
+ // usual "shape is starting to hurt simulation conditioning" cutoff for the
50
+ // radius-ratio metric.
51
+ const SLIVER_QUALITY_THRESHOLD = 0.05;
52
+
53
+ // Sliver-removal driver config. The driver now builds a vertex→tet
54
+ // adjacency cache once per pass and shares it with the boundary check,
55
+ // the local quality eval, and the smoothing primitive — bringing per-pass
56
+ // cost from O(N²) down to O(N·deg). On a 3,242-tet densified cube the
57
+ // driver dropped from ~23 s to ~3 s; on closed-surface meshes (Suzanne,
58
+ // Teapot) where every vertex is boundary, smoothing is a near no-op and
59
+ // the pass should finish in well under a second.
60
+ //
61
+ // BEFORE → AFTER numbers are logged in the per-mesh console line.
62
+ const ENABLE_IMPROVE_QUALITY = true;
63
+ const IMPROVE_TARGET_QUALITY = 0.05; // sliver cutoff only — keep the workload small
64
+ const IMPROVE_MAX_PASSES = 1;
65
+
66
+ // ---------------------------------------------------------------------------
67
+ // Visual / behaviour tunables
68
+ // ---------------------------------------------------------------------------
69
+
70
+ const BACKGROUND_COLOR = 0x202428;
71
+ const EXPLODE_FACTOR = 0.88; // scale each tet toward its centroid; <1 reveals gaps
72
+ const COLOR_SATURATION = 0.62;
73
+ const COLOR_VALUE = 0.92;
74
+ const COLOR_HUE_STEP = 0.61803398875; // golden-ratio conjugate → good separation
75
+ const CAMERA_FIT_PADDING = 1.5;
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // Colour helpers
79
+ // ---------------------------------------------------------------------------
80
+
81
+ /**
82
+ * Standard HSV → packed 0xRRGGBB conversion.
83
+ *
84
+ * @param {number} h hue in [0,1)
85
+ * @param {number} s saturation in [0,1]
86
+ * @param {number} v value in [0,1]
87
+ * @returns {number}
88
+ */
89
+ function hsv_to_rgb_hex(h, s, v) {
90
+ const i = Math.floor(h * 6);
91
+ const f = h * 6 - i;
92
+ const p = v * (1 - s);
93
+ const q = v * (1 - f * s);
94
+ const t = v * (1 - (1 - f) * s);
95
+
96
+ let r, g, b;
97
+ switch (i % 6) {
98
+ case 0: r = v; g = t; b = p; break;
99
+ case 1: r = q; g = v; b = p; break;
100
+ case 2: r = p; g = v; b = t; break;
101
+ case 3: r = p; g = q; b = v; break;
102
+ case 4: r = t; g = p; b = v; break;
103
+ case 5: r = v; g = p; b = q; break;
104
+ }
105
+
106
+ return (Math.round(r * 255) << 16) | (Math.round(g * 255) << 8) | Math.round(b * 255);
107
+ }
108
+
109
+ /**
110
+ * Pick a visually distinct colour for the i-th geometry. Golden-angle hue
111
+ * stepping spreads neighbouring indices far apart in colour space.
112
+ *
113
+ * @param {number} i
114
+ * @returns {number} 0xRRGGBB
115
+ */
116
+ function color_for_index(i) {
117
+ return hsv_to_rgb_hex((i * COLOR_HUE_STEP) % 1, COLOR_SATURATION, COLOR_VALUE);
118
+ }
119
+
120
+ // ---------------------------------------------------------------------------
121
+ // Exploded-tet geometry construction
122
+ // ---------------------------------------------------------------------------
123
+
124
+ /**
125
+ * Emit a single triangle as 3 positions + 3 (flat) normals into the output
126
+ * arrays at `write_offset`. The vertex order is chosen so the normal points
127
+ * away from `opposite` — guaranteeing outward-facing tet faces regardless of
128
+ * the Delaunay output's vertex winding.
129
+ *
130
+ * Returns the new write offset (always advances by 9).
131
+ */
132
+ function emit_face(positions, normals, write_offset, p0, p1, p2, opposite) {
133
+ const ex = p1[0] - p0[0], ey = p1[1] - p0[1], ez = p1[2] - p0[2];
134
+ const fx = p2[0] - p0[0], fy = p2[1] - p0[1], fz = p2[2] - p0[2];
135
+
136
+ let nx = ey * fz - ez * fy;
137
+ let ny = ez * fx - ex * fz;
138
+ let nz = ex * fy - ey * fx;
139
+
140
+ // If normal points toward the opposite vertex, flip the winding.
141
+ const dx = p0[0] - opposite[0], dy = p0[1] - opposite[1], dz = p0[2] - opposite[2];
142
+ if (nx * dx + ny * dy + nz * dz < 0) {
143
+ nx = -nx; ny = -ny; nz = -nz;
144
+ const tmp = p1; p1 = p2; p2 = tmp;
145
+ }
146
+
147
+ const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;
148
+ nx /= len; ny /= len; nz /= len;
149
+
150
+ positions[write_offset + 0] = p0[0]; positions[write_offset + 1] = p0[1]; positions[write_offset + 2] = p0[2];
151
+ positions[write_offset + 3] = p1[0]; positions[write_offset + 4] = p1[1]; positions[write_offset + 5] = p1[2];
152
+ positions[write_offset + 6] = p2[0]; positions[write_offset + 7] = p2[1]; positions[write_offset + 8] = p2[2];
153
+
154
+ for (let k = 0; k < 3; k++) {
155
+ normals[write_offset + k * 3 + 0] = nx;
156
+ normals[write_offset + k * 3 + 1] = ny;
157
+ normals[write_offset + k * 3 + 2] = nz;
158
+ }
159
+
160
+ return write_offset + 9;
161
+ }
162
+
163
+ /**
164
+ * Build a flat-shaded triangle geometry where each tetrahedron is rendered
165
+ * as four outward-facing triangles, with the tet's vertices contracted
166
+ * toward its centroid by `shrink`. The contraction creates visible gaps
167
+ * between adjacent tets so the volumetric tessellation is obvious.
168
+ *
169
+ * @param {TetrahedralMesh} tet_mesh
170
+ * @param {Float32Array|number[]} points flat (x,y,z) positions array
171
+ * @param {number} shrink (0,1] — 1 = touching tets, 0.85 = clear gaps
172
+ * @returns {BufferGeometry}
173
+ */
174
+ function build_exploded_tet_geometry(tet_mesh, points, shrink) {
175
+ const tet_count = tet_mesh.count;
176
+ const float_count = tet_count * 4 * 3 * 3; // 4 faces × 3 verts × xyz
177
+ const positions = new Float32Array(float_count);
178
+ const normals = new Float32Array(float_count);
179
+ const s = shrink;
180
+ const t = 1 - s;
181
+
182
+ let write = 0;
183
+
184
+ tet_mesh.forEach((tet) => {
185
+ const ai = tet_mesh.getVertexIndex(tet, 0);
186
+ const bi = tet_mesh.getVertexIndex(tet, 1);
187
+ const ci = tet_mesh.getVertexIndex(tet, 2);
188
+ const di = tet_mesh.getVertexIndex(tet, 3);
189
+
190
+ const ax = points[ai * 3], ay = points[ai * 3 + 1], az = points[ai * 3 + 2];
191
+ const bx = points[bi * 3], by = points[bi * 3 + 1], bz = points[bi * 3 + 2];
192
+ const cx = points[ci * 3], cy = points[ci * 3 + 1], cz = points[ci * 3 + 2];
193
+ const dx = points[di * 3], dy = points[di * 3 + 1], dz = points[di * 3 + 2];
194
+
195
+ const ccx = (ax + bx + cx + dx) * 0.25;
196
+ const ccy = (ay + by + cy + dy) * 0.25;
197
+ const ccz = (az + bz + cz + dz) * 0.25;
198
+
199
+ const A = [ax * s + ccx * t, ay * s + ccy * t, az * s + ccz * t];
200
+ const B = [bx * s + ccx * t, by * s + ccy * t, bz * s + ccz * t];
201
+ const C = [cx * s + ccx * t, cy * s + ccy * t, cz * s + ccz * t];
202
+ const D = [dx * s + ccx * t, dy * s + ccy * t, dz * s + ccz * t];
203
+
204
+ write = emit_face(positions, normals, write, B, C, D, A); // face opposite A
205
+ write = emit_face(positions, normals, write, A, D, C, B); // face opposite B
206
+ write = emit_face(positions, normals, write, A, B, D, C); // face opposite C
207
+ write = emit_face(positions, normals, write, A, C, B, D); // face opposite D
208
+ });
209
+
210
+ const geometry = new BufferGeometry();
211
+ geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
212
+ geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3));
213
+ return geometry;
214
+ }
215
+
216
+ // ---------------------------------------------------------------------------
217
+ // Tetrahedralization pipeline for a single input geometry
218
+ // ---------------------------------------------------------------------------
219
+
220
+ /**
221
+ * Turn a three.js BufferGeometry (with its world matrix baked in) into a
222
+ * flat-shaded exploded-tet mesh plus measurement stats. Returns null if
223
+ * the input cannot be tetrahedralized.
224
+ *
225
+ * Stats included:
226
+ * - tet_count: number of live tets in the result
227
+ * - surface_volume: divergence-theorem volume of the input surface (the
228
+ * target we're trying to fill — caveat: only correct
229
+ * if the surface is properly closed and consistently
230
+ * wound. For meshes with holes / mixed winding the
231
+ * number is an approximation.)
232
+ * - tet_volume: sum of all tet volumes in the output
233
+ * - min_quality, avg_quality: radius-ratio quality (1 = regular tet,
234
+ * 0 = degenerate)
235
+ * - sliver_count: tets below SLIVER_QUALITY_THRESHOLD
236
+ *
237
+ * @param {BufferGeometry} input_geometry
238
+ * @returns {{
239
+ * geometry: BufferGeometry,
240
+ * tet_count: number,
241
+ * surface_volume: number,
242
+ * tet_volume: number,
243
+ * min_quality: number,
244
+ * avg_quality: number,
245
+ * sliver_count: number,
246
+ * } | null}
247
+ */
248
+ function tetrahedralize_geometry(input_geometry) {
249
+ const positions_attr = input_geometry.getAttribute('position');
250
+ if (!positions_attr || positions_attr.count < 3) return null;
251
+
252
+ // Pull out positions + indices, fabricating trivial indices if the input
253
+ // is non-indexed (every 3 vertices = 1 triangle).
254
+ const positions = Array.from(positions_attr.array);
255
+ let indices;
256
+ if (input_geometry.index) {
257
+ indices = Array.from(input_geometry.index.array);
258
+ } else {
259
+ const n = positions_attr.count;
260
+ indices = new Array(n);
261
+ for (let i = 0; i < n; i++) indices[i] = i;
262
+ }
263
+ if (indices.length < 3) return null;
264
+
265
+ // GLTF often duplicates positions at smoothing/UV splits — that's fine,
266
+ // compute_tetrahedral_mesh_from_surface merges coincident vertices via
267
+ // bt_merge_verts_by_distance internally before tetrahedralizing.
268
+ const surface = new BinaryTopology();
269
+ bt_mesh_from_indexed_geometry(surface, indices, positions);
270
+
271
+ const surface_volume = Math.abs(triangle_mesh_compute_signed_volume(positions, indices));
272
+
273
+ const tet_mesh = new TetrahedralMesh();
274
+ let tet_positions;
275
+ try {
276
+ tet_positions = compute_tetrahedral_mesh_from_surface(tet_mesh, surface);
277
+ } catch (e) {
278
+ console.warn('Tetrahedralization failed for one geometry:', e);
279
+ return null;
280
+ }
281
+
282
+ if (tet_mesh.count === 0) {
283
+ return null;
284
+ }
285
+
286
+ const stats_before = measure_tet_stats(tet_mesh, tet_positions);
287
+
288
+ // Sliver-removal driver: try Laplacian smoothing + 2-3 / 3-2 flips on
289
+ // every tet below IMPROVE_TARGET_QUALITY. Off by toggling the constant
290
+ // at top of file. Stats are captured before+after so the per-mesh
291
+ // console line shows whether the driver actually moved the needle.
292
+ let stats_after = stats_before;
293
+ let driver_stats = null;
294
+ let driver_ms = 0;
295
+ if (ENABLE_IMPROVE_QUALITY) {
296
+ const t = performance.now();
297
+ driver_stats = tetrahedral_mesh_improve_quality(tet_mesh, tet_positions, {
298
+ target_quality: IMPROVE_TARGET_QUALITY,
299
+ max_passes: IMPROVE_MAX_PASSES,
300
+ });
301
+ driver_ms = performance.now() - t;
302
+ stats_after = measure_tet_stats(tet_mesh, tet_positions);
303
+ }
304
+
305
+ const out_geom = build_exploded_tet_geometry(tet_mesh, tet_positions, EXPLODE_FACTOR);
306
+
307
+ return {
308
+ geometry: out_geom,
309
+ tet_count: tet_mesh.count,
310
+ surface_volume,
311
+ tet_volume: stats_after.tet_volume,
312
+ min_quality: stats_after.min_quality,
313
+ avg_quality: stats_after.avg_quality,
314
+ sliver_count: stats_after.sliver_count,
315
+ stats_before,
316
+ stats_after,
317
+ driver_stats,
318
+ driver_ms,
319
+ };
320
+ }
321
+
322
+ /**
323
+ * One pass over a tet mesh: total signed volume, min and average
324
+ * radius-ratio quality, count of tets below the sliver threshold.
325
+ *
326
+ * @param {TetrahedralMesh} tet_mesh
327
+ * @param {Float32Array|number[]} tet_positions
328
+ * @returns {{tet_volume: number, min_quality: number, avg_quality: number, sliver_count: number}}
329
+ */
330
+ function measure_tet_stats(tet_mesh, tet_positions) {
331
+ let tet_volume = 0;
332
+ let min_quality = 1;
333
+ let q_sum = 0;
334
+ let sliver_count = 0;
335
+ tet_mesh.forEach((tet, m) => {
336
+ tet_volume += compute_tetrahedron_volume(m, tet_positions, tet);
337
+ const q = compute_tetrahedron_quality(m, tet_positions, tet);
338
+ if (q < min_quality) min_quality = q;
339
+ q_sum += q;
340
+ if (q < SLIVER_QUALITY_THRESHOLD) sliver_count++;
341
+ });
342
+ const avg_quality = tet_mesh.count > 0 ? q_sum / tet_mesh.count : 0;
343
+ return { tet_volume, min_quality, avg_quality, sliver_count };
344
+ }
345
+
346
+ // ---------------------------------------------------------------------------
347
+ // Scene management
348
+ // ---------------------------------------------------------------------------
349
+
350
+ const scene = new Scene();
351
+ scene.background = null; // let CSS show through
352
+
353
+ const camera = new PerspectiveCamera(45, 1, 0.01, 10000);
354
+ camera.position.set(4, 4, 6);
355
+
356
+ const renderer = new WebGLRenderer({ antialias: true });
357
+ renderer.setPixelRatio(window.devicePixelRatio);
358
+ renderer.setClearColor(BACKGROUND_COLOR, 1);
359
+
360
+ document.body.style.margin = '0';
361
+ document.body.style.overflow = 'hidden';
362
+ document.body.style.background = `#${BACKGROUND_COLOR.toString(16).padStart(6, '0')}`;
363
+ document.body.appendChild(renderer.domElement);
364
+
365
+ scene.add(new AmbientLight(0xffffff, 0.45));
366
+ const key_light = new DirectionalLight(0xffffff, 0.9);
367
+ key_light.position.set(3, 5, 4);
368
+ scene.add(key_light);
369
+ const fill_light = new DirectionalLight(0xa0b8ff, 0.35);
370
+ fill_light.position.set(-4, -2, -3);
371
+ scene.add(fill_light);
372
+
373
+ const controls = new OrbitControls(camera, renderer.domElement);
374
+ controls.enableDamping = true;
375
+ controls.dampingFactor = 0.08;
376
+
377
+ const loaded_group = new Group();
378
+ scene.add(loaded_group);
379
+
380
+ function clear_loaded() {
381
+ while (loaded_group.children.length > 0) {
382
+ const child = loaded_group.children.pop();
383
+ if (child.geometry) child.geometry.dispose();
384
+ if (child.material) child.material.dispose();
385
+ }
386
+ }
387
+
388
+ function fit_camera_to(group) {
389
+ const min = new ThreeVector3(Infinity, Infinity, Infinity);
390
+ const max = new ThreeVector3(-Infinity, -Infinity, -Infinity);
391
+ const tmp = new ThreeVector3();
392
+
393
+ group.traverse((obj) => {
394
+ if (!obj.geometry) return;
395
+ const attr = obj.geometry.getAttribute('position');
396
+ if (!attr) return;
397
+ for (let i = 0; i < attr.count; i++) {
398
+ tmp.set(attr.getX(i), attr.getY(i), attr.getZ(i));
399
+ obj.localToWorld(tmp);
400
+ min.min(tmp);
401
+ max.max(tmp);
402
+ }
403
+ });
404
+
405
+ if (!isFinite(min.x)) return;
406
+
407
+ const center = min.clone().add(max).multiplyScalar(0.5);
408
+ const size = max.clone().sub(min);
409
+ const radius = size.length() * 0.5;
410
+ const dist = (radius / Math.sin((camera.fov * Math.PI / 180) / 2)) * CAMERA_FIT_PADDING;
411
+
412
+ const dir = new ThreeVector3(1, 0.6, 1.2).normalize();
413
+ camera.position.copy(center).add(dir.multiplyScalar(dist));
414
+ camera.near = Math.max(0.001, dist * 0.001);
415
+ camera.far = dist * 100;
416
+ camera.updateProjectionMatrix();
417
+
418
+ controls.target.copy(center);
419
+ controls.update();
420
+ }
421
+
422
+ // ---------------------------------------------------------------------------
423
+ // Drag & drop UI
424
+ // ---------------------------------------------------------------------------
425
+
426
+ const overlay = document.createElement('div');
427
+ Object.assign(overlay.style, {
428
+ position: 'fixed',
429
+ inset: '0',
430
+ display: 'flex',
431
+ flexDirection: 'column',
432
+ alignItems: 'center',
433
+ justifyContent: 'center',
434
+ color: 'rgba(255,255,255,0.55)',
435
+ fontFamily: 'system-ui, sans-serif',
436
+ fontSize: '20px',
437
+ pointerEvents: 'none',
438
+ transition: 'opacity 0.2s ease',
439
+ textAlign: 'center',
440
+ padding: '24px',
441
+ });
442
+ overlay.innerHTML = `
443
+ <div style="font-size:42px;margin-bottom:12px;">⬇</div>
444
+ <div>Drop a <b>.gltf</b> or <b>.glb</b> file anywhere</div>
445
+ <div style="font-size:14px;margin-top:8px;opacity:0.7;">
446
+ Each mesh inside will be tetrahedralized and shown in a distinct colour.
447
+ </div>
448
+ `;
449
+ document.body.appendChild(overlay);
450
+
451
+ const status_bar = document.createElement('div');
452
+ Object.assign(status_bar.style, {
453
+ position: 'fixed',
454
+ left: '12px',
455
+ bottom: '12px',
456
+ color: 'rgba(255,255,255,0.85)',
457
+ fontFamily: 'monospace',
458
+ fontSize: '13px',
459
+ background: 'rgba(0,0,0,0.4)',
460
+ padding: '6px 10px',
461
+ borderRadius: '4px',
462
+ pointerEvents: 'none',
463
+ whiteSpace: 'pre',
464
+ });
465
+ document.body.appendChild(status_bar);
466
+
467
+ function set_status(text) {
468
+ status_bar.textContent = text;
469
+ }
470
+
471
+ set_status('Ready. Drop a .gltf or .glb file.');
472
+
473
+ ['dragenter', 'dragover'].forEach((ev) => {
474
+ window.addEventListener(ev, (e) => {
475
+ e.preventDefault();
476
+ overlay.style.background = 'rgba(60,100,140,0.25)';
477
+ });
478
+ });
479
+ ['dragleave', 'drop'].forEach((ev) => {
480
+ window.addEventListener(ev, (e) => {
481
+ e.preventDefault();
482
+ overlay.style.background = '';
483
+ });
484
+ });
485
+
486
+ window.addEventListener('drop', (e) => {
487
+ const file = e.dataTransfer?.files?.[0];
488
+ if (!file) return;
489
+ handle_dropped_file(file);
490
+ });
491
+
492
+ const gltf_loader = new GLTFLoader();
493
+
494
+ /**
495
+ * @param {File} file
496
+ */
497
+ function handle_dropped_file(file) {
498
+ set_status(`Reading ${file.name}…`);
499
+
500
+ const reader = new FileReader();
501
+ reader.onload = () => {
502
+ const buffer = reader.result;
503
+ const is_glb = file.name.toLowerCase().endsWith('.glb');
504
+
505
+ // GLTFLoader.parse accepts an ArrayBuffer (for .glb) or a JSON string
506
+ // (for .gltf). For .gltf, the result.scenes won't include external
507
+ // .bin buffers — that's a known limitation of single-file drag-drop.
508
+ try {
509
+ let data;
510
+ if (is_glb) {
511
+ data = buffer;
512
+ } else {
513
+ data = new TextDecoder().decode(buffer);
514
+ }
515
+
516
+ gltf_loader.parse(
517
+ data,
518
+ '',
519
+ (gltf) => process_gltf(gltf, file.name),
520
+ (err) => {
521
+ console.error(err);
522
+ set_status(`Failed to parse ${file.name}: ${err?.message ?? err}`);
523
+ }
524
+ );
525
+ } catch (err) {
526
+ console.error(err);
527
+ set_status(`Failed to read ${file.name}: ${err.message}`);
528
+ }
529
+ };
530
+ reader.onerror = () => set_status(`Failed to read ${file.name}`);
531
+ reader.readAsArrayBuffer(file);
532
+ }
533
+
534
+ /**
535
+ * @param {{scene: import("three").Group}} gltf
536
+ * @param {string} file_name
537
+ */
538
+ function process_gltf(gltf, file_name) {
539
+ clear_loaded();
540
+ overlay.style.opacity = '0';
541
+
542
+ gltf.scene.updateWorldMatrix(true, true);
543
+
544
+ /** @type {Array<{name: string, geometry: BufferGeometry}>} */
545
+ const inputs = [];
546
+
547
+ gltf.scene.traverse((obj) => {
548
+ if (!obj.isMesh || !obj.geometry) return;
549
+ // Bake world transform so every geometry lives in the same coordinate frame.
550
+ const baked = obj.geometry.clone();
551
+ baked.applyMatrix4(obj.matrixWorld);
552
+ inputs.push({ name: obj.name || `mesh_${inputs.length}`, geometry: baked });
553
+ });
554
+
555
+ if (inputs.length === 0) {
556
+ set_status(`${file_name}: no meshes found.`);
557
+ overlay.style.opacity = '1';
558
+ return;
559
+ }
560
+
561
+ set_status(`${file_name}: tetrahedralizing ${inputs.length} mesh(es)…`);
562
+
563
+ let total_tets = 0;
564
+ let total_slivers = 0;
565
+ let total_surface_vol = 0;
566
+ let total_tet_vol = 0;
567
+ let global_min_quality = 1;
568
+ let q_sum_weighted = 0; // sum of avg_quality × tet_count, for a proper aggregate average
569
+ let succeeded = 0;
570
+ const t0 = performance.now();
571
+
572
+ inputs.forEach((input, i) => {
573
+ const color = color_for_index(i);
574
+
575
+ let result;
576
+ try {
577
+ result = tetrahedralize_geometry(input.geometry);
578
+ } catch (e) {
579
+ console.warn(`Tetrahedralization threw for "${input.name}":`, e);
580
+ return;
581
+ }
582
+ if (result === null) {
583
+ console.warn(`Tetrahedralization yielded no tets for "${input.name}".`);
584
+ return;
585
+ }
586
+
587
+ const material = new MeshStandardMaterial({
588
+ color,
589
+ flatShading: true,
590
+ roughness: 0.6,
591
+ metalness: 0.05,
592
+ });
593
+ const mesh = new Mesh(result.geometry, material);
594
+ mesh.name = input.name;
595
+ loaded_group.add(mesh);
596
+
597
+ succeeded += 1;
598
+ total_tets += result.tet_count;
599
+ total_slivers += result.sliver_count;
600
+ total_surface_vol += result.surface_volume;
601
+ total_tet_vol += result.tet_volume;
602
+ q_sum_weighted += result.avg_quality * result.tet_count;
603
+ if (result.min_quality < global_min_quality) global_min_quality = result.min_quality;
604
+
605
+ // Per-mesh details to the console. The line shows BEFORE → AFTER
606
+ // the improve-quality driver so we can immediately see whether it
607
+ // moved the needle on this specific mesh.
608
+ const gap_pct = result.surface_volume > 0
609
+ ? ((result.tet_volume - result.surface_volume) / result.surface_volume * 100).toFixed(2) + '%'
610
+ : 'n/a';
611
+ const before = result.stats_before;
612
+ const after = result.stats_after;
613
+ const driver_summary = result.driver_stats
614
+ ? ` (${result.driver_ms.toFixed(0)}ms; smooth=${result.driver_stats.smoothings_committed}, flip23=${result.driver_stats.flips_23_committed}, flip32=${result.driver_stats.flips_32_committed})`
615
+ : '';
616
+ // eslint-disable-next-line no-console
617
+ console.log(
618
+ `[${input.name}] tets=${result.tet_count} ` +
619
+ `surf_vol=${result.surface_volume.toFixed(4)} tet_vol=${result.tet_volume.toFixed(4)} gap=${gap_pct}\n` +
620
+ ` min_q: ${before.min_quality.toFixed(3)} → ${after.min_quality.toFixed(3)} ` +
621
+ `avg_q: ${before.avg_quality.toFixed(3)} → ${after.avg_quality.toFixed(3)} ` +
622
+ `slivers: ${before.sliver_count} → ${after.sliver_count}${driver_summary}`
623
+ );
624
+ });
625
+
626
+ const ms = (performance.now() - t0).toFixed(0);
627
+
628
+ if (succeeded === 0) {
629
+ set_status(`${file_name}: all ${inputs.length} mesh(es) failed to tetrahedralize. See console.`);
630
+ overlay.style.opacity = '1';
631
+ return;
632
+ }
633
+
634
+ fit_camera_to(loaded_group);
635
+
636
+ const aggregate_avg_q = total_tets > 0 ? q_sum_weighted / total_tets : 0;
637
+ const aggregate_gap = total_surface_vol > 0
638
+ ? ((total_tet_vol - total_surface_vol) / total_surface_vol * 100).toFixed(2) + '%'
639
+ : 'n/a';
640
+ const sliver_pct = total_tets > 0
641
+ ? (total_slivers / total_tets * 100).toFixed(1) + '%'
642
+ : '0%';
643
+
644
+ set_status(
645
+ `${file_name}\n` +
646
+ `meshes: ${succeeded}/${inputs.length} tets: ${total_tets.toLocaleString()} time: ${ms} ms\n` +
647
+ `vol: surf=${total_surface_vol.toFixed(4)} tet=${total_tet_vol.toFixed(4)} gap=${aggregate_gap}\n` +
648
+ `quality: min=${global_min_quality.toFixed(3)} avg=${aggregate_avg_q.toFixed(3)} slivers: ${total_slivers} (${sliver_pct})\n` +
649
+ `(drop another file to replace; per-mesh details in console)`
650
+ );
651
+ }
652
+
653
+ // ---------------------------------------------------------------------------
654
+ // Render loop & resize
655
+ // ---------------------------------------------------------------------------
656
+
657
+ function on_resize() {
658
+ const w = window.innerWidth;
659
+ const h = window.innerHeight;
660
+ renderer.setSize(w, h, false);
661
+ camera.aspect = w / h;
662
+ camera.updateProjectionMatrix();
663
+ }
664
+ window.addEventListener('resize', on_resize);
665
+ on_resize();
666
+
667
+ (function animate() {
668
+ requestAnimationFrame(animate);
669
+ controls.update();
670
+ renderer.render(scene, camera);
671
+ })();
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Build a `Map<vertex_id, tet_id[]>` enumerating every live tet that
3
+ * contains each vertex. One full pass over the mesh; the result lets
4
+ * subsequent per-vertex queries run in O(deg) instead of O(N).
5
+ *
6
+ * Useful when the caller is about to perform many per-vertex queries —
7
+ * e.g. boundary-status checks or 1-ring quality evaluations across a whole
8
+ * mesh during a quality-improvement pass. Without the cache, each query
9
+ * has to scan every live tet (see
10
+ * {@link tetrahedral_mesh_find_tets_attached_to_vertex} and
11
+ * {@link tetrahedral_mesh_vertex_is_boundary}), which compounds to O(N²)
12
+ * over a full pass.
13
+ *
14
+ * The map is a SNAPSHOT: it reflects mesh state at build time. Any flips,
15
+ * deletions or appends that happen afterwards will leave it stale. Callers
16
+ * must either rebuild after each mutation or accept the staleness (for
17
+ * boundary checks the cache is flip-invariant, so a once-per-pass rebuild
18
+ * is safe; for queries that need the exact current 1-ring, the caller
19
+ * should filter through `mesh.exists` and rebuild after mutations they
20
+ * care about).
21
+ *
22
+ * Cost: O(N) where N is `mesh.count`.
23
+ *
24
+ * @param {TetrahedralMesh} mesh
25
+ * @returns {Map<number, number[]>}
26
+ */
27
+ export function tetrahedral_mesh_build_vertex_to_tets_map(mesh: TetrahedralMesh): Map<number, number[]>;
28
+ //# sourceMappingURL=tetrahedral_mesh_build_vertex_to_tets_map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tetrahedral_mesh_build_vertex_to_tets_map.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,kFAFa,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC,CAqBjC"}