@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,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Occlusion for a rectangular area light: which layers it holds, when they re-bake, and what the
|
|
3
|
+
* shader is told about them.
|
|
4
|
+
*
|
|
5
|
+
* **An area light's shadow is a point light's shadow rendered from the rectangle's centre**, and
|
|
6
|
+
* the whole of what makes it an *area* shadow is where the penumbra's width comes from. A point
|
|
7
|
+
* light hands the filter one number, `sourceRadius`, and gets a round penumbra. A rectangle hands
|
|
8
|
+
* it two half extents and the filter opens along the rectangle's own axes, so a long cable of
|
|
9
|
+
* bulbs — the case this was reported for — throws one broad shadow that is soft along the cable
|
|
10
|
+
* and tight across it, rather than nine overlapping hard ones that pile up where they cross.
|
|
11
|
+
* That part is `areaShadow()` in `shaders/flat/pointShadow.ts`; this file is the storage and the
|
|
12
|
+
* scheduling in front of it.
|
|
13
|
+
*
|
|
14
|
+
* **Rendering from the centre is an approximation and it is the one this technique is.** The
|
|
15
|
+
* correct answer integrates visibility over the rectangle, which is many shadow maps or a ray
|
|
16
|
+
* query; one map from the centre plus a filter whose width is the emitter's own extent is the
|
|
17
|
+
* standard percentage-closer soft shadow, and what it gets wrong is contact: a caster touching a
|
|
18
|
+
* surface has an umbra there whatever the source's size, and the widened filter still softens it
|
|
19
|
+
* slightly. **What would make it visibly wrong** is a rectangle much wider than its distance to
|
|
20
|
+
* the caster, where different points on the emitter see genuinely different silhouettes — a
|
|
21
|
+
* ceiling-wide panel a hand's width above a table.
|
|
22
|
+
*
|
|
23
|
+
* **Why these layers are dedicated rather than pooled**, which is the one decision here that
|
|
24
|
+
* reverses a note written before it: `POINT_SHADOW_POOL` rations layers because up to fifty lamps
|
|
25
|
+
* compete for twelve, and the eviction rule is what keeps that from costing 327 MB. At most
|
|
26
|
+
* `MAX_AREA_LIGHTS` rectangles exist and every one of them is shaded, so there is nothing to
|
|
27
|
+
* ration — and `preamble.ts` already states the rule that matters here: a shadow budget below the
|
|
28
|
+
* shading budget means some lights illuminate without occluding and *which* ones changes as the
|
|
29
|
+
* camera moves, which reads as shadows switching on and off. Matching the two budgets makes that
|
|
30
|
+
* impossible rather than rare. So the layers are sized from how many rectangles a world says will
|
|
31
|
+
* cast, exactly as `PointShadowArray` sizes itself from the world's light count rather than from
|
|
32
|
+
* the maximum.
|
|
33
|
+
*
|
|
34
|
+
* **What that costs, arithmetic rather than estimate:** an octahedral layer is
|
|
35
|
+
* `OCTAHEDRAL_EDGE` squared at four bytes, 4.19 MB, and a casting rectangle takes two — one for
|
|
36
|
+
* the static world and one for the movers. 8.39 MB each, 33.6 MB if a world declares the full
|
|
37
|
+
* four, nothing at all for a world whose rectangles do not cast. The point pool at its own
|
|
38
|
+
* maximum is 58.7 MB for comparison.
|
|
39
|
+
*
|
|
40
|
+
* **Why two layers and not one.** A single layer would have to hold the static world and the
|
|
41
|
+
* movers together, so a person walking under the rectangle would re-bake six passes over the whole
|
|
42
|
+
* static scene every frame — `pointShadowBudget.ts` measured that shape at 89 ms and 99 ms in two
|
|
43
|
+
* consecutive frames against an 8.3 ms budget, and it is the reason point lights split the two in
|
|
44
|
+
* the first place. Movers alone are a handful of meshes, so the live layer is affordable every
|
|
45
|
+
* frame and the static one is baked once for a fixture that never moves.
|
|
46
|
+
*/
|
|
47
|
+
import type { AreaLightSource } from './areaLights.ts';
|
|
48
|
+
import { MAX_AREA_LIGHTS } from './areaLights.ts';
|
|
49
|
+
import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from './lightBudget.ts';
|
|
50
|
+
import { planPointShadowBakes, type BakeScratch } from './pointShadowBudget.ts';
|
|
51
|
+
import { DEFAULT_SOURCE_RADIUS, POINT_SHADOW_NEAR } from './pointShadowImage.ts';
|
|
52
|
+
|
|
53
|
+
/** A static layer and a live one. See the header for why it is not one. */
|
|
54
|
+
export const LAYERS_PER_AREA_LIGHT = 2;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* How many layers of the shared array a world's rectangles will take.
|
|
58
|
+
*
|
|
59
|
+
* Two per rectangle that declares it casts and names a range, and none for one that does not. A
|
|
60
|
+
* rectangle past `MAX_AREA_LIGHTS` is not shaded, so it gets no layer either — a layer for a light
|
|
61
|
+
* the loop never reaches is storage nothing can read.
|
|
62
|
+
*/
|
|
63
|
+
export function areaShadowLayerCount(lights: readonly AreaLightSource[]): number {
|
|
64
|
+
let casting = 0;
|
|
65
|
+
const count = Math.min(lights.length, MAX_AREA_LIGHTS);
|
|
66
|
+
for (let slot = 0; slot < count; slot++) {
|
|
67
|
+
if (castingRange(lights[slot]) > 0) casting++;
|
|
68
|
+
}
|
|
69
|
+
return casting * LAYERS_PER_AREA_LIGHT;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Where the area layers begin, given how many point lights the world has.
|
|
74
|
+
*
|
|
75
|
+
* **One function rather than the same expression written in three files**, which is the mistake
|
|
76
|
+
* `pointShadowImage.ts` records at `DEFAULT_SOURCE_RADIUS`: the array sizes itself, this set hands
|
|
77
|
+
* out indices, and the two disagreeing by one would have every rectangle sampling a lamp's map.
|
|
78
|
+
* Both call this.
|
|
79
|
+
*/
|
|
80
|
+
export function firstAreaShadowLayer(pointLightCount: number): number {
|
|
81
|
+
return Math.min(pointLightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The range a rectangle will actually cast over, or 0 for one that will not.
|
|
86
|
+
*
|
|
87
|
+
* **A declared `castsShadow` with no `shadowRange` counts as not casting**, because there is no
|
|
88
|
+
* honest far plane to invent for it — see the field. The renderer says so once by name; this
|
|
89
|
+
* function is only the predicate, and it is shared so the layer count and the map assignment
|
|
90
|
+
* cannot answer it differently.
|
|
91
|
+
*/
|
|
92
|
+
export function castingRange(light: AreaLightSource | undefined): number {
|
|
93
|
+
if (light === undefined) return 0;
|
|
94
|
+
if (light.castsShadow !== true) return 0;
|
|
95
|
+
const range = light.shadowRange;
|
|
96
|
+
if (range === undefined || !Number.isFinite(range) || range <= 0) return 0;
|
|
97
|
+
return range;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** What the shader is told about each rectangle's occlusion, filled once a frame. */
|
|
101
|
+
export interface ResolvedAreaShadows {
|
|
102
|
+
/** Which array layer holds this rectangle's static image, or -1 for none. */
|
|
103
|
+
readonly layer: Int32Array;
|
|
104
|
+
readonly far: Float32Array;
|
|
105
|
+
readonly near: Float32Array;
|
|
106
|
+
/** How present the image is, 0 to 1, so a fresh bake arrives rather than appears. */
|
|
107
|
+
readonly weight: Float32Array;
|
|
108
|
+
/** The same four for the layer holding movers only. */
|
|
109
|
+
readonly liveLayer: Int32Array;
|
|
110
|
+
readonly liveFar: Float32Array;
|
|
111
|
+
readonly liveNear: Float32Array;
|
|
112
|
+
readonly liveWeight: Float32Array;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function createResolvedAreaShadows(slots: number = MAX_AREA_LIGHTS): ResolvedAreaShadows {
|
|
116
|
+
return {
|
|
117
|
+
layer: new Int32Array(slots).fill(-1),
|
|
118
|
+
far: new Float32Array(slots).fill(1),
|
|
119
|
+
near: new Float32Array(slots).fill(POINT_SHADOW_NEAR),
|
|
120
|
+
weight: new Float32Array(slots),
|
|
121
|
+
liveLayer: new Int32Array(slots).fill(-1),
|
|
122
|
+
liveFar: new Float32Array(slots).fill(1),
|
|
123
|
+
liveNear: new Float32Array(slots).fill(POINT_SHADOW_NEAR),
|
|
124
|
+
liveWeight: new Float32Array(slots),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* What a map must answer for this set to schedule and publish it.
|
|
130
|
+
*
|
|
131
|
+
* Structurally exactly what `PointShadowMap` and `GpuPointShadowMap` already are, which is the
|
|
132
|
+
* point: an area light's map is a point light's map on a layer of the same array, so neither
|
|
133
|
+
* backend needs a second class and neither can drift from the other about staleness, arrival or
|
|
134
|
+
* resumption. All of that lives in `PointShadowImage`, inside both of them.
|
|
135
|
+
*/
|
|
136
|
+
export interface AreaShadowMap {
|
|
137
|
+
readonly layer: number;
|
|
138
|
+
readonly far: number;
|
|
139
|
+
readonly near: number;
|
|
140
|
+
readonly hasBaked: boolean;
|
|
141
|
+
readonly presence: number;
|
|
142
|
+
matchesSource(
|
|
143
|
+
x: number,
|
|
144
|
+
y: number,
|
|
145
|
+
z: number,
|
|
146
|
+
range: number,
|
|
147
|
+
near: number,
|
|
148
|
+
sourceRadius: number,
|
|
149
|
+
tolerance: number,
|
|
150
|
+
): boolean;
|
|
151
|
+
advance(dt: number): void;
|
|
152
|
+
forget(): void;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** The one thing this set cannot do itself: put faces of a world into a layer. */
|
|
156
|
+
export type BakeAreaFaces<M> = (
|
|
157
|
+
map: M,
|
|
158
|
+
light: AreaLightSource,
|
|
159
|
+
range: number,
|
|
160
|
+
near: number,
|
|
161
|
+
casters: unknown,
|
|
162
|
+
maxFaces: number,
|
|
163
|
+
) => number;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* The maps a world's casting rectangles hold, and when each of them re-bakes.
|
|
167
|
+
*
|
|
168
|
+
* Constructed with a factory rather than a device, for the reason `PointShadowSystem` is: every
|
|
169
|
+
* decision in here is about scheduling and none of it is about a texture, so both backends share
|
|
170
|
+
* this file and supply one callback each.
|
|
171
|
+
*/
|
|
172
|
+
export class AreaShadowSet<M extends AreaShadowMap> {
|
|
173
|
+
/** Indexed by area-light slot. `undefined` where that slot does not cast. */
|
|
174
|
+
private readonly statics: (M | undefined)[] = [];
|
|
175
|
+
private readonly lives: (M | undefined)[] = [];
|
|
176
|
+
/** What each slot was prepared for, so a changed declaration rebuilds rather than lies. */
|
|
177
|
+
private readonly ranges = new Float32Array(MAX_AREA_LIGHTS);
|
|
178
|
+
private firstLayer = -1;
|
|
179
|
+
|
|
180
|
+
constructor(
|
|
181
|
+
private readonly createMap: (layer: number) => M,
|
|
182
|
+
private readonly releaseMap: (map: M) => void,
|
|
183
|
+
) {}
|
|
184
|
+
|
|
185
|
+
/** How many slots currently hold a static map. For a renderer publishing its own state. */
|
|
186
|
+
get castingCount(): number {
|
|
187
|
+
let count = 0;
|
|
188
|
+
for (const map of this.statics) if (map !== undefined) count++;
|
|
189
|
+
return count;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Hand out layers for the rectangles that will cast. Called when the world's lights are known.
|
|
194
|
+
*
|
|
195
|
+
* **Rebuilt from scratch rather than patched**, because the layer a map owns is fixed for its
|
|
196
|
+
* life — `PointShadowMap.layer` is `readonly` and the shader is told an index — so a rectangle
|
|
197
|
+
* that starts or stops casting moves every layer after it. That happens at load, not per frame.
|
|
198
|
+
*/
|
|
199
|
+
prepare(lights: readonly AreaLightSource[], firstLayer: number): void {
|
|
200
|
+
this.release();
|
|
201
|
+
this.firstLayer = firstLayer;
|
|
202
|
+
const count = Math.min(lights.length, MAX_AREA_LIGHTS);
|
|
203
|
+
let next = firstLayer;
|
|
204
|
+
for (let slot = 0; slot < count; slot++) {
|
|
205
|
+
const range = castingRange(lights[slot]);
|
|
206
|
+
this.ranges[slot] = range;
|
|
207
|
+
if (range <= 0) continue;
|
|
208
|
+
this.statics[slot] = this.createMap(next++);
|
|
209
|
+
this.lives[slot] = this.createMap(next++);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** Throw every image away, keeping the layers. For an array that has just been rebuilt. */
|
|
214
|
+
forgetEveryImage(): void {
|
|
215
|
+
for (const map of this.statics) map?.forget();
|
|
216
|
+
for (const map of this.lives) map?.forget();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Give the layers back. */
|
|
220
|
+
release(): void {
|
|
221
|
+
for (const map of this.statics) if (map !== undefined) this.releaseMap(map);
|
|
222
|
+
for (const map of this.lives) if (map !== undefined) this.releaseMap(map);
|
|
223
|
+
this.statics.length = 0;
|
|
224
|
+
this.lives.length = 0;
|
|
225
|
+
this.ranges.fill(0);
|
|
226
|
+
this.firstLayer = -1;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Whether the layers handed out still match what these lights declare.
|
|
231
|
+
*
|
|
232
|
+
* A consumer that turns a rectangle's casting on, or moves one past `MAX_AREA_LIGHTS`, has
|
|
233
|
+
* changed the layout — and a set that carried on would publish a layer index belonging to
|
|
234
|
+
* another rectangle, which is another fixture's shadow under this one. The renderer re-prepares
|
|
235
|
+
* on a false answer, which is the same thing `prepareStaticPointShadows` does about a light
|
|
236
|
+
* count that grew.
|
|
237
|
+
*/
|
|
238
|
+
matchesDeclaration(lights: readonly AreaLightSource[]): boolean {
|
|
239
|
+
if (this.firstLayer < 0) return false;
|
|
240
|
+
const count = Math.min(lights.length, MAX_AREA_LIGHTS);
|
|
241
|
+
for (let slot = 0; slot < MAX_AREA_LIGHTS; slot++) {
|
|
242
|
+
const range = slot < count ? castingRange(lights[slot]) : 0;
|
|
243
|
+
const held = this.statics[slot] !== undefined;
|
|
244
|
+
if (range > 0 !== held) return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Spend a frame's faces across the casting rectangles, static maps first.
|
|
251
|
+
*
|
|
252
|
+
* **The static half is ordered by `planPointShadowBakes`, the same function the point pool
|
|
253
|
+
* uses**, so a rectangle with no image yet jumps ahead of one that has merely drifted — a map
|
|
254
|
+
* that has never baked contributes no occlusion at all, and every frame it waits is a frame with
|
|
255
|
+
* a rectangle visibly lighting through walls. Sharing the ordering rather than writing a second
|
|
256
|
+
* one is the 2026-08-13 rule: two implementations of one decision drift, and here the drift
|
|
257
|
+
* would be shadows arriving in a different order on the two backends, which no parity capture
|
|
258
|
+
* would attribute because both frames look plausible.
|
|
259
|
+
*
|
|
260
|
+
* **The live half has no staleness test, for the reason the point pool's does not**: the caster
|
|
261
|
+
* moved, which is what makes it live. It has a ceiling instead, round-robin across the
|
|
262
|
+
* rectangles, so a scene with four of them spends a bounded number of faces rather than
|
|
263
|
+
* twenty-four.
|
|
264
|
+
*/
|
|
265
|
+
update(
|
|
266
|
+
lights: readonly AreaLightSource[],
|
|
267
|
+
dt: number,
|
|
268
|
+
facesPerFrame: number,
|
|
269
|
+
liveFacesPerFrame: number,
|
|
270
|
+
rebakeDistance: number,
|
|
271
|
+
faceCount: number,
|
|
272
|
+
scratch: BakeScratch,
|
|
273
|
+
staticCasters: unknown,
|
|
274
|
+
dynamicCasters: unknown,
|
|
275
|
+
bake: BakeAreaFaces<M>,
|
|
276
|
+
): void {
|
|
277
|
+
const count = Math.min(lights.length, MAX_AREA_LIGHTS, scratch.stale.length);
|
|
278
|
+
|
|
279
|
+
/*
|
|
280
|
+
* Before the bakes, so an image completing this frame is published at no presence and ramps
|
|
281
|
+
* from there. `PointShadowSystem` advances in the same order and for the same reason:
|
|
282
|
+
* advancing afterwards hands a fresh image a frame's worth of weight on the frame it lands,
|
|
283
|
+
* which is most of the pop on a slow frame.
|
|
284
|
+
*/
|
|
285
|
+
for (let slot = 0; slot < count; slot++) {
|
|
286
|
+
this.statics[slot]?.advance(dt);
|
|
287
|
+
this.lives[slot]?.advance(dt);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
for (let slot = 0; slot < count; slot++) {
|
|
291
|
+
const light = lights[slot];
|
|
292
|
+
const map = this.statics[slot];
|
|
293
|
+
const range = castingRange(light);
|
|
294
|
+
const stale =
|
|
295
|
+
light !== undefined &&
|
|
296
|
+
map !== undefined &&
|
|
297
|
+
range > 0 &&
|
|
298
|
+
!map.matchesSource(
|
|
299
|
+
light.x,
|
|
300
|
+
light.y,
|
|
301
|
+
light.z,
|
|
302
|
+
range,
|
|
303
|
+
light.shadowNear ?? POINT_SHADOW_NEAR,
|
|
304
|
+
/*
|
|
305
|
+
* **`DEFAULT_SOURCE_RADIUS`, and it is not a rectangle's extent.** `matchesSource`
|
|
306
|
+
* compares what a map was baked *with*, and the bake is a depth render from the centre —
|
|
307
|
+
* the emitter's size never reaches it, being read by the filter in the shader instead.
|
|
308
|
+
* Passing the extent here would make the comparison a comparison against a number the
|
|
309
|
+
* bake does not use, and a rectangle whose half extents animate would then be stale
|
|
310
|
+
* every frame: six passes over the static world, for ever, for a picture that cannot
|
|
311
|
+
* change. `pointShadowImage.ts` records the same trap from the other side, two readers
|
|
312
|
+
* of this argument disagreeing about its default.
|
|
313
|
+
*/
|
|
314
|
+
DEFAULT_SOURCE_RADIUS,
|
|
315
|
+
rebakeDistance,
|
|
316
|
+
);
|
|
317
|
+
scratch.stale[slot] = stale ? 1 : 0;
|
|
318
|
+
scratch.ready[slot] = map !== undefined && map.hasBaked ? 1 : 0;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const planned = planPointShadowBakes(scratch.stale, scratch.ready, count, scratch.order);
|
|
322
|
+
let faces = facesPerFrame;
|
|
323
|
+
let urgentSpent = false;
|
|
324
|
+
for (let i = 0; i < planned && faces > 0; i++) {
|
|
325
|
+
const slot = scratch.order[i] ?? -1;
|
|
326
|
+
const light = slot >= 0 ? lights[slot] : undefined;
|
|
327
|
+
const map = slot >= 0 ? this.statics[slot] : undefined;
|
|
328
|
+
if (light === undefined || map === undefined) continue;
|
|
329
|
+
const range = castingRange(light);
|
|
330
|
+
if (range <= 0) continue;
|
|
331
|
+
/*
|
|
332
|
+
* A rectangle with no image at all gets the whole map in one frame, one such jump per
|
|
333
|
+
* frame — the point pool's rule, and it exists because a partial octahedral map is worse
|
|
334
|
+
* than none: half the sphere holds a shadow and half holds the far plane, so the floor is
|
|
335
|
+
* cut in two along a line that belongs to the projection rather than to the scene.
|
|
336
|
+
*/
|
|
337
|
+
const cold = scratch.ready[slot] === 0;
|
|
338
|
+
const budget = cold && !urgentSpent ? faceCount : faces;
|
|
339
|
+
if (cold && !urgentSpent) urgentSpent = true;
|
|
340
|
+
faces -= bake(
|
|
341
|
+
map,
|
|
342
|
+
light,
|
|
343
|
+
range,
|
|
344
|
+
light.shadowNear ?? POINT_SHADOW_NEAR,
|
|
345
|
+
staticCasters,
|
|
346
|
+
Math.min(budget, faceCount),
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
let liveFaces = Math.max(1, liveFacesPerFrame);
|
|
351
|
+
for (let slot = 0; slot < count && liveFaces > 0; slot++) {
|
|
352
|
+
const light = lights[slot];
|
|
353
|
+
const map = this.lives[slot];
|
|
354
|
+
if (light === undefined || map === undefined) continue;
|
|
355
|
+
const range = castingRange(light);
|
|
356
|
+
if (range <= 0) continue;
|
|
357
|
+
liveFaces -= bake(
|
|
358
|
+
map,
|
|
359
|
+
light,
|
|
360
|
+
range,
|
|
361
|
+
light.shadowNear ?? POINT_SHADOW_NEAR,
|
|
362
|
+
dynamicCasters,
|
|
363
|
+
Math.min(liveFaces, faceCount),
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Publish what the shader should read, per area-light slot.
|
|
370
|
+
*
|
|
371
|
+
* **The far plane and the near plane come off the map rather than off the light**, which is the
|
|
372
|
+
* trap `PointShadowImage.planBake` was written for: a bake in flight owns the parameters it
|
|
373
|
+
* started with, so a rectangle whose range changed mid-bake has a map holding faces rendered
|
|
374
|
+
* under the old one. Publishing the declaration would pair new numbers with old pixels, and what
|
|
375
|
+
* that looks like is a shadow at the wrong distance rather than an error.
|
|
376
|
+
*
|
|
377
|
+
* **A map with no image publishes -1** rather than a layer at zero weight. Zero weight would
|
|
378
|
+
* make the fetch harmless and it would still *be* a fetch, of a layer holding whatever
|
|
379
|
+
* `texStorage3D` left there.
|
|
380
|
+
*/
|
|
381
|
+
resolve(lights: readonly AreaLightSource[], out: ResolvedAreaShadows): void {
|
|
382
|
+
const slots = out.layer.length;
|
|
383
|
+
const count = Math.min(lights.length, MAX_AREA_LIGHTS, slots);
|
|
384
|
+
out.layer.fill(-1);
|
|
385
|
+
out.liveLayer.fill(-1);
|
|
386
|
+
out.weight.fill(0);
|
|
387
|
+
out.liveWeight.fill(0);
|
|
388
|
+
for (let slot = 0; slot < count; slot++) {
|
|
389
|
+
const map = this.statics[slot];
|
|
390
|
+
if (map !== undefined && map.hasBaked) {
|
|
391
|
+
out.layer[slot] = map.layer;
|
|
392
|
+
out.far[slot] = map.far;
|
|
393
|
+
out.near[slot] = map.near;
|
|
394
|
+
out.weight[slot] = map.presence;
|
|
395
|
+
}
|
|
396
|
+
const live = this.lives[slot];
|
|
397
|
+
if (live !== undefined && live.hasBaked) {
|
|
398
|
+
out.liveLayer[slot] = live.layer;
|
|
399
|
+
out.liveFar[slot] = live.far;
|
|
400
|
+
out.liveNear[slot] = live.near;
|
|
401
|
+
out.liveWeight[slot] = live.presence;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { Vec3 } from '../math/color.ts';
|
|
2
|
+
|
|
3
|
+
/** Optional camera medium layered over an environment's ordinary air fog. */
|
|
4
|
+
export interface UnderwaterAtmosphere {
|
|
5
|
+
/** Resting water-surface height in world metres. */
|
|
6
|
+
surfaceY: number;
|
|
7
|
+
/** Colour distant light converges toward inside the water column. */
|
|
8
|
+
color: Vec3;
|
|
9
|
+
/** Squared-exponential density inside the water column. */
|
|
10
|
+
fogDensity: number;
|
|
11
|
+
/** Half-width of the smooth air↔water transition around the surface. */
|
|
12
|
+
transitionDepth: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Atmosphere fields shared by every visible render pass. */
|
|
16
|
+
export interface Atmosphere {
|
|
17
|
+
fogColor: Vec3;
|
|
18
|
+
/**
|
|
19
|
+
* Extinction per metre **at `fogBaseY`**, not at the camera. Air thins with
|
|
20
|
+
* height (see `fogHeightFalloff`), so the authored number describes the haze
|
|
21
|
+
* where it is thickest and the camera's altitude does the rest.
|
|
22
|
+
*/
|
|
23
|
+
fogDensity: number;
|
|
24
|
+
/**
|
|
25
|
+
* Reciprocal scale height of the haze, per metre: density at height `y` is
|
|
26
|
+
* `fogDensity · exp(−(y − fogBaseY) · fogHeightFalloff)`. **0 is a uniform
|
|
27
|
+
* medium**, which is what an authored vista or an indoor scene wants.
|
|
28
|
+
*
|
|
29
|
+
* Real aerial perspective thins with altitude because there is less air above
|
|
30
|
+
* you, and that is the whole difference between looking along a valley and
|
|
31
|
+
* looking down a mountain. A world with no vertical extent cannot tell the two
|
|
32
|
+
* apart and does not need this; one with 232 m of band very much does.
|
|
33
|
+
*/
|
|
34
|
+
fogHeightFalloff: number;
|
|
35
|
+
/** The height the haze is thickest at — the sea, usually. */
|
|
36
|
+
fogBaseY: number;
|
|
37
|
+
/**
|
|
38
|
+
* Which curve the haze follows. Absent means `exponential`, which is the physical one
|
|
39
|
+
* and what every existing world is authored against.
|
|
40
|
+
*
|
|
41
|
+
* `linear` swaps the medium for a depth ramp between `fogNear` and `fogFar`: nothing at
|
|
42
|
+
* all closer than `fogNear`, the fog colour entirely at `fogFar`. It exists because that
|
|
43
|
+
* is a distinct *look* rather than an approximation of this one — a hard clear near
|
|
44
|
+
* field is not something an extinction curve can produce at any density.
|
|
45
|
+
*/
|
|
46
|
+
fogMode?: 'exponential' | 'linear';
|
|
47
|
+
/** Linear mode only: where haze begins, and where it is total. */
|
|
48
|
+
fogNear?: number;
|
|
49
|
+
fogFar?: number;
|
|
50
|
+
underwater: UnderwaterAtmosphere | null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The extinction the camera is actually standing in.
|
|
55
|
+
*
|
|
56
|
+
* Precomputed here rather than in seven shaders: the exponential is the same for
|
|
57
|
+
* every fragment of the frame, and a fragment only needs its *own* height relative
|
|
58
|
+
* to the eye to finish the ray integral.
|
|
59
|
+
*/
|
|
60
|
+
export function fogDensityAtEye(atmosphere: Atmosphere, cameraY: number): number {
|
|
61
|
+
if (atmosphere.fogHeightFalloff === 0) return atmosphere.fogDensity;
|
|
62
|
+
return (
|
|
63
|
+
atmosphere.fogDensity * Math.exp(-(cameraY - atmosphere.fogBaseY) * atmosphere.fogHeightFalloff)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The medium as a shader reads it: ten numbers, no graphics API in sight.
|
|
69
|
+
*
|
|
70
|
+
* **Separated from the binding so a second backend can reach the same decision.**
|
|
71
|
+
* `bindAtmosphere` below exists so that mesh, sky, water and plume programs cannot drift into
|
|
72
|
+
* separate medium-selection rules — and a backend that cannot call it, having no
|
|
73
|
+
* `WebGL2RenderingContext`, is exactly the drift that argument was written against. WebGPU
|
|
74
|
+
* writes these into a uniform block; WebGL2 hands them to `uniform3fv`. One decision, two
|
|
75
|
+
* bindings.
|
|
76
|
+
*/
|
|
77
|
+
export interface ResolvedAtmosphere {
|
|
78
|
+
readonly fogColor: Float32Array;
|
|
79
|
+
fogDensity: number;
|
|
80
|
+
fogHeightFalloff: number;
|
|
81
|
+
fogEyeY: number;
|
|
82
|
+
/** 1 for `linear`, 0 for the exponential medium. An `int` uniform on both backends. */
|
|
83
|
+
fogMode: number;
|
|
84
|
+
fogNear: number;
|
|
85
|
+
fogFar: number;
|
|
86
|
+
readonly underwaterColor: Float32Array;
|
|
87
|
+
underwaterFogDensity: number;
|
|
88
|
+
underwaterFactor: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Select the camera's medium, into a target the caller owns.
|
|
93
|
+
*
|
|
94
|
+
* **Filled rather than returned, because both callers are per-frame paths** and `AGENTS.md`
|
|
95
|
+
* allows no allocation in one. Each backend keeps a single `ResolvedAtmosphere` and refills
|
|
96
|
+
* it; nothing here allocates and nothing is shared between them.
|
|
97
|
+
*/
|
|
98
|
+
export function resolveAtmosphere(
|
|
99
|
+
atmosphere: Atmosphere,
|
|
100
|
+
cameraY: number,
|
|
101
|
+
underwaterEnabled: boolean,
|
|
102
|
+
out: ResolvedAtmosphere,
|
|
103
|
+
): ResolvedAtmosphere {
|
|
104
|
+
/*
|
|
105
|
+
* `?? null`, because a field a caller left off is `undefined` rather than `null` and the
|
|
106
|
+
* test below only excluded one of the two.
|
|
107
|
+
*
|
|
108
|
+
* The type says `UnderwaterAtmosphere | null` and a TypeScript consumer cannot omit it, but
|
|
109
|
+
* this runs inside the frame loop, where `AGENTS.md` allows no throw at all — and the callers
|
|
110
|
+
* are plain objects that a JavaScript consumer, a partially-built world or a fixture is free
|
|
111
|
+
* to hand over incomplete. Reading `.transitionDepth` off `undefined` throws, and one throw
|
|
112
|
+
* in a `requestAnimationFrame` loop is sixty a second in somebody's error reporting. Found by
|
|
113
|
+
* a renderer test whose stub environment omitted the field, on the frame `drawSky` started
|
|
114
|
+
* asking for the medium at all.
|
|
115
|
+
*/
|
|
116
|
+
const underwater = atmosphere.underwater ?? null;
|
|
117
|
+
let factor = 0;
|
|
118
|
+
if (underwaterEnabled && underwater !== null) {
|
|
119
|
+
const transition = underwater.transitionDepth;
|
|
120
|
+
if (transition > 0) {
|
|
121
|
+
factor = Math.min(
|
|
122
|
+
Math.max((underwater.surfaceY + transition - cameraY) / (transition * 2), 0),
|
|
123
|
+
1,
|
|
124
|
+
);
|
|
125
|
+
} else {
|
|
126
|
+
factor = cameraY < underwater.surfaceY ? 1 : 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
out.fogColor.set(atmosphere.fogColor);
|
|
131
|
+
out.fogDensity = fogDensityAtEye(atmosphere, cameraY);
|
|
132
|
+
out.fogHeightFalloff = atmosphere.fogHeightFalloff;
|
|
133
|
+
out.fogEyeY = cameraY;
|
|
134
|
+
out.fogMode = atmosphere.fogMode === 'linear' ? 1 : 0;
|
|
135
|
+
out.fogNear = atmosphere.fogNear ?? 0;
|
|
136
|
+
out.fogFar = atmosphere.fogFar ?? 1;
|
|
137
|
+
/*
|
|
138
|
+
* The air medium stands in when nothing is submerged. The shaders multiply by the factor
|
|
139
|
+
* rather than branching on it, so these slots are read at factor zero and cannot be left
|
|
140
|
+
* holding whatever was there before.
|
|
141
|
+
*/
|
|
142
|
+
out.underwaterColor.set(underwater === null ? atmosphere.fogColor : underwater.color);
|
|
143
|
+
out.underwaterFogDensity = underwater === null ? atmosphere.fogDensity : underwater.fogDensity;
|
|
144
|
+
out.underwaterFactor = factor;
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** One per GL binder, refilled per call. See `resolveAtmosphere` on why it is not allocated. */
|
|
149
|
+
const glResolved: ResolvedAtmosphere = {
|
|
150
|
+
fogColor: new Float32Array(3),
|
|
151
|
+
underwaterColor: new Float32Array(3),
|
|
152
|
+
fogDensity: 0,
|
|
153
|
+
fogHeightFalloff: 0,
|
|
154
|
+
fogEyeY: 0,
|
|
155
|
+
fogMode: 0,
|
|
156
|
+
fogNear: 0,
|
|
157
|
+
fogFar: 1,
|
|
158
|
+
underwaterFogDensity: 0,
|
|
159
|
+
underwaterFactor: 0,
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Bind the same camera medium to any shader that declares atmosphere uniforms.
|
|
164
|
+
* Missing optional uniforms are harmless WebGL null locations, so mesh, sky,
|
|
165
|
+
* water and plume programs cannot drift into separate medium-selection rules.
|
|
166
|
+
*/
|
|
167
|
+
export function bindAtmosphere(
|
|
168
|
+
gl: WebGL2RenderingContext,
|
|
169
|
+
uniforms: Record<string, WebGLUniformLocation>,
|
|
170
|
+
atmosphere: Atmosphere,
|
|
171
|
+
cameraY: number,
|
|
172
|
+
underwaterEnabled: boolean,
|
|
173
|
+
): void {
|
|
174
|
+
const m = resolveAtmosphere(atmosphere, cameraY, underwaterEnabled, glResolved);
|
|
175
|
+
|
|
176
|
+
gl.uniform3fv(uniforms['uFogColor'] ?? null, m.fogColor);
|
|
177
|
+
gl.uniform1f(uniforms['uFogDensity'] ?? null, m.fogDensity);
|
|
178
|
+
gl.uniform1f(uniforms['uFogHeightFalloff'] ?? null, m.fogHeightFalloff);
|
|
179
|
+
gl.uniform1f(uniforms['uFogEyeY'] ?? null, m.fogEyeY);
|
|
180
|
+
gl.uniform1i(uniforms['uFogMode'] ?? null, m.fogMode);
|
|
181
|
+
gl.uniform1f(uniforms['uFogNear'] ?? null, m.fogNear);
|
|
182
|
+
gl.uniform1f(uniforms['uFogFar'] ?? null, m.fogFar);
|
|
183
|
+
gl.uniform3fv(uniforms['uUnderwaterColor'] ?? null, m.underwaterColor);
|
|
184
|
+
gl.uniform1f(uniforms['uUnderwaterFogDensity'] ?? null, m.underwaterFogDensity);
|
|
185
|
+
gl.uniform1f(uniforms['uUnderwaterFactor'] ?? null, m.underwaterFactor);
|
|
186
|
+
}
|