@woosh/meep-engine 3.39.0 → 3.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +17 -4
- package/src/engine/asset/loaders/image/avif/threaded_image_encoder.js +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/graphics/ecs/water/Water.d.ts +14 -17
- package/src/engine/graphics/ecs/water/Water.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/Water.js +100 -110
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSerializationAdapter.js +36 -38
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts +6 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.d.ts.map +1 -0
- package/src/engine/graphics/ecs/water/WaterSerializationUpgrader_3_4.js +10 -0
- package/src/engine/graphics/ecs/water/WaterWaves.d.ts +3 -3
- package/src/engine/graphics/ecs/water/WaterWaves.js +46 -46
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_to_avif.js +8 -5
- package/src/engine/graphics3/WaterSystem.d.ts +21 -74
- package/src/engine/graphics3/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/WaterSystem.js +174 -367
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/format/image/avif/api/convert_to_rgba.d.ts +2 -2
- package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
- package/src/format/image/avif/api/convert_to_rgba.js +10 -9
- package/src/format/image/avif/api/decode_avif.d.ts +2 -2
- package/src/format/image/avif/api/decode_avif.d.ts.map +1 -1
- package/src/format/image/avif/api/decode_avif.js +1 -1
- package/src/shade/playground/ssr_reprojection/README.md +111 -103
- package/src/shade/playground/ssr_reprojection/SpatialFilterProbe.js +68 -68
- package/src/shade/playground/ssr_reprojection/index.html +80 -79
- package/src/shade/playground/ssr_reprojection/main.js +256 -247
- package/src/shade/playground/ssr_variance/capture.js +96 -96
- package/src/shade/playground/ssr_variance/reference.js +78 -78
- package/src/shade/playground/vsm/README.md +96 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts +49 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.d.ts.map +1 -0
- package/src/shade/playground/vsm/VSMDebugOverlay.js +351 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts +8 -0
- package/src/shade/playground/vsm/clipmap_panel.d.ts.map +1 -0
- package/src/shade/playground/vsm/clipmap_panel.js +138 -0
- package/src/shade/playground/vsm/index.html +170 -0
- package/src/shade/playground/vsm/main.d.ts +2 -0
- package/src/shade/playground/vsm/main.d.ts.map +1 -0
- package/src/shade/playground/vsm/main.js +389 -0
- package/src/shade/playground/vsm/scenes.d.ts +52 -0
- package/src/shade/playground/vsm/scenes.d.ts.map +1 -0
- package/src/shade/playground/vsm/scenes.js +320 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts +38 -0
- package/src/shade/playground/vsm/verify_vsm.d.ts.map +1 -0
- package/src/shade/playground/vsm/verify_vsm.js +305 -0
- package/src/shade/playground/water_refraction/README.md +57 -9
- package/src/shade/playground/water_refraction/main.js +12 -3
- package/src/shade/playground/water_refraction/world.d.ts +1 -0
- package/src/shade/playground/water_refraction/world.d.ts.map +1 -1
- package/src/shade/playground/water_refraction/world.js +15 -5
- package/src/shade/renderer/Renderer.d.ts +19 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +72 -1
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +8 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +18 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +7 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +11 -0
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +10 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_read_code.js +28 -0
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/serde/table_wgsl_gen_write_code.js +31 -1
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts +3 -0
- package/src/shade/renderer/geometry/MeshletGeometry.d.ts.map +1 -1
- package/src/shade/renderer/geometry/MeshletGeometry.js +1 -0
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +62 -4
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
- package/src/shade/renderer/light/environment/rgbe/parse_rgbe.js +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts +2 -2
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/rgbe_byte_to_rgb_half.js +6 -14
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/sh_exponential/chunk_sh_exp_workgroup_sum.js +5 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts +3 -0
- package/src/shade/renderer/medium/ParticipatingMedium.d.ts.map +1 -1
- package/src/shade/renderer/medium/ParticipatingMedium.js +7 -0
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_build_histogram.js +5 -35
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +12 -4
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +36 -8
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/SSR_DENOISE_TILE_SIZE.js +2 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts +8 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/chunk_ssr_denoise_tile_active.js +40 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +150 -137
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts +3 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_classify.js +44 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts +5 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader_ssr_denoise_tile_dilate.js +35 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts +26 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_graph_denoise_tiles.js +42 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +1 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +113 -105
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts +2 -0
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +177 -167
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/DEPTH_STENCIL_STATE_SHADOW.js +10 -0
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts +1 -2
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/RasterizationJob.js +1 -2
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +5 -6
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +5 -6
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +2 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +11 -0
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/phase/jd/build_lut_fog_parameters_jendersie_deon.js +4 -5
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/dfg/generate_dfg_texture.js +1 -5
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts +30 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_importance.js +54 -0
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/read_gpu_typed_buffer.js +3 -2
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts +19 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DIRECTIONAL_SHADOWMAP_STRUCT.js +27 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +1 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +4 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +54 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +502 -10
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts +3 -2
- package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/Shadowmap.js +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts +8 -0
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_sample_shadowmap_atlas_for_light.js +34 -3
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +3 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +17 -2
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_point2.js +137 -133
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_FIRST_TEXEL_SIZE.js +14 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/DEFAULT_VSM_PAGE_BUDGET.js +15 -0
- package/src/shade/renderer/shadow/vsm/PLAN.md +440 -0
- package/src/shade/renderer/shadow/vsm/REVIEW_LEDGER.md +43 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +42 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.js +153 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts +327 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSMPageManager.js +1408 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_COVER_LEVEL_STEP.js +13 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts +63 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_FEEDBACK_LAYOUT.js +70 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts +11 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_LEVEL_LIMIT.js +10 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +54 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.js +75 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_RECORD_STRUCT.js +85 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts +16 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/VSM_SLOT_STRUCT.js +29 -0
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts +136 -25
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +282 -116
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts +39 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/graph_vsm_feedback.js +289 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts +18 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_virtual.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_addressing.js +75 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +14 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.js +45 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts +17 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_find_page.js +100 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts +15 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_page_view_projection.js +47 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts +26 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_demand.js +156 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_gather_counts.js +65 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +30 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.js +184 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +23 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js +109 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts +56 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js +211 -0
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/decode_typed_gpu_data.js +3 -13
- package/src/shade/renderer/texture/format/infer_format_from_parameters.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/infer_format_from_parameters.js +2 -3
- package/src/shade/renderer/texture/texture_write_to_gpu.d.ts.map +1 -1
- package/src/shade/renderer/texture/texture_write_to_gpu.js +16 -16
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts +4 -90
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VTPhysicalCache.js +6 -210
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts +119 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/VTPhysicalSlots.js +245 -0
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/build_chunk_vt_lookup.js +3 -19
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts +13 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.d.ts.map +1 -0
- package/src/shade/renderer/texture/virtual/chunk_vt_page_table_entry.js +34 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +7 -2
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +49 -49
- package/src/shade/renderer/water/chunk_water_transport.js +3 -3
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts +11 -25
- package/src/shade/renderer/water/medium/GPUWaterBodies.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/GPUWaterBodies.js +64 -116
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts +1 -20
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/WATER_BODIES_STRUCT.js +10 -42
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts +3 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/chunk_water_bodies.js +3 -0
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts +1 -5
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.d.ts.map +1 -1
- package/src/shade/renderer/water/medium/shader_water_bodies_derive.js +32 -30
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts +4 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/water/medium/shader_water_meshlets.js +69 -0
- package/src/shade/renderer/water/optics/chunk_water_inscatter.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_inscatter.js +124 -123
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.d.ts.map +1 -1
- package/src/shade/renderer/water/optics/chunk_water_receiver_downwelling.js +75 -74
- package/src/shade/renderer/water/shader_water.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +490 -406
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts +12 -85
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/GPUWaterWaveSimulation.js +128 -408
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts +6 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/WATER_WAVE_RECORD_STRUCT.js +23 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts +9 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/chunk_water_tessellation.js +144 -0
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts +3 -5
- package/src/shade/renderer/water/surface/chunk_water_wave.d.ts.map +1 -1
- package/src/shade/renderer/water/surface/chunk_water_wave.js +40 -48
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts +14 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/graph_water_tessellation.js +34 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts +4 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_tiles.js +123 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_batch.js +85 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts +6 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.d.ts.map +1 -0
- package/src/shade/renderer/water/surface/shader_water_wave_domain.js +83 -0
- package/src/shade/renderer/water/water_height_texture_from_sampler.d.ts.map +1 -1
- package/src/shade/renderer/water/water_height_texture_from_sampler.js +4 -3
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts +0 -2
- package/src/engine/graphics/ecs/water/WATER_SIZE.d.ts.map +0 -1
- package/src/engine/graphics/ecs/water/WATER_SIZE.js +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.d.ts +0 -22
- package/src/shade/renderer/light/GPUViewLightContext.d.ts.map +0 -1
- package/src/shade/renderer/light/GPUViewLightContext.js +0 -62
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts +0 -14
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/map/csm/CSM_SHADOWMAP_STRUCT.js +0 -20
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +0 -147
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts +0 -7
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/GPUVirtualShadowTextureResidence.js +0 -10
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_RESIDENCE_WORKGROUP_TILE_RESOLUTION.js +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_UNIFORMS_STRUCT.js +0 -8
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts +0 -27
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowmapRenderer.js +0 -102
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts +0 -8
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_coarse_bounds_buffer.js +0 -34
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts +0 -10
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/debug_inspect_residence_buffer.js +0 -64
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts +0 -11
- package/src/shade/renderer/shadow/vsm/decode_tile_address.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/decode_tile_address.js +0 -26
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts +0 -2
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/render/vms_render_tiles.js +0 -11
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts +0 -20
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vms_pipeline_compute_coarse_bounds.js +0 -184
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts +0 -25
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_residence_pipeline.js +0 -230
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts +0 -19
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/vsm_tile_allocation_pipeline.js +0 -127
- package/src/shade/renderer/texture/encode/ENCODE_NOTES_2026_09_02.md +0 -462
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts +0 -23
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance.d.ts.map +0 -1
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts +0 -18
- package/src/shade/renderer/water/optics/chunk_water_light_transmittance_dry.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts +0 -12
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_SURFACE_VERTEX_STRUCT.js +0 -27
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts +0 -14
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/WATER_WAVE_PARAMETERS_STRUCT.js +0 -49
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts +0 -9
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/chunk_water_wave_grid.js +0 -47
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts +0 -10
- package/src/shade/renderer/water/surface/shader_water_surface_write.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_surface_write.js +0 -51
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts +0 -12
- package/src/shade/renderer/water/surface/shader_water_wave_step.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/shader_water_wave_step.js +0 -54
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts +0 -13
- package/src/shade/renderer/water/surface/water_surface_grid_indices.d.ts.map +0 -1
- package/src/shade/renderer/water/surface/water_surface_grid_indices.js +0 -39
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const VSM_SKINNED_MOVERS_WORKGROUP_SIZE: 64;
|
|
2
|
+
/**
|
|
3
|
+
* @type {WebGPUStruct}
|
|
4
|
+
*/
|
|
5
|
+
export const VSM_SKINNED_MOVERS_SETTINGS_STRUCT: WebGPUStruct;
|
|
6
|
+
/**
|
|
7
|
+
* List every skinned mesh whose pose changed since last frame: a joint's skin matrix differs from
|
|
8
|
+
* the one the animation manager kept from the frame before. A pose can change inside bounds that
|
|
9
|
+
* stay put — an arm swinging inside the box its feet and head set — which neither the row's
|
|
10
|
+
* transform nor its box would show; a skin held still is no mover.
|
|
11
|
+
*
|
|
12
|
+
* The mesh's box is this frame's, after the bounds refresh: a pose that changed it is also caught by
|
|
13
|
+
* {@link shader_vsm_movers}, with where the mesh was.
|
|
14
|
+
*
|
|
15
|
+
* One workgroup per skinning binding, its lanes over the skin's joints, after
|
|
16
|
+
* {@link shader_vsm_movers} into the same list.
|
|
17
|
+
*
|
|
18
|
+
* @type {ComputeShader}
|
|
19
|
+
*/
|
|
20
|
+
export const shader_vsm_skinned_movers: ComputeShader;
|
|
21
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
22
|
+
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
23
|
+
//# sourceMappingURL=shader_vsm_skinned_movers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_vsm_skinned_movers.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.js"],"names":[],"mappings":"AAYA,mDAAoD;AAEpD;;GAEG;AACH,iDAFU,YAAY,CAKS;AAsE/B;;;;;;;;;;;;;GAaG;AACH,wCAFU,aAAa,CAMpB;6BApG0B,sCAAsC;8BAJrC,kCAAkC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { WebGPUExtensionType } from "../../../../descriptor/WebGPUExtensionType.js";
|
|
2
|
+
import { SKINNING_BINDING_STRUCT } from "../../../animation/skinning/SKINNING_BINDING_STRUCT.js";
|
|
3
|
+
import { chunk_scene_database_access } from "../../../scene/chunk_scene_database_access.js";
|
|
4
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
5
|
+
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
6
|
+
import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
7
|
+
import { mat4x4f, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
8
|
+
import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
|
|
9
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
10
|
+
import { VSM_MOVERS_STRUCT } from "../VSM_MOVER_LAYOUT.js";
|
|
11
|
+
import { chunk_vsm_append_mover } from "./chunk_vsm_append_mover.js";
|
|
12
|
+
|
|
13
|
+
export const VSM_SKINNED_MOVERS_WORKGROUP_SIZE = 64;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {WebGPUStruct}
|
|
17
|
+
*/
|
|
18
|
+
export const VSM_SKINNED_MOVERS_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
19
|
+
binding_count: u32,
|
|
20
|
+
capacity: u32,
|
|
21
|
+
}, "VSMSkinnedMoversSettings");
|
|
22
|
+
|
|
23
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
24
|
+
|
|
25
|
+
resources.setImmediate('settings', VSM_SKINNED_MOVERS_SETTINGS_STRUCT);
|
|
26
|
+
|
|
27
|
+
resources.createGroup()
|
|
28
|
+
.addStorageBuffer('scene_database', WebGPUArray.from(u32), false)
|
|
29
|
+
.addStorageBuffer('bindings', WebGPUArray.from(SKINNING_BINDING_STRUCT), false)
|
|
30
|
+
.addStorageBuffer('skin_matrices', WebGPUArray.from(mat4x4f), false)
|
|
31
|
+
.addStorageBuffer('prev_skin_matrices', WebGPUArray.from(mat4x4f), false)
|
|
32
|
+
.addStorageBuffer('movers', VSM_MOVERS_STRUCT, true);
|
|
33
|
+
|
|
34
|
+
const body = CodeChunk.from(
|
|
35
|
+
//language=WGSL
|
|
36
|
+
`
|
|
37
|
+
const LANES = ${VSM_SKINNED_MOVERS_WORKGROUP_SIZE}u;
|
|
38
|
+
|
|
39
|
+
// set by the first lane to find a joint that moved: that lane alone lists the mesh
|
|
40
|
+
var<workgroup> claimed: atomic<u32>;
|
|
41
|
+
|
|
42
|
+
fn vsm_matrix_differs(a: mat4x4f, b: mat4x4f) -> bool {
|
|
43
|
+
return any(a[0] != b[0]) || any(a[1] != b[1]) || any(a[2] != b[2]) || any(a[3] != b[3]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@compute @workgroup_size(${VSM_SKINNED_MOVERS_WORKGROUP_SIZE},1,1)
|
|
47
|
+
fn main(
|
|
48
|
+
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
|
49
|
+
@builtin(local_invocation_index) lane: u32,
|
|
50
|
+
) {
|
|
51
|
+
let index = workgroup_id.x;
|
|
52
|
+
|
|
53
|
+
// the whole workgroup's binding, so the whole workgroup leaves
|
|
54
|
+
if (index >= settings.binding_count) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
let binding = bindings[index];
|
|
59
|
+
|
|
60
|
+
// a lane's joints, a workgroup's width apart: as many as the skin has, over the lanes
|
|
61
|
+
var moved = false;
|
|
62
|
+
|
|
63
|
+
for (var j = lane; j < binding.skin_matrix_count; j += LANES) {
|
|
64
|
+
let row = binding.skin_matrix_offset + j;
|
|
65
|
+
|
|
66
|
+
moved = moved || vsm_matrix_differs(skin_matrices[row], prev_skin_matrices[row]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let first = moved && atomicExchange(&claimed, 1u) == 0u;
|
|
70
|
+
|
|
71
|
+
var box_min = vec3f(0.0);
|
|
72
|
+
var box_max = vec3f(0.0);
|
|
73
|
+
|
|
74
|
+
if (first) {
|
|
75
|
+
let mesh = scene_read_mesh(&scene_database, binding.mesh_instance_index);
|
|
76
|
+
|
|
77
|
+
box_min = vec3f(mesh.bounding_box[0], mesh.bounding_box[1], mesh.bounding_box[2]);
|
|
78
|
+
box_max = vec3f(mesh.bounding_box[3], mesh.bounding_box[4], mesh.bounding_box[5]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
vsm_append_mover(first && all(box_min <= box_max), box_min, box_max, settings.capacity);
|
|
82
|
+
}
|
|
83
|
+
`, [
|
|
84
|
+
SKINNING_BINDING_STRUCT.declaration_chunk,
|
|
85
|
+
chunk_scene_database_access,
|
|
86
|
+
chunk_vsm_append_mover,
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
body.addExtension(WebGPUExtensionType.Subgroups);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* List every skinned mesh whose pose changed since last frame: a joint's skin matrix differs from
|
|
93
|
+
* the one the animation manager kept from the frame before. A pose can change inside bounds that
|
|
94
|
+
* stay put — an arm swinging inside the box its feet and head set — which neither the row's
|
|
95
|
+
* transform nor its box would show; a skin held still is no mover.
|
|
96
|
+
*
|
|
97
|
+
* The mesh's box is this frame's, after the bounds refresh: a pose that changed it is also caught by
|
|
98
|
+
* {@link shader_vsm_movers}, with where the mesh was.
|
|
99
|
+
*
|
|
100
|
+
* One workgroup per skinning binding, its lanes over the skin's joints, after
|
|
101
|
+
* {@link shader_vsm_movers} into the same list.
|
|
102
|
+
*
|
|
103
|
+
* @type {ComputeShader}
|
|
104
|
+
*/
|
|
105
|
+
export const shader_vsm_skinned_movers = ComputeShader.from({
|
|
106
|
+
label: "VSM/SkinnedMovers",
|
|
107
|
+
body,
|
|
108
|
+
resources,
|
|
109
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slots a stale-pass workgroup tests against its mover: one per lane.
|
|
3
|
+
* @type {number}
|
|
4
|
+
*/
|
|
5
|
+
export const VSM_STALE_WORKGROUP_SIZE: number;
|
|
6
|
+
/**
|
|
7
|
+
* @type {WebGPUStruct}
|
|
8
|
+
*/
|
|
9
|
+
export const VSM_STALE_ARGS_SETTINGS_STRUCT: WebGPUStruct;
|
|
10
|
+
/**
|
|
11
|
+
* Size the stale pass to this frame's movers: `(ceil(slots / 64), movers, 1)` workgroups, a row of
|
|
12
|
+
* workgroups per mover — or one row when the list overflowed, which marks every occupied slot. No
|
|
13
|
+
* movers, no workgroups.
|
|
14
|
+
*
|
|
15
|
+
* One thread.
|
|
16
|
+
*
|
|
17
|
+
* @type {ComputeShader}
|
|
18
|
+
*/
|
|
19
|
+
export const shader_vsm_stale_args: ComputeShader;
|
|
20
|
+
/**
|
|
21
|
+
* @type {WebGPUStruct}
|
|
22
|
+
*/
|
|
23
|
+
export const VSM_STALE_SETTINGS_STRUCT: WebGPUStruct;
|
|
24
|
+
/**
|
|
25
|
+
* Mark the pool slots a mover crossed: workgroup `(x, y)` tests mover `y` against slots
|
|
26
|
+
* `[64x, 64x + 64)`, one lane a slot, so no thread loops.
|
|
27
|
+
*
|
|
28
|
+
* A slot's page is a square of its level in light space, widened by its border — the slot's whole
|
|
29
|
+
* extent, filtering included. A mover's world box goes into light space as a box around its centre:
|
|
30
|
+
* the light view's rotation of the centre, and the absolute rotation of the half-extent. A hit sets
|
|
31
|
+
* the slot's flag, which stays set until {@link shader_vsm_stale_compact} lists it for a readback, so
|
|
32
|
+
* a frame whose readback was skipped loses nothing.
|
|
33
|
+
*
|
|
34
|
+
* When the mover list overflowed, the one row of workgroups marks every occupied slot.
|
|
35
|
+
*
|
|
36
|
+
* Dispatch indirect from {@link shader_vsm_stale_args}.
|
|
37
|
+
*
|
|
38
|
+
* @type {ComputeShader}
|
|
39
|
+
*/
|
|
40
|
+
export const shader_vsm_stale: ComputeShader;
|
|
41
|
+
/**
|
|
42
|
+
* @type {WebGPUStruct}
|
|
43
|
+
*/
|
|
44
|
+
export const VSM_STALE_COMPACT_SETTINGS_STRUCT: WebGPUStruct;
|
|
45
|
+
/**
|
|
46
|
+
* List the slots flagged stale into the feedback buffer, clearing their flags, and copy the frame's
|
|
47
|
+
* mover count into its header. Runs on the frames a readback is taken, after {@link shader_vsm_stale}.
|
|
48
|
+
*
|
|
49
|
+
* One thread per slot.
|
|
50
|
+
*
|
|
51
|
+
* @type {ComputeShader}
|
|
52
|
+
*/
|
|
53
|
+
export const shader_vsm_stale_compact: ComputeShader;
|
|
54
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
55
|
+
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
56
|
+
//# sourceMappingURL=shader_vsm_stale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_vsm_stale.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/vsm/shader/shader_vsm_stale.js"],"names":[],"mappings":"AAYA;;;GAGG;AACH,uCAFU,MAAM,CAE2B;AAM3C;;GAEG;AACH,6CAFU,YAAY,CAIK;AAU3B;;;;;;;;GAQG;AACH,oCAFU,aAAa,CAiBpB;AAEH;;GAEG;AACH,wCAFU,YAAY,CAIC;AAYvB;;;;;;;;;;;;;;;GAeG;AACH,+BAFU,aAAa,CA6DpB;AAEH;;GAEG;AACH,gDAFU,YAAY,CAKQ;AAW9B;;;;;;;GAOG;AACH,uCAFU,aAAa,CA8BpB;6BA5M0B,sCAAsC;8BAJrC,kCAAkC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
|
|
2
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
3
|
+
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
4
|
+
import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
5
|
+
import { atomic_u32, u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
6
|
+
import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
|
|
7
|
+
import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
|
|
8
|
+
import { VSM_FEEDBACK_LAYOUT } from "../VSM_FEEDBACK_LAYOUT.js";
|
|
9
|
+
import { VSM_MOVER_CAPACITY, VSM_MOVERS_READ_STRUCT } from "../VSM_MOVER_LAYOUT.js";
|
|
10
|
+
import { VSM_SLOT_EMPTY } from "../VSM_SLOT_STRUCT.js";
|
|
11
|
+
import { chunk_vsm_addressing } from "./chunk_vsm_addressing.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Slots a stale-pass workgroup tests against its mover: one per lane.
|
|
15
|
+
* @type {number}
|
|
16
|
+
*/
|
|
17
|
+
export const VSM_STALE_WORKGROUP_SIZE = 64;
|
|
18
|
+
|
|
19
|
+
const RECORD_TABLE = LIGHT_DATABASE_SPEC.get('shadow_virtual');
|
|
20
|
+
const SLOT_TABLE = LIGHT_DATABASE_SPEC.get('shadow_virtual_slot');
|
|
21
|
+
const L = VSM_FEEDBACK_LAYOUT;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @type {WebGPUStruct}
|
|
25
|
+
*/
|
|
26
|
+
export const VSM_STALE_ARGS_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
27
|
+
slot_count: u32,
|
|
28
|
+
}, "VSMStaleArgsSettings");
|
|
29
|
+
|
|
30
|
+
const args_resources = new ShaderResourceSetDescriptor();
|
|
31
|
+
|
|
32
|
+
args_resources.setImmediate('settings', VSM_STALE_ARGS_SETTINGS_STRUCT);
|
|
33
|
+
|
|
34
|
+
args_resources.createGroup()
|
|
35
|
+
.addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
|
|
36
|
+
.addStorageBuffer('command', WebGPUArray.from(u32), true);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Size the stale pass to this frame's movers: `(ceil(slots / 64), movers, 1)` workgroups, a row of
|
|
40
|
+
* workgroups per mover — or one row when the list overflowed, which marks every occupied slot. No
|
|
41
|
+
* movers, no workgroups.
|
|
42
|
+
*
|
|
43
|
+
* One thread.
|
|
44
|
+
*
|
|
45
|
+
* @type {ComputeShader}
|
|
46
|
+
*/
|
|
47
|
+
export const shader_vsm_stale_args = ComputeShader.from({
|
|
48
|
+
label: "VSM/StaleArgs",
|
|
49
|
+
body: CodeChunk.from(
|
|
50
|
+
//language=WGSL
|
|
51
|
+
`
|
|
52
|
+
@compute @workgroup_size(1, 1, 1)
|
|
53
|
+
fn main() {
|
|
54
|
+
let count = movers.count;
|
|
55
|
+
|
|
56
|
+
command[0] = (settings.slot_count + ${VSM_STALE_WORKGROUP_SIZE - 1}u) / ${VSM_STALE_WORKGROUP_SIZE}u;
|
|
57
|
+
command[1] = select(count, 1u, count > ${VSM_MOVER_CAPACITY}u);
|
|
58
|
+
command[2] = 1u;
|
|
59
|
+
}
|
|
60
|
+
`),
|
|
61
|
+
resources: args_resources,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @type {WebGPUStruct}
|
|
66
|
+
*/
|
|
67
|
+
export const VSM_STALE_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
68
|
+
record_row: u32,
|
|
69
|
+
}, "VSMStaleSettings");
|
|
70
|
+
|
|
71
|
+
const stale_resources = new ShaderResourceSetDescriptor();
|
|
72
|
+
|
|
73
|
+
stale_resources.setImmediate('settings', VSM_STALE_SETTINGS_STRUCT);
|
|
74
|
+
|
|
75
|
+
stale_resources.createGroup()
|
|
76
|
+
.addStorageBuffer('light_database', WebGPUArray.from(u32), false)
|
|
77
|
+
.addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
|
|
78
|
+
// persistent, one word per slot: 1 when a mover crossed the slot since the flags were last read
|
|
79
|
+
.addStorageBuffer('stale_flags', WebGPUArray.from(atomic_u32), true);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Mark the pool slots a mover crossed: workgroup `(x, y)` tests mover `y` against slots
|
|
83
|
+
* `[64x, 64x + 64)`, one lane a slot, so no thread loops.
|
|
84
|
+
*
|
|
85
|
+
* A slot's page is a square of its level in light space, widened by its border — the slot's whole
|
|
86
|
+
* extent, filtering included. A mover's world box goes into light space as a box around its centre:
|
|
87
|
+
* the light view's rotation of the centre, and the absolute rotation of the half-extent. A hit sets
|
|
88
|
+
* the slot's flag, which stays set until {@link shader_vsm_stale_compact} lists it for a readback, so
|
|
89
|
+
* a frame whose readback was skipped loses nothing.
|
|
90
|
+
*
|
|
91
|
+
* When the mover list overflowed, the one row of workgroups marks every occupied slot.
|
|
92
|
+
*
|
|
93
|
+
* Dispatch indirect from {@link shader_vsm_stale_args}.
|
|
94
|
+
*
|
|
95
|
+
* @type {ComputeShader}
|
|
96
|
+
*/
|
|
97
|
+
export const shader_vsm_stale = ComputeShader.from({
|
|
98
|
+
label: "VSM/Stale",
|
|
99
|
+
body: CodeChunk.from(
|
|
100
|
+
//language=WGSL
|
|
101
|
+
`
|
|
102
|
+
@compute @workgroup_size(${VSM_STALE_WORKGROUP_SIZE}, 1, 1)
|
|
103
|
+
fn main(
|
|
104
|
+
@builtin(workgroup_id) wg_id: vec3<u32>,
|
|
105
|
+
@builtin(local_invocation_index) lane: u32,
|
|
106
|
+
) {
|
|
107
|
+
let record = ${RECORD_TABLE.marshalling_method_read}(&light_database, settings.record_row);
|
|
108
|
+
|
|
109
|
+
let slot = wg_id.x * ${VSM_STALE_WORKGROUP_SIZE}u + lane;
|
|
110
|
+
|
|
111
|
+
if (slot >= record.slot_count) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let held = ${SLOT_TABLE.marshalling_method_read}(&light_database, record.first_slot + slot);
|
|
116
|
+
|
|
117
|
+
if (held.level == ${VSM_SLOT_EMPTY}u) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var hit = false;
|
|
122
|
+
|
|
123
|
+
if (movers.count > ${VSM_MOVER_CAPACITY}u) {
|
|
124
|
+
// the list overflowed: every occupied slot may hold a stale shadow
|
|
125
|
+
hit = wg_id.y == 0u;
|
|
126
|
+
} else {
|
|
127
|
+
let low = movers.boxes[wg_id.y * 2u].xyz;
|
|
128
|
+
let high = movers.boxes[wg_id.y * 2u + 1u].xyz;
|
|
129
|
+
|
|
130
|
+
let centre = (low + high) * 0.5;
|
|
131
|
+
let half_extent = (high - low) * 0.5;
|
|
132
|
+
|
|
133
|
+
let view = record.view;
|
|
134
|
+
let centre_ls = (view * vec4f(centre, 1.0)).xy;
|
|
135
|
+
let reach = abs(view[0].xy) * half_extent.x + abs(view[1].xy) * half_extent.y + abs(view[2].xy) * half_extent.z;
|
|
136
|
+
|
|
137
|
+
let size = vsm_page_world_size(record, held.level);
|
|
138
|
+
let border = size * f32(record.border) / f32(record.page_size);
|
|
139
|
+
|
|
140
|
+
let slot_min = vec2f(f32(held.x), f32(held.y)) * size - border;
|
|
141
|
+
let slot_max = vec2f(f32(held.x + 1), f32(held.y + 1)) * size + border;
|
|
142
|
+
|
|
143
|
+
hit = all(centre_ls + reach >= slot_min) && all(centre_ls - reach <= slot_max);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (hit) {
|
|
147
|
+
atomicStore(&stale_flags[slot], 1u);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
`, [
|
|
151
|
+
RECORD_TABLE.chunk_read,
|
|
152
|
+
SLOT_TABLE.chunk_read,
|
|
153
|
+
chunk_vsm_addressing,
|
|
154
|
+
]),
|
|
155
|
+
resources: stale_resources,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @type {WebGPUStruct}
|
|
160
|
+
*/
|
|
161
|
+
export const VSM_STALE_COMPACT_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
162
|
+
slot_count: u32,
|
|
163
|
+
request_capacity: u32,
|
|
164
|
+
}, "VSMStaleCompactSettings");
|
|
165
|
+
|
|
166
|
+
const compact_resources = new ShaderResourceSetDescriptor();
|
|
167
|
+
|
|
168
|
+
compact_resources.setImmediate('settings', VSM_STALE_COMPACT_SETTINGS_STRUCT);
|
|
169
|
+
|
|
170
|
+
compact_resources.createGroup()
|
|
171
|
+
.addStorageBuffer('movers', VSM_MOVERS_READ_STRUCT, false)
|
|
172
|
+
.addStorageBuffer('stale_flags', WebGPUArray.from(atomic_u32), true)
|
|
173
|
+
.addStorageBuffer('feedback', WebGPUArray.from(atomic_u32), true);
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* List the slots flagged stale into the feedback buffer, clearing their flags, and copy the frame's
|
|
177
|
+
* mover count into its header. Runs on the frames a readback is taken, after {@link shader_vsm_stale}.
|
|
178
|
+
*
|
|
179
|
+
* One thread per slot.
|
|
180
|
+
*
|
|
181
|
+
* @type {ComputeShader}
|
|
182
|
+
*/
|
|
183
|
+
export const shader_vsm_stale_compact = ComputeShader.from({
|
|
184
|
+
label: "VSM/StaleCompact",
|
|
185
|
+
body: CodeChunk.from(
|
|
186
|
+
//language=WGSL
|
|
187
|
+
`
|
|
188
|
+
@compute @workgroup_size(64, 1, 1)
|
|
189
|
+
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
|
|
190
|
+
let slot = global_id.x;
|
|
191
|
+
|
|
192
|
+
if (slot == 0u) {
|
|
193
|
+
atomicStore(&feedback[${L.MOVER_COUNT}u], movers.count);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (slot >= settings.slot_count) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (atomicExchange(&stale_flags[slot], 0u) == 0u) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
let index = atomicAdd(&feedback[${L.STALE_COUNT}u], 1u);
|
|
205
|
+
let stale_offset = ${L.HEADER_WORDS}u + settings.request_capacity * ${L.REQUEST_WORDS}u;
|
|
206
|
+
|
|
207
|
+
atomicStore(&feedback[stale_offset + index], slot);
|
|
208
|
+
}
|
|
209
|
+
`),
|
|
210
|
+
resources: compact_resources,
|
|
211
|
+
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
*
|
|
3
3
|
* @param {BinaryDataType} type
|
|
4
4
|
* @param {ArrayBuffer} buffer
|
|
5
|
-
* @
|
|
5
|
+
* @returns {Uint8Array|Float32Array}
|
|
6
6
|
*/
|
|
7
7
|
export function decode_typed_gpu_data(type: BinaryDataType, buffer: ArrayBuffer): Uint8Array | Float32Array;
|
|
8
8
|
import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decode_typed_gpu_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/decode_typed_gpu_data.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decode_typed_gpu_data.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/decode_typed_gpu_data.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,4CAJW,cAAc,UACd,WAAW,GACT,UAAU,GAAC,YAAY,CAgBnC;+BAtB8B,gDAAgD"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { half_to_float_uint16 } from "../../../../core/binary/half_to_float_uint16.js";
|
|
2
1
|
import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
*
|
|
6
5
|
* @param {BinaryDataType} type
|
|
7
6
|
* @param {ArrayBuffer} buffer
|
|
8
|
-
* @
|
|
7
|
+
* @returns {Uint8Array|Float32Array}
|
|
9
8
|
*/
|
|
10
9
|
export function decode_typed_gpu_data(type, buffer) {
|
|
11
10
|
|
|
@@ -13,16 +12,7 @@ export function decode_typed_gpu_data(type, buffer) {
|
|
|
13
12
|
return new Float32Array(buffer).slice();
|
|
14
13
|
} else if (type === BinaryDataType.Float16) {
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const length = u16.length;
|
|
19
|
-
const result = new Float32Array(length);
|
|
20
|
-
|
|
21
|
-
for (let i = 0; i < length; i++) {
|
|
22
|
-
result[i] = half_to_float_uint16(u16[i])
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return result;
|
|
15
|
+
return new Float32Array(new Float16Array(buffer));
|
|
26
16
|
|
|
27
17
|
} else if (type === BinaryDataType.Uint8) {
|
|
28
18
|
return new Uint8Array(buffer).slice();
|
|
@@ -30,4 +20,4 @@ export function decode_typed_gpu_data(type, buffer) {
|
|
|
30
20
|
throw new Error(`Unsupported type '${type}'`);
|
|
31
21
|
}
|
|
32
22
|
|
|
33
|
-
}
|
|
23
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer_format_from_parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/infer_format_from_parameters.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,4DANW,MAAM,aACN,cAAc,cACd,OAAO,eACP,UAAU,
|
|
1
|
+
{"version":3,"file":"infer_format_from_parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/texture/format/infer_format_from_parameters.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,4DANW,MAAM,aACN,cAAc,cACd,OAAO,eACP,UAAU,oBA4EpB;+BApF8B,gDAAgD;2BAEpD,kBAAkB"}
|
|
@@ -45,9 +45,8 @@ export function infer_format_from_parameters(
|
|
|
45
45
|
} else if (data_type === BinaryDataType.Float32) {
|
|
46
46
|
ending = "float";
|
|
47
47
|
} else if (data_type === BinaryDataType.Float16 || data_type === BinaryDataType.Uint16) {
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
// Float16 or Uint16 depending on the runtime — both map to the 16-bit float format.
|
|
48
|
+
// Native Float16Array data and legacy Uint16Array-packed half-float samplers
|
|
49
|
+
// both carry binary16 bytes for the GPU.
|
|
51
50
|
ending = "float";
|
|
52
51
|
} else {
|
|
53
52
|
throw new Error(`Unsupported data type '${data_type}'`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texture_write_to_gpu.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/texture/texture_write_to_gpu.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"texture_write_to_gpu.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/texture/texture_write_to_gpu.js"],"names":[],"mappings":"AAsKA;;;;;;;;;;;;GAYG;AACH,2GAFW,MAAM,QAwGhB"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { half_to_float_uint16 } from "../../../core/binary/half_to_float_uint16.js";
|
|
3
|
-
import { to_half_float_uint16 } from "../../../core/binary/to_half_float_uint16.js";
|
|
4
2
|
import { BinaryDataType } from "../../../core/binary/type/BinaryDataType.js";
|
|
5
3
|
import { dataTypeByteSize } from "../../../core/binary/type/DataTypeByteSizes.js";
|
|
6
4
|
import { array_copy } from "../../../core/collection/array/array_copy.js";
|
|
@@ -23,9 +21,8 @@ function channel_one_bytes(data_type) {
|
|
|
23
21
|
return new Uint8Array([0x7F]);
|
|
24
22
|
case BinaryDataType.Uint16:
|
|
25
23
|
case BinaryDataType.Float16:
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
return new Uint8Array(new Uint16Array([0x3C00]).buffer);
|
|
24
|
+
// Includes legacy samplers that store packed binary16 in Uint16Array.
|
|
25
|
+
return new Uint8Array(new Float16Array([1]).buffer);
|
|
29
26
|
case BinaryDataType.Int16:
|
|
30
27
|
return new Uint8Array(new Int16Array([0x7FFF]).buffer);
|
|
31
28
|
case BinaryDataType.Float32:
|
|
@@ -59,13 +56,11 @@ function premultiply_rgba_in_place(data, data_type) {
|
|
|
59
56
|
v[i + 2] *= a;
|
|
60
57
|
}
|
|
61
58
|
} else if (data_type === BinaryDataType.Float16 || data_type === BinaryDataType.Uint16) {
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
// patterns would destroy the texels; decode/encode through half-float instead.
|
|
66
|
-
const v = new Uint16Array(data);
|
|
59
|
+
// Float16Array reads and writes numeric values over the same binary16 bytes,
|
|
60
|
+
// including payloads from legacy Uint16Array-backed half-float samplers.
|
|
61
|
+
const v = new Float16Array(data);
|
|
67
62
|
for (let i = 0; i < v.length; i += 4) {
|
|
68
|
-
const a =
|
|
63
|
+
const a = v[i + 3];
|
|
69
64
|
|
|
70
65
|
if (a === 1) {
|
|
71
66
|
// overwhelmingly common (HDR sources write alpha = 1): identity, and
|
|
@@ -73,9 +68,11 @@ function premultiply_rgba_in_place(data, data_type) {
|
|
|
73
68
|
continue;
|
|
74
69
|
}
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
for (let c = 0; c < 3; c++) {
|
|
72
|
+
const value = v[i + c] * a;
|
|
73
|
+
// Retain saturation of finite overflow; preserve NaN and infinities.
|
|
74
|
+
v[i + c] = Number.isFinite(value) ? Math.min(Math.max(value, -65504), 65504) : value;
|
|
75
|
+
}
|
|
79
76
|
}
|
|
80
77
|
} else {
|
|
81
78
|
throw new Error(`Unsupported data type for premultiplication: ${data_type}`);
|
|
@@ -244,10 +241,13 @@ export function texture_write_to_gpu(
|
|
|
244
241
|
if (source.isSampler2D) {
|
|
245
242
|
|
|
246
243
|
const source_data = source.data;
|
|
244
|
+
const source_buffer = source_data.byteOffset === 0 && source_data.byteLength === source_data.buffer.byteLength
|
|
245
|
+
? source_data.buffer
|
|
246
|
+
: source_data.buffer.slice(source_data.byteOffset, source_data.byteOffset + source_data.byteLength);
|
|
247
247
|
|
|
248
248
|
texture_write_raw(
|
|
249
249
|
image,
|
|
250
|
-
|
|
250
|
+
source_buffer,
|
|
251
251
|
queue,
|
|
252
252
|
texture,
|
|
253
253
|
premultiplyAlpha,
|
|
@@ -279,4 +279,4 @@ export function texture_write_to_gpu(
|
|
|
279
279
|
);
|
|
280
280
|
|
|
281
281
|
}
|
|
282
|
-
}
|
|
282
|
+
}
|