@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,101 @@
|
|
|
1
|
+
import { IndexedFloatMaxHeap } from "../refine/IndexedFloatMaxHeap.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pre-allocated scratch reused by every recursive `bisect_graph` call during
|
|
5
|
+
* the initial-partition phase.
|
|
6
|
+
*
|
|
7
|
+
* Recursive bisection produces O(k) subgraphs that each need their own
|
|
8
|
+
* refinement state and FM scratch — but only at sizes <= the coarsest vertex
|
|
9
|
+
* count. Sharing one set of arrays scoped to that maximum eliminates O(k)
|
|
10
|
+
* typed-array allocations and the corresponding GC pressure.
|
|
11
|
+
*
|
|
12
|
+
* Contents:
|
|
13
|
+
*
|
|
14
|
+
* - **Compute-2way state**: `boundary_vertices`, `boundary_position_of_vertex`,
|
|
15
|
+
* `internal_degree`, `external_degree`, `partition_weights[2]`.
|
|
16
|
+
*
|
|
17
|
+
* - **FM-2way state**: `fm_heaps` (one per side of the bisection),
|
|
18
|
+
* `fm_moved_pass_index`, `fm_swap_history`, `fm_insertion_order`.
|
|
19
|
+
*
|
|
20
|
+
* - **Bisect snapshot**: `best_partition_snapshot` for grow+FM trial selection.
|
|
21
|
+
*
|
|
22
|
+
* - **`vertex_partition_pool`**: a stack of vertex_partition arrays. Each
|
|
23
|
+
* recursive call takes a slot (via `take_vertex_partition_slot`) and
|
|
24
|
+
* releases it on return. New slots are allocated lazily, capped at
|
|
25
|
+
* `log2(k)` total — the maximum recursion depth.
|
|
26
|
+
*
|
|
27
|
+
* The two FM heaps are sized to `max_vertex_count` at construction. Their
|
|
28
|
+
* internal `__slot_of_id` table can hold any id in `[0, max_vertex_count)`, so
|
|
29
|
+
* subgraphs of any size below that work without expanding. `clear()` resets
|
|
30
|
+
* heap state in O(size), not O(capacity).
|
|
31
|
+
*
|
|
32
|
+
* `fm_moved_pass_index` starts initialised to -1. fm_2way's per-pass cleanup
|
|
33
|
+
* resets touched entries back to -1, so the invariant is preserved across
|
|
34
|
+
* calls — no need to refill the whole array between bisect_graph invocations.
|
|
35
|
+
*/
|
|
36
|
+
export class BisectionScratch {
|
|
37
|
+
/**
|
|
38
|
+
* @param {number} max_vertex_count typically the coarsest graph's vertex count
|
|
39
|
+
*/
|
|
40
|
+
constructor(max_vertex_count) {
|
|
41
|
+
this.max_vertex_count = max_vertex_count;
|
|
42
|
+
|
|
43
|
+
// --- 2-way refinement state shared with compute_2way_params ---
|
|
44
|
+
|
|
45
|
+
this.boundary_vertices = new Uint32Array(max_vertex_count);
|
|
46
|
+
this.boundary_position_of_vertex = new Int32Array(max_vertex_count);
|
|
47
|
+
this.internal_degree = new Uint32Array(max_vertex_count);
|
|
48
|
+
this.external_degree = new Uint32Array(max_vertex_count);
|
|
49
|
+
this.partition_weights = new Uint32Array(2);
|
|
50
|
+
this.best_partition_snapshot = new Uint32Array(max_vertex_count);
|
|
51
|
+
|
|
52
|
+
// --- FM_2way scratch ---
|
|
53
|
+
|
|
54
|
+
this.fm_heaps = [
|
|
55
|
+
new IndexedFloatMaxHeap(max_vertex_count, Math.min(max_vertex_count, 1024)),
|
|
56
|
+
new IndexedFloatMaxHeap(max_vertex_count, Math.min(max_vertex_count, 1024))
|
|
57
|
+
];
|
|
58
|
+
this.fm_moved_pass_index = new Int32Array(max_vertex_count);
|
|
59
|
+
this.fm_moved_pass_index.fill(-1);
|
|
60
|
+
this.fm_swap_history = new Uint32Array(max_vertex_count);
|
|
61
|
+
this.fm_insertion_order = new Uint32Array(max_vertex_count);
|
|
62
|
+
|
|
63
|
+
// --- vertex_partition stack pool ---
|
|
64
|
+
|
|
65
|
+
/** @type {Uint32Array[]} */
|
|
66
|
+
this.vertex_partition_pool = [];
|
|
67
|
+
this.vertex_partition_pool_top = 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Borrow a vertex_partition slot from the pool. The first `vertex_count`
|
|
72
|
+
* entries are zero-filled; values past `vertex_count` may hold stale data
|
|
73
|
+
* from a sibling subgraph and must not be read.
|
|
74
|
+
*
|
|
75
|
+
* Returned slot remains owned by the scratch; release with
|
|
76
|
+
* `release_vertex_partition_slot` once you're done with it.
|
|
77
|
+
*
|
|
78
|
+
* @param {number} vertex_count subgraph's vertex_count
|
|
79
|
+
* @returns {Uint32Array}
|
|
80
|
+
*/
|
|
81
|
+
take_vertex_partition_slot(vertex_count) {
|
|
82
|
+
const slot_index = this.vertex_partition_pool_top;
|
|
83
|
+
let slot = this.vertex_partition_pool[slot_index];
|
|
84
|
+
if (slot === undefined) {
|
|
85
|
+
slot = new Uint32Array(this.max_vertex_count);
|
|
86
|
+
this.vertex_partition_pool.push(slot);
|
|
87
|
+
} else {
|
|
88
|
+
slot.fill(0, 0, vertex_count);
|
|
89
|
+
}
|
|
90
|
+
this.vertex_partition_pool_top = slot_index + 1;
|
|
91
|
+
return slot;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Pop the top vertex_partition slot off the pool. Pairs with
|
|
96
|
+
* `take_vertex_partition_slot` — call exactly once per take.
|
|
97
|
+
*/
|
|
98
|
+
release_vertex_partition_slot() {
|
|
99
|
+
this.vertex_partition_pool_top--;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bisect a graph into two partitions with `target_weight_for_partition_0` weight
|
|
3
|
+
* landing in partition 0. Runs `bisection_trial_count` independent BFS-grow + FM
|
|
4
|
+
* trials and keeps the best (lowest-cut) result.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors `Init2WayPartition` from libmetis/initpart.c, single-constraint cut
|
|
7
|
+
* branch only.
|
|
8
|
+
*
|
|
9
|
+
* **All scratch state is taken from the supplied `BisectionScratch`**:
|
|
10
|
+
* - the 2-way refinement arrays (`internal_degree`, `external_degree`,
|
|
11
|
+
* boundary list, `partition_weights[2]`),
|
|
12
|
+
* - the FM heaps and pass-local arrays,
|
|
13
|
+
* - the best-cut snapshot,
|
|
14
|
+
* - and `vertex_partition` itself, which the caller borrows from the
|
|
15
|
+
* scratch's stack pool and releases after using the result.
|
|
16
|
+
*
|
|
17
|
+
* The k-way bookkeeping arrays (`neighbor_partition_*`, `neighbor_partition_pool`)
|
|
18
|
+
* are NOT set up here — bisection doesn't need them. They get allocated by
|
|
19
|
+
* `allocate_partition_state(k)` once recursive bisection is done and the graph
|
|
20
|
+
* moves into k-way refinement.
|
|
21
|
+
*
|
|
22
|
+
* On return, `graph.vertex_partition[]` contains 0/1 in `[0, vertex_count)` and
|
|
23
|
+
* `graph.current_cut` is the bisection cut. The vertex_partition slot may be
|
|
24
|
+
* sized larger than vertex_count — only the prefix is meaningful.
|
|
25
|
+
*
|
|
26
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
27
|
+
* @param {Uint32Array} vertex_partition pre-zeroed slot from the scratch pool;
|
|
28
|
+
* typically obtained via `scratch.take_vertex_partition_slot(graph.vertex_count)`
|
|
29
|
+
* @param {number} target_weight_for_partition_0
|
|
30
|
+
* @param {number} bisection_trial_count number of independent grow+FM trials
|
|
31
|
+
* @param {number} fm_pass_count FM passes per trial
|
|
32
|
+
* @param {number} ub_factor balance tolerance for `grow_bisection`
|
|
33
|
+
* @param {function():number} random
|
|
34
|
+
* @param {import('./BisectionScratch.js').BisectionScratch} scratch
|
|
35
|
+
*/
|
|
36
|
+
export function bisect_graph(graph: import('../MetisGraph.js').MetisGraph, vertex_partition: Uint32Array, target_weight_for_partition_0: number, bisection_trial_count: number, fm_pass_count: number, ub_factor: number, random: () => number, scratch: import('./BisectionScratch.js').BisectionScratch): void;
|
|
37
|
+
//# sourceMappingURL=bisect_graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bisect_graph.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/bisect_graph.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,oCAVW,OAAO,kBAAkB,EAAE,UAAU,oBACrC,WAAW,iCAEX,MAAM,yBACN,MAAM,iBACN,MAAM,aACN,MAAM,gBACK,MAAM,WACjB,OAAO,uBAAuB,EAAE,gBAAgB,QA6C1D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { compute_2way_params } from "./compute_2way_params.js";
|
|
2
|
+
import { fm_2way } from "./fm_2way.js";
|
|
3
|
+
import { grow_bisection } from "./grow_bisection.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Bisect a graph into two partitions with `target_weight_for_partition_0` weight
|
|
7
|
+
* landing in partition 0. Runs `bisection_trial_count` independent BFS-grow + FM
|
|
8
|
+
* trials and keeps the best (lowest-cut) result.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors `Init2WayPartition` from libmetis/initpart.c, single-constraint cut
|
|
11
|
+
* branch only.
|
|
12
|
+
*
|
|
13
|
+
* **All scratch state is taken from the supplied `BisectionScratch`**:
|
|
14
|
+
* - the 2-way refinement arrays (`internal_degree`, `external_degree`,
|
|
15
|
+
* boundary list, `partition_weights[2]`),
|
|
16
|
+
* - the FM heaps and pass-local arrays,
|
|
17
|
+
* - the best-cut snapshot,
|
|
18
|
+
* - and `vertex_partition` itself, which the caller borrows from the
|
|
19
|
+
* scratch's stack pool and releases after using the result.
|
|
20
|
+
*
|
|
21
|
+
* The k-way bookkeeping arrays (`neighbor_partition_*`, `neighbor_partition_pool`)
|
|
22
|
+
* are NOT set up here — bisection doesn't need them. They get allocated by
|
|
23
|
+
* `allocate_partition_state(k)` once recursive bisection is done and the graph
|
|
24
|
+
* moves into k-way refinement.
|
|
25
|
+
*
|
|
26
|
+
* On return, `graph.vertex_partition[]` contains 0/1 in `[0, vertex_count)` and
|
|
27
|
+
* `graph.current_cut` is the bisection cut. The vertex_partition slot may be
|
|
28
|
+
* sized larger than vertex_count — only the prefix is meaningful.
|
|
29
|
+
*
|
|
30
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
31
|
+
* @param {Uint32Array} vertex_partition pre-zeroed slot from the scratch pool;
|
|
32
|
+
* typically obtained via `scratch.take_vertex_partition_slot(graph.vertex_count)`
|
|
33
|
+
* @param {number} target_weight_for_partition_0
|
|
34
|
+
* @param {number} bisection_trial_count number of independent grow+FM trials
|
|
35
|
+
* @param {number} fm_pass_count FM passes per trial
|
|
36
|
+
* @param {number} ub_factor balance tolerance for `grow_bisection`
|
|
37
|
+
* @param {function():number} random
|
|
38
|
+
* @param {import('./BisectionScratch.js').BisectionScratch} scratch
|
|
39
|
+
*/
|
|
40
|
+
export function bisect_graph(
|
|
41
|
+
graph,
|
|
42
|
+
vertex_partition,
|
|
43
|
+
target_weight_for_partition_0,
|
|
44
|
+
bisection_trial_count,
|
|
45
|
+
fm_pass_count,
|
|
46
|
+
ub_factor,
|
|
47
|
+
random,
|
|
48
|
+
scratch
|
|
49
|
+
) {
|
|
50
|
+
attach_scratch(graph, vertex_partition, scratch);
|
|
51
|
+
|
|
52
|
+
let best_cut = -1;
|
|
53
|
+
const best_partition = scratch.best_partition_snapshot;
|
|
54
|
+
const vertex_count = graph.vertex_count;
|
|
55
|
+
|
|
56
|
+
for (let trial = 0; trial < bisection_trial_count; trial++) {
|
|
57
|
+
grow_bisection(graph, target_weight_for_partition_0, ub_factor, random);
|
|
58
|
+
compute_2way_params(graph);
|
|
59
|
+
fm_2way(graph, target_weight_for_partition_0, fm_pass_count, random, scratch);
|
|
60
|
+
|
|
61
|
+
if (best_cut === -1 || graph.current_cut < best_cut) {
|
|
62
|
+
best_cut = graph.current_cut;
|
|
63
|
+
// Snapshot only the active subgraph range — best_partition is
|
|
64
|
+
// sized to max_vertex_count and may have stale values past
|
|
65
|
+
// vertex_count from a sibling's earlier bisection.
|
|
66
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
67
|
+
best_partition[v] = vertex_partition[v];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (best_cut === 0) {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Restore the best partition if a later trial wasn't the winner.
|
|
77
|
+
if (best_cut !== graph.current_cut) {
|
|
78
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
79
|
+
vertex_partition[v] = best_partition[v];
|
|
80
|
+
}
|
|
81
|
+
compute_2way_params(graph);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Wire the graph's bisection-state fields to point at the supplied
|
|
87
|
+
* vertex_partition slot and the shared scratch arrays.
|
|
88
|
+
*
|
|
89
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
90
|
+
* @param {Uint32Array} vertex_partition pre-zeroed slot owned by the scratch pool
|
|
91
|
+
* @param {import('./BisectionScratch.js').BisectionScratch} scratch
|
|
92
|
+
*/
|
|
93
|
+
function attach_scratch(graph, vertex_partition, scratch) {
|
|
94
|
+
graph.vertex_partition = vertex_partition;
|
|
95
|
+
graph.partition_weights = scratch.partition_weights;
|
|
96
|
+
graph.boundary_vertices = scratch.boundary_vertices;
|
|
97
|
+
graph.boundary_position_of_vertex = scratch.boundary_position_of_vertex;
|
|
98
|
+
graph.internal_degree = scratch.internal_degree;
|
|
99
|
+
graph.external_degree = scratch.external_degree;
|
|
100
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* From a freshly-assigned bisection `vertex_partition[]` (containing only 0
|
|
3
|
+
* and 1), populate the 2-way refinement bookkeeping: per-partition weights,
|
|
4
|
+
* per-vertex internal/external degree, boundary list, and total cut.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors `Compute2WayPartitionParams` from libmetis/refine.c.
|
|
7
|
+
*
|
|
8
|
+
* For 2-way refinement, the neighbour-partition list is trivially "the other
|
|
9
|
+
* partition", so we don't allocate any cnbr pool — only the parallel
|
|
10
|
+
* `internal_degree[v]` and `external_degree[v]` arrays are needed.
|
|
11
|
+
*
|
|
12
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
13
|
+
*/
|
|
14
|
+
export function compute_2way_params(graph: import('../MetisGraph.js').MetisGraph): void;
|
|
15
|
+
//# sourceMappingURL=compute_2way_params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute_2way_params.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/compute_2way_params.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,2CAFW,OAAO,kBAAkB,EAAE,UAAU,QAsE/C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assert } from "../../../../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* From a freshly-assigned bisection `vertex_partition[]` (containing only 0
|
|
5
|
+
* and 1), populate the 2-way refinement bookkeeping: per-partition weights,
|
|
6
|
+
* per-vertex internal/external degree, boundary list, and total cut.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors `Compute2WayPartitionParams` from libmetis/refine.c.
|
|
9
|
+
*
|
|
10
|
+
* For 2-way refinement, the neighbour-partition list is trivially "the other
|
|
11
|
+
* partition", so we don't allocate any cnbr pool — only the parallel
|
|
12
|
+
* `internal_degree[v]` and `external_degree[v]` arrays are needed.
|
|
13
|
+
*
|
|
14
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
15
|
+
*/
|
|
16
|
+
export function compute_2way_params(graph) {
|
|
17
|
+
const vertex_count = graph.vertex_count;
|
|
18
|
+
const edge_addresses = graph.edge_addresses;
|
|
19
|
+
const adjacency = graph.adjacency;
|
|
20
|
+
const edge_weights = graph.edge_weights;
|
|
21
|
+
const vertex_weights = graph.vertex_weights;
|
|
22
|
+
const vertex_partition = graph.vertex_partition;
|
|
23
|
+
const partition_weights = graph.partition_weights;
|
|
24
|
+
const internal_degree = graph.internal_degree;
|
|
25
|
+
const external_degree = graph.external_degree;
|
|
26
|
+
const boundary_vertices = graph.boundary_vertices;
|
|
27
|
+
const boundary_position_of_vertex = graph.boundary_position_of_vertex;
|
|
28
|
+
|
|
29
|
+
assert.equal(vertex_partition !== null, true, 'graph.vertex_partition must be allocated');
|
|
30
|
+
assert.equal(partition_weights.length, 2, 'partition_weights must be sized for 2 partitions');
|
|
31
|
+
|
|
32
|
+
partition_weights[0] = 0;
|
|
33
|
+
partition_weights[1] = 0;
|
|
34
|
+
// internal_degree and external_degree do not need pre-clearing — every
|
|
35
|
+
// vertex in [0, vertex_count) gets written in the per-vertex loop below,
|
|
36
|
+
// and we never read past vertex_count.
|
|
37
|
+
// boundary_position_of_vertex IS read conditionally (only boundary vertices
|
|
38
|
+
// get set), so it does need a clear — but bounded to the active subgraph
|
|
39
|
+
// range, since the scratch may be sized for a larger ancestor graph.
|
|
40
|
+
boundary_position_of_vertex.fill(-1, 0, vertex_count);
|
|
41
|
+
|
|
42
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
43
|
+
partition_weights[vertex_partition[v]] += vertex_weights[v];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let boundary_count = 0;
|
|
47
|
+
let cut_doubled = 0;
|
|
48
|
+
|
|
49
|
+
for (let vertex = 0; vertex < vertex_count; vertex++) {
|
|
50
|
+
const my_partition = vertex_partition[vertex];
|
|
51
|
+
|
|
52
|
+
let v_internal_degree = 0;
|
|
53
|
+
let v_external_degree = 0;
|
|
54
|
+
|
|
55
|
+
const edge_start = edge_addresses[vertex];
|
|
56
|
+
const edge_end = edge_addresses[vertex + 1];
|
|
57
|
+
for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
|
|
58
|
+
const neighbor_partition = vertex_partition[adjacency[edge_offset]];
|
|
59
|
+
const edge_weight = edge_weights[edge_offset];
|
|
60
|
+
if (neighbor_partition === my_partition) {
|
|
61
|
+
v_internal_degree += edge_weight;
|
|
62
|
+
} else {
|
|
63
|
+
v_external_degree += edge_weight;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
internal_degree[vertex] = v_internal_degree;
|
|
68
|
+
external_degree[vertex] = v_external_degree;
|
|
69
|
+
|
|
70
|
+
if (v_external_degree > 0 || edge_start === edge_end) {
|
|
71
|
+
// Add isolated vertices too — they're "boundary" in the degenerate sense
|
|
72
|
+
// that moving them is free. Matches METIS behaviour.
|
|
73
|
+
if (v_external_degree > 0) {
|
|
74
|
+
cut_doubled += v_external_degree;
|
|
75
|
+
boundary_vertices[boundary_count] = vertex;
|
|
76
|
+
boundary_position_of_vertex[vertex] = boundary_count;
|
|
77
|
+
boundary_count++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
graph.current_cut = cut_doubled >> 1;
|
|
83
|
+
graph.boundary_count = boundary_count;
|
|
84
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
|
|
3
|
+
*
|
|
4
|
+
* Maintains two max-heaps keyed by per-vertex gain (`external_degree − internal_degree`),
|
|
5
|
+
* one per side of the bisection. Each pass:
|
|
6
|
+
* 1. Insert every boundary vertex into the queue for its current side.
|
|
7
|
+
* 2. Repeatedly pop from whichever side is more overweight, move the vertex,
|
|
8
|
+
* and update neighbours. Track running cut and remember the best snapshot.
|
|
9
|
+
* 3. Stop when both queues drain, or when `LIMIT_NONIMPROVING_MOVES` moves
|
|
10
|
+
* pass without finding a better cut.
|
|
11
|
+
* 4. Roll back any moves made after the best-cut snapshot.
|
|
12
|
+
*
|
|
13
|
+
* Each vertex is locked after moving once (it can't move back in the same pass).
|
|
14
|
+
* Locking is reset between passes.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors `FM_2WayCutRefine` from libmetis/fm.c.
|
|
17
|
+
*
|
|
18
|
+
* All scratch state (heaps, moved-index, swap history, insertion order) is
|
|
19
|
+
* shared via the `BisectionScratch` passed in by the caller, sized to the
|
|
20
|
+
* coarsest graph's vertex_count. This eliminates per-trial allocation.
|
|
21
|
+
*
|
|
22
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
23
|
+
* @param {number} target_weight_for_partition_0
|
|
24
|
+
* @param {number} pass_count
|
|
25
|
+
* @param {function():number} random seeded RNG used to shuffle boundary
|
|
26
|
+
* insertion order so ties break differently each pass
|
|
27
|
+
* @param {import('./BisectionScratch.js').BisectionScratch} scratch
|
|
28
|
+
*/
|
|
29
|
+
export function fm_2way(graph: import('../MetisGraph.js').MetisGraph, target_weight_for_partition_0: number, pass_count: number, random: () => number, scratch: import('./BisectionScratch.js').BisectionScratch): void;
|
|
30
|
+
//# sourceMappingURL=fm_2way.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fm_2way.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/bisection/fm_2way.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,+BAPW,OAAO,kBAAkB,EAAE,UAAU,iCACrC,MAAM,cACN,MAAM,gBACK,MAAM,WAEjB,OAAO,uBAAuB,EAAE,gBAAgB,QAuQ1D"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
|
|
3
|
+
*
|
|
4
|
+
* Maintains two max-heaps keyed by per-vertex gain (`external_degree − internal_degree`),
|
|
5
|
+
* one per side of the bisection. Each pass:
|
|
6
|
+
* 1. Insert every boundary vertex into the queue for its current side.
|
|
7
|
+
* 2. Repeatedly pop from whichever side is more overweight, move the vertex,
|
|
8
|
+
* and update neighbours. Track running cut and remember the best snapshot.
|
|
9
|
+
* 3. Stop when both queues drain, or when `LIMIT_NONIMPROVING_MOVES` moves
|
|
10
|
+
* pass without finding a better cut.
|
|
11
|
+
* 4. Roll back any moves made after the best-cut snapshot.
|
|
12
|
+
*
|
|
13
|
+
* Each vertex is locked after moving once (it can't move back in the same pass).
|
|
14
|
+
* Locking is reset between passes.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors `FM_2WayCutRefine` from libmetis/fm.c.
|
|
17
|
+
*
|
|
18
|
+
* All scratch state (heaps, moved-index, swap history, insertion order) is
|
|
19
|
+
* shared via the `BisectionScratch` passed in by the caller, sized to the
|
|
20
|
+
* coarsest graph's vertex_count. This eliminates per-trial allocation.
|
|
21
|
+
*
|
|
22
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
23
|
+
* @param {number} target_weight_for_partition_0
|
|
24
|
+
* @param {number} pass_count
|
|
25
|
+
* @param {function():number} random seeded RNG used to shuffle boundary
|
|
26
|
+
* insertion order so ties break differently each pass
|
|
27
|
+
* @param {import('./BisectionScratch.js').BisectionScratch} scratch
|
|
28
|
+
*/
|
|
29
|
+
export function fm_2way(graph, target_weight_for_partition_0, pass_count, random, scratch) {
|
|
30
|
+
const vertex_count = graph.vertex_count;
|
|
31
|
+
const edge_addresses = graph.edge_addresses;
|
|
32
|
+
const adjacency = graph.adjacency;
|
|
33
|
+
const edge_weights = graph.edge_weights;
|
|
34
|
+
const vertex_weights = graph.vertex_weights;
|
|
35
|
+
const vertex_partition = graph.vertex_partition;
|
|
36
|
+
const partition_weights = graph.partition_weights;
|
|
37
|
+
const internal_degree = graph.internal_degree;
|
|
38
|
+
const external_degree = graph.external_degree;
|
|
39
|
+
const boundary_vertices = graph.boundary_vertices;
|
|
40
|
+
const boundary_position_of_vertex = graph.boundary_position_of_vertex;
|
|
41
|
+
|
|
42
|
+
if (vertex_count === 0 || graph.boundary_count === 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const target_weight_0 = target_weight_for_partition_0;
|
|
47
|
+
const target_weight_1 = graph.total_vertex_weight - target_weight_for_partition_0;
|
|
48
|
+
|
|
49
|
+
// METIS heuristic: stop a pass after this many moves with no improvement.
|
|
50
|
+
const limit_nonimproving_moves = Math.min(Math.max(Math.floor(0.01 * vertex_count), 15), 100);
|
|
51
|
+
|
|
52
|
+
// METIS uses this for a "close enough to mincut" tolerance when picking
|
|
53
|
+
// the best snapshot — avoids overreacting to small noise in pwgt-balance.
|
|
54
|
+
const avg_vertex_weight = Math.min(
|
|
55
|
+
Math.floor((partition_weights[0] + partition_weights[1]) / 20),
|
|
56
|
+
Math.floor(2 * (partition_weights[0] + partition_weights[1]) / vertex_count)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const queues = scratch.fm_heaps;
|
|
60
|
+
const moved_pass_index = scratch.fm_moved_pass_index;
|
|
61
|
+
const swap_history = scratch.fm_swap_history;
|
|
62
|
+
const insertion_order = scratch.fm_insertion_order;
|
|
63
|
+
|
|
64
|
+
const initial_partition_0_diff = Math.abs(target_weight_0 - partition_weights[0]);
|
|
65
|
+
|
|
66
|
+
for (let pass = 0; pass < pass_count; pass++) {
|
|
67
|
+
queues[0].clear();
|
|
68
|
+
queues[1].clear();
|
|
69
|
+
|
|
70
|
+
let best_cut = graph.current_cut;
|
|
71
|
+
let best_partition_diff = Math.abs(target_weight_0 - partition_weights[0]);
|
|
72
|
+
let best_cut_swap_index = -1;
|
|
73
|
+
let running_cut = best_cut;
|
|
74
|
+
let initial_cut_this_pass = best_cut;
|
|
75
|
+
|
|
76
|
+
let boundary_count = graph.boundary_count;
|
|
77
|
+
|
|
78
|
+
// Insert boundary vertices in random order so ties break differently each pass.
|
|
79
|
+
for (let i = 0; i < boundary_count; i++) {
|
|
80
|
+
insertion_order[i] = i;
|
|
81
|
+
}
|
|
82
|
+
// Fisher–Yates shuffle of insertion_order[0..boundary_count)
|
|
83
|
+
for (let i = boundary_count - 1; i > 0; i--) {
|
|
84
|
+
const j = (random() * (i + 1)) | 0;
|
|
85
|
+
if (j !== i) {
|
|
86
|
+
const tmp = insertion_order[i];
|
|
87
|
+
insertion_order[i] = insertion_order[j];
|
|
88
|
+
insertion_order[j] = tmp;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (let i = 0; i < boundary_count; i++) {
|
|
92
|
+
const vertex = boundary_vertices[insertion_order[i]];
|
|
93
|
+
const gain = external_degree[vertex] - internal_degree[vertex];
|
|
94
|
+
queues[vertex_partition[vertex]].insert(vertex, gain);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let swap_count = 0;
|
|
98
|
+
for (; swap_count < vertex_count; swap_count++) {
|
|
99
|
+
// Pick the side that's more overweight (or equivalently, more under-target).
|
|
100
|
+
const from_side = (target_weight_0 - partition_weights[0]) < (target_weight_1 - partition_weights[1]) ? 0 : 1;
|
|
101
|
+
const to_side = 1 - from_side;
|
|
102
|
+
|
|
103
|
+
const high_gain_vertex = queues[from_side].pop_max();
|
|
104
|
+
if (high_gain_vertex === -1) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const gain = external_degree[high_gain_vertex] - internal_degree[high_gain_vertex];
|
|
109
|
+
running_cut -= gain;
|
|
110
|
+
|
|
111
|
+
partition_weights[from_side] -= vertex_weights[high_gain_vertex];
|
|
112
|
+
partition_weights[to_side] += vertex_weights[high_gain_vertex];
|
|
113
|
+
|
|
114
|
+
const new_partition_diff = Math.abs(target_weight_0 - partition_weights[0]);
|
|
115
|
+
|
|
116
|
+
const improves_cut_within_balance = (
|
|
117
|
+
running_cut < best_cut &&
|
|
118
|
+
new_partition_diff <= initial_partition_0_diff + avg_vertex_weight
|
|
119
|
+
);
|
|
120
|
+
const matches_cut_but_better_balance = (
|
|
121
|
+
running_cut === best_cut &&
|
|
122
|
+
new_partition_diff < best_partition_diff
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (improves_cut_within_balance || matches_cut_but_better_balance) {
|
|
126
|
+
best_cut = running_cut;
|
|
127
|
+
best_partition_diff = new_partition_diff;
|
|
128
|
+
best_cut_swap_index = swap_count;
|
|
129
|
+
} else if (swap_count - best_cut_swap_index > limit_nonimproving_moves) {
|
|
130
|
+
// Pass has gone too long without improvement — undo this last move and stop.
|
|
131
|
+
running_cut += gain;
|
|
132
|
+
partition_weights[from_side] += vertex_weights[high_gain_vertex];
|
|
133
|
+
partition_weights[to_side] -= vertex_weights[high_gain_vertex];
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
vertex_partition[high_gain_vertex] = to_side;
|
|
138
|
+
moved_pass_index[high_gain_vertex] = swap_count;
|
|
139
|
+
swap_history[swap_count] = high_gain_vertex;
|
|
140
|
+
|
|
141
|
+
// After the move, swap id/ed for the moved vertex:
|
|
142
|
+
// edges that used to be external (going to `to_side`) are now internal,
|
|
143
|
+
// and vice versa.
|
|
144
|
+
{
|
|
145
|
+
const tmp = internal_degree[high_gain_vertex];
|
|
146
|
+
internal_degree[high_gain_vertex] = external_degree[high_gain_vertex];
|
|
147
|
+
external_degree[high_gain_vertex] = tmp;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Maybe drop the moved vertex from the boundary.
|
|
151
|
+
if (external_degree[high_gain_vertex] === 0 && edge_addresses[high_gain_vertex] < edge_addresses[high_gain_vertex + 1]) {
|
|
152
|
+
const bp = boundary_position_of_vertex[high_gain_vertex];
|
|
153
|
+
if (bp !== -1) {
|
|
154
|
+
const last = boundary_count - 1;
|
|
155
|
+
if (bp !== last) {
|
|
156
|
+
const moved_to_bp = boundary_vertices[last];
|
|
157
|
+
boundary_vertices[bp] = moved_to_bp;
|
|
158
|
+
boundary_position_of_vertex[moved_to_bp] = bp;
|
|
159
|
+
}
|
|
160
|
+
boundary_position_of_vertex[high_gain_vertex] = -1;
|
|
161
|
+
boundary_count = last;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Update id/ed of neighbours, their boundary membership, and their queue positions.
|
|
166
|
+
const edge_start = edge_addresses[high_gain_vertex];
|
|
167
|
+
const edge_end = edge_addresses[high_gain_vertex + 1];
|
|
168
|
+
for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
|
|
169
|
+
const neighbor = adjacency[edge_offset];
|
|
170
|
+
const ewgt = edge_weights[edge_offset];
|
|
171
|
+
const signed_ewgt = (to_side === vertex_partition[neighbor]) ? ewgt : -ewgt;
|
|
172
|
+
internal_degree[neighbor] += signed_ewgt;
|
|
173
|
+
external_degree[neighbor] -= signed_ewgt;
|
|
174
|
+
|
|
175
|
+
const n_was_on_boundary = boundary_position_of_vertex[neighbor] !== -1;
|
|
176
|
+
|
|
177
|
+
if (n_was_on_boundary) {
|
|
178
|
+
if (external_degree[neighbor] === 0) {
|
|
179
|
+
// Drop from boundary
|
|
180
|
+
const bp = boundary_position_of_vertex[neighbor];
|
|
181
|
+
const last = boundary_count - 1;
|
|
182
|
+
if (bp !== last) {
|
|
183
|
+
const moved_to_bp = boundary_vertices[last];
|
|
184
|
+
boundary_vertices[bp] = moved_to_bp;
|
|
185
|
+
boundary_position_of_vertex[moved_to_bp] = bp;
|
|
186
|
+
}
|
|
187
|
+
boundary_position_of_vertex[neighbor] = -1;
|
|
188
|
+
boundary_count = last;
|
|
189
|
+
if (moved_pass_index[neighbor] === -1) {
|
|
190
|
+
queues[vertex_partition[neighbor]].remove(neighbor);
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
// Still on boundary, update queue priority
|
|
194
|
+
if (moved_pass_index[neighbor] === -1) {
|
|
195
|
+
const updated_gain = external_degree[neighbor] - internal_degree[neighbor];
|
|
196
|
+
queues[vertex_partition[neighbor]].update(neighbor, updated_gain);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
} else {
|
|
200
|
+
if (external_degree[neighbor] > 0) {
|
|
201
|
+
// New boundary vertex
|
|
202
|
+
boundary_vertices[boundary_count] = neighbor;
|
|
203
|
+
boundary_position_of_vertex[neighbor] = boundary_count;
|
|
204
|
+
boundary_count++;
|
|
205
|
+
if (moved_pass_index[neighbor] === -1) {
|
|
206
|
+
const initial_gain = external_degree[neighbor] - internal_degree[neighbor];
|
|
207
|
+
queues[vertex_partition[neighbor]].insert(neighbor, initial_gain);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Reset moved-status for vertices we touched this pass. Preserves the
|
|
215
|
+
// "all -1" invariant for the shared moved_pass_index across calls.
|
|
216
|
+
for (let i = 0; i < swap_count; i++) {
|
|
217
|
+
moved_pass_index[swap_history[i]] = -1;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Roll back any moves made after best_cut_swap_index.
|
|
221
|
+
for (let i = swap_count - 1; i > best_cut_swap_index; i--) {
|
|
222
|
+
const vertex = swap_history[i];
|
|
223
|
+
const flipped_from = vertex_partition[vertex];
|
|
224
|
+
const flipped_to = 1 - flipped_from;
|
|
225
|
+
vertex_partition[vertex] = flipped_to;
|
|
226
|
+
|
|
227
|
+
// Swap id/ed back
|
|
228
|
+
{
|
|
229
|
+
const tmp = internal_degree[vertex];
|
|
230
|
+
internal_degree[vertex] = external_degree[vertex];
|
|
231
|
+
external_degree[vertex] = tmp;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Maybe re-add or remove from boundary based on new ed
|
|
235
|
+
if (external_degree[vertex] === 0 && boundary_position_of_vertex[vertex] !== -1 && edge_addresses[vertex] < edge_addresses[vertex + 1]) {
|
|
236
|
+
const bp = boundary_position_of_vertex[vertex];
|
|
237
|
+
const last = boundary_count - 1;
|
|
238
|
+
if (bp !== last) {
|
|
239
|
+
const moved_to_bp = boundary_vertices[last];
|
|
240
|
+
boundary_vertices[bp] = moved_to_bp;
|
|
241
|
+
boundary_position_of_vertex[moved_to_bp] = bp;
|
|
242
|
+
}
|
|
243
|
+
boundary_position_of_vertex[vertex] = -1;
|
|
244
|
+
boundary_count = last;
|
|
245
|
+
} else if (external_degree[vertex] > 0 && boundary_position_of_vertex[vertex] === -1) {
|
|
246
|
+
boundary_vertices[boundary_count] = vertex;
|
|
247
|
+
boundary_position_of_vertex[vertex] = boundary_count;
|
|
248
|
+
boundary_count++;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
partition_weights[flipped_from] -= vertex_weights[vertex];
|
|
252
|
+
partition_weights[flipped_to] += vertex_weights[vertex];
|
|
253
|
+
|
|
254
|
+
// Update neighbours
|
|
255
|
+
const edge_start = edge_addresses[vertex];
|
|
256
|
+
const edge_end = edge_addresses[vertex + 1];
|
|
257
|
+
for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
|
|
258
|
+
const neighbor = adjacency[edge_offset];
|
|
259
|
+
const ewgt = edge_weights[edge_offset];
|
|
260
|
+
const signed_ewgt = (flipped_to === vertex_partition[neighbor]) ? ewgt : -ewgt;
|
|
261
|
+
internal_degree[neighbor] += signed_ewgt;
|
|
262
|
+
external_degree[neighbor] -= signed_ewgt;
|
|
263
|
+
|
|
264
|
+
if (boundary_position_of_vertex[neighbor] !== -1 && external_degree[neighbor] === 0) {
|
|
265
|
+
const bp = boundary_position_of_vertex[neighbor];
|
|
266
|
+
const last = boundary_count - 1;
|
|
267
|
+
if (bp !== last) {
|
|
268
|
+
const moved_to_bp = boundary_vertices[last];
|
|
269
|
+
boundary_vertices[bp] = moved_to_bp;
|
|
270
|
+
boundary_position_of_vertex[moved_to_bp] = bp;
|
|
271
|
+
}
|
|
272
|
+
boundary_position_of_vertex[neighbor] = -1;
|
|
273
|
+
boundary_count = last;
|
|
274
|
+
}
|
|
275
|
+
if (boundary_position_of_vertex[neighbor] === -1 && external_degree[neighbor] > 0) {
|
|
276
|
+
boundary_vertices[boundary_count] = neighbor;
|
|
277
|
+
boundary_position_of_vertex[neighbor] = boundary_count;
|
|
278
|
+
boundary_count++;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
graph.current_cut = best_cut;
|
|
284
|
+
graph.boundary_count = boundary_count;
|
|
285
|
+
|
|
286
|
+
if (best_cut_swap_index <= 0 || best_cut === initial_cut_this_pass) {
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|