@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
package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_sample_shadowmap_atlas_for_light.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js"],"names":[],"mappings":"AAQA
|
|
1
|
+
{"version":3,"file":"chunk_sample_shadowmap_atlas_for_light.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;GAYG;AACH,qDAFU,SAAS,CAyFjB;0BAzGwB,uCAAuC"}
|
|
@@ -9,6 +9,14 @@ import { chunk_shadowmap_sample_5 } from "./chunk_shadowmap_sample_5.js";
|
|
|
9
9
|
/**
|
|
10
10
|
* Samples the shadow atlas for a given light, using the supplied shadow projection matrix and
|
|
11
11
|
* atlas rect. Applies receiver normal-offset bias to reduce self-shadowing.
|
|
12
|
+
*
|
|
13
|
+
* Two entry points: `sample_shadowmap_atlas_for_light` sizes the bias by a texel's world size as
|
|
14
|
+
* read off the matrix, and `sample_shadowmap_atlas_with_texel` takes that size from a caller that
|
|
15
|
+
* knows it exactly — a virtual shadow map's page, whose texel is fixed by its level, where the
|
|
16
|
+
* matrix's reading grows with the depth range as the light turns toward a world axis.
|
|
17
|
+
*
|
|
18
|
+
* A receiver past the far plane is shadowed only by what was drawn in front of it: its reference
|
|
19
|
+
* depth is held just above the cleared value, which would otherwise compare as shadowed.
|
|
12
20
|
* @type {CodeChunk}
|
|
13
21
|
*/
|
|
14
22
|
export const chunk_sample_shadowmap_atlas_for_light = CodeChunk.from(
|
|
@@ -21,6 +29,27 @@ fn sample_shadowmap_atlas_for_light(
|
|
|
21
29
|
light: ${INCIDENT_LIGHT_STRUCT.wgsl_ref},
|
|
22
30
|
atlas_aabb: vec4f, // x0,y0, width, height
|
|
23
31
|
) -> f32{
|
|
32
|
+
let projection_scale = m4_projection_size(projection_matrix);
|
|
33
|
+
let world_pixel_size = max(projection_scale.x, projection_scale.y) / atlas_aabb.z;
|
|
34
|
+
|
|
35
|
+
return sample_shadowmap_atlas_with_texel(
|
|
36
|
+
projection_matrix,
|
|
37
|
+
world_pixel_size,
|
|
38
|
+
position_ws,
|
|
39
|
+
surface_normal,
|
|
40
|
+
light,
|
|
41
|
+
atlas_aabb,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fn sample_shadowmap_atlas_with_texel(
|
|
46
|
+
projection_matrix: mat4x4f, // shadow VIEW-projection matrix (combined view * projection)
|
|
47
|
+
world_pixel_size: f32, // world size of a texel of the map
|
|
48
|
+
position_ws: vec3f,
|
|
49
|
+
surface_normal: vec3f,
|
|
50
|
+
light: ${INCIDENT_LIGHT_STRUCT.wgsl_ref},
|
|
51
|
+
atlas_aabb: vec4f, // x0,y0, width, height
|
|
52
|
+
) -> f32{
|
|
24
53
|
|
|
25
54
|
const NORMAL_BIAS_SCALE = 0.5;
|
|
26
55
|
|
|
@@ -31,8 +60,10 @@ fn sample_shadowmap_atlas_for_light(
|
|
|
31
60
|
// camera.far (contact shadows detach as the far plane grows).
|
|
32
61
|
const DEPTH_BIAS_TEXELS = 0.5;
|
|
33
62
|
|
|
34
|
-
|
|
35
|
-
|
|
63
|
+
// Reverse-Z clears to 0 and compares "greater": past the far plane a receiver's depth is <= 0,
|
|
64
|
+
// and against a texel nothing was drawn into it would read shadowed. Held just above 0, it
|
|
65
|
+
// reads lit there and still shadowed by anything drawn.
|
|
66
|
+
const DEPTH_FLOOR = 1e-6;
|
|
36
67
|
|
|
37
68
|
let shadowmap_bias = get_shadow_offsets(surface_normal, light.direction);
|
|
38
69
|
let normal_offset = world_pixel_size * shadowmap_bias.x * surface_normal * NORMAL_BIAS_SCALE;
|
|
@@ -54,7 +85,7 @@ fn sample_shadowmap_atlas_for_light(
|
|
|
54
85
|
let light_coords = light_uvw.xy * atlas_aabb.zw;
|
|
55
86
|
|
|
56
87
|
// bias is already applied in world space (depth_offset above)
|
|
57
|
-
let depth = light_uvw.z;
|
|
88
|
+
let depth = max(light_uvw.z, DEPTH_FLOOR);
|
|
58
89
|
|
|
59
90
|
// Clamp so the whole filter footprint stays inside this light's atlas tile (bias can
|
|
60
91
|
// push coordinates outside it). The optimized 5-tap kernel reaches ±2.25 texels around
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Directional-light shadow sampling
|
|
3
|
-
*
|
|
2
|
+
* Directional-light shadow sampling. The light's `shadow_directional` record either names a virtual
|
|
3
|
+
* shadow map, sampled by {@link shadowmap_sample_virtual}, or names its cascades as a range of
|
|
4
|
+
* `shadow_cascade` rows (atlas + view-projection each), with CSM cascade blending:
|
|
4
5
|
* {@link shadowmap_csm_compute_cascade_blended} picks among them, and the one or two it picks are
|
|
5
6
|
* read again here to sample.
|
|
6
7
|
* @type {CodeChunk}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_shadowmap_sample_directional.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_shadowmap_sample_directional.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,iDAFU,SAAS,CAwEjB;0BAtFwB,uCAAuC"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
+
import { GPU_DATABASE_NULL } from "../../../buffer/table/GPU_DATABASE_NULL.js";
|
|
1
2
|
import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
|
|
2
3
|
import { INCIDENT_LIGHT_STRUCT } from "../../../shader/chunk/light/INCIDENT_LIGHT_STRUCT.js";
|
|
3
4
|
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
4
5
|
import { chunk_sample_shadowmap_atlas_for_light } from "./chunk_sample_shadowmap_atlas_for_light.js";
|
|
5
6
|
import { chunk_shadowmap_csm_compute_cascade_blended } from "./chunk_shadowmap_csm_compute_cascade_blended.js";
|
|
7
|
+
import { chunk_shadowmap_sample_virtual } from "../../vsm/shader/chunk_shadowmap_sample_virtual.js";
|
|
6
8
|
|
|
7
9
|
const SHADOW_DIRECTIONAL_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_directional');
|
|
8
10
|
const CASCADE_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_cascade');
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
|
-
* Directional-light shadow sampling
|
|
12
|
-
*
|
|
13
|
+
* Directional-light shadow sampling. The light's `shadow_directional` record either names a virtual
|
|
14
|
+
* shadow map, sampled by {@link shadowmap_sample_virtual}, or names its cascades as a range of
|
|
15
|
+
* `shadow_cascade` rows (atlas + view-projection each), with CSM cascade blending:
|
|
13
16
|
* {@link shadowmap_csm_compute_cascade_blended} picks among them, and the one or two it picks are
|
|
14
17
|
* read again here to sample.
|
|
15
18
|
* @type {CodeChunk}
|
|
@@ -27,6 +30,17 @@ fn shadowmap_sample_directional(
|
|
|
27
30
|
) -> f32 {
|
|
28
31
|
let shadowmap = ${SHADOW_DIRECTIONAL_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
|
|
29
32
|
|
|
33
|
+
if (shadowmap.virtual_map != ${GPU_DATABASE_NULL}u) {
|
|
34
|
+
// a virtual shadow map rather than cascades
|
|
35
|
+
return shadowmap_sample_virtual(
|
|
36
|
+
database,
|
|
37
|
+
shadowmap.virtual_map,
|
|
38
|
+
position_ws,
|
|
39
|
+
surface_normal_ws,
|
|
40
|
+
light,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
30
44
|
let cascade_info = shadowmap_csm_compute_cascade_blended(
|
|
31
45
|
database,
|
|
32
46
|
shadowmap.first_cascade,
|
|
@@ -71,5 +85,6 @@ fn shadowmap_sample_directional(
|
|
|
71
85
|
CASCADE_DESCRIPTOR.chunk_read,
|
|
72
86
|
chunk_sample_shadowmap_atlas_for_light,
|
|
73
87
|
chunk_shadowmap_csm_compute_cascade_blended,
|
|
88
|
+
chunk_shadowmap_sample_virtual,
|
|
74
89
|
]
|
|
75
90
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_shadowmap_sample_point2.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,4CAFU,SAAS,
|
|
1
|
+
{"version":3,"file":"chunk_shadowmap_sample_point2.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,4CAFU,SAAS,CAqGjB;0BA/HwB,uCAAuC"}
|
|
@@ -1,133 +1,137 @@
|
|
|
1
|
-
import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
|
|
2
|
-
import { chunk_cone_sample_direction } from "../../../shader/chunk/geometry/cone/chunk_cone_sample_direction.js";
|
|
3
|
-
import {
|
|
4
|
-
chunk_uv_octahedral_unit_encode
|
|
5
|
-
} from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
|
|
6
|
-
import { chunk_random } from "../../../shader/chunk/random/chunk_random.js";
|
|
7
|
-
import { chunk_random_round_vec2 } from "../../../shader/chunk/random/chunk_random_round_vec2.js";
|
|
8
|
-
import { chunk_random_vec2 } from "../../../shader/chunk/random/chunk_random_vec2.js";
|
|
9
|
-
import { chunk_uv_to_texel_coordinate } from "../../../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
|
|
10
|
-
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
11
|
-
import { chunk_get_shadow_offsets } from "./chunk_get_shadow_offsets.js";
|
|
12
|
-
import { chunk_contact_harden_pcf_kernel } from "./dpcf/chunk_contact_harden_pcf_kernel.js";
|
|
13
|
-
import { chunk_max_penumbra_percentage } from "./dpcf/chunk_max_penumbra_percentage.js";
|
|
14
|
-
|
|
15
|
-
const SHADOW_POINT_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_point');
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Cone-sampled point shadow PCF: 8 random directions inside a cone around the receiver-to-light
|
|
19
|
-
* vector, each re-encoded to the light's octahedral map, one `textureLoad` per tap, ending in
|
|
20
|
-
* {@link chunk_contact_harden_pcf_kernel}. Tap directions come from {@link chunk_random}, which the
|
|
21
|
-
* calling shader (deferred lighting / volumetrics) initialises per invocation, so neighbouring
|
|
22
|
-
* pixels decorrelate without a rotation table or a blue-noise disk.
|
|
23
|
-
*
|
|
24
|
-
* The aperture is the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor
|
|
25
|
-
* of 2 carries over the texels → tangent-plane conversion an earlier disk-based variant used (1
|
|
26
|
-
* atlas texel ≈ 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays comparable.
|
|
27
|
-
*
|
|
28
|
-
* Addressing: `atlas_aabb` is the INNER octahedral surface, and the cube → octahedral remap
|
|
29
|
-
* surrounds it with a `SHADOWMAP_ATLAS_BORDER`-texel skirt holding
|
|
30
|
-
* `inner[texture_octahedral_wrap_texel_coordinates(local)]`. Under the bilinear convention
|
|
31
|
-
* `uv * size - 0.5` a uv on the edge of the square rounds to -1 or `size` — one texel into that
|
|
32
|
-
* skirt, which is this light's own wrapped data. The encode always lands in [0, 1]² and the round
|
|
33
|
-
* can overshoot by at most one texel, so the aperture needs no clamp.
|
|
34
|
-
*
|
|
35
|
-
* @see chunk_cone_sample_direction
|
|
36
|
-
* @type {CodeChunk}
|
|
37
|
-
*/
|
|
38
|
-
export const chunk_shadowmap_sample_point2 = CodeChunk.from(
|
|
39
|
-
//language=WGSL
|
|
40
|
-
`
|
|
41
|
-
fn shadowmap_sample_point(
|
|
42
|
-
database: ptr<storage, array<u32>>,
|
|
43
|
-
shadow_id: u32,
|
|
44
|
-
position_ws: vec3f,
|
|
45
|
-
surface_normal_ws: vec3f,
|
|
46
|
-
light_position_ws: vec3f,
|
|
47
|
-
light_max_distance: f32,
|
|
48
|
-
light_radius: f32,
|
|
49
|
-
) -> f32 {
|
|
50
|
-
const NORMAL_BIAS_SCALE = 2.0;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
let
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
let
|
|
61
|
-
let
|
|
62
|
-
let
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
let
|
|
66
|
-
let
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
let
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
let
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
let
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
let
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
1
|
+
import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
|
|
2
|
+
import { chunk_cone_sample_direction } from "../../../shader/chunk/geometry/cone/chunk_cone_sample_direction.js";
|
|
3
|
+
import {
|
|
4
|
+
chunk_uv_octahedral_unit_encode
|
|
5
|
+
} from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
|
|
6
|
+
import { chunk_random } from "../../../shader/chunk/random/chunk_random.js";
|
|
7
|
+
import { chunk_random_round_vec2 } from "../../../shader/chunk/random/chunk_random_round_vec2.js";
|
|
8
|
+
import { chunk_random_vec2 } from "../../../shader/chunk/random/chunk_random_vec2.js";
|
|
9
|
+
import { chunk_uv_to_texel_coordinate } from "../../../shader/chunk/texture/chunk_uv_to_texel_coordinate.js";
|
|
10
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
11
|
+
import { chunk_get_shadow_offsets } from "./chunk_get_shadow_offsets.js";
|
|
12
|
+
import { chunk_contact_harden_pcf_kernel } from "./dpcf/chunk_contact_harden_pcf_kernel.js";
|
|
13
|
+
import { chunk_max_penumbra_percentage } from "./dpcf/chunk_max_penumbra_percentage.js";
|
|
14
|
+
|
|
15
|
+
const SHADOW_POINT_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_point');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Cone-sampled point shadow PCF: 8 random directions inside a cone around the receiver-to-light
|
|
19
|
+
* vector, each re-encoded to the light's octahedral map, one `textureLoad` per tap, ending in
|
|
20
|
+
* {@link chunk_contact_harden_pcf_kernel}. Tap directions come from {@link chunk_random}, which the
|
|
21
|
+
* calling shader (deferred lighting / volumetrics) initialises per invocation, so neighbouring
|
|
22
|
+
* pixels decorrelate without a rotation table or a blue-noise disk.
|
|
23
|
+
*
|
|
24
|
+
* The aperture is the GDC bulb-radius scaling in {@link chunk_max_penumbra_percentage}; the factor
|
|
25
|
+
* of 2 carries over the texels → tangent-plane conversion an earlier disk-based variant used (1
|
|
26
|
+
* atlas texel ≈ 2/face_dim of Δn.xy near the +Z pole), so the angular footprint stays comparable.
|
|
27
|
+
*
|
|
28
|
+
* Addressing: `atlas_aabb` is the INNER octahedral surface, and the cube → octahedral remap
|
|
29
|
+
* surrounds it with a `SHADOWMAP_ATLAS_BORDER`-texel skirt holding
|
|
30
|
+
* `inner[texture_octahedral_wrap_texel_coordinates(local)]`. Under the bilinear convention
|
|
31
|
+
* `uv * size - 0.5` a uv on the edge of the square rounds to -1 or `size` — one texel into that
|
|
32
|
+
* skirt, which is this light's own wrapped data. The encode always lands in [0, 1]² and the round
|
|
33
|
+
* can overshoot by at most one texel, so the aperture needs no clamp.
|
|
34
|
+
*
|
|
35
|
+
* @see chunk_cone_sample_direction
|
|
36
|
+
* @type {CodeChunk}
|
|
37
|
+
*/
|
|
38
|
+
export const chunk_shadowmap_sample_point2 = CodeChunk.from(
|
|
39
|
+
//language=WGSL
|
|
40
|
+
`
|
|
41
|
+
fn shadowmap_sample_point(
|
|
42
|
+
database: ptr<storage, array<u32>>,
|
|
43
|
+
shadow_id: u32,
|
|
44
|
+
position_ws: vec3f,
|
|
45
|
+
surface_normal_ws: vec3f,
|
|
46
|
+
light_position_ws: vec3f,
|
|
47
|
+
light_max_distance: f32,
|
|
48
|
+
light_radius: f32,
|
|
49
|
+
) -> f32 {
|
|
50
|
+
const NORMAL_BIAS_SCALE = 2.0;
|
|
51
|
+
// Toward the light, in texels of the map at the receiver, scaled by the slope: casters are drawn
|
|
52
|
+
// by their front faces, so the map holds the lit surface itself, and a tap a texel along it
|
|
53
|
+
// reads it a texel's slope nearer — the cube → octahedral remap adds up to half a cube texel's
|
|
54
|
+
// more. A flat offset in the map's normalized depth cleared none of that.
|
|
55
|
+
const DEPTH_BIAS_TEXELS = 1.0;
|
|
56
|
+
|
|
57
|
+
let atlas_aabb = ${SHADOW_POINT_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
|
|
58
|
+
|
|
59
|
+
// unbiased distance and light direction, used to compute the bias amounts
|
|
60
|
+
let to_light_unbiased = light_position_ws - position_ws;
|
|
61
|
+
let dist_to_light_unbiased = length(to_light_unbiased);
|
|
62
|
+
let light_direction = to_light_unbiased / max(dist_to_light_unbiased, 1e-6);
|
|
63
|
+
|
|
64
|
+
let world_pixel_size = 2.0 * dist_to_light_unbiased / max(atlas_aabb.z, 1.0);
|
|
65
|
+
let shadowmap_bias = get_shadow_offsets(surface_normal_ws, light_direction);
|
|
66
|
+
let normal_offset = world_pixel_size * shadowmap_bias.x * surface_normal_ws * NORMAL_BIAS_SCALE;
|
|
67
|
+
|
|
68
|
+
// re-evaluate direction and distance from the normal-biased position
|
|
69
|
+
let to_surface = (position_ws + normal_offset) - light_position_ws;
|
|
70
|
+
let distance_to_center = length(to_surface);
|
|
71
|
+
|
|
72
|
+
// Direction the cube faces captured: FROM LIGHT TO SURFACE
|
|
73
|
+
let dir_light_to_surface = to_surface / max(distance_to_center, 1e-6);
|
|
74
|
+
|
|
75
|
+
let face_size = vec2u(atlas_aabb.zw);
|
|
76
|
+
|
|
77
|
+
// reverse-Z convention: close to light -> 1, at or beyond light_max_distance -> 0.
|
|
78
|
+
let radial = distance_to_center / max(light_max_distance, 1e-6);
|
|
79
|
+
let depth_bias = world_pixel_size * shadowmap_bias.y * DEPTH_BIAS_TEXELS / max(light_max_distance, 1e-6);
|
|
80
|
+
let reference_depth = (1.0 - saturate(radial)) + depth_bias;
|
|
81
|
+
|
|
82
|
+
// Cone aperture (~ tan of the half-angle). max_penumbra_percentage is the GDC formula mapping
|
|
83
|
+
// bulb radius to a fraction of the atlas face; the 2× factor is the texels → tangent-plane
|
|
84
|
+
// conversion. Unclamped — see the header on why any aperture stays addressable.
|
|
85
|
+
let cone_aperture = 2.0 * max_penumbra_percentage(light_radius, light_radius);
|
|
86
|
+
|
|
87
|
+
var occluders: f32 = 0.0;
|
|
88
|
+
var occluder_dist_sum: f32 = 0.0;
|
|
89
|
+
|
|
90
|
+
for (var tap: u32 = 0u; tap < 8u; tap++) {
|
|
91
|
+
|
|
92
|
+
let xi = random_vec2();
|
|
93
|
+
|
|
94
|
+
let perturbed_dir = cone_sample_direction(dir_light_to_surface, cone_aperture, xi);
|
|
95
|
+
|
|
96
|
+
let octahedral_uv = uv_octahedral_unit_encode(perturbed_dir);
|
|
97
|
+
let local_texel = uv_to_texel_coordinate(octahedral_uv, face_size);
|
|
98
|
+
|
|
99
|
+
// one of the two neighbours at random rather than a blend of them: stochastic bilinear
|
|
100
|
+
let rounded_local_texel = random_round_vec2(local_texel);
|
|
101
|
+
|
|
102
|
+
// Signed: the round reaches -1 at a uv of 0, and the skirt is where that tap belongs. Via
|
|
103
|
+
// u32 the -1 would be an indeterminate conversion — 0xFFFFFFFF reaches the skirt through
|
|
104
|
+
// the wrapping add, 0 silently reads the opposite edge of the inner surface. i32 is exact
|
|
105
|
+
// here, and the inner origin is at least SHADOWMAP_ATLAS_BORDER, so the sum is positive.
|
|
106
|
+
let sample_texel = vec2<u32>(vec2<i32>(rounded_local_texel) + vec2<i32>(atlas_aabb.xy));
|
|
107
|
+
|
|
108
|
+
let stored = textureLoad(shadowmapAtlas, sample_texel, 0);
|
|
109
|
+
let dist = stored - reference_depth;
|
|
110
|
+
|
|
111
|
+
// Per-tap binary compare; reverse-Z + step(0, stored - ref) ⇒ 1 = occluded.
|
|
112
|
+
let occluded = step(0.0, dist);
|
|
113
|
+
|
|
114
|
+
occluders += occluded;
|
|
115
|
+
occluder_dist_sum += dist * occluded;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return contact_harden_pcf_kernel(
|
|
119
|
+
occluders,
|
|
120
|
+
occluder_dist_sum,
|
|
121
|
+
reference_depth,
|
|
122
|
+
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
`, [
|
|
126
|
+
SHADOW_POINT_DESCRIPTOR.chunk_read,
|
|
127
|
+
chunk_cone_sample_direction,
|
|
128
|
+
chunk_contact_harden_pcf_kernel,
|
|
129
|
+
chunk_get_shadow_offsets,
|
|
130
|
+
chunk_max_penumbra_percentage,
|
|
131
|
+
chunk_random,
|
|
132
|
+
chunk_uv_octahedral_unit_encode,
|
|
133
|
+
chunk_uv_to_texel_coordinate,
|
|
134
|
+
chunk_random_round_vec2,
|
|
135
|
+
chunk_random_vec2,
|
|
136
|
+
]
|
|
137
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default world size of a texel of a virtual shadow map's finest level, in metres.
|
|
3
|
+
*
|
|
4
|
+
* A 1080p view at 60° spans a 1 mrad pixel, so level 0 is what receivers within about 10 m of the
|
|
5
|
+
* camera ask for, and each level doubles that reach: with twelve levels, the coarsest texel is
|
|
6
|
+
* 20 m and receivers some 20 km out still find a level whose texel matches their pixel.
|
|
7
|
+
*
|
|
8
|
+
* Only the starting value: what a scene uses is
|
|
9
|
+
* {@link GPUSceneShadowmapContext.virtual_first_texel_size}, pushed from
|
|
10
|
+
* {@link Renderer.shadow_virtual_first_texel_size}; a change rebuilds the maps.
|
|
11
|
+
*
|
|
12
|
+
* @type {number}
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_VSM_FIRST_TEXEL_SIZE: number;
|
|
15
|
+
//# sourceMappingURL=DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,2CAFU,MAAM,CAEiC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default world size of a texel of a virtual shadow map's finest level, in metres.
|
|
3
|
+
*
|
|
4
|
+
* A 1080p view at 60° spans a 1 mrad pixel, so level 0 is what receivers within about 10 m of the
|
|
5
|
+
* camera ask for, and each level doubles that reach: with twelve levels, the coarsest texel is
|
|
6
|
+
* 20 m and receivers some 20 km out still find a level whose texel matches their pixel.
|
|
7
|
+
*
|
|
8
|
+
* Only the starting value: what a scene uses is
|
|
9
|
+
* {@link GPUSceneShadowmapContext.virtual_first_texel_size}, pushed from
|
|
10
|
+
* {@link Renderer.shadow_virtual_first_texel_size}; a change rebuilds the maps.
|
|
11
|
+
*
|
|
12
|
+
* @type {number}
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_VSM_FIRST_TEXEL_SIZE = 0.01;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default number of virtual shadow map pages a scene may render per frame, across its maps.
|
|
3
|
+
*
|
|
4
|
+
* Each page is one pooled shadow view through the Fast rasterization path — a mesh cull, the bucket
|
|
5
|
+
* classify, the meshlet expansion with its virtual geometry cut, and the draws — into a 136² slot,
|
|
6
|
+
* so a page costs about what one CSM cascade's view costs, over far fewer pixels. Pages that a frame
|
|
7
|
+
* wants beyond the budget wait for the next one, in priority order: covers for unshadowed pixels,
|
|
8
|
+
* then stale pages in view, then missing pages, each by the pixels asking.
|
|
9
|
+
*
|
|
10
|
+
* Only the starting value: what a scene spends is {@link GPUSceneShadowmapContext.virtual_page_budget},
|
|
11
|
+
* which the renderer pushes from {@link Renderer.shadow_virtual_page_budget} every frame.
|
|
12
|
+
*
|
|
13
|
+
* @type {number}
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_VSM_PAGE_BUDGET: number;
|
|
16
|
+
//# sourceMappingURL=DEFAULT_VSM_PAGE_BUDGET.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DEFAULT_VSM_PAGE_BUDGET.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,sCAFU,MAAM,CAEyB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default number of virtual shadow map pages a scene may render per frame, across its maps.
|
|
3
|
+
*
|
|
4
|
+
* Each page is one pooled shadow view through the Fast rasterization path — a mesh cull, the bucket
|
|
5
|
+
* classify, the meshlet expansion with its virtual geometry cut, and the draws — into a 136² slot,
|
|
6
|
+
* so a page costs about what one CSM cascade's view costs, over far fewer pixels. Pages that a frame
|
|
7
|
+
* wants beyond the budget wait for the next one, in priority order: covers for unshadowed pixels,
|
|
8
|
+
* then stale pages in view, then missing pages, each by the pixels asking.
|
|
9
|
+
*
|
|
10
|
+
* Only the starting value: what a scene spends is {@link GPUSceneShadowmapContext.virtual_page_budget},
|
|
11
|
+
* which the renderer pushes from {@link Renderer.shadow_virtual_page_budget} every frame.
|
|
12
|
+
*
|
|
13
|
+
* @type {number}
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_VSM_PAGE_BUDGET = 8;
|