@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,293 @@
|
|
|
1
|
+
/** Construction-time GPU quality controls shared by every renderer resource. */
|
|
2
|
+
import { MAX_AREA_LIGHTS } from './areaLights.js';
|
|
3
|
+
import { MAX_GLOBAL_MEDIUM_STEPS } from './globalMedium.js';
|
|
4
|
+
import { MAX_POINT_LIGHTS } from './lightBudget.js';
|
|
5
|
+
import { PREFILTER_SAMPLE_COUNTS } from './prefilterEnvMap.js';
|
|
6
|
+
export const MAX_SHADOW_FILTER_TAPS = 12;
|
|
7
|
+
export const MAX_WATER_REFLECTION_FILTER_TAPS = 9;
|
|
8
|
+
export const POINT_SHADOW_FADE_START = 0.35;
|
|
9
|
+
export const DIRECTIONAL_SHADOW_FADE_START = 0.65;
|
|
10
|
+
/**
|
|
11
|
+
* Current fidelity target. Different shadow projections use different texture
|
|
12
|
+
* dimensions for comparable visible detail: a cubemap spends its allocation
|
|
13
|
+
* six times, while the directional map spends all of it on one focused area.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_RENDER_QUALITY = Object.freeze({
|
|
16
|
+
outputTransform: 'none',
|
|
17
|
+
outputExposure: 1,
|
|
18
|
+
pointLightFalloff: 'smooth',
|
|
19
|
+
/**
|
|
20
|
+
* Render at the display's own density, up to 2×.
|
|
21
|
+
*
|
|
22
|
+
* It was 1.75, which is a number that renders *nothing* at native resolution: every
|
|
23
|
+
* retina panel reports 2, so the drawing buffer was 87% of the pixels the screen has and
|
|
24
|
+
* the browser stretched the difference. It was found by comparing a small figure in a
|
|
25
|
+
* box against the world behind it: both were blurred, and for the same reason.
|
|
26
|
+
*
|
|
27
|
+
* 2 is where the ceiling belongs. It is what the overwhelming majority of high-density
|
|
28
|
+
* displays report, so it is the point at which a game stops being upscaled; past it the
|
|
29
|
+
* cost is quadratic for detail almost nobody can resolve, which is why there is a cap at
|
|
30
|
+
* all. A device that cannot hold its rate at 2 has the Low profile, which is a decision
|
|
31
|
+
* about pixels rather than a blur applied to everyone.
|
|
32
|
+
*/
|
|
33
|
+
maxDevicePixelRatio: 2,
|
|
34
|
+
/**
|
|
35
|
+
* 12 megapixels, which is a guard rail rather than a haircut.
|
|
36
|
+
*
|
|
37
|
+
* At a density cap of 2 the drawing buffer is the panel's own pixels, so this does
|
|
38
|
+
* nothing at all up to and including 4K (8.3 MP) — the resolutions almost everybody is
|
|
39
|
+
* on keep every pixel they have. It starts holding at 5K and above, and on the
|
|
40
|
+
* high-density laptop panels whose logical size is large enough to ask for more than a
|
|
41
|
+
* 4K frame, which are exactly the cases where the density cap has stopped meaning
|
|
42
|
+
* anything about cost.
|
|
43
|
+
*
|
|
44
|
+
* A ceiling that never binds on common hardware is the point: the failure it exists to
|
|
45
|
+
* prevent is a frame that quietly grew past a vsync slot, and a cap only prevents that
|
|
46
|
+
* if it is above where people actually are. Consumers wanting the pixels set it to 0.
|
|
47
|
+
*/
|
|
48
|
+
maxDrawingBufferPixels: 12_000_000,
|
|
49
|
+
directionalShadows: true,
|
|
50
|
+
pointShadows: true,
|
|
51
|
+
/* The engine's own budgets, which the renderer lowers per device when it has to. */
|
|
52
|
+
maxLights: MAX_POINT_LIGHTS,
|
|
53
|
+
maxAreaLights: MAX_AREA_LIGHTS,
|
|
54
|
+
directionalShadowMapSize: 2048,
|
|
55
|
+
pointShadowFaceSize: 512,
|
|
56
|
+
shadowFilterTaps: MAX_SHADOW_FILTER_TAPS,
|
|
57
|
+
lightVolumeSamples: 32,
|
|
58
|
+
directionalShadowDepthLayers: 2,
|
|
59
|
+
directionalShadowMaxDistance: 6,
|
|
60
|
+
directionalShadowMaxSlope: 3,
|
|
61
|
+
pointShadowRebakeDistance: 0.4,
|
|
62
|
+
pointShadowFacesPerFrame: 2,
|
|
63
|
+
/*
|
|
64
|
+
* Twelve, which is `LIVE_POINT_SHADOW_MAPS` cubemaps of six faces: exactly what the live
|
|
65
|
+
* loop took before it had a budget at all, so no existing consumer's shadows arrive at a
|
|
66
|
+
* different moment.
|
|
67
|
+
*
|
|
68
|
+
* **Six would have been the wrong default and looked like the right one.** The budget is
|
|
69
|
+
* shared across every live map rather than granted to each, so at six the first map takes
|
|
70
|
+
* the whole cubemap and the second — the one that exists only during an ownership handoff —
|
|
71
|
+
* gets nothing and never bakes. That is a mover's shadow vanishing exactly while a character
|
|
72
|
+
* crosses between two lamps, which is the moment the handoff exists to smooth over.
|
|
73
|
+
*/
|
|
74
|
+
liveShadowFacesPerFrame: 12,
|
|
75
|
+
water: true,
|
|
76
|
+
screenEffects: true,
|
|
77
|
+
sceneSamples: 1,
|
|
78
|
+
planarReflections: false,
|
|
79
|
+
hdrScene: false,
|
|
80
|
+
cameraMotionBlur: 0,
|
|
81
|
+
temporalAa: false,
|
|
82
|
+
orderIndependent: false,
|
|
83
|
+
depthOfField: 0,
|
|
84
|
+
occlusionCulling: 0,
|
|
85
|
+
ambientOcclusion: 0,
|
|
86
|
+
nightEmissive: false,
|
|
87
|
+
bloom: 0,
|
|
88
|
+
/* Brighter than white, which is where a source of light sits and a reflecting surface does
|
|
89
|
+
not. Only consulted once the strength above is non-zero, and positive for the same reason
|
|
90
|
+
the occlusion radius is: a zero left sitting here would look legal and bloom the whole
|
|
91
|
+
frame the moment somebody turned the effect on. */
|
|
92
|
+
bloomThreshold: 1,
|
|
93
|
+
/* Off: a probe only exists once a caller bakes one, so nothing changes by default. */
|
|
94
|
+
reflectionProbeSize: 0,
|
|
95
|
+
/* On, because the cost of the feature is the probe and this only says whether one is allowed:
|
|
96
|
+
with the size at its own default of zero, leaving this true changes nothing at all. */
|
|
97
|
+
environmentReflections: true,
|
|
98
|
+
/* The medium tier. Powers of two only; see PREFILTER_SAMPLE_COUNTS for why. */
|
|
99
|
+
environmentPrefilterSamples: PREFILTER_SAMPLE_COUNTS.medium,
|
|
100
|
+
/* Off: the shipped look is the box chain. See the field for why the default is this way round. */
|
|
101
|
+
environmentPrefilter: false,
|
|
102
|
+
/* Half a metre, which is the scale of the gaps in a room and around a vehicle. Only
|
|
103
|
+
consulted when the strength above is non-zero, so it changes nothing by default. */
|
|
104
|
+
ambientOcclusionRadius: 0.5,
|
|
105
|
+
/* Off, so the medium costs nothing until a consumer asks for it. See the field. */
|
|
106
|
+
globalMediumSteps: 0,
|
|
107
|
+
/* Half, which is the resolution the upsample was designed against. */
|
|
108
|
+
globalMediumHalfResolution: true,
|
|
109
|
+
waterResolution: 128,
|
|
110
|
+
waterReflections: true,
|
|
111
|
+
/*
|
|
112
|
+
* Full, and deliberately not the half the GPU-budget design proposed as a free win.
|
|
113
|
+
*
|
|
114
|
+
* It is not free. The reflection is a second full submission of the scene, but with the
|
|
115
|
+
* GPU timer finally armed it measures **0.50 ms of an 18.00 ms frame** — the same 3%
|
|
116
|
+
* category the 72% shadow claim collapsed into. Trading a visibly softer reflection on
|
|
117
|
+
* every machine for 3% none of them needed is not a win, and it is worse than that in
|
|
118
|
+
* one place: this is construction-time, so a clip export cannot ask for full scale back,
|
|
119
|
+
* and an export is the one frame somebody keeps.
|
|
120
|
+
*
|
|
121
|
+
* The devices that genuinely cannot afford the target get it halved by the capability
|
|
122
|
+
* clamp in `renderer.ts` instead, where the cost is paid by the parts that need it paid.
|
|
123
|
+
*/
|
|
124
|
+
waterReflectionScale: 1,
|
|
125
|
+
waterReflectionFilterTaps: MAX_WATER_REFLECTION_FILTER_TAPS,
|
|
126
|
+
underwaterAtmosphere: true,
|
|
127
|
+
plumeNoiseOctaves: 3,
|
|
128
|
+
capabilityClamp: true,
|
|
129
|
+
/*
|
|
130
|
+
* **Both back ON in 1.1.2, because the black screen they were turned off for was not them.**
|
|
131
|
+
*
|
|
132
|
+
* These are the only two changes in this engine whose correctness an immediate-mode desktop
|
|
133
|
+
* GPU physically cannot express: a discarded attachment costs nothing and changes nothing
|
|
134
|
+
* where the samples have nowhere else to be, and taking the swap chain late is
|
|
135
|
+
* indistinguishable from taking it early until a browser disagrees about when a frame is
|
|
136
|
+
* presented. So when all three consumers came back completely black on an iPhone 16 Pro,
|
|
137
|
+
* these two were the obvious suspects and both were defaulted off.
|
|
138
|
+
*
|
|
139
|
+
* They were not the cause and turning them off never lifted the black screen. It was a
|
|
140
|
+
* uniform array striding by four bytes where WGSL requires sixteen, which WebKit enforces
|
|
141
|
+
* and Dawn does not, so every shader that draws geometry failed to compile on iOS and
|
|
142
|
+
* nowhere else. Fixed in 1.1.1; the iOS black-screen investigation is
|
|
143
|
+
* the investigation, and the retreat here is the clearest thing it cost.
|
|
144
|
+
*
|
|
145
|
+
* **What leaving them off costs, measured on the gilded chamber at a phone viewport with
|
|
146
|
+
* `npm run frame-audit`:** 75.6 MB a frame against 49.7, which is 4.43 GB/s against 2.91 at
|
|
147
|
+
* 60 fps, and thirteen passes against twelve. Nearly all of it is the deferral — off it is
|
|
148
|
+
* 51.2 MB on its own, because opening the frame's pass eagerly forces a load and a store of
|
|
149
|
+
* the attachment for every mirror. The discard adds the last 1.5 MB and takes the frame's
|
|
150
|
+
* unreadable writes to zero. That is the entire mobile bandwidth result of 1.1.0, and it was
|
|
151
|
+
* being paid on exactly the devices it was measured for.
|
|
152
|
+
*
|
|
153
|
+
* **Still unverified on a tiler, and that has not changed.** What changed is that there is no
|
|
154
|
+
* longer an observed failure to attribute to them. `?discard=0` and `?defer=0` turn them off
|
|
155
|
+
* one at a time in all three consumers, so a device that misbehaves still names its own cause
|
|
156
|
+
* in two reloads.
|
|
157
|
+
*/
|
|
158
|
+
discardResolvedAttachments: true,
|
|
159
|
+
deferFramePass: true,
|
|
160
|
+
frameGraph: true,
|
|
161
|
+
clusteredLights: false,
|
|
162
|
+
cullDraws: false,
|
|
163
|
+
/*
|
|
164
|
+
* The profiler stays off, and for its own reason rather than that one: it attaches a
|
|
165
|
+
* timestamp block to every render pass in the frame, which is a cost nobody who did not ask
|
|
166
|
+
* for a measurement should pay. `?gputiming=1` arms it.
|
|
167
|
+
*/
|
|
168
|
+
gpuTiming: false,
|
|
169
|
+
});
|
|
170
|
+
/** Resolve and validate once at renderer construction, never in a hot path. */
|
|
171
|
+
export function resolveRenderQuality(options = {}) {
|
|
172
|
+
const quality = {
|
|
173
|
+
outputTransform: options.outputTransform ?? DEFAULT_RENDER_QUALITY.outputTransform,
|
|
174
|
+
outputExposure: options.outputExposure ?? DEFAULT_RENDER_QUALITY.outputExposure,
|
|
175
|
+
pointLightFalloff: options.pointLightFalloff ?? DEFAULT_RENDER_QUALITY.pointLightFalloff,
|
|
176
|
+
maxDevicePixelRatio: options.maxDevicePixelRatio ?? DEFAULT_RENDER_QUALITY.maxDevicePixelRatio,
|
|
177
|
+
maxDrawingBufferPixels: options.maxDrawingBufferPixels ?? DEFAULT_RENDER_QUALITY.maxDrawingBufferPixels,
|
|
178
|
+
directionalShadows: options.directionalShadows ?? DEFAULT_RENDER_QUALITY.directionalShadows,
|
|
179
|
+
pointShadows: options.pointShadows ?? DEFAULT_RENDER_QUALITY.pointShadows,
|
|
180
|
+
/* Whole slots, at least one, never above what the shader is written for: these two are
|
|
181
|
+
interpolated into the source as array sizes, so a fractional or zero one is a shader that
|
|
182
|
+
does not compile and a larger one is arrays the uploads never fill. */
|
|
183
|
+
maxLights: Math.min(MAX_POINT_LIGHTS, Math.max(1, Math.round(options.maxLights ?? DEFAULT_RENDER_QUALITY.maxLights))),
|
|
184
|
+
maxAreaLights: Math.min(MAX_AREA_LIGHTS, Math.max(1, Math.round(options.maxAreaLights ?? DEFAULT_RENDER_QUALITY.maxAreaLights))),
|
|
185
|
+
directionalShadowMapSize: options.directionalShadowMapSize ?? DEFAULT_RENDER_QUALITY.directionalShadowMapSize,
|
|
186
|
+
pointShadowFaceSize: options.pointShadowFaceSize ?? DEFAULT_RENDER_QUALITY.pointShadowFaceSize,
|
|
187
|
+
shadowFilterTaps: options.shadowFilterTaps ?? DEFAULT_RENDER_QUALITY.shadowFilterTaps,
|
|
188
|
+
lightVolumeSamples: options.lightVolumeSamples ?? DEFAULT_RENDER_QUALITY.lightVolumeSamples,
|
|
189
|
+
directionalShadowDepthLayers: options.directionalShadowDepthLayers ?? DEFAULT_RENDER_QUALITY.directionalShadowDepthLayers,
|
|
190
|
+
directionalShadowMaxDistance: options.directionalShadowMaxDistance ?? DEFAULT_RENDER_QUALITY.directionalShadowMaxDistance,
|
|
191
|
+
directionalShadowMaxSlope: options.directionalShadowMaxSlope ?? DEFAULT_RENDER_QUALITY.directionalShadowMaxSlope,
|
|
192
|
+
pointShadowRebakeDistance: options.pointShadowRebakeDistance ?? DEFAULT_RENDER_QUALITY.pointShadowRebakeDistance,
|
|
193
|
+
pointShadowFacesPerFrame: options.pointShadowFacesPerFrame ?? DEFAULT_RENDER_QUALITY.pointShadowFacesPerFrame,
|
|
194
|
+
liveShadowFacesPerFrame: options.liveShadowFacesPerFrame ?? DEFAULT_RENDER_QUALITY.liveShadowFacesPerFrame,
|
|
195
|
+
water: options.water ?? DEFAULT_RENDER_QUALITY.water,
|
|
196
|
+
screenEffects: options.screenEffects ?? DEFAULT_RENDER_QUALITY.screenEffects,
|
|
197
|
+
sceneSamples: Math.max(1, Math.round(options.sceneSamples ?? DEFAULT_RENDER_QUALITY.sceneSamples)),
|
|
198
|
+
planarReflections: options.planarReflections ?? DEFAULT_RENDER_QUALITY.planarReflections,
|
|
199
|
+
hdrScene: options.hdrScene ?? DEFAULT_RENDER_QUALITY.hdrScene,
|
|
200
|
+
cameraMotionBlur: Math.min(1, Math.max(0, options.cameraMotionBlur ?? DEFAULT_RENDER_QUALITY.cameraMotionBlur)),
|
|
201
|
+
temporalAa: options.temporalAa ?? DEFAULT_RENDER_QUALITY.temporalAa,
|
|
202
|
+
orderIndependent: options.orderIndependent ?? DEFAULT_RENDER_QUALITY.orderIndependent,
|
|
203
|
+
depthOfField: Math.min(1, Math.max(0, options.depthOfField ?? DEFAULT_RENDER_QUALITY.depthOfField)),
|
|
204
|
+
occlusionCulling: Math.max(0, Math.round(options.occlusionCulling ?? DEFAULT_RENDER_QUALITY.occlusionCulling)),
|
|
205
|
+
ambientOcclusion: Math.min(1, Math.max(0, options.ambientOcclusion ?? DEFAULT_RENDER_QUALITY.ambientOcclusion)),
|
|
206
|
+
nightEmissive: options.nightEmissive ?? DEFAULT_RENDER_QUALITY.nightEmissive,
|
|
207
|
+
bloom: Math.min(1, Math.max(0, options.bloom ?? DEFAULT_RENDER_QUALITY.bloom)),
|
|
208
|
+
bloomThreshold: options.bloomThreshold ?? DEFAULT_RENDER_QUALITY.bloomThreshold,
|
|
209
|
+
reflectionProbeSize: Math.max(0, Math.round(options.reflectionProbeSize ?? DEFAULT_RENDER_QUALITY.reflectionProbeSize)),
|
|
210
|
+
environmentReflections: options.environmentReflections ?? DEFAULT_RENDER_QUALITY.environmentReflections,
|
|
211
|
+
/* At least one sample: zero would divide by an accumulated weight of zero and answer NaN,
|
|
212
|
+
which a half-float target spreads across every rough level rather than reporting. */
|
|
213
|
+
environmentPrefilterSamples: Math.max(1, Math.round(options.environmentPrefilterSamples ?? DEFAULT_RENDER_QUALITY.environmentPrefilterSamples)),
|
|
214
|
+
environmentPrefilter: options.environmentPrefilter ?? DEFAULT_RENDER_QUALITY.environmentPrefilter,
|
|
215
|
+
ambientOcclusionRadius: options.ambientOcclusionRadius ?? DEFAULT_RENDER_QUALITY.ambientOcclusionRadius,
|
|
216
|
+
/* Whole steps, and never past the shader's own loop bound: a uniform above it would make the
|
|
217
|
+
clamp inside the shader disagree with the step length computed from it, which is a march
|
|
218
|
+
that stops short of where it divided its distance. */
|
|
219
|
+
globalMediumSteps: Math.min(MAX_GLOBAL_MEDIUM_STEPS, Math.max(0, Math.round(options.globalMediumSteps ?? DEFAULT_RENDER_QUALITY.globalMediumSteps))),
|
|
220
|
+
globalMediumHalfResolution: options.globalMediumHalfResolution ?? DEFAULT_RENDER_QUALITY.globalMediumHalfResolution,
|
|
221
|
+
waterResolution: options.waterResolution ?? DEFAULT_RENDER_QUALITY.waterResolution,
|
|
222
|
+
waterReflections: options.waterReflections ?? DEFAULT_RENDER_QUALITY.waterReflections,
|
|
223
|
+
waterReflectionScale: options.waterReflectionScale ?? DEFAULT_RENDER_QUALITY.waterReflectionScale,
|
|
224
|
+
capabilityClamp: options.capabilityClamp ?? DEFAULT_RENDER_QUALITY.capabilityClamp,
|
|
225
|
+
gpuTiming: options.gpuTiming ?? DEFAULT_RENDER_QUALITY.gpuTiming,
|
|
226
|
+
discardResolvedAttachments: options.discardResolvedAttachments ?? DEFAULT_RENDER_QUALITY.discardResolvedAttachments,
|
|
227
|
+
deferFramePass: options.deferFramePass ?? DEFAULT_RENDER_QUALITY.deferFramePass,
|
|
228
|
+
frameGraph: options.frameGraph ?? DEFAULT_RENDER_QUALITY.frameGraph,
|
|
229
|
+
clusteredLights: options.clusteredLights ?? DEFAULT_RENDER_QUALITY.clusteredLights,
|
|
230
|
+
cullDraws: options.cullDraws ?? DEFAULT_RENDER_QUALITY.cullDraws,
|
|
231
|
+
waterReflectionFilterTaps: options.waterReflectionFilterTaps ?? DEFAULT_RENDER_QUALITY.waterReflectionFilterTaps,
|
|
232
|
+
underwaterAtmosphere: options.underwaterAtmosphere ?? DEFAULT_RENDER_QUALITY.underwaterAtmosphere,
|
|
233
|
+
plumeNoiseOctaves: options.plumeNoiseOctaves ?? DEFAULT_RENDER_QUALITY.plumeNoiseOctaves,
|
|
234
|
+
};
|
|
235
|
+
positive('maxDevicePixelRatio', quality.maxDevicePixelRatio);
|
|
236
|
+
// Zero is legal and means uncapped, so this is the non-negative check rather than
|
|
237
|
+
// the positive one.
|
|
238
|
+
nonNegative('maxDrawingBufferPixels', quality.maxDrawingBufferPixels);
|
|
239
|
+
positiveInteger('directionalShadowMapSize', quality.directionalShadowMapSize);
|
|
240
|
+
positiveInteger('pointShadowFaceSize', quality.pointShadowFaceSize);
|
|
241
|
+
positiveInteger('shadowFilterTaps', quality.shadowFilterTaps);
|
|
242
|
+
positiveInteger('lightVolumeSamples', quality.lightVolumeSamples);
|
|
243
|
+
positiveInteger('directionalShadowDepthLayers', quality.directionalShadowDepthLayers);
|
|
244
|
+
positive('directionalShadowMaxDistance', quality.directionalShadowMaxDistance);
|
|
245
|
+
positive('directionalShadowMaxSlope', quality.directionalShadowMaxSlope);
|
|
246
|
+
nonNegative('pointShadowRebakeDistance', quality.pointShadowRebakeDistance);
|
|
247
|
+
positiveInteger('pointShadowFacesPerFrame', quality.pointShadowFacesPerFrame);
|
|
248
|
+
positiveInteger('liveShadowFacesPerFrame', quality.liveShadowFacesPerFrame);
|
|
249
|
+
positiveInteger('waterResolution', quality.waterResolution);
|
|
250
|
+
positive('waterReflectionScale', quality.waterReflectionScale);
|
|
251
|
+
positiveInteger('waterReflectionFilterTaps', quality.waterReflectionFilterTaps);
|
|
252
|
+
positiveInteger('plumeNoiseOctaves', quality.plumeNoiseOctaves);
|
|
253
|
+
/* A radius of zero would ask every tap to land on the pixel it started from, which is not
|
|
254
|
+
"no occlusion" — it is a division by nothing in the estimator. Off is the strength. */
|
|
255
|
+
positive('ambientOcclusionRadius', quality.ambientOcclusionRadius);
|
|
256
|
+
/* Same shape as the radius above: a threshold of zero is not "bloom everything a little",
|
|
257
|
+
it is every pixel in the frame contributing its whole self. Off is the strength. */
|
|
258
|
+
positive('bloomThreshold', quality.bloomThreshold);
|
|
259
|
+
if (quality.shadowFilterTaps !== 4 &&
|
|
260
|
+
quality.shadowFilterTaps !== 8 &&
|
|
261
|
+
quality.shadowFilterTaps !== MAX_SHADOW_FILTER_TAPS) {
|
|
262
|
+
throw new Error(`RenderQuality.shadowFilterTaps must be 4, 8 or ${MAX_SHADOW_FILTER_TAPS}, got ${quality.shadowFilterTaps}`);
|
|
263
|
+
}
|
|
264
|
+
if (quality.directionalShadowDepthLayers !== 1 && quality.directionalShadowDepthLayers !== 2) {
|
|
265
|
+
throw new Error(`RenderQuality.directionalShadowDepthLayers must be 1 or 2, got ${quality.directionalShadowDepthLayers}`);
|
|
266
|
+
}
|
|
267
|
+
if (quality.plumeNoiseOctaves > 3) {
|
|
268
|
+
throw new Error(`RenderQuality.plumeNoiseOctaves must be <= 3, got ${quality.plumeNoiseOctaves}`);
|
|
269
|
+
}
|
|
270
|
+
if (quality.waterReflectionFilterTaps !== 1 &&
|
|
271
|
+
quality.waterReflectionFilterTaps !== 5 &&
|
|
272
|
+
quality.waterReflectionFilterTaps !== MAX_WATER_REFLECTION_FILTER_TAPS) {
|
|
273
|
+
throw new Error(`RenderQuality.waterReflectionFilterTaps must be 1, 5 or ${MAX_WATER_REFLECTION_FILTER_TAPS}, got ${quality.waterReflectionFilterTaps}`);
|
|
274
|
+
}
|
|
275
|
+
return Object.freeze(quality);
|
|
276
|
+
}
|
|
277
|
+
function positive(name, value) {
|
|
278
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
279
|
+
throw new Error(`RenderQuality.${name} must be a positive finite number, got ${value}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/** Zero is meaningful for a tolerance: it asks for the exact comparison. */
|
|
283
|
+
function nonNegative(name, value) {
|
|
284
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
285
|
+
throw new Error(`RenderQuality.${name} must be a non-negative finite number, got ${value}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function positiveInteger(name, value) {
|
|
289
|
+
positive(name, value);
|
|
290
|
+
if (!Number.isInteger(value)) {
|
|
291
|
+
throw new Error(`RenderQuality.${name} must be an integer, got ${value}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare function recordingGl(options?: {
|
|
2
|
+
/**
|
|
3
|
+
* Extensions this context answers with an object rather than with `null`.
|
|
4
|
+
*
|
|
5
|
+
* **Opt-in, and the default of none is the honest one for most tests**: the shipped default
|
|
6
|
+
* answers `null` to everything, which is the weakest part this engine claims to run on and is
|
|
7
|
+
* what a test that does not care should be written against. A test that *is* about the branch
|
|
8
|
+
* an extension opens has to name it here, or the code under test refuses one step earlier and
|
|
9
|
+
* the test passes for the wrong reason — `EXT_color_buffer_float` is the worked example: with
|
|
10
|
+
* it absent, `OitPass` declines for the float colour buffer and every order-independent
|
|
11
|
+
* profile looks alike whatever its sample count.
|
|
12
|
+
*/
|
|
13
|
+
readonly extensions?: readonly string[];
|
|
14
|
+
/**
|
|
15
|
+
* What this context reports for `MAX_FRAGMENT_UNIFORM_VECTORS`. 1024 by default.
|
|
16
|
+
*
|
|
17
|
+
* Named because it is a limit the renderer now *sizes a shader against* rather than merely
|
|
18
|
+
* compares: 256 is an Adreno 740 and 224 is what WebGL2 guarantees, and both are numbers at
|
|
19
|
+
* which the lit shader has to be built smaller than the engine's own budget.
|
|
20
|
+
*/
|
|
21
|
+
readonly fragmentUniformVectors?: number;
|
|
22
|
+
/**
|
|
23
|
+
* The ceiling this fake driver actually enforces at link time, if it is not the one it admits.
|
|
24
|
+
*
|
|
25
|
+
* **For the gap between what a device reports and what it does.** `planLightBudget` counts an
|
|
26
|
+
* upper bound over the source, so the interesting failure is the other one: a program the
|
|
27
|
+
* arithmetic passed that the driver still refuses. Setting this below
|
|
28
|
+
* `fragmentUniformVectors` is that device, and it is what the renderer's retry is for.
|
|
29
|
+
* `Infinity` by default, so a link only ever fails where a test asked for it.
|
|
30
|
+
*/
|
|
31
|
+
readonly refuseLinkAbove?: number;
|
|
32
|
+
}): {
|
|
33
|
+
gl: WebGL2RenderingContext;
|
|
34
|
+
canvas: HTMLCanvasElement;
|
|
35
|
+
calls: {
|
|
36
|
+
name: string;
|
|
37
|
+
args: unknown[];
|
|
38
|
+
}[];
|
|
39
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A WebGL2 context that answers everything, for tests that need a renderer and not a GPU.
|
|
3
|
+
*
|
|
4
|
+
* **Not a `.test.ts` file, and that is the point.** Vitest registers a test when the file
|
|
5
|
+
* declaring it is imported, so a second test file importing this from beside its own tests would
|
|
6
|
+
* re-run every test in that file as well — five today, and more with each one added. Split out so
|
|
7
|
+
* that importing the harness costs nothing but the harness.
|
|
8
|
+
*
|
|
9
|
+
* **Until this existed, nothing in this repository had ever constructed the WebGL2 `Renderer` in a
|
|
10
|
+
* test**, which is why every claim about that backend was settled by a capture — expensive, slow,
|
|
11
|
+
* and blind to anything the published scenes do not do. There is a `renderer.test.ts` beside that
|
|
12
|
+
* backend now, and what it pins is the shape a capture is worst at: a frame-wide decision taken
|
|
13
|
+
* from the profile, where the wrong answer still draws a plausible picture. The `Proxy` is the
|
|
14
|
+
* same trick `sceneTarget.test.ts` uses one level down: anything not named below is a recorded
|
|
15
|
+
* no-op returning a fresh object, so a constructor that touches several hundred entry points runs
|
|
16
|
+
* to completion and a test can assert the one thing it is about.
|
|
17
|
+
*/
|
|
18
|
+
import { countUniformVectors } from './uniformVectorBudget.js';
|
|
19
|
+
export function recordingGl(options = {}) {
|
|
20
|
+
const extensions = new Set(options.extensions ?? []);
|
|
21
|
+
const reportedVectors = options.fragmentUniformVectors ?? 1024;
|
|
22
|
+
const enforcedVectors = options.refuseLinkAbove ?? Number.POSITIVE_INFINITY;
|
|
23
|
+
/** Fragment sources by shader handle, so a refusal can be decided from what was compiled. */
|
|
24
|
+
const fragmentSources = new WeakMap();
|
|
25
|
+
/** Each program's fragment source, gathered at `attachShader`. */
|
|
26
|
+
const programFragments = new WeakMap();
|
|
27
|
+
const calls = [];
|
|
28
|
+
const constants = {
|
|
29
|
+
ACTIVE_UNIFORMS: 0x8b86,
|
|
30
|
+
ACTIVE_ATTRIBUTES: 0x8b89,
|
|
31
|
+
COMPILE_STATUS: 0x8b81,
|
|
32
|
+
LINK_STATUS: 0x8b82,
|
|
33
|
+
FRAMEBUFFER_COMPLETE: 0x8cd5,
|
|
34
|
+
NO_ERROR: 0,
|
|
35
|
+
MAX_SAMPLES: 0x8d57,
|
|
36
|
+
MAX_TEXTURE_SIZE: 0x0d33,
|
|
37
|
+
MAX_TEXTURE_IMAGE_UNITS: 0x8872,
|
|
38
|
+
MAX_VERTEX_UNIFORM_VECTORS: 0x8dfb,
|
|
39
|
+
MAX_FRAGMENT_UNIFORM_VECTORS: 0x8dfd,
|
|
40
|
+
/*
|
|
41
|
+
* Enums a test needs to compare against, rather than merely to pass through.
|
|
42
|
+
*
|
|
43
|
+
* The `Proxy` below answers an unnamed property with a **fresh function**, so
|
|
44
|
+
* `gl.TEXTURE_2D_ARRAY` read twice is two different values and `toContain(gl.TEXTURE_2D)` can
|
|
45
|
+
* never match anything a call recorded. Anything a test asserts on has to be named here; a
|
|
46
|
+
* constant only ever passed along does not.
|
|
47
|
+
*/
|
|
48
|
+
TEXTURE_2D: 0x0de1,
|
|
49
|
+
TEXTURE_2D_ARRAY: 0x8c1a,
|
|
50
|
+
DEPTH_COMPONENT24: 0x81a6,
|
|
51
|
+
DEPTH_ATTACHMENT: 0x8d00,
|
|
52
|
+
FRAMEBUFFER: 0x8d40,
|
|
53
|
+
NONE: 0,
|
|
54
|
+
ALWAYS: 0x0207,
|
|
55
|
+
LESS: 0x0201,
|
|
56
|
+
TEXTURE_MIN_FILTER: 0x2801,
|
|
57
|
+
TEXTURE_MAG_FILTER: 0x2800,
|
|
58
|
+
TEXTURE_WRAP_S: 0x2802,
|
|
59
|
+
TEXTURE_WRAP_T: 0x2803,
|
|
60
|
+
NEAREST: 0x2600,
|
|
61
|
+
CLAMP_TO_EDGE: 0x812f,
|
|
62
|
+
/* The blend factors, so a test can tell an additive stroke from a covering one. */
|
|
63
|
+
SRC_ALPHA: 0x0302,
|
|
64
|
+
ONE: 1,
|
|
65
|
+
ONE_MINUS_SRC_ALPHA: 0x0303,
|
|
66
|
+
TRIANGLES: 0x0004,
|
|
67
|
+
TEXTURE0: 0x84c0,
|
|
68
|
+
DEPTH_BUFFER_BIT: 0x00000100,
|
|
69
|
+
DEPTH_TEST: 0x0b71,
|
|
70
|
+
CULL_FACE: 0x0b44,
|
|
71
|
+
/* Named so a pass-owned attachment's two colour formats and its two attachment points can be
|
|
72
|
+
compared rather than merely passed along. See `passTarget.test.ts`. */
|
|
73
|
+
COLOR_ATTACHMENT0: 0x8ce0,
|
|
74
|
+
RGBA8: 0x8058,
|
|
75
|
+
RGBA16F: 0x881a,
|
|
76
|
+
RGBA: 0x1908,
|
|
77
|
+
UNSIGNED_BYTE: 0x1401,
|
|
78
|
+
HALF_FLOAT: 0x140b,
|
|
79
|
+
DEPTH_COMPONENT: 0x1902,
|
|
80
|
+
UNSIGNED_INT: 0x1405,
|
|
81
|
+
LINEAR: 0x2601,
|
|
82
|
+
COLOR_BUFFER_BIT: 0x00004000,
|
|
83
|
+
/* Named so a test can tell a mesh that declared itself deforming from one that did not. */
|
|
84
|
+
ARRAY_BUFFER: 0x8892,
|
|
85
|
+
STATIC_DRAW: 0x88e4,
|
|
86
|
+
DYNAMIC_DRAW: 0x88e8,
|
|
87
|
+
};
|
|
88
|
+
const answers = {
|
|
89
|
+
getParameter: (pname) => {
|
|
90
|
+
if (pname === constants.MAX_TEXTURE_SIZE)
|
|
91
|
+
return 4096;
|
|
92
|
+
if (pname === constants.MAX_TEXTURE_IMAGE_UNITS)
|
|
93
|
+
return 16;
|
|
94
|
+
if (pname === constants.MAX_SAMPLES)
|
|
95
|
+
return 4;
|
|
96
|
+
if (pname === constants.MAX_FRAGMENT_UNIFORM_VECTORS)
|
|
97
|
+
return reportedVectors;
|
|
98
|
+
if (pname === constants.MAX_VERTEX_UNIFORM_VECTORS)
|
|
99
|
+
return 1024;
|
|
100
|
+
/* Generous by default: every remaining limit is a ceiling something is checked against,
|
|
101
|
+
and a small answer is read as a device that cannot do the thing. */
|
|
102
|
+
return 4096;
|
|
103
|
+
},
|
|
104
|
+
getExtension: (name) => (extensions.has(String(name)) ? {} : null),
|
|
105
|
+
getShaderParameter: () => true,
|
|
106
|
+
/*
|
|
107
|
+
* A shader remembers its own source, and a program remembers its fragment one, so a link can
|
|
108
|
+
* be refused for the reason a real driver refuses it rather than by a flag. Both are no-ops
|
|
109
|
+
* for every test that does not set a ceiling.
|
|
110
|
+
*/
|
|
111
|
+
createShader: (type) => ({ type }),
|
|
112
|
+
shaderSource: (shader, source) => {
|
|
113
|
+
if (typeof shader === 'object' && shader !== null && typeof source === 'string') {
|
|
114
|
+
fragmentSources.set(shader, source);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
attachShader: (program, shader) => {
|
|
118
|
+
if (typeof program !== 'object' || program === null)
|
|
119
|
+
return;
|
|
120
|
+
if (typeof shader !== 'object' || shader === null)
|
|
121
|
+
return;
|
|
122
|
+
const source = fragmentSources.get(shader);
|
|
123
|
+
/* The fragment stage is the one with a `void main` and no attributes; `#version` is on both,
|
|
124
|
+
so the discriminator is the qualifier only a fragment stage declares. */
|
|
125
|
+
if (source !== undefined && source.includes('precision highp float;')) {
|
|
126
|
+
programFragments.set(program, source);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
/* Linked yes; zero active uniforms and attributes, which ends every reflection loop at once
|
|
130
|
+
and is why this harness does not have to know a single uniform name. */
|
|
131
|
+
getProgramParameter: (program, pname) => {
|
|
132
|
+
if (pname === constants.ACTIVE_UNIFORMS || pname === constants.ACTIVE_ATTRIBUTES)
|
|
133
|
+
return 0;
|
|
134
|
+
if (pname !== constants.LINK_STATUS)
|
|
135
|
+
return true;
|
|
136
|
+
if (!Number.isFinite(enforcedVectors))
|
|
137
|
+
return true;
|
|
138
|
+
if (typeof program !== 'object' || program === null)
|
|
139
|
+
return true;
|
|
140
|
+
const source = programFragments.get(program);
|
|
141
|
+
return source === undefined || countUniformVectors(source) <= enforcedVectors;
|
|
142
|
+
},
|
|
143
|
+
getActiveUniform: () => ({ name: '', size: 1, type: 0 }),
|
|
144
|
+
getActiveAttrib: () => ({ name: '', size: 1, type: 0 }),
|
|
145
|
+
getUniformLocation: () => ({}),
|
|
146
|
+
getAttribLocation: () => -1,
|
|
147
|
+
checkFramebufferStatus: () => constants.FRAMEBUFFER_COMPLETE,
|
|
148
|
+
getError: () => constants.NO_ERROR,
|
|
149
|
+
getShaderInfoLog: () => '',
|
|
150
|
+
/* ANGLE's own words for this refusal, so a test asserting on the message is asserting on the
|
|
151
|
+
sentence a consumer actually pastes into a report. */
|
|
152
|
+
getProgramInfoLog: () => Number.isFinite(enforcedVectors)
|
|
153
|
+
? `FRAGMENT shader uniforms count exceeds MAX_FRAGMENT_UNIFORM_VECTORS(${enforcedVectors})`
|
|
154
|
+
: '',
|
|
155
|
+
isContextLost: () => false,
|
|
156
|
+
};
|
|
157
|
+
const gl = new Proxy({}, {
|
|
158
|
+
get(_target, prop) {
|
|
159
|
+
if (prop in constants)
|
|
160
|
+
return constants[prop];
|
|
161
|
+
if (prop in answers) {
|
|
162
|
+
return (...args) => {
|
|
163
|
+
calls.push({ name: prop, args });
|
|
164
|
+
return answers[prop]?.(...args);
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/* An unnamed call: recorded, and answered with a fresh object so a handle is a handle. */
|
|
168
|
+
return (...args) => {
|
|
169
|
+
calls.push({ name: prop, args });
|
|
170
|
+
return {};
|
|
171
|
+
};
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
const canvas = {
|
|
175
|
+
width: 640,
|
|
176
|
+
height: 480,
|
|
177
|
+
clientWidth: 640,
|
|
178
|
+
clientHeight: 480,
|
|
179
|
+
getContext: () => gl,
|
|
180
|
+
addEventListener: () => { },
|
|
181
|
+
removeEventListener: () => { },
|
|
182
|
+
getBoundingClientRect: () => ({ left: 0, top: 0, width: 640, height: 480 }),
|
|
183
|
+
};
|
|
184
|
+
return { gl, canvas, calls };
|
|
185
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold a frame budget by moving the drawing-buffer scale, and nothing else.
|
|
3
|
+
*
|
|
4
|
+
* This is the safety net the GPU-budget design asks for, and the reason it is worth
|
|
5
|
+
* having is that it works on hardware nobody here owns — including hardware that does not
|
|
6
|
+
* exist yet. One of the three players whose reports started that design found the cure by
|
|
7
|
+
* hand: they shrank the browser window until the game was smooth. This does the same
|
|
8
|
+
* thing without asking anyone to.
|
|
9
|
+
*
|
|
10
|
+
* **Pure by design: no GL, no DOM, no clock.** Frame times come in, a new scale comes
|
|
11
|
+
* out, and the caller decides what to do with it. That is what makes it testable at all,
|
|
12
|
+
* because every device it exists for is one no test machine has.
|
|
13
|
+
*
|
|
14
|
+
* **Asymmetric on purpose.** Dropping is fast, because a player at 6 fps needs relief
|
|
15
|
+
* now. Raising is slow and waits behind several consecutive good windows, because a
|
|
16
|
+
* resolution that oscillates is more visible than one that is slightly too low.
|
|
17
|
+
*/
|
|
18
|
+
export interface GovernorLimits {
|
|
19
|
+
/**
|
|
20
|
+
* The frame time a frame is allowed, in milliseconds. Longer than this is a *long* frame.
|
|
21
|
+
*
|
|
22
|
+
* 40 rather than 16.67, and that gap is the tolerance. This is not a governor for
|
|
23
|
+
* squeezing a machine from 55 fps to 60: it exists for the parts that render at 4 to 9
|
|
24
|
+
* fps, and a trigger anywhere near the vsync interval would spend its life reacting to
|
|
25
|
+
* jitter on machines that are entirely fine. It is `LONG_FRAME_MS` from the consuming
|
|
26
|
+
* game's own frame health, deliberately, because that number has already been tuned
|
|
27
|
+
* against real false positives.
|
|
28
|
+
*/
|
|
29
|
+
readonly budgetMs: number;
|
|
30
|
+
/**
|
|
31
|
+
* Share of a window's frames that must be long before the window counts as bad.
|
|
32
|
+
*
|
|
33
|
+
* **This is the guard that makes a busy high-end machine safe.** One hitch in sixty
|
|
34
|
+
* frames is a 1.7% share and decides nothing; a garbage collection, a shader compile, a
|
|
35
|
+
* texture upload or another application grabbing the GPU all look like that. Half the
|
|
36
|
+
* window being long is not a hitch, it is the machine.
|
|
37
|
+
*/
|
|
38
|
+
readonly badShare: number;
|
|
39
|
+
/** Never go below this. A soft picture beats a slideshow. */
|
|
40
|
+
readonly minScale: number;
|
|
41
|
+
/** Frames per decision. One slow frame is noise; a window of them is evidence. */
|
|
42
|
+
readonly windowFrames: number;
|
|
43
|
+
/**
|
|
44
|
+
* Consecutive bad windows before the scale actually moves.
|
|
45
|
+
*
|
|
46
|
+
* The second half of the tolerance, and the same reasoning `SLOW_WINDOWS` carries in the
|
|
47
|
+
* game: one bad window is a level load, a world build, a tab that just came back. Two in
|
|
48
|
+
* a row is a machine, because none of those things happen twice in a row.
|
|
49
|
+
*/
|
|
50
|
+
readonly badWindows: number;
|
|
51
|
+
/** How far to drop in one decision. */
|
|
52
|
+
readonly dropStep: number;
|
|
53
|
+
/** How far to raise in one decision. Deliberately smaller than `dropStep`. */
|
|
54
|
+
readonly raiseStep: number;
|
|
55
|
+
/** Consecutive clean windows required before raising at all. */
|
|
56
|
+
readonly raisePatience: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Deliberately hard to trigger. Work through what a healthy machine has to do to move it.
|
|
60
|
+
*
|
|
61
|
+
* At 120 fps, sixty frames is half a second. To drop one step a machine must spend **thirty
|
|
62
|
+
* of those sixty frames over 40 ms**, then do it again in the very next window: roughly a
|
|
63
|
+
* full second in which half the frames missed 25 fps. Nothing transient does that. A
|
|
64
|
+
* garbage collection is one frame, a shader compile is a handful, another application
|
|
65
|
+
* grabbing the GPU for a moment is a fraction of a window, and every one of them leaves the
|
|
66
|
+
* share far under a half.
|
|
67
|
+
*
|
|
68
|
+
* The devices this exists for are not marginal and do not need a sensitive trigger.
|
|
69
|
+
* `NFD6QQ`'s Adreno 619 held **156.66 ms** — every frame long, a share of 1.0 — so it
|
|
70
|
+
* clears two windows without ambiguity while a busy desktop never clears one.
|
|
71
|
+
*
|
|
72
|
+
* The 0.5 floor is `RESOLUTION_MIN` from the game's own settings screen, so the governor can
|
|
73
|
+
* never take a player somewhere they could not have gone themselves.
|
|
74
|
+
*/
|
|
75
|
+
export declare const DEFAULT_GOVERNOR_LIMITS: GovernorLimits;
|
|
76
|
+
export declare class ResolutionGovernor {
|
|
77
|
+
private readonly limits;
|
|
78
|
+
private ceiling;
|
|
79
|
+
private current;
|
|
80
|
+
private frames;
|
|
81
|
+
private longFrames;
|
|
82
|
+
private badWindows;
|
|
83
|
+
private goodWindows;
|
|
84
|
+
constructor(ceiling: number, limits?: Partial<GovernorLimits>);
|
|
85
|
+
get scale(): number;
|
|
86
|
+
/**
|
|
87
|
+
* The player's own ceiling moved.
|
|
88
|
+
*
|
|
89
|
+
* A *lower* ceiling applies at once, because their choice is authority and waiting a
|
|
90
|
+
* window to honour it would be ignoring them. A *higher* one is only a permission: it
|
|
91
|
+
* does not raise the current scale, because jumping up would undo a drop the device had
|
|
92
|
+
* already earned. The patience path decides whether it can afford to climb back.
|
|
93
|
+
*/
|
|
94
|
+
setCeiling(ceiling: number): void;
|
|
95
|
+
/** Start the window again, leaving the scale where it is. */
|
|
96
|
+
reset(): void;
|
|
97
|
+
/**
|
|
98
|
+
* One frame. Returns the new scale when it changed and `null` when it did not, so the
|
|
99
|
+
* caller does no GL or DOM work on an ordinary frame.
|
|
100
|
+
*
|
|
101
|
+
* `playable` exists because of `DZTF9F`, where an RTX 3060 filed a report calling
|
|
102
|
+
* itself unplayable from a menu: a menu frame and a hidden-tab frame are not verdicts
|
|
103
|
+
* about the machine. A governor that believed them would soften a game running
|
|
104
|
+
* perfectly, which is the same false positive with a more visible symptom.
|
|
105
|
+
*/
|
|
106
|
+
sample(frameMs: number, playable: boolean): number | null;
|
|
107
|
+
}
|