@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,470 @@
|
|
|
1
|
+
import { mat3, mat4, vec3 } from 'gl-matrix';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What a point light's shadow cubemap *is*, with no device in it.
|
|
5
|
+
*
|
|
6
|
+
* **Everything here is a decision, and the six that matter are already paid for.** A cubemap
|
|
7
|
+
* that is stale by a millimetre re-bakes six passes over the world; one that is not stale
|
|
8
|
+
* enough strobes; one that publishes its parameters before its last face pairs new numbers with
|
|
9
|
+
* old pixels; one that keeps `baked` across a pool handover reports another lamp's picture as
|
|
10
|
+
* its own. Each of those was a shipped bug on the WebGL2 path and each is fixed *here*, so a
|
|
11
|
+
* second backend inherits the fixes instead of re-earning them. That is the 2026-08-13 rule
|
|
12
|
+
* applied to the largest piece of state in the renderer.
|
|
13
|
+
*
|
|
14
|
+
* The device half — the cube texture and the six passes that fill it — is per backend and is
|
|
15
|
+
* all that is left outside this file.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** A cubemap is six faces, and a bake may be spread across frames a few at a time. */
|
|
19
|
+
export const FACE_COUNT = 6;
|
|
20
|
+
|
|
21
|
+
/** Which way each face looks, and which way is up for it. The order is the cubemap's own. */
|
|
22
|
+
const FACE_TARGETS: readonly (readonly [vec3, vec3])[] = [
|
|
23
|
+
[
|
|
24
|
+
[1, 0, 0],
|
|
25
|
+
[0, -1, 0],
|
|
26
|
+
],
|
|
27
|
+
[
|
|
28
|
+
[-1, 0, 0],
|
|
29
|
+
[0, -1, 0],
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
[0, 1, 0],
|
|
33
|
+
[0, 0, 1],
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
[0, -1, 0],
|
|
37
|
+
[0, 0, -1],
|
|
38
|
+
],
|
|
39
|
+
[
|
|
40
|
+
[0, 0, 1],
|
|
41
|
+
[0, -1, 0],
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
[0, 0, -1],
|
|
45
|
+
[0, -1, 0],
|
|
46
|
+
],
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Default distance from the source at which shadow casting begins.
|
|
51
|
+
*
|
|
52
|
+
* Raising it per light is how a fixture avoids shadowing its own lamp: a brazier sits directly
|
|
53
|
+
* under its flame, so with a near plane of a few centimetres it occludes an enormous solid
|
|
54
|
+
* angle and throws a big square across the ground. Anything nearer the source than this is
|
|
55
|
+
* simply not rendered into the map, which is what real fixtures do — the light comes from
|
|
56
|
+
* *inside* them.
|
|
57
|
+
*/
|
|
58
|
+
export const POINT_SHADOW_NEAR = 0.25;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* How long a freshly baked image takes to reach full strength, in seconds.
|
|
62
|
+
*
|
|
63
|
+
* Long enough to read as a shadow settling rather than a shadow appearing, short enough that
|
|
64
|
+
* nobody standing still waits for it. A quarter second is about thirty frames at 120 Hz, which
|
|
65
|
+
* is also comfortably longer than the six-face bake it follows, so the ramp starts from a
|
|
66
|
+
* picture that is already complete.
|
|
67
|
+
*/
|
|
68
|
+
const ARRIVAL_SECONDS = 0.25;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The emitter radius assumed for a light that names none.
|
|
72
|
+
*
|
|
73
|
+
* One constant because it is read in three places — the field, the bake and `matchesSource` —
|
|
74
|
+
* and the whole of the bug it replaces was two of those disagreeing. The bake filled in 0.05
|
|
75
|
+
* and `matchesSource` compared against `undefined`, so a map baked by a caller that said
|
|
76
|
+
* nothing was stale on every frame it was ever checked.
|
|
77
|
+
*/
|
|
78
|
+
export const DEFAULT_SOURCE_RADIUS = 0.05;
|
|
79
|
+
|
|
80
|
+
const scratchView = mat4.create();
|
|
81
|
+
const scratchLook = mat4.create();
|
|
82
|
+
const scratchProj = mat4.create();
|
|
83
|
+
const scratchEye = vec3.create();
|
|
84
|
+
const scratchCenter = vec3.create();
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* One face's view-projection, into a matrix the caller owns.
|
|
88
|
+
*
|
|
89
|
+
* A ninety-degree square frustum per face is what makes six of them a cube, so the projection
|
|
90
|
+
* takes no aspect and no field of view: both are fixed by the shape. Module-scope scratch,
|
|
91
|
+
* because this runs once per face of every bake and `AGENTS.md` allows no allocation there.
|
|
92
|
+
*/
|
|
93
|
+
export function pointShadowFaceViewProj(
|
|
94
|
+
face: number,
|
|
95
|
+
x: number,
|
|
96
|
+
y: number,
|
|
97
|
+
z: number,
|
|
98
|
+
near: number,
|
|
99
|
+
range: number,
|
|
100
|
+
out: mat4,
|
|
101
|
+
): mat4 {
|
|
102
|
+
const target = FACE_TARGETS[face];
|
|
103
|
+
if (target === undefined) return out;
|
|
104
|
+
const dir = target[0];
|
|
105
|
+
vec3.set(scratchEye, x, y, z);
|
|
106
|
+
vec3.set(scratchCenter, x + dir[0], y + dir[1], z + dir[2]);
|
|
107
|
+
mat4.perspective(scratchProj, Math.PI / 2, 1, near, range);
|
|
108
|
+
mat4.lookAt(scratchView, scratchEye, scratchCenter, target[1]);
|
|
109
|
+
return mat4.multiply(out, scratchProj, scratchView);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A face's world-to-face rotation, from the same targets its frustum is built from.
|
|
114
|
+
*
|
|
115
|
+
* **The resolve needs one and the bake needs the other, and two tables would eventually
|
|
116
|
+
* disagree.** A face's octahedral region is written by projecting each texel's direction into that
|
|
117
|
+
* face's own frame and reading the depth the bake stored there; if the two differ by an up vector,
|
|
118
|
+
* every texel of that face is read from the wrong place. That reads as a lighting bug and is a
|
|
119
|
+
* transcription error, so both come off `FACE_TARGETS` and a test puts one point through each and
|
|
120
|
+
* requires the same image coordinates.
|
|
121
|
+
*
|
|
122
|
+
* `lookAt` builds a right-handed view looking down `-z`, so a direction inside this face comes
|
|
123
|
+
* back with a **negative** `z`. The resolve divides by `-v.z` for that reason and not by
|
|
124
|
+
* preference.
|
|
125
|
+
*
|
|
126
|
+
* Module-scope scratch, because this runs once per resolved face inside the bake budget and
|
|
127
|
+
* `AGENTS.md` allows no allocation there.
|
|
128
|
+
*/
|
|
129
|
+
export function pointShadowFaceRotation(face: number, out: mat3): mat3 {
|
|
130
|
+
const target = FACE_TARGETS[face];
|
|
131
|
+
if (target === undefined) return out;
|
|
132
|
+
const dir = target[0];
|
|
133
|
+
vec3.set(scratchEye, 0, 0, 0);
|
|
134
|
+
vec3.set(scratchCenter, dir[0], dir[1], dir[2]);
|
|
135
|
+
mat4.lookAt(scratchLook, scratchEye, scratchCenter, target[1]);
|
|
136
|
+
return mat3.fromMat4(out, scratchLook);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The window of faces a resumed bake should render this frame, and what to render them for.
|
|
141
|
+
* Empty when there is none.
|
|
142
|
+
*
|
|
143
|
+
* **The parameters travel with the window, and that is the point rather than a convenience.**
|
|
144
|
+
* A bake is spread over frames against `pointShadowBudget.ts`, and a caller that used its own
|
|
145
|
+
* live light position for the second half would build an image around two different places —
|
|
146
|
+
* which is the failure `planBake` says it exists to prevent and, before these fields, did not.
|
|
147
|
+
* See `planBake`.
|
|
148
|
+
*/
|
|
149
|
+
export interface FaceRange {
|
|
150
|
+
first: number;
|
|
151
|
+
last: number;
|
|
152
|
+
/** Where the light was when this bake started. */
|
|
153
|
+
x: number;
|
|
154
|
+
y: number;
|
|
155
|
+
z: number;
|
|
156
|
+
/** The far plane, the near plane and the emitter radius the same bake started with. */
|
|
157
|
+
range: number;
|
|
158
|
+
near: number;
|
|
159
|
+
sourceRadius: number;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** A `FaceRange` a map can own for the life of the session, since a bake allocates nothing. */
|
|
163
|
+
export function createFaceRange(): FaceRange {
|
|
164
|
+
return {
|
|
165
|
+
first: 0,
|
|
166
|
+
last: 0,
|
|
167
|
+
x: 0,
|
|
168
|
+
y: 0,
|
|
169
|
+
z: 0,
|
|
170
|
+
range: 1,
|
|
171
|
+
near: POINT_SHADOW_NEAR,
|
|
172
|
+
sourceRadius: DEFAULT_SOURCE_RADIUS,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The state of one cubemap: what it was baked for, how present it is, and how far through.
|
|
178
|
+
*
|
|
179
|
+
* Held by a backend's map rather than inherited from, so the device resource stays a device
|
|
180
|
+
* resource and this stays testable without one.
|
|
181
|
+
*/
|
|
182
|
+
export class PointShadowImage {
|
|
183
|
+
/** Far plane, needed by the shader to linearise the comparison. */
|
|
184
|
+
far = 1;
|
|
185
|
+
/** Near plane; the shader needs the same value to linearise. */
|
|
186
|
+
near = POINT_SHADOW_NEAR;
|
|
187
|
+
/** Emitter radius of the light this map was baked for. */
|
|
188
|
+
sourceRadius = DEFAULT_SOURCE_RADIUS;
|
|
189
|
+
|
|
190
|
+
private baked = false;
|
|
191
|
+
private arrival = 0;
|
|
192
|
+
private x = 0;
|
|
193
|
+
private y = 0;
|
|
194
|
+
private z = 0;
|
|
195
|
+
/** Next face a resumed bake will render; 0 when none is in flight. */
|
|
196
|
+
private pendingFace = 0;
|
|
197
|
+
/** What the in-flight bake was started for, so a changed light restarts it. */
|
|
198
|
+
private pendingX = 0;
|
|
199
|
+
private pendingY = 0;
|
|
200
|
+
private pendingZ = 0;
|
|
201
|
+
private pendingRange = 0;
|
|
202
|
+
private pendingNear = 0;
|
|
203
|
+
private pendingSourceRadius = 0;
|
|
204
|
+
|
|
205
|
+
/** Whether this map holds an image worth sampling. False until a bake completes. */
|
|
206
|
+
get hasBaked(): boolean {
|
|
207
|
+
return this.baked;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** How present the image is, 0 to 1. The shader mixes the occlusion in by it. */
|
|
211
|
+
get presence(): number {
|
|
212
|
+
return this.arrival;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Whether this map still represents the source projection well enough to sample.
|
|
217
|
+
*
|
|
218
|
+
* `tolerance` is how far the source may drift from where it was baked before the map is
|
|
219
|
+
* stale. It exists because an exact comparison made a *flame* the most expensive object in
|
|
220
|
+
* the scene: a brazier wanders a few centimetres every frame to look alive, every frame that
|
|
221
|
+
* moved the light, and every move re-baked six cubemap faces of the entire static world. Up
|
|
222
|
+
* to eight sampled lights doing that is where a frame's 174 surplus draw calls came from,
|
|
223
|
+
* against an `AGENTS.md` budget of a hundred in total.
|
|
224
|
+
*
|
|
225
|
+
* A drift tolerance is the honest fix rather than a cheat. The shadow of static geometry
|
|
226
|
+
* metres away barely moves when the emitter shifts by centimetres, and a fire's shadow that
|
|
227
|
+
* re-solves every frame reads as strobing rather than as flicker. Callers that genuinely move
|
|
228
|
+
* a light pass 0 and get the old behaviour, because drift is measured against the *baked*
|
|
229
|
+
* origin and so accumulates rather than being forgiven each frame.
|
|
230
|
+
*
|
|
231
|
+
* `sourceRadius` defaults to exactly what a bake defaults it to, and the two defaults being
|
|
232
|
+
* one constant is the point rather than a convenience: they disagreed once, `0.05 !== undefined`
|
|
233
|
+
* was true every frame, every map was stale forever, and with a couple of faces of budget the
|
|
234
|
+
* only thing on screen was whichever face had most recently finished — a hard square of shadow
|
|
235
|
+
* that moved as you did. Any default would do as long as it is the same one. Two is the bug.
|
|
236
|
+
*/
|
|
237
|
+
matchesSource(
|
|
238
|
+
x: number,
|
|
239
|
+
y: number,
|
|
240
|
+
z: number,
|
|
241
|
+
range: number,
|
|
242
|
+
near: number,
|
|
243
|
+
sourceRadius = DEFAULT_SOURCE_RADIUS,
|
|
244
|
+
tolerance = 0,
|
|
245
|
+
): boolean {
|
|
246
|
+
if (
|
|
247
|
+
!this.baked ||
|
|
248
|
+
this.far !== range ||
|
|
249
|
+
this.near !== near ||
|
|
250
|
+
this.sourceRadius !== sourceRadius
|
|
251
|
+
) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const dx = this.x - x;
|
|
255
|
+
const dy = this.y - y;
|
|
256
|
+
const dz = this.z - z;
|
|
257
|
+
return dx * dx + dy * dy + dz * dz <= tolerance * tolerance;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Ramp the image in over `ARRIVAL_SECONDS`.
|
|
262
|
+
*
|
|
263
|
+
* The drastic case, and the one the light's own fade cannot reach. A light leaving takes its
|
|
264
|
+
* shadow with it, because by the time membership changes the light is already at nothing —
|
|
265
|
+
* but a light *keeping* its place can still lose its picture, when a pool slot changes hands
|
|
266
|
+
* and `forget` throws the image away. The re-bake then lands whole between two frames, under
|
|
267
|
+
* a lamp that has not moved, and a shadow switching on is exactly as wrong as one switching
|
|
268
|
+
* off.
|
|
269
|
+
*
|
|
270
|
+
* Only a first image after a `forget` ramps. A map that merely drifted past the rebake
|
|
271
|
+
* tolerance keeps `baked` true throughout and stays fully present, which is right: it is
|
|
272
|
+
* correcting a picture, not arriving with one.
|
|
273
|
+
*/
|
|
274
|
+
advance(dt: number): void {
|
|
275
|
+
if (!this.baked) {
|
|
276
|
+
this.arrival = 0;
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
this.arrival = Math.min(1, this.arrival + dt / ARRIVAL_SECONDS);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Throw away the image, because this map is about to belong to another light.
|
|
284
|
+
*
|
|
285
|
+
* A pool slot keeps its cubemap when it changes hands. Without this, `baked` stayed true from
|
|
286
|
+
* the previous borrower, so the new light reported an image it had never rendered — the *old*
|
|
287
|
+
* lamp's, taken from somewhere else — and the shader sampled it for the three frames a
|
|
288
|
+
* re-bake takes at two faces each. That is the flicker: shadows and glare appearing and
|
|
289
|
+
* disappearing as the camera moves and the chosen eight reorder.
|
|
290
|
+
*
|
|
291
|
+
* The partial-bake cursor goes too: a resumed bake must not stitch new faces onto the
|
|
292
|
+
* previous light's old ones. Presence goes with the image — whatever arrives next is a new
|
|
293
|
+
* light's, and it arrives as one.
|
|
294
|
+
*/
|
|
295
|
+
forget(): void {
|
|
296
|
+
this.baked = false;
|
|
297
|
+
this.pendingFace = 0;
|
|
298
|
+
this.arrival = 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Which faces to render now, and what to render them for.
|
|
303
|
+
*
|
|
304
|
+
* **A bake in flight owns its parameters until it finishes**, and the returned range carries
|
|
305
|
+
* them so the caller renders the remaining faces at the place the first ones were rendered
|
|
306
|
+
* for. Half a cubemap around one point and half around another is not a cubemap around
|
|
307
|
+
* anything, and this is what stops it being built.
|
|
308
|
+
*
|
|
309
|
+
* **It used to abandon a partial image whenever any argument moved, and that is the defect
|
|
310
|
+
* this replaces.** The comparison was exact — position, range, near plane and emitter radius,
|
|
311
|
+
* all of them — so a light that changes by any amount between two frames could never satisfy
|
|
312
|
+
* it. Two kinds are ordinary rather than exotic: a flame wanders a few centimetres every
|
|
313
|
+
* frame to look alive, and a light whose brightness is expressed as a radius rescales that
|
|
314
|
+
* radius every frame while it pulses. For either, `pendingFace` was reset to zero on every
|
|
315
|
+
* frame, so with a budget of two faces the bake rendered faces 0 and 1 for ever and **faces 2
|
|
316
|
+
* to 5 were never written again**.
|
|
317
|
+
*
|
|
318
|
+
* That is not a bake that is merely slow. `resolveFace` writes each face into the light's
|
|
319
|
+
* octahedral layer as it is rendered, and `hasBaked` stays true from the last bake that did
|
|
320
|
+
* complete — so the shader keeps sampling a layer holding two faces from where the light is
|
|
321
|
+
* now and four from wherever it used to be, permanently, at full presence. A cube face is a
|
|
322
|
+
* 90 degree frustum, so what that draws is a hard-edged quadrilateral of shadow standing on
|
|
323
|
+
* the ground under the lamp with nothing above it to cast one. Reported as exactly that.
|
|
324
|
+
*
|
|
325
|
+
* A light that moves during a bake is not lost: the image completes at the origin it started
|
|
326
|
+
* from, `matchesSource` finds it stale on the next frame, and a fresh bake starts. What it
|
|
327
|
+
* costs is a shadow up to `FACE_COUNT / facesPerFrame` frames behind a moving lamp, which is
|
|
328
|
+
* the trade `pointShadowRebakeDistance` already makes in a coarser form.
|
|
329
|
+
*/
|
|
330
|
+
planBake(
|
|
331
|
+
x: number,
|
|
332
|
+
y: number,
|
|
333
|
+
z: number,
|
|
334
|
+
range: number,
|
|
335
|
+
near: number,
|
|
336
|
+
sourceRadius: number,
|
|
337
|
+
maxFaces: number,
|
|
338
|
+
out: FaceRange,
|
|
339
|
+
): FaceRange {
|
|
340
|
+
if (this.pendingFace <= 0) {
|
|
341
|
+
this.pendingX = x;
|
|
342
|
+
this.pendingY = y;
|
|
343
|
+
this.pendingZ = z;
|
|
344
|
+
this.pendingRange = range;
|
|
345
|
+
this.pendingNear = near;
|
|
346
|
+
this.pendingSourceRadius = sourceRadius;
|
|
347
|
+
}
|
|
348
|
+
out.first = this.pendingFace;
|
|
349
|
+
out.last = Math.min(FACE_COUNT, out.first + Math.max(0, Math.trunc(maxFaces)));
|
|
350
|
+
out.x = this.pendingX;
|
|
351
|
+
out.y = this.pendingY;
|
|
352
|
+
out.z = this.pendingZ;
|
|
353
|
+
out.range = this.pendingRange;
|
|
354
|
+
out.near = this.pendingNear;
|
|
355
|
+
out.sourceRadius = this.pendingSourceRadius;
|
|
356
|
+
return out;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Record that faces up to `last` have been rendered.
|
|
361
|
+
*
|
|
362
|
+
* **`far`, `near` and `sourceRadius` move only when the last face lands**, and that is the
|
|
363
|
+
* one subtle part. They describe the image the shader is sampling, so publishing them early
|
|
364
|
+
* would pair new parameters with faces that are still mostly old. A first bake is not sampled
|
|
365
|
+
* at all until it completes, so this only matters for a re-bake, where holding the old values
|
|
366
|
+
* keeps them matched to the old faces.
|
|
367
|
+
*/
|
|
368
|
+
completeBake(
|
|
369
|
+
last: number,
|
|
370
|
+
x: number,
|
|
371
|
+
y: number,
|
|
372
|
+
z: number,
|
|
373
|
+
range: number,
|
|
374
|
+
near: number,
|
|
375
|
+
sourceRadius: number,
|
|
376
|
+
): void {
|
|
377
|
+
this.pendingFace = last;
|
|
378
|
+
if (last < FACE_COUNT) return;
|
|
379
|
+
this.pendingFace = 0;
|
|
380
|
+
this.x = x;
|
|
381
|
+
this.y = y;
|
|
382
|
+
this.z = z;
|
|
383
|
+
this.far = range;
|
|
384
|
+
this.near = near;
|
|
385
|
+
this.sourceRadius = sourceRadius;
|
|
386
|
+
this.baked = true;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* What a pool needs of a cubemap, whichever device holds it.
|
|
392
|
+
*
|
|
393
|
+
* Nine members, seven of which are `PointShadowImage`'s already — so a backend's map is this
|
|
394
|
+
* interface plus a texture and a way to fill it. Declared here rather than in either backend
|
|
395
|
+
* because `PointShadowSystem` and `LivePointShadowSet` are written against it, and a pool that
|
|
396
|
+
* knew which device it was pooling would be two pools.
|
|
397
|
+
*/
|
|
398
|
+
export interface PointShadowSource {
|
|
399
|
+
/** Which layer of the shared array holds this map's image. */
|
|
400
|
+
readonly layer: number;
|
|
401
|
+
readonly far: number;
|
|
402
|
+
readonly near: number;
|
|
403
|
+
readonly sourceRadius: number;
|
|
404
|
+
/** Whether this map holds an image worth sampling. */
|
|
405
|
+
readonly hasBaked: boolean;
|
|
406
|
+
/** How present the image is, 0 to 1. */
|
|
407
|
+
readonly presence: number;
|
|
408
|
+
advance(dt: number): void;
|
|
409
|
+
forget(): void;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Everything the shader needs about the point-shadow set, chosen once and bound twice.
|
|
414
|
+
*
|
|
415
|
+
* **The arrays are the decision and the textures are the binding**, which is the split the
|
|
416
|
+
* 2026-08-13 rule asks for. Which light owns which slot, whether its image has landed, and how
|
|
417
|
+
* present it is are answers a pool computes; turning them into `uniform1fv` or into bytes of a
|
|
418
|
+
* uniform block is all that differs between the backends.
|
|
419
|
+
*
|
|
420
|
+
* A caller owns one of these and hands it in, because this is filled every frame.
|
|
421
|
+
*/
|
|
422
|
+
export interface ResolvedPointShadows {
|
|
423
|
+
/**
|
|
424
|
+
* Per shaded light: which array layer holds its static shadow, or −1 for none.
|
|
425
|
+
*
|
|
426
|
+
* **Indexed by the shading pass's light, and it used to be the other way round.** When each
|
|
427
|
+
* map was its own `samplerCube` the shader could not index one, so it ran ten `else if` arms
|
|
428
|
+
* comparing a light against a slot's owner; every array here was addressed by the slot and the
|
|
429
|
+
* light was the value. One array texture makes the map a number, so the light can be the index
|
|
430
|
+
* and the whole chain becomes a lookup. Every array below moved with it.
|
|
431
|
+
*/
|
|
432
|
+
readonly layers: Int32Array;
|
|
433
|
+
readonly far: Float32Array;
|
|
434
|
+
readonly near: Float32Array;
|
|
435
|
+
readonly sourceRadius: Float32Array;
|
|
436
|
+
/** How present each bound map is, so a re-baked one arrives rather than appears. */
|
|
437
|
+
readonly presence: Float32Array;
|
|
438
|
+
/** The live pair, by the same light index: a light owns at most one of the two. */
|
|
439
|
+
readonly liveLayers: Int32Array;
|
|
440
|
+
readonly liveFar: Float32Array;
|
|
441
|
+
readonly liveNear: Float32Array;
|
|
442
|
+
readonly liveSourceRadius: Float32Array;
|
|
443
|
+
readonly liveWeights: Float32Array;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export function createResolvedPointShadows(lights: number): ResolvedPointShadows {
|
|
447
|
+
/*
|
|
448
|
+
* **−1 from the moment it exists, because zero is a layer.**
|
|
449
|
+
*
|
|
450
|
+
* `flat.ts` reads `uPointShadowLayer[i]` and samples when it is not negative, so a zero-filled
|
|
451
|
+
* array does not mean "no point shadows" — it means every light in every scene samples layer
|
|
452
|
+
* zero, which belongs to a live transition map. `resolve` fills these every frame, but a pass
|
|
453
|
+
* bound before the pool has ever been updated would otherwise upload the zeroes, and a scene
|
|
454
|
+
* is free to draw before it updates its shadows. Caught by a unit test that failed with
|
|
455
|
+
* `expected +0 to be -1`; the same trap survives the move from slots to layers, with a worse
|
|
456
|
+
* failure than before, because layer zero always exists where slot zero often did not.
|
|
457
|
+
*/
|
|
458
|
+
return {
|
|
459
|
+
layers: new Int32Array(lights).fill(-1),
|
|
460
|
+
far: new Float32Array(lights),
|
|
461
|
+
near: new Float32Array(lights),
|
|
462
|
+
sourceRadius: new Float32Array(lights),
|
|
463
|
+
presence: new Float32Array(lights),
|
|
464
|
+
liveLayers: new Int32Array(lights).fill(-1),
|
|
465
|
+
liveFar: new Float32Array(lights),
|
|
466
|
+
liveNear: new Float32Array(lights),
|
|
467
|
+
liveSourceRadius: new Float32Array(lights),
|
|
468
|
+
liveWeights: new Float32Array(lights),
|
|
469
|
+
};
|
|
470
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { mat4 } from 'gl-matrix';
|
|
2
|
+
import type { PointShadowTarget } from './pointShadowArray.ts';
|
|
3
|
+
import { DEFAULT_RENDER_QUALITY } from './renderQuality.ts';
|
|
4
|
+
import {
|
|
5
|
+
createFaceRange,
|
|
6
|
+
DEFAULT_SOURCE_RADIUS,
|
|
7
|
+
FACE_COUNT,
|
|
8
|
+
POINT_SHADOW_NEAR,
|
|
9
|
+
PointShadowImage,
|
|
10
|
+
pointShadowFaceViewProj,
|
|
11
|
+
type FaceRange,
|
|
12
|
+
} from './pointShadowImage.ts';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Omnidirectional shadows for a point light: one octahedral layer, rendered a face at a time.
|
|
16
|
+
*
|
|
17
|
+
* Six depth passes per light is normally what makes point-light shadows unaffordable. Static
|
|
18
|
+
* scenes can bake once; a caller may also rebuild a map for a moving source or nearby moving
|
|
19
|
+
* casters.
|
|
20
|
+
*
|
|
21
|
+
* Game-agnostic: it takes a position, a range, and a callback that draws whatever should cast.
|
|
22
|
+
*
|
|
23
|
+
* **All of the state is `PointShadowImage`'s and all of the arithmetic is too**, and now every
|
|
24
|
+
* GPU object is `PointShadowArray`'s — so what is left here is a layer index and a loop. That
|
|
25
|
+
* split is what lets a second backend inherit six paid-for decisions rather than re-derive them;
|
|
26
|
+
* see that file.
|
|
27
|
+
*
|
|
28
|
+
* **The six faces are still rasterised under six 90 degree frusta**, unchanged, because that is
|
|
29
|
+
* the only projection a triangle survives. What changed is where they land: each one goes to the
|
|
30
|
+
* array's shared scratch and is resolved from there into this map's layer, in the octahedral
|
|
31
|
+
* projection the shader reads. Nothing about the bake's cost, order or resumption moved.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/* Re-exported so callers that reach for these through this module keep working. */
|
|
35
|
+
export { FACE_COUNT, POINT_SHADOW_NEAR };
|
|
36
|
+
|
|
37
|
+
const scratchViewProj = mat4.create();
|
|
38
|
+
|
|
39
|
+
export class PointShadowMap {
|
|
40
|
+
readonly size: number;
|
|
41
|
+
/**
|
|
42
|
+
* Which layer of the shared array this map's image lives in.
|
|
43
|
+
*
|
|
44
|
+
* Fixed for the life of the map. The pool hands slots out and takes them back, and a slot's
|
|
45
|
+
* layer never moves — `forget` throws the *image* away, not the storage — so the shader can be
|
|
46
|
+
* told a layer index and nothing has to re-upload a texture binding when a light changes hands.
|
|
47
|
+
*/
|
|
48
|
+
readonly layer: number;
|
|
49
|
+
|
|
50
|
+
/** Everything this map knows about itself that is not a GPU object. */
|
|
51
|
+
private readonly image = new PointShadowImage();
|
|
52
|
+
private readonly range: FaceRange = createFaceRange();
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The array this map writes into, read late rather than held.
|
|
56
|
+
*
|
|
57
|
+
* The pool builds its live maps when the renderer is constructed, and the array cannot exist
|
|
58
|
+
* until a world says how many lights it has — and it is rebuilt if a later world says more. A
|
|
59
|
+
* getter rather than a reference means a map outlives both events without knowing about either.
|
|
60
|
+
* Called once per resolved face, which is nowhere near a per-fragment path.
|
|
61
|
+
*/
|
|
62
|
+
private readonly array: () => PointShadowTarget | null;
|
|
63
|
+
|
|
64
|
+
get far(): number {
|
|
65
|
+
return this.image.far;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get near(): number {
|
|
69
|
+
return this.image.near;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get sourceRadius(): number {
|
|
73
|
+
return this.image.sourceRadius;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Whether this map holds an image worth sampling. False until a bake completes. */
|
|
77
|
+
get hasBaked(): boolean {
|
|
78
|
+
return this.image.hasBaked;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** How present the image is, 0 to 1. The shader mixes the occlusion in by it. */
|
|
82
|
+
get presence(): number {
|
|
83
|
+
return this.image.presence;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Whether this map still represents the source well enough to sample. See the image. */
|
|
87
|
+
matchesSource(
|
|
88
|
+
x: number,
|
|
89
|
+
y: number,
|
|
90
|
+
z: number,
|
|
91
|
+
range: number,
|
|
92
|
+
near: number,
|
|
93
|
+
sourceRadius = DEFAULT_SOURCE_RADIUS,
|
|
94
|
+
tolerance = 0,
|
|
95
|
+
): boolean {
|
|
96
|
+
return this.image.matchesSource(x, y, z, range, near, sourceRadius, tolerance);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Ramp the image in. See the image. */
|
|
100
|
+
advance(dt: number): void {
|
|
101
|
+
this.image.advance(dt);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Throw the image away, because this map is about to belong to another light. */
|
|
105
|
+
forget(): void {
|
|
106
|
+
this.image.forget();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
constructor(
|
|
110
|
+
array: () => PointShadowTarget | null,
|
|
111
|
+
layer: number,
|
|
112
|
+
size = DEFAULT_RENDER_QUALITY.pointShadowFaceSize,
|
|
113
|
+
) {
|
|
114
|
+
this.array = array;
|
|
115
|
+
this.layer = layer;
|
|
116
|
+
this.size = size;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Render up to `maxFaces` of the six, resuming a bake already under way.
|
|
121
|
+
* Returns how many faces were rendered.
|
|
122
|
+
*
|
|
123
|
+
* `drawCasters` receives each face's view-projection and issues its draw calls, so a
|
|
124
|
+
* face is a full pass over the caster set and six of them is the whole cost. Doing
|
|
125
|
+
* all six unconditionally is what made this the most expensive thing in the frame the
|
|
126
|
+
* moment several lights went stale together: eight lights is 48 passes, measured at
|
|
127
|
+
* 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. The caller
|
|
128
|
+
* spends a per-frame face budget across the lights that need one; see
|
|
129
|
+
* `pointShadowBudget.ts`.
|
|
130
|
+
*
|
|
131
|
+
* A resumed bake keeps the origin it started with, **whatever this call is passed**:
|
|
132
|
+
* half a cubemap around one point and half around another is not a cubemap around
|
|
133
|
+
* anything, and a light that moves every frame used to produce exactly that, for ever.
|
|
134
|
+
* See `planBake`. Different arguments are honoured by the *next* bake, which the
|
|
135
|
+
* staleness test starts as soon as this one lands.
|
|
136
|
+
*
|
|
137
|
+
* **`far`, `near` and `sourceRadius` move only when the last face lands**, and that is
|
|
138
|
+
* the one subtle part. They describe the image the shader is sampling, so publishing
|
|
139
|
+
* them early would pair new parameters with faces that are still mostly old. A first
|
|
140
|
+
* bake is not sampled at all until it completes, so this only matters for a re-bake,
|
|
141
|
+
* where holding the old values keeps them matched to the old faces.
|
|
142
|
+
*/
|
|
143
|
+
bake(
|
|
144
|
+
gl: WebGL2RenderingContext,
|
|
145
|
+
x: number,
|
|
146
|
+
y: number,
|
|
147
|
+
z: number,
|
|
148
|
+
range: number,
|
|
149
|
+
drawCasters: (viewProj: mat4) => void,
|
|
150
|
+
near = POINT_SHADOW_NEAR,
|
|
151
|
+
sourceRadius = DEFAULT_SOURCE_RADIUS,
|
|
152
|
+
maxFaces = FACE_COUNT,
|
|
153
|
+
): number {
|
|
154
|
+
/*
|
|
155
|
+
* What to render now, **and what to render it for**. A bake in flight owns the parameters
|
|
156
|
+
* it started with, so the arguments here are only a proposal for a bake that is not already
|
|
157
|
+
* under way; see `planBake` for the permanent artefact that reading them unconditionally
|
|
158
|
+
* left in a moving light's map.
|
|
159
|
+
*/
|
|
160
|
+
const plan = this.image.planBake(x, y, z, range, near, sourceRadius, maxFaces, this.range);
|
|
161
|
+
const { first, last } = plan;
|
|
162
|
+
if (last <= first) return 0;
|
|
163
|
+
|
|
164
|
+
const array = this.array();
|
|
165
|
+
if (array === null) return 0;
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* Cull nothing.
|
|
169
|
+
*
|
|
170
|
+
* Rendering back faces only is the usual acne cure, but it stores the *far*
|
|
171
|
+
* side of every caster — and for a character's limbs the near and far sides
|
|
172
|
+
* are centimetres apart, so the caster effectively vanishes from the map.
|
|
173
|
+
* Acne is handled properly by the slope-scaled bias in the flat shader,
|
|
174
|
+
* which is where it belongs: it is a function of the receiving angle, not
|
|
175
|
+
* of which faces were rasterised.
|
|
176
|
+
*/
|
|
177
|
+
gl.disable(gl.CULL_FACE);
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
* Render, resolve, repeat — and the *repeat* is what makes one scratch serve every light.
|
|
181
|
+
*
|
|
182
|
+
* A face's octahedral region is disjoint from the other five, so the scratch is consumed the
|
|
183
|
+
* moment `resolveFace` reads it and is free again before the next face touches it. That holds
|
|
184
|
+
* across lights too, which matters: `pointShadowBudget.ts` spends one frame's face budget
|
|
185
|
+
* across several stale maps, so a scratch that had to survive a whole six-face bake would be
|
|
186
|
+
* clobbered by whichever light baked next.
|
|
187
|
+
*
|
|
188
|
+
* Completeness is checked once, in the array's constructor. See the note there: asking here
|
|
189
|
+
* is a pipeline flush in the middle of the frame loop.
|
|
190
|
+
*/
|
|
191
|
+
for (let face = first; face < last; face++) {
|
|
192
|
+
array.beginFace(gl);
|
|
193
|
+
drawCasters(
|
|
194
|
+
pointShadowFaceViewProj(
|
|
195
|
+
face,
|
|
196
|
+
plan.x,
|
|
197
|
+
plan.y,
|
|
198
|
+
plan.z,
|
|
199
|
+
plan.near,
|
|
200
|
+
plan.range,
|
|
201
|
+
scratchViewProj,
|
|
202
|
+
),
|
|
203
|
+
);
|
|
204
|
+
/*
|
|
205
|
+
* The casters left culling off and the resolve is a fullscreen triangle, so it does not
|
|
206
|
+
* care; `resolveFace` restores the depth function it borrows, which is the one thing the
|
|
207
|
+
* next face's pass does care about.
|
|
208
|
+
*/
|
|
209
|
+
array.resolveFace(gl, this.layer, face, plan.range, plan.near);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
gl.enable(gl.CULL_FACE);
|
|
213
|
+
gl.cullFace(gl.BACK);
|
|
214
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
215
|
+
|
|
216
|
+
this.image.completeBake(last, plan.x, plan.y, plan.z, plan.range, plan.near, plan.sourceRadius);
|
|
217
|
+
return last - first;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Nothing to free: every GPU object this map used to own belongs to `PointShadowArray` now.
|
|
222
|
+
*
|
|
223
|
+
* Kept because the pool's `releaseMap` calls it, and because a map that silently stopped
|
|
224
|
+
* needing disposal is exactly the shape of a leak nobody notices. The array is disposed by the
|
|
225
|
+
* renderer that built it.
|
|
226
|
+
*/
|
|
227
|
+
dispose(_gl: WebGL2RenderingContext): void {}
|
|
228
|
+
}
|