@driftengine/core 3.61.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/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +9 -0
- package/dist/behavior/behaviorTree.d.ts +140 -0
- package/dist/behavior/behaviorTree.js +289 -0
- package/dist/build/shaderComments.d.ts +64 -0
- package/dist/build/shaderComments.js +0 -0
- package/dist/cinematic/player.d.ts +80 -0
- package/dist/cinematic/player.js +184 -0
- package/dist/cinematic/script.d.ts +63 -0
- package/dist/cinematic/script.js +141 -0
- package/dist/core/bootGate.d.ts +37 -0
- package/dist/core/bootGate.js +47 -0
- package/dist/core/loadTracker.d.ts +78 -0
- package/dist/core/loadTracker.js +106 -0
- package/dist/core/loop.d.ts +118 -0
- package/dist/core/loop.js +84 -0
- package/dist/core/messageQueue.d.ts +61 -0
- package/dist/core/messageQueue.js +104 -0
- package/dist/core/onceSet.d.ts +27 -0
- package/dist/core/onceSet.js +62 -0
- package/dist/core/preferences.d.ts +47 -0
- package/dist/core/preferences.js +140 -0
- package/dist/core/remoteSave.d.ts +154 -0
- package/dist/core/remoteSave.js +249 -0
- package/dist/core/rng.d.ts +64 -0
- package/dist/core/rng.js +72 -0
- package/dist/core/stepBudget.d.ts +91 -0
- package/dist/core/stepBudget.js +105 -0
- package/dist/core/storage.d.ts +52 -0
- package/dist/core/storage.js +85 -0
- package/dist/core/tickTrace.d.ts +72 -0
- package/dist/core/tickTrace.js +102 -0
- package/dist/core/timeCurve.d.ts +83 -0
- package/dist/core/timeCurve.js +107 -0
- package/dist/core/withDefaults.d.ts +21 -0
- package/dist/core/withDefaults.js +29 -0
- package/dist/dev/contactProbe.d.ts +41 -0
- package/dist/dev/contactProbe.js +58 -0
- package/dist/dev/fpsMeter.d.ts +45 -0
- package/dist/dev/fpsMeter.js +86 -0
- package/dist/environment/celestialClock.d.ts +141 -0
- package/dist/environment/celestialClock.js +262 -0
- package/dist/geometry/decal.d.ts +61 -0
- package/dist/geometry/decal.js +178 -0
- package/dist/geometry/filmPatch.d.ts +35 -0
- package/dist/geometry/filmPatch.js +112 -0
- package/dist/geometry/growable.d.ts +70 -0
- package/dist/geometry/growable.js +167 -0
- package/dist/geometry/lightVolume.d.ts +76 -0
- package/dist/geometry/lightVolume.js +65 -0
- package/dist/geometry/meshBuilder.d.ts +426 -0
- package/dist/geometry/meshBuilder.js +1184 -0
- package/dist/geometry/pixelFont.d.ts +59 -0
- package/dist/geometry/pixelFont.js +179 -0
- package/dist/geometry/ribbon.d.ts +101 -0
- package/dist/geometry/ribbon.js +546 -0
- package/dist/geometry/shellFill.d.ts +101 -0
- package/dist/geometry/shellFill.js +203 -0
- package/dist/geometry/spline.d.ts +162 -0
- package/dist/geometry/spline.js +527 -0
- package/dist/geometry/tangents.d.ts +30 -0
- package/dist/geometry/tangents.js +142 -0
- package/dist/geometry/textMesh.d.ts +51 -0
- package/dist/geometry/textMesh.js +57 -0
- package/dist/geometry/treeBuilder.d.ts +37 -0
- package/dist/geometry/treeBuilder.js +56 -0
- package/dist/host/display.d.ts +135 -0
- package/dist/host/display.js +114 -0
- package/dist/host/files.d.ts +25 -0
- package/dist/host/files.js +44 -0
- package/dist/host/lifecycle.d.ts +45 -0
- package/dist/host/lifecycle.js +28 -0
- package/dist/host/platformServices.d.ts +23 -0
- package/dist/host/platformServices.js +1 -0
- package/dist/host/screen.d.ts +49 -0
- package/dist/host/screen.js +90 -0
- package/dist/index.d.ts +289 -0
- package/dist/index.js +320 -0
- package/dist/input/actionMap.d.ts +181 -0
- package/dist/input/actionMap.js +314 -0
- package/dist/input/activeDevice.d.ts +55 -0
- package/dist/input/activeDevice.js +83 -0
- package/dist/input/gamepadIdentity.d.ts +43 -0
- package/dist/input/gamepadIdentity.js +108 -0
- package/dist/input/gamepadMapping.d.ts +56 -0
- package/dist/input/gamepadMapping.js +91 -0
- package/dist/input/input.d.ts +281 -0
- package/dist/input/input.js +703 -0
- package/dist/input/inputHarness.d.ts +42 -0
- package/dist/input/inputHarness.js +193 -0
- package/dist/input/rightGesture.d.ts +57 -0
- package/dist/input/rightGesture.js +49 -0
- package/dist/input/rumble.d.ts +71 -0
- package/dist/input/rumble.js +119 -0
- package/dist/input/touchControls.d.ts +138 -0
- package/dist/input/touchControls.js +352 -0
- package/dist/input/typingTarget.d.ts +6 -0
- package/dist/input/typingTarget.js +27 -0
- package/dist/math/bounds.d.ts +61 -0
- package/dist/math/bounds.js +121 -0
- package/dist/math/color.d.ts +8 -0
- package/dist/math/color.js +35 -0
- package/dist/math/exact.d.ts +66 -0
- package/dist/math/exact.js +262 -0
- package/dist/math/frustum.d.ts +44 -0
- package/dist/math/frustum.js +90 -0
- package/dist/math/intersect.d.ts +76 -0
- package/dist/math/intersect.js +185 -0
- package/dist/math/scalar.d.ts +51 -0
- package/dist/math/scalar.js +99 -0
- package/dist/math/spring.d.ts +59 -0
- package/dist/math/spring.js +88 -0
- package/dist/nav/navGraph.d.ts +71 -0
- package/dist/nav/navGraph.js +111 -0
- package/dist/nav/navPath.d.ts +93 -0
- package/dist/nav/navPath.js +162 -0
- package/dist/nav/navSearch.d.ts +74 -0
- package/dist/nav/navSearch.js +198 -0
- package/dist/physics/boxSurface.d.ts +48 -0
- package/dist/physics/boxSurface.js +73 -0
- package/dist/physics/colliderSurface.d.ts +46 -0
- package/dist/physics/colliderSurface.js +146 -0
- package/dist/physics/compositeSurface.d.ts +33 -0
- package/dist/physics/compositeSurface.js +108 -0
- package/dist/physics/heightSurface.d.ts +103 -0
- package/dist/physics/heightSurface.js +153 -0
- package/dist/physics/ribbonSurface.d.ts +239 -0
- package/dist/physics/ribbonSurface.js +522 -0
- package/dist/render/ambientOcclusionPass.d.ts +53 -0
- package/dist/render/ambientOcclusionPass.js +179 -0
- package/dist/render/areaLights.d.ts +116 -0
- package/dist/render/areaLights.js +91 -0
- package/dist/render/areaShadowSet.d.ts +184 -0
- package/dist/render/areaShadowSet.js +277 -0
- package/dist/render/atmosphere.d.ts +94 -0
- package/dist/render/atmosphere.js +91 -0
- package/dist/render/backend/api.d.ts +496 -0
- package/dist/render/backend/api.js +1 -0
- package/dist/render/backend/budget.d.ts +82 -0
- package/dist/render/backend/budget.js +99 -0
- package/dist/render/backend/createRenderer.d.ts +135 -0
- package/dist/render/backend/createRenderer.js +201 -0
- package/dist/render/backend/deadline.d.ts +24 -0
- package/dist/render/backend/deadline.js +38 -0
- package/dist/render/backend/probe.d.ts +30 -0
- package/dist/render/backend/probe.js +129 -0
- package/dist/render/backend/select.d.ts +70 -0
- package/dist/render/backend/select.js +249 -0
- package/dist/render/backend/timer.d.ts +50 -0
- package/dist/render/backend/timer.js +1 -0
- package/dist/render/backend/webgl2/instanced.d.ts +21 -0
- package/dist/render/backend/webgl2/instanced.js +42 -0
- package/dist/render/backend/webgl2/morphTexture.d.ts +21 -0
- package/dist/render/backend/webgl2/morphTexture.js +55 -0
- package/dist/render/backend/webgl2/renderer.d.ts +3027 -0
- package/dist/render/backend/webgl2/renderer.js +6041 -0
- package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +32 -0
- package/dist/render/backend/webgl2/skinPaletteTexture.js +68 -0
- package/dist/render/backend/webgpu/boltPass.d.ts +42 -0
- package/dist/render/backend/webgpu/boltPass.js +160 -0
- package/dist/render/backend/webgpu/buffers.d.ts +159 -0
- package/dist/render/backend/webgpu/buffers.js +402 -0
- package/dist/render/backend/webgpu/causticsPass.d.ts +36 -0
- package/dist/render/backend/webgpu/causticsPass.js +138 -0
- package/dist/render/backend/webgpu/clusterBinner.d.ts +51 -0
- package/dist/render/backend/webgpu/clusterBinner.js +206 -0
- package/dist/render/backend/webgpu/depthPass.d.ts +114 -0
- package/dist/render/backend/webgpu/depthPass.js +228 -0
- package/dist/render/backend/webgpu/device.d.ts +52 -0
- package/dist/render/backend/webgpu/device.js +121 -0
- package/dist/render/backend/webgpu/drawCommand.d.ts +43 -0
- package/dist/render/backend/webgpu/drawCommand.js +54 -0
- package/dist/render/backend/webgpu/environmentTexels.d.ts +28 -0
- package/dist/render/backend/webgpu/environmentTexels.js +79 -0
- package/dist/render/backend/webgpu/filmPass.d.ts +29 -0
- package/dist/render/backend/webgpu/filmPass.js +97 -0
- package/dist/render/backend/webgpu/flatPass.d.ts +213 -0
- package/dist/render/backend/webgpu/flatPass.js +482 -0
- package/dist/render/backend/webgpu/flockPass.d.ts +34 -0
- package/dist/render/backend/webgpu/flockPass.js +129 -0
- package/dist/render/backend/webgpu/gpuTimestamps.d.ts +94 -0
- package/dist/render/backend/webgpu/gpuTimestamps.js +213 -0
- package/dist/render/backend/webgpu/insetPass.d.ts +19 -0
- package/dist/render/backend/webgpu/insetPass.js +108 -0
- package/dist/render/backend/webgpu/instanced.d.ts +27 -0
- package/dist/render/backend/webgpu/instanced.js +49 -0
- package/dist/render/backend/webgpu/lightVolumePass.d.ts +75 -0
- package/dist/render/backend/webgpu/lightVolumePass.js +154 -0
- package/dist/render/backend/webgpu/linePass.d.ts +90 -0
- package/dist/render/backend/webgpu/linePass.js +220 -0
- package/dist/render/backend/webgpu/morphTexture.d.ts +18 -0
- package/dist/render/backend/webgpu/morphTexture.js +51 -0
- package/dist/render/backend/webgpu/panelPass.d.ts +37 -0
- package/dist/render/backend/webgpu/panelPass.js +114 -0
- package/dist/render/backend/webgpu/particlePass.d.ts +89 -0
- package/dist/render/backend/webgpu/particlePass.js +280 -0
- package/dist/render/backend/webgpu/pipelineCache.d.ts +93 -0
- package/dist/render/backend/webgpu/pipelineCache.js +140 -0
- package/dist/render/backend/webgpu/plumePass.d.ts +69 -0
- package/dist/render/backend/webgpu/plumePass.js +213 -0
- package/dist/render/backend/webgpu/pointShadowPass.d.ts +88 -0
- package/dist/render/backend/webgpu/pointShadowPass.js +280 -0
- package/dist/render/backend/webgpu/postPass.d.ts +342 -0
- package/dist/render/backend/webgpu/postPass.js +366 -0
- package/dist/render/backend/webgpu/probePass.d.ts +108 -0
- package/dist/render/backend/webgpu/probePass.js +188 -0
- package/dist/render/backend/webgpu/reflectionPass.d.ts +29 -0
- package/dist/render/backend/webgpu/reflectionPass.js +87 -0
- package/dist/render/backend/webgpu/renderer.d.ts +3082 -0
- package/dist/render/backend/webgpu/renderer.js +10911 -0
- package/dist/render/backend/webgpu/scatterPass.d.ts +95 -0
- package/dist/render/backend/webgpu/scatterPass.js +266 -0
- package/dist/render/backend/webgpu/sdfTextPass.d.ts +86 -0
- package/dist/render/backend/webgpu/sdfTextPass.js +190 -0
- package/dist/render/backend/webgpu/shaderModules.d.ts +9 -0
- package/dist/render/backend/webgpu/shaderModules.js +45 -0
- package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +23 -0
- package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +208 -0
- package/dist/render/backend/webgpu/skinPaletteRing.d.ts +67 -0
- package/dist/render/backend/webgpu/skinPaletteRing.js +97 -0
- package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +17 -0
- package/dist/render/backend/webgpu/skinPaletteTexture.js +68 -0
- package/dist/render/backend/webgpu/skyPass.d.ts +102 -0
- package/dist/render/backend/webgpu/skyPass.js +70 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +41 -0
- package/dist/render/backend/webgpu/surfaceTexturePass.js +228 -0
- package/dist/render/backend/webgpu/textPass.d.ts +73 -0
- package/dist/render/backend/webgpu/textPass.js +190 -0
- package/dist/render/backend/webgpu/uniformRing.d.ts +133 -0
- package/dist/render/backend/webgpu/uniformRing.js +208 -0
- package/dist/render/backend/webgpu/waterPass.d.ts +73 -0
- package/dist/render/backend/webgpu/waterPass.js +160 -0
- package/dist/render/backend/webgpu/windStreakPass.d.ts +46 -0
- package/dist/render/backend/webgpu/windStreakPass.js +153 -0
- package/dist/render/billboard.d.ts +27 -0
- package/dist/render/billboard.js +79 -0
- package/dist/render/bloomChain.d.ts +66 -0
- package/dist/render/bloomChain.js +83 -0
- package/dist/render/bloomPass.d.ts +54 -0
- package/dist/render/bloomPass.js +219 -0
- package/dist/render/boltBatch.d.ts +39 -0
- package/dist/render/boltBatch.js +121 -0
- package/dist/render/boltPool.d.ts +135 -0
- package/dist/render/boltPool.js +259 -0
- package/dist/render/boom.d.ts +46 -0
- package/dist/render/boom.js +81 -0
- package/dist/render/camera.d.ts +119 -0
- package/dist/render/camera.js +304 -0
- package/dist/render/causticsRenderer.d.ts +63 -0
- package/dist/render/causticsRenderer.js +119 -0
- package/dist/render/cinematicCamera.d.ts +102 -0
- package/dist/render/cinematicCamera.js +227 -0
- package/dist/render/clusteredLights.d.ts +260 -0
- package/dist/render/clusteredLights.js +479 -0
- package/dist/render/colourGrade.d.ts +62 -0
- package/dist/render/colourGrade.js +91 -0
- package/dist/render/compute.d.ts +74 -0
- package/dist/render/compute.js +8 -0
- package/dist/render/contextLoss.d.ts +32 -0
- package/dist/render/contextLoss.js +46 -0
- package/dist/render/debugLines.d.ts +75 -0
- package/dist/render/debugLines.js +281 -0
- package/dist/render/decalPass.d.ts +34 -0
- package/dist/render/decalPass.js +103 -0
- package/dist/render/decalProjector.d.ts +140 -0
- package/dist/render/decalProjector.js +282 -0
- package/dist/render/decalQueue.d.ts +53 -0
- package/dist/render/decalQueue.js +87 -0
- package/dist/render/depthConvention.d.ts +314 -0
- package/dist/render/depthConvention.js +346 -0
- package/dist/render/drawingBuffer.d.ts +52 -0
- package/dist/render/drawingBuffer.js +67 -0
- package/dist/render/emptyTexture.d.ts +60 -0
- package/dist/render/emptyTexture.js +103 -0
- package/dist/render/envProbeArray.d.ts +85 -0
- package/dist/render/envProbeArray.js +164 -0
- package/dist/render/equirectToCube.d.ts +54 -0
- package/dist/render/equirectToCube.js +123 -0
- package/dist/render/flockGeometry.d.ts +23 -0
- package/dist/render/flockGeometry.js +43 -0
- package/dist/render/flockRenderer.d.ts +37 -0
- package/dist/render/flockRenderer.js +70 -0
- package/dist/render/frame/arena.d.ts +32 -0
- package/dist/render/frame/arena.js +65 -0
- package/dist/render/frame/index.d.ts +18 -0
- package/dist/render/frame/index.js +4 -0
- package/dist/render/frame/replay.d.ts +34 -0
- package/dist/render/frame/replay.js +48 -0
- package/dist/render/frame/resources.d.ts +25 -0
- package/dist/render/frame/resources.js +55 -0
- package/dist/render/frame/schedule.d.ts +37 -0
- package/dist/render/frame/schedule.js +61 -0
- package/dist/render/frameView.d.ts +19 -0
- package/dist/render/frameView.js +1 -0
- package/dist/render/gizmo.d.ts +236 -0
- package/dist/render/gizmo.js +727 -0
- package/dist/render/globalMedium.d.ts +124 -0
- package/dist/render/globalMedium.js +100 -0
- package/dist/render/globalMediumPass.d.ts +101 -0
- package/dist/render/globalMediumPass.js +250 -0
- package/dist/render/gpuCapability.d.ts +111 -0
- package/dist/render/gpuCapability.js +194 -0
- package/dist/render/gpuTimer.d.ts +87 -0
- package/dist/render/gpuTimer.js +145 -0
- package/dist/render/halfFloat.d.ts +4 -0
- package/dist/render/halfFloat.js +38 -0
- package/dist/render/handleRegistry.d.ts +54 -0
- package/dist/render/handleRegistry.js +84 -0
- package/dist/render/iesProfile.d.ts +64 -0
- package/dist/render/iesProfile.js +179 -0
- package/dist/render/imageTexels.d.ts +50 -0
- package/dist/render/imageTexels.js +91 -0
- package/dist/render/instancedMesh.d.ts +48 -0
- package/dist/render/instancedMesh.js +127 -0
- package/dist/render/instances.d.ts +69 -0
- package/dist/render/instances.js +52 -0
- package/dist/render/lightBudget.d.ts +397 -0
- package/dist/render/lightBudget.js +524 -0
- package/dist/render/lightMatrix.d.ts +3 -0
- package/dist/render/lightMatrix.js +45 -0
- package/dist/render/lightVolumeDraw.d.ts +132 -0
- package/dist/render/lightVolumeDraw.js +181 -0
- package/dist/render/lineBatch.d.ts +60 -0
- package/dist/render/lineBatch.js +160 -0
- package/dist/render/linePoints.d.ts +33 -0
- package/dist/render/linePoints.js +46 -0
- package/dist/render/livePointShadowSet.d.ts +72 -0
- package/dist/render/livePointShadowSet.js +258 -0
- package/dist/render/lod.d.ts +35 -0
- package/dist/render/lod.js +65 -0
- package/dist/render/mesh.d.ts +177 -0
- package/dist/render/mesh.js +466 -0
- package/dist/render/occlusion.d.ts +81 -0
- package/dist/render/occlusion.js +378 -0
- package/dist/render/oitPass.d.ts +67 -0
- package/dist/render/oitPass.js +213 -0
- package/dist/render/orderIndependent.d.ts +92 -0
- package/dist/render/orderIndependent.js +108 -0
- package/dist/render/particleBatch.d.ts +140 -0
- package/dist/render/particleBatch.js +186 -0
- package/dist/render/particleMaterial.d.ts +54 -0
- package/dist/render/particleMaterial.js +42 -0
- package/dist/render/particlePool.d.ts +124 -0
- package/dist/render/particlePool.js +182 -0
- package/dist/render/pass.d.ts +195 -0
- package/dist/render/pass.js +9 -0
- package/dist/render/passTarget.d.ts +86 -0
- package/dist/render/passTarget.js +121 -0
- package/dist/render/pickable.d.ts +31 -0
- package/dist/render/pickable.js +172 -0
- package/dist/render/planarReflection.d.ts +59 -0
- package/dist/render/planarReflection.js +194 -0
- package/dist/render/planarReflectionDraw.d.ts +31 -0
- package/dist/render/planarReflectionDraw.js +65 -0
- package/dist/render/plumeGeometry.d.ts +25 -0
- package/dist/render/plumeGeometry.js +61 -0
- package/dist/render/plumeMaterial.d.ts +31 -0
- package/dist/render/plumeMaterial.js +64 -0
- package/dist/render/plumeRenderer.d.ts +96 -0
- package/dist/render/plumeRenderer.js +185 -0
- package/dist/render/pointLightSelection.d.ts +175 -0
- package/dist/render/pointLightSelection.js +301 -0
- package/dist/render/pointShadowArray.d.ts +95 -0
- package/dist/render/pointShadowArray.js +219 -0
- package/dist/render/pointShadowBudget.d.ts +118 -0
- package/dist/render/pointShadowBudget.js +221 -0
- package/dist/render/pointShadowImage.d.ts +265 -0
- package/dist/render/pointShadowImage.js +339 -0
- package/dist/render/pointShadowMap.d.ts +93 -0
- package/dist/render/pointShadowMap.js +167 -0
- package/dist/render/pointShadowSystem.d.ts +195 -0
- package/dist/render/pointShadowSystem.js +336 -0
- package/dist/render/prefilterEnvMap.d.ts +124 -0
- package/dist/render/prefilterEnvMap.js +146 -0
- package/dist/render/prefilterPass.d.ts +44 -0
- package/dist/render/prefilterPass.js +98 -0
- package/dist/render/probeGrid.d.ts +122 -0
- package/dist/render/probeGrid.js +174 -0
- package/dist/render/rainField.d.ts +99 -0
- package/dist/render/rainField.js +168 -0
- package/dist/render/reflectionProbe.d.ts +188 -0
- package/dist/render/reflectionProbe.js +437 -0
- package/dist/render/renderQuality.d.ts +699 -0
- package/dist/render/renderQuality.js +293 -0
- package/dist/render/rendererHarness.d.ts +39 -0
- package/dist/render/rendererHarness.js +185 -0
- package/dist/render/resolutionGovernor.d.ts +107 -0
- package/dist/render/resolutionGovernor.js +144 -0
- package/dist/render/scatterDeform.d.ts +17 -0
- package/dist/render/scatterDeform.js +46 -0
- package/dist/render/sceneTarget.d.ts +288 -0
- package/dist/render/sceneTarget.js +856 -0
- package/dist/render/screenSpaceReflection.d.ts +233 -0
- package/dist/render/screenSpaceReflection.js +415 -0
- package/dist/render/sdfFont.d.ts +77 -0
- package/dist/render/sdfFont.js +86 -0
- package/dist/render/sdfTextLayout.d.ts +46 -0
- package/dist/render/sdfTextLayout.js +145 -0
- package/dist/render/sdfTextRenderer.d.ts +75 -0
- package/dist/render/sdfTextRenderer.js +194 -0
- package/dist/render/seaState.d.ts +25 -0
- package/dist/render/seaState.js +34 -0
- package/dist/render/segmentQuads.d.ts +29 -0
- package/dist/render/segmentQuads.js +75 -0
- package/dist/render/shader.d.ts +5 -0
- package/dist/render/shader.js +172 -0
- package/dist/render/shaders/ambientOcclusion.d.ts +45 -0
- package/dist/render/shaders/ambientOcclusion.js +352 -0
- package/dist/render/shaders/arcane.d.ts +19 -0
- package/dist/render/shaders/arcane.js +102 -0
- package/dist/render/shaders/bloom.d.ts +70 -0
- package/dist/render/shaders/bloom.js +227 -0
- package/dist/render/shaders/bolt.d.ts +17 -0
- package/dist/render/shaders/bolt.js +161 -0
- package/dist/render/shaders/caustics.d.ts +38 -0
- package/dist/render/shaders/caustics.js +167 -0
- package/dist/render/shaders/conditionals.d.ts +21 -0
- package/dist/render/shaders/conditionals.js +55 -0
- package/dist/render/shaders/decalProject.d.ts +25 -0
- package/dist/render/shaders/decalProject.js +125 -0
- package/dist/render/shaders/depth.d.ts +14 -0
- package/dist/render/shaders/depth.js +114 -0
- package/dist/render/shaders/depthOfField.d.ts +41 -0
- package/dist/render/shaders/depthOfField.js +139 -0
- package/dist/render/shaders/film.d.ts +15 -0
- package/dist/render/shaders/film.js +283 -0
- package/dist/render/shaders/fire.d.ts +12 -0
- package/dist/render/shaders/fire.js +178 -0
- package/dist/render/shaders/flat/directionalShadow.d.ts +1 -0
- package/dist/render/shaders/flat/directionalShadow.js +195 -0
- package/dist/render/shaders/flat/index.d.ts +135 -0
- package/dist/render/shaders/flat/index.js +387 -0
- package/dist/render/shaders/flat/lobes.d.ts +1 -0
- package/dist/render/shaders/flat/lobes.js +398 -0
- package/dist/render/shaders/flat/main.d.ts +2 -0
- package/dist/render/shaders/flat/main.js +1630 -0
- package/dist/render/shaders/flat/pointShadow.d.ts +1 -0
- package/dist/render/shaders/flat/pointShadow.js +322 -0
- package/dist/render/shaders/flat/preamble.d.ts +15 -0
- package/dist/render/shaders/flat/preamble.js +864 -0
- package/dist/render/shaders/flat/probeGrid.d.ts +21 -0
- package/dist/render/shaders/flat/probeGrid.js +151 -0
- package/dist/render/shaders/flat/surface.d.ts +2 -0
- package/dist/render/shaders/flat/surface.js +40 -0
- package/dist/render/shaders/flock.d.ts +11 -0
- package/dist/render/shaders/flock.js +102 -0
- package/dist/render/shaders/fog.d.ts +37 -0
- package/dist/render/shaders/fog.js +98 -0
- package/dist/render/shaders/fullscreen.d.ts +16 -0
- package/dist/render/shaders/fullscreen.js +27 -0
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +65 -0
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +71 -0
- package/dist/render/shaders/generated/arcane.wgsl.d.ts +90 -0
- package/dist/render/shaders/generated/arcane.wgsl.js +96 -0
- package/dist/render/shaders/generated/bloom.wgsl.d.ts +69 -0
- package/dist/render/shaders/generated/bloom.wgsl.js +75 -0
- package/dist/render/shaders/generated/bolt.wgsl.d.ts +118 -0
- package/dist/render/shaders/generated/bolt.wgsl.js +124 -0
- package/dist/render/shaders/generated/caustics.wgsl.d.ts +118 -0
- package/dist/render/shaders/generated/caustics.wgsl.js +124 -0
- package/dist/render/shaders/generated/decalProject.wgsl.d.ts +61 -0
- package/dist/render/shaders/generated/decalProject.wgsl.js +67 -0
- package/dist/render/shaders/generated/depth.wgsl.d.ts +131 -0
- package/dist/render/shaders/generated/depth.wgsl.js +137 -0
- package/dist/render/shaders/generated/film.wgsl.d.ts +134 -0
- package/dist/render/shaders/generated/film.wgsl.js +140 -0
- package/dist/render/shaders/generated/fire.wgsl.d.ts +128 -0
- package/dist/render/shaders/generated/fire.wgsl.js +134 -0
- package/dist/render/shaders/generated/flat.wgsl.d.ts +9163 -0
- package/dist/render/shaders/generated/flat.wgsl.js +9192 -0
- package/dist/render/shaders/generated/flock.wgsl.d.ts +73 -0
- package/dist/render/shaders/generated/flock.wgsl.js +79 -0
- package/dist/render/shaders/generated/fullscreen.wgsl.d.ts +12 -0
- package/dist/render/shaders/generated/fullscreen.wgsl.js +18 -0
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +130 -0
- package/dist/render/shaders/generated/globalMedium.wgsl.js +136 -0
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +230 -0
- package/dist/render/shaders/generated/lightVolume.wgsl.js +239 -0
- package/dist/render/shaders/generated/line.wgsl.d.ts +128 -0
- package/dist/render/shaders/generated/line.wgsl.js +134 -0
- package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +51 -0
- package/dist/render/shaders/generated/octahedralResolve.wgsl.js +57 -0
- package/dist/render/shaders/generated/oitResolve.wgsl.d.ts +23 -0
- package/dist/render/shaders/generated/oitResolve.wgsl.js +29 -0
- package/dist/render/shaders/generated/panel.wgsl.d.ts +48 -0
- package/dist/render/shaders/generated/panel.wgsl.js +54 -0
- package/dist/render/shaders/generated/particle.wgsl.d.ts +332 -0
- package/dist/render/shaders/generated/particle.wgsl.js +338 -0
- package/dist/render/shaders/generated/prefilter.wgsl.d.ts +61 -0
- package/dist/render/shaders/generated/prefilter.wgsl.js +67 -0
- package/dist/render/shaders/generated/rush.wgsl.d.ts +131 -0
- package/dist/render/shaders/generated/rush.wgsl.js +137 -0
- package/dist/render/shaders/generated/scatter.wgsl.d.ts +195 -0
- package/dist/render/shaders/generated/scatter.wgsl.js +201 -0
- package/dist/render/shaders/generated/sdfText.wgsl.d.ts +69 -0
- package/dist/render/shaders/generated/sdfText.wgsl.js +75 -0
- package/dist/render/shaders/generated/sky.wgsl.d.ts +100 -0
- package/dist/render/shaders/generated/sky.wgsl.js +106 -0
- package/dist/render/shaders/generated/smoke.wgsl.d.ts +85 -0
- package/dist/render/shaders/generated/smoke.wgsl.js +91 -0
- package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +18 -0
- package/dist/render/shaders/generated/ssrResolve.wgsl.js +24 -0
- package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +86 -0
- package/dist/render/shaders/generated/ssrTrace.wgsl.js +92 -0
- package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +46 -0
- package/dist/render/shaders/generated/temporalResolve.wgsl.js +52 -0
- package/dist/render/shaders/generated/text.wgsl.d.ts +98 -0
- package/dist/render/shaders/generated/text.wgsl.js +104 -0
- package/dist/render/shaders/generated/water.wgsl.d.ts +247 -0
- package/dist/render/shaders/generated/water.wgsl.js +253 -0
- package/dist/render/shaders/generated/windStreaks.wgsl.d.ts +73 -0
- package/dist/render/shaders/generated/windStreaks.wgsl.js +79 -0
- package/dist/render/shaders/gerstner.d.ts +21 -0
- package/dist/render/shaders/gerstner.js +110 -0
- package/dist/render/shaders/globalMedium.d.ts +56 -0
- package/dist/render/shaders/globalMedium.js +393 -0
- package/dist/render/shaders/lightVolume.d.ts +61 -0
- package/dist/render/shaders/lightVolume.js +527 -0
- package/dist/render/shaders/line.d.ts +18 -0
- package/dist/render/shaders/line.js +122 -0
- package/dist/render/shaders/morph.d.ts +26 -0
- package/dist/render/shaders/morph.js +61 -0
- package/dist/render/shaders/octahedral.d.ts +76 -0
- package/dist/render/shaders/octahedral.js +161 -0
- package/dist/render/shaders/octahedralResolve.d.ts +25 -0
- package/dist/render/shaders/octahedralResolve.js +81 -0
- package/dist/render/shaders/oitResolve.d.ts +17 -0
- package/dist/render/shaders/oitResolve.js +42 -0
- package/dist/render/shaders/outputTransform.d.ts +37 -0
- package/dist/render/shaders/outputTransform.js +106 -0
- package/dist/render/shaders/panel.d.ts +17 -0
- package/dist/render/shaders/panel.js +50 -0
- package/dist/render/shaders/particle.d.ts +82 -0
- package/dist/render/shaders/particle.js +431 -0
- package/dist/render/shaders/prefilter.d.ts +37 -0
- package/dist/render/shaders/prefilter.js +276 -0
- package/dist/render/shaders/rush.d.ts +21 -0
- package/dist/render/shaders/rush.js +355 -0
- package/dist/render/shaders/scatter.d.ts +14 -0
- package/dist/render/shaders/scatter.js +206 -0
- package/dist/render/shaders/sdfText.d.ts +9 -0
- package/dist/render/shaders/sdfText.js +65 -0
- package/dist/render/shaders/skinning.d.ts +17 -0
- package/dist/render/shaders/skinning.js +59 -0
- package/dist/render/shaders/sky.d.ts +10 -0
- package/dist/render/shaders/sky.js +242 -0
- package/dist/render/shaders/smoke.d.ts +8 -0
- package/dist/render/shaders/smoke.js +88 -0
- package/dist/render/shaders/ssrResolve.d.ts +15 -0
- package/dist/render/shaders/ssrResolve.js +28 -0
- package/dist/render/shaders/ssrTrace.d.ts +22 -0
- package/dist/render/shaders/ssrTrace.js +230 -0
- package/dist/render/shaders/tangentFrame.d.ts +17 -0
- package/dist/render/shaders/tangentFrame.js +70 -0
- package/dist/render/shaders/temporalResolve.d.ts +1 -0
- package/dist/render/shaders/temporalResolve.js +150 -0
- package/dist/render/shaders/text.d.ts +17 -0
- package/dist/render/shaders/text.js +155 -0
- package/dist/render/shaders/vertexChannel.d.ts +39 -0
- package/dist/render/shaders/vertexChannel.js +69 -0
- package/dist/render/shaders/water.d.ts +18 -0
- package/dist/render/shaders/water.js +354 -0
- package/dist/render/shaders/windStreaks.d.ts +14 -0
- package/dist/render/shaders/windStreaks.js +129 -0
- package/dist/render/shadowCasters.d.ts +107 -0
- package/dist/render/shadowCasters.js +1 -0
- package/dist/render/shadowMap.d.ts +10 -0
- package/dist/render/shadowMap.js +80 -0
- package/dist/render/shotPlacement.d.ts +80 -0
- package/dist/render/shotPlacement.js +183 -0
- package/dist/render/skinPalette.d.ts +90 -0
- package/dist/render/skinPalette.js +136 -0
- package/dist/render/ssrPass.d.ts +59 -0
- package/dist/render/ssrPass.js +196 -0
- package/dist/render/surfaceSheet.d.ts +52 -0
- package/dist/render/surfaceSheet.js +99 -0
- package/dist/render/surfaceTexture.d.ts +197 -0
- package/dist/render/surfaceTexture.js +116 -0
- package/dist/render/temporalAa.d.ts +104 -0
- package/dist/render/temporalAa.js +194 -0
- package/dist/render/temporalPass.d.ts +54 -0
- package/dist/render/temporalPass.js +135 -0
- package/dist/render/textLayout.d.ts +88 -0
- package/dist/render/textLayout.js +201 -0
- package/dist/render/textRenderer.d.ts +32 -0
- package/dist/render/textRenderer.js +176 -0
- package/dist/render/thirdPersonCamera.d.ts +272 -0
- package/dist/render/thirdPersonCamera.js +479 -0
- package/dist/render/trample.d.ts +57 -0
- package/dist/render/trample.js +134 -0
- package/dist/render/translucentQueue.d.ts +76 -0
- package/dist/render/translucentQueue.js +90 -0
- package/dist/render/uniformVectorBudget.d.ts +105 -0
- package/dist/render/uniformVectorBudget.js +201 -0
- package/dist/render/uploadStep.d.ts +14 -0
- package/dist/render/uploadStep.js +14 -0
- package/dist/render/vertexDefaults.d.ts +48 -0
- package/dist/render/vertexDefaults.js +111 -0
- package/dist/render/visibility.d.ts +22 -0
- package/dist/render/visibility.js +47 -0
- package/dist/render/waterDraw.d.ts +57 -0
- package/dist/render/waterDraw.js +102 -0
- package/dist/render/waterGrid.d.ts +62 -0
- package/dist/render/waterGrid.js +151 -0
- package/dist/render/waterRenderer.d.ts +163 -0
- package/dist/render/waterRenderer.js +165 -0
- package/dist/render/wind.d.ts +45 -0
- package/dist/render/wind.js +32 -0
- package/dist/render/windField.d.ts +34 -0
- package/dist/render/windField.js +13 -0
- package/dist/render/windStreakDraw.d.ts +73 -0
- package/dist/render/windStreakDraw.js +86 -0
- package/dist/render/windStreakRenderer.d.ts +37 -0
- package/dist/render/windStreakRenderer.js +86 -0
- package/dist/scene/node.d.ts +128 -0
- package/dist/scene/node.js +319 -0
- package/dist/scene/visit.d.ts +38 -0
- package/dist/scene/visit.js +43 -0
- package/dist/ui/clipMime.d.ts +46 -0
- package/dist/ui/clipMime.js +88 -0
- package/dist/ui/exportTarget.d.ts +305 -0
- package/dist/ui/exportTarget.js +368 -0
- package/dist/ui/frameOverlay.d.ts +59 -0
- package/dist/ui/frameOverlay.js +76 -0
- package/dist/ui/framePacer.d.ts +142 -0
- package/dist/ui/framePacer.js +284 -0
- package/dist/ui/frameRecorder.d.ts +188 -0
- package/dist/ui/frameRecorder.js +221 -0
- package/dist/ui/fullscreen.d.ts +72 -0
- package/dist/ui/fullscreen.js +92 -0
- package/dist/ui/pixelCursor.d.ts +28 -0
- package/dist/ui/pixelCursor.js +66 -0
- package/dist/ui/splash.d.ts +86 -0
- package/dist/ui/splash.js +300 -0
- package/dist/ui/stillFrame.d.ts +22 -0
- package/dist/ui/stillFrame.js +40 -0
- package/package.json +60 -0
- package/src/behavior/behaviorTree.ts +346 -0
- package/src/build/shaderComments.ts +0 -0
- package/src/cinematic/player.ts +209 -0
- package/src/cinematic/script.ts +231 -0
- package/src/core/bootGate.ts +49 -0
- package/src/core/loadTracker.ts +144 -0
- package/src/core/loop.ts +211 -0
- package/src/core/messageQueue.ts +145 -0
- package/src/core/onceSet.ts +65 -0
- package/src/core/preferences.ts +177 -0
- package/src/core/remoteSave.ts +347 -0
- package/src/core/rng.ts +101 -0
- package/src/core/stepBudget.ts +136 -0
- package/src/core/storage.ts +114 -0
- package/src/core/tickTrace.ts +129 -0
- package/src/core/timeCurve.ts +175 -0
- package/src/core/withDefaults.ts +28 -0
- package/src/dev/contactProbe.ts +115 -0
- package/src/dev/fpsMeter.ts +101 -0
- package/src/environment/celestialClock.ts +385 -0
- package/src/geometry/decal.ts +260 -0
- package/src/geometry/filmPatch.ts +158 -0
- package/src/geometry/growable.ts +165 -0
- package/src/geometry/lightVolume.ts +161 -0
- package/src/geometry/meshBuilder.ts +1397 -0
- package/src/geometry/pixelFont.ts +189 -0
- package/src/geometry/ribbon.ts +790 -0
- package/src/geometry/shellFill.ts +265 -0
- package/src/geometry/spline.ts +659 -0
- package/src/geometry/tangents.ts +173 -0
- package/src/geometry/textMesh.ts +96 -0
- package/src/geometry/treeBuilder.ts +114 -0
- package/src/host/display.ts +180 -0
- package/src/host/files.ts +77 -0
- package/src/host/lifecycle.ts +63 -0
- package/src/host/platformServices.ts +23 -0
- package/src/host/screen.ts +134 -0
- package/src/index.ts +730 -0
- package/src/input/actionMap.ts +377 -0
- package/src/input/activeDevice.ts +86 -0
- package/src/input/gamepadIdentity.ts +131 -0
- package/src/input/gamepadMapping.ts +121 -0
- package/src/input/input.ts +872 -0
- package/src/input/inputHarness.ts +226 -0
- package/src/input/rightGesture.ts +76 -0
- package/src/input/rumble.ts +138 -0
- package/src/input/touchControls.ts +451 -0
- package/src/input/typingTarget.ts +26 -0
- package/src/math/bounds.ts +153 -0
- package/src/math/color.ts +37 -0
- package/src/math/exact.ts +274 -0
- package/src/math/frustum.ts +115 -0
- package/src/math/intersect.ts +228 -0
- package/src/math/scalar.ts +109 -0
- package/src/math/spring.ts +106 -0
- package/src/nav/navGraph.ts +168 -0
- package/src/nav/navPath.ts +217 -0
- package/src/nav/navSearch.ts +200 -0
- package/src/physics/boxSurface.ts +96 -0
- package/src/physics/colliderSurface.ts +213 -0
- package/src/physics/compositeSurface.ts +111 -0
- package/src/physics/heightSurface.ts +234 -0
- package/src/physics/ribbonSurface.ts +642 -0
- package/src/render/ambientOcclusionPass.ts +200 -0
- package/src/render/areaLights.ts +194 -0
- package/src/render/areaShadowSet.ts +405 -0
- package/src/render/atmosphere.ts +186 -0
- package/src/render/backend/api.ts +802 -0
- package/src/render/backend/budget.ts +139 -0
- package/src/render/backend/createRenderer.ts +343 -0
- package/src/render/backend/deadline.ts +37 -0
- package/src/render/backend/probe.ts +152 -0
- package/src/render/backend/select.ts +288 -0
- package/src/render/backend/timer.ts +59 -0
- package/src/render/backend/webgl2/instanced.ts +46 -0
- package/src/render/backend/webgl2/morphTexture.ts +58 -0
- package/src/render/backend/webgl2/renderer.ts +7484 -0
- package/src/render/backend/webgl2/skinPaletteTexture.ts +70 -0
- package/src/render/backend/webgpu/boltPass.ts +205 -0
- package/src/render/backend/webgpu/buffers.ts +553 -0
- package/src/render/backend/webgpu/causticsPass.ts +174 -0
- package/src/render/backend/webgpu/clusterBinner.ts +259 -0
- package/src/render/backend/webgpu/depthPass.ts +261 -0
- package/src/render/backend/webgpu/device.ts +148 -0
- package/src/render/backend/webgpu/drawCommand.ts +79 -0
- package/src/render/backend/webgpu/environmentTexels.ts +96 -0
- package/src/render/backend/webgpu/filmPass.ts +123 -0
- package/src/render/backend/webgpu/flatPass.ts +635 -0
- package/src/render/backend/webgpu/flockPass.ts +163 -0
- package/src/render/backend/webgpu/gpuTimestamps.ts +255 -0
- package/src/render/backend/webgpu/insetPass.ts +123 -0
- package/src/render/backend/webgpu/instanced.ts +55 -0
- package/src/render/backend/webgpu/lightVolumePass.ts +203 -0
- package/src/render/backend/webgpu/linePass.ts +270 -0
- package/src/render/backend/webgpu/morphTexture.ts +61 -0
- package/src/render/backend/webgpu/panelPass.ts +138 -0
- package/src/render/backend/webgpu/particlePass.ts +370 -0
- package/src/render/backend/webgpu/pipelineCache.ts +152 -0
- package/src/render/backend/webgpu/plumePass.ts +292 -0
- package/src/render/backend/webgpu/pointShadowPass.ts +368 -0
- package/src/render/backend/webgpu/postPass.ts +470 -0
- package/src/render/backend/webgpu/probePass.ts +218 -0
- package/src/render/backend/webgpu/reflectionPass.ts +137 -0
- package/src/render/backend/webgpu/renderer.ts +13004 -0
- package/src/render/backend/webgpu/scatterPass.ts +354 -0
- package/src/render/backend/webgpu/sdfTextPass.ts +220 -0
- package/src/render/backend/webgpu/shaderModules.ts +49 -0
- package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +219 -0
- package/src/render/backend/webgpu/skinPaletteRing.ts +105 -0
- package/src/render/backend/webgpu/skinPaletteTexture.ts +79 -0
- package/src/render/backend/webgpu/skyPass.ts +85 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +257 -0
- package/src/render/backend/webgpu/textPass.ts +224 -0
- package/src/render/backend/webgpu/uniformRing.ts +228 -0
- package/src/render/backend/webgpu/waterPass.ts +211 -0
- package/src/render/backend/webgpu/windStreakPass.ts +196 -0
- package/src/render/billboard.ts +108 -0
- package/src/render/bloomChain.ts +101 -0
- package/src/render/bloomPass.ts +256 -0
- package/src/render/boltBatch.ts +141 -0
- package/src/render/boltPool.ts +360 -0
- package/src/render/boom.ts +123 -0
- package/src/render/camera.ts +348 -0
- package/src/render/causticsRenderer.ts +171 -0
- package/src/render/cinematicCamera.ts +278 -0
- package/src/render/clusteredLights.ts +598 -0
- package/src/render/colourGrade.ts +109 -0
- package/src/render/compute.ts +83 -0
- package/src/render/contextLoss.ts +50 -0
- package/src/render/debugLines.ts +411 -0
- package/src/render/decalPass.ts +124 -0
- package/src/render/decalProjector.ts +390 -0
- package/src/render/decalQueue.ts +110 -0
- package/src/render/depthConvention.ts +383 -0
- package/src/render/drawingBuffer.ts +89 -0
- package/src/render/emptyTexture.ts +130 -0
- package/src/render/envProbeArray.ts +201 -0
- package/src/render/equirectToCube.ts +160 -0
- package/src/render/flockGeometry.ts +53 -0
- package/src/render/flockRenderer.ts +111 -0
- package/src/render/frame/arena.ts +93 -0
- package/src/render/frame/index.ts +29 -0
- package/src/render/frame/replay.ts +50 -0
- package/src/render/frame/resources.ts +61 -0
- package/src/render/frame/schedule.ts +85 -0
- package/src/render/frameView.ts +20 -0
- package/src/render/gizmo.ts +923 -0
- package/src/render/globalMedium.ts +154 -0
- package/src/render/globalMediumPass.ts +323 -0
- package/src/render/gpuCapability.ts +244 -0
- package/src/render/gpuTimer.ts +182 -0
- package/src/render/halfFloat.ts +39 -0
- package/src/render/handleRegistry.ts +96 -0
- package/src/render/iesProfile.ts +215 -0
- package/src/render/imageTexels.ts +109 -0
- package/src/render/instancedMesh.ts +187 -0
- package/src/render/instances.ts +92 -0
- package/src/render/lightBudget.ts +655 -0
- package/src/render/lightMatrix.ts +69 -0
- package/src/render/lightVolumeDraw.ts +216 -0
- package/src/render/lineBatch.ts +180 -0
- package/src/render/linePoints.ts +61 -0
- package/src/render/livePointShadowSet.ts +285 -0
- package/src/render/lod.ts +86 -0
- package/src/render/mesh.ts +536 -0
- package/src/render/occlusion.ts +406 -0
- package/src/render/oitPass.ts +230 -0
- package/src/render/orderIndependent.ts +136 -0
- package/src/render/particleBatch.ts +299 -0
- package/src/render/particleMaterial.ts +84 -0
- package/src/render/particlePool.ts +291 -0
- package/src/render/pass.ts +203 -0
- package/src/render/passTarget.ts +225 -0
- package/src/render/pickable.ts +222 -0
- package/src/render/planarReflection.ts +233 -0
- package/src/render/planarReflectionDraw.ts +87 -0
- package/src/render/plumeGeometry.ts +75 -0
- package/src/render/plumeMaterial.ts +99 -0
- package/src/render/plumeRenderer.ts +272 -0
- package/src/render/pointLightSelection.ts +447 -0
- package/src/render/pointShadowArray.ts +276 -0
- package/src/render/pointShadowBudget.ts +305 -0
- package/src/render/pointShadowImage.ts +470 -0
- package/src/render/pointShadowMap.ts +228 -0
- package/src/render/pointShadowSystem.ts +408 -0
- package/src/render/prefilterEnvMap.ts +162 -0
- package/src/render/prefilterPass.ts +115 -0
- package/src/render/probeGrid.ts +248 -0
- package/src/render/rainField.ts +240 -0
- package/src/render/reflectionProbe.ts +530 -0
- package/src/render/renderQuality.ts +1054 -0
- package/src/render/rendererHarness.ts +214 -0
- package/src/render/resolutionGovernor.ts +189 -0
- package/src/render/scatterDeform.ts +72 -0
- package/src/render/sceneTarget.ts +1032 -0
- package/src/render/screenSpaceReflection.ts +524 -0
- package/src/render/sdfFont.ts +157 -0
- package/src/render/sdfTextLayout.ts +206 -0
- package/src/render/sdfTextRenderer.ts +233 -0
- package/src/render/seaState.ts +55 -0
- package/src/render/segmentQuads.ts +92 -0
- package/src/render/shader.ts +190 -0
- package/src/render/shaders/ambientOcclusion.ts +354 -0
- package/src/render/shaders/arcane.ts +103 -0
- package/src/render/shaders/bloom.ts +232 -0
- package/src/render/shaders/bolt.ts +164 -0
- package/src/render/shaders/caustics.ts +169 -0
- package/src/render/shaders/conditionals.ts +58 -0
- package/src/render/shaders/decalProject.ts +127 -0
- package/src/render/shaders/depth.ts +131 -0
- package/src/render/shaders/depthOfField.ts +141 -0
- package/src/render/shaders/film.ts +285 -0
- package/src/render/shaders/fire.ts +180 -0
- package/src/render/shaders/flat/directionalShadow.ts +196 -0
- package/src/render/shaders/flat/index.ts +502 -0
- package/src/render/shaders/flat/lobes.ts +399 -0
- package/src/render/shaders/flat/main.ts +1631 -0
- package/src/render/shaders/flat/pointShadow.ts +323 -0
- package/src/render/shaders/flat/preamble.ts +875 -0
- package/src/render/shaders/flat/probeGrid.ts +152 -0
- package/src/render/shaders/flat/surface.ts +41 -0
- package/src/render/shaders/flock.ts +103 -0
- package/src/render/shaders/fog.ts +99 -0
- package/src/render/shaders/fullscreen.ts +28 -0
- package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +74 -0
- package/src/render/shaders/generated/arcane.wgsl.ts +98 -0
- package/src/render/shaders/generated/bloom.wgsl.ts +79 -0
- package/src/render/shaders/generated/bolt.wgsl.ts +127 -0
- package/src/render/shaders/generated/caustics.wgsl.ts +127 -0
- package/src/render/shaders/generated/decalProject.wgsl.ts +69 -0
- package/src/render/shaders/generated/depth.wgsl.ts +142 -0
- package/src/render/shaders/generated/film.wgsl.ts +143 -0
- package/src/render/shaders/generated/fire.wgsl.ts +137 -0
- package/src/render/shaders/generated/flat.wgsl.ts +9195 -0
- package/src/render/shaders/generated/flock.wgsl.ts +82 -0
- package/src/render/shaders/generated/fullscreen.wgsl.ts +20 -0
- package/src/render/shaders/generated/globalMedium.wgsl.ts +139 -0
- package/src/render/shaders/generated/lightVolume.wgsl.ts +242 -0
- package/src/render/shaders/generated/line.wgsl.ts +137 -0
- package/src/render/shaders/generated/octahedralResolve.wgsl.ts +60 -0
- package/src/render/shaders/generated/oitResolve.wgsl.ts +31 -0
- package/src/render/shaders/generated/panel.wgsl.ts +57 -0
- package/src/render/shaders/generated/particle.wgsl.ts +343 -0
- package/src/render/shaders/generated/prefilter.wgsl.ts +69 -0
- package/src/render/shaders/generated/rush.wgsl.ts +139 -0
- package/src/render/shaders/generated/scatter.wgsl.ts +205 -0
- package/src/render/shaders/generated/sdfText.wgsl.ts +78 -0
- package/src/render/shaders/generated/sky.wgsl.ts +109 -0
- package/src/render/shaders/generated/smoke.wgsl.ts +93 -0
- package/src/render/shaders/generated/ssrResolve.wgsl.ts +26 -0
- package/src/render/shaders/generated/ssrTrace.wgsl.ts +94 -0
- package/src/render/shaders/generated/temporalResolve.wgsl.ts +54 -0
- package/src/render/shaders/generated/text.wgsl.ts +107 -0
- package/src/render/shaders/generated/water.wgsl.ts +256 -0
- package/src/render/shaders/generated/windStreaks.wgsl.ts +82 -0
- package/src/render/shaders/gerstner.ts +110 -0
- package/src/render/shaders/globalMedium.ts +396 -0
- package/src/render/shaders/lightVolume.ts +546 -0
- package/src/render/shaders/line.ts +125 -0
- package/src/render/shaders/morph.ts +62 -0
- package/src/render/shaders/octahedral.ts +170 -0
- package/src/render/shaders/octahedralResolve.ts +83 -0
- package/src/render/shaders/oitResolve.ts +42 -0
- package/src/render/shaders/outputTransform.ts +107 -0
- package/src/render/shaders/panel.ts +51 -0
- package/src/render/shaders/particle.ts +438 -0
- package/src/render/shaders/prefilter.ts +278 -0
- package/src/render/shaders/rush.ts +357 -0
- package/src/render/shaders/scatter.ts +211 -0
- package/src/render/shaders/sdfText.ts +68 -0
- package/src/render/shaders/skinning.ts +59 -0
- package/src/render/shaders/sky.ts +243 -0
- package/src/render/shaders/smoke.ts +89 -0
- package/src/render/shaders/ssrResolve.ts +28 -0
- package/src/render/shaders/ssrTrace.ts +233 -0
- package/src/render/shaders/tangentFrame.ts +70 -0
- package/src/render/shaders/temporalResolve.ts +151 -0
- package/src/render/shaders/text.ts +156 -0
- package/src/render/shaders/vertexChannel.ts +71 -0
- package/src/render/shaders/water.ts +356 -0
- package/src/render/shaders/windStreaks.ts +130 -0
- package/src/render/shadowCasters.ts +124 -0
- package/src/render/shadowMap.ts +89 -0
- package/src/render/shotPlacement.ts +266 -0
- package/src/render/skinPalette.ts +157 -0
- package/src/render/ssrPass.ts +241 -0
- package/src/render/surfaceSheet.ts +158 -0
- package/src/render/surfaceTexture.ts +310 -0
- package/src/render/temporalAa.ts +221 -0
- package/src/render/temporalPass.ts +153 -0
- package/src/render/textLayout.ts +239 -0
- package/src/render/textRenderer.ts +201 -0
- package/src/render/thirdPersonCamera.ts +578 -0
- package/src/render/trample.ts +140 -0
- package/src/render/translucentQueue.ts +161 -0
- package/src/render/uniformVectorBudget.ts +246 -0
- package/src/render/uploadStep.ts +14 -0
- package/src/render/vertexDefaults.ts +115 -0
- package/src/render/visibility.ts +56 -0
- package/src/render/waterDraw.ts +167 -0
- package/src/render/waterGrid.ts +180 -0
- package/src/render/waterRenderer.ts +352 -0
- package/src/render/wind.ts +79 -0
- package/src/render/windField.ts +50 -0
- package/src/render/windStreakDraw.ts +131 -0
- package/src/render/windStreakRenderer.ts +130 -0
- package/src/scene/node.ts +336 -0
- package/src/scene/visit.ts +82 -0
- package/src/ui/clipMime.ts +109 -0
- package/src/ui/exportTarget.ts +491 -0
- package/src/ui/frameOverlay.ts +159 -0
- package/src/ui/framePacer.ts +351 -0
- package/src/ui/frameRecorder.ts +333 -0
- package/src/ui/fullscreen.ts +113 -0
- package/src/ui/pixelCursor.ts +99 -0
- package/src/ui/splash.ts +347 -0
- package/src/ui/stillFrame.ts +44 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { PointShadowSource, ResolvedPointShadows } from './pointShadowImage.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A pool of point-light shadow maps and the fixed set the shader samples.
|
|
4
|
+
*
|
|
5
|
+
* World lights do not own maps. They borrow one from a pool of
|
|
6
|
+
* `POINT_SHADOW_POOL`, handed out to whichever lights the shading pass chose and
|
|
7
|
+
* reclaimed from whichever was sampled least recently. Live maps contain moving
|
|
8
|
+
* casters only, so they compose with the borrowed maps rather than overwriting
|
|
9
|
+
* them. Normally one is active; both are used briefly while ownership crossfades
|
|
10
|
+
* to another light.
|
|
11
|
+
*
|
|
12
|
+
* **It used to be one permanent map per light**, which read as the generous
|
|
13
|
+
* choice and was the renderer's worst bug: a world with 50 lights allocated
|
|
14
|
+
* roughly 327 MB of cubemaps so that eight of them could be read. See
|
|
15
|
+
* `POINT_SHADOW_POOL` for what that did to integrated GPUs. Borrowing costs a
|
|
16
|
+
* six-face bake when a light enters the sampled set after being away, and buys
|
|
17
|
+
* back memory that scales with the light *budget* rather than with how many lamps
|
|
18
|
+
* the day's world happened to generate.
|
|
19
|
+
*
|
|
20
|
+
* Nothing is lost visually, and that is the point rather than a hope: a light
|
|
21
|
+
* outside the sampled set has no `samplerCube` bound to it and could not be read
|
|
22
|
+
* however long its map was kept.
|
|
23
|
+
*
|
|
24
|
+
* Selection is adopted from the shading pass verbatim. If lighting and shadow
|
|
25
|
+
* code choose independently, a small camera movement can reorder the two sets
|
|
26
|
+
* and make a lamp's static shadow switch off while its illumination remains.
|
|
27
|
+
*/
|
|
28
|
+
export interface ShadowLight {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
z: number;
|
|
32
|
+
/** Distance at which the light falls to zero; the map's far plane. */
|
|
33
|
+
radius: number;
|
|
34
|
+
/** Where casting begins. Keep small — it clips every caster, not just fixtures. */
|
|
35
|
+
shadowNear: number;
|
|
36
|
+
/** Physical emitter radius in metres; it controls penumbra width. */
|
|
37
|
+
sourceRadius: number;
|
|
38
|
+
/**
|
|
39
|
+
* Whether this light is worth a cubemap at all. Defaults to true.
|
|
40
|
+
*
|
|
41
|
+
* The same flag `PointLightSource` carries, declared here because the renderer checks
|
|
42
|
+
* it against the *shaded* set before handing out a pool slot. It used to be read only
|
|
43
|
+
* while building the eligible list, so a light that declined to cast still got a map
|
|
44
|
+
* whenever it was one of the lights being shaded — which is every light near the
|
|
45
|
+
* camera, and so every light whose bake anybody would notice.
|
|
46
|
+
*/
|
|
47
|
+
castsShadow?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The shader's own name for the point-shadow array.
|
|
51
|
+
*
|
|
52
|
+
* Exported because *both* backends address it: WebGL2 looks it up in its uniform table and
|
|
53
|
+
* WebGPU looks it up in the generated binding table. One name, so the two cannot bind different
|
|
54
|
+
* things.
|
|
55
|
+
*
|
|
56
|
+
* **It was twelve names, one per cubemap sampler**, because GLSL ES cannot index a sampler
|
|
57
|
+
* array with a non-constant expression and the shader therefore declared each map separately.
|
|
58
|
+
* One array texture with a layer per light needs one.
|
|
59
|
+
*/
|
|
60
|
+
export declare const POINT_SHADOW_SAMPLER = "uPointShadows";
|
|
61
|
+
export declare class PointShadowSystem<M extends PointShadowSource> {
|
|
62
|
+
private readonly createMap;
|
|
63
|
+
private readonly releaseMap;
|
|
64
|
+
/** The pool. Indexed by pool slot, never by world light. */
|
|
65
|
+
private readonly maps;
|
|
66
|
+
private readonly live;
|
|
67
|
+
private staticLightCount;
|
|
68
|
+
/** Which world light currently holds each pool slot, or -1 while free. */
|
|
69
|
+
private readonly slotOwner;
|
|
70
|
+
/** The lights held ready but not shaded, so joining the sampled set costs no bake. */
|
|
71
|
+
private readonly warm;
|
|
72
|
+
private warmCount;
|
|
73
|
+
/** Frame stamp of the last time each slot was wanted, for the eviction choice. */
|
|
74
|
+
private readonly slotUsed;
|
|
75
|
+
/** Reverse of `slotOwner`: pool slot per world light, or -1 while unassigned. */
|
|
76
|
+
private lightSlot;
|
|
77
|
+
private useStamp;
|
|
78
|
+
private readonly chosen;
|
|
79
|
+
/** Shader light slot each chosen world map belongs to. */
|
|
80
|
+
private readonly slots;
|
|
81
|
+
private chosenCount;
|
|
82
|
+
/** Batched array uniforms; WebGL exposes each array at its `[0]` location. */
|
|
83
|
+
private readonly far;
|
|
84
|
+
private readonly near;
|
|
85
|
+
private readonly sourceRadius;
|
|
86
|
+
/** How present each bound map is, so a re-baked one arrives rather than appears. */
|
|
87
|
+
private readonly presence;
|
|
88
|
+
/**
|
|
89
|
+
* `createMap` rather than a context and a size, so the pool never names a device.
|
|
90
|
+
*
|
|
91
|
+
* The whole of this class is pooling, staleness and selection — decisions a second backend
|
|
92
|
+
* must make identically or its shadows change hands at different moments. Taking a factory is
|
|
93
|
+
* what lets both share it; see `PointShadowSource`.
|
|
94
|
+
*/
|
|
95
|
+
constructor(createMap: (layer: number) => M, releaseMap: (map: M) => void);
|
|
96
|
+
/**
|
|
97
|
+
* Size the pool and forget every assignment. Called once the light count is known.
|
|
98
|
+
*
|
|
99
|
+
* The pool is capped at `POINT_SHADOW_POOL` however many lights the caller has,
|
|
100
|
+
* and at the light count when that is smaller — a world with three lamps has no
|
|
101
|
+
* use for twelve cubemaps.
|
|
102
|
+
*/
|
|
103
|
+
prepareStaticMaps(lightCount: number): void;
|
|
104
|
+
/**
|
|
105
|
+
* The map a light is currently borrowing, if any.
|
|
106
|
+
*
|
|
107
|
+
* A pure lookup: assignment happens once a frame in `sync`, because handing out
|
|
108
|
+
* slots from here would let a caller iterating lights evict the map it is about
|
|
109
|
+
* to read.
|
|
110
|
+
*/
|
|
111
|
+
mapForLight(lightIndex: number): M | undefined;
|
|
112
|
+
/** Adopt the shading pass's world-light list, including its exact order. */
|
|
113
|
+
sync(activeWorldIndices: Int32Array, activeCount: number, warmWorldIndices?: Int32Array, warmCount?: number): void;
|
|
114
|
+
/**
|
|
115
|
+
* Give every chosen light a pool slot, evicting the least recently wanted.
|
|
116
|
+
*
|
|
117
|
+
* One stamp for the whole call, so every light chosen this frame is equally
|
|
118
|
+
* recent and `claimSlot` can refuse to evict any of them.
|
|
119
|
+
*/
|
|
120
|
+
private assignSlots;
|
|
121
|
+
private give;
|
|
122
|
+
/**
|
|
123
|
+
* Take a free slot, or the one wanted longest ago.
|
|
124
|
+
*
|
|
125
|
+
* Slots already stamped with this frame belong to lights the shader is about to
|
|
126
|
+
* read, so they are never candidates. The pool has more slots than
|
|
127
|
+
* `MAX_POINT_LIGHTS`, so a candidate always exists.
|
|
128
|
+
*/
|
|
129
|
+
private claimSlot;
|
|
130
|
+
/** Ramp every pooled image toward full presence. See `PointShadowMap.advance`. */
|
|
131
|
+
/**
|
|
132
|
+
* Ramp every image toward full presence: the pool's, **and the live pair's**.
|
|
133
|
+
*
|
|
134
|
+
* The second half was missing, and it is the whole of why a moving caster was never shadowed by
|
|
135
|
+
* a point light. `this.maps` is the pool; the live pair belongs to `LivePointShadowSet`, which
|
|
136
|
+
* publishes `crossfade weight * presence` and therefore published zero for ever. Every other
|
|
137
|
+
* part of that path reports itself healthy, which is what made it survive.
|
|
138
|
+
*/
|
|
139
|
+
advance(dt: number): void;
|
|
140
|
+
get sampledCount(): number;
|
|
141
|
+
/** How many lights hold a slot this frame: the shaded ones plus the warming ones. */
|
|
142
|
+
get pooledCount(): number;
|
|
143
|
+
/**
|
|
144
|
+
* A light holding a slot, shaded ones first.
|
|
145
|
+
*
|
|
146
|
+
* The renderer bakes across this rather than across `sampledCount`, which is the
|
|
147
|
+
* whole point: a warm light's map is baked *before* it is bound, so being chosen
|
|
148
|
+
* for shading never costs six face passes.
|
|
149
|
+
*/
|
|
150
|
+
pooledLight(index: number): number;
|
|
151
|
+
sampledLight(slot: number): number;
|
|
152
|
+
/**
|
|
153
|
+
* Select the live shadow around a moving caster and advance any ownership
|
|
154
|
+
* crossfade. The position is caller-provided and has no gameplay meaning to
|
|
155
|
+
* the engine.
|
|
156
|
+
*/
|
|
157
|
+
updateLiveSelection(lights: readonly ShadowLight[], x: number, y: number, z: number, frameDt: number): void;
|
|
158
|
+
get liveMapCount(): number;
|
|
159
|
+
liveOwner(slot: number): number;
|
|
160
|
+
liveMap(slot: number): M | undefined;
|
|
161
|
+
/**
|
|
162
|
+
* Bind every selected map and upload its metadata as whole arrays.
|
|
163
|
+
*
|
|
164
|
+
* WebGL reports an active uniform array only as `name[0]`. Looking up
|
|
165
|
+
* `name[1]` in the cached uniform table therefore returns nothing; uploading
|
|
166
|
+
* each element that way left slots 1–7 at zero and made their shadows vanish.
|
|
167
|
+
*/
|
|
168
|
+
/**
|
|
169
|
+
* Settle every shader slot's map choice and parameters into the caller's arrays.
|
|
170
|
+
*
|
|
171
|
+
* **The arrays are the decision and the cubemaps are the binding.** Which light samples which
|
|
172
|
+
* slot, whether its image has landed and how present it is are answers this pool computes;
|
|
173
|
+
* turning them into `uniform1fv` or into bytes of a uniform block is all that differs between
|
|
174
|
+
* backends. A caller walks `mapForShaderSlot` for the textures.
|
|
175
|
+
*/
|
|
176
|
+
resolve(out: ResolvedPointShadows): void;
|
|
177
|
+
/**
|
|
178
|
+
* The map a shader slot samples, or undefined.
|
|
179
|
+
*
|
|
180
|
+
* Separate from `resolve` because a backend needs it for the *texture* while the arrays are
|
|
181
|
+
* already settled, and because a slot with no map still has to be filled with something —
|
|
182
|
+
* see `emptyTexture.ts` on one side and the one-texel cube on the other.
|
|
183
|
+
*/
|
|
184
|
+
mapForShaderSlot(slot: number): M | undefined;
|
|
185
|
+
/**
|
|
186
|
+
* Throw away every baked image, keeping the maps and their layers.
|
|
187
|
+
*
|
|
188
|
+
* For a backend that had to rebuild the storage under them — the array is immutable once
|
|
189
|
+
* allocated, so growing it for a bigger world replaces the pixels with nothing. A map that
|
|
190
|
+
* still reported `hasBaked` afterwards would be sampled, and what it would read is whatever
|
|
191
|
+
* the new allocation happens to contain.
|
|
192
|
+
*/
|
|
193
|
+
forgetEveryImage(): void;
|
|
194
|
+
dispose(): void;
|
|
195
|
+
}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { LIVE_POINT_SHADOW_MAPS, MAX_POINT_LIGHTS, POINT_SHADOW_POOL } from './lightBudget.js';
|
|
2
|
+
import { LivePointShadowSet } from './livePointShadowSet.js';
|
|
3
|
+
/**
|
|
4
|
+
* The shader's own name for the point-shadow array.
|
|
5
|
+
*
|
|
6
|
+
* Exported because *both* backends address it: WebGL2 looks it up in its uniform table and
|
|
7
|
+
* WebGPU looks it up in the generated binding table. One name, so the two cannot bind different
|
|
8
|
+
* things.
|
|
9
|
+
*
|
|
10
|
+
* **It was twelve names, one per cubemap sampler**, because GLSL ES cannot index a sampler
|
|
11
|
+
* array with a non-constant expression and the shader therefore declared each map separately.
|
|
12
|
+
* One array texture with a layer per light needs one.
|
|
13
|
+
*/
|
|
14
|
+
export const POINT_SHADOW_SAMPLER = 'uPointShadows';
|
|
15
|
+
export class PointShadowSystem {
|
|
16
|
+
createMap;
|
|
17
|
+
releaseMap;
|
|
18
|
+
/** The pool. Indexed by pool slot, never by world light. */
|
|
19
|
+
maps = [];
|
|
20
|
+
live;
|
|
21
|
+
staticLightCount = 0;
|
|
22
|
+
/** Which world light currently holds each pool slot, or -1 while free. */
|
|
23
|
+
slotOwner = new Int32Array(POINT_SHADOW_POOL).fill(-1);
|
|
24
|
+
/** The lights held ready but not shaded, so joining the sampled set costs no bake. */
|
|
25
|
+
warm = new Int32Array(POINT_SHADOW_POOL);
|
|
26
|
+
warmCount = 0;
|
|
27
|
+
/** Frame stamp of the last time each slot was wanted, for the eviction choice. */
|
|
28
|
+
slotUsed = new Float64Array(POINT_SHADOW_POOL);
|
|
29
|
+
/** Reverse of `slotOwner`: pool slot per world light, or -1 while unassigned. */
|
|
30
|
+
lightSlot = new Int32Array(0);
|
|
31
|
+
useStamp = 0;
|
|
32
|
+
chosen = new Int32Array(MAX_POINT_LIGHTS);
|
|
33
|
+
/** Shader light slot each chosen world map belongs to. */
|
|
34
|
+
slots = new Int32Array(MAX_POINT_LIGHTS);
|
|
35
|
+
chosenCount = 0;
|
|
36
|
+
/** Batched array uniforms; WebGL exposes each array at its `[0]` location. */
|
|
37
|
+
far = new Float32Array(MAX_POINT_LIGHTS);
|
|
38
|
+
near = new Float32Array(MAX_POINT_LIGHTS);
|
|
39
|
+
sourceRadius = new Float32Array(MAX_POINT_LIGHTS);
|
|
40
|
+
/** How present each bound map is, so a re-baked one arrives rather than appears. */
|
|
41
|
+
presence = new Float32Array(MAX_POINT_LIGHTS);
|
|
42
|
+
/**
|
|
43
|
+
* `createMap` rather than a context and a size, so the pool never names a device.
|
|
44
|
+
*
|
|
45
|
+
* The whole of this class is pooling, staleness and selection — decisions a second backend
|
|
46
|
+
* must make identically or its shadows change hands at different moments. Taking a factory is
|
|
47
|
+
* what lets both share it; see `PointShadowSource`.
|
|
48
|
+
*/
|
|
49
|
+
constructor(createMap, releaseMap) {
|
|
50
|
+
this.createMap = createMap;
|
|
51
|
+
this.releaseMap = releaseMap;
|
|
52
|
+
this.live = new LivePointShadowSet(createMap, releaseMap);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Size the pool and forget every assignment. Called once the light count is known.
|
|
56
|
+
*
|
|
57
|
+
* The pool is capped at `POINT_SHADOW_POOL` however many lights the caller has,
|
|
58
|
+
* and at the light count when that is smaller — a world with three lamps has no
|
|
59
|
+
* use for twelve cubemaps.
|
|
60
|
+
*/
|
|
61
|
+
prepareStaticMaps(lightCount) {
|
|
62
|
+
const wanted = Math.min(lightCount, POINT_SHADOW_POOL);
|
|
63
|
+
while (this.maps.length < wanted) {
|
|
64
|
+
/* Pool slot i takes layer LIVE + i; the live maps hold 0 and 1. See PointShadowArray. */
|
|
65
|
+
this.maps.push(this.createMap(LIVE_POINT_SHADOW_MAPS + this.maps.length));
|
|
66
|
+
}
|
|
67
|
+
if (this.lightSlot.length < lightCount)
|
|
68
|
+
this.lightSlot = new Int32Array(lightCount);
|
|
69
|
+
this.lightSlot.fill(-1);
|
|
70
|
+
this.slotOwner.fill(-1);
|
|
71
|
+
this.slotUsed.fill(0);
|
|
72
|
+
this.staticLightCount = lightCount;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The map a light is currently borrowing, if any.
|
|
76
|
+
*
|
|
77
|
+
* A pure lookup: assignment happens once a frame in `sync`, because handing out
|
|
78
|
+
* slots from here would let a caller iterating lights evict the map it is about
|
|
79
|
+
* to read.
|
|
80
|
+
*/
|
|
81
|
+
mapForLight(lightIndex) {
|
|
82
|
+
if (lightIndex < 0 || lightIndex >= this.staticLightCount)
|
|
83
|
+
return undefined;
|
|
84
|
+
const slot = this.lightSlot[lightIndex] ?? -1;
|
|
85
|
+
return slot < 0 ? undefined : this.maps[slot];
|
|
86
|
+
}
|
|
87
|
+
/** Adopt the shading pass's world-light list, including its exact order. */
|
|
88
|
+
sync(activeWorldIndices, activeCount, warmWorldIndices, warmCount = 0) {
|
|
89
|
+
this.chosenCount = 0;
|
|
90
|
+
const limit = Math.min(activeCount, MAX_POINT_LIGHTS);
|
|
91
|
+
for (let shaderSlot = 0; shaderSlot < limit; shaderSlot++) {
|
|
92
|
+
const worldIndex = activeWorldIndices[shaderSlot] ?? -1;
|
|
93
|
+
if (worldIndex < 0 || worldIndex >= this.staticLightCount)
|
|
94
|
+
continue;
|
|
95
|
+
this.chosen[this.chosenCount] = worldIndex;
|
|
96
|
+
this.slots[this.chosenCount] = shaderSlot;
|
|
97
|
+
this.chosenCount++;
|
|
98
|
+
}
|
|
99
|
+
/*
|
|
100
|
+
* The lights about to be wanted, given slots and baked before they are.
|
|
101
|
+
*
|
|
102
|
+
* Every light owned a permanent map before the pool, so joining the sampled set
|
|
103
|
+
* meant its shadow was already correct. Borrowing broke that: joining meant
|
|
104
|
+
* evicting somebody and baking six faces at two a frame, which is the on/off as a
|
|
105
|
+
* lamp comes into range. The pool has always carried four slots more than the
|
|
106
|
+
* shader can bind, and until now they only absorbed churn — these are the lights
|
|
107
|
+
* they were for.
|
|
108
|
+
*
|
|
109
|
+
* Warm lights hold a slot and take bake budget. They are never bound: `sampledCount`
|
|
110
|
+
* still counts only what the shader reads.
|
|
111
|
+
*/
|
|
112
|
+
this.warmCount = 0;
|
|
113
|
+
if (warmWorldIndices !== undefined) {
|
|
114
|
+
const warmLimit = Math.min(warmCount, this.maps.length);
|
|
115
|
+
for (let i = 0; i < warmLimit; i++) {
|
|
116
|
+
const worldIndex = warmWorldIndices[i] ?? -1;
|
|
117
|
+
if (worldIndex < 0 || worldIndex >= this.staticLightCount)
|
|
118
|
+
continue;
|
|
119
|
+
/*
|
|
120
|
+
* Already being shaded, so it is not warming for anything: it holds its slot
|
|
121
|
+
* from the loop above and it is baked across `pooledCount` either way.
|
|
122
|
+
*
|
|
123
|
+
* Without this the two lists overlap almost entirely — the shadow list is the
|
|
124
|
+
* lights inside their own radius, and a light that close is nearly always in
|
|
125
|
+
* the shaded set already — so `pooledCount` counted the same lights twice, and
|
|
126
|
+
* `bakeStale` being pool-length meant the genuinely extra ones fell off the
|
|
127
|
+
* end. The spare slots the pool carries for exactly this never held anything.
|
|
128
|
+
*/
|
|
129
|
+
let shaded = false;
|
|
130
|
+
for (let k = 0; k < this.chosenCount; k++) {
|
|
131
|
+
if (this.chosen[k] === worldIndex) {
|
|
132
|
+
shaded = true;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (shaded)
|
|
137
|
+
continue;
|
|
138
|
+
this.warm[this.warmCount] = worldIndex;
|
|
139
|
+
this.warmCount++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.assignSlots();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Give every chosen light a pool slot, evicting the least recently wanted.
|
|
146
|
+
*
|
|
147
|
+
* One stamp for the whole call, so every light chosen this frame is equally
|
|
148
|
+
* recent and `claimSlot` can refuse to evict any of them.
|
|
149
|
+
*/
|
|
150
|
+
assignSlots() {
|
|
151
|
+
this.useStamp++;
|
|
152
|
+
// Sampled first, so a warm light can never take a slot from one being shaded.
|
|
153
|
+
for (let k = 0; k < this.chosenCount; k++)
|
|
154
|
+
this.give(this.chosen[k] ?? -1);
|
|
155
|
+
for (let k = 0; k < this.warmCount; k++)
|
|
156
|
+
this.give(this.warm[k] ?? -1);
|
|
157
|
+
}
|
|
158
|
+
give(light) {
|
|
159
|
+
if (light < 0)
|
|
160
|
+
return;
|
|
161
|
+
const existing = this.lightSlot[light] ?? -1;
|
|
162
|
+
const slot = existing >= 0 ? existing : this.claimSlot(light);
|
|
163
|
+
if (slot >= 0)
|
|
164
|
+
this.slotUsed[slot] = this.useStamp;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Take a free slot, or the one wanted longest ago.
|
|
168
|
+
*
|
|
169
|
+
* Slots already stamped with this frame belong to lights the shader is about to
|
|
170
|
+
* read, so they are never candidates. The pool has more slots than
|
|
171
|
+
* `MAX_POINT_LIGHTS`, so a candidate always exists.
|
|
172
|
+
*/
|
|
173
|
+
claimSlot(light) {
|
|
174
|
+
let best = -1;
|
|
175
|
+
let bestStamp = Infinity;
|
|
176
|
+
for (let slot = 0; slot < this.maps.length; slot++) {
|
|
177
|
+
if ((this.slotUsed[slot] ?? 0) === this.useStamp)
|
|
178
|
+
continue;
|
|
179
|
+
if ((this.slotOwner[slot] ?? -1) < 0) {
|
|
180
|
+
best = slot;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const stamp = this.slotUsed[slot] ?? 0;
|
|
184
|
+
if (stamp < bestStamp) {
|
|
185
|
+
bestStamp = stamp;
|
|
186
|
+
best = slot;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (best < 0)
|
|
190
|
+
return -1;
|
|
191
|
+
const previous = this.slotOwner[best] ?? -1;
|
|
192
|
+
if (previous >= 0) {
|
|
193
|
+
this.lightSlot[previous] = -1;
|
|
194
|
+
// The image belongs to the light losing the slot, not to the one taking it.
|
|
195
|
+
// Left in place it is sampled as the new light's shadow until a re-bake lands.
|
|
196
|
+
this.maps[best]?.forget();
|
|
197
|
+
}
|
|
198
|
+
this.slotOwner[best] = light;
|
|
199
|
+
this.lightSlot[light] = best;
|
|
200
|
+
return best;
|
|
201
|
+
}
|
|
202
|
+
/** Ramp every pooled image toward full presence. See `PointShadowMap.advance`. */
|
|
203
|
+
/**
|
|
204
|
+
* Ramp every image toward full presence: the pool's, **and the live pair's**.
|
|
205
|
+
*
|
|
206
|
+
* The second half was missing, and it is the whole of why a moving caster was never shadowed by
|
|
207
|
+
* a point light. `this.maps` is the pool; the live pair belongs to `LivePointShadowSet`, which
|
|
208
|
+
* publishes `crossfade weight * presence` and therefore published zero for ever. Every other
|
|
209
|
+
* part of that path reports itself healthy, which is what made it survive.
|
|
210
|
+
*/
|
|
211
|
+
advance(dt) {
|
|
212
|
+
for (const map of this.maps)
|
|
213
|
+
map.advance(dt);
|
|
214
|
+
this.live.advance(dt);
|
|
215
|
+
}
|
|
216
|
+
get sampledCount() {
|
|
217
|
+
return this.chosenCount;
|
|
218
|
+
}
|
|
219
|
+
/** How many lights hold a slot this frame: the shaded ones plus the warming ones. */
|
|
220
|
+
get pooledCount() {
|
|
221
|
+
return this.chosenCount + this.warmCount;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* A light holding a slot, shaded ones first.
|
|
225
|
+
*
|
|
226
|
+
* The renderer bakes across this rather than across `sampledCount`, which is the
|
|
227
|
+
* whole point: a warm light's map is baked *before* it is bound, so being chosen
|
|
228
|
+
* for shading never costs six face passes.
|
|
229
|
+
*/
|
|
230
|
+
pooledLight(index) {
|
|
231
|
+
if (index < this.chosenCount)
|
|
232
|
+
return this.chosen[index] ?? -1;
|
|
233
|
+
return this.warm[index - this.chosenCount] ?? -1;
|
|
234
|
+
}
|
|
235
|
+
sampledLight(slot) {
|
|
236
|
+
return slot >= 0 && slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Select the live shadow around a moving caster and advance any ownership
|
|
240
|
+
* crossfade. The position is caller-provided and has no gameplay meaning to
|
|
241
|
+
* the engine.
|
|
242
|
+
*/
|
|
243
|
+
updateLiveSelection(lights, x, y, z, frameDt) {
|
|
244
|
+
this.live.update(lights, this.chosen, this.chosenCount, x, y, z, frameDt);
|
|
245
|
+
}
|
|
246
|
+
get liveMapCount() {
|
|
247
|
+
return LIVE_POINT_SHADOW_MAPS;
|
|
248
|
+
}
|
|
249
|
+
liveOwner(slot) {
|
|
250
|
+
return this.live.owner(slot, this.chosen, this.chosenCount);
|
|
251
|
+
}
|
|
252
|
+
liveMap(slot) {
|
|
253
|
+
return this.live.map(slot);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Bind every selected map and upload its metadata as whole arrays.
|
|
257
|
+
*
|
|
258
|
+
* WebGL reports an active uniform array only as `name[0]`. Looking up
|
|
259
|
+
* `name[1]` in the cached uniform table therefore returns nothing; uploading
|
|
260
|
+
* each element that way left slots 1–7 at zero and made their shadows vanish.
|
|
261
|
+
*/
|
|
262
|
+
/**
|
|
263
|
+
* Settle every shader slot's map choice and parameters into the caller's arrays.
|
|
264
|
+
*
|
|
265
|
+
* **The arrays are the decision and the cubemaps are the binding.** Which light samples which
|
|
266
|
+
* slot, whether its image has landed and how present it is are answers this pool computes;
|
|
267
|
+
* turning them into `uniform1fv` or into bytes of a uniform block is all that differs between
|
|
268
|
+
* backends. A caller walks `mapForShaderSlot` for the textures.
|
|
269
|
+
*/
|
|
270
|
+
resolve(out) {
|
|
271
|
+
out.layers.fill(-1);
|
|
272
|
+
out.far.fill(1);
|
|
273
|
+
out.near.fill(0.01);
|
|
274
|
+
out.sourceRadius.fill(0);
|
|
275
|
+
out.presence.fill(0);
|
|
276
|
+
for (let k = 0; k < MAX_POINT_LIGHTS; k++) {
|
|
277
|
+
const map = this.mapForShaderSlot(k);
|
|
278
|
+
/*
|
|
279
|
+
* A map with no image yet contributes nothing, exactly as an unassigned one does.
|
|
280
|
+
*
|
|
281
|
+
* Bakes are spread over frames rather than all done the moment they are noticed (see
|
|
282
|
+
* `pointShadowBudget.ts`), so a light can be selected a frame or two before its cubemap
|
|
283
|
+
* exists. Sampling it then would read whatever the pool slot held previously — another
|
|
284
|
+
* lamp's shadow, from somewhere else entirely — which is far worse than the light simply
|
|
285
|
+
* not casting for two frames. The index stays −1, which is the path the shader already
|
|
286
|
+
* takes for a light with no map at all.
|
|
287
|
+
*/
|
|
288
|
+
if (map === undefined || !map.hasBaked)
|
|
289
|
+
continue;
|
|
290
|
+
/*
|
|
291
|
+
* `slots[k]` is the shading pass's own index for this light, which is the `i` the shader
|
|
292
|
+
* loops over — so it is the index everything about this map is written under. The chosen
|
|
293
|
+
* order and the shading order are not the same order, and writing under `k` here would
|
|
294
|
+
* hand light 2 the parameters of light 0 in any scene where they differ.
|
|
295
|
+
*/
|
|
296
|
+
const light = this.slots[k] ?? -1;
|
|
297
|
+
if (light < 0 || light >= out.layers.length)
|
|
298
|
+
continue;
|
|
299
|
+
out.far[light] = map.far;
|
|
300
|
+
out.near[light] = map.near;
|
|
301
|
+
out.sourceRadius[light] = map.sourceRadius;
|
|
302
|
+
out.presence[light] = map.presence;
|
|
303
|
+
out.layers[light] = map.layer;
|
|
304
|
+
}
|
|
305
|
+
this.live.resolve(this.chosen, this.slots, this.chosenCount, out);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* The map a shader slot samples, or undefined.
|
|
309
|
+
*
|
|
310
|
+
* Separate from `resolve` because a backend needs it for the *texture* while the arrays are
|
|
311
|
+
* already settled, and because a slot with no map still has to be filled with something —
|
|
312
|
+
* see `emptyTexture.ts` on one side and the one-texel cube on the other.
|
|
313
|
+
*/
|
|
314
|
+
mapForShaderSlot(slot) {
|
|
315
|
+
const lightIndex = slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
|
|
316
|
+
return this.mapForLight(lightIndex);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Throw away every baked image, keeping the maps and their layers.
|
|
320
|
+
*
|
|
321
|
+
* For a backend that had to rebuild the storage under them — the array is immutable once
|
|
322
|
+
* allocated, so growing it for a bigger world replaces the pixels with nothing. A map that
|
|
323
|
+
* still reported `hasBaked` afterwards would be sampled, and what it would read is whatever
|
|
324
|
+
* the new allocation happens to contain.
|
|
325
|
+
*/
|
|
326
|
+
forgetEveryImage() {
|
|
327
|
+
for (const map of this.maps)
|
|
328
|
+
map.forget();
|
|
329
|
+
this.live.forgetEveryImage();
|
|
330
|
+
}
|
|
331
|
+
dispose() {
|
|
332
|
+
for (const map of this.maps)
|
|
333
|
+
this.releaseMap(map);
|
|
334
|
+
this.live.dispose();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a GGX prefilter has to decide before any device is involved: which roughness a mip level
|
|
3
|
+
* stands for, and which source level one importance sample is allowed to read.
|
|
4
|
+
*
|
|
5
|
+
* **Backend-neutral, and that is the 2026-08-13 rule rather than tidiness.** A helper taking a
|
|
6
|
+
* `WebGL2RenderingContext` is a decision the other backend cannot reach, so it gets reimplemented
|
|
7
|
+
* there and the two drift. Both backends convolve the same cube by the same lobe; only the binding
|
|
8
|
+
* differs. It is also what makes the arithmetic testable without a GPU, which is where the
|
|
9
|
+
* hand-derived numbers in the test beside this file come from.
|
|
10
|
+
*
|
|
11
|
+
* **What a prefilter is, against what shipped before it.** A box filter averages a square of
|
|
12
|
+
* texels. A GGX lobe is not square, is not symmetric about the reflection direction at grazing
|
|
13
|
+
* angles, and widens with roughness in a way that has an analytic form. Sampling a box-filtered
|
|
14
|
+
* chain by roughness is an approximation whose error is largest exactly where a surface looks most
|
|
15
|
+
* interesting, and `uEnvironmentGain` is the control that has been correcting it by brute force.
|
|
16
|
+
*
|
|
17
|
+
* **What it costs:** a bake goes from six passes plus a mip chain to six passes plus a convolution
|
|
18
|
+
* per level. That is affordable only because a bake is once per scene rather than once per frame,
|
|
19
|
+
* and the sample count is a quality option for the same reason a phone and a workstation should
|
|
20
|
+
* not agree on it. **What would make it wrong** is a caller baking per frame; at that point the
|
|
21
|
+
* convolution is the frame's cost and the box chain it replaced was the right trade.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Samples per texel, per quality tier.
|
|
25
|
+
*
|
|
26
|
+
* **Powers of two, because the Hammersley sequence's radical inverse is a bit reversal.** A count
|
|
27
|
+
* that is not a power of two leaves the sequence unevenly stratified, which does not error — it
|
|
28
|
+
* shows as a faint directional bias in the rough levels that reads as the environment being
|
|
29
|
+
* slightly wrong rather than as a sampling fault.
|
|
30
|
+
*
|
|
31
|
+
* 32 is where a rough level stops showing individual bright sources as separate blobs on the
|
|
32
|
+
* scenes in this repository; 128 is where doubling it again stopped being visible. **What would
|
|
33
|
+
* make these wrong** is a much brighter environment than any tested here — a small sun in an
|
|
34
|
+
* otherwise dark sky is the worst case for variance, and it wants the high tier or a source level
|
|
35
|
+
* chosen more conservatively than `sourceLevelForSample` does.
|
|
36
|
+
*/
|
|
37
|
+
export declare const PREFILTER_SAMPLE_COUNTS: {
|
|
38
|
+
readonly low: 16;
|
|
39
|
+
readonly medium: 32;
|
|
40
|
+
readonly high: 128;
|
|
41
|
+
};
|
|
42
|
+
/** The tier names, so a quality option can take one without restating them. */
|
|
43
|
+
export type PrefilterQuality = keyof typeof PREFILTER_SAMPLE_COUNTS;
|
|
44
|
+
/**
|
|
45
|
+
* The octahedral edge a probe of a given cube face size gets.
|
|
46
|
+
*
|
|
47
|
+
* **Twice the face, which is the ratio `OCTAHEDRAL_EDGE` already chose** for the point-shadow
|
|
48
|
+
* array and for the reason written down there: matching a cube face's angular density needs
|
|
49
|
+
* `face * sqrt(6)`, so twice the face is about **1.22x coarser in the worst direction**, taken
|
|
50
|
+
* because the filtering this unlocks is blurring the result anyway. 1024 for a 512 face there,
|
|
51
|
+
* 256 for the default 128 face here — one rule, so the two octahedral resources in this engine
|
|
52
|
+
* are calibrated against each other rather than each to taste.
|
|
53
|
+
*/
|
|
54
|
+
export declare function octahedralEdgeFor(faceSize: number): number;
|
|
55
|
+
/**
|
|
56
|
+
* The irradiance image's edge, and why the diffuse term is a level of the same chain.
|
|
57
|
+
*
|
|
58
|
+
* **Eight, which is what a probe's diffuse light actually needs.** A cosine convolution removes
|
|
59
|
+
* everything above the second band, so the image it produces has no detail an eighth of a sphere
|
|
60
|
+
* across to lose — the size irradiance probes are conventionally stored at, arrived at from the
|
|
61
|
+
* same place. It replaces nine spherical-harmonic coefficients, and 64 octahedral texels carry at
|
|
62
|
+
* least what nine coefficients did.
|
|
63
|
+
*
|
|
64
|
+
* **What this buys is the last texture unit.** A second array would be a second sampler, and
|
|
65
|
+
* WebGL2 guarantees sixteen units of which fifteen are spent. Folding the diffuse term into a
|
|
66
|
+
* level of the radiance chain is what `REFRACT_SCENE_TEXTURE_UNIT`'s comment asks the next
|
|
67
|
+
* sampler to do, and it leaves unit 15 free.
|
|
68
|
+
*/
|
|
69
|
+
export declare const IRRADIANCE_EDGE = 8;
|
|
70
|
+
/**
|
|
71
|
+
* Which level of a chain holds the cosine convolution.
|
|
72
|
+
*
|
|
73
|
+
* The level whose image is `IRRADIANCE_EDGE` across. For the default 256 edge that is level 5, and
|
|
74
|
+
* **the chain stops there rather than carrying unread levels above it** — `texStorage3D` takes a
|
|
75
|
+
* level count, so the three that would hold sixteen, four and one texel are never created. Six
|
|
76
|
+
* levels, 87,360 texels, 683 KB a layer at half float.
|
|
77
|
+
*/
|
|
78
|
+
export declare function irradianceLevelFor(edge: number): number;
|
|
79
|
+
/**
|
|
80
|
+
* The coarsest level the GGX chain reaches, which is one below the irradiance level.
|
|
81
|
+
*
|
|
82
|
+
* This is `uEnvironmentMaxLod`, and it is what `roughnessForLevel` maps roughness 1 onto. For the
|
|
83
|
+
* default edge it is 4, so the roughest level is 16 texels across.
|
|
84
|
+
*
|
|
85
|
+
* **That is better at high roughness than the cube it replaces, not worse.** A 128 cube's chain
|
|
86
|
+
* ends at one texel a face, which the lit pass's own comment complains about — "one texel a face
|
|
87
|
+
* and therefore one colour for every direction". What is given up is roughness granularity, five
|
|
88
|
+
* stops against eight, and the level blend interpolates between them exactly as the cube's mip
|
|
89
|
+
* filter did.
|
|
90
|
+
*/
|
|
91
|
+
export declare function ggxMaxLevelFor(edge: number): number;
|
|
92
|
+
/**
|
|
93
|
+
* The roughness mip level `level` is convolved for.
|
|
94
|
+
*
|
|
95
|
+
* **Linear in the level index, and it has to be**, because the lit pass already picks its level
|
|
96
|
+
* with `surfaceRoughness * uEnvironmentMaxLod`. This is that relation read backwards. A different
|
|
97
|
+
* curve here would not be an improvement in isolation — it would be the two halves disagreeing
|
|
98
|
+
* about what level three means, which reads as roughness being subtly miscalibrated everywhere and
|
|
99
|
+
* points at nothing.
|
|
100
|
+
*
|
|
101
|
+
* **What would make it wrong** is the lit pass changing how it selects a level; the two move
|
|
102
|
+
* together or neither moves.
|
|
103
|
+
*/
|
|
104
|
+
export declare function roughnessForLevel(level: number, maxLevel: number): number;
|
|
105
|
+
/**
|
|
106
|
+
* Which level of the source cube one importance sample may read.
|
|
107
|
+
*
|
|
108
|
+
* **Filtered importance sampling, and the whole point of it is variance rather than speed.** A
|
|
109
|
+
* sample drawn from the GGX distribution covers a solid angle of `1 / (count * pdf)`; one texel of
|
|
110
|
+
* a cube with `faceTexels`-wide faces covers `4*pi / (6 * faceTexels^2)`. When a sample is much
|
|
111
|
+
* wider than a texel, reading the base level lets a few very bright texels land in some samples and
|
|
112
|
+
* not others, and that variance survives the average as fireflies. Reading a level where the sample
|
|
113
|
+
* covers roughly one texel is what removes them without raising the count.
|
|
114
|
+
*
|
|
115
|
+
* The half in front of the logarithm is not a fudge: a level step doubles a texel's width and so
|
|
116
|
+
* quadruples its solid angle, and the level is a length ratio rather than an area one.
|
|
117
|
+
*
|
|
118
|
+
* **What it costs** is that the source has to be a box-filtered chain, which is why the capture
|
|
119
|
+
* keeps its `generateMipmap` and the convolution writes a second cube. **What would make it wrong**
|
|
120
|
+
* is convolving from a source that is itself already convolved: the lobe would be applied twice and
|
|
121
|
+
* the error compounds up the chain, which is precisely the reason the two cubes are separate
|
|
122
|
+
* objects rather than one written in place.
|
|
123
|
+
*/
|
|
124
|
+
export declare function sourceLevelForSample(pdf: number, faceTexels: number, count: number, maxLevel: number): number;
|