@woosh/meep-engine 3.47.0 → 3.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-terrain.js +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +1 -2
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -1
- package/editor/particles/effect/ParticleReferenceSimulation.js +2 -4
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
- package/package.json +1 -1
- package/src/engine/ecs/async/WORKER_SYSTEM_PLAN.md +27 -11
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +11 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +2 -2
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +7 -7
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +8 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +11 -3
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts +26 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationUpgrader_1_2.js +91 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +2 -2
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +8 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts +84 -1
- package/src/engine/graphics3/ParticipatingMedia.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMedia.js +139 -5
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts +6 -2
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSerializationAdapter.js +29 -4
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts +10 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.d.ts.map +1 -0
- package/src/engine/graphics3/ParticipatingMediaSerializationUpgrader_0_1.js +38 -0
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem.js +46 -3
- package/src/engine/network/NetworkSession.d.ts +16 -5
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +104 -7
- package/src/engine/network/README.md +27 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +40 -18
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +180 -190
- package/src/engine/network/replication/Replicator.d.ts +15 -4
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +50 -16
- package/src/engine/network/state/RecordArrivalRing.d.ts +57 -0
- package/src/engine/network/state/RecordArrivalRing.d.ts.map +1 -0
- package/src/engine/network/state/RecordArrivalRing.js +144 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +354 -0
- package/src/engine/physics/cloth/PLAN.md +85 -5
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +0 -12
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +0 -13
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +7 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +4 -15
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +2 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +6 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +20 -10
- package/src/engine/physics/cloth/playground/collide.html +5 -3
- package/src/engine/physics/cloth/playground/collide_main.js +14 -13
- package/src/engine/physics/cloth/solver/ClothState.d.ts +30 -2
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +62 -4
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +11 -3
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_self_find.js +52 -11
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts +42 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_self_radius.js +64 -0
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +99 -24
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +102 -25
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +5 -1
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +13 -3
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +0 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +12 -14
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +23 -4
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +36 -8
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +4 -2
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +15 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +21 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts +20 -0
- package/src/shade/device/pipeline/ComputePipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/ComputePipelineManager.js +80 -6
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts +52 -0
- package/src/shade/device/pipeline/PipelineEnquiry.d.ts.map +1 -0
- package/src/shade/device/pipeline/PipelineEnquiry.js +63 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts +21 -0
- package/src/shade/device/pipeline/RenderPipelineManager.d.ts.map +1 -1
- package/src/shade/device/pipeline/RenderPipelineManager.js +84 -4
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts +137 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/ContactShadowLab.js +654 -0
- package/src/shade/playground/contact_shadows/README.md +126 -0
- package/src/shade/playground/contact_shadows/index.html +191 -0
- package/src/shade/playground/contact_shadows/main.d.ts +2 -0
- package/src/shade/playground/contact_shadows/main.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/main.js +888 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts +48 -0
- package/src/shade/playground/contact_shadows/scenes.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/scenes.js +620 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts +36 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_composite.js +245 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts +15 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_reference.js +120 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts +55 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_stats.js +216 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts +20 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_lab_view.js +114 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts +11 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/shader_contact_shadow_march.js +90 -0
- package/src/shade/playground/contact_shadows/textures.d.ts +16 -0
- package/src/shade/playground/contact_shadows/textures.d.ts.map +1 -0
- package/src/shade/playground/contact_shadows/textures.js +123 -0
- package/src/shade/playground/particle_ecs/README.md +1 -1
- package/src/shade/playground/particle_ecs/effects/flame.json +1932 -1881
- package/src/shade/playground/particle_ecs/effects/smoke.json +99 -1
- package/src/shade/playground/particle_ecs/effects/soot.json +152 -145
- package/src/shade/playground/tonemap_sdr/README.md +90 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts +105 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/ToneMapCompare.js +380 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts +32 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/chunk_tonemap_gt7_sdr_reference.js +104 -0
- package/src/shade/playground/tonemap_sdr/index.html +90 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts +2 -0
- package/src/shade/playground/tonemap_sdr/main.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/main.js +306 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts +26 -0
- package/src/shade/playground/tonemap_sdr/scenes.d.ts.map +1 -0
- package/src/shade/playground/tonemap_sdr/scenes.js +404 -0
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +85 -4
- package/src/shade/playground/water_refraction/README.md +26 -18
- package/src/shade/playground/water_refraction/index.html +1 -1
- package/src/shade/renderer/Renderer.d.ts +35 -3
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +208 -12
- package/src/shade/renderer/ShadeToneMappingMode.d.ts +14 -0
- package/src/shade/renderer/ShadeToneMappingMode.d.ts.map +1 -0
- package/src/shade/renderer/ShadeToneMappingMode.js +30 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +9 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +14 -0
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +5 -3
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +7 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +12 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts +8 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +12 -0
- package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
- package/src/shade/renderer/camera/GPUCameraContext.js +19 -8
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_read_gBuffer_material.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +4 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_restir.js +4 -0
- package/src/shade/renderer/deferred/shader_deferred_main.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_deferred_main.js +3 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_HDR.js +13 -3
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_none.js +63 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_HDR_pbr_neutral.js +87 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts +6 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR.d.ts.map +1 -1
- package/src/shade/renderer/deferred/shader_tonemap_LDR.js +23 -5
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts +9 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_none.js +68 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts +10 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.d.ts.map +1 -0
- package/src/shade/renderer/deferred/shader_tonemap_LDR_pbr_neutral.js +73 -0
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +58 -9
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +35 -25
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +97 -196
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +121 -129
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +3 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/draw/shader_brick4_indirect_lighting.js +4 -0
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +3 -0
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/deprecated/probe_trace_compute_shader_code.js +4 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_sample_light_probes.js +4 -0
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/shader_resolve_indirect_lighting.js +4 -0
- package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +131 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts +7 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_delta.js +45 -38
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_determine_range.js +81 -79
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts +2 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_find_split.js +5 -3
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts +21 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_internal_children.js +42 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts +19 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/chunk_bvh_morton_code.js +44 -0
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts +23 -5
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +139 -23
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_build_single_workgroup.js +179 -0
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts +2 -2
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +7 -16
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts +3 -4
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +6 -23
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +11 -0
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +14 -3
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/build_indirect_draw_command.js +13 -3
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js +14 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts +26 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_comparator.js +52 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts +32 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_bitonic_workgroup.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +20 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts +10 -0
- package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
- package/src/shade/renderer/hiz/HierarchicalZBuffer.js +294 -281
- package/src/shade/renderer/light/GPULightCollection.d.ts +8 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +18 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts +8 -0
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +234 -218
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_assign_clsuters.js +13 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts +7 -0
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/graph_build_light_clusters.js +16 -2
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts +10 -0
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +13 -0
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +3 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +4 -0
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +4 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +16 -4
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +38 -8
- package/src/shade/renderer/particles/DESIGN.md +49 -7
- package/src/shade/renderer/particles/ORIENTATION_PLAN_2026_10_15.md +453 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +5 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +13 -5
- package/src/shade/renderer/particles/data/particle_emitter_record.js +2 -2
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +12 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +60 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +156 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +2 -2
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +8 -8
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +6 -4
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts +7 -6
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +91 -58
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +10 -0
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +5 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +6 -0
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts +7 -0
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/bloom/graph_postprocess_bloom.js +18 -0
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/LigmaDenoiser.js +1 -0
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +6 -4
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts +11 -0
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +16 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts +10 -0
- package/src/shade/renderer/postprocess/gtao/GTAO.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/GTAO.js +16 -0
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +32 -10
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +3 -0
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/build_ssr_resolve_shader.js +6 -3
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +12 -0
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +15 -0
- package/src/shade/renderer/postprocess/velocity/graph_add_per_object_velocity.d.ts +7 -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 +13 -0
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +31 -3
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +79 -4
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts +17 -0
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/graph_meshlets_rasterize_by_bucket.js +35 -4
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts +7 -0
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/compute/graph_mesh_frustum_cull.js +182 -169
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +20 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_extract_meshlets_from_bucket.js +18 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +20 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts +7 -0
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_mesh_filter_one_way.js +187 -170
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +19 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts +13 -0
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +25 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts +10 -0
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/graph_expand_meshes_to_meshlets.js +20 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +3 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +7 -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 +12 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +4 -3
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +4 -3
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts +2 -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 +11 -3
- 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 +4 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -3
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +15 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +35 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts +14 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +32 -4
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +17 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +34 -4
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts +5 -3
- package/src/shade/renderer/restir/di/chunk_restir_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/chunk_restir_resolve.js +8 -3
- package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/graph_restir_di.js +1 -0
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
- package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +5 -1
- package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
- package/src/shade/renderer/restir/reservoir/shader.js +7 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +7 -0
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +13 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +10 -0
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +19 -0
- package/src/shade/renderer/scene/SceneManager.d.ts +9 -0
- package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
- package/src/shade/renderer/scene/SceneManager.js +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_nodes_update_transform_hierarchy.js +17 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +11 -0
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +18 -1
- package/src/shade/renderer/shader/ComputeShader.d.ts +12 -0
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +53 -0
- package/src/shade/renderer/shader/ImageShader.d.ts +27 -8
- package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ImageShader.js +70 -1
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts +21 -0
- package/src/shade/renderer/shader/ShaderDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/ShaderDescriptor.js +71 -1
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_project_view_position_from_depth.js +45 -0
- package/src/shade/renderer/shader/chunk/camera/chunk_screen_coordinate_to_view.js +3 -3
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.d.ts +1 -1
- package/src/shade/renderer/shader/chunk/color/iCtCp/chunk_eotf_st2084.js +62 -62
- package/src/shade/renderer/shader/chunk/color/tonemap/HDR_TONE_MAPPING_FORMS_BRIEF_2026_10_16.md +318 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/SDR_TONE_MAPPING_BRIEF_2026_10_16.md +237 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_PAPER_WHITE_NITS.js +22 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts +14 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_khronos_pbr.js +28 -15
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/gt7/chunk_tonemap_gt7.js +128 -110
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/ray/chunk_offset_ray_from_depth.js +33 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts +4 -0
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/chunk_compute_multiscattering_specular.js +12 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/MATERIAL_SHADING_INFO_STRUCT.js +7 -0
- package/src/shade/renderer/shader/chunk/material/MULTISCATTER.md +108 -0
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_compute_indirect_specular.js +23 -4
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts +18 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_direct_multiscatter.js +56 -0
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/material/chunk_re_indirect_specular_physical.js +2 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/screen_space/chunk_screen_space_linear_ray.js +319 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts +33 -0
- package/src/shade/renderer/shader/compiler/CodeChunk.d.ts.map +1 -1
- package/src/shade/renderer/shader/compiler/CodeChunk.js +140 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts +74 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/CodeChunkChoice.js +166 -0
- package/src/shade/renderer/shader/compiler/SHADER_SWITCH_PROPOSAL_2026_10_16.md +680 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts +86 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitch.js +178 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts +67 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.d.ts.map +1 -0
- package/src/shade/renderer/shader/compiler/ShaderSwitchSet.js +205 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts +14 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/CONTACT_SHADOW_WAVE_SIZE.js +13 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts +65 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/ContactShadowDispatchList.js +252 -0
- package/src/shade/renderer/shadow/contact/FINDINGS.md +413 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/chunk_contact_shadow_wavefront_extents.js +105 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_linear.js +39 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/graph_contact_shadow_wavefront.js +92 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts +29 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_linear.js +128 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts +52 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.d.ts.map +1 -0
- package/src/shade/renderer/shadow/contact/shader_contact_shadow_wavefront.js +358 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts +10 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/ShadowDirectionalTechnique.js +12 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts +13 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.js +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts +14 -8
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js +20 -86
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts +14 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.js +79 -0
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/shader_ray_shadow_code.js +12 -12
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
- package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +153 -151
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts +13 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.d.ts.map +1 -0
- package/src/shade/renderer/shadow/vsm/shader/chunk_shadowmap_sample_directional_virtual.js +48 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts +10 -0
- package/src/shade/renderer/texture/GPUTextureContext.d.ts.map +1 -1
- package/src/shade/renderer/texture/GPUTextureContext.js +24 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts +219 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.d.ts.map +1 -0
- package/src/shade/renderer/texture/atlas/GPUTileAtlas3D.js +671 -0
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts +26 -2
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUSceneVolumetrics.js +108 -4
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts +5 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +6 -0
- package/src/shade/renderer/volumetrics/NOTES.md +50 -0
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/PARTICIPATING_MEDIA_VOLUME_STRUCT.js +30 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +51 -13
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +98 -13
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts +9 -0
- package/src/shade/renderer/volumetrics/SceneVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/SceneVolumetrics.js +78 -68
- package/src/shade/renderer/volumetrics/VOLUMETRIC_NOISE_PLAN_2026_10_15.md +326 -0
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts +7 -4
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_participating_media_volume_sample.js +21 -9
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts +19 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_froxel_uvw_from_clip.js +53 -0
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts +12 -3
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/chunk_volumetrics_sample_froxel_extinction.js +85 -48
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_froxel_irradiance.js +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts +4 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +21 -1
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts +98 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/PARTICIPATING_MEDIA_NOISE.js +115 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts +9 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/VOLUMETRICS_NOISE_TILE_BAKE_SETTINGS_STRUCT.js +24 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts +27 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/bake_volumetrics_noise_tile.js +91 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts +35 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/chunk_participating_media_noise.js +92 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts +10 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.d.ts.map +1 -0
- package/src/shade/renderer/volumetrics/noise/shader_volumetrics_noise_tile_bake.js +121 -0
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_participating_media.js +38 -3
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_sun_shadow_volume.js +311 -290
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/volumetrics_position_world_to_froxel_uvw.js +28 -49
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts +3 -1
- package/src/shade/renderer/water/GPUWaterRenderer.d.ts.map +1 -1
- package/src/shade/renderer/water/GPUWaterRenderer.js +24 -18
- package/src/shade/renderer/water/chunk_water_transport.d.ts +0 -1
- package/src/shade/renderer/water/chunk_water_transport.d.ts.map +1 -1
- package/src/shade/renderer/water/chunk_water_transport.js +0 -17
- package/src/shade/renderer/water/shader_water.d.ts +4 -2
- package/src/shade/renderer/water/shader_water.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water.js +27 -16
- package/src/shade/renderer/water/shader_water_avboit.d.ts +0 -4
- package/src/shade/renderer/water/shader_water_avboit.d.ts.map +1 -1
- package/src/shade/renderer/water/shader_water_avboit.js +0 -63
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +43 -9
- package/src/engine/network/transport/Channel.d.ts +0 -85
- package/src/engine/network/transport/Channel.d.ts.map +0 -1
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts +0 -155
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +0 -105
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts +0 -103
- package/src/engine/network/transport/fragments/FragmentRetention.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/fragment_send.d.ts +0 -61
- package/src/engine/network/transport/fragments/fragment_send.d.ts.map +0 -1
- package/src/engine/network/transport/fragments/packet_size.d.ts +0 -99
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts +0 -6
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/sRGB/chunk_RRTAndODTFit.js +0 -16
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_aces.js +0 -46
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts +0 -10
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_agx.js +0 -127
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts +0 -7
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.d.ts.map +0 -1
- package/src/shade/renderer/shader/chunk/color/tonemap/chunk_tonemap_pbr_neutral.js +0 -39
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
2
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
3
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
4
|
+
import { f32, u32, vec2i, vec4f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
5
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
6
|
+
import { chunk_contact_shadow_wavefront_extents } from "./chunk_contact_shadow_wavefront_extents.js";
|
|
7
|
+
import { CONTACT_SHADOW_WAVE_SIZE } from "./CONTACT_SHADOW_WAVE_SIZE.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Bits of {@link CONTACT_SHADOW_SETTINGS_STRUCT}'s `flags`.
|
|
11
|
+
* @enum {number}
|
|
12
|
+
*/
|
|
13
|
+
export const ContactShadowFlags = {
|
|
14
|
+
/**
|
|
15
|
+
* A depth read the edge test calls an edge casts no shadow (Bend's `IgnoreEdgePixels`). Removes the
|
|
16
|
+
* striation a grazing flat surface gets where its own depth steps read as edges, and thins real
|
|
17
|
+
* shadows, foliage edges especially.
|
|
18
|
+
*/
|
|
19
|
+
IgnoreEdgePixels: 1,
|
|
20
|
+
/**
|
|
21
|
+
* Push the starting depth away from the camera by 1/65535 of the depth (Bend's
|
|
22
|
+
* `UsePrecisionOffset`), for a depth buffer too coarse to compare against itself.
|
|
23
|
+
*/
|
|
24
|
+
PrecisionOffset: 2,
|
|
25
|
+
/**
|
|
26
|
+
* Interpolate the reads toward the ray itself, using the same depth to start from and to cast from
|
|
27
|
+
* (Bend's `BilinearSamplingOffsetMode`). Off: start at pixel centres and cast from a depth pushed
|
|
28
|
+
* back by the step across the pixel, which Bend default to.
|
|
29
|
+
*/
|
|
30
|
+
BilinearOffsetMode: 4,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* What {@link CONTACT_SHADOW_SETTINGS_STRUCT}'s `debug_mode` writes instead of the shadow.
|
|
35
|
+
* @enum {number}
|
|
36
|
+
*/
|
|
37
|
+
export const ContactShadowDebugMode = {
|
|
38
|
+
None: 0,
|
|
39
|
+
/** 1 where the pixel's own read was taken as an edge, for tuning `bilinear_threshold`. */
|
|
40
|
+
EdgeMask: 1,
|
|
41
|
+
/** The thread's position in its wave, 0 to 1 along the ray. */
|
|
42
|
+
ThreadIndex: 2,
|
|
43
|
+
/** Which wave along the ring edge, cycling every {@link CONTACT_SHADOW_WAVE_SIZE}. */
|
|
44
|
+
WaveIndex: 3,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Per dispatch, as immediates: the light's coordinate and the dispatch's wave offset from
|
|
49
|
+
* {@link ContactShadowDispatchList}, and the tuning.
|
|
50
|
+
*
|
|
51
|
+
* - `surface_thickness`: how thick each depth sample is taken to be, as a fraction of its device
|
|
52
|
+
* depth. With this engine's reverse-Z infinite projection (device depth = near / view depth) a sample
|
|
53
|
+
* shadows the ray when it is in front of it by up to twice this fraction of its own view distance
|
|
54
|
+
* (Bend's `SurfaceThickness`; their starting value 0.005 is 1% of the distance).
|
|
55
|
+
* - `bilinear_threshold`: two depths further apart than this fraction of the nearer one are an edge,
|
|
56
|
+
* and are not interpolated across (`BilinearThreshold`).
|
|
57
|
+
* - `shadow_contrast`: the slope of the transition in and out of the thickness window
|
|
58
|
+
* (`ShadowContrast`); a sample is fully shadowing over the middle `1 − 2 / contrast` of it.
|
|
59
|
+
*
|
|
60
|
+
* @type {WebGPUStruct}
|
|
61
|
+
*/
|
|
62
|
+
export const CONTACT_SHADOW_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
63
|
+
light_coordinate: vec4f,
|
|
64
|
+
wave_offset: vec2i,
|
|
65
|
+
surface_thickness: f32,
|
|
66
|
+
bilinear_threshold: f32,
|
|
67
|
+
shadow_contrast: f32,
|
|
68
|
+
flags: u32,
|
|
69
|
+
debug_mode: u32,
|
|
70
|
+
}, "ContactShadowSettings");
|
|
71
|
+
|
|
72
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
73
|
+
|
|
74
|
+
resources.setImmediate("settings", CONTACT_SHADOW_SETTINGS_STRUCT);
|
|
75
|
+
|
|
76
|
+
resources.createGroup()
|
|
77
|
+
.addTexture("tDepth")
|
|
78
|
+
.addStorageTexture("tContactShadow", "r32float", "2d", "write-only");
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Samples each pixel tests along its ray toward the light, one pixel apart on the ray's major axis
|
|
82
|
+
* (Bend's `SAMPLE_COUNT`). This is the shadow's reach in pixels and the thread's whole budget: a
|
|
83
|
+
* thread reads {@link READ_COUNT} × 2 depths and this many words of workgroup memory, whatever the scene.
|
|
84
|
+
* @type {number}
|
|
85
|
+
*/
|
|
86
|
+
const SAMPLE_COUNT = 60;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The first samples, any one of which may shadow the pixel fully (`HARD_SHADOW_SAMPLES`); the rest
|
|
90
|
+
* are reduced in four interleaved sets and averaged, so one depth sample cannot fully shadow a pixel
|
|
91
|
+
* from further away.
|
|
92
|
+
* @type {number}
|
|
93
|
+
*/
|
|
94
|
+
const HARD_SHADOW_SAMPLES = 4;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The last samples, which shadow progressively less, so the reach ends in a fade rather than a cut
|
|
98
|
+
* (`FADE_OUT_SAMPLES`).
|
|
99
|
+
* @type {number}
|
|
100
|
+
*/
|
|
101
|
+
const FADE_OUT_SAMPLES = 8;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Reads per thread. Thread t's samples are workgroup words t + 1 … t + {@link SAMPLE_COUNT}, so the
|
|
105
|
+
* workgroup holds SAMPLE_COUNT + WAVE_SIZE words, rounded up to whole waves: two, while the reach stays
|
|
106
|
+
* within one wave.
|
|
107
|
+
* @type {number}
|
|
108
|
+
*/
|
|
109
|
+
const READ_COUNT = Math.ceil((SAMPLE_COUNT + CONTACT_SHADOW_WAVE_SIZE) / CONTACT_SHADOW_WAVE_SIZE);
|
|
110
|
+
|
|
111
|
+
if (READ_COUNT !== 2) {
|
|
112
|
+
throw new Error(`the shader reads twice per thread; SAMPLE_COUNT ${SAMPLE_COUNT} needs ${READ_COUNT}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (HARD_SHADOW_SAMPLES % 4 !== 0 || FADE_OUT_SAMPLES % 4 !== 0 || SAMPLE_COUNT % 4 !== 0) {
|
|
116
|
+
// the four interleaved reductions are walked four samples at a time, never by a dynamic lane index
|
|
117
|
+
throw new Error('sample counts must be multiples of 4');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const body = CodeChunk.from(
|
|
121
|
+
//language=WGSL
|
|
122
|
+
`
|
|
123
|
+
const WAVE_SIZE = ${CONTACT_SHADOW_WAVE_SIZE}u;
|
|
124
|
+
const SAMPLE_COUNT = ${SAMPLE_COUNT}u;
|
|
125
|
+
const HARD_SHADOW_SAMPLES = ${HARD_SHADOW_SAMPLES}u;
|
|
126
|
+
const FADE_OUT_SAMPLES = ${FADE_OUT_SAMPLES}u;
|
|
127
|
+
|
|
128
|
+
// reverse-Z: the far plane is 0 in the depth buffer, the near plane 1
|
|
129
|
+
const FAR_DEPTH = 0.0;
|
|
130
|
+
const Z_SIGN = -1.0;
|
|
131
|
+
|
|
132
|
+
// a depth that can shadow nothing: an edge read with edges ignored, a read past the light
|
|
133
|
+
const NO_SHADOW_DEPTH = 1e20;
|
|
134
|
+
|
|
135
|
+
const FLAG_IGNORE_EDGE_PIXELS = ${ContactShadowFlags.IgnoreEdgePixels}u;
|
|
136
|
+
const FLAG_PRECISION_OFFSET = ${ContactShadowFlags.PrecisionOffset}u;
|
|
137
|
+
const FLAG_BILINEAR_OFFSET_MODE = ${ContactShadowFlags.BilinearOffsetMode}u;
|
|
138
|
+
|
|
139
|
+
var<workgroup> depth_data: array<f32, ${READ_COUNT * CONTACT_SHADOW_WAVE_SIZE}>;
|
|
140
|
+
|
|
141
|
+
struct ContactShadowRead {
|
|
142
|
+
// the depth the pixel starts its ray from
|
|
143
|
+
sampling_depth: f32,
|
|
144
|
+
// the depth this read casts from
|
|
145
|
+
shadowing_depth: f32,
|
|
146
|
+
// the read's distance from the far plane, in device depth: what thresholds are fractions of
|
|
147
|
+
thickness_scale: f32,
|
|
148
|
+
is_edge: bool,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Off-screen reads return the far plane, which shadows nothing (Bend's clamp-to-border sampler).
|
|
153
|
+
*/
|
|
154
|
+
fn contact_shadow_load_depth(xy: vec2<i32>, size: vec2<i32>) -> f32 {
|
|
155
|
+
if (any(xy < vec2<i32>(0)) || any(xy >= size)) {
|
|
156
|
+
return FAR_DEPTH;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return textureLoad(tDepth, xy, 0).r;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Two point reads across the ray's minor axis, interpolated unless they straddle an edge.
|
|
164
|
+
*/
|
|
165
|
+
fn contact_shadow_read(pixel_xy: vec2<f32>, major_axis_x: bool, size: vec2<i32>) -> ContactShadowRead {
|
|
166
|
+
let read_xy = vec2<i32>(floor(pixel_xy));
|
|
167
|
+
let minor_axis = select(pixel_xy.x, pixel_xy.y, major_axis_x);
|
|
168
|
+
|
|
169
|
+
var bilinear = fract(minor_axis) - 0.5;
|
|
170
|
+
|
|
171
|
+
let bias = select(-1, 1, bilinear > 0.0);
|
|
172
|
+
let offset_xy = select(vec2<i32>(bias, 0), vec2<i32>(0, bias), major_axis_x);
|
|
173
|
+
|
|
174
|
+
let depth_x = contact_shadow_load_depth(read_xy, size);
|
|
175
|
+
let depth_y = contact_shadow_load_depth(read_xy + offset_xy, size);
|
|
176
|
+
|
|
177
|
+
var result: ContactShadowRead;
|
|
178
|
+
|
|
179
|
+
result.thickness_scale = abs(FAR_DEPTH - depth_x);
|
|
180
|
+
|
|
181
|
+
let use_point_filter = abs(depth_x - depth_y) > result.thickness_scale * settings.bilinear_threshold;
|
|
182
|
+
|
|
183
|
+
result.is_edge = use_point_filter;
|
|
184
|
+
|
|
185
|
+
let ignore_edges = (settings.flags & FLAG_IGNORE_EDGE_PIXELS) != 0u;
|
|
186
|
+
|
|
187
|
+
if ((settings.flags & FLAG_BILINEAR_OFFSET_MODE) != 0u) {
|
|
188
|
+
bilinear = select(bilinear, 0.0, use_point_filter);
|
|
189
|
+
|
|
190
|
+
result.sampling_depth = mix(depth_x, depth_y, abs(bilinear));
|
|
191
|
+
result.shadowing_depth = select(result.sampling_depth, NO_SHADOW_DEPTH, ignore_edges && use_point_filter);
|
|
192
|
+
} else {
|
|
193
|
+
result.sampling_depth = depth_x;
|
|
194
|
+
|
|
195
|
+
let edge_depth = select(depth_x, NO_SHADOW_DEPTH, ignore_edges);
|
|
196
|
+
|
|
197
|
+
// any sample on this ray may sit anywhere between the two reads, so cast from the further one
|
|
198
|
+
let shadow_depth = depth_x + abs(depth_x - depth_y) * Z_SIGN;
|
|
199
|
+
|
|
200
|
+
result.shadowing_depth = select(shadow_depth, edge_depth, use_point_filter);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@compute @workgroup_size(${CONTACT_SHADOW_WAVE_SIZE}, 1, 1)
|
|
207
|
+
fn main(
|
|
208
|
+
@builtin(workgroup_id) group_id: vec3<u32>,
|
|
209
|
+
@builtin(local_invocation_index) thread_id: u32,
|
|
210
|
+
) {
|
|
211
|
+
let wave = contact_shadow_wavefront_extents(settings.light_coordinate, settings.wave_offset, group_id, thread_id);
|
|
212
|
+
|
|
213
|
+
let size = vec2<i32>(textureDimensions(tDepth));
|
|
214
|
+
let light_depth = settings.light_coordinate.z;
|
|
215
|
+
|
|
216
|
+
// toward the light's point when it is in front of the camera, away from it when it is behind
|
|
217
|
+
let direction = -settings.light_coordinate.w;
|
|
218
|
+
|
|
219
|
+
let write_xy = vec2<i32>(floor(wave.pixel_xy));
|
|
220
|
+
|
|
221
|
+
// this pixel, then the pixel a wave further along the ray
|
|
222
|
+
let read_0 = contact_shadow_read(wave.pixel_xy, wave.major_axis_x, size);
|
|
223
|
+
let read_1 = contact_shadow_read(wave.pixel_xy + wave.delta_xy * direction, wave.major_axis_x, size);
|
|
224
|
+
|
|
225
|
+
let distance_0 = wave.pixel_distance;
|
|
226
|
+
let distance_1 = wave.pixel_distance + f32(WAVE_SIZE) * direction;
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
Divided by the distance to the light, every ray to it is parallel: device depth along a screen
|
|
230
|
+
line toward the light's projection is linear in the distance to it, so (depth − light depth) /
|
|
231
|
+
distance is constant along a ray and a sample only has to be compared with the pixel's own value.
|
|
232
|
+
A second read that has run past the light can shadow nothing.
|
|
233
|
+
*/
|
|
234
|
+
depth_data[thread_id] = (read_0.shadowing_depth - light_depth) / distance_0;
|
|
235
|
+
depth_data[WAVE_SIZE + thread_id] = select(NO_SHADOW_DEPTH, (read_1.shadowing_depth - light_depth) / distance_1, distance_1 > 0.0);
|
|
236
|
+
|
|
237
|
+
workgroupBarrier();
|
|
238
|
+
|
|
239
|
+
if (wave.covers_light) {
|
|
240
|
+
// a ray of no length: nothing on screen can stand between the pixel and the light
|
|
241
|
+
let light_xy = vec2<i32>(floor(settings.light_coordinate.xy));
|
|
242
|
+
|
|
243
|
+
if (all(light_xy >= vec2<i32>(0)) && all(light_xy < size)) {
|
|
244
|
+
textureStore(tContactShadow, light_xy, vec4<f32>(1.0));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (any(write_xy < vec2<i32>(0)) || any(write_xy >= size)) {
|
|
249
|
+
// the rings overrun the viewport by up to two waves
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (read_0.sampling_depth <= FAR_DEPTH) {
|
|
254
|
+
// background: nothing to shadow
|
|
255
|
+
textureStore(tContactShadow, write_xy, vec4<f32>(1.0));
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
var start_depth = read_0.sampling_depth;
|
|
260
|
+
|
|
261
|
+
if ((settings.flags & FLAG_PRECISION_OFFSET) != 0u) {
|
|
262
|
+
start_depth = mix(start_depth, FAR_DEPTH, -1.0 / 65535.0);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
start_depth = (start_depth - light_depth) / distance_0;
|
|
266
|
+
|
|
267
|
+
/*
|
|
268
|
+
Scales a depth difference so the thickness window is [0, 2]: × distance_0 undoes the divide above,
|
|
269
|
+
÷ thickness_scale makes it a fraction of the pixel's own depth, and ÷ surface_thickness sets the
|
|
270
|
+
window. Close to the light's point the min() widens the window instead, so the pixel at the
|
|
271
|
+
centre is either wholly lit or wholly shadowed.
|
|
272
|
+
*/
|
|
273
|
+
let depth_scale = min(distance_0 + direction, 1.0 / settings.surface_thickness) * distance_0 / read_0.thickness_scale;
|
|
274
|
+
|
|
275
|
+
start_depth = start_depth * depth_scale - Z_SIGN;
|
|
276
|
+
|
|
277
|
+
let sample_index = thread_id + 1u;
|
|
278
|
+
|
|
279
|
+
var hard_shadow = 1.0;
|
|
280
|
+
|
|
281
|
+
for (var i = 0u; i < HARD_SHADOW_SAMPLES; i++) {
|
|
282
|
+
// 0 where the sample sits exactly one thickness in front of the ray
|
|
283
|
+
let depth_delta = abs(start_depth - depth_data[sample_index + i] * depth_scale);
|
|
284
|
+
|
|
285
|
+
hard_shadow = min(hard_shadow, depth_delta);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// four interleaved reductions, sample i into lane i % 4, walked four at a time
|
|
289
|
+
var shadow_value = vec4<f32>(1.0);
|
|
290
|
+
|
|
291
|
+
for (var i = HARD_SHADOW_SAMPLES; i < SAMPLE_COUNT - FADE_OUT_SAMPLES; i += 4u) {
|
|
292
|
+
let k = sample_index + i;
|
|
293
|
+
|
|
294
|
+
let samples = vec4<f32>(depth_data[k], depth_data[k + 1u], depth_data[k + 2u], depth_data[k + 3u]);
|
|
295
|
+
|
|
296
|
+
shadow_value = min(shadow_value, abs(vec4<f32>(start_depth) - samples * depth_scale));
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
for (var i = SAMPLE_COUNT - FADE_OUT_SAMPLES; i < SAMPLE_COUNT; i += 4u) {
|
|
300
|
+
let k = sample_index + i;
|
|
301
|
+
|
|
302
|
+
let samples = vec4<f32>(depth_data[k], depth_data[k + 1u], depth_data[k + 2u], depth_data[k + 3u]);
|
|
303
|
+
|
|
304
|
+
// sample n of the fade (from 1) adds 0.75 n / (FADE_OUT_SAMPLES + 1)
|
|
305
|
+
let n = vec4<f32>(f32(i + 1u - (SAMPLE_COUNT - FADE_OUT_SAMPLES))) + vec4<f32>(0.0, 1.0, 2.0, 3.0);
|
|
306
|
+
let fade_out = n / f32(FADE_OUT_SAMPLES + 1u) * 0.75;
|
|
307
|
+
|
|
308
|
+
shadow_value = min(shadow_value, abs(vec4<f32>(start_depth) - samples * depth_scale) + fade_out);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// a sample need not match the window's centre exactly to shadow fully
|
|
312
|
+
let contrast = settings.shadow_contrast;
|
|
313
|
+
|
|
314
|
+
shadow_value = saturate(shadow_value * contrast + (1.0 - contrast));
|
|
315
|
+
hard_shadow = saturate(hard_shadow * contrast + (1.0 - contrast));
|
|
316
|
+
|
|
317
|
+
var result = min(hard_shadow, dot(shadow_value, vec4<f32>(0.25)));
|
|
318
|
+
|
|
319
|
+
switch (settings.debug_mode) {
|
|
320
|
+
case ${ContactShadowDebugMode.EdgeMask}u: {
|
|
321
|
+
result = select(0.0, 1.0, read_0.is_edge);
|
|
322
|
+
}
|
|
323
|
+
case ${ContactShadowDebugMode.ThreadIndex}u: {
|
|
324
|
+
result = f32(thread_id) / f32(WAVE_SIZE);
|
|
325
|
+
}
|
|
326
|
+
case ${ContactShadowDebugMode.WaveIndex}u: {
|
|
327
|
+
result = fract(f32(group_id.x) / f32(WAVE_SIZE));
|
|
328
|
+
}
|
|
329
|
+
default: {
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
textureStore(tContactShadow, write_xy, vec4<f32>(result));
|
|
334
|
+
}
|
|
335
|
+
`, [
|
|
336
|
+
CONTACT_SHADOW_SETTINGS_STRUCT.declaration_chunk,
|
|
337
|
+
chunk_contact_shadow_wavefront_extents,
|
|
338
|
+
]
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Screen-space contact shadow for one light, Bend Studio's wavefront method (`bend_sss_gpu.h`,
|
|
343
|
+
* Sony Interactive Entertainment, Apache 2.0; "Inside Bend: Screen Space Shadows").
|
|
344
|
+
*
|
|
345
|
+
* Writes visibility, 1 lit and 0 shadowed, for every pixel of `tContactShadow`, from the depth buffer
|
|
346
|
+
* alone. One dispatch per entry of a {@link ContactShadowDispatchList}, each with its own wave offset;
|
|
347
|
+
* the dispatches write disjoint pixels and need no barrier between them.
|
|
348
|
+
*
|
|
349
|
+
* **Bounded per thread.** Each thread reads four depths (two reads of two taps) and
|
|
350
|
+
* {@link SAMPLE_COUNT} words of workgroup memory, and nothing it does depends on the scene.
|
|
351
|
+
*
|
|
352
|
+
* @type {ComputeShader}
|
|
353
|
+
*/
|
|
354
|
+
export const shader_contact_shadow_wavefront = ComputeShader.from({
|
|
355
|
+
label: "Contact shadow / wavefront",
|
|
356
|
+
resources,
|
|
357
|
+
body,
|
|
358
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a directional light's shadow is mapped: one technique for every directional light of a renderer,
|
|
3
|
+
* set by `Renderer.feature_virtual_shadow_maps`.
|
|
4
|
+
*/
|
|
5
|
+
export type ShadowDirectionalTechnique = number;
|
|
6
|
+
export namespace ShadowDirectionalTechnique {
|
|
7
|
+
let Cascades: number;
|
|
8
|
+
let Virtual: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ShadowDirectionalTechnique.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShadowDirectionalTechnique.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/map/ShadowDirectionalTechnique.js"],"names":[],"mappings":";;;;yCAIU,MAAM"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a directional light's shadow is mapped: one technique for every directional light of a renderer,
|
|
3
|
+
* set by `Renderer.feature_virtual_shadow_maps`.
|
|
4
|
+
*
|
|
5
|
+
* @enum {number}
|
|
6
|
+
*/
|
|
7
|
+
export const ShadowDirectionalTechnique = {
|
|
8
|
+
/** Cascaded shadow maps: a range of `shadow_cascade` rows per light, each a slice of the view frustum. */
|
|
9
|
+
Cascades: 0,
|
|
10
|
+
/** A virtual shadow map: a clipmap of pages rendered as the view asks for them. */
|
|
11
|
+
Virtual: 1,
|
|
12
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which technique a shader samples directional shadows with — decided by
|
|
3
|
+
* {@link chunk_shadowmap_sample_directional}, so a pipeline links one technique and never branches on
|
|
4
|
+
* the light's record to find out which.
|
|
5
|
+
*
|
|
6
|
+
* The technique is the renderer's, for every directional light at once, so the renderer sets this from
|
|
7
|
+
* `feature_virtual_shadow_maps` in the switch set it hands its passes.
|
|
8
|
+
*
|
|
9
|
+
* @type {ShaderSwitch}
|
|
10
|
+
*/
|
|
11
|
+
export const SHADOW_DIRECTIONAL_TECHNIQUE: ShaderSwitch;
|
|
12
|
+
import { ShaderSwitch } from "../../../shader/compiler/ShaderSwitch.js";
|
|
13
|
+
//# sourceMappingURL=SHADOW_DIRECTIONAL_TECHNIQUE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SHADOW_DIRECTIONAL_TECHNIQUE.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/SHADOW_DIRECTIONAL_TECHNIQUE.js"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,2CAFU,YAAY,CAEoG;6BAb7F,0CAA0C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ShaderSwitch } from "../../../shader/compiler/ShaderSwitch.js";
|
|
2
|
+
import { ShadowDirectionalTechnique } from "../ShadowDirectionalTechnique.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Which technique a shader samples directional shadows with — decided by
|
|
6
|
+
* {@link chunk_shadowmap_sample_directional}, so a pipeline links one technique and never branches on
|
|
7
|
+
* the light's record to find out which.
|
|
8
|
+
*
|
|
9
|
+
* The technique is the renderer's, for every directional light at once, so the renderer sets this from
|
|
10
|
+
* `feature_virtual_shadow_maps` in the switch set it hands its passes.
|
|
11
|
+
*
|
|
12
|
+
* @type {ShaderSwitch}
|
|
13
|
+
*/
|
|
14
|
+
export const SHADOW_DIRECTIONAL_TECHNIQUE = ShaderSwitch.enum('shadow directional technique', ShadowDirectionalTechnique);
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Directional-light shadow sampling
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* {@link
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* Directional-light shadow sampling, `shadowmap_sample_directional(database, shadow_id, position_ws,
|
|
3
|
+
* view_direction_ws, surface_normal_ws, light) -> f32`, by the renderer's technique
|
|
4
|
+
* ({@link SHADOW_DIRECTIONAL_TECHNIQUE}): cascades
|
|
5
|
+
* ({@link chunk_shadowmap_sample_directional_cascades}) or a virtual shadow map
|
|
6
|
+
* ({@link chunk_shadowmap_sample_directional_virtual}).
|
|
7
|
+
*
|
|
8
|
+
* A pipeline links one of the two. The technique is the same for every directional light of a
|
|
9
|
+
* renderer, so it is decided when the pipeline is made rather than per light and per pixel. Linking
|
|
10
|
+
* both cost cascade users 6 % of the deferred pass on an RTX 4090 (0.936× without the virtual path,
|
|
11
|
+
* measured 2026-10-16), and a pipeline compiled with one technique compiles in 0.66–0.83× the time.
|
|
12
|
+
*
|
|
13
|
+
* @type {CodeChunkChoice}
|
|
8
14
|
*/
|
|
9
|
-
export const chunk_shadowmap_sample_directional:
|
|
10
|
-
import {
|
|
15
|
+
export const chunk_shadowmap_sample_directional: CodeChunkChoice;
|
|
16
|
+
import { CodeChunkChoice } from "../../../shader/compiler/CodeChunkChoice.js";
|
|
11
17
|
//# sourceMappingURL=chunk_shadowmap_sample_directional.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_shadowmap_sample_directional.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_shadowmap_sample_directional.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AACH,iDAFU,eAAe,CAE4E;gCApBrE,6CAA6C"}
|
|
@@ -1,90 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { chunk_shadowmap_csm_compute_cascade_blended } from "./chunk_shadowmap_csm_compute_cascade_blended.js";
|
|
7
|
-
import { chunk_shadowmap_sample_virtual } from "../../vsm/shader/chunk_shadowmap_sample_virtual.js";
|
|
8
|
-
|
|
9
|
-
const SHADOW_DIRECTIONAL_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_directional');
|
|
10
|
-
const CASCADE_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_cascade');
|
|
1
|
+
import { CodeChunkChoice } from "../../../shader/compiler/CodeChunkChoice.js";
|
|
2
|
+
import { chunk_shadowmap_sample_directional_virtual } from "../../vsm/shader/chunk_shadowmap_sample_directional_virtual.js";
|
|
3
|
+
import { ShadowDirectionalTechnique } from "../ShadowDirectionalTechnique.js";
|
|
4
|
+
import { chunk_shadowmap_sample_directional_cascades } from "./chunk_shadowmap_sample_directional_cascades.js";
|
|
5
|
+
import { SHADOW_DIRECTIONAL_TECHNIQUE } from "./SHADOW_DIRECTIONAL_TECHNIQUE.js";
|
|
11
6
|
|
|
12
7
|
/**
|
|
13
|
-
* Directional-light shadow sampling
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* {@link
|
|
17
|
-
*
|
|
18
|
-
*
|
|
8
|
+
* Directional-light shadow sampling, `shadowmap_sample_directional(database, shadow_id, position_ws,
|
|
9
|
+
* view_direction_ws, surface_normal_ws, light) -> f32`, by the renderer's technique
|
|
10
|
+
* ({@link SHADOW_DIRECTIONAL_TECHNIQUE}): cascades
|
|
11
|
+
* ({@link chunk_shadowmap_sample_directional_cascades}) or a virtual shadow map
|
|
12
|
+
* ({@link chunk_shadowmap_sample_directional_virtual}).
|
|
13
|
+
*
|
|
14
|
+
* A pipeline links one of the two. The technique is the same for every directional light of a
|
|
15
|
+
* renderer, so it is decided when the pipeline is made rather than per light and per pixel. Linking
|
|
16
|
+
* both cost cascade users 6 % of the deferred pass on an RTX 4090 (0.936× without the virtual path,
|
|
17
|
+
* measured 2026-10-16), and a pipeline compiled with one technique compiles in 0.66–0.83× the time.
|
|
18
|
+
*
|
|
19
|
+
* @type {CodeChunkChoice}
|
|
19
20
|
*/
|
|
20
|
-
export const chunk_shadowmap_sample_directional =
|
|
21
|
-
//language=WGSL
|
|
22
|
-
`
|
|
23
|
-
fn shadowmap_sample_directional(
|
|
24
|
-
database: ptr<storage, array<u32>>,
|
|
25
|
-
shadow_id: u32,
|
|
26
|
-
position_ws: vec3f,
|
|
27
|
-
view_direction_ws: vec3f,
|
|
28
|
-
surface_normal_ws: vec3f,
|
|
29
|
-
light: ${INCIDENT_LIGHT_STRUCT.wgsl_ref},
|
|
30
|
-
) -> f32 {
|
|
31
|
-
let shadowmap = ${SHADOW_DIRECTIONAL_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
|
|
32
|
-
|
|
33
|
-
if (shadowmap.virtual_map != ${GPU_DATABASE_NULL}u) {
|
|
34
|
-
// a virtual shadow map rather than cascades
|
|
35
|
-
return shadowmap_sample_virtual(
|
|
36
|
-
database,
|
|
37
|
-
shadowmap.virtual_map,
|
|
38
|
-
position_ws,
|
|
39
|
-
surface_normal_ws,
|
|
40
|
-
light,
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
let cascade_info = shadowmap_csm_compute_cascade_blended(
|
|
45
|
-
database,
|
|
46
|
-
shadowmap.first_cascade,
|
|
47
|
-
shadowmap.cascade_count,
|
|
48
|
-
position_ws,
|
|
49
|
-
view_direction_ws,
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
if(cascade_info.index_0 == ~0u){
|
|
53
|
-
// not in the shadowmap, assume fully visible
|
|
54
|
-
return 1.0;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
let cascade_meta_0 = ${CASCADE_DESCRIPTOR.marshalling_method_read}(database, cascade_info.index_0);
|
|
58
|
-
|
|
59
|
-
let visibility_0 = sample_shadowmap_atlas_for_light(
|
|
60
|
-
cascade_meta_0.projection,
|
|
61
|
-
position_ws,
|
|
62
|
-
surface_normal_ws,
|
|
63
|
-
light,
|
|
64
|
-
cascade_meta_0.atlas,
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
if(cascade_info.blend <= 0.0){
|
|
68
|
-
return visibility_0;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
let cascade_meta_1 = ${CASCADE_DESCRIPTOR.marshalling_method_read}(database, cascade_info.index_1);
|
|
72
|
-
|
|
73
|
-
let visibility_1 = sample_shadowmap_atlas_for_light(
|
|
74
|
-
cascade_meta_1.projection,
|
|
75
|
-
position_ws,
|
|
76
|
-
surface_normal_ws,
|
|
77
|
-
light,
|
|
78
|
-
cascade_meta_1.atlas,
|
|
79
|
-
);
|
|
21
|
+
export const chunk_shadowmap_sample_directional = CodeChunkChoice.from(SHADOW_DIRECTIONAL_TECHNIQUE);
|
|
80
22
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
`, [
|
|
84
|
-
SHADOW_DIRECTIONAL_DESCRIPTOR.chunk_read,
|
|
85
|
-
CASCADE_DESCRIPTOR.chunk_read,
|
|
86
|
-
chunk_sample_shadowmap_atlas_for_light,
|
|
87
|
-
chunk_shadowmap_csm_compute_cascade_blended,
|
|
88
|
-
chunk_shadowmap_sample_virtual,
|
|
89
|
-
]
|
|
90
|
-
);
|
|
23
|
+
chunk_shadowmap_sample_directional.add(ShadowDirectionalTechnique.Cascades, chunk_shadowmap_sample_directional_cascades);
|
|
24
|
+
chunk_shadowmap_sample_directional.add(ShadowDirectionalTechnique.Virtual, chunk_shadowmap_sample_directional_virtual);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shadowmap_sample_directional` under {@link ShadowDirectionalTechnique.Cascades}. The light's
|
|
3
|
+
* `shadow_directional` record names its cascades as a range of `shadow_cascade` rows (atlas +
|
|
4
|
+
* view-projection each), with CSM cascade blending: {@link shadowmap_csm_compute_cascade_blended} picks
|
|
5
|
+
* among them, and the one or two it picks are read again here to sample.
|
|
6
|
+
*
|
|
7
|
+
* A light whose record names no cascades — a frame where the renderer has just switched to virtual
|
|
8
|
+
* maps and not yet rebuilt them — finds no cascade and is lit.
|
|
9
|
+
*
|
|
10
|
+
* @type {CodeChunk}
|
|
11
|
+
*/
|
|
12
|
+
export const chunk_shadowmap_sample_directional_cascades: CodeChunk;
|
|
13
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
14
|
+
//# sourceMappingURL=chunk_shadowmap_sample_directional_cascades.d.ts.map
|
package/src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk_shadowmap_sample_directional_cascades.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/shadow/map/shader/chunk_shadowmap_sample_directional_cascades.js"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,0DAFU,SAAS,CA4DjB;0BA5EwB,uCAAuC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { LIGHT_DATABASE_SPEC } from "../../../light/LIGHT_DATABASE_SPEC.js";
|
|
2
|
+
import { INCIDENT_LIGHT_STRUCT } from "../../../shader/chunk/light/INCIDENT_LIGHT_STRUCT.js";
|
|
3
|
+
import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
|
|
4
|
+
import { chunk_sample_shadowmap_atlas_for_light } from "./chunk_sample_shadowmap_atlas_for_light.js";
|
|
5
|
+
import { chunk_shadowmap_csm_compute_cascade_blended } from "./chunk_shadowmap_csm_compute_cascade_blended.js";
|
|
6
|
+
|
|
7
|
+
const SHADOW_DIRECTIONAL_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_directional');
|
|
8
|
+
const CASCADE_DESCRIPTOR = LIGHT_DATABASE_SPEC.get('shadow_cascade');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* `shadowmap_sample_directional` under {@link ShadowDirectionalTechnique.Cascades}. The light's
|
|
12
|
+
* `shadow_directional` record names its cascades as a range of `shadow_cascade` rows (atlas +
|
|
13
|
+
* view-projection each), with CSM cascade blending: {@link shadowmap_csm_compute_cascade_blended} picks
|
|
14
|
+
* among them, and the one or two it picks are read again here to sample.
|
|
15
|
+
*
|
|
16
|
+
* A light whose record names no cascades — a frame where the renderer has just switched to virtual
|
|
17
|
+
* maps and not yet rebuilt them — finds no cascade and is lit.
|
|
18
|
+
*
|
|
19
|
+
* @type {CodeChunk}
|
|
20
|
+
*/
|
|
21
|
+
export const chunk_shadowmap_sample_directional_cascades = CodeChunk.from(
|
|
22
|
+
//language=WGSL
|
|
23
|
+
`
|
|
24
|
+
fn shadowmap_sample_directional(
|
|
25
|
+
database: ptr<storage, array<u32>>,
|
|
26
|
+
shadow_id: u32,
|
|
27
|
+
position_ws: vec3f,
|
|
28
|
+
view_direction_ws: vec3f,
|
|
29
|
+
surface_normal_ws: vec3f,
|
|
30
|
+
light: ${INCIDENT_LIGHT_STRUCT.wgsl_ref},
|
|
31
|
+
) -> f32 {
|
|
32
|
+
let shadowmap = ${SHADOW_DIRECTIONAL_DESCRIPTOR.marshalling_method_read}(database, shadow_id);
|
|
33
|
+
|
|
34
|
+
let cascade_info = shadowmap_csm_compute_cascade_blended(
|
|
35
|
+
database,
|
|
36
|
+
shadowmap.first_cascade,
|
|
37
|
+
shadowmap.cascade_count,
|
|
38
|
+
position_ws,
|
|
39
|
+
view_direction_ws,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
if(cascade_info.index_0 == ~0u){
|
|
43
|
+
// not in the shadowmap, assume fully visible
|
|
44
|
+
return 1.0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let cascade_meta_0 = ${CASCADE_DESCRIPTOR.marshalling_method_read}(database, cascade_info.index_0);
|
|
48
|
+
|
|
49
|
+
let visibility_0 = sample_shadowmap_atlas_for_light(
|
|
50
|
+
cascade_meta_0.projection,
|
|
51
|
+
position_ws,
|
|
52
|
+
surface_normal_ws,
|
|
53
|
+
light,
|
|
54
|
+
cascade_meta_0.atlas,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
if(cascade_info.blend <= 0.0){
|
|
58
|
+
return visibility_0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let cascade_meta_1 = ${CASCADE_DESCRIPTOR.marshalling_method_read}(database, cascade_info.index_1);
|
|
62
|
+
|
|
63
|
+
let visibility_1 = sample_shadowmap_atlas_for_light(
|
|
64
|
+
cascade_meta_1.projection,
|
|
65
|
+
position_ws,
|
|
66
|
+
surface_normal_ws,
|
|
67
|
+
light,
|
|
68
|
+
cascade_meta_1.atlas,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return mix(visibility_0, visibility_1, cascade_info.blend);
|
|
72
|
+
}
|
|
73
|
+
`, [
|
|
74
|
+
SHADOW_DIRECTIONAL_DESCRIPTOR.chunk_read,
|
|
75
|
+
CASCADE_DESCRIPTOR.chunk_read,
|
|
76
|
+
chunk_sample_shadowmap_atlas_for_light,
|
|
77
|
+
chunk_shadowmap_csm_compute_cascade_blended,
|
|
78
|
+
]
|
|
79
|
+
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_ray_shadow_code.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/ray/shader_ray_shadow_code.js"],"names":[],"mappings":"AA6KA,mDAII;
|
|
1
|
+
{"version":3,"file":"shader_ray_shadow_code.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shadow/ray/shader_ray_shadow_code.js"],"names":[],"mappings":"AA6KA,mDAII;8BA5J0B,+BAA+B"}
|