@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,408 @@
|
|
|
1
|
+
import { LIVE_POINT_SHADOW_MAPS, MAX_POINT_LIGHTS, POINT_SHADOW_POOL } from './lightBudget.ts';
|
|
2
|
+
import { LivePointShadowSet } from './livePointShadowSet.ts';
|
|
3
|
+
import type { PointShadowSource, ResolvedPointShadows } from './pointShadowImage.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A pool of point-light shadow maps and the fixed set the shader samples.
|
|
7
|
+
*
|
|
8
|
+
* World lights do not own maps. They borrow one from a pool of
|
|
9
|
+
* `POINT_SHADOW_POOL`, handed out to whichever lights the shading pass chose and
|
|
10
|
+
* reclaimed from whichever was sampled least recently. Live maps contain moving
|
|
11
|
+
* casters only, so they compose with the borrowed maps rather than overwriting
|
|
12
|
+
* them. Normally one is active; both are used briefly while ownership crossfades
|
|
13
|
+
* to another light.
|
|
14
|
+
*
|
|
15
|
+
* **It used to be one permanent map per light**, which read as the generous
|
|
16
|
+
* choice and was the renderer's worst bug: a world with 50 lights allocated
|
|
17
|
+
* roughly 327 MB of cubemaps so that eight of them could be read. See
|
|
18
|
+
* `POINT_SHADOW_POOL` for what that did to integrated GPUs. Borrowing costs a
|
|
19
|
+
* six-face bake when a light enters the sampled set after being away, and buys
|
|
20
|
+
* back memory that scales with the light *budget* rather than with how many lamps
|
|
21
|
+
* the day's world happened to generate.
|
|
22
|
+
*
|
|
23
|
+
* Nothing is lost visually, and that is the point rather than a hope: a light
|
|
24
|
+
* outside the sampled set has no `samplerCube` bound to it and could not be read
|
|
25
|
+
* however long its map was kept.
|
|
26
|
+
*
|
|
27
|
+
* Selection is adopted from the shading pass verbatim. If lighting and shadow
|
|
28
|
+
* code choose independently, a small camera movement can reorder the two sets
|
|
29
|
+
* and make a lamp's static shadow switch off while its illumination remains.
|
|
30
|
+
*/
|
|
31
|
+
export interface ShadowLight {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
z: number;
|
|
35
|
+
/** Distance at which the light falls to zero; the map's far plane. */
|
|
36
|
+
radius: number;
|
|
37
|
+
/** Where casting begins. Keep small — it clips every caster, not just fixtures. */
|
|
38
|
+
shadowNear: number;
|
|
39
|
+
/** Physical emitter radius in metres; it controls penumbra width. */
|
|
40
|
+
sourceRadius: number;
|
|
41
|
+
/**
|
|
42
|
+
* Whether this light is worth a cubemap at all. Defaults to true.
|
|
43
|
+
*
|
|
44
|
+
* The same flag `PointLightSource` carries, declared here because the renderer checks
|
|
45
|
+
* it against the *shaded* set before handing out a pool slot. It used to be read only
|
|
46
|
+
* while building the eligible list, so a light that declined to cast still got a map
|
|
47
|
+
* whenever it was one of the lights being shaded — which is every light near the
|
|
48
|
+
* camera, and so every light whose bake anybody would notice.
|
|
49
|
+
*/
|
|
50
|
+
castsShadow?: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The shader's own name for the point-shadow array.
|
|
55
|
+
*
|
|
56
|
+
* Exported because *both* backends address it: WebGL2 looks it up in its uniform table and
|
|
57
|
+
* WebGPU looks it up in the generated binding table. One name, so the two cannot bind different
|
|
58
|
+
* things.
|
|
59
|
+
*
|
|
60
|
+
* **It was twelve names, one per cubemap sampler**, because GLSL ES cannot index a sampler
|
|
61
|
+
* array with a non-constant expression and the shader therefore declared each map separately.
|
|
62
|
+
* One array texture with a layer per light needs one.
|
|
63
|
+
*/
|
|
64
|
+
export const POINT_SHADOW_SAMPLER = 'uPointShadows';
|
|
65
|
+
|
|
66
|
+
export class PointShadowSystem<M extends PointShadowSource> {
|
|
67
|
+
/** The pool. Indexed by pool slot, never by world light. */
|
|
68
|
+
private readonly maps: M[] = [];
|
|
69
|
+
private readonly live: LivePointShadowSet<M>;
|
|
70
|
+
private staticLightCount = 0;
|
|
71
|
+
|
|
72
|
+
/** Which world light currently holds each pool slot, or -1 while free. */
|
|
73
|
+
private readonly slotOwner = new Int32Array(POINT_SHADOW_POOL).fill(-1);
|
|
74
|
+
/** The lights held ready but not shaded, so joining the sampled set costs no bake. */
|
|
75
|
+
private readonly warm = new Int32Array(POINT_SHADOW_POOL);
|
|
76
|
+
private warmCount = 0;
|
|
77
|
+
|
|
78
|
+
/** Frame stamp of the last time each slot was wanted, for the eviction choice. */
|
|
79
|
+
private readonly slotUsed = new Float64Array(POINT_SHADOW_POOL);
|
|
80
|
+
/** Reverse of `slotOwner`: pool slot per world light, or -1 while unassigned. */
|
|
81
|
+
private lightSlot = new Int32Array(0);
|
|
82
|
+
private useStamp = 0;
|
|
83
|
+
|
|
84
|
+
private readonly chosen = new Int32Array(MAX_POINT_LIGHTS);
|
|
85
|
+
/** Shader light slot each chosen world map belongs to. */
|
|
86
|
+
private readonly slots = new Int32Array(MAX_POINT_LIGHTS);
|
|
87
|
+
private chosenCount = 0;
|
|
88
|
+
|
|
89
|
+
/** Batched array uniforms; WebGL exposes each array at its `[0]` location. */
|
|
90
|
+
private readonly far = new Float32Array(MAX_POINT_LIGHTS);
|
|
91
|
+
private readonly near = new Float32Array(MAX_POINT_LIGHTS);
|
|
92
|
+
private readonly sourceRadius = new Float32Array(MAX_POINT_LIGHTS);
|
|
93
|
+
/** How present each bound map is, so a re-baked one arrives rather than appears. */
|
|
94
|
+
private readonly presence = new Float32Array(MAX_POINT_LIGHTS);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* `createMap` rather than a context and a size, so the pool never names a device.
|
|
98
|
+
*
|
|
99
|
+
* The whole of this class is pooling, staleness and selection — decisions a second backend
|
|
100
|
+
* must make identically or its shadows change hands at different moments. Taking a factory is
|
|
101
|
+
* what lets both share it; see `PointShadowSource`.
|
|
102
|
+
*/
|
|
103
|
+
constructor(
|
|
104
|
+
private readonly createMap: (layer: number) => M,
|
|
105
|
+
private readonly releaseMap: (map: M) => void,
|
|
106
|
+
) {
|
|
107
|
+
this.live = new LivePointShadowSet(createMap, releaseMap);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Size the pool and forget every assignment. Called once the light count is known.
|
|
112
|
+
*
|
|
113
|
+
* The pool is capped at `POINT_SHADOW_POOL` however many lights the caller has,
|
|
114
|
+
* and at the light count when that is smaller — a world with three lamps has no
|
|
115
|
+
* use for twelve cubemaps.
|
|
116
|
+
*/
|
|
117
|
+
prepareStaticMaps(lightCount: number): void {
|
|
118
|
+
const wanted = Math.min(lightCount, POINT_SHADOW_POOL);
|
|
119
|
+
while (this.maps.length < wanted) {
|
|
120
|
+
/* Pool slot i takes layer LIVE + i; the live maps hold 0 and 1. See PointShadowArray. */
|
|
121
|
+
this.maps.push(this.createMap(LIVE_POINT_SHADOW_MAPS + this.maps.length));
|
|
122
|
+
}
|
|
123
|
+
if (this.lightSlot.length < lightCount) this.lightSlot = new Int32Array(lightCount);
|
|
124
|
+
this.lightSlot.fill(-1);
|
|
125
|
+
this.slotOwner.fill(-1);
|
|
126
|
+
this.slotUsed.fill(0);
|
|
127
|
+
this.staticLightCount = lightCount;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The map a light is currently borrowing, if any.
|
|
132
|
+
*
|
|
133
|
+
* A pure lookup: assignment happens once a frame in `sync`, because handing out
|
|
134
|
+
* slots from here would let a caller iterating lights evict the map it is about
|
|
135
|
+
* to read.
|
|
136
|
+
*/
|
|
137
|
+
mapForLight(lightIndex: number): M | undefined {
|
|
138
|
+
if (lightIndex < 0 || lightIndex >= this.staticLightCount) return undefined;
|
|
139
|
+
const slot = this.lightSlot[lightIndex] ?? -1;
|
|
140
|
+
return slot < 0 ? undefined : this.maps[slot];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Adopt the shading pass's world-light list, including its exact order. */
|
|
144
|
+
sync(
|
|
145
|
+
activeWorldIndices: Int32Array,
|
|
146
|
+
activeCount: number,
|
|
147
|
+
warmWorldIndices?: Int32Array,
|
|
148
|
+
warmCount = 0,
|
|
149
|
+
): void {
|
|
150
|
+
this.chosenCount = 0;
|
|
151
|
+
const limit = Math.min(activeCount, MAX_POINT_LIGHTS);
|
|
152
|
+
for (let shaderSlot = 0; shaderSlot < limit; shaderSlot++) {
|
|
153
|
+
const worldIndex = activeWorldIndices[shaderSlot] ?? -1;
|
|
154
|
+
if (worldIndex < 0 || worldIndex >= this.staticLightCount) continue;
|
|
155
|
+
this.chosen[this.chosenCount] = worldIndex;
|
|
156
|
+
this.slots[this.chosenCount] = shaderSlot;
|
|
157
|
+
this.chosenCount++;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* The lights about to be wanted, given slots and baked before they are.
|
|
162
|
+
*
|
|
163
|
+
* Every light owned a permanent map before the pool, so joining the sampled set
|
|
164
|
+
* meant its shadow was already correct. Borrowing broke that: joining meant
|
|
165
|
+
* evicting somebody and baking six faces at two a frame, which is the on/off as a
|
|
166
|
+
* lamp comes into range. The pool has always carried four slots more than the
|
|
167
|
+
* shader can bind, and until now they only absorbed churn — these are the lights
|
|
168
|
+
* they were for.
|
|
169
|
+
*
|
|
170
|
+
* Warm lights hold a slot and take bake budget. They are never bound: `sampledCount`
|
|
171
|
+
* still counts only what the shader reads.
|
|
172
|
+
*/
|
|
173
|
+
this.warmCount = 0;
|
|
174
|
+
if (warmWorldIndices !== undefined) {
|
|
175
|
+
const warmLimit = Math.min(warmCount, this.maps.length);
|
|
176
|
+
for (let i = 0; i < warmLimit; i++) {
|
|
177
|
+
const worldIndex = warmWorldIndices[i] ?? -1;
|
|
178
|
+
if (worldIndex < 0 || worldIndex >= this.staticLightCount) continue;
|
|
179
|
+
/*
|
|
180
|
+
* Already being shaded, so it is not warming for anything: it holds its slot
|
|
181
|
+
* from the loop above and it is baked across `pooledCount` either way.
|
|
182
|
+
*
|
|
183
|
+
* Without this the two lists overlap almost entirely — the shadow list is the
|
|
184
|
+
* lights inside their own radius, and a light that close is nearly always in
|
|
185
|
+
* the shaded set already — so `pooledCount` counted the same lights twice, and
|
|
186
|
+
* `bakeStale` being pool-length meant the genuinely extra ones fell off the
|
|
187
|
+
* end. The spare slots the pool carries for exactly this never held anything.
|
|
188
|
+
*/
|
|
189
|
+
let shaded = false;
|
|
190
|
+
for (let k = 0; k < this.chosenCount; k++) {
|
|
191
|
+
if (this.chosen[k] === worldIndex) {
|
|
192
|
+
shaded = true;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (shaded) continue;
|
|
197
|
+
this.warm[this.warmCount] = worldIndex;
|
|
198
|
+
this.warmCount++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
this.assignSlots();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Give every chosen light a pool slot, evicting the least recently wanted.
|
|
207
|
+
*
|
|
208
|
+
* One stamp for the whole call, so every light chosen this frame is equally
|
|
209
|
+
* recent and `claimSlot` can refuse to evict any of them.
|
|
210
|
+
*/
|
|
211
|
+
private assignSlots(): void {
|
|
212
|
+
this.useStamp++;
|
|
213
|
+
// Sampled first, so a warm light can never take a slot from one being shaded.
|
|
214
|
+
for (let k = 0; k < this.chosenCount; k++) this.give(this.chosen[k] ?? -1);
|
|
215
|
+
for (let k = 0; k < this.warmCount; k++) this.give(this.warm[k] ?? -1);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
private give(light: number): void {
|
|
219
|
+
if (light < 0) return;
|
|
220
|
+
const existing = this.lightSlot[light] ?? -1;
|
|
221
|
+
const slot = existing >= 0 ? existing : this.claimSlot(light);
|
|
222
|
+
if (slot >= 0) this.slotUsed[slot] = this.useStamp;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Take a free slot, or the one wanted longest ago.
|
|
227
|
+
*
|
|
228
|
+
* Slots already stamped with this frame belong to lights the shader is about to
|
|
229
|
+
* read, so they are never candidates. The pool has more slots than
|
|
230
|
+
* `MAX_POINT_LIGHTS`, so a candidate always exists.
|
|
231
|
+
*/
|
|
232
|
+
private claimSlot(light: number): number {
|
|
233
|
+
let best = -1;
|
|
234
|
+
let bestStamp = Infinity;
|
|
235
|
+
for (let slot = 0; slot < this.maps.length; slot++) {
|
|
236
|
+
if ((this.slotUsed[slot] ?? 0) === this.useStamp) continue;
|
|
237
|
+
if ((this.slotOwner[slot] ?? -1) < 0) {
|
|
238
|
+
best = slot;
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
const stamp = this.slotUsed[slot] ?? 0;
|
|
242
|
+
if (stamp < bestStamp) {
|
|
243
|
+
bestStamp = stamp;
|
|
244
|
+
best = slot;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (best < 0) return -1;
|
|
248
|
+
const previous = this.slotOwner[best] ?? -1;
|
|
249
|
+
if (previous >= 0) {
|
|
250
|
+
this.lightSlot[previous] = -1;
|
|
251
|
+
// The image belongs to the light losing the slot, not to the one taking it.
|
|
252
|
+
// Left in place it is sampled as the new light's shadow until a re-bake lands.
|
|
253
|
+
this.maps[best]?.forget();
|
|
254
|
+
}
|
|
255
|
+
this.slotOwner[best] = light;
|
|
256
|
+
this.lightSlot[light] = best;
|
|
257
|
+
return best;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Ramp every pooled image toward full presence. See `PointShadowMap.advance`. */
|
|
261
|
+
/**
|
|
262
|
+
* Ramp every image toward full presence: the pool's, **and the live pair's**.
|
|
263
|
+
*
|
|
264
|
+
* The second half was missing, and it is the whole of why a moving caster was never shadowed by
|
|
265
|
+
* a point light. `this.maps` is the pool; the live pair belongs to `LivePointShadowSet`, which
|
|
266
|
+
* publishes `crossfade weight * presence` and therefore published zero for ever. Every other
|
|
267
|
+
* part of that path reports itself healthy, which is what made it survive.
|
|
268
|
+
*/
|
|
269
|
+
advance(dt: number): void {
|
|
270
|
+
for (const map of this.maps) map.advance(dt);
|
|
271
|
+
this.live.advance(dt);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
get sampledCount(): number {
|
|
275
|
+
return this.chosenCount;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** How many lights hold a slot this frame: the shaded ones plus the warming ones. */
|
|
279
|
+
get pooledCount(): number {
|
|
280
|
+
return this.chosenCount + this.warmCount;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* A light holding a slot, shaded ones first.
|
|
285
|
+
*
|
|
286
|
+
* The renderer bakes across this rather than across `sampledCount`, which is the
|
|
287
|
+
* whole point: a warm light's map is baked *before* it is bound, so being chosen
|
|
288
|
+
* for shading never costs six face passes.
|
|
289
|
+
*/
|
|
290
|
+
pooledLight(index: number): number {
|
|
291
|
+
if (index < this.chosenCount) return this.chosen[index] ?? -1;
|
|
292
|
+
return this.warm[index - this.chosenCount] ?? -1;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
sampledLight(slot: number): number {
|
|
296
|
+
return slot >= 0 && slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Select the live shadow around a moving caster and advance any ownership
|
|
301
|
+
* crossfade. The position is caller-provided and has no gameplay meaning to
|
|
302
|
+
* the engine.
|
|
303
|
+
*/
|
|
304
|
+
updateLiveSelection(
|
|
305
|
+
lights: readonly ShadowLight[],
|
|
306
|
+
x: number,
|
|
307
|
+
y: number,
|
|
308
|
+
z: number,
|
|
309
|
+
frameDt: number,
|
|
310
|
+
): void {
|
|
311
|
+
this.live.update(lights, this.chosen, this.chosenCount, x, y, z, frameDt);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
get liveMapCount(): number {
|
|
315
|
+
return LIVE_POINT_SHADOW_MAPS;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
liveOwner(slot: number): number {
|
|
319
|
+
return this.live.owner(slot, this.chosen, this.chosenCount);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
liveMap(slot: number): M | undefined {
|
|
323
|
+
return this.live.map(slot);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Bind every selected map and upload its metadata as whole arrays.
|
|
328
|
+
*
|
|
329
|
+
* WebGL reports an active uniform array only as `name[0]`. Looking up
|
|
330
|
+
* `name[1]` in the cached uniform table therefore returns nothing; uploading
|
|
331
|
+
* each element that way left slots 1–7 at zero and made their shadows vanish.
|
|
332
|
+
*/
|
|
333
|
+
/**
|
|
334
|
+
* Settle every shader slot's map choice and parameters into the caller's arrays.
|
|
335
|
+
*
|
|
336
|
+
* **The arrays are the decision and the cubemaps are the binding.** Which light samples which
|
|
337
|
+
* slot, whether its image has landed and how present it is are answers this pool computes;
|
|
338
|
+
* turning them into `uniform1fv` or into bytes of a uniform block is all that differs between
|
|
339
|
+
* backends. A caller walks `mapForShaderSlot` for the textures.
|
|
340
|
+
*/
|
|
341
|
+
resolve(out: ResolvedPointShadows): void {
|
|
342
|
+
out.layers.fill(-1);
|
|
343
|
+
out.far.fill(1);
|
|
344
|
+
out.near.fill(0.01);
|
|
345
|
+
out.sourceRadius.fill(0);
|
|
346
|
+
out.presence.fill(0);
|
|
347
|
+
|
|
348
|
+
for (let k = 0; k < MAX_POINT_LIGHTS; k++) {
|
|
349
|
+
const map = this.mapForShaderSlot(k);
|
|
350
|
+
/*
|
|
351
|
+
* A map with no image yet contributes nothing, exactly as an unassigned one does.
|
|
352
|
+
*
|
|
353
|
+
* Bakes are spread over frames rather than all done the moment they are noticed (see
|
|
354
|
+
* `pointShadowBudget.ts`), so a light can be selected a frame or two before its cubemap
|
|
355
|
+
* exists. Sampling it then would read whatever the pool slot held previously — another
|
|
356
|
+
* lamp's shadow, from somewhere else entirely — which is far worse than the light simply
|
|
357
|
+
* not casting for two frames. The index stays −1, which is the path the shader already
|
|
358
|
+
* takes for a light with no map at all.
|
|
359
|
+
*/
|
|
360
|
+
if (map === undefined || !map.hasBaked) continue;
|
|
361
|
+
/*
|
|
362
|
+
* `slots[k]` is the shading pass's own index for this light, which is the `i` the shader
|
|
363
|
+
* loops over — so it is the index everything about this map is written under. The chosen
|
|
364
|
+
* order and the shading order are not the same order, and writing under `k` here would
|
|
365
|
+
* hand light 2 the parameters of light 0 in any scene where they differ.
|
|
366
|
+
*/
|
|
367
|
+
const light = this.slots[k] ?? -1;
|
|
368
|
+
if (light < 0 || light >= out.layers.length) continue;
|
|
369
|
+
out.far[light] = map.far;
|
|
370
|
+
out.near[light] = map.near;
|
|
371
|
+
out.sourceRadius[light] = map.sourceRadius;
|
|
372
|
+
out.presence[light] = map.presence;
|
|
373
|
+
out.layers[light] = map.layer;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
this.live.resolve(this.chosen, this.slots, this.chosenCount, out);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* The map a shader slot samples, or undefined.
|
|
381
|
+
*
|
|
382
|
+
* Separate from `resolve` because a backend needs it for the *texture* while the arrays are
|
|
383
|
+
* already settled, and because a slot with no map still has to be filled with something —
|
|
384
|
+
* see `emptyTexture.ts` on one side and the one-texel cube on the other.
|
|
385
|
+
*/
|
|
386
|
+
mapForShaderSlot(slot: number): M | undefined {
|
|
387
|
+
const lightIndex = slot < this.chosenCount ? (this.chosen[slot] ?? -1) : -1;
|
|
388
|
+
return this.mapForLight(lightIndex);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Throw away every baked image, keeping the maps and their layers.
|
|
393
|
+
*
|
|
394
|
+
* For a backend that had to rebuild the storage under them — the array is immutable once
|
|
395
|
+
* allocated, so growing it for a bigger world replaces the pixels with nothing. A map that
|
|
396
|
+
* still reported `hasBaked` afterwards would be sampled, and what it would read is whatever
|
|
397
|
+
* the new allocation happens to contain.
|
|
398
|
+
*/
|
|
399
|
+
forgetEveryImage(): void {
|
|
400
|
+
for (const map of this.maps) map.forget();
|
|
401
|
+
this.live.forgetEveryImage();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
dispose(): void {
|
|
405
|
+
for (const map of this.maps) this.releaseMap(map);
|
|
406
|
+
this.live.dispose();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
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
|
+
/**
|
|
25
|
+
* Samples per texel, per quality tier.
|
|
26
|
+
*
|
|
27
|
+
* **Powers of two, because the Hammersley sequence's radical inverse is a bit reversal.** A count
|
|
28
|
+
* that is not a power of two leaves the sequence unevenly stratified, which does not error — it
|
|
29
|
+
* shows as a faint directional bias in the rough levels that reads as the environment being
|
|
30
|
+
* slightly wrong rather than as a sampling fault.
|
|
31
|
+
*
|
|
32
|
+
* 32 is where a rough level stops showing individual bright sources as separate blobs on the
|
|
33
|
+
* scenes in this repository; 128 is where doubling it again stopped being visible. **What would
|
|
34
|
+
* make these wrong** is a much brighter environment than any tested here — a small sun in an
|
|
35
|
+
* otherwise dark sky is the worst case for variance, and it wants the high tier or a source level
|
|
36
|
+
* chosen more conservatively than `sourceLevelForSample` does.
|
|
37
|
+
*/
|
|
38
|
+
export const PREFILTER_SAMPLE_COUNTS = {
|
|
39
|
+
low: 16,
|
|
40
|
+
medium: 32,
|
|
41
|
+
high: 128,
|
|
42
|
+
} as const satisfies Readonly<Record<string, number>>;
|
|
43
|
+
|
|
44
|
+
/** The tier names, so a quality option can take one without restating them. */
|
|
45
|
+
export type PrefilterQuality = keyof typeof PREFILTER_SAMPLE_COUNTS;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The octahedral edge a probe of a given cube face size gets.
|
|
49
|
+
*
|
|
50
|
+
* **Twice the face, which is the ratio `OCTAHEDRAL_EDGE` already chose** for the point-shadow
|
|
51
|
+
* array and for the reason written down there: matching a cube face's angular density needs
|
|
52
|
+
* `face * sqrt(6)`, so twice the face is about **1.22x coarser in the worst direction**, taken
|
|
53
|
+
* because the filtering this unlocks is blurring the result anyway. 1024 for a 512 face there,
|
|
54
|
+
* 256 for the default 128 face here — one rule, so the two octahedral resources in this engine
|
|
55
|
+
* are calibrated against each other rather than each to taste.
|
|
56
|
+
*/
|
|
57
|
+
export function octahedralEdgeFor(faceSize: number): number {
|
|
58
|
+
return Math.max(32, Math.trunc(faceSize) * 2);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The irradiance image's edge, and why the diffuse term is a level of the same chain.
|
|
63
|
+
*
|
|
64
|
+
* **Eight, which is what a probe's diffuse light actually needs.** A cosine convolution removes
|
|
65
|
+
* everything above the second band, so the image it produces has no detail an eighth of a sphere
|
|
66
|
+
* across to lose — the size irradiance probes are conventionally stored at, arrived at from the
|
|
67
|
+
* same place. It replaces nine spherical-harmonic coefficients, and 64 octahedral texels carry at
|
|
68
|
+
* least what nine coefficients did.
|
|
69
|
+
*
|
|
70
|
+
* **What this buys is the last texture unit.** A second array would be a second sampler, and
|
|
71
|
+
* WebGL2 guarantees sixteen units of which fifteen are spent. Folding the diffuse term into a
|
|
72
|
+
* level of the radiance chain is what `REFRACT_SCENE_TEXTURE_UNIT`'s comment asks the next
|
|
73
|
+
* sampler to do, and it leaves unit 15 free.
|
|
74
|
+
*/
|
|
75
|
+
export const IRRADIANCE_EDGE = 8;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Which level of a chain holds the cosine convolution.
|
|
79
|
+
*
|
|
80
|
+
* The level whose image is `IRRADIANCE_EDGE` across. For the default 256 edge that is level 5, and
|
|
81
|
+
* **the chain stops there rather than carrying unread levels above it** — `texStorage3D` takes a
|
|
82
|
+
* level count, so the three that would hold sixteen, four and one texel are never created. Six
|
|
83
|
+
* levels, 87,360 texels, 683 KB a layer at half float.
|
|
84
|
+
*/
|
|
85
|
+
export function irradianceLevelFor(edge: number): number {
|
|
86
|
+
return Math.max(1, Math.round(Math.log2(Math.max(IRRADIANCE_EDGE * 2, edge) / IRRADIANCE_EDGE)));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The coarsest level the GGX chain reaches, which is one below the irradiance level.
|
|
91
|
+
*
|
|
92
|
+
* This is `uEnvironmentMaxLod`, and it is what `roughnessForLevel` maps roughness 1 onto. For the
|
|
93
|
+
* default edge it is 4, so the roughest level is 16 texels across.
|
|
94
|
+
*
|
|
95
|
+
* **That is better at high roughness than the cube it replaces, not worse.** A 128 cube's chain
|
|
96
|
+
* ends at one texel a face, which the lit pass's own comment complains about — "one texel a face
|
|
97
|
+
* and therefore one colour for every direction". What is given up is roughness granularity, five
|
|
98
|
+
* stops against eight, and the level blend interpolates between them exactly as the cube's mip
|
|
99
|
+
* filter did.
|
|
100
|
+
*/
|
|
101
|
+
export function ggxMaxLevelFor(edge: number): number {
|
|
102
|
+
return Math.max(1, irradianceLevelFor(edge) - 1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The roughness mip level `level` is convolved for.
|
|
107
|
+
*
|
|
108
|
+
* **Linear in the level index, and it has to be**, because the lit pass already picks its level
|
|
109
|
+
* with `surfaceRoughness * uEnvironmentMaxLod`. This is that relation read backwards. A different
|
|
110
|
+
* curve here would not be an improvement in isolation — it would be the two halves disagreeing
|
|
111
|
+
* about what level three means, which reads as roughness being subtly miscalibrated everywhere and
|
|
112
|
+
* points at nothing.
|
|
113
|
+
*
|
|
114
|
+
* **What would make it wrong** is the lit pass changing how it selects a level; the two move
|
|
115
|
+
* together or neither moves.
|
|
116
|
+
*/
|
|
117
|
+
export function roughnessForLevel(level: number, maxLevel: number): number {
|
|
118
|
+
/*
|
|
119
|
+
* A single-level chain has nowhere to go, and dividing by its zero top level is NaN — a
|
|
120
|
+
* roughness the convolution would carry into every sample, producing a picture nobody could
|
|
121
|
+
* attribute to a divide. A mirror is what one level honestly is.
|
|
122
|
+
*/
|
|
123
|
+
if (maxLevel <= 0) return 0;
|
|
124
|
+
return Math.min(1, Math.max(0, level / maxLevel));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Which level of the source cube one importance sample may read.
|
|
129
|
+
*
|
|
130
|
+
* **Filtered importance sampling, and the whole point of it is variance rather than speed.** A
|
|
131
|
+
* sample drawn from the GGX distribution covers a solid angle of `1 / (count * pdf)`; one texel of
|
|
132
|
+
* a cube with `faceTexels`-wide faces covers `4*pi / (6 * faceTexels^2)`. When a sample is much
|
|
133
|
+
* wider than a texel, reading the base level lets a few very bright texels land in some samples and
|
|
134
|
+
* not others, and that variance survives the average as fireflies. Reading a level where the sample
|
|
135
|
+
* covers roughly one texel is what removes them without raising the count.
|
|
136
|
+
*
|
|
137
|
+
* The half in front of the logarithm is not a fudge: a level step doubles a texel's width and so
|
|
138
|
+
* quadruples its solid angle, and the level is a length ratio rather than an area one.
|
|
139
|
+
*
|
|
140
|
+
* **What it costs** is that the source has to be a box-filtered chain, which is why the capture
|
|
141
|
+
* keeps its `generateMipmap` and the convolution writes a second cube. **What would make it wrong**
|
|
142
|
+
* is convolving from a source that is itself already convolved: the lobe would be applied twice and
|
|
143
|
+
* the error compounds up the chain, which is precisely the reason the two cubes are separate
|
|
144
|
+
* objects rather than one written in place.
|
|
145
|
+
*/
|
|
146
|
+
export function sourceLevelForSample(
|
|
147
|
+
pdf: number,
|
|
148
|
+
faceTexels: number,
|
|
149
|
+
count: number,
|
|
150
|
+
maxLevel: number,
|
|
151
|
+
): number {
|
|
152
|
+
/* Guard the logarithm's arguments rather than its result; a zero here is a caller's bug. */
|
|
153
|
+
const texels = Math.max(1, faceTexels);
|
|
154
|
+
const samples = Math.max(1, count);
|
|
155
|
+
const density = Math.max(1e-12, pdf);
|
|
156
|
+
|
|
157
|
+
const texelSolidAngle = (4 * Math.PI) / (6 * texels * texels);
|
|
158
|
+
const sampleSolidAngle = 1 / (samples * density);
|
|
159
|
+
const level = 0.5 * Math.log2(sampleSolidAngle / texelSolidAngle);
|
|
160
|
+
|
|
161
|
+
return Math.min(maxLevel, Math.max(0, level));
|
|
162
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/** WebGL2's half of the environment prefilter: the program, and the draw for one level of a layer. */
|
|
2
|
+
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
4
|
+
import { PREFILTER_FRAG } from './shaders/prefilter.ts';
|
|
5
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.ts';
|
|
6
|
+
import type { EnvProbeArray } from './envProbeArray.ts';
|
|
7
|
+
import type { ReflectionProbe } from './reflectionProbe.ts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Convolves a captured probe's box chain into one layer of the grid's array, once per bake.
|
|
11
|
+
*
|
|
12
|
+
* **Its own module rather than more of the renderer**, following `ambientOcclusionPass.ts` and
|
|
13
|
+
* `bloomPass.ts`: a program, its uniforms, a vertex array and one draw. The renderer owns when
|
|
14
|
+
* this happens; this owns what it is.
|
|
15
|
+
*
|
|
16
|
+
* **What it costs** is one program compile at construction and **one draw per level per bake**,
|
|
17
|
+
* where the cube it replaced needed six — an octahedral map has no faces, so the six-way loop is
|
|
18
|
+
* gone rather than moved. A bake is once per scene per probe, which is the whole reason a
|
|
19
|
+
* convolution is affordable where a per-frame version of it would not be. **What would make it
|
|
20
|
+
* wrong** is a caller baking every frame; at that point this is the frame's cost and the box chain
|
|
21
|
+
* it replaced was the right trade.
|
|
22
|
+
*
|
|
23
|
+
* **A grid multiplies a bake by its probe count**, which is the real budget question rather than
|
|
24
|
+
* the texture units. The caller drives one probe at a time for exactly that reason.
|
|
25
|
+
*/
|
|
26
|
+
export class EnvironmentPrefilterPass {
|
|
27
|
+
private readonly program: WebGLProgram;
|
|
28
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
29
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
30
|
+
|
|
31
|
+
constructor(gl: WebGL2RenderingContext) {
|
|
32
|
+
this.program = compileProgram(gl, FULLSCREEN_VERT, PREFILTER_FRAG, 'envPrefilter');
|
|
33
|
+
this.uniforms = uniformLocations(gl, this.program, 'envPrefilter');
|
|
34
|
+
|
|
35
|
+
const vao = gl.createVertexArray();
|
|
36
|
+
if (vao === null) throw new Error('EnvironmentPrefilterPass: createVertexArray failed');
|
|
37
|
+
this.vao = vao;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Fill every level of the probe's prefiltered cube from its captured one.
|
|
42
|
+
*
|
|
43
|
+
* The source is bound on the unit the environment normally occupies, which is deliberate rather
|
|
44
|
+
* than convenient: that unit is rebound by the lit pass every frame, so borrowing it here cannot
|
|
45
|
+
* outlive the bake, and it keeps the pass out of the unit accounting `textureUnitBudget.test.ts`
|
|
46
|
+
* holds.
|
|
47
|
+
*/
|
|
48
|
+
run(
|
|
49
|
+
gl: WebGL2RenderingContext,
|
|
50
|
+
source: ReflectionProbe,
|
|
51
|
+
array: EnvProbeArray,
|
|
52
|
+
layer: number,
|
|
53
|
+
sourceUnit: number,
|
|
54
|
+
samples: number,
|
|
55
|
+
/**
|
|
56
|
+
* Whether the reflection chain is the GGX convolution rather than a box filter.
|
|
57
|
+
*
|
|
58
|
+
* `RenderQuality.environmentPrefilter`, and it is consulted here rather than at bind time
|
|
59
|
+
* because there is one chain now instead of two textures. A profile that has not asked for the
|
|
60
|
+
* lobe chain bakes the box one into the same layers and gets the picture it already had.
|
|
61
|
+
*/
|
|
62
|
+
prefiltered: boolean,
|
|
63
|
+
): void {
|
|
64
|
+
const previousProgram = gl.getParameter(gl.CURRENT_PROGRAM) as WebGLProgram | null;
|
|
65
|
+
|
|
66
|
+
gl.useProgram(this.program);
|
|
67
|
+
gl.bindVertexArray(this.vao);
|
|
68
|
+
/*
|
|
69
|
+
* A convolution writes over a target it has no depth relationship with, so both the test and
|
|
70
|
+
* the write are off — and culling with it, because the fullscreen triangle's winding is
|
|
71
|
+
* whatever the vertex shader's corner arithmetic produced rather than something anybody chose.
|
|
72
|
+
*/
|
|
73
|
+
gl.disable(gl.DEPTH_TEST);
|
|
74
|
+
gl.depthMask(false);
|
|
75
|
+
gl.disable(gl.CULL_FACE);
|
|
76
|
+
gl.disable(gl.BLEND);
|
|
77
|
+
|
|
78
|
+
gl.activeTexture(gl.TEXTURE0 + sourceUnit);
|
|
79
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, source.texture);
|
|
80
|
+
gl.uniform1i(this.uniforms['uPrefilterSource'] ?? null, sourceUnit);
|
|
81
|
+
gl.uniform1f(this.uniforms['uPrefilterSamples'] ?? null, samples);
|
|
82
|
+
gl.uniform1f(this.uniforms['uPrefilterSourceTexels'] ?? null, source.size);
|
|
83
|
+
gl.uniform1f(this.uniforms['uPrefilterSourceMaxLod'] ?? null, source.maxLod);
|
|
84
|
+
|
|
85
|
+
array.convolve(gl, layer, (level, roughness, kind) => {
|
|
86
|
+
/*
|
|
87
|
+
* **The level's own edge, not the array's.** A gutter is one texel at every level, so its
|
|
88
|
+
* share of the map doubles as the chain coarsens; insetting a coarse level by the base
|
|
89
|
+
* edge's fraction reads as the reflection sliding as roughness rises.
|
|
90
|
+
*/
|
|
91
|
+
gl.uniform1f(this.uniforms['uPrefilterEdge'] ?? null, Math.max(1, array.edge >> level));
|
|
92
|
+
gl.uniform1f(this.uniforms['uPrefilterIrradiance'] ?? null, kind === 'irradiance' ? 1 : 0);
|
|
93
|
+
gl.uniform1f(this.uniforms['uPrefilterBox'] ?? null, prefiltered ? 0 : 1);
|
|
94
|
+
gl.uniform1f(this.uniforms['uPrefilterLevel'] ?? null, level);
|
|
95
|
+
gl.uniform1f(this.uniforms['uPrefilterRoughness'] ?? null, roughness);
|
|
96
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
gl.bindVertexArray(null);
|
|
100
|
+
gl.depthMask(true);
|
|
101
|
+
gl.enable(gl.DEPTH_TEST);
|
|
102
|
+
gl.enable(gl.CULL_FACE);
|
|
103
|
+
/*
|
|
104
|
+
* Put the caller's program back rather than leaving ours current. The bake around this reads
|
|
105
|
+
* and restores flat-shader uniforms on either side of itself, and it would be doing that to
|
|
106
|
+
* whichever program happened to be bound.
|
|
107
|
+
*/
|
|
108
|
+
if (previousProgram !== null) gl.useProgram(previousProgram);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
112
|
+
gl.deleteProgram(this.program);
|
|
113
|
+
gl.deleteVertexArray(this.vao);
|
|
114
|
+
}
|
|
115
|
+
}
|