@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.
- package/package.json +1 -1
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.d.ts +3 -3
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.js +4 -4
- package/src/core/collection/PairUint32Map.d.ts +100 -0
- package/src/core/collection/PairUint32Map.d.ts.map +1 -0
- package/src/core/collection/PairUint32Map.js +321 -0
- package/src/core/collection/Uint32Map.d.ts +119 -0
- package/src/core/collection/Uint32Map.d.ts.map +1 -0
- package/src/core/collection/Uint32Map.js +345 -0
- package/src/core/collection/array/array_shuffle.d.ts +10 -3
- package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
- package/src/core/collection/array/array_shuffle.js +27 -22
- package/src/core/collection/heap/FibonacciHeap.d.ts +195 -0
- package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -0
- package/src/core/collection/heap/FibonacciHeap.js +586 -0
- package/src/core/collection/heap/Uint32Heap.js +1 -1
- package/src/core/collection/heap/Uint32Heap4.d.ts +169 -0
- package/src/core/collection/heap/Uint32Heap4.d.ts.map +1 -0
- package/src/core/collection/heap/Uint32Heap4.js +490 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts +30 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.d.ts.map +1 -0
- package/src/core/geom/3d/aabb/aabb3_transform_oriented.js +93 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +27 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +1 -0
- package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +88 -0
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts +54 -0
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_to_matrix3.js +69 -0
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts +24 -2
- package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/AbstractShape3D.js +24 -1
- package/src/core/geom/3d/shape/BoxShape3D.d.ts +61 -0
- package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/BoxShape3D.js +158 -0
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +11 -0
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.js +12 -0
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +148 -0
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/HeightMapShape3D.js +451 -0
- package/src/core/geom/3d/shape/MeshShape3D.d.ts +210 -0
- package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/MeshShape3D.js +593 -0
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +46 -2
- package/src/core/geom/3d/shape/Triangle3D.d.ts +95 -0
- package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/Triangle3D.js +318 -0
- package/src/core/geom/3d/shape/UnionShape3D.js +13 -0
- package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts +37 -9
- package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -98
- package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts +10 -0
- package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnitSphereShape3D.js +11 -0
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts +30 -0
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.d.ts.map +1 -0
- package/src/core/geom/3d/shape/shape_mesh_from_geometry.js +64 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +61 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -0
- package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +148 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts +39 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +147 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +15 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +22 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts +2 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.js +671 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.d.ts +28 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_build_vertex_to_tets_map.js +48 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts +26 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +222 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts +34 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts +36 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts +33 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts +68 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +387 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +35 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +140 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +31 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +97 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +32 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts +41 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +124 -13
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts +134 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +276 -3
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +17 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +135 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts +14 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +177 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +20 -4
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +5 -3
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +9 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -45
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.js +7 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts +8 -6
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +8 -6
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +73 -0
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +51 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts +10 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts +28 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +227 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts +13 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +11 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +20 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +20 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +1 -0
- package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +38 -0
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts +2 -2
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/v3_compute_triangle_normal.js +1 -1
- package/src/core/geom/vec3/v3_dot_array_array.d.ts +3 -3
- package/src/core/geom/vec3/v3_dot_array_array.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_dot_array_array.js +2 -2
- package/src/core/geom/vec3/v3_negate_array.d.ts +3 -3
- package/src/core/geom/vec3/v3_negate_array.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_negate_array.js +2 -2
- package/src/core/geom/vec3/v3_quat3_apply.d.ts +29 -0
- package/src/core/geom/vec3/v3_quat3_apply.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_quat3_apply.js +39 -0
- package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +30 -0
- package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_quat3_apply_inverse.js +41 -0
- package/src/core/geom/vec3/v3_triple_cross_product.d.ts +32 -0
- package/src/core/geom/vec3/v3_triple_cross_product.d.ts.map +1 -0
- package/src/core/geom/vec3/v3_triple_cross_product.js +45 -0
- package/src/core/graph/csr/CSRGraph.d.ts +168 -0
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -0
- package/src/core/graph/csr/CSRGraph.js +319 -0
- package/src/core/graph/metis/cluster_mesh_metis.d.ts +12 -0
- package/src/core/graph/metis/cluster_mesh_metis.d.ts.map +1 -1
- package/src/core/graph/metis/cluster_mesh_metis.js +12 -0
- package/src/core/graph/metis/metis.d.ts +19 -0
- package/src/core/graph/metis/metis.d.ts.map +1 -1
- package/src/core/graph/metis/metis.js +20 -0
- package/src/core/graph/metis/metis_cluster_bs.d.ts +11 -0
- package/src/core/graph/metis/metis_cluster_bs.d.ts.map +1 -1
- package/src/core/graph/metis/metis_cluster_bs.js +11 -0
- package/src/core/graph/metis/metis_options.d.ts +17 -2
- package/src/core/graph/metis/metis_options.d.ts.map +1 -1
- package/src/core/graph/metis/metis_options.js +17 -2
- package/src/core/graph/metis/native/MetisGraph.d.ts +144 -0
- package/src/core/graph/metis/native/MetisGraph.d.ts.map +1 -0
- package/src/core/graph/metis/native/MetisGraph.js +212 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts +72 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/BisectionScratch.js +101 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.d.ts +37 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts +15 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/compute_2way_params.js +84 -0
- package/src/core/graph/metis/native/bisection/fm_2way.d.ts +30 -0
- package/src/core/graph/metis/native/bisection/fm_2way.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/fm_2way.js +290 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.d.ts +23 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts +28 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts.map +1 -0
- package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts +20 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts +24 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -0
- package/src/core/graph/metis/native/coarsen/match_shem.d.ts +41 -0
- package/src/core/graph/metis/native/coarsen/match_shem.d.ts.map +1 -0
- package/src/core/graph/metis/native/coarsen/match_shem.js +175 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts +24 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts.map +1 -0
- package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts +29 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts.map +1 -0
- package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -0
- package/src/core/graph/metis/native/metis_partition_kway.d.ts +41 -0
- package/src/core/graph/metis/native/metis_partition_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/metis_partition_kway.js +126 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts +62 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js +261 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.d.ts +45 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.d.ts +18 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/compute_kway_params.js +138 -0
- package/src/core/graph/metis/native/refine/fm_kway.d.ts +63 -0
- package/src/core/graph/metis/native/refine/fm_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/fm_kway.js +462 -0
- package/src/core/graph/metis/native/refine/project_kway.d.ts +22 -0
- package/src/core/graph/metis/native/refine/project_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/project_kway.js +43 -0
- package/src/core/graph/metis/native/refine/refine_kway.d.ts +34 -0
- package/src/core/graph/metis/native/refine/refine_kway.d.ts.map +1 -0
- package/src/core/graph/metis/native/refine/refine_kway.js +43 -0
- package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts +2 -2
- package/src/core/math/linalg/eigen/matrix_householder_in_place.js +2 -2
- package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +6 -4
- package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -1
- package/src/core/math/linalg/eigen/matrix_qr_in_place.js +69 -23
- package/src/engine/EngineHarness.d.ts +3 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +3 -0
- package/src/engine/control/first-person/DESIGN.md +30 -6
- package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +115 -9
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerController.js +211 -176
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +601 -8
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +349 -8
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +319 -23
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +1789 -799
- package/src/engine/control/first-person/TODO.md +173 -0
- package/src/engine/control/first-person/abilities/Ability.d.ts +101 -0
- package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Ability.js +119 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts +86 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/AbilitySet.js +185 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +62 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.js +199 -0
- package/src/engine/control/first-person/abilities/Mantle.d.ts +45 -0
- package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Mantle.js +188 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts +33 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/Slide.js +166 -0
- package/src/engine/control/first-person/abilities/WallJump.d.ts +45 -0
- package/src/engine/control/first-person/abilities/WallJump.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/WallJump.js +131 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts +44 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -0
- package/src/engine/control/first-person/abilities/WallRun.js +180 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts +49 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts.map +1 -0
- package/src/engine/control/first-person/composer/EyeOffsetStack.js +60 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts +100 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.js +133 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.d.ts +10 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts +61 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.js +109 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts +40 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasteryEvaluator.js +45 -0
- package/src/engine/control/first-person/mastery/MasteryScore.d.ts +68 -0
- package/src/engine/control/first-person/mastery/MasteryScore.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasteryScore.js +100 -0
- package/src/engine/control/first-person/mastery/MasterySet.d.ts +60 -0
- package/src/engine/control/first-person/mastery/MasterySet.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/MasterySet.js +86 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +58 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +83 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +69 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -0
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +109 -0
- package/src/engine/control/first-person/math/Spring.d.ts +56 -0
- package/src/engine/control/first-person/math/Spring.d.ts.map +1 -0
- package/src/engine/control/first-person/math/Spring.js +71 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts +26 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts.map +1 -0
- package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -0
- package/src/engine/control/first-person/math/computeMassRatios.d.ts +35 -0
- package/src/engine/control/first-person/math/computeMassRatios.d.ts.map +1 -0
- package/src/engine/control/first-person/math/computeMassRatios.js +44 -0
- package/src/engine/control/first-person/pose/FirstPersonPose.d.ts +31 -1
- package/src/engine/control/first-person/pose/FirstPersonPose.d.ts.map +1 -1
- package/src/engine/control/first-person/pose/FirstPersonPose.js +49 -3
- package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts +7 -0
- package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts.map +1 -0
- package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -0
- package/src/engine/control/first-person/prototype_first_person_controller.js +637 -120
- package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts +58 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts.map +1 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensors.js +77 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +80 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -0
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +196 -0
- package/src/engine/control/first-person/test/buildTestPlayer.d.ts +20 -0
- package/src/engine/control/first-person/test/buildTestPlayer.d.ts.map +1 -0
- package/src/engine/control/first-person/test/buildTestPlayer.js +36 -0
- package/src/engine/graphics/camera/testClippingPlaneComputation.js +0 -2
- package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/Light.js +27 -0
- package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
- package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
- package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
- package/src/engine/graphics/geometry/CapsuleGeometry.d.ts +42 -0
- package/src/engine/graphics/geometry/CapsuleGeometry.d.ts.map +1 -0
- package/src/engine/graphics/geometry/CapsuleGeometry.js +171 -0
- package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
- package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
- package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
- package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
- package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
- package/src/engine/physics/BULLET_REVIEW.md +945 -0
- package/src/engine/physics/CANNON_REVIEW.md +1300 -0
- package/src/engine/physics/JOLT_REVIEW.md +913 -0
- package/src/engine/physics/PLAN.md +461 -0
- package/src/engine/physics/RAPIER_REVIEW.md +934 -0
- package/src/engine/physics/REVIEW_001_ACTION_PLAN.md +642 -0
- package/src/engine/physics/body/BodyStorage.d.ts +187 -0
- package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
- package/src/engine/physics/body/BodyStorage.js +427 -0
- package/src/engine/physics/broadphase/PairList.d.ts +62 -0
- package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
- package/src/engine/physics/broadphase/PairList.js +97 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
- package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
- package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
- package/src/engine/physics/broadphase/generate_pairs.js +101 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts +299 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
- package/src/engine/physics/contact/ManifoldStore.js +608 -0
- package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
- package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
- package/src/engine/physics/ecs/BodyKind.js +24 -0
- package/src/engine/physics/ecs/Collider.d.ts +98 -0
- package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
- package/src/engine/physics/ecs/Collider.js +136 -0
- package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
- package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderFlags.js +15 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
- package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
- package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
- package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +628 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/PhysicsSystem.js +1301 -0
- package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
- package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBody.js +240 -0
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
- package/src/engine/physics/ecs/SleepState.d.ts +11 -0
- package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
- package/src/engine/physics/ecs/SleepState.js +12 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
- package/src/engine/physics/events/ContactEventBuffer.js +83 -0
- package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
- package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
- package/src/engine/physics/events/diff_manifolds.js +50 -0
- package/src/engine/physics/fluid/FluidField.d.ts +294 -16
- package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidField.js +510 -66
- package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
- package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidSimulator.js +456 -95
- package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
- package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
- package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
- package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
- package/src/engine/physics/fluid/prototype.js +102 -91
- package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
- package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +48 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +92 -0
- package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts +6 -6
- package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
- package/src/engine/physics/gjk/expanding_polytope_algorithm.js +76 -32
- package/src/engine/physics/gjk/gjk.d.ts +28 -2
- package/src/engine/physics/gjk/gjk.d.ts.map +1 -1
- package/src/engine/physics/gjk/gjk.js +421 -378
- package/src/engine/physics/gjk/minkowski_support.d.ts +37 -0
- package/src/engine/physics/gjk/minkowski_support.d.ts.map +1 -0
- package/src/engine/physics/gjk/minkowski_support.js +75 -0
- package/src/engine/physics/gjk/mpr.d.ts +56 -0
- package/src/engine/physics/gjk/mpr.d.ts.map +1 -0
- package/src/engine/physics/gjk/mpr.js +344 -0
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts +44 -0
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
- package/src/engine/physics/inertia/world_inverse_inertia.js +77 -0
- package/src/engine/physics/integration/integrate_position.d.ts +34 -0
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_position.js +79 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts +55 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_velocity.js +160 -0
- package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
- package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
- package/src/engine/physics/integration/quat_integrate.js +62 -0
- package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
- package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
- package/src/engine/physics/island/IslandBuilder.js +411 -0
- package/src/engine/physics/island/union_find.d.ts +51 -0
- package/src/engine/physics/island/union_find.d.ts.map +1 -0
- package/src/engine/physics/island/union_find.js +76 -0
- package/src/engine/physics/narrowphase/PosedShape.d.ts +51 -0
- package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/PosedShape.js +108 -0
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/box_box_manifold.js +639 -0
- package/src/engine/physics/narrowphase/box_triangle_contact.d.ts +30 -0
- package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/box_triangle_contact.js +811 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/capsule_contacts.js +462 -0
- package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts +71 -0
- package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/capsule_triangle_contact.js +375 -0
- package/src/engine/physics/narrowphase/compute_penetration.d.ts +91 -0
- package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/compute_penetration.js +396 -0
- package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts +35 -0
- package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.js +80 -0
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts +31 -0
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/decompose_to_triangles.js +55 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +42 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +204 -0
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +42 -0
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +94 -0
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts +37 -0
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/decomposition/triangle_buffer_layout.js +37 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts +17 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/narrowphase_step.js +1422 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/sphere_box_contact.js +123 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
- package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts +48 -0
- package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/sphere_triangle_contact.js +143 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
- package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
- package/src/engine/physics/queries/overlap_shape.d.ts +51 -0
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -0
- package/src/engine/physics/queries/overlap_shape.js +183 -0
- package/src/engine/physics/queries/raycast.d.ts +20 -0
- package/src/engine/physics/queries/raycast.d.ts.map +1 -0
- package/src/engine/physics/queries/raycast.js +249 -0
- package/src/engine/physics/queries/shape_cast.d.ts +56 -0
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -0
- package/src/engine/physics/queries/shape_cast.js +387 -0
- package/src/engine/physics/solver/friction_cone.d.ts +16 -0
- package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
- package/src/engine/physics/solver/friction_cone.js +37 -0
- package/src/engine/physics/solver/solve_contacts.d.ts +122 -0
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
- package/src/engine/physics/solver/solve_contacts.js +1016 -0
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
- package/src/engine/ecs/components/Motion.d.ts +0 -21
- package/src/engine/ecs/components/Motion.d.ts.map +0 -1
- package/src/engine/ecs/components/Motion.js +0 -27
- package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
- package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
- package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
- package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
- package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
- package/src/engine/ecs/systems/MotionSystem.js +0 -29
- package/src/engine/physics/fluid/Fluid.d.ts +0 -26
- package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
- package/src/engine/physics/fluid/Fluid.js +0 -221
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
- 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"}
|