@woosh/meep-engine 3.58.0 → 3.59.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/editor/particles/effect/ParticleEffectDocument.d.ts +162 -43
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +450 -43
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +12 -3
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +78 -23
- package/editor/particles/effect/make_starter_particle_effect.js +17 -17
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +3 -3
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +224 -67
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +44 -11
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +2 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +46 -16
- package/editor/view/particles/effect/ParticlePreviewView.js +2 -2
- package/editor/view/particles/effect/particle-editor.css +77 -68
- package/package.json +1 -1
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +2 -2
- package/src/engine/ecs/EntityManager.d.ts +29 -5
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +37 -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/particles/ParticleEffect.d.ts +74 -17
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +156 -25
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +13 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +59 -13
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +3 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +9 -9
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts +15 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_2_3.js +78 -0
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +2 -0
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +2 -0
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +1 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +1 -1
- package/src/engine/graphics/trail/tube/TubeX.d.ts +5 -3
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/TubeX.js +5 -3
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +3 -2
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +9 -8
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +65 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +1351 -904
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +1 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +13 -13
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/generation/foliage/FOLIAGE_DESIGN.md +26 -5
- package/src/generation/foliage/LOD_REWORK_BRIEF_2026_10_27.md +35 -0
- package/src/generation/foliage/SELF_ORGANIZING_FRAMEWORK_BRIEF_2026_10_26.md +2 -1
- package/src/generation/foliage/TWO_FRONT_ENDS_BRIEF_2026_10_28.md +552 -0
- package/src/generation/foliage/analysis/tree_crown_opacity.d.ts.map +1 -1
- package/src/generation/foliage/analysis/tree_crown_opacity.js +2 -1
- package/src/generation/foliage/analysis/tree_render_cost.d.ts +5 -3
- package/src/generation/foliage/analysis/tree_render_cost.d.ts.map +1 -1
- package/src/generation/foliage/analysis/tree_render_cost.js +8 -7
- package/src/generation/foliage/asset/TreeAsset.d.ts +17 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -1
- package/src/generation/foliage/asset/TreeAsset.js +20 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts +69 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeSpeciesCache.js +147 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +10 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/generate_tree.js +57 -29
- package/src/generation/foliage/asset/place_tree.d.ts +2 -1
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -1
- package/src/generation/foliage/asset/place_tree.js +2 -1
- package/src/generation/foliage/asset/tree_lod_plan.d.ts +4 -2
- package/src/generation/foliage/asset/tree_lod_plan.d.ts.map +1 -1
- package/src/generation/foliage/asset/tree_lod_plan.js +12 -14
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts +119 -0
- package/src/generation/foliage/asset/tree_shoot_instances.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_instances.js +410 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts +155 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.d.ts.map +1 -0
- package/src/generation/foliage/asset/tree_shoot_prototypes.js +251 -0
- package/src/generation/foliage/config/TreeGrowth.d.ts +10 -0
- package/src/generation/foliage/config/TreeGrowth.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeGrowth.js +18 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +6 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -1
- package/src/generation/foliage/config/TreeLODConfig.js +7 -0
- package/src/generation/foliage/index.d.ts +3 -0
- package/src/generation/foliage/index.js +3 -0
- package/src/generation/foliage/material/foliage_tile.d.ts +6 -6
- package/src/generation/foliage/material/foliage_tile.js +3 -3
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts +44 -0
- package/src/generation/foliage/material/tree_cluster_atlas.d.ts.map +1 -0
- package/src/generation/foliage/material/tree_cluster_atlas.js +37 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +2 -2
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts +14 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_scale_spread.js +15 -0
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts +8 -7
- package/src/generation/foliage/mesh/tree_cluster_representatives.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_cluster_representatives.js +85 -40
- package/src/generation/foliage/mesh/tree_clusters.d.ts +26 -5
- package/src/generation/foliage/mesh/tree_clusters.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_clusters.js +52 -39
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -1
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +32 -54
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +6 -1
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -1
- package/src/generation/foliage/presets/make_tree_species_preset.js +157 -3
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +19 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/TreeSkeleton.js +41 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts +5 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_compute_joint_mechanics.js +8 -1
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts +70 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_copy_branches.js +171 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts +17 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_extend_branch.js +79 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts +12 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_fit_crown_frame.js +56 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts +11 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_floor_girth.js +38 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +4 -11
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +8 -2034
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts +22 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_framework.js +2050 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts +10 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.d.ts.map +1 -1
- package/src/generation/foliage/skeleton/tree_skeleton_grow_shoots.js +27 -56
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/DepthStencilState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/DepthStencilState.js +170 -144
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/MultisampleState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/MultisampleState.js +78 -65
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +176 -172
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts +4 -0
- package/src/shade/descriptor/pipeline/render/StencilFaceState.d.ts.map +1 -1
- package/src/shade/descriptor/pipeline/render/StencilFaceState.js +107 -88
- package/src/shade/playground/particle_ecs/README.md +9 -8
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +6 -6
- package/src/shade/playground/particle_ecs/bonfire_effects.js +6 -6
- package/src/shade/playground/particle_editor/README.md +14 -11
- package/src/shade/playground/particle_system/particle_prototype.js +18 -18
- package/src/shade/playground/particle_system/particle_scene.js +13 -13
- package/src/shade/playground/probe_clipmap/README.md +42 -0
- package/src/shade/playground/probe_clipmap/index.html +178 -0
- package/src/shade/playground/probe_clipmap/main.d.ts +8 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -0
- package/src/shade/playground/probe_clipmap/main.js +360 -0
- package/src/shade/renderer/Renderer.d.ts +3 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +94 -38
- package/src/shade/renderer/extension/ViewTextures.d.ts +2 -1
- package/src/shade/renderer/extension/ViewTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/ViewTextures.js +2 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +3 -3
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +6 -6
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +1 -1
- package/src/shade/renderer/fluid/query/GPUFluidQueries.d.ts +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +34 -12
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +56 -15
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +13 -26
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +25 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +54 -32
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_VERDICT.js +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +2 -6
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts +131 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_descent.js +467 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_instance.js +111 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts +42 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_rule.js +404 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_stat.js +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_want.js +65 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +14 -70
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +13 -773
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts +55 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_cut_descent.js +248 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +15 -174
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_probe_meta_pick2.js +8 -24
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/chunk_brick4_sample_forward_indirect.js +1 -25
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/chunk_lpv_get_visibility_mask.js +5 -23
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +25 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +126 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +832 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +7 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +16 -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 +9 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/{mesh/chunk_mesh_brick_object.d.ts → chunk_brick_object.d.ts} +8 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_object.js +42 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_provider.js +93 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +0 -7
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +0 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +5 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +13 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +99 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +139 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +65 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +393 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +17 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +108 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +31 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +113 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +85 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +273 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +151 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +13 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +133 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +22 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +20 -6
- 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 +152 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +7 -0
- 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 +8 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +14 -2
- 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 +50 -5
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts +19 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_cage.js +40 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts +72 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +343 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +188 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js +132 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +4 -0
- 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 +26 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +3 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +8 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js +101 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts +15 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js +175 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +26 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +3 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +5 -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 +3 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want.d.ts +5 -9
- 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 +9 -110
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +27 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +110 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts +13 -0
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/chunk_world_light_cluster_lookup.js +40 -0
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts +11 -6
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/graph_build_world_light_clusters.js +15 -8
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts +9 -2
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/world_cluster/shader_world_cluster_assign_lights.js +25 -11
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +151 -42
- package/src/shade/renderer/particles/EMITTER_GLOBAL_STATE_PLAN_2026_10_29.md +283 -0
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +10 -2
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +46 -8
- package/src/shade/renderer/particles/ParticleConstants.d.ts +23 -6
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +25 -6
- package/src/shade/renderer/particles/bounds/chunk_particle_bounds.js +5 -5
- package/src/shade/renderer/particles/bounds/shader_particle_bounds.js +187 -187
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +20 -9
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +36 -10
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +8 -7
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +25 -16
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts +51 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_FIELD_BINDING.js +56 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +1 -1
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +22 -11
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +14 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +4 -4
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +59 -24
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -287
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +13 -6
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +46 -27
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +8 -2
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +240 -234
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +3 -2
- package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -170
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +25 -16
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_json.js +16 -2
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +29 -15
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +54 -22
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +18 -8
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +9 -2
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +70 -32
- package/src/shade/renderer/particles/graph_particles.d.ts +9 -4
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +27 -4
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +7 -6
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +17 -16
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +17 -0
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleAssembler.js +35 -0
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +26 -6
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +61 -9
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +55 -4
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +79 -10
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +20 -6
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +136 -25
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts +20 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_link_global_fields.js +46 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +8 -8
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +62 -28
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +102 -62
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +2 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +1 -1
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +4 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +2 -2
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +3 -3
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +11 -11
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +5 -4
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +1 -1
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +4 -4
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +13 -11
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +7 -7
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +3 -2
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +5 -4
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -51
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +5 -5
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +2 -2
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +5 -4
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +93 -22
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +336 -29
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +43 -3
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +43 -3
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +56 -26
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +89 -33
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts +85 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleGlobalFields.js +221 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +143 -18
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +378 -28
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +19 -7
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -9
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +3 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +4 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts +30 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_field_bind.js +121 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +3 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +12 -4
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +48 -11
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +36 -14
- package/src/shade/renderer/postprocess/PostProcess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/PostProcess.js +2 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +31 -19
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +44 -30
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/ao_reproject_shader.js +16 -2
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +4 -3
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts +7 -1
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +16 -0
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts +20 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_add_hit_irradiance.js +53 -3
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts +10 -2
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/chunk_ssr_sample_radiance.js +31 -3
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +17 -11
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +4 -2
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +6 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_fsr2_compute_depth_clip.js +10 -5
- package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_taa.js +15 -12
- 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 +26 -17
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts +4 -3
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect.js +6 -4
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts +12 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_sample_indirect_probe_clipmap.js +57 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +4 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +4 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +8 -2
- 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 +28 -15
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw.js +19 -3
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +4 -2
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +3 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +27 -14
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +2 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +19 -3
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts +2 -8
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_bounds.js +25 -52
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_positions.js +52 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/TRIANGLE_POSITIONS_STRUCT.js +12 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js +37 -0
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/lpv/depth/chunk_lpv_mask_weights_by_visibility.js +26 -60
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/light/probe/chunk_probe_visibility_weight.js +54 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_f16_round_stochastic.js +43 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts +14 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/chunk_jitter_from_vectors.js +37 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts +27 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/reservoir/chunk_pick2_wrs_mat2x4.js +61 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js +41 -0
- package/src/shade/renderer/texture/util/texture_fill_rectangle.d.ts.map +1 -1
- package/src/shade/renderer/texture/util/texture_fill_rectangle.js +282 -267
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +8 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +36 -36
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts +6 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/GPUIrradianceClipmap.js +498 -484
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts +15 -2
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/chunk_irradiance_clipmap_gi_sample.js +57 -3
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/irradiance_clipmap/shader_irradiance_clipmap_build.js +197 -191
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +4 -4
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +2 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +5 -1
- package/src/shade/renderer/water/chunk_water_gi.d.ts +13 -3
- package/src/shade/renderer/water/chunk_water_gi.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_gi.js +47 -5
- package/src/shade/renderer/water/query/GPUWaterQueries.d.ts +1 -1
- package/src/shade/renderer/water/shader_water.d.ts +3 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +9 -3
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/SDF_BUILD_SETTINGS_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts +0 -2
- package/src/shade/renderer/geometry/sdf/SFD_BUILD_WORKGROUP_SIZE.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts +0 -8
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_sdf.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/chunk_blas_query_volume_sign.d.ts.map +0 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts +0 -3
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_object.js +0 -42
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +0 -31
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts +0 -42
- package/src/shade/renderer/shadow/vsm/VSMMoverTracker.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts +0 -54
- package/src/shade/renderer/shadow/vsm/VSM_MOVER_LAYOUT.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts +0 -14
- package/src/shade/renderer/shadow/vsm/shader/chunk_vsm_append_mover.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts +0 -30
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_movers.d.ts.map +0 -1
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts +0 -23
- package/src/shade/renderer/shadow/vsm/shader/shader_vsm_skinned_movers.d.ts.map +0 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { chunk_roughness_to_mip_ratio } from "../../../light/environment/chunk_roughness_to_mip_ratio.js";
|
|
2
|
+
import { chunk_uv_octahedral_unit_encode } from "../../../shader/chunk/geometry/octahedron/chunk_uv_octahedral_unit_encode.js";
|
|
3
|
+
import { chunk_index_to_grid2d_reciprocal } from "../../../shader/chunk/grid/chunk_index_to_grid2d_reciprocal.js";
|
|
4
|
+
import { chunk_probe_visibility_weight } from "../../../shader/chunk/light/probe/chunk_probe_visibility_weight.js";
|
|
5
|
+
import { METRO_L1_IRRADIANCE_STRUCT } from "../../../shader/chunk/spherical_harmonics/l1i/chunk_convert_to_irradiance_sh.js";
|
|
6
|
+
import {
|
|
7
|
+
chunk_resolve_irradiance_sh_to_specular
|
|
8
|
+
} from "../../../shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_specular.js";
|
|
9
|
+
import { chunk_texture_octahedral_skirt_uv } from "../../../shader/chunk/texture/octahedral/chunk_texture_octahedral_skirt_uv.js";
|
|
10
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
11
|
+
import {
|
|
12
|
+
PROBE_LEVELS_RESOURCE,
|
|
13
|
+
PROBE_RADIANCE_HISTORY_RESOURCE,
|
|
14
|
+
PROBE_RECORDS_READ_RESOURCE,
|
|
15
|
+
PROBE_STATES_READ_RESOURCE
|
|
16
|
+
} from "./chunk_probe_clipmap.js";
|
|
17
|
+
import { chunk_probe_clipmap_cage } from "./chunk_probe_clipmap_cage.js";
|
|
18
|
+
import {
|
|
19
|
+
chunk_probe_clipmap_pick,
|
|
20
|
+
PROBE_DEPTH_SAMPLER_RESOURCE,
|
|
21
|
+
PROBE_SAMPLING_RESOURCE
|
|
22
|
+
} from "./chunk_probe_clipmap_pick.js";
|
|
23
|
+
import { PROBE_RECEIVER_BIAS_VIEW } from "./PROBE_CLIPMAP.js";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A point's specular radiance from its probes (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §9.3), before Fresnel:
|
|
27
|
+
*
|
|
28
|
+
* ```wgsl
|
|
29
|
+
* fn probe_clipmap_radiance_of(pick: ProbeClipmapPick, position: vec3<f32>, normal: vec3<f32>, view_direction: vec3<f32>, roughness: f32) -> ProbeClipmapRadiance
|
|
30
|
+
* fn probe_clipmap_sample_radiance(position: vec3<f32>, normal: vec3<f32>, view_direction: vec3<f32>, roughness: f32, noise: vec2<f32>) -> ProbeClipmapRadiance
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* - **The pick is the diffuse's** (`probe_clipmap_pick`), by the normal and the view, so a pass that does
|
|
34
|
+
* both picks once: `probe_clipmap_radiance_of` takes a pick already made, with the point, normal and view it
|
|
35
|
+
* was made by. Its shares are re-weighted for the lobe, as Brick4's fused pass re-weights its pair:
|
|
36
|
+
* each probe's weight taken again with the sample vector in place of the normal, over the weight it was
|
|
37
|
+
* picked by, at the visibility it was picked at. The trilinear part cancels.
|
|
38
|
+
* - **The sample vector** is Lagarde's dominant direction, `normalize(mix(r, n, α))` with r the
|
|
39
|
+
* reflection of the view and α the roughness squared.
|
|
40
|
+
* - **A radiance tap** a probe, along the sample vector after a one-step sphere parallax: the reflected ray
|
|
41
|
+
* is met with a sphere about the probe whose radius is its mean depth along the vector. The depth is held
|
|
42
|
+
* at the cage's diagonal (§8.2), past which no parallax is taken. One bilinear tap of the tile, through
|
|
43
|
+
* its skirt and the depth's sampler.
|
|
44
|
+
* - **The rough end** is the probes' SH, mixed by the same shares and resolved for the GGX lobe
|
|
45
|
+
* (`resolve_irradiance_sh_to_specular`). The two are blended by `roughness_to_mip_ratio`: SH alone from
|
|
46
|
+
* roughness 0.7.
|
|
47
|
+
* - Where no probe weighs anything, nothing is found and the fallback is the caller's.
|
|
48
|
+
*
|
|
49
|
+
* @type {CodeChunk}
|
|
50
|
+
*/
|
|
51
|
+
export const chunk_probe_clipmap_sample_radiance = CodeChunk.from(
|
|
52
|
+
//language=WGSL
|
|
53
|
+
`
|
|
54
|
+
struct ProbeClipmapRadiance {
|
|
55
|
+
radiance: vec3<f32>,
|
|
56
|
+
found: bool,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
struct ProbeClipmapLobe {
|
|
60
|
+
// the probe's share for the lobe, before the shares are renormalised
|
|
61
|
+
weight: f32,
|
|
62
|
+
radiance: vec3<f32>,
|
|
63
|
+
sh: ${METRO_L1_IRRADIANCE_STRUCT.wgsl_ref},
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// a slot's radiance toward a direction: one bilinear tap of its tile, through its skirt
|
|
67
|
+
fn probe_clipmap_radiance(slot: u32, direction: vec3<f32>) -> vec3<f32> {
|
|
68
|
+
let side = probe_sampling.radiance_resolution + 2u;
|
|
69
|
+
let place = index_to_grid2d_reciprocal(slot, probe_sampling.radiance_tiles_per_row, probe_sampling.radiance_tiles_per_row_reciprocal);
|
|
70
|
+
let tile = vec2<f32>(place * side);
|
|
71
|
+
let in_tile = texture_octahedral_skirt_uv(uv_octahedral_unit_encode(direction), f32(side)) * f32(side);
|
|
72
|
+
|
|
73
|
+
return textureSampleLevel(probe_radiance, probe_depth_sampler, (tile + in_tile) * probe_sampling.radiance_texel, 0.0).rgb;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// a picked probe's share for the lobe, its radiance along it and its SH
|
|
77
|
+
fn probe_clipmap_lobe(slot: u32, share: f32, position: vec3<f32>, normal: vec3<f32>, bias_direction: vec3<f32>, lobe: vec3<f32>) -> ProbeClipmapLobe {
|
|
78
|
+
let record = probe_records[slot];
|
|
79
|
+
let spacing = probe_levels[record.cascade].cell_size;
|
|
80
|
+
let probe = vec3<f32>(record.cell) * spacing + probe_clipmap_offset_decode(probe_states[slot].y, spacing);
|
|
81
|
+
|
|
82
|
+
// the visibility it was picked at: Chebyshev's from its depth toward the biased point
|
|
83
|
+
let biased = probe_clipmap_biased(record.cascade, position, bias_direction);
|
|
84
|
+
let to_point = biased - probe;
|
|
85
|
+
let distance = length(to_point);
|
|
86
|
+
let visibility = probe_visibility_chebyshev(probe_clipmap_depth_moments(slot, to_point / max(distance, 1e-6)), distance / spacing);
|
|
87
|
+
|
|
88
|
+
let toward = normalize(probe - position);
|
|
89
|
+
|
|
90
|
+
var out: ProbeClipmapLobe;
|
|
91
|
+
out.weight = share * probe_visibility_weight(toward, lobe, visibility) / probe_visibility_weight(toward, normal, visibility);
|
|
92
|
+
out.sh = record.sh;
|
|
93
|
+
|
|
94
|
+
// the reflected ray met with a sphere about the probe, its radius the probe's mean depth along the lobe
|
|
95
|
+
let radius = probe_clipmap_depth_moments(slot, lobe).x * spacing;
|
|
96
|
+
let origin = position - probe;
|
|
97
|
+
let b = dot(lobe, origin);
|
|
98
|
+
let discriminant = b * b - (dot(origin, origin) - radius * radius);
|
|
99
|
+
|
|
100
|
+
var direction = lobe;
|
|
101
|
+
|
|
102
|
+
if (discriminant >= 0.0) {
|
|
103
|
+
let t = sqrt(discriminant) - b;
|
|
104
|
+
|
|
105
|
+
if (t > 0.0) {
|
|
106
|
+
direction = normalize(origin + t * lobe);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
out.radiance = probe_clipmap_radiance(slot, direction);
|
|
111
|
+
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fn probe_clipmap_radiance_of(pick: ProbeClipmapPick, position: vec3<f32>, normal: vec3<f32>, view_direction: vec3<f32>, roughness: f32) -> ProbeClipmapRadiance {
|
|
116
|
+
var out: ProbeClipmapRadiance;
|
|
117
|
+
|
|
118
|
+
out.found = dot(pick.weights, vec4<f32>(1.0)) > 0.0;
|
|
119
|
+
|
|
120
|
+
if (!out.found) {
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let alpha = roughness * roughness;
|
|
125
|
+
let lobe = normalize(mix(reflect(-view_direction, normal), normal, alpha));
|
|
126
|
+
let bias_direction = mix(normal, view_direction, ${PROBE_RECEIVER_BIAS_VIEW});
|
|
127
|
+
|
|
128
|
+
var weight = 0.0;
|
|
129
|
+
var radiance = vec3<f32>(0.0);
|
|
130
|
+
var sh: ${METRO_L1_IRRADIANCE_STRUCT.wgsl_ref};
|
|
131
|
+
|
|
132
|
+
// each by name, the slots of a share of zero not read
|
|
133
|
+
if (pick.weights.x > 0.0) {
|
|
134
|
+
let probe = probe_clipmap_lobe(pick.slots.x, pick.weights.x, position, normal, bias_direction, lobe);
|
|
135
|
+
weight += probe.weight;
|
|
136
|
+
radiance += probe.weight * probe.radiance;
|
|
137
|
+
sh.Y += probe.weight * probe.sh.Y;
|
|
138
|
+
sh.CoCg += probe.weight * probe.sh.CoCg;
|
|
139
|
+
}
|
|
140
|
+
if (pick.weights.y > 0.0) {
|
|
141
|
+
let probe = probe_clipmap_lobe(pick.slots.y, pick.weights.y, position, normal, bias_direction, lobe);
|
|
142
|
+
weight += probe.weight;
|
|
143
|
+
radiance += probe.weight * probe.radiance;
|
|
144
|
+
sh.Y += probe.weight * probe.sh.Y;
|
|
145
|
+
sh.CoCg += probe.weight * probe.sh.CoCg;
|
|
146
|
+
}
|
|
147
|
+
if (pick.weights.z > 0.0) {
|
|
148
|
+
let probe = probe_clipmap_lobe(pick.slots.z, pick.weights.z, position, normal, bias_direction, lobe);
|
|
149
|
+
weight += probe.weight;
|
|
150
|
+
radiance += probe.weight * probe.radiance;
|
|
151
|
+
sh.Y += probe.weight * probe.sh.Y;
|
|
152
|
+
sh.CoCg += probe.weight * probe.sh.CoCg;
|
|
153
|
+
}
|
|
154
|
+
if (pick.weights.w > 0.0) {
|
|
155
|
+
let probe = probe_clipmap_lobe(pick.slots.w, pick.weights.w, position, normal, bias_direction, lobe);
|
|
156
|
+
weight += probe.weight;
|
|
157
|
+
radiance += probe.weight * probe.radiance;
|
|
158
|
+
sh.Y += probe.weight * probe.sh.Y;
|
|
159
|
+
sh.CoCg += probe.weight * probe.sh.CoCg;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let rough = resolve_irradiance_sh_to_specular(sh.Y / weight, sh.CoCg / weight, lobe, alpha);
|
|
163
|
+
|
|
164
|
+
out.radiance = mix(radiance / weight, rough, roughness_to_mip_ratio(roughness));
|
|
165
|
+
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fn probe_clipmap_sample_radiance(position: vec3<f32>, normal: vec3<f32>, view_direction: vec3<f32>, roughness: f32, noise: vec2<f32>) -> ProbeClipmapRadiance {
|
|
170
|
+
return probe_clipmap_radiance_of(probe_clipmap_pick(position, normal, view_direction, noise), position, normal, view_direction, roughness);
|
|
171
|
+
}
|
|
172
|
+
`, [
|
|
173
|
+
chunk_probe_clipmap_pick,
|
|
174
|
+
chunk_probe_clipmap_cage,
|
|
175
|
+
chunk_probe_visibility_weight,
|
|
176
|
+
chunk_index_to_grid2d_reciprocal,
|
|
177
|
+
chunk_texture_octahedral_skirt_uv,
|
|
178
|
+
chunk_uv_octahedral_unit_encode,
|
|
179
|
+
chunk_resolve_irradiance_sh_to_specular,
|
|
180
|
+
chunk_roughness_to_mip_ratio,
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_LEVELS_RESOURCE);
|
|
184
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_SAMPLING_RESOURCE);
|
|
185
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_STATES_READ_RESOURCE);
|
|
186
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_RECORDS_READ_RESOURCE);
|
|
187
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_DEPTH_SAMPLER_RESOURCE);
|
|
188
|
+
chunk_probe_clipmap_sample_radiance.requireResource(PROBE_RADIANCE_HISTORY_RESOURCE);
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wanting the probes a receiving point's pick reads (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §9.1),
|
|
3
|
+
* for want's pixels and the hits' wants alike.
|
|
4
|
+
*
|
|
5
|
+
* ```wgsl
|
|
6
|
+
* fn probe_clipmap_want(wants: bool, position: vec3<f32>, bias_direction: vec3<f32>, cascade_count: u32, resolution: u32, key_count: u32, flag: u32)
|
|
7
|
+
* ```
|
|
8
|
+
*
|
|
9
|
+
* The cages are the pick's: the finest cascade whose cage window holds the point, the cage of the point
|
|
10
|
+
* biased along `bias_direction` by that cascade's spacing, and in the cascade's blend skirt the next
|
|
11
|
+
* cascade's cage too, biased by its own. A cage a bias moved out of its window is not wanted. Each cage
|
|
12
|
+
* point's bit is set, and a point whose bit was clear goes on the wanted list with `flag` over its key,
|
|
13
|
+
* so the list holds every point wanted this frame once, with its first wanter's flag.
|
|
14
|
+
*
|
|
15
|
+
* A workgroup's lanes want a few cages between them, so the first lane to want a cage claims it in the
|
|
16
|
+
* workgroup's table and sets its bits; the rest want it through that lane. Measured on the AMD iGPU at
|
|
17
|
+
* 1280×720 on Sponza before the claims, the bits' atomics were 140 of want's 345 µs and the appends 90.
|
|
18
|
+
*
|
|
19
|
+
* Every lane of the workgroup calls it once, wanting or not, from uniform control flow: the appends are
|
|
20
|
+
* the subgroup's.
|
|
21
|
+
*
|
|
22
|
+
* @type {CodeChunk}
|
|
23
|
+
*/
|
|
24
|
+
export const chunk_probe_clipmap_want: CodeChunk;
|
|
25
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
26
|
+
//# sourceMappingURL=chunk_probe_clipmap_want.d.ts.map
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_probe_clipmap_want.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,uCAFU,SAAS,CAgFZ;0BA7HmB,uCAAuC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_want.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { chunk_collection_u32_append } from "../../../gpu_primitive/chunk_collection_u32_append.js";
|
|
2
|
+
import { chunk_clipmap_select_finest } from "../../../shader/chunk/clipmap/chunk_clipmap_select_finest.js";
|
|
3
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
4
|
+
import {
|
|
5
|
+
chunk_probe_clipmap,
|
|
6
|
+
PROBE_LEVELS_RESOURCE,
|
|
7
|
+
PROBE_WANTED_BITS_RESOURCE,
|
|
8
|
+
PROBE_WANTED_WRITE_RESOURCE
|
|
9
|
+
} from "./chunk_probe_clipmap.js";
|
|
10
|
+
import { chunk_probe_clipmap_cage } from "./chunk_probe_clipmap_cage.js";
|
|
11
|
+
import { PROBE_THREAD_WORKGROUP_SIZE } from "./PROBE_CLIPMAP.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Slots of a workgroup's claim table: twice the claims its lanes make at most, a cage in each of two
|
|
15
|
+
* cascades a lane, so a probe finds a slot within a few. Sized for {@link PROBE_THREAD_WORKGROUP_SIZE}
|
|
16
|
+
* lanes: want's 8×8 tiles, and the hits' wants' 64.
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
const WANT_CLAIM_SLOTS = 2 * 2 * PROBE_THREAD_WORKGROUP_SIZE;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Slots a claim tries before it wants its cage anyway: a bound, which a half-full table does not reach.
|
|
23
|
+
* @type {number}
|
|
24
|
+
*/
|
|
25
|
+
const WANT_CLAIM_PROBES = 16;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Wanting the probes a receiving point's pick reads (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.3, §9.1),
|
|
29
|
+
* for want's pixels and the hits' wants alike.
|
|
30
|
+
*
|
|
31
|
+
* ```wgsl
|
|
32
|
+
* fn probe_clipmap_want(wants: bool, position: vec3<f32>, bias_direction: vec3<f32>, cascade_count: u32, resolution: u32, key_count: u32, flag: u32)
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* The cages are the pick's: the finest cascade whose cage window holds the point, the cage of the point
|
|
36
|
+
* biased along `bias_direction` by that cascade's spacing, and in the cascade's blend skirt the next
|
|
37
|
+
* cascade's cage too, biased by its own. A cage a bias moved out of its window is not wanted. Each cage
|
|
38
|
+
* point's bit is set, and a point whose bit was clear goes on the wanted list with `flag` over its key,
|
|
39
|
+
* so the list holds every point wanted this frame once, with its first wanter's flag.
|
|
40
|
+
*
|
|
41
|
+
* A workgroup's lanes want a few cages between them, so the first lane to want a cage claims it in the
|
|
42
|
+
* workgroup's table and sets its bits; the rest want it through that lane. Measured on the AMD iGPU at
|
|
43
|
+
* 1280×720 on Sponza before the claims, the bits' atomics were 140 of want's 345 µs and the appends 90.
|
|
44
|
+
*
|
|
45
|
+
* Every lane of the workgroup calls it once, wanting or not, from uniform control flow: the appends are
|
|
46
|
+
* the subgroup's.
|
|
47
|
+
*
|
|
48
|
+
* @type {CodeChunk}
|
|
49
|
+
*/
|
|
50
|
+
export const chunk_probe_clipmap_want = CodeChunk.from(
|
|
51
|
+
//language=WGSL
|
|
52
|
+
`
|
|
53
|
+
// the cages the workgroup's lanes have claimed, by their key plus one; zero at the workgroup's start
|
|
54
|
+
var<workgroup> probe_want_claims: array<atomic<u32>, ${WANT_CLAIM_SLOTS}>;
|
|
55
|
+
|
|
56
|
+
// whether this lane is the first of its workgroup to want the cage whose least point has \`key\`; a lane
|
|
57
|
+
// that finds no room in its probes wants it as well, which the bits make harmless
|
|
58
|
+
fn probe_want_claim(key: u32) -> bool {
|
|
59
|
+
let tag = key + 1u;
|
|
60
|
+
|
|
61
|
+
var at = (tag * 2654435761u) >> ${32 - Math.log2(WANT_CLAIM_SLOTS)}u;
|
|
62
|
+
|
|
63
|
+
for (var probe = 0u; probe < ${WANT_CLAIM_PROBES}u; probe++) {
|
|
64
|
+
let seen = atomicCompareExchangeWeak(&probe_want_claims[at], 0u, tag);
|
|
65
|
+
|
|
66
|
+
if (seen.exchanged) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (seen.old_value == tag) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// another cage's slot: the next one; an empty slot that failed spuriously is tried again
|
|
75
|
+
if (seen.old_value != 0u) {
|
|
76
|
+
at = (at + 1u) & ${WANT_CLAIM_SLOTS - 1}u;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
fn probe_clipmap_want(wants: bool, position: vec3<f32>, bias_direction: vec3<f32>, cascade_count: u32, resolution: u32, key_count: u32, flag: u32) {
|
|
84
|
+
let selection = clipmap_select_finest(&probe_levels, cascade_count, position, PROBE_BLEND_SKIRT);
|
|
85
|
+
|
|
86
|
+
let held = wants && selection.level != CLIPMAP_LEVEL_NONE;
|
|
87
|
+
let finest = select(0u, selection.level, held);
|
|
88
|
+
let next = min(finest + 1u, cascade_count - 1u);
|
|
89
|
+
|
|
90
|
+
var cage_finest: vec3<i32>;
|
|
91
|
+
var cage_next: vec3<i32>;
|
|
92
|
+
|
|
93
|
+
// storage wraps by the window's side, a power of two: the low bits of a point, negative ones too
|
|
94
|
+
let wrap = vec3<u32>(resolution - 1u);
|
|
95
|
+
|
|
96
|
+
let wants_finest = held && probe_clipmap_cage(finest, position, bias_direction, &cage_finest)
|
|
97
|
+
&& probe_want_claim(probe_clipmap_key(finest, vec3<u32>(cage_finest) & wrap, resolution));
|
|
98
|
+
let wants_next = held && selection.edge_weight > 0.0 && finest + 1u < cascade_count
|
|
99
|
+
&& probe_clipmap_cage(next, position, bias_direction, &cage_next)
|
|
100
|
+
&& probe_want_claim(probe_clipmap_key(next, vec3<u32>(cage_next) & wrap, resolution));
|
|
101
|
+
|
|
102
|
+
// every lane through all sixteen corners, so that the appends stay in uniform control flow
|
|
103
|
+
for (var k = 0u; k < 16u; k++) {
|
|
104
|
+
let coarse = k >= 8u;
|
|
105
|
+
let cascade = select(finest, next, coarse);
|
|
106
|
+
let wanted = select(wants_finest, wants_next, coarse);
|
|
107
|
+
let corner = vec3<i32>(vec3<u32>(k & 1u, (k >> 1u) & 1u, (k >> 2u) & 1u));
|
|
108
|
+
let point = select(cage_finest, cage_next, coarse) + corner;
|
|
109
|
+
|
|
110
|
+
let storage = vec3<u32>(point) & wrap;
|
|
111
|
+
let key = probe_clipmap_key(cascade, storage, resolution);
|
|
112
|
+
let bit = 1u << (key & 31u);
|
|
113
|
+
|
|
114
|
+
var first = false;
|
|
115
|
+
|
|
116
|
+
if (wanted) {
|
|
117
|
+
first = (atomicOr(&probe_wanted_bits[key >> 5u], bit) & bit) == 0u;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
collection_u32_append(&probe_wanted, first, key | flag, key_count);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
`, [
|
|
124
|
+
chunk_probe_clipmap,
|
|
125
|
+
chunk_clipmap_select_finest,
|
|
126
|
+
chunk_probe_clipmap_cage,
|
|
127
|
+
chunk_collection_u32_append,
|
|
128
|
+
]);
|
|
129
|
+
|
|
130
|
+
chunk_probe_clipmap_want.requireResource(PROBE_LEVELS_RESOURCE);
|
|
131
|
+
chunk_probe_clipmap_want.requireResource(PROBE_WANTED_BITS_RESOURCE);
|
|
132
|
+
chunk_probe_clipmap_want.requireResource(PROBE_WANTED_WRITE_RESOURCE);
|
|
@@ -21,6 +21,10 @@ export const PROBE_ACCUMULATE_SETTINGS: WebGPUStruct;
|
|
|
21
21
|
* R to (R ≤ 64·n_d²).
|
|
22
22
|
* - **A new probe's history is another probe's**, its slot's last owner: on its first update a texel
|
|
23
23
|
* no ray reached is cleared, radiance to nothing seen, depth to the moments of a miss.
|
|
24
|
+
* - **Stored rounded stochastically** onto halves (`f16_round_stochastic`), with noise fresh for each
|
|
25
|
+
* texel and update. Rounded by the store, a blend whose step is under a ULP would stop short of its
|
|
26
|
+
* target by up to a ULP/α, and below it, since both devices measured round toward zero: on a room
|
|
27
|
+
* glowing evenly, 1.5% at 60 Hz and 5.9% at 240 Hz. Rounded stochastically it moves in expectation.
|
|
24
28
|
*
|
|
25
29
|
* @type {ComputeShader}
|
|
26
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_accumulate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_accumulate.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js"],"names":[],"mappings":"AA+BA;;GAEG;AACH,wCAFU,YAAY,CAmBQ;AAgB9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,8CAFU,aAAa,CAgMpB;6BAlR0B,sCAAsC;8BAHrC,kCAAkC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { chunk_folded_workgroup_index } from "../../../shader/chunk/grid/chunk_folded_workgroup_index.js";
|
|
2
2
|
import { chunk_index_to_grid2d } from "../../../shader/chunk/grid/chunk_index_to_grid2d.js";
|
|
3
|
+
import { chunk_f16_round_stochastic } from "../../../shader/chunk/math/chunk_f16_round_stochastic.js";
|
|
4
|
+
import { chunk_hash_to_float01 } from "../../../shader/chunk/random/chunk_hash_to_float01.js";
|
|
5
|
+
import { chunk_pcg3d } from "../../../shader/chunk/random/pcg/chunk_pcg3d.js";
|
|
3
6
|
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
4
7
|
import { ComputeShader } from "../../../shader/ComputeShader.js";
|
|
5
8
|
import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
@@ -81,6 +84,10 @@ resources.createGroup()
|
|
|
81
84
|
* R to (R ≤ 64·n_d²).
|
|
82
85
|
* - **A new probe's history is another probe's**, its slot's last owner: on its first update a texel
|
|
83
86
|
* no ray reached is cleared, radiance to nothing seen, depth to the moments of a miss.
|
|
87
|
+
* - **Stored rounded stochastically** onto halves (`f16_round_stochastic`), with noise fresh for each
|
|
88
|
+
* texel and update. Rounded by the store, a blend whose step is under a ULP would stop short of its
|
|
89
|
+
* target by up to a ULP/α, and below it, since both devices measured round toward zero: on a room
|
|
90
|
+
* glowing evenly, 1.5% at 60 Hz and 5.9% at 240 Hz. Rounded stochastically it moves in expectation.
|
|
84
91
|
*
|
|
85
92
|
* @type {ComputeShader}
|
|
86
93
|
*/
|
|
@@ -94,6 +101,13 @@ fn probe_accumulate_light(ray: ${PROBE_RAY_STRUCT.wgsl_ref}) -> vec3<f32> {
|
|
|
94
101
|
return vec3<f32>(unpack2x16float(ray.light_rg), unpack2x16float(ray.light_b).x);
|
|
95
102
|
}
|
|
96
103
|
|
|
104
|
+
// uniform noise in [0, 1) for a texel's store, fresh each update
|
|
105
|
+
fn probe_accumulate_store_noise(slot: u32, texel: u32, updates: u32) -> vec3<f32> {
|
|
106
|
+
let hash = pcg3d(vec3<u32>(slot, texel, updates));
|
|
107
|
+
|
|
108
|
+
return vec3<f32>(hash_to_float01(hash.x), hash_to_float01(hash.y), hash_to_float01(hash.z));
|
|
109
|
+
}
|
|
110
|
+
|
|
97
111
|
// a ray's depth sample, in spacings: past a miss's, as far as a sample goes
|
|
98
112
|
fn probe_accumulate_depth(ray: ${PROBE_RAY_STRUCT.wgsl_ref}, spacing: f32) -> f32 {
|
|
99
113
|
if ((ray.flags & PROBE_RAY_KIND_MASK) == ${BRICK_TRACE_MISS}u) {
|
|
@@ -168,8 +182,11 @@ fn main(
|
|
|
168
182
|
texel = vec4<f32>(mix(history.rgb, sum / f32(count), alpha), min(history.a + 1.0, ${PROBE_RADIANCE_SAMPLES_LIMIT}.0));
|
|
169
183
|
}
|
|
170
184
|
|
|
171
|
-
|
|
172
|
-
|
|
185
|
+
// the count is whole, which any noise keeps
|
|
186
|
+
let stored = f16_round_stochastic(texel, vec4<f32>(probe_accumulate_store_noise(slot, i, updates), 0.0));
|
|
187
|
+
|
|
188
|
+
probe_maps[maps + 2u * i] = pack2x16float(stored.rg);
|
|
189
|
+
probe_maps[maps + 2u * i + 1u] = pack2x16float(stored.ba);
|
|
173
190
|
probe_maps[maps + 2u * texels + i] = count | (back_faces << 16u);
|
|
174
191
|
|
|
175
192
|
return;
|
|
@@ -249,13 +266,19 @@ fn main(
|
|
|
249
266
|
moments = vec2<f32>(${PROBE_DEPTH_LIMIT}, ${PROBE_DEPTH_LIMIT} * ${PROBE_DEPTH_LIMIT});
|
|
250
267
|
}
|
|
251
268
|
|
|
252
|
-
|
|
269
|
+
let noise = probe_accumulate_store_noise(slot, texels + j, updates);
|
|
270
|
+
let stored = f16_round_stochastic(vec4<f32>(moments, 0.0, 0.0), vec4<f32>(noise.xy, 0.0, 0.0));
|
|
271
|
+
|
|
272
|
+
probe_maps[maps + 3u * texels + j] = pack2x16float(stored.xy);
|
|
253
273
|
}
|
|
254
274
|
`, [
|
|
255
275
|
chunk_probe_clipmap,
|
|
256
276
|
chunk_probe_clipmap_ray_texel,
|
|
257
277
|
chunk_folded_workgroup_index,
|
|
258
278
|
chunk_index_to_grid2d,
|
|
279
|
+
chunk_f16_round_stochastic,
|
|
280
|
+
chunk_pcg3d,
|
|
281
|
+
chunk_hash_to_float01,
|
|
259
282
|
PROBE_RAY_STRUCT.declaration_chunk,
|
|
260
283
|
]),
|
|
261
284
|
});
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts
CHANGED
|
@@ -23,6 +23,9 @@ export const PROBE_ADMIT_SETTINGS: WebGPUStruct;
|
|
|
23
23
|
* free list cannot serve is counted, and the host grows the capacity on it (§7.10's pattern); the
|
|
24
24
|
* point is wanted again the next frame.
|
|
25
25
|
*
|
|
26
|
+
* Either way the probe is marked the screen's when its entry carries `PROBE_WANTED_SCREEN`, and the
|
|
27
|
+
* hits' when it does not, which decides whether its hits want in turn.
|
|
28
|
+
*
|
|
26
29
|
* Retire ran first, so an entry that names a slot names the probe of this very point: the window holds
|
|
27
30
|
* one point a storage cell, and a probe whose point left was freed.
|
|
28
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_probe_clipmap_admit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js"],"names":[],"mappings":"AAuBA;;GAEG;AACH,2CAFU,YAAY,CAKU;AAUhC;;;;;GAKG;AACH,iDAFU,aAAa,CAqBpB;AAEH;;GAEG;AACH,mCAFU,YAAY,CAWG;AAgBzB
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_admit.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js"],"names":[],"mappings":"AAuBA;;GAEG;AACH,2CAFU,YAAY,CAKU;AAUhC;;;;;GAKG;AACH,iDAFU,aAAa,CAqBpB;AAEH;;GAEG;AACH,mCAFU,YAAY,CAWG;AAgBzB;;;;;;;;;;;;;;;;;GAiBG;AACH,yCAFU,aAAa,CAiEpB;6BAvK0B,sCAAsC;8BAHrC,kCAAkC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js
CHANGED
|
@@ -102,6 +102,9 @@ resources.createGroup()
|
|
|
102
102
|
* free list cannot serve is counted, and the host grows the capacity on it (§7.10's pattern); the
|
|
103
103
|
* point is wanted again the next frame.
|
|
104
104
|
*
|
|
105
|
+
* Either way the probe is marked the screen's when its entry carries `PROBE_WANTED_SCREEN`, and the
|
|
106
|
+
* hits' when it does not, which decides whether its hits want in turn.
|
|
107
|
+
*
|
|
105
108
|
* Retire ran first, so an entry that names a slot names the probe of this very point: the window holds
|
|
106
109
|
* one point a storage cell, and a probe whose point left was freed.
|
|
107
110
|
*
|
|
@@ -125,7 +128,9 @@ fn main(
|
|
|
125
128
|
|
|
126
129
|
if (index < min(probe_wanted.count, settings.key_count)) {
|
|
127
130
|
let resolution = settings.resolution;
|
|
128
|
-
let
|
|
131
|
+
let wanted = probe_wanted.elements[index];
|
|
132
|
+
let key = wanted & ~PROBE_WANTED_SCREEN;
|
|
133
|
+
let screen = select(0u, 1u, (wanted & PROBE_WANTED_SCREEN) != 0u);
|
|
129
134
|
let cascade = probe_clipmap_key_cascade(key, resolution);
|
|
130
135
|
let storage = probe_clipmap_key_storage(key, resolution);
|
|
131
136
|
let texel = probe_clipmap_indirection_texel(cascade, storage, resolution);
|
|
@@ -133,6 +138,7 @@ fn main(
|
|
|
133
138
|
|
|
134
139
|
if (entry != PROBE_CLIPMAP_NONE) {
|
|
135
140
|
probe_records[entry].wanted_time = settings.time;
|
|
141
|
+
probe_records[entry].screen = screen;
|
|
136
142
|
} else {
|
|
137
143
|
slot = slot_stack_pop(&probe_counters[PROBE_COUNTER_FREE], &probe_free, settings.capacity);
|
|
138
144
|
|
|
@@ -145,6 +151,7 @@ fn main(
|
|
|
145
151
|
probe_records[slot].wanted_time = settings.time;
|
|
146
152
|
probe_records[slot].traced_time = settings.time;
|
|
147
153
|
probe_records[slot].back_face = 0.0;
|
|
154
|
+
probe_records[slot].screen = screen;
|
|
148
155
|
probe_records[slot].sh.CoCg = vec2<f32>(0.0);
|
|
149
156
|
probe_records[slot].sh.Y = vec4<f32>(0.0);
|
|
150
157
|
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The probe clipmap's deferred diffuse (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §9.2, §9.6): each pixel's
|
|
3
|
+
* irradiance from the probes `probe_clipmap_sample_sh` picks around it, with the frame's STBN for the
|
|
4
|
+
* pick, resolved at its bent normal and multiplied by π, the resolve giving E/π. A pixel no probe weighs
|
|
5
|
+
* anything for takes the environment's irradiance, as the IBL pass would give it. AO multiplies it, as in
|
|
6
|
+
* the IBL pass.
|
|
7
|
+
*
|
|
8
|
+
* @type {ImageShader}
|
|
9
|
+
*/
|
|
10
|
+
export const shader_probe_clipmap_diffuse: ImageShader;
|
|
11
|
+
import { ImageShader } from "../../../shader/ImageShader.js";
|
|
12
|
+
//# sourceMappingURL=shader_probe_clipmap_diffuse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_diffuse.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js"],"names":[],"mappings":"AAgFA;;;;;;;;GAQG;AACH,2CAFU,WAAW,CAalB;4BAtFyB,gCAAgC"}
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_diffuse.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CAMERA_UNIFORM_STRUCT } from "../../../camera/CAMERA_UNIFORM_STRUCT.js";
|
|
2
|
+
import { chunk_get_ibl_irradiance } from "../../../deferred/indirect/chunk_get_ibl_irradiance.js";
|
|
3
|
+
import { DEPTH_STENCIL_FOREGROUND_ONLY } from "../../../depth/DEPTH_STENCIL_FOREGROUND_ONLY.js";
|
|
4
|
+
import { ENVIRONMENT_MAP_RESOURCE } from "../../../light/environment/ENVIRONMENT_MAP_RESOURCE.js";
|
|
5
|
+
import { ENVIRONMENT_MAP_SAMPLER_RESOURCE } from "../../../light/environment/ENVIRONMENT_MAP_SAMPLER_RESOURCE.js";
|
|
6
|
+
import { chunk_project_position_from_depth } from "../../../shader/chunk/camera/chunk_project_position_from_depth.js";
|
|
7
|
+
import { chunk_mat4_extract_position } from "../../../shader/chunk/geometry/mat4/chunk_mat4_extract_position.js";
|
|
8
|
+
import { chunk_decode_g_buffer_normal } from "../../../shader/chunk/geometry/normal/chunk_decode_g_buffer_normal.js";
|
|
9
|
+
import { PI_DECLARATION } from "../../../shader/chunk/math/PI_DECLARATION.js";
|
|
10
|
+
import { chunk_stbn_sample_vec2 } from "../../../shader/chunk/noise/chunk_stbn_sample_vec2.js";
|
|
11
|
+
import {
|
|
12
|
+
chunk_resolve_irradiance_sh_to_diffuse
|
|
13
|
+
} from "../../../shader/chunk/spherical_harmonics/l1i/chunk_resolve_irradiance_sh_to_diffuse.js";
|
|
14
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
15
|
+
import { ImageShader } from "../../../shader/ImageShader.js";
|
|
16
|
+
import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
17
|
+
import { ShaderDescriptor } from "../../../shader/ShaderDescriptor.js";
|
|
18
|
+
import { STBN_VEC2_RESOURCE } from "../../../STATIC_GRAPHICS_ENGINE_ASSET_RESOURCES.js";
|
|
19
|
+
import { VIEW_UNIFORM_STRUCT } from "../../../view/VIEW_UNIFORM_STRUCT.js";
|
|
20
|
+
import { chunk_probe_clipmap_pick, PROBE_CLIPMAP_SAMPLING_GROUP } from "./chunk_probe_clipmap_pick.js";
|
|
21
|
+
|
|
22
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
23
|
+
|
|
24
|
+
resources.createGroup()
|
|
25
|
+
.addTexture("tDepth")
|
|
26
|
+
.addTexture("tNormals", "uint")
|
|
27
|
+
.addTexture("tBentNormals", "uint")
|
|
28
|
+
.addTexture("tGBufferAlbedo")
|
|
29
|
+
.add(STBN_VEC2_RESOURCE)
|
|
30
|
+
.addUniform("view", VIEW_UNIFORM_STRUCT)
|
|
31
|
+
.addUniform("camera", CAMERA_UNIFORM_STRUCT)
|
|
32
|
+
.add(ENVIRONMENT_MAP_RESOURCE)
|
|
33
|
+
.add(ENVIRONMENT_MAP_SAMPLER_RESOURCE);
|
|
34
|
+
|
|
35
|
+
// the whole group the GI hands its readers: a graph pass must declare every input it is given
|
|
36
|
+
resources.addGroup(PROBE_CLIPMAP_SAMPLING_GROUP);
|
|
37
|
+
|
|
38
|
+
const body = CodeChunk.from(
|
|
39
|
+
//language=WGSL
|
|
40
|
+
`
|
|
41
|
+
@fragment
|
|
42
|
+
fn main(
|
|
43
|
+
@builtin(position) coord: vec4<f32>,
|
|
44
|
+
@location(0) uv: vec2<f32>,
|
|
45
|
+
) -> @location(0) vec4<f32> {
|
|
46
|
+
let i_coord = vec2<u32>(coord.xy);
|
|
47
|
+
|
|
48
|
+
let depth = textureLoad(tDepth, i_coord, 0).r;
|
|
49
|
+
let position = project_position_from_depth(uv, depth, camera.view_projection_matrix_inverse);
|
|
50
|
+
let view_direction = normalize(mat4_extract_position(camera.transform) - position);
|
|
51
|
+
|
|
52
|
+
// the surface's own normal picks, as want chose by it; the bent normal resolves, as IBL's does
|
|
53
|
+
let normal = decode_g_buffer_normal(textureLoad(tNormals, i_coord, 0).xy);
|
|
54
|
+
let bent_normal = decode_g_buffer_normal(textureLoad(tBentNormals, i_coord, 0).xy);
|
|
55
|
+
|
|
56
|
+
let noise = stbn_sample_vec2(vec3<u32>(i_coord, view.frame_index));
|
|
57
|
+
let probes = probe_clipmap_sample_sh(position, normal, view_direction, noise);
|
|
58
|
+
|
|
59
|
+
var irradiance = get_ibl_irradiance(bent_normal);
|
|
60
|
+
|
|
61
|
+
if (probes.found) {
|
|
62
|
+
irradiance = PI * resolve_irradiance_sh_to_diffuse(probes.sh.Y, probes.sh.CoCg, bent_normal);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// AO baked in at the source, as the IBL pass does, so the resolve need not know which path ran
|
|
66
|
+
let occlusion = textureLoad(tGBufferAlbedo, i_coord, 0).a;
|
|
67
|
+
|
|
68
|
+
return vec4<f32>(irradiance * occlusion, 0.0);
|
|
69
|
+
}
|
|
70
|
+
`, [
|
|
71
|
+
chunk_project_position_from_depth,
|
|
72
|
+
chunk_mat4_extract_position,
|
|
73
|
+
chunk_decode_g_buffer_normal,
|
|
74
|
+
chunk_stbn_sample_vec2,
|
|
75
|
+
chunk_probe_clipmap_pick,
|
|
76
|
+
chunk_resolve_irradiance_sh_to_diffuse,
|
|
77
|
+
chunk_get_ibl_irradiance,
|
|
78
|
+
PI_DECLARATION,
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The probe clipmap's deferred diffuse (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §9.2, §9.6): each pixel's
|
|
83
|
+
* irradiance from the probes `probe_clipmap_sample_sh` picks around it, with the frame's STBN for the
|
|
84
|
+
* pick, resolved at its bent normal and multiplied by π, the resolve giving E/π. A pixel no probe weighs
|
|
85
|
+
* anything for takes the environment's irradiance, as the IBL pass would give it. AO multiplies it, as in
|
|
86
|
+
* the IBL pass.
|
|
87
|
+
*
|
|
88
|
+
* @type {ImageShader}
|
|
89
|
+
*/
|
|
90
|
+
export const shader_probe_clipmap_diffuse = ImageShader.from({
|
|
91
|
+
descriptor: ShaderDescriptor.from({
|
|
92
|
+
label: "Probe Clipmap / Indirect Diffuse",
|
|
93
|
+
resources,
|
|
94
|
+
body,
|
|
95
|
+
}),
|
|
96
|
+
depthStencil: DEPTH_STENCIL_FOREGROUND_ONLY,
|
|
97
|
+
targets: [{
|
|
98
|
+
label: "Diffuse Indirect lighting",
|
|
99
|
+
format: "rgba16float"
|
|
100
|
+
}]
|
|
101
|
+
});
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ 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
7
|
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due
|
|
8
|
-
* when a pixel wanted it this frame, its point's bit set, and:
|
|
8
|
+
* when a pixel or a hit wanted it this frame, its point's bit set, and:
|
|
9
9
|
* - it is NEW, in the first pass, which lists them first;
|
|
10
10
|
* - in the second pass, it is ALIVE and `(frame + h(slot)) mod T` is 0, or DEAD and
|
|
11
11
|
* `(frame + h(slot)) mod 8T` is 0, so that a probe inside a solid notices when the scene changes.
|
package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js
CHANGED
|
@@ -48,7 +48,7 @@ resources.createGroup()
|
|
|
48
48
|
/**
|
|
49
49
|
* Due (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §8.5): a thread an entry of the frame's active list,
|
|
50
50
|
* dispatched twice through `PROBE_DISPATCH_ACTIVE` after schedule has set the period T. A probe is due
|
|
51
|
-
* when a pixel wanted it this frame, its point's bit set, and:
|
|
51
|
+
* when a pixel or a hit wanted it this frame, its point's bit set, and:
|
|
52
52
|
* - it is NEW, in the first pass, which lists them first;
|
|
53
53
|
* - in the second pass, it is ALIVE and `(frame + h(slot)) mod T` is 0, or DEAD and
|
|
54
54
|
* `(frame + h(slot)) mod 8T` is 0, so that a probe inside a solid notices when the scene changes.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The probe clipmap's deferred indirect light in one pass (PROBE_CLIPMAP_PROPOSAL_2026_10_27.md §9.6), for SSR
|
|
3
|
+
* off: one pick a pixel, by its own normal and the view, with the frame's STBN, for both lobes.
|
|
4
|
+
* - The diffuse is `shader_probe_clipmap_diffuse`'s: the picked SH resolved at the bent normal, times π. Its
|
|
5
|
+
* shares are the pick's, not re-weighted for the bent normal, so SSR on and off light the diffuse alike.
|
|
6
|
+
* - The specular is the pick's radiance (`probe_clipmap_radiance_of`), its shares re-weighted for the lobe.
|
|
7
|
+
* - A pixel no probe weighs anything for takes the environment's for both.
|
|
8
|
+
* - The two are resolved as `shader_resolve_indirect_lighting` resolves the IBL pair: AO multiplies the
|
|
9
|
+
* diffuse, the specular is occluded along its lobe, and the result is added to the scene's colour.
|
|
10
|
+
*
|
|
11
|
+
* @type {ImageShader}
|
|
12
|
+
*/
|
|
13
|
+
export const shader_probe_clipmap_indirect_lighting: ImageShader;
|
|
14
|
+
import { ImageShader } from "../../../shader/ImageShader.js";
|
|
15
|
+
//# sourceMappingURL=shader_probe_clipmap_indirect_lighting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader_probe_clipmap_indirect_lighting.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_indirect_lighting.js"],"names":[],"mappings":"AA0IA;;;;;;;;;;;GAWG;AACH,qDAFU,WAAW,CA0BlB;4BAxJyB,gCAAgC"}
|