@woosh/meep-engine 2.156.0 → 2.157.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/README.md +1 -3
- package/editor/view/ecs/components/common/AutoCanvasView.js +100 -53
- package/editor/view/ecs/components/common/TextController.js +59 -0
- package/editor/view/node-graph/NodeGraphCamera.js +90 -0
- package/editor/view/node-graph/NodeGraphEditorView.js +121 -22
- package/editor/view/node-graph/NodeGraphSelection.js +89 -0
- package/editor/view/node-graph/NodeGraphView.js +669 -453
- package/editor/view/node-graph/NodeView.js +211 -135
- package/editor/view/node-graph/actions/ConnectionCreateAction.js +53 -0
- package/editor/view/node-graph/actions/ConnectionDeleteAction.js +36 -0
- package/editor/view/node-graph/actions/NodeDeleteAction.js +88 -0
- package/editor/view/node-graph/actions/NodeParameterSetAction.js +52 -0
- package/editor/view/node-graph/actions/NodesMoveAction.js +41 -0
- package/editor/view/node-graph/actions/SelectionSetAction.js +60 -0
- package/editor/view/node-graph/connection_wire_geometry.js +107 -0
- package/package.json +1 -1
- package/samples/generation/SampleGenerator0.js +8 -1
- package/src/core/binary/reinterpret_float32_as_uint32.d.ts +7 -0
- package/src/core/binary/reinterpret_float32_as_uint32.d.ts.map +1 -0
- package/src/core/binary/reinterpret_float32_as_uint32.js +13 -0
- package/src/core/binary/reinterpret_uint32_as_float32.d.ts +7 -0
- package/src/core/binary/reinterpret_uint32_as_float32.d.ts.map +1 -0
- package/src/core/binary/reinterpret_uint32_as_float32.js +14 -0
- package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.js +1 -3
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts +12 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.d.ts.map +1 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.js +92 -0
- package/src/core/bvh8/BVH8.d.ts +127 -0
- package/src/core/bvh8/BVH8.d.ts.map +1 -0
- package/src/core/bvh8/BVH8.js +436 -0
- package/src/core/bvh8/NOTES.md +63 -0
- package/src/core/bvh8/build/BVH8Converter.d.ts +59 -0
- package/src/core/bvh8/build/BVH8Converter.d.ts.map +1 -0
- package/src/core/bvh8/build/BVH8Converter.js +588 -0
- package/src/core/bvh8/build/NodeProxy.d.ts +66 -0
- package/src/core/bvh8/build/NodeProxy.d.ts.map +1 -0
- package/src/core/bvh8/build/NodeProxy.js +308 -0
- package/src/core/bvh8/build/TriangleCluster.d.ts +29 -0
- package/src/core/bvh8/build/TriangleCluster.d.ts.map +1 -0
- package/src/core/bvh8/build/TriangleCluster.js +123 -0
- package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts +8 -0
- package/src/core/bvh8/build/aabb3_compute_merge_cost.d.ts.map +1 -0
- package/src/core/bvh8/build/aabb3_compute_merge_cost.js +29 -0
- package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts +10 -0
- package/src/core/bvh8/build/aabb3_from_triangle_by_index.d.ts.map +1 -0
- package/src/core/bvh8/build/aabb3_from_triangle_by_index.js +18 -0
- package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts +10 -0
- package/src/core/bvh8/build/bvh8_build_for_geometry.d.ts.map +1 -0
- package/src/core/bvh8/build/bvh8_build_for_geometry.js +303 -0
- package/src/core/bvh8/build/bvh8_from_proxy.d.ts +9 -0
- package/src/core/bvh8/build/bvh8_from_proxy.d.ts.map +1 -0
- package/src/core/bvh8/build/bvh8_from_proxy.js +256 -0
- package/src/core/bvh8/build/byte.d.ts +7 -0
- package/src/core/bvh8/build/byte.d.ts.map +1 -0
- package/src/core/bvh8/build/byte.js +10 -0
- package/src/core/bvh8/build/encode_bounds_e.d.ts +9 -0
- package/src/core/bvh8/build/encode_bounds_e.d.ts.map +1 -0
- package/src/core/bvh8/build/encode_bounds_e.js +12 -0
- package/src/core/bvh8/bvh8_convert_to_dot.d.ts +11 -0
- package/src/core/bvh8/bvh8_convert_to_dot.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_convert_to_dot.js +133 -0
- package/src/core/bvh8/bvh8_count_primitives.d.ts +22 -0
- package/src/core/bvh8/bvh8_count_primitives.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_count_primitives.js +98 -0
- package/src/core/bvh8/bvh8_geometry_validate.d.ts +16 -0
- package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_geometry_validate.js +149 -0
- package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts +16 -0
- package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_geometry_validate_indirect.js +177 -0
- package/src/core/bvh8/bvh8_get_node_bounds.d.ts +9 -0
- package/src/core/bvh8/bvh8_get_node_bounds.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_get_node_bounds.js +35 -0
- package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts +10 -0
- package/src/core/bvh8/bvh8_get_node_child_bounds.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_get_node_child_bounds.js +53 -0
- package/src/core/bvh8/bvh8_node_child_surface_area.d.ts +9 -0
- package/src/core/bvh8/bvh8_node_child_surface_area.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_node_child_surface_area.js +18 -0
- package/src/core/bvh8/bvh8_node_count_triangles.d.ts +8 -0
- package/src/core/bvh8/bvh8_node_count_triangles.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_node_count_triangles.js +28 -0
- package/src/core/bvh8/bvh8_quality.d.ts +8 -0
- package/src/core/bvh8/bvh8_quality.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_quality.js +73 -0
- package/src/core/bvh8/bvh8_validate_structure.d.ts +15 -0
- package/src/core/bvh8/bvh8_validate_structure.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_validate_structure.js +87 -0
- package/src/core/collection/Uint32MinHeap.d.ts +56 -0
- package/src/core/collection/Uint32MinHeap.d.ts.map +1 -0
- package/src/core/collection/Uint32MinHeap.js +109 -0
- package/src/core/collection/list/FilteredListProjection.js +1 -1
- package/src/{engine/physics/island → core/collection/union-find}/union_find.d.ts +8 -5
- package/src/core/collection/union-find/union_find.d.ts.map +1 -0
- package/src/{engine/physics/island → core/collection/union-find}/union_find.js +8 -5
- package/src/core/dom/isImageBitmap.d.ts +7 -0
- package/src/core/dom/isImageBitmap.d.ts.map +1 -0
- package/src/core/dom/isImageBitmap.js +12 -0
- package/src/core/function/frameThrottle.d.ts +8 -0
- package/src/core/function/frameThrottle.d.ts.map +1 -0
- package/src/core/function/frameThrottle.js +23 -0
- package/src/{engine/physics/narrowphase/clip_against_axis_uv.d.ts → core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts} +3 -3
- package/src/core/geom/2d/polygon/polygon2_clip_axis_halfplane.d.ts.map +1 -0
- package/src/{engine/physics/narrowphase/clip_against_axis_uv.js → core/geom/2d/polygon/polygon2_clip_axis_halfplane.js} +51 -51
- package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts → core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts} +9 -7
- package/src/core/geom/3d/aabb/aabb3_transform_oriented_inverse.d.ts.map +1 -0
- package/src/{engine/physics/narrowphase/decomposition/aabb_world_to_local.js → core/geom/3d/aabb/aabb3_transform_oriented_inverse.js} +9 -7
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts +12 -0
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.d.ts.map +1 -0
- package/src/core/geom/3d/aabb/compute_triangle_group_aabb3.js +46 -0
- package/src/core/geom/3d/box/box3_projected_half_extent.d.ts +28 -0
- package/src/core/geom/3d/box/box3_projected_half_extent.d.ts.map +1 -0
- package/src/core/geom/3d/box/box3_projected_half_extent.js +35 -0
- package/src/core/geom/3d/frustum/read_cluster_frustum_corners.js +1 -1
- package/src/core/geom/3d/frustum/read_frustum_corner.d.ts +9 -0
- package/src/core/geom/3d/frustum/read_frustum_corner.d.ts.map +1 -0
- package/src/core/geom/3d/frustum/read_frustum_corner.js +14 -0
- package/src/core/geom/3d/gjk/gjk.d.ts.map +1 -0
- package/src/{engine/physics → core/geom/3d}/gjk/gjk.js +430 -372
- package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.d.ts +8 -5
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -0
- package/src/{engine/physics → core/geom/3d}/gjk/gjk_epa_penetration.js +520 -544
- package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.d.ts +5 -4
- package/src/core/geom/3d/gjk/minkowski_support.d.ts.map +1 -0
- package/src/{engine/physics → core/geom/3d}/gjk/minkowski_support.js +71 -70
- package/src/{engine/physics → core/geom/3d}/gjk/mpr.d.ts +3 -3
- package/src/core/geom/3d/gjk/mpr.d.ts.map +1 -0
- package/src/{engine/physics → core/geom/3d}/gjk/mpr.js +368 -362
- package/src/{engine/physics/integration/quat_integrate.d.ts → core/geom/3d/quaternion/quat3_integrate.d.ts} +2 -2
- package/src/core/geom/3d/quaternion/quat3_integrate.d.ts.map +1 -0
- package/src/{engine/physics/integration/quat_integrate.js → core/geom/3d/quaternion/quat3_integrate.js} +1 -1
- package/src/{engine/physics/narrowphase/PosedShape.d.ts → core/geom/3d/shape/PosedShape3D.d.ts} +9 -8
- package/src/{engine/physics/narrowphase/PosedShape.d.ts.map → core/geom/3d/shape/PosedShape3D.d.ts.map} +1 -1
- package/src/{engine/physics/narrowphase/PosedShape.js → core/geom/3d/shape/PosedShape3D.js} +10 -9
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +15 -11
- package/src/core/geom/vec3/v3_quat3_apply_inverse.d.ts +1 -1
- package/src/core/geom/vec3/v3_quat3_apply_inverse.js +1 -1
- package/src/core/math/complex/complex_add.d.ts +1 -1
- package/src/core/math/complex/complex_add.d.ts.map +1 -1
- package/src/core/math/complex/complex_add.js +12 -3
- package/src/core/math/complex/complex_div.d.ts +1 -1
- package/src/core/math/complex/complex_div.d.ts.map +1 -1
- package/src/core/math/complex/complex_div.js +11 -4
- package/src/core/math/complex/complex_mul.d.ts +1 -1
- package/src/core/math/complex/complex_mul.d.ts.map +1 -1
- package/src/core/math/complex/complex_mul.js +10 -3
- package/src/core/math/complex/complex_sub.d.ts +1 -1
- package/src/core/math/complex/complex_sub.d.ts.map +1 -1
- package/src/core/math/complex/complex_sub.js +12 -3
- package/src/{engine/physics/fluid/solver/optimal_sor_omega.d.ts → core/math/linalg/sor_optimal_omega.d.ts} +4 -3
- package/src/core/math/linalg/sor_optimal_omega.d.ts.map +1 -0
- package/src/{engine/physics/fluid/solver/optimal_sor_omega.js → core/math/linalg/sor_optimal_omega.js} +4 -3
- package/src/core/math/lookup/ParameterLookupTable.d.ts +123 -0
- package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -0
- package/src/core/math/lookup/ParameterLookupTable.js +495 -0
- package/src/core/math/lookup/ParameterLookupTableFlags.d.ts +5 -0
- package/src/core/math/lookup/ParameterLookupTableFlags.d.ts.map +1 -0
- package/src/core/math/lookup/ParameterLookupTableFlags.js +6 -0
- package/src/core/math/physics/kinematics/computeInterceptPoint.d.ts.map +1 -0
- package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.js +79 -79
- package/src/core/math/physics/mie/ri_air.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_air.js +1 -3
- package/src/core/math/physics/mie/ri_ammonium_sulfate.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_ammonium_sulfate.js +1 -3
- package/src/core/math/physics/mie/ri_brine.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_brine.js +1 -3
- package/src/core/math/physics/mie/ri_dust.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_dust.js +1 -3
- package/src/core/math/physics/mie/ri_pollen.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_pollen.js +1 -3
- package/src/core/math/physics/mie/ri_smoke.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_smoke.js +1 -3
- package/src/core/math/physics/mie/ri_soot.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_soot.js +1 -3
- package/src/core/math/physics/mie/ri_water.d.ts.map +1 -1
- package/src/core/math/physics/mie/ri_water.js +1 -3
- package/src/core/math/random/random_pick_weighted_index.d.ts +10 -0
- package/src/core/math/random/random_pick_weighted_index.d.ts.map +1 -0
- package/src/core/math/random/random_pick_weighted_index.js +26 -0
- package/src/core/model/node-graph/NodeGraph.d.ts +9 -0
- package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
- package/src/core/model/node-graph/NodeGraph.js +38 -0
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +23 -0
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.js +54 -0
- package/src/core/path/convertPathToURL.d.ts +9 -0
- package/src/core/path/convertPathToURL.d.ts.map +1 -0
- package/src/core/path/convertPathToURL.js +107 -0
- package/src/core/process/worker/WorkerBuilder.js +1 -1
- package/src/core/process/worker/extractTransferables.js +1 -1
- package/src/engine/animation/curve/draw/build_tangent_editor.d.ts.map +1 -1
- package/src/engine/animation/curve/draw/build_tangent_editor.js +8 -1
- package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.d.ts.map +1 -1
- package/src/engine/animation/curve/editor/createKeyframeDraggableAspect.js +11 -5
- package/src/engine/asset/Asset.d.ts.map +1 -1
- package/src/engine/asset/Asset.js +16 -6
- package/src/engine/asset/AssetManager.d.ts +61 -52
- package/src/engine/asset/AssetManager.d.ts.map +1 -1
- package/src/engine/asset/AssetManager.js +1411 -1045
- package/src/engine/asset/AssetRequest.d.ts +1 -1
- package/src/engine/asset/AssetRequest.d.ts.map +1 -1
- package/src/engine/asset/AssetRequest.js +1 -1
- package/src/engine/asset/AssetRequestScope.d.ts.map +1 -1
- package/src/engine/asset/AssetRequestScope.js +7 -0
- package/src/engine/asset/PendingAsset.d.ts +32 -1
- package/src/engine/asset/PendingAsset.d.ts.map +1 -1
- package/src/engine/asset/PendingAsset.js +108 -61
- package/src/engine/asset/loaders/ArrayBufferLoader.js +2 -2
- package/src/engine/asset/loaders/AssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/AssetLoader.js +19 -2
- package/src/engine/asset/loaders/GLTFAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/GLTFAssetLoader.js +123 -114
- package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts +1 -1
- package/src/engine/asset/loaders/JavascriptAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/JavascriptAssetLoader.js +31 -47
- package/src/engine/asset/loaders/JsonAssetLoader.js +1 -1
- package/src/engine/asset/loaders/SVGAssetLoader.js +2 -2
- package/src/engine/asset/loaders/SoundAssetLoader.js +1 -1
- package/src/engine/asset/loaders/TextAssetLoader.js +2 -2
- package/src/{core → engine/asset/loaders}/font/FontAsset.d.ts +1 -1
- package/src/engine/asset/loaders/font/FontAsset.d.ts.map +1 -0
- package/src/{core → engine/asset/loaders}/font/FontAsset.js +21 -21
- package/src/{core → engine/asset/loaders}/font/FontAssetLoader.d.ts +1 -1
- package/src/engine/asset/loaders/font/FontAssetLoader.d.ts.map +1 -0
- package/src/{core → engine/asset/loaders}/font/FontAssetLoader.js +20 -20
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts +1 -1
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +11 -20
- package/src/engine/asset/loaders/texture/TextureAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/texture/TextureAssetLoader.js +8 -2
- package/src/engine/asset/preloader/AssetPreloader.js +1 -1
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts +1 -1
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.d.ts.map +1 -1
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +19 -22
- package/src/engine/graphics/FrameThrottle.d.ts +1 -7
- package/src/engine/graphics/FrameThrottle.d.ts.map +1 -1
- package/src/engine/graphics/FrameThrottle.js +2 -24
- package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.d.ts +1 -1
- package/src/engine/graphics/debug/shape_to_visual_entity.d.ts.map +1 -0
- package/src/{core/geom/3d/shape/util → engine/graphics/debug}/shape_to_visual_entity.js +159 -159
- package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.d.ts +1 -1
- package/src/engine/graphics/debug/visualize_tetrahedral_mesh.d.ts.map +1 -0
- package/src/{core/geom/3d/tetrahedra → engine/graphics/debug}/visualize_tetrahedral_mesh.js +46 -46
- package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts +1 -1
- package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.d.ts.map +1 -1
- package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +22 -32
- package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +2 -76
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -427
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts +1 -4
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/parameter/ParameterLookupTableFlags.js +2 -6
- package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -1
- package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts +1 -8
- package/src/engine/graphics/render/forward_plus/read_frustum_corner.d.ts.map +1 -1
- package/src/engine/graphics/render/forward_plus/read_frustum_corner.js +2 -14
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts +1 -11
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.d.ts.map +1 -1
- package/src/engine/graphics/sh3/path_tracer/geometry/compute_triangle_group_aabb3.js +2 -46
- package/src/engine/graphics/sh3/prototypeSH3Probe.js +1 -1
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +27 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +81 -0
- package/src/engine/graphics/texture/isImageBitmap.d.ts +1 -6
- package/src/engine/graphics/texture/isImageBitmap.d.ts.map +1 -1
- package/src/engine/graphics/texture/isImageBitmap.js +2 -12
- package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.d.ts +2 -2
- package/src/engine/intelligence/behavior/util/AsynchronousDelayAction.d.ts.map +1 -0
- package/src/{core/process/action → engine/intelligence/behavior/util}/AsynchronousDelayAction.js +55 -55
- package/src/engine/network/NetworkSession.d.ts +12 -1
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +52 -1
- package/src/engine/network/README.md +45 -0
- package/src/engine/network/convertPathToURL.d.ts +1 -8
- package/src/engine/network/convertPathToURL.d.ts.map +1 -1
- package/src/engine/network/convertPathToURL.js +2 -107
- package/src/engine/network/core/quantize/quantize_float.d.ts.map +1 -1
- package/src/engine/network/core/quantize/quantize_float.js +7 -0
- package/src/engine/network/core/quantize/quantize_position.d.ts.map +1 -1
- package/src/engine/network/core/quantize/quantize_position.js +12 -1
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +15 -1
- package/src/engine/network/replication/Replicator.d.ts +8 -0
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +48 -0
- package/src/engine/network/transport/Channel.d.ts.map +1 -1
- package/src/engine/network/transport/Channel.js +46 -12
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts +16 -0
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
- package/src/engine/network/transport/ReliableCommandPipeline.js +29 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +7 -1
- package/src/engine/network/transport/fragments/packet_size.d.ts +5 -5
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
- package/src/engine/network/transport/fragments/packet_size.js +5 -5
- package/src/engine/physics/BULLET_REVIEW.md +1 -1
- package/src/engine/physics/JOLT_REVIEW.md +2 -2
- package/src/engine/physics/PLAN.md +1094 -945
- package/src/engine/physics/RAPIER_REVIEW.md +2 -2
- package/src/engine/physics/body/BodyStorage.d.ts +2 -12
- package/src/engine/physics/body/BodyStorage.d.ts.map +1 -1
- package/src/engine/physics/body/BodyStorage.js +406 -452
- package/src/engine/physics/body/SolverBodyState.d.ts.map +1 -1
- package/src/engine/physics/body/SolverBodyState.js +12 -3
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +28 -3
- package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -1
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +60 -24
- package/src/engine/physics/broadphase/generate_pairs.d.ts +9 -5
- package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -1
- package/src/engine/physics/broadphase/generate_pairs.js +52 -37
- package/src/engine/physics/ccd/linear_sweep.d.ts +15 -5
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +122 -40
- package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
- package/src/engine/physics/constraint/solve_constraints.js +830 -805
- package/src/engine/physics/contact/ManifoldStore.d.ts +91 -16
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
- package/src/engine/physics/contact/ManifoldStore.js +204 -60
- package/src/engine/physics/ecs/BodyKind.d.ts +7 -3
- package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -1
- package/src/engine/physics/ecs/BodyKind.js +29 -25
- package/src/engine/physics/ecs/Collider.d.ts +7 -0
- package/src/engine/physics/ecs/Collider.d.ts.map +1 -1
- package/src/engine/physics/ecs/Collider.js +7 -0
- package/src/engine/physics/ecs/ColliderSerializationAdapter.js +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +110 -6
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +467 -45
- package/src/engine/physics/ecs/RigidBody.d.ts +20 -5
- package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -1
- package/src/engine/physics/ecs/RigidBody.js +307 -286
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts +6 -3
- package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -1
- package/src/engine/physics/ecs/RigidBodyFlags.js +31 -28
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +12 -4
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -1
- package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +19 -5
- package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts +10 -0
- package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/physics/ecs/RigidBodySerializationUpgrader_0_1.js +37 -0
- package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts +28 -0
- package/src/engine/physics/ecs/find_non_finite_physics_state.d.ts.map +1 -0
- package/src/engine/physics/ecs/find_non_finite_physics_state.js +76 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts +11 -0
- package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -1
- package/src/engine/physics/events/ContactEventBuffer.js +40 -0
- package/src/engine/physics/events/diff_manifolds.d.ts +30 -13
- package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -1
- package/src/engine/physics/events/diff_manifolds.js +87 -50
- package/src/engine/physics/fluid/FluidField.d.ts +45 -17
- package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidField.js +53 -23
- package/src/engine/physics/fluid/FluidSimulator.d.ts +141 -5
- package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
- package/src/engine/physics/fluid/FluidSimulator.js +336 -43
- package/src/engine/physics/fluid/REVIEW_02_PLAN.md +114 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +4 -3
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidComponent.js +4 -3
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
- package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts +41 -0
- package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.d.ts.map +1 -0
- package/src/engine/physics/fluid/effector/AmbientWindFluidEffector.js +124 -0
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +27 -8
- package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +67 -18
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts +42 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +136 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts +37 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +169 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts +36 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +100 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +6 -0
- 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 +6 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +7 -2
- 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 +17 -12
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts +42 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +131 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +32 -22
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +43 -26
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts +31 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.d.ts.map +1 -0
- package/src/engine/physics/fluid/solver/v3_grid_patch_edges_constant.js +77 -0
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +26 -19
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +46 -42
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +38 -10
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +158 -75
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +22 -17
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +108 -96
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts +30 -1
- package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -1
- package/src/engine/physics/inertia/world_inverse_inertia.js +160 -116
- package/src/engine/physics/integration/integrate_position.js +97 -97
- package/src/engine/physics/island/IslandBuilder.d.ts +49 -8
- package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
- package/src/engine/physics/island/IslandBuilder.js +93 -14
- package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/box_box_manifold.js +683 -673
- package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/box_triangle_contact.js +899 -749
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts +27 -0
- package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_contacts.js +624 -459
- package/src/engine/physics/narrowphase/capsule_triangle_contact.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/capsule_triangle_contact.js +58 -38
- package/src/engine/physics/narrowphase/compute_penetration.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/compute_penetration.js +369 -325
- package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts +3 -1
- package/src/engine/physics/narrowphase/convex_convex_manifold.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/convex_convex_manifold.js +568 -422
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts +6 -3
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js +66 -10
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts +4 -1
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js +97 -94
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +117 -117
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +1738 -1739
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts +14 -7
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/reduce_manifold_contacts.js +74 -69
- package/src/engine/physics/persistence/solver_caches.d.ts +20 -0
- package/src/engine/physics/persistence/solver_caches.d.ts.map +1 -0
- package/src/engine/physics/persistence/solver_caches.js +309 -0
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
- package/src/engine/physics/queries/overlap_shape.js +187 -184
- package/src/engine/physics/queries/raycast.d.ts +3 -2
- package/src/engine/physics/queries/raycast.d.ts.map +1 -1
- package/src/engine/physics/queries/raycast.js +37 -11
- package/src/engine/physics/queries/shape_cast.d.ts +18 -5
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
- package/src/engine/physics/queries/shape_cast.js +417 -393
- package/src/engine/physics/solver/solve_contacts.d.ts +22 -6
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
- package/src/engine/physics/solver/solve_contacts.js +1482 -1338
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
- package/src/engine/physics/vehicle/RaycastVehicle.js +344 -339
- package/src/engine/ui/DraggableAspect.d.ts +12 -3
- package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
- package/src/engine/ui/DraggableAspect.js +115 -83
- package/src/generation/COORDINATES.md +54 -0
- package/src/generation/GridTaskGroup.js +2 -2
- package/src/generation/REVIEW_01_ACTION_PLAN.md +628 -0
- package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts +9 -1
- package/src/generation/automata/CaveGeneratorCellularAutomata.d.ts.map +1 -1
- package/src/generation/automata/CaveGeneratorCellularAutomata.js +79 -59
- package/src/generation/automata/CellularAutomata.d.ts +6 -3
- package/src/generation/automata/CellularAutomata.d.ts.map +1 -1
- package/src/generation/automata/CellularAutomata.js +22 -19
- package/src/generation/filtering/CellFilter.d.ts +17 -0
- package/src/generation/filtering/CellFilter.d.ts.map +1 -1
- package/src/generation/filtering/CellFilter.js +117 -77
- package/src/generation/filtering/CellFilterCellMatcher.d.ts.map +1 -1
- package/src/generation/filtering/CellFilterCellMatcher.js +2 -0
- package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts +5 -0
- package/src/generation/filtering/boolean/CellFilterLiteralBoolean.d.ts.map +1 -1
- package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +15 -0
- package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts +0 -1
- package/src/generation/filtering/core/CellFilterBinaryOperation.d.ts.map +1 -1
- package/src/generation/filtering/core/CellFilterBinaryOperation.js +37 -50
- package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts +0 -1
- package/src/generation/filtering/core/CellFilterOperationTertiary.d.ts.map +1 -1
- package/src/generation/filtering/core/CellFilterOperationTertiary.js +43 -59
- package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts +0 -1
- package/src/generation/filtering/core/CellFilterUnaryOperation.d.ts.map +1 -1
- package/src/generation/filtering/core/CellFilterUnaryOperation.js +29 -33
- package/src/generation/filtering/numeric/CellFilterCache.d.ts +1 -0
- package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts +3 -2
- package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +9 -35
- package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts +0 -1
- package/src/generation/filtering/numeric/complex/CellFilterCurvature.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterCurvature.js +19 -43
- package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts +0 -1
- package/src/generation/filtering/numeric/complex/CellFilterFXAA.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterFXAA.js +2 -6
- package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +9 -12
- package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +2 -1
- package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts +0 -1
- package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts.map +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterSobel.js +2 -6
- package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts +5 -4
- package/src/generation/filtering/numeric/math/CellFilterInverseLerp.d.ts.map +1 -1
- package/src/generation/filtering/numeric/math/CellFilterInverseLerp.js +5 -4
- package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts +17 -0
- package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.d.ts.map +1 -0
- package/src/generation/filtering/numeric/process/computeFilterSurfaceNormal.js +42 -0
- package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.d.ts.map +1 -1
- package/src/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +7 -1
- package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.d.ts.map +1 -1
- package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +7 -10
- package/src/generation/filtering/numeric/util/sampler_from_filter.d.ts.map +1 -1
- package/src/generation/filtering/numeric/util/sampler_from_filter.js +2 -1
- package/src/generation/grid/GridData.d.ts.map +1 -1
- package/src/generation/grid/GridData.js +14 -1
- package/src/generation/grid/actions/ContinuousGridCellAction.d.ts +10 -3
- package/src/generation/grid/actions/ContinuousGridCellAction.d.ts.map +1 -1
- package/src/generation/grid/actions/ContinuousGridCellAction.js +18 -3
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts +11 -1
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.d.ts.map +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.js +13 -3
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +2 -2
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +4 -6
- package/src/generation/grid/coords/grid_to_texel.d.ts +9 -0
- package/src/generation/grid/coords/grid_to_texel.d.ts.map +1 -0
- package/src/generation/grid/coords/grid_to_texel.js +10 -0
- package/src/generation/grid/coords/texel_to_grid.d.ts +9 -0
- package/src/generation/grid/coords/texel_to_grid.d.ts.map +1 -0
- package/src/generation/grid/coords/texel_to_grid.js +10 -0
- package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts +2 -2
- package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskApplyActionToCells.js +10 -6
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +20 -21
- package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts +7 -0
- package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +18 -10
- package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.d.ts.map +1 -1
- package/src/generation/grid/generation/discrete/GridTaskCellularAutomata.js +16 -7
- package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts +5 -3
- package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts.map +1 -1
- package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +26 -23
- package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.d.ts.map +1 -1
- package/src/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +10 -1
- package/src/generation/grid/generation/grid/select/CellSupplierBestN.d.ts.map +1 -1
- package/src/generation/grid/generation/grid/select/CellSupplierBestN.js +4 -0
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts +15 -8
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.d.ts.map +1 -1
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +89 -92
- package/src/generation/markers/GridActionRuleSet.d.ts.map +1 -1
- package/src/generation/markers/GridActionRuleSet.js +10 -2
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts +11 -0
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarker.js +20 -3
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts +3 -1
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarkerGroup.js +9 -2
- package/src/generation/markers/MarkerNode.d.ts +8 -3
- package/src/generation/markers/MarkerNode.d.ts.map +1 -1
- package/src/generation/markers/MarkerNode.js +12 -5
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessor.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +2 -2
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorSequence.js +2 -2
- package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
- package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.js +6 -4
- package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.d.ts.map +1 -1
- package/src/generation/markers/actions/probability/MarkerNodeActionWeightedElement.js +1 -3
- package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.d.ts.map +1 -1
- package/src/generation/markers/actions/terrain/MarkerNodeActionPaintTerrain.js +12 -11
- package/src/generation/markers/matcher/MarkerNodeMatcherAnd.js +2 -2
- package/src/generation/markers/transform/MarkerNodeTransformer.d.ts +4 -1
- package/src/generation/markers/transform/MarkerNodeTransformer.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformer.js +4 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +1 -3
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts +5 -0
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +15 -0
- package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerRecordProperty.js +1 -3
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +2 -4
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +1 -3
- package/src/generation/placement/GridCellPlacementRule.d.ts.map +1 -1
- package/src/generation/placement/GridCellPlacementRule.js +1 -3
- package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
- package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -10
- package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.d.ts.map +1 -1
- package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +6 -4
- package/src/generation/placement/action/random/weighted/WeightedGridCellAction.d.ts.map +1 -1
- package/src/generation/placement/action/random/weighted/WeightedGridCellAction.js +1 -3
- package/src/generation/rules/CellMatcher.d.ts +3 -1
- package/src/generation/rules/CellMatcher.d.ts.map +1 -1
- package/src/generation/rules/CellMatcher.js +3 -1
- package/src/generation/rules/CellMatcherFromFilter.d.ts.map +1 -1
- package/src/generation/rules/CellMatcherFromFilter.js +1 -3
- package/src/generation/rules/CellMatcherLayerBitMaskTest.d.ts.map +1 -1
- package/src/generation/rules/CellMatcherLayerBitMaskTest.js +6 -20
- package/src/generation/test_support/executeTaskTreeSync.d.ts +9 -0
- package/src/generation/test_support/executeTaskTreeSync.d.ts.map +1 -0
- package/src/generation/test_support/executeTaskTreeSync.js +78 -0
- package/src/generation/theme/TerrainLayerRuleAggregator.d.ts +2 -1
- package/src/generation/theme/TerrainLayerRuleAggregator.d.ts.map +1 -1
- package/src/generation/theme/TerrainLayerRuleAggregator.js +9 -6
- package/src/generation/theme/Theme.d.ts +1 -1
- package/src/generation/theme/Theme.d.ts.map +1 -1
- package/src/generation/theme/Theme.js +2 -2
- package/src/generation/theme/ThemeEngine.d.ts +3 -3
- package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
- package/src/generation/theme/ThemeEngine.js +26 -16
- package/src/generation/theme/cell/CellProcessingRule.d.ts +3 -3
- package/src/generation/theme/cell/CellProcessingRule.d.ts.map +1 -1
- package/src/generation/theme/cell/CellProcessingRule.js +6 -10
- package/src/generation/theme/cell/CellProcessingRuleSet.d.ts +1 -1
- package/src/generation/theme/cell/CellProcessingRuleSet.d.ts.map +1 -1
- package/src/generation/theme/cell/CellProcessingRuleSet.js +2 -2
- package/src/view/common/ListView.js +1 -1
- package/src/view/elements/BottomLeftResizeHandleView.d.ts.map +1 -1
- package/src/view/elements/BottomLeftResizeHandleView.js +13 -5
- package/src/core/font/FontAsset.d.ts.map +0 -1
- package/src/core/font/FontAssetLoader.d.ts.map +0 -1
- package/src/core/geom/3d/shape/util/shape_to_visual_entity.d.ts.map +0 -1
- package/src/core/geom/3d/tetrahedra/visualize_tetrahedral_mesh.d.ts.map +0 -1
- package/src/core/process/action/AsynchronousDelayAction.d.ts.map +0 -1
- package/src/engine/physics/computeInterceptPoint.d.ts.map +0 -1
- package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +0 -1
- package/src/engine/physics/gjk/gjk.d.ts.map +0 -1
- package/src/engine/physics/gjk/gjk_epa_penetration.d.ts.map +0 -1
- package/src/engine/physics/gjk/minkowski_support.d.ts.map +0 -1
- package/src/engine/physics/gjk/mpr.d.ts.map +0 -1
- package/src/engine/physics/integration/quat_integrate.d.ts.map +0 -1
- package/src/engine/physics/island/union_find.d.ts.map +0 -1
- package/src/engine/physics/narrowphase/clip_against_axis_uv.d.ts.map +0 -1
- package/src/engine/physics/narrowphase/decomposition/aabb_world_to_local.d.ts.map +0 -1
- package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts +0 -21
- package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.d.ts.map +0 -1
- package/src/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +0 -68
- package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts +0 -10
- package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.d.ts.map +0 -1
- package/src/generation/grid/generation/grid/GridTaskGridAlignedNodeGenerator.js +0 -17
- /package/src/{engine/physics → core/geom/3d}/gjk/NOTES.md +0 -0
- /package/src/{engine/physics → core/geom/3d}/gjk/gjk.d.ts +0 -0
- /package/src/{engine/physics → core/math/physics/kinematics}/computeInterceptPoint.d.ts +0 -0
|
@@ -22,11 +22,14 @@
|
|
|
22
22
|
*
|
|
23
23
|
* The collision grid therefore has `seg_u = (W − 1)·N` segments along u and
|
|
24
24
|
* `seg_v = (H − 1)·N` along v. The feature_id encodes
|
|
25
|
-
* `(sub_y · seg_u + sub_x) · 2 + tri_idx`, where (sub_x, sub_y) is the
|
|
25
|
+
* `(sub_y · seg_u + sub_x) · 2 + tri_idx + 1`, where (sub_x, sub_y) is the
|
|
26
26
|
* sub-cell and tri_idx ∈ {0, 1}: a unique, frame-stable key per sub-cell
|
|
27
27
|
* triangle (`seg_u · seg_v · 2` stays well under 2^53 for any realistic
|
|
28
|
-
* sampler × N).
|
|
29
|
-
*
|
|
28
|
+
* sampler × N). The `+ 1` keeps the corner cell's first triangle off fid 0 —
|
|
29
|
+
* the narrowphase's "no feature info" sentinel, which would cost its
|
|
30
|
+
* contacts fid warm-start matching and per-substep redetect. Two triangles
|
|
31
|
+
* per sub-cell, lower-left-diagonal split (matches the existing
|
|
32
|
+
* {@link build_height_field_geometry} winding).
|
|
30
33
|
*
|
|
31
34
|
* The query AABB is filtered against the footprint *and* against the
|
|
32
35
|
* cell grid; triangles outside the query AABB along the height axis are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heightmap_enumerate_triangles.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"heightmap_enumerate_triangles.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/narrowphase/decomposition/heightmap_enumerate_triangles.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,sDAXW,YAAY,UACZ,MAAM,uCAEN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CA+MlB"}
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
import { TRIANGLE_FEATURE_ID_OFFSET, TRIANGLE_FLOAT_STRIDE } from "./triangle_buffer_layout.js";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Corner-height row cache (D5). The emit loop reads 4 corner heights per
|
|
5
|
+
* sub-cell, but every interior corner is shared by 4 sub-cells — and the
|
|
6
|
+
* Catmull-Rom evaluation behind each height is ~9 bilinear taps, re-paid by
|
|
7
|
+
* the concave redetect every substep. Sampling each corner of the query
|
|
8
|
+
* rect ONCE — a row of corners at a time, rolled as `j` advances — cuts CR
|
|
9
|
+
* evaluations ~4× on interior rects.
|
|
10
|
+
*
|
|
11
|
+
* Exactness: corner k of row j is sampled at
|
|
12
|
+
* `u01 = (i_first + k) * inv_segU`, `v01 = j * inv_segV` — the SAME float
|
|
13
|
+
* expressions the per-cell code used (cell i's `u01_hi` and cell i+1's
|
|
14
|
+
* `u01_lo` are the identical product), so the cached values are
|
|
15
|
+
* bit-identical to the uncached ones and the emitted triangles do not
|
|
16
|
+
* change by a single bit.
|
|
17
|
+
*
|
|
18
|
+
* Module scratch, grown on demand; single-threaded narrowphase.
|
|
19
|
+
* @type {Float64Array}
|
|
20
|
+
*/
|
|
21
|
+
let row_corner_lo = new Float64Array(64);
|
|
22
|
+
let row_corner_hi = new Float64Array(64);
|
|
23
|
+
|
|
3
24
|
/**
|
|
4
25
|
* Write the heightmap's triangles that may overlap the given body-local
|
|
5
26
|
* query AABB into `output`, starting at float-index `offset`.
|
|
@@ -24,11 +45,14 @@ import { TRIANGLE_FEATURE_ID_OFFSET, TRIANGLE_FLOAT_STRIDE } from "./triangle_bu
|
|
|
24
45
|
*
|
|
25
46
|
* The collision grid therefore has `seg_u = (W − 1)·N` segments along u and
|
|
26
47
|
* `seg_v = (H − 1)·N` along v. The feature_id encodes
|
|
27
|
-
* `(sub_y · seg_u + sub_x) · 2 + tri_idx`, where (sub_x, sub_y) is the
|
|
48
|
+
* `(sub_y · seg_u + sub_x) · 2 + tri_idx + 1`, where (sub_x, sub_y) is the
|
|
28
49
|
* sub-cell and tri_idx ∈ {0, 1}: a unique, frame-stable key per sub-cell
|
|
29
50
|
* triangle (`seg_u · seg_v · 2` stays well under 2^53 for any realistic
|
|
30
|
-
* sampler × N).
|
|
31
|
-
*
|
|
51
|
+
* sampler × N). The `+ 1` keeps the corner cell's first triangle off fid 0 —
|
|
52
|
+
* the narrowphase's "no feature info" sentinel, which would cost its
|
|
53
|
+
* contacts fid warm-start matching and per-substep redetect. Two triangles
|
|
54
|
+
* per sub-cell, lower-left-diagonal split (matches the existing
|
|
55
|
+
* {@link build_height_field_geometry} winding).
|
|
32
56
|
*
|
|
33
57
|
* The query AABB is filtered against the footprint *and* against the
|
|
34
58
|
* cell grid; triangles outside the query AABB along the height axis are
|
|
@@ -177,22 +201,48 @@ export function heightmap_enumerate_triangles(
|
|
|
177
201
|
let count = 0;
|
|
178
202
|
let cursor = offset;
|
|
179
203
|
|
|
204
|
+
// Corner-row cache (see the D5 note at the top): `row_corner_lo` holds
|
|
205
|
+
// the heights along the sub-cell row's lower grid line, `row_corner_hi`
|
|
206
|
+
// the upper; rolled (swapped) as `j` advances since row j's upper line
|
|
207
|
+
// IS row j+1's lower line — the same `(j+1) * inv_segV` float.
|
|
208
|
+
const corners_per_row = i_last - i_first + 2;
|
|
209
|
+
if (row_corner_lo.length < corners_per_row) {
|
|
210
|
+
let cap = row_corner_lo.length;
|
|
211
|
+
while (cap < corners_per_row) cap <<= 1;
|
|
212
|
+
row_corner_lo = new Float64Array(cap);
|
|
213
|
+
row_corner_hi = new Float64Array(cap);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Prime the first row's lower grid line.
|
|
217
|
+
{
|
|
218
|
+
const v01 = j_first * inv_segV;
|
|
219
|
+
for (let k = 0; k < corners_per_row; k++) {
|
|
220
|
+
row_corner_lo[k] = sampler.sampleChannelCatmullRomUV((i_first + k) * inv_segU, v01, 0);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
180
224
|
for (let j = j_first; j <= j_last; j++) {
|
|
181
225
|
const v01_lo = j * inv_segV;
|
|
182
226
|
const v01_hi = (j + 1) * inv_segV;
|
|
183
227
|
const v_lo_coord = -half_v + size_z * v01_lo;
|
|
184
228
|
const v_hi_coord = -half_v + size_z * v01_hi;
|
|
185
229
|
|
|
230
|
+
// Sample the row's upper grid line; the lower line is already cached.
|
|
231
|
+
for (let k = 0; k < corners_per_row; k++) {
|
|
232
|
+
row_corner_hi[k] = sampler.sampleChannelCatmullRomUV((i_first + k) * inv_segU, v01_hi, 0);
|
|
233
|
+
}
|
|
234
|
+
|
|
186
235
|
for (let i = i_first; i <= i_last; i++) {
|
|
187
236
|
const u01_lo = i * inv_segU;
|
|
188
237
|
const u01_hi = (i + 1) * inv_segU;
|
|
189
238
|
const u_lo_coord = -half_u + size_x * u01_lo;
|
|
190
239
|
const u_hi_coord = -half_u + size_x * u01_hi;
|
|
191
240
|
|
|
192
|
-
const
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
const
|
|
241
|
+
const k = i - i_first;
|
|
242
|
+
const hA = row_corner_lo[k];
|
|
243
|
+
const hB = row_corner_lo[k + 1];
|
|
244
|
+
const hC = row_corner_hi[k + 1];
|
|
245
|
+
const hD = row_corner_hi[k];
|
|
196
246
|
|
|
197
247
|
const Ax = ux * u_lo_coord + vx * v_lo_coord + nx * hA;
|
|
198
248
|
const Ay = uy * u_lo_coord + vy * v_lo_coord + ny * hA;
|
|
@@ -213,11 +263,11 @@ export function heightmap_enumerate_triangles(
|
|
|
213
263
|
const cell_idx = j * seg_u + i;
|
|
214
264
|
const fid_base = cell_idx * 2;
|
|
215
265
|
|
|
216
|
-
// triangle 0: (A, D, B)
|
|
266
|
+
// triangle 0: (A, D, B). fid is offset by 1 — 0 is the "no fid" sentinel.
|
|
217
267
|
output[cursor ] = Ax; output[cursor + 1] = Ay; output[cursor + 2] = Az;
|
|
218
268
|
output[cursor + 3] = Dx; output[cursor + 4] = Dy; output[cursor + 5] = Dz;
|
|
219
269
|
output[cursor + 6] = Bx; output[cursor + 7] = By; output[cursor + 8] = Bz;
|
|
220
|
-
output[cursor + TRIANGLE_FEATURE_ID_OFFSET] = fid_base;
|
|
270
|
+
output[cursor + TRIANGLE_FEATURE_ID_OFFSET] = fid_base + 1;
|
|
221
271
|
cursor += TRIANGLE_FLOAT_STRIDE;
|
|
222
272
|
count++;
|
|
223
273
|
|
|
@@ -225,10 +275,16 @@ export function heightmap_enumerate_triangles(
|
|
|
225
275
|
output[cursor ] = Dx; output[cursor + 1] = Dy; output[cursor + 2] = Dz;
|
|
226
276
|
output[cursor + 3] = Cx; output[cursor + 4] = Cy; output[cursor + 5] = Cz;
|
|
227
277
|
output[cursor + 6] = Bx; output[cursor + 7] = By; output[cursor + 8] = Bz;
|
|
228
|
-
output[cursor + TRIANGLE_FEATURE_ID_OFFSET] = fid_base +
|
|
278
|
+
output[cursor + TRIANGLE_FEATURE_ID_OFFSET] = fid_base + 2;
|
|
229
279
|
cursor += TRIANGLE_FLOAT_STRIDE;
|
|
230
280
|
count++;
|
|
231
281
|
}
|
|
282
|
+
|
|
283
|
+
// Roll the corner rows: this row's upper line is the next row's
|
|
284
|
+
// lower line.
|
|
285
|
+
const roll = row_corner_lo;
|
|
286
|
+
row_corner_lo = row_corner_hi;
|
|
287
|
+
row_corner_hi = roll;
|
|
232
288
|
}
|
|
233
289
|
|
|
234
290
|
return count;
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
* {@link MeshShape3D#positions})
|
|
8
8
|
* [+3..+5] vB.xyz
|
|
9
9
|
* [+6..+8] vC.xyz
|
|
10
|
-
* [+9] feature_id (the surface triangle's index
|
|
10
|
+
* [+9] feature_id (the surface triangle's index + 1 — fid 0 is the
|
|
11
|
+
* narrowphase's "no feature info" sentinel, which
|
|
12
|
+
* would cost triangle 0's contacts their fid
|
|
13
|
+
* warm-start matching and per-substep redetect)
|
|
11
14
|
*
|
|
12
15
|
* Triangles are AABB-filtered: a triangle is emitted iff its tight AABB
|
|
13
16
|
* (min/max across its 3 vertices) overlaps the query AABB. This is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh_enumerate_triangles.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"mesh_enumerate_triangles.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/narrowphase/decomposition/mesh_enumerate_triangles.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,iDAXW,YAAY,UACZ,MAAM,kCAEN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,cACN,MAAM,GACJ,MAAM,CAqDlB"}
|
|
@@ -1,94 +1,97 @@
|
|
|
1
|
-
import { TRIANGLE_FEATURE_ID_OFFSET, TRIANGLE_FLOAT_STRIDE } from "./triangle_buffer_layout.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Write the mesh's surface triangles that may overlap the given query
|
|
5
|
-
* AABB into `output`, starting at float-index `offset`.
|
|
6
|
-
*
|
|
7
|
-
* Each triangle occupies {@link TRIANGLE_FLOAT_STRIDE} consecutive floats:
|
|
8
|
-
* [+0..+2] vA.xyz (shape's body-local frame, i.e. read directly from
|
|
9
|
-
* {@link MeshShape3D#positions})
|
|
10
|
-
* [+3..+5] vB.xyz
|
|
11
|
-
* [+6..+8] vC.xyz
|
|
12
|
-
* [+9] feature_id (the surface triangle's index
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* @param {
|
|
36
|
-
* @param {number}
|
|
37
|
-
* @param {
|
|
38
|
-
* @param {number}
|
|
39
|
-
* @param {number}
|
|
40
|
-
* @param {number}
|
|
41
|
-
* @
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
if (
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
output[cursor +
|
|
88
|
-
|
|
89
|
-
cursor
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
1
|
+
import { TRIANGLE_FEATURE_ID_OFFSET, TRIANGLE_FLOAT_STRIDE } from "./triangle_buffer_layout.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Write the mesh's surface triangles that may overlap the given query
|
|
5
|
+
* AABB into `output`, starting at float-index `offset`.
|
|
6
|
+
*
|
|
7
|
+
* Each triangle occupies {@link TRIANGLE_FLOAT_STRIDE} consecutive floats:
|
|
8
|
+
* [+0..+2] vA.xyz (shape's body-local frame, i.e. read directly from
|
|
9
|
+
* {@link MeshShape3D#positions})
|
|
10
|
+
* [+3..+5] vB.xyz
|
|
11
|
+
* [+6..+8] vC.xyz
|
|
12
|
+
* [+9] feature_id (the surface triangle's index + 1 — fid 0 is the
|
|
13
|
+
* narrowphase's "no feature info" sentinel, which
|
|
14
|
+
* would cost triangle 0's contacts their fid
|
|
15
|
+
* warm-start matching and per-substep redetect)
|
|
16
|
+
*
|
|
17
|
+
* Triangles are AABB-filtered: a triangle is emitted iff its tight AABB
|
|
18
|
+
* (min/max across its 3 vertices) overlaps the query AABB. This is a
|
|
19
|
+
* linear O(N) scan over the mesh's surface triangles — no surface-BVH
|
|
20
|
+
* yet (the existing BVH on MeshShape3D is over the *tet* decomposition
|
|
21
|
+
* used by `contains_point`, with different leaf semantics). For meshes
|
|
22
|
+
* up to a few thousand triangles the linear scan is comfortably faster
|
|
23
|
+
* than a BVH would be after broadphase has already given us a tight
|
|
24
|
+
* query AABB; we can graduate to a per-mesh surface BVH later.
|
|
25
|
+
*
|
|
26
|
+
* Determinism: triangles are emitted in the natural index order, so
|
|
27
|
+
* feature_id values inside `output` rise monotonically over a single
|
|
28
|
+
* call. The narrowphase relies on this for stable contact-manifold
|
|
29
|
+
* pairing across frames.
|
|
30
|
+
*
|
|
31
|
+
* Caller is responsible for ensuring
|
|
32
|
+
* `output.length - offset >= shape.indices.length / 3 * TRIANGLE_FLOAT_STRIDE`
|
|
33
|
+
* in the worst case (every triangle overlaps).
|
|
34
|
+
*
|
|
35
|
+
* @param {Float64Array} output
|
|
36
|
+
* @param {number} offset float-index into output
|
|
37
|
+
* @param {MeshShape3D} shape
|
|
38
|
+
* @param {number} aabb_min_x query AABB in shape's body-local frame
|
|
39
|
+
* @param {number} aabb_min_y
|
|
40
|
+
* @param {number} aabb_min_z
|
|
41
|
+
* @param {number} aabb_max_x
|
|
42
|
+
* @param {number} aabb_max_y
|
|
43
|
+
* @param {number} aabb_max_z
|
|
44
|
+
* @returns {number} number of triangles written
|
|
45
|
+
*/
|
|
46
|
+
export function mesh_enumerate_triangles(
|
|
47
|
+
output, offset, shape,
|
|
48
|
+
aabb_min_x, aabb_min_y, aabb_min_z,
|
|
49
|
+
aabb_max_x, aabb_max_y, aabb_max_z
|
|
50
|
+
) {
|
|
51
|
+
const positions = shape.positions;
|
|
52
|
+
const indices = shape.indices;
|
|
53
|
+
|
|
54
|
+
const tri_count = (indices.length / 3) | 0;
|
|
55
|
+
if (tri_count === 0) {
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let count = 0;
|
|
60
|
+
let cursor = offset;
|
|
61
|
+
|
|
62
|
+
for (let t = 0; t < tri_count; t++) {
|
|
63
|
+
const i_a = indices[t * 3 ] * 3;
|
|
64
|
+
const i_b = indices[t * 3 + 1] * 3;
|
|
65
|
+
const i_c = indices[t * 3 + 2] * 3;
|
|
66
|
+
|
|
67
|
+
const ax = positions[i_a ]; const ay = positions[i_a + 1]; const az = positions[i_a + 2];
|
|
68
|
+
const bx = positions[i_b ]; const by = positions[i_b + 1]; const bz = positions[i_b + 2];
|
|
69
|
+
const cx = positions[i_c ]; const cy = positions[i_c + 1]; const cz = positions[i_c + 2];
|
|
70
|
+
|
|
71
|
+
// tight per-triangle AABB
|
|
72
|
+
const tri_min_x = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx);
|
|
73
|
+
if (tri_min_x > aabb_max_x) continue;
|
|
74
|
+
const tri_max_x = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx);
|
|
75
|
+
if (tri_max_x < aabb_min_x) continue;
|
|
76
|
+
|
|
77
|
+
const tri_min_y = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy);
|
|
78
|
+
if (tri_min_y > aabb_max_y) continue;
|
|
79
|
+
const tri_max_y = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);
|
|
80
|
+
if (tri_max_y < aabb_min_y) continue;
|
|
81
|
+
|
|
82
|
+
const tri_min_z = az < bz ? (az < cz ? az : cz) : (bz < cz ? bz : cz);
|
|
83
|
+
if (tri_min_z > aabb_max_z) continue;
|
|
84
|
+
const tri_max_z = az > bz ? (az > cz ? az : cz) : (bz > cz ? bz : cz);
|
|
85
|
+
if (tri_max_z < aabb_min_z) continue;
|
|
86
|
+
|
|
87
|
+
output[cursor ] = ax; output[cursor + 1] = ay; output[cursor + 2] = az;
|
|
88
|
+
output[cursor + 3] = bx; output[cursor + 4] = by; output[cursor + 5] = bz;
|
|
89
|
+
output[cursor + 6] = cx; output[cursor + 7] = cy; output[cursor + 8] = cz;
|
|
90
|
+
output[cursor + TRIANGLE_FEATURE_ID_OFFSET] = t + 1; // 0 is the "no fid" sentinel
|
|
91
|
+
|
|
92
|
+
cursor += TRIANGLE_FLOAT_STRIDE;
|
|
93
|
+
count++;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return count;
|
|
97
|
+
}
|
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
import { bvh_query_user_data_overlaps_aabb } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.js";
|
|
2
|
-
import { aabb3_transform_oriented } from "../../../core/geom/3d/aabb/aabb3_transform_oriented.js";
|
|
3
|
-
import {
|
|
4
|
-
import { build_convex_decomposition } from "./convex_decomposition.js";
|
|
5
|
-
import { convex_convex_manifold, CONVEX_CONVEX_OUT_LENGTH } from "./convex_convex_manifold.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Contact generation between two triangulated meshes, each treated as the union
|
|
9
|
-
* of its CONVEX PIECES (from greedy tet-merge — see {@link build_convex_decomposition}).
|
|
10
|
-
* Concave-vs-concave reduced to convex piece-vs-piece, the standard
|
|
11
|
-
* convex-decomposition approach.
|
|
12
|
-
*
|
|
13
|
-
* Only piece pairs whose AABBs overlap reach the SAT + face-clip manifold:
|
|
14
|
-
* project mesh B's world AABB into A's local frame and query A's piece BVH; for
|
|
15
|
-
* each candidate piece of A, project its world AABB into B's local frame and
|
|
16
|
-
* query B's piece BVH. One top-level broadphase leaf per body; the per-shape
|
|
17
|
-
* piece BVHs do the culling. Merging keeps the piece count (and the per-pair
|
|
18
|
-
* SAT cost) far below the raw tet count — the path to large tet counts.
|
|
19
|
-
*
|
|
20
|
-
* The decomposition is built once per shape and cached (shapes are immutable,
|
|
21
|
-
* shared, and the decomposition is in the shape's local frame). Per-frame, no
|
|
22
|
-
* cross-frame state → reset-and-resimulate determinism preserved.
|
|
23
|
-
*
|
|
24
|
-
* @author Alex Goldring
|
|
25
|
-
* @copyright Company Named Limited (c) 2026
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
/** Stop emitting once the candidate buffer is nearly full (capped at 4
|
|
29
|
-
* downstream); a localised resting contact never approaches this. */
|
|
30
|
-
const MAX_EMIT = 60;
|
|
31
|
-
|
|
32
|
-
const piece_out = new Float64Array(CONVEX_CONVEX_OUT_LENGTH);
|
|
33
|
-
let cand_a = new Uint32Array(4096);
|
|
34
|
-
let cand_b = new Uint32Array(4096);
|
|
35
|
-
const local_bbox = new Float64Array(6);
|
|
36
|
-
const world_aabb = new Float64Array(6);
|
|
37
|
-
const query_aabb = new Float64Array(6);
|
|
38
|
-
|
|
39
|
-
/** Build + cache the convex decomposition on the (immutable, shared) shape. */
|
|
40
|
-
function get_decomposition(shape) {
|
|
41
|
-
let d = shape.__convex_decomposition;
|
|
42
|
-
if (d === undefined) {
|
|
43
|
-
d = build_convex_decomposition(shape);
|
|
44
|
-
shape.__convex_decomposition = d;
|
|
45
|
-
}
|
|
46
|
-
return d;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function ensure(buf, n) { return buf.length >= n ? buf : new Uint32Array(n); }
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Append the mesh-vs-mesh contacts via `append`, the narrowphase's
|
|
53
|
-
* `append_contact(count, wax,way,waz, wbx,wby,wbz, nx,ny,nz, depth, fid) → newCount`.
|
|
54
|
-
*
|
|
55
|
-
* @returns {number} new candidate count
|
|
56
|
-
*/
|
|
57
|
-
export function mesh_mesh_tet_contacts(count, shapeA, trA, shapeB, trB, append) {
|
|
58
|
-
const decompA = get_decomposition(shapeA);
|
|
59
|
-
const decompB = get_decomposition(shapeB);
|
|
60
|
-
const piecesA = decompA.pieces;
|
|
61
|
-
const piecesB = decompB.pieces;
|
|
62
|
-
|
|
63
|
-
// Candidate pieces of A: those whose AABB overlaps B's world AABB (in A-local).
|
|
64
|
-
shapeB.compute_bounding_box(local_bbox);
|
|
65
|
-
aabb3_transform_oriented(
|
|
66
|
-
world_aabb, 0,
|
|
67
|
-
local_bbox[0], local_bbox[1], local_bbox[2], local_bbox[3], local_bbox[4], local_bbox[5],
|
|
68
|
-
trB.position.x, trB.position.y, trB.position.z,
|
|
69
|
-
trB.rotation.x, trB.rotation.y, trB.rotation.z, trB.rotation.w
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
query_aabb, 0, world_aabb,
|
|
73
|
-
trA.position.x, trA.position.y, trA.position.z,
|
|
74
|
-
trA.rotation.x, trA.rotation.y, trA.rotation.z, trA.rotation.w
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
cand_a = ensure(cand_a, piecesA.length);
|
|
78
|
-
const nA = bvh_query_user_data_overlaps_aabb(cand_a, 0, decompA.bvh, query_aabb);
|
|
79
|
-
|
|
80
|
-
for (let i = 0; i < nA; i++) {
|
|
81
|
-
const pieceA = piecesA[cand_a[i]];
|
|
82
|
-
|
|
83
|
-
// Candidate pieces of B near this piece of A.
|
|
84
|
-
const ab = pieceA.aabb;
|
|
85
|
-
aabb3_transform_oriented(
|
|
86
|
-
world_aabb, 0,
|
|
87
|
-
ab[0], ab[1], ab[2], ab[3], ab[4], ab[5],
|
|
88
|
-
trA.position.x, trA.position.y, trA.position.z,
|
|
89
|
-
trA.rotation.x, trA.rotation.y, trA.rotation.z, trA.rotation.w
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
query_aabb, 0, world_aabb,
|
|
93
|
-
trB.position.x, trB.position.y, trB.position.z,
|
|
94
|
-
trB.rotation.x, trB.rotation.y, trB.rotation.z, trB.rotation.w
|
|
95
|
-
);
|
|
96
|
-
cand_b = ensure(cand_b, piecesB.length);
|
|
97
|
-
const nB = bvh_query_user_data_overlaps_aabb(cand_b, 0, decompB.bvh, query_aabb);
|
|
98
|
-
|
|
99
|
-
for (let j = 0; j < nB; j++) {
|
|
100
|
-
const pieceB = piecesB[cand_b[j]];
|
|
101
|
-
if (!convex_convex_manifold(piece_out, pieceA, trA.position, trA.rotation, pieceB, trB.position, trB.rotation)) {
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
const cc = piece_out[3] | 0;
|
|
105
|
-
const nx = piece_out[0], ny = piece_out[1], nz = piece_out[2];
|
|
106
|
-
for (let k = 0; k < cc; k++) {
|
|
107
|
-
const base = 4 + k * 7;
|
|
108
|
-
count = append(count,
|
|
109
|
-
piece_out[base], piece_out[base + 1], piece_out[base + 2],
|
|
110
|
-
piece_out[base + 3], piece_out[base + 4], piece_out[base + 5],
|
|
111
|
-
nx, ny, nz, piece_out[base + 6], 0);
|
|
112
|
-
}
|
|
113
|
-
if (count >= MAX_EMIT) return count;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return count;
|
|
117
|
-
}
|
|
1
|
+
import { bvh_query_user_data_overlaps_aabb } from "../../../core/bvh2/bvh3/query/bvh_query_user_data_overlaps_aabb.js";
|
|
2
|
+
import { aabb3_transform_oriented } from "../../../core/geom/3d/aabb/aabb3_transform_oriented.js";
|
|
3
|
+
import { aabb3_transform_oriented_inverse } from "../../../core/geom/3d/aabb/aabb3_transform_oriented_inverse.js";
|
|
4
|
+
import { build_convex_decomposition } from "./convex_decomposition.js";
|
|
5
|
+
import { convex_convex_manifold, CONVEX_CONVEX_OUT_LENGTH } from "./convex_convex_manifold.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Contact generation between two triangulated meshes, each treated as the union
|
|
9
|
+
* of its CONVEX PIECES (from greedy tet-merge — see {@link build_convex_decomposition}).
|
|
10
|
+
* Concave-vs-concave reduced to convex piece-vs-piece, the standard
|
|
11
|
+
* convex-decomposition approach.
|
|
12
|
+
*
|
|
13
|
+
* Only piece pairs whose AABBs overlap reach the SAT + face-clip manifold:
|
|
14
|
+
* project mesh B's world AABB into A's local frame and query A's piece BVH; for
|
|
15
|
+
* each candidate piece of A, project its world AABB into B's local frame and
|
|
16
|
+
* query B's piece BVH. One top-level broadphase leaf per body; the per-shape
|
|
17
|
+
* piece BVHs do the culling. Merging keeps the piece count (and the per-pair
|
|
18
|
+
* SAT cost) far below the raw tet count — the path to large tet counts.
|
|
19
|
+
*
|
|
20
|
+
* The decomposition is built once per shape and cached (shapes are immutable,
|
|
21
|
+
* shared, and the decomposition is in the shape's local frame). Per-frame, no
|
|
22
|
+
* cross-frame state → reset-and-resimulate determinism preserved.
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** Stop emitting once the candidate buffer is nearly full (capped at 4
|
|
29
|
+
* downstream); a localised resting contact never approaches this. */
|
|
30
|
+
const MAX_EMIT = 60;
|
|
31
|
+
|
|
32
|
+
const piece_out = new Float64Array(CONVEX_CONVEX_OUT_LENGTH);
|
|
33
|
+
let cand_a = new Uint32Array(4096);
|
|
34
|
+
let cand_b = new Uint32Array(4096);
|
|
35
|
+
const local_bbox = new Float64Array(6);
|
|
36
|
+
const world_aabb = new Float64Array(6);
|
|
37
|
+
const query_aabb = new Float64Array(6);
|
|
38
|
+
|
|
39
|
+
/** Build + cache the convex decomposition on the (immutable, shared) shape. */
|
|
40
|
+
function get_decomposition(shape) {
|
|
41
|
+
let d = shape.__convex_decomposition;
|
|
42
|
+
if (d === undefined) {
|
|
43
|
+
d = build_convex_decomposition(shape);
|
|
44
|
+
shape.__convex_decomposition = d;
|
|
45
|
+
}
|
|
46
|
+
return d;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function ensure(buf, n) { return buf.length >= n ? buf : new Uint32Array(n); }
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Append the mesh-vs-mesh contacts via `append`, the narrowphase's
|
|
53
|
+
* `append_contact(count, wax,way,waz, wbx,wby,wbz, nx,ny,nz, depth, fid) → newCount`.
|
|
54
|
+
*
|
|
55
|
+
* @returns {number} new candidate count
|
|
56
|
+
*/
|
|
57
|
+
export function mesh_mesh_tet_contacts(count, shapeA, trA, shapeB, trB, append) {
|
|
58
|
+
const decompA = get_decomposition(shapeA);
|
|
59
|
+
const decompB = get_decomposition(shapeB);
|
|
60
|
+
const piecesA = decompA.pieces;
|
|
61
|
+
const piecesB = decompB.pieces;
|
|
62
|
+
|
|
63
|
+
// Candidate pieces of A: those whose AABB overlaps B's world AABB (in A-local).
|
|
64
|
+
shapeB.compute_bounding_box(local_bbox);
|
|
65
|
+
aabb3_transform_oriented(
|
|
66
|
+
world_aabb, 0,
|
|
67
|
+
local_bbox[0], local_bbox[1], local_bbox[2], local_bbox[3], local_bbox[4], local_bbox[5],
|
|
68
|
+
trB.position.x, trB.position.y, trB.position.z,
|
|
69
|
+
trB.rotation.x, trB.rotation.y, trB.rotation.z, trB.rotation.w
|
|
70
|
+
);
|
|
71
|
+
aabb3_transform_oriented_inverse(
|
|
72
|
+
query_aabb, 0, world_aabb,
|
|
73
|
+
trA.position.x, trA.position.y, trA.position.z,
|
|
74
|
+
trA.rotation.x, trA.rotation.y, trA.rotation.z, trA.rotation.w
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
cand_a = ensure(cand_a, piecesA.length);
|
|
78
|
+
const nA = bvh_query_user_data_overlaps_aabb(cand_a, 0, decompA.bvh, query_aabb);
|
|
79
|
+
|
|
80
|
+
for (let i = 0; i < nA; i++) {
|
|
81
|
+
const pieceA = piecesA[cand_a[i]];
|
|
82
|
+
|
|
83
|
+
// Candidate pieces of B near this piece of A.
|
|
84
|
+
const ab = pieceA.aabb;
|
|
85
|
+
aabb3_transform_oriented(
|
|
86
|
+
world_aabb, 0,
|
|
87
|
+
ab[0], ab[1], ab[2], ab[3], ab[4], ab[5],
|
|
88
|
+
trA.position.x, trA.position.y, trA.position.z,
|
|
89
|
+
trA.rotation.x, trA.rotation.y, trA.rotation.z, trA.rotation.w
|
|
90
|
+
);
|
|
91
|
+
aabb3_transform_oriented_inverse(
|
|
92
|
+
query_aabb, 0, world_aabb,
|
|
93
|
+
trB.position.x, trB.position.y, trB.position.z,
|
|
94
|
+
trB.rotation.x, trB.rotation.y, trB.rotation.z, trB.rotation.w
|
|
95
|
+
);
|
|
96
|
+
cand_b = ensure(cand_b, piecesB.length);
|
|
97
|
+
const nB = bvh_query_user_data_overlaps_aabb(cand_b, 0, decompB.bvh, query_aabb);
|
|
98
|
+
|
|
99
|
+
for (let j = 0; j < nB; j++) {
|
|
100
|
+
const pieceB = piecesB[cand_b[j]];
|
|
101
|
+
if (!convex_convex_manifold(piece_out, pieceA, trA.position, trA.rotation, pieceB, trB.position, trB.rotation)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const cc = piece_out[3] | 0;
|
|
105
|
+
const nx = piece_out[0], ny = piece_out[1], nz = piece_out[2];
|
|
106
|
+
for (let k = 0; k < cc; k++) {
|
|
107
|
+
const base = 4 + k * 7;
|
|
108
|
+
count = append(count,
|
|
109
|
+
piece_out[base], piece_out[base + 1], piece_out[base + 2],
|
|
110
|
+
piece_out[base + 3], piece_out[base + 4], piece_out[base + 5],
|
|
111
|
+
nx, ny, nz, piece_out[base + 6], 0);
|
|
112
|
+
}
|
|
113
|
+
if (count >= MAX_EMIT) return count;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return count;
|
|
117
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narrowphase_step.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/narrowphase/narrowphase_step.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"narrowphase_step.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/narrowphase/narrowphase_step.js"],"names":[],"mappings":"AAyyCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qDAVW,YAAY,GAAC,MAAM,EAAE,iCAGrB;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,QAC5B;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,iCAErC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,QAC5B;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,GACnC,MAAM,CAuClB;AAED;;;;;;;;;;;GAWG;AACH,uFALW,MAAM,MAAM;IAAC,QAAQ,WAAW;IAAC,SAAS,YAAW;CAAC,CAAC,CAAC,QA4LlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,uEAJW,MAAM,UACN,MAAM;IAAC,QAAQ,WAAW;IAAC,SAAS,YAAW;CAAC,CAAC,UACjD,MAAM;IAAC,QAAQ,WAAW;IAAC,SAAS,YAAW;CAAC,CAAC,QA2H3D"}
|