@woosh/meep-engine 3.41.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/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/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/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.map +1 -1
- package/src/engine/ecs/EntityManager.js +18 -15
- 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/parent/EntityNode.js +3 -3
- 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/binary/BinarySerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
- 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 +8 -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/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/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/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/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/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/scene/SCENE_DATABASE_SPEC.js +2 -1
- 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/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
|
@@ -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"}
|
|
@@ -1,34 +1,169 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
1
2
|
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
2
3
|
import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
|
|
3
4
|
import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import {
|
|
6
|
+
build_indirect_compute_dispatch_command,
|
|
7
|
+
INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
|
|
8
|
+
} from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
9
|
+
import { WATER_LOD_VIEW_STRUCT } from "./lod/WATER_LOD.js";
|
|
10
|
+
import {
|
|
11
|
+
shader_water_lod_candidate_command,
|
|
12
|
+
shader_water_lod_candidates,
|
|
13
|
+
shader_water_lod_cells,
|
|
14
|
+
shader_water_lod_draw_commands,
|
|
15
|
+
shader_water_lod_flats,
|
|
16
|
+
shader_water_lod_triangles,
|
|
17
|
+
WATER_LOD_CANDIDATE_LIMIT,
|
|
18
|
+
WATER_LOD_CANDIDATE_ROW_WORDS,
|
|
19
|
+
WATER_LOD_CANDIDATE_STRUCT,
|
|
20
|
+
WATER_LOD_COMMAND_BYTES,
|
|
21
|
+
WATER_LOD_LIMITS_STRUCT,
|
|
22
|
+
WATER_LOD_POLYGON_WORDS,
|
|
23
|
+
WATER_LOD_STATISTICS_WORDS,
|
|
24
|
+
WaterLodCommand,
|
|
25
|
+
WaterLodList
|
|
26
|
+
} from "./lod/shader_water_lod.js";
|
|
8
27
|
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
/** A counts collection of this many elements: its count, padded, then the elements in whole vec4 blocks. */
|
|
29
|
+
function counts_descriptor(elements) {
|
|
30
|
+
const bytes = 16 + Math.ceil(Math.max(elements, 1) / 4) * 16;
|
|
31
|
+
return BufferResourceDescriptor.from(bytes, GPUBufferUsage.STORAGE, 0, 16);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Where each list's records start in the cell buffer, and the buffer's words: interior and boundary cells a word each,
|
|
36
|
+
* triangles drawn as themselves two words each, patches a word each, then each boundary cell's clipped polygon. The
|
|
37
|
+
* vertex stage finds them by the same arithmetic over the limits (chunk_water_lod_layout).
|
|
38
|
+
*
|
|
39
|
+
* @param {{interior: number, boundary: number, triangles: number, patches: number}} limits
|
|
40
|
+
* @returns {{interior: number, boundary: number, triangles: number, patches: number, polygons: number, words: number}}
|
|
41
|
+
*/
|
|
42
|
+
export function water_lod_cell_layout(limits) {
|
|
43
|
+
const triangles = limits.interior + limits.boundary;
|
|
44
|
+
const patches = triangles + 2 * limits.triangles;
|
|
45
|
+
const polygons = patches + limits.patches;
|
|
46
|
+
return { interior: 0, boundary: limits.interior, triangles, patches, polygons,
|
|
47
|
+
words: Math.max(polygons + WATER_LOD_POLYGON_WORDS * limits.boundary, 1) };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The view's lattice cut by the drawn bodies' authored triangles (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md
|
|
52
|
+
* §4.3): per triangle, either itself on the triangle list or its candidates; per candidate, its quadrants and rows;
|
|
53
|
+
* and the patch, interior cell and boundary cell lists, each compacted by an ordered scan so equal-depth ownership
|
|
54
|
+
* between bodies stays deterministic. Candidates and cells are cut to `limits`; the totals before the cut land in `statistics`, for
|
|
55
|
+
* the caller to grow its budgets by.
|
|
56
|
+
*
|
|
57
|
+
* @param {object} options
|
|
58
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
59
|
+
* @param {object} options.scene GPU scene context
|
|
60
|
+
* @param {number} options.camera the view's camera uniform resource
|
|
61
|
+
* @param {number} options.meshlets the drawn bodies' meshlets resource, from {@link GPUWaterBodies#meshlets}
|
|
62
|
+
* @param {number} options.lod_bodies the view's per-body lattice frames resource, from the same
|
|
63
|
+
* @param {number} options.meshlet_capacity every water meshlet the scene holds: the triangle slots there can be
|
|
64
|
+
* @param {{ranges: number, orthographic: number, level: number, distance: number}} options.lod the view's lattice choice
|
|
65
|
+
* @param {{candidates: number, interior: number, boundary: number, triangles: number, patches: number}} options.limits budgets
|
|
66
|
+
* @param {GPUBuffer} options.steep per wave row: set for a body with a triangle too steep for the lattice
|
|
67
|
+
* @returns {{candidates: number, cells: number, commands: number, statistics: number}} resources
|
|
68
|
+
*/
|
|
69
|
+
export function graph_water_tessellation({ graph, scene, camera, meshlets, lod_bodies, meshlet_capacity, lod, limits, steep }) {
|
|
70
|
+
assert.lessThanOrEqual(limits.candidates, WATER_LOD_CANDIDATE_LIMIT, 'candidate budget');
|
|
71
|
+
const slots = Math.max(meshlet_capacity, 1) * GEOMETRY_MESHLET_TRIANGLE_LIMIT;
|
|
72
|
+
const layout = water_lod_cell_layout(limits);
|
|
73
|
+
const geometry_bindings = { scene_database: scene.scene_database_buffer,
|
|
74
|
+
meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data };
|
|
75
|
+
const limits_value = { ...limits };
|
|
76
|
+
|
|
77
|
+
// per triangle slot of the drawn meshlets: drawn as itself, or its candidates
|
|
78
|
+
const triangles_data = {};
|
|
79
|
+
const triangles = graph.add('Water / lod triangles', triangles_data, (d, resources, { encoder }) => {
|
|
80
|
+
const command = resources.get(d.command), list = resources.get(d.meshlets);
|
|
81
|
+
build_indirect_compute_dispatch_command(1, encoder, list, 0, command, 0, true);
|
|
82
|
+
shader_water_lod_triangles.dispatchIndirect({ encoder, command, bindings: { ...geometry_bindings,
|
|
83
|
+
lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod), water_meshlets: list,
|
|
84
|
+
lod_bodies: resources.get(d.lod_bodies), steep, counts: resources.get(d.counts), flats: resources.get(d.flats) } });
|
|
85
|
+
});
|
|
86
|
+
triangles_data.meshlets = triangles.read(meshlets);
|
|
87
|
+
triangles_data.lod_bodies = triangles.read(lod_bodies);
|
|
88
|
+
triangles_data.command = triangles.create('Water lod triangles command', INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
|
|
89
|
+
triangles_data.counts = triangles.create('Water lod triangle counts', counts_descriptor(slots));
|
|
90
|
+
triangles_data.flats = triangles.create('Water lod flat counts', counts_descriptor(slots));
|
|
91
|
+
const triangle_sums = graph_prefix_scan_csdldf({ graph, data: triangles_data.counts, element_max_count: slots });
|
|
92
|
+
const flat_sums = graph_prefix_scan_csdldf({ graph, data: triangles_data.flats, element_max_count: slots });
|
|
93
|
+
|
|
94
|
+
// the candidates' dispatch; the flat triangles' records and draw
|
|
95
|
+
const command_data = {};
|
|
96
|
+
const candidate_command = graph.add('Water / lod candidate command', command_data, (d, resources, { encoder }) => {
|
|
97
|
+
const commands = resources.get(d.commands);
|
|
98
|
+
shader_water_lod_candidate_command.dispatch({ encoder, bindings: {
|
|
99
|
+
limits: encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value),
|
|
100
|
+
triangle_sums: resources.get(d.sums), flat_sums: resources.get(d.flat_sums), commands, statistics: resources.get(d.statistics) } });
|
|
101
|
+
shader_water_lod_flats.dispatchIndirect({ encoder, command: commands, command_offset: WaterLodCommand.Flats, bindings: {
|
|
102
|
+
limits: { base: layout.triangles, budget: limits.triangles }, water_meshlets: resources.get(d.meshlets),
|
|
103
|
+
flat_sums: resources.get(d.flat_sums), cells: resources.get(d.cells) } });
|
|
104
|
+
});
|
|
105
|
+
command_data.sums = candidate_command.read(triangle_sums);
|
|
106
|
+
command_data.flat_sums = candidate_command.read(flat_sums);
|
|
107
|
+
command_data.meshlets = candidate_command.read(meshlets);
|
|
108
|
+
command_data.commands = candidate_command.create('Water lod commands', BufferResourceDescriptor.from(WATER_LOD_COMMAND_BYTES,
|
|
109
|
+
GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT));
|
|
110
|
+
command_data.statistics = candidate_command.create('Water lod statistics', BufferResourceDescriptor.from(
|
|
111
|
+
WATER_LOD_STATISTICS_WORDS * 4, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC));
|
|
112
|
+
command_data.cells = candidate_command.create('Water lod cells', BufferResourceDescriptor.from(layout.words * 4, GPUBufferUsage.STORAGE));
|
|
113
|
+
|
|
114
|
+
// candidates: quadrants, rows, and how many cells of each list
|
|
115
|
+
const candidates_data = {};
|
|
116
|
+
const candidates = graph.add('Water / lod candidates', candidates_data, (d, resources, { encoder }) => {
|
|
117
|
+
shader_water_lod_candidates.dispatchIndirect({ encoder, command: resources.get(d.commands), command_offset: WaterLodCommand.Candidates,
|
|
118
|
+
bindings: { ...geometry_bindings, lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod),
|
|
119
|
+
limits: encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value), camera: resources.get(d.camera),
|
|
120
|
+
water_meshlets: resources.get(d.meshlets), lod_bodies: resources.get(d.lod_bodies), triangle_sums: resources.get(d.sums),
|
|
121
|
+
candidates: resources.get(d.candidates), candidate_rows: resources.get(d.rows),
|
|
122
|
+
cell_counts: resources.get(d.counts) } });
|
|
123
|
+
});
|
|
124
|
+
candidates_data.commands = candidates.read(command_data.commands);
|
|
125
|
+
candidates_data.camera = candidates.read(camera);
|
|
126
|
+
candidates_data.meshlets = candidates.read(meshlets);
|
|
127
|
+
candidates_data.lod_bodies = candidates.read(lod_bodies);
|
|
128
|
+
candidates_data.sums = candidates.read(triangle_sums);
|
|
129
|
+
const budget = Math.max(limits.candidates, 1);
|
|
130
|
+
candidates_data.candidates = candidates.create('Water lod candidates', BufferResourceDescriptor.from(
|
|
131
|
+
budget * WATER_LOD_CANDIDATE_STRUCT.size, GPUBufferUsage.STORAGE));
|
|
132
|
+
candidates_data.rows = candidates.create('Water lod candidate rows', BufferResourceDescriptor.from(
|
|
133
|
+
budget * WATER_LOD_CANDIDATE_ROW_WORDS * 4, GPUBufferUsage.STORAGE));
|
|
134
|
+
// the interior, boundary and patch counts of every candidate, one region after another, scanned once
|
|
135
|
+
candidates_data.counts = candidates.create('Water lod cell counts', counts_descriptor(3 * budget));
|
|
136
|
+
const list_sums = graph_prefix_scan_csdldf({ graph, data: candidates_data.counts, element_max_count: 3 * budget });
|
|
137
|
+
|
|
138
|
+
// each list's records; the boundary cells' polygons
|
|
139
|
+
const lists = [
|
|
140
|
+
{ list: WaterLodList.Interior, base: layout.interior, budget: limits.interior, command: WaterLodCommand.Cells },
|
|
141
|
+
{ list: WaterLodList.Boundary, base: layout.boundary, budget: limits.boundary, command: WaterLodCommand.Cells + 16 },
|
|
142
|
+
{ list: WaterLodList.Patch, base: layout.patches, budget: limits.patches, command: WaterLodCommand.PatchCells },
|
|
143
|
+
];
|
|
144
|
+
const cells_data = {};
|
|
145
|
+
const cells = graph.add('Water / lod cells', cells_data, (d, resources, { encoder }) => {
|
|
146
|
+
const commands = resources.get(d.commands);
|
|
147
|
+
const sums = resources.get(d.sums);
|
|
148
|
+
const limits_buffer = encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits_value);
|
|
149
|
+
shader_water_lod_draw_commands.dispatch({ encoder, bindings: { limits: limits_buffer, sums, commands,
|
|
150
|
+
statistics: resources.get(d.statistics) } });
|
|
151
|
+
const lod_buffer = encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod);
|
|
152
|
+
lists.forEach(({ list, base, budget, command }) => {
|
|
153
|
+
shader_water_lod_cells.dispatchIndirect({ encoder, command: commands, command_offset: command,
|
|
154
|
+
bindings: { meshlet_metadata: geometry_bindings.meshlet_metadata, meshlet_data: geometry_bindings.meshlet_data,
|
|
155
|
+
limits: { base, budget, list }, lod: lod_buffer, lod_limits: limits_buffer,
|
|
156
|
+
lod_bodies: resources.get(d.lod_bodies), sums, cells: resources.get(d.cells),
|
|
157
|
+
candidates: resources.get(d.candidates), candidate_rows: resources.get(d.rows) } });
|
|
158
|
+
});
|
|
23
159
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return { tiles: data.tiles, sums, count: output };
|
|
160
|
+
cells_data.commands = cells.write(cells.read(command_data.commands));
|
|
161
|
+
cells_data.statistics = cells.write(cells.read(command_data.statistics));
|
|
162
|
+
cells_data.cells = cells.write(cells.read(command_data.cells));
|
|
163
|
+
cells_data.sums = cells.read(list_sums);
|
|
164
|
+
cells_data.candidates = cells.read(candidates_data.candidates);
|
|
165
|
+
cells_data.rows = cells.read(candidates_data.rows);
|
|
166
|
+
cells_data.lod_bodies = cells.read(lod_bodies);
|
|
167
|
+
return { candidates: candidates_data.candidates, cells: cells_data.cells, commands: cells_data.commands,
|
|
168
|
+
statistics: cells_data.statistics };
|
|
34
169
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A view's lattice choice from its projection, its target's height in pixels and the setting.
|
|
3
|
+
*
|
|
4
|
+
* θ, the angle a pixel subtends at unit distance, is 2 / (height · P[1][1]); an orthographic projection gives the world
|
|
5
|
+
* size of a pixel by the same formula. A cell spans `pixels` on screen where it is smallest, at 0.7 of its level's
|
|
6
|
+
* range, so R = 1 / (0.7 · pixels · θ), and never below {@link WATER_LOD_RANGE_RATIO_MIN}.
|
|
7
|
+
*
|
|
8
|
+
* @param {ArrayLike<number>} projection column-major 4×4
|
|
9
|
+
* @param {number} height render target height, pixels
|
|
10
|
+
* @param {number} pixels the smallest a cell is drawn on screen
|
|
11
|
+
* @returns {{ranges: number, orthographic: number, level: number, distance: number, pixel: number}}
|
|
12
|
+
*/
|
|
13
|
+
export function water_lod_view(projection: ArrayLike<number>, height: number, pixels: number): {
|
|
14
|
+
ranges: number;
|
|
15
|
+
orthographic: number;
|
|
16
|
+
level: number;
|
|
17
|
+
distance: number;
|
|
18
|
+
pixel: number;
|
|
19
|
+
};
|
|
20
|
+
/** Levels of the lattice: cells of 2^(L − 10) m, 1 mm at level 0 to 16 km at level 24. */
|
|
21
|
+
export const WATER_LOD_LEVELS: 25;
|
|
22
|
+
/** Exponent of level 0's cell: 2^−10 m. */
|
|
23
|
+
export const WATER_LOD_FINEST_EXPONENT: -10;
|
|
24
|
+
/** Cells a side of a node; a quadrant is half a node. */
|
|
25
|
+
export const WATER_LOD_NODE_CELLS: 16;
|
|
26
|
+
/** Fraction of a level's range at which its odd vertices start to slide onto the coarser grid. */
|
|
27
|
+
export const WATER_LOD_MORPH_START: 0.7;
|
|
28
|
+
/**
|
|
29
|
+
* Smallest ratio of a level's range to its cell for which adjacent levels meet without cracks: a level's points lie
|
|
30
|
+
* within r_L + 16√2 s_L of the camera, which must stay inside the next level's unmorphed range, 0.7 · r_{L+1}.
|
|
31
|
+
*/
|
|
32
|
+
export const WATER_LOD_RANGE_RATIO_MIN: 64;
|
|
33
|
+
/**
|
|
34
|
+
* How one view chooses the lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1): the same for every body.
|
|
35
|
+
*/
|
|
36
|
+
export const WATER_LOD_VIEW_STRUCT: WebGPUStruct;
|
|
37
|
+
/** Lattice modes a drawn body takes. */
|
|
38
|
+
export const WaterLodMode: Readonly<{
|
|
39
|
+
/** Not drawn by this view. */
|
|
40
|
+
Hidden: 0;
|
|
41
|
+
/** No displacement it can show: its authored triangles. */
|
|
42
|
+
Flat: 1;
|
|
43
|
+
/** Cut from the lattice. */
|
|
44
|
+
Lattice: 2;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* One drawn body as one view sees it, in its metric local frame (local units times its transform's axis lengths).
|
|
48
|
+
*/
|
|
49
|
+
export const WATER_LOD_BODY_STRUCT: WebGPUStruct;
|
|
50
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
51
|
+
//# sourceMappingURL=WATER_LOD.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WATER_LOD.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/WATER_LOD.js"],"names":[],"mappings":"AAkEA;;;;;;;;;;;GAWG;AACH,2CALW,UAAU,MAAM,CAAC,UACjB,MAAM,UACN,MAAM,GACJ;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAkBlG;AA1FD,0FAA0F;AAC1F,kCAAmC;AAEnC,2CAA2C;AAC3C,4CAA6C;AAE7C,yDAAyD;AACzD,sCAAuC;AAEvC,kGAAkG;AAClG,wCAAyC;AAEzC;;;GAGG;AACH,2CAA4C;AAE5C;;GAEG;AACH,iDAW0B;AAE1B,wCAAwC;AACxC;IACI,8BAA8B;;IAE9B,2DAA2D;;IAE3D,4BAA4B;;GAE7B;AAEH;;GAEG;AACH,iDAa0B;6BA9DG,sCAAsC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { f32, u32, vec2f, vec3f } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
3
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
4
|
+
|
|
5
|
+
/** Levels of the lattice: cells of 2^(L − 10) m, 1 mm at level 0 to 16 km at level 24. */
|
|
6
|
+
export const WATER_LOD_LEVELS = 25;
|
|
7
|
+
|
|
8
|
+
/** Exponent of level 0's cell: 2^−10 m. */
|
|
9
|
+
export const WATER_LOD_FINEST_EXPONENT = -10;
|
|
10
|
+
|
|
11
|
+
/** Cells a side of a node; a quadrant is half a node. */
|
|
12
|
+
export const WATER_LOD_NODE_CELLS = 16;
|
|
13
|
+
|
|
14
|
+
/** Fraction of a level's range at which its odd vertices start to slide onto the coarser grid. */
|
|
15
|
+
export const WATER_LOD_MORPH_START = 0.7;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Smallest ratio of a level's range to its cell for which adjacent levels meet without cracks: a level's points lie
|
|
19
|
+
* within r_L + 16√2 s_L of the camera, which must stay inside the next level's unmorphed range, 0.7 · r_{L+1}.
|
|
20
|
+
*/
|
|
21
|
+
export const WATER_LOD_RANGE_RATIO_MIN = 64;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* How one view chooses the lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1): the same for every body.
|
|
25
|
+
*/
|
|
26
|
+
export const WATER_LOD_VIEW_STRUCT = WebGPUStruct.from({
|
|
27
|
+
/** R: a level's range over its cell. */
|
|
28
|
+
ranges: f32,
|
|
29
|
+
/** Non-zero for an orthographic view, which draws one level everywhere. */
|
|
30
|
+
orthographic: u32,
|
|
31
|
+
/** The orthographic view's level. */
|
|
32
|
+
level: u32,
|
|
33
|
+
/** The distance an orthographic view selects with: 0.6 of its level's range. */
|
|
34
|
+
distance: f32,
|
|
35
|
+
/** The angle a pixel subtends at unit distance; for an orthographic view, the size of a pixel. */
|
|
36
|
+
pixel: f32,
|
|
37
|
+
}, 'WaterLodView').pack();
|
|
38
|
+
|
|
39
|
+
/** Lattice modes a drawn body takes. */
|
|
40
|
+
export const WaterLodMode = Object.freeze({
|
|
41
|
+
/** Not drawn by this view. */
|
|
42
|
+
Hidden: 0,
|
|
43
|
+
/** No displacement it can show: its authored triangles. */
|
|
44
|
+
Flat: 1,
|
|
45
|
+
/** Cut from the lattice. */
|
|
46
|
+
Lattice: 2,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* One drawn body as one view sees it, in its metric local frame (local units times its transform's axis lengths).
|
|
51
|
+
*/
|
|
52
|
+
export const WATER_LOD_BODY_STRUCT = WebGPUStruct.from({
|
|
53
|
+
/** The camera in the body's metric local frame. */
|
|
54
|
+
camera: vec3f,
|
|
55
|
+
/** Distance from the camera to the body's rest height range, metric; zero inside it. */
|
|
56
|
+
vertical: f32,
|
|
57
|
+
/** Metres per local unit along each local axis. */
|
|
58
|
+
scale: vec3f,
|
|
59
|
+
/** A {@link WaterLodMode}. */
|
|
60
|
+
mode: u32,
|
|
61
|
+
/** The body's displacement bounds, metric: vertical, horizontal. */
|
|
62
|
+
bounds: vec2f,
|
|
63
|
+
/** The body's rest height range, local units. */
|
|
64
|
+
rest: vec2f,
|
|
65
|
+
}, 'WaterLodBody').pack();
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* A view's lattice choice from its projection, its target's height in pixels and the setting.
|
|
69
|
+
*
|
|
70
|
+
* θ, the angle a pixel subtends at unit distance, is 2 / (height · P[1][1]); an orthographic projection gives the world
|
|
71
|
+
* size of a pixel by the same formula. A cell spans `pixels` on screen where it is smallest, at 0.7 of its level's
|
|
72
|
+
* range, so R = 1 / (0.7 · pixels · θ), and never below {@link WATER_LOD_RANGE_RATIO_MIN}.
|
|
73
|
+
*
|
|
74
|
+
* @param {ArrayLike<number>} projection column-major 4×4
|
|
75
|
+
* @param {number} height render target height, pixels
|
|
76
|
+
* @param {number} pixels the smallest a cell is drawn on screen
|
|
77
|
+
* @returns {{ranges: number, orthographic: number, level: number, distance: number, pixel: number}}
|
|
78
|
+
*/
|
|
79
|
+
export function water_lod_view(projection, height, pixels) {
|
|
80
|
+
assert.greaterThan(height, 0, 'height');
|
|
81
|
+
assert.greaterThan(pixels, 0, 'pixels');
|
|
82
|
+
const theta = 2 / (height * Math.abs(projection[5]));
|
|
83
|
+
assert.isFinite(theta, 'pixel angle');
|
|
84
|
+
const ranges = Math.max(WATER_LOD_RANGE_RATIO_MIN, 1 / (WATER_LOD_MORPH_START * pixels * theta));
|
|
85
|
+
// a perspective projection writes −1 (or 1) into w from z; an orthographic one leaves w at 1
|
|
86
|
+
const orthographic = projection[11] === 0 ? 1 : 0;
|
|
87
|
+
let level = 0, distance = 0;
|
|
88
|
+
if (orthographic !== 0) {
|
|
89
|
+
// the coarsest cell no larger than the target
|
|
90
|
+
level = Math.min(WATER_LOD_LEVELS - 1, Math.max(0,
|
|
91
|
+
Math.floor(Math.log2(pixels * theta)) - WATER_LOD_FINEST_EXPONENT));
|
|
92
|
+
distance = 0.6 * ranges * 2 ** (level + WATER_LOD_FINEST_EXPONENT);
|
|
93
|
+
}
|
|
94
|
+
return { ranges, orthographic, level, distance, pixel: theta };
|
|
95
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The distance LOD lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1) as pure functions of a view, a
|
|
3
|
+
* body and a point of the body's metric local xz. Selection, morph and footprint all derive from one distance, so the
|
|
4
|
+
* passes that choose cells and the vertex stage that draws them agree to the bit.
|
|
5
|
+
*
|
|
6
|
+
* @type {CodeChunk}
|
|
7
|
+
*/
|
|
8
|
+
export const chunk_water_lod: CodeChunk;
|
|
9
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
10
|
+
//# sourceMappingURL=chunk_water_lod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_water_lod.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/chunk_water_lod.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,8BAFU,SAAS,CA+GoE;0BA9H7D,uCAAuC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import {
|
|
3
|
+
WATER_LOD_BODY_STRUCT,
|
|
4
|
+
WATER_LOD_FINEST_EXPONENT,
|
|
5
|
+
WATER_LOD_LEVELS,
|
|
6
|
+
WATER_LOD_MORPH_START,
|
|
7
|
+
WATER_LOD_NODE_CELLS,
|
|
8
|
+
WATER_LOD_VIEW_STRUCT
|
|
9
|
+
} from "./WATER_LOD.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The distance LOD lattice (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.1) as pure functions of a view, a
|
|
13
|
+
* body and a point of the body's metric local xz. Selection, morph and footprint all derive from one distance, so the
|
|
14
|
+
* passes that choose cells and the vertex stage that draws them agree to the bit.
|
|
15
|
+
*
|
|
16
|
+
* @type {CodeChunk}
|
|
17
|
+
*/
|
|
18
|
+
export const chunk_water_lod = CodeChunk.from(/* language=WGSL */ `
|
|
19
|
+
const WATER_LOD_LEVELS: u32 = ${WATER_LOD_LEVELS}u;
|
|
20
|
+
const WATER_LOD_FINEST_EXPONENT: f32 = ${WATER_LOD_FINEST_EXPONENT}.0;
|
|
21
|
+
const WATER_LOD_NODE_CELLS: i32 = ${WATER_LOD_NODE_CELLS};
|
|
22
|
+
const WATER_LOD_QUADRANT_CELLS: i32 = ${WATER_LOD_NODE_CELLS / 2};
|
|
23
|
+
const WATER_LOD_MORPH_START: f32 = ${WATER_LOD_MORPH_START};
|
|
24
|
+
const WATER_LOD_COARSEST: u32 = ${WATER_LOD_LEVELS - 1}u;
|
|
25
|
+
|
|
26
|
+
// Edge of a level's cells, metres: a power of two, so a lattice coordinate times it is exact in f32.
|
|
27
|
+
fn water_lod_cell(level: u32) -> f32 {
|
|
28
|
+
return exp2(f32(level) + WATER_LOD_FINEST_EXPONENT);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fn water_lod_range(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, level: u32) -> f32 {
|
|
32
|
+
return view.ranges * water_lod_cell(level);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The distance the lattice is chosen by: from the camera to the point horizontally, and to the body's rest height
|
|
36
|
+
// range vertically. An orthographic view has one distance everywhere.
|
|
37
|
+
fn water_lod_distance(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, p: vec2<f32>) -> f32 {
|
|
38
|
+
if (view.orthographic != 0u) { return view.distance; }
|
|
39
|
+
let d = p - body.camera.xz;
|
|
40
|
+
return sqrt(dot(d, d) + body.vertical * body.vertical);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The least distance over the square lo … hi of metric local xz.
|
|
44
|
+
fn water_lod_nearest(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, lo: vec2<f32>, hi: vec2<f32>) -> f32 {
|
|
45
|
+
if (view.orthographic != 0u) { return view.distance; }
|
|
46
|
+
let d = max(max(lo - body.camera.xz, body.camera.xz - hi), vec2<f32>(0.0));
|
|
47
|
+
return sqrt(dot(d, d) + body.vertical * body.vertical);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// The greatest distance over the square lo … hi.
|
|
51
|
+
fn water_lod_farthest(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, lo: vec2<f32>, hi: vec2<f32>) -> f32 {
|
|
52
|
+
if (view.orthographic != 0u) { return view.distance; }
|
|
53
|
+
let d = max(abs(lo - body.camera.xz), abs(hi - body.camera.xz));
|
|
54
|
+
return sqrt(dot(d, d) + body.vertical * body.vertical);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Node n of a level: its corners in metric local xz.
|
|
58
|
+
fn water_lod_node_lo(level: u32, node: vec2<i32>) -> vec2<f32> {
|
|
59
|
+
return vec2<f32>(node * WATER_LOD_NODE_CELLS) * water_lod_cell(level);
|
|
60
|
+
}
|
|
61
|
+
fn water_lod_node_hi(level: u32, node: vec2<i32>) -> vec2<f32> {
|
|
62
|
+
return vec2<f32>((node + vec2<i32>(1)) * WATER_LOD_NODE_CELLS) * water_lod_cell(level);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Quadrant q (0 … 3, x then z) of a node: its first cell.
|
|
66
|
+
fn water_lod_quadrant_origin(node: vec2<i32>, quadrant: u32) -> vec2<i32> {
|
|
67
|
+
return node * WATER_LOD_NODE_CELLS + vec2<i32>(i32(quadrant & 1u), i32(quadrant >> 1u)) * WATER_LOD_QUADRANT_CELLS;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// CDLOD's rule in closed form: a node exists at its level when it reaches into the level's range; the coarsest level
|
|
71
|
+
// takes whatever is beyond every range.
|
|
72
|
+
fn water_lod_node_exists(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, node: vec2<i32>) -> bool {
|
|
73
|
+
if (view.orthographic != 0u) { return level == view.level; }
|
|
74
|
+
if (level >= WATER_LOD_COARSEST) { return true; }
|
|
75
|
+
return water_lod_nearest(view, body, water_lod_node_lo(level, node), water_lod_node_hi(level, node)) <= water_lod_range(view, level);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ... and an existing node's quadrant is drawn at its level unless all of it lies beyond the finer level's range.
|
|
79
|
+
fn water_lod_quadrant_drawn(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, node: vec2<i32>, quadrant: u32) -> bool {
|
|
80
|
+
if (view.orthographic != 0u || level == 0u) { return true; }
|
|
81
|
+
let cell = water_lod_cell(level);
|
|
82
|
+
let lo = vec2<f32>(water_lod_quadrant_origin(node, quadrant)) * cell;
|
|
83
|
+
let hi = vec2<f32>(water_lod_quadrant_origin(node, quadrant) + vec2<i32>(WATER_LOD_QUADRANT_CELLS)) * cell;
|
|
84
|
+
return water_lod_nearest(view, body, lo, hi) > water_lod_range(view, level - 1u);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// How far a lattice point at this distance has slid towards the next level's grid, 0 … 1.
|
|
88
|
+
fn water_lod_morph(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, level: u32, distance: f32) -> f32 {
|
|
89
|
+
if (view.orthographic != 0u || level >= WATER_LOD_COARSEST) { return 0.0; }
|
|
90
|
+
let range = water_lod_range(view, level);
|
|
91
|
+
return clamp((distance - WATER_LOD_MORPH_START * range) / ((1.0 - WATER_LOD_MORPH_START) * range), 0.0, 1.0);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A lattice point of a level after its morph, metric local xz: an odd coordinate slides k cells down onto the even
|
|
95
|
+
// one, k taken where the point would be unmorphed. Exact for k = 0 and k = 1, so where two levels meet the finer
|
|
96
|
+
// one's points land on the coarser one's.
|
|
97
|
+
fn water_lod_lattice_point(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, point: vec2<i32>) -> vec2<f32> {
|
|
98
|
+
let cell = water_lod_cell(level);
|
|
99
|
+
let k = water_lod_morph(view, level, water_lod_distance(view, body, vec2<f32>(point) * cell));
|
|
100
|
+
let odd = vec2<f32>(vec2<i32>(point.x & 1, point.y & 1));
|
|
101
|
+
return (vec2<f32>(point) - odd * k) * cell;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// The spacing the waves are filtered by at a vertex of a cell of this level, from the vertex's own position, so two
|
|
105
|
+
// cells — of one level, or of two meeting levels where the finer is fully morphed and the coarser not at all — that
|
|
106
|
+
// generate the same vertex filter it alike.
|
|
107
|
+
fn water_lod_footprint(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, body: ${WATER_LOD_BODY_STRUCT.wgsl_ref}, level: u32, p: vec2<f32>) -> f32 {
|
|
108
|
+
return water_lod_cell(level) * (1.0 + water_lod_morph(view, level, water_lod_distance(view, body, p)));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The levels that can draw points between these distances: a point drawn at level L lies beyond r_{L−1} and within
|
|
112
|
+
// r_L + 16√2 s_L. (x: finest, y: coarsest, inclusive.)
|
|
113
|
+
fn water_lod_level_span(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, nearest: f32, farthest: f32) -> vec2<u32> {
|
|
114
|
+
if (view.orthographic != 0u) { return vec2<u32>(view.level); }
|
|
115
|
+
let reach = view.ranges + f32(WATER_LOD_NODE_CELLS) * 1.41421356;
|
|
116
|
+
let finest = clamp(floor(log2(max(nearest, 1e-30) / reach)) - WATER_LOD_FINEST_EXPONENT, 0.0, f32(WATER_LOD_COARSEST));
|
|
117
|
+
let coarsest = clamp(ceil(log2(max(2.0 * farthest, 1e-30) / view.ranges)) - WATER_LOD_FINEST_EXPONENT, 0.0, f32(WATER_LOD_COARSEST));
|
|
118
|
+
return vec2<u32>(u32(finest), u32(max(finest, coarsest)));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// The finest footprint any vertex at least this far away can be drawn with.
|
|
122
|
+
fn water_lod_footprint_min(view: ${WATER_LOD_VIEW_STRUCT.wgsl_ref}, nearest: f32) -> f32 {
|
|
123
|
+
if (view.orthographic != 0u) { return water_lod_cell(view.level); }
|
|
124
|
+
let reach = view.ranges + f32(WATER_LOD_NODE_CELLS) * 1.41421356;
|
|
125
|
+
return max(water_lod_cell(0u), nearest / reach);
|
|
126
|
+
}
|
|
127
|
+
`, [WATER_LOD_VIEW_STRUCT.declaration_chunk, WATER_LOD_BODY_STRUCT.declaration_chunk]);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A lattice cell cut by an authored triangle in the body's metric local xz
|
|
3
|
+
* (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.2).
|
|
4
|
+
*
|
|
5
|
+
* Every point is identified by what it lies on — a cell corner, an authored corner, or a cell edge crossing an
|
|
6
|
+
* authored edge — and its position, rest height and normal are computed from that identity alone, with each edge
|
|
7
|
+
* taken in a fixed endpoint order (the lesser in x, then z, first). So two triangles sharing an edge, and two cells or
|
|
8
|
+
* two levels sharing a seam, produce the same f32 vertices whichever way round they walk them.
|
|
9
|
+
*
|
|
10
|
+
* Point bits: the authored edges 1 (b–c), 2 (c–a), 4 (a–b); the cell edges 16 (corner 0 → 1), 32 (1 → 2), 64 (2 → 3),
|
|
11
|
+
* 128 (3 → 0), corners 0 … 3 at (x0, z0), (x1, z0), (x1, z1), (x0, z1).
|
|
12
|
+
*
|
|
13
|
+
* @type {CodeChunk}
|
|
14
|
+
*/
|
|
15
|
+
export const chunk_water_lod_cell: CodeChunk;
|
|
16
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
17
|
+
//# sourceMappingURL=chunk_water_lod_cell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_water_lod_cell.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,mCAFU,SAAS,CAsOG;0BArPI,uCAAuC"}
|