@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,199 @@
|
|
|
1
|
+
import Signal from "../../../../core/events/signal/Signal.js";
|
|
2
|
+
import { assert } from "../../../../core/assert.js";
|
|
3
|
+
import { SamplerDescriptor } from "../../../descriptor/texture/SamplerDescriptor.js";
|
|
4
|
+
import { GPUWaterSpectrum } from "./spectrum/GPUWaterSpectrum.js";
|
|
5
|
+
import { GPUWaterParticles } from "./particles/GPUWaterParticles.js";
|
|
6
|
+
import { shader_water_waves_combine } from "./shader_water_waves_combine.js";
|
|
7
|
+
import {
|
|
8
|
+
shader_water_cull,
|
|
9
|
+
shader_water_cull_finalize,
|
|
10
|
+
WATER_CULL_STRUCT,
|
|
11
|
+
WATER_CULL_WORKGROUP_SIZE,
|
|
12
|
+
WATER_LIST_HEADER_BYTES,
|
|
13
|
+
WATER_SURFACE_COMMAND_COUNT,
|
|
14
|
+
WATER_SURFACE_COMMAND_STRIDE,
|
|
15
|
+
WaterSurfaceCommand
|
|
16
|
+
} from "./shader_water_cull.js";
|
|
17
|
+
import { water_lod_view, WATER_LOD_VIEW_STRUCT } from "./lod/WATER_LOD.js";
|
|
18
|
+
import { WATER_SPECTRUM_LOOP_SECONDS } from "./spectrum/WATER_SPECTRUM.js";
|
|
19
|
+
|
|
20
|
+
/** Times of its loop the bands are evaluated at once, on a device's first frame with wind, to seed their envelopes. */
|
|
21
|
+
export const WATER_ENVELOPE_SEED_TIMES = 32;
|
|
22
|
+
|
|
23
|
+
/** How the surface sampler reads the band tiles: filtered, and periodic. */
|
|
24
|
+
export const WATER_BAND_SAMPLER = Object.freeze(SamplerDescriptor.from({
|
|
25
|
+
magFilter: "linear",
|
|
26
|
+
minFilter: "linear",
|
|
27
|
+
addressModeU: "repeat",
|
|
28
|
+
addressModeV: "repeat",
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The water surface producer (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §3), scheduled by what the frame's view
|
|
33
|
+
* sees (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §3): a culling pass over every body, then the shared
|
|
34
|
+
* spectral bands the visible bodies can draw, the wave particles of the bodies simulated this frame, and their
|
|
35
|
+
* bounds. Recorded once a frame at the head of the frame. What the surface passes bind of it is the surface
|
|
36
|
+
* interface: the band textures, the particle hash, and the rows.
|
|
37
|
+
*/
|
|
38
|
+
export class GPUWaterSurface {
|
|
39
|
+
/** Dispatched with the scene when a frame that emitted the queued splashes is submitted. */
|
|
40
|
+
onInputsConsumed = new Signal();
|
|
41
|
+
/** Most wave particles alive at once over every body of a scene. */
|
|
42
|
+
particle_capacity = 65536;
|
|
43
|
+
/** Whether any body has wind; without it the band tiles are not animated. */
|
|
44
|
+
windy = false;
|
|
45
|
+
/**
|
|
46
|
+
* Whether any splash was ever queued. Until one is, the pool is empty and no particle pass is recorded; set by
|
|
47
|
+
* whoever queues splashes.
|
|
48
|
+
*/
|
|
49
|
+
splashed = false;
|
|
50
|
+
#spectrum = new GPUWaterSpectrum();
|
|
51
|
+
#particles = new GPUWaterParticles();
|
|
52
|
+
#device = null;
|
|
53
|
+
#scene = null;
|
|
54
|
+
#rows = 0;
|
|
55
|
+
#steep = null;
|
|
56
|
+
#activity = null;
|
|
57
|
+
#lists = null;
|
|
58
|
+
#commands = null;
|
|
59
|
+
#pending = 0;
|
|
60
|
+
#spectrum_time = NaN;
|
|
61
|
+
#seeded = false;
|
|
62
|
+
#recorded = new WeakSet();
|
|
63
|
+
|
|
64
|
+
get displacement() { return this.#spectrum.displacement; }
|
|
65
|
+
get derivatives() { return this.#spectrum.derivatives; }
|
|
66
|
+
get particle_offsets() { return this.#particles.offsets; }
|
|
67
|
+
get particle_entries() { return this.#particles.entries; }
|
|
68
|
+
/** @returns {GPUBuffer} per wave row, set by the tessellation when a body has a triangle too steep to displace */
|
|
69
|
+
get steep() { return this.#steep; }
|
|
70
|
+
/** @returns {GPUBuffer} per wave row, the culling pass's {@link WaterActivity} bits for the frame */
|
|
71
|
+
get activity() { return this.#activity; }
|
|
72
|
+
/** @returns {GPUBuffer} the water_bodies rows the frame's culling pass found visible: a count, then the rows */
|
|
73
|
+
get visible_rows() { return this.#lists?.visible ?? null; }
|
|
74
|
+
get particles() { return this.#particles; }
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Seconds of water time to step at the next recorded frame.
|
|
78
|
+
* @param {number} dt
|
|
79
|
+
*/
|
|
80
|
+
advance(dt) {
|
|
81
|
+
assert.isFinite(dt, 'dt'); assert.greaterThanOrEqual(dt, 0, 'dt');
|
|
82
|
+
this.#pending += dt;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
dispose() {
|
|
86
|
+
this.#spectrum.dispose();
|
|
87
|
+
this.#particles.dispose();
|
|
88
|
+
for (const buffer of [this.#steep, this.#activity, this.#commands, ...Object.values(this.#lists ?? {})]) { buffer?.destroy(); }
|
|
89
|
+
this.#steep = this.#activity = this.#commands = this.#lists = null;
|
|
90
|
+
this.#rows = 0;
|
|
91
|
+
this.#device = null;
|
|
92
|
+
this.#scene = null;
|
|
93
|
+
this.#spectrum_time = NaN;
|
|
94
|
+
this.#seeded = false;
|
|
95
|
+
this.#recorded = new WeakSet();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Per wave row buffers for this many rows, carrying the steep flags of the rows that were. */
|
|
99
|
+
#allocate(device, rows) {
|
|
100
|
+
if (this.#steep !== null && rows <= this.#rows) { return null; }
|
|
101
|
+
const previous = this.#steep, previous_rows = this.#rows;
|
|
102
|
+
for (const buffer of [this.#activity, ...Object.values(this.#lists ?? {})]) { buffer?.destroy(); }
|
|
103
|
+
const buffer = (label, size, usage = 0) => device.createBuffer({ label: `Water / ${label}`, size,
|
|
104
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC | usage });
|
|
105
|
+
this.#steep = buffer('steep bodies', rows * 4);
|
|
106
|
+
this.#activity = buffer('activity', rows * 4);
|
|
107
|
+
const list = label => buffer(label, WATER_LIST_HEADER_BYTES + rows * 4);
|
|
108
|
+
this.#lists = { visible: list('visible rows'), active: list('active rows'), emit: list('emit rows') };
|
|
109
|
+
this.#commands ??= buffer('surface commands', WATER_SURFACE_COMMAND_COUNT * WATER_SURFACE_COMMAND_STRIDE, GPUBufferUsage.INDIRECT);
|
|
110
|
+
this.#rows = rows;
|
|
111
|
+
if (previous === null) { return null; }
|
|
112
|
+
return encoder => {
|
|
113
|
+
encoder.copyBufferToBuffer(previous, 0, this.#steep, 0, previous_rows * 4);
|
|
114
|
+
encoder.done.then(() => previous.destroy());
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @param {object} options
|
|
120
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
121
|
+
* @param {GPUDevice} options.device
|
|
122
|
+
* @param {object} options.scene GPU scene context
|
|
123
|
+
* @param {number} options.time water time, seconds
|
|
124
|
+
* @param {object} options.view the view the frame is recorded for
|
|
125
|
+
* @param {GPUBuffer} options.view.camera its camera uniforms
|
|
126
|
+
* @param {ArrayLike<number>} options.view.projection its projection, column-major
|
|
127
|
+
* @param {number} options.view.height its render target's height, pixels
|
|
128
|
+
* @param {number} options.pixels the smallest a lattice cell is drawn on screen
|
|
129
|
+
*/
|
|
130
|
+
record({ graph, device, scene, time, view, pixels }) {
|
|
131
|
+
if (this.#recorded.has(graph)) { return; }
|
|
132
|
+
if (device !== this.#device || scene !== this.#scene) {
|
|
133
|
+
this.dispose(); this.#device = device; this.#scene = scene;
|
|
134
|
+
}
|
|
135
|
+
this.#recorded.add(graph);
|
|
136
|
+
const bodies = scene.scene_database.get('water_bodies');
|
|
137
|
+
const waves = scene.scene_database.get('water_waves');
|
|
138
|
+
const rows = Math.max(waves.element_capacity, 1);
|
|
139
|
+
this.#spectrum.prepare(device);
|
|
140
|
+
const carry_steep = this.#allocate(device, rows);
|
|
141
|
+
const carry_bounds = this.#particles.prepare(device, this.particle_capacity, rows);
|
|
142
|
+
const dt = this.#pending;
|
|
143
|
+
this.#pending = 0;
|
|
144
|
+
const stepping = dt > 0;
|
|
145
|
+
const binning = this.splashed;
|
|
146
|
+
const fresh = time !== this.#spectrum_time;
|
|
147
|
+
this.#spectrum_time = time;
|
|
148
|
+
const seed = this.windy && !this.#seeded;
|
|
149
|
+
if (seed) { this.#seeded = true; }
|
|
150
|
+
const windy = this.windy;
|
|
151
|
+
const lod = water_lod_view(view.projection, view.height, pixels);
|
|
152
|
+
const groups = bodies.dispatch_group_count(WATER_CULL_WORKGROUP_SIZE);
|
|
153
|
+
const lists = this.#lists, commands = this.#commands, steep = this.#steep, activity = this.#activity;
|
|
154
|
+
const band_state = this.#spectrum.band_state, band_requests = this.#spectrum.band_requests;
|
|
155
|
+
const particle_bounds = this.#particles.body_bounds;
|
|
156
|
+
const command = index => index * WATER_SURFACE_COMMAND_STRIDE;
|
|
157
|
+
const finalize = (encoder, frame) => shader_water_cull_finalize.dispatch({ encoder, bindings: { frame,
|
|
158
|
+
band_state, band_requests, active_rows: lists.active, emit_rows: lists.emit, commands } });
|
|
159
|
+
const spectrum = encoder => this.#spectrum.encode(encoder, time, commands,
|
|
160
|
+
command(WaterSurfaceCommand.SpectrumRows), command(WaterSurfaceCommand.SpectrumColumns));
|
|
161
|
+
const head = graph.add('Water / cull', {}, (_d, _r, { encoder }) => {
|
|
162
|
+
carry_steep?.(encoder);
|
|
163
|
+
carry_bounds?.(encoder);
|
|
164
|
+
for (const list of Object.values(lists)) { encoder.clearBuffer(list, 0, WATER_LIST_HEADER_BYTES); }
|
|
165
|
+
if (seed) {
|
|
166
|
+
// every band at times spread over its loop, so the culling pass has envelopes to bound hidden bodies'
|
|
167
|
+
// waves by: one time's extrema fall short of the loop's by up to half (measured over 2,000 times)
|
|
168
|
+
finalize(encoder, { fresh: 1, seed: 1 });
|
|
169
|
+
for (let i = 0; i < WATER_ENVELOPE_SEED_TIMES; i++) {
|
|
170
|
+
this.#spectrum.encode(encoder, (i + 0.5) / WATER_ENVELOPE_SEED_TIMES * WATER_SPECTRUM_LOOP_SECONDS, commands,
|
|
171
|
+
command(WaterSurfaceCommand.SpectrumRows), command(WaterSurfaceCommand.SpectrumColumns));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (groups > 0) {
|
|
175
|
+
shader_water_cull.dispatch({ encoder, bindings: {
|
|
176
|
+
cull: encoder.allocateTransientValueBuffer(WATER_CULL_STRUCT, { dt, stepping: stepping ? 1 : 0, binning: binning ? 1 : 0 }),
|
|
177
|
+
lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod), camera: view.camera, scene_database: scene.scene_database_buffer, geometries: scene.geometries.buffer_metadata,
|
|
178
|
+
band_state, band_requests, particle_bounds, steep, activity, visible_rows: lists.visible, active_rows: lists.active,
|
|
179
|
+
emit_rows: lists.emit }, group_count_x: Math.min(groups, 65535), group_count_y: Math.ceil(groups / 65535) });
|
|
180
|
+
}
|
|
181
|
+
finalize(encoder, { fresh: fresh && !seed ? 1 : 0, seed: 0 });
|
|
182
|
+
if (windy) { spectrum(encoder); }
|
|
183
|
+
});
|
|
184
|
+
head.make_side_effect();
|
|
185
|
+
if (binning) {
|
|
186
|
+
this.#particles.record({ graph, scene, steep, activity, emit_rows: lists.emit, commands,
|
|
187
|
+
emit_command: command(WaterSurfaceCommand.Emit), dt: stepping ? dt : 0 });
|
|
188
|
+
}
|
|
189
|
+
const tail = graph.add('Water / surface bounds', {}, (_d, _r, { encoder }) => {
|
|
190
|
+
shader_water_waves_combine.dispatchIndirect({ encoder, command: commands, command_offset: command(WaterSurfaceCommand.Active),
|
|
191
|
+
bindings: { scene_database: scene.scene_database_buffer, active_rows: lists.active, band_state, particle_bounds, steep } });
|
|
192
|
+
if (stepping && binning) {
|
|
193
|
+
// Submit is the ownership boundary for staged CPU inputs.
|
|
194
|
+
encoder.onFinished.addOne(() => this.onInputsConsumed.dispatch(scene));
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
tail.make_side_effect();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
/** Most impulses one body applies in one
|
|
1
|
+
/** Most impulses one body applies in one frame. */
|
|
2
2
|
export const WATER_WAVE_IMPULSE_LIMIT: 16;
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* The surface state of one water body, one row per body (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §6.1).
|
|
5
|
+
* The CPU writes what is authored and queued; the GPU writes what it derives each frame.
|
|
6
|
+
*/
|
|
4
7
|
export const WATER_WAVE_RECORD_STRUCT: WebGPUStruct;
|
|
5
8
|
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
6
9
|
//# sourceMappingURL=WATER_WAVE_RECORD_STRUCT.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WATER_WAVE_RECORD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WATER_WAVE_RECORD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js"],"names":[],"mappings":"AAKA,mDAAmD;AACnD,0CAA2C;AAE3C;;;GAGG;AACH,oDA8BsB;6BAxCO,mCAAmC"}
|
|
@@ -1,23 +1,43 @@
|
|
|
1
1
|
import { f32, u32, vec2f, vec4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
2
|
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
3
3
|
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
4
|
+
import { WATER_SPECTRUM_BAND_COUNT } from "./spectrum/WATER_SPECTRUM.js";
|
|
4
5
|
|
|
5
|
-
/** Most impulses one body applies in one
|
|
6
|
+
/** Most impulses one body applies in one frame. */
|
|
6
7
|
export const WATER_WAVE_IMPULSE_LIMIT = 16;
|
|
7
8
|
|
|
8
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* The surface state of one water body, one row per body (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §6.1).
|
|
11
|
+
* The CPU writes what is authored and queued; the GPU writes what it derives each frame.
|
|
12
|
+
*/
|
|
9
13
|
export const WATER_WAVE_RECORD_STRUCT = WebGPUStruct.from({
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Wind direction in the body's metric local xz (cos, sin), wind speed at 10 m in m/s, and the amplitude
|
|
16
|
+
* reflection coefficient of the mesh's outline.
|
|
17
|
+
*/
|
|
18
|
+
wind: vec4f,
|
|
19
|
+
/** Open water upwind of the mesh, metres, added to the mesh's own extent along the wind. */
|
|
20
|
+
upwind_fetch: f32,
|
|
21
|
+
/** Queued splashes: local xz centre, world radius, velocity kick (m/s). */
|
|
15
22
|
impulses: WebGPUArray.from(vec4f, WATER_WAVE_IMPULSE_LIMIT),
|
|
16
|
-
node: u32,
|
|
17
|
-
unresolved_variance: f32,
|
|
18
23
|
impulse_count: u32,
|
|
19
|
-
|
|
24
|
+
node: u32,
|
|
20
25
|
geometry: u32,
|
|
21
|
-
/**
|
|
22
|
-
|
|
26
|
+
/** Non-zero to step the body while no view sees it (`Water.simulateWhenHidden`). */
|
|
27
|
+
simulate_hidden: u32,
|
|
28
|
+
/** GPU: the wind speed and fetch the weights were derived for; the culling pass re-derives when they change. */
|
|
29
|
+
derived_for: vec2f,
|
|
30
|
+
/** GPU: amplitude weight of each spectral band, from the wind and the fetch. */
|
|
31
|
+
weights: WebGPUArray.from(f32, WATER_SPECTRUM_BAND_COUNT),
|
|
32
|
+
/** GPU: slope variance of all of the body's ambient waves. */
|
|
33
|
+
slope_variance: f32,
|
|
34
|
+
/** GPU: the wind direction a turn started from and the one it is going to, metric local xz. */
|
|
35
|
+
wind_from: vec2f,
|
|
36
|
+
wind_to: vec2f,
|
|
37
|
+
/** GPU: progress of the turn from wind_from to wind_to, 0 … 1. */
|
|
38
|
+
wind_blend: f32,
|
|
39
|
+
/** GPU: signed local-y displacement bounds and the horizontal bound, local units, as the body's last simulated frame left them. */
|
|
40
|
+
displacement_bounds: vec4f,
|
|
41
|
+
/** GPU: bit l set when the body has wave particles at hash level l this frame. */
|
|
42
|
+
particle_levels: u32,
|
|
23
43
|
}, "WaterWaveRecord");
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Most particle entries one point reads, over every level. The bin pass thins a crowded cell to about
|
|
3
|
+
* WATER_PARTICLE_CELL_SHARE packets, the same ones in every cell they reach, so a point reads all of its cells
|
|
4
|
+
* unless several levels are crowded there at once.
|
|
5
|
+
*/
|
|
6
|
+
export const WATER_PARTICLE_GATHER_BUDGET: 64;
|
|
7
|
+
/**
|
|
8
|
+
* The surface interface (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §3): the displaced water surface at one
|
|
9
|
+
* rest point of one body, from the shared spectral bands and the body's wave particles, filtered by the
|
|
10
|
+
* point's footprint.
|
|
11
|
+
*
|
|
12
|
+
* A pure function of its arguments and the frame's resources. Callers pass the rest point and a footprint
|
|
13
|
+
* computed from the rest point alone, so two cells sharing a vertex displace it identically.
|
|
14
|
+
*
|
|
15
|
+
* Bindings it reads: `scene_database`, `water_band_displacement`, `water_band_derivatives`,
|
|
16
|
+
* `water_band_sampler` (linear, repeat), `water_particle_offsets`, `water_particle_entries`.
|
|
17
|
+
*
|
|
18
|
+
* @type {CodeChunk}
|
|
19
|
+
*/
|
|
20
|
+
export const chunk_water_surface_sample: CodeChunk;
|
|
21
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
22
|
+
//# sourceMappingURL=chunk_water_surface_sample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_water_surface_sample.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_surface_sample.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,8CAA+C;AAE/C;;;;;;;;;;;;GAYG;AACH,yCAFU,SAAS,CAgMyC;0BAxNlC,oCAAoC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_pcg3d } from "../../shader/chunk/random/pcg/chunk_pcg3d.js";
|
|
3
|
+
import { WATER_WAVES_TABLE } from "../medium/chunk_water_bodies.js";
|
|
4
|
+
import { chunk_water_spectrum } from "./spectrum/chunk_water_spectrum.js";
|
|
5
|
+
import { chunk_water_particle } from "./particles/chunk_water_particle.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Most particle entries one point reads, over every level. The bin pass thins a crowded cell to about
|
|
9
|
+
* WATER_PARTICLE_CELL_SHARE packets, the same ones in every cell they reach, so a point reads all of its cells
|
|
10
|
+
* unless several levels are crowded there at once.
|
|
11
|
+
*/
|
|
12
|
+
export const WATER_PARTICLE_GATHER_BUDGET = 64;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The surface interface (WATER_SURFACE_SIMULATION_PLAN_2026_10_06.md §3): the displaced water surface at one
|
|
16
|
+
* rest point of one body, from the shared spectral bands and the body's wave particles, filtered by the
|
|
17
|
+
* point's footprint.
|
|
18
|
+
*
|
|
19
|
+
* A pure function of its arguments and the frame's resources. Callers pass the rest point and a footprint
|
|
20
|
+
* computed from the rest point alone, so two cells sharing a vertex displace it identically.
|
|
21
|
+
*
|
|
22
|
+
* Bindings it reads: `scene_database`, `water_band_displacement`, `water_band_derivatives`,
|
|
23
|
+
* `water_band_sampler` (linear, repeat), `water_particle_offsets`, `water_particle_entries`.
|
|
24
|
+
*
|
|
25
|
+
* @type {CodeChunk}
|
|
26
|
+
*/
|
|
27
|
+
export const chunk_water_surface_sample = CodeChunk.from(/* language=WGSL */ `
|
|
28
|
+
const WATER_PARTICLE_GATHER_BUDGET: u32 = ${WATER_PARTICLE_GATHER_BUDGET}u;
|
|
29
|
+
const WATER_LN2: f32 = 0.69314718;
|
|
30
|
+
|
|
31
|
+
struct WaterSurfaceSample {
|
|
32
|
+
// metric local frame: (Dx, h, Dz)
|
|
33
|
+
offset: vec3<f32>,
|
|
34
|
+
// unit normal of the displaced surface, metric local frame
|
|
35
|
+
normal: vec3<f32>,
|
|
36
|
+
// slope variance of the waves too short for the footprint
|
|
37
|
+
unresolved_variance: f32,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Everything at a point before the horizontal displacement is limited: metric local frame.
|
|
41
|
+
struct WaterSurfaceSum {
|
|
42
|
+
height: f32,
|
|
43
|
+
slope: vec2<f32>,
|
|
44
|
+
displacement: vec2<f32>,
|
|
45
|
+
jacobian: mat2x2<f32>,
|
|
46
|
+
// slope variance of the bands and packets too short for the footprint
|
|
47
|
+
variance: f32,
|
|
48
|
+
// ... of which the packets'
|
|
49
|
+
particle_variance: f32,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// What geometry at this footprint carries of a band: all of it while its shortest waves (half the node wavelength)
|
|
53
|
+
// span eight samples, fading over the octave below.
|
|
54
|
+
fn water_band_vertex_fraction(band: u32, footprint: f32) -> f32 {
|
|
55
|
+
return clamp(log2(water_band_wavelength(band) / (8.0 * footprint)), 0.0, 1.0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// What a pixel of this footprint shades of a band: all of it while its shortest waves span four pixels, none once they
|
|
59
|
+
// span two.
|
|
60
|
+
fn water_band_pixel_fraction(band: u32, footprint: f32) -> f32 {
|
|
61
|
+
return clamp(log2(water_band_wavelength(band) / (4.0 * footprint)), 0.0, 1.0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Where in its tile a body's band starts, for one orientation of its waves: per body, so two bodies with one
|
|
65
|
+
// wind do not show the same waves, and per orientation, so the two a turn of the wind blends are independent
|
|
66
|
+
// however small the turn. An orientation is the exact bits of its direction, which the turn hands on unchanged.
|
|
67
|
+
fn water_band_offset(wave: u32, band: u32, wind: vec2<f32>) -> vec2<f32> {
|
|
68
|
+
let bits = pcg3d(vec3<u32>(wave, band, pcg3d(vec3<u32>(bitcast<u32>(wind.x), bitcast<u32>(wind.y), 0x5eau)).x));
|
|
69
|
+
return vec2<f32>(f32(bits.x >> 8u), f32(bits.y >> 8u)) * (1.0 / 16777216.0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Band j's waves at p, turned so the tile's own wind angle points along wind, scaled by weight.
|
|
73
|
+
fn water_band_add(sum: ptr<function, WaterSurfaceSum>, wave: u32, band: u32, p: vec2<f32>, wind: vec2<f32>, weight: f32) {
|
|
74
|
+
let angle = water_band_wind_angle(band);
|
|
75
|
+
let band_wind = vec2<f32>(cos(angle), sin(angle));
|
|
76
|
+
// body frame → tile frame turns by (band angle − wind angle); back by its inverse
|
|
77
|
+
let c = dot(band_wind, wind);
|
|
78
|
+
let s = band_wind.y * wind.x - band_wind.x * wind.y;
|
|
79
|
+
let to_tile = mat2x2<f32>(c, s, -s, c);
|
|
80
|
+
let to_body = mat2x2<f32>(c, -s, s, c);
|
|
81
|
+
let uv = (to_tile * p) / water_band_period(band) + water_band_offset(wave, band, wind);
|
|
82
|
+
let a = textureSampleLevel(water_band_displacement, water_band_sampler, uv, band, 0.0);
|
|
83
|
+
let b = textureSampleLevel(water_band_derivatives, water_band_sampler, uv, band, 0.0);
|
|
84
|
+
(*sum).height += weight * a.y;
|
|
85
|
+
(*sum).displacement += weight * (to_body * a.xz);
|
|
86
|
+
// a gradient turns as a vector does; the Jacobian as R J Rᵀ
|
|
87
|
+
(*sum).slope += weight * (to_body * b.xy);
|
|
88
|
+
(*sum).jacobian += weight * (to_body * mat2x2<f32>(b.z, a.w, a.w, b.w) * to_tile);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The bands and particles at metric local point p of wave row wave, filtered to footprint metres between samples.
|
|
92
|
+
fn water_surface_sum(wave: u32, p: vec2<f32>, footprint: f32) -> WaterSurfaceSum {
|
|
93
|
+
let weights = ${WATER_WAVES_TABLE.marshalling_method_read_field('weights')}(&scene_database, wave);
|
|
94
|
+
let wind_from = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_from')}(&scene_database, wave);
|
|
95
|
+
let wind_to = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_to')}(&scene_database, wave);
|
|
96
|
+
let blend = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_blend')}(&scene_database, wave);
|
|
97
|
+
let levels = ${WATER_WAVES_TABLE.marshalling_method_read_field('particle_levels')}(&scene_database, wave);
|
|
98
|
+
var sum: WaterSurfaceSum;
|
|
99
|
+
var variance = 0.0;
|
|
100
|
+
// during a turn of the wind both orientations show, independent, with weights whose squares sum to one
|
|
101
|
+
let turning = blend < 1.0;
|
|
102
|
+
let weight_to = select(1.0, sin(1.57079633 * blend), turning);
|
|
103
|
+
let weight_from = select(0.0, cos(1.57079633 * blend), turning);
|
|
104
|
+
for (var band = 0u; band < WATER_SPECTRUM_BANDS; band++) {
|
|
105
|
+
let w = weights[band];
|
|
106
|
+
if (!(w > 0.0)) { continue; }
|
|
107
|
+
// what geometry does not carry is slope variance
|
|
108
|
+
let f = water_band_vertex_fraction(band, footprint);
|
|
109
|
+
variance += w * w * WATER_LN2 * (1.0 - f * f);
|
|
110
|
+
if (f <= 0.0) { continue; }
|
|
111
|
+
water_band_add(&sum, wave, band, p, wind_to, w * f * weight_to);
|
|
112
|
+
if (weight_from > 0.0) { water_band_add(&sum, wave, band, p, wind_from, w * f * weight_from); }
|
|
113
|
+
}
|
|
114
|
+
let table = water_particle_offsets.count;
|
|
115
|
+
var visited = 0u;
|
|
116
|
+
var particle_variance = 0.0;
|
|
117
|
+
// coarsest first: the budget goes to packets the footprint can draw before those it can only roughen
|
|
118
|
+
for (var from_top = 0u; from_top < WATER_PARTICLE_LEVELS && table != 0u; from_top++) {
|
|
119
|
+
let level = WATER_PARTICLE_LEVELS - 1u - from_top;
|
|
120
|
+
if ((levels & (1u << level)) == 0u) { continue; }
|
|
121
|
+
let size = water_particle_cell_size(level);
|
|
122
|
+
let cell = vec2<i32>(floor(p / size));
|
|
123
|
+
let key = (wave << 4u) | level;
|
|
124
|
+
let bucket = water_particle_bucket(wave, level, cell, table);
|
|
125
|
+
var start = 0u;
|
|
126
|
+
if (bucket > 0u) { start = water_particle_offsets.elements[bucket - 1u]; }
|
|
127
|
+
let end = water_particle_offsets.elements[bucket];
|
|
128
|
+
for (var i = start; i < end && visited < WATER_PARTICLE_GATHER_BUDGET; i++) {
|
|
129
|
+
visited++;
|
|
130
|
+
let entry = water_particle_entries[i];
|
|
131
|
+
if (entry.key != key || any(entry.cell != cell)) { continue; }
|
|
132
|
+
let field = water_particle_field(p - entry.position, entry.angle, entry.amplitude, entry.radius, entry.width, entry.phase);
|
|
133
|
+
// a packet is geometry while its wavelength spans eight samples, fading out by four
|
|
134
|
+
let f = clamp(log2(entry.radius / (2.0 * footprint)), 0.0, 1.0);
|
|
135
|
+
particle_variance += (1.0 - f * f) * dot(field.slope, field.slope);
|
|
136
|
+
sum.height += f * field.height;
|
|
137
|
+
sum.slope += f * field.slope;
|
|
138
|
+
sum.displacement += f * field.displacement;
|
|
139
|
+
sum.jacobian += f * field.jacobian;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
sum.variance = variance + particle_variance;
|
|
143
|
+
sum.particle_variance = particle_variance;
|
|
144
|
+
return sum;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Band j's slope at p, turned as water_band_add turns it: the derivatives tile alone.
|
|
148
|
+
fn water_band_slope(wave: u32, band: u32, p: vec2<f32>, wind: vec2<f32>) -> vec2<f32> {
|
|
149
|
+
let angle = water_band_wind_angle(band);
|
|
150
|
+
let band_wind = vec2<f32>(cos(angle), sin(angle));
|
|
151
|
+
let c = dot(band_wind, wind);
|
|
152
|
+
let s = band_wind.y * wind.x - band_wind.x * wind.y;
|
|
153
|
+
let to_tile = mat2x2<f32>(c, s, -s, c);
|
|
154
|
+
let to_body = mat2x2<f32>(c, -s, s, c);
|
|
155
|
+
let uv = (to_tile * p) / water_band_period(band) + water_band_offset(wave, band, wind);
|
|
156
|
+
return to_body * textureSampleLevel(water_band_derivatives, water_band_sampler, uv, band, 0.0).xy;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// What a pixel sees of the bands at rest point p that its vertices, footprint apart, could not carry: their slope,
|
|
160
|
+
// metric local frame, to tilt the vertices' normal by; and the slope variance of the bands neither resolves.
|
|
161
|
+
struct WaterSurfaceDetail {
|
|
162
|
+
slope: vec2<f32>,
|
|
163
|
+
variance: f32,
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
fn water_surface_detail(wave: u32, p: vec2<f32>, vertex_footprint: f32, pixel_footprint: f32) -> WaterSurfaceDetail {
|
|
167
|
+
let weights = ${WATER_WAVES_TABLE.marshalling_method_read_field('weights')}(&scene_database, wave);
|
|
168
|
+
let wind_from = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_from')}(&scene_database, wave);
|
|
169
|
+
let wind_to = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_to')}(&scene_database, wave);
|
|
170
|
+
let blend = ${WATER_WAVES_TABLE.marshalling_method_read_field('wind_blend')}(&scene_database, wave);
|
|
171
|
+
let turning = blend < 1.0;
|
|
172
|
+
let weight_to = select(1.0, sin(1.57079633 * blend), turning);
|
|
173
|
+
let weight_from = select(0.0, cos(1.57079633 * blend), turning);
|
|
174
|
+
var detail: WaterSurfaceDetail;
|
|
175
|
+
for (var band = 0u; band < WATER_SPECTRUM_BANDS; band++) {
|
|
176
|
+
let w = weights[band];
|
|
177
|
+
if (!(w > 0.0)) { continue; }
|
|
178
|
+
let carried = water_band_vertex_fraction(band, vertex_footprint);
|
|
179
|
+
let shaded = max(water_band_pixel_fraction(band, pixel_footprint), carried);
|
|
180
|
+
detail.variance += w * w * WATER_LN2 * (1.0 - shaded * shaded);
|
|
181
|
+
let extra = shaded - carried;
|
|
182
|
+
if (!(extra > 0.0)) { continue; }
|
|
183
|
+
detail.slope += w * extra * weight_to * water_band_slope(wave, band, p, wind_to);
|
|
184
|
+
if (weight_from > 0.0) { detail.slope += w * extra * weight_from * water_band_slope(wave, band, p, wind_from); }
|
|
185
|
+
}
|
|
186
|
+
return detail;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The surface from its sum, with the horizontal displacement scaled by at most horizontal (a caller's
|
|
190
|
+
// near-plane allowance), and folded back where it would turn the surface inside out: the largest scale
|
|
191
|
+
// λ ≤ horizontal for which det(I + λJ) stays at least 0.2.
|
|
192
|
+
fn water_surface_finish(sum: WaterSurfaceSum, horizontal: f32) -> WaterSurfaceSample {
|
|
193
|
+
let trace = sum.jacobian[0][0] + sum.jacobian[1][1];
|
|
194
|
+
let det = determinant(sum.jacobian);
|
|
195
|
+
var lambda = clamp(horizontal, 0.0, 1.0);
|
|
196
|
+
if (1.0 + lambda * trace + lambda * lambda * det < 0.2) {
|
|
197
|
+
// the first root of det λ² + trace λ + 0.8 = 0 in (0, λ): the polynomial is 1 > 0.2 at 0
|
|
198
|
+
// the cancellation-free pair of roots: q / det and 0.8 / q, either of which may be the one
|
|
199
|
+
let q = -0.5 * (trace + select(-1.0, 1.0, trace >= 0.0) * sqrt(max(trace * trace - 3.2 * det, 0.0)));
|
|
200
|
+
let r1 = select(-1.0, q / det, abs(det) > 1e-20);
|
|
201
|
+
let r2 = select(-1.0, 0.8 / q, abs(q) > 1e-20);
|
|
202
|
+
lambda = min(select(lambda, r1, r1 > 0.0 && r1 < lambda), select(lambda, r2, r2 > 0.0 && r2 < lambda));
|
|
203
|
+
}
|
|
204
|
+
let j = lambda * sum.jacobian;
|
|
205
|
+
let tangent_x = vec3<f32>(1.0 + j[0][0], sum.slope.x, j[0][1]);
|
|
206
|
+
let tangent_z = vec3<f32>(j[1][0], sum.slope.y, 1.0 + j[1][1]);
|
|
207
|
+
return WaterSurfaceSample(vec3<f32>(lambda * sum.displacement.x, sum.height, lambda * sum.displacement.y),
|
|
208
|
+
normalize(cross(tangent_z, tangent_x)), sum.variance);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
fn water_surface_sample(wave: u32, p: vec2<f32>, footprint: f32, horizontal: f32) -> WaterSurfaceSample {
|
|
212
|
+
return water_surface_finish(water_surface_sum(wave, p, footprint), horizontal);
|
|
213
|
+
}
|
|
214
|
+
`, [chunk_water_spectrum, chunk_water_particle, chunk_pcg3d,
|
|
215
|
+
WATER_WAVES_TABLE.chunk_read_field('weights'), WATER_WAVES_TABLE.chunk_read_field('wind_from'),
|
|
216
|
+
WATER_WAVES_TABLE.chunk_read_field('wind_to'), WATER_WAVES_TABLE.chunk_read_field('wind_blend'),
|
|
217
|
+
WATER_WAVES_TABLE.chunk_read_field('particle_levels')]);
|
|
@@ -1,14 +1,68 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Where each list's records start in the cell buffer, and the buffer's words: interior and boundary cells a word each,
|
|
3
|
+
* triangles drawn as themselves two words each, patches a word each, then each boundary cell's clipped polygon. The
|
|
4
|
+
* vertex stage finds them by the same arithmetic over the limits (chunk_water_lod_layout).
|
|
5
|
+
*
|
|
6
|
+
* @param {{interior: number, boundary: number, triangles: number, patches: number}} limits
|
|
7
|
+
* @returns {{interior: number, boundary: number, triangles: number, patches: number, polygons: number, words: number}}
|
|
8
|
+
*/
|
|
9
|
+
export function water_lod_cell_layout(limits: {
|
|
10
|
+
interior: number;
|
|
11
|
+
boundary: number;
|
|
12
|
+
triangles: number;
|
|
13
|
+
patches: number;
|
|
9
14
|
}): {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
interior: number;
|
|
16
|
+
boundary: number;
|
|
17
|
+
triangles: number;
|
|
18
|
+
patches: number;
|
|
19
|
+
polygons: number;
|
|
20
|
+
words: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The view's lattice cut by the drawn bodies' authored triangles (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md
|
|
24
|
+
* §4.3): per triangle, either itself on the triangle list or its candidates; per candidate, its quadrants and rows;
|
|
25
|
+
* and the patch, interior cell and boundary cell lists, each compacted by an ordered scan so equal-depth ownership
|
|
26
|
+
* between bodies stays deterministic. Candidates and cells are cut to `limits`; the totals before the cut land in `statistics`, for
|
|
27
|
+
* the caller to grow its budgets by.
|
|
28
|
+
*
|
|
29
|
+
* @param {object} options
|
|
30
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
31
|
+
* @param {object} options.scene GPU scene context
|
|
32
|
+
* @param {number} options.camera the view's camera uniform resource
|
|
33
|
+
* @param {number} options.meshlets the drawn bodies' meshlets resource, from {@link GPUWaterBodies#meshlets}
|
|
34
|
+
* @param {number} options.lod_bodies the view's per-body lattice frames resource, from the same
|
|
35
|
+
* @param {number} options.meshlet_capacity every water meshlet the scene holds: the triangle slots there can be
|
|
36
|
+
* @param {{ranges: number, orthographic: number, level: number, distance: number}} options.lod the view's lattice choice
|
|
37
|
+
* @param {{candidates: number, interior: number, boundary: number, triangles: number, patches: number}} options.limits budgets
|
|
38
|
+
* @param {GPUBuffer} options.steep per wave row: set for a body with a triangle too steep for the lattice
|
|
39
|
+
* @returns {{candidates: number, cells: number, commands: number, statistics: number}} resources
|
|
40
|
+
*/
|
|
41
|
+
export function graph_water_tessellation({ graph, scene, camera, meshlets, lod_bodies, meshlet_capacity, lod, limits, steep }: {
|
|
42
|
+
graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
43
|
+
scene: object;
|
|
44
|
+
camera: number;
|
|
45
|
+
meshlets: number;
|
|
46
|
+
lod_bodies: number;
|
|
47
|
+
meshlet_capacity: number;
|
|
48
|
+
lod: {
|
|
49
|
+
ranges: number;
|
|
50
|
+
orthographic: number;
|
|
51
|
+
level: number;
|
|
52
|
+
distance: number;
|
|
53
|
+
};
|
|
54
|
+
limits: {
|
|
55
|
+
candidates: number;
|
|
56
|
+
interior: number;
|
|
57
|
+
boundary: number;
|
|
58
|
+
triangles: number;
|
|
59
|
+
patches: number;
|
|
60
|
+
};
|
|
61
|
+
steep: GPUBuffer;
|
|
62
|
+
}): {
|
|
63
|
+
candidates: number;
|
|
64
|
+
cells: number;
|
|
65
|
+
commands: number;
|
|
66
|
+
statistics: number;
|
|
13
67
|
};
|
|
14
68
|
//# sourceMappingURL=graph_water_tessellation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/graph_water_tessellation.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_water_tessellation.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/graph_water_tessellation.js"],"names":[],"mappings":"AAiCA;;;;;;;GAOG;AACH,8CAHW;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GACtE;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAQrH;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAXsG,KAAK,EAAhG,OAAO,8DAA8D,EAAE,UAAU;IACjE,KAAK,EAArB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,QAAQ,EAAxB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,gBAAgB,EAAhC,MAAM;IAC2E,GAAG,EAApF;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IAC+B,MAAM,EAA5G;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC;IACzE,KAAK;IACtB;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAsGrF"}
|