@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
|
@@ -1,43 +1,154 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* A directional light's virtual shadow map: a clipmap of world-anchored pages around the main
|
|
3
|
+
* camera, rendered into a region of the shadow atlas as the GPU asks for them and as movers make
|
|
4
|
+
* them stale, under a budget of pages per frame.
|
|
5
|
+
*
|
|
6
|
+
* The page bookkeeping is {@link VSMPageManager}'s; this holds what ties it to the light and to the
|
|
7
|
+
* shadow context: the light space, the depth range, the main view's numbers the record carries, the
|
|
8
|
+
* rows the context claimed for it in the light database, and the pooled views pages are drawn with
|
|
9
|
+
* ({@link views}, one per page a frame may draw).
|
|
10
|
+
*
|
|
11
|
+
* Built and owned by {@link GPUSceneShadowmapContext} when its renderer asks for virtual shadow maps.
|
|
12
|
+
*
|
|
13
|
+
* @extends {Shadowmap}
|
|
14
|
+
*/
|
|
15
|
+
export class VirtualShadowMap extends Shadowmap {
|
|
3
16
|
/**
|
|
4
|
-
* @
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @param {number} options.level_count
|
|
19
|
+
* @param {number} options.pages_per_level
|
|
20
|
+
* @param {number} options.first_texel_size
|
|
21
|
+
* @param {number} options.page_size
|
|
22
|
+
* @param {number} options.border
|
|
23
|
+
* @param {number} options.pool_size texels on the pool's side
|
|
24
|
+
* @param {number} options.request_capacity
|
|
25
|
+
* @param {number} options.protect_frames
|
|
26
|
+
* @param {number} options.depth_extent
|
|
5
27
|
*/
|
|
6
|
-
|
|
28
|
+
constructor({ level_count, pages_per_level, first_texel_size, page_size, border, pool_size, request_capacity, protect_frames, depth_extent, }: {
|
|
29
|
+
level_count: number;
|
|
30
|
+
pages_per_level: number;
|
|
31
|
+
first_texel_size: number;
|
|
32
|
+
page_size: number;
|
|
33
|
+
border: number;
|
|
34
|
+
pool_size: number;
|
|
35
|
+
request_capacity: number;
|
|
36
|
+
protect_frames: number;
|
|
37
|
+
depth_extent: number;
|
|
38
|
+
});
|
|
7
39
|
/**
|
|
8
|
-
*
|
|
40
|
+
* @type {VSMPageManager}
|
|
41
|
+
* @readonly
|
|
42
|
+
*/
|
|
43
|
+
readonly manager: VSMPageManager;
|
|
44
|
+
/**
|
|
45
|
+
* Distance either side of the snapped camera depth that the light's depth range reaches.
|
|
46
|
+
* @type {number}
|
|
47
|
+
* @readonly
|
|
48
|
+
*/
|
|
49
|
+
readonly depth_extent: number;
|
|
50
|
+
/**
|
|
51
|
+
* The map's row of `shadow_virtual`, claimed by the shadow context with the map; -1 before.
|
|
9
52
|
* @type {number}
|
|
10
53
|
*/
|
|
11
|
-
|
|
54
|
+
record_row: number;
|
|
12
55
|
/**
|
|
13
|
-
*
|
|
56
|
+
* First rows of the map's runs of `shadow_virtual_level`, `shadow_virtual_page` and
|
|
57
|
+
* `shadow_virtual_slot`; -1 before they are claimed.
|
|
58
|
+
* @type {number}
|
|
14
59
|
*/
|
|
15
|
-
|
|
60
|
+
first_level: number;
|
|
61
|
+
first_page: number;
|
|
62
|
+
first_slot: number;
|
|
16
63
|
/**
|
|
17
|
-
* @
|
|
64
|
+
* The map's own frame count, advanced by every {@link update}: what its pages, touches and
|
|
65
|
+
* readings are stamped with. The map's own because it has to keep rising whichever view the
|
|
66
|
+
* frame was rendered for — a view's count starts again at zero with each new camera, and a
|
|
67
|
+
* reading stamped from it would be refused as older than the last one applied.
|
|
68
|
+
* @type {number}
|
|
69
|
+
*/
|
|
70
|
+
frame_index: number;
|
|
71
|
+
/**
|
|
72
|
+
* What this frame's {@link update} works with, set by the shadow context before it: how many
|
|
73
|
+
* pages it may draw, the bias the record carries, and the main view's height in pixels.
|
|
74
|
+
*/
|
|
75
|
+
page_budget: number;
|
|
76
|
+
lod_bias: number;
|
|
77
|
+
view_height: number;
|
|
78
|
+
/**
|
|
79
|
+
* One word per pool slot, set on the GPU when a mover crosses the slot and cleared when a
|
|
80
|
+
* readback lists it — persistent, so a frame whose readback was skipped loses nothing. Created
|
|
81
|
+
* by the shadow context with the map's rows; null before.
|
|
82
|
+
* @type {GPUBuffer|null}
|
|
83
|
+
*/
|
|
84
|
+
stale_flags: GPUBuffer | null;
|
|
85
|
+
/**
|
|
86
|
+
* Readbacks of this map's feedback on their way back.
|
|
87
|
+
* @type {number}
|
|
18
88
|
*/
|
|
19
|
-
|
|
89
|
+
readbacks_in_flight: number;
|
|
20
90
|
/**
|
|
21
|
-
*
|
|
91
|
+
* Set once the map is torn down: a reading still in flight is then dropped.
|
|
92
|
+
* @type {boolean}
|
|
22
93
|
*/
|
|
23
|
-
|
|
94
|
+
destroyed: boolean;
|
|
24
95
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* @see https://www.w3.org/TR/WGSL/#texturestore
|
|
28
|
-
* @type {GPUBuffer}
|
|
96
|
+
* The light camera at the world origin; its view matrix is light space.
|
|
97
|
+
* @type {OrthographicCamera}
|
|
29
98
|
*/
|
|
30
|
-
|
|
31
|
-
get total_tile_count(): number;
|
|
99
|
+
light_camera: OrthographicCamera;
|
|
32
100
|
/**
|
|
101
|
+
* The light's depth range this frame, as distances along the light from light space's origin.
|
|
102
|
+
* @type {number}
|
|
103
|
+
*/
|
|
104
|
+
near: number;
|
|
105
|
+
far: number;
|
|
106
|
+
/**
|
|
107
|
+
* Texels on a slot's side: a page and its border.
|
|
108
|
+
* @returns {number}
|
|
109
|
+
*/
|
|
110
|
+
get slot_size(): number;
|
|
111
|
+
/**
|
|
112
|
+
* Fit the light space and the windows to this frame and choose its pages, advancing
|
|
113
|
+
* {@link frame_index}. Reads {@link page_budget}, {@link lod_bias} and {@link view_height}, which
|
|
114
|
+
* the shadow context sets first.
|
|
115
|
+
*
|
|
116
|
+
* @param {Camera} main_camera
|
|
117
|
+
* @param {GPUSceneContext} scene_ctx
|
|
118
|
+
*/
|
|
119
|
+
update(main_camera: Camera, scene_ctx: GPUSceneContext): void;
|
|
120
|
+
/**
|
|
121
|
+
* The `shadow_directional` record: an empty cascade range, and this map's `shadow_virtual` row.
|
|
122
|
+
* @returns {{first_cascade: number, cascade_count: number, virtual_map: number}}
|
|
123
|
+
*/
|
|
124
|
+
make_record(): {
|
|
125
|
+
first_cascade: number;
|
|
126
|
+
cascade_count: number;
|
|
127
|
+
virtual_map: number;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* The `shadow_virtual` record as of the last {@link update}.
|
|
131
|
+
* @returns {object}
|
|
132
|
+
*/
|
|
133
|
+
make_virtual_record(): object;
|
|
134
|
+
/**
|
|
135
|
+
* Point a page camera at a page: turned as the light, at the origin, its planes the page's
|
|
136
|
+
* square widened by its border on every side, the light's depth range.
|
|
33
137
|
*
|
|
34
|
-
* @param {
|
|
35
|
-
* @param {number}
|
|
36
|
-
* @param {number}
|
|
37
|
-
* @param {number}
|
|
138
|
+
* @param {OrthographicCamera} camera
|
|
139
|
+
* @param {number} level
|
|
140
|
+
* @param {number} x world page
|
|
141
|
+
* @param {number} y world page
|
|
142
|
+
*/
|
|
143
|
+
aim_page_camera(camera: OrthographicCamera, level: number, x: number, y: number): void;
|
|
144
|
+
/**
|
|
145
|
+
* @readonly
|
|
146
|
+
* @type {boolean}
|
|
38
147
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
148
|
+
readonly isVirtualShadowMap: boolean;
|
|
149
|
+
#private;
|
|
41
150
|
}
|
|
42
|
-
import {
|
|
151
|
+
import { Shadowmap } from "../map/Shadowmap.js";
|
|
152
|
+
import { VSMPageManager } from "./VSMPageManager.js";
|
|
153
|
+
import { OrthographicCamera } from "../../camera/OrthographicCamera.js";
|
|
43
154
|
//# sourceMappingURL=VirtualShadowMap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualShadowMap.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/vsm/VirtualShadowMap.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VirtualShadowMap.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/vsm/VirtualShadowMap.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AACH;IAuHI;;;;;;;;;;;OAWG;IACH;QAV2B,WAAW,EAA3B,MAAM;QACU,eAAe,EAA/B,MAAM;QACU,gBAAgB,EAAhC,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,MAAM,EAAtB,MAAM;QACU,SAAS,EAAzB,MAAM;QACU,gBAAgB,EAAhC,MAAM;QACU,cAAc,EAA9B,MAAM;QACU,YAAY,EAA5B,MAAM;OA8BhB;IA7JD;;;OAGG;IACH,kBAHU,cAAc,CAGhB;IAER;;;;OAIG;IACH,uBAHU,MAAM,CAGH;IAEb;;;OAGG;IACH,YAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,aAFU,MAAM,CAEC;IACjB,mBAAgB;IAChB,mBAAgB;IAEhB;;;;;;OAMG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,oBAAgB;IAChB,iBAAa;IACb,oBAAgB;IAEhB;;;;;OAKG;IACH,aAFU,YAAU,IAAI,CAEL;IAEnB;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,WAFU,OAAO,CAEC;IAElB;;;OAGG;IACH,cAFU,kBAAkB,CAEY;IAExC;;;OAGG;IACH,MAFU,MAAM,CAEP;IACT,YAAQ;IAmFR;;;OAGG;IACH,wBAEC;IAED;;;;;;;OAOG;IACH,8DA2DC;IAED;;;OAGG;IACH,eAFa;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAM/E;IAED;;;OAGG;IACH,uBAFa,MAAM,CAsBlB;IAED;;;;;;;;OAQG;IACH,wBALW,kBAAkB,SAClB,MAAM,KACN,MAAM,KACN,MAAM,QAiBhB;IAYL;;;OAGG;IACH,6BAFU,OAAO,CAE4B;;CAN5C;0BArUyB,qBAAqB;+BAChB,qBAAqB;mCAFjB,oCAAoC"}
|
|
@@ -1,169 +1,335 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { GPU_DATABASE_NULL } from "../../buffer/table/GPU_DATABASE_NULL.js";
|
|
3
|
+
import { OrthographicCamera } from "../../camera/OrthographicCamera.js";
|
|
4
|
+
import { Shadowmap } from "../map/Shadowmap.js";
|
|
5
|
+
import { VSMPageManager } from "./VSMPageManager.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A directional light's virtual shadow map: a clipmap of world-anchored pages around the main
|
|
9
|
+
* camera, rendered into a region of the shadow atlas as the GPU asks for them and as movers make
|
|
10
|
+
* them stale, under a budget of pages per frame.
|
|
11
|
+
*
|
|
12
|
+
* The page bookkeeping is {@link VSMPageManager}'s; this holds what ties it to the light and to the
|
|
13
|
+
* shadow context: the light space, the depth range, the main view's numbers the record carries, the
|
|
14
|
+
* rows the context claimed for it in the light database, and the pooled views pages are drawn with
|
|
15
|
+
* ({@link views}, one per page a frame may draw).
|
|
16
|
+
*
|
|
17
|
+
* Built and owned by {@link GPUSceneShadowmapContext} when its renderer asks for virtual shadow maps.
|
|
18
|
+
*
|
|
19
|
+
* @extends {Shadowmap}
|
|
20
|
+
*/
|
|
21
|
+
export class VirtualShadowMap extends Shadowmap {
|
|
4
22
|
|
|
5
|
-
|
|
23
|
+
/**
|
|
24
|
+
* @type {VSMPageManager}
|
|
25
|
+
* @readonly
|
|
26
|
+
*/
|
|
27
|
+
manager;
|
|
6
28
|
|
|
7
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Distance either side of the snapped camera depth that the light's depth range reaches.
|
|
31
|
+
* @type {number}
|
|
32
|
+
* @readonly
|
|
33
|
+
*/
|
|
34
|
+
depth_extent;
|
|
8
35
|
|
|
9
36
|
/**
|
|
10
|
-
*
|
|
37
|
+
* The map's row of `shadow_virtual`, claimed by the shadow context with the map; -1 before.
|
|
38
|
+
* @type {number}
|
|
11
39
|
*/
|
|
12
|
-
|
|
40
|
+
record_row = -1;
|
|
13
41
|
|
|
42
|
+
/**
|
|
43
|
+
* First rows of the map's runs of `shadow_virtual_level`, `shadow_virtual_page` and
|
|
44
|
+
* `shadow_virtual_slot`; -1 before they are claimed.
|
|
45
|
+
* @type {number}
|
|
46
|
+
*/
|
|
47
|
+
first_level = -1;
|
|
48
|
+
first_page = -1;
|
|
49
|
+
first_slot = -1;
|
|
14
50
|
|
|
15
51
|
/**
|
|
16
|
-
*
|
|
52
|
+
* The map's own frame count, advanced by every {@link update}: what its pages, touches and
|
|
53
|
+
* readings are stamped with. The map's own because it has to keep rising whichever view the
|
|
54
|
+
* frame was rendered for — a view's count starts again at zero with each new camera, and a
|
|
55
|
+
* reading stamped from it would be refused as older than the last one applied.
|
|
17
56
|
* @type {number}
|
|
18
57
|
*/
|
|
19
|
-
|
|
58
|
+
frame_index = 0;
|
|
20
59
|
|
|
21
60
|
/**
|
|
22
|
-
* @
|
|
61
|
+
* What this frame's {@link update} works with, set by the shadow context before it: how many
|
|
62
|
+
* pages it may draw, the bias the record carries, and the main view's height in pixels.
|
|
23
63
|
*/
|
|
24
|
-
|
|
64
|
+
page_budget = 0;
|
|
65
|
+
lod_bias = 0;
|
|
66
|
+
view_height = 1;
|
|
25
67
|
|
|
26
68
|
/**
|
|
27
|
-
*
|
|
69
|
+
* One word per pool slot, set on the GPU when a mover crosses the slot and cleared when a
|
|
70
|
+
* readback lists it — persistent, so a frame whose readback was skipped loses nothing. Created
|
|
71
|
+
* by the shadow context with the map's rows; null before.
|
|
72
|
+
* @type {GPUBuffer|null}
|
|
28
73
|
*/
|
|
29
|
-
|
|
74
|
+
stale_flags = null;
|
|
30
75
|
|
|
31
76
|
/**
|
|
32
|
-
*
|
|
77
|
+
* Readbacks of this map's feedback on their way back.
|
|
78
|
+
* @type {number}
|
|
33
79
|
*/
|
|
34
|
-
|
|
80
|
+
readbacks_in_flight = 0;
|
|
35
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Set once the map is torn down: a reading still in flight is then dropped.
|
|
84
|
+
* @type {boolean}
|
|
85
|
+
*/
|
|
86
|
+
destroyed = false;
|
|
36
87
|
|
|
37
88
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* @see https://www.w3.org/TR/WGSL/#texturestore
|
|
41
|
-
* @type {GPUBuffer}
|
|
89
|
+
* The light camera at the world origin; its view matrix is light space.
|
|
90
|
+
* @type {OrthographicCamera}
|
|
42
91
|
*/
|
|
43
|
-
|
|
92
|
+
light_camera = new OrthographicCamera();
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The light's depth range this frame, as distances along the light from light space's origin.
|
|
96
|
+
* @type {number}
|
|
97
|
+
*/
|
|
98
|
+
near = 0;
|
|
99
|
+
far = 0;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Where the depth range is centred, along the light; set by the first {@link update}.
|
|
103
|
+
*/
|
|
104
|
+
#depth_centre = 0;
|
|
105
|
+
#depth_centred = false;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The `shadow_virtual` record, written whole every frame.
|
|
109
|
+
*/
|
|
110
|
+
#record = {
|
|
111
|
+
view: new Float32Array(16),
|
|
112
|
+
camera_position: new Float32Array(3),
|
|
113
|
+
pixel_angle: 0,
|
|
114
|
+
near: 0,
|
|
115
|
+
far: 0,
|
|
116
|
+
first_texel_size: 0,
|
|
117
|
+
lod_bias: 0,
|
|
118
|
+
first_level: 0,
|
|
119
|
+
level_count: 0,
|
|
120
|
+
pages_per_level: 0,
|
|
121
|
+
page_size: 0,
|
|
122
|
+
border: 0,
|
|
123
|
+
pool_origin: new Uint32Array(2),
|
|
124
|
+
slots_per_axis: 0,
|
|
125
|
+
first_page: 0,
|
|
126
|
+
page_count: 0,
|
|
127
|
+
first_slot: 0,
|
|
128
|
+
slot_count: 0,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* The `shadow_directional` record: no cascades, and this map.
|
|
133
|
+
*/
|
|
134
|
+
#directional_record = {
|
|
135
|
+
first_cascade: GPU_DATABASE_NULL,
|
|
136
|
+
cascade_count: 0,
|
|
137
|
+
virtual_map: GPU_DATABASE_NULL,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @param {Object} options
|
|
142
|
+
* @param {number} options.level_count
|
|
143
|
+
* @param {number} options.pages_per_level
|
|
144
|
+
* @param {number} options.first_texel_size
|
|
145
|
+
* @param {number} options.page_size
|
|
146
|
+
* @param {number} options.border
|
|
147
|
+
* @param {number} options.pool_size texels on the pool's side
|
|
148
|
+
* @param {number} options.request_capacity
|
|
149
|
+
* @param {number} options.protect_frames
|
|
150
|
+
* @param {number} options.depth_extent
|
|
151
|
+
*/
|
|
152
|
+
constructor({
|
|
153
|
+
level_count,
|
|
154
|
+
pages_per_level,
|
|
155
|
+
first_texel_size,
|
|
156
|
+
page_size,
|
|
157
|
+
border,
|
|
158
|
+
pool_size,
|
|
159
|
+
request_capacity,
|
|
160
|
+
protect_frames,
|
|
161
|
+
depth_extent,
|
|
162
|
+
}) {
|
|
163
|
+
super();
|
|
164
|
+
|
|
165
|
+
assert.isNumber(depth_extent, 'depth_extent');
|
|
166
|
+
assert.greaterThan(depth_extent, 0, 'depth_extent');
|
|
167
|
+
|
|
168
|
+
this.manager = new VSMPageManager({
|
|
169
|
+
level_count,
|
|
170
|
+
pages_per_level,
|
|
171
|
+
first_texel_size,
|
|
172
|
+
page_size,
|
|
173
|
+
border,
|
|
174
|
+
pool_size,
|
|
175
|
+
request_capacity,
|
|
176
|
+
protect_frames,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
this.depth_extent = depth_extent;
|
|
180
|
+
}
|
|
44
181
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
182
|
+
/**
|
|
183
|
+
* Texels on a slot's side: a page and its border.
|
|
184
|
+
* @returns {number}
|
|
185
|
+
*/
|
|
186
|
+
get slot_size() {
|
|
187
|
+
return this.manager.slots.slot_size;
|
|
48
188
|
}
|
|
49
189
|
|
|
50
190
|
/**
|
|
191
|
+
* Fit the light space and the windows to this frame and choose its pages, advancing
|
|
192
|
+
* {@link frame_index}. Reads {@link page_budget}, {@link lod_bias} and {@link view_height}, which
|
|
193
|
+
* the shadow context sets first.
|
|
51
194
|
*
|
|
52
|
-
* @param {
|
|
53
|
-
* @param {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
initialize({
|
|
58
|
-
device,
|
|
59
|
-
virtual_resolution = 4096,
|
|
60
|
-
physical_resolution = 1024,
|
|
61
|
-
tile_resolution = 128
|
|
62
|
-
}) {
|
|
63
|
-
|
|
64
|
-
if (!Number.isSafeInteger(virtual_resolution) || virtual_resolution <= 0
|
|
65
|
-
|| virtual_resolution > 0xffffffff || !Number.isInteger(Math.log2(virtual_resolution))) {
|
|
66
|
-
throw new RangeError(`virtual_resolution must be a positive u32 power of two, instead was ${virtual_resolution}`);
|
|
67
|
-
}
|
|
195
|
+
* @param {Camera} main_camera
|
|
196
|
+
* @param {GPUSceneContext} scene_ctx
|
|
197
|
+
*/
|
|
198
|
+
update(main_camera, scene_ctx) {
|
|
199
|
+
assert.defined(main_camera, 'main_camera');
|
|
68
200
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
throw new RangeError(`tile_resolution must be a positive power of two no larger than virtual_resolution, instead was ${tile_resolution}`);
|
|
72
|
-
}
|
|
201
|
+
const t = this.light.transform;
|
|
202
|
+
const light_camera = this.light_camera;
|
|
73
203
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
204
|
+
// turned as the light, at the origin: its view matrix is world to light space
|
|
205
|
+
light_camera.transform.setRotation(t.rotation_x, t.rotation_y, t.rotation_z, t.rotation_w);
|
|
206
|
+
light_camera.transform.setTranslation(0, 0, 0);
|
|
207
|
+
light_camera.update();
|
|
77
208
|
|
|
78
|
-
const
|
|
79
|
-
// Pages cannot straddle the edge of the physical atlas, including after device clamping.
|
|
80
|
-
const physical_tiles_per_side = Math.floor(Math.min(physical_resolution, resolution_limit) / tile_resolution);
|
|
81
|
-
const _actual_physical_resolution = physical_tiles_per_side * tile_resolution;
|
|
82
|
-
if (physical_tiles_per_side === 0) {
|
|
83
|
-
throw new RangeError('The physical atlas must fit at least one tile within the device texture limit');
|
|
84
|
-
}
|
|
209
|
+
const view = light_camera.view_matrix;
|
|
85
210
|
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
if (resolution_in_tiles > 32768 || lookup_size > device.limits.maxBufferSize
|
|
91
|
-
|| lookup_size > device.limits.maxStorageBufferBindingSize
|
|
92
|
-
|| Math.ceil(total_tile_count / 256) > device.limits.maxComputeWorkgroupsPerDimension) {
|
|
93
|
-
throw new RangeError('The virtual tile tree exceeds the shader or device buffer/dispatch limits');
|
|
94
|
-
}
|
|
211
|
+
const c = main_camera.transform;
|
|
212
|
+
const cx = c.translation_x;
|
|
213
|
+
const cy = c.translation_y;
|
|
214
|
+
const cz = c.translation_z;
|
|
95
215
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this.resolution_in_tiles = resolution_in_tiles;
|
|
216
|
+
const light_x = view[0] * cx + view[4] * cy + view[8] * cz + view[12];
|
|
217
|
+
const light_y = view[1] * cx + view[5] * cy + view[9] * cz + view[13];
|
|
218
|
+
const light_depth = -(view[2] * cx + view[6] * cy + view[10] * cz + view[14]);
|
|
100
219
|
|
|
220
|
+
// snapped, so the range moves — and every page with it — only when the camera has gone a
|
|
221
|
+
// quarter of it along the light from where the range is centred: a camera standing on the
|
|
222
|
+
// plane between two snaps does not move it back and forth
|
|
223
|
+
const snap = this.depth_extent / 4;
|
|
101
224
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
225
|
+
if (!this.#depth_centred || Math.abs(light_depth - this.#depth_centre) > snap) {
|
|
226
|
+
this.#depth_centre = Math.round(light_depth / snap) * snap;
|
|
227
|
+
this.#depth_centred = true;
|
|
228
|
+
}
|
|
105
229
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
physical_descriptor.size = [_actual_physical_resolution, _actual_physical_resolution];
|
|
109
|
-
physical_descriptor.mipLevelCount = 1;
|
|
110
|
-
physical_descriptor.usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT;
|
|
230
|
+
this.near = this.#depth_centre - this.depth_extent;
|
|
231
|
+
this.far = this.#depth_centre + this.depth_extent;
|
|
111
232
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
label: "Virtual Shadow Map / uniforms",
|
|
115
|
-
size: VSM_UNIFORMS_STRUCT.size,
|
|
116
|
-
usage: GPUBufferUsage.UNIFORM,
|
|
117
|
-
mappedAtCreation: true
|
|
118
|
-
});
|
|
233
|
+
const manager = this.manager;
|
|
234
|
+
const frame = ++this.frame_index;
|
|
119
235
|
|
|
120
|
-
|
|
236
|
+
manager.set_light_space(view, this.near, this.far, frame);
|
|
237
|
+
manager.update_windows(light_x, light_y);
|
|
238
|
+
manager.select(frame, this.page_budget);
|
|
121
239
|
|
|
122
|
-
const
|
|
240
|
+
const record = this.#record;
|
|
123
241
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
242
|
+
record.view.set(view);
|
|
243
|
+
record.camera_position[0] = cx;
|
|
244
|
+
record.camera_position[1] = cy;
|
|
245
|
+
record.camera_position[2] = cz;
|
|
127
246
|
|
|
128
|
-
|
|
247
|
+
// a perspective view's pixel at unit distance; a view without a field of view selects the
|
|
248
|
+
// finest level everywhere
|
|
249
|
+
const fov = main_camera.fov;
|
|
250
|
+
record.pixel_angle = fov === undefined ? 0 : 2 * Math.tan(fov * 0.5) / Math.max(1, this.view_height);
|
|
129
251
|
|
|
130
|
-
|
|
252
|
+
record.near = this.near;
|
|
253
|
+
record.far = this.far;
|
|
254
|
+
record.lod_bias = this.lod_bias;
|
|
131
255
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
new Uint32Array(this.buffer_lookup.getMappedRange()).fill(0xffffffff);
|
|
142
|
-
this.buffer_lookup.unmap();
|
|
256
|
+
this.metadata_changed = true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* The `shadow_directional` record: an empty cascade range, and this map's `shadow_virtual` row.
|
|
261
|
+
* @returns {{first_cascade: number, cascade_count: number, virtual_map: number}}
|
|
262
|
+
*/
|
|
263
|
+
make_record() {
|
|
264
|
+
this.#directional_record.virtual_map = this.record_row;
|
|
143
265
|
|
|
266
|
+
return this.#directional_record;
|
|
144
267
|
}
|
|
145
268
|
|
|
146
|
-
|
|
269
|
+
/**
|
|
270
|
+
* The `shadow_virtual` record as of the last {@link update}.
|
|
271
|
+
* @returns {object}
|
|
272
|
+
*/
|
|
273
|
+
make_virtual_record() {
|
|
274
|
+
const record = this.#record;
|
|
275
|
+
const manager = this.manager;
|
|
276
|
+
const pool = this.layout[0];
|
|
277
|
+
|
|
278
|
+
record.first_texel_size = manager.first_texel_size;
|
|
279
|
+
record.first_level = this.first_level;
|
|
280
|
+
record.level_count = manager.level_count;
|
|
281
|
+
record.pages_per_level = manager.pages_per_level;
|
|
282
|
+
record.page_size = manager.page_size;
|
|
283
|
+
record.border = manager.border;
|
|
284
|
+
record.pool_origin[0] = pool.x0;
|
|
285
|
+
record.pool_origin[1] = pool.y0;
|
|
286
|
+
record.slots_per_axis = manager.slots.slots_per_axis;
|
|
287
|
+
record.first_page = this.first_page;
|
|
288
|
+
record.page_count = manager.cell_count;
|
|
289
|
+
record.first_slot = this.first_slot;
|
|
290
|
+
record.slot_count = manager.slots.capacity;
|
|
291
|
+
|
|
292
|
+
return record;
|
|
293
|
+
}
|
|
147
294
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
295
|
+
/**
|
|
296
|
+
* Point a page camera at a page: turned as the light, at the origin, its planes the page's
|
|
297
|
+
* square widened by its border on every side, the light's depth range.
|
|
298
|
+
*
|
|
299
|
+
* @param {OrthographicCamera} camera
|
|
300
|
+
* @param {number} level
|
|
301
|
+
* @param {number} x world page
|
|
302
|
+
* @param {number} y world page
|
|
303
|
+
*/
|
|
304
|
+
aim_page_camera(camera, level, x, y) {
|
|
305
|
+
const manager = this.manager;
|
|
306
|
+
const size = manager.page_world_size(level);
|
|
307
|
+
const border = size * manager.border / manager.page_size;
|
|
151
308
|
|
|
152
|
-
|
|
309
|
+
camera.transform.copy(this.light_camera.transform);
|
|
153
310
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
311
|
+
camera.left = x * size - border;
|
|
312
|
+
camera.right = (x + 1) * size + border;
|
|
313
|
+
camera.bottom = y * size - border;
|
|
314
|
+
camera.top = (y + 1) * size + border;
|
|
315
|
+
camera.near = this.near;
|
|
316
|
+
camera.far = this.far;
|
|
158
317
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
318
|
+
camera.update();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
destroy() {
|
|
322
|
+
this.destroyed = true;
|
|
323
|
+
|
|
324
|
+
if (this.stale_flags !== null) {
|
|
325
|
+
this.stale_flags.destroy();
|
|
326
|
+
this.stale_flags = null;
|
|
166
327
|
}
|
|
167
|
-
this.resolution_in_tiles = 0;
|
|
168
328
|
}
|
|
169
329
|
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* @readonly
|
|
333
|
+
* @type {boolean}
|
|
334
|
+
*/
|
|
335
|
+
VirtualShadowMap.prototype.isVirtualShadowMap = true;
|