@woosh/meep-engine 2.138.20 → 2.139.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/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/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/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/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/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 +673 -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 +365 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +31 -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 +112 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +22 -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 +55 -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 +22 -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 +49 -0
- 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/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 +102 -9
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerController.js +38 -3
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +533 -4
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +315 -6
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +220 -22
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +858 -241
- package/src/engine/control/first-person/TODO.md +127 -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 +158 -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 +550 -119
- 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 +28 -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/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/PLAN.md +236 -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/aabb_transform_oriented.d.ts +30 -0
- package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts.map +1 -0
- package/src/engine/physics/broadphase/aabb_transform_oriented.js +93 -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 +226 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
- package/src/engine/physics/contact/ManifoldStore.js +499 -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 +520 -0
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/PhysicsSystem.js +1159 -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 +455 -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_solve_pressure_unmasked_legacy.d.ts +20 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.js +83 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +26 -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 +70 -0
- package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
- package/src/engine/physics/gjk/expanding_polytope_algorithm.js +8 -10
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts +29 -0
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
- package/src/engine/physics/inertia/world_inverse_inertia.js +79 -0
- package/src/engine/physics/integration/integrate_position.d.ts +16 -0
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_position.js +48 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts +25 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
- package/src/engine/physics/integration/integrate_velocity.js +79 -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 +59 -0
- package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/PosedShape.js +110 -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 +543 -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 +508 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts +11 -0
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
- package/src/engine/physics/narrowphase/narrowphase_step.js +382 -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 +130 -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/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/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/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 +36 -0
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
- package/src/engine/physics/solver/solve_contacts.js +598 -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,499 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { PAIR_UINT32_MAP_ABSENT, PairUint32Map } from "../../../core/collection/PairUint32Map.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Maximum contact points per manifold. Four is the universal industry choice
|
|
6
|
+
* (Bullet's btPersistentManifold, Box2D, Jolt) — enough to express stable
|
|
7
|
+
* face-on-face contact, small enough to fit inertia-driven solver passes.
|
|
8
|
+
* @type {number}
|
|
9
|
+
*/
|
|
10
|
+
export const MAX_CONTACTS_PER_MANIFOLD = 4;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Per-contact field stride in the data Float64Array.
|
|
14
|
+
*
|
|
15
|
+
* Layout per contact (all world-space):
|
|
16
|
+
* 0..2 : world_a (contact point on body A's surface)
|
|
17
|
+
* 3..5 : world_b (contact point on body B's surface)
|
|
18
|
+
* 6..8 : normal_w (from B toward A)
|
|
19
|
+
* 9 : depth (positive = penetration, negative = speculative gap)
|
|
20
|
+
* 10 : j_n (accumulated normal impulse, warm-start)
|
|
21
|
+
* 11 : j_t1 (accumulated tangent impulse, axis 1)
|
|
22
|
+
* 12 : j_t2 (accumulated tangent impulse, axis 2)
|
|
23
|
+
*
|
|
24
|
+
* Solver uses `(world_a + world_b) * 0.5` as the application point; storing
|
|
25
|
+
* both surface points keeps the door open for richer warm-start matching
|
|
26
|
+
* across frames in a follow-up slice.
|
|
27
|
+
*
|
|
28
|
+
* @type {number}
|
|
29
|
+
*/
|
|
30
|
+
export const CONTACT_STRIDE = 13;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Per-slot Float64 stride: room for {@link MAX_CONTACTS_PER_MANIFOLD} contacts.
|
|
34
|
+
* @type {number}
|
|
35
|
+
*/
|
|
36
|
+
export const SLOT_DATA_STRIDE = CONTACT_STRIDE * MAX_CONTACTS_PER_MANIFOLD;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Per-slot meta stride in the Uint32 meta buffer:
|
|
40
|
+
* 0 : bodyA
|
|
41
|
+
* 1 : bodyB
|
|
42
|
+
* 2 : packed = count(0..3) | touched(bit 4) | prev_touched(bit 5) | grace(bits 6..13)
|
|
43
|
+
* @type {number}
|
|
44
|
+
*/
|
|
45
|
+
const SLOT_META_STRIDE = 3;
|
|
46
|
+
|
|
47
|
+
const FLAG_TOUCHED = 1 << 4;
|
|
48
|
+
const FLAG_PREV_TOUCHED = 1 << 5;
|
|
49
|
+
const COUNT_MASK = 0x0F;
|
|
50
|
+
const GRACE_SHIFT = 6;
|
|
51
|
+
const GRACE_MASK = 0xFF; // 8 bits
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Number of consecutive frames a manifold may stay untouched before eviction.
|
|
55
|
+
* Two frames of grace lets a one-frame separation survive (jitter friendly)
|
|
56
|
+
* while still keeping the cache bounded.
|
|
57
|
+
* @type {number}
|
|
58
|
+
*/
|
|
59
|
+
const DEFAULT_GRACE = 2;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Sentinel for "no slot".
|
|
63
|
+
* @type {number}
|
|
64
|
+
*/
|
|
65
|
+
export const MANIFOLD_SLOT_ABSENT = -1;
|
|
66
|
+
|
|
67
|
+
const DEFAULT_INITIAL_CAPACITY = 64;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Persistent contact-manifold cache keyed by canonical body-id pairs.
|
|
71
|
+
*
|
|
72
|
+
* Owns:
|
|
73
|
+
* - the SoA `Float64Array` of contact points (per-slot stride 52),
|
|
74
|
+
* - the small meta `Uint32Array` (bodyA, bodyB, packed flags + count),
|
|
75
|
+
* - a {@link PairUint32Map} from `(idA, idB)` to slot id,
|
|
76
|
+
* - a dense `__live_slots` array of currently-allocated slot ids,
|
|
77
|
+
* - a min-heap-free-stack of released slot ids so reuse is deterministic.
|
|
78
|
+
*
|
|
79
|
+
* Lifecycle per simulation step:
|
|
80
|
+
* 1. Broadphase calls {@link acquire} for every encountered pair, which marks
|
|
81
|
+
* each touched slot as "fresh this frame".
|
|
82
|
+
* 2. Narrowphase fills in contact points via {@link set_contact} /
|
|
83
|
+
* {@link clear_contacts}.
|
|
84
|
+
* 3. End-of-step calls {@link advance_frame} to roll touched → prev_touched
|
|
85
|
+
* and evict slots that have been untouched for {@link DEFAULT_GRACE}
|
|
86
|
+
* consecutive frames.
|
|
87
|
+
*
|
|
88
|
+
* @author Alex Goldring
|
|
89
|
+
* @copyright Company Named Limited (c) 2026
|
|
90
|
+
*/
|
|
91
|
+
export class ManifoldStore {
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @param {number} [initial_capacity] slots
|
|
95
|
+
*/
|
|
96
|
+
constructor(initial_capacity = DEFAULT_INITIAL_CAPACITY) {
|
|
97
|
+
assert.isNonNegativeInteger(initial_capacity, 'initial_capacity');
|
|
98
|
+
this.__capacity = Math.max(4, initial_capacity);
|
|
99
|
+
this.__high_water = 0;
|
|
100
|
+
|
|
101
|
+
this.__data = new Float64Array(this.__capacity * SLOT_DATA_STRIDE);
|
|
102
|
+
this.__meta = new Uint32Array(this.__capacity * SLOT_META_STRIDE);
|
|
103
|
+
|
|
104
|
+
this.__pair_index = new PairUint32Map(this.__capacity * 2);
|
|
105
|
+
|
|
106
|
+
// Dense list of currently-allocated slot ids + reverse map.
|
|
107
|
+
this.__live_slots = new Uint32Array(this.__capacity);
|
|
108
|
+
this.__live_pos = new Int32Array(this.__capacity);
|
|
109
|
+
this.__live_pos.fill(-1);
|
|
110
|
+
this.__live_count = 0;
|
|
111
|
+
|
|
112
|
+
// Min-heap of released slot ids.
|
|
113
|
+
this.__free_heap = new Uint32Array(this.__capacity);
|
|
114
|
+
this.__free_count = 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @returns {number} number of currently-live slots
|
|
119
|
+
*/
|
|
120
|
+
get count() {
|
|
121
|
+
return this.__live_count;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @returns {number} total allocated slot capacity
|
|
126
|
+
*/
|
|
127
|
+
get capacity() {
|
|
128
|
+
return this.__capacity;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Look up a slot by canonical pair. Caller is responsible for ordering
|
|
133
|
+
* `(idA, idB)` such that the same pair always hashes the same way.
|
|
134
|
+
*
|
|
135
|
+
* @param {number} idA
|
|
136
|
+
* @param {number} idB
|
|
137
|
+
* @returns {number} slot id or {@link MANIFOLD_SLOT_ABSENT}
|
|
138
|
+
*/
|
|
139
|
+
find(idA, idB) {
|
|
140
|
+
const v = this.__pair_index.get(idA, idB);
|
|
141
|
+
return v === PAIR_UINT32_MAP_ABSENT ? MANIFOLD_SLOT_ABSENT : v;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Acquire a slot for the pair, creating one if absent, and mark it
|
|
146
|
+
* "touched this frame". Returns the slot id. Calling `acquire` twice in
|
|
147
|
+
* the same step on the same pair is a no-op for the second call.
|
|
148
|
+
*
|
|
149
|
+
* @param {number} idA
|
|
150
|
+
* @param {number} idB
|
|
151
|
+
* @returns {number} slot id
|
|
152
|
+
*/
|
|
153
|
+
acquire(idA, idB) {
|
|
154
|
+
let slot = this.find(idA, idB);
|
|
155
|
+
if (slot === MANIFOLD_SLOT_ABSENT) {
|
|
156
|
+
slot = this.__allocate_slot();
|
|
157
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
158
|
+
this.__meta[meta_off] = idA;
|
|
159
|
+
this.__meta[meta_off + 1] = idB;
|
|
160
|
+
this.__meta[meta_off + 2] = 0; // count=0, no flags, grace=0
|
|
161
|
+
// Zero the contact data — important so a recycled slot's warm-start
|
|
162
|
+
// impulses don't leak across pair identities.
|
|
163
|
+
const data_off = slot * SLOT_DATA_STRIDE;
|
|
164
|
+
this.__data.fill(0, data_off, data_off + SLOT_DATA_STRIDE);
|
|
165
|
+
|
|
166
|
+
this.__pair_index.set(idA, idB, slot);
|
|
167
|
+
}
|
|
168
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
169
|
+
// Set touched bit, clear grace.
|
|
170
|
+
let packed = this.__meta[meta_off + 2];
|
|
171
|
+
packed |= FLAG_TOUCHED;
|
|
172
|
+
packed &= ~(GRACE_MASK << GRACE_SHIFT);
|
|
173
|
+
this.__meta[meta_off + 2] = packed;
|
|
174
|
+
return slot;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @param {number} slot
|
|
179
|
+
* @returns {number} body A id stored at this slot
|
|
180
|
+
*/
|
|
181
|
+
bodyA(slot) {
|
|
182
|
+
return this.__meta[slot * SLOT_META_STRIDE];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @param {number} slot
|
|
187
|
+
* @returns {number}
|
|
188
|
+
*/
|
|
189
|
+
bodyB(slot) {
|
|
190
|
+
return this.__meta[slot * SLOT_META_STRIDE + 1];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @param {number} slot
|
|
195
|
+
* @returns {number} 0..MAX_CONTACTS_PER_MANIFOLD
|
|
196
|
+
*/
|
|
197
|
+
contact_count(slot) {
|
|
198
|
+
return this.__meta[slot * SLOT_META_STRIDE + 2] & COUNT_MASK;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* @param {number} slot
|
|
203
|
+
* @returns {boolean}
|
|
204
|
+
*/
|
|
205
|
+
is_touched(slot) {
|
|
206
|
+
return (this.__meta[slot * SLOT_META_STRIDE + 2] & FLAG_TOUCHED) !== 0;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @param {number} slot
|
|
211
|
+
* @returns {boolean}
|
|
212
|
+
*/
|
|
213
|
+
was_touched_prev(slot) {
|
|
214
|
+
return (this.__meta[slot * SLOT_META_STRIDE + 2] & FLAG_PREV_TOUCHED) !== 0;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Iterate the dense list of currently-live slots without going through
|
|
219
|
+
* the pair map. `i` ranges `[0, count)`.
|
|
220
|
+
* @param {number} i
|
|
221
|
+
* @returns {number}
|
|
222
|
+
*/
|
|
223
|
+
live_at(i) {
|
|
224
|
+
return this.__live_slots[i];
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Clear the contact list for a slot (counts go to zero, warm-start
|
|
229
|
+
* impulses also reset). Used when narrowphase determines the pair is
|
|
230
|
+
* separated this frame.
|
|
231
|
+
* @param {number} slot
|
|
232
|
+
*/
|
|
233
|
+
clear_contacts(slot) {
|
|
234
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
235
|
+
this.__meta[meta_off + 2] = this.__meta[meta_off + 2] & ~COUNT_MASK;
|
|
236
|
+
|
|
237
|
+
const data_off = slot * SLOT_DATA_STRIDE;
|
|
238
|
+
this.__data.fill(0, data_off, data_off + SLOT_DATA_STRIDE);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Write a contact point into a slot. Increments contact_count if `idx`
|
|
243
|
+
* exceeds the current count.
|
|
244
|
+
*
|
|
245
|
+
* @param {number} slot
|
|
246
|
+
* @param {number} idx contact index in `[0, MAX_CONTACTS_PER_MANIFOLD)`
|
|
247
|
+
* @param {number} lax
|
|
248
|
+
* @param {number} lay
|
|
249
|
+
* @param {number} laz
|
|
250
|
+
* @param {number} lbx
|
|
251
|
+
* @param {number} lby
|
|
252
|
+
* @param {number} lbz
|
|
253
|
+
* @param {number} nx normal world x (B toward A)
|
|
254
|
+
* @param {number} ny
|
|
255
|
+
* @param {number} nz
|
|
256
|
+
* @param {number} depth
|
|
257
|
+
*/
|
|
258
|
+
set_contact(slot, idx, lax, lay, laz, lbx, lby, lbz, nx, ny, nz, depth) {
|
|
259
|
+
const off = slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE;
|
|
260
|
+
this.__data[off] = lax;
|
|
261
|
+
this.__data[off + 1] = lay;
|
|
262
|
+
this.__data[off + 2] = laz;
|
|
263
|
+
this.__data[off + 3] = lbx;
|
|
264
|
+
this.__data[off + 4] = lby;
|
|
265
|
+
this.__data[off + 5] = lbz;
|
|
266
|
+
this.__data[off + 6] = nx;
|
|
267
|
+
this.__data[off + 7] = ny;
|
|
268
|
+
this.__data[off + 8] = nz;
|
|
269
|
+
this.__data[off + 9] = depth;
|
|
270
|
+
// j_n, j_t1, j_t2 are warm-start; preserved across calls.
|
|
271
|
+
|
|
272
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
273
|
+
const count_now = this.__meta[meta_off + 2] & COUNT_MASK;
|
|
274
|
+
if (idx + 1 > count_now) {
|
|
275
|
+
this.__meta[meta_off + 2] = (this.__meta[meta_off + 2] & ~COUNT_MASK) | (idx + 1);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Read a contact point. Writes 10 floats: lax, lay, laz, lbx, lby, lbz, nx, ny, nz, depth.
|
|
281
|
+
* @param {number} slot
|
|
282
|
+
* @param {number} idx
|
|
283
|
+
* @param {number[]|Float64Array} out
|
|
284
|
+
* @param {number} out_offset
|
|
285
|
+
*/
|
|
286
|
+
get_contact(slot, idx, out, out_offset) {
|
|
287
|
+
const off = slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE;
|
|
288
|
+
for (let i = 0; i < 10; i++) {
|
|
289
|
+
out[out_offset + i] = this.__data[off + i];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Get the contact-normal world x component for a given contact.
|
|
295
|
+
* Provided for testability without exposing the raw Float64Array view.
|
|
296
|
+
* @param {number} slot
|
|
297
|
+
* @param {number} idx
|
|
298
|
+
* @returns {number}
|
|
299
|
+
*/
|
|
300
|
+
contact_normal_x(slot, idx) {
|
|
301
|
+
return this.__data[slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE + 6];
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** @param {number} slot @param {number} idx @returns {number} */
|
|
305
|
+
contact_normal_y(slot, idx) {
|
|
306
|
+
return this.__data[slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE + 7];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** @param {number} slot @param {number} idx @returns {number} */
|
|
310
|
+
contact_normal_z(slot, idx) {
|
|
311
|
+
return this.__data[slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE + 8];
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/** @param {number} slot @param {number} idx @returns {number} */
|
|
315
|
+
contact_depth(slot, idx) {
|
|
316
|
+
return this.__data[slot * SLOT_DATA_STRIDE + idx * CONTACT_STRIDE + 9];
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Raw contact-point buffer. Hot-path solver code dereferences this
|
|
321
|
+
* directly via {@link slot_data_offset} + {@link CONTACT_STRIDE} to avoid
|
|
322
|
+
* per-field accessor overhead. Buffer identity is stable until grow.
|
|
323
|
+
* @returns {Float64Array}
|
|
324
|
+
*/
|
|
325
|
+
get data_buffer() {
|
|
326
|
+
return this.__data;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Word offset into {@link data_buffer} where the first contact of `slot`
|
|
331
|
+
* begins. Subsequent contacts within the slot are at
|
|
332
|
+
* `offset + c * CONTACT_STRIDE`.
|
|
333
|
+
* @param {number} slot
|
|
334
|
+
* @returns {number}
|
|
335
|
+
*/
|
|
336
|
+
slot_data_offset(slot) {
|
|
337
|
+
return slot * SLOT_DATA_STRIDE;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Advance touched flags by one frame and evict slots that have been
|
|
342
|
+
* untouched for {@link DEFAULT_GRACE} consecutive frames.
|
|
343
|
+
*/
|
|
344
|
+
advance_frame() {
|
|
345
|
+
// Iterate live slots backwards so swap-with-last during release doesn't
|
|
346
|
+
// skip indices.
|
|
347
|
+
for (let i = this.__live_count - 1; i >= 0; i--) {
|
|
348
|
+
const slot = this.__live_slots[i];
|
|
349
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
350
|
+
let packed = this.__meta[meta_off + 2];
|
|
351
|
+
|
|
352
|
+
const was_touched = (packed & FLAG_TOUCHED) !== 0;
|
|
353
|
+
// Roll touched → prev_touched, clear touched.
|
|
354
|
+
if (was_touched) {
|
|
355
|
+
packed = (packed & ~FLAG_PREV_TOUCHED) | FLAG_PREV_TOUCHED;
|
|
356
|
+
packed &= ~FLAG_TOUCHED;
|
|
357
|
+
// Reset grace.
|
|
358
|
+
packed &= ~(GRACE_MASK << GRACE_SHIFT);
|
|
359
|
+
this.__meta[meta_off + 2] = packed;
|
|
360
|
+
} else {
|
|
361
|
+
// Bump grace.
|
|
362
|
+
const grace = ((packed >>> GRACE_SHIFT) & GRACE_MASK) + 1;
|
|
363
|
+
packed &= ~FLAG_PREV_TOUCHED;
|
|
364
|
+
packed &= ~(GRACE_MASK << GRACE_SHIFT);
|
|
365
|
+
packed |= (grace & GRACE_MASK) << GRACE_SHIFT;
|
|
366
|
+
this.__meta[meta_off + 2] = packed;
|
|
367
|
+
|
|
368
|
+
if (grace >= DEFAULT_GRACE) {
|
|
369
|
+
this.__release_slot(slot);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* @private
|
|
377
|
+
* @returns {number} newly-allocated slot id
|
|
378
|
+
*/
|
|
379
|
+
__allocate_slot() {
|
|
380
|
+
let slot;
|
|
381
|
+
if (this.__free_count > 0) {
|
|
382
|
+
slot = this.__heap_pop();
|
|
383
|
+
} else {
|
|
384
|
+
if (this.__high_water === this.__capacity) {
|
|
385
|
+
this.__grow();
|
|
386
|
+
}
|
|
387
|
+
slot = this.__high_water++;
|
|
388
|
+
}
|
|
389
|
+
const pos = this.__live_count++;
|
|
390
|
+
this.__live_slots[pos] = slot;
|
|
391
|
+
this.__live_pos[slot] = pos;
|
|
392
|
+
return slot;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* @private
|
|
397
|
+
* @param {number} slot
|
|
398
|
+
*/
|
|
399
|
+
__release_slot(slot) {
|
|
400
|
+
const meta_off = slot * SLOT_META_STRIDE;
|
|
401
|
+
const idA = this.__meta[meta_off];
|
|
402
|
+
const idB = this.__meta[meta_off + 1];
|
|
403
|
+
|
|
404
|
+
this.__pair_index.delete(idA, idB);
|
|
405
|
+
|
|
406
|
+
// Remove from dense live list (swap with last).
|
|
407
|
+
const pos = this.__live_pos[slot];
|
|
408
|
+
const last_pos = --this.__live_count;
|
|
409
|
+
if (pos !== last_pos) {
|
|
410
|
+
const swapped = this.__live_slots[last_pos];
|
|
411
|
+
this.__live_slots[pos] = swapped;
|
|
412
|
+
this.__live_pos[swapped] = pos;
|
|
413
|
+
}
|
|
414
|
+
this.__live_pos[slot] = -1;
|
|
415
|
+
|
|
416
|
+
this.__heap_push(slot);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* @private
|
|
421
|
+
*/
|
|
422
|
+
__grow() {
|
|
423
|
+
const new_capacity = this.__capacity << 1;
|
|
424
|
+
this.__capacity = new_capacity;
|
|
425
|
+
|
|
426
|
+
const grow_f64 = (a, stride) => {
|
|
427
|
+
const n = new Float64Array(new_capacity * stride);
|
|
428
|
+
n.set(a);
|
|
429
|
+
return n;
|
|
430
|
+
};
|
|
431
|
+
const grow_u32 = (a, stride) => {
|
|
432
|
+
const n = new Uint32Array(new_capacity * stride);
|
|
433
|
+
n.set(a);
|
|
434
|
+
return n;
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
this.__data = grow_f64(this.__data, SLOT_DATA_STRIDE);
|
|
438
|
+
this.__meta = grow_u32(this.__meta, SLOT_META_STRIDE);
|
|
439
|
+
|
|
440
|
+
const next_live = new Uint32Array(new_capacity);
|
|
441
|
+
next_live.set(this.__live_slots);
|
|
442
|
+
this.__live_slots = next_live;
|
|
443
|
+
|
|
444
|
+
const next_live_pos = new Int32Array(new_capacity);
|
|
445
|
+
next_live_pos.set(this.__live_pos);
|
|
446
|
+
next_live_pos.fill(-1, this.__live_pos.length);
|
|
447
|
+
this.__live_pos = next_live_pos;
|
|
448
|
+
|
|
449
|
+
const next_free = new Uint32Array(new_capacity);
|
|
450
|
+
next_free.set(this.__free_heap);
|
|
451
|
+
this.__free_heap = next_free;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* @private
|
|
456
|
+
* @param {number} v
|
|
457
|
+
*/
|
|
458
|
+
__heap_push(v) {
|
|
459
|
+
const heap = this.__free_heap;
|
|
460
|
+
let i = this.__free_count++;
|
|
461
|
+
heap[i] = v;
|
|
462
|
+
while (i > 0) {
|
|
463
|
+
const parent = (i - 1) >>> 1;
|
|
464
|
+
if (heap[parent] > heap[i]) {
|
|
465
|
+
const tmp = heap[parent];
|
|
466
|
+
heap[parent] = heap[i];
|
|
467
|
+
heap[i] = tmp;
|
|
468
|
+
i = parent;
|
|
469
|
+
} else break;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* @private
|
|
475
|
+
* @returns {number}
|
|
476
|
+
*/
|
|
477
|
+
__heap_pop() {
|
|
478
|
+
const heap = this.__free_heap;
|
|
479
|
+
const result = heap[0];
|
|
480
|
+
const new_count = --this.__free_count;
|
|
481
|
+
if (new_count > 0) {
|
|
482
|
+
heap[0] = heap[new_count];
|
|
483
|
+
let i = 0;
|
|
484
|
+
while (true) {
|
|
485
|
+
const l = (i << 1) + 1;
|
|
486
|
+
const r = l + 1;
|
|
487
|
+
let smallest = i;
|
|
488
|
+
if (l < new_count && heap[l] < heap[smallest]) smallest = l;
|
|
489
|
+
if (r < new_count && heap[r] < heap[smallest]) smallest = r;
|
|
490
|
+
if (smallest === i) break;
|
|
491
|
+
const tmp = heap[i];
|
|
492
|
+
heap[i] = heap[smallest];
|
|
493
|
+
heap[smallest] = tmp;
|
|
494
|
+
i = smallest;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kind of a rigid body. Determines how the body participates in the simulation:
|
|
3
|
+
* - {@link BodyKind.Static }: never moves. Has infinite mass. Ideal for level geometry.
|
|
4
|
+
* Stored in the static broadphase tree.
|
|
5
|
+
* - {@link BodyKind.Dynamic }: integrated under forces, gravity and contact impulses. The
|
|
6
|
+
* common case for game-play objects.
|
|
7
|
+
* - {@link BodyKind.KinematicVelocity }: driven externally by velocity. Pushes Dynamic
|
|
8
|
+
* bodies but is not pushed back. Mass effectively infinite for the solver.
|
|
9
|
+
* - {@link BodyKind.KinematicPosition }: driven externally by direct pose writes. Velocity
|
|
10
|
+
* is derived by the system from the per-step delta so dynamic neighbours respond
|
|
11
|
+
* correctly.
|
|
12
|
+
*
|
|
13
|
+
* Values are bit-distinct so a {@link Static } | {@link Dynamic } mask can be used in
|
|
14
|
+
* filtering predicates, although the primary use is identity comparison.
|
|
15
|
+
*/
|
|
16
|
+
export type BodyKind = number;
|
|
17
|
+
export namespace BodyKind {
|
|
18
|
+
let Static: number;
|
|
19
|
+
let Dynamic: number;
|
|
20
|
+
let KinematicVelocity: number;
|
|
21
|
+
let KinematicPosition: number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=BodyKind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BodyKind.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/ecs/BodyKind.js"],"names":[],"mappings":";;;;;;;;;;;;;;;uBAgBU,MAAM"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kind of a rigid body. Determines how the body participates in the simulation:
|
|
3
|
+
* - {@link BodyKind.Static}: never moves. Has infinite mass. Ideal for level geometry.
|
|
4
|
+
* Stored in the static broadphase tree.
|
|
5
|
+
* - {@link BodyKind.Dynamic}: integrated under forces, gravity and contact impulses. The
|
|
6
|
+
* common case for game-play objects.
|
|
7
|
+
* - {@link BodyKind.KinematicVelocity}: driven externally by velocity. Pushes Dynamic
|
|
8
|
+
* bodies but is not pushed back. Mass effectively infinite for the solver.
|
|
9
|
+
* - {@link BodyKind.KinematicPosition}: driven externally by direct pose writes. Velocity
|
|
10
|
+
* is derived by the system from the per-step delta so dynamic neighbours respond
|
|
11
|
+
* correctly.
|
|
12
|
+
*
|
|
13
|
+
* Values are bit-distinct so a {@link Static} | {@link Dynamic} mask can be used in
|
|
14
|
+
* filtering predicates, although the primary use is identity comparison.
|
|
15
|
+
*
|
|
16
|
+
* @readonly
|
|
17
|
+
* @enum {number}
|
|
18
|
+
*/
|
|
19
|
+
export const BodyKind = {
|
|
20
|
+
Static: 0,
|
|
21
|
+
Dynamic: 1,
|
|
22
|
+
KinematicVelocity: 2,
|
|
23
|
+
KinematicPosition: 3,
|
|
24
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel for {@link Collider#_bvhNode} prior to insertion. Matches the BVH's
|
|
3
|
+
* own NULL_NODE convention without taking a direct import dependency on it.
|
|
4
|
+
*
|
|
5
|
+
* @type {number}
|
|
6
|
+
*/
|
|
7
|
+
export const COLLIDER_UNBOUND: number;
|
|
8
|
+
/**
|
|
9
|
+
* Collider component.
|
|
10
|
+
*
|
|
11
|
+
* Pairs a shared, immutable {@link AbstractShape3D} with a body-specific surface
|
|
12
|
+
* material. World pose comes from the entity's own {@link Transform}; for compound
|
|
13
|
+
* bodies the child collider entities are linked to the body via the existing
|
|
14
|
+
* `ParentEntity` component.
|
|
15
|
+
*
|
|
16
|
+
* @author Alex Goldring
|
|
17
|
+
* @copyright Company Named Limited (c) 2026
|
|
18
|
+
*/
|
|
19
|
+
export class Collider {
|
|
20
|
+
/**
|
|
21
|
+
* Surface geometry. Shared between colliders; never mutated.
|
|
22
|
+
* @type {AbstractShape3D}
|
|
23
|
+
*/
|
|
24
|
+
shape: AbstractShape3D;
|
|
25
|
+
/**
|
|
26
|
+
* Coulomb friction coefficient. Combined with the other side's friction via
|
|
27
|
+
* the system-wide combine rule (default: geometric mean).
|
|
28
|
+
* @type {number}
|
|
29
|
+
*/
|
|
30
|
+
friction: number;
|
|
31
|
+
/**
|
|
32
|
+
* Coefficient of restitution. 0 = perfectly inelastic, 1 = perfectly elastic.
|
|
33
|
+
* Combined via the system-wide combine rule.
|
|
34
|
+
* @type {number}
|
|
35
|
+
*/
|
|
36
|
+
restitution: number;
|
|
37
|
+
/**
|
|
38
|
+
* Mass-per-unit-volume. Used by inertia-tensor helpers if the user opts in
|
|
39
|
+
* to automatic mass computation; otherwise informational.
|
|
40
|
+
* @type {number}
|
|
41
|
+
*/
|
|
42
|
+
density: number;
|
|
43
|
+
/**
|
|
44
|
+
* @type {ColliderFlags|number}
|
|
45
|
+
*/
|
|
46
|
+
flags: ColliderFlags | number;
|
|
47
|
+
/**
|
|
48
|
+
* BVH node identifier assigned by {@link PhysicsSystem#link}. System-private.
|
|
49
|
+
* @type {number}
|
|
50
|
+
*/
|
|
51
|
+
_bvhNode: number;
|
|
52
|
+
/**
|
|
53
|
+
* Packed body id of the owning body, copied from the parent's
|
|
54
|
+
* {@link RigidBody#_bodyId} at link time. System-private.
|
|
55
|
+
* @type {number}
|
|
56
|
+
*/
|
|
57
|
+
_bodyId: number;
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param {number|ColliderFlags} flag
|
|
61
|
+
*/
|
|
62
|
+
setFlag(flag: number | ColliderFlags): void;
|
|
63
|
+
/**
|
|
64
|
+
*
|
|
65
|
+
* @param {number|ColliderFlags} flag
|
|
66
|
+
*/
|
|
67
|
+
clearFlag(flag: number | ColliderFlags): void;
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
* @param {number|ColliderFlags} flag
|
|
71
|
+
* @returns {boolean}
|
|
72
|
+
*/
|
|
73
|
+
getFlag(flag: number | ColliderFlags): boolean;
|
|
74
|
+
/**
|
|
75
|
+
*
|
|
76
|
+
* @param {number|ColliderFlags} flag
|
|
77
|
+
* @param {boolean} value
|
|
78
|
+
*/
|
|
79
|
+
writeFlag(flag: number | ColliderFlags, value: boolean): void;
|
|
80
|
+
toJSON(): {
|
|
81
|
+
friction: number;
|
|
82
|
+
restitution: number;
|
|
83
|
+
density: number;
|
|
84
|
+
flags: number;
|
|
85
|
+
};
|
|
86
|
+
fromJSON(json: any): void;
|
|
87
|
+
/**
|
|
88
|
+
* @readonly
|
|
89
|
+
* @type {boolean}
|
|
90
|
+
*/
|
|
91
|
+
readonly isCollider: boolean;
|
|
92
|
+
}
|
|
93
|
+
export namespace Collider {
|
|
94
|
+
let typeName: string;
|
|
95
|
+
}
|
|
96
|
+
import { AbstractShape3D } from "../../../core/geom/3d/shape/AbstractShape3D.js";
|
|
97
|
+
import { ColliderFlags } from "./ColliderFlags.js";
|
|
98
|
+
//# sourceMappingURL=Collider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collider.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/ecs/Collider.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,+BAFU,MAAM,CAEmB;AAEnC;;;;;;;;;;GAUG;AACH;IAEI;;;OAGG;IACH,OAFU,eAAe,CAEU;IAEnC;;;;OAIG;IACH,UAFU,MAAM,CAED;IAEf;;;;OAIG;IACH,aAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,SAFU,MAAM,CAEJ;IAEZ;;OAEG;IACH,OAFU,aAAa,GAAC,MAAM,CAEH;IAE3B;;;OAGG;IACH,UAFU,MAAM,CAEY;IAE5B;;;;OAIG;IACH,SAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,cAFW,MAAM,GAAC,aAAa,QAI9B;IAED;;;OAGG;IACH,gBAFW,MAAM,GAAC,aAAa,QAI9B;IAED;;;;OAIG;IACH,cAHW,MAAM,GAAC,aAAa,GAClB,OAAO,CAInB;IAED;;;;OAIG;IACH,gBAHW,MAAM,GAAC,aAAa,SACpB,OAAO,QAQjB;IAED;;;;;MAOC;IAED,0BAKC;IASL;;;OAGG;IACH,qBAFU,OAAO,CAEY;CAZ5B;;kBAIS,MAAM;;gCA/HgB,gDAAgD;8BAElD,oBAAoB"}
|