@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,314 @@
|
|
|
1
|
+
function isAnalog(definition) {
|
|
2
|
+
return 'stick' in definition;
|
|
3
|
+
}
|
|
4
|
+
/** Scratch, at module scope because `vector` is a per-frame read. */
|
|
5
|
+
const stickVector = { x: 0, y: 0 };
|
|
6
|
+
const keyVector = { x: 0, y: 0 };
|
|
7
|
+
export class ActionMap {
|
|
8
|
+
input;
|
|
9
|
+
definitions;
|
|
10
|
+
/** The current bindings per digital action, which rebinding and loading replace. */
|
|
11
|
+
bindings = new Map();
|
|
12
|
+
defaults = new Map();
|
|
13
|
+
warnedAboutRecord = false;
|
|
14
|
+
constructor(input, definitions) {
|
|
15
|
+
this.input = input;
|
|
16
|
+
this.definitions = definitions;
|
|
17
|
+
for (const [name, definition] of Object.entries(definitions)) {
|
|
18
|
+
if (isAnalog(definition))
|
|
19
|
+
continue;
|
|
20
|
+
const initial = bindingsOf(definition);
|
|
21
|
+
this.defaults.set(name, initial);
|
|
22
|
+
this.bindings.set(name, [...initial]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Whether anything bound to this action is held. */
|
|
26
|
+
down(action) {
|
|
27
|
+
return this.any(action, (binding) => binding.device === 'keyboard'
|
|
28
|
+
? this.input.isDown(binding.code)
|
|
29
|
+
: (this.input.pad(0)?.down(binding.button) ?? false));
|
|
30
|
+
}
|
|
31
|
+
/** Whether anything bound to it went down since the last poll. Readable by anything. */
|
|
32
|
+
pressed(action) {
|
|
33
|
+
return this.any(action, (binding) => binding.device === 'keyboard'
|
|
34
|
+
? this.input.keyPressed(binding.code)
|
|
35
|
+
: (this.input.pad(0)?.pressed(binding.button) ?? false));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The same edge, claimed: true for exactly one caller.
|
|
39
|
+
*
|
|
40
|
+
* **Claims through the device rather than keeping its own set**, so a claim made here is also
|
|
41
|
+
* gone from `input.keyPressed` and from the pad's own `pressed`. Two claim registers over one
|
|
42
|
+
* physical press is how a press gets acted on twice.
|
|
43
|
+
*/
|
|
44
|
+
consumePress(action) {
|
|
45
|
+
const bindings = this.bindings.get(action);
|
|
46
|
+
if (bindings === undefined)
|
|
47
|
+
return false;
|
|
48
|
+
for (const binding of bindings) {
|
|
49
|
+
if (binding.device === 'keyboard') {
|
|
50
|
+
if (this.input.consumeKeyPress(binding.code))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
else if (this.input.pad(0)?.consumePress(binding.button) === true) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fill `out` with an analog action's direction.
|
|
61
|
+
*
|
|
62
|
+
* **The larger of stick and keys, never the sum.** A player holding a key while pushing the
|
|
63
|
+
* stick the same way is asking to go that way, once; adding the contributions would send them at
|
|
64
|
+
* twice the speed, which is the bug a naive merge ships with. What it costs: the two cannot be
|
|
65
|
+
* combined to exceed the rim, which is the intent. What would make it wrong: an action where two
|
|
66
|
+
* devices genuinely should add, and nothing has asked for one.
|
|
67
|
+
*
|
|
68
|
+
* **This is the reader for a direction.** If the two axes are two separate controls — throttle
|
|
69
|
+
* and steering, pitch and roll — read them one at a time with `axis`, which does not normalise
|
|
70
|
+
* them against each other. See its note for what the joint normalisation cost one consumer.
|
|
71
|
+
*/
|
|
72
|
+
vector(action, out) {
|
|
73
|
+
out.x = 0;
|
|
74
|
+
out.y = 0;
|
|
75
|
+
if (!this.sample(action))
|
|
76
|
+
return;
|
|
77
|
+
/* Normalised, so a diagonal on the keyboard is not faster than a straight line. This is the
|
|
78
|
+
one line `axis` does not run, and the whole difference between the two readers. */
|
|
79
|
+
const keyLength = Math.hypot(keyVector.x, keyVector.y);
|
|
80
|
+
if (keyLength > 1) {
|
|
81
|
+
keyVector.x /= keyLength;
|
|
82
|
+
keyVector.y /= keyLength;
|
|
83
|
+
}
|
|
84
|
+
const useStick = Math.hypot(stickVector.x, stickVector.y) >= Math.min(keyLength, 1);
|
|
85
|
+
out.x = useStick ? stickVector.x : keyVector.x;
|
|
86
|
+
out.y = useStick ? stickVector.y : keyVector.y;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* One axis of an analog action, on its own, **not normalised against the other**.
|
|
90
|
+
*
|
|
91
|
+
* **`vector` is right for a direction and wrong for two controls**, and the difference is not
|
|
92
|
+
* cosmetic. On foot the two axes are one direction, so a keyboard diagonal must be shortened to
|
|
93
|
+
* the rim or the player walks faster askew than straight ahead — that is what `vector` is for and
|
|
94
|
+
* it should stay the default. At a wheel the same two axes are throttle and steering, which are
|
|
95
|
+
* two separate controls that happen to share an action: normalising them together means a driver
|
|
96
|
+
* holding forward and left gets 0.707 of each and **can never reach full lock while accelerating**.
|
|
97
|
+
*
|
|
98
|
+
* A consumer lost two weeks to this. The report was "the car does not turn and it is slow", the
|
|
99
|
+
* whole vehicle model was rewritten looking for it, and it was not in the vehicle model — it was
|
|
100
|
+
* `Math.hypot` three call frames away, doing exactly what it was written to do. They shipped four
|
|
101
|
+
* duplicate digital actions bound to the same keys to get around it.
|
|
102
|
+
*
|
|
103
|
+
* The pad is unchanged either way: a stick already gives its two axes independently, so a caller
|
|
104
|
+
* driving with one reads the same numbers from both methods. The keyboard is where they part.
|
|
105
|
+
*/
|
|
106
|
+
axis(action, axis) {
|
|
107
|
+
if (!this.sample(action))
|
|
108
|
+
return 0;
|
|
109
|
+
const useStick = Math.hypot(stickVector.x, stickVector.y) >= Math.min(Math.hypot(keyVector.x, keyVector.y), 1);
|
|
110
|
+
const from = useStick ? stickVector : keyVector;
|
|
111
|
+
return axis === 'x' ? from.x : from.y;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fill the two scratch vectors for an analog action, and say whether there was one.
|
|
115
|
+
*
|
|
116
|
+
* Shared so that `vector` and `axis` cannot disagree about which device is being read or how a
|
|
117
|
+
* key becomes a number — the device choice in particular is subtle enough that two copies of it
|
|
118
|
+
* would drift.
|
|
119
|
+
*/
|
|
120
|
+
sample(action) {
|
|
121
|
+
const definition = this.definitions[action];
|
|
122
|
+
if (definition === undefined || !isAnalog(definition))
|
|
123
|
+
return false;
|
|
124
|
+
const pad = this.input.pad(0);
|
|
125
|
+
stickVector.x = pad === null ? 0 : pad.axis(definition.stick === 'left' ? 'leftX' : 'rightX');
|
|
126
|
+
stickVector.y = pad === null ? 0 : pad.axis(definition.stick === 'left' ? 'leftY' : 'rightY');
|
|
127
|
+
keyVector.x = 0;
|
|
128
|
+
keyVector.y = 0;
|
|
129
|
+
if (this.anyDown(definition.left))
|
|
130
|
+
keyVector.x -= 1;
|
|
131
|
+
if (this.anyDown(definition.right))
|
|
132
|
+
keyVector.x += 1;
|
|
133
|
+
if (this.anyDown(definition.up))
|
|
134
|
+
keyVector.y -= 1;
|
|
135
|
+
if (this.anyDown(definition.down))
|
|
136
|
+
keyVector.y += 1;
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Whether the pad these actions read has motors this browser can drive.
|
|
141
|
+
*
|
|
142
|
+
* **Pad 0, which is the pad every other member of this class already reads.** An action map is
|
|
143
|
+
* one player's controls, so "the pad the actions come from" is the device a rumble belongs on;
|
|
144
|
+
* a consumer running local multiplayer reaches `InputSource.pad(n).rumble` directly.
|
|
145
|
+
*
|
|
146
|
+
* Grey the control out when this is false. It is re-read rather than cached, because a pad
|
|
147
|
+
* unplugged and plugged back in is a different device behind the same slot.
|
|
148
|
+
*/
|
|
149
|
+
get canRumble() {
|
|
150
|
+
return this.input.pad(0)?.canRumble ?? false;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Rumble that pad for `durationMs`, at two magnitudes in [0, 1]. Answers whether it was taken.
|
|
154
|
+
*
|
|
155
|
+
* `false` where there is no pad, no actuator, or nothing to play. Never throws.
|
|
156
|
+
*/
|
|
157
|
+
rumble(durationMs, strong, weak) {
|
|
158
|
+
return this.input.pad(0)?.rumble(durationMs, strong, weak) ?? false;
|
|
159
|
+
}
|
|
160
|
+
/** Stop whatever that pad is playing. Answers whether the platform took it. */
|
|
161
|
+
stopRumble() {
|
|
162
|
+
return this.input.pad(0)?.stopRumble() ?? false;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Whether any of a direction's codes is held.
|
|
166
|
+
*
|
|
167
|
+
* Allocation-free for both shapes: a single code is compared without wrapping it in an array,
|
|
168
|
+
* and an array is walked by index. `vector` runs once a tick.
|
|
169
|
+
*/
|
|
170
|
+
anyDown(codes) {
|
|
171
|
+
if (codes === undefined)
|
|
172
|
+
return false;
|
|
173
|
+
if (typeof codes === 'string')
|
|
174
|
+
return this.input.isDown(codes);
|
|
175
|
+
for (let i = 0; i < codes.length; i++) {
|
|
176
|
+
const code = codes[i];
|
|
177
|
+
if (code !== undefined && this.input.isDown(code))
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
/** What currently satisfies an action. */
|
|
183
|
+
bindingsFor(action) {
|
|
184
|
+
return this.bindings.get(action) ?? [];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Give an action a binding, and say which actions lost it.
|
|
188
|
+
*
|
|
189
|
+
* **Reports rather than decides.** A binding already serving another action is the interesting
|
|
190
|
+
* case in every rebinding screen there has ever been, and what to do about it is a product
|
|
191
|
+
* decision: steal it silently, warn, or refuse. A consumer that wants uniqueness enforced reads
|
|
192
|
+
* the return and rebinds back.
|
|
193
|
+
*/
|
|
194
|
+
rebind(action, binding) {
|
|
195
|
+
const displaced = [];
|
|
196
|
+
for (const [name, list] of this.bindings) {
|
|
197
|
+
if (name === action)
|
|
198
|
+
continue;
|
|
199
|
+
const at = list.findIndex((held) => sameBinding(held, binding));
|
|
200
|
+
if (at < 0)
|
|
201
|
+
continue;
|
|
202
|
+
list.splice(at, 1);
|
|
203
|
+
displaced.push(name);
|
|
204
|
+
}
|
|
205
|
+
const own = this.bindings.get(action);
|
|
206
|
+
if (own === undefined)
|
|
207
|
+
return displaced;
|
|
208
|
+
if (!own.some((held) => sameBinding(held, binding)))
|
|
209
|
+
own.push(binding);
|
|
210
|
+
return displaced;
|
|
211
|
+
}
|
|
212
|
+
/** Put one action, or every action, back to what the game shipped with. */
|
|
213
|
+
resetToDefaults(action) {
|
|
214
|
+
for (const [name, initial] of this.defaults) {
|
|
215
|
+
if (action !== undefined && name !== action)
|
|
216
|
+
continue;
|
|
217
|
+
this.bindings.set(name, [...initial]);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Write the bindings a player has actually changed, and nothing else.
|
|
222
|
+
*
|
|
223
|
+
* **A diff rather than a snapshot, and this is the load-bearing decision.** A snapshot freezes
|
|
224
|
+
* the map at the version that saved it: a game that later adds an action, or changes a default
|
|
225
|
+
* nobody had rebound, finds every returning player still on the old set with no way to tell a
|
|
226
|
+
* deliberate choice from a stale record. A diff means an untouched action always follows the
|
|
227
|
+
* current default and only real choices survive an update.
|
|
228
|
+
*
|
|
229
|
+
* Through `KeyValueStore` because the engine calls no platform API a consumer might want to
|
|
230
|
+
* supply differently — the rule that put saves behind this seam.
|
|
231
|
+
*/
|
|
232
|
+
save(store, key) {
|
|
233
|
+
const changed = {};
|
|
234
|
+
for (const [name, list] of this.bindings) {
|
|
235
|
+
const initial = this.defaults.get(name) ?? [];
|
|
236
|
+
if (sameList(list, initial))
|
|
237
|
+
continue;
|
|
238
|
+
changed[name] = list;
|
|
239
|
+
}
|
|
240
|
+
store.write(key, JSON.stringify(changed));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Apply a stored record over the defaults.
|
|
244
|
+
*
|
|
245
|
+
* **An unreadable record is the defaults, reported once.** A player whose stored bindings cannot
|
|
246
|
+
* be parsed should get a working game rather than a broken one, and should not have that decided
|
|
247
|
+
* silently — the same shape as every other refusal in this engine.
|
|
248
|
+
*/
|
|
249
|
+
load(store, key) {
|
|
250
|
+
const raw = store.read(key);
|
|
251
|
+
if (raw === null)
|
|
252
|
+
return;
|
|
253
|
+
let parsed = null;
|
|
254
|
+
try {
|
|
255
|
+
parsed = JSON.parse(raw);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
parsed = null;
|
|
259
|
+
}
|
|
260
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
261
|
+
if (!this.warnedAboutRecord) {
|
|
262
|
+
this.warnedAboutRecord = true;
|
|
263
|
+
console.warn(`[driftengine] the stored input bindings at ${JSON.stringify(key)} could not be read; ` +
|
|
264
|
+
'the defaults are in force. Save again to replace the record.');
|
|
265
|
+
}
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
for (const [name, list] of Object.entries(parsed)) {
|
|
269
|
+
/* An action the record knows and this build does not is dropped rather than kept: it is a
|
|
270
|
+
binding for a verb that no longer exists, and holding it would resurrect it on a
|
|
271
|
+
downgrade. An action this build has and the record does not keeps its default, which is
|
|
272
|
+
the whole reason this is a diff. */
|
|
273
|
+
if (!this.bindings.has(name) || !Array.isArray(list))
|
|
274
|
+
continue;
|
|
275
|
+
this.bindings.set(name, list.filter(isBinding));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
any(action, holds) {
|
|
279
|
+
const bindings = this.bindings.get(action);
|
|
280
|
+
if (bindings === undefined)
|
|
281
|
+
return false;
|
|
282
|
+
for (const binding of bindings)
|
|
283
|
+
if (holds(binding))
|
|
284
|
+
return true;
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function bindingsOf(definition) {
|
|
289
|
+
const list = [];
|
|
290
|
+
for (const code of definition.keys ?? [])
|
|
291
|
+
list.push({ device: 'keyboard', code });
|
|
292
|
+
for (const button of definition.buttons ?? [])
|
|
293
|
+
list.push({ device: 'gamepad', button });
|
|
294
|
+
return list;
|
|
295
|
+
}
|
|
296
|
+
function sameBinding(a, b) {
|
|
297
|
+
if (a.device !== b.device)
|
|
298
|
+
return false;
|
|
299
|
+
return a.device === 'keyboard' && b.device === 'keyboard'
|
|
300
|
+
? a.code === b.code
|
|
301
|
+
: a.device === 'gamepad' && b.device === 'gamepad' && a.button === b.button;
|
|
302
|
+
}
|
|
303
|
+
function sameList(a, b) {
|
|
304
|
+
return a.length === b.length && a.every((entry, at) => sameBinding(entry, b[at]));
|
|
305
|
+
}
|
|
306
|
+
/** A stored entry is data from disk, so it is checked rather than trusted. */
|
|
307
|
+
function isBinding(value) {
|
|
308
|
+
if (typeof value !== 'object' || value === null)
|
|
309
|
+
return false;
|
|
310
|
+
const candidate = value;
|
|
311
|
+
if (candidate.device === 'keyboard')
|
|
312
|
+
return typeof candidate.code === 'string';
|
|
313
|
+
return candidate.device === 'gamepad' && typeof candidate.button === 'string';
|
|
314
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which device the player is actually using, so a consumer can redraw its prompts.
|
|
3
|
+
*
|
|
4
|
+
* **The rule is use, never presence**, and that single word is most of the design. A controller
|
|
5
|
+
* plugged in for something else, or left on a desk, must not change every prompt on screen while
|
|
6
|
+
* the player is still on the keyboard — which is the bug this kind of feature usually ships with.
|
|
7
|
+
* The browser helps: it does not report a gamepad at all until a button has been pressed on it.
|
|
8
|
+
* This closes the rest.
|
|
9
|
+
*/
|
|
10
|
+
export type InputDevice = 'keyboard' | 'mouse' | 'touch' | 'gamepad';
|
|
11
|
+
/**
|
|
12
|
+
* How far a cursor must travel, in pixels, before it counts as the player choosing the mouse.
|
|
13
|
+
*
|
|
14
|
+
* A tuning constant, so its value is not asserted anywhere — `AGENTS.md` forbids that, because a
|
|
15
|
+
* decision that will change every feel pass produces a test that fails on intent.
|
|
16
|
+
*/
|
|
17
|
+
export declare const MOUSE_MOVE_THRESHOLD_PX = 32;
|
|
18
|
+
export declare class ActiveDevice {
|
|
19
|
+
/**
|
|
20
|
+
* The keyboard to begin with.
|
|
21
|
+
*
|
|
22
|
+
* Something has to be answered before anything has been touched, and a prompt is more often
|
|
23
|
+
* wanted on a desktop than not. It is corrected by the first real input either way, and no
|
|
24
|
+
* device is *reported* as connected by this — only as used.
|
|
25
|
+
*/
|
|
26
|
+
private device;
|
|
27
|
+
/**
|
|
28
|
+
* Travel accumulated since a device other than the mouse was last used.
|
|
29
|
+
*
|
|
30
|
+
* **A threshold rather than a flip on the first event, and the mouse alone needs one.** A
|
|
31
|
+
* keydown and a touchstart are intentional; a mousemove is not necessarily anything at all — an
|
|
32
|
+
* unlocked cursor drifts, a desk gets bumped, and a window manager can deliver motion nobody
|
|
33
|
+
* caused. Accumulating rather than testing one delta means a slow deliberate movement counts
|
|
34
|
+
* while a single stray pixel does not.
|
|
35
|
+
*
|
|
36
|
+
* **What it costs:** a drift of a pixel at a time does eventually cross it, in about thirty
|
|
37
|
+
* moves. **What would make it wrong:** a pointing device whose ordinary use produces less travel
|
|
38
|
+
* than this — a trackpoint or an eye tracker — where the answer is a smaller threshold rather
|
|
39
|
+
* than none.
|
|
40
|
+
*/
|
|
41
|
+
private travel;
|
|
42
|
+
private readonly listeners;
|
|
43
|
+
get last(): InputDevice;
|
|
44
|
+
/** Record that a device was used. Notifies only on a change. */
|
|
45
|
+
use(device: InputDevice): void;
|
|
46
|
+
/** Offer pointer movement. Becomes a use of the mouse once it adds up to a decision. */
|
|
47
|
+
moved(dx: number, dy: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Hear about changes. Returns the unsubscribe, which is the shape `InputSource.subscribe` uses.
|
|
50
|
+
*
|
|
51
|
+
* Fires only on a change, so a consumer that redraws its prompts here redraws them once rather
|
|
52
|
+
* than every frame a button is held.
|
|
53
|
+
*/
|
|
54
|
+
subscribe(listener: (device: InputDevice) => void): () => void;
|
|
55
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which device the player is actually using, so a consumer can redraw its prompts.
|
|
3
|
+
*
|
|
4
|
+
* **The rule is use, never presence**, and that single word is most of the design. A controller
|
|
5
|
+
* plugged in for something else, or left on a desk, must not change every prompt on screen while
|
|
6
|
+
* the player is still on the keyboard — which is the bug this kind of feature usually ships with.
|
|
7
|
+
* The browser helps: it does not report a gamepad at all until a button has been pressed on it.
|
|
8
|
+
* This closes the rest.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* How far a cursor must travel, in pixels, before it counts as the player choosing the mouse.
|
|
12
|
+
*
|
|
13
|
+
* A tuning constant, so its value is not asserted anywhere — `AGENTS.md` forbids that, because a
|
|
14
|
+
* decision that will change every feel pass produces a test that fails on intent.
|
|
15
|
+
*/
|
|
16
|
+
export const MOUSE_MOVE_THRESHOLD_PX = 32;
|
|
17
|
+
export class ActiveDevice {
|
|
18
|
+
/**
|
|
19
|
+
* The keyboard to begin with.
|
|
20
|
+
*
|
|
21
|
+
* Something has to be answered before anything has been touched, and a prompt is more often
|
|
22
|
+
* wanted on a desktop than not. It is corrected by the first real input either way, and no
|
|
23
|
+
* device is *reported* as connected by this — only as used.
|
|
24
|
+
*/
|
|
25
|
+
device = 'keyboard';
|
|
26
|
+
/**
|
|
27
|
+
* Travel accumulated since a device other than the mouse was last used.
|
|
28
|
+
*
|
|
29
|
+
* **A threshold rather than a flip on the first event, and the mouse alone needs one.** A
|
|
30
|
+
* keydown and a touchstart are intentional; a mousemove is not necessarily anything at all — an
|
|
31
|
+
* unlocked cursor drifts, a desk gets bumped, and a window manager can deliver motion nobody
|
|
32
|
+
* caused. Accumulating rather than testing one delta means a slow deliberate movement counts
|
|
33
|
+
* while a single stray pixel does not.
|
|
34
|
+
*
|
|
35
|
+
* **What it costs:** a drift of a pixel at a time does eventually cross it, in about thirty
|
|
36
|
+
* moves. **What would make it wrong:** a pointing device whose ordinary use produces less travel
|
|
37
|
+
* than this — a trackpoint or an eye tracker — where the answer is a smaller threshold rather
|
|
38
|
+
* than none.
|
|
39
|
+
*/
|
|
40
|
+
travel = 0;
|
|
41
|
+
listeners = [];
|
|
42
|
+
get last() {
|
|
43
|
+
return this.device;
|
|
44
|
+
}
|
|
45
|
+
/** Record that a device was used. Notifies only on a change. */
|
|
46
|
+
use(device) {
|
|
47
|
+
if (device !== 'mouse')
|
|
48
|
+
this.travel = 0;
|
|
49
|
+
if (device === this.device)
|
|
50
|
+
return;
|
|
51
|
+
this.device = device;
|
|
52
|
+
/* Indexed rather than iterated: this can fire from a frame callback, and the house rule about
|
|
53
|
+
allocation in a per-frame path binds it. */
|
|
54
|
+
for (let i = 0; i < this.listeners.length; i += 1)
|
|
55
|
+
this.listeners[i]?.(device);
|
|
56
|
+
}
|
|
57
|
+
/** Offer pointer movement. Becomes a use of the mouse once it adds up to a decision. */
|
|
58
|
+
moved(dx, dy) {
|
|
59
|
+
if (this.device === 'mouse')
|
|
60
|
+
return;
|
|
61
|
+
this.travel += Math.hypot(dx, dy);
|
|
62
|
+
if (this.travel >= MOUSE_MOVE_THRESHOLD_PX)
|
|
63
|
+
this.use('mouse');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Hear about changes. Returns the unsubscribe, which is the shape `InputSource.subscribe` uses.
|
|
67
|
+
*
|
|
68
|
+
* Fires only on a change, so a consumer that redraws its prompts here redraws them once rather
|
|
69
|
+
* than every frame a button is held.
|
|
70
|
+
*/
|
|
71
|
+
subscribe(listener) {
|
|
72
|
+
this.listeners.push(listener);
|
|
73
|
+
let subscribed = true;
|
|
74
|
+
return () => {
|
|
75
|
+
if (!subscribed)
|
|
76
|
+
return;
|
|
77
|
+
subscribed = false;
|
|
78
|
+
const index = this.listeners.indexOf(listener);
|
|
79
|
+
if (index >= 0)
|
|
80
|
+
this.listeners.splice(index, 1);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type GamepadButton } from './gamepadMapping.ts';
|
|
2
|
+
/**
|
|
3
|
+
* What the pad in the player's hands calls a position, so a consumer can draw the right prompt.
|
|
4
|
+
*
|
|
5
|
+
* **The engine ships no art and never will.** A glyph key is an identifier a consumer maps to its
|
|
6
|
+
* own icon set or font. It exists so that several consumers do not each write the same table, and
|
|
7
|
+
* so the mapping from *hardware* to *name* lives beside the hardware knowledge rather than inside
|
|
8
|
+
* somebody's heads-up display.
|
|
9
|
+
*
|
|
10
|
+
* **Four families, and no device database.** A table of individual controllers is a maintenance
|
|
11
|
+
* obligation that grows with the hardware market and rots silently — and a rotted entry shows a
|
|
12
|
+
* wrong glyph to a player while no test can see it. Four families cover the pads a browser will
|
|
13
|
+
* vouch for; everything else is `generic` and correct rather than guessed.
|
|
14
|
+
*
|
|
15
|
+
* **What would make this wrong:** a family whose members disagree about their own lettering, which
|
|
16
|
+
* would make the family the wrong unit to key on. None of these four do.
|
|
17
|
+
*/
|
|
18
|
+
export type GamepadFamily = 'xbox' | 'playstation' | 'nintendo' | 'generic';
|
|
19
|
+
/**
|
|
20
|
+
* Read the family out of the `id` string, in either shape a browser writes it.
|
|
21
|
+
*
|
|
22
|
+
* Chromium writes `Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 09cc)`; Firefox
|
|
23
|
+
* writes `054c-09cc-Wireless Controller`. Both are matched, because a parser that knew only one
|
|
24
|
+
* would answer `generic` for every pad in the other browser — which is a wrong prompt on screen
|
|
25
|
+
* with nothing anywhere reporting it, the failure this repository's rules about silent plausible
|
|
26
|
+
* answers exist for.
|
|
27
|
+
*/
|
|
28
|
+
export declare function identifyGamepad(id: string): GamepadFamily;
|
|
29
|
+
/**
|
|
30
|
+
* What this pad calls that position.
|
|
31
|
+
*
|
|
32
|
+
* A generic pad answers its position — `Face Down` is a poor prompt and it is not a *wrong* one,
|
|
33
|
+
* which is the trade this design takes over inventing a lettering for hardware it cannot identify.
|
|
34
|
+
*/
|
|
35
|
+
export declare function labelFor(family: GamepadFamily, button: GamepadButton): string;
|
|
36
|
+
/**
|
|
37
|
+
* A stable key for a consumer's own icon set: `xbox.a`, `playstation.cross`, `nintendo.b`.
|
|
38
|
+
*
|
|
39
|
+
* Stable is the load-bearing word. A consumer builds a lookup from these to its own art, so
|
|
40
|
+
* changing one silently breaks an icon in somebody else's repository — they are an interface, not
|
|
41
|
+
* a formatting choice.
|
|
42
|
+
*/
|
|
43
|
+
export declare function glyphFor(family: GamepadFamily, button: GamepadButton): string;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {} from './gamepadMapping.js';
|
|
2
|
+
/** Vendor identifiers, which are the same four hex digits in every browser that reports them. */
|
|
3
|
+
const VENDORS = {
|
|
4
|
+
'045e': 'xbox',
|
|
5
|
+
'054c': 'playstation',
|
|
6
|
+
'057e': 'nintendo',
|
|
7
|
+
};
|
|
8
|
+
/** For a pad that names itself but carries no vendor pair, which is most of what XInput reports. */
|
|
9
|
+
const NAMED = [
|
|
10
|
+
['xbox', 'xbox'],
|
|
11
|
+
['xinput', 'xbox'],
|
|
12
|
+
['dualsense', 'playstation'],
|
|
13
|
+
['dualshock', 'playstation'],
|
|
14
|
+
['playstation', 'playstation'],
|
|
15
|
+
['nintendo', 'nintendo'],
|
|
16
|
+
['switch pro', 'nintendo'],
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Read the family out of the `id` string, in either shape a browser writes it.
|
|
20
|
+
*
|
|
21
|
+
* Chromium writes `Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 09cc)`; Firefox
|
|
22
|
+
* writes `054c-09cc-Wireless Controller`. Both are matched, because a parser that knew only one
|
|
23
|
+
* would answer `generic` for every pad in the other browser — which is a wrong prompt on screen
|
|
24
|
+
* with nothing anywhere reporting it, the failure this repository's rules about silent plausible
|
|
25
|
+
* answers exist for.
|
|
26
|
+
*/
|
|
27
|
+
export function identifyGamepad(id) {
|
|
28
|
+
const lower = id.toLowerCase();
|
|
29
|
+
const vendor = /(?:^|vendor:\s*)([0-9a-f]{4})\b/.exec(lower);
|
|
30
|
+
const known = vendor === null ? undefined : VENDORS[vendor[1] ?? ''];
|
|
31
|
+
if (known !== undefined)
|
|
32
|
+
return known;
|
|
33
|
+
for (const [needle, family] of NAMED)
|
|
34
|
+
if (lower.includes(needle))
|
|
35
|
+
return family;
|
|
36
|
+
return 'generic';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The vendor's own token for a position, which is also the tail of its glyph key.
|
|
40
|
+
*
|
|
41
|
+
* Only the positions vendors actually name differently are listed. A shoulder is `L1` on every pad
|
|
42
|
+
* that has one printed, so it falls through to the positional label rather than being repeated
|
|
43
|
+
* three times.
|
|
44
|
+
*/
|
|
45
|
+
const TOKENS = {
|
|
46
|
+
xbox: {
|
|
47
|
+
faceDown: 'a',
|
|
48
|
+
faceRight: 'b',
|
|
49
|
+
faceLeft: 'x',
|
|
50
|
+
faceUp: 'y',
|
|
51
|
+
select: 'view',
|
|
52
|
+
start: 'menu',
|
|
53
|
+
},
|
|
54
|
+
playstation: {
|
|
55
|
+
faceDown: 'cross',
|
|
56
|
+
faceRight: 'circle',
|
|
57
|
+
faceLeft: 'square',
|
|
58
|
+
faceUp: 'triangle',
|
|
59
|
+
select: 'create',
|
|
60
|
+
start: 'options',
|
|
61
|
+
l1: 'l1',
|
|
62
|
+
r1: 'r1',
|
|
63
|
+
l2: 'l2',
|
|
64
|
+
r2: 'r2',
|
|
65
|
+
},
|
|
66
|
+
/* The swap: Nintendo's bottom button is B and its right button is A, the other way round from
|
|
67
|
+
every other pad here. This is the entire reason the engine names positions. */
|
|
68
|
+
nintendo: {
|
|
69
|
+
faceDown: 'b',
|
|
70
|
+
faceRight: 'a',
|
|
71
|
+
faceLeft: 'y',
|
|
72
|
+
faceUp: 'x',
|
|
73
|
+
select: 'minus',
|
|
74
|
+
start: 'plus',
|
|
75
|
+
},
|
|
76
|
+
generic: {},
|
|
77
|
+
};
|
|
78
|
+
/** `faceDown` to `Face Down`, `l1` to `L1` — true of any pad, and readable rather than cryptic. */
|
|
79
|
+
function positionalLabel(button) {
|
|
80
|
+
if (/^[lr][123]$/.test(button))
|
|
81
|
+
return button.toUpperCase();
|
|
82
|
+
const spaced = button.replace(/([A-Z])/g, ' $1');
|
|
83
|
+
return spaced.charAt(0).toUpperCase() + spaced.slice(1);
|
|
84
|
+
}
|
|
85
|
+
/** A vendor token to the label a player reads on the plastic: `cross` to `Cross`, `a` to `A`. */
|
|
86
|
+
function titled(token) {
|
|
87
|
+
return token.length <= 2 ? token.toUpperCase() : token.charAt(0).toUpperCase() + token.slice(1);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* What this pad calls that position.
|
|
91
|
+
*
|
|
92
|
+
* A generic pad answers its position — `Face Down` is a poor prompt and it is not a *wrong* one,
|
|
93
|
+
* which is the trade this design takes over inventing a lettering for hardware it cannot identify.
|
|
94
|
+
*/
|
|
95
|
+
export function labelFor(family, button) {
|
|
96
|
+
const token = TOKENS[family][button];
|
|
97
|
+
return token === undefined ? positionalLabel(button) : titled(token);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* A stable key for a consumer's own icon set: `xbox.a`, `playstation.cross`, `nintendo.b`.
|
|
101
|
+
*
|
|
102
|
+
* Stable is the load-bearing word. A consumer builds a lookup from these to its own art, so
|
|
103
|
+
* changing one silently breaks an icon in somebody else's repository — they are an interface, not
|
|
104
|
+
* a formatting choice.
|
|
105
|
+
*/
|
|
106
|
+
export function glyphFor(family, button) {
|
|
107
|
+
return `${family}.${TOKENS[family][button] ?? button}`;
|
|
108
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The W3C Standard Gamepad, by position rather than by anybody's lettering.
|
|
3
|
+
*
|
|
4
|
+
* **The names are positional and that is a correctness decision, not a style one.** Index 0 is the
|
|
5
|
+
* bottom button of the right cluster. It is labelled A on an Xbox pad, Cross on a PlayStation pad
|
|
6
|
+
* and **B** on a Nintendo pad, because Nintendo's physical layout swaps the two. Any lettering
|
|
7
|
+
* this file picked would therefore be a false statement about somebody's hardware. It names the
|
|
8
|
+
* position, which is true everywhere; `gamepadIdentity.ts` answers what that position is *called*
|
|
9
|
+
* on the pad actually in the player's hands.
|
|
10
|
+
*
|
|
11
|
+
* A browser sets `mapping: 'standard'` only when it is confident the device matches this table.
|
|
12
|
+
* Anything else is served by raw index and says so once — see `InputSource`'s pad view.
|
|
13
|
+
*/
|
|
14
|
+
export type GamepadButton = 'faceDown' | 'faceRight' | 'faceLeft' | 'faceUp' | 'l1' | 'r1' | 'l2' | 'r2' | 'select' | 'start' | 'l3' | 'r3' | 'dpadUp' | 'dpadDown' | 'dpadLeft' | 'dpadRight' | 'guide';
|
|
15
|
+
export type GamepadAxis = 'leftX' | 'leftY' | 'rightX' | 'rightY';
|
|
16
|
+
export declare const BUTTON_INDEX: Readonly<Record<GamepadButton, number>>;
|
|
17
|
+
/**
|
|
18
|
+
* **Vertical axes point up at −1**, which is the specification's choice and the opposite of most
|
|
19
|
+
* game code's expectation.
|
|
20
|
+
*
|
|
21
|
+
* It is not corrected here. An engine that silently flips a sign is one a consumer cannot reason
|
|
22
|
+
* about — the value it reads would disagree with every reference about the API it came from — so a
|
|
23
|
+
* caller that wants the other convention negates it at the one place that means something. What it
|
|
24
|
+
* costs: a caller has to know. What would make it wrong: nothing short of the specification
|
|
25
|
+
* changing, which it will not.
|
|
26
|
+
*/
|
|
27
|
+
export declare const AXIS_INDEX: Readonly<Record<GamepadAxis, number>>;
|
|
28
|
+
/**
|
|
29
|
+
* How far a stick must travel before it is moving at all.
|
|
30
|
+
*
|
|
31
|
+
* A tuning constant, so it is an option rather than a rule — `AGENTS.md` forbids asserting the
|
|
32
|
+
* value of one, and `gamepadMapping.test.ts` checks only that it sits in a range a stick can
|
|
33
|
+
* leave. Sticks rest off-centre by different amounts on different pads and wear looser with age,
|
|
34
|
+
* which is the whole reason a deadzone exists.
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_DEADZONE = 0.15;
|
|
37
|
+
/**
|
|
38
|
+
* Drop the dead region and rescale what is left, into a caller-owned target.
|
|
39
|
+
*
|
|
40
|
+
* **Radial rather than per-axis.** A per-axis deadzone leaves a *square* dead region, so a stick
|
|
41
|
+
* pushed diagonally clears it at a smaller displacement than one pushed straight, and the diagonal
|
|
42
|
+
* snaps out of nothing. What a player is controlling is the magnitude, so the magnitude is what
|
|
43
|
+
* the test applies to.
|
|
44
|
+
*
|
|
45
|
+
* **Rescaled from the edge**, because without it the value jumps from 0 to the deadzone the
|
|
46
|
+
* instant it is crossed — a stick that begins moving fast rather than from rest. What it costs:
|
|
47
|
+
* full deflection is reached fractionally before the hardware's own rim. What would make it wrong:
|
|
48
|
+
* a caller wanting the untouched number, which the pad view answers separately as `rawAxis`.
|
|
49
|
+
*
|
|
50
|
+
* Fills `out` rather than returning an object: this is a per-frame path and the house rule about
|
|
51
|
+
* allocation binds it.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyDeadzone(x: number, y: number, deadzone: number, out: {
|
|
54
|
+
x: number;
|
|
55
|
+
y: number;
|
|
56
|
+
}): void;
|