@woosh/meep-engine 3.41.0 → 3.43.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 +91 -96
- 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/vgeo_runtime/README.md +5 -4
- 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/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +6 -5
- 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/atmosphere/GPUSky.d.ts +12 -0
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +162 -147
- 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/lightmap/bake/shader_lightmap_denoise_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +10 -3
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +13 -9
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.d.ts +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_lighting.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +9 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +23 -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/volumetrics/GPUViewVolumetrics.d.ts +4 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +74 -3
- package/src/shade/renderer/volumetrics/NOTES.md +1023 -957
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts +5 -4
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_irradiance_sh.js +5 -4
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.d.ts +1 -1
- package/src/shade/renderer/volumetrics/gi/chunk_volumetrics_gi.js +1 -1
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.d.ts +1 -1
- package/src/shade/renderer/volumetrics/gi/graph_build_froxel_gi.js +1 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +41 -0
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +112 -0
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +9 -23
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +18 -126
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts +22 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_irradiance.js +228 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js +0 -53
- 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 +23 -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 +227 -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 +274 -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 +57 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +43 -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 +268 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +20 -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 +239 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +153 -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 +874 -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 +29 -9
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +14 -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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { CAMERA_UNIFORM_STRUCT } from "../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
2
|
+
import { chunk_light_cluster_counts } from "../light/cluster/chunk_light_cluster_counts.js";
|
|
3
|
+
import { chunk_light_cluster_metadata_by_position } from "../light/cluster/chunk_light_cluster_metadata_by_position.js";
|
|
4
|
+
import { LIGHT_CLUSTER_LOOKUP_STRUCT } from "../light/cluster/shader_cluster_assign_lights.js";
|
|
5
|
+
import { chunk_cluster_depth_from_z_slice } from "../light/cluster/chunk_cluster_depth_from_z_slice.js";
|
|
6
|
+
import { chunk_camera_ray_from_uv } from "../shader/chunk/geometry/ray/chunk_camera_ray_from_uv.js";
|
|
7
|
+
import { RAY_STRUCT } from "../shader/chunk/geometry/ray/RAY_STRUCT.js";
|
|
8
|
+
import { chunk_stbn_sample_vec3 } from "../shader/chunk/noise/chunk_stbn_sample_vec3.js";
|
|
9
|
+
import {
|
|
10
|
+
chunk_directional_lights_iteration_mask
|
|
11
|
+
} from "../shader/chunk/light/io/chunk_directional_lights_iteration_mask.js";
|
|
12
|
+
import {
|
|
13
|
+
chunk_get_directional_light_info_by_index
|
|
14
|
+
} from "../shader/chunk/light/io/chunk_get_directional_light_info_by_index.js";
|
|
15
|
+
import {
|
|
16
|
+
chunk_get_point_light_info_by_index
|
|
17
|
+
} from "../shader/chunk/light/io/chunk_get_point_light_info_by_index.js";
|
|
18
|
+
import { chunk_get_spot_light_info_by_index } from "../shader/chunk/light/io/chunk_get_spot_light_info_by_index.js";
|
|
19
|
+
import {
|
|
20
|
+
METRO_L1_IRRADIANCE_STRUCT
|
|
21
|
+
} from "../shader/chunk/spherical_harmonics/l1i/chunk_convert_to_irradiance_sh.js";
|
|
22
|
+
import { chunk_texel_coordinate_to_uv } from "../shader/chunk/texture/chunk_texel_coordinate_to_uv.js";
|
|
23
|
+
import { chunk_uv_to_texel_coordinate } from "../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
|
|
24
|
+
import { CodeChunk } from "../shader/compiler/CodeChunk.js";
|
|
25
|
+
import { ComputeShader } from "../shader/ComputeShader.js";
|
|
26
|
+
import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
|
|
27
|
+
import { vec3f } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
28
|
+
import { WebGPUArray } from "../shader/type/WebGPUArray.js";
|
|
29
|
+
import { chunk_shadowmap_get_light_visibility } from "../shadow/map/shader/chunk_shadowmap_get_light_visibility.js";
|
|
30
|
+
import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
|
|
31
|
+
import { VIEW_UNIFORM_STRUCT } from "../view/VIEW_UNIFORM_STRUCT.js";
|
|
32
|
+
import { chunk_volumetrics_irradiance_sh } from "./chunk_volumetrics_irradiance_sh.js";
|
|
33
|
+
import { chunk_volumetrics_local_light_shadow } from "./chunk_volumetrics_local_light_shadow.js";
|
|
34
|
+
import { chunk_camera_ray_planar_depth_scale } from "./chunk_camera_ray_planar_depth_scale.js";
|
|
35
|
+
import { chunk_volumetrics_column_jitter } from "./chunk_volumetrics_column_jitter.js";
|
|
36
|
+
import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Workgroup shape of this pass, `[x, y, z]` in froxels, stated to the `@workgroup_size` below and
|
|
40
|
+
* read back out of it by the dispatch. Flat in z and 64 invocations, for the reasons the fog's
|
|
41
|
+
* lighting pass gives (`VOLUMETRICS_LIGHTING_WORKGROUP_RESOLUTION`): it walks the same light
|
|
42
|
+
* clusters, and those are farthest apart along depth.
|
|
43
|
+
*
|
|
44
|
+
* @type {number[]}
|
|
45
|
+
*/
|
|
46
|
+
export const VOLUMETRICS_IRRADIANCE_WORKGROUP_RESOLUTION = [8, 8, 1];
|
|
47
|
+
|
|
48
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
49
|
+
|
|
50
|
+
// The froxel irradiance volume (chunk_volumetrics_irradiance_sh): luma SH2 in one, chroma in the .rg
|
|
51
|
+
// of the other. rgba16float for both, because rg16float is not a storage format without
|
|
52
|
+
// texture-formats-tier1. It starts from what the froxel GI stage (gi/) wrote to tGIY / tGICoCg.
|
|
53
|
+
resources.createGroup()
|
|
54
|
+
.addUniform("volumetrics_metadata", VOLUMETRICS_METADATA_STRUCT)
|
|
55
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
56
|
+
.addUniform("view", VIEW_UNIFORM_STRUCT)
|
|
57
|
+
.addTexture("tSTBN_vec3", "unfilterable-float", "3d")
|
|
58
|
+
.addTexture("tGIY", "float", "3d")
|
|
59
|
+
.addTexture("tGICoCg", "float", "3d")
|
|
60
|
+
.addStorageTexture("tIrradianceY", "rgba16float", "3d", "write-only")
|
|
61
|
+
.addStorageTexture("tIrradianceCoCg", "rgba16float", "3d", "write-only");
|
|
62
|
+
|
|
63
|
+
// Lighting information
|
|
64
|
+
resources.createGroup()
|
|
65
|
+
.addStorageBuffer("light_data", WebGPUArray.u32)
|
|
66
|
+
// clusters
|
|
67
|
+
.addUniform("cluster_parameters", vec3f)
|
|
68
|
+
.addStorageBuffer("cluster_lookup", LIGHT_CLUSTER_LOOKUP_STRUCT)
|
|
69
|
+
.addStorageBuffer("cluster_data", WebGPUArray.u32)
|
|
70
|
+
// shadows
|
|
71
|
+
.addTexture("shadowmapAtlas", "depth")
|
|
72
|
+
.addSampler("sCompareLinear", "comparison", SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR);
|
|
73
|
+
|
|
74
|
+
const body = CodeChunk.from(
|
|
75
|
+
//language=WGSL
|
|
76
|
+
`
|
|
77
|
+
@compute @workgroup_size(${VOLUMETRICS_IRRADIANCE_WORKGROUP_RESOLUTION.join(",")})
|
|
78
|
+
fn main(
|
|
79
|
+
@builtin(global_invocation_id) voxel : vec3<u32>
|
|
80
|
+
){
|
|
81
|
+
let resolution = textureDimensions(tIrradianceY);
|
|
82
|
+
|
|
83
|
+
if (any(voxel >= resolution)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The fog lighting pass's sample, taken the same way (shader_volumetrics_build_lighting, where
|
|
88
|
+
// the irradiance was written until it had a pass of its own): one point per froxel per frame,
|
|
89
|
+
// jittered across the slab in depth by the column jitter and the blue noise, and in xy by the
|
|
90
|
+
// blue noise. Never a fixed point. A particle spans many froxels and reads them trilinearly, and
|
|
91
|
+
// a lattice of samples that never moves shows on it as seams wherever neighbouring texels
|
|
92
|
+
// disagree — beside a light, along a shadow edge. Moved every frame, the lattice is resolved by
|
|
93
|
+
// the main TAA, which the particles are drawn ahead of.
|
|
94
|
+
let near_far = camera.clip_near_far;
|
|
95
|
+
let curve = volumetrics_metadata.froxel_cluster_parameters;
|
|
96
|
+
|
|
97
|
+
let z_jitter = volumetrics_column_jitter(voxel.xy, view.frame_index);
|
|
98
|
+
|
|
99
|
+
let z0 = max(near_far.x, cluster_depth_from_z_slice(f32(voxel.z) + z_jitter, curve, f32(resolution.z)));
|
|
100
|
+
let z1 = min(near_far.y, cluster_depth_from_z_slice(f32(voxel.z + 1u) + z_jitter, curve, f32(resolution.z)));
|
|
101
|
+
|
|
102
|
+
// the lighting pass's offset and temporal axis, so the two passes ask about the same point
|
|
103
|
+
const STBN_DECORRELATION_OFFSET = vec2<u32>(37u, 71u);
|
|
104
|
+
|
|
105
|
+
let noise = stbn_sample_vec3(vec3(voxel.xy + STBN_DECORRELATION_OFFSET, view.frame_index + voxel.z));
|
|
106
|
+
|
|
107
|
+
// interpolate the cubes, then take the cube root: uniform in world-space volume across the slab
|
|
108
|
+
let view_depth = pow(mix(z0 * z0 * z0, z1 * z1 * z1, noise.z), 0.333333);
|
|
109
|
+
|
|
110
|
+
let tile_uv = saturate(texel_coordinate_to_uv(vec2<f32>(voxel.xy) + (noise.xy - 0.5), resolution.xy));
|
|
111
|
+
let view_ray = camera_ray_from_uv(tile_uv, camera);
|
|
112
|
+
|
|
113
|
+
// view_depth is planar, so step the ray by the planar-to-distance scale
|
|
114
|
+
let position_ws = view_ray.origin
|
|
115
|
+
+ view_ray.direction * (view_depth * camera_ray_planar_depth_scale(view_ray.direction, camera));
|
|
116
|
+
|
|
117
|
+
let view_pixel_coord = uv_to_texel_coordinate(tile_uv, vec2(view.width, view.height));
|
|
118
|
+
|
|
119
|
+
var irradiance: ${METRO_L1_IRRADIANCE_STRUCT.wgsl_ref};
|
|
120
|
+
|
|
121
|
+
// Each light as the surfaces around the froxel receive it: its colour and its shadow, and no
|
|
122
|
+
// medium on the way in. The deferred and forward paths light meshes by exactly this, and a lit
|
|
123
|
+
// particle beside a lit log has to agree with it — the fog is composited over both afterwards.
|
|
124
|
+
|
|
125
|
+
var directional_bits = directional_lights_iteration_mask(&light_data);
|
|
126
|
+
while (directional_bits != 0u) {
|
|
127
|
+
let directional_index = countTrailingZeros(directional_bits);
|
|
128
|
+
directional_bits &= ~(1u << directional_index);
|
|
129
|
+
|
|
130
|
+
let sun = get_directional_light_info_by_index(&light_data, directional_index);
|
|
131
|
+
|
|
132
|
+
let shadow_term = shadowmap_get_directional_light_visibility(
|
|
133
|
+
&light_data,
|
|
134
|
+
directional_index,
|
|
135
|
+
position_ws,
|
|
136
|
+
// toward-camera, the deferred cascade-blend convention; view_ray runs camera->scene
|
|
137
|
+
-view_ray.direction,
|
|
138
|
+
sun.direction
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
irradiance = volumetrics_irradiance_sh_add(irradiance, shadow_term * sun.color, sun.direction);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
let cluster_metadata = light_cluster_metadata_by_position(
|
|
145
|
+
view_pixel_coord,
|
|
146
|
+
view_depth,
|
|
147
|
+
vec2(view.width, view.height)
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
let cluster_offset = cluster_metadata.offset;
|
|
151
|
+
let point_count = light_cluster_count_point(cluster_metadata.counts);
|
|
152
|
+
let spot_count = light_cluster_count_spot(cluster_metadata.counts);
|
|
153
|
+
|
|
154
|
+
for (var j = 0u; j < point_count; j++) {
|
|
155
|
+
let light_index = cluster_data[cluster_offset + j];
|
|
156
|
+
let direct_light = get_point_light_info_by_index(&light_data, light_index, position_ws);
|
|
157
|
+
|
|
158
|
+
if (all(direct_light.color == vec3(0.0))) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let shadow_term = volumetrics_point_light_shadow(&light_data, light_index, position_ws);
|
|
163
|
+
|
|
164
|
+
irradiance = volumetrics_irradiance_sh_add(irradiance, shadow_term * direct_light.color, direct_light.direction);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
for (var k = 0u; k < spot_count; k++) {
|
|
168
|
+
let light_index = cluster_data[cluster_offset + point_count + k];
|
|
169
|
+
let direct_light = get_spot_light_info_by_index(&light_data, light_index, position_ws);
|
|
170
|
+
|
|
171
|
+
if (all(direct_light.color == vec3(0.0))) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
let shadow_term = volumetrics_spot_light_shadow(&light_data, light_index, position_ws);
|
|
176
|
+
|
|
177
|
+
irradiance = volumetrics_irradiance_sh_add(irradiance, shadow_term * direct_light.color, direct_light.direction);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// What the renderer's indirect lighting gives this froxel, in the same encoding; the lights add
|
|
181
|
+
// to it. Written by the froxel GI module the mode selects, which is all this pass knows of GI.
|
|
182
|
+
irradiance.Y += textureLoad(tGIY, voxel, 0);
|
|
183
|
+
irradiance.CoCg += textureLoad(tGICoCg, voxel, 0).xy;
|
|
184
|
+
|
|
185
|
+
// nothing filters this volume, so nothing downstream would stop an Inf or a NaN here
|
|
186
|
+
let stored = volumetrics_irradiance_sh_storable(irradiance);
|
|
187
|
+
|
|
188
|
+
textureStore(tIrradianceY, voxel, stored.Y);
|
|
189
|
+
textureStore(tIrradianceCoCg, voxel, vec4<f32>(stored.CoCg, 0.0, 0.0));
|
|
190
|
+
}
|
|
191
|
+
`, [
|
|
192
|
+
METRO_L1_IRRADIANCE_STRUCT.declaration_chunk,
|
|
193
|
+
RAY_STRUCT.declaration_chunk,
|
|
194
|
+
chunk_volumetrics_column_jitter,
|
|
195
|
+
chunk_cluster_depth_from_z_slice,
|
|
196
|
+
chunk_stbn_sample_vec3,
|
|
197
|
+
chunk_texel_coordinate_to_uv,
|
|
198
|
+
chunk_uv_to_texel_coordinate,
|
|
199
|
+
chunk_camera_ray_from_uv,
|
|
200
|
+
chunk_camera_ray_planar_depth_scale,
|
|
201
|
+
|
|
202
|
+
chunk_light_cluster_metadata_by_position,
|
|
203
|
+
chunk_light_cluster_counts,
|
|
204
|
+
chunk_directional_lights_iteration_mask,
|
|
205
|
+
chunk_get_directional_light_info_by_index,
|
|
206
|
+
chunk_get_point_light_info_by_index,
|
|
207
|
+
chunk_get_spot_light_info_by_index,
|
|
208
|
+
chunk_shadowmap_get_light_visibility,
|
|
209
|
+
chunk_volumetrics_local_light_shadow,
|
|
210
|
+
chunk_volumetrics_irradiance_sh,
|
|
211
|
+
]
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* The froxel irradiance volume (`chunk_volumetrics_irradiance_sh`): what a lit particle standing in a
|
|
216
|
+
* froxel is lit by. Starts from the froxel GI stage's volume and adds every directional, point and
|
|
217
|
+
* spot light with its shadow, at a point jittered through the froxel every frame.
|
|
218
|
+
*
|
|
219
|
+
* Its own pass, not a by-product of the fog's lighting pass: particle lighting needs no medium, so it
|
|
220
|
+
* runs whether or not the scene has any fog, and the frame graph culls it when nothing reads it.
|
|
221
|
+
*
|
|
222
|
+
* @type {ComputeShader}
|
|
223
|
+
*/
|
|
224
|
+
export const shader_volumetrics_build_irradiance = ComputeShader.from({
|
|
225
|
+
label: "Volumetrics / build irradiance",
|
|
226
|
+
resources,
|
|
227
|
+
body,
|
|
228
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_volumetrics_build_lighting.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/shader_volumetrics_build_lighting.js"],"names":[],"mappings":"AA6CA;;;;;;;;;;;;;;;GAeG;AACH,wDAFU,MAAM,EAAE,CAEiD;AAiXnE,8DAIE;8BA9Z4B,4BAA4B"}
|
|
@@ -41,10 +41,6 @@ import {
|
|
|
41
41
|
import { VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT } from "./VOLUMETRICS_SUN_SHADOW_RESOLUTION.js";
|
|
42
42
|
import { chunk_volumetrics_column_jitter } from "./chunk_volumetrics_column_jitter.js";
|
|
43
43
|
import { chunk_volumetrics_local_light_shadow } from "./chunk_volumetrics_local_light_shadow.js";
|
|
44
|
-
import { chunk_volumetrics_irradiance_sh } from "./chunk_volumetrics_irradiance_sh.js";
|
|
45
|
-
import {
|
|
46
|
-
METRO_L1_IRRADIANCE_STRUCT
|
|
47
|
-
} from "../shader/chunk/spherical_harmonics/l1i/chunk_convert_to_irradiance_sh.js";
|
|
48
44
|
import { VOLUMETRICS_METADATA_STRUCT } from "./VOLUMETRICS_METADATA_STRUCT.js";
|
|
49
45
|
|
|
50
46
|
/**
|
|
@@ -87,14 +83,6 @@ for (let cascade = 0; cascade < VOLUMETRICS_SUN_SHADOW_CASCADE_COUNT; cascade++)
|
|
|
87
83
|
|
|
88
84
|
primary_group.addStorageTexture("tLighting", "rgba16float", "3d", "write-only")
|
|
89
85
|
|
|
90
|
-
// The froxel irradiance volume (chunk_volumetrics_irradiance_sh): luma SH2 in one, chroma in the
|
|
91
|
-
// .rg of the other. rgba16float for both, because rg16float is not a storage format without
|
|
92
|
-
// texture-formats-tier1. It is what the froxel GI stage (gi/) wrote to tGIY / tGICoCg, plus the lights.
|
|
93
|
-
primary_group.addTexture("tGIY", "float", "3d")
|
|
94
|
-
primary_group.addTexture("tGICoCg", "float", "3d")
|
|
95
|
-
primary_group.addStorageTexture("tIrradianceY", "rgba16float", "3d", "write-only")
|
|
96
|
-
primary_group.addStorageTexture("tIrradianceCoCg", "rgba16float", "3d", "write-only")
|
|
97
|
-
|
|
98
86
|
// Lighting information
|
|
99
87
|
resources.createGroup()
|
|
100
88
|
|
|
@@ -144,11 +132,6 @@ fn main(
|
|
|
144
132
|
var inScatteringSum = vec3<f32>(0.0);
|
|
145
133
|
var extinctionSum = 0.0;
|
|
146
134
|
|
|
147
|
-
// What a transparent surface at the sample receives from the same lights: their shadowed
|
|
148
|
-
// colour, attenuated by the medium toward each light, before any scattering by it.
|
|
149
|
-
var irradianceSum: ${METRO_L1_IRRADIANCE_STRUCT.wgsl_ref};
|
|
150
|
-
|
|
151
|
-
|
|
152
135
|
// One sample per froxel. The 0.95-blend TAA downstream is a ~39-effective-sample temporal
|
|
153
136
|
// integrator; supersampling here as well spends N times this pass removing variance that filter
|
|
154
137
|
// removes anyway — and spends it at the Monte Carlo rate, because the samples were independent
|
|
@@ -313,15 +296,6 @@ fn main(
|
|
|
313
296
|
);
|
|
314
297
|
|
|
315
298
|
inScatteringSum += shadow_term * ms * transmittance_atmospheric * sun.color;
|
|
316
|
-
|
|
317
|
-
// No atmospheric transmittance: that is the air's, and a surface in the volume is lit
|
|
318
|
-
// the way the surfaces around it are — the deferred and forward paths light meshes by
|
|
319
|
-
// sun.color as it stands, and a lit particle beside a lit log has to agree with it.
|
|
320
|
-
irradianceSum = volumetrics_irradiance_sh_add(
|
|
321
|
-
irradianceSum,
|
|
322
|
-
shadow_term * exp(-optical_depth) * sun.color,
|
|
323
|
-
sun.direction
|
|
324
|
-
);
|
|
325
299
|
}
|
|
326
300
|
|
|
327
301
|
// Local lights
|
|
@@ -374,12 +348,6 @@ fn main(
|
|
|
374
348
|
let shadow_term = volumetrics_point_light_shadow(&light_data, light_index, position_ws);
|
|
375
349
|
|
|
376
350
|
inScatteringSum += shadow_term * ms * direct_light.color;
|
|
377
|
-
|
|
378
|
-
irradianceSum = volumetrics_irradiance_sh_add(
|
|
379
|
-
irradianceSum,
|
|
380
|
-
shadow_term * exp(-optical_depth) * direct_light.color,
|
|
381
|
-
direct_light.direction
|
|
382
|
-
);
|
|
383
351
|
}
|
|
384
352
|
|
|
385
353
|
for (var k = 0u; k < spot_count; k++) {
|
|
@@ -415,12 +383,6 @@ fn main(
|
|
|
415
383
|
let shadow_term = volumetrics_spot_light_shadow(&light_data, light_index, position_ws);
|
|
416
384
|
|
|
417
385
|
inScatteringSum += shadow_term * ms * direct_light.color;
|
|
418
|
-
|
|
419
|
-
irradianceSum = volumetrics_irradiance_sh_add(
|
|
420
|
-
irradianceSum,
|
|
421
|
-
shadow_term * exp(-optical_depth) * direct_light.color,
|
|
422
|
-
direct_light.direction
|
|
423
|
-
);
|
|
424
386
|
}
|
|
425
387
|
}
|
|
426
388
|
|
|
@@ -435,20 +397,6 @@ fn main(
|
|
|
435
397
|
let extinction = extinctionSum / f32(SAMPLE_COUNT);
|
|
436
398
|
|
|
437
399
|
textureStore(tLighting, voxel_coord, vec4<f32>(inScattering, extinction));
|
|
438
|
-
|
|
439
|
-
irradianceSum.Y /= f32(SAMPLE_COUNT);
|
|
440
|
-
irradianceSum.CoCg /= f32(SAMPLE_COUNT);
|
|
441
|
-
|
|
442
|
-
// What the renderer's indirect lighting gives this froxel, in the same encoding; the lights add
|
|
443
|
-
// to it. Written by the froxel GI module the mode selects, which is all this pass knows of GI.
|
|
444
|
-
irradianceSum.Y += textureLoad(tGIY, voxel_coord, 0);
|
|
445
|
-
irradianceSum.CoCg += textureLoad(tGICoCg, voxel_coord, 0).xy;
|
|
446
|
-
|
|
447
|
-
// nothing TAA-filters this volume, so nothing downstream would stop an Inf or a NaN here
|
|
448
|
-
let irradiance = volumetrics_irradiance_sh_storable(irradianceSum);
|
|
449
|
-
|
|
450
|
-
textureStore(tIrradianceY, voxel_coord, irradiance.Y);
|
|
451
|
-
textureStore(tIrradianceCoCg, voxel_coord, vec4<f32>(irradiance.CoCg, 0.0, 0.0));
|
|
452
400
|
}
|
|
453
401
|
`, [
|
|
454
402
|
chunk_cluster_depth_from_z_slice,
|
|
@@ -469,7 +417,6 @@ fn main(
|
|
|
469
417
|
chunk_get_spot_light_info_by_index,
|
|
470
418
|
chunk_shadowmap_get_light_visibility,
|
|
471
419
|
chunk_volumetrics_local_light_shadow,
|
|
472
|
-
chunk_volumetrics_irradiance_sh,
|
|
473
420
|
chunk_sky_lut_compute_uv,
|
|
474
421
|
|
|
475
422
|
RAY_STRUCT.declaration_chunk,
|
|
@@ -23,6 +23,21 @@ export class GPUWaterRenderer {
|
|
|
23
23
|
* @type {import("./medium/GPUWaterBodies.js").GPUWaterBodies|null}
|
|
24
24
|
*/
|
|
25
25
|
bodies: import("./medium/GPUWaterBodies.js").GPUWaterBodies | null;
|
|
26
|
+
/**
|
|
27
|
+
* What the lattice's per-frame lists may hold (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3). Grown from
|
|
28
|
+
* each view's totals, read back a frame or two later; a frame over a budget drops its tail until then.
|
|
29
|
+
*/
|
|
30
|
+
lod_budgets: {
|
|
31
|
+
candidates: number;
|
|
32
|
+
interior: number;
|
|
33
|
+
boundary: number;
|
|
34
|
+
patches: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* The lists' totals as the last read back frame needed them: candidates, interior cells, boundary cells, triangles
|
|
38
|
+
* drawn as themselves, patches.
|
|
39
|
+
*/
|
|
40
|
+
lod_totals: Uint32Array;
|
|
26
41
|
avboit_is_empty(view: any): boolean;
|
|
27
42
|
/** Optional single-pixel readback on the next rendered water frame. No per-frame readback. */
|
|
28
43
|
request_probe(uv: any): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUWaterRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/GPUWaterRenderer.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUWaterRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/water/GPUWaterRenderer.js"],"names":[],"mappings":"AAqBA,sFAAsF;AACtF;IACI,WAAa;IACb,mBAAe;IACf,yBAAqB;IACrB,aAAS;IACT,WAAa;IACb;;;;;;;;;;;MAE6B;IAC7B;;;;OAIG;IACH,QAFU,OAAO,4BAA4B,EAAE,cAAc,GAAC,IAAI,CAEpD;IAOd;;;OAGG;IACH;;;;;MAA8F;IAC9F;;;OAGG;IACH,wBAAyD;IAMzD,oCAIC;IAED,8FAA8F;IAC9F,qCAgBC;IAED,gBASC;IAuDD;;;;;;;;;;;;;;;;MAgJC;IAQD;;;;;YAMC;IAED;;;;;;;;;;MAOC;IAED;;;;;;;;;;;;;;MAwBC;IAED,gGAAgG;IAChG,mEAYC;;CA4BJ"}
|
|
@@ -3,16 +3,18 @@ import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.
|
|
|
3
3
|
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
4
4
|
import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
|
|
5
5
|
import { ShadeIndirectLightingMode } from "../ShadeIndirectLightingMode.js";
|
|
6
|
-
import { BufferResourceDescriptor } from "../../device/graph/BufferResourceDescriptor.js";
|
|
7
|
-
import { build_indirect_draw_command } from "../gpu_primitive/indirect/build_indirect_draw_command.js";
|
|
8
6
|
import { graph_water_tessellation } from "./surface/graph_water_tessellation.js";
|
|
9
|
-
import {
|
|
7
|
+
import { water_lod_view, WATER_LOD_VIEW_STRUCT } from "./surface/lod/WATER_LOD.js";
|
|
8
|
+
import { WATER_LOD_LIMITS_STRUCT, WATER_LOD_PATCH_INDICES, WATER_LOD_STATISTICS_WORDS,
|
|
9
|
+
WaterLodCommand } from "./surface/lod/shader_water_lod.js";
|
|
10
|
+
import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
|
|
10
11
|
import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../STATIC_GRAPHICS_ENGINE_ASSETS.js";
|
|
11
12
|
import { SAMPLER_LINEAR_UPSCALE } from "../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
12
13
|
import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
|
|
13
14
|
import { create_water_finalize_pipeline_brick4, create_water_finalize_pipeline_ibl, create_water_pipeline,
|
|
14
15
|
WATER_FINALIZE_RESOURCES_BRICK4, WATER_FINALIZE_RESOURCES_IBL, WATER_RESOURCES,
|
|
15
|
-
WATER_TRACE_STRUCT
|
|
16
|
+
WATER_TRACE_STRUCT } from "./shader_water.js";
|
|
17
|
+
import { WATER_BAND_SAMPLER } from "./surface/GPUWaterSurface.js";
|
|
16
18
|
import { shader_water_background_copy, shader_water_debug, shader_water_draw,
|
|
17
19
|
shader_water_occupancy, shader_water_splat, shader_water_confidence_seed,
|
|
18
20
|
shader_water_confidence_x, shader_water_confidence_y } from "./shader_water_avboit.js";
|
|
@@ -39,6 +41,20 @@ export class GPUWaterRenderer {
|
|
|
39
41
|
#prepared = new WeakMap();
|
|
40
42
|
#inspection = new WeakMap();
|
|
41
43
|
#probe = null;
|
|
44
|
+
/**
|
|
45
|
+
* What the lattice's per-frame lists may hold (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3). Grown from
|
|
46
|
+
* each view's totals, read back a frame or two later; a frame over a budget drops its tail until then.
|
|
47
|
+
*/
|
|
48
|
+
lod_budgets = { candidates: 1 << 16, interior: 1 << 18, boundary: 1 << 16, patches: 1 << 12 };
|
|
49
|
+
/**
|
|
50
|
+
* The lists' totals as the last read back frame needed them: candidates, interior cells, boundary cells, triangles
|
|
51
|
+
* drawn as themselves, patches.
|
|
52
|
+
*/
|
|
53
|
+
lod_totals = new Uint32Array(WATER_LOD_STATISTICS_WORDS);
|
|
54
|
+
/** Readback buffers for the lists' totals, idle ones first. */
|
|
55
|
+
#readbacks = [];
|
|
56
|
+
/** The patches' index buffer, one per device. */
|
|
57
|
+
#patch_indices = null;
|
|
42
58
|
|
|
43
59
|
avboit_is_empty(view) {
|
|
44
60
|
// the authored state: whether there is water at all, not whether its surface was produced yet
|
|
@@ -70,29 +86,100 @@ export class GPUWaterRenderer {
|
|
|
70
86
|
this.#probe = null;
|
|
71
87
|
this.#prepared = new WeakMap();
|
|
72
88
|
this.#inspection = new WeakMap();
|
|
89
|
+
for (const readback of this.#readbacks) { readback.buffer.destroy(); }
|
|
90
|
+
this.#readbacks = [];
|
|
91
|
+
this.#patch_indices?.buffer.destroy();
|
|
92
|
+
this.#patch_indices = null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** The patches' indices on this device, made the first time a frame draws there. */
|
|
96
|
+
#patch_index_buffer(device) {
|
|
97
|
+
if (this.#patch_indices?.device !== device) {
|
|
98
|
+
this.#patch_indices?.buffer.destroy();
|
|
99
|
+
const buffer = device.createBuffer({ label: 'Water / lod patch indices', size: WATER_LOD_PATCH_INDICES.byteLength,
|
|
100
|
+
usage: GPUBufferUsage.INDEX, mappedAtCreation: true });
|
|
101
|
+
new Uint16Array(buffer.getMappedRange()).set(WATER_LOD_PATCH_INDICES);
|
|
102
|
+
buffer.unmap();
|
|
103
|
+
this.#patch_indices = { device, buffer };
|
|
104
|
+
}
|
|
105
|
+
return this.#patch_indices.buffer;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Keep a frame's totals and grow the budgets they outran, to the next power of two over a quarter more. */
|
|
109
|
+
#grow(totals) {
|
|
110
|
+
this.lod_totals.set(totals);
|
|
111
|
+
const budgets = this.lod_budgets;
|
|
112
|
+
// statistics words: candidates, interior, boundary, flat triangles (sized by the scene, not grown), patches
|
|
113
|
+
const keys = { candidates: 0, interior: 1, boundary: 2, patches: 4 };
|
|
114
|
+
for (const [key, i] of Object.entries(keys)) {
|
|
115
|
+
if (totals[i] > budgets[key]) { budgets[key] = 2 ** Math.ceil(Math.log2(totals[i] * 1.25)); }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** After the lists are built, their totals to the CPU: at most three in flight, none if all are busy. */
|
|
120
|
+
#record_readback(graph, statistics) {
|
|
121
|
+
const data = {};
|
|
122
|
+
const pass = graph.add('Water / lod budgets', data, (d, resources, { encoder, graphics }) => {
|
|
123
|
+
// buffers of a device that has since been replaced go with it
|
|
124
|
+
this.#readbacks = this.#readbacks.filter(r => r.device === graphics.device || (r.buffer.destroy(), false));
|
|
125
|
+
let readback = this.#readbacks.find(r => !r.busy);
|
|
126
|
+
if (readback === undefined) {
|
|
127
|
+
if (this.#readbacks.length >= 3) { return; }
|
|
128
|
+
readback = { busy: false, device: graphics.device, buffer: graphics.device.createBuffer({ label: 'Water / lod budgets readback',
|
|
129
|
+
size: WATER_LOD_STATISTICS_WORDS * 4, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST }) };
|
|
130
|
+
this.#readbacks.push(readback);
|
|
131
|
+
}
|
|
132
|
+
readback.busy = true;
|
|
133
|
+
encoder.copyBufferToBuffer(resources.get(d.statistics), 0, readback.buffer, 0, WATER_LOD_STATISTICS_WORDS * 4);
|
|
134
|
+
encoder.done.then(async () => {
|
|
135
|
+
try {
|
|
136
|
+
await readback.buffer.mapAsync(GPUMapMode.READ);
|
|
137
|
+
this.#grow(new Uint32Array(readback.buffer.getMappedRange()));
|
|
138
|
+
readback.buffer.unmap();
|
|
139
|
+
} catch (error) {
|
|
140
|
+
// a device lost or a buffer destroyed with the system: nothing to grow for
|
|
141
|
+
} finally { readback.busy = false; }
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
data.statistics = pass.read(statistics);
|
|
145
|
+
pass.make_side_effect();
|
|
73
146
|
}
|
|
74
147
|
|
|
75
148
|
avboit_prepare({ graph, view_ctx, camera, color_texture, depth_texture, normal_texture,
|
|
76
149
|
hzb_texture, environment_texture, light_cluster_parameters, light_cluster_lookup, light_cluster_data,
|
|
77
150
|
shadowmap_atlas, indirect_lighting_mode = ShadeIndirectLightingMode.IBL }) {
|
|
78
151
|
const scene = view_ctx.scene;
|
|
79
|
-
const meshlets = this.bodies.meshlets({ graph, view: view_ctx, camera, meshlet_capacity: this.meshlet_capacity });
|
|
80
152
|
const settings = { ...this.settings };
|
|
81
153
|
const probe = this.#probe;
|
|
82
154
|
this.#probe = null;
|
|
83
155
|
const resolution = Array.from(view_ctx.resolution);
|
|
84
|
-
const
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
156
|
+
const surface = this.waves;
|
|
157
|
+
// the lattice is chosen from the camera's position and its pixel angle, not its jittered projection's offset:
|
|
158
|
+
// raster jitter moves samples, not the mesh
|
|
159
|
+
const lod = water_lod_view(view_ctx.camera.camera.projection_matrix, resolution[1], Math.max(0.5, settings.tessellation_pixels));
|
|
160
|
+
const { meshlets, lod_bodies } = this.bodies.meshlets({ graph, view: view_ctx, camera, meshlet_capacity: this.meshlet_capacity,
|
|
161
|
+
visible_rows: surface.visible_rows, lod, steep: surface.steep });
|
|
162
|
+
const limits = { ...this.lod_budgets, triangles: Math.max(this.meshlet_capacity, 1) * GEOMETRY_MESHLET_TRIANGLE_LIMIT };
|
|
163
|
+
const patches = graph_water_tessellation({ graph, scene, camera, meshlets, lod_bodies, meshlet_capacity: this.meshlet_capacity,
|
|
164
|
+
lod, limits, steep: surface.steep });
|
|
165
|
+
this.#record_readback(graph, patches.statistics);
|
|
91
166
|
const data = { resolution, frame_time: this.time };
|
|
92
|
-
|
|
93
|
-
const geometry_bindings = () => ({ scene_database: scene.scene_database_buffer,
|
|
167
|
+
// the surface interface: the band tiles and the frame's particle hash; and the view's lattice
|
|
168
|
+
const geometry_bindings = (graphics, encoder, resources, d) => ({ scene_database: scene.scene_database_buffer,
|
|
94
169
|
meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data,
|
|
95
|
-
|
|
170
|
+
water_band_displacement: surface.displacement, water_band_derivatives: surface.derivatives,
|
|
171
|
+
water_band_sampler: graphics.samplers.obtain(WATER_BAND_SAMPLER),
|
|
172
|
+
water_particle_offsets: surface.particle_offsets, water_particle_entries: surface.particle_entries,
|
|
173
|
+
lod: encoder.allocateTransientValueBuffer(WATER_LOD_VIEW_STRUCT, lod),
|
|
174
|
+
lod_limits: encoder.allocateTransientValueBuffer(WATER_LOD_LIMITS_STRUCT, limits),
|
|
175
|
+
water_lod_bodies: resources.get(d.lod_bodies), water_lod_candidates: resources.get(d.candidates),
|
|
176
|
+
water_lod_cells: resources.get(d.cells) });
|
|
177
|
+
// the interior, boundary and triangle lists' draws, and the patches'
|
|
178
|
+
const draw = (render, commands, device) => {
|
|
179
|
+
for (let list = 0; list < 3; list++) { render.drawIndirect(commands, WaterLodCommand.Draws + 16 * list); }
|
|
180
|
+
render.setIndexBuffer(this.#patch_index_buffer(device), 'uint16');
|
|
181
|
+
render.drawIndexedIndirect(commands, WaterLodCommand.PatchDraw);
|
|
182
|
+
};
|
|
96
183
|
const pipeline = this.#pipeline;
|
|
97
184
|
const pass = graph.add("Water / receivers", data, (data, resources, context) => {
|
|
98
185
|
const { encoder, graphics } = context;
|
|
@@ -104,13 +191,7 @@ export class GPUWaterRenderer {
|
|
|
104
191
|
tHZB: resources.get(data.hzb).obtainView(),
|
|
105
192
|
tScene: resources.get(data.color).obtainView(),
|
|
106
193
|
};
|
|
107
|
-
const
|
|
108
|
-
build_indirect_draw_command(graphics.device, `${WATER_TILE_VERTEX_COUNT}, input, 0, 0`,
|
|
109
|
-
encoder, resources.get(data.patch_count), command);
|
|
110
|
-
const bindings = WATER_RESOURCES.generateBindings({ ...shared, ...geometry_bindings(),
|
|
111
|
-
wave_grid: encoder.allocateTransientValueBuffer(WATER_GRID_STRUCT, { resolution: wave_resolution }),
|
|
112
|
-
water_tiles: resources.get(data.tiles), water_tile_sums: resources.get(data.sums),
|
|
113
|
-
tessellation: encoder.allocateTransientValueBuffer(WATER_TESSELLATION_STRUCT, tessellation) }, encoder);
|
|
194
|
+
const bindings = WATER_RESOURCES.generateBindings({ ...shared, ...geometry_bindings(graphics, encoder, resources, data) }, encoder);
|
|
114
195
|
const render = encoder.constructRenderPass({ label: "Water / receivers", pipeline, bindings: [],
|
|
115
196
|
colorAttachments: [data.receiver, data.trace_metadata].map(handle => ({
|
|
116
197
|
view: resources.get(handle).obtainView(), loadOp: "clear", storeOp: "store", clearValue: [0,0,0,0],
|
|
@@ -119,7 +200,7 @@ export class GPUWaterRenderer {
|
|
|
119
200
|
depthLoadOp: "clear", depthStoreOp: "store", depthClearValue: 0 },
|
|
120
201
|
});
|
|
121
202
|
graphics.setPipelineBindings(render, pipeline, bindings);
|
|
122
|
-
render.
|
|
203
|
+
draw(render, resources.get(data.commands), graphics.device);
|
|
123
204
|
render.end();
|
|
124
205
|
});
|
|
125
206
|
for (const [name, handle] of Object.entries({ camera, color: color_texture, scene_depth: depth_texture,
|
|
@@ -128,8 +209,8 @@ export class GPUWaterRenderer {
|
|
|
128
209
|
resolution, format, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
129
210
|
| (probe !== null && format !== "depth32float" ? GPUTextureUsage.COPY_SRC : 0),
|
|
130
211
|
}));
|
|
131
|
-
data.
|
|
132
|
-
data.
|
|
212
|
+
data.lod_bodies = pass.read(lod_bodies); data.candidates = pass.read(patches.candidates); data.cells = pass.read(patches.cells);
|
|
213
|
+
data.commands = pass.read(patches.commands);
|
|
133
214
|
// Keep the accepted UV and both paths at f32 precision through final shading.
|
|
134
215
|
data.receiver = target("receiver", "rgba32float");
|
|
135
216
|
data.trace_metadata = target("trace metadata", "rgba32float");
|
|
@@ -164,9 +245,7 @@ export class GPUWaterRenderer {
|
|
|
164
245
|
tScene: resources.get(d.color).obtainView(),
|
|
165
246
|
receiver: resources.get(d.receiver).obtainView(), trace_metadata: resources.get(d.trace_metadata).obtainView(),
|
|
166
247
|
visibility_distance: resources.get(d.visibility_distance).obtainView(),
|
|
167
|
-
...geometry_bindings(
|
|
168
|
-
tessellation: encoder.allocateTransientValueBuffer(WATER_TESSELLATION_STRUCT, tessellation),
|
|
169
|
-
wave_grid: encoder.allocateTransientValueBuffer(WATER_GRID_STRUCT, { resolution: wave_resolution }),
|
|
248
|
+
...geometry_bindings(graphics, encoder, resources, d),
|
|
170
249
|
// the lights, as the transparent meshes bind them
|
|
171
250
|
light_data: view_ctx.scene.lights.buffer_data,
|
|
172
251
|
tEnvironment: resources.get(d.environment).obtainView(),
|
|
@@ -192,10 +271,11 @@ export class GPUWaterRenderer {
|
|
|
192
271
|
graphics.setPipelineBindings(render, copy_pipeline, copy_bindings); render.draw(3);
|
|
193
272
|
render.setPipeline(graphics.render_pipelines.obtain(finalize_pipeline)); render.record_pipeline(finalize_pipeline);
|
|
194
273
|
graphics.setPipelineBindings(render, finalize_pipeline, bindings);
|
|
195
|
-
render
|
|
274
|
+
draw(render, resources.get(d.commands), graphics.device);
|
|
196
275
|
render.end();
|
|
197
276
|
});
|
|
198
|
-
for (const key of ['camera','scene_depth','normal','hzb','color','receiver','trace_metadata','visibility_distance','interface_depth',
|
|
277
|
+
for (const key of ['camera','scene_depth','normal','hzb','color','receiver','trace_metadata','visibility_distance','interface_depth',
|
|
278
|
+
'lod_bodies','candidates','cells','commands']) {
|
|
199
279
|
finalize_data[key] = finalize.read(data[key]);
|
|
200
280
|
}
|
|
201
281
|
for (const [key, handle] of Object.entries({ environment: environment_texture, light_cluster_parameters,
|
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** A view's water bodies: which the view draws and how, and their meshlets in row order. */
|
|
2
2
|
export class GPUWaterBodies {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Draw culling over the frame's visible list (WATER_SURFACE_DISTANCE_LOD_PROPOSAL_2026_10_06.md §4.3), each drawn
|
|
5
|
+
* body's lattice frame at its row, and the drawn bodies' meshlets. The expansion is an ordered prefix scan over the
|
|
6
|
+
* rows, which preserves equal-depth ownership, including after holes and reuse.
|
|
7
|
+
*
|
|
8
|
+
* @returns {{meshlets: number, lod_bodies: number}} resources
|
|
9
|
+
*/
|
|
10
|
+
meshlets({ graph, view, camera, meshlet_capacity, visible_rows, lod, steep }: {
|
|
9
11
|
graph: any;
|
|
10
12
|
view: any;
|
|
11
13
|
camera: any;
|
|
12
14
|
meshlet_capacity: any;
|
|
13
|
-
|
|
15
|
+
visible_rows: any;
|
|
16
|
+
lod: any;
|
|
17
|
+
steep: any;
|
|
18
|
+
}): {
|
|
19
|
+
meshlets: number;
|
|
20
|
+
lod_bodies: number;
|
|
21
|
+
};
|
|
14
22
|
}
|
|
15
23
|
//# sourceMappingURL=GPUWaterBodies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUWaterBodies.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/GPUWaterBodies.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUWaterBodies.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/GPUWaterBodies.js"],"names":[],"mappings":"AAcA,4FAA4F;AAC5F;IACI;;;;;;OAMG;IACH;;;;;;;;QAFa;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CA8ClD;CACJ"}
|