@woosh/meep-engine 3.40.0 → 3.42.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/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/selection/editor_pick.d.ts.map +1 -1
- package/editor/selection/editor_pick.js +2 -1
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +7 -1
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
- package/editor/tools/engine/ToolEngine.js +10 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +7 -20
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
- package/editor/tools/v2/handle/gizmo_drag_plane.js +4 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
- package/editor/view/ecs/EntityEditor.js +3 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +28 -12
- package/package.json +1 -1
- package/samples/engine/first-scene/index.html +4 -1
- package/samples/engine/first-scene/main.js +14 -9
- package/src/core/binary/utf8/utf8_decode.js +3 -3
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.d.ts.map +1 -1
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.js +112 -113
- package/src/core/bvh2/bvh3/ebvh_nodes_sort_sah_local4.js +2 -2
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +14 -14
- package/src/core/collection/RingBuffer.d.ts.map +1 -1
- package/src/core/collection/RingBuffer.js +4 -0
- package/src/core/collection/array/array_contains_duplicates.d.ts.map +1 -1
- package/src/core/collection/array/array_contains_duplicates.js +2 -1
- package/src/core/collection/array/array_copy.d.ts.map +1 -1
- package/src/core/collection/array/array_copy.js +23 -0
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/sparse_typed_array_hash.js +9 -8
- package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint16_array_hash.js +4 -4
- package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint8_array_hash.js +4 -4
- package/src/core/collection/array/weightedRandomFromArray.d.ts +1 -0
- package/src/core/collection/array/weightedRandomFromArray.d.ts.map +1 -1
- package/src/core/collection/array/weightedRandomFromArray.js +9 -1
- package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
- package/src/core/collection/heap/BinaryHeap.js +4 -0
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +4 -2
- package/src/core/collection/set/ArraySet.js +1 -1
- package/src/core/collection/set/HashSet.d.ts +1 -1
- package/src/core/collection/set/HashSet.d.ts.map +1 -1
- package/src/core/collection/set/HashSet.js +4 -2
- package/src/core/debug/matchers/IsEqual.js +1 -1
- package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
- package/src/core/debug/matchers/IsIterableContaining.js +61 -74
- package/src/core/events/signal/SignalBinding.js +101 -101
- package/src/core/function/extractFunctionBody.js +13 -13
- package/src/core/function/objectsEqual.d.ts.map +1 -1
- package/src/core/function/objectsEqual.js +15 -14
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +207 -172
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +5 -4
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +8 -2
- package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts +24 -0
- package/src/core/geom/3d/quaternion/swing_twist_clamp.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_clamp.js +62 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts +15 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_compose.js +36 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.d.ts +39 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/swing_twist_error.js +85 -0
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts +11 -6
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_rigid_align_paired_unit_vectors.js +27 -13
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts +25 -0
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.d.ts.map +1 -0
- package/src/core/math/linalg/eigen/matrix_symmetric_4x4_eigen.js +166 -0
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts +5 -3
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.d.ts.map +1 -1
- package/src/core/math/linalg/eigen/matrix_top_eigenvector_power_iteration.js +5 -3
- package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
- package/src/core/math/noise/curl_noise_3dt.js +20 -10
- package/src/core/math/noise/sdnoise.d.ts +16 -5
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +43 -9
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +6 -2
- package/src/engine/animation/curve/AnimationCurve.d.ts +3 -0
- package/src/engine/animation/curve/AnimationCurve.d.ts.map +1 -1
- package/src/engine/animation/curve/AnimationCurve.js +6 -1
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
- package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/WallRun.js +13 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
- package/src/engine/ecs/EntityManager.d.ts +9 -1
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +44 -42
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +20 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -1
- package/src/engine/ecs/gpu/GPUStateAuthority.js +21 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts +13 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPU_AUTHORITY_EVENT_HOLD_CHANGE.js +12 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +6 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -1
- package/src/engine/ecs/gpu/gpu_authority_grant.js +7 -1
- package/src/engine/ecs/gpu/gpu_authority_held.d.ts +14 -0
- package/src/engine/ecs/gpu/gpu_authority_held.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_held.js +23 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_hold.js +41 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts +14 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_unhold.js +32 -0
- package/src/engine/ecs/ik/IKGoal.d.ts +59 -0
- package/src/engine/ecs/ik/IKGoal.d.ts.map +1 -0
- package/src/engine/ecs/ik/IKGoal.js +83 -0
- package/src/engine/ecs/ik/IKGoalSystem.d.ts +75 -0
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -0
- package/src/engine/ecs/ik/IKGoalSystem.js +1456 -0
- package/src/engine/ecs/ik/PLAN.md +179 -0
- package/src/engine/ecs/parent/EntityNode.js +3 -3
- package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
- package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
- package/src/engine/ecs/storage/BinaryBufferSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/BinaryBufferSerializer.js +4 -5
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
- package/src/engine/ecs/storage/binary/SERIALIZATION_COVERAGE.md +7 -3
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +9 -2
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts +33 -0
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.d.ts.map +1 -0
- package/src/engine/ecs/system/orderSystemsByDeclaredAccess.js +282 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
- package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -139
- package/src/engine/ecs/transform/t64_evaluate_local.d.ts +25 -0
- package/src/engine/ecs/transform/t64_evaluate_local.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_local.js +35 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +5 -3
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_evaluate_world.js +128 -126
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +17 -0
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +2 -0
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +337 -329
- package/src/engine/graphics3/AnimationSystem.d.ts +2 -0
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +360 -352
- package/src/engine/graphics3/WaterSystem.d.ts +12 -3
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +78 -46
- package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
- package/src/engine/input/devices/PointerDevice.js +29 -4
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
- package/src/engine/physics/cloth/MEASUREMENTS.md +130 -0
- package/src/engine/physics/cloth/PLAN.md +16 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +5 -6
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +5 -6
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +4 -7
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +4 -7
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +4 -3
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +4 -3
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +10 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +24 -24
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +46 -43
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +1 -1
- package/src/engine/physics/constraint/solve_constraints.d.ts +0 -35
- package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
- package/src/engine/physics/constraint/solve_constraints.js +1 -83
- package/src/engine/physics/ecs/ContactProbe.d.ts +73 -0
- package/src/engine/physics/ecs/ContactProbe.d.ts.map +1 -0
- package/src/engine/physics/ecs/ContactProbe.js +103 -0
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts +44 -0
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -0
- package/src/engine/physics/ecs/ContactProbeSystem.js +397 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +1 -1
- package/src/engine/physics/fluid/ecs/FluidComponent.js +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts +205 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/FrameFabrikProblem.js +245 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts +21 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_limit_from_joint.js +63 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts +33 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/frame_fabrik/frame_fabrik_solve.js +874 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts +27 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/joint_hinge_mid_axis.js +77 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts +36 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.d.ts.map +1 -0
- package/src/engine/physics/inverse_kinematics/two_bone_path_solve.js +97 -0
- package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts +33 -11
- package/src/engine/physics/inverse_kinematics/two_joint_ik.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/two_joint_ik.js +158 -67
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
- package/src/engine/ui/DraggableAspect.d.ts +5 -1
- package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
- package/src/engine/ui/DraggableAspect.js +61 -4
- package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
- package/src/format/image/avif/heif/ItemProperty.js +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
- package/src/shade/playground/water_refraction/README.md +10 -11
- package/src/shade/playground/water_refraction/main.js +9 -8
- package/src/shade/playground/water_refraction/world.js +1 -1
- package/src/shade/playground/water_surface/README.md +43 -0
- package/src/shade/playground/water_surface/index.html +30 -0
- package/src/shade/playground/water_surface/main.d.ts +2 -0
- package/src/shade/playground/water_surface/main.d.ts.map +1 -0
- package/src/shade/playground/water_surface/main.js +154 -0
- package/src/shade/playground/water_surface/world.d.ts +44 -0
- package/src/shade/playground/water_surface/world.d.ts.map +1 -0
- package/src/shade/playground/water_surface/world.js +160 -0
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +10 -4
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +251 -23
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +12 -4
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +12 -4
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +14 -1
- package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts +78 -0
- package/src/shade/renderer/animation/pose/PoseChannelIndex.d.ts.map +1 -0
- package/src/shade/renderer/animation/pose/PoseChannelIndex.js +274 -0
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts +40 -3
- package/src/shade/renderer/animation/pose/PosePlayback.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/PosePlayback.js +77 -3
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +21 -3
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +79 -11
- package/src/shade/renderer/animation/shader_animation_apply.js +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts +3 -2
- package/src/shade/renderer/animation/shader_animation_pose_resolve.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +187 -176
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
- package/src/shade/renderer/binding/BufferBinding.js +2 -2
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +3 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.js +5 -2
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +4 -0
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +6 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +135 -73
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +7 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +29 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts +19 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js +167 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts +25 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js +124 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts +19 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.d.ts.map +1 -0
- package/src/shade/renderer/scene/optimization/geometry/internal/seed_correspondence_from_face_pair.js +48 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +17 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +29 -3
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
- package/src/shade/renderer/water/shader_water.d.ts +0 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +201 -72
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
- package/src/engine/ecs/ik/IKConstraint.d.ts +0 -52
- package/src/engine/ecs/ik/IKConstraint.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKConstraint.js +0 -95
- package/src/engine/ecs/ik/IKProblem.d.ts +0 -45
- package/src/engine/ecs/ik/IKProblem.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKProblem.js +0 -58
- package/src/engine/ecs/ik/IKSolver.d.ts +0 -8
- package/src/engine/ecs/ik/IKSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/IKSolver.js +0 -9
- package/src/engine/ecs/ik/InverseKinematics.d.ts +0 -48
- package/src/engine/ecs/ik/InverseKinematics.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematics.js +0 -119
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts +0 -19
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematicsSerializationAdapter.js +0 -72
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +0 -54
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +0 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +0 -212
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts +0 -8
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +0 -153
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts +0 -5
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +0 -1
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +0 -120
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +0 -64
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +0 -142
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +0 -42
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_probe_terrain_contact.js +0 -123
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +0 -18
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +0 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +0 -32
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
|
@@ -6,13 +6,14 @@ import { Transform64 } from "../../../../../engine/ecs/transform/Transform64.js"
|
|
|
6
6
|
import { StandardAttributes } from "../../../geometry/StandardAttributes.js";
|
|
7
7
|
import { anchor_grow_topological } from "./internal/anchor_grow_topological.js";
|
|
8
8
|
import { cover_greedy } from "./internal/cover_greedy.js";
|
|
9
|
+
import { face_neighbourhood_hash } from "./internal/face_neighbourhood_hash.js";
|
|
9
10
|
import { geometry_extract_subset } from "./internal/geometry_extract_subset.js";
|
|
10
11
|
import { geometry_to_topology } from "./internal/geometry_to_topology.js";
|
|
11
12
|
import { GLOBAL_RESIDUAL_THRESHOLD_FRACTION, match_refit_and_validate } from "./internal/match_refit_validate.js";
|
|
12
13
|
import { match_validate_topology } from "./internal/match_validate_topology.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { ANCHOR_STRIDE, neighbourhood_anchor_index } from "./internal/neighbourhood_anchor_index.js";
|
|
15
|
+
import { seed_correspondence_from_face_pair } from "./internal/seed_correspondence_from_face_pair.js";
|
|
16
|
+
import { vertex_attribute_pairs } from "./internal/vertex_attributes_equal.js";
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* @typedef GeometryDeduplicateOptions
|
|
@@ -23,9 +24,20 @@ import { triangle_fingerprint_stream } from "./internal/triangle_fingerprint_str
|
|
|
23
24
|
* own tolerance ≈ `min(diag_a, diag_b) * 1e-4`.
|
|
24
25
|
* When provided, the per-pair derivation is
|
|
25
26
|
* clamped to this value (the tighter wins).
|
|
26
|
-
* @property {number} [seed_budget=256] Max
|
|
27
|
+
* @property {number} [seed_budget=256] Max triangles kept per neighbourhood hash
|
|
27
28
|
*/
|
|
28
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Edge-steps of neighbourhood each triangle's anchor hash takes in ({@link face_neighbourhood_hash}).
|
|
32
|
+
* Fewer make a hash that more unrelated triangles share, and more growth spent finding that out; more
|
|
33
|
+
* keep a triangle from anchoring unless the piece around it is that much wider, and thin pieces go
|
|
34
|
+
* unfound. Measured on Sponza through scene_optimize's meshlet round trip, triangles shared and time
|
|
35
|
+
* taken (single runs on a busy machine): 2 rounds 147.3k in 6.5 s, 3 rounds 145.8k in 5.2 s, 4 rounds
|
|
36
|
+
* 144.8k in 3.6 s, 6 rounds 136.4k in 2.6 s.
|
|
37
|
+
* @type {number}
|
|
38
|
+
*/
|
|
39
|
+
const NEIGHBOURHOOD_ROUNDS = 3;
|
|
40
|
+
|
|
29
41
|
/**
|
|
30
42
|
* Relative tolerance for the per-anchor `position_epsilon` derivation.
|
|
31
43
|
* The smaller of the two paired geometries' bounding-box diagonals is multiplied
|
|
@@ -94,12 +106,14 @@ export function geometry_deduplicate({
|
|
|
94
106
|
// loop can derive a per-pair tolerance without recomputing bounds.
|
|
95
107
|
const geom_diagonals = compute_geometry_diagonals(unique_geoms);
|
|
96
108
|
|
|
97
|
-
//
|
|
98
|
-
|
|
109
|
+
// ──────────────────── Stage B: neighbourhood hashes ────────────────────
|
|
110
|
+
// Keyed on the triangles around each triangle, not on its place in the index stream: a meshlet build
|
|
111
|
+
// orders a turned copy's triangles differently from the original's, and no run of them survives.
|
|
112
|
+
let hashes = unique_geoms.map(g => face_neighbourhood_hash(g, NEIGHBOURHOOD_ROUNDS));
|
|
99
113
|
|
|
100
|
-
//
|
|
101
|
-
const anchors =
|
|
102
|
-
|
|
114
|
+
// ────────────────────── Stage C: anchors ──────────────────────
|
|
115
|
+
const anchors = neighbourhood_anchor_index(hashes, seed_budget);
|
|
116
|
+
hashes = null; // the hashes aren't needed past this point — let GC reclaim
|
|
103
117
|
|
|
104
118
|
// ────────────────────── Stage D: grow each anchor ──────────────────────
|
|
105
119
|
/** @type {Map<number, BinaryTopology>} */
|
|
@@ -118,79 +132,52 @@ export function geometry_deduplicate({
|
|
|
118
132
|
/** Per-geom faces already covered by an accepted grown match. */
|
|
119
133
|
const grown_face_set_per_geom = new Map();
|
|
120
134
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const b_grown = get_or_create_set(grown_face_set_per_geom, anchor.b_geom);
|
|
135
|
+
/** @type {Map<number, number>} an anchor's seed, rewritten per attempt; growth works on a copy */
|
|
136
|
+
const seed = new Map();
|
|
124
137
|
|
|
125
|
-
|
|
126
|
-
|
|
138
|
+
for (let i = 0; i < anchors.length; i += ANCHOR_STRIDE) {
|
|
139
|
+
const a_index = anchors[i];
|
|
140
|
+
const a_face = anchors[i + 1];
|
|
141
|
+
const b_index = anchors[i + 2];
|
|
142
|
+
const b_face = anchors[i + 3];
|
|
127
143
|
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
const topology_a = get_topology(anchor.a_geom);
|
|
131
|
-
const topology_b = get_topology(anchor.b_geom);
|
|
144
|
+
const a_grown = get_or_create_set(grown_face_set_per_geom, a_index);
|
|
145
|
+
const b_grown = get_or_create_set(grown_face_set_per_geom, b_index);
|
|
132
146
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
);
|
|
139
|
-
if (seed === null) continue;
|
|
147
|
+
if (a_grown.has(a_face) && b_grown.has(b_face)) continue;
|
|
148
|
+
|
|
149
|
+
const topology_a = get_topology(a_index);
|
|
150
|
+
const topology_b = get_topology(b_index);
|
|
151
|
+
const attributes = vertex_attribute_pairs(unique_geoms[a_index], unique_geoms[b_index]);
|
|
140
152
|
|
|
141
153
|
const pair_epsilon = derive_pair_epsilon(
|
|
142
|
-
geom_diagonals[
|
|
143
|
-
geom_diagonals[
|
|
154
|
+
geom_diagonals[a_index],
|
|
155
|
+
geom_diagonals[b_index],
|
|
144
156
|
position_epsilon
|
|
145
157
|
);
|
|
146
158
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const matched_set_a = new Set(grown.faces_a);
|
|
160
|
-
if (!match_validate_topology(
|
|
161
|
-
topology_a, topology_b,
|
|
162
|
-
matched_set_a, grown.face_correspondence, grown.vertex_correspondence
|
|
163
|
-
)) {
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
159
|
+
// the anchor pairs two triangles; which corner lies on which is for attributes, then positions, to say
|
|
160
|
+
for (let offset = 0; offset < 3; offset++) {
|
|
161
|
+
if (!seed_correspondence_from_face_pair(seed, attributes, topology_a, topology_b, a_face, b_face, offset)) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const match = grow_validated_match(
|
|
166
|
+
unique_geoms, a_index, b_index,
|
|
167
|
+
topology_a, topology_b,
|
|
168
|
+
seed, a_face, b_face,
|
|
169
|
+
pair_epsilon, min_primitives
|
|
170
|
+
);
|
|
166
171
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
geometry_a: a_geom,
|
|
174
|
-
geometry_b: b_geom,
|
|
175
|
-
vertex_correspondence: grown.vertex_correspondence,
|
|
176
|
-
transform: grown.transform,
|
|
177
|
-
threshold: pair_epsilon * GLOBAL_RESIDUAL_THRESHOLD_FRACTION,
|
|
178
|
-
});
|
|
179
|
-
if (!validation.valid) {
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
172
|
+
if (match === null) continue;
|
|
173
|
+
|
|
174
|
+
for (const f of match.faces_a) a_grown.add(f);
|
|
175
|
+
for (const f of match.faces_b) b_grown.add(f);
|
|
176
|
+
|
|
177
|
+
matches.push(match);
|
|
182
178
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
matches.push({
|
|
187
|
-
a_geom: anchor.a_geom,
|
|
188
|
-
b_geom: anchor.b_geom,
|
|
189
|
-
faces_a: grown.faces_a,
|
|
190
|
-
faces_b: grown.faces_b,
|
|
191
|
-
transform: grown.transform,
|
|
192
|
-
max_residual: validation.max_residual,
|
|
193
|
-
});
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
194
181
|
}
|
|
195
182
|
|
|
196
183
|
// ────────────────────── Stage E: greedy cover ──────────────────────
|
|
@@ -267,6 +254,76 @@ export function geometry_deduplicate({
|
|
|
267
254
|
return result;
|
|
268
255
|
}
|
|
269
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Grow a match out from a seeded triangle pair, and keep it only if it covers at least `min_primitives`
|
|
259
|
+
* triangles, its connectivity is the same on both sides, and one transform fitted to all of it still
|
|
260
|
+
* places every vertex within tolerance.
|
|
261
|
+
*
|
|
262
|
+
* @param {Geometry[]} unique_geoms
|
|
263
|
+
* @param {number} a_geom index of A in `unique_geoms`
|
|
264
|
+
* @param {number} b_geom index of B in `unique_geoms`
|
|
265
|
+
* @param {BinaryTopology} topology_a
|
|
266
|
+
* @param {BinaryTopology} topology_b
|
|
267
|
+
* @param {Map<number, number>} seed vertex of A → vertex of B, for the seed triangles' corners
|
|
268
|
+
* @param {number} seed_face_a
|
|
269
|
+
* @param {number} seed_face_b
|
|
270
|
+
* @param {number} pair_epsilon
|
|
271
|
+
* @param {number} min_primitives
|
|
272
|
+
* @returns {import("./internal/cover_greedy.js").GrownMatchRecord|null}
|
|
273
|
+
*/
|
|
274
|
+
function grow_validated_match(
|
|
275
|
+
unique_geoms, a_geom, b_geom,
|
|
276
|
+
topology_a, topology_b,
|
|
277
|
+
seed, seed_face_a, seed_face_b,
|
|
278
|
+
pair_epsilon, min_primitives
|
|
279
|
+
) {
|
|
280
|
+
const geometry_a = unique_geoms[a_geom];
|
|
281
|
+
const geometry_b = unique_geoms[b_geom];
|
|
282
|
+
|
|
283
|
+
const grown = anchor_grow_topological({
|
|
284
|
+
geometry_a,
|
|
285
|
+
geometry_b,
|
|
286
|
+
topology_a, topology_b,
|
|
287
|
+
initial_vertex_correspondence: seed,
|
|
288
|
+
seed_face_a,
|
|
289
|
+
seed_face_b,
|
|
290
|
+
position_epsilon: pair_epsilon,
|
|
291
|
+
});
|
|
292
|
+
if (grown === null) return null;
|
|
293
|
+
if (grown.faces_a.length < min_primitives) return null;
|
|
294
|
+
|
|
295
|
+
const matched_set_a = new Set(grown.faces_a);
|
|
296
|
+
if (!match_validate_topology(
|
|
297
|
+
topology_a, topology_b,
|
|
298
|
+
matched_set_a, grown.face_correspondence, grown.vertex_correspondence
|
|
299
|
+
)) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Global post-grow residual check: the per-face check inside growth
|
|
304
|
+
// uses the incrementally-refit transform, so cumulative drift can
|
|
305
|
+
// smuggle past-acceptable faces through while the final fit produces
|
|
306
|
+
// worse residuals elsewhere. Refit on all correspondences and reject
|
|
307
|
+
// if any vertex deviates by more than a fraction of pair_epsilon.
|
|
308
|
+
const validation = match_refit_and_validate({
|
|
309
|
+
geometry_a,
|
|
310
|
+
geometry_b,
|
|
311
|
+
vertex_correspondence: grown.vertex_correspondence,
|
|
312
|
+
transform: grown.transform,
|
|
313
|
+
threshold: pair_epsilon * GLOBAL_RESIDUAL_THRESHOLD_FRACTION,
|
|
314
|
+
});
|
|
315
|
+
if (!validation.valid) return null;
|
|
316
|
+
|
|
317
|
+
return {
|
|
318
|
+
a_geom,
|
|
319
|
+
b_geom,
|
|
320
|
+
faces_a: grown.faces_a,
|
|
321
|
+
faces_b: grown.faces_b,
|
|
322
|
+
transform: grown.transform,
|
|
323
|
+
max_residual: validation.max_residual,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
270
327
|
/**
|
|
271
328
|
* Bounding-box diagonal length per unique geometry, in input order.
|
|
272
329
|
*
|
|
@@ -429,7 +486,12 @@ function match_transform_to_meep_transform(mt, piece_stats, max_residual) {
|
|
|
429
486
|
if (delta > OVERSCALE_MAX_FRACTION) delta = OVERSCALE_MAX_FRACTION;
|
|
430
487
|
}
|
|
431
488
|
|
|
432
|
-
if (delta === 0)
|
|
489
|
+
if (delta === 0) {
|
|
490
|
+
// The solver writes components only, so the clone's matrix was never composed. An exact fit (a half
|
|
491
|
+
// turn, say) leaves no residual to boost, and still owes the matrix its rotation and scale.
|
|
492
|
+
t.updateMatrix();
|
|
493
|
+
return t;
|
|
494
|
+
}
|
|
433
495
|
|
|
434
496
|
const boost = 1 + delta;
|
|
435
497
|
t.setScale(t.scale_x * boost, t.scale_y * boost, t.scale_z * boost);
|
|
@@ -31,6 +31,13 @@
|
|
|
31
31
|
* - faces_b not yet claimed as instance or canonical anywhere
|
|
32
32
|
* - faces_a not yet claimed as instance anywhere (we allow them to keep
|
|
33
33
|
* serving as canonical for additional matches)
|
|
34
|
+
* - within one geometry, faces_b sharing no face with faces_a: the piece is
|
|
35
|
+
* drawn at the canonical's place and again at the instance's, so a shared
|
|
36
|
+
* face would be drawn twice (a symmetric part matched onto itself)
|
|
37
|
+
* - a new canonical face-set sharing no face with one already chosen in its
|
|
38
|
+
* geometry: every piece of a geometry is drawn at the geometry's own place,
|
|
39
|
+
* so two overlapping pieces draw the overlap twice. The same set exactly
|
|
40
|
+
* is not new, and its piece is reused.
|
|
34
41
|
*
|
|
35
42
|
* @param {GrownMatchRecord[]} matches
|
|
36
43
|
* @param {number} min_primitives Drop matches smaller than this — they go to leftover
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cover_greedy.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AAEH
|
|
1
|
+
{"version":3,"file":"cover_greedy.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,sCAJW,gBAAgB,EAAE,kBAClB,MAAM,GACJ,aAAa,EAAE,CAwG3B;;;;;YApJa,MAAM;;;;YACN,MAAM;aACN,MAAM,EAAE;aACR,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;;;;;;kBAC3E,MAAM;;;YAON,MAAM;aACN,MAAM,EAAE;eACR,OAAO,uDAAuD,EAAE,WAAW;kBAC3E,MAAM;;;;;;wBAKN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM,EAAE;;;;eACR,qBAAqB,EAAE"}
|
|
@@ -34,6 +34,13 @@
|
|
|
34
34
|
* - faces_b not yet claimed as instance or canonical anywhere
|
|
35
35
|
* - faces_a not yet claimed as instance anywhere (we allow them to keep
|
|
36
36
|
* serving as canonical for additional matches)
|
|
37
|
+
* - within one geometry, faces_b sharing no face with faces_a: the piece is
|
|
38
|
+
* drawn at the canonical's place and again at the instance's, so a shared
|
|
39
|
+
* face would be drawn twice (a symmetric part matched onto itself)
|
|
40
|
+
* - a new canonical face-set sharing no face with one already chosen in its
|
|
41
|
+
* geometry: every piece of a geometry is drawn at the geometry's own place,
|
|
42
|
+
* so two overlapping pieces draw the overlap twice. The same set exactly
|
|
43
|
+
* is not new, and its piece is reused.
|
|
37
44
|
*
|
|
38
45
|
* @param {GrownMatchRecord[]} matches
|
|
39
46
|
* @param {number} min_primitives Drop matches smaller than this — they go to leftover
|
|
@@ -92,6 +99,9 @@ export function cover_greedy(matches, min_primitives) {
|
|
|
92
99
|
}
|
|
93
100
|
if (conflict) continue;
|
|
94
101
|
|
|
102
|
+
// (3) within one geometry, the two sides must not share a face
|
|
103
|
+
if (match.a_geom === match.b_geom && face_sets_intersect(match.faces_a, match.faces_b)) continue;
|
|
104
|
+
|
|
95
105
|
// Accept. If another match has chosen this exact canonical face-set,
|
|
96
106
|
// reuse the piece. Group candidates by a cheap hash, then deep-compare
|
|
97
107
|
// on hash collision.
|
|
@@ -99,6 +109,17 @@ export function cover_greedy(matches, min_primitives) {
|
|
|
99
109
|
let decision = find_decision(decisions_by_canonical.get(canonical_hash), match.a_geom, match.faces_a);
|
|
100
110
|
|
|
101
111
|
if (decision === undefined) {
|
|
112
|
+
// (4) a new canonical face-set must not share a face with one already chosen
|
|
113
|
+
const a_canonical_set = get_or_create(claimed_as_canonical, match.a_geom);
|
|
114
|
+
|
|
115
|
+
for (const f of match.faces_a) {
|
|
116
|
+
if (a_canonical_set.has(f)) {
|
|
117
|
+
conflict = true;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (conflict) continue;
|
|
122
|
+
|
|
102
123
|
decision = {
|
|
103
124
|
canonical_piece_id: next_piece_id++,
|
|
104
125
|
a_geom: match.a_geom,
|
|
@@ -113,7 +134,6 @@ export function cover_greedy(matches, min_primitives) {
|
|
|
113
134
|
bucket.push(decision);
|
|
114
135
|
decisions.push(decision);
|
|
115
136
|
|
|
116
|
-
const a_canonical_set = get_or_create(claimed_as_canonical, match.a_geom);
|
|
117
137
|
for (const f of match.faces_a) a_canonical_set.add(f);
|
|
118
138
|
}
|
|
119
139
|
|
|
@@ -173,3 +193,11 @@ function face_sets_equal(a, b) {
|
|
|
173
193
|
}
|
|
174
194
|
return true;
|
|
175
195
|
}
|
|
196
|
+
|
|
197
|
+
function face_sets_intersect(a, b) {
|
|
198
|
+
const seen = new Set(a);
|
|
199
|
+
for (const f of b) {
|
|
200
|
+
if (seen.has(f)) return true;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One 32-bit hash per triangle that depends on the triangles within `rounds` edge-steps of it, and on
|
|
3
|
+
* nothing else: not on where any of them sits in the index stream, not on which corner a triangle's
|
|
4
|
+
* indices start at, and not on the rigid motion and uniform scale the geometry was placed with.
|
|
5
|
+
*
|
|
6
|
+
* Round 0 is the triangle's own {@link triangle_fingerprint_stream} fingerprint. Each round after that
|
|
7
|
+
* mixes in the three hashes across the triangle's edges, read in winding order and started at the
|
|
8
|
+
* smallest, so the same triangle indexed from another corner reads the same three in the same order.
|
|
9
|
+
*
|
|
10
|
+
* Two copies of a piece hash their triangles alike wherever a triangle's `rounds`-ring lies inside the
|
|
11
|
+
* piece, whatever order a meshlet build or an exporter left the triangles in. A triangle nearer the
|
|
12
|
+
* piece's edge than that sees what surrounds the piece, which differs between copies.
|
|
13
|
+
*
|
|
14
|
+
* @param {Geometry} geometry
|
|
15
|
+
* @param {number} rounds
|
|
16
|
+
* @returns {Uint32Array} one per triangle
|
|
17
|
+
*/
|
|
18
|
+
export function face_neighbourhood_hash(geometry: Geometry, rounds: number): Uint32Array;
|
|
19
|
+
//# sourceMappingURL=face_neighbourhood_hash.d.ts.map
|
package/src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face_neighbourhood_hash.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/face_neighbourhood_hash.js"],"names":[],"mappings":"AAkGA;;;;;;;;;;;;;;;;GAgBG;AACH,oEAHW,MAAM,GACJ,WAAW,CAqDvB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { hash_mix2 } from "../../../../../../core/math/hash/hash_mix2.js";
|
|
2
|
+
import { hash_mix3 } from "../../../../../../core/math/hash/hash_mix3.js";
|
|
3
|
+
import { lowbias32 } from "../../../../../../core/math/hash/lowbias32.js";
|
|
4
|
+
import { triangle_fingerprint_stream } from "./triangle_fingerprint_stream.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Stands in for the triangle across an edge that has none, or more than one: a boundary or a
|
|
8
|
+
* non-manifold edge. Any value does, so long as it is the same for every geometry.
|
|
9
|
+
* @type {number}
|
|
10
|
+
*/
|
|
11
|
+
const NO_NEIGHBOUR = 0x5bd1e995;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* For every triangle, the triangle across each of its three edges, where edge `k` runs from corner `k`
|
|
15
|
+
* to corner `k + 1`; -1 across a boundary edge or one shared by more than two triangles.
|
|
16
|
+
*
|
|
17
|
+
* Two triangles are neighbours when they share an edge's two vertex indices, which is how
|
|
18
|
+
* {@link geometry_to_topology} joins them too, so the triangles a hash reaches are the ones growth walks.
|
|
19
|
+
*
|
|
20
|
+
* @param {ArrayLike<number>|null} index three entries per triangle, or null for one vertex per corner
|
|
21
|
+
* @param {number} triangle_count
|
|
22
|
+
* @param {number} vertex_count
|
|
23
|
+
* @returns {Int32Array} `triangle_count * 3`
|
|
24
|
+
*/
|
|
25
|
+
function triangle_edge_neighbours(index, triangle_count, vertex_count) {
|
|
26
|
+
const corner_count = triangle_count * 3;
|
|
27
|
+
|
|
28
|
+
const result = new Int32Array(corner_count).fill(-1);
|
|
29
|
+
|
|
30
|
+
if (index === null) {
|
|
31
|
+
// no corner shares a vertex with another, so no edge is shared
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// each edge filed under its lower vertex, so the two sides of an edge land in one short list
|
|
36
|
+
const start = new Uint32Array(vertex_count + 1);
|
|
37
|
+
|
|
38
|
+
for (let e = 0; e < corner_count; e++) {
|
|
39
|
+
const a = index[e];
|
|
40
|
+
const b = index[e - e % 3 + (e + 1) % 3];
|
|
41
|
+
|
|
42
|
+
start[(a < b ? a : b) + 1]++;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
46
|
+
start[v + 1] += start[v];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const cursor = start.slice(0, vertex_count);
|
|
50
|
+
const edges = new Uint32Array(corner_count);
|
|
51
|
+
|
|
52
|
+
for (let e = 0; e < corner_count; e++) {
|
|
53
|
+
const a = index[e];
|
|
54
|
+
const b = index[e - e % 3 + (e + 1) % 3];
|
|
55
|
+
|
|
56
|
+
edges[cursor[a < b ? a : b]++] = e;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (let v = 0; v < vertex_count; v++) {
|
|
60
|
+
const end = start[v + 1];
|
|
61
|
+
|
|
62
|
+
for (let i = start[v]; i < end; i++) {
|
|
63
|
+
const e = edges[i];
|
|
64
|
+
const a = index[e];
|
|
65
|
+
const b = index[e - e % 3 + (e + 1) % 3];
|
|
66
|
+
|
|
67
|
+
if (a === b) {
|
|
68
|
+
// a degenerate triangle's collapsed edge joins nothing
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const upper = a < b ? b : a;
|
|
73
|
+
|
|
74
|
+
let other = -1;
|
|
75
|
+
let sharing = 0;
|
|
76
|
+
|
|
77
|
+
for (let j = start[v]; j < end; j++) {
|
|
78
|
+
if (j === i) continue;
|
|
79
|
+
|
|
80
|
+
const f = edges[j];
|
|
81
|
+
const fa = index[f];
|
|
82
|
+
const fb = index[f - f % 3 + (f + 1) % 3];
|
|
83
|
+
|
|
84
|
+
if ((fa < fb ? fb : fa) === upper) {
|
|
85
|
+
other = f;
|
|
86
|
+
sharing++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (sharing === 1) {
|
|
91
|
+
result[e] = (other / 3) | 0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* One 32-bit hash per triangle that depends on the triangles within `rounds` edge-steps of it, and on
|
|
101
|
+
* nothing else: not on where any of them sits in the index stream, not on which corner a triangle's
|
|
102
|
+
* indices start at, and not on the rigid motion and uniform scale the geometry was placed with.
|
|
103
|
+
*
|
|
104
|
+
* Round 0 is the triangle's own {@link triangle_fingerprint_stream} fingerprint. Each round after that
|
|
105
|
+
* mixes in the three hashes across the triangle's edges, read in winding order and started at the
|
|
106
|
+
* smallest, so the same triangle indexed from another corner reads the same three in the same order.
|
|
107
|
+
*
|
|
108
|
+
* Two copies of a piece hash their triangles alike wherever a triangle's `rounds`-ring lies inside the
|
|
109
|
+
* piece, whatever order a meshlet build or an exporter left the triangles in. A triangle nearer the
|
|
110
|
+
* piece's edge than that sees what surrounds the piece, which differs between copies.
|
|
111
|
+
*
|
|
112
|
+
* @param {Geometry} geometry
|
|
113
|
+
* @param {number} rounds
|
|
114
|
+
* @returns {Uint32Array} one per triangle
|
|
115
|
+
*/
|
|
116
|
+
export function face_neighbourhood_hash(geometry, rounds) {
|
|
117
|
+
let hash = triangle_fingerprint_stream(geometry);
|
|
118
|
+
|
|
119
|
+
if (rounds === 0) {
|
|
120
|
+
return hash;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const triangle_count = hash.length;
|
|
124
|
+
|
|
125
|
+
const neighbours = triangle_edge_neighbours(
|
|
126
|
+
geometry.index !== null ? geometry.index.data : null,
|
|
127
|
+
triangle_count,
|
|
128
|
+
geometry.getVertexCount()
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
let next = new Uint32Array(triangle_count);
|
|
132
|
+
|
|
133
|
+
for (let round = 0; round < rounds; round++) {
|
|
134
|
+
for (let t = 0; t < triangle_count; t++) {
|
|
135
|
+
const n0 = neighbours[t * 3];
|
|
136
|
+
const n1 = neighbours[t * 3 + 1];
|
|
137
|
+
const n2 = neighbours[t * 3 + 2];
|
|
138
|
+
|
|
139
|
+
const h0 = n0 >= 0 ? hash[n0] : NO_NEIGHBOUR;
|
|
140
|
+
const h1 = n1 >= 0 ? hash[n1] : NO_NEIGHBOUR;
|
|
141
|
+
const h2 = n2 >= 0 ? hash[n2] : NO_NEIGHBOUR;
|
|
142
|
+
|
|
143
|
+
// the rotation of (h0, h1, h2) that starts at the smallest; ties go to the smaller next value
|
|
144
|
+
let x = h0, y = h1, z = h2;
|
|
145
|
+
|
|
146
|
+
if (h1 < x || (h1 === x && (h2 < y || (h2 === y && h0 < z)))) {
|
|
147
|
+
x = h1;
|
|
148
|
+
y = h2;
|
|
149
|
+
z = h0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (h2 < x || (h2 === x && (h0 < y || (h0 === y && h1 < z)))) {
|
|
153
|
+
x = h2;
|
|
154
|
+
y = h0;
|
|
155
|
+
z = h1;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
next[t] = lowbias32(hash_mix2(hash_mix3(hash[t], x, y), z));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const swap = hash;
|
|
162
|
+
hash = next;
|
|
163
|
+
next = swap;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return hash;
|
|
167
|
+
}
|
package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pair up triangles whose {@link face_neighbourhood_hash} values are equal, within a geometry or across
|
|
3
|
+
* two: each pair is a place where a copy may sit, for growth to confirm or throw out.
|
|
4
|
+
*
|
|
5
|
+
* Within one hash, every triangle is paired with the first, in input order (geometry, then triangle) -
|
|
6
|
+
* not every triangle with every other. A copy that matches the first is found from it, and one that
|
|
7
|
+
* does not still gets the first's canonical piece by another anchor; pairing them all only repeats
|
|
8
|
+
* growth that the first pair already did. On Sponza through scene_optimize's meshlet round trip,
|
|
9
|
+
* pairing them all grew 172k times against 41k, and shared fewer triangles: 144.5k against 145.8k.
|
|
10
|
+
*
|
|
11
|
+
* A hash shared by more than `seed_budget` triangles keeps the first `seed_budget` of them, so a
|
|
12
|
+
* featureless region repeated thousands of times does not swamp what follows.
|
|
13
|
+
*
|
|
14
|
+
* @param {Uint32Array[]} hash_streams one per geometry, one hash per triangle
|
|
15
|
+
* @param {number} seed_budget most triangles kept per hash, >= 2
|
|
16
|
+
* @returns {Uint32Array} {@link ANCHOR_STRIDE} words per anchor: a geometry, a triangle of it, b geometry,
|
|
17
|
+
* a triangle of it. The `a` side is the earlier of the two in input order.
|
|
18
|
+
*/
|
|
19
|
+
export function neighbourhood_anchor_index(hash_streams: Uint32Array[], seed_budget: number): Uint32Array;
|
|
20
|
+
/**
|
|
21
|
+
* Words per anchor in the array {@link neighbourhood_anchor_index} returns.
|
|
22
|
+
* @type {number}
|
|
23
|
+
*/
|
|
24
|
+
export const ANCHOR_STRIDE: number;
|
|
25
|
+
//# sourceMappingURL=neighbourhood_anchor_index.d.ts.map
|
package/src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbourhood_anchor_index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/scene/optimization/geometry/internal/neighbourhood_anchor_index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;GAiBG;AACH,yDALW,WAAW,EAAE,eACb,MAAM,GACJ,WAAW,CAoGvB;AAzHD;;;GAGG;AACH,4BAFU,MAAM,CAEe"}
|