@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
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** The longest step a particle takes in one frame, seconds: a stalled tab does not fling fronts across a lake. */
|
|
2
|
+
export const WATER_PARTICLE_STEP_LIMIT: number;
|
|
3
|
+
/**
|
|
4
|
+
* The wave particles of every water body of a scene, on the device (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md
|
|
5
|
+
* §5.4): ping-pong particle arrays, and each frame's hash of them for the surface sampler. Counts never leave
|
|
6
|
+
* the GPU; every pass over particles is dispatched indirectly from the count the previous pass wrote.
|
|
7
|
+
*/
|
|
8
|
+
export class GPUWaterParticles {
|
|
9
|
+
/** @returns {GPUBuffer} the frame's hash: table size, then inclusive bucket offsets */
|
|
10
|
+
get offsets(): GPUBuffer;
|
|
11
|
+
/** @returns {GPUBuffer} the frame's entries, bucket by bucket, each bucket ordered by particle */
|
|
12
|
+
get entries(): GPUBuffer;
|
|
13
|
+
/** @returns {GPUBuffer} per wave row: occupied-level mask, then a height bound per level (f32 bits) */
|
|
14
|
+
get body_bounds(): GPUBuffer;
|
|
15
|
+
/** @returns {GPUBuffer} the live particles: count, then records */
|
|
16
|
+
get particles(): GPUBuffer;
|
|
17
|
+
get capacity(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Allocate for a device, a capacity and a number of wave rows.
|
|
20
|
+
*
|
|
21
|
+
* When the rows grow, the bounds the last stepping frame wrote are carried into the larger buffer: a paused
|
|
22
|
+
* frame does not rebuild them, and every body's surface is culled and tessellated by them.
|
|
23
|
+
*
|
|
24
|
+
* @param {GPUDevice} device
|
|
25
|
+
* @param {number} capacity
|
|
26
|
+
* @param {number} rows
|
|
27
|
+
* @returns {function(import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext):void|null} when the
|
|
28
|
+
* rows grew, encodes the carry and releases the old buffer once it ran; encode it before this frame's passes
|
|
29
|
+
*/
|
|
30
|
+
prepare(device: GPUDevice, capacity: number, rows: number): (arg0: import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext) => void | null;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
/**
|
|
33
|
+
* The frame's particles (§5.4): when the frame steps, one step of every particle of a body simulated this frame (a
|
|
34
|
+
* paused body's stand still) and the splashes of the culling pass's emit list; then, every frame, the hash of the
|
|
35
|
+
* particles of the bodies simulated this frame, which the surface sampler gathers from, and their bounds. The hash
|
|
36
|
+
* is rebuilt on a frame that does not step too, since the bodies in view change with the camera.
|
|
37
|
+
*
|
|
38
|
+
* @param {object} options
|
|
39
|
+
* @param {import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
40
|
+
* @param {object} options.scene GPU scene context: database, geometries
|
|
41
|
+
* @param {GPUBuffer} options.steep per wave row: non-zero for a body that must stay calm
|
|
42
|
+
* @param {GPUBuffer} options.activity per wave row: the culling pass's {@link WaterActivity} bits
|
|
43
|
+
* @param {GPUBuffer} options.emit_rows the culling pass's emit list
|
|
44
|
+
* @param {GPUBuffer} options.commands the culling pass's commands
|
|
45
|
+
* @param {number} options.emit_command byte offset of the emit list's command in `commands`
|
|
46
|
+
* @param {number} options.dt seconds; zero for a frame that does not step
|
|
47
|
+
*/
|
|
48
|
+
record({ graph, scene, steep, activity, emit_rows, commands, emit_command, dt }: {
|
|
49
|
+
graph: import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
50
|
+
scene: object;
|
|
51
|
+
steep: GPUBuffer;
|
|
52
|
+
activity: GPUBuffer;
|
|
53
|
+
emit_rows: GPUBuffer;
|
|
54
|
+
commands: GPUBuffer;
|
|
55
|
+
emit_command: number;
|
|
56
|
+
dt: number;
|
|
57
|
+
}): void;
|
|
58
|
+
#private;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=GPUWaterParticles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GPUWaterParticles.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/GPUWaterParticles.js"],"names":[],"mappings":"AAuBA,kHAAkH;AAClH,+CAAgD;AAUhD;;;;GAIG;AACH;IAkBI,uFAAuF;IACvF,yBAAuC;IACvC,kGAAkG;IAClG,yBAAuC;IACvC,uGAAuG;IACvG,6BAA+C;IAC/C,mEAAmE;IACnE,2BAAyD;IACzD,uBAAyC;IAEzC;;;;;;;;;;;OAWG;IACH,qCALW,MAAM,QACN,MAAM,UACK,OAAO,8CAA8C,EAAE,sBAAsB,KAAE,IAAI,GAAC,IAAI,CA4C7G;IAED,gBAWC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QATyG,KAAK,EAAnG,OAAO,iEAAiE,EAAE,UAAU;QACpE,KAAK,EAArB,MAAM;QACa,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ;QACX,YAAY,EAA5B,MAAM;QACU,EAAE,EAAlB,MAAM;aA6EhB;;CACJ"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { graph_prefix_scan_csdldf } from "../../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
3
|
+
import {
|
|
4
|
+
build_indirect_compute_dispatch_command,
|
|
5
|
+
INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
|
|
6
|
+
} from "../../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
7
|
+
import { graph_import_buffer } from "../../../shader/graph/graph_import_buffer.js";
|
|
8
|
+
import { WATER_PARTICLE_BODY_BOUNDS_STRIDE } from "../shader_water_waves_combine.js";
|
|
9
|
+
import { WATER_PARTICLE_ENTRY_STRUCT, WATER_PARTICLE_STRUCT } from "./WATER_PARTICLE_STRUCT.js";
|
|
10
|
+
import {
|
|
11
|
+
shader_water_particles_bin,
|
|
12
|
+
shader_water_particles_bounds,
|
|
13
|
+
shader_water_particles_emit,
|
|
14
|
+
shader_water_particles_finalize,
|
|
15
|
+
shader_water_particles_rank,
|
|
16
|
+
shader_water_particles_scatter,
|
|
17
|
+
shader_water_particles_split,
|
|
18
|
+
shader_water_particles_total,
|
|
19
|
+
shader_water_particles_update,
|
|
20
|
+
shader_water_particles_weigh,
|
|
21
|
+
WATER_PARTICLE_CORNERS
|
|
22
|
+
} from "./shader_water_particles.js";
|
|
23
|
+
|
|
24
|
+
/** The longest step a particle takes in one frame, seconds: a stalled tab does not fling fronts across a lake. */
|
|
25
|
+
export const WATER_PARTICLE_STEP_LIMIT = 1 / 15;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param {number} value
|
|
29
|
+
* @returns {number} the smallest power of two at least value
|
|
30
|
+
*/
|
|
31
|
+
function power_of_two_at_least(value) {
|
|
32
|
+
return 2 ** Math.ceil(Math.log2(Math.max(value, 1)));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The wave particles of every water body of a scene, on the device (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md
|
|
37
|
+
* §5.4): ping-pong particle arrays, and each frame's hash of them for the surface sampler. Counts never leave
|
|
38
|
+
* the GPU; every pass over particles is dispatched indirectly from the count the previous pass wrote.
|
|
39
|
+
*/
|
|
40
|
+
export class GPUWaterParticles {
|
|
41
|
+
#device = null;
|
|
42
|
+
#capacity = 0;
|
|
43
|
+
#table_limit = 0;
|
|
44
|
+
#rows = 0;
|
|
45
|
+
#parity = 0;
|
|
46
|
+
#particles = [];
|
|
47
|
+
#children = null;
|
|
48
|
+
#buckets = null;
|
|
49
|
+
#slots = null;
|
|
50
|
+
#bucket_amplitude = null;
|
|
51
|
+
#bucket_weight = null;
|
|
52
|
+
#visible = null;
|
|
53
|
+
#staging = null;
|
|
54
|
+
#entries = null;
|
|
55
|
+
#body_bounds = null;
|
|
56
|
+
#commands = null;
|
|
57
|
+
|
|
58
|
+
/** @returns {GPUBuffer} the frame's hash: table size, then inclusive bucket offsets */
|
|
59
|
+
get offsets() { return this.#buckets; }
|
|
60
|
+
/** @returns {GPUBuffer} the frame's entries, bucket by bucket, each bucket ordered by particle */
|
|
61
|
+
get entries() { return this.#entries; }
|
|
62
|
+
/** @returns {GPUBuffer} per wave row: occupied-level mask, then a height bound per level (f32 bits) */
|
|
63
|
+
get body_bounds() { return this.#body_bounds; }
|
|
64
|
+
/** @returns {GPUBuffer} the live particles: count, then records */
|
|
65
|
+
get particles() { return this.#particles[this.#parity]; }
|
|
66
|
+
get capacity() { return this.#capacity; }
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Allocate for a device, a capacity and a number of wave rows.
|
|
70
|
+
*
|
|
71
|
+
* When the rows grow, the bounds the last stepping frame wrote are carried into the larger buffer: a paused
|
|
72
|
+
* frame does not rebuild them, and every body's surface is culled and tessellated by them.
|
|
73
|
+
*
|
|
74
|
+
* @param {GPUDevice} device
|
|
75
|
+
* @param {number} capacity
|
|
76
|
+
* @param {number} rows
|
|
77
|
+
* @returns {function(import("../../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext):void|null} when the
|
|
78
|
+
* rows grew, encodes the carry and releases the old buffer once it ran; encode it before this frame's passes
|
|
79
|
+
*/
|
|
80
|
+
prepare(device, capacity, rows) {
|
|
81
|
+
assert.isNonNegativeInteger(capacity, 'capacity');
|
|
82
|
+
assert.greaterThan(capacity, 0, 'capacity');
|
|
83
|
+
if (device !== this.#device || capacity !== this.#capacity) {
|
|
84
|
+
this.dispose();
|
|
85
|
+
this.#device = device;
|
|
86
|
+
this.#capacity = capacity;
|
|
87
|
+
this.#table_limit = power_of_two_at_least(2 * WATER_PARTICLE_CORNERS * capacity);
|
|
88
|
+
const buffer = (label, size, usage = 0) => device.createBuffer({ label: `Water / particles ${label}`,
|
|
89
|
+
size: Math.max(16, size), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | usage });
|
|
90
|
+
const array_size = 16 + capacity * WATER_PARTICLE_STRUCT.size;
|
|
91
|
+
this.#particles = [buffer('a', array_size), buffer('b', array_size)];
|
|
92
|
+
this.#children = buffer('children', 16 + capacity * 4);
|
|
93
|
+
this.#buckets = buffer('buckets', 16 + this.#table_limit * 4);
|
|
94
|
+
this.#slots = buffer('slots', capacity * WATER_PARTICLE_CORNERS * 4);
|
|
95
|
+
this.#bucket_amplitude = buffer('bucket amplitude', this.#table_limit * 4);
|
|
96
|
+
this.#bucket_weight = buffer('bucket weight', this.#table_limit * 4);
|
|
97
|
+
this.#visible = buffer('visible', capacity * 4);
|
|
98
|
+
const entries = capacity * WATER_PARTICLE_CORNERS * WATER_PARTICLE_ENTRY_STRUCT.size;
|
|
99
|
+
this.#staging = buffer('staging', entries);
|
|
100
|
+
this.#entries = buffer('entries', entries);
|
|
101
|
+
this.#commands = [0, 1].map(i => device.createBuffer({ label: `Water / particles command ${i}`,
|
|
102
|
+
size: INDIRECT_COMPUTE_COMMAND_DESCRIPTOR.size, usage: INDIRECT_COMPUTE_COMMAND_DESCRIPTOR.usage }));
|
|
103
|
+
this.#rows = 0;
|
|
104
|
+
this.#parity = 0;
|
|
105
|
+
}
|
|
106
|
+
let carry = null;
|
|
107
|
+
if (rows > this.#rows || this.#body_bounds === null) {
|
|
108
|
+
const old = this.#body_bounds, old_rows = this.#rows;
|
|
109
|
+
this.#rows = Math.max(rows, 1);
|
|
110
|
+
const bounds = this.#body_bounds = device.createBuffer({ label: 'Water / particle body bounds',
|
|
111
|
+
size: this.#rows * WATER_PARTICLE_BODY_BOUNDS_STRIDE * 4,
|
|
112
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC });
|
|
113
|
+
if (old !== null) {
|
|
114
|
+
carry = encoder => {
|
|
115
|
+
encoder.copyBufferToBuffer(old, 0, bounds, 0, old_rows * WATER_PARTICLE_BODY_BOUNDS_STRIDE * 4);
|
|
116
|
+
encoder.done.then(() => old.destroy());
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return carry;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
dispose() {
|
|
124
|
+
for (const buffer of [...this.#particles, this.#children, this.#buckets, this.#slots, this.#bucket_amplitude,
|
|
125
|
+
this.#bucket_weight, this.#visible, this.#staging, this.#entries, this.#body_bounds, ...(this.#commands ?? [])]) { buffer?.destroy(); }
|
|
126
|
+
this.#particles = [];
|
|
127
|
+
this.#children = this.#buckets = this.#slots = this.#bucket_amplitude = this.#staging = this.#entries = null;
|
|
128
|
+
this.#bucket_weight = this.#visible = null;
|
|
129
|
+
this.#body_bounds = null;
|
|
130
|
+
this.#commands = null;
|
|
131
|
+
this.#device = null;
|
|
132
|
+
this.#capacity = 0;
|
|
133
|
+
this.#rows = 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The frame's particles (§5.4): when the frame steps, one step of every particle of a body simulated this frame (a
|
|
138
|
+
* paused body's stand still) and the splashes of the culling pass's emit list; then, every frame, the hash of the
|
|
139
|
+
* particles of the bodies simulated this frame, which the surface sampler gathers from, and their bounds. The hash
|
|
140
|
+
* is rebuilt on a frame that does not step too, since the bodies in view change with the camera.
|
|
141
|
+
*
|
|
142
|
+
* @param {object} options
|
|
143
|
+
* @param {import("../../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
144
|
+
* @param {object} options.scene GPU scene context: database, geometries
|
|
145
|
+
* @param {GPUBuffer} options.steep per wave row: non-zero for a body that must stay calm
|
|
146
|
+
* @param {GPUBuffer} options.activity per wave row: the culling pass's {@link WaterActivity} bits
|
|
147
|
+
* @param {GPUBuffer} options.emit_rows the culling pass's emit list
|
|
148
|
+
* @param {GPUBuffer} options.commands the culling pass's commands
|
|
149
|
+
* @param {number} options.emit_command byte offset of the emit list's command in `commands`
|
|
150
|
+
* @param {number} options.dt seconds; zero for a frame that does not step
|
|
151
|
+
*/
|
|
152
|
+
record({ graph, scene, steep, activity, emit_rows, commands, emit_command, dt }) {
|
|
153
|
+
assert.notNull(this.#device, 'prepare() first');
|
|
154
|
+
const stepping = dt > 0;
|
|
155
|
+
const step = Math.min(Math.max(dt, 0), WATER_PARTICLE_STEP_LIMIT);
|
|
156
|
+
const capacity = this.#capacity, table_limit = this.#table_limit;
|
|
157
|
+
const current = this.#particles[this.#parity];
|
|
158
|
+
// a frame that does not step bins the particles where they are
|
|
159
|
+
const next = stepping ? this.#particles[1 - this.#parity] : current;
|
|
160
|
+
if (stepping) { this.#parity = 1 - this.#parity; }
|
|
161
|
+
const [command_current, command_next] = this.#commands;
|
|
162
|
+
const geometries = scene.geometries;
|
|
163
|
+
let children = graph_import_buffer(graph, this.#children, 'Water / particle children');
|
|
164
|
+
let buckets = graph_import_buffer(graph, this.#buckets, 'Water / particle buckets');
|
|
165
|
+
const node = (name, execute, reads, writes) => {
|
|
166
|
+
const data = {};
|
|
167
|
+
const pass = graph.add(name, data, (d, resources, context) => execute(resources, context, d));
|
|
168
|
+
for (const [key, handle] of Object.entries(reads)) { data[key] = pass.read(handle); }
|
|
169
|
+
for (const [key, handle] of Object.entries(writes)) { data[key] = pass.write(handle); }
|
|
170
|
+
pass.make_side_effect();
|
|
171
|
+
return data;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
if (stepping) {
|
|
175
|
+
// Each particle in place, and what it leaves.
|
|
176
|
+
children = node('Water / particles update', (resources, { encoder }) => {
|
|
177
|
+
encoder.copyBufferToBuffer(current, 0, this.#children, 0, 4);
|
|
178
|
+
build_indirect_compute_dispatch_command(64, encoder, current, 0, command_current, 0, true);
|
|
179
|
+
shader_water_particles_update.dispatchIndirect({ encoder, command: command_current, bindings: {
|
|
180
|
+
frame: { dt: step, capacity }, particles: current, children: this.#children, activity,
|
|
181
|
+
scene_database: scene.scene_database_buffer, geometries: geometries.buffer_metadata,
|
|
182
|
+
blas_lookup: geometries.blas.buffer_metadata, blas_data: geometries.blas.buffer_data,
|
|
183
|
+
meshlet_metadata: geometries.meshlets.buffer_metadata, meshlet_data: geometries.meshlets.buffer_data,
|
|
184
|
+
} });
|
|
185
|
+
}, {}, { children }).children;
|
|
186
|
+
children = graph_prefix_scan_csdldf({ graph, data: children, element_max_count: capacity });
|
|
187
|
+
|
|
188
|
+
// What they leave into the next array, then the frame's splashes after them.
|
|
189
|
+
node('Water / particles split and emit', (resources, { encoder }) => {
|
|
190
|
+
shader_water_particles_split.dispatchIndirect({ encoder, command: command_current, bindings: {
|
|
191
|
+
capacity, particles: current, children: this.#children, next } });
|
|
192
|
+
shader_water_particles_total.dispatch({ encoder, bindings: { capacity, children: this.#children, next } });
|
|
193
|
+
shader_water_particles_emit.dispatchIndirect({ encoder, command: commands, command_offset: emit_command,
|
|
194
|
+
bindings: { capacity, scene_database: scene.scene_database_buffer, emit_rows, steep, activity,
|
|
195
|
+
particle_bounds: this.#body_bounds, next } });
|
|
196
|
+
shader_water_particles_finalize.dispatch({ encoder, bindings: { limits: { capacity, table_limit }, next, offsets: this.#buckets } });
|
|
197
|
+
}, { children }, {});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// The frame's hash: how crowded each cell is, then each particle into the cells its support overlaps as far as
|
|
201
|
+
// its crowd leaves it drawn, offsets, entries in order.
|
|
202
|
+
buckets = node('Water / particles bin', (resources, { encoder }) => {
|
|
203
|
+
if (!stepping) {
|
|
204
|
+
// the table size the last stepping frame chose for these particles
|
|
205
|
+
shader_water_particles_finalize.dispatch({ encoder, bindings: { limits: { capacity, table_limit }, next, offsets: this.#buckets } });
|
|
206
|
+
}
|
|
207
|
+
build_indirect_compute_dispatch_command(64, encoder, next, 0, command_next, 0, true);
|
|
208
|
+
encoder.clearBuffer(this.#buckets, 16, table_limit * 4);
|
|
209
|
+
encoder.clearBuffer(this.#bucket_amplitude);
|
|
210
|
+
encoder.clearBuffer(this.#bucket_weight);
|
|
211
|
+
shader_water_particles_weigh.dispatchIndirect({ encoder, command: command_next, bindings: {
|
|
212
|
+
next, activity, offsets: this.#buckets, bucket_weight: this.#bucket_weight } });
|
|
213
|
+
shader_water_particles_bin.dispatchIndirect({ encoder, command: command_next, bindings: {
|
|
214
|
+
next, activity, buckets: this.#buckets, slots: this.#slots, bucket_amplitude: this.#bucket_amplitude,
|
|
215
|
+
body_bounds: this.#body_bounds, bucket_weight: this.#bucket_weight, visible: this.#visible } });
|
|
216
|
+
}, {}, { buckets }).buckets;
|
|
217
|
+
buckets = graph_prefix_scan_csdldf({ graph, data: buckets, element_max_count: table_limit });
|
|
218
|
+
node('Water / particles order and bound', (resources, { encoder }) => {
|
|
219
|
+
const bindings = { next, offsets: this.#buckets, slots: this.#slots };
|
|
220
|
+
shader_water_particles_scatter.dispatchIndirect({ encoder, command: command_next, bindings: { ...bindings,
|
|
221
|
+
visible: this.#visible, staging: this.#staging } });
|
|
222
|
+
shader_water_particles_rank.dispatchIndirect({ encoder, command: command_next, bindings: { ...bindings,
|
|
223
|
+
staging: this.#staging, entries: this.#entries } });
|
|
224
|
+
shader_water_particles_bounds.dispatchIndirect({ encoder, command: command_next, bindings: { next, activity,
|
|
225
|
+
offsets: this.#buckets, bucket_amplitude: this.#bucket_amplitude, body_bounds: this.#body_bounds } });
|
|
226
|
+
}, { buckets }, {});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One wave particle (Yuksel, House & Keyser 2007): a point of an expanding wave front carrying a small wave
|
|
3
|
+
* packet, in the metric local frame of the water body it lives on
|
|
4
|
+
* (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
|
|
5
|
+
*
|
|
6
|
+
* Its position is not stored; it is `origin + direction(angle) · group_speed(radius) · age`, so it moves
|
|
7
|
+
* without integration error and every particle of one front shares the origin and the age.
|
|
8
|
+
*/
|
|
9
|
+
export const WATER_PARTICLE_STRUCT: WebGPUStruct;
|
|
10
|
+
/**
|
|
11
|
+
* A particle as one hash cell holds it for the surface sampler: everything its kernel needs at the frame's
|
|
12
|
+
* time, and the cell it was entered for, since one particle is entered in every cell its support overlaps and
|
|
13
|
+
* two cells may share a bucket.
|
|
14
|
+
*/
|
|
15
|
+
export const WATER_PARTICLE_ENTRY_STRUCT: WebGPUStruct;
|
|
16
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
17
|
+
//# sourceMappingURL=WATER_PARTICLE_STRUCT.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WATER_PARTICLE_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,iDAeoB;AAEpB;;;;GAIG;AACH,uDAeyB;6BA/CI,sCAAsC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { f32, u32, vec2f, vec2i } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* One wave particle (Yuksel, House & Keyser 2007): a point of an expanding wave front carrying a small wave
|
|
6
|
+
* packet, in the metric local frame of the water body it lives on
|
|
7
|
+
* (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
|
|
8
|
+
*
|
|
9
|
+
* Its position is not stored; it is `origin + direction(angle) · group_speed(radius) · age`, so it moves
|
|
10
|
+
* without integration error and every particle of one front shares the origin and the age.
|
|
11
|
+
*/
|
|
12
|
+
export const WATER_PARTICLE_STRUCT = WebGPUStruct.from({
|
|
13
|
+
/** Centre of the front, or its mirror image after a reflection; metric local xz. */
|
|
14
|
+
origin: vec2f,
|
|
15
|
+
/** Propagation direction, radians from local +x towards +z. */
|
|
16
|
+
angle: f32,
|
|
17
|
+
/** Seconds the front has travelled from its origin. */
|
|
18
|
+
age: f32,
|
|
19
|
+
/** Signed ridge height at the packet's centre, metres. */
|
|
20
|
+
amplitude: f32,
|
|
21
|
+
/** Half the packet's wavelength, metres. */
|
|
22
|
+
radius: f32,
|
|
23
|
+
/** Angle to the neighbouring particle of the same front. */
|
|
24
|
+
dispersion: f32,
|
|
25
|
+
/** The water_waves row of the body it lives on. */
|
|
26
|
+
body: u32,
|
|
27
|
+
}, 'WaterParticle');
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A particle as one hash cell holds it for the surface sampler: everything its kernel needs at the frame's
|
|
31
|
+
* time, and the cell it was entered for, since one particle is entered in every cell its support overlaps and
|
|
32
|
+
* two cells may share a bucket.
|
|
33
|
+
*/
|
|
34
|
+
export const WATER_PARTICLE_ENTRY_STRUCT = WebGPUStruct.from({
|
|
35
|
+
position: vec2f,
|
|
36
|
+
cell: vec2i,
|
|
37
|
+
angle: f32,
|
|
38
|
+
amplitude: f32,
|
|
39
|
+
radius: f32,
|
|
40
|
+
/** Tangential window: the distance to the front's neighbouring particle. */
|
|
41
|
+
width: f32,
|
|
42
|
+
/** Carrier phase lag of the crests behind the envelope, radians. */
|
|
43
|
+
phase: f32,
|
|
44
|
+
/** water_waves row << 4 | level */
|
|
45
|
+
key: u32,
|
|
46
|
+
/** Index of the particle, which orders a bucket. */
|
|
47
|
+
source: u32,
|
|
48
|
+
reserved: u32,
|
|
49
|
+
}, 'WaterParticleEntry');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Levels of the particle hash: cell sizes 4 mm · 2^level, so supports up to 64 m. */
|
|
2
|
+
export const WATER_PARTICLE_LEVELS: 16;
|
|
3
|
+
/** Cell size of level 0, metres. A particle sits at the smallest level whose cell is at least its support's diameter. */
|
|
4
|
+
export const WATER_PARTICLE_LEVEL0_CELL: number;
|
|
5
|
+
/**
|
|
6
|
+
* The physics of one wave particle as pure functions (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
|
|
7
|
+
*
|
|
8
|
+
* A particle of radius r carries a packet of wavelength 2r, k = π/r. Under the gravity–capillary
|
|
9
|
+
* dispersion relation the packet's envelope travels at the group speed and its crests at the phase speed
|
|
10
|
+
* (Jeschke & Wojtan 2017; Xue et al. 2025 give wave particles their own wavelength's dispersion). It loses
|
|
11
|
+
* amplitude at the clean-surface viscous rate 2νk² plus the surface-film rate k√(νω)/(2√2) of natural
|
|
12
|
+
* water — so a raindrop's ripple is gone in a fraction of a second while a big splash crosses a bay.
|
|
13
|
+
*
|
|
14
|
+
* The particles of a front are W apart, W the front's arc between them; a cosine window of half-width W
|
|
15
|
+
* along the front is a partition of unity over them, so the front's height is the packet's amplitude
|
|
16
|
+
* whatever the spacing, and one front adds at most two particles at any point.
|
|
17
|
+
*
|
|
18
|
+
* @type {CodeChunk}
|
|
19
|
+
*/
|
|
20
|
+
export const chunk_water_particle: CodeChunk;
|
|
21
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
22
|
+
//# sourceMappingURL=chunk_water_particle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_water_particle.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/chunk_water_particle.js"],"names":[],"mappings":"AAKA,sFAAsF;AACtF,uCAAwC;AAExC,yHAAyH;AACzH,gDAAkD;AAElD;;;;;;;;;;;;;;GAcG;AACH,mCAFU,SAAS,CAsH6G;0BA9ItG,uCAAuC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_pcg3d } from "../../../shader/chunk/random/pcg/chunk_pcg3d.js";
|
|
3
|
+
import { WATER_PARTICLE_ENTRY_STRUCT, WATER_PARTICLE_STRUCT } from "./WATER_PARTICLE_STRUCT.js";
|
|
4
|
+
import { chunk_water_spectrum } from "../spectrum/chunk_water_spectrum.js";
|
|
5
|
+
|
|
6
|
+
/** Levels of the particle hash: cell sizes 4 mm · 2^level, so supports up to 64 m. */
|
|
7
|
+
export const WATER_PARTICLE_LEVELS = 16;
|
|
8
|
+
|
|
9
|
+
/** Cell size of level 0, metres. A particle sits at the smallest level whose cell is at least its support's diameter. */
|
|
10
|
+
export const WATER_PARTICLE_LEVEL0_CELL = 1 / 256;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The physics of one wave particle as pure functions (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5).
|
|
14
|
+
*
|
|
15
|
+
* A particle of radius r carries a packet of wavelength 2r, k = π/r. Under the gravity–capillary
|
|
16
|
+
* dispersion relation the packet's envelope travels at the group speed and its crests at the phase speed
|
|
17
|
+
* (Jeschke & Wojtan 2017; Xue et al. 2025 give wave particles their own wavelength's dispersion). It loses
|
|
18
|
+
* amplitude at the clean-surface viscous rate 2νk² plus the surface-film rate k√(νω)/(2√2) of natural
|
|
19
|
+
* water — so a raindrop's ripple is gone in a fraction of a second while a big splash crosses a bay.
|
|
20
|
+
*
|
|
21
|
+
* The particles of a front are W apart, W the front's arc between them; a cosine window of half-width W
|
|
22
|
+
* along the front is a partition of unity over them, so the front's height is the packet's amplitude
|
|
23
|
+
* whatever the spacing, and one front adds at most two particles at any point.
|
|
24
|
+
*
|
|
25
|
+
* @type {CodeChunk}
|
|
26
|
+
*/
|
|
27
|
+
export const chunk_water_particle = CodeChunk.from(/* language=WGSL */ `
|
|
28
|
+
const WATER_PARTICLE_LEVELS: u32 = ${WATER_PARTICLE_LEVELS}u;
|
|
29
|
+
const WATER_PARTICLE_LEVEL0_CELL: f32 = ${WATER_PARTICLE_LEVEL0_CELL};
|
|
30
|
+
// kinematic viscosity of water, m²/s
|
|
31
|
+
const WATER_VISCOSITY: f32 = 1e-6;
|
|
32
|
+
const WATER_PI: f32 = 3.14159265358979;
|
|
33
|
+
|
|
34
|
+
fn water_particle_wavenumber(radius: f32) -> f32 {
|
|
35
|
+
return WATER_PI / radius;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Phase speed of the particle's wavelength, m/s: how fast its crests move.
|
|
39
|
+
fn water_particle_phase_speed(radius: f32) -> f32 {
|
|
40
|
+
let k = water_particle_wavenumber(radius);
|
|
41
|
+
return water_dispersion(k) / k;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Group speed dω/dk of the particle's wavelength, m/s: how fast its packet moves.
|
|
45
|
+
fn water_particle_group_speed(radius: f32) -> f32 {
|
|
46
|
+
let k = water_particle_wavenumber(radius);
|
|
47
|
+
return (WATER_GRAVITY + 3.0 * WATER_SURFACE_TENSION * k * k) / (2.0 * water_dispersion(k));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Amplitude decay rate, 1/s: viscous plus surface film.
|
|
51
|
+
fn water_particle_damping(radius: f32) -> f32 {
|
|
52
|
+
let k = water_particle_wavenumber(radius);
|
|
53
|
+
return 2.0 * WATER_VISCOSITY * k * k + k * sqrt(WATER_VISCOSITY * water_dispersion(k)) / (2.0 * sqrt(2.0));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
fn water_particle_direction(angle: f32) -> vec2<f32> {
|
|
57
|
+
return vec2<f32>(cos(angle), sin(angle));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Distance the front has travelled from its origin.
|
|
61
|
+
fn water_particle_distance(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
|
|
62
|
+
return water_particle_group_speed(particle.radius) * particle.age;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
fn water_particle_position(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> vec2<f32> {
|
|
66
|
+
return particle.origin + water_particle_direction(particle.angle) * water_particle_distance(particle);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// The front's arc between neighbouring particles: the half-width of the tangential window.
|
|
70
|
+
fn water_particle_width(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
|
|
71
|
+
return max(particle.dispersion * water_particle_distance(particle), 1e-3 * particle.radius);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// How far the crests have slid through the envelope: k (c − c_g) age.
|
|
75
|
+
fn water_particle_phase(particle: ${WATER_PARTICLE_STRUCT.wgsl_ref}) -> f32 {
|
|
76
|
+
let lag = (water_particle_phase_speed(particle.radius) - water_particle_group_speed(particle.radius)) * particle.age;
|
|
77
|
+
return water_particle_wavenumber(particle.radius) * lag;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Radius of a circle around the particle holding its whole kernel: two radii across the front, the window along it.
|
|
81
|
+
fn water_particle_support(radius: f32, width: f32) -> f32 {
|
|
82
|
+
return length(vec2<f32>(2.0 * radius, width));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The smallest hash level whose cell is at least the support's diameter, so the support overlaps at most
|
|
86
|
+
// the 2×2 cells around it.
|
|
87
|
+
fn water_particle_level(support: f32) -> u32 {
|
|
88
|
+
let level = ceil(log2(max(2.0 * support / WATER_PARTICLE_LEVEL0_CELL, 1.0)));
|
|
89
|
+
return min(u32(level), WATER_PARTICLE_LEVELS - 1u);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
fn water_particle_cell_size(level: u32) -> f32 {
|
|
93
|
+
return WATER_PARTICLE_LEVEL0_CELL * exp2(f32(level));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fn water_particle_bucket(body: u32, level: u32, cell: vec2<i32>, table_size: u32) -> u32 {
|
|
97
|
+
let bits = pcg3d(vec3<u32>((body << 4u) | level, bitcast<u32>(cell.x), bitcast<u32>(cell.y)));
|
|
98
|
+
return bits.x & (table_size - 1u);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
struct WaterParticleField {
|
|
102
|
+
height: f32,
|
|
103
|
+
// ∂h/∂x, ∂h/∂z
|
|
104
|
+
slope: vec2<f32>,
|
|
105
|
+
displacement: vec2<f32>,
|
|
106
|
+
// columns ∂D/∂x and ∂D/∂z: (∂Dx/∂x, ∂Dz/∂x), (∂Dx/∂z, ∂Dz/∂z)
|
|
107
|
+
jacobian: mat2x2<f32>,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The packet at offset d from its particle. u across the front, v along it: envelope E(u) over two radii,
|
|
111
|
+
// window T(v) over the width, carrier phase φ = πu/r − phase. Height a·E·T·cos φ; horizontal displacement
|
|
112
|
+
// −a·E·T·sin φ along the direction (Gerstner-like orbits, Yuksel's longitudinal sign); with derivatives.
|
|
113
|
+
fn water_particle_field(d: vec2<f32>, angle: f32, amplitude: f32, radius: f32, width: f32, phase: f32) -> WaterParticleField {
|
|
114
|
+
var field: WaterParticleField;
|
|
115
|
+
let direction = water_particle_direction(angle);
|
|
116
|
+
let tangent = vec2<f32>(-direction.y, direction.x);
|
|
117
|
+
let u = dot(d, direction);
|
|
118
|
+
let v = dot(d, tangent);
|
|
119
|
+
if (abs(u) >= 2.0 * radius || abs(v) >= width) { return field; }
|
|
120
|
+
let eu = 0.5 * WATER_PI * u / radius;
|
|
121
|
+
let envelope = 0.5 * (1.0 + cos(eu));
|
|
122
|
+
let envelope_du = -0.25 * WATER_PI / radius * sin(eu);
|
|
123
|
+
let tv = WATER_PI * v / width;
|
|
124
|
+
let window = 0.5 * (1.0 + cos(tv));
|
|
125
|
+
let window_dv = -0.5 * WATER_PI / width * sin(tv);
|
|
126
|
+
let carrier = WATER_PI * u / radius - phase;
|
|
127
|
+
let c = cos(carrier);
|
|
128
|
+
let s = sin(carrier);
|
|
129
|
+
let k = WATER_PI / radius;
|
|
130
|
+
let z = amplitude * envelope * window * c;
|
|
131
|
+
let z_u = amplitude * window * (envelope_du * c - envelope * s * k);
|
|
132
|
+
let z_v = amplitude * envelope * window_dv * c;
|
|
133
|
+
let h = -amplitude * envelope * window * s;
|
|
134
|
+
let h_u = -amplitude * window * (envelope_du * s + envelope * c * k);
|
|
135
|
+
let h_v = -amplitude * envelope * window_dv * s;
|
|
136
|
+
let gradient_h = h_u * direction + h_v * tangent;
|
|
137
|
+
field.height = z;
|
|
138
|
+
field.slope = z_u * direction + z_v * tangent;
|
|
139
|
+
field.displacement = h * direction;
|
|
140
|
+
field.jacobian = mat2x2<f32>(direction * gradient_h.x, direction * gradient_h.y);
|
|
141
|
+
return field;
|
|
142
|
+
}
|
|
143
|
+
`, [chunk_water_spectrum, chunk_pcg3d, WATER_PARTICLE_STRUCT.declaration_chunk, WATER_PARTICLE_ENTRY_STRUCT.declaration_chunk]);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Seconds over which a packet that has fallen below the drawing threshold fades to a tenth of it, where it dies. */
|
|
2
|
+
export const WATER_PARTICLE_FADE_SECONDS: 0.15;
|
|
3
|
+
/**
|
|
4
|
+
* One frame of one wave particle (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §5.1): it ages, spreads over its
|
|
5
|
+
* widening front, damps, reflects off its body's authored outline, and dies or splits.
|
|
6
|
+
*
|
|
7
|
+
* Whether a point is over the body is a down-ray into the body's own BLAS, so the outline is exactly the
|
|
8
|
+
* authored mesh's, holes for islands included. Bindings: `geometries`, `blas_lookup`, `blas_data`,
|
|
9
|
+
* `meshlet_metadata`, `meshlet_data`.
|
|
10
|
+
*
|
|
11
|
+
* @type {CodeChunk}
|
|
12
|
+
*/
|
|
13
|
+
export const chunk_water_particle_step: CodeChunk;
|
|
14
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
15
|
+
//# sourceMappingURL=chunk_water_particle_step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_water_particle_step.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/particles/chunk_water_particle_step.js"],"names":[],"mappings":"AAOA,qHAAqH;AACrH,+CAAgD;AAEhD;;;;;;;;;GASG;AACH,wCAFU,SAAS,CAsGsC;0BAxH/B,uCAAuC"}
|