@driftengine/core 3.62.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 +122 -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 +70 -4
- package/dist/index.js +123 -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 +47 -14
- package/dist/render/backend/webgpu/surfaceTexturePass.js +128 -80
- 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 +261 -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 +158 -88
- 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
|
@@ -209,45 +209,24 @@ export function createGpuMeshIncremental(device, data, dynamic = false) {
|
|
|
209
209
|
const indicesPerStep = Math.max(1, Math.floor(UPLOAD_BYTES_PER_STEP / indexWidth));
|
|
210
210
|
const totalSteps = Math.max(1, Math.ceil(vertexCount / verticesPerStep)) +
|
|
211
211
|
Math.max(1, Math.ceil(data.indices.length / indicesPerStep));
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
fieldOffset += width;
|
|
228
|
-
}
|
|
229
|
-
device.queue.writeBuffer(vertices, from * stride, interleaved, from * step, (to - from) * step);
|
|
230
|
-
taken += 1;
|
|
231
|
-
if (taken < totalSteps)
|
|
232
|
-
yield;
|
|
233
|
-
}
|
|
234
|
-
for (let from = 0; from < data.indices.length; from += indicesPerStep) {
|
|
235
|
-
const to = Math.min(from + indicesPerStep, data.indices.length);
|
|
236
|
-
device.queue.writeBuffer(indexBuffer, from * indexWidth, data.indices, from, to - from);
|
|
237
|
-
taken += 1;
|
|
238
|
-
if (taken < totalSteps)
|
|
239
|
-
yield;
|
|
240
|
-
}
|
|
241
|
-
uploaded = true;
|
|
242
|
-
}
|
|
243
|
-
const mesh = {
|
|
244
|
-
vertexBuffers: [vertices, constants],
|
|
212
|
+
/*
|
|
213
|
+
* **The mesh is assembled out here, by functions of its own, and that is the fix for a copy
|
|
214
|
+
* nobody named.** It was an object literal in this scope, and its `complete` getter shared this
|
|
215
|
+
* scope's context with the upload generator and the `filter` above, which both read `data` — V8
|
|
216
|
+
* gives every closure in a scope one context — so a getter returning a boolean held the whole
|
|
217
|
+
* `MeshData` and the interleaved rows for as long as the mesh lived. The voxel sandbox's forward
|
|
218
|
+
* path held 2,058 MB of ArrayBuffers at radius 32 against the second pipeline's 368.
|
|
219
|
+
* `meshRetention.test.ts` holds it: a mesh keeps its buffers, and a dynamic one its rows.
|
|
220
|
+
*/
|
|
221
|
+
const progress = { uploaded: false };
|
|
222
|
+
const mesh = gpuMeshOf({
|
|
223
|
+
vertices,
|
|
224
|
+
constants,
|
|
245
225
|
indexBuffer,
|
|
226
|
+
stride,
|
|
246
227
|
indexCount: data.indices.length,
|
|
247
228
|
bounds,
|
|
248
|
-
|
|
249
|
-
return uploaded;
|
|
250
|
-
},
|
|
229
|
+
progress,
|
|
251
230
|
hasTangents: data.tangents !== undefined,
|
|
252
231
|
isSkinned: data.joints !== undefined,
|
|
253
232
|
hasChannel: data.channel !== undefined,
|
|
@@ -256,35 +235,114 @@ export function createGpuMeshIncremental(device, data, dynamic = false) {
|
|
|
256
235
|
: new MorphTexture(device, data.morphTargets, data.positions.length / 3, data.morphTargetCount),
|
|
257
236
|
update: !dynamic
|
|
258
237
|
? null
|
|
259
|
-
: (
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
238
|
+
: dynamicUpdate(interleaved, vertices, bounds, vertexCount, step, positionField, normalField),
|
|
239
|
+
});
|
|
240
|
+
const job = {
|
|
241
|
+
data,
|
|
242
|
+
interleaved,
|
|
243
|
+
device,
|
|
244
|
+
supplied,
|
|
245
|
+
vertices,
|
|
246
|
+
indexBuffer,
|
|
247
|
+
vertexCount,
|
|
248
|
+
step,
|
|
249
|
+
stride,
|
|
250
|
+
verticesPerStep,
|
|
251
|
+
indicesPerStep,
|
|
252
|
+
totalSteps,
|
|
253
|
+
progress,
|
|
254
|
+
};
|
|
255
|
+
return { mesh, upload: uploadSteps(job) };
|
|
256
|
+
}
|
|
257
|
+
function* uploadSteps(job) {
|
|
258
|
+
const { device, supplied, vertices, indexBuffer, vertexCount, step, stride } = job;
|
|
259
|
+
let taken = 0;
|
|
260
|
+
for (let from = 0; from < vertexCount; from += job.verticesPerStep) {
|
|
261
|
+
const data = job.data;
|
|
262
|
+
const interleaved = job.interleaved;
|
|
263
|
+
const to = Math.min(from + job.verticesPerStep, vertexCount);
|
|
264
|
+
let fieldOffset = 0;
|
|
265
|
+
for (const attribute of supplied) {
|
|
266
|
+
const source = data[attribute.name];
|
|
267
|
+
const width = attribute.components;
|
|
268
|
+
for (let vertex = from; vertex < to; vertex++) {
|
|
269
|
+
for (let component = 0; component < width; component++) {
|
|
270
|
+
interleaved[vertex * step + fieldOffset + component] =
|
|
271
|
+
source[vertex * width + component] ?? 0;
|
|
278
272
|
}
|
|
279
|
-
|
|
280
|
-
|
|
273
|
+
}
|
|
274
|
+
fieldOffset += width;
|
|
275
|
+
}
|
|
276
|
+
device.queue.writeBuffer(vertices, from * stride, interleaved, from * step, (to - from) * step);
|
|
277
|
+
taken += 1;
|
|
278
|
+
if (taken < job.totalSteps)
|
|
279
|
+
yield;
|
|
280
|
+
}
|
|
281
|
+
const indices = job.data.indices;
|
|
282
|
+
const indexWidth = indices.BYTES_PER_ELEMENT;
|
|
283
|
+
for (let from = 0; from < indices.length; from += job.indicesPerStep) {
|
|
284
|
+
const to = Math.min(from + job.indicesPerStep, indices.length);
|
|
285
|
+
device.queue.writeBuffer(indexBuffer, from * indexWidth, indices, from, to - from);
|
|
286
|
+
taken += 1;
|
|
287
|
+
if (taken < job.totalSteps)
|
|
288
|
+
yield;
|
|
289
|
+
}
|
|
290
|
+
job.data = null;
|
|
291
|
+
job.interleaved = null;
|
|
292
|
+
job.progress.uploaded = true;
|
|
293
|
+
}
|
|
294
|
+
/** The handle, made where it can see only what it hands out. */
|
|
295
|
+
function gpuMeshOf(parts) {
|
|
296
|
+
const { vertices, constants, indexBuffer, progress } = parts;
|
|
297
|
+
return {
|
|
298
|
+
vertexBuffers: [vertices, constants],
|
|
299
|
+
vertexStride: parts.stride,
|
|
300
|
+
indexBuffer,
|
|
301
|
+
indexCount: parts.indexCount,
|
|
302
|
+
bounds: parts.bounds,
|
|
303
|
+
get complete() {
|
|
304
|
+
return progress.uploaded;
|
|
305
|
+
},
|
|
306
|
+
hasTangents: parts.hasTangents,
|
|
307
|
+
isSkinned: parts.isSkinned,
|
|
308
|
+
hasChannel: parts.hasChannel,
|
|
309
|
+
morph: parts.morph,
|
|
310
|
+
update: parts.update,
|
|
281
311
|
dispose() {
|
|
282
312
|
vertices.destroy();
|
|
283
313
|
constants.destroy();
|
|
284
314
|
indexBuffer.destroy();
|
|
285
315
|
},
|
|
286
316
|
};
|
|
287
|
-
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* A dynamic mesh's `update`, which keeps the interleaved rows and nothing else: it rewrites the
|
|
320
|
+
* positions and normals in them and uploads the whole buffer, so the other attributes it does not
|
|
321
|
+
* receive have to still be there.
|
|
322
|
+
*/
|
|
323
|
+
function dynamicUpdate(interleaved, vertices, bounds, vertexCount, step, positionField, normalField) {
|
|
324
|
+
return (target, positions, normals) => {
|
|
325
|
+
if (positions.length !== vertexCount * 3) {
|
|
326
|
+
throw new Error(`this mesh has ${vertexCount} vertices and the update has ${positions.length / 3}. ` +
|
|
327
|
+
"A mesh's vertex count is fixed at creation: the index buffer, the pipeline and " +
|
|
328
|
+
'every other attribute are sized against it.');
|
|
329
|
+
}
|
|
330
|
+
/* Everything that decides whether this is on screen starts from the bounds, so a cloth
|
|
331
|
+
that blew sideways out of its original box would be culled while still visible. */
|
|
332
|
+
boundsOfPositions(positions, bounds);
|
|
333
|
+
for (let vertex = 0; vertex < vertexCount; vertex++) {
|
|
334
|
+
const at = vertex * step;
|
|
335
|
+
interleaved[at + positionField] = positions[vertex * 3] ?? 0;
|
|
336
|
+
interleaved[at + positionField + 1] = positions[vertex * 3 + 1] ?? 0;
|
|
337
|
+
interleaved[at + positionField + 2] = positions[vertex * 3 + 2] ?? 0;
|
|
338
|
+
if (normals === undefined)
|
|
339
|
+
continue;
|
|
340
|
+
interleaved[at + normalField] = normals[vertex * 3] ?? 0;
|
|
341
|
+
interleaved[at + normalField + 1] = normals[vertex * 3 + 1] ?? 0;
|
|
342
|
+
interleaved[at + normalField + 2] = normals[vertex * 3 + 2] ?? 0;
|
|
343
|
+
}
|
|
344
|
+
target.queue.writeBuffer(vertices, 0, interleaved);
|
|
345
|
+
};
|
|
288
346
|
}
|
|
289
347
|
/**
|
|
290
348
|
* The buffer layouts a pipeline is built with, matching what `createGpuMesh` uploaded.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The world's distance field, composed on the device from what the frame declared.
|
|
3
|
+
*
|
|
4
|
+
* **Extracted from `GiFieldPass` rather than written beside it**, because two copies of this
|
|
5
|
+
* arithmetic is exactly the hazard `composeField.wgsl.ts` opens by naming: a shader and a
|
|
6
|
+
* TypeScript function cannot import a struct from each other, so every restatement of the layout
|
|
7
|
+
* is a place the two can drift. There was already one restatement — the reference and the shader,
|
|
8
|
+
* which `scripts/gi-parity.mjs` holds together. A third, in a renderer that composed its own field
|
|
9
|
+
* while a contributed pass composed another, would be one nothing checks.
|
|
10
|
+
*
|
|
11
|
+
* **What changed from the pass is where the instances come from.** `GiFieldPass` took them in its
|
|
12
|
+
* constructor and uploaded them once at `init`, which is right for a rig whose scene is fixed and
|
|
13
|
+
* wrong for a renderer whose consumer declares its fields every frame. Here the instances arrive
|
|
14
|
+
* in a `DistanceFieldScene`, the instance count reaches the shader through the params, and the
|
|
15
|
+
* samples live in a buffer that grows to fit the scene and is never reallocated by a steady one.
|
|
16
|
+
*
|
|
17
|
+
* **The samples are uploaded only when the packing changed.** A field is megabytes and a placement
|
|
18
|
+
* is bytes; a composer that rewrote the samples every frame would move the whole world across the
|
|
19
|
+
* bus to say what it said last frame. `DistanceFieldScene.packingChanged` is what knows.
|
|
20
|
+
*/
|
|
21
|
+
import type { ReadonlyMat4, ReadonlyVec3 } from 'gl-matrix';
|
|
22
|
+
import type { DistanceFieldScene } from '../../gi/fieldScene.ts';
|
|
23
|
+
import type { PassDistanceField } from '../../pass.ts';
|
|
24
|
+
/**
|
|
25
|
+
* What a composed field is, to anything that reads it.
|
|
26
|
+
*
|
|
27
|
+
* **Declared in `pass.ts` rather than here**, because it is what the seam hands a contributed pass
|
|
28
|
+
* and a second declaration of one shape is the drift this file's header is about. This is an alias
|
|
29
|
+
* so a reader of the composer does not have to leave it to learn what it produces.
|
|
30
|
+
*/
|
|
31
|
+
export type ComposedField = PassDistanceField;
|
|
32
|
+
/**
|
|
33
|
+
* What the renderer composes with when a consumer only said `quality.indirectLight`.
|
|
34
|
+
*
|
|
35
|
+
* **Three cascades of 49, four metres at the innermost**, which is `demo/giFieldRig.ts`'s
|
|
36
|
+
* measurement and its reasoning: 49 rather than 33 puts the innermost cascade's step at 16.7 cm
|
|
37
|
+
* rather than 25, the difference between a 1.1 m object having six samples across it and four.
|
|
38
|
+
* The three together are 1.4 MB on the device, and the outermost reaches sixteen metres — beyond
|
|
39
|
+
* which the chain's probe level answers and never declines.
|
|
40
|
+
*/
|
|
41
|
+
export declare const DEFAULT_FIELD_COMPOSE: FieldComposeOptions;
|
|
42
|
+
export interface FieldComposeOptions {
|
|
43
|
+
/** Samples a side, every cascade. */
|
|
44
|
+
readonly resolution: number;
|
|
45
|
+
readonly cascades: number;
|
|
46
|
+
/** The innermost cascade's half-extent in metres. Each one out reaches twice as far. */
|
|
47
|
+
readonly radius: number;
|
|
48
|
+
}
|
|
49
|
+
export declare class FieldComposer {
|
|
50
|
+
private readonly options;
|
|
51
|
+
private readonly samples;
|
|
52
|
+
/** The cascade geometry, kept on the CPU because `placeCascade` is what decides it. */
|
|
53
|
+
private readonly cascades;
|
|
54
|
+
private readonly device;
|
|
55
|
+
private readonly pipeline;
|
|
56
|
+
/** One a cascade, each binding that cascade's own params at its own aligned offset. */
|
|
57
|
+
private groups;
|
|
58
|
+
private readonly paramBuffer;
|
|
59
|
+
private readonly instanceBuffer;
|
|
60
|
+
private readonly fieldBuffer;
|
|
61
|
+
/** The colour of whatever won the union at each sample, three floats. */
|
|
62
|
+
private readonly albedoBuffer;
|
|
63
|
+
/**
|
|
64
|
+
* Where each cascade stands, as the field's readers see it: moved by a copy encoded after the
|
|
65
|
+
* composition, never written by the queue. See `cascadeStaged`.
|
|
66
|
+
*/
|
|
67
|
+
private readonly cascadeBuffer;
|
|
68
|
+
/**
|
|
69
|
+
* **This frame's bounds, on their way to `cascadeBuffer`.** A queue write lands when it is made
|
|
70
|
+
* and an encoded command when its command buffer runs, and a reader of the field — the march in
|
|
71
|
+
* a contributed pass's `prepare` — is encoded before the composition. Written straight into the
|
|
72
|
+
* buffer readers bind, the bounds arrived a frame ahead of the samples they describe, and every
|
|
73
|
+
* frame a cascade stepped the field was read one voxel off. Staged here and copied after the
|
|
74
|
+
* composition's dispatches, a reader before them sees last frame's bounds with last frame's
|
|
75
|
+
* samples and a reader after them sees this frame's with this frame's.
|
|
76
|
+
*/
|
|
77
|
+
private readonly cascadeStaged;
|
|
78
|
+
/**
|
|
79
|
+
* The declared sources' samples, grown to fit rather than allocated at the budget.
|
|
80
|
+
*
|
|
81
|
+
* **The budget is a ceiling and not a size.** `MAX_DISTANCE_FIELD_SAMPLES` is sixteen megabytes;
|
|
82
|
+
* a scene with two 33-cubed fields wants two hundred and eighty kilobytes, and a renderer that
|
|
83
|
+
* reserved the ceiling would charge every consumer for the largest one imaginable. It grows when
|
|
84
|
+
* a frame declares more than it holds and never shrinks, so a scene that cycles between two sets
|
|
85
|
+
* of fields settles rather than reallocating.
|
|
86
|
+
*/
|
|
87
|
+
private sourceBuffer;
|
|
88
|
+
private sourceFloats;
|
|
89
|
+
private readonly paramScratch;
|
|
90
|
+
private readonly cascadeScratch;
|
|
91
|
+
private readonly instanceScratch;
|
|
92
|
+
private readonly outerBounds;
|
|
93
|
+
/** False until a frame has actually composed something, so a reader knows not to trace. */
|
|
94
|
+
private composed;
|
|
95
|
+
/**
|
|
96
|
+
* The device's own clock around the dispatch, where it has one.
|
|
97
|
+
*
|
|
98
|
+
* **Moved here from `GiFieldPass` with the dispatch it measures.** A timestamp belongs beside
|
|
99
|
+
* the work, and this is now the only place the world's field is composed — so the figure a rig
|
|
100
|
+
* reports is the figure the renderer actually pays rather than a second composition's.
|
|
101
|
+
*/
|
|
102
|
+
private queries;
|
|
103
|
+
private queryResolve;
|
|
104
|
+
private queryRead;
|
|
105
|
+
private queryCopied;
|
|
106
|
+
private queryMapping;
|
|
107
|
+
private timed;
|
|
108
|
+
private composeMsValue;
|
|
109
|
+
constructor(device: GPUDevice, options: FieldComposeOptions);
|
|
110
|
+
/** One bind group a cascade. Rebuilt whenever the source buffer is replaced by a larger one. */
|
|
111
|
+
private rebuildGroups;
|
|
112
|
+
/**
|
|
113
|
+
* Make room for `floats` of samples, replacing the buffer and its bind groups if it is short.
|
|
114
|
+
*
|
|
115
|
+
* **Grown to exactly what is asked rather than doubled.** A doubling policy is for something
|
|
116
|
+
* appended to; this is rewritten whole whenever the packing changes, and the sizes involved are
|
|
117
|
+
* a scene's whole set of baked fields — a quantity that changes when the world does and not
|
|
118
|
+
* between frames of a steady one.
|
|
119
|
+
*/
|
|
120
|
+
private ensureSources;
|
|
121
|
+
private storage;
|
|
122
|
+
/** The composed field, or null until a frame has composed one. */
|
|
123
|
+
get field(): ComposedField | null;
|
|
124
|
+
/**
|
|
125
|
+
* Compose every cascade from what the frame declared, centred on the eye.
|
|
126
|
+
*
|
|
127
|
+
* One dispatch a cascade rather than one for all of them: each has its own origin and step, and
|
|
128
|
+
* a single dispatch would carry them in a buffer indexed by the invocation's own cascade — a
|
|
129
|
+
* divide and a dependent read per thread to save a handful of dispatches.
|
|
130
|
+
*
|
|
131
|
+
* **A frame that declared nothing composes nothing and says so.** An empty instance list would
|
|
132
|
+
* otherwise fill every cascade with the "no surface anywhere" value, which a march reads as an
|
|
133
|
+
* infinite empty room — a ray that travels its whole reach and reports a miss. That is the right
|
|
134
|
+
* answer, but it costs a full dispatch to write it and the field it produces was already there.
|
|
135
|
+
*/
|
|
136
|
+
compose(encoder: GPUCommandEncoder, scene: DistanceFieldScene, eye: ReadonlyVec3): void;
|
|
137
|
+
/**
|
|
138
|
+
* The device milliseconds the last measured composition took, or null where nothing measured it.
|
|
139
|
+
*
|
|
140
|
+
* One frame behind, because a timestamp is read back and a readback that blocked would be the
|
|
141
|
+
* measurement changing what it measures.
|
|
142
|
+
*/
|
|
143
|
+
get composeMs(): number | null;
|
|
144
|
+
/** Ask for the last frame's figure, once the frame that recorded it has been submitted. */
|
|
145
|
+
readTimings(): void;
|
|
146
|
+
dispose(): void;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The inverse of a rigid transform with a uniform scale, written into `out` at `at`.
|
|
150
|
+
*
|
|
151
|
+
* **Not a general inverse**, because `composeGlobalField` refuses anything else: a distance is not
|
|
152
|
+
* preserved by a non-uniform scale and there is no factor to correct one by. Transposing the
|
|
153
|
+
* rotation and dividing by the scale squared is exact for what is allowed, and a general inverse
|
|
154
|
+
* here would be a fourth spelling of a constraint stated three times already.
|
|
155
|
+
*/
|
|
156
|
+
export declare function writeInverse(m: ReadonlyMat4, out: Float32Array, at: number): void;
|