@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
|
@@ -51,6 +51,20 @@ export class BinaryTopology {
|
|
|
51
51
|
* l: uint32 // The list of loops around the edge points at a Loop
|
|
52
52
|
* v1_disk_link: uint32[2] // Disk Cycle Pointers edge around vertex v1 and d2 does the same for v2.
|
|
53
53
|
* v2_disk_link: uint32[2] // see above
|
|
54
|
+
*
|
|
55
|
+
* Disk cycle convention:
|
|
56
|
+
* For every vertex v with at least one incident edge, the edges incident
|
|
57
|
+
* to v form a doubly-linked cycle threaded through their disk_link slots.
|
|
58
|
+
* Each non-self-loop edge e uses exactly ONE slot in v's cycle: the v1
|
|
59
|
+
* slot if `vertex1(e) === v`, otherwise the v2 slot. Callers select the
|
|
60
|
+
* side with `is_v1 = edge_read_vertex1(e) === v`.
|
|
61
|
+
*
|
|
62
|
+
* Self-loops (vertex1(e) === vertex2(e) === v) are represented with ONE
|
|
63
|
+
* slot too, by convention the v1 slot. The v2_disk_link of a self-loop is
|
|
64
|
+
* UNSPECIFIED -- readers must not follow it, writers must not assume any
|
|
65
|
+
* prior value. Insertion/removal helpers must be called exactly once per
|
|
66
|
+
* self-loop (not once per "endpoint"), otherwise the v1 slot is scribbled
|
|
67
|
+
* on a second time and the cycle is corrupted.
|
|
54
68
|
* @type {BinaryElementPool}
|
|
55
69
|
* @private
|
|
56
70
|
*/
|
|
@@ -80,17 +94,52 @@ export class BinaryTopology {
|
|
|
80
94
|
*/
|
|
81
95
|
__face_pool = new BinaryElementPool(UINT_32_SIZE + FLOAT_32_SIZE * 3);
|
|
82
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Optional opaque per-vertex data pool. Item IDs map 1:1 with vertex IDs.
|
|
99
|
+
* Null until {@link create_vertex_data} is called.
|
|
100
|
+
* @type {BinaryElementPool|null}
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
__vertex_data_pool = null;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Optional opaque per-edge data pool. Item IDs map 1:1 with edge IDs.
|
|
107
|
+
* @type {BinaryElementPool|null}
|
|
108
|
+
* @private
|
|
109
|
+
*/
|
|
110
|
+
__edge_data_pool = null;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Optional opaque per-loop data pool. Item IDs map 1:1 with loop IDs.
|
|
114
|
+
* @type {BinaryElementPool|null}
|
|
115
|
+
* @private
|
|
116
|
+
*/
|
|
117
|
+
__loop_data_pool = null;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Optional opaque per-face data pool. Item IDs map 1:1 with face IDs.
|
|
121
|
+
* @type {BinaryElementPool|null}
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
__face_data_pool = null;
|
|
125
|
+
|
|
83
126
|
|
|
84
127
|
/**
|
|
85
128
|
* Total (approximate) size of this structure in memory, in bytes
|
|
86
129
|
* @return {number}
|
|
87
130
|
*/
|
|
88
131
|
get byteSize() {
|
|
89
|
-
|
|
132
|
+
let total = this.__loop_pool.byteSize
|
|
90
133
|
+ this.__vertex_pool.byteSize
|
|
91
134
|
+ this.__edge_pool.byteSize
|
|
92
|
-
+ this.__face_pool.byteSize
|
|
93
|
-
|
|
135
|
+
+ this.__face_pool.byteSize;
|
|
136
|
+
|
|
137
|
+
if (this.__vertex_data_pool !== null) total += this.__vertex_data_pool.byteSize;
|
|
138
|
+
if (this.__edge_data_pool !== null) total += this.__edge_data_pool.byteSize;
|
|
139
|
+
if (this.__loop_data_pool !== null) total += this.__loop_data_pool.byteSize;
|
|
140
|
+
if (this.__face_data_pool !== null) total += this.__face_data_pool.byteSize;
|
|
141
|
+
|
|
142
|
+
return total;
|
|
94
143
|
}
|
|
95
144
|
|
|
96
145
|
/**
|
|
@@ -102,6 +151,11 @@ export class BinaryTopology {
|
|
|
102
151
|
this.__vertex_pool.trim();
|
|
103
152
|
this.__edge_pool.trim();
|
|
104
153
|
this.__face_pool.trim();
|
|
154
|
+
|
|
155
|
+
if (this.__vertex_data_pool !== null) this.__vertex_data_pool.trim();
|
|
156
|
+
if (this.__edge_data_pool !== null) this.__edge_data_pool.trim();
|
|
157
|
+
if (this.__loop_data_pool !== null) this.__loop_data_pool.trim();
|
|
158
|
+
if (this.__face_data_pool !== null) this.__face_data_pool.trim();
|
|
105
159
|
}
|
|
106
160
|
|
|
107
161
|
/**
|
|
@@ -136,6 +190,147 @@ export class BinaryTopology {
|
|
|
136
190
|
return this.__face_pool;
|
|
137
191
|
}
|
|
138
192
|
|
|
193
|
+
/**
|
|
194
|
+
* Opaque per-vertex data. The user is responsible for encoding/decoding the bytes,
|
|
195
|
+
* and for keeping the pool's allocation in sync with {@link vertices} — typically
|
|
196
|
+
* by calling `vertex_data.allocate()` whenever a vertex is allocated.
|
|
197
|
+
* Slot at vertex ID X holds that vertex's data.
|
|
198
|
+
* @returns {BinaryElementPool|null} null when no data pool has been created
|
|
199
|
+
*/
|
|
200
|
+
get vertex_data() {
|
|
201
|
+
return this.__vertex_data_pool;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Opaque per-edge data. See {@link vertex_data}.
|
|
206
|
+
* @returns {BinaryElementPool|null} null when no data pool has been created
|
|
207
|
+
*/
|
|
208
|
+
get edge_data() {
|
|
209
|
+
return this.__edge_data_pool;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Opaque per-loop data. See {@link vertex_data}.
|
|
214
|
+
* @returns {BinaryElementPool|null} null when no data pool has been created
|
|
215
|
+
*/
|
|
216
|
+
get loop_data() {
|
|
217
|
+
return this.__loop_data_pool;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Opaque per-face data. See {@link vertex_data}.
|
|
222
|
+
* @returns {BinaryElementPool|null} null when no data pool has been created
|
|
223
|
+
*/
|
|
224
|
+
get face_data() {
|
|
225
|
+
return this.__face_data_pool;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Create an opaque per-vertex data pool. If vertices already exist, the pool is
|
|
230
|
+
* sized to match (bytes zero-initialized).
|
|
231
|
+
*
|
|
232
|
+
* After this returns, it is the caller's responsibility to keep the data pool's
|
|
233
|
+
* allocation in sync with {@link vertices} (call `vertex_data.allocate()` /
|
|
234
|
+
* `vertex_data.allocate_continuous(n)` / `vertex_data.release(id)` /
|
|
235
|
+
* `vertex_data.clear()` alongside the matching base pool calls).
|
|
236
|
+
*
|
|
237
|
+
* @param {number} item_size_bytes
|
|
238
|
+
*/
|
|
239
|
+
create_vertex_data(item_size_bytes) {
|
|
240
|
+
assert.isNull(this.__vertex_data_pool, '__vertex_data_pool');
|
|
241
|
+
this.__vertex_data_pool = this.__create_data_pool(this.__vertex_pool, item_size_bytes);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Create an opaque per-edge data pool. See {@link create_vertex_data}.
|
|
246
|
+
* @param {number} item_size_bytes
|
|
247
|
+
*/
|
|
248
|
+
create_edge_data(item_size_bytes) {
|
|
249
|
+
assert.isNull(this.__edge_data_pool, '__edge_data_pool');
|
|
250
|
+
this.__edge_data_pool = this.__create_data_pool(this.__edge_pool, item_size_bytes);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Create an opaque per-loop data pool. See {@link create_vertex_data}.
|
|
255
|
+
* @param {number} item_size_bytes
|
|
256
|
+
*/
|
|
257
|
+
create_loop_data(item_size_bytes) {
|
|
258
|
+
assert.isNull(this.__loop_data_pool, '__loop_data_pool');
|
|
259
|
+
this.__loop_data_pool = this.__create_data_pool(this.__loop_pool, item_size_bytes);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Create an opaque per-face data pool. See {@link create_vertex_data}.
|
|
264
|
+
* @param {number} item_size_bytes
|
|
265
|
+
*/
|
|
266
|
+
create_face_data(item_size_bytes) {
|
|
267
|
+
assert.isNull(this.__face_data_pool, '__face_data_pool');
|
|
268
|
+
this.__face_data_pool = this.__create_data_pool(this.__face_pool, item_size_bytes);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @returns {boolean} true if a data pool was removed, false if there was none
|
|
273
|
+
*/
|
|
274
|
+
delete_vertex_data() {
|
|
275
|
+
if (this.__vertex_data_pool === null) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
this.__vertex_data_pool = null;
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @returns {boolean} true if a data pool was removed, false if there was none
|
|
284
|
+
*/
|
|
285
|
+
delete_edge_data() {
|
|
286
|
+
if (this.__edge_data_pool === null) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
this.__edge_data_pool = null;
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* @returns {boolean} true if a data pool was removed, false if there was none
|
|
295
|
+
*/
|
|
296
|
+
delete_loop_data() {
|
|
297
|
+
if (this.__loop_data_pool === null) {
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
this.__loop_data_pool = null;
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @returns {boolean} true if a data pool was removed, false if there was none
|
|
306
|
+
*/
|
|
307
|
+
delete_face_data() {
|
|
308
|
+
if (this.__face_data_pool === null) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
this.__face_data_pool = null;
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* @param {BinaryElementPool} base
|
|
317
|
+
* @param {number} item_size_bytes
|
|
318
|
+
* @returns {BinaryElementPool}
|
|
319
|
+
* @private
|
|
320
|
+
*/
|
|
321
|
+
__create_data_pool(base, item_size_bytes) {
|
|
322
|
+
const data = new BinaryElementPool(item_size_bytes);
|
|
323
|
+
|
|
324
|
+
// Size the new pool to match the related pool's current allocation.
|
|
325
|
+
// Bytes are zero by ArrayBuffer initialization.
|
|
326
|
+
const current_size = base.size;
|
|
327
|
+
if (current_size > 0) {
|
|
328
|
+
data.allocate_continuous(current_size);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return data;
|
|
332
|
+
}
|
|
333
|
+
|
|
139
334
|
|
|
140
335
|
/**
|
|
141
336
|
* Clear the topology, removed all data
|
|
@@ -145,6 +340,11 @@ export class BinaryTopology {
|
|
|
145
340
|
this.__edge_pool.clear();
|
|
146
341
|
this.__loop_pool.clear();
|
|
147
342
|
this.__face_pool.clear();
|
|
343
|
+
|
|
344
|
+
this.__vertex_data_pool?.clear();
|
|
345
|
+
this.__edge_data_pool?.clear();
|
|
346
|
+
this.__loop_data_pool?.clear();
|
|
347
|
+
this.__face_data_pool?.clear();
|
|
148
348
|
}
|
|
149
349
|
|
|
150
350
|
/**
|
|
@@ -419,9 +619,54 @@ export class BinaryTopology {
|
|
|
419
619
|
pool.data_view.setUint32(address + 6 * UINT_32_SIZE, value);
|
|
420
620
|
}
|
|
421
621
|
|
|
622
|
+
/**
|
|
623
|
+
* Allocate a new vertex and, if the vertex data pool exists, ensure its
|
|
624
|
+
* underlying buffer has capacity for the new ID. Tracking the data pool's
|
|
625
|
+
* __size remains the caller's responsibility.
|
|
626
|
+
* @returns {number} vertex ID
|
|
627
|
+
*/
|
|
628
|
+
vertex_create() {
|
|
629
|
+
const id = this.__vertex_pool.allocate();
|
|
630
|
+
|
|
631
|
+
this.__vertex_data_pool?.ensure_capacity(id + 1);
|
|
632
|
+
|
|
633
|
+
return id;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/**
|
|
637
|
+
* Allocate a new edge. See {@link vertex_create}.
|
|
638
|
+
* @returns {number} edge ID
|
|
639
|
+
*/
|
|
640
|
+
edge_create() {
|
|
641
|
+
const id = this.__edge_pool.allocate();
|
|
642
|
+
|
|
643
|
+
this.__edge_data_pool?.ensure_capacity(id + 1);
|
|
644
|
+
|
|
645
|
+
return id;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Allocate a new face. See {@link vertex_create}.
|
|
650
|
+
* @returns {number} face ID
|
|
651
|
+
*/
|
|
652
|
+
face_create() {
|
|
653
|
+
const id = this.__face_pool.allocate();
|
|
654
|
+
|
|
655
|
+
this.__face_data_pool?.ensure_capacity(id + 1);
|
|
656
|
+
|
|
657
|
+
return id;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Allocate a new loop and put it into a valid initial state.
|
|
662
|
+
* See {@link vertex_create} for the data pool sync semantics.
|
|
663
|
+
* @returns {number} loop ID
|
|
664
|
+
*/
|
|
422
665
|
loop_create() {
|
|
423
666
|
const id = this.__loop_pool.allocate();
|
|
424
667
|
|
|
668
|
+
this.__loop_data_pool?.ensure_capacity(id + 1);
|
|
669
|
+
|
|
425
670
|
this.loop_initialize(id);
|
|
426
671
|
|
|
427
672
|
return id;
|
|
@@ -679,6 +924,34 @@ export class BinaryTopology {
|
|
|
679
924
|
this.__edge_pool.copy(other.edges);
|
|
680
925
|
this.__loop_pool.copy(other.loops);
|
|
681
926
|
this.__face_pool.copy(other.faces);
|
|
927
|
+
|
|
928
|
+
if (other.vertex_data === null) {
|
|
929
|
+
if (this.__vertex_data_pool !== null) this.delete_vertex_data();
|
|
930
|
+
} else {
|
|
931
|
+
if (this.__vertex_data_pool === null) this.create_vertex_data(other.vertex_data.item_size);
|
|
932
|
+
this.__vertex_data_pool.copy(other.vertex_data);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
if (other.edge_data === null) {
|
|
936
|
+
if (this.__edge_data_pool !== null) this.delete_edge_data();
|
|
937
|
+
} else {
|
|
938
|
+
if (this.__edge_data_pool === null) this.create_edge_data(other.edge_data.item_size);
|
|
939
|
+
this.__edge_data_pool.copy(other.edge_data);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
if (other.loop_data === null) {
|
|
943
|
+
if (this.__loop_data_pool !== null) this.delete_loop_data();
|
|
944
|
+
} else {
|
|
945
|
+
if (this.__loop_data_pool === null) this.create_loop_data(other.loop_data.item_size);
|
|
946
|
+
this.__loop_data_pool.copy(other.loop_data);
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
if (other.face_data === null) {
|
|
950
|
+
if (this.__face_data_pool !== null) this.delete_face_data();
|
|
951
|
+
} else {
|
|
952
|
+
if (this.__face_data_pool === null) this.create_face_data(other.face_data.item_size);
|
|
953
|
+
this.__face_data_pool.copy(other.face_data);
|
|
954
|
+
}
|
|
682
955
|
}
|
|
683
956
|
|
|
684
957
|
/**
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close every boundary hole in `mesh` by fan-tessellating each boundary loop
|
|
3
|
+
* around its centroid. A new Steiner vertex is added at the centroid of each
|
|
4
|
+
* hole; one triangle is emitted per boundary edge, connecting the edge's two
|
|
5
|
+
* vertices to the centroid.
|
|
6
|
+
*
|
|
7
|
+
* After this returns, no edge in the mesh is a boundary edge (every edge has
|
|
8
|
+
* exactly two faces on its radial cycle).
|
|
9
|
+
*
|
|
10
|
+
* Throws if any boundary vertex has more than two boundary edges (figure-8 /
|
|
11
|
+
* pinched boundaries). Mutates the mesh in place.
|
|
12
|
+
*
|
|
13
|
+
* @param {BinaryTopology} mesh
|
|
14
|
+
* @returns {number} number of boundary holes that were closed
|
|
15
|
+
*/
|
|
16
|
+
export function bt_mesh_close_boundary_holes(mesh: BinaryTopology): number;
|
|
17
|
+
//# sourceMappingURL=bt_mesh_close_boundary_holes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bt_mesh_close_boundary_holes.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;;;;;GAcG;AACH,oEAFa,MAAM,CA8DlB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { bt_mesh_walk_boundary_loops } from "../query/bt_mesh_walk_boundary_loops.js";
|
|
2
|
+
import { bt_mesh_face_poke } from "./face/bt_face_poke.js";
|
|
3
|
+
import { bt_radial_loop_add } from "./bt_radial_loop_add.js";
|
|
4
|
+
|
|
5
|
+
const scratch_coord = [0, 0, 0];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Walk a boundary cycle (returned by {@link bt_mesh_walk_boundary_loops}) and
|
|
9
|
+
* produce a vertex/edge sequence starting at `start_vertex` and going around
|
|
10
|
+
* the cycle in the direction `start_vertex` dictates.
|
|
11
|
+
*
|
|
12
|
+
* Output arrays are filled in place; both have length equal to `cycle.length`.
|
|
13
|
+
*
|
|
14
|
+
* @param {BinaryTopology} mesh
|
|
15
|
+
* @param {number[]} cycle
|
|
16
|
+
* @param {number} start_vertex must be an endpoint of one of the cycle's edges
|
|
17
|
+
* @param {number[]} out_vertices
|
|
18
|
+
* @param {number[]} out_edges
|
|
19
|
+
*/
|
|
20
|
+
function order_cycle_from(mesh, cycle, start_vertex, out_vertices, out_edges) {
|
|
21
|
+
const n = cycle.length;
|
|
22
|
+
|
|
23
|
+
const v_to_edges = new Map();
|
|
24
|
+
for (let i = 0; i < n; i++) {
|
|
25
|
+
const e = cycle[i];
|
|
26
|
+
const v1 = mesh.edge_read_vertex1(e);
|
|
27
|
+
const v2 = mesh.edge_read_vertex2(e);
|
|
28
|
+
let bucket = v_to_edges.get(v1);
|
|
29
|
+
if (bucket === undefined) {
|
|
30
|
+
bucket = [];
|
|
31
|
+
v_to_edges.set(v1, bucket);
|
|
32
|
+
}
|
|
33
|
+
bucket.push(e);
|
|
34
|
+
bucket = v_to_edges.get(v2);
|
|
35
|
+
if (bucket === undefined) {
|
|
36
|
+
bucket = [];
|
|
37
|
+
v_to_edges.set(v2, bucket);
|
|
38
|
+
}
|
|
39
|
+
bucket.push(e);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let v_curr = start_vertex;
|
|
43
|
+
let e_prev = -1;
|
|
44
|
+
|
|
45
|
+
for (let i = 0; i < n; i++) {
|
|
46
|
+
out_vertices[i] = v_curr;
|
|
47
|
+
|
|
48
|
+
const edges_at_v = v_to_edges.get(v_curr);
|
|
49
|
+
const e_next = (edges_at_v[0] === e_prev) ? edges_at_v[1] : edges_at_v[0];
|
|
50
|
+
|
|
51
|
+
out_edges[i] = e_next;
|
|
52
|
+
|
|
53
|
+
const e_v1 = mesh.edge_read_vertex1(e_next);
|
|
54
|
+
const e_v2 = mesh.edge_read_vertex2(e_next);
|
|
55
|
+
v_curr = (e_v1 === v_curr) ? e_v2 : e_v1;
|
|
56
|
+
e_prev = e_next;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Close every boundary hole in `mesh` by fan-tessellating each boundary loop
|
|
62
|
+
* around its centroid. A new Steiner vertex is added at the centroid of each
|
|
63
|
+
* hole; one triangle is emitted per boundary edge, connecting the edge's two
|
|
64
|
+
* vertices to the centroid.
|
|
65
|
+
*
|
|
66
|
+
* After this returns, no edge in the mesh is a boundary edge (every edge has
|
|
67
|
+
* exactly two faces on its radial cycle).
|
|
68
|
+
*
|
|
69
|
+
* Throws if any boundary vertex has more than two boundary edges (figure-8 /
|
|
70
|
+
* pinched boundaries). Mutates the mesh in place.
|
|
71
|
+
*
|
|
72
|
+
* @param {BinaryTopology} mesh
|
|
73
|
+
* @returns {number} number of boundary holes that were closed
|
|
74
|
+
*/
|
|
75
|
+
export function bt_mesh_close_boundary_holes(mesh) {
|
|
76
|
+
const cycles = bt_mesh_walk_boundary_loops(mesh);
|
|
77
|
+
|
|
78
|
+
const ordered_vertices = [];
|
|
79
|
+
const ordered_edges = [];
|
|
80
|
+
|
|
81
|
+
for (const cycle of cycles) {
|
|
82
|
+
const n = cycle.length;
|
|
83
|
+
|
|
84
|
+
// Each new loop on a boundary edge must wind opposite the existing
|
|
85
|
+
// loop, so the shared edge ends up with consistent radial orientation.
|
|
86
|
+
const seed_edge = cycle[0];
|
|
87
|
+
const seed_loop = mesh.edge_read_loop(seed_edge);
|
|
88
|
+
const existing_loop_vertex = mesh.loop_read_vertex(seed_loop);
|
|
89
|
+
const seed_v1 = mesh.edge_read_vertex1(seed_edge);
|
|
90
|
+
const seed_v2 = mesh.edge_read_vertex2(seed_edge);
|
|
91
|
+
const start_vertex = (existing_loop_vertex === seed_v1) ? seed_v2 : seed_v1;
|
|
92
|
+
|
|
93
|
+
ordered_vertices.length = n;
|
|
94
|
+
ordered_edges.length = n;
|
|
95
|
+
order_cycle_from(mesh, cycle, start_vertex, ordered_vertices, ordered_edges);
|
|
96
|
+
|
|
97
|
+
// Compute centroid of the hole's vertices.
|
|
98
|
+
let cx = 0, cy = 0, cz = 0;
|
|
99
|
+
for (let i = 0; i < n; i++) {
|
|
100
|
+
mesh.vertex_read_coordinate(scratch_coord, 0, ordered_vertices[i]);
|
|
101
|
+
cx += scratch_coord[0];
|
|
102
|
+
cy += scratch_coord[1];
|
|
103
|
+
cz += scratch_coord[2];
|
|
104
|
+
}
|
|
105
|
+
cx /= n;
|
|
106
|
+
cy /= n;
|
|
107
|
+
cz /= n;
|
|
108
|
+
|
|
109
|
+
// Allocate a new face plus n loops, wire them into the face cycle and
|
|
110
|
+
// each boundary edge's radial cycle. Face normal stays zero; downstream
|
|
111
|
+
// tetrahedralization is position-only.
|
|
112
|
+
const new_face = mesh.faces.allocate();
|
|
113
|
+
|
|
114
|
+
const loops = new Array(n);
|
|
115
|
+
for (let i = 0; i < n; i++) {
|
|
116
|
+
loops[i] = mesh.loop_create();
|
|
117
|
+
mesh.loop_write_vertex(loops[i], ordered_vertices[i]);
|
|
118
|
+
mesh.loop_write_face(loops[i], new_face);
|
|
119
|
+
bt_radial_loop_add(mesh, loops[i], ordered_edges[i]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
for (let i = 0; i < n; i++) {
|
|
123
|
+
mesh.loop_write_next(loops[i], loops[(i + 1) % n]);
|
|
124
|
+
mesh.loop_write_prev(loops[i], loops[(i - 1 + n) % n]);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
mesh.face_write_loop(new_face, loops[0]);
|
|
128
|
+
|
|
129
|
+
// Fan from centroid — adds the Steiner vertex and replaces the n-gon
|
|
130
|
+
// face with n triangles.
|
|
131
|
+
bt_mesh_face_poke(mesh, new_face, cx, cy, cz);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return cycles.length;
|
|
135
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove allocation holes from a mesh's pools.
|
|
3
|
+
* After compaction, every base pool's live elements occupy a contiguous
|
|
4
|
+
* range [0, N) and the free set is empty. All cross-references between
|
|
5
|
+
* pools are patched to the new IDs. Optional per-element data pools
|
|
6
|
+
* (vertex_data, edge_data, loop_data, face_data) are compacted in
|
|
7
|
+
* lockstep with their base pools.
|
|
8
|
+
*
|
|
9
|
+
* The mesh's topological meaning is preserved; only IDs may change.
|
|
10
|
+
*
|
|
11
|
+
* @param {BinaryTopology} mesh
|
|
12
|
+
*/
|
|
13
|
+
export function bt_mesh_compact(mesh: BinaryTopology): void;
|
|
14
|
+
//# sourceMappingURL=bt_mesh_compact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bt_mesh_compact.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js"],"names":[],"mappings":"AA4EA;;;;;;;;;;;GAWG;AACH,4DAwFC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { NULL_POINTER } from "../BinaryTopology.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Walk a pool and assign a new sequential ID to each live element.
|
|
5
|
+
* Free slots map to NULL_POINTER.
|
|
6
|
+
* @param {BinaryElementPool} pool
|
|
7
|
+
* @returns {Uint32Array} remap[old_id] -> new_id (or NULL_POINTER if old_id was free)
|
|
8
|
+
*/
|
|
9
|
+
function build_remap(pool) {
|
|
10
|
+
const size = pool.size;
|
|
11
|
+
const remap = new Uint32Array(size);
|
|
12
|
+
|
|
13
|
+
let next_id = 0;
|
|
14
|
+
for (let old_id = 0; old_id < size; old_id++) {
|
|
15
|
+
if (pool.is_allocated(old_id)) {
|
|
16
|
+
remap[old_id] = next_id;
|
|
17
|
+
next_id++;
|
|
18
|
+
} else {
|
|
19
|
+
remap[old_id] = NULL_POINTER;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return remap;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Returns NULL_POINTER unchanged, otherwise looks up the remap.
|
|
28
|
+
* @param {Uint32Array} remap
|
|
29
|
+
* @param {number} ptr
|
|
30
|
+
* @returns {number}
|
|
31
|
+
*/
|
|
32
|
+
function patch(remap, ptr) {
|
|
33
|
+
if (ptr === NULL_POINTER) {
|
|
34
|
+
return NULL_POINTER;
|
|
35
|
+
}
|
|
36
|
+
return remap[ptr];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Physically move live elements down so they occupy [0, live_count) contiguously.
|
|
41
|
+
* Uses the remap only to identify free slots (where remap[i] === NULL_POINTER).
|
|
42
|
+
* @param {BinaryElementPool} pool
|
|
43
|
+
* @param {Uint32Array} remap remap built from this pool's pre-compaction state
|
|
44
|
+
*/
|
|
45
|
+
function compact_bytes(pool, remap) {
|
|
46
|
+
const size = remap.length;
|
|
47
|
+
|
|
48
|
+
let write = 0;
|
|
49
|
+
for (let read = 0; read < size; read++) {
|
|
50
|
+
if (remap[read] === NULL_POINTER) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (read !== write) {
|
|
55
|
+
pool.swap(read, write);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
write++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Count live slots from a remap built by {@link build_remap}.
|
|
64
|
+
* @param {Uint32Array} remap
|
|
65
|
+
* @returns {number}
|
|
66
|
+
*/
|
|
67
|
+
function live_count_from_remap(remap) {
|
|
68
|
+
let count = 0;
|
|
69
|
+
for (let i = 0; i < remap.length; i++) {
|
|
70
|
+
if (remap[i] !== NULL_POINTER) {
|
|
71
|
+
count++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return count;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Remove allocation holes from a mesh's pools.
|
|
79
|
+
* After compaction, every base pool's live elements occupy a contiguous
|
|
80
|
+
* range [0, N) and the free set is empty. All cross-references between
|
|
81
|
+
* pools are patched to the new IDs. Optional per-element data pools
|
|
82
|
+
* (vertex_data, edge_data, loop_data, face_data) are compacted in
|
|
83
|
+
* lockstep with their base pools.
|
|
84
|
+
*
|
|
85
|
+
* The mesh's topological meaning is preserved; only IDs may change.
|
|
86
|
+
*
|
|
87
|
+
* @param {BinaryTopology} mesh
|
|
88
|
+
*/
|
|
89
|
+
export function bt_mesh_compact(mesh) {
|
|
90
|
+
const vertex_pool = mesh.vertices;
|
|
91
|
+
const edge_pool = mesh.edges;
|
|
92
|
+
const loop_pool = mesh.loops;
|
|
93
|
+
const face_pool = mesh.faces;
|
|
94
|
+
|
|
95
|
+
// 1. Build remap tables for all four base pools
|
|
96
|
+
const vertex_remap = build_remap(vertex_pool);
|
|
97
|
+
const edge_remap = build_remap(edge_pool);
|
|
98
|
+
const loop_remap = build_remap(loop_pool);
|
|
99
|
+
const face_remap = build_remap(face_pool);
|
|
100
|
+
|
|
101
|
+
// 2. Patch pointer fields in-place at OLD positions, live elements only.
|
|
102
|
+
// NULL_POINTER passes through unchanged.
|
|
103
|
+
|
|
104
|
+
// Vertices: edge_pointer -> edge
|
|
105
|
+
const vertex_size = vertex_remap.length;
|
|
106
|
+
for (let v = 0; v < vertex_size; v++) {
|
|
107
|
+
if (vertex_remap[v] === NULL_POINTER) continue;
|
|
108
|
+
|
|
109
|
+
mesh.vertex_write_edge(v, patch(edge_remap, mesh.vertex_read_edge(v)));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Edges: v1, v2 -> vertex; l -> loop; disk pointers -> edge
|
|
113
|
+
const edge_size = edge_remap.length;
|
|
114
|
+
for (let e = 0; e < edge_size; e++) {
|
|
115
|
+
if (edge_remap[e] === NULL_POINTER) continue;
|
|
116
|
+
|
|
117
|
+
mesh.edge_write_vertex1(e, patch(vertex_remap, mesh.edge_read_vertex1(e)));
|
|
118
|
+
mesh.edge_write_vertex2(e, patch(vertex_remap, mesh.edge_read_vertex2(e)));
|
|
119
|
+
mesh.edge_write_loop(e, patch(loop_remap, mesh.edge_read_loop(e)));
|
|
120
|
+
|
|
121
|
+
mesh.edge_write_v1_disk_next(e, patch(edge_remap, mesh.edge_read_v1_disk_next(e)));
|
|
122
|
+
mesh.edge_write_v1_disk_prev(e, patch(edge_remap, mesh.edge_read_v1_disk_prev(e)));
|
|
123
|
+
mesh.edge_write_v2_disk_next(e, patch(edge_remap, mesh.edge_read_v2_disk_next(e)));
|
|
124
|
+
mesh.edge_write_v2_disk_prev(e, patch(edge_remap, mesh.edge_read_v2_disk_prev(e)));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Loops: v -> vertex; e -> edge; f -> face; radial/face cycle -> loop
|
|
128
|
+
const loop_size = loop_remap.length;
|
|
129
|
+
for (let l = 0; l < loop_size; l++) {
|
|
130
|
+
if (loop_remap[l] === NULL_POINTER) continue;
|
|
131
|
+
|
|
132
|
+
mesh.loop_write_vertex(l, patch(vertex_remap, mesh.loop_read_vertex(l)));
|
|
133
|
+
mesh.loop_write_edge(l, patch(edge_remap, mesh.loop_read_edge(l)));
|
|
134
|
+
mesh.loop_write_face(l, patch(face_remap, mesh.loop_read_face(l)));
|
|
135
|
+
|
|
136
|
+
mesh.loop_write_radial_next(l, patch(loop_remap, mesh.loop_read_radial_next(l)));
|
|
137
|
+
mesh.loop_write_radial_prev(l, patch(loop_remap, mesh.loop_read_radial_prev(l)));
|
|
138
|
+
mesh.loop_write_next(l, patch(loop_remap, mesh.loop_read_next(l)));
|
|
139
|
+
mesh.loop_write_prev(l, patch(loop_remap, mesh.loop_read_prev(l)));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Faces: l_first -> loop
|
|
143
|
+
const face_size = face_remap.length;
|
|
144
|
+
for (let f = 0; f < face_size; f++) {
|
|
145
|
+
if (face_remap[f] === NULL_POINTER) continue;
|
|
146
|
+
|
|
147
|
+
mesh.face_write_loop(f, patch(loop_remap, mesh.face_read_loop(f)));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// 3. Physically compact bytes. Base pools first, then any optional data
|
|
151
|
+
// pools using the same remaps.
|
|
152
|
+
compact_bytes(vertex_pool, vertex_remap);
|
|
153
|
+
compact_bytes(edge_pool, edge_remap);
|
|
154
|
+
compact_bytes(loop_pool, loop_remap);
|
|
155
|
+
compact_bytes(face_pool, face_remap);
|
|
156
|
+
|
|
157
|
+
if (mesh.vertex_data !== null) compact_bytes(mesh.vertex_data, vertex_remap);
|
|
158
|
+
if (mesh.edge_data !== null) compact_bytes(mesh.edge_data, edge_remap);
|
|
159
|
+
if (mesh.loop_data !== null) compact_bytes(mesh.loop_data, loop_remap);
|
|
160
|
+
if (mesh.face_data !== null) compact_bytes(mesh.face_data, face_remap);
|
|
161
|
+
|
|
162
|
+
// 4. Truncate sizes on every pool (base + data).
|
|
163
|
+
const vertex_live = live_count_from_remap(vertex_remap);
|
|
164
|
+
const edge_live = live_count_from_remap(edge_remap);
|
|
165
|
+
const loop_live = live_count_from_remap(loop_remap);
|
|
166
|
+
const face_live = live_count_from_remap(face_remap);
|
|
167
|
+
|
|
168
|
+
vertex_pool.truncate(vertex_live);
|
|
169
|
+
edge_pool.truncate(edge_live);
|
|
170
|
+
loop_pool.truncate(loop_live);
|
|
171
|
+
face_pool.truncate(face_live);
|
|
172
|
+
|
|
173
|
+
if (mesh.vertex_data !== null) mesh.vertex_data.truncate(vertex_live);
|
|
174
|
+
if (mesh.edge_data !== null) mesh.edge_data.truncate(edge_live);
|
|
175
|
+
if (mesh.loop_data !== null) mesh.loop_data.truncate(loop_live);
|
|
176
|
+
if (mesh.face_data !== null) mesh.face_data.truncate(face_live);
|
|
177
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bt_mesh_face_decouple.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,sEAJW,MAAM,YACN,MAAM,
|
|
1
|
+
{"version":3,"file":"bt_mesh_face_decouple.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,sEAJW,MAAM,YACN,MAAM,QAgJhB"}
|