@driftengine/core 3.63.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +111 -0
- package/NOTICE +20 -0
- package/README.md +1 -1
- package/dist/core/loop.js +18 -2
- package/dist/core/storage.js +5 -0
- package/dist/geometry/meshBuilder.d.ts +1 -1
- package/dist/geometry/meshBuilder.js +6 -2
- package/dist/index.d.ts +69 -4
- package/dist/index.js +112 -2
- package/dist/input/input.js +6 -1
- package/dist/math/exact.d.ts +13 -3
- package/dist/math/exact.js +68 -3
- package/dist/math/frustum.d.ts +17 -2
- package/dist/math/frustum.js +24 -0
- package/dist/render/backend/api.d.ts +34 -1
- package/dist/render/backend/api.js +22 -1
- package/dist/render/backend/budget.d.ts +7 -6
- package/dist/render/backend/budget.js +7 -6
- package/dist/render/backend/createRenderer.d.ts +57 -0
- package/dist/render/backend/createRenderer.js +51 -2
- package/dist/render/backend/materialChanges.d.ts +41 -0
- package/dist/render/backend/materialChanges.js +38 -0
- package/dist/render/backend/select.js +8 -0
- package/dist/render/backend/webgl2/renderer.d.ts +80 -1
- package/dist/render/backend/webgl2/renderer.js +208 -10
- package/dist/render/backend/webgpu/buffers.d.ts +20 -1
- package/dist/render/backend/webgpu/buffers.js +116 -58
- package/dist/render/backend/webgpu/fieldCompose.d.ts +156 -0
- package/dist/render/backend/webgpu/fieldCompose.js +396 -0
- package/dist/render/backend/webgpu/giFieldPass.d.ts +66 -0
- package/dist/render/backend/webgpu/giFieldPass.js +137 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +728 -0
- package/dist/render/backend/webgpu/gpuDrivenPass.js +2473 -0
- package/dist/render/backend/webgpu/linePass.d.ts +4 -14
- package/dist/render/backend/webgpu/linePass.js +4 -33
- package/dist/render/backend/webgpu/probeBake.d.ts +148 -0
- package/dist/render/backend/webgpu/probeBake.js +493 -0
- package/dist/render/backend/webgpu/renderer.d.ts +379 -24
- package/dist/render/backend/webgpu/renderer.js +1369 -76
- package/dist/render/backend/webgpu/scatterPass.js +15 -1
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +19 -9
- package/dist/render/backend/webgpu/surfaceTexturePass.js +58 -32
- package/dist/render/causticsRenderer.d.ts +3 -1
- package/dist/render/causticsRenderer.js +4 -1
- package/dist/render/depthConvention.d.ts +12 -0
- package/dist/render/depthConvention.js +14 -0
- package/dist/render/deviceFeatures.d.ts +32 -0
- package/dist/render/deviceFeatures.js +41 -0
- package/dist/render/fog.d.ts +79 -0
- package/dist/render/fog.js +138 -0
- package/dist/render/frame/alias.d.ts +30 -0
- package/dist/render/frame/alias.js +61 -0
- package/dist/render/frame/deps.d.ts +37 -0
- package/dist/render/frame/deps.js +122 -0
- package/dist/render/frame/flushGraph.d.ts +43 -0
- package/dist/render/frame/flushGraph.js +84 -0
- package/dist/render/frame/graphSchedule.d.ts +49 -0
- package/dist/render/frame/graphSchedule.js +120 -0
- package/dist/render/frame/index.d.ts +15 -0
- package/dist/render/frame/index.js +8 -0
- package/dist/render/frame/lifetime.d.ts +24 -0
- package/dist/render/frame/lifetime.js +36 -0
- package/dist/render/frame/passTimings.d.ts +42 -0
- package/dist/render/frame/passTimings.js +38 -0
- package/dist/render/frame/validate.d.ts +15 -0
- package/dist/render/frame/validate.js +22 -0
- package/dist/render/frame/virtual.d.ts +44 -0
- package/dist/render/frame/virtual.js +61 -0
- package/dist/render/gi/chain.d.ts +82 -0
- package/dist/render/gi/chain.js +135 -0
- package/dist/render/gi/denoise.d.ts +114 -0
- package/dist/render/gi/denoise.js +169 -0
- package/dist/render/gi/fieldScene.d.ts +125 -0
- package/dist/render/gi/fieldScene.js +219 -0
- package/dist/render/gi/globalField.d.ts +157 -0
- package/dist/render/gi/globalField.js +373 -0
- package/dist/render/gi/probeGridFit.d.ts +24 -0
- package/dist/render/gi/probeGridFit.js +71 -0
- package/dist/render/gi/probeTrace.d.ts +82 -0
- package/dist/render/gi/probeTrace.js +128 -0
- package/dist/render/gi/probeVolume.d.ts +136 -0
- package/dist/render/gi/probeVolume.js +191 -0
- package/dist/render/gi/reflection.d.ts +73 -0
- package/dist/render/gi/reflection.js +109 -0
- package/dist/render/gi/traceField.d.ts +91 -0
- package/dist/render/gi/traceField.js +129 -0
- package/dist/render/gi/traceScreen.d.ts +68 -0
- package/dist/render/gi/traceScreen.js +82 -0
- package/dist/render/gpuScene.d.ts +38 -0
- package/dist/render/gpuScene.js +41 -0
- package/dist/render/gpudriven/alphaTest.d.ts +28 -0
- package/dist/render/gpudriven/alphaTest.js +32 -0
- package/dist/render/gpudriven/clusterUpload.d.ts +59 -0
- package/dist/render/gpudriven/clusterUpload.js +75 -0
- package/dist/render/gpudriven/clusterWorld.d.ts +57 -0
- package/dist/render/gpudriven/clusterWorld.js +155 -0
- package/dist/render/gpudriven/compact.d.ts +51 -0
- package/dist/render/gpudriven/compact.js +68 -0
- package/dist/render/gpudriven/cullClusters.d.ts +129 -0
- package/dist/render/gpudriven/cullClusters.js +237 -0
- package/dist/render/gpudriven/decodeTables.d.ts +64 -0
- package/dist/render/gpudriven/decodeTables.js +219 -0
- package/dist/render/gpudriven/frustum.d.ts +25 -0
- package/dist/render/gpudriven/frustum.js +59 -0
- package/dist/render/gpudriven/geometryHarness.d.ts +15 -0
- package/dist/render/gpudriven/geometryHarness.js +31 -0
- package/dist/render/gpudriven/hzb.d.ts +60 -0
- package/dist/render/gpudriven/hzb.js +97 -0
- package/dist/render/gpudriven/ibl.d.ts +85 -0
- package/dist/render/gpudriven/ibl.js +129 -0
- package/dist/render/gpudriven/indirect.d.ts +67 -0
- package/dist/render/gpudriven/indirect.js +77 -0
- package/dist/render/gpudriven/instances.d.ts +43 -0
- package/dist/render/gpudriven/instances.js +172 -0
- package/dist/render/gpudriven/lit.d.ts +165 -0
- package/dist/render/gpudriven/lit.js +165 -0
- package/dist/render/gpudriven/lodCut.d.ts +28 -0
- package/dist/render/gpudriven/lodCut.js +38 -0
- package/dist/render/gpudriven/materialBin.d.ts +60 -0
- package/dist/render/gpudriven/materialBin.js +108 -0
- package/dist/render/gpudriven/materialTable.d.ts +88 -0
- package/dist/render/gpudriven/materialTable.js +115 -0
- package/dist/render/gpudriven/pipeline.d.ts +135 -0
- package/dist/render/gpudriven/pipeline.js +237 -0
- package/dist/render/gpudriven/rangeAlloc.d.ts +50 -0
- package/dist/render/gpudriven/rangeAlloc.js +112 -0
- package/dist/render/gpudriven/sceneUpload.d.ts +96 -0
- package/dist/render/gpudriven/sceneUpload.js +115 -0
- package/dist/render/gpudriven/shadeBins.d.ts +92 -0
- package/dist/render/gpudriven/shadeBins.js +182 -0
- package/dist/render/gpudriven/shadow.d.ts +136 -0
- package/dist/render/gpudriven/shadow.js +224 -0
- package/dist/render/gpudriven/shadowCamera.d.ts +87 -0
- package/dist/render/gpudriven/shadowCamera.js +345 -0
- package/dist/render/gpudriven/streamScene.d.ts +194 -0
- package/dist/render/gpudriven/streamScene.js +459 -0
- package/dist/render/gpudriven/surfaceFrame.d.ts +25 -0
- package/dist/render/gpudriven/surfaceFrame.js +51 -0
- package/dist/render/gpudriven/twoPhase.d.ts +122 -0
- package/dist/render/gpudriven/twoPhase.js +160 -0
- package/dist/render/gpudriven/visbuffer.d.ts +25 -0
- package/dist/render/gpudriven/visbuffer.js +37 -0
- package/dist/render/halfFloat.d.ts +10 -0
- package/dist/render/halfFloat.js +23 -4
- package/dist/render/inference/attentionTiled.d.ts +27 -0
- package/dist/render/inference/attentionTiled.js +117 -0
- package/dist/render/inference/denseKernels.d.ts +29 -0
- package/dist/render/inference/denseKernels.js +312 -0
- package/dist/render/inference/device.d.ts +21 -0
- package/dist/render/inference/device.js +32 -0
- package/dist/render/inference/deviceGraph.d.ts +34 -0
- package/dist/render/inference/deviceGraph.js +17 -0
- package/dist/render/inference/fuse.d.ts +15 -0
- package/dist/render/inference/fuse.js +37 -0
- package/dist/render/inference/kernelKit.d.ts +52 -0
- package/dist/render/inference/kernelKit.js +70 -0
- package/dist/render/inference/kernels.d.ts +3 -0
- package/dist/render/inference/kernels.js +11 -0
- package/dist/render/inference/plan.d.ts +13 -0
- package/dist/render/inference/plan.js +18 -0
- package/dist/render/inference/reuse.d.ts +39 -0
- package/dist/render/inference/reuse.js +65 -0
- package/dist/render/inference/runner.d.ts +31 -0
- package/dist/render/inference/runner.js +175 -0
- package/dist/render/inference/schedule.d.ts +39 -0
- package/dist/render/inference/schedule.js +59 -0
- package/dist/render/inference/shapeKernels.d.ts +10 -0
- package/dist/render/inference/shapeKernels.js +80 -0
- package/dist/render/inference/spatialKernels.d.ts +21 -0
- package/dist/render/inference/spatialKernels.js +179 -0
- package/dist/render/inference/splatRaster.wgsl.d.ts +75 -0
- package/dist/render/inference/splatRaster.wgsl.js +337 -0
- package/dist/render/inference/splatTiles.d.ts +79 -0
- package/dist/render/inference/splatTiles.js +161 -0
- package/dist/render/lineBatch.d.ts +2 -5
- package/dist/render/lineBatch.js +4 -24
- package/dist/render/mesh.d.ts +4 -0
- package/dist/render/mesh.js +45 -1
- package/dist/render/pass.d.ts +145 -8
- package/dist/render/prefilterEnvMap.d.ts +22 -0
- package/dist/render/prefilterEnvMap.js +31 -0
- package/dist/render/readback.d.ts +30 -0
- package/dist/render/readback.js +47 -0
- package/dist/render/recon/clamp.d.ts +36 -0
- package/dist/render/recon/clamp.js +92 -0
- package/dist/render/recon/disocclusion.d.ts +60 -0
- package/dist/render/recon/disocclusion.js +109 -0
- package/dist/render/recon/frameGen.d.ts +81 -0
- package/dist/render/recon/frameGen.js +150 -0
- package/dist/render/recon/frameSizes.d.ts +34 -0
- package/dist/render/recon/frameSizes.js +58 -0
- package/dist/render/recon/jitter.d.ts +60 -0
- package/dist/render/recon/jitter.js +118 -0
- package/dist/render/recon/motionVectors.d.ts +55 -0
- package/dist/render/recon/motionVectors.js +107 -0
- package/dist/render/recon/reproject.d.ts +41 -0
- package/dist/render/recon/reproject.js +131 -0
- package/dist/render/recon/resolve.d.ts +90 -0
- package/dist/render/recon/resolve.js +313 -0
- package/dist/render/recon/tier.d.ts +24 -0
- package/dist/render/recon/tier.js +8 -0
- package/dist/render/reflectionProbe.d.ts +26 -0
- package/dist/render/reflectionProbe.js +33 -0
- package/dist/render/renderQuality.d.ts +69 -0
- package/dist/render/renderQuality.js +22 -0
- package/dist/render/screenSpaceReflection.d.ts +23 -0
- package/dist/render/screenSpaceReflection.js +22 -3
- package/dist/render/sdfFont.js +2 -0
- package/dist/render/segmentQuads.d.ts +13 -0
- package/dist/render/segmentQuads.js +32 -0
- package/dist/render/shaders/flat/lobes.d.ts +27 -0
- package/dist/render/shaders/flat/lobes.js +33 -3
- package/dist/render/shaders/flat/preamble.d.ts +7 -0
- package/dist/render/shaders/flat/preamble.js +24 -1
- package/dist/render/shaders/flat/probeGrid.d.ts +1 -1
- package/dist/render/shaders/flat/probeGrid.js +71 -2
- package/dist/render/shaders/generated/flat.wgsl.d.ts +48 -8
- package/dist/render/shaders/generated/flat.wgsl.js +64 -24
- package/dist/render/shaders/gi/composeField.wgsl.d.ts +56 -0
- package/dist/render/shaders/gi/composeField.wgsl.js +231 -0
- package/dist/render/shaders/gi/marchField.wgsl.d.ts +30 -0
- package/dist/render/shaders/gi/marchField.wgsl.js +141 -0
- package/dist/render/shaders/gi/probeBake.wgsl.d.ts +113 -0
- package/dist/render/shaders/gi/probeBake.wgsl.js +635 -0
- package/dist/render/shaders/gi/probeTrace.wgsl.d.ts +72 -0
- package/dist/render/shaders/gi/probeTrace.wgsl.js +261 -0
- package/dist/render/shaders/gi/probeVolume.wgsl.d.ts +49 -0
- package/dist/render/shaders/gi/probeVolume.wgsl.js +242 -0
- package/dist/render/shaders/gi/sampleField.wgsl.d.ts +32 -0
- package/dist/render/shaders/gi/sampleField.wgsl.js +134 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +26 -0
- package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +339 -0
- package/dist/render/shaders/gpudriven/compact.wgsl.d.ts +29 -0
- package/dist/render/shaders/gpudriven/compact.wgsl.js +58 -0
- package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +90 -0
- package/dist/render/shaders/gpudriven/cull.wgsl.js +423 -0
- package/dist/render/shaders/gpudriven/decode.wgsl.d.ts +72 -0
- package/dist/render/shaders/gpudriven/decode.wgsl.js +349 -0
- package/dist/render/shaders/gpudriven/environment.wgsl.d.ts +44 -0
- package/dist/render/shaders/gpudriven/environment.wgsl.js +137 -0
- package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +28 -0
- package/dist/render/shaders/gpudriven/fog.wgsl.js +107 -0
- package/dist/render/shaders/gpudriven/frameBlock.wgsl.d.ts +13 -0
- package/dist/render/shaders/gpudriven/frameBlock.wgsl.js +62 -0
- package/dist/render/shaders/gpudriven/materialBin.wgsl.d.ts +51 -0
- package/dist/render/shaders/gpudriven/materialBin.wgsl.js +112 -0
- package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +25 -0
- package/dist/render/shaders/gpudriven/materialTable.wgsl.js +43 -0
- package/dist/render/shaders/gpudriven/meshTransform.wgsl.d.ts +18 -0
- package/dist/render/shaders/gpudriven/meshTransform.wgsl.js +37 -0
- package/dist/render/shaders/gpudriven/present.wgsl.d.ts +43 -0
- package/dist/render/shaders/gpudriven/present.wgsl.js +127 -0
- package/dist/render/shaders/gpudriven/shade.wgsl.d.ts +127 -0
- package/dist/render/shaders/gpudriven/shade.wgsl.js +874 -0
- package/dist/render/shaders/gpudriven/shadow.wgsl.d.ts +44 -0
- package/dist/render/shaders/gpudriven/shadow.wgsl.js +308 -0
- package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.d.ts +28 -0
- package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.js +245 -0
- package/dist/render/shaders/network.wgsl.d.ts +101 -0
- package/dist/render/shaders/network.wgsl.js +206 -0
- package/dist/render/shaders/recon/motion.wgsl.d.ts +44 -0
- package/dist/render/shaders/recon/motion.wgsl.js +96 -0
- package/dist/render/shaders/recon/resolve.wgsl.d.ts +51 -0
- package/dist/render/shaders/recon/resolve.wgsl.js +733 -0
- package/dist/render/temporalAa.js +8 -33
- package/dist/render/textLayout.js +12 -6
- package/dist/render/textRenderer.d.ts +3 -1
- package/dist/render/textRenderer.js +4 -1
- package/dist/render/translucentQueue.d.ts +6 -0
- package/dist/render/translucentQueue.js +11 -0
- package/dist/render/windStreakRenderer.d.ts +2 -1
- package/dist/render/windStreakRenderer.js +3 -1
- package/dist/world/cell.d.ts +63 -0
- package/dist/world/cell.js +181 -0
- package/dist/world/cellStream.d.ts +103 -0
- package/dist/world/cellStream.js +198 -0
- package/dist/world/freeze.d.ts +81 -0
- package/dist/world/freeze.js +114 -0
- package/dist/world/rebase.d.ts +29 -0
- package/dist/world/rebase.js +41 -0
- package/package.json +8 -3
- package/scripts/frames.mjs +92 -0
- package/scripts/gpuCompute.mjs +323 -0
- package/scripts/png.d.mts +16 -0
- package/scripts/png.mjs +25 -0
- package/src/core/loop.ts +19 -2
- package/src/core/storage.ts +5 -0
- package/src/geometry/meshBuilder.ts +5 -1
- package/src/index.ts +246 -4
- package/src/input/input.ts +6 -1
- package/src/math/exact.ts +69 -3
- package/src/math/frustum.ts +52 -3
- package/src/render/backend/api.ts +42 -1
- package/src/render/backend/budget.ts +7 -6
- package/src/render/backend/createRenderer.ts +92 -3
- package/src/render/backend/materialChanges.ts +54 -0
- package/src/render/backend/select.ts +8 -0
- package/src/render/backend/webgl2/renderer.ts +211 -9
- package/src/render/backend/webgpu/buffers.ts +182 -69
- package/src/render/backend/webgpu/fieldCompose.ts +482 -0
- package/src/render/backend/webgpu/giFieldPass.ts +200 -0
- package/src/render/backend/webgpu/gpuDrivenPass.ts +2993 -0
- package/src/render/backend/webgpu/linePass.ts +4 -39
- package/src/render/backend/webgpu/probeBake.ts +588 -0
- package/src/render/backend/webgpu/renderer.ts +1481 -76
- package/src/render/backend/webgpu/scatterPass.ts +15 -1
- package/src/render/backend/webgpu/surfaceTexturePass.ts +63 -36
- package/src/render/causticsRenderer.ts +5 -2
- package/src/render/depthConvention.ts +15 -0
- package/src/render/deviceFeatures.ts +77 -0
- package/src/render/fog.ts +185 -0
- package/src/render/frame/alias.ts +97 -0
- package/src/render/frame/deps.ts +155 -0
- package/src/render/frame/flushGraph.ts +135 -0
- package/src/render/frame/graphSchedule.ts +170 -0
- package/src/render/frame/index.ts +52 -0
- package/src/render/frame/lifetime.ts +61 -0
- package/src/render/frame/passTimings.ts +69 -0
- package/src/render/frame/validate.ts +40 -0
- package/src/render/frame/virtual.ts +91 -0
- package/src/render/gi/chain.ts +225 -0
- package/src/render/gi/denoise.ts +276 -0
- package/src/render/gi/fieldScene.ts +264 -0
- package/src/render/gi/globalField.ts +543 -0
- package/src/render/gi/probeGridFit.ts +89 -0
- package/src/render/gi/probeTrace.ts +143 -0
- package/src/render/gi/probeVolume.ts +288 -0
- package/src/render/gi/reflection.ts +163 -0
- package/src/render/gi/traceField.ts +223 -0
- package/src/render/gi/traceScreen.ts +106 -0
- package/src/render/gpuScene.ts +80 -0
- package/src/render/gpudriven/alphaTest.ts +33 -0
- package/src/render/gpudriven/clusterUpload.ts +123 -0
- package/src/render/gpudriven/clusterWorld.ts +239 -0
- package/src/render/gpudriven/compact.ts +80 -0
- package/src/render/gpudriven/cullClusters.ts +333 -0
- package/src/render/gpudriven/decodeTables.ts +332 -0
- package/src/render/gpudriven/frustum.ts +70 -0
- package/src/render/gpudriven/geometryHarness.ts +51 -0
- package/src/render/gpudriven/hzb.ts +113 -0
- package/src/render/gpudriven/ibl.ts +147 -0
- package/src/render/gpudriven/indirect.ts +89 -0
- package/src/render/gpudriven/instances.ts +234 -0
- package/src/render/gpudriven/lit.ts +329 -0
- package/src/render/gpudriven/lodCut.ts +62 -0
- package/src/render/gpudriven/materialBin.ts +131 -0
- package/src/render/gpudriven/materialTable.ts +164 -0
- package/src/render/gpudriven/pipeline.ts +336 -0
- package/src/render/gpudriven/rangeAlloc.ts +122 -0
- package/src/render/gpudriven/sceneUpload.ts +173 -0
- package/src/render/gpudriven/shadeBins.ts +222 -0
- package/src/render/gpudriven/shadow.ts +285 -0
- package/src/render/gpudriven/shadowCamera.ts +406 -0
- package/src/render/gpudriven/streamScene.ts +575 -0
- package/src/render/gpudriven/surfaceFrame.ts +68 -0
- package/src/render/gpudriven/twoPhase.ts +214 -0
- package/src/render/gpudriven/visbuffer.ts +41 -0
- package/src/render/halfFloat.ts +22 -4
- package/src/render/inference/attentionTiled.ts +132 -0
- package/src/render/inference/denseKernels.ts +369 -0
- package/src/render/inference/device.ts +44 -0
- package/src/render/inference/deviceGraph.ts +39 -0
- package/src/render/inference/fuse.ts +47 -0
- package/src/render/inference/kernelKit.ts +120 -0
- package/src/render/inference/kernels.ts +18 -0
- package/src/render/inference/plan.ts +26 -0
- package/src/render/inference/reuse.ts +79 -0
- package/src/render/inference/runner.ts +204 -0
- package/src/render/inference/schedule.ts +80 -0
- package/src/render/inference/shapeKernels.ts +112 -0
- package/src/render/inference/spatialKernels.ts +220 -0
- package/src/render/inference/splatRaster.wgsl.ts +348 -0
- package/src/render/inference/splatTiles.ts +186 -0
- package/src/render/lineBatch.ts +4 -24
- package/src/render/mesh.ts +46 -1
- package/src/render/pass.ts +155 -10
- package/src/render/prefilterEnvMap.ts +33 -0
- package/src/render/readback.ts +73 -0
- package/src/render/recon/clamp.ts +113 -0
- package/src/render/recon/disocclusion.ts +143 -0
- package/src/render/recon/frameGen.ts +191 -0
- package/src/render/recon/frameSizes.ts +64 -0
- package/src/render/recon/jitter.ts +126 -0
- package/src/render/recon/motionVectors.ts +138 -0
- package/src/render/recon/reproject.ts +179 -0
- package/src/render/recon/resolve.ts +444 -0
- package/src/render/recon/tier.ts +31 -0
- package/src/render/reflectionProbe.ts +34 -0
- package/src/render/renderQuality.ts +87 -0
- package/src/render/screenSpaceReflection.ts +37 -3
- package/src/render/sdfFont.ts +2 -0
- package/src/render/segmentQuads.ts +39 -0
- package/src/render/shaders/flat/lobes.ts +35 -3
- package/src/render/shaders/flat/preamble.ts +25 -1
- package/src/render/shaders/flat/probeGrid.ts +77 -2
- package/src/render/shaders/generated/flat.wgsl.ts +64 -24
- package/src/render/shaders/gi/composeField.wgsl.ts +239 -0
- package/src/render/shaders/gi/marchField.wgsl.ts +146 -0
- package/src/render/shaders/gi/probeBake.wgsl.ts +649 -0
- package/src/render/shaders/gi/probeTrace.wgsl.ts +269 -0
- package/src/render/shaders/gi/probeVolume.wgsl.ts +246 -0
- package/src/render/shaders/gi/sampleField.wgsl.ts +140 -0
- package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +343 -0
- package/src/render/shaders/gpudriven/compact.wgsl.ts +59 -0
- package/src/render/shaders/gpudriven/cull.wgsl.ts +433 -0
- package/src/render/shaders/gpudriven/decode.wgsl.ts +373 -0
- package/src/render/shaders/gpudriven/environment.wgsl.ts +141 -0
- package/src/render/shaders/gpudriven/fog.wgsl.ts +110 -0
- package/src/render/shaders/gpudriven/frameBlock.wgsl.ts +62 -0
- package/src/render/shaders/gpudriven/materialBin.wgsl.ts +116 -0
- package/src/render/shaders/gpudriven/materialTable.wgsl.ts +46 -0
- package/src/render/shaders/gpudriven/meshTransform.wgsl.ts +37 -0
- package/src/render/shaders/gpudriven/present.wgsl.ts +129 -0
- package/src/render/shaders/gpudriven/shade.wgsl.ts +884 -0
- package/src/render/shaders/gpudriven/shadow.wgsl.ts +322 -0
- package/src/render/shaders/gpudriven/visbufferRaster.wgsl.ts +251 -0
- package/src/render/shaders/network.wgsl.ts +238 -0
- package/src/render/shaders/recon/motion.wgsl.ts +101 -0
- package/src/render/shaders/recon/resolve.wgsl.ts +741 -0
- package/src/render/temporalAa.ts +9 -33
- package/src/render/textLayout.ts +12 -6
- package/src/render/textRenderer.ts +5 -2
- package/src/render/translucentQueue.ts +11 -0
- package/src/render/windStreakRenderer.ts +4 -2
- package/src/world/cell.ts +231 -0
- package/src/world/cellStream.ts +278 -0
- package/src/world/freeze.ts +157 -0
- package/src/world/rebase.ts +56 -0
|
@@ -114,10 +114,24 @@ export interface ScreenSpaceHit {
|
|
|
114
114
|
v: number;
|
|
115
115
|
/** How far along the ray it was found, world metres. */
|
|
116
116
|
distanceM: number;
|
|
117
|
+
/**
|
|
118
|
+
* The closest this ray's whole path came to the edge of the frame, 0 to 0.5. Zero if it left.
|
|
119
|
+
*
|
|
120
|
+
* **Fading the *hit* is not enough, and that is what this is for.** `screenEdgeFade` softens a
|
|
121
|
+
* hit near the border so a reflection leaves rather than being cut off along a line — but a ray
|
|
122
|
+
* that runs off the edge *before* it hits anything returns no hit at all, and that is still a
|
|
123
|
+
* line. The two cases are adjacent: one pixel's ray grazes the border and lands, the next
|
|
124
|
+
* pixel's leaves and answers nothing.
|
|
125
|
+
*
|
|
126
|
+
* So the fade has to be driven by how close the *path* came, which only the march can see. A
|
|
127
|
+
* ray that stayed in the middle of the frame reports 0.5; one that skimmed the border reports
|
|
128
|
+
* almost nothing and fades out before its neighbour disappears.
|
|
129
|
+
*/
|
|
130
|
+
margin: number;
|
|
117
131
|
}
|
|
118
132
|
|
|
119
133
|
export function newScreenSpaceHit(): ScreenSpaceHit {
|
|
120
|
-
return { hit: false, u: 0, v: 0, distanceM: 0 };
|
|
134
|
+
return { hit: false, u: 0, v: 0, distanceM: 0, margin: 0 };
|
|
121
135
|
}
|
|
122
136
|
|
|
123
137
|
/**
|
|
@@ -185,6 +199,9 @@ export function traceScreenSpaceRay(
|
|
|
185
199
|
out.u = 0;
|
|
186
200
|
out.v = 0;
|
|
187
201
|
out.distanceM = 0;
|
|
202
|
+
out.margin = 0;
|
|
203
|
+
/* The closest the path has come to the border so far. See `ScreenSpaceHit.margin`. */
|
|
204
|
+
let margin = 0.5;
|
|
188
205
|
|
|
189
206
|
const steps = Math.max(1, Math.round(march.steps));
|
|
190
207
|
const ox = origin[0] ?? 0;
|
|
@@ -216,6 +233,7 @@ export function traceScreenSpaceRay(
|
|
|
216
233
|
const y = oy + dy * t;
|
|
217
234
|
const z = oz + dz * t;
|
|
218
235
|
if (!project(x, y, z, UV)) return false;
|
|
236
|
+
margin = Math.min(margin, edgeMargin(UV[0] ?? 0, UV[1] ?? 0));
|
|
219
237
|
|
|
220
238
|
const scene = sceneDistance(UV[0] ?? 0, UV[1] ?? 0);
|
|
221
239
|
/* Nothing was drawn here, so there is no surface to cross. Carried rather than treated as a
|
|
@@ -267,6 +285,7 @@ export function traceScreenSpaceRay(
|
|
|
267
285
|
out.u = hitU;
|
|
268
286
|
out.v = hitV;
|
|
269
287
|
out.distanceM = far;
|
|
288
|
+
out.margin = margin;
|
|
270
289
|
return true;
|
|
271
290
|
}
|
|
272
291
|
|
|
@@ -290,8 +309,23 @@ export function traceScreenSpaceRay(
|
|
|
290
309
|
*/
|
|
291
310
|
export function screenEdgeFade(u: number, v: number, band: number): number {
|
|
292
311
|
if (band <= 0) return u < 0 || u > 1 || v < 0 || v > 1 ? 0 : 1;
|
|
293
|
-
|
|
294
|
-
|
|
312
|
+
return edgeFade(edgeMargin(u, v), band);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/** How far a screen position is from the nearest border, 0 at it and 0.5 in the middle. */
|
|
316
|
+
export function edgeMargin(u: number, v: number): number {
|
|
317
|
+
return Math.min(u, 1 - u, v, 1 - v);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* A margin turned into a fade, so `screenEdgeFade` and `ScreenSpaceHit.margin` cannot disagree.
|
|
322
|
+
*
|
|
323
|
+
* One expression rather than two copies of it — the rule `REFLECTION_EDGE_FADE` states about the
|
|
324
|
+
* band applied one level down, to the arithmetic the band goes into.
|
|
325
|
+
*/
|
|
326
|
+
export function edgeFade(margin: number, band: number): number {
|
|
327
|
+
if (band <= 0) return margin < 0 ? 0 : 1;
|
|
328
|
+
return Math.min(1, Math.max(0, margin / band));
|
|
295
329
|
}
|
|
296
330
|
|
|
297
331
|
/**
|
package/src/render/sdfFont.ts
CHANGED
|
@@ -80,9 +80,11 @@ const SUPPORTED_VERSION = 1;
|
|
|
80
80
|
* beside a reference and they do not match. Every other required field is checked the same way.
|
|
81
81
|
*/
|
|
82
82
|
export function parseSdfFont(document: unknown): SdfFont {
|
|
83
|
+
// platform: feature probe — a bake and a worker both reach here without one
|
|
83
84
|
if (typeof document !== 'object' || document === null) {
|
|
84
85
|
throw new Error('parseSdfFont: expected a metrics object');
|
|
85
86
|
}
|
|
87
|
+
// platform: feature probe — guarded by the line above
|
|
86
88
|
const source = document as Record<string, unknown>;
|
|
87
89
|
if (source['version'] !== SUPPORTED_VERSION) {
|
|
88
90
|
throw new Error(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { BoltSegments } from './boltPool.ts';
|
|
2
|
+
import type { LineSegments } from './linePoints.ts';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* How a list of segments becomes triangles, held once for every renderer that draws one.
|
|
@@ -90,3 +91,41 @@ export function expandBoltSegments(
|
|
|
90
91
|
}
|
|
91
92
|
return count;
|
|
92
93
|
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Expand this frame's segments to their four vertices each, into arrays the caller owns.
|
|
97
|
+
*
|
|
98
|
+
* Returns how many segments were written, which is the list's count clamped to the batch's
|
|
99
|
+
* capacity — a caller that overruns loses its tail rather than its frame, the same rule
|
|
100
|
+
* `expandBoltSegments` follows. Reads only `LineSegments.from`/`.to`.
|
|
101
|
+
*
|
|
102
|
+
* **Both backends call it**, which is the reason it is here: the WebGL2 batch wrote the same walk
|
|
103
|
+
* inline until 2026-09-19, so the number of segments a batch draws — and so whether it draws at
|
|
104
|
+
* all, and is counted — was one decision written twice.
|
|
105
|
+
*/
|
|
106
|
+
export function expandLineSegments(
|
|
107
|
+
data: LineSegments,
|
|
108
|
+
capacity: number,
|
|
109
|
+
from: Float32Array,
|
|
110
|
+
to: Float32Array,
|
|
111
|
+
): number {
|
|
112
|
+
const count = Math.min(data.count, capacity);
|
|
113
|
+
for (let s = 0; s < count; s++) {
|
|
114
|
+
const fx = data.from[s * 3] as number;
|
|
115
|
+
const fy = data.from[s * 3 + 1] as number;
|
|
116
|
+
const fz = data.from[s * 3 + 2] as number;
|
|
117
|
+
const tx = data.to[s * 3] as number;
|
|
118
|
+
const ty = data.to[s * 3 + 1] as number;
|
|
119
|
+
const tz = data.to[s * 3 + 2] as number;
|
|
120
|
+
for (let c = 0; c < 4; c++) {
|
|
121
|
+
const v = s * 4 + c;
|
|
122
|
+
from[v * 3] = fx;
|
|
123
|
+
from[v * 3 + 1] = fy;
|
|
124
|
+
from[v * 3 + 2] = fz;
|
|
125
|
+
to[v * 3] = tx;
|
|
126
|
+
to[v * 3 + 1] = ty;
|
|
127
|
+
to[v * 3 + 2] = tz;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return count;
|
|
131
|
+
}
|
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
/** How light falls off with distance, and the specular lobes a highlight is made of. */
|
|
2
2
|
import { POINT_SHADOW_FADE_START } from '../../renderQuality.ts';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* How much of a self-lit surface's glow a shadow may take. See the GLSL constant's own comment.
|
|
6
|
+
*
|
|
7
|
+
* Exported because the GPU-driven pipeline dims its emission by the same share, and a number two
|
|
8
|
+
* shaders read is a number that belongs in one place.
|
|
9
|
+
*/
|
|
10
|
+
export const EMISSIVE_SHADOW_SHARE = 0.55;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The narrowest lobe this engine draws, as the distribution's own width.
|
|
14
|
+
*
|
|
15
|
+
* **Derived rather than chosen.** These lobes are divided by their own peak, `a2*a2 / (d*d)`, and
|
|
16
|
+
* the division is guarded at `1e-8` so a mirror cannot divide by nothing. At the peak `d` *is*
|
|
17
|
+
* `a2`, so the guard starts binding exactly where `a2*a2` reaches `1e-8` — at `a = 0.01` — and
|
|
18
|
+
* below that it scales the answer instead of protecting it: the peak fell to **0.0039 at roughness
|
|
19
|
+
* 0.05, 256 times dimmer than at 0.1**, so a polished surface had a fainter highlight than a satin
|
|
20
|
+
* one. Flooring `a` here keeps the peak at one for every roughness and leaves the guard as the
|
|
21
|
+
* guard it was meant to be.
|
|
22
|
+
*
|
|
23
|
+
* **What it gives up**: a surface smoother than this is drawn at this width rather than narrower.
|
|
24
|
+
* That is the same trade `sphereLobe` argues below — a reflection narrower than a fragment cannot
|
|
25
|
+
* be sampled and comes back as speckle — so the floor is where the engine stops pretending to
|
|
26
|
+
* resolve something it cannot. **What would make it wrong** is a path that integrates the lobe
|
|
27
|
+
* rather than sampling it at a point, where the narrow tail is carried by the integral;
|
|
28
|
+
* `prefilter.ts`'s `ggxDistribution` is that path, keeps the honest normalisation, and is
|
|
29
|
+
* deliberately not this.
|
|
30
|
+
*/
|
|
31
|
+
export const MIN_LOBE_ALPHA = 0.01;
|
|
32
|
+
|
|
4
33
|
export const LOBES_GLSL = `float shadowReach(float distance, float maxDistance) {
|
|
5
34
|
return 1.0 - smoothstep(
|
|
6
35
|
maxDistance * ${POINT_SHADOW_FADE_START.toFixed(2)},
|
|
@@ -53,7 +82,10 @@ const float MAX_FILTER_RADIUS = 0.25;
|
|
|
53
82
|
* something passed in front of it, which is worse. Just over half reads as an inlay lit
|
|
54
83
|
* from within a deck that is itself in shade.
|
|
55
84
|
*/
|
|
56
|
-
const float EMISSIVE_SHADOW_SHARE =
|
|
85
|
+
const float EMISSIVE_SHADOW_SHARE = ${EMISSIVE_SHADOW_SHARE};
|
|
86
|
+
|
|
87
|
+
/* The narrowest lobe this engine draws. See MIN_LOBE_ALPHA in this module for why it is this. */
|
|
88
|
+
const float MIN_LOBE_ALPHA = ${MIN_LOBE_ALPHA};
|
|
57
89
|
|
|
58
90
|
/*
|
|
59
91
|
* Trowbridge-Reitz, because the width of a highlight is the whole effect.
|
|
@@ -77,7 +109,7 @@ const float EMISSIVE_SHADOW_SHARE = 0.55;
|
|
|
77
109
|
* is a multiply cheaper than the honest spelling as well.
|
|
78
110
|
*/
|
|
79
111
|
float specularLobe(float ndh, float roughness) {
|
|
80
|
-
float a = max(roughness * roughness,
|
|
112
|
+
float a = max(roughness * roughness, MIN_LOBE_ALPHA);
|
|
81
113
|
float a2 = a * a;
|
|
82
114
|
float d = ndh * ndh * (a2 - 1.0) + 1.0;
|
|
83
115
|
return (a2 * a2) / max(d * d, 1e-8);
|
|
@@ -103,7 +135,7 @@ float specularLobe(float ndh, float roughness) {
|
|
|
103
135
|
* scene ever does, so r/d is large and its highlight is genuinely broad.
|
|
104
136
|
*/
|
|
105
137
|
float sphereLobe(float ndh, float roughness, float sourceRadius, float dist) {
|
|
106
|
-
float a = max(roughness * roughness,
|
|
138
|
+
float a = max(roughness * roughness, MIN_LOBE_ALPHA);
|
|
107
139
|
float widened = clamp(a + sourceRadius / max(2.0 * dist, 1e-3), a, 1.0);
|
|
108
140
|
float energy = (a / widened) * (a / widened);
|
|
109
141
|
float w2 = widened * widened;
|
|
@@ -10,6 +10,14 @@ import {
|
|
|
10
10
|
MAX_LIGHTS_PER_CLUSTER,
|
|
11
11
|
TABLE_WIDTH,
|
|
12
12
|
} from '../../clusteredLights.ts';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How much roughness a relieved or normal-mapped surface gains per unit of relief.
|
|
16
|
+
*
|
|
17
|
+
* Exported because the GPU-driven pipeline widens its roughness by a normal map's strength the way
|
|
18
|
+
* this shader does, and one number read by two shaders is a number that cannot drift between them.
|
|
19
|
+
*/
|
|
20
|
+
export const RELIEF_ROUGHNESS = 0.35;
|
|
13
21
|
import { MAX_SHADOW_FILTER_TAPS } from '../../renderQuality.ts';
|
|
14
22
|
import type { LightBudget } from '../../uniformVectorBudget.ts';
|
|
15
23
|
import { FOG_GLSL } from '../fog.ts';
|
|
@@ -48,7 +56,7 @@ in float vRoughness;
|
|
|
48
56
|
* because the amplitude is known here rather than measured off the screen.
|
|
49
57
|
*/
|
|
50
58
|
#define RELIEF_TILT 1.6
|
|
51
|
-
#define RELIEF_ROUGHNESS
|
|
59
|
+
#define RELIEF_ROUGHNESS ${RELIEF_ROUGHNESS}
|
|
52
60
|
/**
|
|
53
61
|
* The furthest a texture-derived bump may turn the shading normal, as a tangent.
|
|
54
62
|
*
|
|
@@ -482,6 +490,22 @@ uniform float uEnvironmentMaxLod;
|
|
|
482
490
|
* under-sampled and forced to a roughness it does not have.
|
|
483
491
|
*/
|
|
484
492
|
uniform float uEnvironmentEdge;
|
|
493
|
+
/**
|
|
494
|
+
* Whether the probe blend consults what each probe can see, and where those moments are.
|
|
495
|
+
*
|
|
496
|
+
* **Zero is off, and off is what every published scene is gated at.** On, each probe's visibility
|
|
497
|
+
* map is a *layer of this same array*, offset past the radiance layers by the grid's probe count:
|
|
498
|
+
* two moments a texel, the mean distance to geometry along a direction and the mean of its square.
|
|
499
|
+
*
|
|
500
|
+
* **In this array rather than a sampler of its own, and branched at run time rather than compiled
|
|
501
|
+
* in or out.** A sampler of its own would be a seventeenth on a backend that guarantees sixteen
|
|
502
|
+
* units — the reason \`environmentProbe\` is a permutation at all — and a permutation flag of its
|
|
503
|
+
* own would double the generated shader corpus for every consumer, which \`scripts/wgsl.ts\` prices
|
|
504
|
+
* at 400,728 to 597,638 gzipped bytes. Sharing the array costs neither: no new unit, no new
|
|
505
|
+
* permutation, and the arithmetic sits behind a branch on this uniform the way the clustered light
|
|
506
|
+
* table's does.
|
|
507
|
+
*/
|
|
508
|
+
uniform float uProbeVisibilityEnabled;
|
|
485
509
|
/**
|
|
486
510
|
* The level holding the cosine convolution, which is the scene's diffuse ambient.
|
|
487
511
|
*
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
/** Reading the probe array: which layers a point sits between, and what each of them holds. */
|
|
2
2
|
|
|
3
|
+
import {
|
|
4
|
+
PROBE_VISIBILITY_CRUSH,
|
|
5
|
+
PROBE_VISIBILITY_SHARPNESS,
|
|
6
|
+
PROBE_VISIBILITY_VARIANCE_FLOOR,
|
|
7
|
+
} from '../../gi/probeVolume.ts';
|
|
8
|
+
|
|
9
|
+
/** A number as GLSL always reads it as a float, so an integer constant is not an `int`. */
|
|
10
|
+
function glslFloat(value: number): string {
|
|
11
|
+
return Number.isInteger(value) ? value.toFixed(1) : String(value);
|
|
12
|
+
}
|
|
13
|
+
|
|
3
14
|
/**
|
|
4
15
|
* The lit pass's half of the grid, and the two things it has to get right.
|
|
5
16
|
*
|
|
@@ -83,6 +94,41 @@ vec3 probeRadiance(vec3 dir, float lod, float layer) {
|
|
|
83
94
|
return mix(fine, coarse, clamp(lod - lo, 0.0, 1.0));
|
|
84
95
|
}
|
|
85
96
|
|
|
97
|
+
/** Layers of radiance in the array, which is where the visibility moments start. */
|
|
98
|
+
float probeLayerCount() {
|
|
99
|
+
return uProbeGridCounts.x * uProbeGridCounts.y * uProbeGridCounts.z;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* How much of a probe a point can actually see, from one to zero.
|
|
104
|
+
*
|
|
105
|
+
* **The same arithmetic as "probeVisibilityWeight", and the constants are interpolated from it**
|
|
106
|
+
* rather than written again: one in front of what the probe saw along that direction, and behind it
|
|
107
|
+
* a Chebyshev bound on the variance of the distances the probe recorded — confident where the
|
|
108
|
+
* geometry is flat, uncertain where it is not, which is exactly where a hard answer would be wrong.
|
|
109
|
+
*
|
|
110
|
+
* The variance floor is not a tolerance. A probe facing a flat wall records the same distance in
|
|
111
|
+
* every direction of its cone, so the variance is exactly zero and the bound becomes a step: one in
|
|
112
|
+
* front of the wall and zero behind it, with a hard line between them that crawls every time the
|
|
113
|
+
* probes are rebaked.
|
|
114
|
+
*
|
|
115
|
+
* The moments live in the radiance array, offset past its layers by the grid's probe count, at
|
|
116
|
+
* level zero. See "uProbeVisibilityEnabled".
|
|
117
|
+
*/
|
|
118
|
+
float probeVisible(vec3 fromProbe, float distanceM, float layer) {
|
|
119
|
+
vec2 moments = textureLod(
|
|
120
|
+
uEnvironment,
|
|
121
|
+
vec3(octInsetUv(fromProbe, uEnvironmentEdge), layer + probeLayerCount()),
|
|
122
|
+
0.0
|
|
123
|
+
).rg;
|
|
124
|
+
if (distanceM <= moments.x) return 1.0;
|
|
125
|
+
float variance =
|
|
126
|
+
max(abs(moments.x * moments.x - moments.y), ${glslFloat(PROBE_VISIBILITY_VARIANCE_FLOOR)});
|
|
127
|
+
float beyond = distanceM - moments.x;
|
|
128
|
+
float chebyshev = variance / (variance + beyond * beyond);
|
|
129
|
+
return pow(chebyshev, ${glslFloat(PROBE_VISIBILITY_SHARPNESS)});
|
|
130
|
+
}
|
|
131
|
+
|
|
86
132
|
/**
|
|
87
133
|
* The grid's diffuse light at a point, trilinear over the eight probes around it.
|
|
88
134
|
*
|
|
@@ -101,14 +147,43 @@ vec3 gridIrradiance(vec3 dir, vec3 worldPos) {
|
|
|
101
147
|
vec3 frac;
|
|
102
148
|
probeCell(worldPos, base, frac);
|
|
103
149
|
vec3 sum = vec3(0.0);
|
|
150
|
+
/*
|
|
151
|
+
* **The weights are renormalised rather than used as they fall.** Multiplying by visibility takes
|
|
152
|
+
* energy out of the blend, and a blend that quietly drops a share of its probes darkens every
|
|
153
|
+
* bounce — the property "visibleProbes" states and the white furnace rests on.
|
|
154
|
+
*
|
|
155
|
+
* And a point every probe is blind to still gets an answer: inside a solid, or in a sealed void
|
|
156
|
+
* with a probe on each side of a wall, every weight crushes to nothing and the nearest probe
|
|
157
|
+
* takes the lot. This is the last level of the chain and there is nothing behind it.
|
|
158
|
+
*/
|
|
159
|
+
float total = 0.0;
|
|
160
|
+
float nearestDistance = 1.0e30;
|
|
161
|
+
vec3 nearestColour = vec3(0.0);
|
|
104
162
|
for (int c = 0; c < 8; c++) {
|
|
105
163
|
vec3 corner = vec3(float(c & 1), float((c >> 1) & 1), float((c >> 2) & 1));
|
|
106
164
|
vec3 axisWeight = mix(1.0 - frac, frac, corner);
|
|
107
165
|
float weight = axisWeight.x * axisWeight.y * axisWeight.z;
|
|
108
166
|
if (weight <= 0.0) continue;
|
|
109
|
-
|
|
167
|
+
float layer = probeLayer(base + corner);
|
|
168
|
+
vec3 colour = probeIrradiance(dir, layer);
|
|
169
|
+
float kept = weight;
|
|
170
|
+
if (uProbeVisibilityEnabled > 0.5) {
|
|
171
|
+
vec3 fromProbe = worldPos - (uProbeGridOrigin + (base + corner) / uProbeGridInvSpacing);
|
|
172
|
+
float distanceM = length(fromProbe);
|
|
173
|
+
/* A point standing exactly on a probe is seen by it, and has no direction to ask about. */
|
|
174
|
+
float seen = distanceM > 0.0 ? probeVisible(fromProbe / distanceM, distanceM, layer) : 1.0;
|
|
175
|
+
kept = weight * seen;
|
|
176
|
+
kept = kept < ${glslFloat(PROBE_VISIBILITY_CRUSH)} ? 0.0 : kept;
|
|
177
|
+
if (distanceM < nearestDistance) {
|
|
178
|
+
nearestDistance = distanceM;
|
|
179
|
+
nearestColour = colour;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
sum += colour * kept;
|
|
183
|
+
total += kept;
|
|
110
184
|
}
|
|
111
|
-
return sum;
|
|
185
|
+
if (uProbeVisibilityEnabled <= 0.5) return sum;
|
|
186
|
+
return total > 0.0 ? sum / total : nearestColour;
|
|
112
187
|
}
|
|
113
188
|
|
|
114
189
|
/**
|