@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,109 @@
|
|
|
1
|
+
export const TAU = Math.PI * 2;
|
|
2
|
+
export const DEG_TO_RAD = Math.PI / 180;
|
|
3
|
+
|
|
4
|
+
export function clamp(value: number, min: number, max: number): number {
|
|
5
|
+
return value < min ? min : value > max ? max : value;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function lerp(a: number, b: number, t: number): number {
|
|
9
|
+
return a + (b - a) * t;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Hermite interpolation between two edges: 0 below `a`, 1 above `b`. */
|
|
13
|
+
export function smoothstep(a: number, b: number, x: number): number {
|
|
14
|
+
const t = clamp((x - a) / (b - a), 0, 1);
|
|
15
|
+
return t * t * (3 - 2 * t);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Framerate-independent exponential approach of `a` toward `b`.
|
|
20
|
+
* `lambda` is the convergence rate in 1/seconds (higher = snappier).
|
|
21
|
+
*/
|
|
22
|
+
export function damp(a: number, b: number, lambda: number, dt: number): number {
|
|
23
|
+
/*
|
|
24
|
+
* **Presentation smoothing, which is why the marker is here and not a rewrite.** `damp`,
|
|
25
|
+
* `dampAngle` and `dampTracking` converge a *drawn* value toward a target over wall-clock
|
|
26
|
+
* seconds: a camera following a car, a dial settling. `scripts/determinism.mjs` refuses `Math.exp`
|
|
27
|
+
* inside the simulation set because ECMAScript does not specify it, and that refusal is right for
|
|
28
|
+
* anything a tick's state depends on — but none of these three is that.
|
|
29
|
+
*
|
|
30
|
+
* **What a simulation wants instead**, if it ever wants exponential approach inside the fixed
|
|
31
|
+
* step, is a per-tick factor computed once from `lambda` and the fixed `dt` and passed in as a
|
|
32
|
+
* number: at a constant step the factor is a constant, so nothing has to call `exp` on a tick at
|
|
33
|
+
* all. `exactExp` in `math/exact.ts` is the other answer, and is the one to reach for when the
|
|
34
|
+
* rate itself varies.
|
|
35
|
+
*/
|
|
36
|
+
// determinism: build-time — presentation smoothing; see the note above for a simulation
|
|
37
|
+
return lerp(a, b, 1 - Math.exp(-lambda * dt));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Exponential approach of `a` toward a target that is itself **moving**, at `velocity`.
|
|
42
|
+
*
|
|
43
|
+
* `damp` above is `lerp(a, b, 1 - exp(-lambda dt))`, which is the exact solution of
|
|
44
|
+
* `a' = lambda (b - a)` for a `b` that holds still across the interval — a zero-order hold. For a
|
|
45
|
+
* target that is moving it is wrong in two ways that both show up as the frame rate changes,
|
|
46
|
+
* because the error is a function of `dt`:
|
|
47
|
+
*
|
|
48
|
+
* - the settled gap becomes `v dt (1-k)/k` for `k = 1 - exp(-lambda dt)`, which *shrinks as the
|
|
49
|
+
* frame time grows*, so a machine that drops rate quietly re-frames the shot;
|
|
50
|
+
* - and under uneven frames the gap oscillates rather than settling at all.
|
|
51
|
+
*
|
|
52
|
+
* This solves the same equation for `b(t) = b - v (dt - t)`, a target arriving at `b` having
|
|
53
|
+
* travelled at `v`. Substituting `e = a - b` gives `e' = -lambda e - v`, whose solution is
|
|
54
|
+
* `e(t) = (e0 + v/lambda) exp(-lambda t) - v/lambda` — so the settled gap is `v/lambda` at every
|
|
55
|
+
* rate and there is nothing left for jitter to move. `b` is the target **now**, at the end of the
|
|
56
|
+
* interval, which is what a caller has.
|
|
57
|
+
*
|
|
58
|
+
* **What it costs is a velocity the caller has to supply**, and a caller that passes zero gets
|
|
59
|
+
* `damp` back exactly. A finite difference of the target over the frame is the usual source and is
|
|
60
|
+
* exact for a target that is moving smoothly; what it is not good for is a target that *steps*,
|
|
61
|
+
* where one frame of `delta/dt` is a spike and this will aim `v/lambda` ahead of it.
|
|
62
|
+
*
|
|
63
|
+
* Zero or negative `lambda` returns `a` rather than dividing by it. The limit as `lambda` goes to
|
|
64
|
+
* zero is `a` — no pull, no movement — so the guard agrees with the arithmetic rather than merely
|
|
65
|
+
* avoiding an infinity.
|
|
66
|
+
*/
|
|
67
|
+
export function dampTracking(
|
|
68
|
+
a: number,
|
|
69
|
+
b: number,
|
|
70
|
+
velocity: number,
|
|
71
|
+
lambda: number,
|
|
72
|
+
dt: number,
|
|
73
|
+
): number {
|
|
74
|
+
if (lambda <= 0) return a;
|
|
75
|
+
const lag = velocity / lambda;
|
|
76
|
+
// determinism: build-time — presentation smoothing, like `damp`; see the note there
|
|
77
|
+
return b - lag + (a - b + lag + velocity * dt) * Math.exp(-lambda * dt);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Signed shortest angular distance from `a` to `b`, in (-π, π]. */
|
|
81
|
+
export function angleDelta(a: number, b: number): number {
|
|
82
|
+
let d = (b - a) % TAU;
|
|
83
|
+
if (d > Math.PI) d -= TAU;
|
|
84
|
+
if (d < -Math.PI) d += TAU;
|
|
85
|
+
return d;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Fold an angle into (-π, π]. Simulation state uses this so a long session
|
|
90
|
+
* cannot accumulate an unbounded angle and lose float precision. Anything
|
|
91
|
+
* replaying a recorded session depends on staying bit-stable over its length.
|
|
92
|
+
*/
|
|
93
|
+
export function wrapAngle(a: number): number {
|
|
94
|
+
let w = a % TAU;
|
|
95
|
+
if (w > Math.PI) w -= TAU;
|
|
96
|
+
if (w <= -Math.PI) w += TAU;
|
|
97
|
+
return w;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** `lerp` along the shortest arc — the angular counterpart for render interpolation. */
|
|
101
|
+
export function lerpAngle(a: number, b: number, t: number): number {
|
|
102
|
+
return a + angleDelta(a, b) * t;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** `damp` along the shortest arc between two angles. */
|
|
106
|
+
export function dampAngle(a: number, b: number, lambda: number, dt: number): number {
|
|
107
|
+
// determinism: build-time — presentation smoothing; see `damp`
|
|
108
|
+
return a + angleDelta(a, b) * (1 - Math.exp(-lambda * dt));
|
|
109
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { angleDelta, wrapAngle } from './scalar.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A critically damped spring: a value that *accelerates* toward a target and
|
|
5
|
+
* settles on it.
|
|
6
|
+
*
|
|
7
|
+
* The counterpart to `damp`, and the difference is the whole reason this exists.
|
|
8
|
+
* `damp` is a first-order lag: its speed is proportional to the error it has
|
|
9
|
+
* already accumulated, so it is fastest on the first frame of a move and
|
|
10
|
+
* asymptotic for the rest of it. It cannot ease in, cannot settle, and — the
|
|
11
|
+
* part that bites — cannot follow a *moving* target without falling behind,
|
|
12
|
+
* because the only way it can travel at the target's speed is to build up an
|
|
13
|
+
* error of `speed / lambda` and hold it. A replay camera damping onto a character
|
|
14
|
+
* at 14 m/s was measured framing every shot 2.2 m further out than the shot
|
|
15
|
+
* asked for, and re-accumulating that error as a straight slide after every cut.
|
|
16
|
+
*
|
|
17
|
+
* This carries a velocity, so it has an acceleration profile — it leads into a
|
|
18
|
+
* move and comes to rest at the end of one — and it is stepped against the
|
|
19
|
+
* target's *own* velocity, so a target moving smoothly is ridden along with at
|
|
20
|
+
* zero steady-state error rather than trailed.
|
|
21
|
+
*
|
|
22
|
+
* Long-lived and stateful by nature, hence a class: one per axis, constructed
|
|
23
|
+
* once and mutated in place, so a per-frame caller allocates nothing.
|
|
24
|
+
*/
|
|
25
|
+
export class Spring {
|
|
26
|
+
value = 0;
|
|
27
|
+
velocity = 0;
|
|
28
|
+
|
|
29
|
+
/** Place the spring, with no motion unless one is given. Use on a cut. */
|
|
30
|
+
reset(value: number, velocity = 0): void {
|
|
31
|
+
this.value = value;
|
|
32
|
+
this.velocity = velocity;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Step toward `target`, which is itself travelling at `targetVelocity`.
|
|
37
|
+
*
|
|
38
|
+
* `rate` is the convergence rate in 1/seconds, as `damp`'s lambda is — higher
|
|
39
|
+
* is tighter — though the two are not numerically interchangeable: a spring at
|
|
40
|
+
* the same figure is gentler, because it spends the start of a move
|
|
41
|
+
* accelerating rather than covering ground.
|
|
42
|
+
*/
|
|
43
|
+
step(target: number, targetVelocity: number, rate: number, dt: number): number {
|
|
44
|
+
this.advance(
|
|
45
|
+
this.value - startOf(target, targetVelocity, dt),
|
|
46
|
+
target,
|
|
47
|
+
targetVelocity,
|
|
48
|
+
rate,
|
|
49
|
+
dt,
|
|
50
|
+
);
|
|
51
|
+
return this.value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The same, along the shortest arc, for angles. The value stays folded into
|
|
56
|
+
* (-π, π] so a long session cannot accumulate an unbounded angle.
|
|
57
|
+
*/
|
|
58
|
+
stepAngle(target: number, targetVelocity: number, rate: number, dt: number): number {
|
|
59
|
+
const from = startOf(target, targetVelocity, dt);
|
|
60
|
+
this.advance(-angleDelta(this.value, from), target, targetVelocity, rate, dt);
|
|
61
|
+
this.value = wrapAngle(this.value);
|
|
62
|
+
return this.value;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The analytic solution of `e'' = -ω²e - 2ωe'` over one step, in the target's
|
|
67
|
+
* own frame of reference — which is what makes a moving target free of lag,
|
|
68
|
+
* and only if the error going in is measured in that same frame. See
|
|
69
|
+
* `startOf`: solving from an error taken against where the target has *got to*
|
|
70
|
+
* while integrating to where it is *going* leaves a step's worth of target
|
|
71
|
+
* motion unaccounted for every frame, which converges on twice the target's
|
|
72
|
+
* velocity and 2V/ω of standing error — 4.56 m of the 4.667 m predicted, in
|
|
73
|
+
* the first measurement taken of this.
|
|
74
|
+
*
|
|
75
|
+
* Solved rather than integrated because a spring stepped by Euler diverges
|
|
76
|
+
* once `ω·dt` approaches 1, and this runs on a frame that can be 250 ms long
|
|
77
|
+
* when a tab wakes up. `decay` stands in for `e^-x` with a rational
|
|
78
|
+
* approximation that stays inside (0, 1] for every non-negative x, so a long
|
|
79
|
+
* frame overshoots nothing — it just arrives.
|
|
80
|
+
*/
|
|
81
|
+
private advance(
|
|
82
|
+
error: number,
|
|
83
|
+
target: number,
|
|
84
|
+
targetVelocity: number,
|
|
85
|
+
rate: number,
|
|
86
|
+
dt: number,
|
|
87
|
+
): void {
|
|
88
|
+
const omega = rate > 0 ? rate : 0;
|
|
89
|
+
const relative = this.velocity - targetVelocity;
|
|
90
|
+
const x = omega * dt;
|
|
91
|
+
const decay = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x);
|
|
92
|
+
const slope = relative + omega * error;
|
|
93
|
+
this.value = target + (error + slope * dt) * decay;
|
|
94
|
+
this.velocity = targetVelocity + (relative - omega * slope * dt) * decay;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Where a target travelling at `targetVelocity` was when this step began.
|
|
100
|
+
*
|
|
101
|
+
* `target` is where it has arrived, which is the natural thing for a caller to
|
|
102
|
+
* have and the wrong end of the step to measure an error against.
|
|
103
|
+
*/
|
|
104
|
+
function startOf(target: number, targetVelocity: number, dt: number): number {
|
|
105
|
+
return target - targetVelocity * dt;
|
|
106
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A graph to path over: nodes somewhere in the world, edges between them, and a cost per edge.
|
|
3
|
+
*
|
|
4
|
+
* **A graph rather than a navigation mesh, and that is a decision rather than a first step.** A
|
|
5
|
+
* mesh is what you build when walkable space is an arbitrary region and an agent may cross it
|
|
6
|
+
* anywhere; a graph is what you build when the ways through a world are *already* a network —
|
|
7
|
+
* roads, corridors, rails, docking lanes, the connections between rooms. Consumers of this engine
|
|
8
|
+
* keep arriving with the second: one reported that they extract a road graph from their world
|
|
9
|
+
* already and that their agents still walk straight at the target and wedge against a wall on the
|
|
10
|
+
* way, about once every two minutes of play. A mesh would have asked them to throw that away and
|
|
11
|
+
* start from geometry.
|
|
12
|
+
*
|
|
13
|
+
* What it costs is honest and worth saying at the top: **an agent on a graph travels along edges,
|
|
14
|
+
* so it takes corners the graph has and none it does not.** Open ground crossed by two nodes is
|
|
15
|
+
* crossed in one straight line. If a world's walkable space genuinely is a region, this is the
|
|
16
|
+
* wrong structure and a mesh is the row that is still open.
|
|
17
|
+
*
|
|
18
|
+
* **Structure of arrays, CSR adjacency, everything typed.** The search below runs inside a frame
|
|
19
|
+
* budget against a graph a consumer may rebuild when the world changes, so nothing here holds an
|
|
20
|
+
* object per node and nothing allocates during a query.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export interface NavGraph {
|
|
24
|
+
/** xyz per node, in world units. */
|
|
25
|
+
readonly positions: Float32Array;
|
|
26
|
+
readonly nodeCount: number;
|
|
27
|
+
/** CSR offsets: node `i`'s edges are `[edgeStart[i], edgeStart[i + 1])`. Length `nodeCount + 1`. */
|
|
28
|
+
readonly edgeStart: Uint32Array;
|
|
29
|
+
/** The node at the far end of each edge. */
|
|
30
|
+
readonly edgeTarget: Uint32Array;
|
|
31
|
+
/** What each edge costs to traverse. Distance unless the caller said otherwise. */
|
|
32
|
+
readonly edgeCost: Float32Array;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface NavEdge {
|
|
36
|
+
readonly from: number;
|
|
37
|
+
readonly to: number;
|
|
38
|
+
/**
|
|
39
|
+
* What crossing it costs. Defaults to the distance between its ends.
|
|
40
|
+
*
|
|
41
|
+
* **A cost is not a distance and the difference is the whole of route quality.** Mud, a hill, a
|
|
42
|
+
* toll, a road an agent should prefer, a corridor it should avoid unless there is nothing else:
|
|
43
|
+
* all of them are this number, and a consumer that never sets it gets shortest-path behaviour.
|
|
44
|
+
* The one rule the search depends on is that a cost is **never less than the straight-line
|
|
45
|
+
* distance between the two ends** — see `navSearch`, where the heuristic that makes A* exact
|
|
46
|
+
* assumes exactly that. Faster-than-flying edges are refused at build time rather than producing
|
|
47
|
+
* a route that is quietly not the best one.
|
|
48
|
+
*/
|
|
49
|
+
readonly cost?: number;
|
|
50
|
+
/** Whether it may also be crossed the other way. Default true. */
|
|
51
|
+
readonly bidirectional?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Build the graph, checking the two things that make a wrong route look like a working one.
|
|
56
|
+
*
|
|
57
|
+
* An edge naming a node that does not exist, and an edge cheaper than flying: both produce a graph
|
|
58
|
+
* that searches happily and answers wrongly, one by reading past the end of an array and one by
|
|
59
|
+
* breaking the admissibility A* needs. Refused here, at build time, which is where this engine
|
|
60
|
+
* refuses things.
|
|
61
|
+
*/
|
|
62
|
+
export function buildNavGraph(
|
|
63
|
+
positions: Float32Array | readonly number[],
|
|
64
|
+
edges: readonly NavEdge[],
|
|
65
|
+
): NavGraph {
|
|
66
|
+
const points = positions instanceof Float32Array ? positions : new Float32Array(positions);
|
|
67
|
+
if (points.length % 3 !== 0) {
|
|
68
|
+
throw new Error(`buildNavGraph: positions must be xyz-packed, got ${points.length} floats`);
|
|
69
|
+
}
|
|
70
|
+
const nodeCount = points.length / 3;
|
|
71
|
+
if (nodeCount === 0)
|
|
72
|
+
throw new Error('buildNavGraph: a graph with no nodes has nothing to path over');
|
|
73
|
+
|
|
74
|
+
const degree = new Uint32Array(nodeCount);
|
|
75
|
+
for (const edge of edges) {
|
|
76
|
+
check(edge.from, nodeCount, 'from');
|
|
77
|
+
check(edge.to, nodeCount, 'to');
|
|
78
|
+
degree[edge.from] = (degree[edge.from] ?? 0) + 1;
|
|
79
|
+
if (edge.bidirectional !== false) degree[edge.to] = (degree[edge.to] ?? 0) + 1;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const edgeStart = new Uint32Array(nodeCount + 1);
|
|
83
|
+
for (let i = 0; i < nodeCount; i++) edgeStart[i + 1] = (edgeStart[i] ?? 0) + (degree[i] ?? 0);
|
|
84
|
+
const total = edgeStart[nodeCount] ?? 0;
|
|
85
|
+
const edgeTarget = new Uint32Array(total);
|
|
86
|
+
const edgeCost = new Float32Array(total);
|
|
87
|
+
|
|
88
|
+
const cursor = new Uint32Array(nodeCount);
|
|
89
|
+
for (const edge of edges) {
|
|
90
|
+
const span = distance(points, edge.from, edge.to);
|
|
91
|
+
const cost = edge.cost ?? span;
|
|
92
|
+
if (!(cost >= span)) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`buildNavGraph: edge ${edge.from}->${edge.to} costs ${cost} over a span of ${span}. ` +
|
|
95
|
+
'A cost below the straight-line distance breaks the search heuristic and returns routes ' +
|
|
96
|
+
'that are not the cheapest, silently.',
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
write(edgeStart, cursor, edgeTarget, edgeCost, edge.from, edge.to, cost);
|
|
100
|
+
if (edge.bidirectional !== false) {
|
|
101
|
+
write(edgeStart, cursor, edgeTarget, edgeCost, edge.to, edge.from, cost);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return { positions: points, nodeCount, edgeStart, edgeTarget, edgeCost };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The node nearest a world position, or −1 for a graph with none in reach.
|
|
110
|
+
*
|
|
111
|
+
* **A linear scan, and the ceiling is stated rather than discovered.** A road network is hundreds
|
|
112
|
+
* of nodes and a scan over it is microseconds; a graph of tens of thousands wants a spatial index,
|
|
113
|
+
* and a consumer with one should keep their own and pass the answer to `navSearch` directly, which
|
|
114
|
+
* is why that function takes node indices and not positions.
|
|
115
|
+
*
|
|
116
|
+
* `maxDistance` is what stops an agent that has walked off the network being snapped onto the far
|
|
117
|
+
* side of the map. Absent means the nearest node however far away it is.
|
|
118
|
+
*/
|
|
119
|
+
export function nearestNavNode(
|
|
120
|
+
graph: NavGraph,
|
|
121
|
+
x: number,
|
|
122
|
+
y: number,
|
|
123
|
+
z: number,
|
|
124
|
+
maxDistance = Infinity,
|
|
125
|
+
): number {
|
|
126
|
+
let best = -1;
|
|
127
|
+
let bestSquared = maxDistance === Infinity ? Infinity : maxDistance * maxDistance;
|
|
128
|
+
for (let i = 0; i < graph.nodeCount; i++) {
|
|
129
|
+
const dx = (graph.positions[i * 3] ?? 0) - x;
|
|
130
|
+
const dy = (graph.positions[i * 3 + 1] ?? 0) - y;
|
|
131
|
+
const dz = (graph.positions[i * 3 + 2] ?? 0) - z;
|
|
132
|
+
const squared = dx * dx + dy * dy + dz * dz;
|
|
133
|
+
/* Strictly nearer, so an exact tie keeps the lower index and two runs agree. */
|
|
134
|
+
if (squared < bestSquared) {
|
|
135
|
+
bestSquared = squared;
|
|
136
|
+
best = i;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return best;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function check(node: number, count: number, which: string): void {
|
|
143
|
+
if (!Number.isInteger(node) || node < 0 || node >= count) {
|
|
144
|
+
throw new Error(`buildNavGraph: edge ${which} is ${node}, which is not a node of ${count}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function distance(points: Float32Array, a: number, b: number): number {
|
|
149
|
+
const dx = (points[a * 3] ?? 0) - (points[b * 3] ?? 0);
|
|
150
|
+
const dy = (points[a * 3 + 1] ?? 0) - (points[b * 3 + 1] ?? 0);
|
|
151
|
+
const dz = (points[a * 3 + 2] ?? 0) - (points[b * 3 + 2] ?? 0);
|
|
152
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function write(
|
|
156
|
+
edgeStart: Uint32Array,
|
|
157
|
+
cursor: Uint32Array,
|
|
158
|
+
edgeTarget: Uint32Array,
|
|
159
|
+
edgeCost: Float32Array,
|
|
160
|
+
from: number,
|
|
161
|
+
to: number,
|
|
162
|
+
cost: number,
|
|
163
|
+
): void {
|
|
164
|
+
const at = (edgeStart[from] ?? 0) + (cursor[from] ?? 0);
|
|
165
|
+
cursor[from] = (cursor[from] ?? 0) + 1;
|
|
166
|
+
edgeTarget[at] = to;
|
|
167
|
+
edgeCost[at] = cost;
|
|
168
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import type { NavGraph } from './navGraph.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Following a route, which is the half of navigation that is not the search.
|
|
5
|
+
*
|
|
6
|
+
* **A path is a list of nodes and an agent is not.** Between the two sits a set of decisions every
|
|
7
|
+
* consumer makes and none of them enjoys: when has a waypoint been reached, what happens when the
|
|
8
|
+
* agent is pushed off the line, what does the last waypoint mean, and — the one that is always got
|
|
9
|
+
* wrong first — what do you steer *at*. Steering at the next node makes an agent visibly zigzag
|
|
10
|
+
* between waypoints on a curved road; steering at a point a fixed distance ahead *along* the path
|
|
11
|
+
* makes it cut the corner smoothly, and that is what this returns.
|
|
12
|
+
*
|
|
13
|
+
* **It does not move anything.** It answers where to aim, in world units, and the caller applies
|
|
14
|
+
* their own speed, acceleration, turn rate and physics — which is the same boundary
|
|
15
|
+
* `CharacterController` and `groundMotor` draw, and for the same reason: how a thing moves is the
|
|
16
|
+
* game's, where it should go is the engine's.
|
|
17
|
+
*
|
|
18
|
+
* Nothing here allocates and nothing reads a clock.
|
|
19
|
+
*/
|
|
20
|
+
export interface NavSteer {
|
|
21
|
+
/** Where to aim, in world units. */
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
z: number;
|
|
25
|
+
/** How far along the path is left, following the line rather than as the crow flies. */
|
|
26
|
+
remainingM: number;
|
|
27
|
+
/** True once the agent is within `arriveM` of the final node. */
|
|
28
|
+
arrived: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createNavSteer(): NavSteer {
|
|
32
|
+
return { x: 0, y: 0, z: 0, remainingM: 0, arrived: false };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface NavPathOptions {
|
|
36
|
+
/**
|
|
37
|
+
* How far ahead along the path to aim, metres.
|
|
38
|
+
*
|
|
39
|
+
* **The one number that decides whether following looks like driving or like a wind-up toy.**
|
|
40
|
+
* Short and the agent snaps at each waypoint in turn; long and it cuts corners so hard it leaves
|
|
41
|
+
* the road. A useful value is a little more than the agent's turning radius, and the default of
|
|
42
|
+
* two metres suits somebody walking.
|
|
43
|
+
*/
|
|
44
|
+
readonly lookaheadM?: number;
|
|
45
|
+
/** Within this of the last node, the agent has arrived. Default half a metre. */
|
|
46
|
+
readonly arriveM?: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A route being walked: the nodes, and how far along them the agent is.
|
|
51
|
+
*
|
|
52
|
+
* **Progress is a distance along the path, not an index into it**, and that is what makes this
|
|
53
|
+
* survive an agent being shoved. An index only ever counts up when a waypoint is reached, so an
|
|
54
|
+
* agent knocked backwards past one keeps aiming at the waypoint behind it; a distance is recovered
|
|
55
|
+
* from the agent's own position every update, against the segment it is nearest to, so being pushed
|
|
56
|
+
* about costs progress and never correctness.
|
|
57
|
+
*/
|
|
58
|
+
export class NavPath {
|
|
59
|
+
private readonly graph: NavGraph;
|
|
60
|
+
private readonly lookaheadM: number;
|
|
61
|
+
private readonly arriveM: number;
|
|
62
|
+
/** Node indices of the route, and how many are live. */
|
|
63
|
+
private readonly nodes: Uint32Array;
|
|
64
|
+
private length = 0;
|
|
65
|
+
/** Cumulative distance to the start of each segment, so a lookahead is a lookup. */
|
|
66
|
+
private readonly distanceTo: Float64Array;
|
|
67
|
+
private total = 0;
|
|
68
|
+
/** Which segment the agent was on last update: where the search for the nearest one starts. */
|
|
69
|
+
private segment = 0;
|
|
70
|
+
|
|
71
|
+
constructor(graph: NavGraph, capacity: number, options: NavPathOptions = {}) {
|
|
72
|
+
if (!(capacity > 1)) throw new Error(`NavPath: capacity must be at least 2, got ${capacity}`);
|
|
73
|
+
this.graph = graph;
|
|
74
|
+
this.nodes = new Uint32Array(capacity);
|
|
75
|
+
this.distanceTo = new Float64Array(capacity);
|
|
76
|
+
this.lookaheadM = options.lookaheadM ?? 2;
|
|
77
|
+
this.arriveM = options.arriveM ?? 0.5;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get nodeCount(): number {
|
|
81
|
+
return this.length;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get lengthM(): number {
|
|
85
|
+
return this.total;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Whether there is a route to follow at all. */
|
|
89
|
+
get active(): boolean {
|
|
90
|
+
return this.length > 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Take a route, as `NavSearch.find` filled it.
|
|
95
|
+
*
|
|
96
|
+
* A route of one node is a route to where the agent already is, and is stored as no route: it
|
|
97
|
+
* has no direction to steer along and every caller would otherwise have to special-case it.
|
|
98
|
+
*/
|
|
99
|
+
set(path: Uint32Array, count: number): void {
|
|
100
|
+
this.length = 0;
|
|
101
|
+
this.total = 0;
|
|
102
|
+
this.segment = 0;
|
|
103
|
+
if (count < 2) return;
|
|
104
|
+
const usable = Math.min(count, this.nodes.length);
|
|
105
|
+
this.nodes.set(path.subarray(0, usable));
|
|
106
|
+
this.length = usable;
|
|
107
|
+
this.distanceTo[0] = 0;
|
|
108
|
+
for (let i = 1; i < usable; i++) {
|
|
109
|
+
this.total += this.span(i - 1, i);
|
|
110
|
+
this.distanceTo[i] = this.total;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
clear(): void {
|
|
115
|
+
this.length = 0;
|
|
116
|
+
this.total = 0;
|
|
117
|
+
this.segment = 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Where an agent at `(x, y, z)` should aim next.
|
|
122
|
+
*
|
|
123
|
+
* With no route, the agent is told to aim where it stands and that it has arrived, so a caller
|
|
124
|
+
* driving off `arrived` needs no separate check for having no path at all.
|
|
125
|
+
*/
|
|
126
|
+
steer(x: number, y: number, z: number, out: NavSteer): void {
|
|
127
|
+
if (this.length < 2) {
|
|
128
|
+
out.x = x;
|
|
129
|
+
out.y = y;
|
|
130
|
+
out.z = z;
|
|
131
|
+
out.remainingM = 0;
|
|
132
|
+
out.arrived = true;
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* Where the agent is, as a distance along the route. Searched over the whole path rather than
|
|
138
|
+
* forward from the last segment: an agent carried backwards — a lift, a shove, a vehicle it
|
|
139
|
+
* was standing on — is exactly the case a forward-only scan gets wrong, and a route is tens of
|
|
140
|
+
* nodes rather than thousands.
|
|
141
|
+
*/
|
|
142
|
+
let bestSquared = Infinity;
|
|
143
|
+
let travelled = 0;
|
|
144
|
+
for (let i = 0; i + 1 < this.length; i++) {
|
|
145
|
+
const along = this.project(i, x, y, z);
|
|
146
|
+
const squared = this.distanceSquaredTo(i, along, x, y, z);
|
|
147
|
+
if (squared < bestSquared) {
|
|
148
|
+
bestSquared = squared;
|
|
149
|
+
travelled = (this.distanceTo[i] ?? 0) + along;
|
|
150
|
+
this.segment = i;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const remaining = this.total - travelled;
|
|
155
|
+
out.remainingM = remaining > 0 ? remaining : 0;
|
|
156
|
+
out.arrived = remaining <= this.arriveM;
|
|
157
|
+
/* Aim ahead along the line, clamped to the end: near the goal the target is the goal, which is
|
|
158
|
+
what stops an agent overshooting it to satisfy a lookahead. */
|
|
159
|
+
this.pointAt(Math.min(travelled + this.lookaheadM, this.total), out);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** How far along segment `i` the point `(x, y, z)` projects, clamped to the segment. */
|
|
163
|
+
private project(i: number, x: number, y: number, z: number): number {
|
|
164
|
+
const ax = this.px(i);
|
|
165
|
+
const ay = this.py(i);
|
|
166
|
+
const az = this.pz(i);
|
|
167
|
+
const dx = this.px(i + 1) - ax;
|
|
168
|
+
const dy = this.py(i + 1) - ay;
|
|
169
|
+
const dz = this.pz(i + 1) - az;
|
|
170
|
+
const lengthSquared = dx * dx + dy * dy + dz * dz;
|
|
171
|
+
if (lengthSquared === 0) return 0;
|
|
172
|
+
let t = ((x - ax) * dx + (y - ay) * dy + (z - az) * dz) / lengthSquared;
|
|
173
|
+
if (t < 0) t = 0;
|
|
174
|
+
else if (t > 1) t = 1;
|
|
175
|
+
return t * Math.sqrt(lengthSquared);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private distanceSquaredTo(i: number, along: number, x: number, y: number, z: number): number {
|
|
179
|
+
const span = this.span(i, i + 1);
|
|
180
|
+
const t = span === 0 ? 0 : along / span;
|
|
181
|
+
const dx = this.px(i) + (this.px(i + 1) - this.px(i)) * t - x;
|
|
182
|
+
const dy = this.py(i) + (this.py(i + 1) - this.py(i)) * t - y;
|
|
183
|
+
const dz = this.pz(i) + (this.pz(i + 1) - this.pz(i)) * t - z;
|
|
184
|
+
return dx * dx + dy * dy + dz * dz;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** The world point a given distance along the route. */
|
|
188
|
+
private pointAt(distance: number, out: NavSteer): void {
|
|
189
|
+
let i = this.segment;
|
|
190
|
+
while (i + 2 < this.length && (this.distanceTo[i + 1] ?? 0) < distance) i++;
|
|
191
|
+
const base = this.distanceTo[i] ?? 0;
|
|
192
|
+
const span = this.span(i, i + 1);
|
|
193
|
+
const t = span === 0 ? 0 : Math.min(1, Math.max(0, (distance - base) / span));
|
|
194
|
+
out.x = this.px(i) + (this.px(i + 1) - this.px(i)) * t;
|
|
195
|
+
out.y = this.py(i) + (this.py(i + 1) - this.py(i)) * t;
|
|
196
|
+
out.z = this.pz(i) + (this.pz(i + 1) - this.pz(i)) * t;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private span(a: number, b: number): number {
|
|
200
|
+
const dx = this.px(b) - this.px(a);
|
|
201
|
+
const dy = this.py(b) - this.py(a);
|
|
202
|
+
const dz = this.pz(b) - this.pz(a);
|
|
203
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private px(i: number): number {
|
|
207
|
+
return this.graph.positions[(this.nodes[i] ?? 0) * 3] ?? 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private py(i: number): number {
|
|
211
|
+
return this.graph.positions[(this.nodes[i] ?? 0) * 3 + 1] ?? 0;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
private pz(i: number): number {
|
|
215
|
+
return this.graph.positions[(this.nodes[i] ?? 0) * 3 + 2] ?? 0;
|
|
216
|
+
}
|
|
217
|
+
}
|