@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,42 @@
|
|
|
1
|
+
import { type GamepadAxis, type GamepadButton } from './gamepadMapping.ts';
|
|
2
|
+
export declare function fakeBrowser(id?: string): {
|
|
3
|
+
target: HTMLElement;
|
|
4
|
+
/**
|
|
5
|
+
* How many times the poll asked the browser for pads.
|
|
6
|
+
*
|
|
7
|
+
* The number the once-a-frame rule is asserted on: `getGamepads` allocates an array and the
|
|
8
|
+
* objects behind it, so a read that called it again would multiply that by however many
|
|
9
|
+
* buttons a frame looks at.
|
|
10
|
+
*/
|
|
11
|
+
calls: {
|
|
12
|
+
getGamepads: number;
|
|
13
|
+
};
|
|
14
|
+
/** Every effect the poll's pad was asked to play, in order, with the parameters it was given. */
|
|
15
|
+
effects: {
|
|
16
|
+
type: string;
|
|
17
|
+
params: Record<string, number>;
|
|
18
|
+
}[];
|
|
19
|
+
/** How many times the actuator was reset, which is what stopping a rumble does. */
|
|
20
|
+
readonly resets: number;
|
|
21
|
+
/**
|
|
22
|
+
* Whether this pad carries an actuator, and whether that actuator carries `reset`.
|
|
23
|
+
*
|
|
24
|
+
* Both are real states a browser produces: a keyboard-shaped pad has no actuator at all, and an
|
|
25
|
+
* older Chromium's actuator has `playEffect` without `reset`.
|
|
26
|
+
*/
|
|
27
|
+
rumbleSupport(present: boolean, options?: {
|
|
28
|
+
reset?: boolean;
|
|
29
|
+
fail?: boolean;
|
|
30
|
+
}): void;
|
|
31
|
+
connect(nextId?: string, nextMapping?: string): void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
press(button: GamepadButton): void;
|
|
34
|
+
release(button: GamepadButton): void;
|
|
35
|
+
axis(axis: GamepadAxis, value: number): void;
|
|
36
|
+
/** Press a key, as the window would deliver it. `target` is nothing a game is typing into. */
|
|
37
|
+
keyDown(code: string): void;
|
|
38
|
+
keyUp(code: string): void;
|
|
39
|
+
/** Run exactly one animation frame, which is what a poll rides on. */
|
|
40
|
+
frame(): void;
|
|
41
|
+
restore(): void;
|
|
42
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { AXIS_INDEX, BUTTON_INDEX, } from './gamepadMapping.js';
|
|
2
|
+
export function fakeBrowser(id = 'Xbox 360 Controller (XInput STANDARD GAMEPAD)') {
|
|
3
|
+
const buttons = Array.from({ length: 17 }, () => ({ pressed: false, value: 0 }));
|
|
4
|
+
const axes = [0, 0, 0, 0];
|
|
5
|
+
let connected = false;
|
|
6
|
+
let mapping = 'standard';
|
|
7
|
+
let padId = id;
|
|
8
|
+
/**
|
|
9
|
+
* A fresh array every call, and fresh button objects behind it — **because the real one does
|
|
10
|
+
* that too**, and the poll's whole design rests on it. A harness that handed back the same array
|
|
11
|
+
* would let a renderer read it many times a frame and never show the cost.
|
|
12
|
+
*/
|
|
13
|
+
const calls = { getGamepads: 0 };
|
|
14
|
+
/**
|
|
15
|
+
* The rumble half, recorded rather than felt.
|
|
16
|
+
*
|
|
17
|
+
* **A haptic effect has no observable result in a test**, which is exactly why the surface answers
|
|
18
|
+
* a boolean rather than nothing: what can be asserted is whether the platform took the call and
|
|
19
|
+
* what it was handed. So the effects are recorded here and the tests read them.
|
|
20
|
+
*
|
|
21
|
+
* `hasActuator` is a switch rather than a fixture, because the capability under test is largely
|
|
22
|
+
* the *refusal*: most pads on most browsers cannot rumble, and a settings screen has to know.
|
|
23
|
+
*/
|
|
24
|
+
const effects = [];
|
|
25
|
+
let resets = 0;
|
|
26
|
+
let hasActuator = true;
|
|
27
|
+
let hasReset = true;
|
|
28
|
+
let failEffect = false;
|
|
29
|
+
const actuator = {
|
|
30
|
+
playEffect: (type, params) => {
|
|
31
|
+
effects.push({ type, params: { ...params } });
|
|
32
|
+
return failEffect
|
|
33
|
+
? Promise.reject(new Error('the pad went away'))
|
|
34
|
+
: Promise.resolve('complete');
|
|
35
|
+
},
|
|
36
|
+
reset: () => {
|
|
37
|
+
resets += 1;
|
|
38
|
+
return Promise.resolve('complete');
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
const getGamepads = () => {
|
|
42
|
+
calls.getGamepads += 1;
|
|
43
|
+
if (!connected)
|
|
44
|
+
return [null];
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
id: padId,
|
|
48
|
+
index: 0,
|
|
49
|
+
mapping,
|
|
50
|
+
connected: true,
|
|
51
|
+
buttons: buttons.map((b) => ({ pressed: b.pressed, value: b.value })),
|
|
52
|
+
axes: axes.slice(),
|
|
53
|
+
vibrationActuator: hasActuator
|
|
54
|
+
? hasReset
|
|
55
|
+
? actuator
|
|
56
|
+
: { playEffect: actuator.playEffect }
|
|
57
|
+
: null,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
};
|
|
61
|
+
const frameCallbacks = [];
|
|
62
|
+
let nextFrameHandle = 1;
|
|
63
|
+
const target = {
|
|
64
|
+
addEventListener: () => { },
|
|
65
|
+
removeEventListener: () => { },
|
|
66
|
+
requestPointerLock: () => undefined,
|
|
67
|
+
getBoundingClientRect: () => ({ left: 0, top: 0, width: 640, height: 480 }),
|
|
68
|
+
};
|
|
69
|
+
const globals = globalThis;
|
|
70
|
+
const had = {};
|
|
71
|
+
const install = (name, value) => {
|
|
72
|
+
had[name] = { present: name in globals, value: globals[name] };
|
|
73
|
+
/* `defineProperty` rather than assignment: `navigator` is a getter on the Node global and
|
|
74
|
+
assigning to it is silently ignored, which would leave the poll reading the real one. */
|
|
75
|
+
Object.defineProperty(globals, name, { value, configurable: true, writable: true });
|
|
76
|
+
};
|
|
77
|
+
/** Window listeners this harness can fire, so a key is a statement rather than a real event. */
|
|
78
|
+
const windowListeners = new Map();
|
|
79
|
+
install('window', {
|
|
80
|
+
matchMedia: () => ({ matches: false }),
|
|
81
|
+
addEventListener: (type, fn) => {
|
|
82
|
+
const existing = windowListeners.get(type);
|
|
83
|
+
if (existing === undefined)
|
|
84
|
+
windowListeners.set(type, [fn]);
|
|
85
|
+
else
|
|
86
|
+
existing.push(fn);
|
|
87
|
+
},
|
|
88
|
+
removeEventListener: (type, fn) => {
|
|
89
|
+
const existing = windowListeners.get(type);
|
|
90
|
+
if (existing === undefined)
|
|
91
|
+
return;
|
|
92
|
+
const at = existing.indexOf(fn);
|
|
93
|
+
if (at >= 0)
|
|
94
|
+
existing.splice(at, 1);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
install('document', {
|
|
98
|
+
addEventListener: () => { },
|
|
99
|
+
removeEventListener: () => { },
|
|
100
|
+
pointerLockElement: null,
|
|
101
|
+
visibilityState: 'visible',
|
|
102
|
+
});
|
|
103
|
+
install('navigator', { getGamepads });
|
|
104
|
+
install('requestAnimationFrame', (fn) => {
|
|
105
|
+
frameCallbacks.push(fn);
|
|
106
|
+
return nextFrameHandle++;
|
|
107
|
+
});
|
|
108
|
+
install('cancelAnimationFrame', () => { });
|
|
109
|
+
const indexOfButton = (button) => BUTTON_INDEX[button];
|
|
110
|
+
return {
|
|
111
|
+
target,
|
|
112
|
+
/**
|
|
113
|
+
* How many times the poll asked the browser for pads.
|
|
114
|
+
*
|
|
115
|
+
* The number the once-a-frame rule is asserted on: `getGamepads` allocates an array and the
|
|
116
|
+
* objects behind it, so a read that called it again would multiply that by however many
|
|
117
|
+
* buttons a frame looks at.
|
|
118
|
+
*/
|
|
119
|
+
calls,
|
|
120
|
+
/** Every effect the poll's pad was asked to play, in order, with the parameters it was given. */
|
|
121
|
+
effects,
|
|
122
|
+
/** How many times the actuator was reset, which is what stopping a rumble does. */
|
|
123
|
+
get resets() {
|
|
124
|
+
return resets;
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Whether this pad carries an actuator, and whether that actuator carries `reset`.
|
|
128
|
+
*
|
|
129
|
+
* Both are real states a browser produces: a keyboard-shaped pad has no actuator at all, and an
|
|
130
|
+
* older Chromium's actuator has `playEffect` without `reset`.
|
|
131
|
+
*/
|
|
132
|
+
rumbleSupport(present, options = {}) {
|
|
133
|
+
hasActuator = present;
|
|
134
|
+
hasReset = options.reset ?? true;
|
|
135
|
+
failEffect = options.fail ?? false;
|
|
136
|
+
},
|
|
137
|
+
connect(nextId = padId, nextMapping = 'standard') {
|
|
138
|
+
padId = nextId;
|
|
139
|
+
mapping = nextMapping;
|
|
140
|
+
connected = true;
|
|
141
|
+
},
|
|
142
|
+
disconnect() {
|
|
143
|
+
connected = false;
|
|
144
|
+
},
|
|
145
|
+
press(button) {
|
|
146
|
+
const at = buttons[indexOfButton(button)];
|
|
147
|
+
if (at !== undefined) {
|
|
148
|
+
at.pressed = true;
|
|
149
|
+
at.value = 1;
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
release(button) {
|
|
153
|
+
const at = buttons[indexOfButton(button)];
|
|
154
|
+
if (at !== undefined) {
|
|
155
|
+
at.pressed = false;
|
|
156
|
+
at.value = 0;
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
axis(axis, value) {
|
|
160
|
+
axes[AXIS_INDEX[axis]] = value;
|
|
161
|
+
},
|
|
162
|
+
/** Press a key, as the window would deliver it. `target` is nothing a game is typing into. */
|
|
163
|
+
keyDown(code) {
|
|
164
|
+
for (const fn of windowListeners.get('keydown') ?? []) {
|
|
165
|
+
fn({ code, repeat: false, target: null, preventDefault: () => { } });
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
keyUp(code) {
|
|
169
|
+
for (const fn of windowListeners.get('keyup') ?? [])
|
|
170
|
+
fn({ code });
|
|
171
|
+
},
|
|
172
|
+
/** Run exactly one animation frame, which is what a poll rides on. */
|
|
173
|
+
frame() {
|
|
174
|
+
const pending = frameCallbacks.splice(0, frameCallbacks.length);
|
|
175
|
+
for (const fn of pending)
|
|
176
|
+
fn(0);
|
|
177
|
+
},
|
|
178
|
+
restore() {
|
|
179
|
+
for (const [name, before] of Object.entries(had)) {
|
|
180
|
+
if (before.present) {
|
|
181
|
+
Object.defineProperty(globals, name, {
|
|
182
|
+
value: before.value,
|
|
183
|
+
configurable: true,
|
|
184
|
+
writable: true,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
delete globals[name];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a drag on the look zone turns out to be.
|
|
3
|
+
*
|
|
4
|
+
* Separated from `TouchControls` because it is the one part of touch handling
|
|
5
|
+
* with a right answer that can be checked without a device: everything else is
|
|
6
|
+
* DOM plumbing, but this is a classification, and getting it wrong silently
|
|
7
|
+
* removes a control rather than breaking one visibly.
|
|
8
|
+
*/
|
|
9
|
+
export type RightGesture = 'pending' | 'look' | 'secondary';
|
|
10
|
+
export interface RightGestureOptions {
|
|
11
|
+
/** Travel before a drag is classified at all, pixels. */
|
|
12
|
+
gestureMovePx: number;
|
|
13
|
+
/** A flick has to finish inside this to count as one, milliseconds. */
|
|
14
|
+
swipeMaxMs: number;
|
|
15
|
+
/** Vertical travel over horizontal required to read as a deliberate flick. */
|
|
16
|
+
swipeDominance: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Classify a drag from its travel and duration.
|
|
20
|
+
*
|
|
21
|
+
* The bias is deliberate and one-way: **when in doubt, it is a look.** Looking
|
|
22
|
+
* is continuous and constant, the secondary flick is occasional, and the two
|
|
23
|
+
* failure modes are not equal — a missed flick costs one slide, while a look
|
|
24
|
+
* wrongly eaten costs the camera for the whole gesture, which is felt as the
|
|
25
|
+
* controls being broken rather than as a missed input.
|
|
26
|
+
*
|
|
27
|
+
* That asymmetry is exactly what went wrong: any quick downward drag was read
|
|
28
|
+
* as a flick, so trying to look *down* quickly did not move the camera at all.
|
|
29
|
+
* Looking left and right stayed fine, because no gesture competes for it.
|
|
30
|
+
*/
|
|
31
|
+
export declare function classifyRightGesture(dx: number, dy: number, elapsedMs: number, options: RightGestureOptions): RightGesture;
|
|
32
|
+
/**
|
|
33
|
+
* Whether a released touch was a tap, and therefore fires the primary.
|
|
34
|
+
*
|
|
35
|
+
* Stated as its own rule because getting it wrong is how the primary went
|
|
36
|
+
* missing. The press used to be queued only for a touch still *unresolved* at
|
|
37
|
+
* release — but a motionless touch is promoted to the held form after
|
|
38
|
+
* `holdResolveMs`, which the caller runs on a frame clock, so every tap longer
|
|
39
|
+
* than that resolve was discarded. On a phone that is most of them: a
|
|
40
|
+
* comfortable tap is 80 to 150 ms against a 90 ms resolve, which is exactly the
|
|
41
|
+
* shape of *"sometimes the jump is missed."*
|
|
42
|
+
*
|
|
43
|
+
* So a tap is defined by what it *did*, not by which state it happened to be
|
|
44
|
+
* parked in: it stayed inside `gestureMovePx` of where it landed and it was
|
|
45
|
+
* short. A touch that travelled further has already been read as a look or a
|
|
46
|
+
* flick and did its work there; firing a press on its release as well would put
|
|
47
|
+
* a jump on the end of every camera drag, which is the complaint this scheme
|
|
48
|
+
* was built to fix.
|
|
49
|
+
*
|
|
50
|
+
* `travelPx` is the *greatest* distance reached from the start, not the
|
|
51
|
+
* distance at release: a thumb that swings out and returns is not a tap, and
|
|
52
|
+
* measuring only the final point cannot tell the two apart.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isTapRelease(travelPx: number, durationMs: number, options: {
|
|
55
|
+
gestureMovePx: number;
|
|
56
|
+
tapMaxMs: number;
|
|
57
|
+
}): boolean;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify a drag from its travel and duration.
|
|
3
|
+
*
|
|
4
|
+
* The bias is deliberate and one-way: **when in doubt, it is a look.** Looking
|
|
5
|
+
* is continuous and constant, the secondary flick is occasional, and the two
|
|
6
|
+
* failure modes are not equal — a missed flick costs one slide, while a look
|
|
7
|
+
* wrongly eaten costs the camera for the whole gesture, which is felt as the
|
|
8
|
+
* controls being broken rather than as a missed input.
|
|
9
|
+
*
|
|
10
|
+
* That asymmetry is exactly what went wrong: any quick downward drag was read
|
|
11
|
+
* as a flick, so trying to look *down* quickly did not move the camera at all.
|
|
12
|
+
* Looking left and right stayed fine, because no gesture competes for it.
|
|
13
|
+
*/
|
|
14
|
+
export function classifyRightGesture(dx, dy, elapsedMs, options) {
|
|
15
|
+
if (Math.hypot(dx, dy) < options.gestureMovePx)
|
|
16
|
+
return 'pending';
|
|
17
|
+
const quick = elapsedMs < options.swipeMaxMs;
|
|
18
|
+
// Downward only, and steeply so: dy is positive toward the bottom of the
|
|
19
|
+
// screen, and a flick that is merely mostly-down is far likelier to be
|
|
20
|
+
// somebody looking at the ground.
|
|
21
|
+
if (quick && dy > 0 && dy > options.swipeDominance * Math.abs(dx))
|
|
22
|
+
return 'secondary';
|
|
23
|
+
return 'look';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether a released touch was a tap, and therefore fires the primary.
|
|
27
|
+
*
|
|
28
|
+
* Stated as its own rule because getting it wrong is how the primary went
|
|
29
|
+
* missing. The press used to be queued only for a touch still *unresolved* at
|
|
30
|
+
* release — but a motionless touch is promoted to the held form after
|
|
31
|
+
* `holdResolveMs`, which the caller runs on a frame clock, so every tap longer
|
|
32
|
+
* than that resolve was discarded. On a phone that is most of them: a
|
|
33
|
+
* comfortable tap is 80 to 150 ms against a 90 ms resolve, which is exactly the
|
|
34
|
+
* shape of *"sometimes the jump is missed."*
|
|
35
|
+
*
|
|
36
|
+
* So a tap is defined by what it *did*, not by which state it happened to be
|
|
37
|
+
* parked in: it stayed inside `gestureMovePx` of where it landed and it was
|
|
38
|
+
* short. A touch that travelled further has already been read as a look or a
|
|
39
|
+
* flick and did its work there; firing a press on its release as well would put
|
|
40
|
+
* a jump on the end of every camera drag, which is the complaint this scheme
|
|
41
|
+
* was built to fix.
|
|
42
|
+
*
|
|
43
|
+
* `travelPx` is the *greatest* distance reached from the start, not the
|
|
44
|
+
* distance at release: a thumb that swings out and returns is not a tap, and
|
|
45
|
+
* measuring only the final point cannot tell the two apart.
|
|
46
|
+
*/
|
|
47
|
+
export function isTapRelease(travelPx, durationMs, options) {
|
|
48
|
+
return travelPx <= options.gestureMovePx && durationMs < options.tapMaxMs;
|
|
49
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Driving a controller's motors, and saying so when the platform cannot.
|
|
3
|
+
*
|
|
4
|
+
* **The refusal is half the capability.** Most pads on most browsers have no actuator at all, and a
|
|
5
|
+
* settings screen that offers a rumble slider a player's hardware ignores is worse than one that
|
|
6
|
+
* greys it out. So every verb here answers a boolean — the same rule the host seam keeps for a
|
|
7
|
+
* window mode a shell cannot enter — rather than accepting the call and doing nothing quietly.
|
|
8
|
+
*
|
|
9
|
+
* **The engine takes durations and magnitudes, and nothing else.** A magnitude is a fraction of a
|
|
10
|
+
* motor and a duration is milliseconds; what a rumble *means* is the consumer's. There is no
|
|
11
|
+
* pattern language, no named effect and no curve, because every one of those would be a decision
|
|
12
|
+
* about what a game does with the hardware.
|
|
13
|
+
*
|
|
14
|
+
* ## What this reaches, and what it does not
|
|
15
|
+
*
|
|
16
|
+
* `GamepadHapticActuator.playEffect('dual-rumble', …)` and nothing else. Two motors of different
|
|
17
|
+
* masses, which is what a standard pad has: `strong` is the low-frequency one and `weak` the
|
|
18
|
+
* high-frequency one.
|
|
19
|
+
*
|
|
20
|
+
* **`hapticActuators[].pulse` is not used, on purpose.** It is a non-standard surface with a
|
|
21
|
+
* different model — one magnitude where this has two — so serving it would mean either dropping
|
|
22
|
+
* the weak motor or averaging the pair, and both are a silent lie about what the caller asked for.
|
|
23
|
+
* A platform with only `pulse` answers `false` and is greyed out, which is true rather than
|
|
24
|
+
* convenient. **What would make that wrong** is a measurement on a browser a consumer actually
|
|
25
|
+
* ships to where `pulse` exists and `vibrationActuator` does not.
|
|
26
|
+
*
|
|
27
|
+
* **Trigger rumble is not reached either.** `'trigger-rumble'` drives two more motors that only
|
|
28
|
+
* some pads have, so it needs its own capability answer beside `canRumble` rather than riding this
|
|
29
|
+
* one; it is a row of its own the day somebody wants it.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The actuator, named here so this file does not depend on lib.dom's version of it.
|
|
33
|
+
*
|
|
34
|
+
* `reset` is optional because an older Chromium ships `playEffect` without it, and a pad that can
|
|
35
|
+
* play an effect can always be stopped by a zero one — which is what `stopRumble` falls back to.
|
|
36
|
+
*/
|
|
37
|
+
export interface RawHapticActuator {
|
|
38
|
+
playEffect(type: string, params: Readonly<Record<string, number>>): Promise<string>;
|
|
39
|
+
reset?(): Promise<string>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The specification's ceiling on one effect, in milliseconds.
|
|
43
|
+
*
|
|
44
|
+
* Clamped here rather than left to the platform, because a longer request is not an error the
|
|
45
|
+
* caller can see: the promise resolves with a word nobody reads, and browsers differ on whether
|
|
46
|
+
* they clamp it or drop it. A caller wanting a longer rumble re-issues, which it has to anyway —
|
|
47
|
+
* any effect can be preempted by the next one.
|
|
48
|
+
*/
|
|
49
|
+
export declare const MAX_RUMBLE_MS = 5000;
|
|
50
|
+
/**
|
|
51
|
+
* Play one dual-rumble effect. Answers whether the platform took it.
|
|
52
|
+
*
|
|
53
|
+
* `false` means the caller should stop offering the control, and it is answered for three separate
|
|
54
|
+
* states that are one thing to a player: no actuator, an actuator this browser cannot drive, and a
|
|
55
|
+
* duration there is nothing to play for.
|
|
56
|
+
*
|
|
57
|
+
* A rejection is swallowed and reported through `onFailure`, once per pad. `playEffect` rejects
|
|
58
|
+
* when the pad goes away mid-effect, which is a thing a player does with a cable; an unhandled
|
|
59
|
+
* rejection is a stack trace nobody can act on, and silence leaves a player whose pad stopped
|
|
60
|
+
* rumbling with nothing to read. **This never throws**, because it is reachable from a frame.
|
|
61
|
+
*/
|
|
62
|
+
export declare function playRumble(actuator: RawHapticActuator | null, durationMs: number, strong: number, weak: number, onFailure: () => void): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Stop whatever is playing. Answers whether the platform took it.
|
|
65
|
+
*
|
|
66
|
+
* `reset` where the actuator has one, and a zero effect where it does not — a zero-magnitude,
|
|
67
|
+
* zero-duration effect preempts the one in flight, which is the same result by the specification's
|
|
68
|
+
* own rule about preemption. Answering `false` for a missing `reset` would grey out a control the
|
|
69
|
+
* hardware can honour.
|
|
70
|
+
*/
|
|
71
|
+
export declare function stopRumble(actuator: RawHapticActuator | null, onFailure: () => void): boolean;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Driving a controller's motors, and saying so when the platform cannot.
|
|
3
|
+
*
|
|
4
|
+
* **The refusal is half the capability.** Most pads on most browsers have no actuator at all, and a
|
|
5
|
+
* settings screen that offers a rumble slider a player's hardware ignores is worse than one that
|
|
6
|
+
* greys it out. So every verb here answers a boolean — the same rule the host seam keeps for a
|
|
7
|
+
* window mode a shell cannot enter — rather than accepting the call and doing nothing quietly.
|
|
8
|
+
*
|
|
9
|
+
* **The engine takes durations and magnitudes, and nothing else.** A magnitude is a fraction of a
|
|
10
|
+
* motor and a duration is milliseconds; what a rumble *means* is the consumer's. There is no
|
|
11
|
+
* pattern language, no named effect and no curve, because every one of those would be a decision
|
|
12
|
+
* about what a game does with the hardware.
|
|
13
|
+
*
|
|
14
|
+
* ## What this reaches, and what it does not
|
|
15
|
+
*
|
|
16
|
+
* `GamepadHapticActuator.playEffect('dual-rumble', …)` and nothing else. Two motors of different
|
|
17
|
+
* masses, which is what a standard pad has: `strong` is the low-frequency one and `weak` the
|
|
18
|
+
* high-frequency one.
|
|
19
|
+
*
|
|
20
|
+
* **`hapticActuators[].pulse` is not used, on purpose.** It is a non-standard surface with a
|
|
21
|
+
* different model — one magnitude where this has two — so serving it would mean either dropping
|
|
22
|
+
* the weak motor or averaging the pair, and both are a silent lie about what the caller asked for.
|
|
23
|
+
* A platform with only `pulse` answers `false` and is greyed out, which is true rather than
|
|
24
|
+
* convenient. **What would make that wrong** is a measurement on a browser a consumer actually
|
|
25
|
+
* ships to where `pulse` exists and `vibrationActuator` does not.
|
|
26
|
+
*
|
|
27
|
+
* **Trigger rumble is not reached either.** `'trigger-rumble'` drives two more motors that only
|
|
28
|
+
* some pads have, so it needs its own capability answer beside `canRumble` rather than riding this
|
|
29
|
+
* one; it is a row of its own the day somebody wants it.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* The specification's ceiling on one effect, in milliseconds.
|
|
33
|
+
*
|
|
34
|
+
* Clamped here rather than left to the platform, because a longer request is not an error the
|
|
35
|
+
* caller can see: the promise resolves with a word nobody reads, and browsers differ on whether
|
|
36
|
+
* they clamp it or drop it. A caller wanting a longer rumble re-issues, which it has to anyway —
|
|
37
|
+
* any effect can be preempted by the next one.
|
|
38
|
+
*/
|
|
39
|
+
export const MAX_RUMBLE_MS = 5000;
|
|
40
|
+
/**
|
|
41
|
+
* The parameters, claimed once.
|
|
42
|
+
*
|
|
43
|
+
* `playEffect` converts this to a dictionary synchronously at the call, so one object rewritten in
|
|
44
|
+
* place is safe and is what the hot-path rule asks for even though a rumble is an event rather
|
|
45
|
+
* than a frame.
|
|
46
|
+
*/
|
|
47
|
+
const params = {
|
|
48
|
+
duration: 0,
|
|
49
|
+
startDelay: 0,
|
|
50
|
+
strongMagnitude: 0,
|
|
51
|
+
weakMagnitude: 0,
|
|
52
|
+
};
|
|
53
|
+
function clamp01(value) {
|
|
54
|
+
if (!(value > 0))
|
|
55
|
+
return 0;
|
|
56
|
+
return value > 1 ? 1 : value;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Play one dual-rumble effect. Answers whether the platform took it.
|
|
60
|
+
*
|
|
61
|
+
* `false` means the caller should stop offering the control, and it is answered for three separate
|
|
62
|
+
* states that are one thing to a player: no actuator, an actuator this browser cannot drive, and a
|
|
63
|
+
* duration there is nothing to play for.
|
|
64
|
+
*
|
|
65
|
+
* A rejection is swallowed and reported through `onFailure`, once per pad. `playEffect` rejects
|
|
66
|
+
* when the pad goes away mid-effect, which is a thing a player does with a cable; an unhandled
|
|
67
|
+
* rejection is a stack trace nobody can act on, and silence leaves a player whose pad stopped
|
|
68
|
+
* rumbling with nothing to read. **This never throws**, because it is reachable from a frame.
|
|
69
|
+
*/
|
|
70
|
+
export function playRumble(actuator, durationMs, strong, weak, onFailure) {
|
|
71
|
+
if (actuator === null || typeof actuator.playEffect !== 'function')
|
|
72
|
+
return false;
|
|
73
|
+
if (!(durationMs > 0))
|
|
74
|
+
return false;
|
|
75
|
+
params.duration = durationMs > MAX_RUMBLE_MS ? MAX_RUMBLE_MS : durationMs;
|
|
76
|
+
params.strongMagnitude = clamp01(strong);
|
|
77
|
+
params.weakMagnitude = clamp01(weak);
|
|
78
|
+
return dispatch(actuator, onFailure);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stop whatever is playing. Answers whether the platform took it.
|
|
82
|
+
*
|
|
83
|
+
* `reset` where the actuator has one, and a zero effect where it does not — a zero-magnitude,
|
|
84
|
+
* zero-duration effect preempts the one in flight, which is the same result by the specification's
|
|
85
|
+
* own rule about preemption. Answering `false` for a missing `reset` would grey out a control the
|
|
86
|
+
* hardware can honour.
|
|
87
|
+
*/
|
|
88
|
+
export function stopRumble(actuator, onFailure) {
|
|
89
|
+
if (actuator === null || typeof actuator.playEffect !== 'function')
|
|
90
|
+
return false;
|
|
91
|
+
if (typeof actuator.reset === 'function') {
|
|
92
|
+
swallow(actuator.reset(), onFailure);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
params.duration = 0;
|
|
96
|
+
params.strongMagnitude = 0;
|
|
97
|
+
params.weakMagnitude = 0;
|
|
98
|
+
return dispatch(actuator, onFailure);
|
|
99
|
+
}
|
|
100
|
+
function dispatch(actuator, onFailure) {
|
|
101
|
+
/*
|
|
102
|
+
* The call itself is guarded, not only its promise. A browser that rejects the *arguments* throws
|
|
103
|
+
* synchronously rather than rejecting, and this is reachable from a frame — where the house rule
|
|
104
|
+
* is that nothing throws.
|
|
105
|
+
*/
|
|
106
|
+
try {
|
|
107
|
+
swallow(actuator.playEffect('dual-rumble', params), onFailure);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
onFailure();
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
function swallow(result, onFailure) {
|
|
116
|
+
if (result === undefined || typeof result.then !== 'function')
|
|
117
|
+
return;
|
|
118
|
+
void result.then(undefined, onFailure);
|
|
119
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/** Configurable two-zone mobile controls over raw touch input. */
|
|
2
|
+
import { InputSource } from './input.ts';
|
|
3
|
+
export interface TouchControlsOptions {
|
|
4
|
+
/**
|
|
5
|
+
* The two nodes the stick is *drawn* with, when a caller wants one drawn.
|
|
6
|
+
*
|
|
7
|
+
* **Optional, and that is a correction rather than a convenience.** These were positional
|
|
8
|
+
* arguments and read as dependencies — a consumer who could not reach the page concluded the
|
|
9
|
+
* class needed two elements to work, and constructed two `div`s it never appended anywhere so
|
|
10
|
+
* the input maths would run. It does not need them: they are an *output channel*, written to and
|
|
11
|
+
* never read. Every touch comes from `input.target`, and every number this class reports is
|
|
12
|
+
* computed without either node.
|
|
13
|
+
*
|
|
14
|
+
* So absent means the stick has no visible representation and the controls work exactly as they
|
|
15
|
+
* did, which is what a consumer drawing its own HUD, drawing none, or forbidden the page wants.
|
|
16
|
+
* `stickBase` takes `hidden` and a position; `stickNub` takes a transform.
|
|
17
|
+
*/
|
|
18
|
+
stickBase?: HTMLElement;
|
|
19
|
+
stickNub?: HTMLElement;
|
|
20
|
+
/** Fraction of the input surface assigned to the dynamic stick. */
|
|
21
|
+
splitRatio?: number;
|
|
22
|
+
stickRadiusPx?: number;
|
|
23
|
+
stickDeadzone?: number;
|
|
24
|
+
gestureMovePx?: number;
|
|
25
|
+
holdResolveMs?: number;
|
|
26
|
+
/**
|
|
27
|
+
* How long a touch may last and still fire the primary on release.
|
|
28
|
+
*
|
|
29
|
+
* The press fires on release, so this duration *is* the action's input
|
|
30
|
+
* latency, and a caller whose action has a grace window of its own — a
|
|
31
|
+
* platformer's coyote time — wants the two sized against each other. Set it
|
|
32
|
+
* past that window and a tap begun at the edge of a drop resolves after the
|
|
33
|
+
* body is unjumpably in the air.
|
|
34
|
+
*/
|
|
35
|
+
tapMaxMs?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Whether holding the second zone still also *fires* the primary, or only holds it.
|
|
38
|
+
*
|
|
39
|
+
* The default is only-holds, and it is the fix for a real complaint from phone
|
|
40
|
+
* testing: a still thumb kept firing the primary action, so there was no way to hold
|
|
41
|
+
* position and look. A thumb placed down and held is what looking around
|
|
42
|
+
* *starts* with, so resolving it into a press fires the action every time somebody
|
|
43
|
+
* lines up a camera move. There is no threshold that separates "still thumb" from
|
|
44
|
+
* "about to look", because they are the same input.
|
|
45
|
+
*
|
|
46
|
+
* A tap still fires on release, which is where the intent actually is; and the hold
|
|
47
|
+
* still reports `primaryHeld`, so a caller whose action has a held form — a glide, a
|
|
48
|
+
* charge — keeps it. Only the *edge* from a motionless press is gone.
|
|
49
|
+
*
|
|
50
|
+
* The promotion is not a verdict, and reading it as one is what later ate the tap:
|
|
51
|
+
* a touch promoted to the hold and released quickly is still a tap, because the
|
|
52
|
+
* player's thumb did the thing a tap is. See `isTapRelease`.
|
|
53
|
+
*/
|
|
54
|
+
fireOnHold?: boolean;
|
|
55
|
+
swipeMaxMs?: number;
|
|
56
|
+
/** Vertical travel divided by horizontal travel required for a swipe. */
|
|
57
|
+
swipeDominance?: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A reusable mobile scheme: dynamic stick on the first zone; look plus a
|
|
61
|
+
* primary tap/hold and secondary downward swipe on the second. The class
|
|
62
|
+
* reports generic control state. A game decides whether those signals mean
|
|
63
|
+
* jump, fire, crouch, slide, or anything else.
|
|
64
|
+
*/
|
|
65
|
+
export declare class TouchControls {
|
|
66
|
+
moveX: number;
|
|
67
|
+
moveY: number;
|
|
68
|
+
primaryHeld: boolean;
|
|
69
|
+
secondaryHeld: boolean;
|
|
70
|
+
onFirstTouch: (() => void) | null;
|
|
71
|
+
private primaryQueued;
|
|
72
|
+
private lookDx;
|
|
73
|
+
private lookDy;
|
|
74
|
+
private leftId;
|
|
75
|
+
private rightId;
|
|
76
|
+
private rightMode;
|
|
77
|
+
private rightLastX;
|
|
78
|
+
private rightLastY;
|
|
79
|
+
/** Greatest distance the owning touch has reached from where it landed. */
|
|
80
|
+
private rightTravel;
|
|
81
|
+
private rightStart;
|
|
82
|
+
private firstTouchSeen;
|
|
83
|
+
private readonly extraIds;
|
|
84
|
+
private readonly extraTravel;
|
|
85
|
+
private readonly extraSliding;
|
|
86
|
+
/** Whether the owning touch is the one holding the secondary. */
|
|
87
|
+
private ownerSliding;
|
|
88
|
+
private readonly stickBase;
|
|
89
|
+
private readonly stickNub;
|
|
90
|
+
private readonly surface;
|
|
91
|
+
private readonly splitRatio;
|
|
92
|
+
private readonly stickRadiusPx;
|
|
93
|
+
private readonly stickDeadzone;
|
|
94
|
+
private readonly gestureMovePx;
|
|
95
|
+
private readonly holdResolveMs;
|
|
96
|
+
private readonly tapMaxMs;
|
|
97
|
+
private readonly fireOnHold;
|
|
98
|
+
private readonly swipeMaxMs;
|
|
99
|
+
private readonly swipeDominance;
|
|
100
|
+
private readonly unsubscribe;
|
|
101
|
+
/**
|
|
102
|
+
* Take the input surface, and optionally the two nodes the stick is drawn with.
|
|
103
|
+
*
|
|
104
|
+
* **Two forms, and the older one is kept working rather than deprecated.** It was
|
|
105
|
+
* `(input, stickBase, stickNub, options)`, which put an output channel where a reader expects a
|
|
106
|
+
* dependency — a consumer forbidden the page read the signature, concluded the class could not be
|
|
107
|
+
* used without two `HTMLElement`s, and built two it threw away. The options form says what is
|
|
108
|
+
* true: the elements are how the stick is *drawn*, and drawing it is optional.
|
|
109
|
+
*
|
|
110
|
+
* `new TouchControls(input)` is a working control scheme with no visible stick.
|
|
111
|
+
*/
|
|
112
|
+
constructor(input: InputSource, options?: TouchControlsOptions);
|
|
113
|
+
constructor(input: InputSource, stickBase: HTMLElement, stickNub: HTMLElement, options?: TouchControlsOptions);
|
|
114
|
+
/** Resolve a still second-zone touch into the generic primary hold. */
|
|
115
|
+
tick(nowMs: number): void;
|
|
116
|
+
/** Consume the primary edge exactly once. */
|
|
117
|
+
consumePrimaryPress(): boolean;
|
|
118
|
+
/** Drain accumulated second-zone look motion into a caller-owned object. */
|
|
119
|
+
consumeLook(out: {
|
|
120
|
+
dx: number;
|
|
121
|
+
dy: number;
|
|
122
|
+
}): void;
|
|
123
|
+
dispose(): void;
|
|
124
|
+
private onStart;
|
|
125
|
+
private onMove;
|
|
126
|
+
private onEnd;
|
|
127
|
+
private claimExtra;
|
|
128
|
+
private extraSlot;
|
|
129
|
+
private moveExtra;
|
|
130
|
+
private endExtra;
|
|
131
|
+
/** The secondary is held while *any* touch in the zone is holding it. */
|
|
132
|
+
private refreshSecondary;
|
|
133
|
+
private classify;
|
|
134
|
+
private isTap;
|
|
135
|
+
private showStick;
|
|
136
|
+
private updateStick;
|
|
137
|
+
private validateOptions;
|
|
138
|
+
}
|