@driftengine/core 3.63.0 → 4.1.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 +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
package/src/render/temporalAa.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { mat4 } from 'gl-matrix';
|
|
2
2
|
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
3
3
|
|
|
4
|
+
import { jitterTable } from './recon/jitter.ts';
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* The sub-pixel sequence a temporal resolve samples along, and the state that says whether there
|
|
6
8
|
* is anything to resolve *against* yet.
|
|
@@ -38,45 +40,19 @@ export const JITTER_PERIOD = 8;
|
|
|
38
40
|
export const TEMPORAL_HISTORY_BLEND = 0.9;
|
|
39
41
|
|
|
40
42
|
/**
|
|
41
|
-
* The
|
|
42
|
-
* before it fills a corner.
|
|
43
|
-
*
|
|
44
|
-
* Consecutive samples land as far from each other as the base allows, so eight of them cover the
|
|
45
|
-
* pixel evenly where eight random ones would leave holes and pairs.
|
|
46
|
-
*/
|
|
47
|
-
function halton(index: number, base: number): number {
|
|
48
|
-
let result = 0;
|
|
49
|
-
let fraction = 1;
|
|
50
|
-
let i = index;
|
|
51
|
-
while (i > 0) {
|
|
52
|
-
fraction /= base;
|
|
53
|
-
result += fraction * (i % base);
|
|
54
|
-
i = Math.floor(i / base);
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The period's offsets, centred so they sum to zero.
|
|
43
|
+
* The period's offsets, centred so they sum to zero — `recon/jitter.ts`'s sequence at eight phases.
|
|
61
44
|
*
|
|
62
|
-
* **
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* approximate, which is what lets the test assert it.
|
|
45
|
+
* **One sequence for the temporal resolve and for reconstruction**, and these are the numbers the
|
|
46
|
+
* resolve has always used: Halton in bases two and three, each period centred on its own mean,
|
|
47
|
+
* because accumulating towards an off-centre mean resolves to a picture displaced from the depth
|
|
48
|
+
* it was tested against.
|
|
67
49
|
*/
|
|
68
|
-
const OFFSETS
|
|
69
|
-
const raw: [number, number][] = [];
|
|
70
|
-
for (let i = 1; i <= JITTER_PERIOD; i++) raw.push([halton(i, 2), halton(i, 3)]);
|
|
71
|
-
const meanX = raw.reduce((sum, o) => sum + o[0], 0) / JITTER_PERIOD;
|
|
72
|
-
const meanY = raw.reduce((sum, o) => sum + o[1], 0) / JITTER_PERIOD;
|
|
73
|
-
return raw.map(([x, y]) => [x - meanX, y - meanY] as const);
|
|
74
|
-
})();
|
|
50
|
+
const OFFSETS = jitterTable(JITTER_PERIOD);
|
|
75
51
|
|
|
76
52
|
/** Where in its pixel frame `frameIndex` samples, in pixels, centred on zero. */
|
|
77
53
|
export function jitterOffset(frameIndex: number): readonly [number, number] {
|
|
78
54
|
const at = ((frameIndex % JITTER_PERIOD) + JITTER_PERIOD) % JITTER_PERIOD;
|
|
79
|
-
return OFFSETS[at] as
|
|
55
|
+
return [OFFSETS[at * 2] as number, OFFSETS[at * 2 + 1] as number];
|
|
80
56
|
}
|
|
81
57
|
|
|
82
58
|
/**
|
package/src/render/textLayout.ts
CHANGED
|
@@ -217,13 +217,19 @@ function buildCube(): { positions: Float32Array; normals: Float32Array; vertexCo
|
|
|
217
217
|
for (const face of faces) {
|
|
218
218
|
const [a, b, c, d] = face.corners as [Vec3, Vec3, Vec3, Vec3];
|
|
219
219
|
/*
|
|
220
|
-
* Wound
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
220
|
+
* **Wound the usual way, and it was wound backwards on purpose until 2026-09-16.**
|
|
221
|
+
*
|
|
222
|
+
* The comment that stood here said the vertex shader's Y flip mirrors the winding, so faces
|
|
223
|
+
* authored the usual way "come out back-facing and every one of them is culled". Measured on
|
|
224
|
+
* both backends, that is not what happens: with the usual winding both draw solid glyphs, and
|
|
225
|
+
* with the reversed one **WebGL2 draws a one-pixel sliver of every cell** while WebGPU draws
|
|
226
|
+
* them solid. The text on the default backend has been a dotted outline of itself.
|
|
227
|
+
*
|
|
228
|
+
* It survived because it is legible. A reader sees letters; only a capture beside the other
|
|
229
|
+
* backend says the cells are hollow, and `demo/dev/overlay.html` is where that comparison is
|
|
230
|
+
* cheap — 7,678 lit pixels against 14,982 for the same string.
|
|
225
231
|
*/
|
|
226
|
-
for (const corner of [a,
|
|
232
|
+
for (const corner of [a, b, c, a, c, d]) {
|
|
227
233
|
positions.push(corner[0], corner[1], corner[2]);
|
|
228
234
|
normals.push(face.normal[0], face.normal[1], face.normal[2]);
|
|
229
235
|
}
|
|
@@ -69,6 +69,8 @@ export class TextRenderer {
|
|
|
69
69
|
/**
|
|
70
70
|
* @param originX left edge, in pixels from the left of the viewport.
|
|
71
71
|
* @param originY baseline, in pixels from the top.
|
|
72
|
+
*
|
|
73
|
+
* Answers whether it drew, which the renderer counts on its frame budget.
|
|
72
74
|
*/
|
|
73
75
|
draw(
|
|
74
76
|
viewportWidth: number,
|
|
@@ -77,8 +79,8 @@ export class TextRenderer {
|
|
|
77
79
|
originY: number,
|
|
78
80
|
style: TextStyle,
|
|
79
81
|
timeSec: number,
|
|
80
|
-
):
|
|
81
|
-
if (this.layout.instanceCount === 0 || style.alpha <= 0) return;
|
|
82
|
+
): boolean {
|
|
83
|
+
if (this.layout.instanceCount === 0 || style.alpha <= 0) return false;
|
|
82
84
|
const gl = this.gl;
|
|
83
85
|
|
|
84
86
|
gl.useProgram(this.program);
|
|
@@ -137,6 +139,7 @@ export class TextRenderer {
|
|
|
137
139
|
|
|
138
140
|
gl.drawArraysInstanced(gl.TRIANGLES, 0, TEXT_CUBE.vertexCount, this.layout.instanceCount);
|
|
139
141
|
gl.bindVertexArray(null);
|
|
142
|
+
return true;
|
|
140
143
|
}
|
|
141
144
|
|
|
142
145
|
dispose(): void {
|
|
@@ -83,12 +83,21 @@ function newRecord(): PooledDraw {
|
|
|
83
83
|
export class TranslucentQueue {
|
|
84
84
|
private readonly pool: PooledDraw[] = [];
|
|
85
85
|
private count = 0;
|
|
86
|
+
private refracting = 0;
|
|
86
87
|
|
|
87
88
|
/** How many draws this frame has recorded. */
|
|
88
89
|
get length(): number {
|
|
89
90
|
return this.count;
|
|
90
91
|
}
|
|
91
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Whether anything recorded this frame refracts, so a backend replaying the set knows to copy the
|
|
95
|
+
* frame behind it first, and does not copy it for a set that never reads it.
|
|
96
|
+
*/
|
|
97
|
+
get refracts(): boolean {
|
|
98
|
+
return this.refracting > 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
92
101
|
/** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
|
|
93
102
|
get capacity(): number {
|
|
94
103
|
return this.pool.length;
|
|
@@ -128,6 +137,7 @@ export class TranslucentQueue {
|
|
|
128
137
|
record.tint = record.tintStore;
|
|
129
138
|
}
|
|
130
139
|
record.refraction = options.refraction ?? 0;
|
|
140
|
+
if (record.refraction > 0) this.refracting++;
|
|
131
141
|
record.thicknessM = options.thicknessM ?? 0;
|
|
132
142
|
const refractTint = options.refractTint ?? null;
|
|
133
143
|
if (refractTint === null) {
|
|
@@ -157,5 +167,6 @@ export class TranslucentQueue {
|
|
|
157
167
|
/** Empty it for the next frame, keeping the storage. */
|
|
158
168
|
reset(): void {
|
|
159
169
|
this.count = 0;
|
|
170
|
+
this.refracting = 0;
|
|
160
171
|
}
|
|
161
172
|
}
|
|
@@ -76,6 +76,7 @@ export class WindStreakRenderer {
|
|
|
76
76
|
/** Refilled per call rather than allocated; this is a per-frame path. */
|
|
77
77
|
private readonly resolved = createResolvedWindStreaks();
|
|
78
78
|
|
|
79
|
+
/** Answers whether it drew, which the renderer counts on its frame budget. */
|
|
79
80
|
draw(
|
|
80
81
|
gl: WebGL2RenderingContext,
|
|
81
82
|
camera: FrameView,
|
|
@@ -84,7 +85,7 @@ export class WindStreakRenderer {
|
|
|
84
85
|
tint: Vec3,
|
|
85
86
|
/** True when the camera is below the waterline. */
|
|
86
87
|
submerged = false,
|
|
87
|
-
):
|
|
88
|
+
): boolean {
|
|
88
89
|
/* Chosen in `windStreakDraw.ts` so both backends show the same weather. */
|
|
89
90
|
const settled = resolveWindStreaks(
|
|
90
91
|
wind.speed,
|
|
@@ -95,7 +96,7 @@ export class WindStreakRenderer {
|
|
|
95
96
|
submerged,
|
|
96
97
|
this.resolved,
|
|
97
98
|
);
|
|
98
|
-
if (!settled.visible) return;
|
|
99
|
+
if (!settled.visible) return false;
|
|
99
100
|
|
|
100
101
|
const u = this.uniforms;
|
|
101
102
|
gl.useProgram(this.program);
|
|
@@ -120,6 +121,7 @@ export class WindStreakRenderer {
|
|
|
120
121
|
gl.enable(gl.CULL_FACE);
|
|
121
122
|
gl.depthMask(true);
|
|
122
123
|
gl.disable(gl.BLEND);
|
|
124
|
+
return true;
|
|
123
125
|
}
|
|
124
126
|
|
|
125
127
|
dispose(gl: WebGL2RenderingContext): void {
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The world as a sparse grid of cells: the unit that streams, freezes and rebases.
|
|
3
|
+
*
|
|
4
|
+
* **A position on a boundary belongs to exactly one cell, and which one is decided by `Math.floor`
|
|
5
|
+
* rather than by rounding.** Both sides, or neither, are the two ways this goes wrong, and both
|
|
6
|
+
* present as an entity that flickers between cells while standing still — which then flickers
|
|
7
|
+
* between loaded and unloaded.
|
|
8
|
+
*
|
|
9
|
+
* **Negative coordinates work.** A naive bit-packing of the grid coordinate breaks below zero and
|
|
10
|
+
* the symptom is a world that is fine in one quadrant, which is the quadrant anybody tests in.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { mat4 } from 'gl-matrix';
|
|
14
|
+
import { boxInFrustum, frustumFromViewProjection } from '../math/frustum.ts';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Bits per axis in a packed cell identifier.
|
|
18
|
+
*
|
|
19
|
+
* Seventeen gives ±65,536 cells an axis, and three of them multiply to 2.25e15 — inside the
|
|
20
|
+
* 9.01e15 an integer stays exact in a double. At a 256-metre cell that is ±16,777 km an axis,
|
|
21
|
+
* which is more world than anybody has; at one metre it is still ±65 km.
|
|
22
|
+
*/
|
|
23
|
+
const AXIS_BITS = 17;
|
|
24
|
+
const AXIS_SPAN = 1 << AXIS_BITS;
|
|
25
|
+
const AXIS_BIAS = AXIS_SPAN >> 1;
|
|
26
|
+
|
|
27
|
+
/** The grid coordinate a world coordinate falls in. */
|
|
28
|
+
export function cellCoord(value: number, size: number): number {
|
|
29
|
+
return Math.floor(value / size);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Whether these grid coordinates fit the packing. See `AXIS_BITS` for the range. */
|
|
33
|
+
export function cellCoordInRange(c: number): boolean {
|
|
34
|
+
return Number.isInteger(c) && c >= -AXIS_BIAS && c < AXIS_BIAS;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Pack grid coordinates into one identifier.
|
|
39
|
+
*
|
|
40
|
+
* **Out of range throws rather than wrapping**, and the reason is what wrapping does: a coordinate
|
|
41
|
+
* past the bias produces an identifier belonging to a different, real cell, so two distant places
|
|
42
|
+
* in the world silently become the same cell. That is a corruption with no symptom near where it
|
|
43
|
+
* happened. This is a streaming-time path, not a per-vertex one, so the check costs nothing that
|
|
44
|
+
* matters.
|
|
45
|
+
*/
|
|
46
|
+
export function cellIdFrom(cx: number, cy: number, cz: number): number {
|
|
47
|
+
if (!cellCoordInRange(cx) || !cellCoordInRange(cy) || !cellCoordInRange(cz)) {
|
|
48
|
+
throw new RangeError(
|
|
49
|
+
`cell coordinate (${cx}, ${cy}, ${cz}) is outside the ±${AXIS_BIAS} the packing holds`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
const x = cx + AXIS_BIAS;
|
|
53
|
+
const y = cy + AXIS_BIAS;
|
|
54
|
+
const z = cz + AXIS_BIAS;
|
|
55
|
+
/* Multiplication rather than shifts: a shift in JavaScript is 32-bit and would wrap here. */
|
|
56
|
+
return (x * AXIS_SPAN + y) * AXIS_SPAN + z;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function cellIdFor(x: number, y: number, z: number, size: number): number {
|
|
60
|
+
return cellIdFrom(cellCoord(x, size), cellCoord(y, size), cellCoord(z, size));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function cellCoordsOf(id: number, out: Int32Array): void {
|
|
64
|
+
const z = id % AXIS_SPAN;
|
|
65
|
+
const rest = (id - z) / AXIS_SPAN;
|
|
66
|
+
const y = rest % AXIS_SPAN;
|
|
67
|
+
const x = (rest - y) / AXIS_SPAN;
|
|
68
|
+
out[0] = x - AXIS_BIAS;
|
|
69
|
+
out[1] = y - AXIS_BIAS;
|
|
70
|
+
out[2] = z - AXIS_BIAS;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const COORDS = new Int32Array(3);
|
|
74
|
+
|
|
75
|
+
/** Minimum corner and size, in world units. */
|
|
76
|
+
export function cellBounds(id: number, size: number, out: Float64Array): void {
|
|
77
|
+
cellCoordsOf(id, COORDS);
|
|
78
|
+
out[0] = (COORDS[0] as number) * size;
|
|
79
|
+
out[1] = (COORDS[1] as number) * size;
|
|
80
|
+
out[2] = (COORDS[2] as number) * size;
|
|
81
|
+
out[3] = size;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Every cell within `radius` of a point, appended to `out`.
|
|
86
|
+
*
|
|
87
|
+
* Symmetric about the centre and conservative: a cell the sphere merely touches is included,
|
|
88
|
+
* because the cost of an extra cell is a wasted load and the cost of a missing one is a hole.
|
|
89
|
+
*/
|
|
90
|
+
export function cellsInRadius(
|
|
91
|
+
x: number,
|
|
92
|
+
y: number,
|
|
93
|
+
z: number,
|
|
94
|
+
radius: number,
|
|
95
|
+
size: number,
|
|
96
|
+
out: number[],
|
|
97
|
+
): number {
|
|
98
|
+
out.length = 0;
|
|
99
|
+
const lo = [
|
|
100
|
+
cellCoord(x - radius, size),
|
|
101
|
+
cellCoord(y - radius, size),
|
|
102
|
+
cellCoord(z - radius, size),
|
|
103
|
+
];
|
|
104
|
+
const hi = [
|
|
105
|
+
cellCoord(x + radius, size),
|
|
106
|
+
cellCoord(y + radius, size),
|
|
107
|
+
cellCoord(z + radius, size),
|
|
108
|
+
];
|
|
109
|
+
for (let cx = lo[0] as number; cx <= (hi[0] as number); cx += 1) {
|
|
110
|
+
for (let cy = lo[1] as number; cy <= (hi[1] as number); cy += 1) {
|
|
111
|
+
for (let cz = lo[2] as number; cz <= (hi[2] as number); cz += 1) {
|
|
112
|
+
out.push(cellIdFrom(cx, cy, cz));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return out.length;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The grid a query walks: its cell, and the most cells one query may walk.
|
|
121
|
+
*
|
|
122
|
+
* **The limit is stated rather than discovered.** A view's frustum is bounded by its far plane, and
|
|
123
|
+
* a far plane a thousand cells away is a million-cell walk per predicted frame — a frame-time cliff
|
|
124
|
+
* that looks like a hang. A query that would walk more than `maxCells` refuses and says how many.
|
|
125
|
+
*/
|
|
126
|
+
export interface CellGrid {
|
|
127
|
+
/** Cell edge length, world units. */
|
|
128
|
+
readonly size: number;
|
|
129
|
+
readonly maxCells: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function createCellGrid(size: number, maxCells = 65_536): CellGrid {
|
|
133
|
+
if (!(size > 0 && size < Infinity)) {
|
|
134
|
+
throw new RangeError(`a cell of ${String(size)} units is not a cell`);
|
|
135
|
+
}
|
|
136
|
+
if (!(Number.isInteger(maxCells) && maxCells >= 1)) {
|
|
137
|
+
throw new RangeError(`a limit of ${String(maxCells)} cells is not a limit`);
|
|
138
|
+
}
|
|
139
|
+
return { size, maxCells };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Double precision throughout: a world past 2^24 units is what this grid is for. */
|
|
143
|
+
const PLANES = new Float64Array(24);
|
|
144
|
+
const INVERSE = new Float64Array(16);
|
|
145
|
+
const CORNER_LOW = new Float64Array(3);
|
|
146
|
+
const CORNER_HIGH = new Float64Array(3);
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Every cell the view looks into, into `out`, in coordinate order. Returns how many.
|
|
150
|
+
*
|
|
151
|
+
* `viewProj` is column-major and OpenGL-convention, as `gl-matrix` builds one, and in absolute
|
|
152
|
+
* world units — **in double precision if the world is past 2^24**, because a plane's offset out there
|
|
153
|
+
* is not a number a single float holds to the metre.
|
|
154
|
+
*
|
|
155
|
+
* **Conservative, as `cellsInRadius` is**: a cell is left out only when it lies wholly beyond one of
|
|
156
|
+
* the view's planes, so every point the view can see is in a returned cell, and a cell near a
|
|
157
|
+
* corner of the view can be returned without being seen. The cells walked are those inside the
|
|
158
|
+
* box round the view's eight corners, which is why a view with no far plane is refused: its box has
|
|
159
|
+
* no far side.
|
|
160
|
+
*/
|
|
161
|
+
export function cellsInFrustum(grid: CellGrid, viewProj: ArrayLike<number>, out: number[]): number {
|
|
162
|
+
out.length = 0;
|
|
163
|
+
const matrix = viewProj as Float64Array;
|
|
164
|
+
if (mat4.invert(INVERSE, matrix) === null) {
|
|
165
|
+
throw new RangeError('cellsInFrustum: a view with no inverse has no far plane to bound it');
|
|
166
|
+
}
|
|
167
|
+
CORNER_LOW.fill(Infinity);
|
|
168
|
+
CORNER_HIGH.fill(-Infinity);
|
|
169
|
+
for (let corner = 0; corner < 8; corner += 1) {
|
|
170
|
+
const x = corner & 1 ? 1 : -1;
|
|
171
|
+
const y = corner & 2 ? 1 : -1;
|
|
172
|
+
const z = corner & 4 ? 1 : -1;
|
|
173
|
+
const m = INVERSE;
|
|
174
|
+
const w =
|
|
175
|
+
(m[3] as number) * x + (m[7] as number) * y + (m[11] as number) * z + (m[15] as number);
|
|
176
|
+
/*
|
|
177
|
+
* A corner at or behind the eye's plane is a corner at infinity: the view has no far side.
|
|
178
|
+
* **This is the only check the corners need.** A lens deep enough for a corner to overflow has
|
|
179
|
+
* its far plane at infinity in double precision, where this is exactly zero, and a matrix small
|
|
180
|
+
* enough to overflow its inverse has a determinant that has already underflowed to none.
|
|
181
|
+
*/
|
|
182
|
+
if (!(w > 0)) {
|
|
183
|
+
throw new RangeError('cellsInFrustum: a view whose far plane is at infinity bounds no cells');
|
|
184
|
+
}
|
|
185
|
+
for (let axis = 0; axis < 3; axis += 1) {
|
|
186
|
+
const value =
|
|
187
|
+
((m[axis] as number) * x +
|
|
188
|
+
(m[4 + axis] as number) * y +
|
|
189
|
+
(m[8 + axis] as number) * z +
|
|
190
|
+
(m[12 + axis] as number)) /
|
|
191
|
+
w;
|
|
192
|
+
CORNER_LOW[axis] = Math.min(CORNER_LOW[axis] as number, value);
|
|
193
|
+
CORNER_HIGH[axis] = Math.max(CORNER_HIGH[axis] as number, value);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const size = grid.size;
|
|
197
|
+
const x0 = cellCoord(CORNER_LOW[0] as number, size);
|
|
198
|
+
const y0 = cellCoord(CORNER_LOW[1] as number, size);
|
|
199
|
+
const z0 = cellCoord(CORNER_LOW[2] as number, size);
|
|
200
|
+
const x1 = cellCoord(CORNER_HIGH[0] as number, size);
|
|
201
|
+
const y1 = cellCoord(CORNER_HIGH[1] as number, size);
|
|
202
|
+
const z1 = cellCoord(CORNER_HIGH[2] as number, size);
|
|
203
|
+
const span = (x1 - x0 + 1) * (y1 - y0 + 1) * (z1 - z0 + 1);
|
|
204
|
+
if (span > grid.maxCells) {
|
|
205
|
+
throw new RangeError(
|
|
206
|
+
`cellsInFrustum: this view spans ${String(span)} cells, more than the ${String(grid.maxCells)} its grid allows`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
frustumFromViewProjection(matrix, PLANES);
|
|
211
|
+
for (let cx = x0; cx <= x1; cx += 1) {
|
|
212
|
+
for (let cy = y0; cy <= y1; cy += 1) {
|
|
213
|
+
for (let cz = z0; cz <= z1; cz += 1) {
|
|
214
|
+
if (
|
|
215
|
+
boxInFrustum(
|
|
216
|
+
PLANES,
|
|
217
|
+
cx * size,
|
|
218
|
+
cy * size,
|
|
219
|
+
cz * size,
|
|
220
|
+
(cx + 1) * size,
|
|
221
|
+
(cy + 1) * size,
|
|
222
|
+
(cz + 1) * size,
|
|
223
|
+
)
|
|
224
|
+
) {
|
|
225
|
+
out.push(cellIdFrom(cx, cy, cz));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return out.length;
|
|
231
|
+
}
|