@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 @@
|
|
|
1
|
+
{"version":3,"file":"WallJump.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/control/first-person/abilities/WallJump.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;IAOI,kEAoBC;IAED,gDAgDC;IAED;;;;;OAKG;IACH,wBAEC;IAED,4FAKC;CACJ;wBAhIuB,cAAc"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { clamp } from "../../../../core/math/clamp.js";
|
|
2
|
+
import { DecisionPoint } from "../mastery/DecisionPoint.js";
|
|
3
|
+
import { Ability } from "./Ability.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wall-jump ability — instantaneous off-wall impulse fired when the
|
|
7
|
+
* player presses jump while close to a wall. Designed to chain
|
|
8
|
+
* naturally from wall-run (its priority is higher, so it preempts wall-
|
|
9
|
+
* run's `canInterrupt()=true`) but ALSO fires from "near-wall airborne"
|
|
10
|
+
* — a window where the player is mid-jump near a wall they haven't
|
|
11
|
+
* committed to running.
|
|
12
|
+
*
|
|
13
|
+
* Activation:
|
|
14
|
+
* - intent.jump just went true (rising edge)
|
|
15
|
+
* - airborne (`!state.grounded`)
|
|
16
|
+
* - a side wall sensor has hit within `nearWallMaxDistance`
|
|
17
|
+
*
|
|
18
|
+
* Behaviour:
|
|
19
|
+
* - Apply impulse: `outwardImpulse * wall.normal + upImpulse * worldUp`
|
|
20
|
+
* where `upImpulse = jumpInitialVy * upFactor`.
|
|
21
|
+
* - Clear variableJumpCut so the impulse takes effect cleanly.
|
|
22
|
+
* - Fire `onJumpStart` and `onLeaveGround{reason:"walljump"}` signals.
|
|
23
|
+
* - Releases immediately (it's instantaneous, not a sustained state).
|
|
24
|
+
*
|
|
25
|
+
* The impulse goes through `mastery.evaluate(DecisionPoint.WallJumpImpulse)`
|
|
26
|
+
* so any registered evaluators (e.g. breath rhythm, wall-jump-angle
|
|
27
|
+
* timing) can scale it.
|
|
28
|
+
*
|
|
29
|
+
* Priority 60 — highest among movement abilities. Wall-jump must fire
|
|
30
|
+
* reliably on player press, so it preempts wall-run (50), mantle (30),
|
|
31
|
+
* and slide (10).
|
|
32
|
+
*
|
|
33
|
+
* @author Alex Goldring
|
|
34
|
+
* @copyright Company Named Limited (c) 2026
|
|
35
|
+
*/
|
|
36
|
+
export class WallJump extends Ability {
|
|
37
|
+
constructor() {
|
|
38
|
+
super();
|
|
39
|
+
this.name = "WallJump";
|
|
40
|
+
this.priority = 60;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
canActivate(controller, runtime, sensors) {
|
|
44
|
+
const cfg = controller.config.wallJump;
|
|
45
|
+
if (!cfg) return false;
|
|
46
|
+
if (sensors === undefined || sensors === null) return false;
|
|
47
|
+
|
|
48
|
+
// Edge-trigger: must be a fresh jump press, not a held jump.
|
|
49
|
+
if (!controller.intent.jump) return false;
|
|
50
|
+
if (runtime.prevJumpHeld) return false;
|
|
51
|
+
|
|
52
|
+
// Must be airborne — wall-jump from the ground is just a jump.
|
|
53
|
+
if (controller.state.grounded) return false;
|
|
54
|
+
|
|
55
|
+
// At least one side wall within the near-wall distance.
|
|
56
|
+
const left = sensors.wallLeft;
|
|
57
|
+
const right = sensors.wallRight;
|
|
58
|
+
const leftClose = left.hit && left.distance <= cfg.nearWallMaxDistance;
|
|
59
|
+
const rightClose = right.hit && right.distance <= cfg.nearWallMaxDistance;
|
|
60
|
+
if (!leftClose && !rightClose) return false;
|
|
61
|
+
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
onActivate(controller, runtime) {
|
|
66
|
+
const cfg = controller.config.wallJump;
|
|
67
|
+
const sensors = runtime.sensors;
|
|
68
|
+
|
|
69
|
+
// Pick the closer wall (also: if only one side is hit, use it).
|
|
70
|
+
let wallNormal;
|
|
71
|
+
const lH = sensors.wallLeft.hit;
|
|
72
|
+
const rH = sensors.wallRight.hit;
|
|
73
|
+
if (lH && (!rH || sensors.wallLeft.distance <= sensors.wallRight.distance)) {
|
|
74
|
+
wallNormal = sensors.wallLeft.normal;
|
|
75
|
+
} else {
|
|
76
|
+
wallNormal = sensors.wallRight.normal;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Mastery: scale the impulse.
|
|
80
|
+
const masteryMul = controller.mastery.evaluate(
|
|
81
|
+
DecisionPoint.WallJumpImpulse, controller, runtime,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Apply impulse. Outward is along the wall normal; up is along
|
|
85
|
+
// world up. Clamp upFactor positive to avoid pathological configs
|
|
86
|
+
// that would push the player into the ground.
|
|
87
|
+
const upFactor = clamp(cfg.upFactor, 0, 2);
|
|
88
|
+
runtime.velocityX += wallNormal.x * cfg.outwardImpulse * masteryMul;
|
|
89
|
+
runtime.velocityZ += wallNormal.z * cfg.outwardImpulse * masteryMul;
|
|
90
|
+
runtime.velocityY = runtime.jumpInitialVy * upFactor * masteryMul;
|
|
91
|
+
|
|
92
|
+
// Mark this as a fresh jump (so the base jump FSM doesn't think
|
|
93
|
+
// we're falling and the variable-cut logic doesn't try to cut
|
|
94
|
+
// the upward velocity).
|
|
95
|
+
runtime.midJump = true;
|
|
96
|
+
runtime.apexFired = false;
|
|
97
|
+
controller.state.isVariableJumpCut = false;
|
|
98
|
+
controller.state.isAscending = true;
|
|
99
|
+
// Consume the jump-press edge so the base jump FSM doesn't double-fire.
|
|
100
|
+
runtime.prevJumpHeld = true;
|
|
101
|
+
|
|
102
|
+
// Exertion impulse — same magnitude as a regular jump-fire.
|
|
103
|
+
const cfgExt = controller.config.exertion;
|
|
104
|
+
controller.state.exertion = clamp(
|
|
105
|
+
controller.state.exertion + cfgExt.jumpRise * runtime.massRatios.exertionRiseScale,
|
|
106
|
+
0, 1,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
controller.signals.onJumpStart.send1({
|
|
110
|
+
peakHeight: controller.config.jump.peakHeight,
|
|
111
|
+
});
|
|
112
|
+
controller.signals.onLeaveGround.send1({ reason: "walljump" });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Wall-jump is instantaneous — it shouldn't ever be "interrupted".
|
|
117
|
+
* tick() returns false on first call so the ability releases
|
|
118
|
+
* immediately. Returning false here doesn't matter (no other ability
|
|
119
|
+
* exceeds priority 60 in the default set).
|
|
120
|
+
*/
|
|
121
|
+
canInterrupt() {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
tick(_controller, _runtime, _bodyTransform, _dt, _system) {
|
|
126
|
+
// The impulse was applied in onActivate; the ability is purely
|
|
127
|
+
// instantaneous. Release immediately so base locomotion picks up
|
|
128
|
+
// the resulting airborne arc.
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wall-run ability. Activates when the player is airborne with momentum
|
|
3
|
+
* and a wall is detected to their left or right. While active:
|
|
4
|
+
*
|
|
5
|
+
* - Gravity is reduced to `cfg.wallRun.gravityFactor × base` (typically
|
|
6
|
+
* 25%), letting the player hang on the wall for longer than a normal
|
|
7
|
+
* jump arc.
|
|
8
|
+
* - Horizontal velocity is projected onto the wall's tangent each tick,
|
|
9
|
+
* so the body sticks to the wall and slides along it. Forward
|
|
10
|
+
* momentum is preserved; into-wall and out-of-wall velocity
|
|
11
|
+
* components are zeroed.
|
|
12
|
+
* - Camera tilts into the wall via the shared lean spring (writes the
|
|
13
|
+
* wall-tilt to `runtime.leanTargetRad` each tick — same channel
|
|
14
|
+
* base writes its lat-accel-derived lean to, so transitions in and
|
|
15
|
+
* out share the spring's smoothing).
|
|
16
|
+
*
|
|
17
|
+
* Exits on:
|
|
18
|
+
* - Timer (`cfg.wallRun.maxDuration`)
|
|
19
|
+
* - Lost wall contact (sensor's hit flag becomes false)
|
|
20
|
+
* - Re-grounded (we walked onto a floor at the wall's end)
|
|
21
|
+
* - Wall-jump preempts (higher priority — WallJump declares priority 60)
|
|
22
|
+
*
|
|
23
|
+
* Priority 50 — above Mantle (30), Slide (10), below Wall-jump (60).
|
|
24
|
+
*
|
|
25
|
+
* @author Alex Goldring
|
|
26
|
+
* @copyright Company Named Limited (c) 2026
|
|
27
|
+
*/
|
|
28
|
+
export class WallRun extends Ability {
|
|
29
|
+
/** @private Seconds since this ability activated. */
|
|
30
|
+
private _elapsed;
|
|
31
|
+
/** @private "L" or "R" — which wall we're running on. */
|
|
32
|
+
private _side;
|
|
33
|
+
canActivate(controller: any, runtime: any, sensors: any): boolean;
|
|
34
|
+
onActivate(controller: any, runtime: any): void;
|
|
35
|
+
/**
|
|
36
|
+
* Wall-jump (priority 60) should be allowed to preempt freely; that's
|
|
37
|
+
* the canonical chain (wall-run → wall-jump). Any other higher-priority
|
|
38
|
+
* ability is also fine — wall-run is a transient state.
|
|
39
|
+
*/
|
|
40
|
+
canInterrupt(): boolean;
|
|
41
|
+
tick(controller: any, runtime: any, bodyTransform: any, dt: any, system: any): boolean;
|
|
42
|
+
}
|
|
43
|
+
import { Ability } from "./Ability.js";
|
|
44
|
+
//# sourceMappingURL=WallRun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WallRun.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/control/first-person/abilities/WallRun.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;IAMQ,qDAAqD;IACrD,iBAAiB;IACjB,yDAAyD;IACzD,cAAgB;IAGpB,kEAiBC;IAED,gDAqBC;IAED;;;;OAIG;IACH,wBAEC;IAED,uFAiFC;CAKJ;wBAlLuB,cAAc"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { DEG_TO_RAD } from "../../../../core/math/DEG_TO_RAD.js";
|
|
2
|
+
import { Ability } from "./Ability.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Wall-run ability. Activates when the player is airborne with momentum
|
|
6
|
+
* and a wall is detected to their left or right. While active:
|
|
7
|
+
*
|
|
8
|
+
* - Gravity is reduced to `cfg.wallRun.gravityFactor × base` (typically
|
|
9
|
+
* 25%), letting the player hang on the wall for longer than a normal
|
|
10
|
+
* jump arc.
|
|
11
|
+
* - Horizontal velocity is projected onto the wall's tangent each tick,
|
|
12
|
+
* so the body sticks to the wall and slides along it. Forward
|
|
13
|
+
* momentum is preserved; into-wall and out-of-wall velocity
|
|
14
|
+
* components are zeroed.
|
|
15
|
+
* - Camera tilts into the wall via the shared lean spring (writes the
|
|
16
|
+
* wall-tilt to `runtime.leanTargetRad` each tick — same channel
|
|
17
|
+
* base writes its lat-accel-derived lean to, so transitions in and
|
|
18
|
+
* out share the spring's smoothing).
|
|
19
|
+
*
|
|
20
|
+
* Exits on:
|
|
21
|
+
* - Timer (`cfg.wallRun.maxDuration`)
|
|
22
|
+
* - Lost wall contact (sensor's hit flag becomes false)
|
|
23
|
+
* - Re-grounded (we walked onto a floor at the wall's end)
|
|
24
|
+
* - Wall-jump preempts (higher priority — WallJump declares priority 60)
|
|
25
|
+
*
|
|
26
|
+
* Priority 50 — above Mantle (30), Slide (10), below Wall-jump (60).
|
|
27
|
+
*
|
|
28
|
+
* @author Alex Goldring
|
|
29
|
+
* @copyright Company Named Limited (c) 2026
|
|
30
|
+
*/
|
|
31
|
+
export class WallRun extends Ability {
|
|
32
|
+
constructor() {
|
|
33
|
+
super();
|
|
34
|
+
this.name = "WallRun";
|
|
35
|
+
this.priority = 50;
|
|
36
|
+
|
|
37
|
+
/** @private Seconds since this ability activated. */
|
|
38
|
+
this._elapsed = 0;
|
|
39
|
+
/** @private "L" or "R" — which wall we're running on. */
|
|
40
|
+
this._side = "L";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
canActivate(controller, runtime, sensors) {
|
|
44
|
+
const cfg = controller.config.wallRun;
|
|
45
|
+
if (!cfg) return false;
|
|
46
|
+
if (sensors === undefined || sensors === null) return false;
|
|
47
|
+
if (controller.state.grounded) return false;
|
|
48
|
+
if (controller.state.airborneTime < cfg.minAirborneTime) return false;
|
|
49
|
+
|
|
50
|
+
const speed = Math.hypot(runtime.velocityX, runtime.velocityZ);
|
|
51
|
+
if (speed < cfg.minSpeed) return false;
|
|
52
|
+
|
|
53
|
+
// Need a wall on left OR right (not front — that's a wall to bump into).
|
|
54
|
+
if (!sensors.wallLeft.hit && !sensors.wallRight.hit) return false;
|
|
55
|
+
|
|
56
|
+
// Forward intent required — wall-run is a committed action.
|
|
57
|
+
if (controller.intent.move.y < 0.1) return false;
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
onActivate(controller, runtime) {
|
|
63
|
+
const sensors = runtime.sensors;
|
|
64
|
+
this._elapsed = 0;
|
|
65
|
+
|
|
66
|
+
// Pick the closer wall if both detected.
|
|
67
|
+
if (sensors.wallLeft.hit
|
|
68
|
+
&& (!sensors.wallRight.hit
|
|
69
|
+
|| sensors.wallLeft.distance <= sensors.wallRight.distance)) {
|
|
70
|
+
this._side = "L";
|
|
71
|
+
} else {
|
|
72
|
+
this._side = "R";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Clear any in-progress jump state — the wall-run takes over the
|
|
76
|
+
// vertical model.
|
|
77
|
+
runtime.midJump = false;
|
|
78
|
+
runtime.apexFired = false;
|
|
79
|
+
controller.state.isVariableJumpCut = false;
|
|
80
|
+
controller.state.isAscending = false;
|
|
81
|
+
|
|
82
|
+
controller.signals.onLeaveGround.send1({ reason: "wallrun" });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Wall-jump (priority 60) should be allowed to preempt freely; that's
|
|
87
|
+
* the canonical chain (wall-run → wall-jump). Any other higher-priority
|
|
88
|
+
* ability is also fine — wall-run is a transient state.
|
|
89
|
+
*/
|
|
90
|
+
canInterrupt() {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
tick(controller, runtime, bodyTransform, dt, system) {
|
|
95
|
+
const cfg = controller.config.wallRun;
|
|
96
|
+
this._elapsed += dt;
|
|
97
|
+
|
|
98
|
+
// -- Exit: timer.
|
|
99
|
+
if (this._elapsed >= cfg.maxDuration) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// -- Exit: re-grounded (we ran onto a floor).
|
|
103
|
+
if (controller.state.grounded) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const sensors = runtime.sensors;
|
|
108
|
+
const sensorHit = this._side === "L" ? sensors.wallLeft : sensors.wallRight;
|
|
109
|
+
|
|
110
|
+
// -- Exit: lost the wall.
|
|
111
|
+
if (!sensorHit.hit) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// -- Project velocity onto the wall's tangent.
|
|
116
|
+
// The wall's normal is in the XZ plane (vertical wall). Zero the
|
|
117
|
+
// component of velocity along that normal. Forward momentum
|
|
118
|
+
// (along the wall's tangent direction) is preserved.
|
|
119
|
+
const nx = sensorHit.normal.x;
|
|
120
|
+
const nz = sensorHit.normal.z;
|
|
121
|
+
const dotN = runtime.velocityX * nx + runtime.velocityZ * nz;
|
|
122
|
+
runtime.velocityX -= dotN * nx;
|
|
123
|
+
runtime.velocityZ -= dotN * nz;
|
|
124
|
+
|
|
125
|
+
// -- Camera roll: write directly to the shared lean target.
|
|
126
|
+
// Sign convention: positive engine roll = head tilts RIGHT. Wall
|
|
127
|
+
// on LEFT → tilt LEFT → negative roll. Wall on RIGHT → tilt
|
|
128
|
+
// RIGHT → positive roll. L2.f spring-steps from this value each
|
|
129
|
+
// tick; base will overwrite once the ability releases, and the
|
|
130
|
+
// spring smooths the transition.
|
|
131
|
+
const rollSign = this._side === "L" ? -1 : 1;
|
|
132
|
+
runtime.leanTargetRad = rollSign * cfg.cameraRollDeg * DEG_TO_RAD;
|
|
133
|
+
|
|
134
|
+
// -- Reduced gravity.
|
|
135
|
+
runtime.velocityY -= runtime.gravity * cfg.gravityFactor * dt;
|
|
136
|
+
|
|
137
|
+
// -- Integrate position (manual — don't call the system's vertical
|
|
138
|
+
// phase because that would re-apply gravity with the fall multiplier).
|
|
139
|
+
bodyTransform.position._add(
|
|
140
|
+
runtime.velocityX * dt,
|
|
141
|
+
runtime.velocityY * dt,
|
|
142
|
+
runtime.velocityZ * dt,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// -- Ground catch. Reduced gravity is still gravity; over the
|
|
146
|
+
// wall-run's lifetime the player drifts down. Without a ground
|
|
147
|
+
// check here, the player can integrate PAST the floor — at
|
|
148
|
+
// which point the wall sensor eventually drops out, base
|
|
149
|
+
// resumes, and base's downward groundResolver raycast (from
|
|
150
|
+
// below the floor) doesn't find anything above. Player free-
|
|
151
|
+
// falls forever.
|
|
152
|
+
//
|
|
153
|
+
// Consult the same effective ground the base integrator uses:
|
|
154
|
+
// max(useBuiltInFlatGround baseline, groundResolver). If we've
|
|
155
|
+
// sunk to or past it, snap, zero vy, and release — base will
|
|
156
|
+
// mark grounded on the next tick.
|
|
157
|
+
let groundY = system.useBuiltInFlatGround ? system.groundY : null;
|
|
158
|
+
if (system.groundResolver !== null) {
|
|
159
|
+
const resolved = system.groundResolver(
|
|
160
|
+
bodyTransform.position.x,
|
|
161
|
+
bodyTransform.position.y,
|
|
162
|
+
bodyTransform.position.z,
|
|
163
|
+
);
|
|
164
|
+
if (resolved !== null && (groundY === null || resolved > groundY)) {
|
|
165
|
+
groundY = resolved;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (groundY !== null && bodyTransform.position.y <= groundY) {
|
|
169
|
+
bodyTransform.position.setY(groundY);
|
|
170
|
+
runtime.velocityY = 0;
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// No onDeactivate cleanup needed: on the tick we release, base runs
|
|
178
|
+
// and overwrites runtime.leanTargetRad with the natural value. The
|
|
179
|
+
// lean spring smooths the transition.
|
|
180
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Additive accumulator for body-local eye-position offsets. The first-
|
|
3
|
+
* person controller's `_composeEye` clears this each frame, pushes its
|
|
4
|
+
* own contributions (bob impact, lateral bob, breath, landing, jump
|
|
5
|
+
* anticipation, sprint posture shift), then reads the accumulated offset
|
|
6
|
+
* into the eye transform.
|
|
7
|
+
*
|
|
8
|
+
* Designed so external sources — gunfire recoil, melee impact reaction,
|
|
9
|
+
* environmental shake — can push offsets without the controller having to
|
|
10
|
+
* know about them. They reach the runtime through the same interface; the
|
|
11
|
+
* controller treats all contributions identically.
|
|
12
|
+
*
|
|
13
|
+
* Translation only. Rotation composition stays explicit in the system
|
|
14
|
+
* because the multiplication order (yaw → pitch → roll) is semantically
|
|
15
|
+
* load-bearing.
|
|
16
|
+
*
|
|
17
|
+
* @author Alex Goldring
|
|
18
|
+
* @copyright Company Named Limited (c) 2026
|
|
19
|
+
*/
|
|
20
|
+
export class EyeOffsetStack {
|
|
21
|
+
/**
|
|
22
|
+
* @readonly
|
|
23
|
+
* @type {Vector3}
|
|
24
|
+
*/
|
|
25
|
+
readonly offset: Vector3;
|
|
26
|
+
/**
|
|
27
|
+
* Reset to zero. Call once per frame before pushing.
|
|
28
|
+
*/
|
|
29
|
+
clear(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Add a vector contribution. `source` is purely for debugging and
|
|
32
|
+
* future inspection (e.g. a developer overlay listing each
|
|
33
|
+
* contribution); the math is a plain sum.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} _source label, e.g. "bob.impact", "breath", "shake"
|
|
36
|
+
* @param {number} x
|
|
37
|
+
* @param {number} y
|
|
38
|
+
* @param {number} z
|
|
39
|
+
*/
|
|
40
|
+
push(_source: string, x: number, y: number, z: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Convenience overload — push a Vector3.
|
|
43
|
+
* @param {string} _source
|
|
44
|
+
* @param {Vector3} v
|
|
45
|
+
*/
|
|
46
|
+
pushVec(_source: string, v: Vector3): void;
|
|
47
|
+
}
|
|
48
|
+
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
49
|
+
//# sourceMappingURL=EyeOffsetStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EyeOffsetStack.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/control/first-person/composer/EyeOffsetStack.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAEQ;;;OAGG;IACH,iBAFU,OAAO,CAEU;IAG/B;;OAEG;IACH,cAEC;IAED;;;;;;;;;OASG;IACH,cALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAIhB;IAED;;;;OAIG;IACH,iBAHW,MAAM,KACN,OAAO,QAIjB;CACJ;oBA3DmB,kCAAkC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Additive accumulator for body-local eye-position offsets. The first-
|
|
5
|
+
* person controller's `_composeEye` clears this each frame, pushes its
|
|
6
|
+
* own contributions (bob impact, lateral bob, breath, landing, jump
|
|
7
|
+
* anticipation, sprint posture shift), then reads the accumulated offset
|
|
8
|
+
* into the eye transform.
|
|
9
|
+
*
|
|
10
|
+
* Designed so external sources — gunfire recoil, melee impact reaction,
|
|
11
|
+
* environmental shake — can push offsets without the controller having to
|
|
12
|
+
* know about them. They reach the runtime through the same interface; the
|
|
13
|
+
* controller treats all contributions identically.
|
|
14
|
+
*
|
|
15
|
+
* Translation only. Rotation composition stays explicit in the system
|
|
16
|
+
* because the multiplication order (yaw → pitch → roll) is semantically
|
|
17
|
+
* load-bearing.
|
|
18
|
+
*
|
|
19
|
+
* @author Alex Goldring
|
|
20
|
+
* @copyright Company Named Limited (c) 2026
|
|
21
|
+
*/
|
|
22
|
+
export class EyeOffsetStack {
|
|
23
|
+
constructor() {
|
|
24
|
+
/**
|
|
25
|
+
* @readonly
|
|
26
|
+
* @type {Vector3}
|
|
27
|
+
*/
|
|
28
|
+
this.offset = new Vector3();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Reset to zero. Call once per frame before pushing.
|
|
33
|
+
*/
|
|
34
|
+
clear() {
|
|
35
|
+
this.offset.set(0, 0, 0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Add a vector contribution. `source` is purely for debugging and
|
|
40
|
+
* future inspection (e.g. a developer overlay listing each
|
|
41
|
+
* contribution); the math is a plain sum.
|
|
42
|
+
*
|
|
43
|
+
* @param {string} _source label, e.g. "bob.impact", "breath", "shake"
|
|
44
|
+
* @param {number} x
|
|
45
|
+
* @param {number} y
|
|
46
|
+
* @param {number} z
|
|
47
|
+
*/
|
|
48
|
+
push(_source, x, y, z) {
|
|
49
|
+
this.offset._add(x, y, z);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Convenience overload — push a Vector3.
|
|
54
|
+
* @param {string} _source
|
|
55
|
+
* @param {Vector3} v
|
|
56
|
+
*/
|
|
57
|
+
pushVec(_source, v) {
|
|
58
|
+
this.offset._add(v.x, v.y, v.z);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symmetric curve over breath phase ∈ [0, 1):
|
|
3
|
+
* 0.00 → neutral (mid-inhale-to-exhale transition)
|
|
4
|
+
* 0.25 → trough: inhaling (small penalty)
|
|
5
|
+
* 0.50 → neutral
|
|
6
|
+
* 0.75 → peak: exhaling (small bonus)
|
|
7
|
+
*
|
|
8
|
+
* Physically motivated. Power-output research (weightlifting, sports
|
|
9
|
+
* biomechanics) consistently finds that peak force output happens during
|
|
10
|
+
* controlled exhalation. Holding breath produces a brief assist but
|
|
11
|
+
* inhaling during exertion is measurably worse. Bonus magnitude > penalty
|
|
12
|
+
* magnitude per the project design rule (asymmetric in magnitude).
|
|
13
|
+
*
|
|
14
|
+
* The curve is parameterizable so the same evaluator can serve multiple
|
|
15
|
+
* roles: large peak/trough for "action" decisions (jump, slide, wall-
|
|
16
|
+
* jump), small peak/trough for "continuous" decisions (ground accel
|
|
17
|
+
* during running in-sync with breath).
|
|
18
|
+
*/
|
|
19
|
+
export function makeBreathRhythmCurve(peakBonus: any, troughPenalty: any): AnimationCurve;
|
|
20
|
+
/**
|
|
21
|
+
* Mastery evaluator: scales the queried quantity by breath-phase timing.
|
|
22
|
+
* Multi-decision-point — same instance fires on whatever decision points
|
|
23
|
+
* are configured. Two canonical use cases:
|
|
24
|
+
*
|
|
25
|
+
* 1. **Action evaluators** (jump, slide-start, wall-jump, mantle-exit):
|
|
26
|
+
* Default magnitudes (+3% peak / −1% trough). Fires once per event;
|
|
27
|
+
* players naturally hold or release breath when committing to an
|
|
28
|
+
* action.
|
|
29
|
+
*
|
|
30
|
+
* 2. **Sustained-action evaluator** (ground accel during in-sync run):
|
|
31
|
+
* Smaller magnitudes (+1.5% / −0.5%) and gated by exertion (only
|
|
32
|
+
* meaningful when the player is actually breathing heavily; matches
|
|
33
|
+
* the locomotor-respiratory-coupling principle — coupling-bonus
|
|
34
|
+
* kicks in at high exertion).
|
|
35
|
+
*
|
|
36
|
+
* The "smallest bonus in the system" rule applies here: this evaluator's
|
|
37
|
+
* defaults are tiny on purpose. Compounded across a long run with many
|
|
38
|
+
* actions, a breath-aware player gets a noticeable lift; a casual player
|
|
39
|
+
* who never notices the rhythm pays barely anything.
|
|
40
|
+
*
|
|
41
|
+
* Example usage:
|
|
42
|
+
*
|
|
43
|
+
* // Action bonuses — fires on jump/slide-entry/wall-jump
|
|
44
|
+
* controller.mastery.add(new BreathRhythmEvaluator());
|
|
45
|
+
*
|
|
46
|
+
* // Speed bonus during sustained heavy breathing
|
|
47
|
+
* controller.mastery.add(new BreathRhythmEvaluator({
|
|
48
|
+
* decisionPoints: [DecisionPoint.GroundAccel],
|
|
49
|
+
* peakBonus: 0.015,
|
|
50
|
+
* troughPenalty: 0.005,
|
|
51
|
+
* requireExertionAbove: 0.3,
|
|
52
|
+
* }));
|
|
53
|
+
*
|
|
54
|
+
* @author Alex Goldring
|
|
55
|
+
* @copyright Company Named Limited (c) 2026
|
|
56
|
+
*/
|
|
57
|
+
export class BreathRhythmEvaluator extends MasteryEvaluator {
|
|
58
|
+
/**
|
|
59
|
+
* @param {object} [opts]
|
|
60
|
+
* @param {number[]} [opts.decisionPoints] Defaults to action points
|
|
61
|
+
* (jump, slide entry, wall-jump). Pass [GroundAccel] for the
|
|
62
|
+
* "running in sync" speed bonus.
|
|
63
|
+
* @param {number} [opts.peakBonus] Default 0.03 = +3% at exhale.
|
|
64
|
+
* @param {number} [opts.troughPenalty] Default 0.01 = −1% at inhale.
|
|
65
|
+
* @param {number} [opts.requireExertionAbove] Below this exertion
|
|
66
|
+
* level (default 0) the evaluator returns identity. Use ~0.3 for
|
|
67
|
+
* "only when breathing heavily" semantics.
|
|
68
|
+
*/
|
|
69
|
+
constructor({ decisionPoints, peakBonus, troughPenalty, requireExertionAbove, }?: {
|
|
70
|
+
decisionPoints?: number[];
|
|
71
|
+
peakBonus?: number;
|
|
72
|
+
troughPenalty?: number;
|
|
73
|
+
requireExertionAbove?: number;
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Set of decision points this evaluator answers. Default: the
|
|
77
|
+
* three classic "action" points.
|
|
78
|
+
* @type {Set<number>}
|
|
79
|
+
*/
|
|
80
|
+
decisionPoints: Set<number>;
|
|
81
|
+
/** @type {number} */
|
|
82
|
+
peakBonus: number;
|
|
83
|
+
/** @type {number} */
|
|
84
|
+
troughPenalty: number;
|
|
85
|
+
/** @type {number} */
|
|
86
|
+
requireExertionAbove: number;
|
|
87
|
+
/** Magnitude exponent — scales the deviation around 1.0. */
|
|
88
|
+
flatBoost: number;
|
|
89
|
+
/** @private */
|
|
90
|
+
private _curve;
|
|
91
|
+
/**
|
|
92
|
+
* Rebuild the curve from current peakBonus/troughPenalty. Call after
|
|
93
|
+
* mutating those fields if you want the change to take effect.
|
|
94
|
+
*/
|
|
95
|
+
rebuildCurve(): void;
|
|
96
|
+
evaluate(decisionPoint: any, controller: any, _runtime: any): number;
|
|
97
|
+
}
|
|
98
|
+
import { AnimationCurve } from "../../../animation/curve/AnimationCurve.js";
|
|
99
|
+
import { MasteryEvaluator } from "./MasteryEvaluator.js";
|
|
100
|
+
//# sourceMappingURL=BreathRhythmEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreathRhythmEvaluator.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/control/first-person/mastery/BreathRhythmEvaluator.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;GAiBG;AACH,0FAQC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH;IACI;;;;;;;;;;OAUG;IACH;QAT2B,cAAc,GAA9B,MAAM,EAAE;QAGM,SAAS,GAAvB,MAAM;QACQ,aAAa,GAA3B,MAAM;QACQ,oBAAoB,GAAlC,MAAM;OAoChB;IAvBG;;;;OAIG;IACH,gBAFU,IAAI,MAAM,CAAC,CAMnB;IAEF,qBAAqB;IACrB,WADW,MAAM,CACS;IAC1B,qBAAqB;IACrB,eADW,MAAM,CACiB;IAClC,qBAAqB;IACrB,sBADW,MAAM,CAC+B;IAEhD,4DAA4D;IAC5D,kBAAoB;IAEpB,eAAe;IACf,eAA6D;IAGjE;;;OAGG;IACH,qBAEC;IAED,qEAOC;CACJ;+BApI8B,4CAA4C;iCAG1C,uBAAuB"}
|