@woosh/meep-engine 2.138.19 → 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 +2 -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 +6 -4
- 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/ecs/EntityManager.d.ts +2 -2
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +13 -8
- package/src/engine/ecs/System.d.ts.map +1 -1
- package/src/engine/ecs/System.js +2 -2
- 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
|
@@ -1,91 +1,102 @@
|
|
|
1
|
-
import { MetricCollection } from "../../development/performance/MetricCollection.js";
|
|
2
|
-
import {
|
|
3
|
-
MetricCollectionConsoleMonitor
|
|
4
|
-
} from "../../development/performance/monitor/MetricCollectionConsoleMonitor.js";
|
|
5
|
-
import Entity from "../../ecs/Entity.js";
|
|
6
|
-
import GUIElement from "../../ecs/gui/GUIElement.js";
|
|
7
|
-
import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
|
|
8
|
-
import { EngineHarness } from "../../EngineHarness.js";
|
|
9
|
-
import { BehaviorComponent } from "../../intelligence/behavior/ecs/BehaviorComponent.js";
|
|
10
|
-
import { BehaviorSystem } from "../../intelligence/behavior/ecs/BehaviorSystem.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
metrics
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
* @param {Engine} engine
|
|
24
|
-
*/
|
|
25
|
-
function main(engine) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
field.
|
|
34
|
-
|
|
35
|
-
field.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
field
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
1
|
+
import { MetricCollection } from "../../development/performance/MetricCollection.js";
|
|
2
|
+
import {
|
|
3
|
+
MetricCollectionConsoleMonitor
|
|
4
|
+
} from "../../development/performance/monitor/MetricCollectionConsoleMonitor.js";
|
|
5
|
+
import Entity from "../../ecs/Entity.js";
|
|
6
|
+
import GUIElement from "../../ecs/gui/GUIElement.js";
|
|
7
|
+
import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
|
|
8
|
+
import { EngineHarness } from "../../EngineHarness.js";
|
|
9
|
+
import { BehaviorComponent } from "../../intelligence/behavior/ecs/BehaviorComponent.js";
|
|
10
|
+
import { BehaviorSystem } from "../../intelligence/behavior/ecs/BehaviorSystem.js";
|
|
11
|
+
import { FluidComponent } from "./ecs/FluidComponent.js";
|
|
12
|
+
import { FluidEffectorsComponent } from "./ecs/FluidEffectorsComponent.js";
|
|
13
|
+
import { FluidSystem } from "./ecs/FluidSystem.js";
|
|
14
|
+
import { GlobalFluidEffector } from "./effector/GlobalFluidEffector.js";
|
|
15
|
+
import { ImpulseFluidEffector } from "./effector/ImpulseFluidEffector.js";
|
|
16
|
+
import { SliceVisualiser } from "./SliceVisualiser.js";
|
|
17
|
+
|
|
18
|
+
const harness = new EngineHarness();
|
|
19
|
+
const metrics = new MetricCollection();
|
|
20
|
+
metrics.create({ name: 'sim' });
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {Engine} engine
|
|
24
|
+
*/
|
|
25
|
+
function main(engine) {
|
|
26
|
+
const ecd = engine.entityManager.dataset;
|
|
27
|
+
|
|
28
|
+
const RES_X = 32, RES_Y = 32, RES_Z = 8;
|
|
29
|
+
|
|
30
|
+
// Fluid volume entity: holds the field + its world placement. The FluidSystem
|
|
31
|
+
// will step it each fixed update.
|
|
32
|
+
const fluid_component = new FluidComponent();
|
|
33
|
+
fluid_component.field.setResolution(RES_X, RES_Y, RES_Z);
|
|
34
|
+
fluid_component.field.addScalar("dye");
|
|
35
|
+
fluid_component.field.build();
|
|
36
|
+
fluid_component.origin = [0, 0, 0];
|
|
37
|
+
fluid_component.cell_size = 1; // world = grid for this demo
|
|
38
|
+
|
|
39
|
+
// Seed a dye blob in the middle so the advection is visually obvious.
|
|
40
|
+
const field = fluid_component.field;
|
|
41
|
+
for (let z = 1; z < RES_Z - 1; z++) {
|
|
42
|
+
for (let dy = -2; dy <= 2; dy++) {
|
|
43
|
+
for (let dx = -2; dx <= 2; dx++) {
|
|
44
|
+
field.setScalarAtIndex(0,
|
|
45
|
+
(RES_X >> 1) + dx, (RES_Y >> 1) + dy, z,
|
|
46
|
+
1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
new Entity().add(fluid_component).build(ecd);
|
|
52
|
+
|
|
53
|
+
// Effector entity: separate from the fluid volume. With cell_size=1 above, world
|
|
54
|
+
// coords here line up 1:1 with grid coords.
|
|
55
|
+
const effectors = new FluidEffectorsComponent();
|
|
56
|
+
|
|
57
|
+
const gravity = new GlobalFluidEffector();
|
|
58
|
+
gravity.force = [0, -5, 0];
|
|
59
|
+
effectors.addEffector(gravity);
|
|
60
|
+
|
|
61
|
+
const swirl = new ImpulseFluidEffector();
|
|
62
|
+
swirl.position = [RES_X >> 1, RES_Y >> 1, RES_Z >> 1];
|
|
63
|
+
swirl.force = [15, 0, 0];
|
|
64
|
+
swirl.radius = 3;
|
|
65
|
+
effectors.addEffector(swirl);
|
|
66
|
+
|
|
67
|
+
new Entity().add(effectors).build(ecd);
|
|
68
|
+
|
|
69
|
+
// Debug visualisation — a per-frame behavior, separate from the fluid stepping.
|
|
70
|
+
const slice_view = new SliceVisualiser();
|
|
71
|
+
slice_view.size.set(RES_X * 6, RES_Y * 2);
|
|
72
|
+
slice_view.scale.setScalar(2);
|
|
73
|
+
slice_view.transformOrigin.set(0, 0);
|
|
74
|
+
slice_view.setChannels(
|
|
75
|
+
[field.velocity_x, field.velocity_y, field.velocity_z, field.getScalarData("dye")],
|
|
76
|
+
field.getResolution()
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
new Entity()
|
|
80
|
+
.add(BehaviorComponent.loop(() => {
|
|
81
|
+
// FluidSystem.fixedUpdate is what advances the sim; we just observe and
|
|
82
|
+
// time the draw cost here.
|
|
83
|
+
const t0 = performance.now();
|
|
84
|
+
slice_view.draw();
|
|
85
|
+
metrics.get('sim').record(performance.now() - t0);
|
|
86
|
+
}))
|
|
87
|
+
.build(ecd);
|
|
88
|
+
|
|
89
|
+
MetricCollectionConsoleMonitor.from(metrics).start();
|
|
90
|
+
|
|
91
|
+
new Entity()
|
|
92
|
+
.add(GUIElement.fromView(slice_view))
|
|
93
|
+
.build(ecd);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
harness.initialize({
|
|
97
|
+
configuration(config, engine) {
|
|
98
|
+
config.addSystem(new GUIElementSystem(engine.gameView, engine));
|
|
99
|
+
config.addSystem(new BehaviorSystem(engine));
|
|
100
|
+
config.addSystem(new FluidSystem());
|
|
101
|
+
}
|
|
102
|
+
}).then(main);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimal SOR relaxation factor for the 7-point Laplacian on a cell-centered grid
|
|
3
|
+
* with Neumann boundaries (the discretisation {@link v3_grid_solve_pressure} uses).
|
|
4
|
+
*
|
|
5
|
+
* For a Poisson problem on a uniform grid of side `N`, the Jacobi iteration matrix
|
|
6
|
+
* has spectral radius `ρ_J ≈ cos(π/N)`. The classical optimal SOR factor is
|
|
7
|
+
*
|
|
8
|
+
* ω_opt = 2 / (1 + √(1 - ρ_J²)) = 2 / (1 + sin(π/N))
|
|
9
|
+
*
|
|
10
|
+
* On non-cubic grids the slowest-converging mode has a wavelength bounded below by
|
|
11
|
+
* the longest side, so we use `N = max(res_x, res_y, res_z)`. This is slightly
|
|
12
|
+
* conservative on lopsided grids — the true optimum would also account for the
|
|
13
|
+
* shorter axes — but it never overshoots into the divergent ω ≥ 2 region, and the
|
|
14
|
+
* dropoff in convergence rate around the optimum is mild.
|
|
15
|
+
*
|
|
16
|
+
* Reference values:
|
|
17
|
+
* N = 8 → ω ≈ 1.446
|
|
18
|
+
* N = 16 → ω ≈ 1.674
|
|
19
|
+
* N = 32 → ω ≈ 1.821
|
|
20
|
+
* N = 64 → ω ≈ 1.906
|
|
21
|
+
* N = 128 → ω ≈ 1.952
|
|
22
|
+
*
|
|
23
|
+
* Note the value is always in `(1, 2)` — `1 < ω` for `N ≥ 2`, and `ω → 2` as
|
|
24
|
+
* `N → ∞`. A hardcoded 1.7 is roughly correct for 16³ and dramatically too
|
|
25
|
+
* cautious for 128³.
|
|
26
|
+
*
|
|
27
|
+
* @param {number} res_x
|
|
28
|
+
* @param {number} res_y
|
|
29
|
+
* @param {number} res_z
|
|
30
|
+
* @returns {number} ω in (0, 2)
|
|
31
|
+
*/
|
|
32
|
+
export function optimal_sor_omega(res_x: number, res_y: number, res_z: number): number;
|
|
33
|
+
//# sourceMappingURL=optimal_sor_omega.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimal_sor_omega.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/optimal_sor_omega.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,yCALW,MAAM,SACN,MAAM,SACN,MAAM,GACJ,MAAM,CASlB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optimal SOR relaxation factor for the 7-point Laplacian on a cell-centered grid
|
|
5
|
+
* with Neumann boundaries (the discretisation {@link v3_grid_solve_pressure} uses).
|
|
6
|
+
*
|
|
7
|
+
* For a Poisson problem on a uniform grid of side `N`, the Jacobi iteration matrix
|
|
8
|
+
* has spectral radius `ρ_J ≈ cos(π/N)`. The classical optimal SOR factor is
|
|
9
|
+
*
|
|
10
|
+
* ω_opt = 2 / (1 + √(1 - ρ_J²)) = 2 / (1 + sin(π/N))
|
|
11
|
+
*
|
|
12
|
+
* On non-cubic grids the slowest-converging mode has a wavelength bounded below by
|
|
13
|
+
* the longest side, so we use `N = max(res_x, res_y, res_z)`. This is slightly
|
|
14
|
+
* conservative on lopsided grids — the true optimum would also account for the
|
|
15
|
+
* shorter axes — but it never overshoots into the divergent ω ≥ 2 region, and the
|
|
16
|
+
* dropoff in convergence rate around the optimum is mild.
|
|
17
|
+
*
|
|
18
|
+
* Reference values:
|
|
19
|
+
* N = 8 → ω ≈ 1.446
|
|
20
|
+
* N = 16 → ω ≈ 1.674
|
|
21
|
+
* N = 32 → ω ≈ 1.821
|
|
22
|
+
* N = 64 → ω ≈ 1.906
|
|
23
|
+
* N = 128 → ω ≈ 1.952
|
|
24
|
+
*
|
|
25
|
+
* Note the value is always in `(1, 2)` — `1 < ω` for `N ≥ 2`, and `ω → 2` as
|
|
26
|
+
* `N → ∞`. A hardcoded 1.7 is roughly correct for 16³ and dramatically too
|
|
27
|
+
* cautious for 128³.
|
|
28
|
+
*
|
|
29
|
+
* @param {number} res_x
|
|
30
|
+
* @param {number} res_y
|
|
31
|
+
* @param {number} res_z
|
|
32
|
+
* @returns {number} ω in (0, 2)
|
|
33
|
+
*/
|
|
34
|
+
export function optimal_sor_omega(res_x, res_y, res_z) {
|
|
35
|
+
assert.isPositiveInteger(res_x, "res_x");
|
|
36
|
+
assert.isPositiveInteger(res_y, "res_y");
|
|
37
|
+
assert.isPositiveInteger(res_z, "res_z");
|
|
38
|
+
|
|
39
|
+
const n = Math.max(res_x, res_y, res_z);
|
|
40
|
+
return 2 / (1 + Math.sin(Math.PI / n));
|
|
41
|
+
}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Semi-Lagrangian self-advection of a cell-centered 3D velocity field.
|
|
2
3
|
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* For each cell, traces backward along the current velocity for one timestep, then
|
|
5
|
+
* trilinearly samples each input velocity component at that back-traced position.
|
|
6
|
+
* Stable for arbitrarily large `time_delta` (the trade-off is numerical diffusion;
|
|
7
|
+
* the field gets blurrier each step).
|
|
8
|
+
*
|
|
9
|
+
* Inputs and outputs must be disjoint Float32Arrays of length `res_x * res_y * res_z`.
|
|
10
|
+
* Cells flagged solid (non-zero in `solid`) keep their input value unchanged.
|
|
11
|
+
*
|
|
12
|
+
* @param {Float32Array[]} outputs `[out_x, out_y, out_z]`, mutated.
|
|
13
|
+
* @param {Float32Array[]} inputs `[in_x, in_y, in_z]`, read; expected to alias the
|
|
14
|
+
* "current" velocity field that drives back-tracing.
|
|
15
|
+
* @param {number} res_x
|
|
16
|
+
* @param {number} res_y
|
|
17
|
+
* @param {number} res_z
|
|
18
|
+
* @param {number} time_delta Simulation timestep, in the same units as velocity
|
|
19
|
+
* (grid-cells / second when used standalone).
|
|
20
|
+
* @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
|
|
21
|
+
* domain); non-zero cells are not updated.
|
|
7
22
|
*/
|
|
8
|
-
export function v3_grid_apply_advection_forward(outputs: Float32Array[], inputs: Float32Array[],
|
|
23
|
+
export function v3_grid_apply_advection_forward(outputs: Float32Array[], inputs: Float32Array[], res_x: number, res_y: number, res_z: number, time_delta: number, solid: Uint8Array): void;
|
|
9
24
|
//# sourceMappingURL=v3_grid_apply_advection_forward.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3_grid_apply_advection_forward.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"v3_grid_apply_advection_forward.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,yDAXW,YAAY,EAAE,UACd,YAAY,EAAE,SAEd,MAAM,SACN,MAAM,SACN,MAAM,cACN,MAAM,SAEN,UAAU,QA6DpB"}
|
|
@@ -1,61 +1,83 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
1
2
|
import { scs3d_sample_linear } from "../../../graphics/texture/3d/scs3d_sample_linear.js";
|
|
2
3
|
|
|
3
4
|
/**
|
|
5
|
+
* Semi-Lagrangian self-advection of a cell-centered 3D velocity field.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* For each cell, traces backward along the current velocity for one timestep, then
|
|
8
|
+
* trilinearly samples each input velocity component at that back-traced position.
|
|
9
|
+
* Stable for arbitrarily large `time_delta` (the trade-off is numerical diffusion;
|
|
10
|
+
* the field gets blurrier each step).
|
|
11
|
+
*
|
|
12
|
+
* Inputs and outputs must be disjoint Float32Arrays of length `res_x * res_y * res_z`.
|
|
13
|
+
* Cells flagged solid (non-zero in `solid`) keep their input value unchanged.
|
|
14
|
+
*
|
|
15
|
+
* @param {Float32Array[]} outputs `[out_x, out_y, out_z]`, mutated.
|
|
16
|
+
* @param {Float32Array[]} inputs `[in_x, in_y, in_z]`, read; expected to alias the
|
|
17
|
+
* "current" velocity field that drives back-tracing.
|
|
18
|
+
* @param {number} res_x
|
|
19
|
+
* @param {number} res_y
|
|
20
|
+
* @param {number} res_z
|
|
21
|
+
* @param {number} time_delta Simulation timestep, in the same units as velocity
|
|
22
|
+
* (grid-cells / second when used standalone).
|
|
23
|
+
* @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
|
|
24
|
+
* domain); non-zero cells are not updated.
|
|
9
25
|
*/
|
|
10
|
-
export function v3_grid_apply_advection_forward(outputs, inputs,
|
|
26
|
+
export function v3_grid_apply_advection_forward(outputs, inputs, res_x, res_y, res_z, time_delta, solid) {
|
|
27
|
+
assert.equal(outputs.length, 3, "outputs is a 3-component array");
|
|
28
|
+
assert.equal(inputs.length, 3, "inputs is a 3-component array");
|
|
11
29
|
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
30
|
+
const out_x = outputs[0];
|
|
31
|
+
const out_y = outputs[1];
|
|
32
|
+
const out_z = outputs[2];
|
|
15
33
|
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
34
|
+
const in_x = inputs[0];
|
|
35
|
+
const in_y = inputs[1];
|
|
36
|
+
const in_z = inputs[2];
|
|
19
37
|
|
|
20
|
-
const
|
|
38
|
+
const cell_count = res_x * res_y * res_z;
|
|
21
39
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
)
|
|
40
|
+
assert.greaterThanOrEqual(out_x.length, cell_count, "out_x covers grid");
|
|
41
|
+
assert.greaterThanOrEqual(out_y.length, cell_count, "out_y covers grid");
|
|
42
|
+
assert.greaterThanOrEqual(out_z.length, cell_count, "out_z covers grid");
|
|
43
|
+
assert.greaterThanOrEqual(in_x.length, cell_count, "in_x covers grid");
|
|
44
|
+
assert.greaterThanOrEqual(in_y.length, cell_count, "in_y covers grid");
|
|
45
|
+
assert.greaterThanOrEqual(in_z.length, cell_count, "in_z covers grid");
|
|
27
46
|
|
|
28
|
-
|
|
47
|
+
assert.notEqual(out_x, in_x, "out_x must not alias in_x");
|
|
48
|
+
assert.notEqual(out_y, in_y, "out_y must not alias in_y");
|
|
49
|
+
assert.notEqual(out_z, in_z, "out_z must not alias in_z");
|
|
29
50
|
|
|
30
|
-
|
|
31
|
-
let y = 0;
|
|
32
|
-
y < res_y;
|
|
33
|
-
y++
|
|
34
|
-
) {
|
|
35
|
-
const current_y_line_offset = y * res_x;
|
|
51
|
+
const slice_size = res_x * res_y;
|
|
36
52
|
|
|
37
|
-
|
|
53
|
+
for (let z = 0; z < res_z; z++) {
|
|
54
|
+
const z_off = z * slice_size;
|
|
38
55
|
|
|
56
|
+
for (let y = 0; y < res_y; y++) {
|
|
57
|
+
const y_off = y * res_x;
|
|
39
58
|
|
|
40
|
-
|
|
59
|
+
for (let x = 0; x < res_x; x++) {
|
|
60
|
+
const c = z_off + y_off + x;
|
|
61
|
+
|
|
62
|
+
if (solid[c] !== 0) {
|
|
63
|
+
out_x[c] = in_x[c];
|
|
64
|
+
out_y[c] = in_y[c];
|
|
65
|
+
out_z[c] = in_z[c];
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
41
68
|
|
|
42
|
-
const v_x =
|
|
43
|
-
const v_y =
|
|
44
|
-
const v_z =
|
|
69
|
+
const v_x = in_x[c];
|
|
70
|
+
const v_y = in_y[c];
|
|
71
|
+
const v_z = in_z[c];
|
|
45
72
|
|
|
46
|
-
//
|
|
73
|
+
// Trace back to where this parcel came from one timestep ago.
|
|
47
74
|
const s_x = x - v_x * time_delta;
|
|
48
75
|
const s_y = y - v_y * time_delta;
|
|
49
76
|
const s_z = z - v_z * time_delta;
|
|
50
77
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const new_z = scs3d_sample_linear(input_z, res_x, res_y, res_z, s_x, s_y, s_z);
|
|
55
|
-
|
|
56
|
-
outputs[0][current_index] = new_x;
|
|
57
|
-
outputs[1][current_index] = new_y;
|
|
58
|
-
outputs[2][current_index] = new_z;
|
|
78
|
+
out_x[c] = scs3d_sample_linear(in_x, res_x, res_y, res_z, s_x, s_y, s_z);
|
|
79
|
+
out_y[c] = scs3d_sample_linear(in_y, res_x, res_y, res_z, s_x, s_y, s_z);
|
|
80
|
+
out_z[c] = scs3d_sample_linear(in_z, res_x, res_y, res_z, s_x, s_y, s_z);
|
|
59
81
|
}
|
|
60
82
|
}
|
|
61
83
|
}
|
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Implicit (Gauss-Seidel-like) Jacobi diffusion on a 3D cell-centered scalar grid.
|
|
2
3
|
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Solves the implicit diffusion equation `(I - a*L) x = x0` for `x`, where L is the
|
|
5
|
+
* discrete Laplacian. Solving implicitly is unconditionally stable for any `a >= 0`,
|
|
6
|
+
* which is why Stam's "Stable Fluids" uses it instead of an explicit step.
|
|
7
|
+
*
|
|
8
|
+
* Each iteration writes into a scratch buffer and swaps; after `iterations` rounds the
|
|
9
|
+
* final result is copied into `output`. Increasing `iterations` increases accuracy at
|
|
10
|
+
* linear cost; 4-20 is the usual range. Boundary cells use Neumann (reflective)
|
|
11
|
+
* conditions — missing neighbours are treated as equal to the cell itself, which
|
|
12
|
+
* reduces the effective denominator.
|
|
13
|
+
*
|
|
14
|
+
* Solid cells (marked non-zero in `solid`) are skipped: their value in `output` is
|
|
15
|
+
* left at the corresponding `x0` value.
|
|
16
|
+
*
|
|
17
|
+
* @param {Float32Array} output Destination (size = res_x * res_y * res_z). Mutated.
|
|
18
|
+
* @param {Float32Array} x0 Source values to diffuse. NOT mutated.
|
|
19
|
+
* @param {Float32Array} scratch Same size as output; used for ping-pong. Mutated.
|
|
20
|
+
* @param {number} res_x
|
|
21
|
+
* @param {number} res_y
|
|
22
|
+
* @param {number} res_z
|
|
23
|
+
* @param {number} a Implicit diffusion coefficient (= dt * diffusion_rate).
|
|
24
|
+
* @param {number} iterations Jacobi iteration count.
|
|
25
|
+
* @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
|
|
26
|
+
* domain); non-zero cells are not updated.
|
|
6
27
|
*/
|
|
7
|
-
export function v3_grid_apply_diffusion(output: Float32Array,
|
|
28
|
+
export function v3_grid_apply_diffusion(output: Float32Array, x0: Float32Array, scratch: Float32Array, res_x: number, res_y: number, res_z: number, a: number, iterations: number, solid: Uint8Array): void;
|
|
8
29
|
//# sourceMappingURL=v3_grid_apply_diffusion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3_grid_apply_diffusion.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"v3_grid_apply_diffusion.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,gDAXW,YAAY,MACZ,YAAY,WACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,KACN,MAAM,cACN,MAAM,SACN,UAAU,QA2EpB"}
|
|
@@ -1,82 +1,102 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
|
|
1
3
|
/**
|
|
4
|
+
* Implicit (Gauss-Seidel-like) Jacobi diffusion on a 3D cell-centered scalar grid.
|
|
5
|
+
*
|
|
6
|
+
* Solves the implicit diffusion equation `(I - a*L) x = x0` for `x`, where L is the
|
|
7
|
+
* discrete Laplacian. Solving implicitly is unconditionally stable for any `a >= 0`,
|
|
8
|
+
* which is why Stam's "Stable Fluids" uses it instead of an explicit step.
|
|
9
|
+
*
|
|
10
|
+
* Each iteration writes into a scratch buffer and swaps; after `iterations` rounds the
|
|
11
|
+
* final result is copied into `output`. Increasing `iterations` increases accuracy at
|
|
12
|
+
* linear cost; 4-20 is the usual range. Boundary cells use Neumann (reflective)
|
|
13
|
+
* conditions — missing neighbours are treated as equal to the cell itself, which
|
|
14
|
+
* reduces the effective denominator.
|
|
2
15
|
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
16
|
+
* Solid cells (marked non-zero in `solid`) are skipped: their value in `output` is
|
|
17
|
+
* left at the corresponding `x0` value.
|
|
18
|
+
*
|
|
19
|
+
* @param {Float32Array} output Destination (size = res_x * res_y * res_z). Mutated.
|
|
20
|
+
* @param {Float32Array} x0 Source values to diffuse. NOT mutated.
|
|
21
|
+
* @param {Float32Array} scratch Same size as output; used for ping-pong. Mutated.
|
|
22
|
+
* @param {number} res_x
|
|
23
|
+
* @param {number} res_y
|
|
24
|
+
* @param {number} res_z
|
|
25
|
+
* @param {number} a Implicit diffusion coefficient (= dt * diffusion_rate).
|
|
26
|
+
* @param {number} iterations Jacobi iteration count.
|
|
27
|
+
* @param {Uint8Array} solid Required cell flags (zero-filled for a wall-free
|
|
28
|
+
* domain); non-zero cells are not updated.
|
|
6
29
|
*/
|
|
7
|
-
export function v3_grid_apply_diffusion(output,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
let current_z_slice_offset = 0;
|
|
24
|
-
current_z_slice_offset <= last_z_slice_offset;
|
|
25
|
-
current_z_slice_offset += slice_size
|
|
26
|
-
) {
|
|
27
|
-
|
|
28
|
-
for (
|
|
29
|
-
let current_y_line_offset = 0;
|
|
30
|
-
current_y_line_offset <= last_y_line_offset;
|
|
31
|
-
current_y_line_offset += res_x
|
|
32
|
-
) {
|
|
33
|
-
|
|
34
|
-
for (let x = 0; x < res_x; x++) {
|
|
35
|
-
|
|
36
|
-
let sample_count = 1;
|
|
37
|
-
|
|
38
|
-
sum = 0;
|
|
39
|
-
|
|
40
|
-
// sample cells around
|
|
41
|
-
if (current_z_slice_offset > 0) {
|
|
42
|
-
sample_count++;
|
|
43
|
-
sum += input[current_z_slice_offset - slice_size + current_y_line_offset + x]
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (current_y_line_offset > 0) {
|
|
48
|
-
sample_count++;
|
|
49
|
-
sum += input[current_z_slice_offset + current_y_line_offset - res_x + x]
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (x > 0) {
|
|
53
|
-
sample_count++;
|
|
54
|
-
sum += input[current_z_slice_offset + current_y_line_offset + (x - 1)]
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const current = current_z_slice_offset + current_y_line_offset + x;
|
|
59
|
-
|
|
60
|
-
sum += input[current];
|
|
61
|
-
|
|
62
|
-
if (x < res_x - 1) {
|
|
63
|
-
sample_count++;
|
|
64
|
-
sum += input[current_z_slice_offset + current_y_line_offset + (x + 1)]
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (current_y_line_offset < last_y_line_offset) {
|
|
68
|
-
sample_count++;
|
|
69
|
-
sum += input[current_z_slice_offset + current_y_line_offset + res_x + x]
|
|
70
|
-
}
|
|
30
|
+
export function v3_grid_apply_diffusion(output, x0, scratch, res_x, res_y, res_z, a, iterations, solid) {
|
|
31
|
+
assert.notEqual(output, x0, "output must differ from x0 (x0 is the source and must not be mutated)");
|
|
32
|
+
assert.notEqual(output, scratch, "output must differ from scratch");
|
|
33
|
+
assert.notEqual(x0, scratch, "x0 must differ from scratch");
|
|
34
|
+
assert.greaterThanOrEqual(output.length, res_x * res_y * res_z, "output covers grid");
|
|
35
|
+
assert.greaterThanOrEqual(x0.length, res_x * res_y * res_z, "x0 covers grid");
|
|
36
|
+
assert.greaterThanOrEqual(scratch.length, res_x * res_y * res_z, "scratch covers grid");
|
|
37
|
+
assert.greaterThanOrEqual(a, 0, "a");
|
|
38
|
+
assert.isNonNegativeInteger(iterations, "iterations");
|
|
39
|
+
|
|
40
|
+
// Seed first iterate with x0.
|
|
41
|
+
output.set(x0);
|
|
42
|
+
|
|
43
|
+
if (iterations === 0 || a === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
71
46
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
47
|
+
const slice_size = res_x * res_y;
|
|
48
|
+
const last_x = res_x - 1;
|
|
49
|
+
const last_y = res_y - 1;
|
|
50
|
+
const last_z = res_z - 1;
|
|
51
|
+
|
|
52
|
+
let prev = output;
|
|
53
|
+
let next = scratch;
|
|
54
|
+
|
|
55
|
+
for (let iter = 0; iter < iterations; iter++) {
|
|
56
|
+
|
|
57
|
+
for (let z = 0; z < res_z; z++) {
|
|
58
|
+
const z_off = z * slice_size;
|
|
59
|
+
const has_zm = z > 0;
|
|
60
|
+
const has_zp = z < last_z;
|
|
61
|
+
|
|
62
|
+
for (let y = 0; y < res_y; y++) {
|
|
63
|
+
const y_off = y * res_x;
|
|
64
|
+
const has_ym = y > 0;
|
|
65
|
+
const has_yp = y < last_y;
|
|
66
|
+
|
|
67
|
+
for (let x = 0; x < res_x; x++) {
|
|
68
|
+
const c = z_off + y_off + x;
|
|
69
|
+
|
|
70
|
+
if (solid[c] !== 0) {
|
|
71
|
+
next[c] = x0[c];
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let sum = 0;
|
|
76
|
+
let count = 0;
|
|
77
|
+
|
|
78
|
+
if (x > 0) { sum += prev[c - 1]; count++; }
|
|
79
|
+
if (x < last_x) { sum += prev[c + 1]; count++; }
|
|
80
|
+
if (has_ym) { sum += prev[c - res_x]; count++; }
|
|
81
|
+
if (has_yp) { sum += prev[c + res_x]; count++; }
|
|
82
|
+
if (has_zm) { sum += prev[c - slice_size]; count++; }
|
|
83
|
+
if (has_zp) { sum += prev[c + slice_size]; count++; }
|
|
84
|
+
|
|
85
|
+
// Implicit Jacobi update with Neumann boundary correction:
|
|
86
|
+
// missing neighbours contribute as if equal to the cell, which is
|
|
87
|
+
// equivalent to dropping them from both the numerator and the
|
|
88
|
+
// denominator factor on `a`.
|
|
89
|
+
next[c] = (x0[c] + a * sum) / (1 + a * count);
|
|
75
90
|
}
|
|
76
|
-
|
|
77
|
-
output[current] = sum / sample_count;
|
|
78
|
-
|
|
79
91
|
}
|
|
80
92
|
}
|
|
93
|
+
|
|
94
|
+
const tmp = prev;
|
|
95
|
+
prev = next;
|
|
96
|
+
next = tmp;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (prev !== output) {
|
|
100
|
+
output.set(prev);
|
|
81
101
|
}
|
|
82
102
|
}
|