@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,451 @@
|
|
|
1
|
+
/** Configurable two-zone mobile controls over raw touch input. */
|
|
2
|
+
|
|
3
|
+
import type { TouchPoint } from './input.ts';
|
|
4
|
+
import { InputSource } from './input.ts';
|
|
5
|
+
|
|
6
|
+
export interface TouchControlsOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The two nodes the stick is *drawn* with, when a caller wants one drawn.
|
|
9
|
+
*
|
|
10
|
+
* **Optional, and that is a correction rather than a convenience.** These were positional
|
|
11
|
+
* arguments and read as dependencies — a consumer who could not reach the page concluded the
|
|
12
|
+
* class needed two elements to work, and constructed two `div`s it never appended anywhere so
|
|
13
|
+
* the input maths would run. It does not need them: they are an *output channel*, written to and
|
|
14
|
+
* never read. Every touch comes from `input.target`, and every number this class reports is
|
|
15
|
+
* computed without either node.
|
|
16
|
+
*
|
|
17
|
+
* So absent means the stick has no visible representation and the controls work exactly as they
|
|
18
|
+
* did, which is what a consumer drawing its own HUD, drawing none, or forbidden the page wants.
|
|
19
|
+
* `stickBase` takes `hidden` and a position; `stickNub` takes a transform.
|
|
20
|
+
*/
|
|
21
|
+
stickBase?: HTMLElement;
|
|
22
|
+
stickNub?: HTMLElement;
|
|
23
|
+
/** Fraction of the input surface assigned to the dynamic stick. */
|
|
24
|
+
splitRatio?: number;
|
|
25
|
+
stickRadiusPx?: number;
|
|
26
|
+
stickDeadzone?: number;
|
|
27
|
+
gestureMovePx?: number;
|
|
28
|
+
holdResolveMs?: number;
|
|
29
|
+
/**
|
|
30
|
+
* How long a touch may last and still fire the primary on release.
|
|
31
|
+
*
|
|
32
|
+
* The press fires on release, so this duration *is* the action's input
|
|
33
|
+
* latency, and a caller whose action has a grace window of its own — a
|
|
34
|
+
* platformer's coyote time — wants the two sized against each other. Set it
|
|
35
|
+
* past that window and a tap begun at the edge of a drop resolves after the
|
|
36
|
+
* body is unjumpably in the air.
|
|
37
|
+
*/
|
|
38
|
+
tapMaxMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Whether holding the second zone still also *fires* the primary, or only holds it.
|
|
41
|
+
*
|
|
42
|
+
* The default is only-holds, and it is the fix for a real complaint from phone
|
|
43
|
+
* testing: a still thumb kept firing the primary action, so there was no way to hold
|
|
44
|
+
* position and look. A thumb placed down and held is what looking around
|
|
45
|
+
* *starts* with, so resolving it into a press fires the action every time somebody
|
|
46
|
+
* lines up a camera move. There is no threshold that separates "still thumb" from
|
|
47
|
+
* "about to look", because they are the same input.
|
|
48
|
+
*
|
|
49
|
+
* A tap still fires on release, which is where the intent actually is; and the hold
|
|
50
|
+
* still reports `primaryHeld`, so a caller whose action has a held form — a glide, a
|
|
51
|
+
* charge — keeps it. Only the *edge* from a motionless press is gone.
|
|
52
|
+
*
|
|
53
|
+
* The promotion is not a verdict, and reading it as one is what later ate the tap:
|
|
54
|
+
* a touch promoted to the hold and released quickly is still a tap, because the
|
|
55
|
+
* player's thumb did the thing a tap is. See `isTapRelease`.
|
|
56
|
+
*/
|
|
57
|
+
fireOnHold?: boolean;
|
|
58
|
+
swipeMaxMs?: number;
|
|
59
|
+
/** Vertical travel divided by horizontal travel required for a swipe. */
|
|
60
|
+
swipeDominance?: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
import { classifyRightGesture, isTapRelease } from './rightGesture.ts';
|
|
64
|
+
|
|
65
|
+
type RightMode = 'pending' | 'look' | 'secondary' | 'primary-hold';
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Second-zone touches beyond the first, and what they may do.
|
|
69
|
+
*
|
|
70
|
+
* The first thumb in the zone owns everything continuous: the look, and the
|
|
71
|
+
* held form of the primary. Anything after it owns only *edges* — a tap, a
|
|
72
|
+
* flick — because two fingers contributing look at once is one camera being
|
|
73
|
+
* dragged in two directions, which is a worse control than the one this fixes.
|
|
74
|
+
*
|
|
75
|
+
* They exist at all because the zone used to drop every touch after the first
|
|
76
|
+
* outright: a player steering through a corner could not jump out of it without
|
|
77
|
+
* letting go of the corner.
|
|
78
|
+
*/
|
|
79
|
+
const EXTRA_SLOTS = 3;
|
|
80
|
+
const NO_TOUCH = -1;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* A reusable mobile scheme: dynamic stick on the first zone; look plus a
|
|
84
|
+
* primary tap/hold and secondary downward swipe on the second. The class
|
|
85
|
+
* reports generic control state. A game decides whether those signals mean
|
|
86
|
+
* jump, fire, crouch, slide, or anything else.
|
|
87
|
+
*/
|
|
88
|
+
export class TouchControls {
|
|
89
|
+
moveX = 0;
|
|
90
|
+
moveY = 0;
|
|
91
|
+
primaryHeld = false;
|
|
92
|
+
secondaryHeld = false;
|
|
93
|
+
onFirstTouch: (() => void) | null = null;
|
|
94
|
+
|
|
95
|
+
private primaryQueued = false;
|
|
96
|
+
private lookDx = 0;
|
|
97
|
+
private lookDy = 0;
|
|
98
|
+
private leftId: number | null = null;
|
|
99
|
+
private rightId: number | null = null;
|
|
100
|
+
private rightMode: RightMode = 'pending';
|
|
101
|
+
private rightLastX = 0;
|
|
102
|
+
private rightLastY = 0;
|
|
103
|
+
/** Greatest distance the owning touch has reached from where it landed. */
|
|
104
|
+
private rightTravel = 0;
|
|
105
|
+
private rightStart: TouchPoint | null = null;
|
|
106
|
+
private firstTouchSeen = false;
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
* The extra second-zone touches, as parallel fixed arrays: a touch event
|
|
110
|
+
* arrives as often as a frame does while a thumb is down, so nothing on this
|
|
111
|
+
* path may allocate.
|
|
112
|
+
*/
|
|
113
|
+
private readonly extraIds = new Int32Array(EXTRA_SLOTS).fill(NO_TOUCH);
|
|
114
|
+
private readonly extraTravel = new Float32Array(EXTRA_SLOTS);
|
|
115
|
+
private readonly extraSliding = new Uint8Array(EXTRA_SLOTS);
|
|
116
|
+
/** Whether the owning touch is the one holding the secondary. */
|
|
117
|
+
private ownerSliding = false;
|
|
118
|
+
|
|
119
|
+
private readonly stickBase: HTMLElement | null;
|
|
120
|
+
private readonly stickNub: HTMLElement | null;
|
|
121
|
+
private readonly surface: HTMLElement;
|
|
122
|
+
private readonly splitRatio: number;
|
|
123
|
+
private readonly stickRadiusPx: number;
|
|
124
|
+
private readonly stickDeadzone: number;
|
|
125
|
+
private readonly gestureMovePx: number;
|
|
126
|
+
private readonly holdResolveMs: number;
|
|
127
|
+
private readonly tapMaxMs: number;
|
|
128
|
+
private readonly fireOnHold: boolean;
|
|
129
|
+
private readonly swipeMaxMs: number;
|
|
130
|
+
private readonly swipeDominance: number;
|
|
131
|
+
private readonly unsubscribe: () => void;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Take the input surface, and optionally the two nodes the stick is drawn with.
|
|
135
|
+
*
|
|
136
|
+
* **Two forms, and the older one is kept working rather than deprecated.** It was
|
|
137
|
+
* `(input, stickBase, stickNub, options)`, which put an output channel where a reader expects a
|
|
138
|
+
* dependency — a consumer forbidden the page read the signature, concluded the class could not be
|
|
139
|
+
* used without two `HTMLElement`s, and built two it threw away. The options form says what is
|
|
140
|
+
* true: the elements are how the stick is *drawn*, and drawing it is optional.
|
|
141
|
+
*
|
|
142
|
+
* `new TouchControls(input)` is a working control scheme with no visible stick.
|
|
143
|
+
*/
|
|
144
|
+
constructor(input: InputSource, options?: TouchControlsOptions);
|
|
145
|
+
constructor(
|
|
146
|
+
input: InputSource,
|
|
147
|
+
stickBase: HTMLElement,
|
|
148
|
+
stickNub: HTMLElement,
|
|
149
|
+
options?: TouchControlsOptions,
|
|
150
|
+
);
|
|
151
|
+
constructor(
|
|
152
|
+
input: InputSource,
|
|
153
|
+
second: HTMLElement | TouchControlsOptions = {},
|
|
154
|
+
third?: HTMLElement,
|
|
155
|
+
fourth: TouchControlsOptions = {},
|
|
156
|
+
) {
|
|
157
|
+
/*
|
|
158
|
+
* **A third argument means the positional form, and nothing about the second is inspected.**
|
|
159
|
+
*
|
|
160
|
+
* Sniffing the second argument was tried first and is wrong: `instanceof HTMLElement` needs a
|
|
161
|
+
* DOM constructor this package is checked without, and duck-typing on `nodeType` reads a
|
|
162
|
+
* stand-in element as an options object — which this file's own harness supplies, so the first
|
|
163
|
+
* version silently dropped every option a positional caller passed. The arity carries the
|
|
164
|
+
* answer without asking what anything is.
|
|
165
|
+
*/
|
|
166
|
+
const positional = third !== undefined;
|
|
167
|
+
const options: TouchControlsOptions = positional ? fourth : (second as TouchControlsOptions);
|
|
168
|
+
this.stickBase = positional ? (second as HTMLElement) : (options.stickBase ?? null);
|
|
169
|
+
this.stickNub = positional ? (third ?? null) : (options.stickNub ?? null);
|
|
170
|
+
this.surface = input.target;
|
|
171
|
+
this.splitRatio = options.splitRatio ?? 0.5;
|
|
172
|
+
this.stickRadiusPx = options.stickRadiusPx ?? 40;
|
|
173
|
+
this.stickDeadzone = options.stickDeadzone ?? 0.12;
|
|
174
|
+
/*
|
|
175
|
+
* Twenty rather than fourteen: a thumb rolls a little as it lands, and at
|
|
176
|
+
* fourteen that roll turned a tap into a two-degree camera nudge. Nothing
|
|
177
|
+
* is lost at the start of a look, because the travel that resolves one is
|
|
178
|
+
* credited to it (see `onMove`).
|
|
179
|
+
*/
|
|
180
|
+
this.gestureMovePx = options.gestureMovePx ?? 20;
|
|
181
|
+
this.holdResolveMs = options.holdResolveMs ?? 90;
|
|
182
|
+
this.tapMaxMs = options.tapMaxMs ?? 180;
|
|
183
|
+
this.fireOnHold = options.fireOnHold ?? false;
|
|
184
|
+
this.swipeMaxMs = options.swipeMaxMs ?? 160;
|
|
185
|
+
this.swipeDominance = options.swipeDominance ?? 2.4;
|
|
186
|
+
this.validateOptions();
|
|
187
|
+
this.unsubscribe = input.subscribe({
|
|
188
|
+
onTouchStart: (touch) => this.onStart(touch),
|
|
189
|
+
onTouchMove: (touch) => this.onMove(touch),
|
|
190
|
+
onTouchEnd: (touch, durationMs) => this.onEnd(touch, durationMs),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Resolve a still second-zone touch into the generic primary hold. */
|
|
195
|
+
tick(nowMs: number): void {
|
|
196
|
+
const start = this.rightStart;
|
|
197
|
+
if (this.rightMode !== 'pending' || start === null) return;
|
|
198
|
+
if (nowMs - start.startTime >= this.holdResolveMs) {
|
|
199
|
+
// Held, not fired: see `fireOnHold`. A motionless thumb is somebody deciding
|
|
200
|
+
// where to look, and firing under it is the bug this exists to prevent.
|
|
201
|
+
if (this.fireOnHold) this.primaryQueued = true;
|
|
202
|
+
this.primaryHeld = true;
|
|
203
|
+
this.rightMode = 'primary-hold';
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Consume the primary edge exactly once. */
|
|
208
|
+
consumePrimaryPress(): boolean {
|
|
209
|
+
const queued = this.primaryQueued;
|
|
210
|
+
this.primaryQueued = false;
|
|
211
|
+
return queued;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** Drain accumulated second-zone look motion into a caller-owned object. */
|
|
215
|
+
consumeLook(out: { dx: number; dy: number }): void {
|
|
216
|
+
out.dx = this.lookDx;
|
|
217
|
+
out.dy = this.lookDy;
|
|
218
|
+
this.lookDx = 0;
|
|
219
|
+
this.lookDy = 0;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
dispose(): void {
|
|
223
|
+
this.unsubscribe();
|
|
224
|
+
if (this.stickBase !== null) this.stickBase.hidden = true;
|
|
225
|
+
this.moveX = 0;
|
|
226
|
+
this.moveY = 0;
|
|
227
|
+
this.primaryHeld = false;
|
|
228
|
+
this.secondaryHeld = false;
|
|
229
|
+
this.ownerSliding = false;
|
|
230
|
+
this.extraIds.fill(NO_TOUCH);
|
|
231
|
+
this.extraSliding.fill(0);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private onStart(touch: TouchPoint): void {
|
|
235
|
+
if (!this.firstTouchSeen) {
|
|
236
|
+
this.firstTouchSeen = true;
|
|
237
|
+
this.onFirstTouch?.();
|
|
238
|
+
}
|
|
239
|
+
const bounds = this.surface.getBoundingClientRect();
|
|
240
|
+
const splitX = bounds.left + bounds.width * this.splitRatio;
|
|
241
|
+
if (touch.startX < splitX) {
|
|
242
|
+
if (this.leftId !== null) return;
|
|
243
|
+
this.leftId = touch.id;
|
|
244
|
+
this.showStick(touch.startX, touch.startY);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (this.rightId !== null) {
|
|
248
|
+
this.claimExtra(touch.id);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
this.rightId = touch.id;
|
|
252
|
+
this.rightMode = 'pending';
|
|
253
|
+
this.rightStart = touch;
|
|
254
|
+
this.rightTravel = 0;
|
|
255
|
+
this.rightLastX = touch.x;
|
|
256
|
+
this.rightLastY = touch.y;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private onMove(touch: TouchPoint): void {
|
|
260
|
+
if (touch.id === this.leftId) {
|
|
261
|
+
this.updateStick(touch);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (touch.id !== this.rightId) {
|
|
265
|
+
this.moveExtra(touch);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const dx = touch.x - touch.startX;
|
|
270
|
+
const dy = touch.y - touch.startY;
|
|
271
|
+
this.rightTravel = Math.max(this.rightTravel, Math.hypot(dx, dy));
|
|
272
|
+
|
|
273
|
+
if (this.rightMode === 'pending') {
|
|
274
|
+
const gesture = this.classify(touch, dx, dy);
|
|
275
|
+
if (gesture === 'secondary') {
|
|
276
|
+
this.rightMode = 'secondary';
|
|
277
|
+
this.ownerSliding = true;
|
|
278
|
+
this.secondaryHeld = true;
|
|
279
|
+
} else if (gesture === 'look') {
|
|
280
|
+
this.rightMode = 'look';
|
|
281
|
+
/*
|
|
282
|
+
* Credit the travel that resolved the gesture. Starting the count from
|
|
283
|
+
* here instead threw away the first dozen pixels of every drag, which
|
|
284
|
+
* is a dead zone at the start of each look and reads as the camera
|
|
285
|
+
* being slow to respond rather than as an input being dropped.
|
|
286
|
+
*/
|
|
287
|
+
this.lookDx += dx;
|
|
288
|
+
this.lookDy += dy;
|
|
289
|
+
this.rightLastX = touch.x;
|
|
290
|
+
this.rightLastY = touch.y;
|
|
291
|
+
}
|
|
292
|
+
} else if (this.rightMode === 'look' || this.rightMode === 'primary-hold') {
|
|
293
|
+
/*
|
|
294
|
+
* A held thumb still looks, and keeps holding while it does.
|
|
295
|
+
*
|
|
296
|
+
* The hold used to be a terminal state: once a motionless touch resolved
|
|
297
|
+
* into it, the same thumb could no longer move the camera for the rest of
|
|
298
|
+
* its life. That is the wrong half of the input to freeze — the held form
|
|
299
|
+
* is for verbs that last (a glide), and a verb that lasts is exactly the
|
|
300
|
+
* one you need to steer through.
|
|
301
|
+
*/
|
|
302
|
+
this.lookDx += touch.x - this.rightLastX;
|
|
303
|
+
this.lookDy += touch.y - this.rightLastY;
|
|
304
|
+
}
|
|
305
|
+
this.rightLastX = touch.x;
|
|
306
|
+
this.rightLastY = touch.y;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
private onEnd(touch: TouchPoint, durationMs: number): void {
|
|
310
|
+
if (touch.id === this.leftId) {
|
|
311
|
+
this.leftId = null;
|
|
312
|
+
this.moveX = 0;
|
|
313
|
+
this.moveY = 0;
|
|
314
|
+
if (this.stickBase !== null) this.stickBase.hidden = true;
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (touch.id !== this.rightId) {
|
|
318
|
+
this.endExtra(touch, durationMs);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/*
|
|
323
|
+
* `primary-hold` counts as a tap here, and that is the fix. It is the state
|
|
324
|
+
* a still thumb is promoted into after `holdResolveMs`, so the old test —
|
|
325
|
+
* fire only from `pending` — threw away every tap slower than 90 ms, which
|
|
326
|
+
* on a phone is most of them. `isTapRelease` decides on travel and duration
|
|
327
|
+
* instead, which is what a tap actually is.
|
|
328
|
+
*/
|
|
329
|
+
if (
|
|
330
|
+
(this.rightMode === 'pending' || this.rightMode === 'primary-hold') &&
|
|
331
|
+
this.isTap(this.rightTravel, durationMs)
|
|
332
|
+
) {
|
|
333
|
+
this.primaryQueued = true;
|
|
334
|
+
}
|
|
335
|
+
if (this.rightMode === 'secondary') {
|
|
336
|
+
this.ownerSliding = false;
|
|
337
|
+
this.refreshSecondary();
|
|
338
|
+
}
|
|
339
|
+
if (this.rightMode === 'primary-hold') this.primaryHeld = false;
|
|
340
|
+
this.rightId = null;
|
|
341
|
+
this.rightStart = null;
|
|
342
|
+
this.rightMode = 'pending';
|
|
343
|
+
this.rightTravel = 0;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
private claimExtra(id: number): void {
|
|
347
|
+
for (let i = 0; i < EXTRA_SLOTS; i++) {
|
|
348
|
+
if (this.extraIds[i] !== NO_TOUCH) continue;
|
|
349
|
+
this.extraIds[i] = id;
|
|
350
|
+
this.extraTravel[i] = 0;
|
|
351
|
+
this.extraSliding[i] = 0;
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
private extraSlot(id: number): number {
|
|
357
|
+
for (let i = 0; i < EXTRA_SLOTS; i++) {
|
|
358
|
+
if (this.extraIds[i] === id) return i;
|
|
359
|
+
}
|
|
360
|
+
return -1;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private moveExtra(touch: TouchPoint): void {
|
|
364
|
+
const slot = this.extraSlot(touch.id);
|
|
365
|
+
if (slot < 0) return;
|
|
366
|
+
const dx = touch.x - touch.startX;
|
|
367
|
+
const dy = touch.y - touch.startY;
|
|
368
|
+
this.extraTravel[slot] = Math.max(this.extraTravel[slot] ?? 0, Math.hypot(dx, dy));
|
|
369
|
+
// A flick still reads as one from any finger. A drag does not become a
|
|
370
|
+
// look: the owning thumb has the camera, and a second one joining it would
|
|
371
|
+
// make every two-thumb frame a fight over the same axis.
|
|
372
|
+
if (this.extraSliding[slot] === 0 && this.classify(touch, dx, dy) === 'secondary') {
|
|
373
|
+
this.extraSliding[slot] = 1;
|
|
374
|
+
this.secondaryHeld = true;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
private endExtra(touch: TouchPoint, durationMs: number): void {
|
|
379
|
+
const slot = this.extraSlot(touch.id);
|
|
380
|
+
if (slot < 0) return;
|
|
381
|
+
if (this.isTap(this.extraTravel[slot] ?? 0, durationMs)) this.primaryQueued = true;
|
|
382
|
+
this.extraIds[slot] = NO_TOUCH;
|
|
383
|
+
this.extraSliding[slot] = 0;
|
|
384
|
+
this.refreshSecondary();
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/** The secondary is held while *any* touch in the zone is holding it. */
|
|
388
|
+
private refreshSecondary(): void {
|
|
389
|
+
let held = this.ownerSliding;
|
|
390
|
+
for (let i = 0; i < EXTRA_SLOTS && !held; i++) held = this.extraSliding[i] === 1;
|
|
391
|
+
this.secondaryHeld = held;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
private classify(touch: TouchPoint, dx: number, dy: number) {
|
|
395
|
+
return classifyRightGesture(dx, dy, performance.now() - touch.startTime, {
|
|
396
|
+
gestureMovePx: this.gestureMovePx,
|
|
397
|
+
swipeMaxMs: this.swipeMaxMs,
|
|
398
|
+
swipeDominance: this.swipeDominance,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
private isTap(travelPx: number, durationMs: number): boolean {
|
|
403
|
+
return isTapRelease(travelPx, durationMs, {
|
|
404
|
+
gestureMovePx: this.gestureMovePx,
|
|
405
|
+
tapMaxMs: this.tapMaxMs,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
private showStick(x: number, y: number): void {
|
|
410
|
+
if (this.stickBase !== null) {
|
|
411
|
+
this.stickBase.style.left = `${x}px`;
|
|
412
|
+
this.stickBase.style.top = `${y}px`;
|
|
413
|
+
this.stickBase.hidden = false;
|
|
414
|
+
}
|
|
415
|
+
if (this.stickNub !== null) this.stickNub.style.transform = 'translate3d(0, 0, 0)';
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
private updateStick(touch: TouchPoint): void {
|
|
419
|
+
const dx = touch.x - touch.startX;
|
|
420
|
+
const dy = touch.y - touch.startY;
|
|
421
|
+
const length = Math.hypot(dx, dy);
|
|
422
|
+
const strength = Math.min(length / this.stickRadiusPx, 1);
|
|
423
|
+
|
|
424
|
+
if (strength < this.stickDeadzone || length < 1e-6) {
|
|
425
|
+
this.moveX = 0;
|
|
426
|
+
this.moveY = 0;
|
|
427
|
+
} else {
|
|
428
|
+
this.moveX = (dx / length) * strength;
|
|
429
|
+
this.moveY = (-dy / length) * strength;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const clampedLength = Math.min(length, this.stickRadiusPx);
|
|
433
|
+
const nx = length > 1e-6 ? (dx / length) * clampedLength : 0;
|
|
434
|
+
const ny = length > 1e-6 ? (dy / length) * clampedLength : 0;
|
|
435
|
+
if (this.stickNub !== null) {
|
|
436
|
+
this.stickNub.style.transform = `translate3d(${nx}px, ${ny}px, 0)`;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
private validateOptions(): void {
|
|
441
|
+
if (this.splitRatio <= 0 || this.splitRatio >= 1) {
|
|
442
|
+
throw new Error(`TouchControls.splitRatio must be between 0 and 1, got ${this.splitRatio}`);
|
|
443
|
+
}
|
|
444
|
+
if (this.stickRadiusPx <= 0) {
|
|
445
|
+
throw new Error(`TouchControls.stickRadiusPx must be positive, got ${this.stickRadiusPx}`);
|
|
446
|
+
}
|
|
447
|
+
if (this.stickDeadzone < 0 || this.stickDeadzone >= 1) {
|
|
448
|
+
throw new Error(`TouchControls.stickDeadzone must be in [0, 1), got ${this.stickDeadzone}`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the keystroke belongs to a text field rather than to the game.
|
|
3
|
+
*
|
|
4
|
+
* An input layer that swallows keys while somebody is typing is a text field that
|
|
5
|
+
* silently drops characters. A consumer found this the hard way: it asks for
|
|
6
|
+
* `Space`, `KeyE` and the arrows to be `preventDefault`ed — reasonably, since Space
|
|
7
|
+
* scrolls the page and the arrows move it — and a player writing a bug report could
|
|
8
|
+
* not type a space, an `e`, or move the caret.
|
|
9
|
+
*
|
|
10
|
+
* Game-agnostic and deliberately conservative: it asks what the event is *for*, not
|
|
11
|
+
* what the game wants. A consumer that genuinely wants keys while a field has focus
|
|
12
|
+
* can read `keys` directly; nothing here stops that.
|
|
13
|
+
*/
|
|
14
|
+
const TYPING_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* `INPUT` covers buttons and checkboxes too, which do not take text — but a Space on a
|
|
18
|
+
* focused button is the browser's own "press it", so leaving those alone is right for
|
|
19
|
+
* the same reason.
|
|
20
|
+
*/
|
|
21
|
+
export function isTypingTarget(target: EventTarget | null): boolean {
|
|
22
|
+
if (target === null) return false;
|
|
23
|
+
const element = target as Partial<HTMLElement> & { tagName?: string };
|
|
24
|
+
if (typeof element.tagName === 'string' && TYPING_TAGS.has(element.tagName)) return true;
|
|
25
|
+
return element.isContentEditable === true;
|
|
26
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How big a piece of geometry is, and where it sits.
|
|
3
|
+
*
|
|
4
|
+
* **Nothing in this engine knew either until now**, which is why there has never been a frustum
|
|
5
|
+
* test: a renderer cannot decide whether a mesh is on screen without knowing what part of space
|
|
6
|
+
* it occupies. `CAPABILITIES.md` recorded the consequence — no draw culling at all, only backface
|
|
7
|
+
* — and every track on the roadmap that wants culling, level of detail, a broadphase or a
|
|
8
|
+
* bounding gizmo wants this object first.
|
|
9
|
+
*
|
|
10
|
+
* Both a box and a sphere, because the two answer different questions cheaply. A sphere survives
|
|
11
|
+
* an arbitrary transform as a sphere, which makes it the right shape for a per-draw visibility
|
|
12
|
+
* test; a box is tighter and is what a physics broadphase and an editor's selection want.
|
|
13
|
+
*/
|
|
14
|
+
export interface Bounds {
|
|
15
|
+
/** The axis-aligned box, in the geometry's own space. */
|
|
16
|
+
readonly min: Float32Array;
|
|
17
|
+
readonly max: Float32Array;
|
|
18
|
+
/** The box's midpoint, which is what the radius is measured from. */
|
|
19
|
+
readonly centre: Float32Array;
|
|
20
|
+
/** The furthest vertex from `centre`. See `boundsOfPositions` for why not half the diagonal. */
|
|
21
|
+
radius: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function createBounds(): Bounds {
|
|
25
|
+
return {
|
|
26
|
+
min: new Float32Array(3),
|
|
27
|
+
max: new Float32Array(3),
|
|
28
|
+
centre: new Float32Array(3),
|
|
29
|
+
radius: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Measure a vertex array, into bounds the caller owns.
|
|
35
|
+
*
|
|
36
|
+
* **Two passes, and the second one is the point.** The first finds the box; the second finds the
|
|
37
|
+
* furthest vertex from the box's midpoint. Half the diagonal would be one pass and would be the
|
|
38
|
+
* box's circumradius — right for a box, and loose for anything rounded, which is most geometry.
|
|
39
|
+
* A sphere that reaches the corners of a box the geometry never visits answers every test too
|
|
40
|
+
* generously, and the cost is a second walk of an array that is already in cache.
|
|
41
|
+
*
|
|
42
|
+
* **Measured about the box's centre and never about the origin.** A mesh modelled a kilometre
|
|
43
|
+
* from the origin gets a kilometre-wide sphere the other way, and culls nothing for the rest of
|
|
44
|
+
* its life.
|
|
45
|
+
*
|
|
46
|
+
* Allocates nothing: `out` is the caller's and is returned for convenience.
|
|
47
|
+
*/
|
|
48
|
+
export function boundsOfPositions(positions: Float32Array, out: Bounds): Bounds {
|
|
49
|
+
/* Whole vertices only. A trailing partial one has no third component and cannot be placed;
|
|
50
|
+
reading it as a zero would drag the box to the origin. */
|
|
51
|
+
const vertices = Math.floor(positions.length / 3);
|
|
52
|
+
if (vertices === 0) {
|
|
53
|
+
out.min.fill(0);
|
|
54
|
+
out.max.fill(0);
|
|
55
|
+
out.centre.fill(0);
|
|
56
|
+
out.radius = 0;
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let minX = Infinity;
|
|
61
|
+
let minY = Infinity;
|
|
62
|
+
let minZ = Infinity;
|
|
63
|
+
let maxX = -Infinity;
|
|
64
|
+
let maxY = -Infinity;
|
|
65
|
+
let maxZ = -Infinity;
|
|
66
|
+
for (let i = 0; i < vertices; i += 1) {
|
|
67
|
+
const x = positions[i * 3] ?? 0;
|
|
68
|
+
const y = positions[i * 3 + 1] ?? 0;
|
|
69
|
+
const z = positions[i * 3 + 2] ?? 0;
|
|
70
|
+
if (x < minX) minX = x;
|
|
71
|
+
if (y < minY) minY = y;
|
|
72
|
+
if (z < minZ) minZ = z;
|
|
73
|
+
if (x > maxX) maxX = x;
|
|
74
|
+
if (y > maxY) maxY = y;
|
|
75
|
+
if (z > maxZ) maxZ = z;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
out.min[0] = minX;
|
|
79
|
+
out.min[1] = minY;
|
|
80
|
+
out.min[2] = minZ;
|
|
81
|
+
out.max[0] = maxX;
|
|
82
|
+
out.max[1] = maxY;
|
|
83
|
+
out.max[2] = maxZ;
|
|
84
|
+
|
|
85
|
+
const cx = (minX + maxX) * 0.5;
|
|
86
|
+
const cy = (minY + maxY) * 0.5;
|
|
87
|
+
const cz = (minZ + maxZ) * 0.5;
|
|
88
|
+
out.centre[0] = cx;
|
|
89
|
+
out.centre[1] = cy;
|
|
90
|
+
out.centre[2] = cz;
|
|
91
|
+
|
|
92
|
+
let furthest = 0;
|
|
93
|
+
for (let i = 0; i < vertices; i += 1) {
|
|
94
|
+
const dx = (positions[i * 3] ?? 0) - cx;
|
|
95
|
+
const dy = (positions[i * 3 + 1] ?? 0) - cy;
|
|
96
|
+
const dz = (positions[i * 3 + 2] ?? 0) - cz;
|
|
97
|
+
const squared = dx * dx + dy * dy + dz * dz;
|
|
98
|
+
if (squared > furthest) furthest = squared;
|
|
99
|
+
}
|
|
100
|
+
out.radius = Math.sqrt(furthest);
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Bounds for a box the caller names itself, into bounds the caller owns.
|
|
106
|
+
*
|
|
107
|
+
* **`boundsOfPositions` was the only way to make one of these, and it demands a vertex array.**
|
|
108
|
+
* A consumer that wants to ask the renderer about a region rather than about a mesh — a streamed
|
|
109
|
+
* world testing its squares, a trigger volume, a room — has no vertices to hand it, so making the
|
|
110
|
+
* object meant filling `centre` and `radius` by hand and getting the sphere's invariant right. A
|
|
111
|
+
* consumer measured what that costs: with one mesh per material per square, a two-kilometre ring
|
|
112
|
+
* is 1,618 draws it walks one at a time, where the world itself knows 68 squares it could have
|
|
113
|
+
* tested instead.
|
|
114
|
+
*
|
|
115
|
+
* **Here the radius *is* half the diagonal**, which is the opposite of what `boundsOfPositions`
|
|
116
|
+
* does and is right for the same reason. That function measures the furthest actual vertex,
|
|
117
|
+
* because a mesh's corners are usually empty; a named box has no vertices and its corners are
|
|
118
|
+
* exactly the points it promises to contain, so anything tighter would report a region as off
|
|
119
|
+
* screen while part of it is on.
|
|
120
|
+
*
|
|
121
|
+
* Degenerate is allowed: a flat square gives a real box and a real radius, and a caller that
|
|
122
|
+
* passes a max below a min gets those values back rather than a silent swap — the box it asked
|
|
123
|
+
* for is the box it gets, and an inverted one is a bug at the call site.
|
|
124
|
+
*/
|
|
125
|
+
export function boundsOfBox(
|
|
126
|
+
minX: number,
|
|
127
|
+
minY: number,
|
|
128
|
+
minZ: number,
|
|
129
|
+
maxX: number,
|
|
130
|
+
maxY: number,
|
|
131
|
+
maxZ: number,
|
|
132
|
+
out: Bounds,
|
|
133
|
+
): Bounds {
|
|
134
|
+
out.min[0] = minX;
|
|
135
|
+
out.min[1] = minY;
|
|
136
|
+
out.min[2] = minZ;
|
|
137
|
+
out.max[0] = maxX;
|
|
138
|
+
out.max[1] = maxY;
|
|
139
|
+
out.max[2] = maxZ;
|
|
140
|
+
|
|
141
|
+
const cx = (minX + maxX) * 0.5;
|
|
142
|
+
const cy = (minY + maxY) * 0.5;
|
|
143
|
+
const cz = (minZ + maxZ) * 0.5;
|
|
144
|
+
out.centre[0] = cx;
|
|
145
|
+
out.centre[1] = cy;
|
|
146
|
+
out.centre[2] = cz;
|
|
147
|
+
|
|
148
|
+
const dx = maxX - cx;
|
|
149
|
+
const dy = maxY - cy;
|
|
150
|
+
const dz = maxZ - cz;
|
|
151
|
+
out.radius = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** RGB triplet, each channel in [0, 1]. Mutable tuple for direct uniform upload. */
|
|
2
|
+
export type Vec3 = [number, number, number];
|
|
3
|
+
|
|
4
|
+
/** hue in degrees (any range), saturation/lightness in [0, 1]. */
|
|
5
|
+
export function hslToRgb(hue: number, saturation: number, lightness: number): Vec3 {
|
|
6
|
+
const h = ((hue % 360) + 360) % 360;
|
|
7
|
+
const c = (1 - Math.abs(2 * lightness - 1)) * saturation;
|
|
8
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
9
|
+
const m = lightness - c / 2;
|
|
10
|
+
|
|
11
|
+
let r = 0;
|
|
12
|
+
let g = 0;
|
|
13
|
+
let b = 0;
|
|
14
|
+
if (h < 60) [r, g, b] = [c, x, 0];
|
|
15
|
+
else if (h < 120) [r, g, b] = [x, c, 0];
|
|
16
|
+
else if (h < 180) [r, g, b] = [0, c, x];
|
|
17
|
+
else if (h < 240) [r, g, b] = [0, x, c];
|
|
18
|
+
else if (h < 300) [r, g, b] = [x, 0, c];
|
|
19
|
+
else [r, g, b] = [c, 0, x];
|
|
20
|
+
|
|
21
|
+
return [r + m, g + m, b + m];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function mixColor(a: Vec3, b: Vec3, t: number): Vec3 {
|
|
25
|
+
return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** In-place `mixColor` for per-frame use — allocating here would be a hot-path bug. */
|
|
29
|
+
export function mixColorInto(out: Vec3, a: Vec3, b: Vec3, t: number): void {
|
|
30
|
+
out[0] = a[0] + (b[0] - a[0]) * t;
|
|
31
|
+
out[1] = a[1] + (b[1] - a[1]) * t;
|
|
32
|
+
out[2] = a[2] + (b[2] - a[2]) * t;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function scaleColor(color: Vec3, factor: number): Vec3 {
|
|
36
|
+
return [color[0] * factor, color[1] * factor, color[2] * factor];
|
|
37
|
+
}
|