@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,179 @@
|
|
|
1
|
+
import { AO_BLUR_FRAG, AO_FRAG } from './shaders/ambientOcclusion.js';
|
|
2
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
4
|
+
/**
|
|
5
|
+
* The screen-space ambient occlusion pass: estimate from depth, then blur.
|
|
6
|
+
*
|
|
7
|
+
* Its own module rather than more of `SceneTarget`, because it is its own responsibility —
|
|
8
|
+
* that class owns where the frame lands and how it reaches the canvas, and this owns one
|
|
9
|
+
* effect's targets and programs. The composite pass consumes the texture this returns and
|
|
10
|
+
* knows nothing else about it.
|
|
11
|
+
*
|
|
12
|
+
* **Two single-channel targets, ping-ponged.** The estimate lands in one, the horizontal
|
|
13
|
+
* blur writes the other, the vertical blur writes back into the first, and that one is
|
|
14
|
+
* returned. `R8` rather than `RGBA8`: occlusion is one number, and three channels of padding
|
|
15
|
+
* over a 4K frame is 24 MB of bandwidth per pass to carry nothing.
|
|
16
|
+
*/
|
|
17
|
+
export class AmbientOcclusionPass {
|
|
18
|
+
gl;
|
|
19
|
+
width = 0;
|
|
20
|
+
height = 0;
|
|
21
|
+
estimate = null;
|
|
22
|
+
scratch = null;
|
|
23
|
+
estimateFramebuffer = null;
|
|
24
|
+
scratchFramebuffer = null;
|
|
25
|
+
/**
|
|
26
|
+
* Set once if a single-channel target will not complete, after which this pass does
|
|
27
|
+
* nothing and says so once.
|
|
28
|
+
*
|
|
29
|
+
* `R8` is colour-renderable in WebGL2 by specification, so this is not expected. It is here
|
|
30
|
+
* because the alternative to an honest "off" is a frame multiplied by a texture that was
|
|
31
|
+
* never written, and the last time an effect in this renderer sampled a target nobody had
|
|
32
|
+
* filled, the failure presented as the driver being at fault. See `sceneTarget.ts`.
|
|
33
|
+
*/
|
|
34
|
+
unavailable = false;
|
|
35
|
+
estimateProgram;
|
|
36
|
+
estimateUniforms;
|
|
37
|
+
blurProgram;
|
|
38
|
+
blurUniforms;
|
|
39
|
+
vao;
|
|
40
|
+
/** Scratch for the blur direction, so a per-frame pass allocates nothing. */
|
|
41
|
+
step = new Float32Array(2);
|
|
42
|
+
/** Scratch for the four inverse-projection terms the blur linearises depth with. */
|
|
43
|
+
depthToViewZ = new Float32Array(4);
|
|
44
|
+
constructor(gl) {
|
|
45
|
+
this.gl = gl;
|
|
46
|
+
this.estimateProgram = compileProgram(gl, FULLSCREEN_VERT, AO_FRAG, 'ao');
|
|
47
|
+
this.estimateUniforms = uniformLocations(gl, this.estimateProgram, 'ao');
|
|
48
|
+
this.blurProgram = compileProgram(gl, FULLSCREEN_VERT, AO_BLUR_FRAG, 'aoBlur');
|
|
49
|
+
this.blurUniforms = uniformLocations(gl, this.blurProgram, 'aoBlur');
|
|
50
|
+
const vao = gl.createVertexArray();
|
|
51
|
+
if (vao === null)
|
|
52
|
+
throw new Error('AmbientOcclusionPass: createVertexArray failed');
|
|
53
|
+
this.vao = vao;
|
|
54
|
+
}
|
|
55
|
+
ensureSize(width, height) {
|
|
56
|
+
if (this.unavailable)
|
|
57
|
+
return false;
|
|
58
|
+
if (this.width === width && this.height === height && this.estimate !== null)
|
|
59
|
+
return true;
|
|
60
|
+
const { gl } = this;
|
|
61
|
+
this.width = width;
|
|
62
|
+
this.height = height;
|
|
63
|
+
this.estimate = this.allocate(this.estimate, width, height);
|
|
64
|
+
this.scratch = this.allocate(this.scratch, width, height);
|
|
65
|
+
if (this.estimateFramebuffer === null)
|
|
66
|
+
this.estimateFramebuffer = gl.createFramebuffer();
|
|
67
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.estimateFramebuffer);
|
|
68
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.estimate, 0);
|
|
69
|
+
const estimateReady = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;
|
|
70
|
+
if (this.scratchFramebuffer === null)
|
|
71
|
+
this.scratchFramebuffer = gl.createFramebuffer();
|
|
72
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
|
|
73
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.scratch, 0);
|
|
74
|
+
const scratchReady = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;
|
|
75
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
76
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
77
|
+
if (!estimateReady || !scratchReady) {
|
|
78
|
+
this.unavailable = true;
|
|
79
|
+
console.warn('AmbientOcclusionPass: this driver will not render to a single-channel target, so ' +
|
|
80
|
+
'ambient occlusion is off. The frame itself is unaffected.');
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
allocate(existing, width, height) {
|
|
86
|
+
const { gl } = this;
|
|
87
|
+
const texture = existing ?? gl.createTexture();
|
|
88
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
89
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, null);
|
|
90
|
+
/* NEAREST, because every read of this is at a texel centre: the blur steps whole pixels
|
|
91
|
+
and the composite reads the pixel it is shading. Linear would only cost filtering. */
|
|
92
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
93
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
94
|
+
/* Clamped, so a tap past the edge repeats the edge rather than wrapping the opposite
|
|
95
|
+
side of the frame into a corner. */
|
|
96
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
97
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
98
|
+
return texture;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Estimate occlusion from the frame's depth and blur it. Returns the texture to multiply
|
|
102
|
+
* by, or null if this pass could not run, which the caller must read as "no occlusion"
|
|
103
|
+
* rather than as black.
|
|
104
|
+
*
|
|
105
|
+
* `invProjection` is column-major, as `gl-matrix` produces it.
|
|
106
|
+
*/
|
|
107
|
+
run(depth, width, height, radius, projScale, invProjection) {
|
|
108
|
+
if (!this.ensureSize(width, height))
|
|
109
|
+
return null;
|
|
110
|
+
const { gl } = this;
|
|
111
|
+
/* One triangle over a target with no depth attachment. Anything inherited from the scene
|
|
112
|
+
pass would be tested against a buffer that is not there. */
|
|
113
|
+
gl.disable(gl.DEPTH_TEST);
|
|
114
|
+
gl.disable(gl.BLEND);
|
|
115
|
+
gl.disable(gl.CULL_FACE);
|
|
116
|
+
gl.depthMask(false);
|
|
117
|
+
gl.bindVertexArray(this.vao);
|
|
118
|
+
gl.viewport(0, 0, width, height);
|
|
119
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.estimateFramebuffer);
|
|
120
|
+
gl.useProgram(this.estimateProgram);
|
|
121
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
122
|
+
gl.bindTexture(gl.TEXTURE_2D, depth);
|
|
123
|
+
gl.uniform1i(this.estimateUniforms['uDepth'] ?? null, 0);
|
|
124
|
+
gl.uniform2fv(this.estimateUniforms['uProjScale'] ?? null, projScale);
|
|
125
|
+
gl.uniform1f(this.estimateUniforms['uRadius'] ?? null, radius);
|
|
126
|
+
gl.uniformMatrix4fv(this.estimateUniforms['uInvProjection'] ?? null, false, invProjection);
|
|
127
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
128
|
+
/*
|
|
129
|
+
* The four terms that carry a depth back to metres, read out of the inverse projection.
|
|
130
|
+
* Column major, so `[2][2]` is element 10 and `[3][3]` is element 15.
|
|
131
|
+
*/
|
|
132
|
+
this.depthToViewZ[0] = invProjection[10] ?? 0;
|
|
133
|
+
this.depthToViewZ[1] = invProjection[14] ?? 0;
|
|
134
|
+
this.depthToViewZ[2] = invProjection[11] ?? 0;
|
|
135
|
+
this.depthToViewZ[3] = invProjection[15] ?? 1;
|
|
136
|
+
gl.useProgram(this.blurProgram);
|
|
137
|
+
gl.uniform1i(this.blurUniforms['uAo'] ?? null, 0);
|
|
138
|
+
gl.uniform1i(this.blurUniforms['uDepth'] ?? null, 1);
|
|
139
|
+
gl.uniform4fv(this.blurUniforms['uDepthToViewZ'] ?? null, this.depthToViewZ);
|
|
140
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
141
|
+
gl.bindTexture(gl.TEXTURE_2D, depth);
|
|
142
|
+
/* Across, into the scratch target. */
|
|
143
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
|
|
144
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
145
|
+
gl.bindTexture(gl.TEXTURE_2D, this.estimate);
|
|
146
|
+
this.step[0] = 1 / width;
|
|
147
|
+
this.step[1] = 0;
|
|
148
|
+
gl.uniform2fv(this.blurUniforms['uStep'] ?? null, this.step);
|
|
149
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
150
|
+
/* And down, back into the estimate, which is the texture handed out. */
|
|
151
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.estimateFramebuffer);
|
|
152
|
+
gl.bindTexture(gl.TEXTURE_2D, this.scratch);
|
|
153
|
+
this.step[0] = 0;
|
|
154
|
+
this.step[1] = 1 / height;
|
|
155
|
+
gl.uniform2fv(this.blurUniforms['uStep'] ?? null, this.step);
|
|
156
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
157
|
+
gl.bindVertexArray(null);
|
|
158
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
159
|
+
return this.estimate;
|
|
160
|
+
}
|
|
161
|
+
dispose() {
|
|
162
|
+
const { gl } = this;
|
|
163
|
+
if (this.estimateFramebuffer !== null)
|
|
164
|
+
gl.deleteFramebuffer(this.estimateFramebuffer);
|
|
165
|
+
if (this.scratchFramebuffer !== null)
|
|
166
|
+
gl.deleteFramebuffer(this.scratchFramebuffer);
|
|
167
|
+
if (this.estimate !== null)
|
|
168
|
+
gl.deleteTexture(this.estimate);
|
|
169
|
+
if (this.scratch !== null)
|
|
170
|
+
gl.deleteTexture(this.scratch);
|
|
171
|
+
gl.deleteProgram(this.estimateProgram);
|
|
172
|
+
gl.deleteProgram(this.blurProgram);
|
|
173
|
+
gl.deleteVertexArray(this.vao);
|
|
174
|
+
this.estimateFramebuffer = null;
|
|
175
|
+
this.scratchFramebuffer = null;
|
|
176
|
+
this.estimate = null;
|
|
177
|
+
this.scratch = null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** Rectangular area lights: what a caller declares, and the arrays a shader wants. */
|
|
2
|
+
/**
|
|
3
|
+
* How many rectangles the lit pass shades against at once.
|
|
4
|
+
*
|
|
5
|
+
* **Four, because a rectangle is a fixture rather than a lamp.** A window, a softbox, a lit panel:
|
|
6
|
+
* a scene with more than a handful of these is a scene that wants them baked into an environment,
|
|
7
|
+
* which is what the prefilter and the loader are for. Raising it is a uniform-array size and an
|
|
8
|
+
* iteration of the loop, exactly as `MAX_POINT_LIGHTS` is.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MAX_AREA_LIGHTS = 4;
|
|
11
|
+
/**
|
|
12
|
+
* One rectangular emitter, as a consumer describes it.
|
|
13
|
+
*
|
|
14
|
+
* Positions, colours and sizes, and nothing that means anything in one game — the rule
|
|
15
|
+
* `AGENTS.md` opens with. `right` and `up` are the rectangle's own in-plane axes, and their cross
|
|
16
|
+
* product is the direction it emits.
|
|
17
|
+
*/
|
|
18
|
+
export interface AreaLightSource {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
z: number;
|
|
22
|
+
r: number;
|
|
23
|
+
g: number;
|
|
24
|
+
b: number;
|
|
25
|
+
/** In-plane axes. Normalised on the way in, because the form factor assumes unit length. */
|
|
26
|
+
rightX: number;
|
|
27
|
+
rightY: number;
|
|
28
|
+
rightZ: number;
|
|
29
|
+
upX: number;
|
|
30
|
+
upY: number;
|
|
31
|
+
upZ: number;
|
|
32
|
+
/** Half extents along `right` and `up`, in metres. */
|
|
33
|
+
halfWidth: number;
|
|
34
|
+
halfHeight: number;
|
|
35
|
+
/**
|
|
36
|
+
* Whether the rectangle emits from both faces. Default false.
|
|
37
|
+
*
|
|
38
|
+
* A window is one-sided and a hanging panel is two-sided, and the difference is visible rather
|
|
39
|
+
* than pedantic: a one-sided light must contribute nothing to a surface behind it, or the wall
|
|
40
|
+
* it is set into is lit by it and reads as glowing.
|
|
41
|
+
*/
|
|
42
|
+
twoSided?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether this rectangle is worth a shadow layer at all. **Default false**, which is the
|
|
45
|
+
* opposite of what a point light's identically named field defaults to.
|
|
46
|
+
*
|
|
47
|
+
* A point light has cast since before there was a budget to ration, so `true` is what its
|
|
48
|
+
* existing callers already rely on. An area light shipped in 3.2.0 with no occlusion at all —
|
|
49
|
+
* `AGENTS.md` calls that a bug rather than a limitation, and it is the row this field closes —
|
|
50
|
+
* so every scene that already declares one was authored against a rectangle that lights
|
|
51
|
+
* through walls. Defaulting to `true` here would hand each of them two octahedral layers,
|
|
52
|
+
* 8.39 MB, and a six-face bake over the static world, for a change in the picture nobody asked
|
|
53
|
+
* for. `RenderQuality`'s own rule is that a feature's default reproduces today's frame.
|
|
54
|
+
*
|
|
55
|
+
* **It also rides `RenderQuality.pointShadows`**, because an area light's occlusion is read out
|
|
56
|
+
* of the same array texture a point light's is. WebGL2 guarantees sixteen texture units and the
|
|
57
|
+
* lit pass binds sixteen, so a seventeenth sampler is not available to declare — see
|
|
58
|
+
* `FlatShaderOptions.environmentProbe` for the same wall reached from the other side. With that
|
|
59
|
+
* flag off there is no array to bake into, and the renderer says so once by name rather than
|
|
60
|
+
* quietly drawing an unoccluded rectangle.
|
|
61
|
+
*/
|
|
62
|
+
castsShadow?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* How far from the rectangle occlusion is tracked, in metres: the shadow map's far plane.
|
|
65
|
+
*
|
|
66
|
+
* **Required when `castsShadow` is true, and deliberately not defaulted.** A point light's map
|
|
67
|
+
* gets its far plane from `radius`, the distance at which the light itself reaches zero — a
|
|
68
|
+
* rectangle has no such distance, because its falloff is the solid angle it subtends and that is
|
|
69
|
+
* never exactly zero. So the number is a statement about how much of the scene this fixture is
|
|
70
|
+
* responsible for occluding, which is a decision about the content: a panel in a corridor wants
|
|
71
|
+
* the corridor's length and a sky panel over a courtyard wants the courtyard's.
|
|
72
|
+
*
|
|
73
|
+
* Guessing it would produce one of two failures, both of which read as a renderer bug rather
|
|
74
|
+
* than a missing field: too short and the shadow stops in a straight line partway across the
|
|
75
|
+
* floor, too long and the depth precision spent on the near metres is what a fixture actually
|
|
76
|
+
* needed. A rectangle that declares it casts and names no range is refused with a warning
|
|
77
|
+
* naming the field.
|
|
78
|
+
*/
|
|
79
|
+
shadowRange?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Where casting begins, in metres from the rectangle's plane. Defaults to `POINT_SHADOW_NEAR`.
|
|
82
|
+
*
|
|
83
|
+
* The same knob a point light carries and for the same reason: a fixture's own housing sits
|
|
84
|
+
* within centimetres of the emitter, occludes an enormous solid angle from it, and throws that
|
|
85
|
+
* across the floor as a hard square much larger than the housing. Keep it small — it clips
|
|
86
|
+
* every caster, not just the fixture.
|
|
87
|
+
*/
|
|
88
|
+
shadowNear?: number;
|
|
89
|
+
}
|
|
90
|
+
/** The five arrays the shader declares, filled once a frame from whatever a caller supplied. */
|
|
91
|
+
export interface AreaLightBuffer {
|
|
92
|
+
count: number;
|
|
93
|
+
readonly positions: Float32Array;
|
|
94
|
+
readonly colors: Float32Array;
|
|
95
|
+
readonly right: Float32Array;
|
|
96
|
+
readonly up: Float32Array;
|
|
97
|
+
readonly sizes: Float32Array;
|
|
98
|
+
readonly twoSided: Float32Array;
|
|
99
|
+
}
|
|
100
|
+
export declare function createAreaLightBuffer(capacity?: number): AreaLightBuffer;
|
|
101
|
+
/**
|
|
102
|
+
* Fill the buffer from a caller's list, normalising the axes and orthogonalising them.
|
|
103
|
+
*
|
|
104
|
+
* **Both corrections are here rather than trusted**, and neither is defensive tidying:
|
|
105
|
+
*
|
|
106
|
+
* - The form factor treats `right` and `up` as unit vectors, so a caller's un-normalised axis
|
|
107
|
+
* scales the rectangle it describes. That is a light of the wrong *size*, which reads as the
|
|
108
|
+
* half extents having been set wrong.
|
|
109
|
+
* - The two axes are made perpendicular, because a rectangle whose axes are not describes a
|
|
110
|
+
* parallelogram — and the form factor is defined for the polygon its four corners make, so what
|
|
111
|
+
* comes out is the irradiance of a shape the caller did not ask for and cannot see the outline
|
|
112
|
+
* of.
|
|
113
|
+
*
|
|
114
|
+
* Allocation-free: it fills a target the caller owns, because this runs per frame.
|
|
115
|
+
*/
|
|
116
|
+
export declare function selectAreaLights(lights: readonly AreaLightSource[], out: AreaLightBuffer): AreaLightBuffer;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/** Rectangular area lights: what a caller declares, and the arrays a shader wants. */
|
|
2
|
+
/**
|
|
3
|
+
* How many rectangles the lit pass shades against at once.
|
|
4
|
+
*
|
|
5
|
+
* **Four, because a rectangle is a fixture rather than a lamp.** A window, a softbox, a lit panel:
|
|
6
|
+
* a scene with more than a handful of these is a scene that wants them baked into an environment,
|
|
7
|
+
* which is what the prefilter and the loader are for. Raising it is a uniform-array size and an
|
|
8
|
+
* iteration of the loop, exactly as `MAX_POINT_LIGHTS` is.
|
|
9
|
+
*/
|
|
10
|
+
export const MAX_AREA_LIGHTS = 4;
|
|
11
|
+
export function createAreaLightBuffer(capacity = MAX_AREA_LIGHTS) {
|
|
12
|
+
return {
|
|
13
|
+
count: 0,
|
|
14
|
+
positions: new Float32Array(capacity * 3),
|
|
15
|
+
colors: new Float32Array(capacity * 3),
|
|
16
|
+
right: new Float32Array(capacity * 3),
|
|
17
|
+
up: new Float32Array(capacity * 3),
|
|
18
|
+
sizes: new Float32Array(capacity * 2),
|
|
19
|
+
twoSided: new Float32Array(capacity),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fill the buffer from a caller's list, normalising the axes and orthogonalising them.
|
|
24
|
+
*
|
|
25
|
+
* **Both corrections are here rather than trusted**, and neither is defensive tidying:
|
|
26
|
+
*
|
|
27
|
+
* - The form factor treats `right` and `up` as unit vectors, so a caller's un-normalised axis
|
|
28
|
+
* scales the rectangle it describes. That is a light of the wrong *size*, which reads as the
|
|
29
|
+
* half extents having been set wrong.
|
|
30
|
+
* - The two axes are made perpendicular, because a rectangle whose axes are not describes a
|
|
31
|
+
* parallelogram — and the form factor is defined for the polygon its four corners make, so what
|
|
32
|
+
* comes out is the irradiance of a shape the caller did not ask for and cannot see the outline
|
|
33
|
+
* of.
|
|
34
|
+
*
|
|
35
|
+
* Allocation-free: it fills a target the caller owns, because this runs per frame.
|
|
36
|
+
*/
|
|
37
|
+
export function selectAreaLights(lights, out) {
|
|
38
|
+
const capacity = Math.floor(out.sizes.length / 2);
|
|
39
|
+
const count = Math.min(lights.length, capacity);
|
|
40
|
+
out.count = count;
|
|
41
|
+
for (let slot = 0; slot < count; slot++) {
|
|
42
|
+
const light = lights[slot];
|
|
43
|
+
if (light === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
out.positions[slot * 3] = light.x;
|
|
46
|
+
out.positions[slot * 3 + 1] = light.y;
|
|
47
|
+
out.positions[slot * 3 + 2] = light.z;
|
|
48
|
+
out.colors[slot * 3] = light.r;
|
|
49
|
+
out.colors[slot * 3 + 1] = light.g;
|
|
50
|
+
out.colors[slot * 3 + 2] = light.b;
|
|
51
|
+
const rx = light.rightX;
|
|
52
|
+
const ry = light.rightY;
|
|
53
|
+
const rz = light.rightZ;
|
|
54
|
+
const rLen = Math.sqrt(rx * rx + ry * ry + rz * rz) || 1;
|
|
55
|
+
const nrx = rx / rLen;
|
|
56
|
+
const nry = ry / rLen;
|
|
57
|
+
const nrz = rz / rLen;
|
|
58
|
+
/* Gram-Schmidt: up loses whatever component it shared with right, then is normalised. */
|
|
59
|
+
const ux = light.upX;
|
|
60
|
+
const uy = light.upY;
|
|
61
|
+
const uz = light.upZ;
|
|
62
|
+
const along = ux * nrx + uy * nry + uz * nrz;
|
|
63
|
+
let oux = ux - nrx * along;
|
|
64
|
+
let ouy = uy - nry * along;
|
|
65
|
+
let ouz = uz - nrz * along;
|
|
66
|
+
const uLen = Math.sqrt(oux * oux + ouy * ouy + ouz * ouz);
|
|
67
|
+
if (uLen < 1e-6) {
|
|
68
|
+
/*
|
|
69
|
+
* Parallel axes describe no rectangle at all. Any perpendicular will do rather than leaving
|
|
70
|
+
* a zero vector, which would make every corner the same point and every form factor NaN —
|
|
71
|
+
* a light that blanks whatever it touches, from two numbers a caller got wrong.
|
|
72
|
+
*/
|
|
73
|
+
const fallback = Math.abs(nry) < 0.9 ? [0, 1, 0] : [1, 0, 0];
|
|
74
|
+
oux = (fallback[1] ?? 0) * nrz - (fallback[2] ?? 0) * nry;
|
|
75
|
+
ouy = (fallback[2] ?? 0) * nrx - (fallback[0] ?? 0) * nrz;
|
|
76
|
+
ouz = (fallback[0] ?? 0) * nry - (fallback[1] ?? 0) * nrx;
|
|
77
|
+
}
|
|
78
|
+
const finalLen = Math.sqrt(oux * oux + ouy * ouy + ouz * ouz) || 1;
|
|
79
|
+
out.right[slot * 3] = nrx;
|
|
80
|
+
out.right[slot * 3 + 1] = nry;
|
|
81
|
+
out.right[slot * 3 + 2] = nrz;
|
|
82
|
+
out.up[slot * 3] = oux / finalLen;
|
|
83
|
+
out.up[slot * 3 + 1] = ouy / finalLen;
|
|
84
|
+
out.up[slot * 3 + 2] = ouz / finalLen;
|
|
85
|
+
/* Never zero: a rectangle with no extent has no solid angle and no light. */
|
|
86
|
+
out.sizes[slot * 2] = Math.max(1e-4, light.halfWidth);
|
|
87
|
+
out.sizes[slot * 2 + 1] = Math.max(1e-4, light.halfHeight);
|
|
88
|
+
out.twoSided[slot] = light.twoSided === true ? 1 : 0;
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Occlusion for a rectangular area light: which layers it holds, when they re-bake, and what the
|
|
3
|
+
* shader is told about them.
|
|
4
|
+
*
|
|
5
|
+
* **An area light's shadow is a point light's shadow rendered from the rectangle's centre**, and
|
|
6
|
+
* the whole of what makes it an *area* shadow is where the penumbra's width comes from. A point
|
|
7
|
+
* light hands the filter one number, `sourceRadius`, and gets a round penumbra. A rectangle hands
|
|
8
|
+
* it two half extents and the filter opens along the rectangle's own axes, so a long cable of
|
|
9
|
+
* bulbs — the case this was reported for — throws one broad shadow that is soft along the cable
|
|
10
|
+
* and tight across it, rather than nine overlapping hard ones that pile up where they cross.
|
|
11
|
+
* That part is `areaShadow()` in `shaders/flat/pointShadow.ts`; this file is the storage and the
|
|
12
|
+
* scheduling in front of it.
|
|
13
|
+
*
|
|
14
|
+
* **Rendering from the centre is an approximation and it is the one this technique is.** The
|
|
15
|
+
* correct answer integrates visibility over the rectangle, which is many shadow maps or a ray
|
|
16
|
+
* query; one map from the centre plus a filter whose width is the emitter's own extent is the
|
|
17
|
+
* standard percentage-closer soft shadow, and what it gets wrong is contact: a caster touching a
|
|
18
|
+
* surface has an umbra there whatever the source's size, and the widened filter still softens it
|
|
19
|
+
* slightly. **What would make it visibly wrong** is a rectangle much wider than its distance to
|
|
20
|
+
* the caster, where different points on the emitter see genuinely different silhouettes — a
|
|
21
|
+
* ceiling-wide panel a hand's width above a table.
|
|
22
|
+
*
|
|
23
|
+
* **Why these layers are dedicated rather than pooled**, which is the one decision here that
|
|
24
|
+
* reverses a note written before it: `POINT_SHADOW_POOL` rations layers because up to fifty lamps
|
|
25
|
+
* compete for twelve, and the eviction rule is what keeps that from costing 327 MB. At most
|
|
26
|
+
* `MAX_AREA_LIGHTS` rectangles exist and every one of them is shaded, so there is nothing to
|
|
27
|
+
* ration — and `preamble.ts` already states the rule that matters here: a shadow budget below the
|
|
28
|
+
* shading budget means some lights illuminate without occluding and *which* ones changes as the
|
|
29
|
+
* camera moves, which reads as shadows switching on and off. Matching the two budgets makes that
|
|
30
|
+
* impossible rather than rare. So the layers are sized from how many rectangles a world says will
|
|
31
|
+
* cast, exactly as `PointShadowArray` sizes itself from the world's light count rather than from
|
|
32
|
+
* the maximum.
|
|
33
|
+
*
|
|
34
|
+
* **What that costs, arithmetic rather than estimate:** an octahedral layer is
|
|
35
|
+
* `OCTAHEDRAL_EDGE` squared at four bytes, 4.19 MB, and a casting rectangle takes two — one for
|
|
36
|
+
* the static world and one for the movers. 8.39 MB each, 33.6 MB if a world declares the full
|
|
37
|
+
* four, nothing at all for a world whose rectangles do not cast. The point pool at its own
|
|
38
|
+
* maximum is 58.7 MB for comparison.
|
|
39
|
+
*
|
|
40
|
+
* **Why two layers and not one.** A single layer would have to hold the static world and the
|
|
41
|
+
* movers together, so a person walking under the rectangle would re-bake six passes over the whole
|
|
42
|
+
* static scene every frame — `pointShadowBudget.ts` measured that shape at 89 ms and 99 ms in two
|
|
43
|
+
* consecutive frames against an 8.3 ms budget, and it is the reason point lights split the two in
|
|
44
|
+
* the first place. Movers alone are a handful of meshes, so the live layer is affordable every
|
|
45
|
+
* frame and the static one is baked once for a fixture that never moves.
|
|
46
|
+
*/
|
|
47
|
+
import type { AreaLightSource } from './areaLights.ts';
|
|
48
|
+
import { type BakeScratch } from './pointShadowBudget.ts';
|
|
49
|
+
/** A static layer and a live one. See the header for why it is not one. */
|
|
50
|
+
export declare const LAYERS_PER_AREA_LIGHT = 2;
|
|
51
|
+
/**
|
|
52
|
+
* How many layers of the shared array a world's rectangles will take.
|
|
53
|
+
*
|
|
54
|
+
* Two per rectangle that declares it casts and names a range, and none for one that does not. A
|
|
55
|
+
* rectangle past `MAX_AREA_LIGHTS` is not shaded, so it gets no layer either — a layer for a light
|
|
56
|
+
* the loop never reaches is storage nothing can read.
|
|
57
|
+
*/
|
|
58
|
+
export declare function areaShadowLayerCount(lights: readonly AreaLightSource[]): number;
|
|
59
|
+
/**
|
|
60
|
+
* Where the area layers begin, given how many point lights the world has.
|
|
61
|
+
*
|
|
62
|
+
* **One function rather than the same expression written in three files**, which is the mistake
|
|
63
|
+
* `pointShadowImage.ts` records at `DEFAULT_SOURCE_RADIUS`: the array sizes itself, this set hands
|
|
64
|
+
* out indices, and the two disagreeing by one would have every rectangle sampling a lamp's map.
|
|
65
|
+
* Both call this.
|
|
66
|
+
*/
|
|
67
|
+
export declare function firstAreaShadowLayer(pointLightCount: number): number;
|
|
68
|
+
/**
|
|
69
|
+
* The range a rectangle will actually cast over, or 0 for one that will not.
|
|
70
|
+
*
|
|
71
|
+
* **A declared `castsShadow` with no `shadowRange` counts as not casting**, because there is no
|
|
72
|
+
* honest far plane to invent for it — see the field. The renderer says so once by name; this
|
|
73
|
+
* function is only the predicate, and it is shared so the layer count and the map assignment
|
|
74
|
+
* cannot answer it differently.
|
|
75
|
+
*/
|
|
76
|
+
export declare function castingRange(light: AreaLightSource | undefined): number;
|
|
77
|
+
/** What the shader is told about each rectangle's occlusion, filled once a frame. */
|
|
78
|
+
export interface ResolvedAreaShadows {
|
|
79
|
+
/** Which array layer holds this rectangle's static image, or -1 for none. */
|
|
80
|
+
readonly layer: Int32Array;
|
|
81
|
+
readonly far: Float32Array;
|
|
82
|
+
readonly near: Float32Array;
|
|
83
|
+
/** How present the image is, 0 to 1, so a fresh bake arrives rather than appears. */
|
|
84
|
+
readonly weight: Float32Array;
|
|
85
|
+
/** The same four for the layer holding movers only. */
|
|
86
|
+
readonly liveLayer: Int32Array;
|
|
87
|
+
readonly liveFar: Float32Array;
|
|
88
|
+
readonly liveNear: Float32Array;
|
|
89
|
+
readonly liveWeight: Float32Array;
|
|
90
|
+
}
|
|
91
|
+
export declare function createResolvedAreaShadows(slots?: number): ResolvedAreaShadows;
|
|
92
|
+
/**
|
|
93
|
+
* What a map must answer for this set to schedule and publish it.
|
|
94
|
+
*
|
|
95
|
+
* Structurally exactly what `PointShadowMap` and `GpuPointShadowMap` already are, which is the
|
|
96
|
+
* point: an area light's map is a point light's map on a layer of the same array, so neither
|
|
97
|
+
* backend needs a second class and neither can drift from the other about staleness, arrival or
|
|
98
|
+
* resumption. All of that lives in `PointShadowImage`, inside both of them.
|
|
99
|
+
*/
|
|
100
|
+
export interface AreaShadowMap {
|
|
101
|
+
readonly layer: number;
|
|
102
|
+
readonly far: number;
|
|
103
|
+
readonly near: number;
|
|
104
|
+
readonly hasBaked: boolean;
|
|
105
|
+
readonly presence: number;
|
|
106
|
+
matchesSource(x: number, y: number, z: number, range: number, near: number, sourceRadius: number, tolerance: number): boolean;
|
|
107
|
+
advance(dt: number): void;
|
|
108
|
+
forget(): void;
|
|
109
|
+
}
|
|
110
|
+
/** The one thing this set cannot do itself: put faces of a world into a layer. */
|
|
111
|
+
export type BakeAreaFaces<M> = (map: M, light: AreaLightSource, range: number, near: number, casters: unknown, maxFaces: number) => number;
|
|
112
|
+
/**
|
|
113
|
+
* The maps a world's casting rectangles hold, and when each of them re-bakes.
|
|
114
|
+
*
|
|
115
|
+
* Constructed with a factory rather than a device, for the reason `PointShadowSystem` is: every
|
|
116
|
+
* decision in here is about scheduling and none of it is about a texture, so both backends share
|
|
117
|
+
* this file and supply one callback each.
|
|
118
|
+
*/
|
|
119
|
+
export declare class AreaShadowSet<M extends AreaShadowMap> {
|
|
120
|
+
private readonly createMap;
|
|
121
|
+
private readonly releaseMap;
|
|
122
|
+
/** Indexed by area-light slot. `undefined` where that slot does not cast. */
|
|
123
|
+
private readonly statics;
|
|
124
|
+
private readonly lives;
|
|
125
|
+
/** What each slot was prepared for, so a changed declaration rebuilds rather than lies. */
|
|
126
|
+
private readonly ranges;
|
|
127
|
+
private firstLayer;
|
|
128
|
+
constructor(createMap: (layer: number) => M, releaseMap: (map: M) => void);
|
|
129
|
+
/** How many slots currently hold a static map. For a renderer publishing its own state. */
|
|
130
|
+
get castingCount(): number;
|
|
131
|
+
/**
|
|
132
|
+
* Hand out layers for the rectangles that will cast. Called when the world's lights are known.
|
|
133
|
+
*
|
|
134
|
+
* **Rebuilt from scratch rather than patched**, because the layer a map owns is fixed for its
|
|
135
|
+
* life — `PointShadowMap.layer` is `readonly` and the shader is told an index — so a rectangle
|
|
136
|
+
* that starts or stops casting moves every layer after it. That happens at load, not per frame.
|
|
137
|
+
*/
|
|
138
|
+
prepare(lights: readonly AreaLightSource[], firstLayer: number): void;
|
|
139
|
+
/** Throw every image away, keeping the layers. For an array that has just been rebuilt. */
|
|
140
|
+
forgetEveryImage(): void;
|
|
141
|
+
/** Give the layers back. */
|
|
142
|
+
release(): void;
|
|
143
|
+
/**
|
|
144
|
+
* Whether the layers handed out still match what these lights declare.
|
|
145
|
+
*
|
|
146
|
+
* A consumer that turns a rectangle's casting on, or moves one past `MAX_AREA_LIGHTS`, has
|
|
147
|
+
* changed the layout — and a set that carried on would publish a layer index belonging to
|
|
148
|
+
* another rectangle, which is another fixture's shadow under this one. The renderer re-prepares
|
|
149
|
+
* on a false answer, which is the same thing `prepareStaticPointShadows` does about a light
|
|
150
|
+
* count that grew.
|
|
151
|
+
*/
|
|
152
|
+
matchesDeclaration(lights: readonly AreaLightSource[]): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Spend a frame's faces across the casting rectangles, static maps first.
|
|
155
|
+
*
|
|
156
|
+
* **The static half is ordered by `planPointShadowBakes`, the same function the point pool
|
|
157
|
+
* uses**, so a rectangle with no image yet jumps ahead of one that has merely drifted — a map
|
|
158
|
+
* that has never baked contributes no occlusion at all, and every frame it waits is a frame with
|
|
159
|
+
* a rectangle visibly lighting through walls. Sharing the ordering rather than writing a second
|
|
160
|
+
* one is the 2026-08-13 rule: two implementations of one decision drift, and here the drift
|
|
161
|
+
* would be shadows arriving in a different order on the two backends, which no parity capture
|
|
162
|
+
* would attribute because both frames look plausible.
|
|
163
|
+
*
|
|
164
|
+
* **The live half has no staleness test, for the reason the point pool's does not**: the caster
|
|
165
|
+
* moved, which is what makes it live. It has a ceiling instead, round-robin across the
|
|
166
|
+
* rectangles, so a scene with four of them spends a bounded number of faces rather than
|
|
167
|
+
* twenty-four.
|
|
168
|
+
*/
|
|
169
|
+
update(lights: readonly AreaLightSource[], dt: number, facesPerFrame: number, liveFacesPerFrame: number, rebakeDistance: number, faceCount: number, scratch: BakeScratch, staticCasters: unknown, dynamicCasters: unknown, bake: BakeAreaFaces<M>): void;
|
|
170
|
+
/**
|
|
171
|
+
* Publish what the shader should read, per area-light slot.
|
|
172
|
+
*
|
|
173
|
+
* **The far plane and the near plane come off the map rather than off the light**, which is the
|
|
174
|
+
* trap `PointShadowImage.planBake` was written for: a bake in flight owns the parameters it
|
|
175
|
+
* started with, so a rectangle whose range changed mid-bake has a map holding faces rendered
|
|
176
|
+
* under the old one. Publishing the declaration would pair new numbers with old pixels, and what
|
|
177
|
+
* that looks like is a shadow at the wrong distance rather than an error.
|
|
178
|
+
*
|
|
179
|
+
* **A map with no image publishes -1** rather than a layer at zero weight. Zero weight would
|
|
180
|
+
* make the fetch harmless and it would still *be* a fetch, of a layer holding whatever
|
|
181
|
+
* `texStorage3D` left there.
|
|
182
|
+
*/
|
|
183
|
+
resolve(lights: readonly AreaLightSource[], out: ResolvedAreaShadows): void;
|
|
184
|
+
}
|