@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,200 @@
|
|
|
1
|
+
import type { NavGraph } from './navGraph.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A* over a `NavGraph`, allocating nothing per query and answering the same route every time.
|
|
5
|
+
*
|
|
6
|
+
* **Reused rather than constructed per search**, because the scratch is proportional to the graph
|
|
7
|
+
* and a world with a dozen agents re-pathing on a schedule would otherwise allocate a dozen arrays
|
|
8
|
+
* the size of the map every time somebody changed their mind. One of these per thread of control;
|
|
9
|
+
* a search is not re-entrant and says so.
|
|
10
|
+
*
|
|
11
|
+
* **The route is a function of the graph and the two endpoints, and of nothing else.** Two runs, two
|
|
12
|
+
* machines, a replay: same nodes out. That takes more than avoiding randomness — a heap pops ties in
|
|
13
|
+
* whatever order it happens to hold them, and two equally good routes through a symmetric world are
|
|
14
|
+
* exactly the case a road network produces constantly. So ties break on the node index, which is
|
|
15
|
+
* arbitrary but *stable*, and the sequence is frozen the same way the engine's RNG is.
|
|
16
|
+
*
|
|
17
|
+
* **The heuristic is straight-line distance**, which is admissible precisely because
|
|
18
|
+
* `buildNavGraph` refuses an edge cheaper than its own span. That refusal is what makes the first
|
|
19
|
+
* route this returns the cheapest one rather than merely a good one, and it is why it is a build
|
|
20
|
+
* error rather than a note.
|
|
21
|
+
*/
|
|
22
|
+
export class NavSearch {
|
|
23
|
+
private readonly graph: NavGraph;
|
|
24
|
+
private readonly gScore: Float64Array;
|
|
25
|
+
private readonly fScore: Float64Array;
|
|
26
|
+
private readonly cameFrom: Int32Array;
|
|
27
|
+
/** 0 unseen, 1 open, 2 closed. */
|
|
28
|
+
private readonly state: Uint8Array;
|
|
29
|
+
/**
|
|
30
|
+
* A binary heap of node indices, ordered by `fScore` then by index.
|
|
31
|
+
*
|
|
32
|
+
* **Sized by edges and not by nodes**, from an argument rather than from a measurement: a push
|
|
33
|
+
* happens at most once per directed edge — a node goes on when it is first reached and again only
|
|
34
|
+
* when an edge improves it — so an array of that length cannot overflow. A node count is *not* a
|
|
35
|
+
* bound on that, and the failure it would allow is the quiet kind: a dropped push is not a slower
|
|
36
|
+
* search, it is a node marked open that nothing will ever pop, so a route that exists comes back
|
|
37
|
+
* as none.
|
|
38
|
+
*
|
|
39
|
+
* **No test here exhibits that**, and `nav.test.ts` says so where the dense graph is: occupancy
|
|
40
|
+
* in practice sits far below either bound, so a graph that could tell the two sizings apart is
|
|
41
|
+
* larger than a suite should carry. The argument is what the sizing rests on and the guard in
|
|
42
|
+
* `push` is what stands behind the argument.
|
|
43
|
+
*/
|
|
44
|
+
private readonly heap: Uint32Array;
|
|
45
|
+
private heapSize = 0;
|
|
46
|
+
/** How many nodes the last search took off the heap. Useful for a budget, and for a test. */
|
|
47
|
+
private lastExpanded = 0;
|
|
48
|
+
|
|
49
|
+
constructor(graph: NavGraph) {
|
|
50
|
+
this.graph = graph;
|
|
51
|
+
this.gScore = new Float64Array(graph.nodeCount);
|
|
52
|
+
this.fScore = new Float64Array(graph.nodeCount);
|
|
53
|
+
this.cameFrom = new Int32Array(graph.nodeCount);
|
|
54
|
+
this.state = new Uint8Array(graph.nodeCount);
|
|
55
|
+
this.heap = new Uint32Array(graph.edgeTarget.length + 1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Nodes taken off the heap by the last `find`. */
|
|
59
|
+
get expanded(): number {
|
|
60
|
+
return this.lastExpanded;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Fill `outPath` with the node indices from `from` to `to`, and return how many there are.
|
|
65
|
+
*
|
|
66
|
+
* Zero means there is no route, which is a real answer and not an error: a road network with a
|
|
67
|
+
* bridge out is a graph with two components, and an agent that asks for the other side has to be
|
|
68
|
+
* told rather than thrown at inside a frame.
|
|
69
|
+
*
|
|
70
|
+
* A path longer than `outPath` is refused by returning zero rather than by writing a prefix,
|
|
71
|
+
* because half a route is worse than none — an agent would follow it confidently into the middle
|
|
72
|
+
* of nowhere and stop.
|
|
73
|
+
*/
|
|
74
|
+
find(from: number, to: number, outPath: Uint32Array): number {
|
|
75
|
+
const { graph } = this;
|
|
76
|
+
if (from < 0 || from >= graph.nodeCount || to < 0 || to >= graph.nodeCount) return 0;
|
|
77
|
+
this.state.fill(0);
|
|
78
|
+
this.heapSize = 0;
|
|
79
|
+
this.lastExpanded = 0;
|
|
80
|
+
|
|
81
|
+
this.gScore[from] = 0;
|
|
82
|
+
this.fScore[from] = this.straightLine(from, to);
|
|
83
|
+
this.cameFrom[from] = -1;
|
|
84
|
+
this.state[from] = 1;
|
|
85
|
+
this.push(from);
|
|
86
|
+
|
|
87
|
+
while (this.heapSize > 0) {
|
|
88
|
+
const current = this.pop();
|
|
89
|
+
if (current === to) return this.unwind(from, to, outPath);
|
|
90
|
+
/* A duplicate of a node already expanded, left behind by pushing instead of decreasing a
|
|
91
|
+
key. Its cost is already final, so re-walking its edges would find nothing. */
|
|
92
|
+
if (this.state[current] === 2) continue;
|
|
93
|
+
this.state[current] = 2;
|
|
94
|
+
this.lastExpanded++;
|
|
95
|
+
|
|
96
|
+
const end = graph.edgeStart[current + 1] ?? 0;
|
|
97
|
+
for (let e = graph.edgeStart[current] ?? 0; e < end; e++) {
|
|
98
|
+
const next = graph.edgeTarget[e] ?? 0;
|
|
99
|
+
if (this.state[next] === 2) continue;
|
|
100
|
+
const tentative = (this.gScore[current] ?? 0) + (graph.edgeCost[e] ?? 0);
|
|
101
|
+
if (this.state[next] === 1 && tentative >= (this.gScore[next] ?? 0)) continue;
|
|
102
|
+
this.gScore[next] = tentative;
|
|
103
|
+
this.fScore[next] = tentative + this.straightLine(next, to);
|
|
104
|
+
this.cameFrom[next] = current;
|
|
105
|
+
/*
|
|
106
|
+
* Pushed again rather than decreased in place. A decrease-key needs every node's position
|
|
107
|
+
* in the heap maintained on every swap, which is a second array and a write per sift step
|
|
108
|
+
* for a graph where a node is rarely improved twice; the duplicate is popped later, found
|
|
109
|
+
* closed, and skipped. The heap is sized for that: a node can be open once per edge into
|
|
110
|
+
* it, and the loop below tolerates a full heap by dropping the worse copy.
|
|
111
|
+
*/
|
|
112
|
+
this.state[next] = 1;
|
|
113
|
+
this.push(next);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Straight-line distance, the heuristic.
|
|
121
|
+
*
|
|
122
|
+
* Never an overestimate, because no edge may cost less than its own span — `buildNavGraph`
|
|
123
|
+
* enforces it — so the first time the goal comes off the heap its cost is final.
|
|
124
|
+
*/
|
|
125
|
+
private straightLine(a: number, b: number): number {
|
|
126
|
+
const p = this.graph.positions;
|
|
127
|
+
const dx = (p[a * 3] ?? 0) - (p[b * 3] ?? 0);
|
|
128
|
+
const dy = (p[a * 3 + 1] ?? 0) - (p[b * 3 + 1] ?? 0);
|
|
129
|
+
const dz = (p[a * 3 + 2] ?? 0) - (p[b * 3 + 2] ?? 0);
|
|
130
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Walk `cameFrom` back from the goal, then reverse it in place. */
|
|
134
|
+
private unwind(from: number, to: number, outPath: Uint32Array): number {
|
|
135
|
+
let length = 0;
|
|
136
|
+
for (let node = to; node !== -1; node = this.cameFrom[node] ?? -1) {
|
|
137
|
+
if (length >= outPath.length) return 0;
|
|
138
|
+
outPath[length++] = node;
|
|
139
|
+
if (node === from) break;
|
|
140
|
+
}
|
|
141
|
+
for (let i = 0, j = length - 1; i < j; i++, j--) {
|
|
142
|
+
const swap = outPath[i] ?? 0;
|
|
143
|
+
outPath[i] = outPath[j] ?? 0;
|
|
144
|
+
outPath[j] = swap;
|
|
145
|
+
}
|
|
146
|
+
return length;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private better(a: number, b: number): boolean {
|
|
150
|
+
const fa = this.fScore[a] ?? 0;
|
|
151
|
+
const fb = this.fScore[b] ?? 0;
|
|
152
|
+
if (fa !== fb) return fa < fb;
|
|
153
|
+
/* The tie-break that makes a route reproducible. See the class note. */
|
|
154
|
+
return a < b;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private push(node: number): void {
|
|
158
|
+
/*
|
|
159
|
+
* Unreachable with the heap sized by edges above, and kept because the alternative to a guard
|
|
160
|
+
* here is writing past the end of the array in a frame. If it ever fires, the sizing argument
|
|
161
|
+
* is wrong and a route will be missed rather than a crash reported — which is why the sizing
|
|
162
|
+
* argument is written out where the array is declared.
|
|
163
|
+
*/
|
|
164
|
+
if (this.heapSize >= this.heap.length) return;
|
|
165
|
+
let at = this.heapSize++;
|
|
166
|
+
this.heap[at] = node;
|
|
167
|
+
while (at > 0) {
|
|
168
|
+
const parent = (at - 1) >> 1;
|
|
169
|
+
if (!this.better(this.heap[at] ?? 0, this.heap[parent] ?? 0)) break;
|
|
170
|
+
const swap = this.heap[at] ?? 0;
|
|
171
|
+
this.heap[at] = this.heap[parent] ?? 0;
|
|
172
|
+
this.heap[parent] = swap;
|
|
173
|
+
at = parent;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private pop(): number {
|
|
178
|
+
const top = this.heap[0] ?? 0;
|
|
179
|
+
this.heapSize--;
|
|
180
|
+
if (this.heapSize > 0) {
|
|
181
|
+
this.heap[0] = this.heap[this.heapSize] ?? 0;
|
|
182
|
+
let at = 0;
|
|
183
|
+
for (;;) {
|
|
184
|
+
const left = at * 2 + 1;
|
|
185
|
+
const right = left + 1;
|
|
186
|
+
let best = at;
|
|
187
|
+
if (left < this.heapSize && this.better(this.heap[left] ?? 0, this.heap[best] ?? 0))
|
|
188
|
+
best = left;
|
|
189
|
+
if (right < this.heapSize && this.better(this.heap[right] ?? 0, this.heap[best] ?? 0))
|
|
190
|
+
best = right;
|
|
191
|
+
if (best === at) break;
|
|
192
|
+
const swap = this.heap[at] ?? 0;
|
|
193
|
+
this.heap[at] = this.heap[best] ?? 0;
|
|
194
|
+
this.heap[best] = swap;
|
|
195
|
+
at = best;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return top;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { GroundSurface, SurfaceHit } from './ribbonSurface.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The tops of a set of flat, axis-aligned pads, answering as a ground surface.
|
|
5
|
+
*
|
|
6
|
+
* For the parts of a route that are *platforms* rather than ribbon — a flight of
|
|
7
|
+
* steps, a run of pads with gaps between them. Those are still the route, and
|
|
8
|
+
* that is the whole reason this exists rather than letting the collision boxes
|
|
9
|
+
* carry them: a character on ordinary geometry is off the route as far as anything
|
|
10
|
+
* asking the surface is concerned, and the route is what decides top speed, what
|
|
11
|
+
* the camera leans on, and how far along the run somebody is.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately flat. A pad is an AABB, its top is level, and pretending
|
|
14
|
+
* otherwise would mean inventing a normal that the collider it shares a shape
|
|
15
|
+
* with does not have.
|
|
16
|
+
*/
|
|
17
|
+
export interface SurfaceBox {
|
|
18
|
+
minX: number;
|
|
19
|
+
maxX: number;
|
|
20
|
+
minZ: number;
|
|
21
|
+
maxZ: number;
|
|
22
|
+
/** Height of the walkable face. */
|
|
23
|
+
topY: number;
|
|
24
|
+
/** How far along the route this pad sits, metres. */
|
|
25
|
+
distanceM: number;
|
|
26
|
+
/** Direction of travel across it, for the camera and the pose. */
|
|
27
|
+
tangentX: number;
|
|
28
|
+
tangentZ: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class BoxSurface implements GroundSurface {
|
|
32
|
+
constructor(private readonly boxes: readonly SurfaceBox[]) {}
|
|
33
|
+
|
|
34
|
+
get count(): number {
|
|
35
|
+
return this.boxes.length;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The highest pad whose footprint contains the column.
|
|
40
|
+
*
|
|
41
|
+
* Highest rather than nearest, because pads never overlap in a way where the
|
|
42
|
+
* lower one is the answer — a flight of steps is monotone — and "highest"
|
|
43
|
+
* needs no reference height, which keeps this usable from a plain
|
|
44
|
+
* `GroundSurface` call.
|
|
45
|
+
*
|
|
46
|
+
* A linear scan: a day's route carries a few dozen pads, and a scan over
|
|
47
|
+
* thirty boxes inside a fixed tick costs less than the branch needed to skip
|
|
48
|
+
* it. Allocation-free either way.
|
|
49
|
+
*/
|
|
50
|
+
sample(x: number, z: number, out: SurfaceHit, atY = Infinity): boolean {
|
|
51
|
+
let best: SurfaceBox | null = null;
|
|
52
|
+
for (const box of this.boxes) {
|
|
53
|
+
if (x < box.minX || x > box.maxX || z < box.minZ || z > box.maxZ) continue;
|
|
54
|
+
// Highest pad at or below the asker, so a run of pads under a flyover
|
|
55
|
+
// does not hand a character the deck above them.
|
|
56
|
+
if (box.topY > atY + 1.2) continue;
|
|
57
|
+
if (best === null || box.topY > best.topY) best = box;
|
|
58
|
+
}
|
|
59
|
+
if (best === null) return false;
|
|
60
|
+
describe(best, out);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** See `GroundSurface.sampleBand`: the highest pad whose top is in the band. */
|
|
65
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean {
|
|
66
|
+
let best: SurfaceBox | null = null;
|
|
67
|
+
for (const box of this.boxes) {
|
|
68
|
+
if (x < box.minX || x > box.maxX || z < box.minZ || z > box.maxZ) continue;
|
|
69
|
+
if (box.topY < loY || box.topY >= hiY) continue;
|
|
70
|
+
if (best === null || box.topY > best.topY) best = box;
|
|
71
|
+
}
|
|
72
|
+
if (best === null) return false;
|
|
73
|
+
describe(best, out);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function describe(box: SurfaceBox, out: SurfaceHit): void {
|
|
79
|
+
out.y = box.topY;
|
|
80
|
+
out.normalX = 0;
|
|
81
|
+
out.normalY = 1;
|
|
82
|
+
// A lid is flat, so it looks exactly as it collides. See `SurfaceHit.tilt`.
|
|
83
|
+
out.tiltX = 0;
|
|
84
|
+
out.tiltY = 1;
|
|
85
|
+
out.tiltZ = 0;
|
|
86
|
+
out.normalZ = 0;
|
|
87
|
+
out.tangentX = box.tangentX;
|
|
88
|
+
out.tangentY = 0;
|
|
89
|
+
out.tangentZ = box.tangentZ;
|
|
90
|
+
out.distanceM = box.distanceM;
|
|
91
|
+
out.lateralM = 0;
|
|
92
|
+
// Half the smaller footprint axis: the honest answer to "how much room is
|
|
93
|
+
// left", which is what a caller uses it for.
|
|
94
|
+
out.halfWidthM = Math.min(box.maxX - box.minX, box.maxZ - box.minZ) * 0.5;
|
|
95
|
+
out.bankRad = 0;
|
|
96
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { Collider, ColliderSet } from '@driftengine/physics';
|
|
2
|
+
import { ColliderSet as ColliderSetClass } from '@driftengine/physics';
|
|
3
|
+
|
|
4
|
+
import type { GroundSurface, SurfaceHit } from './ribbonSurface.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A `ColliderSet` answering "where is the ground here?", so a solid holds a body up.
|
|
8
|
+
*
|
|
9
|
+
* **Because a collider was solid to walk into and not to stand on.** The kinematic sweep resolves a
|
|
10
|
+
* body against a collider set laterally, and `CharacterController` senses ground through
|
|
11
|
+
* `PhysicsWorld` bodies and through a `GroundSurface` — a collider set is neither, so nothing ever
|
|
12
|
+
* asked it what was under your feet. Measured before this existed: a character dropped over a
|
|
13
|
+
* `ColliderSet` slab whose top face is at 5.5 m falls to −84 m in three seconds, which is exactly
|
|
14
|
+
* what it does with no slab at all.
|
|
15
|
+
*
|
|
16
|
+
* Reported by a consumer building flyovers, who could express a sloped deck as a hull already and
|
|
17
|
+
* found that standing on one did not hold them up. The alternative available to them was to add
|
|
18
|
+
* every deck to a `PhysicsWorld` as a static body as well — the same geometry twice, in two
|
|
19
|
+
* structures that can disagree.
|
|
20
|
+
*
|
|
21
|
+
* **It is a `GroundSurface` and not a new seam, which is what makes it worth having.** Everything
|
|
22
|
+
* that stands on ground already takes one: the character controller, the raycast vehicle, the
|
|
23
|
+
* third-person camera boom, the rain field. And because `heightSurface` takes a list of surfaces,
|
|
24
|
+
* a world can be terrain *and* slabs without either knowing about the other:
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const ground = new CompositeSurface([
|
|
28
|
+
* heightSurface((x, z) => terrainAt(x, z)),
|
|
29
|
+
* colliderSurface(decks, { minY: -10, maxY: 60 }),
|
|
30
|
+
* ]);
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* **What it is not.** It is not a replacement for the sweep: the sweep is what stops a body walking
|
|
34
|
+
* *into* a collider, and this is what stops it falling *through* one. A consumer wants both, and
|
|
35
|
+
* they read the same set.
|
|
36
|
+
*/
|
|
37
|
+
export interface ColliderSurfaceOptions {
|
|
38
|
+
/**
|
|
39
|
+
* The vertical extent to look through, metres.
|
|
40
|
+
*
|
|
41
|
+
* **Required, and guessing would be worse than asking.** A ground query is a column, and the
|
|
42
|
+
* spatial hash walks every cell in it — an unbounded column over a 4 m grid is half a million
|
|
43
|
+
* cells and a frozen frame. A consumer knows how tall their world is; the engine does not, and a
|
|
44
|
+
* default would be wrong quietly.
|
|
45
|
+
*/
|
|
46
|
+
readonly minY: number;
|
|
47
|
+
readonly maxY: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** How much a face above the asker is penalised when two are equally near. */
|
|
51
|
+
const TIE_BREAK = 0.4;
|
|
52
|
+
/** Below this a face is treated as vertical: a wall, which is not something to stand on. */
|
|
53
|
+
const VERTICAL_EPSILON = 1e-6;
|
|
54
|
+
/** The column has a width, because a query with none falls between two cells of the hash. */
|
|
55
|
+
const COLUMN_EPSILON = 1e-4;
|
|
56
|
+
|
|
57
|
+
export function colliderSurface(set: ColliderSet, options: ColliderSurfaceOptions): GroundSurface {
|
|
58
|
+
const { minY, maxY } = options;
|
|
59
|
+
if (!(maxY > minY)) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`colliderSurface: maxY must be above minY, got minY=${minY} maxY=${maxY}. This is the ` +
|
|
62
|
+
'vertical extent the column search walks, and an empty one finds no ground anywhere.',
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Allocation-free: a ground query runs every tick for everything that stands on something. */
|
|
67
|
+
const found = new Int32Array(ColliderSetClass.MAX_HITS);
|
|
68
|
+
const box: Collider = { minX: 0, minY: 0, minZ: 0, maxX: 0, maxY: 0, maxZ: 0 };
|
|
69
|
+
const top = { y: 0, nx: 0, ny: 1, nz: 0 };
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The highest surface of collider `index` in this column, or false where the column misses it.
|
|
73
|
+
*
|
|
74
|
+
* **A shaped collider is solved against its own face planes, not its box.** The box is the broad
|
|
75
|
+
* phase; treating it as the answer is what would put a body standing on thin air over the corner
|
|
76
|
+
* of every ramp, which is the same mistake the segment query documents having made. For a convex
|
|
77
|
+
* solid the vertical line at `(x, z)` enters through the downward-facing planes and leaves
|
|
78
|
+
* through the upward-facing ones, so the exit is the lowest of the upward ones and the entry is
|
|
79
|
+
* the highest of the downward ones — and the column misses the solid entirely when the exit is
|
|
80
|
+
* below the entry.
|
|
81
|
+
*/
|
|
82
|
+
const columnTop = (index: number, x: number, z: number): boolean => {
|
|
83
|
+
set.bounds(index, box);
|
|
84
|
+
if (x < box.minX || x > box.maxX || z < box.minZ || z > box.maxZ) return false;
|
|
85
|
+
|
|
86
|
+
const shape = set.shapeAt(index);
|
|
87
|
+
const planes = shape?.facePlanes;
|
|
88
|
+
if (shape === undefined || planes === undefined || planes.length < 16) {
|
|
89
|
+
/* A collider that is its box: the lid is flat and its normal is up. */
|
|
90
|
+
top.y = box.maxY;
|
|
91
|
+
top.nx = 0;
|
|
92
|
+
top.ny = 1;
|
|
93
|
+
top.nz = 0;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let exit = Infinity;
|
|
98
|
+
let entry = -Infinity;
|
|
99
|
+
let nx = 0;
|
|
100
|
+
let ny = 1;
|
|
101
|
+
let nz = 0;
|
|
102
|
+
for (let p = 0; p < planes.length; p += 4) {
|
|
103
|
+
const pnx = planes[p] as number;
|
|
104
|
+
const pny = planes[p + 1] as number;
|
|
105
|
+
const pnz = planes[p + 2] as number;
|
|
106
|
+
const d = planes[p + 3] as number;
|
|
107
|
+
const lateral = pnx * x + pnz * z;
|
|
108
|
+
if (pny > -VERTICAL_EPSILON && pny < VERTICAL_EPSILON) {
|
|
109
|
+
/* A vertical face bounds the column rather than the height: outside it, there is no solid
|
|
110
|
+
over this point at any height. */
|
|
111
|
+
if (lateral > d) return false;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const y = (d - lateral) / pny;
|
|
115
|
+
if (pny > 0) {
|
|
116
|
+
if (y < exit) {
|
|
117
|
+
exit = y;
|
|
118
|
+
nx = pnx;
|
|
119
|
+
ny = pny;
|
|
120
|
+
nz = pnz;
|
|
121
|
+
}
|
|
122
|
+
} else if (y > entry) {
|
|
123
|
+
entry = y;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!Number.isFinite(exit) || exit < entry) return false;
|
|
127
|
+
|
|
128
|
+
/* Rounding grows the solid outward along the face normal, so the lid rises by it. `sideRadius`
|
|
129
|
+
grows a cylinder's side and not its caps, which is why only `radius` is here. */
|
|
130
|
+
top.y = exit + shape.radius;
|
|
131
|
+
top.nx = nx;
|
|
132
|
+
top.ny = ny;
|
|
133
|
+
top.nz = nz;
|
|
134
|
+
return true;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const fill = (out: SurfaceHit): void => {
|
|
138
|
+
out.y = top.y;
|
|
139
|
+
out.normalX = top.nx;
|
|
140
|
+
out.normalY = top.ny;
|
|
141
|
+
out.normalZ = top.nz;
|
|
142
|
+
/* A solid has no route, so the fields that describe one say nothing rather than something
|
|
143
|
+
invented. `tilt` follows the face, for the reason `heightSurface` gives: the surface collides
|
|
144
|
+
exactly as it looks. */
|
|
145
|
+
out.tiltX = top.nx;
|
|
146
|
+
out.tiltY = top.ny;
|
|
147
|
+
out.tiltZ = top.nz;
|
|
148
|
+
out.tangentX = 1;
|
|
149
|
+
out.tangentY = 0;
|
|
150
|
+
out.tangentZ = 0;
|
|
151
|
+
out.distanceM = 0;
|
|
152
|
+
out.lateralM = 0;
|
|
153
|
+
out.bankRad = 0;
|
|
154
|
+
out.halfWidthM = Infinity;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
/**
|
|
159
|
+
* The face nearest the asker's feet, ties broken toward the one below.
|
|
160
|
+
*
|
|
161
|
+
* The same rule `CompositeSurface` uses between its parts and `RibbonSurface` between its own
|
|
162
|
+
* passes, and for the same reason: what you are standing on is the thing under your feet, and
|
|
163
|
+
* "highest wins" teleports a body under a deck up onto it.
|
|
164
|
+
*/
|
|
165
|
+
sample(x: number, z: number, out: SurfaceHit, atY = Infinity): boolean {
|
|
166
|
+
const count = set.query(
|
|
167
|
+
x - COLUMN_EPSILON,
|
|
168
|
+
minY,
|
|
169
|
+
z - COLUMN_EPSILON,
|
|
170
|
+
x + COLUMN_EPSILON,
|
|
171
|
+
maxY,
|
|
172
|
+
z + COLUMN_EPSILON,
|
|
173
|
+
found,
|
|
174
|
+
);
|
|
175
|
+
const located = Number.isFinite(atY);
|
|
176
|
+
let best = Infinity;
|
|
177
|
+
let hit = false;
|
|
178
|
+
for (let i = 0; i < count; i++) {
|
|
179
|
+
if (!columnTop(found[i] as number, x, z)) continue;
|
|
180
|
+
const score = located ? Math.abs(top.y - atY) + (top.y > atY ? TIE_BREAK : 0) : -top.y;
|
|
181
|
+
if (score >= best) continue;
|
|
182
|
+
best = score;
|
|
183
|
+
fill(out);
|
|
184
|
+
hit = true;
|
|
185
|
+
}
|
|
186
|
+
return hit;
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
/** See `GroundSurface.sampleBand`: the highest face in the band, and nothing outside it. */
|
|
190
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean {
|
|
191
|
+
const count = set.query(
|
|
192
|
+
x - COLUMN_EPSILON,
|
|
193
|
+
Math.max(minY, loY),
|
|
194
|
+
z - COLUMN_EPSILON,
|
|
195
|
+
x + COLUMN_EPSILON,
|
|
196
|
+
Math.min(maxY, hiY),
|
|
197
|
+
z + COLUMN_EPSILON,
|
|
198
|
+
found,
|
|
199
|
+
);
|
|
200
|
+
let bestY = -Infinity;
|
|
201
|
+
let hit = false;
|
|
202
|
+
for (let i = 0; i < count; i++) {
|
|
203
|
+
if (!columnTop(found[i] as number, x, z)) continue;
|
|
204
|
+
/* Half-open, as the interface says: a face at head height is one a body passes under. */
|
|
205
|
+
if (top.y < loY || top.y >= hiY || top.y <= bestY) continue;
|
|
206
|
+
bestY = top.y;
|
|
207
|
+
fill(out);
|
|
208
|
+
hit = true;
|
|
209
|
+
}
|
|
210
|
+
return hit;
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createSurfaceHit } from './ribbonSurface.ts';
|
|
2
|
+
import type { GroundSurface, SurfaceHit } from './ribbonSurface.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Several surfaces answering as one.
|
|
6
|
+
*
|
|
7
|
+
* A route that forks has two floors in the same column, and a query has to pick
|
|
8
|
+
* one. It picks the **highest surface at or below the asking height**, which is
|
|
9
|
+
* the same rule a lift shaft or a flyover needs: what you are standing on is
|
|
10
|
+
* the nearest thing under your feet, not the nearest thing full stop.
|
|
11
|
+
*
|
|
12
|
+
* Falling back to the highest surface overall when nothing is below keeps a
|
|
13
|
+
* character who has dropped beneath everything from reporting no ground at all —
|
|
14
|
+
* they are still over the track, just under it, and the caller decides what
|
|
15
|
+
* that means.
|
|
16
|
+
*/
|
|
17
|
+
/** How much a surface above the asker is penalised when two are equally near. */
|
|
18
|
+
const TIE_BREAK = 0.4;
|
|
19
|
+
|
|
20
|
+
export class CompositeSurface implements GroundSurface {
|
|
21
|
+
private readonly candidate = createSurfaceHit();
|
|
22
|
+
|
|
23
|
+
constructor(private readonly surfaces: readonly GroundSurface[]) {}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The floors this is made of.
|
|
27
|
+
*
|
|
28
|
+
* Exposed because "two of my floors are in the same column" is a question only
|
|
29
|
+
* the parts can answer, and it is one a consumer has to be able to ask. Two
|
|
30
|
+
* walkable surfaces overlapping with millimetres between them is invisible to
|
|
31
|
+
* every gameplay check — `sample` picks one and both readings look sane — while
|
|
32
|
+
* on screen the depth buffer cannot separate them and the pair flickers against
|
|
33
|
+
* each other as the camera turns. Composed, that information is gone.
|
|
34
|
+
*/
|
|
35
|
+
get parts(): readonly GroundSurface[] {
|
|
36
|
+
return this.surfaces;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Ask every part and keep the best answer.
|
|
41
|
+
*
|
|
42
|
+
* `atY` is what makes this correct rather than arbitrary. Without a reference
|
|
43
|
+
* height the only available rule is "highest wins", which teleports a character
|
|
44
|
+
* on the low line of a split up onto the high one the moment the two overlap.
|
|
45
|
+
*/
|
|
46
|
+
sample(x: number, z: number, out: SurfaceHit, atY = Infinity): boolean {
|
|
47
|
+
// See `RibbonSurface`: without a height to measure from, the highest wins.
|
|
48
|
+
const located = Number.isFinite(atY);
|
|
49
|
+
let best = Infinity;
|
|
50
|
+
let found = false;
|
|
51
|
+
|
|
52
|
+
for (const part of this.surfaces) {
|
|
53
|
+
if (!part.sample(x, z, this.candidate, atY)) continue;
|
|
54
|
+
/*
|
|
55
|
+
* Nearest to the asker's height, ties broken toward the surface below.
|
|
56
|
+
*
|
|
57
|
+
* The same rule `RibbonSurface` uses between its own passes, and for the
|
|
58
|
+
* same reason: "highest at or below" is written for a flyover and wrong for
|
|
59
|
+
* two decks at similar heights, where it can hand a character a surface just
|
|
60
|
+
* far enough beneath their feet that they cannot snap to it and fall
|
|
61
|
+
* through ground that is directly under them.
|
|
62
|
+
*/
|
|
63
|
+
const score = located
|
|
64
|
+
? Math.abs(this.candidate.y - atY) + (this.candidate.y > atY ? TIE_BREAK : 0)
|
|
65
|
+
: -this.candidate.y;
|
|
66
|
+
if (score < best) {
|
|
67
|
+
best = score;
|
|
68
|
+
copyHit(this.candidate, out);
|
|
69
|
+
found = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return found;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* See `GroundSurface.sampleBand`: the highest floor any part puts in the band.
|
|
77
|
+
*
|
|
78
|
+
* The one query where composing surfaces costs nothing in fidelity — a band is
|
|
79
|
+
* a filter, so asking every part and keeping the highest answer is the same
|
|
80
|
+
* answer a single surface holding all of them would give.
|
|
81
|
+
*/
|
|
82
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean {
|
|
83
|
+
let bestY = -Infinity;
|
|
84
|
+
let found = false;
|
|
85
|
+
for (const part of this.surfaces) {
|
|
86
|
+
if (!part.sampleBand(x, z, this.candidate, loY, hiY)) continue;
|
|
87
|
+
if (this.candidate.y <= bestY) continue;
|
|
88
|
+
bestY = this.candidate.y;
|
|
89
|
+
copyHit(this.candidate, out);
|
|
90
|
+
found = true;
|
|
91
|
+
}
|
|
92
|
+
return found;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function copyHit(from: SurfaceHit, to: SurfaceHit): void {
|
|
97
|
+
to.y = from.y;
|
|
98
|
+
to.normalX = from.normalX;
|
|
99
|
+
to.normalY = from.normalY;
|
|
100
|
+
to.normalZ = from.normalZ;
|
|
101
|
+
to.tangentX = from.tangentX;
|
|
102
|
+
to.tangentY = from.tangentY;
|
|
103
|
+
to.tangentZ = from.tangentZ;
|
|
104
|
+
to.distanceM = from.distanceM;
|
|
105
|
+
to.lateralM = from.lateralM;
|
|
106
|
+
to.halfWidthM = from.halfWidthM;
|
|
107
|
+
to.bankRad = from.bankRad;
|
|
108
|
+
to.tiltX = from.tiltX;
|
|
109
|
+
to.tiltY = from.tiltY;
|
|
110
|
+
to.tiltZ = from.tiltZ;
|
|
111
|
+
}
|