@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,188 @@
|
|
|
1
|
+
import type { LockableSurface } from './exportTarget.ts';
|
|
2
|
+
import type { FrameOverlay } from './frameOverlay.ts';
|
|
3
|
+
import type { FramePacingReport } from './framePacer.ts';
|
|
4
|
+
export declare const DEFAULT_CLIP_FPS = 30;
|
|
5
|
+
/**
|
|
6
|
+
* Recording what is on a canvas — or on a prepared export target — to a file.
|
|
7
|
+
*
|
|
8
|
+
* A convenience on top of the replay, not the feature. The replay itself is
|
|
9
|
+
* what makes a run worth posting; this saves the trouble of reaching for a
|
|
10
|
+
* screen recorder — and where the browser cannot do it, saying so plainly beats
|
|
11
|
+
* producing a file that will not play.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately not a server-side render. That is the "proper" answer and it is
|
|
14
|
+
* a backend, a queue, a storage bill and a moderation problem, for something
|
|
15
|
+
* the browser already does.
|
|
16
|
+
*
|
|
17
|
+
* **The honest limit, and it belongs here rather than in a commit message:**
|
|
18
|
+
* `MediaRecorder` timestamps every frame by wall clock, and that is measured
|
|
19
|
+
* rather than assumed — a probe recording requested frames at gaps of 8.6 / 24.5 /
|
|
20
|
+
* 8.1 / 28.6 ms and `ffprobe` read the MP4's own timestamps back as 8.8 / 24.2 /
|
|
21
|
+
* 8.1 / 28.5 ms, `avg_frame_rate=7110000/120161`. Two things follow.
|
|
22
|
+
*
|
|
23
|
+
* An export has to run in real time: there is no in-browser way to render a clip
|
|
24
|
+
* slower than real time and have the audio line up, short of shipping our own
|
|
25
|
+
* muxer, which is a dependency and the standing rule says no. So the export can be
|
|
26
|
+
* *paced* (see `ExportTarget`) and *measured*, but it cannot be given more time.
|
|
27
|
+
*
|
|
28
|
+
* And a constant-rate file is not on offer either. What is on offer is a file whose
|
|
29
|
+
* frames are evenly spaced *and* hold moments the same distance apart, which is
|
|
30
|
+
* what a viewer reads as smooth — so the schedule captures every n-th animation
|
|
31
|
+
* frame and the content follows the wall clock. A device that cannot hold the
|
|
32
|
+
* target rate then produces a slower clip rather than a juddering one, and the
|
|
33
|
+
* measurement in `pacing` says which it was.
|
|
34
|
+
*/
|
|
35
|
+
export interface FrameRecorderOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Record the canvas directly, at `fps`. Simple and appropriate for a debug
|
|
38
|
+
* capture; for a clip anybody else will see, prefer `stream` from an
|
|
39
|
+
* `ExportTarget`, which fixes the aspect, stamps the mark and paces the
|
|
40
|
+
* frames.
|
|
41
|
+
*/
|
|
42
|
+
readonly canvas?: HTMLCanvasElement;
|
|
43
|
+
/** A prepared video stream, e.g. `ExportTarget.acquire()`. Wins over `canvas`. */
|
|
44
|
+
readonly stream?: MediaStream;
|
|
45
|
+
/** Mixed into the clip. Omit for a silent recording. */
|
|
46
|
+
readonly audio?: MediaStream | null;
|
|
47
|
+
/**
|
|
48
|
+
* Frames per second wanted — a floor, not a promise.
|
|
49
|
+
*
|
|
50
|
+
* The schedule counts animation frames (see `FramePacer`), so what comes out is
|
|
51
|
+
* the loop's own rate divided by a whole number. Asking for 60 on a 144 Hz panel
|
|
52
|
+
* records 72; asking for it on a loop that can only deliver 40 records 40.
|
|
53
|
+
*/
|
|
54
|
+
readonly fps?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Bits per second for video. Defaults to a figure scaled from the frame's
|
|
57
|
+
* pixel count and rate — a constant is generous at one size and starved at
|
|
58
|
+
* another, and a starved encoder on high-motion footage looks like stutter.
|
|
59
|
+
*/
|
|
60
|
+
readonly videoBitsPerSecond?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Record at a fixed frame size rather than at whatever the canvas happens to
|
|
63
|
+
* be, compositing the scene and an optional mark into it.
|
|
64
|
+
*
|
|
65
|
+
* This is what makes an export a *product* rather than a screen capture: the
|
|
66
|
+
* frame is the requested shape whatever the window is, the mark is inside the
|
|
67
|
+
* video where a DOM overlay could never be, and frames are handed over one at a
|
|
68
|
+
* time so none is ever recorded twice.
|
|
69
|
+
*/
|
|
70
|
+
readonly target?: {
|
|
71
|
+
/** The canvas the scene is drawn into. */
|
|
72
|
+
readonly source: HTMLCanvasElement;
|
|
73
|
+
/** Whoever owns that canvas's drawing-buffer size — normally the renderer. */
|
|
74
|
+
readonly surface: LockableSurface;
|
|
75
|
+
readonly width: number;
|
|
76
|
+
readonly height: number;
|
|
77
|
+
readonly overlay?: FrameOverlay | ((width: number, height: number) => FrameOverlay);
|
|
78
|
+
/**
|
|
79
|
+
* Drawn live into every composed frame, after the scene and the baked mark.
|
|
80
|
+
*
|
|
81
|
+
* For anything that changes frame to frame — a speedometer, a clock — which the
|
|
82
|
+
* baked `overlay` cannot express at all. See `ExportTargetOptions.drawFrame`.
|
|
83
|
+
*/
|
|
84
|
+
readonly drawFrame?: (ctx: CanvasRenderingContext2D, width: number, height: number) => void;
|
|
85
|
+
/**
|
|
86
|
+
* What the renderer is currently managing, frames per second. A device below
|
|
87
|
+
* the target rate records at a smaller frame instead: a slightly softer clip
|
|
88
|
+
* that holds its rate beats a full-size one that judders. Omit for no
|
|
89
|
+
* measurement, which is treated as no evidence rather than as bad news.
|
|
90
|
+
*/
|
|
91
|
+
readonly measuredFps?: number;
|
|
92
|
+
/** Forwarded to `ExportTargetOptions.presentedFrames`; see `duplicateFrame` below. */
|
|
93
|
+
readonly presentedFrames?: () => number;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export declare class FrameRecorder {
|
|
97
|
+
private readonly options;
|
|
98
|
+
private recorder;
|
|
99
|
+
private chunks;
|
|
100
|
+
private readonly mime;
|
|
101
|
+
private target;
|
|
102
|
+
private targetStream;
|
|
103
|
+
constructor(options: FrameRecorderOptions);
|
|
104
|
+
get mimeType(): string;
|
|
105
|
+
/**
|
|
106
|
+
* Take over the render surface before recording starts.
|
|
107
|
+
*
|
|
108
|
+
* Separate from `start` because the aspect has to be in force *before* the
|
|
109
|
+
* first frame anybody records: the camera composes for `renderer.aspect`, so
|
|
110
|
+
* locking and recording in the same breath would put a screen-shaped shot in
|
|
111
|
+
* the first frames of a vertical clip. Returns the frame size that will be
|
|
112
|
+
* recorded, which is not always the one requested — see `measuredFps`.
|
|
113
|
+
*/
|
|
114
|
+
prepare(): {
|
|
115
|
+
width: number;
|
|
116
|
+
height: number;
|
|
117
|
+
reduced: boolean;
|
|
118
|
+
} | null;
|
|
119
|
+
/**
|
|
120
|
+
* Whether the frame about to be drawn will be kept. True when there is no
|
|
121
|
+
* fixed target, so a caller can gate its render pass unconditionally.
|
|
122
|
+
*
|
|
123
|
+
* Call once per animation frame, drawing or not: the instant is kept and reused
|
|
124
|
+
* when the frame is handed over, so one clock decides and commits.
|
|
125
|
+
*/
|
|
126
|
+
captureDue(nowMs: number): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* One rendered frame, offered to the recording.
|
|
129
|
+
*
|
|
130
|
+
* Call at the very end of the render pass. Cheap and false when there is no
|
|
131
|
+
* fixed target, so a caller can hand every frame over unconditionally. Takes no
|
|
132
|
+
* instant — it uses the one `captureDue` was given for this frame.
|
|
133
|
+
*/
|
|
134
|
+
frameRendered(): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* What the pacing actually was, or null when recording the canvas directly.
|
|
137
|
+
*
|
|
138
|
+
* The measurement is the point rather than a diagnostic afterthought: an export
|
|
139
|
+
* that ran below its target rate produced a juddering file, and the only honest
|
|
140
|
+
* options are to say so or to have not measured.
|
|
141
|
+
*/
|
|
142
|
+
get pacing(): FramePacingReport | null;
|
|
143
|
+
/**
|
|
144
|
+
* Whether the frame `frameRendered` just composited repeats the one before it.
|
|
145
|
+
*
|
|
146
|
+
* False without a target, and false when `presentedFrames` was never supplied — the same
|
|
147
|
+
* two "no evidence yet" cases `pacing` already has to account for. See
|
|
148
|
+
* `ExportTarget.duplicateFrame`, which this only forwards.
|
|
149
|
+
*/
|
|
150
|
+
get duplicateFrame(): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Start the measurement over, keeping the schedule.
|
|
153
|
+
*
|
|
154
|
+
* For a caller that records a warm-up in front of the clip proper: what a device
|
|
155
|
+
* costs while an encoder gets going is not what the clip is like, and the report is
|
|
156
|
+
* what the export decides whether to warn the player on.
|
|
157
|
+
*/
|
|
158
|
+
resetPacing(): void;
|
|
159
|
+
start(): void;
|
|
160
|
+
/**
|
|
161
|
+
* Resolves with the finished clip, or null if nothing was recorded.
|
|
162
|
+
*
|
|
163
|
+
* The surface goes back before the promise resolves either way. A cancelled
|
|
164
|
+
* export that left the drawing buffer pinned to 1080x1920 would leave the game
|
|
165
|
+
* rendering into the wrong shape for the rest of the session.
|
|
166
|
+
*/
|
|
167
|
+
stop(): Promise<Blob | null>;
|
|
168
|
+
/** Give the render surface back. Safe at any point, and idempotent. */
|
|
169
|
+
release(): void;
|
|
170
|
+
/**
|
|
171
|
+
* Bitrate from whatever the frame's real size turns out to be.
|
|
172
|
+
*
|
|
173
|
+
* Read from the track where possible, because that is the authority: a stream
|
|
174
|
+
* from a composited target has nothing to do with the canvas that was passed
|
|
175
|
+
* in, and guessing from the wrong one is how a 1080x1920 clip ends up encoded
|
|
176
|
+
* at a bitrate chosen for a 400-pixel window.
|
|
177
|
+
*/
|
|
178
|
+
private defaultBitrate;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Hand a file to the player.
|
|
182
|
+
*
|
|
183
|
+
* `navigator.share` where it exists, because on a phone that is one tap into
|
|
184
|
+
* the app they were going to post to anyway; a download otherwise. A file in
|
|
185
|
+
* the Downloads folder that nobody can find is most of the way to no export at
|
|
186
|
+
* all.
|
|
187
|
+
*/
|
|
188
|
+
export declare function offerClip(blob: Blob, filename: string): Promise<void>;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { supportedClipMimeType } from './clipMime.js';
|
|
2
|
+
import { ExportTarget, clipBitrate, exportSizeFor } from './exportTarget.js';
|
|
3
|
+
export const DEFAULT_CLIP_FPS = 30;
|
|
4
|
+
export class FrameRecorder {
|
|
5
|
+
options;
|
|
6
|
+
recorder = null;
|
|
7
|
+
chunks = [];
|
|
8
|
+
mime;
|
|
9
|
+
target = null;
|
|
10
|
+
targetStream = null;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
const mime = supportedClipMimeType();
|
|
14
|
+
if (mime === null)
|
|
15
|
+
throw new Error('This browser cannot record video.');
|
|
16
|
+
if (options.canvas === undefined &&
|
|
17
|
+
options.stream === undefined &&
|
|
18
|
+
options.target === undefined) {
|
|
19
|
+
throw new Error('A recording needs a canvas, a stream or a target.');
|
|
20
|
+
}
|
|
21
|
+
this.mime = mime;
|
|
22
|
+
}
|
|
23
|
+
get mimeType() {
|
|
24
|
+
return this.mime;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Take over the render surface before recording starts.
|
|
28
|
+
*
|
|
29
|
+
* Separate from `start` because the aspect has to be in force *before* the
|
|
30
|
+
* first frame anybody records: the camera composes for `renderer.aspect`, so
|
|
31
|
+
* locking and recording in the same breath would put a screen-shaped shot in
|
|
32
|
+
* the first frames of a vertical clip. Returns the frame size that will be
|
|
33
|
+
* recorded, which is not always the one requested — see `measuredFps`.
|
|
34
|
+
*/
|
|
35
|
+
prepare() {
|
|
36
|
+
const options = this.options.target;
|
|
37
|
+
if (options === undefined)
|
|
38
|
+
return null;
|
|
39
|
+
if (this.target !== null) {
|
|
40
|
+
return { width: this.target.width, height: this.target.height, reduced: false };
|
|
41
|
+
}
|
|
42
|
+
const fps = this.options.fps ?? DEFAULT_CLIP_FPS;
|
|
43
|
+
// The measurement was taken while rendering the *window*, so it is handed in
|
|
44
|
+
// with the pixel count it was taken at — see `exportSizeFor`.
|
|
45
|
+
const size = exportSizeFor(options.width, options.height, options.measuredFps ?? 0, fps, options.source.width * options.source.height);
|
|
46
|
+
this.target = new ExportTarget({
|
|
47
|
+
source: options.source,
|
|
48
|
+
surface: options.surface,
|
|
49
|
+
width: size.width,
|
|
50
|
+
height: size.height,
|
|
51
|
+
fps,
|
|
52
|
+
...(options.overlay === undefined ? {} : { overlay: options.overlay }),
|
|
53
|
+
...(options.drawFrame === undefined ? {} : { drawFrame: options.drawFrame }),
|
|
54
|
+
...(options.presentedFrames === undefined
|
|
55
|
+
? {}
|
|
56
|
+
: { presentedFrames: options.presentedFrames }),
|
|
57
|
+
});
|
|
58
|
+
this.targetStream = this.target.acquire();
|
|
59
|
+
return size;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether the frame about to be drawn will be kept. True when there is no
|
|
63
|
+
* fixed target, so a caller can gate its render pass unconditionally.
|
|
64
|
+
*
|
|
65
|
+
* Call once per animation frame, drawing or not: the instant is kept and reused
|
|
66
|
+
* when the frame is handed over, so one clock decides and commits.
|
|
67
|
+
*/
|
|
68
|
+
captureDue(nowMs) {
|
|
69
|
+
return this.target?.captureDue(nowMs) ?? true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* One rendered frame, offered to the recording.
|
|
73
|
+
*
|
|
74
|
+
* Call at the very end of the render pass. Cheap and false when there is no
|
|
75
|
+
* fixed target, so a caller can hand every frame over unconditionally. Takes no
|
|
76
|
+
* instant — it uses the one `captureDue` was given for this frame.
|
|
77
|
+
*/
|
|
78
|
+
frameRendered() {
|
|
79
|
+
return this.target?.frameRendered() ?? false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* What the pacing actually was, or null when recording the canvas directly.
|
|
83
|
+
*
|
|
84
|
+
* The measurement is the point rather than a diagnostic afterthought: an export
|
|
85
|
+
* that ran below its target rate produced a juddering file, and the only honest
|
|
86
|
+
* options are to say so or to have not measured.
|
|
87
|
+
*/
|
|
88
|
+
get pacing() {
|
|
89
|
+
return this.target === null ? null : this.target.pacing;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Whether the frame `frameRendered` just composited repeats the one before it.
|
|
93
|
+
*
|
|
94
|
+
* False without a target, and false when `presentedFrames` was never supplied — the same
|
|
95
|
+
* two "no evidence yet" cases `pacing` already has to account for. See
|
|
96
|
+
* `ExportTarget.duplicateFrame`, which this only forwards.
|
|
97
|
+
*/
|
|
98
|
+
get duplicateFrame() {
|
|
99
|
+
return this.target?.duplicateFrame ?? false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Start the measurement over, keeping the schedule.
|
|
103
|
+
*
|
|
104
|
+
* For a caller that records a warm-up in front of the clip proper: what a device
|
|
105
|
+
* costs while an encoder gets going is not what the clip is like, and the report is
|
|
106
|
+
* what the export decides whether to warn the player on.
|
|
107
|
+
*/
|
|
108
|
+
resetPacing() {
|
|
109
|
+
this.target?.resetPacing();
|
|
110
|
+
}
|
|
111
|
+
start() {
|
|
112
|
+
if (this.recorder !== null)
|
|
113
|
+
return;
|
|
114
|
+
const { canvas, audio, fps = DEFAULT_CLIP_FPS } = this.options;
|
|
115
|
+
if (this.options.target !== undefined)
|
|
116
|
+
this.prepare();
|
|
117
|
+
const source = this.targetStream ?? this.options.stream ?? canvas?.captureStream(fps) ?? null;
|
|
118
|
+
if (source === null)
|
|
119
|
+
throw new Error('A recording needs a canvas, a stream or a target.');
|
|
120
|
+
/*
|
|
121
|
+
* A fresh stream rather than the source one. Adding the audio tracks to a
|
|
122
|
+
* stream the caller owns means stopping the recording would stop the audio
|
|
123
|
+
* graph's capture track too, and a second export would then come out silent.
|
|
124
|
+
*/
|
|
125
|
+
const stream = new MediaStream();
|
|
126
|
+
for (const track of source.getVideoTracks())
|
|
127
|
+
stream.addTrack(track);
|
|
128
|
+
if (audio != null) {
|
|
129
|
+
for (const track of audio.getAudioTracks())
|
|
130
|
+
stream.addTrack(track);
|
|
131
|
+
}
|
|
132
|
+
this.chunks = [];
|
|
133
|
+
this.recorder = new MediaRecorder(stream, {
|
|
134
|
+
mimeType: this.mime,
|
|
135
|
+
videoBitsPerSecond: this.options.videoBitsPerSecond ?? this.defaultBitrate(stream, fps),
|
|
136
|
+
});
|
|
137
|
+
this.recorder.ondataavailable = (event) => {
|
|
138
|
+
if (event.data.size > 0)
|
|
139
|
+
this.chunks.push(event.data);
|
|
140
|
+
};
|
|
141
|
+
this.recorder.start();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Resolves with the finished clip, or null if nothing was recorded.
|
|
145
|
+
*
|
|
146
|
+
* The surface goes back before the promise resolves either way. A cancelled
|
|
147
|
+
* export that left the drawing buffer pinned to 1080x1920 would leave the game
|
|
148
|
+
* rendering into the wrong shape for the rest of the session.
|
|
149
|
+
*/
|
|
150
|
+
async stop() {
|
|
151
|
+
const recorder = this.recorder;
|
|
152
|
+
if (recorder === null) {
|
|
153
|
+
this.release();
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
this.recorder = null;
|
|
157
|
+
await new Promise((resolve) => {
|
|
158
|
+
recorder.onstop = () => resolve();
|
|
159
|
+
try {
|
|
160
|
+
recorder.stop();
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
resolve();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
this.release();
|
|
167
|
+
if (this.chunks.length === 0)
|
|
168
|
+
return null;
|
|
169
|
+
return new Blob(this.chunks, { type: this.mime });
|
|
170
|
+
}
|
|
171
|
+
/** Give the render surface back. Safe at any point, and idempotent. */
|
|
172
|
+
release() {
|
|
173
|
+
this.target?.release();
|
|
174
|
+
this.target = null;
|
|
175
|
+
this.targetStream = null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Bitrate from whatever the frame's real size turns out to be.
|
|
179
|
+
*
|
|
180
|
+
* Read from the track where possible, because that is the authority: a stream
|
|
181
|
+
* from a composited target has nothing to do with the canvas that was passed
|
|
182
|
+
* in, and guessing from the wrong one is how a 1080x1920 clip ends up encoded
|
|
183
|
+
* at a bitrate chosen for a 400-pixel window.
|
|
184
|
+
*/
|
|
185
|
+
defaultBitrate(stream, fps) {
|
|
186
|
+
const track = stream.getVideoTracks()[0];
|
|
187
|
+
const settings = track?.getSettings();
|
|
188
|
+
const width = settings?.width ?? this.options.canvas?.width ?? 1280;
|
|
189
|
+
const height = settings?.height ?? this.options.canvas?.height ?? 720;
|
|
190
|
+
return clipBitrate(width, height, fps);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Hand a file to the player.
|
|
195
|
+
*
|
|
196
|
+
* `navigator.share` where it exists, because on a phone that is one tap into
|
|
197
|
+
* the app they were going to post to anyway; a download otherwise. A file in
|
|
198
|
+
* the Downloads folder that nobody can find is most of the way to no export at
|
|
199
|
+
* all.
|
|
200
|
+
*/
|
|
201
|
+
export async function offerClip(blob, filename) {
|
|
202
|
+
const file = new File([blob], filename, { type: blob.type });
|
|
203
|
+
if (typeof navigator.canShare === 'function' && navigator.canShare({ files: [file] })) {
|
|
204
|
+
try {
|
|
205
|
+
await navigator.share({ files: [file] });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Cancelled, or refused. Fall through to a download rather than leaving
|
|
210
|
+
// the player with nothing.
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const url = URL.createObjectURL(blob);
|
|
214
|
+
const link = document.createElement('a');
|
|
215
|
+
link.href = url;
|
|
216
|
+
link.download = filename;
|
|
217
|
+
link.click();
|
|
218
|
+
// Revoked on the next turn: doing it synchronously races the download in
|
|
219
|
+
// some browsers and produces an empty file.
|
|
220
|
+
setTimeout(() => URL.revokeObjectURL(url), 10_000);
|
|
221
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filling the screen on a handheld, from a gesture that is already happening.
|
|
3
|
+
*
|
|
4
|
+
* A browser tab on a phone keeps its URL bar, and the game keeps whatever is left.
|
|
5
|
+
* There is no declaration that changes that — no manifest key, no meta tag, and
|
|
6
|
+
* nothing anywhere on the web platform that marks a page as a game and is granted
|
|
7
|
+
* anything for it. A page fills a phone's screen in exactly two ways: it is an
|
|
8
|
+
* *installed* app whose manifest asks for `display: fullscreen`, or it calls
|
|
9
|
+
* `requestFullscreen` from a user gesture. This is the second one. The manifest is
|
|
10
|
+
* the consumer's to ship and covers the installed case; between them every Android
|
|
11
|
+
* entry point is covered, and iPhone Safari is covered by neither because it has no
|
|
12
|
+
* element fullscreen at all — only the installed route.
|
|
13
|
+
*
|
|
14
|
+
* Game-agnostic (AGENTS.md): an element and a gesture. It knows nothing about what
|
|
15
|
+
* is being drawn into the element.
|
|
16
|
+
*
|
|
17
|
+
* **Handheld only, and once.** Two restraints, both of them about not taking a
|
|
18
|
+
* decision away from somebody who has already made it:
|
|
19
|
+
*
|
|
20
|
+
* A desktop player has a window they chose the size of, and a key that toggles
|
|
21
|
+
* fullscreen whenever they want it. Seizing the whole display because they clicked
|
|
22
|
+
* a menu button is the behaviour every embedded video player has been hated for.
|
|
23
|
+
* So the request is made where the screen is small and there is no other way to
|
|
24
|
+
* reclaim the space, and nowhere else.
|
|
25
|
+
*
|
|
26
|
+
* And a player who leaves fullscreen — the back gesture, the notification shade,
|
|
27
|
+
* the system button — has said something. Asking again on their next tap would be
|
|
28
|
+
* an argument they cannot win, since every tap is another gesture and every gesture
|
|
29
|
+
* is another chance to ask. One attempt per page load, whether it is granted,
|
|
30
|
+
* refused or undone.
|
|
31
|
+
*/
|
|
32
|
+
/** What the decision needs to know. Every field is observed, none of it inferred. */
|
|
33
|
+
export interface FullscreenConditions {
|
|
34
|
+
/**
|
|
35
|
+
* A handheld, decided by the pointer rather than by the user agent string.
|
|
36
|
+
*
|
|
37
|
+
* `(pointer: coarse)` is the property that actually matters — a finger, no
|
|
38
|
+
* hover, no window to speak of — and unlike a UA sniff it is right about a
|
|
39
|
+
* tablet, right about a phone in desktop-site mode, and right about a laptop
|
|
40
|
+
* with a touchscreen that is being driven by its trackpad.
|
|
41
|
+
*/
|
|
42
|
+
readonly coarsePointer: boolean;
|
|
43
|
+
/** Whether the API exists here at all. False on iPhone Safari. */
|
|
44
|
+
readonly supported: boolean;
|
|
45
|
+
/** Already filling the screen: asking again is a no-op that can still reject. */
|
|
46
|
+
readonly alreadyFullscreen: boolean;
|
|
47
|
+
/** Asked once already this page load, granted or not. See the header. */
|
|
48
|
+
readonly askedBefore: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether to ask for fullscreen on the gesture currently being handled.
|
|
52
|
+
*
|
|
53
|
+
* Pure, so all four restraints are checkable without a browser — which is the whole
|
|
54
|
+
* of this module's logic. The call itself is one line and is verified by hand, per
|
|
55
|
+
* AGENTS.md's rule that DOM is not unit-tested.
|
|
56
|
+
*/
|
|
57
|
+
export declare function fullscreenWanted(conditions: FullscreenConditions): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Ask for fullscreen on the next gesture of any kind, once, on a handheld.
|
|
60
|
+
*
|
|
61
|
+
* Returns the way to stop listening. The listeners are passive and in the capture
|
|
62
|
+
* phase, matching the audio unlock that shares this moment: a page whose first
|
|
63
|
+
* gesture has to both start the audio graph and claim the screen should do both from
|
|
64
|
+
* that one gesture, not ask for a second one.
|
|
65
|
+
*
|
|
66
|
+
* Failure is silence by design. `requestFullscreen` rejects when the browser is not
|
|
67
|
+
* satisfied that a gesture is in progress, when an ancestor iframe has no
|
|
68
|
+
* `allowfullscreen`, and on platforms that expose the method and refuse it anyway.
|
|
69
|
+
* None of those is worth a message to somebody who did not ask for fullscreen in the
|
|
70
|
+
* first place and whose game is running either way.
|
|
71
|
+
*/
|
|
72
|
+
export declare function requestFullscreenOnGesture(element: HTMLElement): () => void;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filling the screen on a handheld, from a gesture that is already happening.
|
|
3
|
+
*
|
|
4
|
+
* A browser tab on a phone keeps its URL bar, and the game keeps whatever is left.
|
|
5
|
+
* There is no declaration that changes that — no manifest key, no meta tag, and
|
|
6
|
+
* nothing anywhere on the web platform that marks a page as a game and is granted
|
|
7
|
+
* anything for it. A page fills a phone's screen in exactly two ways: it is an
|
|
8
|
+
* *installed* app whose manifest asks for `display: fullscreen`, or it calls
|
|
9
|
+
* `requestFullscreen` from a user gesture. This is the second one. The manifest is
|
|
10
|
+
* the consumer's to ship and covers the installed case; between them every Android
|
|
11
|
+
* entry point is covered, and iPhone Safari is covered by neither because it has no
|
|
12
|
+
* element fullscreen at all — only the installed route.
|
|
13
|
+
*
|
|
14
|
+
* Game-agnostic (AGENTS.md): an element and a gesture. It knows nothing about what
|
|
15
|
+
* is being drawn into the element.
|
|
16
|
+
*
|
|
17
|
+
* **Handheld only, and once.** Two restraints, both of them about not taking a
|
|
18
|
+
* decision away from somebody who has already made it:
|
|
19
|
+
*
|
|
20
|
+
* A desktop player has a window they chose the size of, and a key that toggles
|
|
21
|
+
* fullscreen whenever they want it. Seizing the whole display because they clicked
|
|
22
|
+
* a menu button is the behaviour every embedded video player has been hated for.
|
|
23
|
+
* So the request is made where the screen is small and there is no other way to
|
|
24
|
+
* reclaim the space, and nowhere else.
|
|
25
|
+
*
|
|
26
|
+
* And a player who leaves fullscreen — the back gesture, the notification shade,
|
|
27
|
+
* the system button — has said something. Asking again on their next tap would be
|
|
28
|
+
* an argument they cannot win, since every tap is another gesture and every gesture
|
|
29
|
+
* is another chance to ask. One attempt per page load, whether it is granted,
|
|
30
|
+
* refused or undone.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Whether to ask for fullscreen on the gesture currently being handled.
|
|
34
|
+
*
|
|
35
|
+
* Pure, so all four restraints are checkable without a browser — which is the whole
|
|
36
|
+
* of this module's logic. The call itself is one line and is verified by hand, per
|
|
37
|
+
* AGENTS.md's rule that DOM is not unit-tested.
|
|
38
|
+
*/
|
|
39
|
+
export function fullscreenWanted(conditions) {
|
|
40
|
+
const { coarsePointer, supported, alreadyFullscreen, askedBefore } = conditions;
|
|
41
|
+
return coarsePointer && supported && !alreadyFullscreen && !askedBefore;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Ask for fullscreen on the next gesture of any kind, once, on a handheld.
|
|
45
|
+
*
|
|
46
|
+
* Returns the way to stop listening. The listeners are passive and in the capture
|
|
47
|
+
* phase, matching the audio unlock that shares this moment: a page whose first
|
|
48
|
+
* gesture has to both start the audio graph and claim the screen should do both from
|
|
49
|
+
* that one gesture, not ask for a second one.
|
|
50
|
+
*
|
|
51
|
+
* Failure is silence by design. `requestFullscreen` rejects when the browser is not
|
|
52
|
+
* satisfied that a gesture is in progress, when an ancestor iframe has no
|
|
53
|
+
* `allowfullscreen`, and on platforms that expose the method and refuse it anyway.
|
|
54
|
+
* None of those is worth a message to somebody who did not ask for fullscreen in the
|
|
55
|
+
* first place and whose game is running either way.
|
|
56
|
+
*/
|
|
57
|
+
export function requestFullscreenOnGesture(element) {
|
|
58
|
+
const events = ['pointerdown', 'keydown', 'touchstart'];
|
|
59
|
+
let asked = false;
|
|
60
|
+
function stop() {
|
|
61
|
+
for (const event of events)
|
|
62
|
+
window.removeEventListener(event, fire, true);
|
|
63
|
+
}
|
|
64
|
+
function fire() {
|
|
65
|
+
const wanted = fullscreenWanted({
|
|
66
|
+
coarsePointer: matchesCoarsePointer(),
|
|
67
|
+
supported: typeof element.requestFullscreen === 'function',
|
|
68
|
+
alreadyFullscreen: document.fullscreenElement !== null,
|
|
69
|
+
askedBefore: asked,
|
|
70
|
+
});
|
|
71
|
+
// Detached either way: on a desktop the answer will never change, and on a
|
|
72
|
+
// handheld the one attempt has now been made.
|
|
73
|
+
asked = true;
|
|
74
|
+
stop();
|
|
75
|
+
if (!wanted)
|
|
76
|
+
return;
|
|
77
|
+
// Floating deliberately. There is nothing to do with the rejection but ignore
|
|
78
|
+
// it, and awaiting it would hold up the gesture that is unlocking the audio.
|
|
79
|
+
void element.requestFullscreen().catch(() => {
|
|
80
|
+
/* Refused. The game is running regardless. */
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
for (const event of events)
|
|
84
|
+
window.addEventListener(event, fire, true);
|
|
85
|
+
return stop;
|
|
86
|
+
}
|
|
87
|
+
/** `(pointer: coarse)`, defensively — an engine without `matchMedia` is a test one. */
|
|
88
|
+
function matchesCoarsePointer() {
|
|
89
|
+
if (typeof window.matchMedia !== 'function')
|
|
90
|
+
return false;
|
|
91
|
+
return window.matchMedia('(pointer: coarse)').matches;
|
|
92
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel art from a string grid, as a CSS cursor value.
|
|
3
|
+
*
|
|
4
|
+
* Generated rather than shipped as a PNG. Two reasons, and the second is the
|
|
5
|
+
* one that matters: a generated cursor costs no asset and no request, and it
|
|
6
|
+
* can be recoloured at runtime — so it belongs to whatever palette the game is
|
|
7
|
+
* currently wearing instead of being a fixed image that clashes with half of
|
|
8
|
+
* them.
|
|
9
|
+
*
|
|
10
|
+
* Rendered at the device pixel ratio and declared through `image-set`, so it is
|
|
11
|
+
* crisp on a retina display. A bitmap authored at 1x is upscaled smoothly by
|
|
12
|
+
* the browser, which is precisely the wrong thing to do to pixel art.
|
|
13
|
+
*/
|
|
14
|
+
export interface PixelCursorOptions {
|
|
15
|
+
/** Device-independent pixels per art pixel. */
|
|
16
|
+
readonly scale?: number;
|
|
17
|
+
/** The art pixel that sits under the pointer. Defaults to the centre. */
|
|
18
|
+
readonly hotspotX?: number;
|
|
19
|
+
readonly hotspotY?: number;
|
|
20
|
+
/** Keyword used when the image cannot be built. */
|
|
21
|
+
readonly fallback?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @param rows one string per row; each character indexes `palette`.
|
|
25
|
+
* @param palette character → CSS colour. A character absent from it is
|
|
26
|
+
* transparent, which is what makes `' '` the natural empty cell.
|
|
27
|
+
*/
|
|
28
|
+
export declare function pixelCursor(rows: readonly string[], palette: Readonly<Record<string, string>>, options?: PixelCursorOptions): string;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param rows one string per row; each character indexes `palette`.
|
|
3
|
+
* @param palette character → CSS colour. A character absent from it is
|
|
4
|
+
* transparent, which is what makes `' '` the natural empty cell.
|
|
5
|
+
*/
|
|
6
|
+
export function pixelCursor(rows, palette, options = {}) {
|
|
7
|
+
const fallback = options.fallback ?? 'auto';
|
|
8
|
+
const height = rows.length;
|
|
9
|
+
const width = rows[0]?.length ?? 0;
|
|
10
|
+
if (width === 0 || height === 0)
|
|
11
|
+
return fallback;
|
|
12
|
+
const scale = Math.max(1, Math.round(options.scale ?? 3));
|
|
13
|
+
const dpr = Math.max(1, Math.round(globalThis.devicePixelRatio ?? 1));
|
|
14
|
+
const cssWidth = width * scale;
|
|
15
|
+
const cssHeight = height * scale;
|
|
16
|
+
const hotspotX = Math.round((options.hotspotX ?? (width - 1) / 2) * scale);
|
|
17
|
+
const hotspotY = Math.round((options.hotspotY ?? (height - 1) / 2) * scale);
|
|
18
|
+
const url = render(rows, palette, cssWidth * dpr, cssHeight * dpr, scale * dpr);
|
|
19
|
+
if (url === null)
|
|
20
|
+
return fallback;
|
|
21
|
+
/*
|
|
22
|
+
* `image-set` carries the pixel ratio the image was drawn at, so the browser
|
|
23
|
+
* displays it at the right physical size instead of treating device pixels as
|
|
24
|
+
* CSS pixels and rendering a cursor a third of the intended size.
|
|
25
|
+
*
|
|
26
|
+
* The bare `url()` in front is the fallback for engines without image-set in
|
|
27
|
+
* `cursor`; there the image is oversized on retina rather than absent, which
|
|
28
|
+
* is the better of the two failures.
|
|
29
|
+
*/
|
|
30
|
+
const hotspot = `${hotspotX} ${hotspotY}`;
|
|
31
|
+
if (dpr === 1)
|
|
32
|
+
return `url(${url}) ${hotspot}, ${fallback}`;
|
|
33
|
+
return `image-set(url(${url}) ${dpr}x) ${hotspot}, url(${url}) ${hotspot}, ${fallback}`;
|
|
34
|
+
}
|
|
35
|
+
function render(rows, palette, pixelWidth, pixelHeight, cellSize) {
|
|
36
|
+
let canvas;
|
|
37
|
+
try {
|
|
38
|
+
canvas = document.createElement('canvas');
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
canvas.width = pixelWidth;
|
|
44
|
+
canvas.height = pixelHeight;
|
|
45
|
+
const ctx = canvas.getContext('2d');
|
|
46
|
+
if (ctx === null)
|
|
47
|
+
return null;
|
|
48
|
+
for (let y = 0; y < rows.length; y++) {
|
|
49
|
+
const row = rows[y] ?? '';
|
|
50
|
+
for (let x = 0; x < row.length; x++) {
|
|
51
|
+
const colour = palette[row[x] ?? ''];
|
|
52
|
+
if (colour === undefined)
|
|
53
|
+
continue;
|
|
54
|
+
ctx.fillStyle = colour;
|
|
55
|
+
// Filled as whole cells rather than drawn small and scaled up: this is
|
|
56
|
+
// what keeps the edges hard at any ratio.
|
|
57
|
+
ctx.fillRect(x * cellSize, y * cellSize, cellSize, cellSize);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return canvas.toDataURL('image/png');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|