@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,404 @@
|
|
|
1
|
+
import { Color } from "../../../core/color/Color.js";
|
|
2
|
+
import { kelvin_to_rgb } from "../../../core/color/kelvin/kelvin_to_rgb.js";
|
|
3
|
+
import Quaternion from "../../../core/geom/Quaternion.js";
|
|
4
|
+
import Vector3 from "../../../core/geom/Vector3.js";
|
|
5
|
+
import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
|
|
6
|
+
import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
|
|
7
|
+
import { BoxGeometry } from "../../renderer/geometry/BoxGeometry.js";
|
|
8
|
+
import { MeshoptClusterizer } from "../../renderer/geometry/meshlet/build/meshoptimizer/meshopt_clusterizer.js";
|
|
9
|
+
import { meshlet_geometry_build_from_geometry } from "../../renderer/geometry/meshlet_geometry_build_from_geometry.js";
|
|
10
|
+
import { MeshletGeometry } from "../../renderer/geometry/MeshletGeometry.js";
|
|
11
|
+
import { make_torus_knot_geometry } from "../../renderer/geometry/primitives/make_torus_knot_geometry.js";
|
|
12
|
+
import { make_uv_sphere_geometry } from "../../renderer/geometry/primitives/make_uv_sphere_geometry.js";
|
|
13
|
+
import { make_sunlight } from "../../renderer/light/make_sunlight.js";
|
|
14
|
+
import { PointLight } from "../../renderer/light/model/PointLight.js";
|
|
15
|
+
import { place_light } from "../../renderer/light/place_light.js";
|
|
16
|
+
import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
|
|
17
|
+
import { place_primitive } from "../../renderer/scene/rows/place_primitive.js";
|
|
18
|
+
import { Scene } from "../../renderer/scene/Scene.js";
|
|
19
|
+
import { load_default_environment } from "../load_default_environment.js";
|
|
20
|
+
import { make_flat_environment } from "../skinned_blas_refit/flat_environment.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {import("../../renderer/Renderer.js").Renderer} Renderer
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @typedef {Object} ToneMapScene
|
|
28
|
+
* @property {string} name
|
|
29
|
+
* @property {Scene} scene
|
|
30
|
+
* @property {number[][]} view camera position and target
|
|
31
|
+
* @property {number} exposure_ev the fixed exposure the scene is authored for, in f-stops over a scene value of 1
|
|
32
|
+
* @property {string} note what the scene is there to show
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* An sRGB-encoded 8-bit triple as linear Rec.709, which is what a material's colour takes.
|
|
37
|
+
*
|
|
38
|
+
* @param {number} r
|
|
39
|
+
* @param {number} g
|
|
40
|
+
* @param {number} b
|
|
41
|
+
* @returns {number[]}
|
|
42
|
+
*/
|
|
43
|
+
function from_srgb8(r, g, b) {
|
|
44
|
+
return [r, g, b].map(v => {
|
|
45
|
+
const c = v / 255;
|
|
46
|
+
|
|
47
|
+
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A black body's colour as linear Rec.709. `kelvin_to_rgb` answers sRGB-encoded, and a light's colour and an
|
|
53
|
+
* emissive factor both take linear.
|
|
54
|
+
*
|
|
55
|
+
* @param {number} temperature in kelvin
|
|
56
|
+
* @returns {number[]}
|
|
57
|
+
*/
|
|
58
|
+
function kelvin_linear(temperature) {
|
|
59
|
+
const encoded = [];
|
|
60
|
+
|
|
61
|
+
kelvin_to_rgb(encoded, 0, temperature);
|
|
62
|
+
|
|
63
|
+
return encoded.map(c => c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* What every scene starts from: a scene on its own dataset, and placers for boxes and spheres.
|
|
68
|
+
*
|
|
69
|
+
* @param {Renderer} renderer
|
|
70
|
+
*/
|
|
71
|
+
function scene_base(renderer) {
|
|
72
|
+
const scene = new Scene();
|
|
73
|
+
|
|
74
|
+
scene.dataset = new EntityComponentDataset();
|
|
75
|
+
|
|
76
|
+
const scene_context = renderer.scenes.obtain(scene);
|
|
77
|
+
|
|
78
|
+
const cube = new BoxGeometry();
|
|
79
|
+
|
|
80
|
+
const sphere = new MeshletGeometry();
|
|
81
|
+
meshlet_geometry_build_from_geometry(make_uv_sphere_geometry(1, 48, 24), sphere);
|
|
82
|
+
|
|
83
|
+
const knot = new MeshletGeometry();
|
|
84
|
+
meshlet_geometry_build_from_geometry(make_torus_knot_geometry(0.6, 0.2, 160, 24), knot);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param {number[]} rgb linear
|
|
88
|
+
* @param {number} roughness
|
|
89
|
+
* @param {number} metallic
|
|
90
|
+
* @returns {StandardShadeMaterial}
|
|
91
|
+
*/
|
|
92
|
+
const surface = (rgb, roughness, metallic) => {
|
|
93
|
+
const material = new StandardShadeMaterial();
|
|
94
|
+
|
|
95
|
+
material.diffuse_color.copy(new Color(rgb[0], rgb[1], rgb[2]));
|
|
96
|
+
material.roughness_factor = roughness;
|
|
97
|
+
material.metallic_factor = metallic;
|
|
98
|
+
|
|
99
|
+
return material;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A black surface that only emits: `rgb` times `strength`, in scene units.
|
|
104
|
+
*
|
|
105
|
+
* @param {number[]} rgb
|
|
106
|
+
* @param {number} strength
|
|
107
|
+
* @returns {StandardShadeMaterial}
|
|
108
|
+
*/
|
|
109
|
+
const glow = (rgb, strength) => {
|
|
110
|
+
const material = surface([0, 0, 0], 1, 0);
|
|
111
|
+
|
|
112
|
+
material.emissive_factor.copy(new Color(rgb[0] * strength, rgb[1] * strength, rgb[2] * strength));
|
|
113
|
+
|
|
114
|
+
return material;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @param {MeshletGeometry} geometry
|
|
119
|
+
* @param {StandardShadeMaterial} material
|
|
120
|
+
* @param {number[]} position
|
|
121
|
+
* @param {number[]} scale
|
|
122
|
+
* @param {number} [yaw] radians about +Y
|
|
123
|
+
*/
|
|
124
|
+
const place = (geometry, material, position, scale, yaw = 0) => {
|
|
125
|
+
const transform = new Transform64();
|
|
126
|
+
const rotation = Quaternion.fromAxisAngle(Vector3.up, yaw);
|
|
127
|
+
|
|
128
|
+
transform.setTranslation(position[0], position[1], position[2]);
|
|
129
|
+
transform.setRotation(rotation.x, rotation.y, rotation.z, rotation.w);
|
|
130
|
+
transform.setScale(scale[0], scale[1], scale[2]);
|
|
131
|
+
transform.updateMatrix();
|
|
132
|
+
|
|
133
|
+
place_primitive(scene_context, geometry, material, transform);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @param {number[]} position
|
|
138
|
+
* @param {number[]} rgb chromaticity, linear
|
|
139
|
+
* @param {number} candela
|
|
140
|
+
*/
|
|
141
|
+
const lamp = (position, rgb, candela) => {
|
|
142
|
+
const light = new PointLight();
|
|
143
|
+
|
|
144
|
+
light.color.copy(new Color(rgb[0], rgb[1], rgb[2]));
|
|
145
|
+
light.intensity = candela;
|
|
146
|
+
light.distance = 0;
|
|
147
|
+
light.radius = 0.05;
|
|
148
|
+
light.casts_shadow = false;
|
|
149
|
+
light.transform.setTranslation(position[0], position[1], position[2]);
|
|
150
|
+
light.transform.updateMatrix();
|
|
151
|
+
|
|
152
|
+
place_light(scene, light);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
return { scene, cube, sphere, knot, surface, glow, place, lamp };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Night, lit only by what glows. A fire of stacked emitters lights a floor and three props, and a ladder of emitters
|
|
160
|
+
* steps four saturated colours up by two stops at a time, from below the shoulder of every operator to far past it.
|
|
161
|
+
*
|
|
162
|
+
* @param {Renderer} renderer
|
|
163
|
+
* @returns {ToneMapScene}
|
|
164
|
+
*/
|
|
165
|
+
function create_fire(renderer) {
|
|
166
|
+
const { scene, cube, sphere, surface, glow, place, lamp } = scene_base(renderer);
|
|
167
|
+
|
|
168
|
+
scene.lights.environment = make_flat_environment([0.0015, 0.002, 0.004]);
|
|
169
|
+
|
|
170
|
+
place(cube, surface([0.18, 0.18, 0.18], 0.85, 0), [0, -0.05, 0], [30, 0.1, 30]);
|
|
171
|
+
|
|
172
|
+
// the fire: hot at the core, redder and dimmer outwards
|
|
173
|
+
const FIRE = [1, 0.35, 0.05];
|
|
174
|
+
|
|
175
|
+
place(sphere, glow([1, 0.62, 0.22], 48), [0, 0.28, 0], [0.22, 0.3, 0.22]);
|
|
176
|
+
place(sphere, glow(FIRE, 16), [0.18, 0.22, 0.1], [0.2, 0.24, 0.2]);
|
|
177
|
+
place(sphere, glow(FIRE, 16), [-0.16, 0.2, -0.08], [0.18, 0.26, 0.18]);
|
|
178
|
+
place(sphere, glow([1, 0.2, 0.03], 6), [0.05, 0.16, -0.22], [0.2, 0.16, 0.2]);
|
|
179
|
+
place(sphere, glow([1, 0.2, 0.03], 6), [-0.1, 0.14, 0.24], [0.22, 0.14, 0.22]);
|
|
180
|
+
place(sphere, glow([0.9, 0.12, 0.02], 2), [0, 0.06, 0], [0.5, 0.06, 0.5]);
|
|
181
|
+
|
|
182
|
+
// logs and stones around it
|
|
183
|
+
const char = surface([0.04, 0.03, 0.025], 0.9, 0);
|
|
184
|
+
|
|
185
|
+
for (let i = 0; i < 6; i++) {
|
|
186
|
+
const a = i / 6 * Math.PI * 2;
|
|
187
|
+
|
|
188
|
+
place(cube, char, [Math.cos(a) * 0.45, 0.06, Math.sin(a) * 0.45], [0.5, 0.1, 0.12], -a);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const fire_light = kelvin_linear(1900);
|
|
192
|
+
|
|
193
|
+
lamp([0, 0.6, 0], fire_light, 120);
|
|
194
|
+
lamp([0.2, 0.35, 0.15], fire_light, 40);
|
|
195
|
+
|
|
196
|
+
// props the fire lights: a white sphere, a grey column, a saturated blue box
|
|
197
|
+
place(sphere, surface([0.8, 0.8, 0.8], 0.4, 0), [-1.6, 0.5, 0.6], [0.5, 0.5, 0.5]);
|
|
198
|
+
place(cube, surface([0.45, 0.45, 0.45], 0.7, 0), [1.7, 1, 0.2], [0.5, 2, 0.5]);
|
|
199
|
+
place(cube, surface(from_srgb8(30, 80, 200), 0.5, 0), [1.2, 0.3, 1.2], [0.6, 0.6, 0.6], 0.4);
|
|
200
|
+
|
|
201
|
+
// the ladder: four colours, each two stops brighter than the last, left to right
|
|
202
|
+
const ladder = [
|
|
203
|
+
[1, 0.35, 0.05], // fire orange
|
|
204
|
+
[1, 0.03, 0.02], // brake-lamp red
|
|
205
|
+
[1, 0.55, 0.12], // sodium
|
|
206
|
+
[0.05, 0.2, 1], // neon blue
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
for (let row = 0; row < ladder.length; row++) {
|
|
210
|
+
for (let step = 0; step < 6; step++) {
|
|
211
|
+
const strength = Math.pow(2, step * 2 - 2);
|
|
212
|
+
|
|
213
|
+
place(cube, glow(ladder[row], strength), [-2.75 + step * 1.1, 0.8 + row * 0.6, -4], [0.45, 0.45, 0.1]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
name: 'Fire and emitters',
|
|
219
|
+
scene,
|
|
220
|
+
view: [[0, 1.7, 4.6], [0, 1.1, -1.5]],
|
|
221
|
+
exposure_ev: 0,
|
|
222
|
+
note: 'Night, lit by a fire. Back row: four colours from ¼ to 256, two stops a step.',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Midday. A photographed sky and a sun over a concrete yard, with a car-paint orange, primaries, foliage green, chrome
|
|
228
|
+
* and white — the case where the sky and the sunlit white sit near the top of the range.
|
|
229
|
+
*
|
|
230
|
+
* @param {Renderer} renderer
|
|
231
|
+
* @returns {ToneMapScene}
|
|
232
|
+
*/
|
|
233
|
+
function create_exterior(renderer) {
|
|
234
|
+
const { scene, cube, sphere, knot, surface, place } = scene_base(renderer);
|
|
235
|
+
|
|
236
|
+
scene.lights.environment = make_flat_environment([0.35, 0.45, 0.6]);
|
|
237
|
+
load_default_environment(scene, '/test_assets/environments/octahedral/rustig_koppie_puresky_2k.hdr');
|
|
238
|
+
|
|
239
|
+
const sun = make_sunlight({ intensity: 8, temperature: 5800, direction: new Vector3(-0.45, -0.7, -0.55) });
|
|
240
|
+
|
|
241
|
+
place_light(scene, sun);
|
|
242
|
+
|
|
243
|
+
place(cube, surface([0.42, 0.4, 0.37], 0.9, 0), [0, -0.05, -10], [80, 0.1, 80]);
|
|
244
|
+
|
|
245
|
+
// a white wall and a dark doorway, for a sunlit white beside a shadow
|
|
246
|
+
place(cube, surface([0.82, 0.8, 0.76], 0.8, 0), [0, 1.5, -4.5], [9, 3, 0.3]);
|
|
247
|
+
place(cube, surface([0.05, 0.05, 0.05], 0.9, 0), [2.5, 1.1, -4.3], [1.1, 2.2, 0.1]);
|
|
248
|
+
|
|
249
|
+
// GT7's own test colour: a vivid orange paint, outside Rec.709 in their renders, at the edge of it here
|
|
250
|
+
place(sphere, surface(from_srgb8(255, 96, 0), 0.12, 0), [-1.8, 0.7, -1.5], [0.7, 0.7, 0.7]);
|
|
251
|
+
place(knot, surface(from_srgb8(255, 96, 0), 0.12, 0), [-3.5, 0.9, -2.8], [1, 1, 1], 0.6);
|
|
252
|
+
|
|
253
|
+
place(cube, surface(from_srgb8(200, 20, 30), 0.5, 0), [0.4, 0.5, -1.2], [1, 1, 1], 0.3);
|
|
254
|
+
place(cube, surface(from_srgb8(20, 60, 190), 0.5, 0), [1.7, 0.4, -0.6], [0.8, 0.8, 0.8], -0.2);
|
|
255
|
+
place(sphere, surface(from_srgb8(60, 120, 30), 0.8, 0), [3.2, 0.9, -2.4], [0.9, 0.9, 0.9]);
|
|
256
|
+
place(sphere, surface([0.95, 0.95, 0.95], 0.05, 1), [-0.2, 0.45, 0.6], [0.45, 0.45, 0.45]);
|
|
257
|
+
place(sphere, surface([0.85, 0.85, 0.85], 0.6, 0), [1.1, 0.35, 1.3], [0.35, 0.35, 0.35]);
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
name: 'Sunlit exterior',
|
|
261
|
+
scene,
|
|
262
|
+
view: [[1.5, 1.7, 5.5], [-0.3, 0.9, -2.5]],
|
|
263
|
+
exposure_ev: -0.5,
|
|
264
|
+
note: 'Sky and sun. A white wall in sun beside a doorway in shade; car-paint orange, primaries, chrome.',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Evening indoors. A room lit by one warm lamp, with a window onto a bright panel and a low sun throwing a patch
|
|
270
|
+
* through it: exposed for the room, the window and the patch are far over.
|
|
271
|
+
*
|
|
272
|
+
* @param {Renderer} renderer
|
|
273
|
+
* @returns {ToneMapScene}
|
|
274
|
+
*/
|
|
275
|
+
function create_interior(renderer) {
|
|
276
|
+
const { scene, cube, sphere, surface, glow, place, lamp } = scene_base(renderer);
|
|
277
|
+
|
|
278
|
+
scene.lights.environment = make_flat_environment([0.003, 0.003, 0.004]);
|
|
279
|
+
|
|
280
|
+
const sun = make_sunlight({ intensity: 60, temperature: 4200, direction: new Vector3(0.3, -0.8, 0.5) });
|
|
281
|
+
|
|
282
|
+
place_light(scene, sun);
|
|
283
|
+
|
|
284
|
+
const plaster = surface([0.7, 0.66, 0.6], 0.9, 0);
|
|
285
|
+
const wood = surface(from_srgb8(120, 72, 40), 0.6, 0);
|
|
286
|
+
|
|
287
|
+
// the room: 8 x 3 x 6 m, the window in the far wall
|
|
288
|
+
place(cube, wood, [0, -0.05, 0], [8, 0.1, 6]);
|
|
289
|
+
place(cube, plaster, [0, 3.05, 0], [8, 0.1, 6]);
|
|
290
|
+
place(cube, plaster, [-4.05, 1.5, 0], [0.1, 3, 6]);
|
|
291
|
+
place(cube, plaster, [4.05, 1.5, 0], [0.1, 3, 6]);
|
|
292
|
+
place(cube, plaster, [0, 1.5, 3.05], [8, 3, 0.1]);
|
|
293
|
+
|
|
294
|
+
// the far wall around a 2 x 1.4 m window, its sill at 0.9 m
|
|
295
|
+
place(cube, plaster, [-2.5, 1.5, -3.05], [3, 3, 0.1]);
|
|
296
|
+
place(cube, plaster, [2.5, 1.5, -3.05], [3, 3, 0.1]);
|
|
297
|
+
place(cube, plaster, [0, 0.45, -3.05], [2, 0.9, 0.1]);
|
|
298
|
+
place(cube, plaster, [0, 2.65, -3.05], [2, 0.7, 0.1]);
|
|
299
|
+
|
|
300
|
+
// outside: a bright overcast panel, the view through the window, low enough that the sun clears it
|
|
301
|
+
place(cube, glow([0.85, 0.9, 1], 12), [0, 1.6, -6], [12, 3, 0.1]);
|
|
302
|
+
|
|
303
|
+
// a lamp on a side table: an emitting shade and a 2700 K light under it
|
|
304
|
+
const warm = kelvin_linear(2700);
|
|
305
|
+
|
|
306
|
+
place(cube, wood, [-1.9, 0.3, -1.4], [0.6, 0.6, 0.6]);
|
|
307
|
+
place(sphere, glow(warm, 4), [-1.9, 0.95, -1.4], [0.22, 0.18, 0.22]);
|
|
308
|
+
lamp([-1.9, 0.95, -1.4], warm, 4);
|
|
309
|
+
|
|
310
|
+
// a teal sofa, a rug, and a shelf of books in saturated covers
|
|
311
|
+
const teal = surface(from_srgb8(0, 120, 120), 0.9, 0);
|
|
312
|
+
|
|
313
|
+
// the sofa sits under the window, where the sun patch falls on its seat
|
|
314
|
+
place(cube, teal, [0.4, 0.25, -2.45], [2.4, 0.5, 0.9]);
|
|
315
|
+
place(cube, teal, [0.4, 0.65, -2.9], [2.4, 0.5, 0.2]);
|
|
316
|
+
place(cube, surface(from_srgb8(150, 30, 40), 0.95, 0), [0.4, 0.01, -0.8], [3, 0.02, 2]);
|
|
317
|
+
|
|
318
|
+
const covers = [[200, 30, 30], [240, 190, 20], [30, 90, 200], [30, 140, 60], [230, 230, 220], [120, 40, 140]];
|
|
319
|
+
|
|
320
|
+
// the shelf stands against the left wall, beside the lamp
|
|
321
|
+
place(cube, wood, [-3.8, 1, -1.5], [0.4, 2, 1.8]);
|
|
322
|
+
|
|
323
|
+
for (let i = 0; i < 12; i++) {
|
|
324
|
+
const c = covers[i % covers.length];
|
|
325
|
+
|
|
326
|
+
place(cube, surface(from_srgb8(c[0], c[1], c[2]), 0.7, 0), [-3.55, 1.25, -2.25 + i * 0.13], [0.1, 0.35, 0.1]);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
place(sphere, surface([0.8, 0.8, 0.8], 0.3, 0), [-1.2, 0.25, 0.8], [0.25, 0.25, 0.25]);
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
name: 'Dim interior',
|
|
333
|
+
scene,
|
|
334
|
+
view: [[1.5, 1.5, 2.6], [-0.8, 0.9, -2.5]],
|
|
335
|
+
exposure_ev: 1,
|
|
336
|
+
note: 'One 2700 K lamp; a window onto a bright panel, and a low sun patch on the teal sofa under it.',
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* A studio. A photographed studio environment and a soft key light over a white sweep, with product colours given as
|
|
342
|
+
* sRGB values — what Khronos PBR Neutral promises to reproduce, and the shot e-commerce viewers default to it for.
|
|
343
|
+
*
|
|
344
|
+
* @param {Renderer} renderer
|
|
345
|
+
* @returns {ToneMapScene}
|
|
346
|
+
*/
|
|
347
|
+
function create_product(renderer) {
|
|
348
|
+
const { scene, cube, sphere, knot, surface, place } = scene_base(renderer);
|
|
349
|
+
|
|
350
|
+
scene.lights.environment = make_flat_environment([0.5, 0.5, 0.5]);
|
|
351
|
+
load_default_environment(scene, '/test_assets/environments/octahedral/blue_photo_studio_2k.hdr');
|
|
352
|
+
|
|
353
|
+
const key = make_sunlight({ intensity: 1.5, temperature: 6500, direction: new Vector3(0.5, -0.7, -0.5) });
|
|
354
|
+
|
|
355
|
+
key.radius = 0.2;
|
|
356
|
+
place_light(scene, key);
|
|
357
|
+
|
|
358
|
+
const sweep = surface([0.8, 0.8, 0.8], 0.7, 0);
|
|
359
|
+
|
|
360
|
+
place(cube, sweep, [0, -0.05, 0], [12, 0.1, 8]);
|
|
361
|
+
place(cube, sweep, [0, 2, -3], [12, 4, 0.1]);
|
|
362
|
+
|
|
363
|
+
const products = [
|
|
364
|
+
[from_srgb8(231, 218, 63), 0.35, 0], // canary yellow
|
|
365
|
+
[from_srgb8(203, 63, 63), 0.35, 0], // a marketing red
|
|
366
|
+
[from_srgb8(149, 218, 188), 0.35, 0], // mint
|
|
367
|
+
[[0.8, 0.8, 0.8], 0.9, 0], // matte paper white
|
|
368
|
+
[[1, 0.77, 0.34], 0.25, 1], // gold
|
|
369
|
+
[[0.04, 0.04, 0.045], 0.15, 0], // gloss black
|
|
370
|
+
];
|
|
371
|
+
|
|
372
|
+
for (let i = 0; i < products.length; i++) {
|
|
373
|
+
const [rgb, roughness, metallic] = products[i];
|
|
374
|
+
|
|
375
|
+
place(sphere, surface(rgb, roughness, metallic), [-2.5 + i, 0.4, 0], [0.4, 0.4, 0.4]);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
place(knot, surface(from_srgb8(255, 110, 20), 0.3, 0), [0, 1.35, -1], [0.9, 0.9, 0.9]);
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
name: 'Product shot',
|
|
382
|
+
scene,
|
|
383
|
+
view: [[0, 1.4, 4.2], [0, 0.6, -0.5]],
|
|
384
|
+
exposure_ev: 0,
|
|
385
|
+
note: 'Studio light on a white sweep. Base colours given in sRGB: yellow 231,218,63 · red 203,63,63 · mint 149,218,188.',
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Every scene the page offers, in menu order.
|
|
391
|
+
*
|
|
392
|
+
* @param {Renderer} renderer
|
|
393
|
+
* @returns {Promise<ToneMapScene[]>}
|
|
394
|
+
*/
|
|
395
|
+
export async function create_scenes(renderer) {
|
|
396
|
+
await MeshoptClusterizer.ready;
|
|
397
|
+
|
|
398
|
+
return [
|
|
399
|
+
create_fire(renderer),
|
|
400
|
+
create_exterior(renderer),
|
|
401
|
+
create_interior(renderer),
|
|
402
|
+
create_product(renderer),
|
|
403
|
+
];
|
|
404
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/volumetrics_froxel/main.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/volumetrics_froxel/main.js"],"names":[],"mappings":"AA0fA,uCAgeC"}
|
|
@@ -16,6 +16,7 @@ import { load_gltf } from "../../renderer/loader/gltf/load_gltf.js";
|
|
|
16
16
|
import { Renderer } from "../../renderer/Renderer.js";
|
|
17
17
|
import { Scene } from "../../renderer/scene/Scene.js";
|
|
18
18
|
import {
|
|
19
|
+
participating_media_volume_advance_noise,
|
|
19
20
|
ParticipatingMediaVolume,
|
|
20
21
|
VolumetricsParticleSpec
|
|
21
22
|
} from "../../renderer/volumetrics/ParticipatingMediaVolume.js";
|
|
@@ -211,7 +212,20 @@ function add_participating_media(scene) {
|
|
|
211
212
|
* @param {number} spec.fade
|
|
212
213
|
* @param {number} [spec.yaw_degrees]
|
|
213
214
|
*/
|
|
214
|
-
|
|
215
|
+
/**
|
|
216
|
+
* @param {object} spec
|
|
217
|
+
* @param {number[]} spec.position
|
|
218
|
+
* @param {number[]} spec.scale
|
|
219
|
+
* @param {object} spec.particle from MIE_PARTICLES_STANDARD_PRECOMPUTED
|
|
220
|
+
* @param {number} spec.extinction
|
|
221
|
+
* @param {number} spec.fade
|
|
222
|
+
* @param {number} [spec.yaw_degrees]
|
|
223
|
+
* @param {number} [spec.noise_strength] 0 is the uniform medium; 1 is the engine's noise tile as
|
|
224
|
+
* it is, sampled in world space every `noise_scale` metres, scrolled by `NOISE_WIND` each frame
|
|
225
|
+
* @param {number} [spec.noise_scale]
|
|
226
|
+
* @param {number} [spec.noise_warp]
|
|
227
|
+
*/
|
|
228
|
+
function volume({ position, scale, particle, extinction, fade, yaw_degrees = 0, noise_strength = 0, noise_scale = 32, noise_warp = 0.1 }) {
|
|
215
229
|
const v = new ParticipatingMediaVolume();
|
|
216
230
|
|
|
217
231
|
v.transform.setTranslation(...position);
|
|
@@ -229,6 +243,14 @@ function add_participating_media(scene) {
|
|
|
229
243
|
v.particle_spec = VolumetricsParticleSpec.fromMeep(particle);
|
|
230
244
|
v.target_extinction = extinction;
|
|
231
245
|
|
|
246
|
+
v.noise_strength = noise_strength;
|
|
247
|
+
v.noise_scale = noise_scale;
|
|
248
|
+
v.noise_warp = noise_warp;
|
|
249
|
+
|
|
250
|
+
if (noise_strength > 0) {
|
|
251
|
+
noisy_volumes.add(v);
|
|
252
|
+
}
|
|
253
|
+
|
|
232
254
|
scene.volumetrics.add(v);
|
|
233
255
|
|
|
234
256
|
return v;
|
|
@@ -237,7 +259,8 @@ function add_participating_media(scene) {
|
|
|
237
259
|
const P = MIE_PARTICLES_STANDARD_PRECOMPUTED;
|
|
238
260
|
|
|
239
261
|
// the dense bank along the western edge — the thickest medium in the scene, and the one that
|
|
240
|
-
// fills the frame corners from the `vol_0` view
|
|
262
|
+
// fills the frame corners from the `vol_0` view. Noisy: the bank is what the "Fog bank" and
|
|
263
|
+
// "Inside the fog" viewpoints look at, so it is where the noise is judged and measured
|
|
241
264
|
volume({
|
|
242
265
|
position: [-55, 4, -5.116],
|
|
243
266
|
scale: [10, 3, 20],
|
|
@@ -245,24 +268,34 @@ function add_participating_media(scene) {
|
|
|
245
268
|
particle: P.CLOUD_DROPLET_LARGE,
|
|
246
269
|
extinction: 1,
|
|
247
270
|
fade: 0.5,
|
|
271
|
+
noise_strength: 1,
|
|
272
|
+
noise_scale: 20,
|
|
273
|
+
noise_warp: 0.15,
|
|
248
274
|
});
|
|
249
275
|
|
|
250
|
-
// graveyard
|
|
276
|
+
// graveyard — noisy: wisps 4 m apart (the default tile's four features over 16 m), drifting
|
|
277
|
+
// with the wind and changing shape as the warp tap slides against the base
|
|
251
278
|
volume({
|
|
252
279
|
position: [-51.98019820725889, 7.899311905935347, -15.3228393616169],
|
|
253
280
|
scale: [7, 5, 7],
|
|
254
281
|
particle: P.FOG_DROPLET_SMALL,
|
|
255
282
|
extinction: 0.4,
|
|
256
283
|
fade: 1,
|
|
284
|
+
noise_strength: 1,
|
|
285
|
+
noise_scale: 16,
|
|
286
|
+
noise_warp: 0.15,
|
|
257
287
|
});
|
|
258
288
|
|
|
259
|
-
// mine
|
|
289
|
+
// mine — noisy: coarser clumps of dust, warped harder
|
|
260
290
|
volume({
|
|
261
291
|
position: [-50.846390607312934, 0.3159949821015605, 17.89429433940319],
|
|
262
292
|
scale: [10, 7, 10],
|
|
263
293
|
particle: P.COARSE_DUST_MEDIUM,
|
|
264
294
|
extinction: 0.4,
|
|
265
295
|
fade: 4,
|
|
296
|
+
noise_strength: 1,
|
|
297
|
+
noise_scale: 24,
|
|
298
|
+
noise_warp: 0.25,
|
|
266
299
|
});
|
|
267
300
|
|
|
268
301
|
// large crystal
|
|
@@ -294,6 +327,52 @@ function add_participating_media(scene) {
|
|
|
294
327
|
});
|
|
295
328
|
}
|
|
296
329
|
|
|
330
|
+
/**
|
|
331
|
+
* The wind every noisy volume drifts with, metres a second. Gentle on purpose: the froxel TAA
|
|
332
|
+
* blends about 39 frames, and a feature that moves far inside that window smears.
|
|
333
|
+
* @type {number[]}
|
|
334
|
+
*/
|
|
335
|
+
const NOISE_WIND = [1.2, 0, 0.4];
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* One frame of the noise: what `ParticipatingMediaSystem` does for an ECS scene, done here by hand
|
|
339
|
+
* because this page builds its volumes directly. A debug global stands in for an A/B switch:
|
|
340
|
+
* `globalThis.__VOL_NOISE = 0` makes every noisy volume uniform (the branch the shader skips), `1`
|
|
341
|
+
* puts the noise back; `measure.js`'s `ab` flips it by frame blocks.
|
|
342
|
+
*
|
|
343
|
+
* @param {Scene} scene
|
|
344
|
+
* @param {number} dt seconds
|
|
345
|
+
*/
|
|
346
|
+
function advance_noise(scene, dt) {
|
|
347
|
+
const strength = globalThis.__VOL_NOISE ?? 1;
|
|
348
|
+
let changed = false;
|
|
349
|
+
|
|
350
|
+
for (const v of scene.volumetrics.volumes) {
|
|
351
|
+
if (!noisy_volumes.has(v)) {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (v.noise_strength !== strength) {
|
|
356
|
+
v.noise_strength = strength;
|
|
357
|
+
changed = true;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (strength > 0 && participating_media_volume_advance_noise(v, NOISE_WIND, dt)) {
|
|
361
|
+
changed = true;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (changed) {
|
|
366
|
+
scene.volumetrics.invalidate();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* The volumes `add_participating_media` gave noise, so the A/B switch knows which to touch.
|
|
372
|
+
* @type {Set<ParticipatingMediaVolume>}
|
|
373
|
+
*/
|
|
374
|
+
const noisy_volumes = new Set();
|
|
375
|
+
|
|
297
376
|
/**
|
|
298
377
|
* A rolling mean frame time, so the readout is legible rather than jittering.
|
|
299
378
|
*/
|
|
@@ -893,6 +972,8 @@ export async function start() {
|
|
|
893
972
|
return;
|
|
894
973
|
}
|
|
895
974
|
|
|
975
|
+
advance_noise(scene, time_delta_s);
|
|
976
|
+
|
|
896
977
|
renderer.render(camera, scene, time_delta_s);
|
|
897
978
|
|
|
898
979
|
frame_timer.add(raf_time_s);
|
|
@@ -49,16 +49,13 @@ wave/object checks. NSS uses the renderer's existing weight requirement and fall
|
|
|
49
49
|
when weights have not been installed; this standalone page does not supply NSS weights.
|
|
50
50
|
|
|
51
51
|
Inspection modes display prepared coverage, receiver UV, bounded path, classification/update count,
|
|
52
|
-
surface radiance, residual, RGB throughput, shared front throughput
|
|
53
|
-
and the confidence used to select the refraction lookup.
|
|
52
|
+
surface radiance, residual, RGB throughput, shared front throughput and water's normalization term.
|
|
54
53
|
They replace presentation **after** shared resolve and temporal processing, so diagnostics show
|
|
55
54
|
the current frame's measurements without TAA history. Internal-resolution measurements are
|
|
56
55
|
displayed with nearest sampling at the output resolution.
|
|
57
56
|
Shift-click requests one pixel from four prepared textures on the next frame; normal frames perform
|
|
58
57
|
no readback. Arrays are `receiver=[u,v,path,status+updates/32]`,
|
|
59
58
|
`transmission=[Tr,Tg,Tb,coverage]`, `radiance=[Wr,Wg,Wb,residual]`.
|
|
60
|
-
The separate `confidence` field is the final weight after rejecting unsupported lookups; the
|
|
61
|
-
confidence display reads this same weight rather than recomputing an approximation.
|
|
62
59
|
Status 0 is a converged Newton hit; codes 8–13 are validated HZB hits, 16–21 undisplaced opaque fallbacks,
|
|
63
60
|
24–29 bounded sky fallbacks, and 31 the below-interface control. The low three bits preserve the
|
|
64
61
|
Newton miss reason: 0 none/not attempted, 1 bounds/clip, 2 sky, 3 parallel/invalid, 4 ray interval,
|
|
@@ -87,14 +84,12 @@ reflection and in-scattered radiance and its RGB transmittance; shared resolve a
|
|
|
87
84
|
Rear transparent surfaces/particles are attenuated at their original screen positions. Their radiance
|
|
88
85
|
is not sampled through the bent ray. Missing/off-screen receivers get bounded, explicit fallbacks.
|
|
89
86
|
Missing receivers use the medium's extinction distance, bounded by the trace budget. Final shading
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
water thickness from that lookup's local receiver plane and
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
still show classified misses; Refraction confidence shows the displacement fade actually used by
|
|
97
|
-
the final image. Screen reflections also fade near the ray origin and frame
|
|
87
|
+
takes a validated receiver at its whole displacement, however near an object, the shore or the frame
|
|
88
|
+
edge it lies; a pixel without one shows its own undisplaced background. It then performs one
|
|
89
|
+
geometry-aware color lookup, derives water thickness from that lookup's local receiver plane and
|
|
90
|
+
builds its complete optical event. Nothing fades between the two lookups: any point between them is
|
|
91
|
+
one the ray never reached (see 2026-10-16 below). The raw receiver/residual displays show classified
|
|
92
|
+
misses. Screen reflections fade near the ray origin and frame
|
|
98
93
|
edges to avoid self-hit speckles, reusing the existing SSR back-face/thickness/vignette validation.
|
|
99
94
|
As in the paper, a converged Newton root is final: screen bounds plus the one-pixel and distance
|
|
100
95
|
residuals accept it, with no further visibility proof. Like the paper's method it can converge past
|
|
@@ -105,6 +100,8 @@ mip dimensions, including odd viewport sizes; it does not assume a floating halv
|
|
|
105
100
|
grid. It starts in the source pixel, since water is absent from opaque depth. HZB slab crossings
|
|
106
101
|
are intersected once with the selected receiver plane and validated again before shading. A second
|
|
107
102
|
Newton search here could jump past the first footprint to a root the traversal has ruled out.
|
|
103
|
+
Where that plane meets the ray past a floor's edge, over a texel that reads as sky, the texel the
|
|
104
|
+
traversal stopped on is validated on its own instead.
|
|
108
105
|
An exhausted traversal uses the control event. Color filtering accepts only taps on the validated
|
|
109
106
|
receiver's local plane, with geometric-normal and interface-side checks. Receiver selection retains
|
|
110
107
|
full-precision UV/path/control-path data. Final shading reads the same selected interface and
|
|
@@ -113,6 +110,18 @@ AVBOIT still supplies the sole transparency resolve.
|
|
|
113
110
|
Underwater transport, two-interface transport, transparent receivers and caustics remain the plan's
|
|
114
111
|
follow-on stage, rather than being implied by the below-interface/overlap controls.
|
|
115
112
|
|
|
113
|
+
2026-10-16: refraction has no fade. Three quarter-resolution passes used to slide the receiver UV
|
|
114
|
+
toward the pixel's own within 64 pixels of any dry pixel, emergent object or the sky, and near the
|
|
115
|
+
frame edge. On the Shore preset that faded 56 of 199 probed validated hits and removed 17 entirely,
|
|
116
|
+
and the slid lookup bent the floor into a ring around every post and the box. Seeding the fade from
|
|
117
|
+
pixels neither trace resolved instead pumped as the waves moved those failures: at the posts, 17.6
|
|
118
|
+
pixels a frame changed by more than 24 levels, against 0.8 with the old fade; seeding it in
|
|
119
|
+
proportion to the failures brought the rings back. Without any fade the floor stays straight and
|
|
120
|
+
the posts change 0.9 pixels a frame (16 stepped frames at 60 Hz, the default view, paired in one
|
|
121
|
+
page). What remains are the pixels whose rays pass behind a post: they show their own background,
|
|
122
|
+
in the post's outline displaced by the refraction offset. Filling them needs floor visible near the
|
|
123
|
+
post; the neighbours' offset lands on the post itself.
|
|
124
|
+
|
|
116
125
|
The tangent-plane update follows the paper's Appendix A, but geometry reconstruction differs:
|
|
117
126
|
Newton reads the unfiltered depth and geometric face normal at mip zero, rather than the paper's
|
|
118
127
|
distance-dependent mip filtering for local smoothness. The conservative HZB is a visibility
|
|
@@ -131,10 +140,9 @@ the traversal for failed pixels and screen reflections.
|
|
|
131
140
|
The main risks to check on target hardware are moving-wave temporal ghosts (water keeps the opaque
|
|
132
141
|
depth/motion contract), coarse 8×8 volume attenuation near thin/partial edges, tangent-plane hits at
|
|
133
142
|
depth discontinuities, and first activation of AVBOIT in otherwise opaque scenes. No paper performance
|
|
134
|
-
claim is adopted;
|
|
143
|
+
claim is adopted; geometry-aware filtering adds work to water rendering.
|
|
135
144
|
Water transient targets cost approximately 68 bytes per internal pixel before allocator lifetime
|
|
136
|
-
reuse,
|
|
137
|
-
32 bytes for receiver/trace metadata, 4 for interface depth, and 32 for final optics/background. The tiny-loss
|
|
145
|
+
reuse: 32 bytes for receiver/trace metadata, 4 for interface depth, and 32 for final optics/background. The tiny-loss
|
|
138
146
|
throughput target is float32 and is read through unfilterable loads, so float32-filterable is unnecessary.
|
|
139
147
|
|
|
140
148
|
The checker fixture uses 64 texels per square, preserving its world-space pattern while keeping
|
|
@@ -144,9 +152,9 @@ Numerical regressions execute production receiver/final-shading entries against
|
|
|
144
152
|
transport, and water's volume splat through shared integration at full, partial and odd-edge coverage.
|
|
145
153
|
They also cover the actual shared WGSL contribution/resolve, count conservation,
|
|
146
154
|
normal-incidence acceptance, analytic plane/sphere intersections, invalid rays, bounded fallback thickness,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
155
|
+
subpixel receiver thickness, grazing visibility intervals, odd-dimension traversal crossings, a hit on the
|
|
156
|
+
floor texel before the sky, receiver ownership at silhouettes, converged roots kept without a traversal
|
|
157
|
+
budget and old/new serialization.
|
|
150
158
|
Software-device orchestration verifies water precedes shared warp/integration/resolve without adding
|
|
151
159
|
another one. Visual checks are complementary: inspect TAA/fog, mixed sources, below-interface fallback,
|
|
152
160
|
overlap, no-water/MBOIT suppression, terrain replacement and device restart on a real GPU.
|
|
@@ -33,7 +33,7 @@ input[type=range]{width:135px}input[type=number]{width:84px}input,select,button,
|
|
|
33
33
|
<label>Internal scale<select id="resolution"><option value="1">1×</option><option value=".75">0.75×</option><option value=".5">0.5×</option></select></label>
|
|
34
34
|
<label>Opaque SSR<input id="ssr" type="checkbox"></label><label>Atmospheric fog<input id="fog" type="checkbox"></label>
|
|
35
35
|
<label>Transparency<select id="transparency"><option value="avboit">AVBOIT</option><option value="mboit">MBOIT (water unavailable)</option></select></label>
|
|
36
|
-
<h2>Inspect</h2><label>Display<select id="debug"><option value="0">Final composite</option><option value="1">Coverage</option><option value="2">Receiver UV</option><option value="3">Water path</option><option value="4">Trace status / updates</option><option value="5">Surface radiance</option><option value="6">Residual</option><option value="7">RGB throughput</option><option value="8">Shared front throughput</option><option value="9">Water normalization</option
|
|
36
|
+
<h2>Inspect</h2><label>Display<select id="debug"><option value="0">Final composite</option><option value="1">Coverage</option><option value="2">Receiver UV</option><option value="3">Water path</option><option value="4">Trace status / updates</option><option value="5">Surface radiance</option><option value="6">Residual</option><option value="7">RGB throughput</option><option value="8">Shared front throughput</option><option value="9">Water normalization</option></select></label>
|
|
37
37
|
<div class="row"><button id="compile">Compile check</button><button id="profile">Profile (T)</button></div><pre id="probe">Shift-click water to read a pixel.</pre>
|
|
38
38
|
<h2>Reproduce a view</h2><div class="row"><button id="copy">Copy state</button><button id="apply">Apply state</button></div><textarea id="state" aria-label="Saved camera and settings"></textarea>
|
|
39
39
|
<p>Rear transparent radiance is attenuated on its original screen path. Initial optics select one water interface; underwater transport and caustics are follow-on work. <a href="./README.md">Review guide</a></p>
|