@woosh/meep-engine 3.64.0 → 3.65.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/CHANGELOG.md +85 -0
- package/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BinaryBuffer.d.ts +5 -0
- package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/BinaryBuffer.js +39 -5
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +65 -6
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +451 -101
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +4 -2
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +4 -2
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts +8 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +45 -10
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +237 -119
- package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts +143 -0
- package/src/engine/graphics/ecs/grass/GrassSpecies.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GrassSpecies.js +189 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.d.ts +25 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GrassSurface.js +32 -0
- package/src/engine/graphics/ecs/grass/GroundCover.d.ts +68 -0
- package/src/engine/graphics/ecs/grass/GroundCover.d.ts.map +1 -0
- package/src/engine/graphics/ecs/grass/GroundCover.js +85 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.d.ts +27 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.d.ts.map +1 -0
- package/src/engine/graphics/texture/sampler/exr_to_sampler2d.js +91 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.d.ts +23 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.d.ts.map +1 -0
- package/src/engine/graphics/texture/sampler/sampler2d_to_exr.js +64 -0
- package/src/engine/graphics3/GrassSurfaceSystem.d.ts +153 -0
- package/src/engine/graphics3/GrassSurfaceSystem.d.ts.map +1 -0
- package/src/engine/graphics3/GrassSurfaceSystem.js +1076 -0
- package/src/engine/graphics3/GroundCoverSystem.d.ts +33 -0
- package/src/engine/graphics3/GroundCoverSystem.d.ts.map +1 -0
- package/src/engine/graphics3/GroundCoverSystem.js +58 -0
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +372 -110
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +6 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +9 -2
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +325 -140
- package/src/engine/network/sim/SimActionExecutor.d.ts +4 -1
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +65 -9
- package/src/engine/network/state/PredictionHistory.d.ts.map +1 -1
- package/src/engine/network/state/PredictionHistory.js +6 -1
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts +25 -14
- package/src/engine/network/time/AdaptiveRenderDelay.d.ts.map +1 -1
- package/src/engine/network/time/AdaptiveRenderDelay.js +38 -20
- package/src/engine/network/time/RenderPlayout.d.ts +23 -3
- package/src/engine/network/time/RenderPlayout.d.ts.map +1 -1
- package/src/engine/network/time/RenderPlayout.js +40 -4
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts +5 -1
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/chunk_fluid_obstacle_record.js +27 -1
- package/src/format/image/exr/ExrCompression.d.ts +22 -0
- package/src/format/image/exr/ExrCompression.d.ts.map +1 -0
- package/src/format/image/exr/ExrCompression.js +27 -0
- package/src/format/image/exr/ExrImage.d.ts +32 -0
- package/src/format/image/exr/ExrImage.d.ts.map +1 -0
- package/src/format/image/exr/ExrImage.js +32 -0
- package/src/format/image/exr/ExrPixelType.d.ts +13 -0
- package/src/format/image/exr/ExrPixelType.d.ts.map +1 -0
- package/src/format/image/exr/ExrPixelType.js +18 -0
- package/src/format/image/exr/exr_compare_names.d.ts +16 -0
- package/src/format/image/exr/exr_compare_names.d.ts.map +1 -0
- package/src/format/image/exr/exr_compare_names.js +25 -0
- package/src/format/image/exr/exr_constants.d.ts +49 -0
- package/src/format/image/exr/exr_constants.d.ts.map +1 -0
- package/src/format/image/exr/exr_constants.js +56 -0
- package/src/format/image/exr/exr_read.d.ts +32 -0
- package/src/format/image/exr/exr_read.d.ts.map +1 -0
- package/src/format/image/exr/exr_read.js +531 -0
- package/src/format/image/exr/exr_sample_bits.d.ts +16 -0
- package/src/format/image/exr/exr_sample_bits.d.ts.map +1 -0
- package/src/format/image/exr/exr_sample_bits.js +21 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.d.ts +17 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.d.ts.map +1 -0
- package/src/format/image/exr/exr_scanlines_per_chunk.js +31 -0
- package/src/format/image/exr/exr_write.d.ts +27 -0
- package/src/format/image/exr/exr_write.d.ts.map +1 -0
- package/src/format/image/exr/exr_write.js +378 -0
- package/src/shade/device/shader/ShaderModuleCompiler.d.ts +2 -0
- package/src/shade/device/shader/ShaderModuleCompiler.d.ts.map +1 -1
- package/src/shade/device/shader/ShaderModuleCompiler.js +25 -2
- package/src/shade/playground/grass_surfaces/index.html +75 -0
- package/src/shade/playground/grass_surfaces/main.d.ts +2 -0
- package/src/shade/playground/grass_surfaces/main.d.ts.map +1 -0
- package/src/shade/playground/grass_surfaces/main.js +593 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts +62 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.d.ts.map +1 -0
- package/src/shade/playground/grass_surfaces/read_grass_surfaces.js +188 -0
- package/src/shade/playground/probe_clipmap/index.html +5 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap/main.js +34 -1
- package/src/shade/playground/probe_clipmap_box/README.md +5 -1
- package/src/shade/playground/probe_clipmap_box/index.html +12 -0
- package/src/shade/playground/probe_clipmap_box/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap_box/main.js +15 -0
- package/src/shade/playground/probe_clipmap_box/scene.d.ts +8 -1
- package/src/shade/playground/probe_clipmap_box/scene.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap_box/scene.js +74 -6
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +47 -43
- package/src/shade/renderer/extension/ViewTextures.d.ts +12 -5
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +19 -5
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +3 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +6 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +7 -0
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +10 -0
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +7 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +46 -15
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts +3 -2
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/bundle/ModelCacheBundle.js +3 -2
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts +22 -0
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/bundle/model_cache_bundle_sort_morton.js +247 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +50 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +101 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +12 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +35 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_clipmap.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/debug/graph_probe_clipmap_debug_brick_material.js +6 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/GPUBrickMaterial.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts +6 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/chunk_brick_material.js +15 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/material/shader_brick_material_gather.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +19 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +128 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +19 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +27 -15
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts +19 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/ProbeClipmapScreenWants.js +35 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +18 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_box_cages.js +174 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.d.ts +4 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_hit_material.js +10 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts +31 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_parallax.js +54 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +8 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +10 -21
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +7 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +33 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/graph_probe_clipmap_want_meshlets.js +138 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +7 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +28 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +13 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +18 -11
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +18 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +44 -48
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +2 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +5 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +15 -30
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +4 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +11 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js +29 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_late.js +126 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_meshlets.js +221 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts +40 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/age_eviction/chunk_age_eviction.js +86 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts +135 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/GPUGrassBlades.js +676 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts +145 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/GRASS_BLADE.js +179 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts +63 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade.js +244 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts +58 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/chunk_grass_blade_wind.js +174 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts +25 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_id_draw.js +133 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts +80 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_mechanics.js +92 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts +29 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/grass_blade_resolve.js +175 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts +14 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_draw_args.js +45 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts +61 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_blade_expand.js +340 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts +46 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.d.ts.map +1 -0
- package/src/shade/renderer/grass/blade/shader_grass_cell_count.js +280 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.d.ts +60 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.d.ts.map +1 -0
- package/src/shade/renderer/grass/population/chunk_grass_population.js +171 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.d.ts +99 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/GPUGrassPress.js +436 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts +179 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/GRASS_PRESS.js +217 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.d.ts +65 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/chunk_grass_press.js +296 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +31 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/shader_grass_press_mark.js +169 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts +27 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.d.ts.map +1 -0
- package/src/shade/renderer/grass/press/shader_grass_press_stamp.js +183 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts +193 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GPUGrassSurfaces.js +1253 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts +211 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE.js +241 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts +82 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/GRASS_SURFACE_VIEW.js +111 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts +39 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_column_cross.js +85 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts +29 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_directory.js +112 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts +27 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_slot.js +50 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts +21 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_frame.js +41 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts +32 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surface_window.js +136 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts +37 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_surfel.js +85 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts +25 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/chunk_grass_tile.js +52 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts +23 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_directory_fill.js +87 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts +43 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake.js +265 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts +13 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_bake_command.js +49 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts +62 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_invalidate.js +162 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts +40 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_retire.js +155 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts +19 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_schedule.js +58 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts +30 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_want.js +251 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts +21 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.d.ts.map +1 -0
- package/src/shade/renderer/grass/surface/shader_grass_surface_window_count.js +75 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.js +4 -23
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts +12 -0
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/velocity/view_velocity_matrices.js +29 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +22 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +3 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts +27 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/scene/GRASS_SURFACE_PARAMS_STRUCT.js +38 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts +28 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/scene/MESH_GROUND_COVER_STRUCT.js +58 -0
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +8 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +8 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +21 -3
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts +37 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_ray_query_nearest_among.js +148 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/sdf/chunk_shape_record_line_span.js +169 -0
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts +18 -0
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.d.ts.map +1 -1
- package/src/shade/renderer/texture/atlas/chunk_tile_atlas_slot_origin.js +28 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts +13 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/tile_atlas_slot_shift.js +22 -0
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +4 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +52 -5
- package/src/shade/renderer/wind/GPUSceneWind.d.ts.map +1 -1
- package/src/shade/renderer/wind/GPUSceneWind.js +164 -8
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts +3 -1
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.d.ts.map +1 -1
- package/src/shade/renderer/wind/WIND_FIELD_UNIFORM.js +3 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts +2 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.d.ts.map +1 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_cascades.js +18 -13
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts +13 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.d.ts.map +1 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_previous.js +23 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts +1 -0
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.d.ts.map +1 -1
- package/src/shade/renderer/wind/chunk_wind_field_sample_uniform.js +6 -1
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts +11 -0
- package/src/shade/renderer/wind/wind_field_add_resources.d.ts.map +1 -1
- package/src/shade/renderer/wind/wind_field_add_resources.js +15 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +2 -0
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts
CHANGED
|
@@ -4,13 +4,17 @@
|
|
|
4
4
|
export const PROBE_DUE_SETTINGS: WebGPUStruct;
|
|
5
5
|
/**
|
|
6
6
|
* Due (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.5): a thread an entry of the frame's active list,
|
|
7
|
-
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due
|
|
8
|
-
*
|
|
9
|
-
* - it is
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
7
|
+
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due:
|
|
8
|
+
* - in the first pass, which lists them first, when it is NEW: it has had no update;
|
|
9
|
+
* - in the second pass, when it is ALIVE or DEAD and `(frame + h(slot)) mod P` is 0, where P is
|
|
10
|
+
* - T when a want waits on it: a pixel or a hit wanted it since its last update, its wanted time past
|
|
11
|
+
* its traced time;
|
|
12
|
+
* - T · `idle_periods` when it is idle, none waiting on it. Every live probe keeps being updated, so one
|
|
13
|
+
* that readers reach without wanting it, the bounce at a hit among them, and one a want comes back to,
|
|
14
|
+
* holds light no older than that. Its update is any other probe's.
|
|
15
|
+
*
|
|
16
|
+
* A DEAD probe is due like an ALIVE one, its update casting `PROBE_DEAD_RAYS`, so that a probe inside a
|
|
17
|
+
* solid notices when the scene changes (Enshrouded's dead probes trace 16 a frame).
|
|
14
18
|
*
|
|
15
19
|
* Wanted since its last update, not this frame: a hit wants a probe the frame after its own probe's
|
|
16
20
|
* update, so a probe that only hits keep is wanted on few of its turns. Measured on Sponza with the
|
|
@@ -19,8 +23,8 @@ export const PROBE_DUE_SETTINGS: WebGPUStruct;
|
|
|
19
23
|
* waits on nothing: the update comes after admit in its frame, so its traced time is the want's or later.
|
|
20
24
|
*
|
|
21
25
|
* The due go on the trace list, which holds the frame's updates, at most U: past it the count still
|
|
22
|
-
* rises and nothing is written, and a probe not listed waits its next turn.
|
|
23
|
-
*
|
|
26
|
+
* rises and nothing is written, and a probe not listed waits its next turn. Schedule's T keeps the
|
|
27
|
+
* expected count a frame under U, so only NEW probes past U, a camera cut, wait.
|
|
24
28
|
*
|
|
25
29
|
* @type {ComputeShader}
|
|
26
30
|
*/
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_due.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js"],"names":[],"mappings":"AAkBA;;GAEG;AACH,iCAFU,YAAY,
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_due.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js"],"names":[],"mappings":"AAkBA;;GAEG;AACH,iCAFU,YAAY,CAaC;AAavB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,uCAFU,aAAa,CA6CpB;6BA3G0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js
CHANGED
|
@@ -28,6 +28,8 @@ export const PROBE_DUE_SETTINGS = WebGPUStruct.from({
|
|
|
28
28
|
frame: u32,
|
|
29
29
|
/** 1 for the pass that lists the NEW probes, 0 for the one that lists the rest */
|
|
30
30
|
new_only: u32,
|
|
31
|
+
/** periods between an idle probe's turns, `probe_clipmap_idle_periods`, at least 1 */
|
|
32
|
+
idle_periods: u32,
|
|
31
33
|
}, "ProbeDueSettings");
|
|
32
34
|
|
|
33
35
|
const resources = new ShaderResourceSetDescriptor();
|
|
@@ -43,13 +45,17 @@ resources.createGroup()
|
|
|
43
45
|
|
|
44
46
|
/**
|
|
45
47
|
* Due (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.5): a thread an entry of the frame's active list,
|
|
46
|
-
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due
|
|
47
|
-
*
|
|
48
|
-
* - it is
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
48
|
+
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due:
|
|
49
|
+
* - in the first pass, which lists them first, when it is NEW: it has had no update;
|
|
50
|
+
* - in the second pass, when it is ALIVE or DEAD and `(frame + h(slot)) mod P` is 0, where P is
|
|
51
|
+
* - T when a want waits on it: a pixel or a hit wanted it since its last update, its wanted time past
|
|
52
|
+
* its traced time;
|
|
53
|
+
* - T · `idle_periods` when it is idle, none waiting on it. Every live probe keeps being updated, so one
|
|
54
|
+
* that readers reach without wanting it, the bounce at a hit among them, and one a want comes back to,
|
|
55
|
+
* holds light no older than that. Its update is any other probe's.
|
|
56
|
+
*
|
|
57
|
+
* A DEAD probe is due like an ALIVE one, its update casting `PROBE_DEAD_RAYS`, so that a probe inside a
|
|
58
|
+
* solid notices when the scene changes (Enshrouded's dead probes trace 16 a frame).
|
|
53
59
|
*
|
|
54
60
|
* Wanted since its last update, not this frame: a hit wants a probe the frame after its own probe's
|
|
55
61
|
* update, so a probe that only hits keep is wanted on few of its turns. Measured on Sponza with the
|
|
@@ -58,8 +64,8 @@ resources.createGroup()
|
|
|
58
64
|
* waits on nothing: the update comes after admit in its frame, so its traced time is the want's or later.
|
|
59
65
|
*
|
|
60
66
|
* The due go on the trace list, which holds the frame's updates, at most U: past it the count still
|
|
61
|
-
* rises and nothing is written, and a probe not listed waits its next turn.
|
|
62
|
-
*
|
|
67
|
+
* rises and nothing is written, and a probe not listed waits its next turn. Schedule's T keeps the
|
|
68
|
+
* expected count a frame under U, so only NEW probes past U, a camera cut, wait.
|
|
63
69
|
*
|
|
64
70
|
* @type {ComputeShader}
|
|
65
71
|
*/
|
|
@@ -87,13 +93,14 @@ fn main(
|
|
|
87
93
|
// wanted since its last update
|
|
88
94
|
let waiting = probe_records[slot].wanted_frame > probe_records[slot].traced_frame;
|
|
89
95
|
|
|
90
|
-
|
|
96
|
+
// an idle probe's turn comes once in as many periods as the settings give
|
|
97
|
+
let period = max(probe_counters[PROBE_COUNTER_PERIOD], 1u) * select(max(settings.idle_periods, 1u), 1u, waiting);
|
|
91
98
|
let turn = settings.frame + hash_lowbias32(slot);
|
|
92
99
|
|
|
93
100
|
if (settings.new_only != 0u) {
|
|
94
101
|
due = kind == PROBE_STATE_NEW;
|
|
95
102
|
} else {
|
|
96
|
-
due =
|
|
103
|
+
due = (kind == PROBE_STATE_ALIVE || kind == PROBE_STATE_DEAD) && turn % period == 0u;
|
|
97
104
|
}
|
|
98
105
|
}
|
|
99
106
|
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js
CHANGED
|
@@ -204,7 +204,7 @@ fn probe_clipmap_local_irradiance(cascade: u32, position: vec3<f32>, normal: vec
|
|
|
204
204
|
return estimate;
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
let shadow = brick_clipmap_trace(lifted, to_light / span, 0.0, reach, settings.brick_cascade_count);
|
|
207
|
+
let shadow = brick_clipmap_trace(lifted, to_light / span, 0.0, reach, settings.brick_cascade_count, settings.brick_atlas_shift);
|
|
208
208
|
|
|
209
209
|
return select(vec3<f32>(0.0), estimate, shadow.kind == BRICK_TRACE_MISS);
|
|
210
210
|
}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts
CHANGED
|
@@ -6,9 +6,10 @@ export const PROBE_PROJECT_SETTINGS: WebGPUStruct;
|
|
|
6
6
|
* Projection, rows (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.8): a thread a row of each listed probe's
|
|
7
7
|
* radiance map, dispatched through `PROBE_DISPATCH_ROWS`. It sums the row's texels, new and kept, as
|
|
8
8
|
* RGB radiance SH3, `L·Y(ω)·dω` over each texel's solid angle, so that `sh3_color_get_irradiance_at` gives
|
|
9
|
-
* E; the row's rays this update, resolved and back faces; and
|
|
10
|
-
*
|
|
11
|
-
* the probe's
|
|
9
|
+
* E; the row's rays this update, resolved and back faces; and the row's part of L0 as the texels'
|
|
10
|
+
* estimators hold it, each texel by its solid angle: their short means less their means, their deviations
|
|
11
|
+
* squared (by the solid angle squared) and their short means, luminance. One row of the probe's projection
|
|
12
|
+
* each, which the probe's pass sums.
|
|
12
13
|
*
|
|
13
14
|
* @type {ComputeShader}
|
|
14
15
|
*/
|
|
@@ -25,21 +26,20 @@ export const shader_probe_clipmap_project_rows: ComputeShader;
|
|
|
25
26
|
* radiance is nothing, so their share would read a probe inside a solid as alive. Such an update keeps
|
|
26
27
|
* the probe's kind and its back-face share.
|
|
27
28
|
*
|
|
28
|
-
* **The probe's
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* - Otherwise half what it asked for last, down to the fewest: a converged probe sips.
|
|
29
|
+
* **The probe's L0 estimator** (§8.6, §8.8): a multi-scale mean estimator (`chunk_multiscale_mean`) over the
|
|
30
|
+
* probe's whole light, L0, the solid-angle-weighted sum of its radiance texels. Its short and long means are
|
|
31
|
+
* L0 of the texels' short and long means, and its deviation the root of their deviations' sum, each by its
|
|
32
|
+
* solid angle squared, as the rows sum them; its inconsistency and blend reduction are the probe's own, in
|
|
33
|
+
* `probe_requests`. Its catch-up, the published estimator's, decides what the probe's next update takes:
|
|
34
|
+
* - **Blend**: every texel's long mean blends by at least the catch-up (`shader_probe_clipmap_accumulate`).
|
|
35
|
+
* A one-ray texel's own test sees no change under its own noise; L0 pools every texel's evidence, so a
|
|
36
|
+
* change in the probe's whole light, brighter or darker, is found where no texel can find it.
|
|
37
|
+
* - **Rays**: the next guided update asks for half what the last asked for, raised toward the most by the
|
|
38
|
+
* catch-up, and never under the fewest: a probe whose light moved asks for more, a steady one sips.
|
|
39
|
+
* - After a probe's first update the most rays, a blend of nothing and the estimator seeded as a texel's is,
|
|
40
|
+
* an inconsistency of one and no blend reduction: its slot's last owner's state is not its own.
|
|
41
|
+
* - An update whose texels hold no spread, L0's deviation nothing, leaves the estimator as it was and halves
|
|
42
|
+
* the rays.
|
|
43
43
|
*
|
|
44
44
|
* @type {ComputeShader}
|
|
45
45
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_project.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_project.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js"],"names":[],"mappings":"AAgCA;;GAEG;AACH,qCAFU,YAAY,CAmBK;AAW3B;;;;;;;;;;GAUG;AACH,gDAFU,aAAa,CAyDpB;AAcH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2CAFU,aAAa,CA0FpB;6BArP0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { chunk_rgb_to_luminance } from "../../../shader/chunk/color/chunk_rgb_to_luminance.js";
|
|
2
|
+
import { chunk_multiscale_mean } from "../../../shader/chunk/filter/chunk_multiscale_mean.js";
|
|
1
3
|
import {
|
|
2
4
|
chunk_octahedral_solid_angle
|
|
3
5
|
} from "../../../shader/chunk/geometry/octahedron/chunk_octahedral_solid_angle.js";
|
|
@@ -26,12 +28,7 @@ import {
|
|
|
26
28
|
PROBE_STATES_STORE_RESOURCE,
|
|
27
29
|
PROBE_TRACE_READ_RESOURCE
|
|
28
30
|
} from "./chunk_probe_clipmap.js";
|
|
29
|
-
import {
|
|
30
|
-
PROBE_CHANGE_SIGNIFICANCE,
|
|
31
|
-
PROBE_RADIANCE_SAMPLES_LIMIT,
|
|
32
|
-
PROBE_THREAD_WORKGROUP_SIZE,
|
|
33
|
-
PROBE_VARIANCE_BLEND
|
|
34
|
-
} from "./PROBE_CLIPMAP.js";
|
|
31
|
+
import { PROBE_SHORT_BLEND, PROBE_THREAD_WORKGROUP_SIZE } from "./PROBE_CLIPMAP.js";
|
|
35
32
|
|
|
36
33
|
/**
|
|
37
34
|
* @type {WebGPUStruct}
|
|
@@ -68,9 +65,10 @@ row_resources.createGroup()
|
|
|
68
65
|
* Projection, rows (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.8): a thread a row of each listed probe's
|
|
69
66
|
* radiance map, dispatched through `PROBE_DISPATCH_ROWS`. It sums the row's texels, new and kept, as
|
|
70
67
|
* RGB radiance SH3, `L·Y(ω)·dω` over each texel's solid angle, so that `sh3_color_get_irradiance_at` gives
|
|
71
|
-
* E; the row's rays this update, resolved and back faces; and
|
|
72
|
-
*
|
|
73
|
-
* the probe's
|
|
68
|
+
* E; the row's rays this update, resolved and back faces; and the row's part of L0 as the texels'
|
|
69
|
+
* estimators hold it, each texel by its solid angle: their short means less their means, their deviations
|
|
70
|
+
* squared (by the solid angle squared) and their short means, luminance. One row of the probe's projection
|
|
71
|
+
* each, which the probe's pass sums.
|
|
74
72
|
*
|
|
75
73
|
* @type {ComputeShader}
|
|
76
74
|
*/
|
|
@@ -106,13 +104,15 @@ fn main(
|
|
|
106
104
|
let uv = (vec2<f32>(f32(x), f32(row)) + 0.5) * inverse;
|
|
107
105
|
let solid_angle = octahedral_solid_angle(uv, inverse);
|
|
108
106
|
let rays = probe_maps[maps + 2u * texels + i];
|
|
109
|
-
|
|
107
|
+
// the texel's estimator: its short mean less its mean, and its deviation, luminance
|
|
108
|
+
let state = unpack2x16float(probe_maps[maps + 3u * texels + settings.depth_resolution * settings.depth_resolution + i]);
|
|
110
109
|
|
|
111
110
|
sh3_color_accumulate(&row_sum.sh, light * solid_angle, sh3_basis_at(uv_octahedral_unit_decode(uv)));
|
|
112
111
|
row_sum.resolved += rays & 0xFFFFu;
|
|
113
112
|
row_sum.back_faces += rays >> 16u;
|
|
114
|
-
row_sum.
|
|
115
|
-
row_sum.
|
|
113
|
+
row_sum.gap += state.x * solid_angle;
|
|
114
|
+
row_sum.variance += state.y * state.y * solid_angle * solid_angle;
|
|
115
|
+
row_sum.level += (rgb_to_luminance(light) + state.x) * solid_angle;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
probe_projection[thread] = row_sum;
|
|
@@ -124,6 +124,7 @@ fn main(
|
|
|
124
124
|
chunk_uv_octahedral_unit_decode,
|
|
125
125
|
chunk_sh3_basis_at,
|
|
126
126
|
chunk_sh3_color_accumulate,
|
|
127
|
+
chunk_rgb_to_luminance,
|
|
127
128
|
PROBE_PROJECTION_ROW_STRUCT.declaration_chunk,
|
|
128
129
|
]),
|
|
129
130
|
});
|
|
@@ -152,21 +153,20 @@ probe_resources.createGroup()
|
|
|
152
153
|
* radiance is nothing, so their share would read a probe inside a solid as alive. Such an update keeps
|
|
153
154
|
* the probe's kind and its back-face share.
|
|
154
155
|
*
|
|
155
|
-
* **The probe's
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* - Otherwise half what it asked for last, down to the fewest: a converged probe sips.
|
|
156
|
+
* **The probe's L0 estimator** (§8.6, §8.8): a multi-scale mean estimator (`chunk_multiscale_mean`) over the
|
|
157
|
+
* probe's whole light, L0, the solid-angle-weighted sum of its radiance texels. Its short and long means are
|
|
158
|
+
* L0 of the texels' short and long means, and its deviation the root of their deviations' sum, each by its
|
|
159
|
+
* solid angle squared, as the rows sum them; its inconsistency and blend reduction are the probe's own, in
|
|
160
|
+
* `probe_requests`. Its catch-up, the published estimator's, decides what the probe's next update takes:
|
|
161
|
+
* - **Blend**: every texel's long mean blends by at least the catch-up (`shader_probe_clipmap_accumulate`).
|
|
162
|
+
* A one-ray texel's own test sees no change under its own noise; L0 pools every texel's evidence, so a
|
|
163
|
+
* change in the probe's whole light, brighter or darker, is found where no texel can find it.
|
|
164
|
+
* - **Rays**: the next guided update asks for half what the last asked for, raised toward the most by the
|
|
165
|
+
* catch-up, and never under the fewest: a probe whose light moved asks for more, a steady one sips.
|
|
166
|
+
* - After a probe's first update the most rays, a blend of nothing and the estimator seeded as a texel's is,
|
|
167
|
+
* an inconsistency of one and no blend reduction: its slot's last owner's state is not its own.
|
|
168
|
+
* - An update whose texels hold no spread, L0's deviation nothing, leaves the estimator as it was and halves
|
|
169
|
+
* the rays.
|
|
170
170
|
*
|
|
171
171
|
* @type {ComputeShader}
|
|
172
172
|
*/
|
|
@@ -201,8 +201,9 @@ fn main(
|
|
|
201
201
|
|
|
202
202
|
sum.resolved += part.resolved;
|
|
203
203
|
sum.back_faces += part.back_faces;
|
|
204
|
-
sum.
|
|
205
|
-
sum.
|
|
204
|
+
sum.gap += part.gap;
|
|
205
|
+
sum.variance += part.variance;
|
|
206
|
+
sum.level += part.level;
|
|
206
207
|
}
|
|
207
208
|
|
|
208
209
|
let state = probe_states[slot].x;
|
|
@@ -227,28 +228,22 @@ fn main(
|
|
|
227
228
|
probe_records[slot].sh = probe_record_sh_encode(sum.sh);
|
|
228
229
|
probe_records[slot].traced_frame = settings.frame;
|
|
229
230
|
|
|
230
|
-
// the
|
|
231
|
+
// the L0 estimator: the next update's blend and rays
|
|
231
232
|
var request = probe_requests[slot];
|
|
232
233
|
|
|
233
234
|
if (updates == 0u) {
|
|
234
|
-
// its slot's last owner's
|
|
235
|
-
request = ${PROBE_REQUEST_STRUCT.make({ rays: "settings.rays_max",
|
|
236
|
-
} else if (sum.
|
|
237
|
-
let
|
|
238
|
-
let
|
|
239
|
-
let
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
let mean = mix(request.change_mean, held, blend);
|
|
247
|
-
|
|
248
|
-
request.change_variance = mix(request.change_variance, (held - request.change_mean) * (held - mean), blend);
|
|
249
|
-
request.change_mean = mean;
|
|
250
|
-
request.changes = min(request.changes + 1u, ${PROBE_RADIANCE_SAMPLES_LIMIT}u);
|
|
251
|
-
request.rays = select(max(settings.rays_min, request.rays >> 1u), settings.rays_max, moved);
|
|
235
|
+
// seeded: its slot's last owner's state is not its own
|
|
236
|
+
request = ${PROBE_REQUEST_STRUCT.make({ rays: "settings.rays_max", blend: "0.0", inconsistency: "1.0", reduction: "0.0" })};
|
|
237
|
+
} else if (sum.variance > 0.0) {
|
|
238
|
+
let deviation = sqrt(sum.variance);
|
|
239
|
+
let relative = abs(sum.gap) / deviation;
|
|
240
|
+
let inconsistency = mix(request.inconsistency, relative, ${PROBE_SHORT_BLEND});
|
|
241
|
+
let blend = saturate(multiscale_mean_catch_up(relative, inconsistency, request.reduction));
|
|
242
|
+
|
|
243
|
+
request.reduction = mix(request.reduction, multiscale_mean_blend_reduction(sum.level / deviation), MULTISCALE_MEAN_REDUCTION_BLEND);
|
|
244
|
+
request.inconsistency = inconsistency;
|
|
245
|
+
request.blend = blend;
|
|
246
|
+
request.rays = max(settings.rays_min, u32(round(mix(f32(request.rays >> 1u), f32(settings.rays_max), blend))));
|
|
252
247
|
} else {
|
|
253
248
|
request.rays = max(settings.rays_min, request.rays >> 1u);
|
|
254
249
|
}
|
|
@@ -259,6 +254,7 @@ fn main(
|
|
|
259
254
|
chunk_probe_clipmap,
|
|
260
255
|
chunk_probe_clipmap_guide,
|
|
261
256
|
chunk_folded_workgroup_index,
|
|
257
|
+
chunk_multiscale_mean,
|
|
262
258
|
PROBE_PROJECTION_ROW_STRUCT.declaration_chunk,
|
|
263
259
|
PROBE_REQUEST_STRUCT.declaration_chunk,
|
|
264
260
|
]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_relocate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH,sCAFU,YAAY,
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_relocate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH,sCAFU,YAAY,CASM;AAkB5B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,4CAFU,aAAa,CAyDpB;6BA3H0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js
CHANGED
|
@@ -31,6 +31,8 @@ export const PROBE_RELOCATE_SETTINGS = WebGPUStruct.from({
|
|
|
31
31
|
trace_capacity: u32,
|
|
32
32
|
/** the brick clipmap's cascades, what its field is read through */
|
|
33
33
|
brick_cascade_count: u32,
|
|
34
|
+
/** the brick atlas's footprint as shifts, `GPUBrickClipmap#atlas_shift` */
|
|
35
|
+
brick_atlas_shift: u32,
|
|
34
36
|
}, "ProbeRelocateSettings");
|
|
35
37
|
|
|
36
38
|
const resources = new ShaderResourceSetDescriptor();
|
|
@@ -97,13 +99,13 @@ fn main(
|
|
|
97
99
|
var position = lattice;
|
|
98
100
|
|
|
99
101
|
for (var step = 0u; step < ${PROBE_RELOCATION_STEPS}u; step++) {
|
|
100
|
-
let distance = brick_clipmap_distance(position, settings.brick_cascade_count);
|
|
102
|
+
let distance = brick_clipmap_distance(position, settings.brick_cascade_count, settings.brick_atlas_shift);
|
|
101
103
|
|
|
102
104
|
if (distance >= clearance) {
|
|
103
105
|
break;
|
|
104
106
|
}
|
|
105
107
|
|
|
106
|
-
let gradient = brick_clipmap_gradient(position, settings.brick_cascade_count);
|
|
108
|
+
let gradient = brick_clipmap_gradient(position, settings.brick_cascade_count, settings.brick_atlas_shift);
|
|
107
109
|
|
|
108
110
|
if (all(gradient == vec3<f32>(0.0))) {
|
|
109
111
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_retire.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH,oCAFU,YAAY,CASI;AAiB1B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,0CAFU,aAAa,
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_retire.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH,oCAFU,YAAY,CASI;AAiB1B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,0CAFU,aAAa,CAqFpB;6BAvJ0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js
CHANGED
|
@@ -120,10 +120,9 @@ fn main(
|
|
|
120
120
|
|
|
121
121
|
// the oldest buckets whole, and as many of the one below them as are asked for; one that left its
|
|
122
122
|
// window goes anyway and takes none of those
|
|
123
|
-
|
|
124
|
-
var evicted = evictable && counted >= whole;
|
|
123
|
+
var evicted = evictable && age_eviction_whole(counted, probe_eviction.buckets);
|
|
125
124
|
|
|
126
|
-
if (held && evictable && counted
|
|
125
|
+
if (held && evictable && age_eviction_partial(counted, probe_eviction.buckets) && probe_eviction.remaining > 0u) {
|
|
127
126
|
evicted = atomicAdd(&probe_counters[PROBE_COUNTER_EVICTED], 1u) < probe_eviction.remaining;
|
|
128
127
|
}
|
|
129
128
|
|
|
@@ -6,9 +6,11 @@ export const PROBE_SCHEDULE_SETTINGS: WebGPUStruct;
|
|
|
6
6
|
* Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §8.5): one thread, after admit, when the frame's
|
|
7
7
|
* active list is whole.
|
|
8
8
|
* - The period: with P_w the probes waiting for an update, the NEW and those wanted since their last
|
|
9
|
-
* update,
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* update, P_i the idle, every other live probe, and m `idle_periods`,
|
|
10
|
+
* `T = max(1, ⌈(P_w + P_i / m) / U⌉)` frames. Every probe a want waits on is updated within a period and
|
|
11
|
+
* every idle one within m of them, a frame's updates U at most on average, and the period follows the
|
|
12
|
+
* live count. Retire and admit counted the waiting in `probe_counters[PROBE_COUNTER_WAITING]`, which it
|
|
13
|
+
* empties for the next frame's; the idle are the rest of the frame's active list. The period goes to
|
|
12
14
|
* `probe_counters[PROBE_COUNTER_PERIOD]` for the due passes.
|
|
13
15
|
* - The next frame's eviction, `probe_eviction`: as many slots as the free ones fall short of the frame's
|
|
14
16
|
* wanted points and the slack, the probes wanted longest ago first. Walking retire's age buckets from the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_schedule.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js"],"names":[],"mappings":"AAgBA;;GAEG;AACH,sCAFU,YAAY,
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_schedule.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js"],"names":[],"mappings":"AAgBA;;GAEG;AACH,sCAFU,YAAY,CAaM;AAa5B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,4CAFU,aAAa,CA2CpB;6BA1G0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js
CHANGED
|
@@ -26,6 +26,8 @@ export const PROBE_SCHEDULE_SETTINGS = WebGPUStruct.from({
|
|
|
26
26
|
trace_capacity: u32,
|
|
27
27
|
/** slots kept free beyond the frame's wanted points, ⌈capacity · PROBE_FREE_SLACK⌉ */
|
|
28
28
|
slack: u32,
|
|
29
|
+
/** idle probes the period counts as one waiting, `probe_clipmap_idle_periods`, at least 1 */
|
|
30
|
+
idle_periods: u32,
|
|
29
31
|
}, "ProbeScheduleSettings");
|
|
30
32
|
|
|
31
33
|
const resources = new ShaderResourceSetDescriptor();
|
|
@@ -43,9 +45,11 @@ resources.createGroup()
|
|
|
43
45
|
* Schedule (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §8.5): one thread, after admit, when the frame's
|
|
44
46
|
* active list is whole.
|
|
45
47
|
* - The period: with P_w the probes waiting for an update, the NEW and those wanted since their last
|
|
46
|
-
* update,
|
|
47
|
-
*
|
|
48
|
-
*
|
|
48
|
+
* update, P_i the idle, every other live probe, and m `idle_periods`,
|
|
49
|
+
* `T = max(1, ⌈(P_w + P_i / m) / U⌉)` frames. Every probe a want waits on is updated within a period and
|
|
50
|
+
* every idle one within m of them, a frame's updates U at most on average, and the period follows the
|
|
51
|
+
* live count. Retire and admit counted the waiting in `probe_counters[PROBE_COUNTER_WAITING]`, which it
|
|
52
|
+
* empties for the next frame's; the idle are the rest of the frame's active list. The period goes to
|
|
49
53
|
* `probe_counters[PROBE_COUNTER_PERIOD]` for the due passes.
|
|
50
54
|
* - The next frame's eviction, `probe_eviction`: as many slots as the free ones fall short of the frame's
|
|
51
55
|
* wanted points and the slack, the probes wanted longest ago first. Walking retire's age buckets from the
|
|
@@ -73,47 +77,28 @@ export const shader_probe_clipmap_schedule = ComputeShader.from({
|
|
|
73
77
|
`
|
|
74
78
|
@compute @workgroup_size(1)
|
|
75
79
|
fn main() {
|
|
80
|
+
let live = min(probe_active_write.count, settings.capacity);
|
|
76
81
|
let waiting = atomicLoad(&probe_counters[PROBE_COUNTER_WAITING]);
|
|
82
|
+
let idle = live - min(waiting, live);
|
|
83
|
+
let idle_periods = max(settings.idle_periods, 1u);
|
|
77
84
|
let traced = max(settings.trace_capacity, 1u);
|
|
78
85
|
|
|
79
86
|
atomicStore(&probe_counters[PROBE_COUNTER_WAITING], 0u);
|
|
80
|
-
|
|
87
|
+
// ⌈(P_w + P_i / m) / U⌉ in whole numbers
|
|
88
|
+
atomicStore(&probe_counters[PROBE_COUNTER_PERIOD], max(divide_round_up_u32(waiting * idle_periods + idle, traced * idle_periods), 1u));
|
|
81
89
|
|
|
82
90
|
// the slots short of the frame's wanted points and the slack
|
|
83
91
|
let wanted = min(probe_wanted.count, settings.wanted_capacity);
|
|
84
92
|
let room = wanted + settings.slack;
|
|
85
93
|
let free = atomicLoad(&probe_counters[PROBE_COUNTER_FREE]);
|
|
86
94
|
|
|
87
|
-
|
|
88
|
-
var buckets = 0u;
|
|
89
|
-
var remaining = 0u;
|
|
90
|
-
|
|
91
|
-
for (var k = 0u; k < PROBE_AGE_BUCKETS; k++) {
|
|
92
|
-
let at = PROBE_COUNTER_AGES + PROBE_AGE_BUCKETS - 1u - k;
|
|
93
|
-
let aged = atomicLoad(&probe_counters[at]);
|
|
94
|
-
|
|
95
|
-
atomicStore(&probe_counters[at], 0u);
|
|
95
|
+
let plan = age_eviction_plan(&probe_counters, PROBE_COUNTER_AGES, select(0u, room - free, room > free));
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (lacking > 0u && aged > 0u) {
|
|
100
|
-
if (aged <= lacking) {
|
|
101
|
-
lacking -= aged;
|
|
102
|
-
buckets = k + 1u;
|
|
103
|
-
} else {
|
|
104
|
-
buckets = k;
|
|
105
|
-
remaining = lacking;
|
|
106
|
-
lacking = 0u;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
probe_eviction.buckets = buckets;
|
|
112
|
-
probe_eviction.remaining = remaining;
|
|
97
|
+
probe_eviction.buckets = plan.x;
|
|
98
|
+
probe_eviction.remaining = plan.y;
|
|
113
99
|
|
|
114
100
|
atomicStore(&probe_counters[PROBE_COUNTER_EVICTED], 0u);
|
|
115
101
|
|
|
116
|
-
let live = min(probe_active_write.count, settings.capacity);
|
|
117
102
|
let folded = folded_dispatch(divide_round_up_u32(live, PROBE_THREAD_WORKGROUP_SIZE));
|
|
118
103
|
|
|
119
104
|
probe_dispatch[PROBE_DISPATCH_ACTIVE] = folded.x;
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js
CHANGED
|
@@ -110,7 +110,7 @@ fn main(
|
|
|
110
110
|
let cascade = (record.flags >> PROBE_RAY_CASCADE_SHIFT) & PROBE_RAY_CASCADE_MASK;
|
|
111
111
|
|
|
112
112
|
let draw = hash_to_float01(pcg4d(vec4<u32>(probe_trace.elements[k], record.direction, 0x510E527Fu, 0u)).x);
|
|
113
|
-
let surface = probe_clipmap_hit_material_pick(position, normal, cascade, draw);
|
|
113
|
+
let surface = probe_clipmap_hit_material_pick(position, normal, cascade, draw, settings.brick_atlas_shift);
|
|
114
114
|
let direct = rgbe9995_decode(record.light);
|
|
115
115
|
|
|
116
116
|
radiance = surface.emissive + surface.albedo * direct * RECIPROCAL_PI;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_trace.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js"],"names":[],"mappings":"AAkDA;;GAEG;AACH,mCAFU,YAAY,
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_trace.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js"],"names":[],"mappings":"AAkDA;;GAEG;AACH,mCAFU,YAAY,CAiBG;AAsBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,yCAFU,aAAa,CAuJpB;6BAzP0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js
CHANGED
|
@@ -64,6 +64,8 @@ export const PROBE_TRACE_SETTINGS = WebGPUStruct.from({
|
|
|
64
64
|
t_max: f32,
|
|
65
65
|
/** updates between a probe's uniform ones, `PROBE_UNIFORM_PERIOD` */
|
|
66
66
|
uniform_period: u32,
|
|
67
|
+
/** the brick atlas's footprint as shifts, `GPUBrickClipmap#atlas_shift` */
|
|
68
|
+
brick_atlas_shift: u32,
|
|
67
69
|
}, "ProbeTraceSettings");
|
|
68
70
|
|
|
69
71
|
const resources = new ShaderResourceSetDescriptor();
|
|
@@ -198,7 +200,7 @@ fn main(
|
|
|
198
200
|
let start = brick_clipmap_start(origin, cascade_count);
|
|
199
201
|
let t_min = brick_levels[min(start, cascade_count - 1u)].cell_size / ${MESH_SDF_BRICK_VOXELS}.0;
|
|
200
202
|
|
|
201
|
-
let hit = brick_clipmap_trace(origin, direction, t_min, settings.t_max, cascade_count);
|
|
203
|
+
let hit = brick_clipmap_trace(origin, direction, t_min, settings.t_max, cascade_count, settings.brick_atlas_shift);
|
|
202
204
|
|
|
203
205
|
let is_hit = hit.kind == BRICK_TRACE_HIT;
|
|
204
206
|
let back_face = is_hit && dot(hit.normal, direction) > 0.0;
|
|
@@ -229,7 +231,7 @@ fn main(
|
|
|
229
231
|
// a point of the disk of its own for each light, apart from the origin's draw
|
|
230
232
|
let hash = pcg3d(vec3<u32>(slot, packed, 0x3C6EF372u + shadowed));
|
|
231
233
|
let toward = cone_sample_direction(-light.direction, light.disk_radius, vec2<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y)));
|
|
232
|
-
let shadow = brick_clipmap_trace(lifted, toward, 0.0, settings.t_max, cascade_count);
|
|
234
|
+
let shadow = brick_clipmap_trace(lifted, toward, 0.0, settings.t_max, cascade_count, settings.brick_atlas_shift);
|
|
233
235
|
|
|
234
236
|
visible = select(0.0, 1.0, shadow.kind == BRICK_TRACE_MISS);
|
|
235
237
|
}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* @type {WebGPUStruct}
|
|
3
3
|
*/
|
|
4
4
|
export const PROBE_WANT_SETTINGS: WebGPUStruct;
|
|
5
|
+
/**
|
|
6
|
+
* {@link PROBE_WANT_SETTINGS} and how the surface's normals are read.
|
|
7
|
+
* @type {WebGPUStruct}
|
|
8
|
+
*/
|
|
9
|
+
export const PROBE_WANT_SURFACE_SETTINGS: WebGPUStruct;
|
|
5
10
|
/**
|
|
6
11
|
* Want (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3): a thread a tile of {@link PROBE_WANT_TILE}² pixels,
|
|
7
12
|
* the launch the screen's tiles.
|
|
@@ -10,6 +15,12 @@ export const PROBE_WANT_SETTINGS: WebGPUStruct;
|
|
|
10
15
|
* that pixel's pick reads (§9.1), biased along `mix(n, v, 0.2)`, through `probe_clipmap_want`. A sky
|
|
11
16
|
* pixel wants nothing.
|
|
12
17
|
*
|
|
18
|
+
* The surface is any the frame holds a depth and a normal of, a pixel each: the G-buffer's, or one drawn
|
|
19
|
+
* apart from it whose reader picks its probes per pixel, the water's interface. `gBufferDepth` is its
|
|
20
|
+
* reverse-Z depth, zero where it has no surface; `gBufferNormals` its normals, octahedral in the channel
|
|
21
|
+
* `settings.normal_channel`, as the G-buffer packs its own in its first. Where `settings.two_sided` is set,
|
|
22
|
+
* a normal that faces away from the eye is turned to face it, as a reader of such a surface turns it.
|
|
23
|
+
*
|
|
13
24
|
* At a cascade's outer edge a lattice cell is 58 pixels on a 1080p screen at a 60° field of view, and
|
|
14
25
|
* 19 at 120°, so a tile of 8 samples every cell several times a frame, and a workgroup's 64 tiles want
|
|
15
26
|
* a few cages between them, which its claims keep to one want each.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_want.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js"],"names":[],"mappings":"AAqBA;;GAEG;AACH,kCAFU,YAAY,CAcE;
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_want.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.js"],"names":[],"mappings":"AAqBA;;GAEG;AACH,kCAFU,YAAY,CAcE;AAExB;;;GAGG;AACH,0CAFU,YAAY,CAaS;AAe/B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wCAFU,aAAa,CAyCpB;6BArH0B,sCAAsC;8BAHrC,kCAAkC"}
|