@woosh/meep-engine 3.39.0 → 3.40.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-terrain.js +1 -1
- package/package.json +1 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +17 -4
- package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +100 -110
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
- package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
- package/src/engine/graphics3/WaterSystem.d.ts +21 -74
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +174 -367
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
- package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
- package/src/format/image/avif/api/convert_to_rgba.js +10 -9
- package/src/format/image/avif/api/decode_avif.d.ts +2 -2
- package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
- package/src/format/image/avif/api/decode_avif.js +1 -1
- package/src/shade/playground/ssr_reprojection/README.md +111 -103
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
- package/src/shade/playground/ssr_reprojection/index.html +80 -79
- package/src/shade/playground/ssr_reprojection/main.js +256 -247
- package/src/shade/playground/ssr_variance/capture.js +96 -96
- package/src/shade/playground/ssr_variance/reference.js +78 -78
- package/src/shade/playground/vsm/README.md +96 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
- package/src/shade/playground/vsm/clipmap_panel.js +138 -0
- package/src/shade/playground/vsm/index.html +170 -0
- package/src/shade/playground/vsm/main.d.ts +2 -0
- package/src/shade/playground/vsm/main.d.ts.map +1 -0
- package/src/shade/playground/vsm/main.js +389 -0
- package/src/shade/playground/vsm/scenes.d.ts +52 -0
- package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
- package/src/shade/playground/vsm/scenes.js +320 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
- package/src/shade/playground/vsm/verify_vsm.js +305 -0
- package/src/shade/playground/water_refraction/README.md +57 -9
- package/src/shade/playground/water_refraction/main.js +12 -3
- package/src/shade/playground/water_refraction/world.d.ts +1 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
- package/src/shade/playground/water_refraction/world.js +15 -5
- package/src/shade/renderer/Renderer.d.ts +19 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +72 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
- package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
- package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
- package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
- package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
- package/src/shade/renderer/water/chunk_water_transport.js +3 -3
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
- package/src/shade/renderer/water/shader_water.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +490 -406
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
- package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
- package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
- package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
- package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
- package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The slot bookkeeping of a physical page cache — a square grid of `page_size + 2*border` slots
|
|
5
|
+
* over an atlas — with no texture behind it: which slots are taken, when each was last touched,
|
|
6
|
+
* which may never be evicted, and the mip each holds.
|
|
7
|
+
*
|
|
8
|
+
* {@link VTPhysicalCache} adds the layer textures and uploads on top of this. A cache whose pages
|
|
9
|
+
* are drawn rather than uploaded — the virtual shadow map's pool is a region of the shadow atlas —
|
|
10
|
+
* uses it on its own.
|
|
11
|
+
*
|
|
12
|
+
* Eviction metadata lives here as flat parallel arrays; the pick is a linear scan, which at the
|
|
13
|
+
* typical slot count (≤ ~1k) is cheaper than maintaining a heap.
|
|
14
|
+
*/
|
|
15
|
+
export class VTPhysicalSlots {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Payload texels per page side, without border.
|
|
19
|
+
* @type {number}
|
|
20
|
+
* @readonly
|
|
21
|
+
*/
|
|
22
|
+
page_size;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Border texels on each side of the payload.
|
|
26
|
+
* @type {number}
|
|
27
|
+
* @readonly
|
|
28
|
+
*/
|
|
29
|
+
border;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* page_size + 2*border.
|
|
33
|
+
* @type {number}
|
|
34
|
+
* @readonly
|
|
35
|
+
*/
|
|
36
|
+
slot_size;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Atlas side length in texels.
|
|
40
|
+
* @type {number}
|
|
41
|
+
* @readonly
|
|
42
|
+
*/
|
|
43
|
+
atlas_size;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Slots along one atlas axis.
|
|
47
|
+
* @type {number}
|
|
48
|
+
* @readonly
|
|
49
|
+
*/
|
|
50
|
+
slots_per_axis;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Total slot count.
|
|
54
|
+
* @type {number}
|
|
55
|
+
* @readonly
|
|
56
|
+
*/
|
|
57
|
+
capacity;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Free slot indices, used as a stack.
|
|
61
|
+
* @type {number[]}
|
|
62
|
+
*/
|
|
63
|
+
#free = [];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Per-slot: frame index of the last feedback touch.
|
|
67
|
+
* @type {Uint32Array}
|
|
68
|
+
*/
|
|
69
|
+
#last_touch;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Per-slot: 1 when the slot must never be evicted (stack root pages).
|
|
73
|
+
* @type {Uint8Array}
|
|
74
|
+
*/
|
|
75
|
+
#locked;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Per-slot: 1 when the slot is allocated.
|
|
79
|
+
* @type {Uint8Array}
|
|
80
|
+
*/
|
|
81
|
+
#occupied;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Per-slot: virtual mip of the resident page — eviction tie-break only
|
|
85
|
+
* (prefer shedding fine pages, shrinking the resident quadtree from the
|
|
86
|
+
* leaves).
|
|
87
|
+
* @type {Uint8Array}
|
|
88
|
+
*/
|
|
89
|
+
#mip;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @param {Object} options
|
|
94
|
+
* @param {number} [options.atlas_size]
|
|
95
|
+
* @param {number} [options.page_size]
|
|
96
|
+
* @param {number} [options.border]
|
|
97
|
+
*/
|
|
98
|
+
constructor({
|
|
99
|
+
atlas_size = 4096,
|
|
100
|
+
page_size = 128,
|
|
101
|
+
border = 4,
|
|
102
|
+
}) {
|
|
103
|
+
assert.isNonNegativeInteger(atlas_size, 'atlas_size');
|
|
104
|
+
assert.isNonNegativeInteger(page_size, 'page_size');
|
|
105
|
+
assert.isNonNegativeInteger(border, 'border');
|
|
106
|
+
|
|
107
|
+
this.page_size = page_size;
|
|
108
|
+
this.border = border;
|
|
109
|
+
this.slot_size = page_size + border * 2;
|
|
110
|
+
this.atlas_size = atlas_size;
|
|
111
|
+
|
|
112
|
+
this.slots_per_axis = Math.floor(atlas_size / this.slot_size);
|
|
113
|
+
this.capacity = this.slots_per_axis * this.slots_per_axis;
|
|
114
|
+
|
|
115
|
+
assert.greaterThan(this.capacity, 0, 'cache capacity');
|
|
116
|
+
|
|
117
|
+
this.#last_touch = new Uint32Array(this.capacity);
|
|
118
|
+
this.#locked = new Uint8Array(this.capacity);
|
|
119
|
+
this.#occupied = new Uint8Array(this.capacity);
|
|
120
|
+
this.#mip = new Uint8Array(this.capacity);
|
|
121
|
+
|
|
122
|
+
for (let i = this.capacity - 1; i >= 0; i--) {
|
|
123
|
+
this.#free.push(i);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Number of allocated slots.
|
|
129
|
+
* @returns {number}
|
|
130
|
+
*/
|
|
131
|
+
get used() {
|
|
132
|
+
return this.capacity - this.#free.length;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
*
|
|
137
|
+
* @param {number} slot
|
|
138
|
+
* @returns {{x: number, y: number}} slot grid coordinates
|
|
139
|
+
*/
|
|
140
|
+
slot_coords(slot) {
|
|
141
|
+
return {
|
|
142
|
+
x: slot % this.slots_per_axis,
|
|
143
|
+
y: (slot / this.slots_per_axis) | 0,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
*
|
|
149
|
+
* @param {number} slot
|
|
150
|
+
* @returns {boolean}
|
|
151
|
+
*/
|
|
152
|
+
is_occupied(slot) {
|
|
153
|
+
return this.#occupied[slot] === 1;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
*
|
|
158
|
+
* @param {number} current_frame
|
|
159
|
+
* @param {boolean} [locked]
|
|
160
|
+
* @param {number} [mip] virtual mip of the incoming page
|
|
161
|
+
* @returns {number} slot index, or -1 when full
|
|
162
|
+
*/
|
|
163
|
+
allocate(current_frame, locked = false, mip = 0) {
|
|
164
|
+
if (this.#free.length === 0) {
|
|
165
|
+
return -1;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const slot = this.#free.pop();
|
|
169
|
+
|
|
170
|
+
this.#occupied[slot] = 1;
|
|
171
|
+
this.#locked[slot] = locked ? 1 : 0;
|
|
172
|
+
this.#last_touch[slot] = current_frame;
|
|
173
|
+
this.#mip[slot] = mip;
|
|
174
|
+
|
|
175
|
+
return slot;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
*
|
|
180
|
+
* @param {number} slot
|
|
181
|
+
*/
|
|
182
|
+
free(slot) {
|
|
183
|
+
assert.equal(this.#occupied[slot], 1, `slot ${slot} is not allocated`);
|
|
184
|
+
|
|
185
|
+
this.#occupied[slot] = 0;
|
|
186
|
+
this.#locked[slot] = 0;
|
|
187
|
+
|
|
188
|
+
this.#free.push(slot);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
*
|
|
193
|
+
* @param {number} slot
|
|
194
|
+
* @param {number} frame
|
|
195
|
+
*/
|
|
196
|
+
touch(slot, frame) {
|
|
197
|
+
this.#last_touch[slot] = frame;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
*
|
|
202
|
+
* @param {number} slot
|
|
203
|
+
* @returns {number}
|
|
204
|
+
*/
|
|
205
|
+
last_touch(slot) {
|
|
206
|
+
return this.#last_touch[slot];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Pick the least-recently-touched evictable slot.
|
|
211
|
+
*
|
|
212
|
+
* @param {number} current_frame
|
|
213
|
+
* @param {number} protect_window slots touched within this many frames
|
|
214
|
+
* are not eligible — feedback readback runs a couple of frames
|
|
215
|
+
* behind, so "recently touched" really means "probably on screen"
|
|
216
|
+
* @returns {number} slot index, or -1 when nothing is evictable
|
|
217
|
+
*/
|
|
218
|
+
find_eviction_candidate(current_frame, protect_window) {
|
|
219
|
+
let best = -1;
|
|
220
|
+
let best_touch = 0xFFFFFFFF;
|
|
221
|
+
let best_mip = 0xFF;
|
|
222
|
+
|
|
223
|
+
for (let slot = 0; slot < this.capacity; slot++) {
|
|
224
|
+
if (this.#occupied[slot] === 0 || this.#locked[slot] === 1) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const touch = this.#last_touch[slot];
|
|
229
|
+
|
|
230
|
+
if (current_frame - touch < protect_window) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const mip = this.#mip[slot];
|
|
235
|
+
|
|
236
|
+
if (touch < best_touch || (touch === best_touch && mip < best_mip)) {
|
|
237
|
+
best_touch = touch;
|
|
238
|
+
best_mip = mip;
|
|
239
|
+
best = slot;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return best;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* vt_stack_wrap_uv(uv, flags) — repeat/clamp addressing
|
|
10
10
|
* vt_mip_level(info, ddx, ddy) — analytic LOD in virtual-texel units
|
|
11
11
|
* vt_page_table_load(table, info, uv, m) — one textureLoad into the shared table
|
|
12
|
-
* vt_entry_unpack(word) — page table entry fields
|
|
12
|
+
* vt_entry_unpack(word) — page table entry fields, from {@link chunk_vt_page_table_entry}
|
|
13
13
|
* vt_physical_uv(entry, info, uv) — atlas UV for a wrapped virtual UV
|
|
14
14
|
*
|
|
15
15
|
* The mip formula must be byte-identical between feedback and sampling —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build_chunk_vt_lookup.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAL0B,SAAS,EAAxB,MAAM;IACS,MAAM,EAArB,MAAM;IACS,UAAU,EAAzB,MAAM;IACJ,SAAS,
|
|
1
|
+
{"version":3,"file":"build_chunk_vt_lookup.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;IAL0B,SAAS,EAAxB,MAAM;IACS,MAAM,EAArB,MAAM;IACS,UAAU,EAAzB,MAAM;IACJ,SAAS,CA2GrB;0BArIyB,oCAAoC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
-
import {
|
|
2
|
+
import { chunk_vt_page_table_entry } from "./chunk_vt_page_table_entry.js";
|
|
3
3
|
import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -13,7 +13,7 @@ import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
|
|
|
13
13
|
* vt_stack_wrap_uv(uv, flags) — repeat/clamp addressing
|
|
14
14
|
* vt_mip_level(info, ddx, ddy) — analytic LOD in virtual-texel units
|
|
15
15
|
* vt_page_table_load(table, info, uv, m) — one textureLoad into the shared table
|
|
16
|
-
* vt_entry_unpack(word) — page table entry fields
|
|
16
|
+
* vt_entry_unpack(word) — page table entry fields, from {@link chunk_vt_page_table_entry}
|
|
17
17
|
* vt_physical_uv(entry, info, uv) — atlas UV for a wrapped virtual UV
|
|
18
18
|
*
|
|
19
19
|
* The mip formula must be byte-identical between feedback and sampling —
|
|
@@ -41,23 +41,6 @@ const VT_INV_ATLAS_SIZE: f32 = ${(1 / atlas_size).toExponential()};
|
|
|
41
41
|
const VT_STACK_FLAG_WRAP_REPEAT: u32 = 1u;
|
|
42
42
|
const VT_STACK_FLAG_UV_SET_1: u32 = 2u;
|
|
43
43
|
|
|
44
|
-
struct VTPageTableEntry {
|
|
45
|
-
phys: vec2<u32>,
|
|
46
|
-
mip: u32,
|
|
47
|
-
valid: bool,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
fn vt_entry_unpack(word: u32) -> VTPageTableEntry {
|
|
51
|
-
return VTPageTableEntry(
|
|
52
|
-
vec2<u32>(
|
|
53
|
-
word & ${(1 << VT_ENTRY_PHYS_BITS) - 1}u,
|
|
54
|
-
(word >> ${VT_ENTRY_PHYS_BITS}u) & ${(1 << VT_ENTRY_PHYS_BITS) - 1}u
|
|
55
|
-
),
|
|
56
|
-
(word >> ${VT_ENTRY_PHYS_BITS * 2}u) & ${(1 << VT_ENTRY_MIP_BITS) - 1}u,
|
|
57
|
-
(word & ${1 << (VT_ENTRY_PHYS_BITS * 2 + VT_ENTRY_MIP_BITS)}u) != 0u
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
44
|
fn vt_stack_wrap_uv(uv: vec2<f32>, flags: u32) -> vec2<f32> {
|
|
62
45
|
if ((flags & VT_STACK_FLAG_WRAP_REPEAT) != 0u) {
|
|
63
46
|
return fract(uv);
|
|
@@ -145,6 +128,7 @@ fn vt_physical_uv(
|
|
|
145
128
|
`,
|
|
146
129
|
[
|
|
147
130
|
VT_STACK_INFO_STRUCT.declaration_chunk,
|
|
131
|
+
chunk_vt_page_table_entry,
|
|
148
132
|
]
|
|
149
133
|
);
|
|
150
134
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page-table entry word as its fields — the WGSL side of {@link vt_entry_pack} /
|
|
3
|
+
* {@link vt_entry_unpack}: the physical slot holding a page, the mip of that page, and whether the
|
|
4
|
+
* entry points at anything.
|
|
5
|
+
*
|
|
6
|
+
* Independent of any cache geometry, so it is shared by every table that stores entries in this
|
|
7
|
+
* layout — the virtual texture page table, and the virtual shadow map's page rows.
|
|
8
|
+
*
|
|
9
|
+
* @type {CodeChunk}
|
|
10
|
+
*/
|
|
11
|
+
export const chunk_vt_page_table_entry: CodeChunk;
|
|
12
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
13
|
+
//# sourceMappingURL=chunk_vt_page_table_entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_vt_page_table_entry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wCAFU,SAAS,CAsBjB;0BAjCwB,oCAAoC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { VT_ENTRY_MIP_BITS, VT_ENTRY_PHYS_BITS } from "./VT_CONSTANTS.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The page-table entry word as its fields — the WGSL side of {@link vt_entry_pack} /
|
|
6
|
+
* {@link vt_entry_unpack}: the physical slot holding a page, the mip of that page, and whether the
|
|
7
|
+
* entry points at anything.
|
|
8
|
+
*
|
|
9
|
+
* Independent of any cache geometry, so it is shared by every table that stores entries in this
|
|
10
|
+
* layout — the virtual texture page table, and the virtual shadow map's page rows.
|
|
11
|
+
*
|
|
12
|
+
* @type {CodeChunk}
|
|
13
|
+
*/
|
|
14
|
+
export const chunk_vt_page_table_entry = CodeChunk.from(
|
|
15
|
+
//language=WGSL
|
|
16
|
+
`
|
|
17
|
+
struct VTPageTableEntry {
|
|
18
|
+
phys: vec2<u32>,
|
|
19
|
+
mip: u32,
|
|
20
|
+
valid: bool,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
fn vt_entry_unpack(word: u32) -> VTPageTableEntry {
|
|
24
|
+
return VTPageTableEntry(
|
|
25
|
+
vec2<u32>(
|
|
26
|
+
word & ${(1 << VT_ENTRY_PHYS_BITS) - 1}u,
|
|
27
|
+
(word >> ${VT_ENTRY_PHYS_BITS}u) & ${(1 << VT_ENTRY_PHYS_BITS) - 1}u
|
|
28
|
+
),
|
|
29
|
+
(word >> ${VT_ENTRY_PHYS_BITS * 2}u) & ${(1 << VT_ENTRY_MIP_BITS) - 1}u,
|
|
30
|
+
(word & ${1 << (VT_ENTRY_PHYS_BITS * 2 + VT_ENTRY_MIP_BITS)}u) != 0u
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
`
|
|
34
|
+
);
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/** Production water channel. Only AVBOIT's shared resolve composites its radiance. */
|
|
2
2
|
export class GPUWaterRenderer {
|
|
3
|
-
|
|
3
|
+
scene: any;
|
|
4
|
+
body_count: number;
|
|
5
|
+
meshlet_capacity: number;
|
|
6
|
+
time: number;
|
|
7
|
+
waves: any;
|
|
4
8
|
settings: {
|
|
5
9
|
enabled: boolean;
|
|
6
10
|
max_distance: number;
|
|
@@ -11,6 +15,7 @@ export class GPUWaterRenderer {
|
|
|
11
15
|
reflections: number;
|
|
12
16
|
debug_view: number;
|
|
13
17
|
inscatter_segments: number;
|
|
18
|
+
tessellation_pixels: number;
|
|
14
19
|
};
|
|
15
20
|
/**
|
|
16
21
|
* The frame's water bodies table, recorded by whoever owns the surfaces at the head of the frame;
|
|
@@ -18,7 +23,7 @@ export class GPUWaterRenderer {
|
|
|
18
23
|
* @type {import("./medium/GPUWaterBodies.js").GPUWaterBodies|null}
|
|
19
24
|
*/
|
|
20
25
|
bodies: import("./medium/GPUWaterBodies.js").GPUWaterBodies | null;
|
|
21
|
-
avboit_is_empty(): boolean;
|
|
26
|
+
avboit_is_empty(view: any): boolean;
|
|
22
27
|
/** Optional single-pixel readback on the next rendered water frame. No per-frame readback. */
|
|
23
28
|
request_probe(uv: any): Promise<any>;
|
|
24
29
|
dispose(): void;
|
|
@@ -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":"AAmBA,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;IAQd,oCAIC;IAED,8FAA8F;IAC9F,qCAgBC;IAED,gBAKC;IAED;;;;;;;;;;;;;;;;MAyIC;IAQD;;;;;YAMC;IAED;;;;;;;;;;MAOC;IAED;;;;;;;;;;;;;;MAwBC;IAED,gGAAgG;IAChG,mEAYC;;CA4BJ"}
|
|
@@ -1,45 +1,32 @@
|
|
|
1
|
-
import { half_to_float_uint16 } from "../../../core/binary/half_to_float_uint16.js";
|
|
2
1
|
import { TextureResourceDescriptor } from "../../device/graph/TextureResourceDescriptor.js";
|
|
3
2
|
import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.js";
|
|
4
3
|
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
5
4
|
import { graph_image_pass } from "../shader/graph/graph_image_pass.js";
|
|
6
5
|
import { ShadeIndirectLightingMode } from "../ShadeIndirectLightingMode.js";
|
|
7
|
-
import {
|
|
6
|
+
import { BufferResourceDescriptor } from "../../device/graph/BufferResourceDescriptor.js";
|
|
7
|
+
import { build_indirect_draw_command } from "../gpu_primitive/indirect/build_indirect_draw_command.js";
|
|
8
|
+
import { graph_water_tessellation } from "./surface/graph_water_tessellation.js";
|
|
9
|
+
import { WATER_TESSELLATION_STRUCT, WATER_TILE_VERTEX_COUNT } from "./surface/chunk_water_tessellation.js";
|
|
8
10
|
import { STATIC_GRAPHICS_ENGINE_ASSETS } from "../STATIC_GRAPHICS_ENGINE_ASSETS.js";
|
|
9
11
|
import { SAMPLER_LINEAR_UPSCALE } from "../texture/SAMPLER_LINEAR_UPSCALE.js";
|
|
10
12
|
import { SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR } from "../shadow/map/SHADOWMAP_COMPARE_SAMPLER_DESCRIPTOR.js";
|
|
11
13
|
import { create_water_finalize_pipeline_brick4, create_water_finalize_pipeline_ibl, create_water_pipeline,
|
|
12
|
-
|
|
13
|
-
WATER_TRACE_STRUCT } from "./shader_water.js";
|
|
14
|
+
WATER_FINALIZE_RESOURCES_BRICK4, WATER_FINALIZE_RESOURCES_IBL, WATER_RESOURCES,
|
|
15
|
+
WATER_TRACE_STRUCT, WATER_GRID_STRUCT } from "./shader_water.js";
|
|
14
16
|
import { shader_water_background_copy, shader_water_debug, shader_water_draw,
|
|
15
17
|
shader_water_occupancy, shader_water_splat, shader_water_confidence_seed,
|
|
16
18
|
shader_water_confidence_x, shader_water_confidence_y } from "./shader_water_avboit.js";
|
|
17
19
|
|
|
18
|
-
/**
|
|
19
|
-
* A surface the water passes can draw: visible, and with its surface interface published by the
|
|
20
|
-
* producer this frame.
|
|
21
|
-
* @param {Object} s
|
|
22
|
-
* @returns {boolean}
|
|
23
|
-
*/
|
|
24
|
-
function water_surface_drawable(s) {
|
|
25
|
-
return s.visible && s.gpu_surface !== undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Draw a surface interface's mesh: the producer's index buffer over its vertex storage buffer.
|
|
30
|
-
* @param {ShadeGPURenderPassEncoder} render
|
|
31
|
-
* @param {{indices: GPUBuffer, index_count: number}} surface
|
|
32
|
-
*/
|
|
33
|
-
function water_surface_draw(render, surface) {
|
|
34
|
-
render.setIndexBuffer(surface.indices, "uint32");
|
|
35
|
-
render.drawIndexed(surface.index_count);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
20
|
/** Production water channel. Only AVBOIT's shared resolve composites its radiance. */
|
|
39
21
|
export class GPUWaterRenderer {
|
|
40
|
-
|
|
22
|
+
scene = null;
|
|
23
|
+
body_count = 0;
|
|
24
|
+
meshlet_capacity = 0;
|
|
25
|
+
time = 0;
|
|
26
|
+
waves = null;
|
|
41
27
|
settings = { enabled: true, max_distance: 300, distance_tolerance: 0.15,
|
|
42
|
-
max_updates: 4, fallback_steps: 48, mode: 0, reflections: 1, debug_view: 0, inscatter_segments: 4
|
|
28
|
+
max_updates: 4, fallback_steps: 48, mode: 0, reflections: 1, debug_view: 0, inscatter_segments: 4,
|
|
29
|
+
tessellation_pixels: 4 };
|
|
43
30
|
/**
|
|
44
31
|
* The frame's water bodies table, recorded by whoever owns the surfaces at the head of the frame;
|
|
45
32
|
* each drawable surface carries its row as `body_index`.
|
|
@@ -53,9 +40,10 @@ export class GPUWaterRenderer {
|
|
|
53
40
|
#inspection = new WeakMap();
|
|
54
41
|
#probe = null;
|
|
55
42
|
|
|
56
|
-
avboit_is_empty() {
|
|
43
|
+
avboit_is_empty(view) {
|
|
57
44
|
// the authored state: whether there is water at all, not whether its surface was produced yet
|
|
58
|
-
return !this.settings.enabled ||
|
|
45
|
+
return !this.settings.enabled || this.body_count === 0 || this.meshlet_capacity === 0
|
|
46
|
+
|| (view !== undefined && view.scene.scene !== this.scene);
|
|
59
47
|
}
|
|
60
48
|
|
|
61
49
|
/** Optional single-pixel readback on the next rendered water frame. No per-frame readback. */
|
|
@@ -87,16 +75,24 @@ export class GPUWaterRenderer {
|
|
|
87
75
|
avboit_prepare({ graph, view_ctx, camera, color_texture, depth_texture, normal_texture,
|
|
88
76
|
hzb_texture, environment_texture, light_cluster_parameters, light_cluster_lookup, light_cluster_data,
|
|
89
77
|
shadowmap_atlas, indirect_lighting_mode = ShadeIndirectLightingMode.IBL }) {
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
max_distance: this.settings.max_distance }) }))
|
|
93
|
-
.sort((a, b) => a.entity - b.entity);
|
|
94
|
-
surfaces.forEach((surface, index) => { surface.surface_id = index + 1; });
|
|
78
|
+
const scene = view_ctx.scene;
|
|
79
|
+
const meshlets = this.bodies.meshlets({ graph, view: view_ctx, camera, meshlet_capacity: this.meshlet_capacity });
|
|
95
80
|
const settings = { ...this.settings };
|
|
96
81
|
const probe = this.#probe;
|
|
97
82
|
this.#probe = null;
|
|
98
83
|
const resolution = Array.from(view_ctx.resolution);
|
|
99
|
-
const
|
|
84
|
+
const pixels = Math.max(1, settings.tessellation_pixels);
|
|
85
|
+
// Jitter moves raster samples, not the mesh sampling the simulation. A jittered
|
|
86
|
+
// reference would change displaced geometry and normals even while waves are paused.
|
|
87
|
+
const tessellation = { resolution, pixels,
|
|
88
|
+
view_projection_matrix: Float32Array.from(view_ctx.camera.camera.view_projection_matrix) };
|
|
89
|
+
const patches = graph_water_tessellation({ graph, scene, camera, meshlets,
|
|
90
|
+
meshlet_capacity: this.meshlet_capacity, tessellation });
|
|
91
|
+
const data = { resolution, frame_time: this.time };
|
|
92
|
+
const wave_state = this.waves.buffer, wave_resolution = this.waves.grid_resolution;
|
|
93
|
+
const geometry_bindings = () => ({ scene_database: scene.scene_database_buffer,
|
|
94
|
+
meshlet_metadata: scene.geometries.meshlets.buffer_metadata, meshlet_data: scene.geometries.meshlets.buffer_data,
|
|
95
|
+
wave_state });
|
|
100
96
|
const pipeline = this.#pipeline;
|
|
101
97
|
const pass = graph.add("Water / receivers", data, (data, resources, context) => {
|
|
102
98
|
const { encoder, graphics } = context;
|
|
@@ -108,11 +104,13 @@ export class GPUWaterRenderer {
|
|
|
108
104
|
tHZB: resources.get(data.hzb).obtainView(),
|
|
109
105
|
tScene: resources.get(data.color).obtainView(),
|
|
110
106
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
107
|
+
const command = resources.get(data.command);
|
|
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);
|
|
116
114
|
const render = encoder.constructRenderPass({ label: "Water / receivers", pipeline, bindings: [],
|
|
117
115
|
colorAttachments: [data.receiver, data.trace_metadata].map(handle => ({
|
|
118
116
|
view: resources.get(handle).obtainView(), loadOp: "clear", storeOp: "store", clearValue: [0,0,0,0],
|
|
@@ -120,7 +118,8 @@ export class GPUWaterRenderer {
|
|
|
120
118
|
depthStencilAttachment: { view: resources.get(data.interface_depth).obtainView(DEFAULT_DEPTH_TEXTURE_VIEW),
|
|
121
119
|
depthLoadOp: "clear", depthStoreOp: "store", depthClearValue: 0 },
|
|
122
120
|
});
|
|
123
|
-
|
|
121
|
+
graphics.setPipelineBindings(render, pipeline, bindings);
|
|
122
|
+
render.drawIndirect(command, 0);
|
|
124
123
|
render.end();
|
|
125
124
|
});
|
|
126
125
|
for (const [name, handle] of Object.entries({ camera, color: color_texture, scene_depth: depth_texture,
|
|
@@ -129,6 +128,8 @@ export class GPUWaterRenderer {
|
|
|
129
128
|
resolution, format, usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
|
|
130
129
|
| (probe !== null && format !== "depth32float" ? GPUTextureUsage.COPY_SRC : 0),
|
|
131
130
|
}));
|
|
131
|
+
data.tiles = pass.read(patches.tiles); data.sums = pass.read(patches.sums); data.patch_count = pass.read(patches.count);
|
|
132
|
+
data.command = pass.create('Water draw command', BufferResourceDescriptor.from(16, GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT));
|
|
132
133
|
// Keep the accepted UV and both paths at f32 precision through final shading.
|
|
133
134
|
data.receiver = target("receiver", "rgba32float");
|
|
134
135
|
data.trace_metadata = target("trace metadata", "rgba32float");
|
|
@@ -155,7 +156,6 @@ export class GPUWaterRenderer {
|
|
|
155
156
|
const use_brick4 = indirect_lighting_mode === ShadeIndirectLightingMode.Brick4;
|
|
156
157
|
const finalize_pipeline = use_brick4 ? this.#finalize_pipeline_brick4 : this.#finalize_pipeline_ibl;
|
|
157
158
|
const finalize_resources = use_brick4 ? WATER_FINALIZE_RESOURCES_BRICK4 : WATER_FINALIZE_RESOURCES_IBL;
|
|
158
|
-
const bodies = this.bodies;
|
|
159
159
|
const finalize = graph.add('Water / coherent optics', finalize_data, (d, resources, {encoder, graphics}) => {
|
|
160
160
|
const shared = {
|
|
161
161
|
camera: resources.get(d.camera), trace: encoder.allocateTransientValueBuffer(WATER_TRACE_STRUCT, settings),
|
|
@@ -164,7 +164,9 @@ export class GPUWaterRenderer {
|
|
|
164
164
|
tScene: resources.get(d.color).obtainView(),
|
|
165
165
|
receiver: resources.get(d.receiver).obtainView(), trace_metadata: resources.get(d.trace_metadata).obtainView(),
|
|
166
166
|
visibility_distance: resources.get(d.visibility_distance).obtainView(),
|
|
167
|
-
|
|
167
|
+
...geometry_bindings(), water_tiles: resources.get(d.tiles), water_tile_sums: resources.get(d.sums),
|
|
168
|
+
tessellation: encoder.allocateTransientValueBuffer(WATER_TESSELLATION_STRUCT, tessellation),
|
|
169
|
+
wave_grid: encoder.allocateTransientValueBuffer(WATER_GRID_STRUCT, { resolution: wave_resolution }),
|
|
168
170
|
// the lights, as the transparent meshes bind them
|
|
169
171
|
light_data: view_ctx.scene.lights.buffer_data,
|
|
170
172
|
tEnvironment: resources.get(d.environment).obtainView(),
|
|
@@ -178,10 +180,7 @@ export class GPUWaterRenderer {
|
|
|
178
180
|
shared.brick4 = view_ctx.scene.volumetric_light_map.buffer;
|
|
179
181
|
shared.view = view_ctx.uniform_buffer.buffer;
|
|
180
182
|
}
|
|
181
|
-
const
|
|
182
|
-
water: encoder.allocateTransientValueBuffer(WATER_DRAW_STRUCT, s),
|
|
183
|
-
surface_vertices: s.gpu_surface.vertices,
|
|
184
|
-
}, encoder) }));
|
|
183
|
+
const bindings = finalize_resources.generateBindings(shared, encoder);
|
|
185
184
|
const copy_pipeline = shader_water_background_copy.pipeline;
|
|
186
185
|
const copy_bindings = shader_water_background_copy.descriptor.resources.generateBindings({tScene: shared.tScene}, encoder);
|
|
187
186
|
const render = encoder.constructRenderPass({label: 'Water / coherent optics', pipeline: finalize_pipeline, bindings: [],
|
|
@@ -192,10 +191,11 @@ export class GPUWaterRenderer {
|
|
|
192
191
|
render.setPipeline(graphics.render_pipelines.obtain(copy_pipeline)); render.record_pipeline(copy_pipeline);
|
|
193
192
|
graphics.setPipelineBindings(render, copy_pipeline, copy_bindings); render.draw(3);
|
|
194
193
|
render.setPipeline(graphics.render_pipelines.obtain(finalize_pipeline)); render.record_pipeline(finalize_pipeline);
|
|
195
|
-
|
|
194
|
+
graphics.setPipelineBindings(render, finalize_pipeline, bindings);
|
|
195
|
+
render.drawIndirect(resources.get(d.command), 0);
|
|
196
196
|
render.end();
|
|
197
197
|
});
|
|
198
|
-
for (const key of ['camera','scene_depth','normal','hzb','color','receiver','trace_metadata','visibility_distance','interface_depth']) {
|
|
198
|
+
for (const key of ['camera','scene_depth','normal','hzb','color','receiver','trace_metadata','visibility_distance','interface_depth','tiles','sums','command']) {
|
|
199
199
|
finalize_data[key] = finalize.read(data[key]);
|
|
200
200
|
}
|
|
201
201
|
for (const [key, handle] of Object.entries({ environment: environment_texture, light_cluster_parameters,
|
|
@@ -288,7 +288,7 @@ export class GPUWaterRenderer {
|
|
|
288
288
|
try {
|
|
289
289
|
await buffer.mapAsync(GPUMapMode.READ);
|
|
290
290
|
const mapped = buffer.getMappedRange();
|
|
291
|
-
const half = offset => Array.from(new
|
|
291
|
+
const half = offset => Array.from(new Float16Array(mapped, offset, 4));
|
|
292
292
|
const radiance = half(512);
|
|
293
293
|
const confidence = radiance[3];
|
|
294
294
|
radiance[3] = new Float32Array(mapped, 768, 4)[1];
|
|
@@ -76,12 +76,12 @@ fn water_receiver_path(depth: texture_2d<f32>, normals: texture_2d<u32>, uv: vec
|
|
|
76
76
|
return distance(origin, screen_space_ray_lookup_position(uv, receiver, inverse_projection).xyz);
|
|
77
77
|
}
|
|
78
78
|
fn water_receiver_radiance(scene: texture_2d<f32>, depth: texture_2d<f32>, normals: texture_2d<u32>,
|
|
79
|
-
uv: vec2f, inverse_projection: mat4x4f, inverse_view: mat4x4f,
|
|
79
|
+
uv: vec2f, inverse_projection: mat4x4f, inverse_view: mat4x4f, surface: vec3f, surface_normal: vec3f, below_interface: bool) -> vec4f {
|
|
80
80
|
let size = vec2i(textureDimensions(depth, 0));
|
|
81
81
|
let center = water_receiver_texel(depth, normals, clamp(vec2i(uv * vec2f(size)), vec2i(0), size-1),
|
|
82
82
|
inverse_projection, inverse_view);
|
|
83
83
|
if (is_background(center.depth)
|
|
84
|
-
|| (below_interface && center.position
|
|
84
|
+
|| (below_interface && dot(center.position - surface, surface_normal) > WATER_LEVEL_TOLERANCE)) { return vec4f(0.0); }
|
|
85
85
|
let bilinear = get_bilinear_filter_uv(uv, vec2u(size));
|
|
86
86
|
let base = vec2i(bilinear.origin);
|
|
87
87
|
let f = bilinear.weights;
|
|
@@ -91,7 +91,7 @@ fn water_receiver_radiance(scene: texture_2d<f32>, depth: texture_2d<f32>, norma
|
|
|
91
91
|
for (var x = 0; x < 2; x++) {
|
|
92
92
|
let coord = clamp(base + vec2i(x,y), vec2i(0), size-1);
|
|
93
93
|
let tap = water_receiver_texel(depth, normals, coord, inverse_projection, inverse_view);
|
|
94
|
-
if (is_background(tap.depth) || (below_interface && tap.position
|
|
94
|
+
if (is_background(tap.depth) || (below_interface && dot(tap.position - surface, surface_normal) > WATER_LEVEL_TOLERANCE)
|
|
95
95
|
|| dot(center.normal, tap.normal) < 0.95
|
|
96
96
|
|| abs(dot(tap.position - center.position, center.normal)) > 0.02) { continue; }
|
|
97
97
|
let w = select(1.0-f.x, f.x, x == 1) * select(1.0-f.y, f.y, y == 1);
|
|
@@ -1,29 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The frame's water bodies on the GPU, as {@link WATER_BODIES_STRUCT}: one uniform buffer every
|
|
3
|
-
* consumer of the water medium binds.
|
|
4
|
-
*
|
|
5
|
-
* Rebuilt each frame from the surfaces in entity order — the order the water passes draw in — and
|
|
6
|
-
* each surface is told its row as `surface.body_index`. The derived fields are then integrated on
|
|
7
|
-
* the GPU, in a pass recorded at the head of the frame, so everything recorded after reads them.
|
|
8
|
-
*/
|
|
1
|
+
/** GPU work over the scene's water table; no per-body render commands or transient body uniforms. */
|
|
9
2
|
export class GPUWaterBodies {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
get buffer(): any;
|
|
15
|
-
dispose(): void;
|
|
16
|
-
/**
|
|
17
|
-
* @param {Object} options
|
|
18
|
-
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} options.graph
|
|
19
|
-
* @param {GPUDevice} options.device
|
|
20
|
-
* @param {Object[]} options.surfaces
|
|
21
|
-
*/
|
|
22
|
-
record({ graph, device, surfaces }: {
|
|
23
|
-
graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
24
|
-
device: GPUDevice;
|
|
25
|
-
surfaces: any[];
|
|
3
|
+
record({ graph, scene }: {
|
|
4
|
+
graph: any;
|
|
5
|
+
scene: any;
|
|
26
6
|
}): void;
|
|
27
|
-
|
|
7
|
+
/** Ordered prefix expansion preserves equal-depth ownership, including after holes and reuse. */
|
|
8
|
+
meshlets({ graph, view, camera, meshlet_capacity }: {
|
|
9
|
+
graph: any;
|
|
10
|
+
view: any;
|
|
11
|
+
camera: any;
|
|
12
|
+
meshlet_capacity: any;
|
|
13
|
+
}): any;
|
|
28
14
|
}
|
|
29
15
|
//# sourceMappingURL=GPUWaterBodies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUWaterBodies.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/GPUWaterBodies.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUWaterBodies.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/water/medium/GPUWaterBodies.js"],"names":[],"mappings":"AAUA,qGAAqG;AACrG;IACI;;;aASC;IAED,iGAAiG;IACjG;;;;;YAsCC;CACJ"}
|