@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,703 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Low-level, device-agnostic input capture: raw keys, relative mouse motion,
|
|
3
|
+
* live touch points. Interpretation (bindings, gestures, virtual stick) is the
|
|
4
|
+
* game's job — this module never decides what an input *means*.
|
|
5
|
+
*/
|
|
6
|
+
import { isTypingTarget } from './typingTarget.js';
|
|
7
|
+
import { ActiveDevice } from './activeDevice.js';
|
|
8
|
+
import { glyphFor, identifyGamepad, labelFor } from './gamepadIdentity.js';
|
|
9
|
+
import { AXIS_INDEX, BUTTON_INDEX, DEFAULT_DEADZONE, applyDeadzone, } from './gamepadMapping.js';
|
|
10
|
+
import { playRumble, stopRumble } from './rumble.js';
|
|
11
|
+
/**
|
|
12
|
+
* Ask for the pointer lock, and deal with being told no.
|
|
13
|
+
*
|
|
14
|
+
* Split out from the caller below so the rule can be tested without a DOM, the
|
|
15
|
+
* same way `isTypingTarget` is.
|
|
16
|
+
*
|
|
17
|
+
* **The refusal is expected and it is not an error.** Chrome returns a promise here
|
|
18
|
+
* (113 and up) and rejects it when it will not grant the lock — most often for the
|
|
19
|
+
* second or so after the user has left one with Escape, which is precisely when the
|
|
20
|
+
* next click arrives asking for it back. Dropping that promise makes an ordinary
|
|
21
|
+
* refusal an `unhandledrejection`, and in a game that watches for those it becomes a
|
|
22
|
+
* bug report about nothing: see report `G94666`, 2026-08-08.
|
|
23
|
+
*
|
|
24
|
+
* `requestFullscreen` next door has always caught its own for the same reason.
|
|
25
|
+
*/
|
|
26
|
+
export function askForPointerLock(request) {
|
|
27
|
+
/*
|
|
28
|
+
* **Asked for without the operating system's pointer acceleration on it.**
|
|
29
|
+
*
|
|
30
|
+
* `movementX` is a *display* delta by default, so the pointer curve the desktop applies to a
|
|
31
|
+
* cursor is applied to the camera as well: a slow hand is scaled toward nothing and a fast one
|
|
32
|
+
* is scaled up, which is a camera that ignores small movements and then jumps. Reported from
|
|
33
|
+
* Firefox on Linux as "if I move slowly it does not move, and if I accelerate it moves steppy,
|
|
34
|
+
* not because the frame rate is low" — which is the acceleration curve described exactly, by
|
|
35
|
+
* somebody who could tell it was not the frame rate.
|
|
36
|
+
*
|
|
37
|
+
* A game wants the device's own counts. `unadjustedMovement` is how the specification says so,
|
|
38
|
+
* and it is per request rather than a setting, so it belongs here rather than at a call site.
|
|
39
|
+
*
|
|
40
|
+
* **The fallback is the whole reason this is two calls.** A browser that does not implement the
|
|
41
|
+
* option rejects with `NotSupportedError` and grants *nothing*, so asking once and giving up
|
|
42
|
+
* would trade an accelerated camera for no camera at all on every engine that lacks it. Asked
|
|
43
|
+
* again without the option, that browser behaves exactly as it did before this existed.
|
|
44
|
+
*
|
|
45
|
+
* **Firefox is that browser, measured on 2026-08-25, and the fallback is not a rescue there.**
|
|
46
|
+
* Firefox 154 returns a promise and rejects the option with `NotSupportedError`; asked plainly it
|
|
47
|
+
* accepts, and what it then delivers is the compositor's accelerated cursor travel in whole
|
|
48
|
+
* screen pixels — 1,787 locked events, **not one of them fractional**, 27% of them exactly one
|
|
49
|
+
* pixel, and a slow hand producing *no event at all* because the accelerated position never
|
|
50
|
+
* crosses a pixel boundary. That is the report this rule was written for, arriving again from a
|
|
51
|
+
* browser the rule cannot reach. Chromium honours the option and is unaffected.
|
|
52
|
+
*
|
|
53
|
+
* **So this function cannot fix Firefox and is not the place to try.** What it can do is what it
|
|
54
|
+
* does: ask properly, and fall back rather than leaving a game with no camera. A game that wants
|
|
55
|
+
* to respond — a warning, a different sensitivity — needs to be told, and nothing tells it yet.
|
|
56
|
+
* `demo/dev/mouse.html` is the instrument that produced the figures above.
|
|
57
|
+
*/
|
|
58
|
+
const pending = request({ unadjustedMovement: true });
|
|
59
|
+
// Undefined on anything older than the promise, so this cannot reach for `.catch`
|
|
60
|
+
// unconditionally: a browser that merely lacks the feature would throw in a click.
|
|
61
|
+
if (pending === undefined)
|
|
62
|
+
return;
|
|
63
|
+
void pending.catch((error) => {
|
|
64
|
+
/*
|
|
65
|
+
* **Only the option's own refusal is retried**, and the test is the name the specification
|
|
66
|
+
* gives it. Every other refusal is the ordinary one this function was written for — most
|
|
67
|
+
* often the second after the user left the lock with Escape, which is precisely when the
|
|
68
|
+
* next click arrives asking for it back — and asking again immediately would be a second
|
|
69
|
+
* request for the same denial rather than a fallback.
|
|
70
|
+
*/
|
|
71
|
+
const unsupported = typeof error === 'object' &&
|
|
72
|
+
error !== null &&
|
|
73
|
+
error.name === 'NotSupportedError';
|
|
74
|
+
if (!unsupported)
|
|
75
|
+
return;
|
|
76
|
+
const plain = request();
|
|
77
|
+
if (plain !== undefined) {
|
|
78
|
+
void plain.catch(() => {
|
|
79
|
+
/* Refused. The game carries on with the mouse unlocked. */
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** Scratch for the deadzone, at module scope because `axis` is a per-frame read. */
|
|
85
|
+
const deadzoned = { x: 0, y: 0 };
|
|
86
|
+
/** Four is past generous for local play, and the array is preallocated to it. */
|
|
87
|
+
const MAX_PADS = 4;
|
|
88
|
+
/**
|
|
89
|
+
* One pad's state, reused across polls.
|
|
90
|
+
*
|
|
91
|
+
* **Bitmasks rather than arrays of booleans**, because the edge is the difference of two of them
|
|
92
|
+
* and seventeen buttons fit in one integer. `pressed` is `downNow & ~downLast`, computed once at
|
|
93
|
+
* the poll rather than derived at every read.
|
|
94
|
+
*/
|
|
95
|
+
class PadState {
|
|
96
|
+
index = -1;
|
|
97
|
+
mapping = 'unknown';
|
|
98
|
+
live = false;
|
|
99
|
+
id = '';
|
|
100
|
+
downNow = 0;
|
|
101
|
+
downLast = 0;
|
|
102
|
+
claimed = 0;
|
|
103
|
+
/**
|
|
104
|
+
* Presses waiting for somebody to act on them, one bit a button.
|
|
105
|
+
*
|
|
106
|
+
* The pad's half of the pair `keysUnclaimed` is for the keyboard, and it exists for the same
|
|
107
|
+
* reason: a claimant does not run every display frame. See `sync`.
|
|
108
|
+
*/
|
|
109
|
+
unclaimed = 0;
|
|
110
|
+
values = new Float32Array(17);
|
|
111
|
+
axes = new Float32Array(8);
|
|
112
|
+
axisCount = 0;
|
|
113
|
+
buttonCount = 0;
|
|
114
|
+
/**
|
|
115
|
+
* The actuator from the most recent poll, and it is re-read every poll on purpose.
|
|
116
|
+
*
|
|
117
|
+
* A `Gamepad` is a fresh snapshot each `getGamepads` call and a pad unplugged and plugged back in
|
|
118
|
+
* is a different device behind the same slot — holding the first actuator would drive hardware
|
|
119
|
+
* that is no longer there, or fail against one that is.
|
|
120
|
+
*/
|
|
121
|
+
actuator = null;
|
|
122
|
+
/** So a failure is reported once per pad rather than once per effect. See `refuseIfUnvouched`. */
|
|
123
|
+
rumbleFailed = false;
|
|
124
|
+
reportRumbleFailure = () => {
|
|
125
|
+
if (this.rumbleFailed)
|
|
126
|
+
return;
|
|
127
|
+
this.rumbleFailed = true;
|
|
128
|
+
console.warn(`[driftengine] this pad stopped taking haptic effects: ${JSON.stringify(this.id)}. ` +
|
|
129
|
+
'It was most likely unplugged mid-effect; `canRumble` answers again after the next poll.');
|
|
130
|
+
};
|
|
131
|
+
identityObject = {
|
|
132
|
+
family: 'generic',
|
|
133
|
+
label: (button) => labelFor(this.identityObject.family, button),
|
|
134
|
+
glyph: (button) => glyphFor(this.identityObject.family, button),
|
|
135
|
+
};
|
|
136
|
+
get identity() {
|
|
137
|
+
return this.identityObject;
|
|
138
|
+
}
|
|
139
|
+
/** Copy a snapshot into numbers, and latch this frame's edges. Allocates nothing. */
|
|
140
|
+
sync(pad) {
|
|
141
|
+
if (pad.id !== this.id) {
|
|
142
|
+
this.id = pad.id;
|
|
143
|
+
this.identityObject.family = identifyGamepad(pad.id);
|
|
144
|
+
/* The browser's own word, normalised: it writes `''` where it will not vouch for a layout. */
|
|
145
|
+
this.mapping = pad.mapping === 'standard' ? 'standard' : 'unknown';
|
|
146
|
+
}
|
|
147
|
+
this.index = pad.index;
|
|
148
|
+
this.actuator = pad.vibrationActuator ?? null;
|
|
149
|
+
this.downLast = this.downNow;
|
|
150
|
+
let next = 0;
|
|
151
|
+
const buttons = Math.min(pad.buttons.length, 17);
|
|
152
|
+
this.buttonCount = buttons;
|
|
153
|
+
for (let i = 0; i < buttons; i += 1) {
|
|
154
|
+
const button = pad.buttons[i];
|
|
155
|
+
if (button === undefined)
|
|
156
|
+
continue;
|
|
157
|
+
this.values[i] = button.value;
|
|
158
|
+
if (button.pressed)
|
|
159
|
+
next |= 1 << i;
|
|
160
|
+
}
|
|
161
|
+
/*
|
|
162
|
+
* **A press waits to be claimed; only a release spends it.**
|
|
163
|
+
*
|
|
164
|
+
* This used to read *"an edge nobody claimed last frame is not carried into this one"*, which
|
|
165
|
+
* makes a press live for exactly one poll — and `poll` is on an animation frame while a
|
|
166
|
+
* fixed-step consumer is not. At 120 Hz against a 60 Hz simulation about half the display
|
|
167
|
+
* frames run no tick at all, so a press landing in one of those was dropped before anything
|
|
168
|
+
* could claim it, and a controller's jump went missing in proportion to the player's refresh
|
|
169
|
+
* rate. The keyboard was given a claim-scoped edge for this exact reason; the pad kept the
|
|
170
|
+
* frame-scoped one and had the same bug for longer.
|
|
171
|
+
*
|
|
172
|
+
* New presses accumulate, a claim spends one, and a button coming back up spends whatever is
|
|
173
|
+
* left — a press nobody wanted, whose button is no longer down, describes nothing anybody can
|
|
174
|
+
* still act on. Per button, so claiming one never spends another: two buttons in one frame are
|
|
175
|
+
* two independent claims, which is what *"press B+A at the same identical time"* needs.
|
|
176
|
+
*/
|
|
177
|
+
this.unclaimed |= next & ~this.downNow;
|
|
178
|
+
this.unclaimed &= next;
|
|
179
|
+
this.downNow = next;
|
|
180
|
+
/* The *readable* edge stays frame-scoped: `pressed` is what a UI draws with, and a highlight
|
|
181
|
+
that outlived its frame would be wrong. */
|
|
182
|
+
this.claimed = 0;
|
|
183
|
+
const axes = Math.min(pad.axes.length, 8);
|
|
184
|
+
this.axisCount = axes;
|
|
185
|
+
for (let i = 0; i < axes; i += 1)
|
|
186
|
+
this.axes[i] = pad.axes[i] ?? 0;
|
|
187
|
+
return next !== 0;
|
|
188
|
+
}
|
|
189
|
+
/** Whether any stick has left the dead region, which counts as the player using this pad. */
|
|
190
|
+
moved(deadzone) {
|
|
191
|
+
for (let i = 0; i + 1 < this.axisCount; i += 2) {
|
|
192
|
+
applyDeadzone(this.axes[i] ?? 0, this.axes[i + 1] ?? 0, deadzone, deadzoned);
|
|
193
|
+
if (deadzoned.x !== 0 || deadzoned.y !== 0)
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
deadzone = DEFAULT_DEADZONE;
|
|
199
|
+
down(button) {
|
|
200
|
+
return (this.downNow & (1 << BUTTON_INDEX[button])) !== 0;
|
|
201
|
+
}
|
|
202
|
+
pressed(button) {
|
|
203
|
+
const bit = 1 << BUTTON_INDEX[button];
|
|
204
|
+
return (this.downNow & ~this.downLast & ~this.claimed & bit) !== 0;
|
|
205
|
+
}
|
|
206
|
+
consumePress(button) {
|
|
207
|
+
const bit = 1 << BUTTON_INDEX[button];
|
|
208
|
+
if ((this.unclaimed & bit) === 0)
|
|
209
|
+
return false;
|
|
210
|
+
this.unclaimed &= ~bit;
|
|
211
|
+
/* So the readable edge agrees within the frame that produced it: something drawing this button
|
|
212
|
+
as freshly pressed must stop the moment somebody acts on it. */
|
|
213
|
+
this.claimed |= bit;
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
axis(axis) {
|
|
217
|
+
const index = AXIS_INDEX[axis];
|
|
218
|
+
/* Deadzoned against its partner, because the dead region is a circle over the pair rather
|
|
219
|
+
than a window on each — see `applyDeadzone`. */
|
|
220
|
+
const pairFirst = index - (index % 2);
|
|
221
|
+
applyDeadzone(this.axes[pairFirst] ?? 0, this.axes[pairFirst + 1] ?? 0, this.deadzone, deadzoned);
|
|
222
|
+
return index === pairFirst ? deadzoned.x : deadzoned.y;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* A trigger's travel, and it is deliberately not `axis`.
|
|
226
|
+
*
|
|
227
|
+
* A stick's deadzone is a circle over a *pair*, and a trigger has no partner to pair with — so
|
|
228
|
+
* asking for one through `axis` would either invent a partner or mean something different from
|
|
229
|
+
* every other member of that method. It rests at 0 and needs no dead region of its own.
|
|
230
|
+
*/
|
|
231
|
+
trigger(button) {
|
|
232
|
+
return this.values[BUTTON_INDEX[button]] ?? 0;
|
|
233
|
+
}
|
|
234
|
+
button(index) {
|
|
235
|
+
if (index < 0 || index >= this.buttonCount)
|
|
236
|
+
return false;
|
|
237
|
+
return (this.downNow & (1 << index)) !== 0;
|
|
238
|
+
}
|
|
239
|
+
rawAxis(index) {
|
|
240
|
+
if (index < 0 || index >= this.axisCount)
|
|
241
|
+
return 0;
|
|
242
|
+
return this.axes[index] ?? 0;
|
|
243
|
+
}
|
|
244
|
+
get canRumble() {
|
|
245
|
+
return this.actuator !== null && typeof this.actuator.playEffect === 'function';
|
|
246
|
+
}
|
|
247
|
+
rumble(durationMs, strong, weak) {
|
|
248
|
+
return playRumble(this.actuator, durationMs, strong, weak, this.reportRumbleFailure);
|
|
249
|
+
}
|
|
250
|
+
stopRumble() {
|
|
251
|
+
return stopRumble(this.actuator, this.reportRumbleFailure);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export class InputSource {
|
|
255
|
+
isCoarse;
|
|
256
|
+
touches = new Map();
|
|
257
|
+
target;
|
|
258
|
+
keys = new Set();
|
|
259
|
+
preventDefaultCodes;
|
|
260
|
+
subscribers = [];
|
|
261
|
+
mouseDx = 0;
|
|
262
|
+
mouseDy = 0;
|
|
263
|
+
mouseButtonDown = false;
|
|
264
|
+
disposers = [];
|
|
265
|
+
/** Which device the player last actually used, and who wants telling when that changes. */
|
|
266
|
+
active = new ActiveDevice();
|
|
267
|
+
enabled = {
|
|
268
|
+
keyboard: true,
|
|
269
|
+
mouse: true,
|
|
270
|
+
touch: true,
|
|
271
|
+
gamepad: true,
|
|
272
|
+
};
|
|
273
|
+
/** Preallocated: a poll must not build a pad per frame. */
|
|
274
|
+
padStates = Array.from({ length: MAX_PADS }, () => new PadState());
|
|
275
|
+
/** The live subset, as a stable array whose length is set rather than rebuilt. */
|
|
276
|
+
padViews = [];
|
|
277
|
+
deadzone = DEFAULT_DEADZONE;
|
|
278
|
+
autoPoll = true;
|
|
279
|
+
frameHandle = 0;
|
|
280
|
+
/** Devices already refused in words, so a refusal is once a pad rather than once a frame. */
|
|
281
|
+
refusedPads = new Set();
|
|
282
|
+
/**
|
|
283
|
+
* Keys that went down since the last poll, and the ones a caller has claimed.
|
|
284
|
+
*
|
|
285
|
+
* `isDown` is a level and `onKeyDown` is a callback; neither is an edge a simulation tick can
|
|
286
|
+
* take. These give the keyboard the two verbs a pad already had, latched at the same moment and
|
|
287
|
+
* cleared at the same one, which is what lets one action answer for both devices without either
|
|
288
|
+
* being a special case.
|
|
289
|
+
*/
|
|
290
|
+
keysPressed = new Set();
|
|
291
|
+
keysPressedNext = new Set();
|
|
292
|
+
keysClaimed = new Set();
|
|
293
|
+
/**
|
|
294
|
+
* Presses waiting for somebody to act on them.
|
|
295
|
+
*
|
|
296
|
+
* **Separate from `keysPressed`, because the two edges have different lifetimes and conflating
|
|
297
|
+
* them lost inputs.** `keysPressed` is for *drawing* — a highlight that outlived its frame would
|
|
298
|
+
* be wrong — so it rotates every poll. This one is for *acting*, and a claimant does not run
|
|
299
|
+
* every frame: `poll` is on an animation frame and a fixed-step simulation is not, so at 120 Hz
|
|
300
|
+
* against a 60 Hz tick about half the display frames run no tick at all. A press that landed in
|
|
301
|
+
* one of those was rotated away before anything could claim it, and the player's jump did not
|
|
302
|
+
* happen — intermittently, in proportion to their refresh rate. A consumer found it by replacing
|
|
303
|
+
* a hand-rolled `onKeyDown` latch, which cleared only when the simulation ran, with
|
|
304
|
+
* `ActionMap.consumePress`.
|
|
305
|
+
*
|
|
306
|
+
* So a claim lives until it is claimed or until the key comes back up. **Releasing is what makes
|
|
307
|
+
* it stale**: a press nobody wanted, whose key is no longer down, describes nothing anybody can
|
|
308
|
+
* still act on. What this costs is a press held across a screen that does not read it, which
|
|
309
|
+
* then lands on the screen that does — which is the same thing the hand-rolled latch did.
|
|
310
|
+
*/
|
|
311
|
+
keysUnclaimed = new Set();
|
|
312
|
+
/**
|
|
313
|
+
* `options` is a **third** parameter rather than a widened second, so every existing call site
|
|
314
|
+
* keeps compiling. A consumer that passes only a target and its prevent-default codes gets the
|
|
315
|
+
* behaviour it always had, plus a working controller it did not ask for.
|
|
316
|
+
*/
|
|
317
|
+
constructor(target, preventDefaultCodes = [], options = {}) {
|
|
318
|
+
this.target = target;
|
|
319
|
+
this.preventDefaultCodes = new Set(preventDefaultCodes);
|
|
320
|
+
this.isCoarse = window.matchMedia('(pointer: coarse)').matches;
|
|
321
|
+
this.deadzone = options.deadzone ?? DEFAULT_DEADZONE;
|
|
322
|
+
this.autoPoll = options.autoPoll ?? true;
|
|
323
|
+
for (const name of ['keyboard', 'mouse', 'touch', 'gamepad']) {
|
|
324
|
+
this.enabled[name] = options.sources?.[name] ?? true;
|
|
325
|
+
}
|
|
326
|
+
for (const pad of this.padStates)
|
|
327
|
+
pad.deadzone = this.deadzone;
|
|
328
|
+
this.listen(window, 'keydown', (e) => {
|
|
329
|
+
/*
|
|
330
|
+
* A keystroke aimed at a text field is not the game's.
|
|
331
|
+
*
|
|
332
|
+
* Before this, `preventDefaultCodes` applied everywhere, so a consumer that
|
|
333
|
+
* asked for `Space` and `KeyE` — reasonably, since Space scrolls the page —
|
|
334
|
+
* silently made those characters untypeable in its own forms. A consumer
|
|
335
|
+
* hit exactly that: a player could not put a space or an `e` into a bug report.
|
|
336
|
+
*
|
|
337
|
+
* The key is not registered either, not merely un-prevented: holding `W` to
|
|
338
|
+
* write a word must not walk the character into the sea behind the dialog.
|
|
339
|
+
*/
|
|
340
|
+
if (isTypingTarget(e.target))
|
|
341
|
+
return;
|
|
342
|
+
if (!this.enabled.keyboard)
|
|
343
|
+
return;
|
|
344
|
+
if (this.preventDefaultCodes.has(e.code))
|
|
345
|
+
e.preventDefault();
|
|
346
|
+
if (e.repeat)
|
|
347
|
+
return;
|
|
348
|
+
this.keys.add(e.code);
|
|
349
|
+
this.keysPressedNext.add(e.code);
|
|
350
|
+
this.keysUnclaimed.add(e.code);
|
|
351
|
+
this.active.use('keyboard');
|
|
352
|
+
for (let i = 0; i < this.subscribers.length; i++) {
|
|
353
|
+
this.subscribers[i]?.onKeyDown?.(e.code);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
// Always released, even from a field: a key held *before* focus moved into one
|
|
357
|
+
// is in `keys`, and skipping its keyup would leave the character walking forever.
|
|
358
|
+
this.listen(window, 'keyup', (e) => {
|
|
359
|
+
this.keys.delete(e.code);
|
|
360
|
+
/* And the unclaimed press goes with it — see `keysUnclaimed`. */
|
|
361
|
+
this.keysUnclaimed.delete(e.code);
|
|
362
|
+
});
|
|
363
|
+
this.listen(window, 'blur', () => {
|
|
364
|
+
this.keys.clear();
|
|
365
|
+
this.keysUnclaimed.clear();
|
|
366
|
+
});
|
|
367
|
+
this.listen(target, 'mousedown', () => {
|
|
368
|
+
if (!this.enabled.mouse)
|
|
369
|
+
return;
|
|
370
|
+
this.mouseButtonDown = true;
|
|
371
|
+
this.active.use('mouse');
|
|
372
|
+
});
|
|
373
|
+
this.listen(window, 'mouseup', () => {
|
|
374
|
+
this.mouseButtonDown = false;
|
|
375
|
+
});
|
|
376
|
+
/*
|
|
377
|
+
* **Released by anything that can eat the mouseup, exactly as the keys are.**
|
|
378
|
+
*
|
|
379
|
+
* A held key survives a lost focus and leaves the character walking forever, which is why
|
|
380
|
+
* `blur` clears `keys` above. This flag had no such release and is worse when it sticks,
|
|
381
|
+
* because it does not merely hold an input on — it silently moves the look onto a **cursor
|
|
382
|
+
* that is not locked**, and an unlocked cursor is a different device: its `movementX` is the
|
|
383
|
+
* travel of an arrow across the desktop, so it stops dead at the edge of the display and it
|
|
384
|
+
* arrives in whole screen pixels with the operating system's acceleration curve on it.
|
|
385
|
+
*
|
|
386
|
+
* That is two bug reports in one. The camera turns until it will not turn any further and
|
|
387
|
+
* only frees up when the mouse is moved back, which is the arrow sitting against the edge;
|
|
388
|
+
* and a slow hand moves the camera not at all while a fast one moves it in steps, which is
|
|
389
|
+
* sub-pixel travel rounding to zero and then to several at once. Both were reported on
|
|
390
|
+
* browser fullscreen, where the transition blurs the window — eating the mouseup — and the
|
|
391
|
+
* frame is the whole screen, so there is no desktop left to travel across before the edge.
|
|
392
|
+
*
|
|
393
|
+
* `visibilitychange` as well as `blur`, because a tab switched away with a button held
|
|
394
|
+
* comes back to a document that never saw the release either.
|
|
395
|
+
*/
|
|
396
|
+
this.listen(window, 'blur', () => {
|
|
397
|
+
this.mouseButtonDown = false;
|
|
398
|
+
});
|
|
399
|
+
this.listen(window, 'pointercancel', () => {
|
|
400
|
+
this.mouseButtonDown = false;
|
|
401
|
+
});
|
|
402
|
+
/* Not in `GlobalEventHandlersEventMap`, so it is bound directly and disposed by hand. */
|
|
403
|
+
const onHidden = () => {
|
|
404
|
+
if (document.visibilityState !== 'visible')
|
|
405
|
+
this.mouseButtonDown = false;
|
|
406
|
+
};
|
|
407
|
+
document.addEventListener('visibilitychange', onHidden);
|
|
408
|
+
this.disposers.push(() => document.removeEventListener('visibilitychange', onHidden));
|
|
409
|
+
this.listen(window, 'mousemove', (e) => {
|
|
410
|
+
if (!this.enabled.mouse)
|
|
411
|
+
return;
|
|
412
|
+
/* Offered rather than asserted: a mousemove is not necessarily a decision, so
|
|
413
|
+
`ActiveDevice` accumulates it against a threshold. See its own comment. */
|
|
414
|
+
this.active.moved(e.movementX, e.movementY);
|
|
415
|
+
if (this.hasPointerLock || this.mouseButtonDown) {
|
|
416
|
+
this.mouseDx += e.movementX;
|
|
417
|
+
this.mouseDy += e.movementY;
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
this.listen(target, 'touchstart', (e) => this.onTouches(e, 'start'), false);
|
|
421
|
+
this.listen(target, 'touchmove', (e) => this.onTouches(e, 'move'), false);
|
|
422
|
+
this.listen(target, 'touchend', (e) => this.onTouches(e, 'end'), false);
|
|
423
|
+
this.listen(target, 'touchcancel', (e) => this.onTouches(e, 'end'), false);
|
|
424
|
+
/* **This is what makes a controller work with no wiring at all**, which is the requirement.
|
|
425
|
+
It never starts when the source is off, so an application that declines controllers pays
|
|
426
|
+
nothing rather than paying for a loop that returns immediately. */
|
|
427
|
+
this.startPolling();
|
|
428
|
+
}
|
|
429
|
+
isDown(code) {
|
|
430
|
+
return this.keys.has(code);
|
|
431
|
+
}
|
|
432
|
+
/* -- Gamepads, hints and policy -------------------------------------------------------- */
|
|
433
|
+
/**
|
|
434
|
+
* The pads currently connected and seen, most recently sampled.
|
|
435
|
+
*
|
|
436
|
+
* **A pad is invisible until the player uses it**, and that is the browser's rule rather than
|
|
437
|
+
* this engine's: reporting a connected gamepad before a button has been pressed is a
|
|
438
|
+
* fingerprinting surface, so none does. It happens to be the rule this design wanted anyway.
|
|
439
|
+
*
|
|
440
|
+
* The array is stable and its length is set rather than rebuilt, so reading it allocates
|
|
441
|
+
* nothing.
|
|
442
|
+
*/
|
|
443
|
+
get pads() {
|
|
444
|
+
return this.padViews;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* One pad by position in `pads`, or null.
|
|
448
|
+
*
|
|
449
|
+
* **Position in the list, not the browser's slot** — `GamepadView.index` answers that, and is
|
|
450
|
+
* what a consumer pins a player to. The distinction shows itself when a pad is unplugged: the
|
|
451
|
+
* list closes up, and a caller holding a slot wants `index`.
|
|
452
|
+
*/
|
|
453
|
+
pad(at) {
|
|
454
|
+
return this.padViews[at] ?? null;
|
|
455
|
+
}
|
|
456
|
+
/** Which device the player last actually used. See `activeDevice.ts` for what counts as use. */
|
|
457
|
+
get lastDevice() {
|
|
458
|
+
return this.active.last;
|
|
459
|
+
}
|
|
460
|
+
/** Told when that changes, and only when it changes. Returns the unsubscribe. */
|
|
461
|
+
onDeviceChange(listener) {
|
|
462
|
+
return this.active.subscribe(listener);
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Turn a device on or off at runtime, for a settings screen.
|
|
466
|
+
*
|
|
467
|
+
* A disabled source is inert rather than absent, and disabling the gamepad stops the poll
|
|
468
|
+
* outright — so an application that does not want controllers pays for no snapshot a frame.
|
|
469
|
+
*/
|
|
470
|
+
setSourceEnabled(source, enabled) {
|
|
471
|
+
this.enabled[source] = enabled;
|
|
472
|
+
if (source !== 'gamepad')
|
|
473
|
+
return;
|
|
474
|
+
if (enabled) {
|
|
475
|
+
this.startPolling();
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
this.padViews.length = 0;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Sample the pads now.
|
|
482
|
+
*
|
|
483
|
+
* **Called once an animation frame by this source's own loop unless `autoPoll` is false**, and
|
|
484
|
+
* public so a consumer can pin the sample to its own fixed tick instead — which is what a
|
|
485
|
+
* recorded replay needs, since a sample taken on a frame callback is not reproducible.
|
|
486
|
+
*
|
|
487
|
+
* **`getGamepads()` allocates**, an array and the objects behind it, and that cost is the
|
|
488
|
+
* browser's rather than something this engine can pool. So it is called exactly once here and
|
|
489
|
+
* never from a read: every accessor on a view is a lookup on numbers already copied out. A frame
|
|
490
|
+
* that runs three simulation ticks polls once, which is also the correct semantics — the
|
|
491
|
+
* hardware cannot have changed between two ticks of one frame.
|
|
492
|
+
*/
|
|
493
|
+
poll() {
|
|
494
|
+
/*
|
|
495
|
+
* The keyboard's frame boundary, and it happens whether or not there are pads.
|
|
496
|
+
*
|
|
497
|
+
* Rotated rather than cleared: a key pressed *during* the frame that is about to end belongs
|
|
498
|
+
* to the next one, and clearing here would drop it on any consumer that presses and polls in
|
|
499
|
+
* the same task. The two sets are swapped so neither is allocated per frame.
|
|
500
|
+
*/
|
|
501
|
+
const spent = this.keysPressed;
|
|
502
|
+
this.keysPressed = this.keysPressedNext;
|
|
503
|
+
spent.clear();
|
|
504
|
+
this.keysPressedNext = spent;
|
|
505
|
+
this.keysClaimed.clear();
|
|
506
|
+
if (!this.enabled.gamepad)
|
|
507
|
+
return;
|
|
508
|
+
const source = globalThis
|
|
509
|
+
.navigator;
|
|
510
|
+
if (source === undefined || typeof source.getGamepads !== 'function')
|
|
511
|
+
return;
|
|
512
|
+
const raw = source.getGamepads();
|
|
513
|
+
let live = 0;
|
|
514
|
+
let used = false;
|
|
515
|
+
for (let i = 0; i < raw.length && live < MAX_PADS; i += 1) {
|
|
516
|
+
const pad = raw[i];
|
|
517
|
+
if (pad === null || pad === undefined)
|
|
518
|
+
continue;
|
|
519
|
+
const state = this.padStates[live];
|
|
520
|
+
if (state === undefined)
|
|
521
|
+
continue;
|
|
522
|
+
const anyDown = state.sync(pad);
|
|
523
|
+
this.refuseIfUnvouched(state);
|
|
524
|
+
if (anyDown || state.moved(this.deadzone))
|
|
525
|
+
used = true;
|
|
526
|
+
this.padViews[live] = state;
|
|
527
|
+
live += 1;
|
|
528
|
+
}
|
|
529
|
+
this.padViews.length = live;
|
|
530
|
+
if (used)
|
|
531
|
+
this.active.use('gamepad');
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Say once, per device, that a pad's layout is not one the browser will vouch for.
|
|
535
|
+
*
|
|
536
|
+
* **Served rather than refused**, so a consumer that knows the device can still reach it by
|
|
537
|
+
* index — but said out loud, because silence would leave a player whose arcade stick does
|
|
538
|
+
* nothing with no way to discover why, which is the silent no-op the house rules forbid. Once
|
|
539
|
+
* per device rather than once per frame, exactly as `registerCompute` refuses: a line every
|
|
540
|
+
* frame floods a console somebody needs to read.
|
|
541
|
+
*/
|
|
542
|
+
refuseIfUnvouched(state) {
|
|
543
|
+
if (state.mapping !== 'unknown' || this.refusedPads.has(state.id))
|
|
544
|
+
return;
|
|
545
|
+
this.refusedPads.add(state.id);
|
|
546
|
+
console.warn(`[driftengine] the browser will not vouch for this pad's layout: ${JSON.stringify(state.id)}. ` +
|
|
547
|
+
'Its named buttons read the standard positions and may be wrong; read `mapping` and reach ' +
|
|
548
|
+
'it with `button(index)` and `rawAxis(index)`.');
|
|
549
|
+
}
|
|
550
|
+
startPolling() {
|
|
551
|
+
/*
|
|
552
|
+
* Not gated on the gamepad source, and that changed in 2.13.0. The poll advances the *input*
|
|
553
|
+
* frame — it rotates the keyboard's edges as well as sampling pads — so a consumer that
|
|
554
|
+
* switched controllers off would otherwise find `keyPressed` never clearing. What the gamepad
|
|
555
|
+
* switch still turns off is the expensive half: `getGamepads`, which allocates, is not called
|
|
556
|
+
* at all.
|
|
557
|
+
*/
|
|
558
|
+
if (this.frameHandle !== 0 || !this.autoPoll)
|
|
559
|
+
return;
|
|
560
|
+
const frames = globalThis
|
|
561
|
+
.requestAnimationFrame;
|
|
562
|
+
if (typeof frames !== 'function')
|
|
563
|
+
return;
|
|
564
|
+
/* Built once rather than per frame: a closure created every frame is the allocation the house
|
|
565
|
+
rule about hot paths is about. */
|
|
566
|
+
const tick = () => {
|
|
567
|
+
this.frameHandle = frames(tick);
|
|
568
|
+
this.poll();
|
|
569
|
+
};
|
|
570
|
+
this.frameHandle = frames(tick);
|
|
571
|
+
}
|
|
572
|
+
stopPolling() {
|
|
573
|
+
if (this.frameHandle === 0)
|
|
574
|
+
return;
|
|
575
|
+
const cancel = globalThis
|
|
576
|
+
.cancelAnimationFrame;
|
|
577
|
+
if (typeof cancel === 'function')
|
|
578
|
+
cancel(this.frameHandle);
|
|
579
|
+
this.frameHandle = 0;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Whether a key went down since the last poll. Readable by anything, cleared at the next poll.
|
|
583
|
+
*
|
|
584
|
+
* The keyboard's half of the pair `GamepadView.pressed` documents: use this to draw, and
|
|
585
|
+
* `consumeKeyPress` to act, so a slow frame running the fixed-step loop twice cannot act twice.
|
|
586
|
+
*/
|
|
587
|
+
keyPressed(code) {
|
|
588
|
+
return this.keysPressed.has(code) && !this.keysClaimed.has(code);
|
|
589
|
+
}
|
|
590
|
+
/** The same edge, claimed: true for exactly one caller, then gone for everybody. */
|
|
591
|
+
consumeKeyPress(code) {
|
|
592
|
+
if (!this.keysUnclaimed.delete(code))
|
|
593
|
+
return false;
|
|
594
|
+
/* So the readable edge agrees within the frame that produced it: something drawing this key as
|
|
595
|
+
freshly pressed must stop the moment somebody acts on it. */
|
|
596
|
+
this.keysClaimed.add(code);
|
|
597
|
+
return true;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Add a device-event subscriber. Multiple reusable control layers may listen
|
|
601
|
+
* without overwriting one another; interpretation still happens outside the
|
|
602
|
+
* raw source. Subscription and removal are initialization-time operations.
|
|
603
|
+
*/
|
|
604
|
+
subscribe(callbacks) {
|
|
605
|
+
this.subscribers.push(callbacks);
|
|
606
|
+
let subscribed = true;
|
|
607
|
+
return () => {
|
|
608
|
+
if (!subscribed)
|
|
609
|
+
return;
|
|
610
|
+
subscribed = false;
|
|
611
|
+
const index = this.subscribers.indexOf(callbacks);
|
|
612
|
+
if (index >= 0)
|
|
613
|
+
this.subscribers.splice(index, 1);
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
/** Drain accumulated relative mouse motion into `out` (allocation-free). */
|
|
617
|
+
consumeMouseDelta(out) {
|
|
618
|
+
out.dx = this.mouseDx;
|
|
619
|
+
out.dy = this.mouseDy;
|
|
620
|
+
this.mouseDx = 0;
|
|
621
|
+
this.mouseDy = 0;
|
|
622
|
+
}
|
|
623
|
+
get hasPointerLock() {
|
|
624
|
+
return document.pointerLockElement === this.target;
|
|
625
|
+
}
|
|
626
|
+
requestPointerLock() {
|
|
627
|
+
if (!this.isCoarse && !this.hasPointerLock) {
|
|
628
|
+
/*
|
|
629
|
+
* **The options are forwarded, and this line is where they were lost.**
|
|
630
|
+
*
|
|
631
|
+
* It was `() => this.target.requestPointerLock()`, a lambda taking no parameters, so the
|
|
632
|
+
* `{ unadjustedMovement: true }` that `askForPointerLock` builds was passed to it and
|
|
633
|
+
* dropped. Every browser was asked plainly, the fallback had nothing to fall back from, and
|
|
634
|
+
* the camera kept the desktop's acceleration curve for as long as the feature had shipped —
|
|
635
|
+
* reported twice from Firefox and from two separate consumers, which is what said it was the
|
|
636
|
+
* engine rather than one application's wiring. `input.test.ts` covered the helper and not
|
|
637
|
+
* this call, which is why three green tests sat on top of it.
|
|
638
|
+
*/
|
|
639
|
+
askForPointerLock((options) => this.target.requestPointerLock(options));
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
dispose() {
|
|
643
|
+
this.stopPolling();
|
|
644
|
+
this.padViews.length = 0;
|
|
645
|
+
for (const dispose of this.disposers)
|
|
646
|
+
dispose();
|
|
647
|
+
this.disposers.length = 0;
|
|
648
|
+
this.subscribers.length = 0;
|
|
649
|
+
this.keys.clear();
|
|
650
|
+
this.touches.clear();
|
|
651
|
+
}
|
|
652
|
+
onTouches(e, phase) {
|
|
653
|
+
if (!this.enabled.touch)
|
|
654
|
+
return;
|
|
655
|
+
e.preventDefault();
|
|
656
|
+
if (phase === 'start')
|
|
657
|
+
this.active.use('touch');
|
|
658
|
+
const now = performance.now();
|
|
659
|
+
for (let i = 0; i < e.changedTouches.length; i++) {
|
|
660
|
+
const t = e.changedTouches[i];
|
|
661
|
+
if (t === undefined)
|
|
662
|
+
continue;
|
|
663
|
+
if (phase === 'start') {
|
|
664
|
+
const point = {
|
|
665
|
+
id: t.identifier,
|
|
666
|
+
x: t.clientX,
|
|
667
|
+
y: t.clientY,
|
|
668
|
+
startX: t.clientX,
|
|
669
|
+
startY: t.clientY,
|
|
670
|
+
startTime: now,
|
|
671
|
+
};
|
|
672
|
+
this.touches.set(t.identifier, point);
|
|
673
|
+
for (let subscriber = 0; subscriber < this.subscribers.length; subscriber++) {
|
|
674
|
+
this.subscribers[subscriber]?.onTouchStart?.(point);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
else {
|
|
678
|
+
const point = this.touches.get(t.identifier);
|
|
679
|
+
if (point === undefined)
|
|
680
|
+
continue;
|
|
681
|
+
point.x = t.clientX;
|
|
682
|
+
point.y = t.clientY;
|
|
683
|
+
if (phase === 'move') {
|
|
684
|
+
for (let subscriber = 0; subscriber < this.subscribers.length; subscriber++) {
|
|
685
|
+
this.subscribers[subscriber]?.onTouchMove?.(point);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
this.touches.delete(t.identifier);
|
|
690
|
+
const durationMs = now - point.startTime;
|
|
691
|
+
for (let subscriber = 0; subscriber < this.subscribers.length; subscriber++) {
|
|
692
|
+
this.subscribers[subscriber]?.onTouchEnd?.(point, durationMs);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
listen(target, type, handler, passive) {
|
|
699
|
+
const options = passive === undefined ? undefined : { passive };
|
|
700
|
+
target.addEventListener(type, handler, options);
|
|
701
|
+
this.disposers.push(() => target.removeEventListener(type, handler));
|
|
702
|
+
}
|
|
703
|
+
}
|