@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
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The frame's declared distance fields — what the renderer's indirect light may be traced against.
|
|
3
|
+
*
|
|
4
|
+
* **A consumer declares this, and the seam is `addOccluder`'s for `addOccluder`'s reason.** A
|
|
5
|
+
* distance field is the shape of a thing it is *safe* to be traced against, and only the consumer
|
|
6
|
+
* knows which of its objects that is true of: the terrain and the walls, not the leaves, not the
|
|
7
|
+
* water, not the thing that is about to be deleted. `quality.occlusionCulling` already makes that
|
|
8
|
+
* sentence about occluders and culls nothing until somebody declares one. This makes it about
|
|
9
|
+
* light, and lights nothing until somebody declares a field.
|
|
10
|
+
*
|
|
11
|
+
* **A field and its placement are separate arguments on purpose.** Forty identical pillars are one
|
|
12
|
+
* baked field and forty matrices: the samples are megabytes and the matrices are bytes. So a source
|
|
13
|
+
* declared twice in a frame is two instances sharing one packed copy of its samples, and the queue
|
|
14
|
+
* is what knows the difference.
|
|
15
|
+
*
|
|
16
|
+
* **The transform is copied and the samples are not.** A consumer holds a matrix and moves it —
|
|
17
|
+
* that is what a matrix is for — so a queue that kept the reference would replay every field
|
|
18
|
+
* wearing the last pose written, which is `DecalQueue`'s recorded mistake and is the dangerous
|
|
19
|
+
* kind: a plausible picture rather than a broken one. A `FieldSource`, by contrast, is baked and
|
|
20
|
+
* does not move, and copying its samples once a frame would move the whole field across the bus to
|
|
21
|
+
* say the same thing.
|
|
22
|
+
*
|
|
23
|
+
* **Records are pooled and never released**, per `AGENTS.md`: `reset` returns the count to zero
|
|
24
|
+
* and keeps the storage, so a steady scene allocates on its first frame and never again.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { assertCubicVoxels } from './globalField.ts';
|
|
28
|
+
|
|
29
|
+
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
30
|
+
import type { FieldSource } from './globalField.ts';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* How many placed fields one frame may declare.
|
|
34
|
+
*
|
|
35
|
+
* **Thirty-two, which is what `composeGlobalField` was measured against** — 707 ms on the CPU for
|
|
36
|
+
* thirty-two instances over four cascades, and the number the device composition has carried since.
|
|
37
|
+
* The cost is not in the count itself but in the instance buffer being sized once and bound for
|
|
38
|
+
* every cascade's dispatch, so it is a cap rather than a growth.
|
|
39
|
+
*/
|
|
40
|
+
export const MAX_DISTANCE_FIELDS = 32;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* How many samples the frame's distinct sources may add up to, across all of them.
|
|
44
|
+
*
|
|
45
|
+
* Four million floats is sixteen megabytes on the device, which is a 160-cubed field or two
|
|
46
|
+
* hundred 27-cubed ones. **The budget is over the distinct sources rather than the instances**,
|
|
47
|
+
* because that is what is actually uploaded.
|
|
48
|
+
*/
|
|
49
|
+
export const MAX_DISTANCE_FIELD_SAMPLES = 1 << 22;
|
|
50
|
+
|
|
51
|
+
/** One placed field. `transform` is this queue's own copy; `source` is the consumer's object. */
|
|
52
|
+
export interface DistanceFieldInstance {
|
|
53
|
+
/** The baked field. Shared by reference: it does not move and it is the large thing. */
|
|
54
|
+
source: FieldSource;
|
|
55
|
+
/** World from object, copied at the moment it was declared. Uniform scale only. */
|
|
56
|
+
readonly transform: Float32Array;
|
|
57
|
+
/**
|
|
58
|
+
* What colour this placement's surface is, copied like the transform. White where none was given.
|
|
59
|
+
*
|
|
60
|
+
* **A ray that lands on a wall needs to know what colour it is**, because what leaves a surface
|
|
61
|
+
* is the light arriving times its albedo — and a composed distance field is a union that has
|
|
62
|
+
* already forgotten which instance won. `demo/dev/bounce.html` is what made it necessary: a
|
|
63
|
+
* trace without it returned the same answer for a red wall and a white one.
|
|
64
|
+
*
|
|
65
|
+
* On the placement rather than the field, because the same baked shape is placed many times and
|
|
66
|
+
* two pillars cut from one mould may be painted differently.
|
|
67
|
+
*/
|
|
68
|
+
readonly albedo: Float32Array;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function newRecord(): DistanceFieldInstance {
|
|
72
|
+
return {
|
|
73
|
+
source: EMPTY_SOURCE,
|
|
74
|
+
transform: new Float32Array(16),
|
|
75
|
+
albedo: Float32Array.from([1, 1, 1]),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** A placeholder a pooled record holds before its first use, so `source` is never null. */
|
|
80
|
+
const EMPTY_SOURCE: FieldSource = {
|
|
81
|
+
field: new Float32Array(0),
|
|
82
|
+
dims: [0, 0, 0],
|
|
83
|
+
bounds: new Float32Array(6),
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export class DistanceFieldScene {
|
|
87
|
+
private readonly pool: DistanceFieldInstance[] = [];
|
|
88
|
+
private count = 0;
|
|
89
|
+
|
|
90
|
+
/** The distinct sources of this frame, in the order they were first declared. */
|
|
91
|
+
private readonly distinct: FieldSource[] = [];
|
|
92
|
+
/** Where each distinct source's samples start in the packed upload, in floats. */
|
|
93
|
+
private readonly offsets = new Map<FieldSource, number>();
|
|
94
|
+
private samples = 0;
|
|
95
|
+
|
|
96
|
+
/** The distinct sources of the frame that `reset` last ended, for `packingChanged`. */
|
|
97
|
+
private packed: FieldSource[] = [];
|
|
98
|
+
|
|
99
|
+
/** Set once when a budget is first reached, so a scene over it says so and then draws. */
|
|
100
|
+
private warnedInstances = false;
|
|
101
|
+
private warnedSamples = false;
|
|
102
|
+
|
|
103
|
+
/** How many placed fields this frame has recorded. */
|
|
104
|
+
get length(): number {
|
|
105
|
+
return this.count;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
|
|
109
|
+
get capacity(): number {
|
|
110
|
+
return this.pool.length;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** This frame's distinct sources, in the order their samples are packed. */
|
|
114
|
+
get sources(): readonly FieldSource[] {
|
|
115
|
+
return this.distinct;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Floats the packed upload holds — the sum of the distinct sources' fields. */
|
|
119
|
+
get sampleCount(): number {
|
|
120
|
+
return this.samples;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Whether the samples have to be uploaded again, or the placements alone will do.
|
|
125
|
+
*
|
|
126
|
+
* True when this frame's distinct sources are not the last frame's in the same order, since the
|
|
127
|
+
* offsets are positional. A scene whose fields never change answers false from its second frame
|
|
128
|
+
* on, which is what keeps a sixteen-megabyte upload out of the frame loop.
|
|
129
|
+
*/
|
|
130
|
+
get packingChanged(): boolean {
|
|
131
|
+
if (this.distinct.length !== this.packed.length) return true;
|
|
132
|
+
for (let i = 0; i < this.distinct.length; i += 1) {
|
|
133
|
+
if (this.distinct[i] !== this.packed[i]) return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Where a source's samples start in the packed upload, or -1 if it is not in this frame. */
|
|
139
|
+
offsetOf(source: FieldSource): number {
|
|
140
|
+
return this.offsets.get(source) ?? -1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Declare a field, placed.
|
|
145
|
+
*
|
|
146
|
+
* **A source whose samples do not fit is refused whole rather than clipped.** Half a field on the
|
|
147
|
+
* device is not a coarser field; it is a field whose far half reads whatever the buffer held, and
|
|
148
|
+
* that composes as surfaces that are not there — the failure Wave 4A already paid for once, where
|
|
149
|
+
* a phantom surface passed 111,907 parity samples and was found by looking at a picture.
|
|
150
|
+
*/
|
|
151
|
+
record(source: FieldSource, model: ReadonlyMat4, albedo?: ArrayLike<number>): void {
|
|
152
|
+
/*
|
|
153
|
+
* **Before anything else, because a malformed source is not a budget.** The two warnings below
|
|
154
|
+
* are a frame asking for more than it can carry and dropping the surplus is the honest answer;
|
|
155
|
+
* there is none to a source the composer cannot read. The renderer composes on the device and
|
|
156
|
+
* never reaches `composeGlobalField`, so its own check protects only the reference path.
|
|
157
|
+
*/
|
|
158
|
+
assertCubicVoxels(source);
|
|
159
|
+
if (this.count >= MAX_DISTANCE_FIELDS) {
|
|
160
|
+
if (!this.warnedInstances) {
|
|
161
|
+
this.warnedInstances = true;
|
|
162
|
+
console.warn(
|
|
163
|
+
`driftengine: more than ${MAX_DISTANCE_FIELDS} distance fields were declared in one ` +
|
|
164
|
+
'frame, so the rest are not traced against. Fields that never move are cheaper baked ' +
|
|
165
|
+
'into one source, which is composed as a single instance.',
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const known = this.offsets.get(source);
|
|
172
|
+
if (known === undefined) {
|
|
173
|
+
if (this.samples + source.field.length > MAX_DISTANCE_FIELD_SAMPLES) {
|
|
174
|
+
if (!this.warnedSamples) {
|
|
175
|
+
this.warnedSamples = true;
|
|
176
|
+
console.warn(
|
|
177
|
+
`driftengine: the frame's distance fields exceed ${MAX_DISTANCE_FIELD_SAMPLES} ` +
|
|
178
|
+
'samples, so this one is not traced against at all. A field composed in part reads ' +
|
|
179
|
+
'whatever the buffer held beyond it, which is surfaces that are not there.',
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.offsets.set(source, this.samples);
|
|
185
|
+
this.distinct.push(source);
|
|
186
|
+
this.samples += source.field.length;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
let record = this.pool[this.count];
|
|
190
|
+
if (record === undefined) {
|
|
191
|
+
record = newRecord();
|
|
192
|
+
this.pool.push(record);
|
|
193
|
+
}
|
|
194
|
+
record.source = source;
|
|
195
|
+
for (let at = 0; at < 16; at += 1) record.transform[at] = model[at] ?? 0;
|
|
196
|
+
/* Copied like the transform, and white where none was declared. */
|
|
197
|
+
for (let at = 0; at < 3; at += 1) record.albedo[at] = (albedo?.[at] as number | undefined) ?? 1;
|
|
198
|
+
this.count += 1;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
replay(each: (instance: DistanceFieldInstance) => void): void {
|
|
202
|
+
for (let i = 0; i < this.count; i += 1) {
|
|
203
|
+
const record = this.pool[i];
|
|
204
|
+
if (record !== undefined) each(record);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** Empty it for the next frame, keeping the storage and remembering what was packed. */
|
|
209
|
+
reset(): void {
|
|
210
|
+
this.packed = this.distinct.slice();
|
|
211
|
+
this.count = 0;
|
|
212
|
+
this.distinct.length = 0;
|
|
213
|
+
this.offsets.clear();
|
|
214
|
+
this.samples = 0;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* The world extent of everything a frame declared, into vectors the caller owns.
|
|
220
|
+
*
|
|
221
|
+
* **This is what a probe grid is fitted to when a scene declared none.** A renderer asked for
|
|
222
|
+
* indirect light has to put its probes somewhere, and the only description of the world it holds is
|
|
223
|
+
* the set of fields a consumer said its light may be traced against. That is also the *right*
|
|
224
|
+
* description: a grid sized to include everything drawn would spend its probes on the inside of the
|
|
225
|
+
* sky sphere, while a grid sized to the traceable geometry is a grid around the room.
|
|
226
|
+
*
|
|
227
|
+
* **Every corner is transformed, not the box.** A rotated box's axis-aligned extent is decided by
|
|
228
|
+
* where its corners went; transforming the two extremes and taking their min and max gives a box
|
|
229
|
+
* that is too small wherever a rotation is not a multiple of a quarter turn, and too small is a
|
|
230
|
+
* probe grid that stops short of the wall it is meant to surround.
|
|
231
|
+
*
|
|
232
|
+
* False when the frame declared nothing, rather than an empty box at the origin — which
|
|
233
|
+
* `fitProbeGrid` would answer with a plausible grid of one standing in a place no scene chose.
|
|
234
|
+
*/
|
|
235
|
+
export function distanceFieldBounds(
|
|
236
|
+
scene: DistanceFieldScene,
|
|
237
|
+
min: Float32Array,
|
|
238
|
+
max: Float32Array,
|
|
239
|
+
): boolean {
|
|
240
|
+
if (scene.length === 0) return false;
|
|
241
|
+
for (let axis = 0; axis < 3; axis += 1) {
|
|
242
|
+
min[axis] = Infinity;
|
|
243
|
+
max[axis] = -Infinity;
|
|
244
|
+
}
|
|
245
|
+
scene.replay((instance) => {
|
|
246
|
+
const box = instance.source.bounds;
|
|
247
|
+
const m = instance.transform;
|
|
248
|
+
for (let corner = 0; corner < 8; corner += 1) {
|
|
249
|
+
const x = box[(corner & 1) === 0 ? 0 : 3] as number;
|
|
250
|
+
const y = box[(corner & 2) === 0 ? 1 : 4] as number;
|
|
251
|
+
const z = box[(corner & 4) === 0 ? 2 : 5] as number;
|
|
252
|
+
for (let axis = 0; axis < 3; axis += 1) {
|
|
253
|
+
const value =
|
|
254
|
+
(m[axis] as number) * x +
|
|
255
|
+
(m[4 + axis] as number) * y +
|
|
256
|
+
(m[8 + axis] as number) * z +
|
|
257
|
+
(m[12 + axis] as number);
|
|
258
|
+
if (value < (min[axis] as number)) min[axis] = value;
|
|
259
|
+
if (value > (max[axis] as number)) max[axis] = value;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return true;
|
|
264
|
+
}
|