@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,231 @@
|
|
|
1
|
+
import type { ShotParams } from '../render/cinematicCamera.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A cinematic, as data: when the camera cuts, and what is on screen when.
|
|
5
|
+
*
|
|
6
|
+
* A sequence is a *file*, not a function. That is the whole point of the split
|
|
7
|
+
* — a new season, a new trailer or a different cut of the same footage must be
|
|
8
|
+
* a data change, and the moment one of them needs a branch in TypeScript the
|
|
9
|
+
* boundary has moved to the wrong place.
|
|
10
|
+
*
|
|
11
|
+
* Which means data is where the mistakes will be, and this module is where they
|
|
12
|
+
* are caught. Everything a timeline can get wrong — two lines up at once, an
|
|
13
|
+
* entry written above the one it plays after, a keyframe past the end of the
|
|
14
|
+
* shot it belongs to — is rejected the moment the script is loaded, by name and
|
|
15
|
+
* by index. The alternative is a cinematic that silently drops its fourth line,
|
|
16
|
+
* which nobody notices until a player asks what it said.
|
|
17
|
+
*
|
|
18
|
+
* Nothing here knows what is being narrated. A shot is a placement, a line is a
|
|
19
|
+
* string with a window and a `look` the presentation layer resolves.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** One camera placement inside a shot. Times are from the shot's own start. */
|
|
23
|
+
export interface CameraKeyframe {
|
|
24
|
+
readonly atSec: number;
|
|
25
|
+
readonly camera: ShotParams;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A cut, at `atSec`.
|
|
30
|
+
*
|
|
31
|
+
* A shot is either a fixed placement or a list of keyframes moved through while
|
|
32
|
+
* it holds. Keyframes are a *move*, never a second cut: they may not change the
|
|
33
|
+
* kind of shot, because that is a cut and belongs on the timeline where an
|
|
34
|
+
* editor can see it.
|
|
35
|
+
*/
|
|
36
|
+
export interface CinematicShot {
|
|
37
|
+
readonly atSec: number;
|
|
38
|
+
readonly camera: ShotParams | readonly CameraKeyframe[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface CinematicLine {
|
|
42
|
+
readonly atSec: number;
|
|
43
|
+
readonly holdSec: number;
|
|
44
|
+
readonly text: string;
|
|
45
|
+
/** A presentation key — 'story', 'rule'. The player never resolves it. */
|
|
46
|
+
readonly look: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface CinematicScript {
|
|
50
|
+
readonly durationSec: number;
|
|
51
|
+
/** In play order. May be empty: a sequence of lines over live gameplay. */
|
|
52
|
+
readonly shots: readonly CinematicShot[];
|
|
53
|
+
/** In play order, non-overlapping. */
|
|
54
|
+
readonly lines: readonly CinematicLine[];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const SHOT_KINDS: readonly string[] = ['chase', 'lowWide', 'orbit', 'flyby', 'overhead', 'lookAt'];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Validate a script and hand it back, so a data module fails on import:
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* export const SEASON_ONE = defineCinematic('season1', { ... });
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* Loud at load is the only useful moment. A malformed timeline cannot be
|
|
67
|
+
* repaired at runtime and must not be played half-right.
|
|
68
|
+
*/
|
|
69
|
+
export function defineCinematic(name: string, script: CinematicScript): CinematicScript {
|
|
70
|
+
validateCinematic(name, script);
|
|
71
|
+
return script;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Throws on the first thing wrong, naming the entry and both times. */
|
|
75
|
+
export function validateCinematic(name: string, script: CinematicScript): void {
|
|
76
|
+
const fail = (message: string): never => {
|
|
77
|
+
throw new Error(`cinematic "${name}": ${message}`);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const duration = script.durationSec;
|
|
81
|
+
if (!Number.isFinite(duration) || duration <= 0) {
|
|
82
|
+
fail(`runs for ${duration}s, which is not a length`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
validateShots(script, duration, fail);
|
|
86
|
+
validateLines(script, duration, fail);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function validateShots(
|
|
90
|
+
script: CinematicScript,
|
|
91
|
+
duration: number,
|
|
92
|
+
fail: (message: string) => never,
|
|
93
|
+
): void {
|
|
94
|
+
const shots = script.shots;
|
|
95
|
+
for (let i = 0; i < shots.length; i++) {
|
|
96
|
+
const shot = shots[i];
|
|
97
|
+
if (!Number.isFinite(shot.atSec) || shot.atSec < 0) {
|
|
98
|
+
fail(`shot ${i} cuts at ${shot.atSec}s`);
|
|
99
|
+
}
|
|
100
|
+
if (i === 0 && shot.atSec !== 0) {
|
|
101
|
+
fail(`shot 0 cuts at ${shot.atSec}s — the camera has nowhere to be before it`);
|
|
102
|
+
}
|
|
103
|
+
if (i > 0 && shot.atSec <= shots[i - 1].atSec) {
|
|
104
|
+
fail(
|
|
105
|
+
`shot ${i} cuts at ${shot.atSec}s, at or before shot ${i - 1} at ` +
|
|
106
|
+
`${shots[i - 1].atSec}s — shots must be written in the order they play`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
if (shot.atSec >= duration) {
|
|
110
|
+
fail(`shot ${i} cuts at ${shot.atSec}s, after the script ends at ${duration}s`);
|
|
111
|
+
}
|
|
112
|
+
// How long this shot holds — what a keyframe inside it has to fit within.
|
|
113
|
+
const span = (i + 1 < shots.length ? shots[i + 1].atSec : duration) - shot.atSec;
|
|
114
|
+
validateCamera(shot.camera, span, i, fail);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function validateCamera(
|
|
119
|
+
camera: ShotParams | readonly CameraKeyframe[],
|
|
120
|
+
spanSec: number,
|
|
121
|
+
index: number,
|
|
122
|
+
fail: (message: string) => never,
|
|
123
|
+
): void {
|
|
124
|
+
if ('kind' in camera) {
|
|
125
|
+
validateShotParams(camera, `shot ${index}`, fail);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (camera.length === 0) fail(`shot ${index} is keyframed but has no keyframes`);
|
|
130
|
+
const first = camera[0];
|
|
131
|
+
if (first.atSec !== 0) {
|
|
132
|
+
fail(`shot ${index} keyframe 0 is at ${first.atSec}s — a move must start where the cut lands`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
for (let i = 0; i < camera.length; i++) {
|
|
136
|
+
const frame = camera[i];
|
|
137
|
+
const where = `shot ${index} keyframe ${i}`;
|
|
138
|
+
if (!Number.isFinite(frame.atSec) || frame.atSec < 0) fail(`${where} is at ${frame.atSec}s`);
|
|
139
|
+
if (i > 0 && frame.atSec <= camera[i - 1].atSec) {
|
|
140
|
+
fail(
|
|
141
|
+
`${where} is at ${frame.atSec}s, at or before keyframe ${i - 1} at ` +
|
|
142
|
+
`${camera[i - 1].atSec}s — keyframes must be written in the order they play`,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
if (frame.atSec > spanSec) {
|
|
146
|
+
fail(`${where} is at ${frame.atSec}s but the shot holds ${spanSec}s — it would never play`);
|
|
147
|
+
}
|
|
148
|
+
if (frame.camera.kind !== first.camera.kind) {
|
|
149
|
+
fail(
|
|
150
|
+
`${where} changes the shot from ${first.camera.kind} to ${frame.camera.kind} — ` +
|
|
151
|
+
'a change of kind is a cut, and cuts belong on the timeline',
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
/*
|
|
155
|
+
* An optional parameter has to be on every keyframe of a shot or none of
|
|
156
|
+
* them. Interpolating toward a missing anchor would send the shot to the
|
|
157
|
+
* world origin, which reads as the camera being thrown rather than as a
|
|
158
|
+
* mistake in the data.
|
|
159
|
+
*/
|
|
160
|
+
if ((frame.camera.anchor === undefined) !== (first.camera.anchor === undefined)) {
|
|
161
|
+
fail(`${where} adds or drops an anchor mid-move`);
|
|
162
|
+
}
|
|
163
|
+
if ((frame.camera.orbitRate === undefined) !== (first.camera.orbitRate === undefined)) {
|
|
164
|
+
fail(`${where} adds or drops an orbit rate mid-move`);
|
|
165
|
+
}
|
|
166
|
+
validateShotParams(frame.camera, where, fail);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function validateShotParams(
|
|
171
|
+
shot: ShotParams,
|
|
172
|
+
where: string,
|
|
173
|
+
fail: (message: string) => never,
|
|
174
|
+
): void {
|
|
175
|
+
if (!SHOT_KINDS.includes(shot.kind))
|
|
176
|
+
fail(`${where} is a "${shot.kind}" shot, which is not a shot`);
|
|
177
|
+
for (const [label, value] of [
|
|
178
|
+
['distance', shot.distance],
|
|
179
|
+
['height', shot.height],
|
|
180
|
+
['fovDeg', shot.fovDeg],
|
|
181
|
+
] as const) {
|
|
182
|
+
if (!Number.isFinite(value)) fail(`${where} has ${label} ${value}`);
|
|
183
|
+
}
|
|
184
|
+
if (shot.orbitRate !== undefined && !Number.isFinite(shot.orbitRate)) {
|
|
185
|
+
fail(`${where} has orbitRate ${shot.orbitRate}`);
|
|
186
|
+
}
|
|
187
|
+
const anchor = shot.anchor;
|
|
188
|
+
if (anchor !== undefined && (anchor.length !== 3 || !anchor.every(Number.isFinite))) {
|
|
189
|
+
fail(`${where} has an anchor that is not three finite numbers`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function validateLines(
|
|
194
|
+
script: CinematicScript,
|
|
195
|
+
duration: number,
|
|
196
|
+
fail: (message: string) => never,
|
|
197
|
+
): void {
|
|
198
|
+
const lines = script.lines;
|
|
199
|
+
for (let i = 0; i < lines.length; i++) {
|
|
200
|
+
const line = lines[i];
|
|
201
|
+
if (line.text.length === 0) fail(`line ${i} has nothing to say`);
|
|
202
|
+
if (line.look.length === 0) fail(`line ${i} ("${line.text}") has no look`);
|
|
203
|
+
if (!Number.isFinite(line.atSec) || line.atSec < 0) {
|
|
204
|
+
fail(`line ${i} ("${line.text}") opens at ${line.atSec}s`);
|
|
205
|
+
}
|
|
206
|
+
if (!Number.isFinite(line.holdSec) || line.holdSec <= 0) {
|
|
207
|
+
fail(`line ${i} ("${line.text}") holds for ${line.holdSec}s`);
|
|
208
|
+
}
|
|
209
|
+
if (i > 0) {
|
|
210
|
+
const previous = lines[i - 1];
|
|
211
|
+
if (line.atSec <= previous.atSec) {
|
|
212
|
+
fail(
|
|
213
|
+
`line ${i} ("${line.text}") opens at ${line.atSec}s, at or before line ${i - 1} at ` +
|
|
214
|
+
`${previous.atSec}s — lines must be written in the order they play`,
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
if (line.atSec < previous.atSec + previous.holdSec) {
|
|
218
|
+
fail(
|
|
219
|
+
`line ${i} ("${line.text}") opens at ${line.atSec}s while line ${i - 1} is still up ` +
|
|
220
|
+
`until ${previous.atSec + previous.holdSec}s — two lines at once is unreadable`,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (line.atSec + line.holdSec > duration) {
|
|
225
|
+
fail(
|
|
226
|
+
`line ${i} ("${line.text}") is still up at ${line.atSec + line.holdSec}s, ` +
|
|
227
|
+
`after the script ends at ${duration}s`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one bit of state the fixed loop and the engine badge have to share.
|
|
3
|
+
*
|
|
4
|
+
* **The problem it solves.** The badge holds the screen for a few seconds after the game's first
|
|
5
|
+
* frame reaches it — deliberately, because the badge is a hold and not merely a cover. Without a
|
|
6
|
+
* gate the game is *running* for that whole time behind an opaque black plate: an intro animation
|
|
7
|
+
* plays to nobody, a music cue starts and is three seconds in by the time anyone hears it, and a
|
|
8
|
+
* countdown is already counting. Every one of those is content the player paid for and did not
|
|
9
|
+
* get.
|
|
10
|
+
*
|
|
11
|
+
* So the loop freezes on the frame it just drew, and resumes when the plate is gone.
|
|
12
|
+
*
|
|
13
|
+
* **Why a module-level holder rather than a parameter.** `createRenderer` mounts the badge and
|
|
14
|
+
* `startLoop` runs the loop, and a consumer calls them separately with nothing passed between —
|
|
15
|
+
* threading a handle through would make this a thing every game has to wire, which is the whole
|
|
16
|
+
* failure the default-on badge exists to avoid. There is exactly one screen, so there is exactly
|
|
17
|
+
* one badge, and a singleton is the honest shape for it rather than a convenience.
|
|
18
|
+
*
|
|
19
|
+
* **`ui/` writes it and `core/` reads it**, which is why the state lives here rather than in
|
|
20
|
+
* `ui/splash.ts`: the fixed loop must not import a module that touches the DOM. This file names
|
|
21
|
+
* neither of them and knows only that something may be holding frames back.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** What is holding frames, if anything. Set by the badge, read by the loop. */
|
|
25
|
+
let holder: (() => boolean) | null = null;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Register what decides whether frames are held, and hand back the way to stop deciding.
|
|
29
|
+
*
|
|
30
|
+
* The last registration wins, and releasing only clears the gate if it is still yours — two
|
|
31
|
+
* badges cannot exist at once, but a badge that was released after a second one mounted must
|
|
32
|
+
* not open a gate it no longer owns.
|
|
33
|
+
*/
|
|
34
|
+
export function holdFrames(frozen: () => boolean): () => void {
|
|
35
|
+
holder = frozen;
|
|
36
|
+
return () => {
|
|
37
|
+
if (holder === frozen) holder = null;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Whether this frame should be skipped entirely.
|
|
43
|
+
*
|
|
44
|
+
* A null check and at most one call, per frame, for the handful of frames a badge is up and none
|
|
45
|
+
* at all afterwards — the badge clears the holder when it leaves. Nothing here allocates.
|
|
46
|
+
*/
|
|
47
|
+
export function framesHeld(): boolean {
|
|
48
|
+
return holder !== null && holder();
|
|
49
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/** Aggregating everything an app is waiting on into one honest number. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One thing being waited for.
|
|
5
|
+
*
|
|
6
|
+
* `weight` is what makes the total mean anything. A progress bar that treats "decode 58 audio
|
|
7
|
+
* tracks" and "read a settings file" as half each spends most of its life at 50%, which is worse
|
|
8
|
+
* than no bar: it teaches a viewer that the bar is decoration. Weights are in whatever unit the
|
|
9
|
+
* caller likes as long as they are the same unit — bytes are the obvious one because they are
|
|
10
|
+
* usually known in advance, and a rough guess in "seconds this normally takes" also works.
|
|
11
|
+
*/
|
|
12
|
+
export interface LoadTask {
|
|
13
|
+
/** Stable, and not for showing: a caller maps it to whatever words its audience needs. */
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly weight: number;
|
|
16
|
+
/** 0 to 1. */
|
|
17
|
+
fraction: number;
|
|
18
|
+
done: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface LoadSummary {
|
|
22
|
+
/** 0 to 1 across everything registered, weighted. */
|
|
23
|
+
readonly fraction: number;
|
|
24
|
+
/**
|
|
25
|
+
* The id of the task the caller should be talking about: the heaviest one still unfinished.
|
|
26
|
+
*
|
|
27
|
+
* Heaviest rather than first-registered, because that is the one a viewer is actually waiting
|
|
28
|
+
* for. Empty when nothing is outstanding.
|
|
29
|
+
*/
|
|
30
|
+
readonly activeId: string;
|
|
31
|
+
readonly done: boolean;
|
|
32
|
+
readonly tasksDone: number;
|
|
33
|
+
readonly tasksTotal: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* What an app is waiting on, as one weighted number.
|
|
38
|
+
*
|
|
39
|
+
* **Why this is in the engine.** Every consumer builds this, and every one of them builds it
|
|
40
|
+
* slightly wrong in the same way: a bar driven by whichever load happens to report last, or a
|
|
41
|
+
* fraction over a task count that jumps in sevenths, or a spinner that says nothing at all. None
|
|
42
|
+
* of that is a game's decision — it is arithmetic over a set of things with sizes — so it belongs
|
|
43
|
+
* here beside the things that produce the sizes. What stays with the consumer is every word: this
|
|
44
|
+
* hands back ids and numbers, because what to *call* a stage depends entirely on who is reading.
|
|
45
|
+
*
|
|
46
|
+
* **It holds no clock and no DOM.** A caller polls `summary` in its own frame, so a tracker works
|
|
47
|
+
* the same in a browser, a test and a headless bake.
|
|
48
|
+
*
|
|
49
|
+
* Deliberately small. It does not start work, own promises, retry, or time out: a task is
|
|
50
|
+
* something the caller is already doing, and all this knows is how big it is and how far along.
|
|
51
|
+
* Anything more would be a scheduler, which is a different thing with different failure modes.
|
|
52
|
+
*/
|
|
53
|
+
export class LoadTracker {
|
|
54
|
+
private readonly tasks = new Map<string, LoadTask>();
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Declare something to wait for, or re-declare it with a new weight.
|
|
58
|
+
*
|
|
59
|
+
* Registering the same id twice is deliberately allowed and is not a reset: a caller frequently
|
|
60
|
+
* learns the real size of a thing after starting it — a fetch that finally reports its
|
|
61
|
+
* `Content-Length`, a model whose manifest says how many parts are coming — and having to choose
|
|
62
|
+
* between a wrong weight and a lost fraction would be a bad choice to force.
|
|
63
|
+
*/
|
|
64
|
+
add(id: string, weight: number): void {
|
|
65
|
+
const existing = this.tasks.get(id);
|
|
66
|
+
const safeWeight = Number.isFinite(weight) && weight > 0 ? weight : 1;
|
|
67
|
+
if (existing === undefined) {
|
|
68
|
+
this.tasks.set(id, { id, weight: safeWeight, fraction: 0, done: false });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.tasks.set(id, {
|
|
72
|
+
id,
|
|
73
|
+
weight: safeWeight,
|
|
74
|
+
fraction: existing.fraction,
|
|
75
|
+
done: existing.done,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** How far along one task is, 0 to 1. Unknown ids are ignored rather than thrown at. */
|
|
80
|
+
report(id: string, fraction: number): void {
|
|
81
|
+
const task = this.tasks.get(id);
|
|
82
|
+
if (task === undefined) return;
|
|
83
|
+
/*
|
|
84
|
+
* Clamped and guarded, because this is fed by arithmetic a caller did — a division by a total
|
|
85
|
+
* that has not arrived yet is one edit away, and a NaN here would spread to the whole bar and
|
|
86
|
+
* then to whatever the bar drives.
|
|
87
|
+
*/
|
|
88
|
+
const safe = Number.isFinite(fraction) ? Math.min(1, Math.max(0, fraction)) : 0;
|
|
89
|
+
task.fraction = task.done ? 1 : safe;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Mark one finished, whatever it last reported. */
|
|
93
|
+
finish(id: string): void {
|
|
94
|
+
const task = this.tasks.get(id);
|
|
95
|
+
if (task === undefined) return;
|
|
96
|
+
task.fraction = 1;
|
|
97
|
+
task.done = true;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* A task that turned out not to be needed: dropped from the total rather than completed.
|
|
102
|
+
*
|
|
103
|
+
* The distinction matters for the number. An optional asset that is absent — no model baked, a
|
|
104
|
+
* track with no audio — is not 100% loaded, it is not part of this load at all, and counting it
|
|
105
|
+
* as finished makes the bar say a thing arrived that never did.
|
|
106
|
+
*/
|
|
107
|
+
drop(id: string): void {
|
|
108
|
+
this.tasks.delete(id);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Nothing to wait for. A tracker with no tasks is done, which is the useful answer. */
|
|
112
|
+
get summary(): LoadSummary {
|
|
113
|
+
let weighted = 0;
|
|
114
|
+
let total = 0;
|
|
115
|
+
let doneCount = 0;
|
|
116
|
+
let activeId = '';
|
|
117
|
+
let activeWeight = -1;
|
|
118
|
+
for (const task of this.tasks.values()) {
|
|
119
|
+
total += task.weight;
|
|
120
|
+
weighted += task.weight * (task.done ? 1 : task.fraction);
|
|
121
|
+
if (task.done) doneCount++;
|
|
122
|
+
else if (task.weight > activeWeight) {
|
|
123
|
+
activeWeight = task.weight;
|
|
124
|
+
activeId = task.id;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
fraction: total > 0 ? Math.min(1, weighted / total) : 1,
|
|
129
|
+
activeId,
|
|
130
|
+
done: activeId === '',
|
|
131
|
+
tasksDone: doneCount,
|
|
132
|
+
tasksTotal: this.tasks.size,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Every task, for a caller that wants to show a line each rather than one bar. */
|
|
137
|
+
get entries(): readonly LoadTask[] {
|
|
138
|
+
return [...this.tasks.values()];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
clear(): void {
|
|
142
|
+
this.tasks.clear();
|
|
143
|
+
}
|
|
144
|
+
}
|
package/src/core/loop.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { framesHeld } from './bootGate.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Fixed-timestep game loop with render interpolation.
|
|
5
|
+
*
|
|
6
|
+
* Simulation always advances in `fixedDt` increments (determinism requirement,
|
|
7
|
+
* see AGENTS.md); rendering runs once per animation frame and receives the
|
|
8
|
+
* interpolation factor `alpha` in [0, 1) between the two most recent sim states.
|
|
9
|
+
*/
|
|
10
|
+
export interface LoopHooks {
|
|
11
|
+
/**
|
|
12
|
+
* Advance the simulation by exactly `dt` seconds.
|
|
13
|
+
*
|
|
14
|
+
* `tick` counts fixed steps from `LoopOptions.startTick`, and it is the identity every
|
|
15
|
+
* networked and recorded thing indexes by: an input belongs to a tick, a snapshot is of a tick,
|
|
16
|
+
* a desync begins at a tick. `AGENTS.md` already states the contract it makes concrete — "time
|
|
17
|
+
* is a tick count the caller supplies" — and the loop was the one place that knew the count and
|
|
18
|
+
* did not hand it over, so a caller wanting one kept a second counter beside this callback and
|
|
19
|
+
* hoped the two agreed.
|
|
20
|
+
*
|
|
21
|
+
* A caller with no use for it takes one argument and is unaffected.
|
|
22
|
+
*/
|
|
23
|
+
simulate(dt: number, tick: number): void;
|
|
24
|
+
/**
|
|
25
|
+
* Draw one frame. `alpha` interpolates prev→current sim state.
|
|
26
|
+
*
|
|
27
|
+
* `frameDt` is clamped by `maxFrameTime` and is the one to animate against:
|
|
28
|
+
* a stall must not advance the wind by a minute when the page comes back.
|
|
29
|
+
*
|
|
30
|
+
* `wallDt` is the same gap with nothing done to it, and it exists for the
|
|
31
|
+
* diagnostics. A clamped delta cannot tell a device that took a quarter second
|
|
32
|
+
* from a browser that waited a second before asking — both arrive as 0.25 —
|
|
33
|
+
* and three bug reports were filed on that ambiguity before anyone could see it.
|
|
34
|
+
* Nothing that animates should read it.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* @param frame What the frame source delivered, when it delivers anything.
|
|
38
|
+
*
|
|
39
|
+
* `undefined` under the window, which is every frame outside a session. An immersive session
|
|
40
|
+
* hands over the object every pose in that frame is read from, and it is valid only for the
|
|
41
|
+
* duration of this call. Typed `unknown` because core does not name an `XRFrame`; the package
|
|
42
|
+
* that does narrows it. An implementation written before this parameter existed still satisfies
|
|
43
|
+
* the interface, which is why it was added at the end rather than anywhere more readable.
|
|
44
|
+
*/
|
|
45
|
+
render(alpha: number, frameDt: number, wallDt: number, frame?: unknown): void;
|
|
46
|
+
/**
|
|
47
|
+
* Whether the simulation should advance this frame. Absent means always.
|
|
48
|
+
*
|
|
49
|
+
* Pause is expressed here rather than by stopping the loop, so a paused game
|
|
50
|
+
* keeps rendering — the world stays on screen behind the menu instead of
|
|
51
|
+
* freezing on whatever the last frame happened to be.
|
|
52
|
+
*/
|
|
53
|
+
shouldSimulate?: () => boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Whether this frame is worth drawing at all. Absent means always.
|
|
56
|
+
*
|
|
57
|
+
* For the clip export, and it is not an optimisation. A clip is a fixed 60
|
|
58
|
+
* frames a second; a display running at 144 offers 2.4 animation frames per
|
|
59
|
+
* clip frame, and the recorder can only take one of them — so the other 1.4
|
|
60
|
+
* are a full render of a 1080x1920 frame that is thrown away, competing for the
|
|
61
|
+
* GPU with the one that is kept. Worse, on a 100 Hz display no frame lands
|
|
62
|
+
* near enough to every slot and the capture rate falls to 50: the file then
|
|
63
|
+
* claims 60 fps while holding 50, which is precisely the stutter this exists to
|
|
64
|
+
* remove.
|
|
65
|
+
*
|
|
66
|
+
* Skipped time is not lost — it is added to the `frameDt` the next drawn frame
|
|
67
|
+
* receives, so anything smoothing against it sees real elapsed time.
|
|
68
|
+
*
|
|
69
|
+
* **The 60 above is the example and not a limit**, which is worth saying because every sentence
|
|
70
|
+
* of it names one. This hook is a predicate the caller supplies, so the rate is whatever the
|
|
71
|
+
* caller returns true at, and `FramePacer` takes the rate it paces to as a constructor argument:
|
|
72
|
+
* `new FramePacer(30)` is a thirty-a-second export and needs nothing here. A consumer capturing
|
|
73
|
+
* at 60 and dropping every other frame is paying a full render per discarded frame for a rate the
|
|
74
|
+
* pacer would have given them.
|
|
75
|
+
*/
|
|
76
|
+
shouldRender?: () => boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface LoopOptions {
|
|
80
|
+
fixedDt?: number;
|
|
81
|
+
/** Clamp for pathological frames (tab switch, debugger) to avoid a sim spiral. */
|
|
82
|
+
maxFrameTime?: number;
|
|
83
|
+
/**
|
|
84
|
+
* The tick number the first fixed step reports. Zero unless a caller says otherwise.
|
|
85
|
+
*
|
|
86
|
+
* A participant joining a session in progress is told the host's tick and has to agree with it,
|
|
87
|
+
* because every input and every snapshot is addressed by that number. Starting at zero and
|
|
88
|
+
* adding an offset at each use is the same arithmetic done in more places, and one of them
|
|
89
|
+
* eventually forgets.
|
|
90
|
+
*/
|
|
91
|
+
startTick?: number;
|
|
92
|
+
/**
|
|
93
|
+
* Who asks for the next frame, and what that frame carries.
|
|
94
|
+
*
|
|
95
|
+
* **The window, unless a session is driving.** An immersive session produces frames on the
|
|
96
|
+
* headset's clock through `session.requestAnimationFrame`, at whatever rate its display runs, and
|
|
97
|
+
* the callback carries the frame object every pose in that frame is read from. A loop calling the
|
|
98
|
+
* window's `requestAnimationFrame` inside a session draws at the page's rate into a display that
|
|
99
|
+
* wanted something else, which is the difference between presence and motion sickness.
|
|
100
|
+
*
|
|
101
|
+
* Optional and defaulting to the window, so no existing caller changes.
|
|
102
|
+
*
|
|
103
|
+
* `frame` is `unknown` deliberately. This file is `@driftengine/core`'s clock and has no business
|
|
104
|
+
* naming an `XRFrame`, which lives in a package core does not depend on; `@driftengine/xr`
|
|
105
|
+
* narrows it at the one place that reads it. What core owns is that *something* arrived with the
|
|
106
|
+
* frame and is handed to `render` unread.
|
|
107
|
+
*/
|
|
108
|
+
frameSource?: FrameSource;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* A source of animation frames. `window` satisfies it, and so does an `XRSession`.
|
|
113
|
+
*
|
|
114
|
+
* Structural rather than a class, because both of the things that satisfy it are somebody else's:
|
|
115
|
+
* one is the browser's and one is a runtime's.
|
|
116
|
+
*/
|
|
117
|
+
export interface FrameSource {
|
|
118
|
+
requestAnimationFrame(callback: (timeMs: number, frame?: unknown) => void): number;
|
|
119
|
+
cancelAnimationFrame(handle: number): void;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Starts the loop immediately. Returns a stop function. */
|
|
123
|
+
export function startLoop(hooks: LoopHooks, options: LoopOptions = {}): () => void {
|
|
124
|
+
const fixedDt = options.fixedDt ?? 1 / 60;
|
|
125
|
+
const maxFrameTime = options.maxFrameTime ?? 0.25;
|
|
126
|
+
|
|
127
|
+
let last = performance.now();
|
|
128
|
+
let accumulator = 0;
|
|
129
|
+
/**
|
|
130
|
+
* Fixed steps taken, offset by `startTick`.
|
|
131
|
+
*
|
|
132
|
+
* **It counts steps and not frames, and it never moves while paused.** A tick is a unit of
|
|
133
|
+
* simulation, so a paused game that keeps rendering is at the same tick for as long as the menu
|
|
134
|
+
* is open — which is what makes the number usable as an index into a recording.
|
|
135
|
+
*/
|
|
136
|
+
let tick = Math.trunc(options.startTick ?? 0);
|
|
137
|
+
let rafId = 0;
|
|
138
|
+
/** Frame time banked by animation frames that were not drawn. */
|
|
139
|
+
let undrawnDt = 0;
|
|
140
|
+
/** The same bank, unclamped. See `LoopHooks.render`. */
|
|
141
|
+
let undrawnWallDt = 0;
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* Read once and held. A session that ends mid-loop is a consumer stopping this loop and starting
|
|
145
|
+
* another, because the two run at different rates and share no accumulator worth carrying across.
|
|
146
|
+
*/
|
|
147
|
+
const source: FrameSource = options.frameSource ?? {
|
|
148
|
+
requestAnimationFrame: (callback) => requestAnimationFrame(callback),
|
|
149
|
+
cancelAnimationFrame: (handle) => {
|
|
150
|
+
cancelAnimationFrame(handle);
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const frame = (now: number, xrFrame?: unknown): void => {
|
|
155
|
+
rafId = source.requestAnimationFrame(frame);
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* **Held: draw nothing, advance nothing, and bank nothing.**
|
|
159
|
+
*
|
|
160
|
+
* The engine badge holds the screen for a few seconds after the first frame reaches it, and
|
|
161
|
+
* a game left running behind an opaque plate is a game whose opening seconds nobody sees —
|
|
162
|
+
* an intro that plays to a black rectangle, a cue that is already three seconds in when the
|
|
163
|
+
* plate lifts. Freezing on the drawn frame is what makes the badge a hold rather than a
|
|
164
|
+
* theft.
|
|
165
|
+
*
|
|
166
|
+
* `last` moves with the clock so the wait is not banked. Without that line every held frame
|
|
167
|
+
* accumulates, and the resume replays the whole hold in one step: the same failure the pause
|
|
168
|
+
* above drops its accumulator for, arrived at from a different direction.
|
|
169
|
+
*/
|
|
170
|
+
if (framesHeld()) {
|
|
171
|
+
last = now;
|
|
172
|
+
accumulator = 0;
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let frameDt = (now - last) / 1000;
|
|
177
|
+
last = now;
|
|
178
|
+
const wallDt = frameDt;
|
|
179
|
+
if (frameDt > maxFrameTime) frameDt = maxFrameTime;
|
|
180
|
+
|
|
181
|
+
accumulator += frameDt;
|
|
182
|
+
|
|
183
|
+
// Paused: drop the banked time rather than keeping it. Holding it would
|
|
184
|
+
// replay the whole pause in one resume frame, and every one of those ticks
|
|
185
|
+
// would land in a run timer that M4 turns into a leaderboard entry.
|
|
186
|
+
if (hooks.shouldSimulate !== undefined && !hooks.shouldSimulate()) {
|
|
187
|
+
accumulator = 0;
|
|
188
|
+
} else {
|
|
189
|
+
while (accumulator >= fixedDt) {
|
|
190
|
+
hooks.simulate(fixedDt, tick);
|
|
191
|
+
tick += 1;
|
|
192
|
+
accumulator -= fixedDt;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (hooks.shouldRender !== undefined && !hooks.shouldRender()) {
|
|
197
|
+
undrawnDt += frameDt;
|
|
198
|
+
undrawnWallDt += wallDt;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
/* Handed on unread. See `LoopOptions.frameSource` for why core does not look inside it. */
|
|
202
|
+
hooks.render(accumulator / fixedDt, frameDt + undrawnDt, wallDt + undrawnWallDt, xrFrame);
|
|
203
|
+
undrawnDt = 0;
|
|
204
|
+
undrawnWallDt = 0;
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
rafId = source.requestAnimationFrame(frame);
|
|
208
|
+
return () => {
|
|
209
|
+
source.cancelAnimationFrame(rafId);
|
|
210
|
+
};
|
|
211
|
+
}
|