@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which point-shadow maps get to bake this frame, and in what order.
|
|
3
|
+
*
|
|
4
|
+
* Baking is six full passes over the static world per light, and the renderer used to
|
|
5
|
+
* do every stale one in the frame it noticed. That is fine in the steady state, where
|
|
6
|
+
* nothing is stale, and catastrophic on the frame it stops being true: walking into a
|
|
7
|
+
* courtyard makes eight lights stale at once, which is 48 passes in one frame. Measured on
|
|
8
|
+
* a fast machine at boot, that was two consecutive frames of 89 ms and 99 ms against an
|
|
9
|
+
* 8.3 ms budget — the hitch about a second after a page load, and a smaller one each
|
|
10
|
+
* time a new cluster of lamps comes into range.
|
|
11
|
+
*
|
|
12
|
+
* Spreading the same work over more frames costs nothing anybody can see. Eight lights
|
|
13
|
+
* at two faces a frame is 24 frames, a fifth of a second at 120 Hz, during which
|
|
14
|
+
* shadows resolve progressively instead of the whole game stopping.
|
|
15
|
+
*
|
|
16
|
+
* This module only decides the *order*. The renderer spends a face budget walking it,
|
|
17
|
+
* because lights need different numbers of faces depending on how far through a bake
|
|
18
|
+
* they already are.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Order the stale maps so the ones with nothing to show go first.
|
|
22
|
+
*
|
|
23
|
+
* A light whose map has never been baked contributes no shadow at all until it has one
|
|
24
|
+
* (see `PointShadowSystem.bind`), so every frame it waits is a frame with a visibly
|
|
25
|
+
* unlit lamp. A light that has merely drifted past the rebake tolerance is still
|
|
26
|
+
* sampling a perfectly reasonable map from a few centimetres away, and can wait.
|
|
27
|
+
* Serving the second kind first would hold a missing shadow hostage to a nearly
|
|
28
|
+
* invisible correction.
|
|
29
|
+
*
|
|
30
|
+
* Within each group the caller's order is preserved, which is the shading pass's own
|
|
31
|
+
* light order and therefore already sorted by how much each light matters.
|
|
32
|
+
*
|
|
33
|
+
* Writes into `out` and returns how many entries it wrote; allocation-free because this
|
|
34
|
+
* runs every frame.
|
|
35
|
+
*/
|
|
36
|
+
export declare function planPointShadowBakes(
|
|
37
|
+
/** 1 where the map at that slot needs baking. */
|
|
38
|
+
stale: Uint8Array,
|
|
39
|
+
/** 1 where the map at that slot already holds a usable image. */
|
|
40
|
+
ready: Uint8Array, count: number, out: Int32Array,
|
|
41
|
+
/**
|
|
42
|
+
* 1 where this slot's map has gone stale on every recent frame.
|
|
43
|
+
*
|
|
44
|
+
* Optional: a caller that omits it gets the two-group order this had before.
|
|
45
|
+
*/
|
|
46
|
+
chronic?: Uint8Array): number;
|
|
47
|
+
/**
|
|
48
|
+
* The shaded lights that also cast, in the order they were shaded.
|
|
49
|
+
*
|
|
50
|
+
* `castsShadow: false` says a light is not worth a cubemap. `selectPointLights` honours
|
|
51
|
+
* that when it builds the *eligible* list, and that was taken for the whole promise — but
|
|
52
|
+
* the shaded set is a different list, a caller hands it to `updatePointShadows` as the set
|
|
53
|
+
* to bind, and a light in it was given a pool slot and baked whatever it had declared. So
|
|
54
|
+
* the flag held for a lamp out of range and quietly failed for the one in front of you,
|
|
55
|
+
* which is the only one whose bake is visible.
|
|
56
|
+
*
|
|
57
|
+
* It showed up as a shadow with nothing to throw it — a lamp that rides the camera
|
|
58
|
+
* declines to cast for exactly that reason, and cast anyway.
|
|
59
|
+
*
|
|
60
|
+
* Writes into `out` and returns how many it wrote; allocation-free, because this runs
|
|
61
|
+
* every frame.
|
|
62
|
+
*/
|
|
63
|
+
export declare function selectCastingLights(lights: readonly {
|
|
64
|
+
castsShadow?: boolean;
|
|
65
|
+
}[], activeWorldIndices: Int32Array, activeCount: number, out: Int32Array): number;
|
|
66
|
+
/** The per-slot scratch a bake round needs. Caller-owned; this runs every frame. */
|
|
67
|
+
export interface BakeScratch {
|
|
68
|
+
readonly stale: Uint8Array;
|
|
69
|
+
readonly ready: Uint8Array;
|
|
70
|
+
readonly order: Int32Array;
|
|
71
|
+
readonly chronic: Uint8Array;
|
|
72
|
+
readonly staleRun: Uint8Array;
|
|
73
|
+
readonly staleOwner: Int32Array;
|
|
74
|
+
}
|
|
75
|
+
export declare function createBakeScratch(pool: number): BakeScratch;
|
|
76
|
+
/** What a pool must expose for a bake round to be planned over it. */
|
|
77
|
+
export interface BakeablePool<M> {
|
|
78
|
+
readonly pooledCount: number;
|
|
79
|
+
readonly sampledCount: number;
|
|
80
|
+
readonly liveMapCount: number;
|
|
81
|
+
pooledLight(slot: number): number;
|
|
82
|
+
mapForLight(lightIndex: number): M | undefined;
|
|
83
|
+
liveOwner(slot: number): number;
|
|
84
|
+
liveMap(slot: number): M | undefined;
|
|
85
|
+
}
|
|
86
|
+
/** The one thing a bake round cannot do itself: put six faces of a world into a cubemap. */
|
|
87
|
+
export type BakeFaces<M, L> = (map: M, light: L, casters: unknown, maxFaces: number) => number;
|
|
88
|
+
/** What a map must answer for staleness to be decided. */
|
|
89
|
+
export interface StaleCheck {
|
|
90
|
+
hasBaked: boolean;
|
|
91
|
+
matchesSource(x: number, y: number, z: number, range: number, near: number, sourceRadius: number, tolerance: number): boolean;
|
|
92
|
+
}
|
|
93
|
+
/** The light fields a bake round reads. */
|
|
94
|
+
export interface BakeableLight {
|
|
95
|
+
x: number;
|
|
96
|
+
y: number;
|
|
97
|
+
z: number;
|
|
98
|
+
radius: number;
|
|
99
|
+
shadowNear: number;
|
|
100
|
+
sourceRadius: number;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Spend a frame's face budget across the pool, then refresh the live maps.
|
|
104
|
+
*
|
|
105
|
+
* **Every rule in here was bought with a measured frame and none of it is about a device.**
|
|
106
|
+
* Bakes are spread rather than done the instant they are noticed, because walking into a courtyard
|
|
107
|
+
* makes eight lights go stale at once — 48 passes over the static world in one frame, measured
|
|
108
|
+
* at 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. A slot that has never
|
|
109
|
+
* baked and is being *sampled* jumps the queue with the whole six, because a light with no
|
|
110
|
+
* image contributes nothing and a partial cubemap is worse than none; one such jump a frame, so
|
|
111
|
+
* a cluster coming into range cannot spend the whole budget at once. A slot that is stale every
|
|
112
|
+
* frame is demoted after three, because a wandering flame would otherwise starve the queue.
|
|
113
|
+
*
|
|
114
|
+
* A second implementation of any of that is a backend whose shadows arrive at different moments
|
|
115
|
+
* — which is not something a parity capture would attribute, because both frames look plausible.
|
|
116
|
+
* Hence one function, and `bake` as the only thing either backend supplies.
|
|
117
|
+
*/
|
|
118
|
+
export declare function runPointShadowBakes<M extends StaleCheck, L extends BakeableLight>(pool: BakeablePool<M>, lights: readonly L[], facesPerFrame: number, liveFacesPerFrame: number, rebakeDistance: number, faceCount: number, scratch: BakeScratch, staticCasters: unknown, dynamicCasters: unknown, bake: BakeFaces<M, L>): void;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which point-shadow maps get to bake this frame, and in what order.
|
|
3
|
+
*
|
|
4
|
+
* Baking is six full passes over the static world per light, and the renderer used to
|
|
5
|
+
* do every stale one in the frame it noticed. That is fine in the steady state, where
|
|
6
|
+
* nothing is stale, and catastrophic on the frame it stops being true: walking into a
|
|
7
|
+
* courtyard makes eight lights stale at once, which is 48 passes in one frame. Measured on
|
|
8
|
+
* a fast machine at boot, that was two consecutive frames of 89 ms and 99 ms against an
|
|
9
|
+
* 8.3 ms budget — the hitch about a second after a page load, and a smaller one each
|
|
10
|
+
* time a new cluster of lamps comes into range.
|
|
11
|
+
*
|
|
12
|
+
* Spreading the same work over more frames costs nothing anybody can see. Eight lights
|
|
13
|
+
* at two faces a frame is 24 frames, a fifth of a second at 120 Hz, during which
|
|
14
|
+
* shadows resolve progressively instead of the whole game stopping.
|
|
15
|
+
*
|
|
16
|
+
* This module only decides the *order*. The renderer spends a face budget walking it,
|
|
17
|
+
* because lights need different numbers of faces depending on how far through a bake
|
|
18
|
+
* they already are.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Order the stale maps so the ones with nothing to show go first.
|
|
22
|
+
*
|
|
23
|
+
* A light whose map has never been baked contributes no shadow at all until it has one
|
|
24
|
+
* (see `PointShadowSystem.bind`), so every frame it waits is a frame with a visibly
|
|
25
|
+
* unlit lamp. A light that has merely drifted past the rebake tolerance is still
|
|
26
|
+
* sampling a perfectly reasonable map from a few centimetres away, and can wait.
|
|
27
|
+
* Serving the second kind first would hold a missing shadow hostage to a nearly
|
|
28
|
+
* invisible correction.
|
|
29
|
+
*
|
|
30
|
+
* Within each group the caller's order is preserved, which is the shading pass's own
|
|
31
|
+
* light order and therefore already sorted by how much each light matters.
|
|
32
|
+
*
|
|
33
|
+
* Writes into `out` and returns how many entries it wrote; allocation-free because this
|
|
34
|
+
* runs every frame.
|
|
35
|
+
*/
|
|
36
|
+
export function planPointShadowBakes(
|
|
37
|
+
/** 1 where the map at that slot needs baking. */
|
|
38
|
+
stale,
|
|
39
|
+
/** 1 where the map at that slot already holds a usable image. */
|
|
40
|
+
ready, count, out,
|
|
41
|
+
/**
|
|
42
|
+
* 1 where this slot's map has gone stale on every recent frame.
|
|
43
|
+
*
|
|
44
|
+
* Optional: a caller that omits it gets the two-group order this had before.
|
|
45
|
+
*/
|
|
46
|
+
chronic) {
|
|
47
|
+
let written = 0;
|
|
48
|
+
// Never baked: nothing to sample until this lands.
|
|
49
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
50
|
+
if (stale[slot] === 1 && ready[slot] !== 1)
|
|
51
|
+
out[written++] = slot;
|
|
52
|
+
}
|
|
53
|
+
// Baked but drifted: correcting an image that is already close to right.
|
|
54
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
55
|
+
if (stale[slot] === 1 && ready[slot] === 1 && chronic?.[slot] !== 1)
|
|
56
|
+
out[written++] = slot;
|
|
57
|
+
}
|
|
58
|
+
/*
|
|
59
|
+
* Last: the maps that will be stale again next frame whatever is done for them.
|
|
60
|
+
*
|
|
61
|
+
* A light that moves, or breathes its radius, invalidates its own map every frame — so
|
|
62
|
+
* a bake buys it one frame and is owed again immediately. Ordered by the caller's
|
|
63
|
+
* importance alone, which is all the drifted group above uses, such a light sits
|
|
64
|
+
* permanently ahead of a static one that drifted once and would then stay correct for
|
|
65
|
+
* an hour; it takes the spread budget forever and the static one never gets its
|
|
66
|
+
* correction. Importance is the right tie-break between two maps that will *keep* what
|
|
67
|
+
* they are given, and the wrong one when only one of them will.
|
|
68
|
+
*
|
|
69
|
+
* They are still served, and served in full when budget is left over, so a light that
|
|
70
|
+
* settles catches up on the next frame. They simply cannot hold a settling light
|
|
71
|
+
* hostage any more.
|
|
72
|
+
*
|
|
73
|
+
* This is the scheduling half of the problem only. Whether a light is *worth* a cubemap
|
|
74
|
+
* at all — a floor-level marker, a lamp riding a camera, a creature standing inside
|
|
75
|
+
* its own glow — is a question about the content, and `castsShadow` is where a consumer
|
|
76
|
+
* answers it. No ordering can.
|
|
77
|
+
*/
|
|
78
|
+
if (chronic !== undefined) {
|
|
79
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
80
|
+
if (stale[slot] === 1 && ready[slot] === 1 && chronic[slot] === 1)
|
|
81
|
+
out[written++] = slot;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return written;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The shaded lights that also cast, in the order they were shaded.
|
|
88
|
+
*
|
|
89
|
+
* `castsShadow: false` says a light is not worth a cubemap. `selectPointLights` honours
|
|
90
|
+
* that when it builds the *eligible* list, and that was taken for the whole promise — but
|
|
91
|
+
* the shaded set is a different list, a caller hands it to `updatePointShadows` as the set
|
|
92
|
+
* to bind, and a light in it was given a pool slot and baked whatever it had declared. So
|
|
93
|
+
* the flag held for a lamp out of range and quietly failed for the one in front of you,
|
|
94
|
+
* which is the only one whose bake is visible.
|
|
95
|
+
*
|
|
96
|
+
* It showed up as a shadow with nothing to throw it — a lamp that rides the camera
|
|
97
|
+
* declines to cast for exactly that reason, and cast anyway.
|
|
98
|
+
*
|
|
99
|
+
* Writes into `out` and returns how many it wrote; allocation-free, because this runs
|
|
100
|
+
* every frame.
|
|
101
|
+
*/
|
|
102
|
+
export function selectCastingLights(lights, activeWorldIndices, activeCount, out) {
|
|
103
|
+
let written = 0;
|
|
104
|
+
for (let i = 0; i < activeCount && written < out.length; i++) {
|
|
105
|
+
const worldIndex = activeWorldIndices[i] ?? -1;
|
|
106
|
+
if (worldIndex < 0)
|
|
107
|
+
continue;
|
|
108
|
+
if (lights[worldIndex]?.castsShadow === false)
|
|
109
|
+
continue;
|
|
110
|
+
out[written++] = worldIndex;
|
|
111
|
+
}
|
|
112
|
+
return written;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* How many consecutive frames a slot must be stale before it is treated as chronically so.
|
|
116
|
+
*
|
|
117
|
+
* A light that drifts past the rebake tolerance every frame — a wandering flame — would
|
|
118
|
+
* otherwise take a bake every frame and starve everything else. Three frames is long enough
|
|
119
|
+
* that a genuine move still rebakes promptly and short enough that a chronic one is demoted
|
|
120
|
+
* before it has cost much.
|
|
121
|
+
*/
|
|
122
|
+
const CHRONIC_STALE_FRAMES = 3;
|
|
123
|
+
export function createBakeScratch(pool) {
|
|
124
|
+
return {
|
|
125
|
+
stale: new Uint8Array(pool),
|
|
126
|
+
ready: new Uint8Array(pool),
|
|
127
|
+
order: new Int32Array(pool),
|
|
128
|
+
chronic: new Uint8Array(pool),
|
|
129
|
+
staleRun: new Uint8Array(pool),
|
|
130
|
+
staleOwner: new Int32Array(pool).fill(-1),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Spend a frame's face budget across the pool, then refresh the live maps.
|
|
135
|
+
*
|
|
136
|
+
* **Every rule in here was bought with a measured frame and none of it is about a device.**
|
|
137
|
+
* Bakes are spread rather than done the instant they are noticed, because walking into a courtyard
|
|
138
|
+
* makes eight lights go stale at once — 48 passes over the static world in one frame, measured
|
|
139
|
+
* at 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. A slot that has never
|
|
140
|
+
* baked and is being *sampled* jumps the queue with the whole six, because a light with no
|
|
141
|
+
* image contributes nothing and a partial cubemap is worse than none; one such jump a frame, so
|
|
142
|
+
* a cluster coming into range cannot spend the whole budget at once. A slot that is stale every
|
|
143
|
+
* frame is demoted after three, because a wandering flame would otherwise starve the queue.
|
|
144
|
+
*
|
|
145
|
+
* A second implementation of any of that is a backend whose shadows arrive at different moments
|
|
146
|
+
* — which is not something a parity capture would attribute, because both frames look plausible.
|
|
147
|
+
* Hence one function, and `bake` as the only thing either backend supplies.
|
|
148
|
+
*/
|
|
149
|
+
export function runPointShadowBakes(pool, lights, facesPerFrame, liveFacesPerFrame, rebakeDistance, faceCount, scratch, staticCasters, dynamicCasters, bake) {
|
|
150
|
+
/*
|
|
151
|
+
* Across everything holding a slot, not only what is being shaded. A warm light baked now is
|
|
152
|
+
* a light that joins the sampled set without a six-face bill — which is the on/off a lamp
|
|
153
|
+
* used to make as it came into range.
|
|
154
|
+
*/
|
|
155
|
+
const count = Math.min(pool.pooledCount, scratch.stale.length);
|
|
156
|
+
for (let slot = 0; slot < count; slot++) {
|
|
157
|
+
const lightIndex = pool.pooledLight(slot);
|
|
158
|
+
const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
|
|
159
|
+
const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
|
|
160
|
+
const stale = light !== undefined &&
|
|
161
|
+
map !== undefined &&
|
|
162
|
+
!map.matchesSource(light.x, light.y, light.z, light.radius, light.shadowNear, light.sourceRadius, rebakeDistance);
|
|
163
|
+
scratch.stale[slot] = stale ? 1 : 0;
|
|
164
|
+
scratch.ready[slot] = map !== undefined && map.hasBaked ? 1 : 0;
|
|
165
|
+
/* The run is per borrower: a slot changing hands starts its patience over. */
|
|
166
|
+
if (scratch.staleOwner[slot] !== lightIndex) {
|
|
167
|
+
scratch.staleOwner[slot] = lightIndex;
|
|
168
|
+
scratch.staleRun[slot] = 0;
|
|
169
|
+
}
|
|
170
|
+
const run = stale ? Math.min((scratch.staleRun[slot] ?? 0) + 1, CHRONIC_STALE_FRAMES) : 0;
|
|
171
|
+
scratch.staleRun[slot] = run;
|
|
172
|
+
scratch.chronic[slot] = run >= CHRONIC_STALE_FRAMES ? 1 : 0;
|
|
173
|
+
}
|
|
174
|
+
const planned = planPointShadowBakes(scratch.stale, scratch.ready, count, scratch.order, scratch.chronic);
|
|
175
|
+
let faces = facesPerFrame;
|
|
176
|
+
let urgentSpent = false;
|
|
177
|
+
for (let i = 0; i < planned && faces > 0; i++) {
|
|
178
|
+
const slot = scratch.order[i] ?? -1;
|
|
179
|
+
/*
|
|
180
|
+
* `pooledLight`, matching the loop that filled `stale`: resolving through the sampled list
|
|
181
|
+
* here would bake the wrong light for every warm slot.
|
|
182
|
+
*/
|
|
183
|
+
const lightIndex = slot >= 0 ? pool.pooledLight(slot) : -1;
|
|
184
|
+
const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
|
|
185
|
+
const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
|
|
186
|
+
if (light === undefined || map === undefined)
|
|
187
|
+
continue;
|
|
188
|
+
const cold = slot < pool.sampledCount && scratch.ready[slot] === 0;
|
|
189
|
+
const budget = cold && !urgentSpent ? faceCount : faces;
|
|
190
|
+
if (cold && !urgentSpent)
|
|
191
|
+
urgentSpent = true;
|
|
192
|
+
faces -= bake(map, light, staticCasters, budget);
|
|
193
|
+
}
|
|
194
|
+
/*
|
|
195
|
+
* Live maps contain movers only and are composed with the static maps in the shader. A second
|
|
196
|
+
* map exists only during an ownership crossfade.
|
|
197
|
+
*
|
|
198
|
+
* **Unlike a static map there is no staleness test to make** — the caster moved, that is what
|
|
199
|
+
* makes it live — **but there does have to be a ceiling, and there was not one.** This loop
|
|
200
|
+
* asked for the whole cubemap, per live map, every frame, outside `facesPerFrame` entirely.
|
|
201
|
+
* Measured on the consumer and on three of the engine's seven demos: `pointShadow.face`
|
|
202
|
+
* six times a frame, for ever, in scenes that were otherwise nine to fourteen passes. And
|
|
203
|
+
* `LIVE_POINT_SHADOW_MAPS` is two with the second waking up during an ownership handoff, which
|
|
204
|
+
* is precisely what running past a row of lamps is — so a courtyard paid twelve full passes over
|
|
205
|
+
* the dynamic casters a frame, which is where "it is only slow in the courtyard" came from.
|
|
206
|
+
*
|
|
207
|
+
* The faces round-robin under the budget instead, so a mover's shadow finishes over two or
|
|
208
|
+
* three frames rather than all inside one. What that costs is a shadow a frame or two behind
|
|
209
|
+
* a character. What it bought back was the frame rate to see it at all.
|
|
210
|
+
*/
|
|
211
|
+
let liveFaces = Math.max(1, liveFacesPerFrame);
|
|
212
|
+
for (let slot = 0; slot < pool.liveMapCount && liveFaces > 0; slot++) {
|
|
213
|
+
const owner = pool.liveOwner(slot);
|
|
214
|
+
const light = owner >= 0 ? lights[owner] : undefined;
|
|
215
|
+
const map = pool.liveMap(slot);
|
|
216
|
+
if (light === undefined || map === undefined)
|
|
217
|
+
continue;
|
|
218
|
+
/* Never wider than the cube itself: asking for more is asking for faces that do not exist. */
|
|
219
|
+
liveFaces -= bake(map, light, dynamicCasters, Math.min(liveFaces, faceCount));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { mat3, mat4 } from 'gl-matrix';
|
|
2
|
+
/**
|
|
3
|
+
* What a point light's shadow cubemap *is*, with no device in it.
|
|
4
|
+
*
|
|
5
|
+
* **Everything here is a decision, and the six that matter are already paid for.** A cubemap
|
|
6
|
+
* that is stale by a millimetre re-bakes six passes over the world; one that is not stale
|
|
7
|
+
* enough strobes; one that publishes its parameters before its last face pairs new numbers with
|
|
8
|
+
* old pixels; one that keeps `baked` across a pool handover reports another lamp's picture as
|
|
9
|
+
* its own. Each of those was a shipped bug on the WebGL2 path and each is fixed *here*, so a
|
|
10
|
+
* second backend inherits the fixes instead of re-earning them. That is the 2026-08-13 rule
|
|
11
|
+
* applied to the largest piece of state in the renderer.
|
|
12
|
+
*
|
|
13
|
+
* The device half — the cube texture and the six passes that fill it — is per backend and is
|
|
14
|
+
* all that is left outside this file.
|
|
15
|
+
*/
|
|
16
|
+
/** A cubemap is six faces, and a bake may be spread across frames a few at a time. */
|
|
17
|
+
export declare const FACE_COUNT = 6;
|
|
18
|
+
/**
|
|
19
|
+
* Default distance from the source at which shadow casting begins.
|
|
20
|
+
*
|
|
21
|
+
* Raising it per light is how a fixture avoids shadowing its own lamp: a brazier sits directly
|
|
22
|
+
* under its flame, so with a near plane of a few centimetres it occludes an enormous solid
|
|
23
|
+
* angle and throws a big square across the ground. Anything nearer the source than this is
|
|
24
|
+
* simply not rendered into the map, which is what real fixtures do — the light comes from
|
|
25
|
+
* *inside* them.
|
|
26
|
+
*/
|
|
27
|
+
export declare const POINT_SHADOW_NEAR = 0.25;
|
|
28
|
+
/**
|
|
29
|
+
* The emitter radius assumed for a light that names none.
|
|
30
|
+
*
|
|
31
|
+
* One constant because it is read in three places — the field, the bake and `matchesSource` —
|
|
32
|
+
* and the whole of the bug it replaces was two of those disagreeing. The bake filled in 0.05
|
|
33
|
+
* and `matchesSource` compared against `undefined`, so a map baked by a caller that said
|
|
34
|
+
* nothing was stale on every frame it was ever checked.
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_SOURCE_RADIUS = 0.05;
|
|
37
|
+
/**
|
|
38
|
+
* One face's view-projection, into a matrix the caller owns.
|
|
39
|
+
*
|
|
40
|
+
* A ninety-degree square frustum per face is what makes six of them a cube, so the projection
|
|
41
|
+
* takes no aspect and no field of view: both are fixed by the shape. Module-scope scratch,
|
|
42
|
+
* because this runs once per face of every bake and `AGENTS.md` allows no allocation there.
|
|
43
|
+
*/
|
|
44
|
+
export declare function pointShadowFaceViewProj(face: number, x: number, y: number, z: number, near: number, range: number, out: mat4): mat4;
|
|
45
|
+
/**
|
|
46
|
+
* A face's world-to-face rotation, from the same targets its frustum is built from.
|
|
47
|
+
*
|
|
48
|
+
* **The resolve needs one and the bake needs the other, and two tables would eventually
|
|
49
|
+
* disagree.** A face's octahedral region is written by projecting each texel's direction into that
|
|
50
|
+
* face's own frame and reading the depth the bake stored there; if the two differ by an up vector,
|
|
51
|
+
* every texel of that face is read from the wrong place. That reads as a lighting bug and is a
|
|
52
|
+
* transcription error, so both come off `FACE_TARGETS` and a test puts one point through each and
|
|
53
|
+
* requires the same image coordinates.
|
|
54
|
+
*
|
|
55
|
+
* `lookAt` builds a right-handed view looking down `-z`, so a direction inside this face comes
|
|
56
|
+
* back with a **negative** `z`. The resolve divides by `-v.z` for that reason and not by
|
|
57
|
+
* preference.
|
|
58
|
+
*
|
|
59
|
+
* Module-scope scratch, because this runs once per resolved face inside the bake budget and
|
|
60
|
+
* `AGENTS.md` allows no allocation there.
|
|
61
|
+
*/
|
|
62
|
+
export declare function pointShadowFaceRotation(face: number, out: mat3): mat3;
|
|
63
|
+
/**
|
|
64
|
+
* The window of faces a resumed bake should render this frame, and what to render them for.
|
|
65
|
+
* Empty when there is none.
|
|
66
|
+
*
|
|
67
|
+
* **The parameters travel with the window, and that is the point rather than a convenience.**
|
|
68
|
+
* A bake is spread over frames against `pointShadowBudget.ts`, and a caller that used its own
|
|
69
|
+
* live light position for the second half would build an image around two different places —
|
|
70
|
+
* which is the failure `planBake` says it exists to prevent and, before these fields, did not.
|
|
71
|
+
* See `planBake`.
|
|
72
|
+
*/
|
|
73
|
+
export interface FaceRange {
|
|
74
|
+
first: number;
|
|
75
|
+
last: number;
|
|
76
|
+
/** Where the light was when this bake started. */
|
|
77
|
+
x: number;
|
|
78
|
+
y: number;
|
|
79
|
+
z: number;
|
|
80
|
+
/** The far plane, the near plane and the emitter radius the same bake started with. */
|
|
81
|
+
range: number;
|
|
82
|
+
near: number;
|
|
83
|
+
sourceRadius: number;
|
|
84
|
+
}
|
|
85
|
+
/** A `FaceRange` a map can own for the life of the session, since a bake allocates nothing. */
|
|
86
|
+
export declare function createFaceRange(): FaceRange;
|
|
87
|
+
/**
|
|
88
|
+
* The state of one cubemap: what it was baked for, how present it is, and how far through.
|
|
89
|
+
*
|
|
90
|
+
* Held by a backend's map rather than inherited from, so the device resource stays a device
|
|
91
|
+
* resource and this stays testable without one.
|
|
92
|
+
*/
|
|
93
|
+
export declare class PointShadowImage {
|
|
94
|
+
/** Far plane, needed by the shader to linearise the comparison. */
|
|
95
|
+
far: number;
|
|
96
|
+
/** Near plane; the shader needs the same value to linearise. */
|
|
97
|
+
near: number;
|
|
98
|
+
/** Emitter radius of the light this map was baked for. */
|
|
99
|
+
sourceRadius: number;
|
|
100
|
+
private baked;
|
|
101
|
+
private arrival;
|
|
102
|
+
private x;
|
|
103
|
+
private y;
|
|
104
|
+
private z;
|
|
105
|
+
/** Next face a resumed bake will render; 0 when none is in flight. */
|
|
106
|
+
private pendingFace;
|
|
107
|
+
/** What the in-flight bake was started for, so a changed light restarts it. */
|
|
108
|
+
private pendingX;
|
|
109
|
+
private pendingY;
|
|
110
|
+
private pendingZ;
|
|
111
|
+
private pendingRange;
|
|
112
|
+
private pendingNear;
|
|
113
|
+
private pendingSourceRadius;
|
|
114
|
+
/** Whether this map holds an image worth sampling. False until a bake completes. */
|
|
115
|
+
get hasBaked(): boolean;
|
|
116
|
+
/** How present the image is, 0 to 1. The shader mixes the occlusion in by it. */
|
|
117
|
+
get presence(): number;
|
|
118
|
+
/**
|
|
119
|
+
* Whether this map still represents the source projection well enough to sample.
|
|
120
|
+
*
|
|
121
|
+
* `tolerance` is how far the source may drift from where it was baked before the map is
|
|
122
|
+
* stale. It exists because an exact comparison made a *flame* the most expensive object in
|
|
123
|
+
* the scene: a brazier wanders a few centimetres every frame to look alive, every frame that
|
|
124
|
+
* moved the light, and every move re-baked six cubemap faces of the entire static world. Up
|
|
125
|
+
* to eight sampled lights doing that is where a frame's 174 surplus draw calls came from,
|
|
126
|
+
* against an `AGENTS.md` budget of a hundred in total.
|
|
127
|
+
*
|
|
128
|
+
* A drift tolerance is the honest fix rather than a cheat. The shadow of static geometry
|
|
129
|
+
* metres away barely moves when the emitter shifts by centimetres, and a fire's shadow that
|
|
130
|
+
* re-solves every frame reads as strobing rather than as flicker. Callers that genuinely move
|
|
131
|
+
* a light pass 0 and get the old behaviour, because drift is measured against the *baked*
|
|
132
|
+
* origin and so accumulates rather than being forgiven each frame.
|
|
133
|
+
*
|
|
134
|
+
* `sourceRadius` defaults to exactly what a bake defaults it to, and the two defaults being
|
|
135
|
+
* one constant is the point rather than a convenience: they disagreed once, `0.05 !== undefined`
|
|
136
|
+
* was true every frame, every map was stale forever, and with a couple of faces of budget the
|
|
137
|
+
* only thing on screen was whichever face had most recently finished — a hard square of shadow
|
|
138
|
+
* that moved as you did. Any default would do as long as it is the same one. Two is the bug.
|
|
139
|
+
*/
|
|
140
|
+
matchesSource(x: number, y: number, z: number, range: number, near: number, sourceRadius?: number, tolerance?: number): boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Ramp the image in over `ARRIVAL_SECONDS`.
|
|
143
|
+
*
|
|
144
|
+
* The drastic case, and the one the light's own fade cannot reach. A light leaving takes its
|
|
145
|
+
* shadow with it, because by the time membership changes the light is already at nothing —
|
|
146
|
+
* but a light *keeping* its place can still lose its picture, when a pool slot changes hands
|
|
147
|
+
* and `forget` throws the image away. The re-bake then lands whole between two frames, under
|
|
148
|
+
* a lamp that has not moved, and a shadow switching on is exactly as wrong as one switching
|
|
149
|
+
* off.
|
|
150
|
+
*
|
|
151
|
+
* Only a first image after a `forget` ramps. A map that merely drifted past the rebake
|
|
152
|
+
* tolerance keeps `baked` true throughout and stays fully present, which is right: it is
|
|
153
|
+
* correcting a picture, not arriving with one.
|
|
154
|
+
*/
|
|
155
|
+
advance(dt: number): void;
|
|
156
|
+
/**
|
|
157
|
+
* Throw away the image, because this map is about to belong to another light.
|
|
158
|
+
*
|
|
159
|
+
* A pool slot keeps its cubemap when it changes hands. Without this, `baked` stayed true from
|
|
160
|
+
* the previous borrower, so the new light reported an image it had never rendered — the *old*
|
|
161
|
+
* lamp's, taken from somewhere else — and the shader sampled it for the three frames a
|
|
162
|
+
* re-bake takes at two faces each. That is the flicker: shadows and glare appearing and
|
|
163
|
+
* disappearing as the camera moves and the chosen eight reorder.
|
|
164
|
+
*
|
|
165
|
+
* The partial-bake cursor goes too: a resumed bake must not stitch new faces onto the
|
|
166
|
+
* previous light's old ones. Presence goes with the image — whatever arrives next is a new
|
|
167
|
+
* light's, and it arrives as one.
|
|
168
|
+
*/
|
|
169
|
+
forget(): void;
|
|
170
|
+
/**
|
|
171
|
+
* Which faces to render now, and what to render them for.
|
|
172
|
+
*
|
|
173
|
+
* **A bake in flight owns its parameters until it finishes**, and the returned range carries
|
|
174
|
+
* them so the caller renders the remaining faces at the place the first ones were rendered
|
|
175
|
+
* for. Half a cubemap around one point and half around another is not a cubemap around
|
|
176
|
+
* anything, and this is what stops it being built.
|
|
177
|
+
*
|
|
178
|
+
* **It used to abandon a partial image whenever any argument moved, and that is the defect
|
|
179
|
+
* this replaces.** The comparison was exact — position, range, near plane and emitter radius,
|
|
180
|
+
* all of them — so a light that changes by any amount between two frames could never satisfy
|
|
181
|
+
* it. Two kinds are ordinary rather than exotic: a flame wanders a few centimetres every
|
|
182
|
+
* frame to look alive, and a light whose brightness is expressed as a radius rescales that
|
|
183
|
+
* radius every frame while it pulses. For either, `pendingFace` was reset to zero on every
|
|
184
|
+
* frame, so with a budget of two faces the bake rendered faces 0 and 1 for ever and **faces 2
|
|
185
|
+
* to 5 were never written again**.
|
|
186
|
+
*
|
|
187
|
+
* That is not a bake that is merely slow. `resolveFace` writes each face into the light's
|
|
188
|
+
* octahedral layer as it is rendered, and `hasBaked` stays true from the last bake that did
|
|
189
|
+
* complete — so the shader keeps sampling a layer holding two faces from where the light is
|
|
190
|
+
* now and four from wherever it used to be, permanently, at full presence. A cube face is a
|
|
191
|
+
* 90 degree frustum, so what that draws is a hard-edged quadrilateral of shadow standing on
|
|
192
|
+
* the ground under the lamp with nothing above it to cast one. Reported as exactly that.
|
|
193
|
+
*
|
|
194
|
+
* A light that moves during a bake is not lost: the image completes at the origin it started
|
|
195
|
+
* from, `matchesSource` finds it stale on the next frame, and a fresh bake starts. What it
|
|
196
|
+
* costs is a shadow up to `FACE_COUNT / facesPerFrame` frames behind a moving lamp, which is
|
|
197
|
+
* the trade `pointShadowRebakeDistance` already makes in a coarser form.
|
|
198
|
+
*/
|
|
199
|
+
planBake(x: number, y: number, z: number, range: number, near: number, sourceRadius: number, maxFaces: number, out: FaceRange): FaceRange;
|
|
200
|
+
/**
|
|
201
|
+
* Record that faces up to `last` have been rendered.
|
|
202
|
+
*
|
|
203
|
+
* **`far`, `near` and `sourceRadius` move only when the last face lands**, and that is the
|
|
204
|
+
* one subtle part. They describe the image the shader is sampling, so publishing them early
|
|
205
|
+
* would pair new parameters with faces that are still mostly old. A first bake is not sampled
|
|
206
|
+
* at all until it completes, so this only matters for a re-bake, where holding the old values
|
|
207
|
+
* keeps them matched to the old faces.
|
|
208
|
+
*/
|
|
209
|
+
completeBake(last: number, x: number, y: number, z: number, range: number, near: number, sourceRadius: number): void;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* What a pool needs of a cubemap, whichever device holds it.
|
|
213
|
+
*
|
|
214
|
+
* Nine members, seven of which are `PointShadowImage`'s already — so a backend's map is this
|
|
215
|
+
* interface plus a texture and a way to fill it. Declared here rather than in either backend
|
|
216
|
+
* because `PointShadowSystem` and `LivePointShadowSet` are written against it, and a pool that
|
|
217
|
+
* knew which device it was pooling would be two pools.
|
|
218
|
+
*/
|
|
219
|
+
export interface PointShadowSource {
|
|
220
|
+
/** Which layer of the shared array holds this map's image. */
|
|
221
|
+
readonly layer: number;
|
|
222
|
+
readonly far: number;
|
|
223
|
+
readonly near: number;
|
|
224
|
+
readonly sourceRadius: number;
|
|
225
|
+
/** Whether this map holds an image worth sampling. */
|
|
226
|
+
readonly hasBaked: boolean;
|
|
227
|
+
/** How present the image is, 0 to 1. */
|
|
228
|
+
readonly presence: number;
|
|
229
|
+
advance(dt: number): void;
|
|
230
|
+
forget(): void;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Everything the shader needs about the point-shadow set, chosen once and bound twice.
|
|
234
|
+
*
|
|
235
|
+
* **The arrays are the decision and the textures are the binding**, which is the split the
|
|
236
|
+
* 2026-08-13 rule asks for. Which light owns which slot, whether its image has landed, and how
|
|
237
|
+
* present it is are answers a pool computes; turning them into `uniform1fv` or into bytes of a
|
|
238
|
+
* uniform block is all that differs between the backends.
|
|
239
|
+
*
|
|
240
|
+
* A caller owns one of these and hands it in, because this is filled every frame.
|
|
241
|
+
*/
|
|
242
|
+
export interface ResolvedPointShadows {
|
|
243
|
+
/**
|
|
244
|
+
* Per shaded light: which array layer holds its static shadow, or −1 for none.
|
|
245
|
+
*
|
|
246
|
+
* **Indexed by the shading pass's light, and it used to be the other way round.** When each
|
|
247
|
+
* map was its own `samplerCube` the shader could not index one, so it ran ten `else if` arms
|
|
248
|
+
* comparing a light against a slot's owner; every array here was addressed by the slot and the
|
|
249
|
+
* light was the value. One array texture makes the map a number, so the light can be the index
|
|
250
|
+
* and the whole chain becomes a lookup. Every array below moved with it.
|
|
251
|
+
*/
|
|
252
|
+
readonly layers: Int32Array;
|
|
253
|
+
readonly far: Float32Array;
|
|
254
|
+
readonly near: Float32Array;
|
|
255
|
+
readonly sourceRadius: Float32Array;
|
|
256
|
+
/** How present each bound map is, so a re-baked one arrives rather than appears. */
|
|
257
|
+
readonly presence: Float32Array;
|
|
258
|
+
/** The live pair, by the same light index: a light owns at most one of the two. */
|
|
259
|
+
readonly liveLayers: Int32Array;
|
|
260
|
+
readonly liveFar: Float32Array;
|
|
261
|
+
readonly liveNear: Float32Array;
|
|
262
|
+
readonly liveSourceRadius: Float32Array;
|
|
263
|
+
readonly liveWeights: Float32Array;
|
|
264
|
+
}
|
|
265
|
+
export declare function createResolvedPointShadows(lights: number): ResolvedPointShadows;
|