@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
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
-
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
3
|
-
import { f32, u32, vec2i, vec2u, vec2f, mat4x4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
4
|
-
import { chunk_barycentric_solve } from "../../shader/chunk/geometry/triangle/chunk_barycentric_solve.js";
|
|
5
|
-
|
|
6
|
-
export const WATER_TILE_CELLS = 16;
|
|
7
|
-
// A triangle clipped by five planes has at most eight corners, hence six fan triangles.
|
|
8
|
-
export const WATER_TILE_VERTEX_COUNT = WATER_TILE_CELLS ** 2 * 18;
|
|
9
|
-
export const WATER_TILE_STRUCT = WebGPUStruct.from({
|
|
10
|
-
meshlet: u32, triangle: u32, body: u32, anchor: f32, origin: vec2i, size: vec2u, pixels: f32,
|
|
11
|
-
}, 'WaterTile').pack();
|
|
12
|
-
export const WATER_TESSELLATION_STRUCT = WebGPUStruct.from({
|
|
13
|
-
resolution: vec2f, pixels: f32, view_projection_matrix: mat4x4f,
|
|
14
|
-
}, 'WaterTessellation').pack();
|
|
15
|
-
|
|
16
|
-
/** Clip in barycentric space: every generated point remains on the authored triangle. */
|
|
17
|
-
export const chunk_water_tessellation = CodeChunk.from(/* language=WGSL */ `
|
|
18
|
-
fn water_reference_position(position: vec3f, height: f32, simulated: bool) -> vec3f {
|
|
19
|
-
return vec3f(position.x, select(position.y, height, simulated), position.z);
|
|
20
|
-
}
|
|
21
|
-
// Bits identify the boundaries meeting at each corner: the three authored edges,
|
|
22
|
-
// followed by the near plane and four cell edges. Retaining them lets reconstruction
|
|
23
|
-
// evaluate an intersection directly, independent of the polygon clipping history.
|
|
24
|
-
struct WaterPolygon { points: array<vec3f, 8>, boundaries: array<u32, 8>, count: u32 }
|
|
25
|
-
fn water_triangle_polygon() -> WaterPolygon {
|
|
26
|
-
var p: WaterPolygon;
|
|
27
|
-
p.points[0] = vec3f(1,0,0); p.points[1] = vec3f(0,1,0); p.points[2] = vec3f(0,0,1); p.count = 3u;
|
|
28
|
-
p.boundaries[0] = 6u; p.boundaries[1] = 5u; p.boundaries[2] = 3u;
|
|
29
|
-
return p;
|
|
30
|
-
}
|
|
31
|
-
fn water_clip_polygon(p: WaterPolygon, distances: vec3f, boundary: u32) -> WaterPolygon {
|
|
32
|
-
var out: WaterPolygon;
|
|
33
|
-
if (p.count == 0u) { return out; }
|
|
34
|
-
var previous = p.points[p.count - 1u];
|
|
35
|
-
var d_previous = dot(previous, distances);
|
|
36
|
-
for (var i = 0u; i < p.count; i++) {
|
|
37
|
-
let current = p.points[i]; let d = dot(current, distances);
|
|
38
|
-
if ((d >= 0.0) != (d_previous >= 0.0)) {
|
|
39
|
-
let previous_index = select(i - 1u, p.count - 1u, i == 0u);
|
|
40
|
-
out.boundaries[out.count] = (p.boundaries[previous_index] & p.boundaries[i]) | boundary;
|
|
41
|
-
out.points[out.count] = mix(previous, current, d_previous / (d_previous - d)); out.count++;
|
|
42
|
-
}
|
|
43
|
-
if (d >= 0.0) { out.boundaries[out.count] = p.boundaries[i]; out.points[out.count] = current; out.count++; }
|
|
44
|
-
previous = current; d_previous = d;
|
|
45
|
-
}
|
|
46
|
-
return out;
|
|
47
|
-
}
|
|
48
|
-
fn water_plane_distances(a: vec4f, b: vec4f, c: vec4f, plane: vec4f) -> vec3f {
|
|
49
|
-
return vec3f(dot(a, plane), dot(b, plane), dot(c, plane));
|
|
50
|
-
}
|
|
51
|
-
fn water_point_weights(a: vec4f, b: vec4f, c: vec4f, point: vec2f) -> vec3f {
|
|
52
|
-
let w = vec3f(a.w,b.w,c.w);
|
|
53
|
-
return barycentric_solve(vec3f(a.x,b.x,c.x) - point.x * w, vec3f(a.y,b.y,c.y) - point.y * w);
|
|
54
|
-
}
|
|
55
|
-
fn water_authored_edges(weights: vec3f) -> u32 {
|
|
56
|
-
return select(0u,1u,weights.x == 0.0) | select(0u,2u,weights.y == 0.0) | select(0u,4u,weights.z == 0.0);
|
|
57
|
-
}
|
|
58
|
-
fn water_boundary_plane(boundary: u32, lo: vec2f, hi: vec2f) -> vec4f {
|
|
59
|
-
if ((boundary & 8u) != 0u) { return vec4f(0,0,-1,1); }
|
|
60
|
-
if ((boundary & 16u) != 0u) { return vec4f(1,0,0,-lo.x); }
|
|
61
|
-
if ((boundary & 32u) != 0u) { return vec4f(-1,0,0,hi.x); }
|
|
62
|
-
if ((boundary & 64u) != 0u) { return vec4f(0,1,0,-lo.y); }
|
|
63
|
-
return vec4f(0,-1,0,hi.y);
|
|
64
|
-
}
|
|
65
|
-
fn water_corner_weights(a: vec4f, b: vec4f, c: vec4f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
|
|
66
|
-
if ((boundaries & 15u) == 0u) {
|
|
67
|
-
return water_point_weights(a,b,c,vec2f(select(lo.x,hi.x,(boundaries & 32u) != 0u),
|
|
68
|
-
select(lo.y,hi.y,(boundaries & 128u) != 0u)));
|
|
69
|
-
}
|
|
70
|
-
var distances: array<vec3f, 2>;
|
|
71
|
-
var count = 0u;
|
|
72
|
-
for (var bit = 0u; bit < 8u; bit++) {
|
|
73
|
-
if ((boundaries & (1u << bit)) == 0u) { continue; }
|
|
74
|
-
if (bit < 3u) { distances[count][bit] = 1.0; }
|
|
75
|
-
else { distances[count] = water_plane_distances(a,b,c,water_boundary_plane(1u << bit,lo,hi)); }
|
|
76
|
-
count++;
|
|
77
|
-
if (count == 2u) { break; }
|
|
78
|
-
}
|
|
79
|
-
return barycentric_solve(distances[0], distances[1]);
|
|
80
|
-
}
|
|
81
|
-
fn water_corner_position(a: vec3f, b: vec3f, c: vec3f, ca: vec4f, cb: vec4f, cc: vec4f,
|
|
82
|
-
weights: vec3f, boundaries: u32, lo: vec2f, hi: vec2f) -> vec3f {
|
|
83
|
-
let edges = boundaries & 7u;
|
|
84
|
-
if (edges == 6u) { return a; }
|
|
85
|
-
if (edges == 5u) { return b; }
|
|
86
|
-
if (edges == 3u) { return c; }
|
|
87
|
-
if (edges != 0u) {
|
|
88
|
-
var p = a; var q = b; var cp = ca; var cq = cb;
|
|
89
|
-
if (edges == 1u) { p = b; q = c; cp = cb; cq = cc; }
|
|
90
|
-
if (edges == 2u) { q = c; cq = cc; }
|
|
91
|
-
// Adjacent authored triangles traverse their common edge in opposite orders.
|
|
92
|
-
// Canonical endpoints and the original clipping plane give identical f32 positions.
|
|
93
|
-
if (p.x > q.x || (p.x == q.x && (p.y > q.y || (p.y == q.y && p.z > q.z)))) {
|
|
94
|
-
let tmp = p; p = q; q = tmp; let tc = cp; cp = cq; cq = tc;
|
|
95
|
-
}
|
|
96
|
-
// A cell corner may also lie on an authored edge coincident with a cell plane.
|
|
97
|
-
// Use the intersecting plane, rather than dividing by that coincident plane's zero span.
|
|
98
|
-
var dp = 0.0; var dq = 0.0;
|
|
99
|
-
for (var bit = 3u; bit < 8u; bit++) {
|
|
100
|
-
if ((boundaries & (1u << bit)) == 0u) { continue; }
|
|
101
|
-
let plane = water_boundary_plane(1u << bit,lo,hi);
|
|
102
|
-
let p_distance = dot(cp,plane); let q_distance = dot(cq,plane);
|
|
103
|
-
if (abs(p_distance - q_distance) > abs(dp - dq)) { dp = p_distance; dq = q_distance; }
|
|
104
|
-
}
|
|
105
|
-
return mix(p,q,dp / (dp - dq));
|
|
106
|
-
}
|
|
107
|
-
return a * weights.x + b * weights.y + c * weights.z;
|
|
108
|
-
}
|
|
109
|
-
fn water_cell_polygon(a: vec4f, b: vec4f, c: vec4f, lo: vec2f, hi: vec2f) -> WaterPolygon {
|
|
110
|
-
// Interior cells are ordinary quads. Reuse the rasterizer's homogeneous barycentric solve
|
|
111
|
-
// and reserve polygon clipping for the authored boundary and near-plane intersections.
|
|
112
|
-
if (a.w > 0.0 && b.w > 0.0 && c.w > 0.0 && a.w >= a.z && b.w >= b.z && c.w >= c.z) {
|
|
113
|
-
let p0 = water_point_weights(a,b,c,lo);
|
|
114
|
-
let p1 = water_point_weights(a,b,c,vec2f(hi.x,lo.y));
|
|
115
|
-
let p2 = water_point_weights(a,b,c,hi);
|
|
116
|
-
let p3 = water_point_weights(a,b,c,vec2f(lo.x,hi.y));
|
|
117
|
-
let minimum = min(min(p0,p1),min(p2,p3));
|
|
118
|
-
if (all(minimum >= vec3f(0))) {
|
|
119
|
-
var quad: WaterPolygon;
|
|
120
|
-
quad.points[0] = p0; quad.points[1] = p1; quad.points[2] = p2; quad.points[3] = p3;
|
|
121
|
-
quad.boundaries[0] = 80u | water_authored_edges(p0); quad.boundaries[1] = 96u | water_authored_edges(p1);
|
|
122
|
-
quad.boundaries[2] = 160u | water_authored_edges(p2); quad.boundaries[3] = 144u | water_authored_edges(p3);
|
|
123
|
-
// Preserve the source triangle's winding, just as the clipped path does.
|
|
124
|
-
// The rasterizer must identify the same side on interior and boundary cells.
|
|
125
|
-
if (dot(cross(a.xyw,b.xyw),c.xyw) < 0.0) {
|
|
126
|
-
quad.points[1] = p3; quad.points[3] = p1;
|
|
127
|
-
let boundary = quad.boundaries[1]; quad.boundaries[1] = quad.boundaries[3]; quad.boundaries[3] = boundary;
|
|
128
|
-
}
|
|
129
|
-
quad.count = 4u; return quad;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
var p = water_triangle_polygon();
|
|
133
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 8u);
|
|
134
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(1,0,0,-lo.x)), 16u);
|
|
135
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(-1,0,0,hi.x)), 32u);
|
|
136
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,1,0,-lo.y)), 64u);
|
|
137
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,vec4f(0,-1,0,hi.y)), 128u);
|
|
138
|
-
for (var i = 0u; i < p.count; i++) {
|
|
139
|
-
p.points[i] = water_corner_weights(a,b,c,p.boundaries[i],lo,hi);
|
|
140
|
-
p.boundaries[i] |= water_authored_edges(p.points[i]);
|
|
141
|
-
}
|
|
142
|
-
return p;
|
|
143
|
-
}
|
|
144
|
-
`, [chunk_barycentric_solve]);
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The primitive surface producer's physics, as pure functions so each is testable alone.
|
|
3
|
-
*
|
|
4
|
-
* A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
|
|
5
|
-
* leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
|
|
6
|
-
* one-metre reference depth because an authored surface supplies no bathymetry. This primitive
|
|
7
|
-
* model describes long waves; deep-water wind waves have wavelength-dependent speed.
|
|
8
|
-
*
|
|
9
|
-
* @type {CodeChunk}
|
|
10
|
-
*/
|
|
11
|
-
export const chunk_water_wave: CodeChunk;
|
|
12
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
13
|
-
//# sourceMappingURL=chunk_water_wave.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_water_wave.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/chunk_water_wave.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,+BAFU,SAAS,CA6BhB;0BAvCuB,oCAAoC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The primitive surface producer's physics, as pure functions so each is testable alone.
|
|
5
|
-
*
|
|
6
|
-
* A damped linear wave equation on a height field, `h_tt = c² ∇²h − γ h_t + f`, stepped by
|
|
7
|
-
* leapfrog. The celerity is the shallow-water one, `c = √(g·d)`. The batched producer uses a
|
|
8
|
-
* one-metre reference depth because an authored surface supplies no bathymetry. This primitive
|
|
9
|
-
* model describes long waves; deep-water wind waves have wavelength-dependent speed.
|
|
10
|
-
*
|
|
11
|
-
* @type {CodeChunk}
|
|
12
|
-
*/
|
|
13
|
-
export const chunk_water_wave = CodeChunk.from(/* language=WGSL */ `
|
|
14
|
-
const WATER_WAVE_GRAVITY: f32 = 9.81;
|
|
15
|
-
|
|
16
|
-
// Squared celerity of a long wave over water depth metres deep, capped so an explicit step of the
|
|
17
|
-
// size the producer takes stays stable (2-D CFL: c·dt/dx ≤ 1/√2).
|
|
18
|
-
fn water_wave_celerity2(depth: f32, celerity_limit: f32) -> f32 {
|
|
19
|
-
return min(WATER_WAVE_GRAVITY * max(depth, 0.0), celerity_limit * celerity_limit);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// One leapfrog step of h_tt = c² ∇²h − γ h_t + f: the next height from the current one, the
|
|
23
|
-
// previous one, the current height's Laplacian, c², the damping rate γ (1/s), the forcing f (m/s²)
|
|
24
|
-
// and the step dt (s).
|
|
25
|
-
fn water_wave_step(h: f32, h_previous: f32, laplacian: f32, celerity2: f32, damping: f32,
|
|
26
|
-
force: f32, dt: f32) -> f32 {
|
|
27
|
-
return h + (h - h_previous) * max(1.0 - damping * dt, 0.0) + dt * dt * (celerity2 * laplacian + force);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Extra damping in a band along the grid's border, rising quadratically to strength at the edge,
|
|
31
|
-
// so waves leave the domain instead of reflecting off the end of the grid.
|
|
32
|
-
fn water_wave_sponge(cell: vec2<u32>, resolution: u32, width: f32, strength: f32) -> f32 {
|
|
33
|
-
let last = f32(resolution - 1u);
|
|
34
|
-
let p = vec2<f32>(cell);
|
|
35
|
-
let edge = min(min(p.x, p.y), min(last - p.x, last - p.y));
|
|
36
|
-
let s = clamp(1.0 - edge / max(width, 1.0), 0.0, 1.0);
|
|
37
|
-
return strength * s * s;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shader_water_tiles.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_tiles.js"],"names":[],"mappings":"AA4BA,sGAAsG;AACtG,+CA6FmG;8BApHrE,+BAA+B"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { CAMERA_UNIFORM_STRUCT } from "../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
2
|
-
import { GEOMETRY_METADATA_STRUCT } from "../../geometry/GEOMETRY_METADATA_STRUCT.js";
|
|
3
|
-
import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
4
|
-
import { GEOMETRY_MESHLET_TRIANGLE_LIMIT } from "../../geometry/meshlet/GEOMETRY_MESHLET_TRIANGLE_LIMIT.js";
|
|
5
|
-
import { MESHLET_COLLECTION_STRUCT } from "../../rasterize/MESHLET_COLLECTION_STRUCT.js";
|
|
6
|
-
import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
|
|
7
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
8
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
9
|
-
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
10
|
-
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
11
|
-
import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
12
|
-
import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
|
|
13
|
-
import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
14
|
-
import { chunk_read_meshlet_vertex_by_draw_index } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_vertex_by_draw_index.js";
|
|
15
|
-
import { WATER_BODIES_TABLE, WATER_WAVES_TABLE } from "../medium/chunk_water_bodies.js";
|
|
16
|
-
import { chunk_water_tessellation, WATER_TILE_CELLS, WATER_TILE_STRUCT, WATER_TESSELLATION_STRUCT } from "./chunk_water_tessellation.js";
|
|
17
|
-
|
|
18
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
19
|
-
resources.setImmediate('capacity', u32);
|
|
20
|
-
resources.createGroup().addUniform('camera', CAMERA_UNIFORM_STRUCT).addUniform('tessellation', WATER_TESSELLATION_STRUCT)
|
|
21
|
-
.addStorageBuffer('scene_database', WebGPUArray.u32)
|
|
22
|
-
.addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
|
|
23
|
-
.addStorageBuffer('water_meshlets', MESHLET_COLLECTION_STRUCT)
|
|
24
|
-
.addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
|
|
25
|
-
.addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
|
|
26
|
-
.addStorageBuffer('tiles', WebGPUArray.from(WATER_TILE_STRUCT), true)
|
|
27
|
-
.addStorageBuffer('counts', COLLECTION_U32_STRUCT_READ, true);
|
|
28
|
-
|
|
29
|
-
/** Keep triangle identity, including hidden bodies. Only displaced raster depth selects ownership. */
|
|
30
|
-
export const shader_water_tiles = ComputeShader.from({ label: 'Water / classify view tiles', resources,
|
|
31
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
32
|
-
@compute @workgroup_size(128)
|
|
33
|
-
fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
|
|
34
|
-
let i = folded_workgroup_index(group) * 128u + lane;
|
|
35
|
-
if (i == 0u) { counts.count = capacity; }
|
|
36
|
-
if (i >= capacity) { return; }
|
|
37
|
-
counts.elements[i] = 0u;
|
|
38
|
-
let meshlet_slot = i / ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
|
|
39
|
-
if (meshlet_slot >= water_meshlets.count) { return; }
|
|
40
|
-
let definition = water_meshlets.elements[meshlet_slot];
|
|
41
|
-
let triangle = i % ${GEOMETRY_MESHLET_TRIANGLE_LIMIT}u;
|
|
42
|
-
let header = meshlet_metadata[definition.index];
|
|
43
|
-
if (triangle >= header.primitive_count) { return; }
|
|
44
|
-
let body = ${WATER_BODIES_TABLE.marshalling_method_read}(&scene_database, definition.mesh);
|
|
45
|
-
let node = scene_read_node(&scene_database, body.node);
|
|
46
|
-
let simulated = body.wave != ~0u;
|
|
47
|
-
var bounds = vec2f(0);
|
|
48
|
-
if (simulated) { bounds = ${WATER_WAVES_TABLE.marshalling_method_read}(&scene_database, body.wave).displacement_bounds; }
|
|
49
|
-
// Increasing near-plane distance is farther from the camera. Use the far endpoint;
|
|
50
|
-
// clipping it at the near plane cannot discard a point displaced into the visible frustum.
|
|
51
|
-
let direction = tessellation.view_projection_matrix * node.global[1];
|
|
52
|
-
let farther = direction.w - direction.z >= 0.0;
|
|
53
|
-
var anchor = 0.0;
|
|
54
|
-
var pixels = tessellation.pixels;
|
|
55
|
-
if (simulated) {
|
|
56
|
-
let box = geometries[body.geometry].bounding_box;
|
|
57
|
-
// A shared local-xz reference keeps adjacent triangles' generated edge vertices
|
|
58
|
-
// identical, including sloped rest geometry. Only reconstruction flattens height;
|
|
59
|
-
// rendered vertices still interpolate all three authored position coordinates.
|
|
60
|
-
anchor = select(box[1] + bounds.x, box[4] + bounds.y, farther);
|
|
61
|
-
let x = tessellation.view_projection_matrix * node.global[0];
|
|
62
|
-
let z = tessellation.view_projection_matrix * node.global[2];
|
|
63
|
-
let origin = tessellation.view_projection_matrix * node.global[3];
|
|
64
|
-
let plane = cross(x.xyw, z.xyw);
|
|
65
|
-
let reference = origin + direction * anchor;
|
|
66
|
-
let span = box[4] - box[1] + bounds.y - bounds.x;
|
|
67
|
-
if (span > 0.0 && abs(dot(plane, reference.xyw)) <= 1e-5 * length(plane) * max(length(reference.xyw), 1.0)
|
|
68
|
-
&& abs(dot(plane, direction.xyw)) > 1e-20) {
|
|
69
|
-
anchor += select(-span, span, farther);
|
|
70
|
-
}
|
|
71
|
-
var minimum_w = 1e30;
|
|
72
|
-
for (var corner = 0u; corner < 4u; corner++) {
|
|
73
|
-
let p = vec3f(select(box[0], box[3], (corner & 1u) != 0u), anchor, select(box[2], box[5], (corner & 2u) != 0u));
|
|
74
|
-
minimum_w = min(minimum_w, (tessellation.view_projection_matrix * (node.global * vec4f(p, 1))).w);
|
|
75
|
-
}
|
|
76
|
-
let low = box[1] + bounds.x - anchor;
|
|
77
|
-
let high = box[4] + bounds.y - anchor;
|
|
78
|
-
let slopes = vec4f(direction.w + direction.x, direction.w - direction.x, direction.w + direction.y, direction.w - direction.y);
|
|
79
|
-
let allowance = max(vec4f(0), max(slopes * low, slopes * high));
|
|
80
|
-
// After swept side-plane clipping, the reference's NDC span is at most
|
|
81
|
-
// 2 + (left + right allowance)/minimum_w. Use this body-wide bound so a
|
|
82
|
-
// near-plane envelope cannot amplify patches or split shared edge grids.
|
|
83
|
-
let amplification = 1.0 + max(allowance.x + allowance.y, allowance.z + allowance.w)
|
|
84
|
-
/ (2.0 * max(camera.clip_near_far.x, minimum_w));
|
|
85
|
-
pixels *= amplification;
|
|
86
|
-
}
|
|
87
|
-
let pa = read_meshlet_vertex_by_draw_index(header, triangle * 3u).position;
|
|
88
|
-
let pb = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 1u).position;
|
|
89
|
-
let pc = read_meshlet_vertex_by_draw_index(header, triangle * 3u + 2u).position;
|
|
90
|
-
let a = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pa, anchor, simulated), 1));
|
|
91
|
-
let b = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pb, anchor, simulated), 1));
|
|
92
|
-
let c = tessellation.view_projection_matrix * (node.global * vec4f(water_reference_position(pc, anchor, simulated), 1));
|
|
93
|
-
let heights = select(vec3f(0), vec3f(pa.y, pb.y, pc.y) - vec3f(anchor), simulated);
|
|
94
|
-
var p = water_clip_polygon(water_triangle_polygon(), water_plane_distances(a,b,c,vec4f(0,0,-1,1)), 0u);
|
|
95
|
-
// The reference is unjittered, but raster samples may move into the viewport by
|
|
96
|
-
// a pixel. Retain that fixed border without letting jitter change the tile grid.
|
|
97
|
-
let border = vec2f(1.0) + vec2f(2.0) / tessellation.resolution;
|
|
98
|
-
let planes = array<vec4f,4>(vec4f(1,0,0,border.x),vec4f(-1,0,0,border.x),vec4f(0,1,0,border.y),vec4f(0,-1,0,border.y));
|
|
99
|
-
for (var plane = 0u; plane < 4u; plane++) {
|
|
100
|
-
let sweep = dot(direction, planes[plane]);
|
|
101
|
-
let allowance = max((heights + vec3f(bounds.x)) * sweep, (heights + vec3f(bounds.y)) * sweep);
|
|
102
|
-
p = water_clip_polygon(p, water_plane_distances(a,b,c,planes[plane]) + allowance, 0u);
|
|
103
|
-
}
|
|
104
|
-
if (p.count < 3u) { return; }
|
|
105
|
-
var lo = vec2f(1e30); var hi = vec2f(-1e30);
|
|
106
|
-
for (var corner = 0u; corner < p.count; corner++) {
|
|
107
|
-
let q = a * p.points[corner].x + b * p.points[corner].y + c * p.points[corner].z;
|
|
108
|
-
let pixel = (q.xy / q.w * vec2f(0.5,-0.5) + vec2f(0.5)) * tessellation.resolution;
|
|
109
|
-
lo = min(lo, pixel); hi = max(hi, pixel);
|
|
110
|
-
}
|
|
111
|
-
let tile_pixels = pixels * ${WATER_TILE_CELLS}.0;
|
|
112
|
-
let origin = vec2i(floor(lo / tile_pixels));
|
|
113
|
-
let end = vec2i(ceil(hi / tile_pixels));
|
|
114
|
-
let size = vec2u(max(end - origin, vec2i(0)));
|
|
115
|
-
if (any(size == vec2u(0))) { return; }
|
|
116
|
-
var tile: WaterTile;
|
|
117
|
-
tile.meshlet = definition.index; tile.triangle = triangle; tile.body = definition.mesh;
|
|
118
|
-
tile.anchor = anchor; tile.origin = origin; tile.size = size; tile.pixels = pixels;
|
|
119
|
-
tiles[i] = tile;
|
|
120
|
-
counts.elements[i] = size.x * size.y;
|
|
121
|
-
}
|
|
122
|
-
`, [chunk_water_tessellation, chunk_read_meshlet_vertex_by_draw_index, chunk_scene_database_access,
|
|
123
|
-
WATER_BODIES_TABLE.chunk_read, WATER_WAVES_TABLE.chunk_read, chunk_folded_workgroup_index]) });
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export const WATER_WAVE_BATCH_STRUCT: WebGPUStruct;
|
|
2
|
-
export const shader_water_wave_batch: ComputeShader;
|
|
3
|
-
export const shader_water_wave_batch_finish: ComputeShader;
|
|
4
|
-
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
5
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
6
|
-
//# sourceMappingURL=shader_water_wave_batch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shader_water_wave_batch.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_batch.js"],"names":[],"mappings":"AAYA,mDAC+E;AAO/E,oDA8CwH;AAMxH,2DAY4F;6BA/E/D,mCAAmC;8BALlC,+BAA+B"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
2
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
3
|
-
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
-
import { f32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
5
|
-
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
6
|
-
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
7
|
-
import { WATER_WAVES_TABLE as table } from "../medium/chunk_water_bodies.js";
|
|
8
|
-
import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
9
|
-
import { chunk_srdnoise2 } from "../../shader/chunk/noise/psrdnoise/chunk_srdnoise2.js";
|
|
10
|
-
import { chunk_water_wave } from "./chunk_water_wave.js";
|
|
11
|
-
import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
|
|
12
|
-
|
|
13
|
-
export const WATER_WAVE_BATCH_STRUCT = WebGPUStruct.from({ resolution: u32, capacity: u32,
|
|
14
|
-
dt: f32, time: f32, damping: f32, apply_impulses: u32 }, 'WaterWaveBatch');
|
|
15
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
16
|
-
resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
|
|
17
|
-
.addStorageBuffer('scene_database', WebGPUArray.u32)
|
|
18
|
-
.addStorageBuffer('domain', WebGPUArray.u32)
|
|
19
|
-
.addStorageBuffer('state_current', WebGPUArray.from(f32))
|
|
20
|
-
.addStorageBuffer('state_previous', WebGPUArray.from(f32), true);
|
|
21
|
-
export const shader_water_wave_batch = ComputeShader.from({ label: 'Water / batched wave step', resources,
|
|
22
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
23
|
-
@compute @workgroup_size(128)
|
|
24
|
-
fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
|
|
25
|
-
let i = folded_workgroup_index(group) * 128u + lane;
|
|
26
|
-
let n = batch.resolution;
|
|
27
|
-
let row = i / (n * n);
|
|
28
|
-
if (row >= batch.capacity) { return; }
|
|
29
|
-
let params = ${table.marshalling_method_read}(&scene_database, row);
|
|
30
|
-
if (params.first_write != 0u || params.node == 0u || params.node == ~0u || domain[i] == 0u) { state_previous[i] = 0.0; return; }
|
|
31
|
-
if (batch.dt == 0.0) { return; }
|
|
32
|
-
let cell = vec2u(i % n, (i / n) % n);
|
|
33
|
-
let start = row * n * n;
|
|
34
|
-
let spacing = max((params.extent.zw - params.extent.xy) / f32(n - 1u), vec2f(1e-20));
|
|
35
|
-
let world = scene_read_node(&scene_database, params.node).global;
|
|
36
|
-
let scale = vec3f(length(world[0].xyz), length(world[1].xyz), length(world[2].xyz));
|
|
37
|
-
// A temporarily collapsed transform must not poison persistent histories with NaNs.
|
|
38
|
-
if (any(scale <= vec3f(1e-10))) { state_previous[i] = state_current[i]; return; }
|
|
39
|
-
let world_spacing = max(spacing * scale.xz, vec2f(1e-10));
|
|
40
|
-
let h = state_current[i];
|
|
41
|
-
let left = start + cell.y * n + select(cell.x - 1u, 0u, cell.x == 0u);
|
|
42
|
-
let right = start + cell.y * n + min(cell.x + 1u, n - 1u);
|
|
43
|
-
let down = start + select(cell.y - 1u, 0u, cell.y == 0u) * n + cell.x;
|
|
44
|
-
let up = start + min(cell.y + 1u, n - 1u) * n + cell.x;
|
|
45
|
-
let laplacian = (state_current[left] + state_current[right] - 2.0 * h) / (world_spacing.x * world_spacing.x)
|
|
46
|
-
+ (state_current[down] + state_current[up] - 2.0 * h) / (world_spacing.y * world_spacing.y);
|
|
47
|
-
let position = mix(params.extent.xy, params.extent.zw, vec2f(cell) / f32(n - 1u));
|
|
48
|
-
let wind = params.forcing.xy * scale.xz;
|
|
49
|
-
let wind_direction = wind / max(length(wind), 1e-20);
|
|
50
|
-
let drift = wind_direction * params.forcing.w * batch.time;
|
|
51
|
-
var force = params.forcing.z / scale.y * srdnoise2((position * scale.xz - drift) / 6.0, 0.0).x;
|
|
52
|
-
if (batch.apply_impulses != 0u) {
|
|
53
|
-
for (var j = 0u; j < params.impulse_count; j++) {
|
|
54
|
-
let impulse = params.impulses[j];
|
|
55
|
-
let d = position - impulse.xy;
|
|
56
|
-
let world_delta = (world * vec4f(d.x, 0.0, d.y, 0.0)).xyz;
|
|
57
|
-
force += impulse.w / (batch.dt * scale.y) * exp(-dot(world_delta, world_delta) / max(impulse.z * impulse.z, 1e-6));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
let damping = batch.damping + water_wave_sponge(cell, n, max(4.0, f32(n) * 0.04), 4.0);
|
|
61
|
-
// The authored surface has no bathymetry. The primitive producer uses a one-metre reference
|
|
62
|
-
// depth; the CFL cap follows both axes of its local grid. It does not define the mesh outline.
|
|
63
|
-
let celerity = 0.6 * min(world_spacing.x, world_spacing.y) / batch.dt;
|
|
64
|
-
state_previous[i] = water_wave_step(h, state_previous[i], laplacian,
|
|
65
|
-
water_wave_celerity2(1.0, celerity), damping, force, batch.dt);
|
|
66
|
-
}
|
|
67
|
-
`, [table.chunk_read, chunk_folded_workgroup_index, chunk_srdnoise2, chunk_water_wave, chunk_scene_database_access]) });
|
|
68
|
-
|
|
69
|
-
const finish_resources = new ShaderResourceSetDescriptor();
|
|
70
|
-
finish_resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
|
|
71
|
-
.addStorageBuffer('scene_database', WebGPUArray.u32, true);
|
|
72
|
-
const pg = table.page_iterator_symbol_prefix(64, true);
|
|
73
|
-
export const shader_water_wave_batch_finish = ComputeShader.from({ label: 'Water / consume wave inputs', resources: finish_resources,
|
|
74
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
75
|
-
@compute @workgroup_size(64)
|
|
76
|
-
fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
|
|
77
|
-
if (!${pg}_setup(&scene_database, folded_workgroup_index(group), lane)) { return; }
|
|
78
|
-
let slot = ${pg}_slot_in_page(lane);
|
|
79
|
-
if (slot >= ${pg}_ELEMENTS_PER_PAGE || !${pg}_is_occupied(slot)) { return; }
|
|
80
|
-
let row = ${pg}_slot_to_index(slot);
|
|
81
|
-
${table.marshalling_method_write_field('first_write')}(&scene_database, row, 0u);
|
|
82
|
-
if (batch.apply_impulses != 0u) { ${table.marshalling_method_write_field('impulse_count')}(&scene_database, row, 0u); }
|
|
83
|
-
}
|
|
84
|
-
`, [table.chunk_iterate(64, true), table.wgsl_gen_write_field_code('first_write'),
|
|
85
|
-
table.wgsl_gen_write_field_code('impulse_count'), chunk_folded_workgroup_index]) });
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/** Bake the authored footprint once per new wave row, using the existing geometry BLAS. */
|
|
2
|
-
export const shader_water_wave_domain: ComputeShader;
|
|
3
|
-
/** Bilinear reconstruction cannot leave the extrema of its samples. Include the rest surface. */
|
|
4
|
-
export const shader_water_wave_bounds: ComputeShader;
|
|
5
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
6
|
-
//# sourceMappingURL=shader_water_wave_domain.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shader_water_wave_domain.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/surface/shader_water_wave_domain.js"],"names":[],"mappings":"AAwBA,2FAA2F;AAC3F,qDAqBsF;AAOtF,iGAAiG;AACjG,qDA4BmH;8BAlFrF,+BAA+B"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
2
|
-
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
3
|
-
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
-
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
5
|
-
import { GEOMETRY_METADATA_STRUCT } from "../../geometry/GEOMETRY_METADATA_STRUCT.js";
|
|
6
|
-
import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
|
|
7
|
-
import { BVH2_NODE_STRUCT } from "../../shader/chunk/bvh/BVH2_NODE_STRUCT.js";
|
|
8
|
-
import { BVH_TRAVERSAL_STACK_SIZE } from "../../shader/chunk/bvh/BVH_TRAVERSAL_STACK_SIZE.js";
|
|
9
|
-
import { chunk_ray_query_blas_nearest } from "../../shader/chunk/geometry/ray/chunk_ray_query_blas_nearest.js";
|
|
10
|
-
import { chunk_folded_workgroup_index } from "../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
11
|
-
import { f32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
12
|
-
import { WATER_WAVES_TABLE as table } from "../medium/chunk_water_bodies.js";
|
|
13
|
-
import { WATER_WAVE_BATCH_STRUCT } from "./shader_water_wave_batch.js";
|
|
14
|
-
|
|
15
|
-
const resources = new ShaderResourceSetDescriptor();
|
|
16
|
-
resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
|
|
17
|
-
.addStorageBuffer('scene_database', WebGPUArray.u32)
|
|
18
|
-
.addStorageBuffer('geometries', WebGPUArray.from(GEOMETRY_METADATA_STRUCT))
|
|
19
|
-
.addStorageBuffer('blas_lookup', WebGPUArray.u32)
|
|
20
|
-
.addStorageBuffer('blas_data', WebGPUArray.from(BVH2_NODE_STRUCT))
|
|
21
|
-
.addStorageBuffer('meshlet_metadata', WebGPUArray.from(MESHLET_METADATA_STRUCT))
|
|
22
|
-
.addStorageBuffer('meshlet_data', WebGPUArray.from(f32))
|
|
23
|
-
.addStorageBuffer('domain', WebGPUArray.u32, true);
|
|
24
|
-
|
|
25
|
-
/** Bake the authored footprint once per new wave row, using the existing geometry BLAS. */
|
|
26
|
-
export const shader_water_wave_domain = ComputeShader.from({ label: 'Water / authored simulation domain', resources,
|
|
27
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
28
|
-
@compute @workgroup_size(128)
|
|
29
|
-
fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
|
|
30
|
-
let i = folded_workgroup_index(group) * 128u + lane;
|
|
31
|
-
let n = batch.resolution;
|
|
32
|
-
let row = i / (n * n);
|
|
33
|
-
if (row >= batch.capacity) { return; }
|
|
34
|
-
let params = ${table.marshalling_method_read}(&scene_database, row);
|
|
35
|
-
if (params.node == 0u || params.node == ~0u) { domain[i] = 0u; return; }
|
|
36
|
-
if (params.first_write == 0u && batch.apply_impulses == 0u) { return; }
|
|
37
|
-
let geometry = geometries[params.geometry];
|
|
38
|
-
let cell = vec2u(i % n, (i / n) % n);
|
|
39
|
-
let xz = mix(params.extent.xy, params.extent.zw, vec2f(cell) / f32(n - 1u));
|
|
40
|
-
let margin = max(1e-3, (geometry.bounding_box[4] - geometry.bounding_box[1]) * 1e-4);
|
|
41
|
-
let top = geometry.bounding_box[4] + margin;
|
|
42
|
-
var stack: array<u32, ${BVH_TRAVERSAL_STACK_SIZE}>;
|
|
43
|
-
let hit = ray_query_blas_nearest(Ray(vec3f(xz.x, top, xz.y), vec3f(0.0, -1.0, 0.0),
|
|
44
|
-
top - geometry.bounding_box[1] + margin), params.geometry, &stack, 0u);
|
|
45
|
-
domain[i] = select(0u, 1u, hit.t >= 0.0);
|
|
46
|
-
}
|
|
47
|
-
`, [table.chunk_read, chunk_folded_workgroup_index, chunk_ray_query_blas_nearest]) });
|
|
48
|
-
|
|
49
|
-
const bounds_resources = new ShaderResourceSetDescriptor();
|
|
50
|
-
bounds_resources.createGroup().addUniform('batch', WATER_WAVE_BATCH_STRUCT)
|
|
51
|
-
.addStorageBuffer('scene_database', WebGPUArray.u32, true)
|
|
52
|
-
.addStorageBuffer('state', WebGPUArray.from(f32));
|
|
53
|
-
|
|
54
|
-
/** Bilinear reconstruction cannot leave the extrema of its samples. Include the rest surface. */
|
|
55
|
-
export const shader_water_wave_bounds = ComputeShader.from({ label: 'Water / displacement bounds', resources: bounds_resources,
|
|
56
|
-
body: CodeChunk.from(/* language=WGSL */ `
|
|
57
|
-
var<workgroup> lower: array<f32, 128>;
|
|
58
|
-
var<workgroup> upper: array<f32, 128>;
|
|
59
|
-
@compute @workgroup_size(128)
|
|
60
|
-
fn main(@builtin(workgroup_id) group: vec3u, @builtin(local_invocation_index) lane: u32) {
|
|
61
|
-
let row = folded_workgroup_index(group);
|
|
62
|
-
if (row >= batch.capacity) { return; }
|
|
63
|
-
let params = ${table.marshalling_method_read_rw}(&scene_database, row);
|
|
64
|
-
let occupied = params.node != 0u && params.node != ~0u;
|
|
65
|
-
let size = select(0u, batch.resolution * batch.resolution, occupied);
|
|
66
|
-
var lo = 0.0;
|
|
67
|
-
var hi = 0.0;
|
|
68
|
-
for (var cell = lane; cell < size; cell += 128u) {
|
|
69
|
-
let h = state[row * size + cell];
|
|
70
|
-
lo = min(lo, h); hi = max(hi, h);
|
|
71
|
-
}
|
|
72
|
-
lower[lane] = lo; upper[lane] = hi;
|
|
73
|
-
workgroupBarrier();
|
|
74
|
-
for (var stride = 64u; stride != 0u; stride /= 2u) {
|
|
75
|
-
if (lane < stride) {
|
|
76
|
-
lower[lane] = min(lower[lane], lower[lane + stride]);
|
|
77
|
-
upper[lane] = max(upper[lane], upper[lane + stride]);
|
|
78
|
-
}
|
|
79
|
-
workgroupBarrier();
|
|
80
|
-
}
|
|
81
|
-
if (lane == 0u && occupied) { ${table.marshalling_method_write_field('displacement_bounds')}(&scene_database, row, vec2f(lower[0], upper[0])); }
|
|
82
|
-
}
|
|
83
|
-
`, [table.chunk_read_rw, table.wgsl_gen_write_field_code('displacement_bounds'), chunk_folded_workgroup_index]) });
|