@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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baking a mark into a still image sized to a video frame.
|
|
3
|
+
*
|
|
4
|
+
* Everything is placed and sized in **fractions of the frame**, never pixels.
|
|
5
|
+
* That is the whole point of the module: the same overlay has to read correctly
|
|
6
|
+
* at 1080x1920 and at 720x1280, and a mark laid out in pixels is either
|
|
7
|
+
* illegible at the smaller size or covers a quarter of the smaller frame. Text
|
|
8
|
+
* scales against the frame's *shorter* side so a portrait and a landscape
|
|
9
|
+
* export get a mark of the same apparent size rather than one that grows with
|
|
10
|
+
* whichever dimension happens to be long.
|
|
11
|
+
*
|
|
12
|
+
* Baked once, drawn once per captured frame. Painting a few hundred glyph cells
|
|
13
|
+
* per frame would be thirty times the work for an image that never changes.
|
|
14
|
+
*
|
|
15
|
+
* Nothing here knows what the mark says. Text, colour and position are the
|
|
16
|
+
* caller's; the font is the engine's 5x7 grid, so a mark needs no asset and
|
|
17
|
+
* cannot fail to load.
|
|
18
|
+
*/
|
|
19
|
+
export interface OverlayText {
|
|
20
|
+
readonly text: string;
|
|
21
|
+
/** Left edge, as a fraction of frame width. */
|
|
22
|
+
readonly x: number;
|
|
23
|
+
/** Top edge, as a fraction of frame height. */
|
|
24
|
+
readonly y: number;
|
|
25
|
+
/** One glyph cell, as a fraction of the frame's shorter side. */
|
|
26
|
+
readonly cell: number;
|
|
27
|
+
readonly color: string;
|
|
28
|
+
readonly alpha?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Anything a 2D context can draw and report a natural size for. */
|
|
31
|
+
export type OverlayImageSource = HTMLImageElement | HTMLCanvasElement | ImageBitmap;
|
|
32
|
+
export interface OverlayImage {
|
|
33
|
+
readonly image: OverlayImageSource;
|
|
34
|
+
readonly x: number;
|
|
35
|
+
readonly y: number;
|
|
36
|
+
/** Drawn height, as a fraction of the frame's shorter side. */
|
|
37
|
+
readonly height: number;
|
|
38
|
+
readonly alpha?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface FrameOverlay {
|
|
41
|
+
readonly texts?: readonly OverlayText[];
|
|
42
|
+
readonly images?: readonly OverlayImage[];
|
|
43
|
+
}
|
|
44
|
+
/** Lit cells of a string, at a cell size in device pixels. */
|
|
45
|
+
export declare function drawPixelText(ctx: CanvasRenderingContext2D, text: string, left: number, top: number, cell: number, color: string): void;
|
|
46
|
+
/** Pixel width and height of a string at a given cell size. */
|
|
47
|
+
export declare function pixelTextSize(text: string, cell: number): {
|
|
48
|
+
width: number;
|
|
49
|
+
height: number;
|
|
50
|
+
};
|
|
51
|
+
/** Cells a string occupies horizontally, including inter-glyph gaps. */
|
|
52
|
+
export declare function pixelTextCells(text: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Paint an overlay into a transparent canvas of exactly the frame's size.
|
|
55
|
+
*
|
|
56
|
+
* Returns null when there is nothing to draw, so a caller can skip the
|
|
57
|
+
* composite entirely rather than blending a blank layer over every frame.
|
|
58
|
+
*/
|
|
59
|
+
export declare function bakeOverlay(overlay: FrameOverlay, width: number, height: number): HTMLCanvasElement | null;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { GLYPH_HEIGHT, GLYPH_SPACING, GLYPH_WIDTH, forEachCell, measureText, } from '../geometry/pixelFont.js';
|
|
2
|
+
/**
|
|
3
|
+
* How far the shadow sits behind the mark, in cells.
|
|
4
|
+
*
|
|
5
|
+
* A watermark has to survive both a night sky and a noon one. Light type alone
|
|
6
|
+
* disappears against a bright horizon — which in this game is most of the frame
|
|
7
|
+
* — so every glyph is stamped once in near-black first. One cell of offset,
|
|
8
|
+
* because a blur would fight the hard-edged look everything else has.
|
|
9
|
+
*/
|
|
10
|
+
const SHADOW_CELLS = 1;
|
|
11
|
+
const SHADOW_COLOR = 'rgba(2, 5, 10, 0.55)';
|
|
12
|
+
/** Lit cells of a string, at a cell size in device pixels. */
|
|
13
|
+
export function drawPixelText(ctx, text, left, top, cell, color) {
|
|
14
|
+
const height = GLYPH_HEIGHT * cell;
|
|
15
|
+
const paint = (dx, dy, fill) => {
|
|
16
|
+
ctx.fillStyle = fill;
|
|
17
|
+
forEachCell(text, (cx, cy) => {
|
|
18
|
+
// Cell y counts up from the baseline; a canvas counts down from the top.
|
|
19
|
+
ctx.fillRect(left + dx + cx * cell, top + dy + height - (cy + 1) * cell,
|
|
20
|
+
// A hair of overlap, or antialiasing draws a seam between adjacent
|
|
21
|
+
// cells and the letters look woven rather than solid.
|
|
22
|
+
cell + 0.5, cell + 0.5);
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
paint(SHADOW_CELLS * cell, SHADOW_CELLS * cell, SHADOW_COLOR);
|
|
26
|
+
paint(0, 0, color);
|
|
27
|
+
}
|
|
28
|
+
/** Pixel width and height of a string at a given cell size. */
|
|
29
|
+
export function pixelTextSize(text, cell) {
|
|
30
|
+
return { width: measureText(text) * cell, height: GLYPH_HEIGHT * cell };
|
|
31
|
+
}
|
|
32
|
+
/** Cells a string occupies horizontally, including inter-glyph gaps. */
|
|
33
|
+
export function pixelTextCells(text) {
|
|
34
|
+
return text.length === 0 ? 0 : text.length * (GLYPH_WIDTH + GLYPH_SPACING) - GLYPH_SPACING;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Paint an overlay into a transparent canvas of exactly the frame's size.
|
|
38
|
+
*
|
|
39
|
+
* Returns null when there is nothing to draw, so a caller can skip the
|
|
40
|
+
* composite entirely rather than blending a blank layer over every frame.
|
|
41
|
+
*/
|
|
42
|
+
export function bakeOverlay(overlay, width, height) {
|
|
43
|
+
const texts = overlay.texts ?? [];
|
|
44
|
+
const images = overlay.images ?? [];
|
|
45
|
+
if (texts.length === 0 && images.length === 0)
|
|
46
|
+
return null;
|
|
47
|
+
const canvas = document.createElement('canvas');
|
|
48
|
+
canvas.width = width;
|
|
49
|
+
canvas.height = height;
|
|
50
|
+
const ctx = canvas.getContext('2d');
|
|
51
|
+
if (ctx === null)
|
|
52
|
+
return null;
|
|
53
|
+
const short = Math.min(width, height);
|
|
54
|
+
for (const image of images) {
|
|
55
|
+
const drawHeight = image.height * short;
|
|
56
|
+
const natural = imageAspect(image.image);
|
|
57
|
+
ctx.globalAlpha = image.alpha ?? 1;
|
|
58
|
+
ctx.drawImage(image.image, image.x * width, image.y * height, drawHeight * natural, drawHeight);
|
|
59
|
+
}
|
|
60
|
+
for (const text of texts) {
|
|
61
|
+
ctx.globalAlpha = text.alpha ?? 1;
|
|
62
|
+
/*
|
|
63
|
+
* Snapped to whole pixels. A 5x7 grid drawn on a half-pixel boundary is
|
|
64
|
+
* antialiased on every cell edge, which turns a hard-edged mark into a grey
|
|
65
|
+
* smudge — the one thing a watermark cannot be, since it is small by design.
|
|
66
|
+
*/
|
|
67
|
+
drawPixelText(ctx, text.text, Math.round(text.x * width), Math.round(text.y * height), text.cell * short, text.color);
|
|
68
|
+
}
|
|
69
|
+
ctx.globalAlpha = 1;
|
|
70
|
+
return canvas;
|
|
71
|
+
}
|
|
72
|
+
function imageAspect(image) {
|
|
73
|
+
const width = image instanceof HTMLImageElement ? image.naturalWidth || image.width : image.width;
|
|
74
|
+
const height = image instanceof HTMLImageElement ? image.naturalHeight || image.height : image.height;
|
|
75
|
+
return height > 0 ? width / height : 1;
|
|
76
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deciding which of a render loop's frames go into a recording, and measuring
|
|
3
|
+
* what came out.
|
|
4
|
+
*
|
|
5
|
+
* The measuring half is not diagnostics bolted on afterwards — it is half the
|
|
6
|
+
* reason this module exists. A clip that "judders" has at least three possible
|
|
7
|
+
* causes (the renderer missing its rate, the encoder starved of bitrate, the
|
|
8
|
+
* content itself stepping unevenly) and they are indistinguishable by eye. What
|
|
9
|
+
* separates them is a number: how many frames the loop produced, how many were
|
|
10
|
+
* handed to the recorder, and how far apart in wall-clock time those were.
|
|
11
|
+
*
|
|
12
|
+
* **The schedule counts animation frames, not milliseconds, and that is the
|
|
13
|
+
* whole design.** A recorder stamps each frame with the instant it arrived, and
|
|
14
|
+
* the only instants a render loop can offer are its display's own — so a
|
|
15
|
+
* schedule expressed in wall-clock slots asks for moments that do not exist. It
|
|
16
|
+
* then takes the nearest frame either side, alternately early and late, and the
|
|
17
|
+
* file holds frames of uneven duration: 13.9 ms, 20.8 ms, 13.9 ms on a 144 Hz
|
|
18
|
+
* panel asked for 60 a second. Capturing every *n*-th frame instead makes every
|
|
19
|
+
* gap identical by construction, which is what makes the clip play evenly.
|
|
20
|
+
*
|
|
21
|
+
* The rate that comes out is therefore the display's rate divided by a whole
|
|
22
|
+
* number — 60 from 60 Hz, 72 from 144, 60 from 240 — rather than exactly what
|
|
23
|
+
* was asked for. That is the right trade: a clip at 72 fps whose frames are
|
|
24
|
+
* evenly spaced is smooth, and one at exactly 60 whose frames are not is the
|
|
25
|
+
* defect this replaced.
|
|
26
|
+
*
|
|
27
|
+
* Two rules the schedule follows, both learned from what a stutter looks like:
|
|
28
|
+
*
|
|
29
|
+
* - **Never two captures for one animation frame.** A duplicated frame is a
|
|
30
|
+
* frozen instant followed by a double-length step, which reads as a hitch
|
|
31
|
+
* even though nothing was dropped. Counting frames makes this true by
|
|
32
|
+
* construction.
|
|
33
|
+
* - **After falling behind, resume — do not catch up.** Firing twice in quick
|
|
34
|
+
* succession to make up a missed slot converts one gap into a lurch forward.
|
|
35
|
+
* A gap is a frame nobody notices; a lurch is the artefact everybody calls
|
|
36
|
+
* lag.
|
|
37
|
+
*/
|
|
38
|
+
export interface FramePacingReport {
|
|
39
|
+
readonly targetFps: number;
|
|
40
|
+
/** Animation frames the loop produced while the pacer was running. */
|
|
41
|
+
readonly rendered: number;
|
|
42
|
+
/** Frames handed to the recorder. */
|
|
43
|
+
readonly captured: number;
|
|
44
|
+
/** Frames per second actually captured, over the whole run. */
|
|
45
|
+
readonly capturedFps: number;
|
|
46
|
+
/** Mean wall-clock gap between captured frames, ms. */
|
|
47
|
+
readonly meanGapMs: number;
|
|
48
|
+
/** The worst single gap, ms — the one the eye actually notices. */
|
|
49
|
+
readonly worstGapMs: number;
|
|
50
|
+
/**
|
|
51
|
+
* Captures that arrived well outside the cadence the rest of the clip holds.
|
|
52
|
+
*
|
|
53
|
+
* Measured against the clip's *own* spacing rather than against the requested
|
|
54
|
+
* rate, because the two are allowed to differ: a display that divides to 72 fps
|
|
55
|
+
* or a loop that can only manage 40 both produce a clip whose every frame is
|
|
56
|
+
* evenly spaced, and neither is a fault. What is a fault is one frame taking
|
|
57
|
+
* half again as long as its neighbours, and that is what this counts.
|
|
58
|
+
*/
|
|
59
|
+
readonly slipped: number;
|
|
60
|
+
/** Animation frames per capture — the schedule the clip actually ran on. */
|
|
61
|
+
readonly stride: number;
|
|
62
|
+
readonly elapsedMs: number;
|
|
63
|
+
}
|
|
64
|
+
export declare class FramePacer {
|
|
65
|
+
readonly targetFps: number;
|
|
66
|
+
private readonly intervalMs;
|
|
67
|
+
/** Animation frames per capture. One until the loop's own rate is known. */
|
|
68
|
+
private strideFrames;
|
|
69
|
+
private framesSinceCapture;
|
|
70
|
+
private startMs;
|
|
71
|
+
private lastCaptureMs;
|
|
72
|
+
/**
|
|
73
|
+
* What one animation frame costs, ms — a trimmed minimum over a recent window.
|
|
74
|
+
*
|
|
75
|
+
* See `trimmedMinimum` for why the low end and not the middle. Three estimators
|
|
76
|
+
* were tried before it and each failed in a way worth recording: a running minimum
|
|
77
|
+
* over all time ratcheted down on anomalies until a clean 120 Hz loop recorded
|
|
78
|
+
* **24 fps**; a mean was dragged up by every overrunning frame, doubling the rate
|
|
79
|
+
* for the thirty frames an average takes to decay after one hitch; a median sat too
|
|
80
|
+
* far above the floor and wandered across the stride boundary.
|
|
81
|
+
*/
|
|
82
|
+
private frameIntervalMs;
|
|
83
|
+
/** Recent animation-frame intervals, and a scratch buffer to sort them in. */
|
|
84
|
+
private readonly samples;
|
|
85
|
+
private readonly sorted;
|
|
86
|
+
private sampleCount;
|
|
87
|
+
/** The instant last seen, so a frame is only ever counted once. */
|
|
88
|
+
private lastSeenMs;
|
|
89
|
+
private seen;
|
|
90
|
+
/** Rolling estimate of the gap the clip is actually holding, for `slipped`. */
|
|
91
|
+
private cadenceMs;
|
|
92
|
+
private renderedFrames;
|
|
93
|
+
private capturedFrames;
|
|
94
|
+
private gapSumMs;
|
|
95
|
+
private worstGapMs;
|
|
96
|
+
private slippedFrames;
|
|
97
|
+
private started;
|
|
98
|
+
constructor(targetFps: number);
|
|
99
|
+
/**
|
|
100
|
+
* Whether this animation frame is one the recording wants, without committing.
|
|
101
|
+
*
|
|
102
|
+
* The query half of `offer`, and it exists so a caller can decide *before
|
|
103
|
+
* rendering* whether the frame it is about to draw will be kept. A renderer that
|
|
104
|
+
* draws every animation frame and then discards most of them spends its whole
|
|
105
|
+
* budget competing with the frame it means to keep.
|
|
106
|
+
*
|
|
107
|
+
* Called once per animation frame, before drawing. That is also where the loop's
|
|
108
|
+
* own interval is measured, since it is the only call that sees every frame:
|
|
109
|
+
* `offer` only sees the ones that were drawn.
|
|
110
|
+
*
|
|
111
|
+
* Allocation-free: this is called from inside a render loop.
|
|
112
|
+
*/
|
|
113
|
+
due(nowMs: number): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Commit to the frame `due` was asked about.
|
|
116
|
+
*
|
|
117
|
+
* **`nowMs` must be the instant `due` was given, not the instant the frame
|
|
118
|
+
* finished drawing.** Both halves have to agree about when the frame is, or a
|
|
119
|
+
* frame is counted twice — once on the way in and once on the way out — and the
|
|
120
|
+
* loop's measured interval comes out at half its true value.
|
|
121
|
+
*
|
|
122
|
+
* A caller with nothing to gate may pass whatever clock it has, as long as it is
|
|
123
|
+
* the same one every frame.
|
|
124
|
+
*/
|
|
125
|
+
offer(nowMs: number): boolean;
|
|
126
|
+
/** One animation frame seen, for the interval estimate and the frame count. */
|
|
127
|
+
private observe;
|
|
128
|
+
/**
|
|
129
|
+
* Forget what has been measured, keep the schedule.
|
|
130
|
+
*
|
|
131
|
+
* For a recording with a warm-up in front of it: the frames a device spends
|
|
132
|
+
* getting an encoder and a driver going are genuinely awful — measured at 411 ms
|
|
133
|
+
* and 503 ms for a 1080x1920 clip — and they are not what the clip is like. Left in
|
|
134
|
+
* the report they become the worst gap and a couple of slipped frames, which is the
|
|
135
|
+
* evidence an export decides whether to warn the player on.
|
|
136
|
+
*
|
|
137
|
+
* The schedule survives on purpose: it was chosen from those same frames and it is
|
|
138
|
+
* still right.
|
|
139
|
+
*/
|
|
140
|
+
resetMeasurement(): void;
|
|
141
|
+
get report(): FramePacingReport;
|
|
142
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far outside the established cadence a gap has to fall to count as slipped.
|
|
3
|
+
* A little over one gap, so ordinary display jitter is not reported as a fault.
|
|
4
|
+
*/
|
|
5
|
+
const SLIP_FACTOR = 1.4;
|
|
6
|
+
/** Weight of the newest gap in the cadence estimate. */
|
|
7
|
+
const CADENCE_EMA = 0.15;
|
|
8
|
+
/**
|
|
9
|
+
* Animation frames the interval estimate is taken over.
|
|
10
|
+
*
|
|
11
|
+
* Sixteen: a quarter of a second at 60 Hz, which is long enough to absorb one bad
|
|
12
|
+
* sample and short enough that the schedule is settled before anything is recorded.
|
|
13
|
+
* The estimate is re-taken every time the window fills, so a loop that gets heavier
|
|
14
|
+
* mid-clip is followed rather than held to a schedule it can no longer keep.
|
|
15
|
+
*/
|
|
16
|
+
const SAMPLE_WINDOW = 16;
|
|
17
|
+
/**
|
|
18
|
+
* Slack in the stride calculation, as a share of the ratio being floored.
|
|
19
|
+
*
|
|
20
|
+
* Half a percent, and it is small because the estimator earns it. A 60 Hz display
|
|
21
|
+
* asked for 30 fps wants a stride of exactly 2, and a measured interval of 16.6668 ms
|
|
22
|
+
* gives a ratio of 1.99998 — so a bare `floor` answers 1 and doubles the rate. That
|
|
23
|
+
* is the entire job: cover a measurement that lands a hair long, and floating point.
|
|
24
|
+
*
|
|
25
|
+
* It was five percent while the estimate came from a median, which sits *above* the
|
|
26
|
+
* display's period and needed the room. A trimmed minimum sits at or just below it,
|
|
27
|
+
* so the ratio errs high already and slack on top only pushes it over the next
|
|
28
|
+
* boundary the wrong way: measured at five percent, a 100 Hz panel asked for 60
|
|
29
|
+
* sometimes recorded 50 instead of 100, because a jittery window read the period as
|
|
30
|
+
* 8.6 ms and 1.94 became 2.03.
|
|
31
|
+
*/
|
|
32
|
+
const STRIDE_SLACK = 0.005;
|
|
33
|
+
/**
|
|
34
|
+
* How far past its boundary the measurement has to move before the stride changes,
|
|
35
|
+
* in whole strides.
|
|
36
|
+
*
|
|
37
|
+
* A fifth, and this is the part slack alone could not do. The stride is a *discrete*
|
|
38
|
+
* choice, so a ratio sitting near a boundary flips it on the noise in the estimate —
|
|
39
|
+
* and a flip between 1 and 2 doubles the clip's frame rate. Measured on a loop with
|
|
40
|
+
* 24% frame-time jitter and a true ratio of exactly 2.0: the median of a
|
|
41
|
+
* sixteen-frame window wanders between 16.7 ms and 18.3 ms, which is a ratio between
|
|
42
|
+
* 2.0 and 1.82, and the stride flipped five times in a ten-second clip.
|
|
43
|
+
*
|
|
44
|
+
* A display's period does not change, so the right default is to keep the schedule
|
|
45
|
+
* already chosen and demand real evidence to leave it. A fifth of a stride is well
|
|
46
|
+
* past what a median of sixteen frames is wrong by and well short of a genuine step.
|
|
47
|
+
*/
|
|
48
|
+
const STRIDE_HYSTERESIS = 0.2;
|
|
49
|
+
/**
|
|
50
|
+
* Animation frames per capture, given the target interval, what one animation frame
|
|
51
|
+
* actually costs, and the schedule already running.
|
|
52
|
+
*
|
|
53
|
+
* Rounded down, so the rate that comes out is never *below* the one asked for while
|
|
54
|
+
* the loop can hold it: a 100 Hz display asked for 60 records 100 rather than 50,
|
|
55
|
+
* which is more frames than needed and smooth, where the other way round is fewer
|
|
56
|
+
* frames than promised.
|
|
57
|
+
*
|
|
58
|
+
* `current` is held on to unless the measurement has moved clearly past its
|
|
59
|
+
* boundary — see `STRIDE_HYSTERESIS`. Pass 0 to choose freely.
|
|
60
|
+
*/
|
|
61
|
+
function strideFor(targetIntervalMs, frameIntervalMs, current = 0) {
|
|
62
|
+
if (!(frameIntervalMs > 0))
|
|
63
|
+
return Math.max(1, current);
|
|
64
|
+
const scaled = (targetIntervalMs / frameIntervalMs) * (1 + STRIDE_SLACK);
|
|
65
|
+
if (current > 0 &&
|
|
66
|
+
scaled >= current - STRIDE_HYSTERESIS &&
|
|
67
|
+
scaled < current + 1 + STRIDE_HYSTERESIS) {
|
|
68
|
+
return current;
|
|
69
|
+
}
|
|
70
|
+
return Math.max(1, Math.floor(scaled));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Second-smallest of `values`, sorted into `scratch`.
|
|
74
|
+
*
|
|
75
|
+
* **A trimmed minimum, and the choice of statistic is the whole point.** What is
|
|
76
|
+
* being estimated is the display's period, and that is a *floor* on how long an
|
|
77
|
+
* animation frame can take — a frame cannot come back sooner than the next vsync, it
|
|
78
|
+
* can only take longer and land on a later one. So the low end of the distribution is
|
|
79
|
+
* where the answer lives, and the mean and the median are both biased above it by
|
|
80
|
+
* however hard the loop is working.
|
|
81
|
+
*
|
|
82
|
+
* Which matters because the estimate feeds a `floor`: a stride of 2 asks whether the
|
|
83
|
+
* ratio is above or below 2, and an estimator that wanders either side of the answer
|
|
84
|
+
* flips the clip's frame rate. Measured with a median of sixteen: on a loop with 24%
|
|
85
|
+
* frame-time jitter and a true ratio of exactly 2, the median wandered between
|
|
86
|
+
* 16.7 ms and 18.3 ms and the stride flipped, taking a 30 fps request to 36.
|
|
87
|
+
*
|
|
88
|
+
* Second-smallest rather than smallest because the minimum has no defence at all
|
|
89
|
+
* against a bad sample — two callbacks in one frame, a clock that jumped, a tab
|
|
90
|
+
* waking up — and one of those in a window would set a stride far too long. One
|
|
91
|
+
* anomaly per sixteen frames is absorbed; two in the same window is not, which is a
|
|
92
|
+
* trade rather than an oversight.
|
|
93
|
+
*
|
|
94
|
+
* Insertion sort into a caller-owned buffer, because this runs inside a render loop
|
|
95
|
+
* and must not allocate. Sixteen elements nearly in order is a handful of
|
|
96
|
+
* comparisons; the general case is still trivial at this size.
|
|
97
|
+
*/
|
|
98
|
+
function trimmedMinimum(values, scratch) {
|
|
99
|
+
const n = values.length;
|
|
100
|
+
for (let i = 0; i < n; i++) {
|
|
101
|
+
const value = values[i] ?? 0;
|
|
102
|
+
let j = i - 1;
|
|
103
|
+
while (j >= 0 && (scratch[j] ?? 0) > value) {
|
|
104
|
+
scratch[j + 1] = scratch[j] ?? 0;
|
|
105
|
+
j--;
|
|
106
|
+
}
|
|
107
|
+
scratch[j + 1] = value;
|
|
108
|
+
}
|
|
109
|
+
return scratch[Math.min(1, n - 1)] ?? 0;
|
|
110
|
+
}
|
|
111
|
+
export class FramePacer {
|
|
112
|
+
targetFps;
|
|
113
|
+
intervalMs;
|
|
114
|
+
/** Animation frames per capture. One until the loop's own rate is known. */
|
|
115
|
+
strideFrames = 1;
|
|
116
|
+
framesSinceCapture = 0;
|
|
117
|
+
startMs = 0;
|
|
118
|
+
lastCaptureMs = 0;
|
|
119
|
+
/**
|
|
120
|
+
* What one animation frame costs, ms — a trimmed minimum over a recent window.
|
|
121
|
+
*
|
|
122
|
+
* See `trimmedMinimum` for why the low end and not the middle. Three estimators
|
|
123
|
+
* were tried before it and each failed in a way worth recording: a running minimum
|
|
124
|
+
* over all time ratcheted down on anomalies until a clean 120 Hz loop recorded
|
|
125
|
+
* **24 fps**; a mean was dragged up by every overrunning frame, doubling the rate
|
|
126
|
+
* for the thirty frames an average takes to decay after one hitch; a median sat too
|
|
127
|
+
* far above the floor and wandered across the stride boundary.
|
|
128
|
+
*/
|
|
129
|
+
frameIntervalMs = 0;
|
|
130
|
+
/** Recent animation-frame intervals, and a scratch buffer to sort them in. */
|
|
131
|
+
samples = new Float64Array(SAMPLE_WINDOW);
|
|
132
|
+
sorted = new Float64Array(SAMPLE_WINDOW);
|
|
133
|
+
sampleCount = 0;
|
|
134
|
+
/** The instant last seen, so a frame is only ever counted once. */
|
|
135
|
+
lastSeenMs = 0;
|
|
136
|
+
seen = false;
|
|
137
|
+
/** Rolling estimate of the gap the clip is actually holding, for `slipped`. */
|
|
138
|
+
cadenceMs = 0;
|
|
139
|
+
renderedFrames = 0;
|
|
140
|
+
capturedFrames = 0;
|
|
141
|
+
gapSumMs = 0;
|
|
142
|
+
worstGapMs = 0;
|
|
143
|
+
slippedFrames = 0;
|
|
144
|
+
started = false;
|
|
145
|
+
constructor(targetFps) {
|
|
146
|
+
this.targetFps = targetFps;
|
|
147
|
+
this.intervalMs = 1000 / Math.max(targetFps, 1);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Whether this animation frame is one the recording wants, without committing.
|
|
151
|
+
*
|
|
152
|
+
* The query half of `offer`, and it exists so a caller can decide *before
|
|
153
|
+
* rendering* whether the frame it is about to draw will be kept. A renderer that
|
|
154
|
+
* draws every animation frame and then discards most of them spends its whole
|
|
155
|
+
* budget competing with the frame it means to keep.
|
|
156
|
+
*
|
|
157
|
+
* Called once per animation frame, before drawing. That is also where the loop's
|
|
158
|
+
* own interval is measured, since it is the only call that sees every frame:
|
|
159
|
+
* `offer` only sees the ones that were drawn.
|
|
160
|
+
*
|
|
161
|
+
* Allocation-free: this is called from inside a render loop.
|
|
162
|
+
*/
|
|
163
|
+
due(nowMs) {
|
|
164
|
+
this.observe(nowMs);
|
|
165
|
+
if (!this.started)
|
|
166
|
+
return true;
|
|
167
|
+
return this.framesSinceCapture >= this.strideFrames;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Commit to the frame `due` was asked about.
|
|
171
|
+
*
|
|
172
|
+
* **`nowMs` must be the instant `due` was given, not the instant the frame
|
|
173
|
+
* finished drawing.** Both halves have to agree about when the frame is, or a
|
|
174
|
+
* frame is counted twice — once on the way in and once on the way out — and the
|
|
175
|
+
* loop's measured interval comes out at half its true value.
|
|
176
|
+
*
|
|
177
|
+
* A caller with nothing to gate may pass whatever clock it has, as long as it is
|
|
178
|
+
* the same one every frame.
|
|
179
|
+
*/
|
|
180
|
+
offer(nowMs) {
|
|
181
|
+
this.observe(nowMs);
|
|
182
|
+
if (!this.started) {
|
|
183
|
+
this.started = true;
|
|
184
|
+
this.startMs = nowMs;
|
|
185
|
+
this.lastCaptureMs = nowMs;
|
|
186
|
+
this.framesSinceCapture = 0;
|
|
187
|
+
this.capturedFrames = 1;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
if (this.framesSinceCapture < this.strideFrames)
|
|
191
|
+
return false;
|
|
192
|
+
const gap = nowMs - this.lastCaptureMs;
|
|
193
|
+
this.gapSumMs += gap;
|
|
194
|
+
if (gap > this.worstGapMs)
|
|
195
|
+
this.worstGapMs = gap;
|
|
196
|
+
// Against the cadence so far, and only once there is one to compare with.
|
|
197
|
+
if (this.cadenceMs > 0 && gap > this.cadenceMs * SLIP_FACTOR)
|
|
198
|
+
this.slippedFrames++;
|
|
199
|
+
this.cadenceMs =
|
|
200
|
+
this.cadenceMs === 0 ? gap : this.cadenceMs + (gap - this.cadenceMs) * CADENCE_EMA;
|
|
201
|
+
this.lastCaptureMs = nowMs;
|
|
202
|
+
this.framesSinceCapture = 0;
|
|
203
|
+
this.capturedFrames++;
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
/** One animation frame seen, for the interval estimate and the frame count. */
|
|
207
|
+
observe(nowMs) {
|
|
208
|
+
if (this.seen && nowMs === this.lastSeenMs)
|
|
209
|
+
return;
|
|
210
|
+
const since = this.seen ? nowMs - this.lastSeenMs : 0;
|
|
211
|
+
this.lastSeenMs = nowMs;
|
|
212
|
+
this.seen = true;
|
|
213
|
+
this.renderedFrames++;
|
|
214
|
+
if (this.started)
|
|
215
|
+
this.framesSinceCapture++;
|
|
216
|
+
if (since <= 0)
|
|
217
|
+
return;
|
|
218
|
+
this.samples[this.sampleCount % SAMPLE_WINDOW] = since;
|
|
219
|
+
this.sampleCount++;
|
|
220
|
+
/*
|
|
221
|
+
* Until there is a window to take a median of, the estimate is the *shortest*
|
|
222
|
+
* frame seen so far. A schedule is needed before sixteen frames have passed — a
|
|
223
|
+
* recording that waited would capture all sixteen of them, a burst at the head of
|
|
224
|
+
* every clip — and of the estimators available before then the minimum is the one
|
|
225
|
+
* that errs the safe way: it reads the loop as faster than it is, which makes the
|
|
226
|
+
* stride longer and captures *fewer* frames than intended rather than more.
|
|
227
|
+
*
|
|
228
|
+
* The minimum's own failing, that one anomalous frame owns it for good, cannot
|
|
229
|
+
* bite here: sixteen frames later the median takes over and never gives it back.
|
|
230
|
+
*/
|
|
231
|
+
if (this.sampleCount < SAMPLE_WINDOW) {
|
|
232
|
+
if (this.frameIntervalMs === 0 || since < this.frameIntervalMs) {
|
|
233
|
+
this.frameIntervalMs = since;
|
|
234
|
+
this.strideFrames = strideFor(this.intervalMs, since);
|
|
235
|
+
}
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
/*
|
|
239
|
+
* Re-taken when the window fills rather than on every frame: sorting sixteen
|
|
240
|
+
* numbers is cheap but this is a render loop, and a display's period does not
|
|
241
|
+
* change between one frame and the next.
|
|
242
|
+
*/
|
|
243
|
+
if (this.sampleCount % SAMPLE_WINDOW !== 0)
|
|
244
|
+
return;
|
|
245
|
+
this.frameIntervalMs = trimmedMinimum(this.samples, this.sorted);
|
|
246
|
+
this.strideFrames = strideFor(this.intervalMs, this.frameIntervalMs, this.strideFrames);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Forget what has been measured, keep the schedule.
|
|
250
|
+
*
|
|
251
|
+
* For a recording with a warm-up in front of it: the frames a device spends
|
|
252
|
+
* getting an encoder and a driver going are genuinely awful — measured at 411 ms
|
|
253
|
+
* and 503 ms for a 1080x1920 clip — and they are not what the clip is like. Left in
|
|
254
|
+
* the report they become the worst gap and a couple of slipped frames, which is the
|
|
255
|
+
* evidence an export decides whether to warn the player on.
|
|
256
|
+
*
|
|
257
|
+
* The schedule survives on purpose: it was chosen from those same frames and it is
|
|
258
|
+
* still right.
|
|
259
|
+
*/
|
|
260
|
+
resetMeasurement() {
|
|
261
|
+
this.startMs = this.lastCaptureMs;
|
|
262
|
+
this.capturedFrames = 1;
|
|
263
|
+
this.renderedFrames = 0;
|
|
264
|
+
this.gapSumMs = 0;
|
|
265
|
+
this.worstGapMs = 0;
|
|
266
|
+
this.slippedFrames = 0;
|
|
267
|
+
this.cadenceMs = 0;
|
|
268
|
+
}
|
|
269
|
+
get report() {
|
|
270
|
+
const elapsedMs = this.started ? Math.max(this.lastCaptureMs - this.startMs, 0) : 0;
|
|
271
|
+
const gaps = Math.max(this.capturedFrames - 1, 0);
|
|
272
|
+
return {
|
|
273
|
+
targetFps: this.targetFps,
|
|
274
|
+
rendered: this.renderedFrames,
|
|
275
|
+
captured: this.capturedFrames,
|
|
276
|
+
capturedFps: elapsedMs > 0 ? (gaps * 1000) / elapsedMs : 0,
|
|
277
|
+
meanGapMs: gaps > 0 ? this.gapSumMs / gaps : 0,
|
|
278
|
+
worstGapMs: this.worstGapMs,
|
|
279
|
+
slipped: this.slippedFrames,
|
|
280
|
+
stride: this.strideFrames,
|
|
281
|
+
elapsedMs,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|