@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,138 @@
|
|
|
1
|
+
import { assert } from "../../../../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* From a freshly-assigned `vertex_partition[]`, populate the rest of the k-way
|
|
5
|
+
* refinement state: per-partition weights, per-vertex internal/external degree,
|
|
6
|
+
* the neighbour-partition list (via `neighbor_partition_pool`), the boundary
|
|
7
|
+
* list, and the total edge cut.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors `ComputeKWayPartitionParams` from libmetis/kwayrefine.c, cut-objective
|
|
10
|
+
* branch only.
|
|
11
|
+
*
|
|
12
|
+
* Boundary insertion rule (refinement-type boundary): a vertex is added to the
|
|
13
|
+
* boundary when `external_degree >= internal_degree`. That captures "worth
|
|
14
|
+
* considering for a move" — vertices with no external pull aren't candidates.
|
|
15
|
+
*
|
|
16
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
17
|
+
* @param {number} partition_count
|
|
18
|
+
*/
|
|
19
|
+
export function compute_kway_params(graph, partition_count) {
|
|
20
|
+
const vertex_count = graph.vertex_count;
|
|
21
|
+
const edge_addresses = graph.edge_addresses;
|
|
22
|
+
const adjacency = graph.adjacency;
|
|
23
|
+
const edge_weights = graph.edge_weights;
|
|
24
|
+
const vertex_weights = graph.vertex_weights;
|
|
25
|
+
const vertex_partition = graph.vertex_partition;
|
|
26
|
+
const partition_weights = graph.partition_weights;
|
|
27
|
+
const internal_degree = graph.internal_degree;
|
|
28
|
+
const external_degree = graph.external_degree;
|
|
29
|
+
const neighbor_partition_count = graph.neighbor_partition_count;
|
|
30
|
+
const neighbor_partition_offset = graph.neighbor_partition_offset;
|
|
31
|
+
const boundary_vertices = graph.boundary_vertices;
|
|
32
|
+
const boundary_position_of_vertex = graph.boundary_position_of_vertex;
|
|
33
|
+
const neighbor_partition_pool = graph.neighbor_partition_pool;
|
|
34
|
+
|
|
35
|
+
assert.equal(vertex_partition !== null, true, 'graph.vertex_partition must be allocated');
|
|
36
|
+
assert.equal(neighbor_partition_pool !== null, true, 'graph.neighbor_partition_pool must be allocated');
|
|
37
|
+
|
|
38
|
+
partition_weights.fill(0);
|
|
39
|
+
internal_degree.fill(0);
|
|
40
|
+
external_degree.fill(0);
|
|
41
|
+
neighbor_partition_count.fill(0);
|
|
42
|
+
neighbor_partition_offset.fill(-1);
|
|
43
|
+
boundary_position_of_vertex.fill(-1);
|
|
44
|
+
neighbor_partition_pool.clear();
|
|
45
|
+
|
|
46
|
+
// Recompute partition weights from `vertex_partition`. initial_kway_bfs
|
|
47
|
+
// already produces these, but refinement passes invalidate the count, so
|
|
48
|
+
// recompute unconditionally to keep this routine self-contained.
|
|
49
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
50
|
+
partition_weights[vertex_partition[v]] += vertex_weights[v];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Scratch arrays for per-vertex neighbour-partition deduplication:
|
|
54
|
+
// `scratch_partition_position[p]` = where in `scratch_partition_id` /
|
|
55
|
+
// `scratch_partition_edge_weight` we've stored partition p for the current
|
|
56
|
+
// vertex, or -1 if p hasn't been seen yet for this vertex.
|
|
57
|
+
const scratch_partition_position = new Int32Array(partition_count);
|
|
58
|
+
scratch_partition_position.fill(-1);
|
|
59
|
+
|
|
60
|
+
// A vertex's distinct neighbour-partition count never exceeds its degree
|
|
61
|
+
// nor `partition_count`; `partition_count` is the safe upper bound on
|
|
62
|
+
// scratch size.
|
|
63
|
+
const scratch_partition_id = new Uint32Array(partition_count);
|
|
64
|
+
const scratch_partition_edge_weight = new Uint32Array(partition_count);
|
|
65
|
+
|
|
66
|
+
let boundary_count = 0;
|
|
67
|
+
let cut_doubled = 0;
|
|
68
|
+
|
|
69
|
+
const pool_data = neighbor_partition_pool.data_uint32;
|
|
70
|
+
|
|
71
|
+
for (let vertex = 0; vertex < vertex_count; vertex++) {
|
|
72
|
+
const my_partition = vertex_partition[vertex];
|
|
73
|
+
|
|
74
|
+
let v_internal_degree = 0;
|
|
75
|
+
let v_external_degree = 0;
|
|
76
|
+
let distinct_neighbor_partitions = 0;
|
|
77
|
+
|
|
78
|
+
const edge_start = edge_addresses[vertex];
|
|
79
|
+
const edge_end = edge_addresses[vertex + 1];
|
|
80
|
+
for (let edge_offset = edge_start; edge_offset < edge_end; edge_offset++) {
|
|
81
|
+
const neighbor_partition = vertex_partition[adjacency[edge_offset]];
|
|
82
|
+
const edge_weight = edge_weights[edge_offset];
|
|
83
|
+
if (neighbor_partition === my_partition) {
|
|
84
|
+
v_internal_degree += edge_weight;
|
|
85
|
+
} else {
|
|
86
|
+
v_external_degree += edge_weight;
|
|
87
|
+
const existing_position = scratch_partition_position[neighbor_partition];
|
|
88
|
+
if (existing_position === -1) {
|
|
89
|
+
scratch_partition_position[neighbor_partition] = distinct_neighbor_partitions;
|
|
90
|
+
scratch_partition_id[distinct_neighbor_partitions] = neighbor_partition;
|
|
91
|
+
scratch_partition_edge_weight[distinct_neighbor_partitions] = edge_weight;
|
|
92
|
+
distinct_neighbor_partitions++;
|
|
93
|
+
} else {
|
|
94
|
+
scratch_partition_edge_weight[existing_position] += edge_weight;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
internal_degree[vertex] = v_internal_degree;
|
|
100
|
+
external_degree[vertex] = v_external_degree;
|
|
101
|
+
|
|
102
|
+
if (v_external_degree > 0) {
|
|
103
|
+
cut_doubled += v_external_degree;
|
|
104
|
+
|
|
105
|
+
// Reserve pool slots sized to the vertex's degree (not just the
|
|
106
|
+
// current distinct-neighbour-partition count). fm_kway can grow
|
|
107
|
+
// a vertex's neighbour-partition list when its neighbours move
|
|
108
|
+
// and introduce a new partition; we need room.
|
|
109
|
+
const degree = edge_end - edge_start;
|
|
110
|
+
const pool_record_offset = neighbor_partition_pool.allocate_continuous(degree);
|
|
111
|
+
neighbor_partition_offset[vertex] = pool_record_offset;
|
|
112
|
+
neighbor_partition_count[vertex] = distinct_neighbor_partitions;
|
|
113
|
+
|
|
114
|
+
// Each pool record is 8 bytes = 2 uint32 words: (partition_id, edge_weight).
|
|
115
|
+
const word_base = neighbor_partition_pool.element_word(pool_record_offset);
|
|
116
|
+
for (let nbr = 0; nbr < distinct_neighbor_partitions; nbr++) {
|
|
117
|
+
pool_data[word_base + nbr * 2] = scratch_partition_id[nbr];
|
|
118
|
+
pool_data[word_base + nbr * 2 + 1] = scratch_partition_edge_weight[nbr];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (v_external_degree >= v_internal_degree) {
|
|
122
|
+
boundary_vertices[boundary_count] = vertex;
|
|
123
|
+
boundary_position_of_vertex[vertex] = boundary_count;
|
|
124
|
+
boundary_count++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Reset only the touched scratch entries.
|
|
129
|
+
for (let nbr = 0; nbr < distinct_neighbor_partitions; nbr++) {
|
|
130
|
+
scratch_partition_position[scratch_partition_id[nbr]] = -1;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Each crossing edge contributes to both endpoints' external_degree, so we
|
|
135
|
+
// counted it twice across the loop above.
|
|
136
|
+
graph.current_cut = cut_doubled >> 1;
|
|
137
|
+
graph.boundary_count = boundary_count;
|
|
138
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* K-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
|
|
3
|
+
*
|
|
4
|
+
* For each pass:
|
|
5
|
+
* 1. Insert all boundary vertices into a max-heap keyed by
|
|
6
|
+
* `gain = external_degree / sqrt(neighbor_partition_count) - internal_degree`.
|
|
7
|
+
* 2. Repeatedly pop the highest-gain vertex. Find the best target partition
|
|
8
|
+
* satisfying either the standard balance bounds OR a balance-improvement
|
|
9
|
+
* exception. Commit the move.
|
|
10
|
+
* 3. Each move incrementally updates id/ed/nbrs for the moved vertex and all
|
|
11
|
+
* its neighbours, including queue priorities and boundary membership.
|
|
12
|
+
*
|
|
13
|
+
* The pass terminates when the heap drains or no further moves help. Multiple
|
|
14
|
+
* passes are run (default 10) until cut stops improving.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors `Greedy_KWayCutOptimize` from libmetis/kwayfm.c master (post-5.1.0),
|
|
17
|
+
* OMODE_REFINE branch. Three master-era refinements over the 5.1.0 baseline:
|
|
18
|
+
*
|
|
19
|
+
* - **Adaptive ub_factor**: at start, expand `ub_factor` to match the current
|
|
20
|
+
* load imbalance if the graph is already worse than the configured bound.
|
|
21
|
+
* Without this, refinement starting from an imbalanced state can't legally
|
|
22
|
+
* act on it and gets stuck.
|
|
23
|
+
* - **No `fudge_factor` slack** on the max-weight check (master forces this to
|
|
24
|
+
* 0 internally). The looser balance comes from the adaptive ub_factor instead.
|
|
25
|
+
* - **Balance-improvement exception**: a move that violates the strict balance
|
|
26
|
+
* bound is still allowed if it improves the proportional balance ratio
|
|
27
|
+
* between `from` and `to`. Lets refinement pull weight back toward the
|
|
28
|
+
* target over time.
|
|
29
|
+
*
|
|
30
|
+
* Skipped:
|
|
31
|
+
* - minconn (sub-domain connectivity minimisation)
|
|
32
|
+
* - contig (contiguous-partition articulation-point checks)
|
|
33
|
+
* - ncon > 1 (multi-constraint balance)
|
|
34
|
+
* - OMODE_BALANCE (we run REFINE only; the adaptive ub_factor recovers most
|
|
35
|
+
* of what an explicit BALANCE pass would have done)
|
|
36
|
+
*
|
|
37
|
+
* Assumes `compute_kway_params` (or `project_kway`) has populated the refinement
|
|
38
|
+
* state on the graph.
|
|
39
|
+
*
|
|
40
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
41
|
+
* @param {number} partition_count
|
|
42
|
+
* @param {{
|
|
43
|
+
* random: function():number,
|
|
44
|
+
* pass_count?: number,
|
|
45
|
+
* ub_factor?: number,
|
|
46
|
+
* fudge_factor?: number,
|
|
47
|
+
* }} opts
|
|
48
|
+
* `ub_factor` (default 1.03) caps `partition_weight` at `target × ub_factor`.
|
|
49
|
+
* Will be expanded automatically if the input is already more imbalanced.
|
|
50
|
+
* `fudge_factor` (default 0; master sets this to 0). Set non-zero to allow
|
|
51
|
+
* positive-gain moves to overshoot the max bound by `fudge_factor × gain`.
|
|
52
|
+
* @param {import('./RefinementScratch.js').RefinementScratch} scratch shared
|
|
53
|
+
* scratch sized to the original (finest) graph's vertex_count and the same
|
|
54
|
+
* partition_count used here
|
|
55
|
+
* @returns {number} total moves committed across all passes
|
|
56
|
+
*/
|
|
57
|
+
export function fm_kway(graph: import('../MetisGraph.js').MetisGraph, partition_count: number, opts: {
|
|
58
|
+
random: () => number;
|
|
59
|
+
pass_count?: number;
|
|
60
|
+
ub_factor?: number;
|
|
61
|
+
fudge_factor?: number;
|
|
62
|
+
}, scratch: import('./RefinementScratch.js').RefinementScratch): number;
|
|
63
|
+
//# sourceMappingURL=fm_kway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fm_kway.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/graph/metis/native/refine/fm_kway.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,+BAjBW,OAAO,kBAAkB,EAAE,UAAU,mBACrC,MAAM;kBAEO,MAAM;iBACZ,MAAM;gBACP,MAAM;mBACH,MAAM;YAMf,OAAO,wBAAwB,EAAE,iBAAiB,GAGhD,MAAM,CAgZlB"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
// Per-vertex membership state for the priority queue. Each pass starts with
|
|
2
|
+
// every vertex NOT_PRESENT, boundary vertices get inserted (PRESENT), and once
|
|
3
|
+
// processed they become EXTRACTED so they don't get re-inserted within the pass.
|
|
4
|
+
const QUEUE_STATUS_NOT_PRESENT = 0;
|
|
5
|
+
const QUEUE_STATUS_PRESENT = 1;
|
|
6
|
+
const QUEUE_STATUS_EXTRACTED = 2;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* K-way Fiduccia–Mattheyses cut refinement (single-constraint, cut objective).
|
|
10
|
+
*
|
|
11
|
+
* For each pass:
|
|
12
|
+
* 1. Insert all boundary vertices into a max-heap keyed by
|
|
13
|
+
* `gain = external_degree / sqrt(neighbor_partition_count) - internal_degree`.
|
|
14
|
+
* 2. Repeatedly pop the highest-gain vertex. Find the best target partition
|
|
15
|
+
* satisfying either the standard balance bounds OR a balance-improvement
|
|
16
|
+
* exception. Commit the move.
|
|
17
|
+
* 3. Each move incrementally updates id/ed/nbrs for the moved vertex and all
|
|
18
|
+
* its neighbours, including queue priorities and boundary membership.
|
|
19
|
+
*
|
|
20
|
+
* The pass terminates when the heap drains or no further moves help. Multiple
|
|
21
|
+
* passes are run (default 10) until cut stops improving.
|
|
22
|
+
*
|
|
23
|
+
* Mirrors `Greedy_KWayCutOptimize` from libmetis/kwayfm.c master (post-5.1.0),
|
|
24
|
+
* OMODE_REFINE branch. Three master-era refinements over the 5.1.0 baseline:
|
|
25
|
+
*
|
|
26
|
+
* - **Adaptive ub_factor**: at start, expand `ub_factor` to match the current
|
|
27
|
+
* load imbalance if the graph is already worse than the configured bound.
|
|
28
|
+
* Without this, refinement starting from an imbalanced state can't legally
|
|
29
|
+
* act on it and gets stuck.
|
|
30
|
+
* - **No `fudge_factor` slack** on the max-weight check (master forces this to
|
|
31
|
+
* 0 internally). The looser balance comes from the adaptive ub_factor instead.
|
|
32
|
+
* - **Balance-improvement exception**: a move that violates the strict balance
|
|
33
|
+
* bound is still allowed if it improves the proportional balance ratio
|
|
34
|
+
* between `from` and `to`. Lets refinement pull weight back toward the
|
|
35
|
+
* target over time.
|
|
36
|
+
*
|
|
37
|
+
* Skipped:
|
|
38
|
+
* - minconn (sub-domain connectivity minimisation)
|
|
39
|
+
* - contig (contiguous-partition articulation-point checks)
|
|
40
|
+
* - ncon > 1 (multi-constraint balance)
|
|
41
|
+
* - OMODE_BALANCE (we run REFINE only; the adaptive ub_factor recovers most
|
|
42
|
+
* of what an explicit BALANCE pass would have done)
|
|
43
|
+
*
|
|
44
|
+
* Assumes `compute_kway_params` (or `project_kway`) has populated the refinement
|
|
45
|
+
* state on the graph.
|
|
46
|
+
*
|
|
47
|
+
* @param {import('../MetisGraph.js').MetisGraph} graph
|
|
48
|
+
* @param {number} partition_count
|
|
49
|
+
* @param {{
|
|
50
|
+
* random: function():number,
|
|
51
|
+
* pass_count?: number,
|
|
52
|
+
* ub_factor?: number,
|
|
53
|
+
* fudge_factor?: number,
|
|
54
|
+
* }} opts
|
|
55
|
+
* `ub_factor` (default 1.03) caps `partition_weight` at `target × ub_factor`.
|
|
56
|
+
* Will be expanded automatically if the input is already more imbalanced.
|
|
57
|
+
* `fudge_factor` (default 0; master sets this to 0). Set non-zero to allow
|
|
58
|
+
* positive-gain moves to overshoot the max bound by `fudge_factor × gain`.
|
|
59
|
+
* @param {import('./RefinementScratch.js').RefinementScratch} scratch shared
|
|
60
|
+
* scratch sized to the original (finest) graph's vertex_count and the same
|
|
61
|
+
* partition_count used here
|
|
62
|
+
* @returns {number} total moves committed across all passes
|
|
63
|
+
*/
|
|
64
|
+
export function fm_kway(graph, partition_count, opts, scratch) {
|
|
65
|
+
const random = opts.random;
|
|
66
|
+
const pass_count = opts.pass_count !== undefined ? opts.pass_count : 10;
|
|
67
|
+
const configured_ub_factor = opts.ub_factor !== undefined ? opts.ub_factor : 1.03;
|
|
68
|
+
const fudge_factor = opts.fudge_factor !== undefined ? opts.fudge_factor : 0.0;
|
|
69
|
+
|
|
70
|
+
const vertex_count = graph.vertex_count;
|
|
71
|
+
const edge_addresses = graph.edge_addresses;
|
|
72
|
+
const adjacency = graph.adjacency;
|
|
73
|
+
const edge_weights = graph.edge_weights;
|
|
74
|
+
const vertex_weights = graph.vertex_weights;
|
|
75
|
+
const vertex_partition = graph.vertex_partition;
|
|
76
|
+
const partition_weights = graph.partition_weights;
|
|
77
|
+
const boundary_vertices = graph.boundary_vertices;
|
|
78
|
+
const boundary_position_of_vertex = graph.boundary_position_of_vertex;
|
|
79
|
+
const internal_degree = graph.internal_degree;
|
|
80
|
+
const external_degree = graph.external_degree;
|
|
81
|
+
const neighbor_partition_count = graph.neighbor_partition_count;
|
|
82
|
+
const neighbor_partition_offset = graph.neighbor_partition_offset;
|
|
83
|
+
const neighbor_partition_pool = graph.neighbor_partition_pool;
|
|
84
|
+
|
|
85
|
+
// Adaptive ub_factor: if the input is already more imbalanced than the
|
|
86
|
+
// configured target, expand the bound so refinement can act on the
|
|
87
|
+
// imbalanced state instead of being stuck refusing every move. Mirrors
|
|
88
|
+
// master's `gk_max(ctrl->ubfactors[0], ComputeLoadImbalance(...))`.
|
|
89
|
+
const target_partition_weight = graph.total_vertex_weight / partition_count;
|
|
90
|
+
let current_max_imbalance_ratio = 1.0;
|
|
91
|
+
for (let p = 0; p < partition_count; p++) {
|
|
92
|
+
const ratio = partition_weights[p] / target_partition_weight;
|
|
93
|
+
if (ratio > current_max_imbalance_ratio) {
|
|
94
|
+
current_max_imbalance_ratio = ratio;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const effective_ub_factor = Math.max(configured_ub_factor, current_max_imbalance_ratio);
|
|
98
|
+
|
|
99
|
+
const partition_weight_min = scratch.partition_weight_min;
|
|
100
|
+
const partition_weight_max = scratch.partition_weight_max;
|
|
101
|
+
for (let p = 0; p < partition_count; p++) {
|
|
102
|
+
partition_weight_max[p] = Math.ceil(target_partition_weight * effective_ub_factor);
|
|
103
|
+
partition_weight_min[p] = Math.max(1, Math.floor(target_partition_weight / effective_ub_factor));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// All from shared scratch — no per-call allocation.
|
|
107
|
+
// queue_status and touched_position_of_vertex preserve their clean state
|
|
108
|
+
// (all-0 and all-(-1) respectively) across calls via the per-pass cleanup
|
|
109
|
+
// at the end of the main loop.
|
|
110
|
+
const move_queue = scratch.move_queue;
|
|
111
|
+
const queue_status = scratch.queue_status;
|
|
112
|
+
const touched_vertices = scratch.touched_vertices;
|
|
113
|
+
const touched_position_of_vertex = scratch.touched_position_of_vertex;
|
|
114
|
+
|
|
115
|
+
let total_moves = 0;
|
|
116
|
+
|
|
117
|
+
for (let pass = 0; pass < pass_count; pass++) {
|
|
118
|
+
const cut_at_pass_start = graph.current_cut;
|
|
119
|
+
let boundary_count = graph.boundary_count;
|
|
120
|
+
let touched_count = 0;
|
|
121
|
+
let moves_this_pass = 0;
|
|
122
|
+
|
|
123
|
+
move_queue.clear();
|
|
124
|
+
|
|
125
|
+
// Shuffle the boundary order before insertion. Heap ordering means
|
|
126
|
+
// visitation order doesn't change which vertex pops next, but it
|
|
127
|
+
// breaks ties differently each pass, which helps escape local minima.
|
|
128
|
+
// `touched_vertices` is reused as scratch for the shuffle.
|
|
129
|
+
for (let i = 0; i < boundary_count; i++) {
|
|
130
|
+
touched_vertices[i] = i;
|
|
131
|
+
}
|
|
132
|
+
for (let i = boundary_count - 1; i > 0; i--) {
|
|
133
|
+
const j = (random() * (i + 1)) | 0;
|
|
134
|
+
if (j !== i) {
|
|
135
|
+
const tmp = touched_vertices[i];
|
|
136
|
+
touched_vertices[i] = touched_vertices[j];
|
|
137
|
+
touched_vertices[j] = tmp;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (let i = 0; i < boundary_count; i++) {
|
|
141
|
+
const vertex = boundary_vertices[touched_vertices[i]];
|
|
142
|
+
const v_external_degree = external_degree[vertex];
|
|
143
|
+
const v_internal_degree = internal_degree[vertex];
|
|
144
|
+
const v_nbr_partition_count = neighbor_partition_count[vertex];
|
|
145
|
+
const gain = v_nbr_partition_count > 0
|
|
146
|
+
? v_external_degree / Math.sqrt(v_nbr_partition_count) - v_internal_degree
|
|
147
|
+
: -v_internal_degree;
|
|
148
|
+
move_queue.insert(vertex, gain);
|
|
149
|
+
queue_status[vertex] = QUEUE_STATUS_PRESENT;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Build the touched-list properly (the scratch values above are now
|
|
153
|
+
// wrong since they were boundary indices, not vertex ids).
|
|
154
|
+
touched_count = boundary_count;
|
|
155
|
+
for (let i = 0; i < boundary_count; i++) {
|
|
156
|
+
const vertex = boundary_vertices[i];
|
|
157
|
+
touched_vertices[i] = vertex;
|
|
158
|
+
touched_position_of_vertex[vertex] = i;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ===== Main move loop ============================================
|
|
162
|
+
for (;;) {
|
|
163
|
+
const vertex = move_queue.pop_max();
|
|
164
|
+
if (vertex === -1) {
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
queue_status[vertex] = QUEUE_STATUS_EXTRACTED;
|
|
168
|
+
|
|
169
|
+
const from_partition = vertex_partition[vertex];
|
|
170
|
+
const vertex_weight = vertex_weights[vertex];
|
|
171
|
+
const v_internal_degree = internal_degree[vertex];
|
|
172
|
+
const v_external_degree = external_degree[vertex];
|
|
173
|
+
const v_nbr_partition_count = neighbor_partition_count[vertex];
|
|
174
|
+
const v_pool_offset = neighbor_partition_offset[vertex];
|
|
175
|
+
|
|
176
|
+
if (v_pool_offset === -1) {
|
|
177
|
+
// Vertex turned interior during this pass; nothing to do.
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ----- Select the best target partition --------------------------
|
|
182
|
+
// Walk v's neighbour-partition entries from the end. Take the first
|
|
183
|
+
// one that's acceptable under master's REFINE criterion: strictly
|
|
184
|
+
// positive cut gain AND (either both balance bounds respected, or
|
|
185
|
+
// the move improves the proportional balance ratio between `from`
|
|
186
|
+
// and `to`). Tie-break: zero-gain moves only if they're balance-
|
|
187
|
+
// improving. Then re-scan for a strictly better candidate.
|
|
188
|
+
//
|
|
189
|
+
// The balance-improvement test `pwgts[from] - vwgt > pwgts[to]`
|
|
190
|
+
// is master's `tpwgts[from]*pwgts[to] < tpwgts[to]*(pwgts[from]-vwgt)`
|
|
191
|
+
// simplified for uniform tpwgts (which is all we support).
|
|
192
|
+
const pool_data = neighbor_partition_pool.data_uint32;
|
|
193
|
+
const v_pool_word_base = neighbor_partition_pool.element_word(v_pool_offset);
|
|
194
|
+
|
|
195
|
+
const partition_weight_from_after = partition_weights[from_partition] - vertex_weight;
|
|
196
|
+
|
|
197
|
+
let best_nbr_index = -1;
|
|
198
|
+
for (let nbr_index = v_nbr_partition_count - 1; nbr_index >= 0; nbr_index--) {
|
|
199
|
+
const candidate_partition = pool_data[v_pool_word_base + nbr_index * 2];
|
|
200
|
+
const candidate_edge_weight = pool_data[v_pool_word_base + nbr_index * 2 + 1];
|
|
201
|
+
const candidate_weight_after = partition_weights[candidate_partition] + vertex_weight;
|
|
202
|
+
|
|
203
|
+
// "Move improves proportional balance" (uniform-tpwgts form).
|
|
204
|
+
const balance_improves = candidate_weight_after - vertex_weight < partition_weight_from_after;
|
|
205
|
+
|
|
206
|
+
const from_ok = partition_weight_from_after >= partition_weight_min[from_partition] || balance_improves;
|
|
207
|
+
const to_ok = candidate_weight_after <= partition_weight_max[candidate_partition] + fudge_factor * (candidate_edge_weight - v_internal_degree) || balance_improves;
|
|
208
|
+
|
|
209
|
+
if (candidate_edge_weight > v_internal_degree && from_ok && to_ok) {
|
|
210
|
+
best_nbr_index = nbr_index;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
if (candidate_edge_weight === v_internal_degree && balance_improves) {
|
|
214
|
+
best_nbr_index = nbr_index;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (best_nbr_index === -1) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
{
|
|
223
|
+
let best_edge_weight = pool_data[v_pool_word_base + best_nbr_index * 2 + 1];
|
|
224
|
+
let best_target_partition = pool_data[v_pool_word_base + best_nbr_index * 2];
|
|
225
|
+
for (let nbr_index = best_nbr_index - 1; nbr_index >= 0; nbr_index--) {
|
|
226
|
+
const candidate_partition = pool_data[v_pool_word_base + nbr_index * 2];
|
|
227
|
+
const candidate_edge_weight = pool_data[v_pool_word_base + nbr_index * 2 + 1];
|
|
228
|
+
const candidate_weight_after = partition_weights[candidate_partition] + vertex_weight;
|
|
229
|
+
const balance_improves = candidate_weight_after - vertex_weight < partition_weight_from_after;
|
|
230
|
+
|
|
231
|
+
const from_ok = partition_weight_from_after >= partition_weight_min[from_partition] || balance_improves;
|
|
232
|
+
const to_ok = candidate_weight_after <= partition_weight_max[candidate_partition] + fudge_factor * (candidate_edge_weight - v_internal_degree) || balance_improves;
|
|
233
|
+
|
|
234
|
+
if (candidate_edge_weight > best_edge_weight && from_ok && to_ok) {
|
|
235
|
+
best_nbr_index = nbr_index;
|
|
236
|
+
best_edge_weight = candidate_edge_weight;
|
|
237
|
+
best_target_partition = candidate_partition;
|
|
238
|
+
} else if (
|
|
239
|
+
candidate_edge_weight === best_edge_weight &&
|
|
240
|
+
partition_weights[candidate_partition] < partition_weights[best_target_partition]
|
|
241
|
+
) {
|
|
242
|
+
best_nbr_index = nbr_index;
|
|
243
|
+
best_target_partition = candidate_partition;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const to_partition = pool_data[v_pool_word_base + best_nbr_index * 2];
|
|
249
|
+
const to_edge_weight = pool_data[v_pool_word_base + best_nbr_index * 2 + 1];
|
|
250
|
+
const gain = to_edge_weight - v_internal_degree;
|
|
251
|
+
|
|
252
|
+
// ===== Commit the move =========================================
|
|
253
|
+
graph.current_cut -= gain;
|
|
254
|
+
moves_this_pass++;
|
|
255
|
+
total_moves++;
|
|
256
|
+
|
|
257
|
+
partition_weights[from_partition] -= vertex_weight;
|
|
258
|
+
partition_weights[to_partition] += vertex_weight;
|
|
259
|
+
vertex_partition[vertex] = to_partition;
|
|
260
|
+
|
|
261
|
+
// Update v's own id/ed and the neighbour-partition entry at best_nbr_index.
|
|
262
|
+
// After the move:
|
|
263
|
+
// new internal_degree = old edge-weight to `to_partition` (those edges are now internal)
|
|
264
|
+
// new external_degree = old external_degree - old edge-weight to to + old internal_degree
|
|
265
|
+
// (old internal edges to `from_partition` become external)
|
|
266
|
+
const new_internal_degree = to_edge_weight;
|
|
267
|
+
const new_external_degree = v_external_degree - to_edge_weight + v_internal_degree;
|
|
268
|
+
internal_degree[vertex] = new_internal_degree;
|
|
269
|
+
external_degree[vertex] = new_external_degree;
|
|
270
|
+
|
|
271
|
+
if (v_internal_degree === 0) {
|
|
272
|
+
// No back-edges to `from_partition`. Drop the entry by swap-with-last.
|
|
273
|
+
const last_index = v_nbr_partition_count - 1;
|
|
274
|
+
if (best_nbr_index !== last_index) {
|
|
275
|
+
pool_data[v_pool_word_base + best_nbr_index * 2] = pool_data[v_pool_word_base + last_index * 2];
|
|
276
|
+
pool_data[v_pool_word_base + best_nbr_index * 2 + 1] = pool_data[v_pool_word_base + last_index * 2 + 1];
|
|
277
|
+
}
|
|
278
|
+
neighbor_partition_count[vertex] = last_index;
|
|
279
|
+
} else {
|
|
280
|
+
// The slot that used to represent `to_partition` now represents
|
|
281
|
+
// `from_partition` with the old internal_degree as its edge weight.
|
|
282
|
+
pool_data[v_pool_word_base + best_nbr_index * 2] = from_partition;
|
|
283
|
+
pool_data[v_pool_word_base + best_nbr_index * 2 + 1] = v_internal_degree;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Update v's boundary membership.
|
|
287
|
+
{
|
|
288
|
+
const v_boundary_position = boundary_position_of_vertex[vertex];
|
|
289
|
+
if (v_boundary_position !== -1 && new_external_degree - new_internal_degree < 0) {
|
|
290
|
+
const last_boundary_index = boundary_count - 1;
|
|
291
|
+
if (v_boundary_position !== last_boundary_index) {
|
|
292
|
+
const moved_vertex = boundary_vertices[last_boundary_index];
|
|
293
|
+
boundary_vertices[v_boundary_position] = moved_vertex;
|
|
294
|
+
boundary_position_of_vertex[moved_vertex] = v_boundary_position;
|
|
295
|
+
}
|
|
296
|
+
boundary_position_of_vertex[vertex] = -1;
|
|
297
|
+
boundary_count = last_boundary_index;
|
|
298
|
+
} else if (v_boundary_position === -1 && new_external_degree - new_internal_degree >= 0) {
|
|
299
|
+
boundary_vertices[boundary_count] = vertex;
|
|
300
|
+
boundary_position_of_vertex[vertex] = boundary_count;
|
|
301
|
+
boundary_count++;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ----- Update each neighbour of v -------------------------------
|
|
306
|
+
for (let edge_offset = edge_addresses[vertex]; edge_offset < edge_addresses[vertex + 1]; edge_offset++) {
|
|
307
|
+
const neighbor = adjacency[edge_offset];
|
|
308
|
+
const neighbor_owning_partition = vertex_partition[neighbor];
|
|
309
|
+
const edge_weight_to_neighbor = edge_weights[edge_offset];
|
|
310
|
+
|
|
311
|
+
const neighbor_old_nbr_partition_count = neighbor_partition_count[neighbor];
|
|
312
|
+
let neighbor_pool_offset = neighbor_partition_offset[neighbor];
|
|
313
|
+
|
|
314
|
+
if (neighbor_pool_offset === -1) {
|
|
315
|
+
// Neighbour was interior; allocate now, sized to its degree
|
|
316
|
+
// so subsequent additions will fit.
|
|
317
|
+
const neighbor_degree = edge_addresses[neighbor + 1] - edge_addresses[neighbor];
|
|
318
|
+
neighbor_pool_offset = neighbor_partition_pool.allocate_continuous(neighbor_degree);
|
|
319
|
+
neighbor_partition_offset[neighbor] = neighbor_pool_offset;
|
|
320
|
+
}
|
|
321
|
+
// Re-fetch the data view in case the pool grew during allocate.
|
|
322
|
+
const pool_data_for_neighbor = neighbor_partition_pool.data_uint32;
|
|
323
|
+
const neighbor_pool_word_base = neighbor_partition_pool.element_word(neighbor_pool_offset);
|
|
324
|
+
|
|
325
|
+
let n_internal_degree = internal_degree[neighbor];
|
|
326
|
+
let n_external_degree = external_degree[neighbor];
|
|
327
|
+
let n_nbr_partition_count = neighbor_partition_count[neighbor];
|
|
328
|
+
|
|
329
|
+
if (neighbor_owning_partition === from_partition) {
|
|
330
|
+
// The edge v–neighbor used to be internal for the neighbour
|
|
331
|
+
// (both in `from`); after v's move it becomes external.
|
|
332
|
+
n_internal_degree -= edge_weight_to_neighbor;
|
|
333
|
+
n_external_degree += edge_weight_to_neighbor;
|
|
334
|
+
} else if (neighbor_owning_partition === to_partition) {
|
|
335
|
+
// The reverse — was external, now internal.
|
|
336
|
+
n_internal_degree += edge_weight_to_neighbor;
|
|
337
|
+
n_external_degree -= edge_weight_to_neighbor;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Remove the neighbour's record of `from_partition` (or
|
|
341
|
+
// decrement it). Only do this if the neighbour is not itself
|
|
342
|
+
// in `from_partition`; if it is, `from` isn't in its neighbour
|
|
343
|
+
// list at all.
|
|
344
|
+
if (neighbor_owning_partition !== from_partition) {
|
|
345
|
+
for (let nbr_index = 0; nbr_index < n_nbr_partition_count; nbr_index++) {
|
|
346
|
+
if (pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2] === from_partition) {
|
|
347
|
+
const current_edge_weight = pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2 + 1];
|
|
348
|
+
if (current_edge_weight === edge_weight_to_neighbor) {
|
|
349
|
+
// Last edge to from-partition; remove the entry.
|
|
350
|
+
const last_index = n_nbr_partition_count - 1;
|
|
351
|
+
if (nbr_index !== last_index) {
|
|
352
|
+
pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2] = pool_data_for_neighbor[neighbor_pool_word_base + last_index * 2];
|
|
353
|
+
pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2 + 1] = pool_data_for_neighbor[neighbor_pool_word_base + last_index * 2 + 1];
|
|
354
|
+
}
|
|
355
|
+
n_nbr_partition_count = last_index;
|
|
356
|
+
} else {
|
|
357
|
+
pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2 + 1] = current_edge_weight - edge_weight_to_neighbor;
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Add or increment the neighbour's record of `to_partition`,
|
|
365
|
+
// unless the neighbour is itself in `to_partition`.
|
|
366
|
+
if (neighbor_owning_partition !== to_partition) {
|
|
367
|
+
let found_existing_entry = false;
|
|
368
|
+
for (let nbr_index = 0; nbr_index < n_nbr_partition_count; nbr_index++) {
|
|
369
|
+
if (pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2] === to_partition) {
|
|
370
|
+
pool_data_for_neighbor[neighbor_pool_word_base + nbr_index * 2 + 1] += edge_weight_to_neighbor;
|
|
371
|
+
found_existing_entry = true;
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (!found_existing_entry) {
|
|
376
|
+
pool_data_for_neighbor[neighbor_pool_word_base + n_nbr_partition_count * 2] = to_partition;
|
|
377
|
+
pool_data_for_neighbor[neighbor_pool_word_base + n_nbr_partition_count * 2 + 1] = edge_weight_to_neighbor;
|
|
378
|
+
n_nbr_partition_count++;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
internal_degree[neighbor] = n_internal_degree;
|
|
383
|
+
external_degree[neighbor] = n_external_degree;
|
|
384
|
+
neighbor_partition_count[neighbor] = n_nbr_partition_count;
|
|
385
|
+
|
|
386
|
+
// Update boundary membership for the neighbour.
|
|
387
|
+
const n_boundary_position = boundary_position_of_vertex[neighbor];
|
|
388
|
+
if (neighbor_owning_partition === from_partition && n_external_degree - n_internal_degree >= 0 && n_boundary_position === -1) {
|
|
389
|
+
boundary_vertices[boundary_count] = neighbor;
|
|
390
|
+
boundary_position_of_vertex[neighbor] = boundary_count;
|
|
391
|
+
boundary_count++;
|
|
392
|
+
} else if (neighbor_owning_partition === to_partition && n_external_degree - n_internal_degree < 0 && n_boundary_position !== -1) {
|
|
393
|
+
const last_boundary_index = boundary_count - 1;
|
|
394
|
+
if (n_boundary_position !== last_boundary_index) {
|
|
395
|
+
const moved_vertex = boundary_vertices[last_boundary_index];
|
|
396
|
+
boundary_vertices[n_boundary_position] = moved_vertex;
|
|
397
|
+
boundary_position_of_vertex[moved_vertex] = n_boundary_position;
|
|
398
|
+
}
|
|
399
|
+
boundary_position_of_vertex[neighbor] = -1;
|
|
400
|
+
boundary_count = last_boundary_index;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Update the priority queue. Skip if the neighbour's
|
|
404
|
+
// partition wasn't `from` or `to` AND its nbr-count didn't
|
|
405
|
+
// change — nothing observably moved for it.
|
|
406
|
+
const neighbor_state_changed = (
|
|
407
|
+
neighbor_owning_partition === from_partition ||
|
|
408
|
+
neighbor_owning_partition === to_partition ||
|
|
409
|
+
neighbor_old_nbr_partition_count !== n_nbr_partition_count
|
|
410
|
+
);
|
|
411
|
+
if (neighbor_state_changed) {
|
|
412
|
+
const updated_gain = n_nbr_partition_count > 0
|
|
413
|
+
? n_external_degree / Math.sqrt(n_nbr_partition_count) - n_internal_degree
|
|
414
|
+
: -n_internal_degree;
|
|
415
|
+
const neighbor_status = queue_status[neighbor];
|
|
416
|
+
if (neighbor_status === QUEUE_STATUS_PRESENT) {
|
|
417
|
+
if (n_external_degree - n_internal_degree >= 0) {
|
|
418
|
+
move_queue.update(neighbor, updated_gain);
|
|
419
|
+
} else {
|
|
420
|
+
// No longer a boundary candidate; drop from queue.
|
|
421
|
+
move_queue.remove(neighbor);
|
|
422
|
+
queue_status[neighbor] = QUEUE_STATUS_NOT_PRESENT;
|
|
423
|
+
const touched_pos = touched_position_of_vertex[neighbor];
|
|
424
|
+
if (touched_pos !== -1) {
|
|
425
|
+
const last_touched_index = touched_count - 1;
|
|
426
|
+
if (touched_pos !== last_touched_index) {
|
|
427
|
+
const moved_touched_vertex = touched_vertices[last_touched_index];
|
|
428
|
+
touched_vertices[touched_pos] = moved_touched_vertex;
|
|
429
|
+
touched_position_of_vertex[moved_touched_vertex] = touched_pos;
|
|
430
|
+
}
|
|
431
|
+
touched_position_of_vertex[neighbor] = -1;
|
|
432
|
+
touched_count = last_touched_index;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
} else if (neighbor_status === QUEUE_STATUS_NOT_PRESENT && n_external_degree - n_internal_degree >= 0) {
|
|
436
|
+
move_queue.insert(neighbor, updated_gain);
|
|
437
|
+
queue_status[neighbor] = QUEUE_STATUS_PRESENT;
|
|
438
|
+
touched_vertices[touched_count] = neighbor;
|
|
439
|
+
touched_position_of_vertex[neighbor] = touched_count;
|
|
440
|
+
touched_count++;
|
|
441
|
+
}
|
|
442
|
+
// EXTRACTED: don't re-insert in the same pass.
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
graph.boundary_count = boundary_count;
|
|
448
|
+
|
|
449
|
+
// Reset per-pass tracking state.
|
|
450
|
+
for (let i = 0; i < touched_count; i++) {
|
|
451
|
+
const vertex = touched_vertices[i];
|
|
452
|
+
queue_status[vertex] = QUEUE_STATUS_NOT_PRESENT;
|
|
453
|
+
touched_position_of_vertex[vertex] = -1;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
if (moves_this_pass === 0 || graph.current_cut === cut_at_pass_start) {
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return total_moves;
|
|
462
|
+
}
|