@woosh/meep-engine 3.41.0 → 3.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/selection/editor_pick.d.ts.map +1 -1
- package/editor/selection/editor_pick.js +2 -1
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +7 -1
- package/editor/tools/engine/ToolEngine.d.ts.map +1 -1
- package/editor/tools/engine/ToolEngine.js +10 -0
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +7 -20
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
- package/editor/tools/v2/handle/gizmo_drag_plane.js +4 -0
- package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
- package/editor/view/ecs/EntityEditor.js +3 -1
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +28 -12
- package/package.json +1 -1
- package/samples/engine/first-scene/index.html +4 -1
- package/samples/engine/first-scene/main.js +14 -9
- package/src/core/binary/utf8/utf8_decode.js +3 -3
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.d.ts.map +1 -1
- package/src/core/bvh2/binary/2/bvh32_query_user_data_ray.js +112 -113
- package/src/core/bvh2/bvh3/ebvh_nodes_sort_sah_local4.js +2 -2
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +14 -14
- package/src/core/collection/RingBuffer.d.ts.map +1 -1
- package/src/core/collection/RingBuffer.js +4 -0
- package/src/core/collection/array/array_contains_duplicates.d.ts.map +1 -1
- package/src/core/collection/array/array_contains_duplicates.js +2 -1
- package/src/core/collection/array/array_copy.d.ts.map +1 -1
- package/src/core/collection/array/array_copy.js +23 -0
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/sparse_typed_array_hash.d.ts.map +1 -1
- package/src/core/collection/array/typed/sparse_typed_array_hash.js +9 -8
- package/src/core/collection/array/typed/uint16_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint16_array_hash.js +4 -4
- package/src/core/collection/array/typed/uint8_array_hash.d.ts +2 -2
- package/src/core/collection/array/typed/uint8_array_hash.js +4 -4
- package/src/core/collection/array/weightedRandomFromArray.d.ts +1 -0
- package/src/core/collection/array/weightedRandomFromArray.d.ts.map +1 -1
- package/src/core/collection/array/weightedRandomFromArray.js +9 -1
- package/src/core/collection/heap/BinaryHeap.d.ts.map +1 -1
- package/src/core/collection/heap/BinaryHeap.js +4 -0
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +4 -2
- package/src/core/collection/set/ArraySet.js +1 -1
- package/src/core/collection/set/HashSet.d.ts +1 -1
- package/src/core/collection/set/HashSet.d.ts.map +1 -1
- package/src/core/collection/set/HashSet.js +4 -2
- package/src/core/debug/matchers/IsEqual.js +1 -1
- package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
- package/src/core/debug/matchers/IsIterableContaining.js +61 -74
- package/src/core/events/signal/SignalBinding.js +101 -101
- package/src/core/function/extractFunctionBody.js +13 -13
- package/src/core/function/objectsEqual.d.ts.map +1 -1
- package/src/core/function/objectsEqual.js +15 -14
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +207 -172
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +5 -4
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.d.ts.map +1 -1
- package/src/core/geom/3d/line/line3_compute_segment_point_distance_eikonal.js +8 -2
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts +20 -0
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +182 -0
- package/src/core/math/noise/curl_noise_3dt.d.ts.map +1 -1
- package/src/core/math/noise/curl_noise_3dt.js +20 -10
- package/src/core/math/noise/sdnoise.d.ts +16 -5
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +43 -9
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts +16 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_nearest_point.js +44 -3
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +6 -2
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +9 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +26 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +2 -0
- package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/AbilitySet.js +9 -0
- package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/LedgeGrab.js +6 -0
- package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -0
- package/src/engine/control/first-person/abilities/WallRun.d.ts +4 -1
- package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -1
- package/src/engine/control/first-person/abilities/WallRun.js +13 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +6 -5
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +3 -3
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -1
- package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +9 -8
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +13 -4
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +18 -15
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescription.js +2 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +1 -0
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +3 -0
- package/src/engine/ecs/parent/EntityNode.js +3 -3
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +4 -0
- package/src/engine/ecs/storage/BinaryBufferDeSerializer.js +5 -5
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/BinarySerializationRegistry.js +3 -2
- package/src/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter2.js +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/object-v2/BinaryObjectDeSerializer.js +8 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +8 -0
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +5 -2
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +3 -0
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -0
- package/src/engine/ecs/terrain/overlay/TerrainOverlay.js +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +13 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -0
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/LightSerializationAdapter.js +13 -1
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts +5 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/light/LightSerializationUpgrader_0_1.js +27 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +11 -0
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +17 -0
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +3 -1
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts +9 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_4_5.js +24 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +30 -9
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWaves.js +41 -9
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterWavesSerializationAdapter.js +30 -26
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterWavesSerializationUpgrader_0_1.js +22 -0
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +3 -5
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts +20 -0
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.d.ts.map +1 -1
- package/src/engine/graphics/texture/3d/scs3d_sample_linear3.js +36 -0
- package/src/engine/graphics3/WaterSystem.d.ts +12 -3
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +78 -46
- package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
- package/src/engine/input/devices/PointerDevice.js +29 -4
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts +1 -0
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/selector/WeightedRandomBehavior.js +14 -3
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +12 -3
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +8 -2
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts +19 -0
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_sample_scalar_masked.js +41 -2
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +9 -3
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_sl_velocity.js +26 -10
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +3 -6
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +22 -9
- package/src/engine/ui/DraggableAspect.d.ts +5 -1
- package/src/engine/ui/DraggableAspect.d.ts.map +1 -1
- package/src/engine/ui/DraggableAspect.js +61 -4
- package/src/format/image/avif/heif/ItemProperty.d.ts +1 -1
- package/src/format/image/avif/heif/ItemProperty.js +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +17 -6
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +2 -4
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +20 -13
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -1
- package/src/shade/playground/water_refraction/README.md +10 -11
- package/src/shade/playground/water_refraction/main.js +9 -8
- package/src/shade/playground/water_refraction/world.js +1 -1
- package/src/shade/playground/water_surface/README.md +43 -0
- package/src/shade/playground/water_surface/index.html +30 -0
- package/src/shade/playground/water_surface/main.d.ts +2 -0
- package/src/shade/playground/water_surface/main.d.ts.map +1 -0
- package/src/shade/playground/water_surface/main.js +154 -0
- package/src/shade/playground/water_surface/world.d.ts +44 -0
- package/src/shade/playground/water_surface/world.d.ts.map +1 -0
- package/src/shade/playground/water_surface/world.js +160 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +5 -0
- package/src/shade/renderer/binding/BufferBinding.js +2 -2
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +5 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +10 -3
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +17 -9
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts +3 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraInput.js +16 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +2 -0
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +11 -0
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +9 -3
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.d.ts.map +1 -1
- package/src/shade/renderer/geometry/util/geometry_simplify_redundant_topology.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +85 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +12 -6
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +3 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +2 -1
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js +42 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js +39 -0
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +2 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +15 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +110 -30
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +16 -8
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +31 -26
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +0 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +1 -39
- package/src/shade/renderer/water/shader_water.d.ts +0 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +201 -72
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts +70 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/GPUWaterSurface.js +199 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +5 -2
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +32 -12
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +22 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +217 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +65 -11
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +163 -28
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts +51 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/WATER_LOD.js +95 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts +10 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod.js +127 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts +17 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/chunk_water_lod_cell.js +246 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts +118 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/lod/shader_water_lod.js +727 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts +60 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +228 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +17 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +49 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +22 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +143 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +15 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +121 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +83 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/particles/shader_water_particles.js +502 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts +42 -0
- package/src/shade/renderer/water/surface/shader_water_cull.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_cull.js +269 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts +15 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_combine.js +73 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts +11 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_waves_derive.js +78 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts +35 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/GPUWaterSpectrum.js +103 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_BAND_STATE.js +57 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts +22 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/WATER_SPECTRUM.js +25 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts +14 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_jonswap.js +48 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts +23 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/chunk_water_spectrum.js +169 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts +26 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/spectrum/shader_water_spectrum.js +161 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +18 -6
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +11 -3
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts +0 -28
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.d.ts.map +0 -1
- package/src/core/geom/2d/polygon/polygon2_triangulate.corpus.js +0 -86
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts +0 -29
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.d.ts.map +0 -1
- package/src/engine/ecs/storage/binary/object-v2/serializerTestHarness.js +0 -44
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +0 -4
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +0 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +0 -32
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +0 -25
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +0 -128
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +0 -144
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +0 -13
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +0 -40
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +0 -4
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_tiles.js +0 -123
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +0 -85
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +0 -6
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +0 -83
|
@@ -381,6 +381,12 @@ function check_header(buffer, out) {
|
|
|
381
381
|
usable = false;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
+
if (root_page_offset >= directory_offset) {
|
|
385
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `root_page_offset ${root_page_offset} is not before directory_offset ${directory_offset}`));
|
|
386
|
+
|
|
387
|
+
usable = false;
|
|
388
|
+
}
|
|
389
|
+
|
|
384
390
|
// Byte 103 was reserved through `format_version` 5 and is `level_count`'s high byte from 6 on,
|
|
385
391
|
// so there is nothing left to check between it and `source_vertex_count`; the read above landed
|
|
386
392
|
// at 104 and the one below expects to start there.
|
|
@@ -425,6 +431,63 @@ function check_header(buffer, out) {
|
|
|
425
431
|
return usable;
|
|
426
432
|
}
|
|
427
433
|
|
|
434
|
+
/**
|
|
435
|
+
* @param {BinaryBuffer} buffer with a checked, in-file level table
|
|
436
|
+
* @param {number} level_count
|
|
437
|
+
* @param {number} total_clusters
|
|
438
|
+
* @param {number} total_groups
|
|
439
|
+
* @param {VGeoDefect[]} out
|
|
440
|
+
*/
|
|
441
|
+
function check_levels(buffer, level_count, total_clusters, total_groups, out) {
|
|
442
|
+
let counted_clusters = 0;
|
|
443
|
+
let counted_groups = 0;
|
|
444
|
+
|
|
445
|
+
for (let level = 0; level < level_count; level++) {
|
|
446
|
+
const base = VGEO_HEADER_SIZE + level * VGEO_LEVEL_RECORD_SIZE;
|
|
447
|
+
|
|
448
|
+
buffer.position = base;
|
|
449
|
+
|
|
450
|
+
const min_error = buffer.readFloat32();
|
|
451
|
+
const max_error = buffer.readFloat32();
|
|
452
|
+
|
|
453
|
+
if (!Number.isFinite(min_error) || min_error < 0) {
|
|
454
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level ${level}: min_error ${min_error} must be finite and non-negative`));
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (!Number.isFinite(max_error) || max_error < 0) {
|
|
458
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level ${level}: max_error ${max_error} must be finite and non-negative`));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (min_error > max_error) {
|
|
462
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level ${level}: min_error ${min_error} exceeds max_error ${max_error}`));
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
buffer.position = base + 12;
|
|
466
|
+
|
|
467
|
+
const cluster_count = buffer.readUint32();
|
|
468
|
+
const group_count = buffer.readUint32();
|
|
469
|
+
|
|
470
|
+
if (cluster_count === 0) {
|
|
471
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level ${level}: cluster_count is 0`));
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (group_count === 0) {
|
|
475
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level ${level}: group_count is 0`));
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
counted_clusters += cluster_count;
|
|
479
|
+
counted_groups += group_count;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
if (counted_clusters !== total_clusters) {
|
|
483
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level table holds ${counted_clusters} clusters, header says ${total_clusters}`));
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (counted_groups !== total_groups) {
|
|
487
|
+
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `level table holds ${counted_groups} groups, header says ${total_groups}`));
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
428
491
|
/**
|
|
429
492
|
* @param {BinaryBuffer} buffer whole file
|
|
430
493
|
* @param {VGeoDefect[]} out
|
|
@@ -865,6 +928,7 @@ function check_page_nodes(pages, page_groups, page_clusters, out) {
|
|
|
865
928
|
* @type {Int32Array}
|
|
866
929
|
*/
|
|
867
930
|
const group_hits = new Int32Array(groups.length);
|
|
931
|
+
const node_hits = new Int32Array(nodes.length);
|
|
868
932
|
|
|
869
933
|
let structural = true;
|
|
870
934
|
|
|
@@ -902,12 +966,31 @@ function check_page_nodes(pages, page_groups, page_clusters, out) {
|
|
|
902
966
|
|
|
903
967
|
structural = false;
|
|
904
968
|
}
|
|
969
|
+
|
|
970
|
+
for (let i = 0; i < node.child_count; i++) {
|
|
971
|
+
node_hits[node.child_first + i]++;
|
|
972
|
+
}
|
|
905
973
|
});
|
|
906
974
|
|
|
907
975
|
if (!structural) {
|
|
908
976
|
continue;
|
|
909
977
|
}
|
|
910
978
|
|
|
979
|
+
// Strictly forward children with one parent per non-root node form one rooted tree.
|
|
980
|
+
for (let index = 0; index < nodes.length; index++) {
|
|
981
|
+
const expected = index === 0 ? 0 : 1;
|
|
982
|
+
|
|
983
|
+
if (node_hits[index] !== expected) {
|
|
984
|
+
out.push(new VGeoDefect(VGEO_DEFECT.PAGE_LAYOUT, `page ${page.page_index} node ${index}: has ${node_hits[index]} incoming node references, expected ${expected}`));
|
|
985
|
+
|
|
986
|
+
structural = false;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
if (!structural) {
|
|
991
|
+
continue;
|
|
992
|
+
}
|
|
993
|
+
|
|
911
994
|
const unreached = group_hits.reduce((count, hits) => count + (hits === 0 ? 1 : 0), 0);
|
|
912
995
|
const repeated = group_hits.reduce((count, hits) => count + (hits > 1 ? 1 : 0), 0);
|
|
913
996
|
|
|
@@ -1847,6 +1930,8 @@ export async function vgeo_validate_container(buffer) {
|
|
|
1847
1930
|
const total_clusters = Number(buffer.readUint64());
|
|
1848
1931
|
const total_groups = Number(buffer.readUint64());
|
|
1849
1932
|
|
|
1933
|
+
check_levels(buffer, level_count, total_clusters, total_groups, out);
|
|
1934
|
+
|
|
1850
1935
|
buffer.position = VGEO_HEADER_OFFSET.OBJECT_SPHERE;
|
|
1851
1936
|
|
|
1852
1937
|
const object_sphere = read_sphere(buffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUVirtualGeometryRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;
|
|
1
|
+
{"version":3,"file":"GPUVirtualGeometryRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAmHI;;;;;;;;;;;;;;;OAeG;IACH;QAd2C,IAAI,EAApC,sBAAsB;QACL,aAAa,GAA9B,MAAM;QACW,qBAAqB,GAAtC,MAAM;QAEW,mBAAmB,GAApC,MAAM;QAEW,cAAc,GAA/B,MAAM;QACW,cAAc,GAA/B,MAAM;QAEW,qBAAqB,GAAtC,MAAM;QACW,aAAa,GAA9B,MAAM;OAgFhB;IA3KD;;;;OAIG;IACH,KAFU,MAAM,CAER;IAER;;OAEG;IACH,cAFU,OAAO,CAEG;IAmKpB;;OAEG;IACH,yEAEC;IAED;;;;OAIG;IACH,4BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;OAEG;IACH,kCAEC;IAED;;;;;OAKG;IACH,6BAEC;IAED;;;;OAIG;IACH,gCAEC;IAWD;;;;;;OAMG;IACH,iCAKC;IArBD;;;;OAIG;IACH,4BAEC;IAgBD;;;;OAIG;IACH,0BAEC;IAED;;;;OAIG;IACH,yDAEC;IAED;;;;;OAKG;IACH,2BAEC;IAED;;OAEG;IACH;;;;;;;;MAEC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH;QAHgC,IAAI,EAAzB,WAAW;QACT,IAAI,CAqChB;IAwBD;;;;;;;;;;OAUG;IACH,cAHW,WAAW,GACT,MAAM,CA0BlB;IAED;;;;;;OAMG;IACH,mBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,eAFa,WAAW,EAAE,EAAE,CAI3B;IAED;;;;;;;;;OASG;IACH,mBAHW,UAAU,GACR,MAAM,CAkClB;IAED;;;;;;;;;;;;OAYG;IACH,wBAJW,UAAU,UACV,MAAM,GACJ,IAAI,CAOhB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAJ2B,iBAAiB,EAAjC,MAAM;QACU,gBAAgB,EAAhC,MAAM;QACJ,IAAI,CAgBhB;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,+BAEC;IAED;;;;;OAKG;IACH,aAFa,IAAI,CAKhB;IAED;;;;;;;;OAQG;IACH,WAFa,IAAI,CAOhB;;CACJ;qCA3nBY,OAAO,6BAA6B,EAAE,sBAAsB;0BAC5D,OAAO,kBAAkB,EAAE,WAAW;yBACtC,OAAO,iEAAiE,EAAE,UAAU"}
|
|
@@ -150,6 +150,8 @@ export class GPUVirtualGeometryRuntime {
|
|
|
150
150
|
*/
|
|
151
151
|
#instance_capacity = 0;
|
|
152
152
|
|
|
153
|
+
#collections_declared = false;
|
|
154
|
+
|
|
153
155
|
/**
|
|
154
156
|
* @type {number}
|
|
155
157
|
*/
|
|
@@ -414,6 +416,7 @@ export class GPUVirtualGeometryRuntime {
|
|
|
414
416
|
that runs against it appends nothing rather than appending past the end of a collection
|
|
415
417
|
whose real size it was never told.
|
|
416
418
|
*/
|
|
419
|
+
this.#collections_declared = false;
|
|
417
420
|
this.#instance_capacity = 0;
|
|
418
421
|
this.#meshlet_capacity = 0;
|
|
419
422
|
}
|
|
@@ -583,13 +586,16 @@ export class GPUVirtualGeometryRuntime {
|
|
|
583
586
|
assert.isNonNegativeInteger(instance_capacity, 'instance_capacity');
|
|
584
587
|
assert.isNonNegativeInteger(meshlet_capacity, 'meshlet_capacity');
|
|
585
588
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
+
if (!this.#collections_declared) {
|
|
590
|
+
this.#instance_capacity = instance_capacity;
|
|
591
|
+
this.#meshlet_capacity = meshlet_capacity;
|
|
592
|
+
this.#collections_declared = true;
|
|
593
|
+
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
589
596
|
|
|
590
|
-
this.#
|
|
591
|
-
|
|
592
|
-
: Math.min(this.#meshlet_capacity, meshlet_capacity);
|
|
597
|
+
this.#instance_capacity = Math.min(this.#instance_capacity, instance_capacity);
|
|
598
|
+
this.#meshlet_capacity = Math.min(this.#meshlet_capacity, meshlet_capacity);
|
|
593
599
|
}
|
|
594
600
|
|
|
595
601
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGeoPageFetcher.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH;IAgFI;;;;;;OAMG;IACH;QAL4B,YAAY,GAA7B,MAAM;QACuB,WAAW,SAA5B,MAAM;OAS5B;IAED;;OAEG;IACH,2BAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;OAGG;IACH,qCAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;;;;;OAOG;IACH,cAPW,mBAAmB,cACnB,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"VGeoPageFetcher.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH;IAgFI;;;;;;OAMG;IACH;QAL4B,YAAY,GAA7B,MAAM;QACuB,WAAW,SAA5B,MAAM;OAS5B;IAED;;OAEG;IACH,2BAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;OAGG;IACH,qCAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;;;;;OAOG;IACH,cAPW,mBAAmB,cACnB,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,CA4B7B;IAED;;;;;;OAMG;IACH,eAHW,mBAAmB,GACjB,MAAM,CAkClB;IAED;;;;;OAKG;IACH,WAFa,IAAI,CAsBhB;;CAgOJ;kCAheY,OAAO,uCAAuC,EAAE,mBAAmB;uBACnE,OAAO,4BAA4B,EAAE,QAAQ"}
|
|
@@ -174,6 +174,13 @@ export class VGeoPageFetcher {
|
|
|
174
174
|
);
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
+
if (signal?.aborted) {
|
|
178
|
+
return Promise.reject(new VGeoFetchError(
|
|
179
|
+
`page ${page_index}: the fetch was cancelled`, false,
|
|
180
|
+
String(signal.reason?.message ?? signal.reason)
|
|
181
|
+
));
|
|
182
|
+
}
|
|
183
|
+
|
|
177
184
|
if (this.#worker_count > 0 && !this.#no_workers && reader.source.descriptor !== undefined) {
|
|
178
185
|
const worker = this.#worker_for();
|
|
179
186
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGeoRuntimeTables.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js"],"names":[],"mappings":"AAmBA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH;IAmKI;;;;;;;;OAQG;IACH;QAP4B,aAAa,GAA9B,MAAM;QACW,SAAS,GAA1B,MAAM;QAEW,UAAU,GAA3B,MAAM;QACW,YAAY,GAA7B,MAAM;QACW,iBAAiB,GAAlC,MAAM;OA6BhB;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,+BAEC;IAED;;OAEG;IACH,kCAEC;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;OAEG;IACH,kCAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;;;;OAWG;IACH,8BALW,MAAM,qBACN,MAAM,GACJ,MAAM,
|
|
1
|
+
{"version":3,"file":"VGeoRuntimeTables.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js"],"names":[],"mappings":"AAmBA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH;IAmKI;;;;;;;;OAQG;IACH;QAP4B,aAAa,GAA9B,MAAM;QACW,SAAS,GAA1B,MAAM;QAEW,UAAU,GAA3B,MAAM;QACW,YAAY,GAA7B,MAAM;QACW,iBAAiB,GAAlC,MAAM;OA6BhB;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,+BAEC;IAED;;OAEG;IACH,kCAEC;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;OAEG;IACH,kCAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;;;;;OAWG;IACH,8BALW,MAAM,qBACN,MAAM,GACJ,MAAM,CAmDlB;IAED;;;;;;OAMG;IACH,kCAJW,MAAM,GACJ,MAAM,EAAE,CAgDpB;IAED;;;;OAIG;IACH,6BAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;OAIG;IACH,0BAJW,MAAM,cACN,MAAM,GACJ,MAAM,CAQlB;IAED;;;;OAIG;IACH,qBAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,qBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;OAGG;IACH,uBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;OAQG;IACH,sBAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,sBARW,MAAM,QACN,QAAQ,gBACR,MAAM,GACJ,MAAM,CAkFlB;IAED;;;;;OAKG;IACH,qBAHW,QAAQ,GACN,MAAM,CAOlB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAHW,MAAM,GACJ,OAAO,CAuCnB;IAED;;;;;;OAMG;IACH,uBAHW,MAAM,GACJ,IAAI,MAAM,CAAC,CAIvB;IAED;;;;;;;;;;OAUG;IACH,4BAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;OAIG;IACH,uBAFa,MAAM,EAAE,CAQpB;IAwWD;;;;;;;;;;;;OAYG;IACH,+BALW,MAAM,SACN,MAAM,cACN,OAAO,GACL,IAAI,CAUhB;IAED;;;;OAIG;IACH,8BAJW,MAAM,SACN,MAAM,GACJ,OAAO,CAQnB;IAED;;;;;OAKG;IACH,qBAHW,MAAM,GACJ,MAAM,EAAE,CAapB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,MAAM,EAAE,CAOpB;IAED;;;;;;OAMG;IACH,2BAJW,MAAM,gBACN,MAAM,GACJ,OAAO,CAYnB;;CA4DJ;uBAntCY,OAAO,4BAA4B,EAAE,QAAQ"}
|
|
@@ -374,7 +374,7 @@ export class VGeoRuntimeTables {
|
|
|
374
374
|
assert.isNonNegativeInteger(page_count, 'page_count');
|
|
375
375
|
assert.greaterThan(page_count, 0, 'page_count');
|
|
376
376
|
|
|
377
|
-
const recycled = this.#free_geometry_rows.
|
|
377
|
+
const recycled = this.#free_geometry_rows[this.#free_geometry_rows.length - 1];
|
|
378
378
|
|
|
379
379
|
const row = recycled ?? this.#geometry_row_high_water;
|
|
380
380
|
|
|
@@ -396,6 +396,8 @@ export class VGeoRuntimeTables {
|
|
|
396
396
|
|
|
397
397
|
if (recycled === undefined) {
|
|
398
398
|
this.#geometry_row_high_water = row + 1;
|
|
399
|
+
} else {
|
|
400
|
+
this.#free_geometry_rows.pop();
|
|
399
401
|
}
|
|
400
402
|
|
|
401
403
|
this.#geometry_allocations.set(row, allocation);
|
|
@@ -13,7 +13,7 @@ export class TinyGltf {
|
|
|
13
13
|
* @readonly
|
|
14
14
|
* @type {TextureFormat}
|
|
15
15
|
*/
|
|
16
|
-
static readonly "__#
|
|
16
|
+
static readonly "__#264@#UNCOMPRESSED_TARGET": TextureFormat;
|
|
17
17
|
/**
|
|
18
18
|
* @param {AssetManager} assetManager
|
|
19
19
|
* @param {AssetRequestScope} [scope]
|
|
@@ -24,8 +24,9 @@ export const SCENE_DATABASE_SPEC = GPUDatabaseDefinition.from({
|
|
|
24
24
|
|
|
25
25
|
SCENE_DATABASE_SPEC.add_link({ table: 'water_bodies', field: 'node', target_database: SCENE_DATABASE_SPEC,
|
|
26
26
|
target_table: 'transforms', nullable: false, owning: false });
|
|
27
|
+
// Every body has its surface row: any body can carry wave particles, and its bounds are read every frame.
|
|
27
28
|
SCENE_DATABASE_SPEC.add_link({ table: 'water_bodies', field: 'wave', target_database: SCENE_DATABASE_SPEC,
|
|
28
|
-
target_table: 'water_waves', nullable:
|
|
29
|
+
target_table: 'water_waves', nullable: false, owning: true });
|
|
29
30
|
SCENE_DATABASE_SPEC.add_link({ table: 'water_waves', field: 'node', target_database: SCENE_DATABASE_SPEC,
|
|
30
31
|
target_table: 'transforms', nullable: false, owning: false });
|
|
31
32
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unnormalized inverse discrete Fourier transform of 128 complex values, in place:
|
|
3
|
+
* `x[m] = Σₙ X[n] · e^{+2πi·n·m/128}`.
|
|
4
|
+
*
|
|
5
|
+
* Radix-2 decimation in time over a private array: a bit-reversal permutation, then seven butterfly
|
|
6
|
+
* stages of 64 butterflies each — 448 in all, a fixed budget. One invocation transforms one line, so a
|
|
7
|
+
* kernel built on it needs no workgroup memory and no barriers.
|
|
8
|
+
*
|
|
9
|
+
* @type {CodeChunk}
|
|
10
|
+
*/
|
|
11
|
+
export const chunk_fft128_inverse: CodeChunk;
|
|
12
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
13
|
+
//# sourceMappingURL=chunk_fft128_inverse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_fft128_inverse.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/fft/chunk_fft128_inverse.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,mCAFU,SAAS,CA8BU;0BAzCH,gCAAgC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_complex_multiply } from "../complex/chunk_complex_multiply.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Unnormalized inverse discrete Fourier transform of 128 complex values, in place:
|
|
6
|
+
* `x[m] = Σₙ X[n] · e^{+2πi·n·m/128}`.
|
|
7
|
+
*
|
|
8
|
+
* Radix-2 decimation in time over a private array: a bit-reversal permutation, then seven butterfly
|
|
9
|
+
* stages of 64 butterflies each — 448 in all, a fixed budget. One invocation transforms one line, so a
|
|
10
|
+
* kernel built on it needs no workgroup memory and no barriers.
|
|
11
|
+
*
|
|
12
|
+
* @type {CodeChunk}
|
|
13
|
+
*/
|
|
14
|
+
export const chunk_fft128_inverse = CodeChunk.from(
|
|
15
|
+
//language=WGSL
|
|
16
|
+
`
|
|
17
|
+
fn fft128_inverse(data: ptr<function, array<vec2<f32>, 128>>) {
|
|
18
|
+
for (var i = 0u; i < 128u; i++) {
|
|
19
|
+
let j = reverseBits(i) >> 25u;
|
|
20
|
+
if (j > i) {
|
|
21
|
+
let swap = (*data)[i];
|
|
22
|
+
(*data)[i] = (*data)[j];
|
|
23
|
+
(*data)[j] = swap;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
for (var stage = 0u; stage < 7u; stage++) {
|
|
27
|
+
let span = 1u << stage;
|
|
28
|
+
// e^{+iπ·offset/span}: the inverse transform's twiddle for a butterfly over 2·span values
|
|
29
|
+
let turn = 3.14159265358979 / f32(span);
|
|
30
|
+
for (var k = 0u; k < 64u; k++) {
|
|
31
|
+
let offset = k & (span - 1u);
|
|
32
|
+
let i = ((k >> stage) << (stage + 1u)) + offset;
|
|
33
|
+
let j = i + span;
|
|
34
|
+
let angle = turn * f32(offset);
|
|
35
|
+
let t = complex_multiply(vec2<f32>(cos(angle), sin(angle)), (*data)[j]);
|
|
36
|
+
let u = (*data)[i];
|
|
37
|
+
(*data)[i] = u + t;
|
|
38
|
+
(*data)[j] = u - t;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`, [chunk_complex_multiply]);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Four unnormalized inverse discrete Fourier transforms of 128 complex values, cooperatively by a workgroup of
|
|
3
|
+
* 256 invocations: `x[m] = Σₙ X[n] · e^{+2πi·n·m/128}` for each of the four lines of `fft128x4_lines`.
|
|
4
|
+
*
|
|
5
|
+
* The caller writes each line's input in bit-reversed order (`X[n]` at `reverseBits(n) >> 25`), calls
|
|
6
|
+
* `fft128x4_inverse(lane)` from every invocation in uniform control flow, and reads the output in natural order.
|
|
7
|
+
* Radix-2 decimation in time: seven stages, each invocation one butterfly of one line a stage, a barrier
|
|
8
|
+
* between stages. The values live in 4 KiB of workgroup memory instead of a private array per invocation, which
|
|
9
|
+
* a 128-point line spills to local memory.
|
|
10
|
+
*
|
|
11
|
+
* @type {CodeChunk}
|
|
12
|
+
*/
|
|
13
|
+
export const chunk_fft128x4_inverse_workgroup: CodeChunk;
|
|
14
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
15
|
+
//# sourceMappingURL=chunk_fft128x4_inverse_workgroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_fft128x4_inverse_workgroup.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/shader/chunk/math/fft/chunk_fft128x4_inverse_workgroup.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,+CAFU,SAAS,CAyBU;0BAtCH,gCAAgC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CodeChunk } from "../../../compiler/CodeChunk.js";
|
|
2
|
+
import { chunk_complex_multiply } from "../complex/chunk_complex_multiply.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Four unnormalized inverse discrete Fourier transforms of 128 complex values, cooperatively by a workgroup of
|
|
6
|
+
* 256 invocations: `x[m] = Σₙ X[n] · e^{+2πi·n·m/128}` for each of the four lines of `fft128x4_lines`.
|
|
7
|
+
*
|
|
8
|
+
* The caller writes each line's input in bit-reversed order (`X[n]` at `reverseBits(n) >> 25`), calls
|
|
9
|
+
* `fft128x4_inverse(lane)` from every invocation in uniform control flow, and reads the output in natural order.
|
|
10
|
+
* Radix-2 decimation in time: seven stages, each invocation one butterfly of one line a stage, a barrier
|
|
11
|
+
* between stages. The values live in 4 KiB of workgroup memory instead of a private array per invocation, which
|
|
12
|
+
* a 128-point line spills to local memory.
|
|
13
|
+
*
|
|
14
|
+
* @type {CodeChunk}
|
|
15
|
+
*/
|
|
16
|
+
export const chunk_fft128x4_inverse_workgroup = CodeChunk.from(
|
|
17
|
+
//language=WGSL
|
|
18
|
+
`
|
|
19
|
+
var<workgroup> fft128x4_lines: array<vec2<f32>, 512>;
|
|
20
|
+
|
|
21
|
+
fn fft128x4_inverse(lane: u32) {
|
|
22
|
+
let line = (lane >> 6u) << 7u;
|
|
23
|
+
let k = lane & 63u;
|
|
24
|
+
for (var stage = 0u; stage < 7u; stage++) {
|
|
25
|
+
workgroupBarrier();
|
|
26
|
+
let span = 1u << stage;
|
|
27
|
+
let offset = k & (span - 1u);
|
|
28
|
+
let i = line + ((k >> stage) << (stage + 1u)) + offset;
|
|
29
|
+
let j = i + span;
|
|
30
|
+
// e^{+iπ·offset/span}: the inverse transform's twiddle for a butterfly over 2·span values
|
|
31
|
+
let angle = 3.14159265358979 / f32(span) * f32(offset);
|
|
32
|
+
let t = complex_multiply(vec2<f32>(cos(angle), sin(angle)), fft128x4_lines[j]);
|
|
33
|
+
let u = fft128x4_lines[i];
|
|
34
|
+
fft128x4_lines[i] = u + t;
|
|
35
|
+
fft128x4_lines[j] = u - t;
|
|
36
|
+
}
|
|
37
|
+
workgroupBarrier();
|
|
38
|
+
}
|
|
39
|
+
`, [chunk_complex_multiply]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"AAyIA;IAoBI;;OAEG;IACH;cAFoB,MAAM;cAAQ,UAAU;MAI3C;IAED;;;;;OAKG;IACH,4BAMC;IAED;;;;;;;;;;;;OAYG;IACH,mBALW,MAAM,SACN,UAAU,GAAC,MAAM,GAEf,IAAI,CAoDhB;IAED;;;OAGG;IACH,8CAEC;IAGD;;;OAGG;IACH,6CAEC;IAaD;;;;OAIG;IACH;;;;;;;;;;;OAWG;IACH,sBAHW,MAAM,GACJ,OAAO,CAInB;IAED,+FAYC;IAED;;;;;;OAMG;IACH;QAJ4B,KAAK,GAAtB,MAAM;QACW,KAAK,GAAtB,MAAM;QACJ,6BAA6B,CAsBzC;IAED;;;;OAIG;IACH,gBAHW,6BAA6B,GAC3B,OAAO,CAQnB;IAED;;;OAGG;IACH,qBAFW,iBAAe,MAAM,QAW/B;IAED;;OAEG;IACH,oCAFa,wBAAwB,CAiBpC;IAED;;;OAGG;IACH,yBAFY,EAAE,EAAE,CAcf;IAED;;;;OAIG;IACH,8BAHW,iBAAe,MAAM,GACnB,wBAAwB,CAMpC;IAED;;;;;OAKG;IACH,qCAHW,sBAAsB,GACpB,oBAAoB,EAAE,CAgBlC;IAED;;;OAGG;IACH,qBAFY,SAAS,CAwGpB;IAED;;;;;;;;;;;;;;;OAeG;IACH,iCAHW,YAAY,GACV,OAAO,CAwFnB;;CACJ;;eA2BS,SAAS,2BAA2B,CAAC;;2BA5oBlC,OAAO,yCAAyC,EAAE,YAAY;qCAC9D,OAAO,2CAA2C,EAAE,sBAAsB;yBAC1E,OAAO,uBAAuB,EAAE,UAAU;8CALT,oCAAoC;yCAZzC,0DAA0D;0BAIzE,0BAA0B"}
|
|
@@ -83,6 +83,8 @@ function gen_type_storage_texture(member) {
|
|
|
83
83
|
|
|
84
84
|
if (member.viewDimension === "2d") {
|
|
85
85
|
proper_type = "texture_storage_2d"
|
|
86
|
+
} else if (member.viewDimension === "2d-array") {
|
|
87
|
+
proper_type = "texture_storage_2d_array";
|
|
86
88
|
} else if (member.viewDimension === "3d") {
|
|
87
89
|
proper_type = "texture_storage_3d";
|
|
88
90
|
} else {
|
|
@@ -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,
|