@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,276 @@
|
|
|
1
|
+
import { mat3 } from 'gl-matrix';
|
|
2
|
+
|
|
3
|
+
import { createEmptyTexture2D } from './emptyTexture.ts';
|
|
4
|
+
import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from './lightBudget.ts';
|
|
5
|
+
import { pointShadowFaceRotation } from './pointShadowImage.ts';
|
|
6
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
7
|
+
import { OCTAHEDRAL_RESOLVE_FRAG, OCTAHEDRAL_RESOLVE_VERT } from './shaders/octahedralResolve.ts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The edge of one light's octahedral map.
|
|
11
|
+
*
|
|
12
|
+
* Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
|
|
13
|
+
* cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
|
|
14
|
+
* 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
|
|
15
|
+
* is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
|
|
16
|
+
*/
|
|
17
|
+
export const OCTAHEDRAL_EDGE = 1024;
|
|
18
|
+
|
|
19
|
+
/** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
|
|
20
|
+
const faceRotation = mat3.create();
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* What a `PointShadowMap` needs of the array: somewhere to render a face, and somewhere to put it.
|
|
24
|
+
*
|
|
25
|
+
* An interface rather than the class, so a map can be built without a device at all — the pooling
|
|
26
|
+
* rules are worth testing on their own and none of them is about a texture.
|
|
27
|
+
*/
|
|
28
|
+
export interface PointShadowTarget {
|
|
29
|
+
beginFace(gl: WebGL2RenderingContext): void;
|
|
30
|
+
resolveFace(
|
|
31
|
+
gl: WebGL2RenderingContext,
|
|
32
|
+
layer: number,
|
|
33
|
+
face: number,
|
|
34
|
+
far: number,
|
|
35
|
+
near: number,
|
|
36
|
+
): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Every point light's shadow as one array texture, and the scratch that fills it.
|
|
41
|
+
*
|
|
42
|
+
* **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
|
|
43
|
+
* the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
|
|
44
|
+
* region of the map is disjoint from the other five and is written in full the moment that face is
|
|
45
|
+
* resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
|
|
46
|
+
* how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
|
|
47
|
+
* second face to still be around.
|
|
48
|
+
*
|
|
49
|
+
* **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
|
|
50
|
+
* check is per texture object rather than per image: a draw that samples the array while any layer
|
|
51
|
+
* of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
|
|
52
|
+
* before this file existed. So the resolve reads the scratch and writes the array, and the two are
|
|
53
|
+
* never the same object.
|
|
54
|
+
*/
|
|
55
|
+
export class PointShadowArray implements PointShadowTarget {
|
|
56
|
+
readonly texture: WebGLTexture;
|
|
57
|
+
/**
|
|
58
|
+
* How many layers this array holds: the point pool, the two live transition maps, and two more
|
|
59
|
+
* for each rectangle a world said would cast. See the constructor's `extraLayers`.
|
|
60
|
+
*/
|
|
61
|
+
readonly layers: number;
|
|
62
|
+
|
|
63
|
+
private readonly framebuffer: WebGLFramebuffer;
|
|
64
|
+
private readonly scratchTexture: WebGLTexture;
|
|
65
|
+
private readonly scratchFramebuffer: WebGLFramebuffer;
|
|
66
|
+
/** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
|
|
67
|
+
private readonly parked: WebGLTexture;
|
|
68
|
+
private readonly faceSize: number;
|
|
69
|
+
private readonly program: WebGLProgram;
|
|
70
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
71
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
72
|
+
|
|
73
|
+
constructor(
|
|
74
|
+
gl: WebGL2RenderingContext,
|
|
75
|
+
faceSize: number,
|
|
76
|
+
lightCount: number,
|
|
77
|
+
/**
|
|
78
|
+
* Layers above the point pool, for the rectangles a world says will cast.
|
|
79
|
+
*
|
|
80
|
+
* **Sized from the declaration for the same reason the point half is**, and it is the whole of
|
|
81
|
+
* what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
|
|
82
|
+
* and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
|
|
83
|
+
* allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
|
|
84
|
+
* is the same expression as the line below — one function, because the array sizing itself and
|
|
85
|
+
* the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
|
|
86
|
+
* map.
|
|
87
|
+
*/
|
|
88
|
+
extraLayers = 0,
|
|
89
|
+
) {
|
|
90
|
+
this.faceSize = faceSize;
|
|
91
|
+
/*
|
|
92
|
+
* Sized from the world rather than from the maximum. `texStorage3D` is immutable, so the
|
|
93
|
+
* alternative is handing a three-light world the storage for twenty-two — which is the mistake
|
|
94
|
+
* `lightBudget.ts` calls the most expensive the renderer has made, wearing a new shape.
|
|
95
|
+
*/
|
|
96
|
+
this.layers =
|
|
97
|
+
Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
|
|
98
|
+
|
|
99
|
+
const texture = gl.createTexture();
|
|
100
|
+
if (texture === null) throw new Error('PointShadowArray: createTexture failed');
|
|
101
|
+
this.texture = texture;
|
|
102
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
|
|
103
|
+
gl.texStorage3D(
|
|
104
|
+
gl.TEXTURE_2D_ARRAY,
|
|
105
|
+
1,
|
|
106
|
+
gl.DEPTH_COMPONENT24,
|
|
107
|
+
OCTAHEDRAL_EDGE,
|
|
108
|
+
OCTAHEDRAL_EDGE,
|
|
109
|
+
this.layers,
|
|
110
|
+
);
|
|
111
|
+
/* One storage level and no filtering, so textureLod(..., 0.0) is the only fetch there is. */
|
|
112
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
113
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
114
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
115
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
116
|
+
|
|
117
|
+
const scratchTexture = gl.createTexture();
|
|
118
|
+
if (scratchTexture === null) throw new Error('PointShadowArray: createTexture failed');
|
|
119
|
+
this.scratchTexture = scratchTexture;
|
|
120
|
+
gl.bindTexture(gl.TEXTURE_2D, scratchTexture);
|
|
121
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.DEPTH_COMPONENT24, faceSize, faceSize);
|
|
122
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
123
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
124
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
125
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
126
|
+
|
|
127
|
+
this.parked = createEmptyTexture2D(gl);
|
|
128
|
+
|
|
129
|
+
const scratchFramebuffer = gl.createFramebuffer();
|
|
130
|
+
if (scratchFramebuffer === null) throw new Error('PointShadowArray: createFramebuffer failed');
|
|
131
|
+
this.scratchFramebuffer = scratchFramebuffer;
|
|
132
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, scratchFramebuffer);
|
|
133
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, scratchTexture, 0);
|
|
134
|
+
/* Depth-only: without this WebGL expects a colour attachment. */
|
|
135
|
+
gl.drawBuffers([gl.NONE]);
|
|
136
|
+
gl.readBuffer(gl.NONE);
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* The resolve program, built **before** the completeness check below, because that check may
|
|
140
|
+
* return early on a lost context and every field has to be assigned by then. `PointShadowMap`
|
|
141
|
+
* and `ShadowMap` both hold that shape; here it is load-bearing rather than incidental, since
|
|
142
|
+
* `program`, `uniforms` and `vao` are all `readonly`.
|
|
143
|
+
*/
|
|
144
|
+
this.program = compileProgram(
|
|
145
|
+
gl,
|
|
146
|
+
OCTAHEDRAL_RESOLVE_VERT,
|
|
147
|
+
OCTAHEDRAL_RESOLVE_FRAG,
|
|
148
|
+
'octahedralResolve',
|
|
149
|
+
);
|
|
150
|
+
this.uniforms = uniformLocations(gl, this.program, 'octahedralResolve');
|
|
151
|
+
const vao = gl.createVertexArray();
|
|
152
|
+
if (vao === null) throw new Error('PointShadowArray: createVertexArray failed');
|
|
153
|
+
this.vao = vao;
|
|
154
|
+
|
|
155
|
+
const framebuffer = gl.createFramebuffer();
|
|
156
|
+
if (framebuffer === null) throw new Error('PointShadowArray: createFramebuffer failed');
|
|
157
|
+
this.framebuffer = framebuffer;
|
|
158
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
159
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, texture, 0, 0);
|
|
160
|
+
gl.drawBuffers([gl.NONE]);
|
|
161
|
+
gl.readBuffer(gl.NONE);
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* Asked once, here, for the reason `pointShadowMap.ts` records at length: it is a synchronous
|
|
165
|
+
* query, so the driver must drain what it has queued before it can answer, and asking it per
|
|
166
|
+
* face put a pipeline flush inside the render loop for the life of the session — 95.6% of a
|
|
167
|
+
* 69 ms frame. Every layer shares one texture, one size and one format, so a configuration
|
|
168
|
+
* complete for layer 0 is complete for all of them, and nothing about that can change later.
|
|
169
|
+
*/
|
|
170
|
+
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
|
|
171
|
+
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
172
|
+
/*
|
|
173
|
+
* A lost context reports every attachment unusable, and that is not a misconfiguration the
|
|
174
|
+
* caller can fix — see `planarReflection.ts`. Init still throws, because the context cannot
|
|
175
|
+
* be lost before it exists.
|
|
176
|
+
*/
|
|
177
|
+
if (gl.isContextLost()) return;
|
|
178
|
+
throw new Error(`PointShadowArray: framebuffer incomplete (0x${status.toString(16)})`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
182
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
183
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Bind the scratch as the render target for one face of one bake, and clear it.
|
|
188
|
+
*
|
|
189
|
+
* **The previous face's resolve left the scratch bound for sampling, and it is about to be the
|
|
190
|
+
* target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
|
|
191
|
+
* `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
|
|
192
|
+
* because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
|
|
193
|
+
* enough whether the shader branch reads it or not. Found by capturing `night-court` and
|
|
194
|
+
* `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
|
|
195
|
+
* nothing stale to bake.
|
|
196
|
+
*
|
|
197
|
+
* `beginShadowPass` carries the identical fix for the directional maps, and this is the same
|
|
198
|
+
* rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
|
|
199
|
+
* is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
|
|
200
|
+
* would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
|
|
201
|
+
*/
|
|
202
|
+
beginFace(gl: WebGL2RenderingContext): void {
|
|
203
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
204
|
+
gl.bindTexture(gl.TEXTURE_2D, this.parked);
|
|
205
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
|
|
206
|
+
gl.viewport(0, 0, this.faceSize, this.faceSize);
|
|
207
|
+
gl.clear(gl.DEPTH_BUFFER_BIT);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Write the scratch's contents into `layer`'s region for `face`.
|
|
212
|
+
*
|
|
213
|
+
* `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
|
|
214
|
+
* the previous bake of this light left in it, so a fragment that lost a comparison would leave
|
|
215
|
+
* half of one image and half of another — a shadow baked around two different places at once,
|
|
216
|
+
* which is the failure `PointShadowImage.planBake` exists to prevent one level up.
|
|
217
|
+
*
|
|
218
|
+
* Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
|
|
219
|
+
* from an empty vertex array.
|
|
220
|
+
*/
|
|
221
|
+
resolveFace(
|
|
222
|
+
gl: WebGL2RenderingContext,
|
|
223
|
+
layer: number,
|
|
224
|
+
face: number,
|
|
225
|
+
far: number,
|
|
226
|
+
near: number,
|
|
227
|
+
): void {
|
|
228
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
229
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, this.texture, 0, layer);
|
|
230
|
+
gl.viewport(0, 0, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE);
|
|
231
|
+
|
|
232
|
+
gl.useProgram(this.program);
|
|
233
|
+
gl.bindVertexArray(this.vao);
|
|
234
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
235
|
+
gl.bindTexture(gl.TEXTURE_2D, this.scratchTexture);
|
|
236
|
+
gl.uniform1i(this.uniforms['uFace'] ?? null, 0);
|
|
237
|
+
gl.uniform1i(this.uniforms['uFaceIndex'] ?? null, face);
|
|
238
|
+
gl.uniformMatrix3fv(
|
|
239
|
+
this.uniforms['uFaceRotation'] ?? null,
|
|
240
|
+
false,
|
|
241
|
+
pointShadowFaceRotation(face, faceRotation),
|
|
242
|
+
);
|
|
243
|
+
gl.uniform1f(this.uniforms['uFar'] ?? null, far);
|
|
244
|
+
gl.uniform1f(this.uniforms['uNear'] ?? null, near);
|
|
245
|
+
gl.uniform1f(this.uniforms['uEdge'] ?? null, OCTAHEDRAL_EDGE);
|
|
246
|
+
|
|
247
|
+
gl.disable(gl.CULL_FACE);
|
|
248
|
+
gl.enable(gl.DEPTH_TEST);
|
|
249
|
+
gl.depthMask(true);
|
|
250
|
+
/*
|
|
251
|
+
* **Saved and restored rather than put back to a named compare.** This used to end with
|
|
252
|
+
* `depthFunc(LESS)`, which was the frame's compare when it was written and stopped being it
|
|
253
|
+
* the moment the engine could draw reversed: after one point-shadow copy the whole rest of the
|
|
254
|
+
* frame tested the wrong way, and a scene with point shadows lost most of its pixels. Reading
|
|
255
|
+
* the state back costs one `getParameter` on a path that already binds a framebuffer, and it
|
|
256
|
+
* cannot go stale the way a constant can.
|
|
257
|
+
*/
|
|
258
|
+
const wasDepthFunc = gl.getParameter(gl.DEPTH_FUNC) as number;
|
|
259
|
+
gl.depthFunc(gl.ALWAYS);
|
|
260
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
261
|
+
gl.depthFunc(wasDepthFunc);
|
|
262
|
+
|
|
263
|
+
gl.bindVertexArray(null);
|
|
264
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
268
|
+
gl.deleteFramebuffer(this.framebuffer);
|
|
269
|
+
gl.deleteFramebuffer(this.scratchFramebuffer);
|
|
270
|
+
gl.deleteTexture(this.texture);
|
|
271
|
+
gl.deleteTexture(this.scratchTexture);
|
|
272
|
+
gl.deleteTexture(this.parked);
|
|
273
|
+
gl.deleteProgram(this.program);
|
|
274
|
+
gl.deleteVertexArray(this.vao);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which point-shadow maps get to bake this frame, and in what order.
|
|
3
|
+
*
|
|
4
|
+
* Baking is six full passes over the static world per light, and the renderer used to
|
|
5
|
+
* do every stale one in the frame it noticed. That is fine in the steady state, where
|
|
6
|
+
* nothing is stale, and catastrophic on the frame it stops being true: walking into a
|
|
7
|
+
* courtyard makes eight lights stale at once, which is 48 passes in one frame. Measured on
|
|
8
|
+
* a fast machine at boot, that was two consecutive frames of 89 ms and 99 ms against an
|
|
9
|
+
* 8.3 ms budget — the hitch about a second after a page load, and a smaller one each
|
|
10
|
+
* time a new cluster of lamps comes into range.
|
|
11
|
+
*
|
|
12
|
+
* Spreading the same work over more frames costs nothing anybody can see. Eight lights
|
|
13
|
+
* at two faces a frame is 24 frames, a fifth of a second at 120 Hz, during which
|
|
14
|
+
* shadows resolve progressively instead of the whole game stopping.
|
|
15
|
+
*
|
|
16
|
+
* This module only decides the *order*. The renderer spends a face budget walking it,
|
|
17
|
+
* because lights need different numbers of faces depending on how far through a bake
|
|
18
|
+
* they already are.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Order the stale maps so the ones with nothing to show go first.
|
|
23
|
+
*
|
|
24
|
+
* A light whose map has never been baked contributes no shadow at all until it has one
|
|
25
|
+
* (see `PointShadowSystem.bind`), so every frame it waits is a frame with a visibly
|
|
26
|
+
* unlit lamp. A light that has merely drifted past the rebake tolerance is still
|
|
27
|
+
* sampling a perfectly reasonable map from a few centimetres away, and can wait.
|
|
28
|
+
* Serving the second kind first would hold a missing shadow hostage to a nearly
|
|
29
|
+
* invisible correction.
|
|
30
|
+
*
|
|
31
|
+
* Within each group the caller's order is preserved, which is the shading pass's own
|
|
32
|
+
* light order and therefore already sorted by how much each light matters.
|
|
33
|
+
*
|
|
34
|
+
* Writes into `out` and returns how many entries it wrote; allocation-free because this
|
|
35
|
+
* runs every frame.
|
|
36
|
+
*/
|
|
37
|
+
export function planPointShadowBakes(
|
|
38
|
+
/** 1 where the map at that slot needs baking. */
|
|
39
|
+
stale: Uint8Array,
|
|
40
|
+
/** 1 where the map at that slot already holds a usable image. */
|
|
41
|
+
ready: Uint8Array,
|
|
42
|
+
count: number,
|
|
43
|
+
out: Int32Array,
|
|
44
|
+
/**
|
|
45
|
+
* 1 where this slot's map has gone stale on every recent frame.
|
|
46
|
+
*
|
|
47
|
+
* Optional: a caller that omits it gets the two-group order this had before.
|
|
48
|
+
*/
|
|
49
|
+
chronic?: Uint8Array,
|
|
50
|
+
): number {
|
|
51
|
+
let written = 0;
|
|
52
|
+
// Never baked: nothing to sample until this lands.
|
|
53
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
54
|
+
if (stale[slot] === 1 && ready[slot] !== 1) out[written++] = slot;
|
|
55
|
+
}
|
|
56
|
+
// Baked but drifted: correcting an image that is already close to right.
|
|
57
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
58
|
+
if (stale[slot] === 1 && ready[slot] === 1 && chronic?.[slot] !== 1) out[written++] = slot;
|
|
59
|
+
}
|
|
60
|
+
/*
|
|
61
|
+
* Last: the maps that will be stale again next frame whatever is done for them.
|
|
62
|
+
*
|
|
63
|
+
* A light that moves, or breathes its radius, invalidates its own map every frame — so
|
|
64
|
+
* a bake buys it one frame and is owed again immediately. Ordered by the caller's
|
|
65
|
+
* importance alone, which is all the drifted group above uses, such a light sits
|
|
66
|
+
* permanently ahead of a static one that drifted once and would then stay correct for
|
|
67
|
+
* an hour; it takes the spread budget forever and the static one never gets its
|
|
68
|
+
* correction. Importance is the right tie-break between two maps that will *keep* what
|
|
69
|
+
* they are given, and the wrong one when only one of them will.
|
|
70
|
+
*
|
|
71
|
+
* They are still served, and served in full when budget is left over, so a light that
|
|
72
|
+
* settles catches up on the next frame. They simply cannot hold a settling light
|
|
73
|
+
* hostage any more.
|
|
74
|
+
*
|
|
75
|
+
* This is the scheduling half of the problem only. Whether a light is *worth* a cubemap
|
|
76
|
+
* at all — a floor-level marker, a lamp riding a camera, a creature standing inside
|
|
77
|
+
* its own glow — is a question about the content, and `castsShadow` is where a consumer
|
|
78
|
+
* answers it. No ordering can.
|
|
79
|
+
*/
|
|
80
|
+
if (chronic !== undefined) {
|
|
81
|
+
for (let slot = 0; slot < count && written < out.length; slot++) {
|
|
82
|
+
if (stale[slot] === 1 && ready[slot] === 1 && chronic[slot] === 1) out[written++] = slot;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return written;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The shaded lights that also cast, in the order they were shaded.
|
|
90
|
+
*
|
|
91
|
+
* `castsShadow: false` says a light is not worth a cubemap. `selectPointLights` honours
|
|
92
|
+
* that when it builds the *eligible* list, and that was taken for the whole promise — but
|
|
93
|
+
* the shaded set is a different list, a caller hands it to `updatePointShadows` as the set
|
|
94
|
+
* to bind, and a light in it was given a pool slot and baked whatever it had declared. So
|
|
95
|
+
* the flag held for a lamp out of range and quietly failed for the one in front of you,
|
|
96
|
+
* which is the only one whose bake is visible.
|
|
97
|
+
*
|
|
98
|
+
* It showed up as a shadow with nothing to throw it — a lamp that rides the camera
|
|
99
|
+
* declines to cast for exactly that reason, and cast anyway.
|
|
100
|
+
*
|
|
101
|
+
* Writes into `out` and returns how many it wrote; allocation-free, because this runs
|
|
102
|
+
* every frame.
|
|
103
|
+
*/
|
|
104
|
+
export function selectCastingLights(
|
|
105
|
+
lights: readonly { castsShadow?: boolean }[],
|
|
106
|
+
activeWorldIndices: Int32Array,
|
|
107
|
+
activeCount: number,
|
|
108
|
+
out: Int32Array,
|
|
109
|
+
): number {
|
|
110
|
+
let written = 0;
|
|
111
|
+
for (let i = 0; i < activeCount && written < out.length; i++) {
|
|
112
|
+
const worldIndex = activeWorldIndices[i] ?? -1;
|
|
113
|
+
if (worldIndex < 0) continue;
|
|
114
|
+
if (lights[worldIndex]?.castsShadow === false) continue;
|
|
115
|
+
out[written++] = worldIndex;
|
|
116
|
+
}
|
|
117
|
+
return written;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* How many consecutive frames a slot must be stale before it is treated as chronically so.
|
|
122
|
+
*
|
|
123
|
+
* A light that drifts past the rebake tolerance every frame — a wandering flame — would
|
|
124
|
+
* otherwise take a bake every frame and starve everything else. Three frames is long enough
|
|
125
|
+
* that a genuine move still rebakes promptly and short enough that a chronic one is demoted
|
|
126
|
+
* before it has cost much.
|
|
127
|
+
*/
|
|
128
|
+
const CHRONIC_STALE_FRAMES = 3;
|
|
129
|
+
|
|
130
|
+
/** The per-slot scratch a bake round needs. Caller-owned; this runs every frame. */
|
|
131
|
+
export interface BakeScratch {
|
|
132
|
+
readonly stale: Uint8Array;
|
|
133
|
+
readonly ready: Uint8Array;
|
|
134
|
+
readonly order: Int32Array;
|
|
135
|
+
readonly chronic: Uint8Array;
|
|
136
|
+
readonly staleRun: Uint8Array;
|
|
137
|
+
readonly staleOwner: Int32Array;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function createBakeScratch(pool: number): BakeScratch {
|
|
141
|
+
return {
|
|
142
|
+
stale: new Uint8Array(pool),
|
|
143
|
+
ready: new Uint8Array(pool),
|
|
144
|
+
order: new Int32Array(pool),
|
|
145
|
+
chronic: new Uint8Array(pool),
|
|
146
|
+
staleRun: new Uint8Array(pool),
|
|
147
|
+
staleOwner: new Int32Array(pool).fill(-1),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** What a pool must expose for a bake round to be planned over it. */
|
|
152
|
+
export interface BakeablePool<M> {
|
|
153
|
+
readonly pooledCount: number;
|
|
154
|
+
readonly sampledCount: number;
|
|
155
|
+
readonly liveMapCount: number;
|
|
156
|
+
pooledLight(slot: number): number;
|
|
157
|
+
mapForLight(lightIndex: number): M | undefined;
|
|
158
|
+
liveOwner(slot: number): number;
|
|
159
|
+
liveMap(slot: number): M | undefined;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** The one thing a bake round cannot do itself: put six faces of a world into a cubemap. */
|
|
163
|
+
export type BakeFaces<M, L> = (map: M, light: L, casters: unknown, maxFaces: number) => number;
|
|
164
|
+
|
|
165
|
+
/** What a map must answer for staleness to be decided. */
|
|
166
|
+
export interface StaleCheck {
|
|
167
|
+
hasBaked: boolean;
|
|
168
|
+
matchesSource(
|
|
169
|
+
x: number,
|
|
170
|
+
y: number,
|
|
171
|
+
z: number,
|
|
172
|
+
range: number,
|
|
173
|
+
near: number,
|
|
174
|
+
sourceRadius: number,
|
|
175
|
+
tolerance: number,
|
|
176
|
+
): boolean;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** The light fields a bake round reads. */
|
|
180
|
+
export interface BakeableLight {
|
|
181
|
+
x: number;
|
|
182
|
+
y: number;
|
|
183
|
+
z: number;
|
|
184
|
+
radius: number;
|
|
185
|
+
shadowNear: number;
|
|
186
|
+
sourceRadius: number;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Spend a frame's face budget across the pool, then refresh the live maps.
|
|
191
|
+
*
|
|
192
|
+
* **Every rule in here was bought with a measured frame and none of it is about a device.**
|
|
193
|
+
* Bakes are spread rather than done the instant they are noticed, because walking into a courtyard
|
|
194
|
+
* makes eight lights go stale at once — 48 passes over the static world in one frame, measured
|
|
195
|
+
* at 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. A slot that has never
|
|
196
|
+
* baked and is being *sampled* jumps the queue with the whole six, because a light with no
|
|
197
|
+
* image contributes nothing and a partial cubemap is worse than none; one such jump a frame, so
|
|
198
|
+
* a cluster coming into range cannot spend the whole budget at once. A slot that is stale every
|
|
199
|
+
* frame is demoted after three, because a wandering flame would otherwise starve the queue.
|
|
200
|
+
*
|
|
201
|
+
* A second implementation of any of that is a backend whose shadows arrive at different moments
|
|
202
|
+
* — which is not something a parity capture would attribute, because both frames look plausible.
|
|
203
|
+
* Hence one function, and `bake` as the only thing either backend supplies.
|
|
204
|
+
*/
|
|
205
|
+
export function runPointShadowBakes<M extends StaleCheck, L extends BakeableLight>(
|
|
206
|
+
pool: BakeablePool<M>,
|
|
207
|
+
lights: readonly L[],
|
|
208
|
+
facesPerFrame: number,
|
|
209
|
+
liveFacesPerFrame: number,
|
|
210
|
+
rebakeDistance: number,
|
|
211
|
+
faceCount: number,
|
|
212
|
+
scratch: BakeScratch,
|
|
213
|
+
staticCasters: unknown,
|
|
214
|
+
dynamicCasters: unknown,
|
|
215
|
+
bake: BakeFaces<M, L>,
|
|
216
|
+
): void {
|
|
217
|
+
/*
|
|
218
|
+
* Across everything holding a slot, not only what is being shaded. A warm light baked now is
|
|
219
|
+
* a light that joins the sampled set without a six-face bill — which is the on/off a lamp
|
|
220
|
+
* used to make as it came into range.
|
|
221
|
+
*/
|
|
222
|
+
const count = Math.min(pool.pooledCount, scratch.stale.length);
|
|
223
|
+
for (let slot = 0; slot < count; slot++) {
|
|
224
|
+
const lightIndex = pool.pooledLight(slot);
|
|
225
|
+
const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
|
|
226
|
+
const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
|
|
227
|
+
const stale =
|
|
228
|
+
light !== undefined &&
|
|
229
|
+
map !== undefined &&
|
|
230
|
+
!map.matchesSource(
|
|
231
|
+
light.x,
|
|
232
|
+
light.y,
|
|
233
|
+
light.z,
|
|
234
|
+
light.radius,
|
|
235
|
+
light.shadowNear,
|
|
236
|
+
light.sourceRadius,
|
|
237
|
+
rebakeDistance,
|
|
238
|
+
);
|
|
239
|
+
scratch.stale[slot] = stale ? 1 : 0;
|
|
240
|
+
scratch.ready[slot] = map !== undefined && map.hasBaked ? 1 : 0;
|
|
241
|
+
|
|
242
|
+
/* The run is per borrower: a slot changing hands starts its patience over. */
|
|
243
|
+
if (scratch.staleOwner[slot] !== lightIndex) {
|
|
244
|
+
scratch.staleOwner[slot] = lightIndex;
|
|
245
|
+
scratch.staleRun[slot] = 0;
|
|
246
|
+
}
|
|
247
|
+
const run = stale ? Math.min((scratch.staleRun[slot] ?? 0) + 1, CHRONIC_STALE_FRAMES) : 0;
|
|
248
|
+
scratch.staleRun[slot] = run;
|
|
249
|
+
scratch.chronic[slot] = run >= CHRONIC_STALE_FRAMES ? 1 : 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const planned = planPointShadowBakes(
|
|
253
|
+
scratch.stale,
|
|
254
|
+
scratch.ready,
|
|
255
|
+
count,
|
|
256
|
+
scratch.order,
|
|
257
|
+
scratch.chronic,
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
let faces = facesPerFrame;
|
|
261
|
+
let urgentSpent = false;
|
|
262
|
+
for (let i = 0; i < planned && faces > 0; i++) {
|
|
263
|
+
const slot = scratch.order[i] ?? -1;
|
|
264
|
+
/*
|
|
265
|
+
* `pooledLight`, matching the loop that filled `stale`: resolving through the sampled list
|
|
266
|
+
* here would bake the wrong light for every warm slot.
|
|
267
|
+
*/
|
|
268
|
+
const lightIndex = slot >= 0 ? pool.pooledLight(slot) : -1;
|
|
269
|
+
const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
|
|
270
|
+
const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
|
|
271
|
+
if (light === undefined || map === undefined) continue;
|
|
272
|
+
|
|
273
|
+
const cold = slot < pool.sampledCount && scratch.ready[slot] === 0;
|
|
274
|
+
const budget = cold && !urgentSpent ? faceCount : faces;
|
|
275
|
+
if (cold && !urgentSpent) urgentSpent = true;
|
|
276
|
+
faces -= bake(map, light, staticCasters, budget);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/*
|
|
280
|
+
* Live maps contain movers only and are composed with the static maps in the shader. A second
|
|
281
|
+
* map exists only during an ownership crossfade.
|
|
282
|
+
*
|
|
283
|
+
* **Unlike a static map there is no staleness test to make** — the caster moved, that is what
|
|
284
|
+
* makes it live — **but there does have to be a ceiling, and there was not one.** This loop
|
|
285
|
+
* asked for the whole cubemap, per live map, every frame, outside `facesPerFrame` entirely.
|
|
286
|
+
* Measured on the consumer and on three of the engine's seven demos: `pointShadow.face`
|
|
287
|
+
* six times a frame, for ever, in scenes that were otherwise nine to fourteen passes. And
|
|
288
|
+
* `LIVE_POINT_SHADOW_MAPS` is two with the second waking up during an ownership handoff, which
|
|
289
|
+
* is precisely what running past a row of lamps is — so a courtyard paid twelve full passes over
|
|
290
|
+
* the dynamic casters a frame, which is where "it is only slow in the courtyard" came from.
|
|
291
|
+
*
|
|
292
|
+
* The faces round-robin under the budget instead, so a mover's shadow finishes over two or
|
|
293
|
+
* three frames rather than all inside one. What that costs is a shadow a frame or two behind
|
|
294
|
+
* a character. What it bought back was the frame rate to see it at all.
|
|
295
|
+
*/
|
|
296
|
+
let liveFaces = Math.max(1, liveFacesPerFrame);
|
|
297
|
+
for (let slot = 0; slot < pool.liveMapCount && liveFaces > 0; slot++) {
|
|
298
|
+
const owner = pool.liveOwner(slot);
|
|
299
|
+
const light = owner >= 0 ? lights[owner] : undefined;
|
|
300
|
+
const map = pool.liveMap(slot);
|
|
301
|
+
if (light === undefined || map === undefined) continue;
|
|
302
|
+
/* Never wider than the cube itself: asking for more is asking for faces that do not exist. */
|
|
303
|
+
liveFaces -= bake(map, light, dynamicCasters, Math.min(liveFaces, faceCount));
|
|
304
|
+
}
|
|
305
|
+
}
|