@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,146 @@
|
|
|
1
|
+
import { ColliderSet as ColliderSetClass } from '@driftengine/physics';
|
|
2
|
+
/** How much a face above the asker is penalised when two are equally near. */
|
|
3
|
+
const TIE_BREAK = 0.4;
|
|
4
|
+
/** Below this a face is treated as vertical: a wall, which is not something to stand on. */
|
|
5
|
+
const VERTICAL_EPSILON = 1e-6;
|
|
6
|
+
/** The column has a width, because a query with none falls between two cells of the hash. */
|
|
7
|
+
const COLUMN_EPSILON = 1e-4;
|
|
8
|
+
export function colliderSurface(set, options) {
|
|
9
|
+
const { minY, maxY } = options;
|
|
10
|
+
if (!(maxY > minY)) {
|
|
11
|
+
throw new Error(`colliderSurface: maxY must be above minY, got minY=${minY} maxY=${maxY}. This is the ` +
|
|
12
|
+
'vertical extent the column search walks, and an empty one finds no ground anywhere.');
|
|
13
|
+
}
|
|
14
|
+
/* Allocation-free: a ground query runs every tick for everything that stands on something. */
|
|
15
|
+
const found = new Int32Array(ColliderSetClass.MAX_HITS);
|
|
16
|
+
const box = { minX: 0, minY: 0, minZ: 0, maxX: 0, maxY: 0, maxZ: 0 };
|
|
17
|
+
const top = { y: 0, nx: 0, ny: 1, nz: 0 };
|
|
18
|
+
/**
|
|
19
|
+
* The highest surface of collider `index` in this column, or false where the column misses it.
|
|
20
|
+
*
|
|
21
|
+
* **A shaped collider is solved against its own face planes, not its box.** The box is the broad
|
|
22
|
+
* phase; treating it as the answer is what would put a body standing on thin air over the corner
|
|
23
|
+
* of every ramp, which is the same mistake the segment query documents having made. For a convex
|
|
24
|
+
* solid the vertical line at `(x, z)` enters through the downward-facing planes and leaves
|
|
25
|
+
* through the upward-facing ones, so the exit is the lowest of the upward ones and the entry is
|
|
26
|
+
* the highest of the downward ones — and the column misses the solid entirely when the exit is
|
|
27
|
+
* below the entry.
|
|
28
|
+
*/
|
|
29
|
+
const columnTop = (index, x, z) => {
|
|
30
|
+
set.bounds(index, box);
|
|
31
|
+
if (x < box.minX || x > box.maxX || z < box.minZ || z > box.maxZ)
|
|
32
|
+
return false;
|
|
33
|
+
const shape = set.shapeAt(index);
|
|
34
|
+
const planes = shape?.facePlanes;
|
|
35
|
+
if (shape === undefined || planes === undefined || planes.length < 16) {
|
|
36
|
+
/* A collider that is its box: the lid is flat and its normal is up. */
|
|
37
|
+
top.y = box.maxY;
|
|
38
|
+
top.nx = 0;
|
|
39
|
+
top.ny = 1;
|
|
40
|
+
top.nz = 0;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
let exit = Infinity;
|
|
44
|
+
let entry = -Infinity;
|
|
45
|
+
let nx = 0;
|
|
46
|
+
let ny = 1;
|
|
47
|
+
let nz = 0;
|
|
48
|
+
for (let p = 0; p < planes.length; p += 4) {
|
|
49
|
+
const pnx = planes[p];
|
|
50
|
+
const pny = planes[p + 1];
|
|
51
|
+
const pnz = planes[p + 2];
|
|
52
|
+
const d = planes[p + 3];
|
|
53
|
+
const lateral = pnx * x + pnz * z;
|
|
54
|
+
if (pny > -VERTICAL_EPSILON && pny < VERTICAL_EPSILON) {
|
|
55
|
+
/* A vertical face bounds the column rather than the height: outside it, there is no solid
|
|
56
|
+
over this point at any height. */
|
|
57
|
+
if (lateral > d)
|
|
58
|
+
return false;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const y = (d - lateral) / pny;
|
|
62
|
+
if (pny > 0) {
|
|
63
|
+
if (y < exit) {
|
|
64
|
+
exit = y;
|
|
65
|
+
nx = pnx;
|
|
66
|
+
ny = pny;
|
|
67
|
+
nz = pnz;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (y > entry) {
|
|
71
|
+
entry = y;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!Number.isFinite(exit) || exit < entry)
|
|
75
|
+
return false;
|
|
76
|
+
/* Rounding grows the solid outward along the face normal, so the lid rises by it. `sideRadius`
|
|
77
|
+
grows a cylinder's side and not its caps, which is why only `radius` is here. */
|
|
78
|
+
top.y = exit + shape.radius;
|
|
79
|
+
top.nx = nx;
|
|
80
|
+
top.ny = ny;
|
|
81
|
+
top.nz = nz;
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
84
|
+
const fill = (out) => {
|
|
85
|
+
out.y = top.y;
|
|
86
|
+
out.normalX = top.nx;
|
|
87
|
+
out.normalY = top.ny;
|
|
88
|
+
out.normalZ = top.nz;
|
|
89
|
+
/* A solid has no route, so the fields that describe one say nothing rather than something
|
|
90
|
+
invented. `tilt` follows the face, for the reason `heightSurface` gives: the surface collides
|
|
91
|
+
exactly as it looks. */
|
|
92
|
+
out.tiltX = top.nx;
|
|
93
|
+
out.tiltY = top.ny;
|
|
94
|
+
out.tiltZ = top.nz;
|
|
95
|
+
out.tangentX = 1;
|
|
96
|
+
out.tangentY = 0;
|
|
97
|
+
out.tangentZ = 0;
|
|
98
|
+
out.distanceM = 0;
|
|
99
|
+
out.lateralM = 0;
|
|
100
|
+
out.bankRad = 0;
|
|
101
|
+
out.halfWidthM = Infinity;
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
/**
|
|
105
|
+
* The face nearest the asker's feet, ties broken toward the one below.
|
|
106
|
+
*
|
|
107
|
+
* The same rule `CompositeSurface` uses between its parts and `RibbonSurface` between its own
|
|
108
|
+
* passes, and for the same reason: what you are standing on is the thing under your feet, and
|
|
109
|
+
* "highest wins" teleports a body under a deck up onto it.
|
|
110
|
+
*/
|
|
111
|
+
sample(x, z, out, atY = Infinity) {
|
|
112
|
+
const count = set.query(x - COLUMN_EPSILON, minY, z - COLUMN_EPSILON, x + COLUMN_EPSILON, maxY, z + COLUMN_EPSILON, found);
|
|
113
|
+
const located = Number.isFinite(atY);
|
|
114
|
+
let best = Infinity;
|
|
115
|
+
let hit = false;
|
|
116
|
+
for (let i = 0; i < count; i++) {
|
|
117
|
+
if (!columnTop(found[i], x, z))
|
|
118
|
+
continue;
|
|
119
|
+
const score = located ? Math.abs(top.y - atY) + (top.y > atY ? TIE_BREAK : 0) : -top.y;
|
|
120
|
+
if (score >= best)
|
|
121
|
+
continue;
|
|
122
|
+
best = score;
|
|
123
|
+
fill(out);
|
|
124
|
+
hit = true;
|
|
125
|
+
}
|
|
126
|
+
return hit;
|
|
127
|
+
},
|
|
128
|
+
/** See `GroundSurface.sampleBand`: the highest face in the band, and nothing outside it. */
|
|
129
|
+
sampleBand(x, z, out, loY, hiY) {
|
|
130
|
+
const count = set.query(x - COLUMN_EPSILON, Math.max(minY, loY), z - COLUMN_EPSILON, x + COLUMN_EPSILON, Math.min(maxY, hiY), z + COLUMN_EPSILON, found);
|
|
131
|
+
let bestY = -Infinity;
|
|
132
|
+
let hit = false;
|
|
133
|
+
for (let i = 0; i < count; i++) {
|
|
134
|
+
if (!columnTop(found[i], x, z))
|
|
135
|
+
continue;
|
|
136
|
+
/* Half-open, as the interface says: a face at head height is one a body passes under. */
|
|
137
|
+
if (top.y < loY || top.y >= hiY || top.y <= bestY)
|
|
138
|
+
continue;
|
|
139
|
+
bestY = top.y;
|
|
140
|
+
fill(out);
|
|
141
|
+
hit = true;
|
|
142
|
+
}
|
|
143
|
+
return hit;
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { GroundSurface, SurfaceHit } from './ribbonSurface.ts';
|
|
2
|
+
export declare class CompositeSurface implements GroundSurface {
|
|
3
|
+
private readonly surfaces;
|
|
4
|
+
private readonly candidate;
|
|
5
|
+
constructor(surfaces: readonly GroundSurface[]);
|
|
6
|
+
/**
|
|
7
|
+
* The floors this is made of.
|
|
8
|
+
*
|
|
9
|
+
* Exposed because "two of my floors are in the same column" is a question only
|
|
10
|
+
* the parts can answer, and it is one a consumer has to be able to ask. Two
|
|
11
|
+
* walkable surfaces overlapping with millimetres between them is invisible to
|
|
12
|
+
* every gameplay check — `sample` picks one and both readings look sane — while
|
|
13
|
+
* on screen the depth buffer cannot separate them and the pair flickers against
|
|
14
|
+
* each other as the camera turns. Composed, that information is gone.
|
|
15
|
+
*/
|
|
16
|
+
get parts(): readonly GroundSurface[];
|
|
17
|
+
/**
|
|
18
|
+
* Ask every part and keep the best answer.
|
|
19
|
+
*
|
|
20
|
+
* `atY` is what makes this correct rather than arbitrary. Without a reference
|
|
21
|
+
* height the only available rule is "highest wins", which teleports a character
|
|
22
|
+
* on the low line of a split up onto the high one the moment the two overlap.
|
|
23
|
+
*/
|
|
24
|
+
sample(x: number, z: number, out: SurfaceHit, atY?: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* See `GroundSurface.sampleBand`: the highest floor any part puts in the band.
|
|
27
|
+
*
|
|
28
|
+
* The one query where composing surfaces costs nothing in fidelity — a band is
|
|
29
|
+
* a filter, so asking every part and keeping the highest answer is the same
|
|
30
|
+
* answer a single surface holding all of them would give.
|
|
31
|
+
*/
|
|
32
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean;
|
|
33
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createSurfaceHit } from './ribbonSurface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Several surfaces answering as one.
|
|
4
|
+
*
|
|
5
|
+
* A route that forks has two floors in the same column, and a query has to pick
|
|
6
|
+
* one. It picks the **highest surface at or below the asking height**, which is
|
|
7
|
+
* the same rule a lift shaft or a flyover needs: what you are standing on is
|
|
8
|
+
* the nearest thing under your feet, not the nearest thing full stop.
|
|
9
|
+
*
|
|
10
|
+
* Falling back to the highest surface overall when nothing is below keeps a
|
|
11
|
+
* character who has dropped beneath everything from reporting no ground at all —
|
|
12
|
+
* they are still over the track, just under it, and the caller decides what
|
|
13
|
+
* that means.
|
|
14
|
+
*/
|
|
15
|
+
/** How much a surface above the asker is penalised when two are equally near. */
|
|
16
|
+
const TIE_BREAK = 0.4;
|
|
17
|
+
export class CompositeSurface {
|
|
18
|
+
surfaces;
|
|
19
|
+
candidate = createSurfaceHit();
|
|
20
|
+
constructor(surfaces) {
|
|
21
|
+
this.surfaces = surfaces;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The floors this is made of.
|
|
25
|
+
*
|
|
26
|
+
* Exposed because "two of my floors are in the same column" is a question only
|
|
27
|
+
* the parts can answer, and it is one a consumer has to be able to ask. Two
|
|
28
|
+
* walkable surfaces overlapping with millimetres between them is invisible to
|
|
29
|
+
* every gameplay check — `sample` picks one and both readings look sane — while
|
|
30
|
+
* on screen the depth buffer cannot separate them and the pair flickers against
|
|
31
|
+
* each other as the camera turns. Composed, that information is gone.
|
|
32
|
+
*/
|
|
33
|
+
get parts() {
|
|
34
|
+
return this.surfaces;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Ask every part and keep the best answer.
|
|
38
|
+
*
|
|
39
|
+
* `atY` is what makes this correct rather than arbitrary. Without a reference
|
|
40
|
+
* height the only available rule is "highest wins", which teleports a character
|
|
41
|
+
* on the low line of a split up onto the high one the moment the two overlap.
|
|
42
|
+
*/
|
|
43
|
+
sample(x, z, out, atY = Infinity) {
|
|
44
|
+
// See `RibbonSurface`: without a height to measure from, the highest wins.
|
|
45
|
+
const located = Number.isFinite(atY);
|
|
46
|
+
let best = Infinity;
|
|
47
|
+
let found = false;
|
|
48
|
+
for (const part of this.surfaces) {
|
|
49
|
+
if (!part.sample(x, z, this.candidate, atY))
|
|
50
|
+
continue;
|
|
51
|
+
/*
|
|
52
|
+
* Nearest to the asker's height, ties broken toward the surface below.
|
|
53
|
+
*
|
|
54
|
+
* The same rule `RibbonSurface` uses between its own passes, and for the
|
|
55
|
+
* same reason: "highest at or below" is written for a flyover and wrong for
|
|
56
|
+
* two decks at similar heights, where it can hand a character a surface just
|
|
57
|
+
* far enough beneath their feet that they cannot snap to it and fall
|
|
58
|
+
* through ground that is directly under them.
|
|
59
|
+
*/
|
|
60
|
+
const score = located
|
|
61
|
+
? Math.abs(this.candidate.y - atY) + (this.candidate.y > atY ? TIE_BREAK : 0)
|
|
62
|
+
: -this.candidate.y;
|
|
63
|
+
if (score < best) {
|
|
64
|
+
best = score;
|
|
65
|
+
copyHit(this.candidate, out);
|
|
66
|
+
found = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return found;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* See `GroundSurface.sampleBand`: the highest floor any part puts in the band.
|
|
73
|
+
*
|
|
74
|
+
* The one query where composing surfaces costs nothing in fidelity — a band is
|
|
75
|
+
* a filter, so asking every part and keeping the highest answer is the same
|
|
76
|
+
* answer a single surface holding all of them would give.
|
|
77
|
+
*/
|
|
78
|
+
sampleBand(x, z, out, loY, hiY) {
|
|
79
|
+
let bestY = -Infinity;
|
|
80
|
+
let found = false;
|
|
81
|
+
for (const part of this.surfaces) {
|
|
82
|
+
if (!part.sampleBand(x, z, this.candidate, loY, hiY))
|
|
83
|
+
continue;
|
|
84
|
+
if (this.candidate.y <= bestY)
|
|
85
|
+
continue;
|
|
86
|
+
bestY = this.candidate.y;
|
|
87
|
+
copyHit(this.candidate, out);
|
|
88
|
+
found = true;
|
|
89
|
+
}
|
|
90
|
+
return found;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function copyHit(from, to) {
|
|
94
|
+
to.y = from.y;
|
|
95
|
+
to.normalX = from.normalX;
|
|
96
|
+
to.normalY = from.normalY;
|
|
97
|
+
to.normalZ = from.normalZ;
|
|
98
|
+
to.tangentX = from.tangentX;
|
|
99
|
+
to.tangentY = from.tangentY;
|
|
100
|
+
to.tangentZ = from.tangentZ;
|
|
101
|
+
to.distanceM = from.distanceM;
|
|
102
|
+
to.lateralM = from.lateralM;
|
|
103
|
+
to.halfWidthM = from.halfWidthM;
|
|
104
|
+
to.bankRad = from.bankRad;
|
|
105
|
+
to.tiltX = from.tiltX;
|
|
106
|
+
to.tiltY = from.tiltY;
|
|
107
|
+
to.tiltZ = from.tiltZ;
|
|
108
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { GroundSurface, SurfaceHit } from './ribbonSurface.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Any function that answers "how high is the ground at this column?", as a `GroundSurface`.
|
|
4
|
+
*
|
|
5
|
+
* **The hundred lines every consumer with terrain writes, written once.** A world that is not flat
|
|
6
|
+
* has to answer that question somewhere, and the two things that already implement `GroundSurface`
|
|
7
|
+
* answer different ones: `RibbonSurface` is a route with a width and a bank, and `BoxSurface` is a
|
|
8
|
+
* set of flat pads. Neither is a hillside, a ditch, a heightmap or a dune. A consumer with one of
|
|
9
|
+
* those has a `heightAt(x, z)` of their own within an afternoon, and then spends the rest of the
|
|
10
|
+
* week turning it into a surface: a normal by differences, a band query, the route fields nothing
|
|
11
|
+
* asked for, and finally the discovery that the character controller and everything else that
|
|
12
|
+
* stands on ground each need their own copy of the wiring.
|
|
13
|
+
*
|
|
14
|
+
* That was reported from outside as "there is no terrain height a controller can ask about", beside
|
|
15
|
+
* a note that the answer they wrote is a hundred lines and that every consumer with a road will
|
|
16
|
+
* write it again.
|
|
17
|
+
*
|
|
18
|
+
* **This is a seam and not terrain.** It renders nothing, stores nothing, and has no level of
|
|
19
|
+
* detail: `heightAt` is the consumer's, and what this adds is the surface contract around it, so
|
|
20
|
+
* one object can be handed to a character controller, to a vehicle, and to whatever places props —
|
|
21
|
+
* and the floor is one thing rather than three copies of it. Terrain proper is its own track.
|
|
22
|
+
*
|
|
23
|
+
* **A `heightAt` that returns a non-finite number means there is no ground in that column**, and
|
|
24
|
+
* that is the contract a layered world is built out of: a bridge deck answers its height over the
|
|
25
|
+
* span and `NaN` everywhere else, so it is a floor exactly where it is drawn and nothing anywhere
|
|
26
|
+
* else. Until 2026-08-30 this was said only in a private comment inside this file, which is no use
|
|
27
|
+
* to somebody deciding how to model a flyover.
|
|
28
|
+
*/
|
|
29
|
+
export interface HeightSurfaceOptions {
|
|
30
|
+
/**
|
|
31
|
+
* How far apart the two samples that measure the slope are, metres.
|
|
32
|
+
*
|
|
33
|
+
* **This is the scale the ground is measured at, and it is a real choice.** The normal comes from
|
|
34
|
+
* a central difference, so a feature narrower than twice this is smoothed away — a kerb sampled
|
|
35
|
+
* at half a metre is a gentle ramp — while a step far below the resolution of `heightAt` measures
|
|
36
|
+
* its rounding rather than its slope. Five centimetres suits ground a person walks on.
|
|
37
|
+
*
|
|
38
|
+
* A caller who can differentiate their own field should pass `normalAt` instead and pay nothing.
|
|
39
|
+
*/
|
|
40
|
+
readonly stepM?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Where the surface exists at all. Outside it, there is no ground and a query says so.
|
|
43
|
+
*
|
|
44
|
+
* Absent means everywhere, which is right for a field defined by arithmetic and wrong for one
|
|
45
|
+
* backed by a finite array — a sample off the end of a heightmap is not ground at height zero.
|
|
46
|
+
*/
|
|
47
|
+
readonly bounds?: {
|
|
48
|
+
readonly minX: number;
|
|
49
|
+
readonly maxX: number;
|
|
50
|
+
readonly minZ: number;
|
|
51
|
+
readonly maxZ: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The exact unit normal, when the caller has one.
|
|
55
|
+
*
|
|
56
|
+
* An analytic profile — a trapezoid ditch, a cone, a sine dune — knows its own derivative, and
|
|
57
|
+
* four extra calls to `heightAt` a tick to rediscover it numerically is both slower and less
|
|
58
|
+
* accurate. Must be unit length: nothing normalises it afterwards, and a controller compares it
|
|
59
|
+
* against a slope cosine.
|
|
60
|
+
*/
|
|
61
|
+
normalAt?(x: number, z: number, out: {
|
|
62
|
+
x: number;
|
|
63
|
+
y: number;
|
|
64
|
+
z: number;
|
|
65
|
+
}): void;
|
|
66
|
+
}
|
|
67
|
+
/** A field of one height per column: the consumer's own `(x, z) -> y`. */
|
|
68
|
+
export type HeightField = (x: number, z: number) => number;
|
|
69
|
+
/**
|
|
70
|
+
* One field, or several stacked in the same world.
|
|
71
|
+
*
|
|
72
|
+
* **Several is how a road passes under a road.** A single field has exactly one height per column,
|
|
73
|
+
* and no arrangement of it holds both a deck and the carriageway beneath it; two fields do, and the
|
|
74
|
+
* surface picks the one under the body's feet using the height every caller already passes. Order
|
|
75
|
+
* carries no meaning — the rule is nearness to the asker, not position in the list.
|
|
76
|
+
*
|
|
77
|
+
* Each layer answers `NaN` where it is not there, so a deck is a floor over its span and nothing at
|
|
78
|
+
* all beside it.
|
|
79
|
+
*/
|
|
80
|
+
export declare function heightSurface(heightAt: HeightField | readonly HeightField[], options?: HeightSurfaceOptions): GroundSurface;
|
|
81
|
+
/**
|
|
82
|
+
* Whether anything solid stands over this column, between two heights.
|
|
83
|
+
*
|
|
84
|
+
* **The general question, of which "should rain fall here" is one caller.** A surface answers three
|
|
85
|
+
* things and only two of them had names: where the ground is, whether a floor is in the way, and —
|
|
86
|
+
* the one this is — whether the sky is visible from a point. That third question is asked by more
|
|
87
|
+
* than weather, and it is asked constantly: rain and snow that stop under a canopy, a puddle that
|
|
88
|
+
* only forms where the sky reaches, a shaft of sun that should not appear indoors, an agent
|
|
89
|
+
* deciding whether it is worth taking shelter, a plant that grows toward light. Every one of those
|
|
90
|
+
* is `sampleBand` over the column above you, and every consumer that wants one would otherwise
|
|
91
|
+
* discover that for themselves.
|
|
92
|
+
*
|
|
93
|
+
* **A hole is a hole, for free.** This is the property worth stating, because it is what usually
|
|
94
|
+
* separates a convincing effect from a stamped-on one: the answer comes from whether the surface
|
|
95
|
+
* has a *face* in that column, so a roof with a gap in it, a `RibbonSurface` with a stretch of
|
|
96
|
+
* `holes`, a run of pads with air between them, or a bounded heightfield past its own edge all let
|
|
97
|
+
* the sky through in exactly the places they look like they should. Nothing describes the opening
|
|
98
|
+
* twice and nothing can disagree with the geometry it was cut from.
|
|
99
|
+
*
|
|
100
|
+
* `toY` is where the caller stops caring — a cloud base, the top of a level. Half-open like
|
|
101
|
+
* `sampleBand`, so a face exactly at `toY` is above the question rather than in it.
|
|
102
|
+
*/
|
|
103
|
+
export declare function coveredAbove(surface: GroundSurface, x: number, z: number, fromY: number, toY: number, scratch: SurfaceHit): boolean;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { CompositeSurface } from './compositeSurface.js';
|
|
2
|
+
/** Scratch for `normalAt`, at module scope because sampling runs every tick. */
|
|
3
|
+
const NORMAL = { x: 0, y: 1, z: 0 };
|
|
4
|
+
/**
|
|
5
|
+
* One field, or several stacked in the same world.
|
|
6
|
+
*
|
|
7
|
+
* **Several is how a road passes under a road.** A single field has exactly one height per column,
|
|
8
|
+
* and no arrangement of it holds both a deck and the carriageway beneath it; two fields do, and the
|
|
9
|
+
* surface picks the one under the body's feet using the height every caller already passes. Order
|
|
10
|
+
* carries no meaning — the rule is nearness to the asker, not position in the list.
|
|
11
|
+
*
|
|
12
|
+
* Each layer answers `NaN` where it is not there, so a deck is a floor over its span and nothing at
|
|
13
|
+
* all beside it.
|
|
14
|
+
*/
|
|
15
|
+
export function heightSurface(heightAt, options = {}) {
|
|
16
|
+
/*
|
|
17
|
+
* **Layers compose through `CompositeSurface` rather than through a rule written twice.** That
|
|
18
|
+
* class already scores candidates by nearness to the asker and breaks ties toward the surface
|
|
19
|
+
* below, which is exactly what a flyover needs and is the rule `RibbonSurface` already uses
|
|
20
|
+
* between its own passes. A second implementation here would be a second thing to get wrong.
|
|
21
|
+
*/
|
|
22
|
+
/* `typeof` and not `Array.isArray`, which does not narrow a `readonly` array out of a union. */
|
|
23
|
+
if (typeof heightAt !== 'function') {
|
|
24
|
+
const layers = heightAt;
|
|
25
|
+
if (layers.length === 0) {
|
|
26
|
+
throw new Error('heightSurface: an empty list of layers is a world with no ground anywhere, which is ' +
|
|
27
|
+
'almost certainly not what was meant. Pass at least one height field.');
|
|
28
|
+
}
|
|
29
|
+
if (layers.length === 1)
|
|
30
|
+
return heightSurface(layers[0], options);
|
|
31
|
+
/* One surface per layer, each single-valued and each knowing where it is not. */
|
|
32
|
+
return new CompositeSurface(layers.map((layer) => heightSurface(layer, options)));
|
|
33
|
+
}
|
|
34
|
+
const single = heightAt;
|
|
35
|
+
const step = options.stepM ?? 0.05;
|
|
36
|
+
if (!(step > 0))
|
|
37
|
+
throw new Error(`heightSurface: stepM must be positive, got ${step}`);
|
|
38
|
+
const bounds = options.bounds;
|
|
39
|
+
const normalAt = options.normalAt;
|
|
40
|
+
/**
|
|
41
|
+
* Fill `out` for this column, or answer false where there is no ground.
|
|
42
|
+
*
|
|
43
|
+
* **A non-finite height is treated as absence rather than passed on**, because a field defined by
|
|
44
|
+
* arithmetic reports the edge of its domain that way — a square root going negative, a division
|
|
45
|
+
* at a pole — and a `NaN` written into a surface hit becomes a `NaN` position two frames later,
|
|
46
|
+
* where nothing points back here.
|
|
47
|
+
*/
|
|
48
|
+
const fill = (x, z, out) => {
|
|
49
|
+
if (bounds !== undefined) {
|
|
50
|
+
if (x < bounds.minX || x > bounds.maxX || z < bounds.minZ || z > bounds.maxZ)
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const y = single(x, z);
|
|
54
|
+
if (!Number.isFinite(y))
|
|
55
|
+
return false;
|
|
56
|
+
out.y = y;
|
|
57
|
+
if (normalAt !== undefined) {
|
|
58
|
+
normalAt(x, z, NORMAL);
|
|
59
|
+
out.normalX = NORMAL.x;
|
|
60
|
+
out.normalY = NORMAL.y;
|
|
61
|
+
out.normalZ = NORMAL.z;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
/*
|
|
65
|
+
* A central difference, falling back to a one-sided one at the edge of the domain. Without
|
|
66
|
+
* that fallback the last step of a bounded field has no normal at all, which is where a
|
|
67
|
+
* character walks off the map and the ground turns vertical under them.
|
|
68
|
+
*/
|
|
69
|
+
const east = sided(single, x + step, z, y);
|
|
70
|
+
const west = sided(single, x - step, z, y);
|
|
71
|
+
const south = sided(single, x, z + step, y);
|
|
72
|
+
const north = sided(single, x, z - step, y);
|
|
73
|
+
const dx = (east - west) / (step * 2);
|
|
74
|
+
const dz = (south - north) / (step * 2);
|
|
75
|
+
const length = Math.sqrt(dx * dx + 1 + dz * dz);
|
|
76
|
+
out.normalX = -dx / length;
|
|
77
|
+
out.normalY = 1 / length;
|
|
78
|
+
out.normalZ = -dz / length;
|
|
79
|
+
}
|
|
80
|
+
/*
|
|
81
|
+
* A height function has no route, so the fields that describe one say nothing rather than
|
|
82
|
+
* something invented. `tilt` is the exception and it is not an exception at all: the surface
|
|
83
|
+
* looks exactly as it collides, which is the same reason `BoxSurface` sets it from the lid.
|
|
84
|
+
*/
|
|
85
|
+
out.tiltX = out.normalX;
|
|
86
|
+
out.tiltY = out.normalY;
|
|
87
|
+
out.tiltZ = out.normalZ;
|
|
88
|
+
out.tangentX = 1;
|
|
89
|
+
out.tangentY = 0;
|
|
90
|
+
out.tangentZ = 0;
|
|
91
|
+
out.distanceM = 0;
|
|
92
|
+
out.lateralM = 0;
|
|
93
|
+
out.bankRad = 0;
|
|
94
|
+
/* Room before the edge, which for a bounded field is a real distance and otherwise is none. */
|
|
95
|
+
out.halfWidthM =
|
|
96
|
+
bounds === undefined
|
|
97
|
+
? Infinity
|
|
98
|
+
: Math.min(x - bounds.minX, bounds.maxX - x, z - bounds.minZ, bounds.maxZ - z);
|
|
99
|
+
return true;
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
/**
|
|
103
|
+
* `atY` is ignored, and that is a property of the representation and not a shortcut: **one**
|
|
104
|
+
* function of `x` and `z` has exactly one height per column, so there is no deck above or below
|
|
105
|
+
* to choose between.
|
|
106
|
+
*
|
|
107
|
+
* A world with a bridge over a road passes a **list** of fields instead, and then `atY`
|
|
108
|
+
* decides. This comment used to send that reader to `CompositeSurface`, which was true and was
|
|
109
|
+
* the wrong shape of answer: a consumer with 276 km of road and six flyovers read it as "a
|
|
110
|
+
* height field cannot do this" and built the deck into the single field, where the only way
|
|
111
|
+
* through a crossing is over it.
|
|
112
|
+
*/
|
|
113
|
+
sample(x, z, out) {
|
|
114
|
+
return fill(x, z, out);
|
|
115
|
+
},
|
|
116
|
+
sampleBand(x, z, out, loY, hiY) {
|
|
117
|
+
if (!fill(x, z, out))
|
|
118
|
+
return false;
|
|
119
|
+
/* Half-open, as the interface says: a face at head height is one a body passes under. */
|
|
120
|
+
return out.y >= loY && out.y < hiY;
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** One neighbouring sample, or the centre's own height where the field does not answer. */
|
|
125
|
+
function sided(field, x, z, centre) {
|
|
126
|
+
const y = field(x, z);
|
|
127
|
+
return Number.isFinite(y) ? y : centre;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Whether anything solid stands over this column, between two heights.
|
|
131
|
+
*
|
|
132
|
+
* **The general question, of which "should rain fall here" is one caller.** A surface answers three
|
|
133
|
+
* things and only two of them had names: where the ground is, whether a floor is in the way, and —
|
|
134
|
+
* the one this is — whether the sky is visible from a point. That third question is asked by more
|
|
135
|
+
* than weather, and it is asked constantly: rain and snow that stop under a canopy, a puddle that
|
|
136
|
+
* only forms where the sky reaches, a shaft of sun that should not appear indoors, an agent
|
|
137
|
+
* deciding whether it is worth taking shelter, a plant that grows toward light. Every one of those
|
|
138
|
+
* is `sampleBand` over the column above you, and every consumer that wants one would otherwise
|
|
139
|
+
* discover that for themselves.
|
|
140
|
+
*
|
|
141
|
+
* **A hole is a hole, for free.** This is the property worth stating, because it is what usually
|
|
142
|
+
* separates a convincing effect from a stamped-on one: the answer comes from whether the surface
|
|
143
|
+
* has a *face* in that column, so a roof with a gap in it, a `RibbonSurface` with a stretch of
|
|
144
|
+
* `holes`, a run of pads with air between them, or a bounded heightfield past its own edge all let
|
|
145
|
+
* the sky through in exactly the places they look like they should. Nothing describes the opening
|
|
146
|
+
* twice and nothing can disagree with the geometry it was cut from.
|
|
147
|
+
*
|
|
148
|
+
* `toY` is where the caller stops caring — a cloud base, the top of a level. Half-open like
|
|
149
|
+
* `sampleBand`, so a face exactly at `toY` is above the question rather than in it.
|
|
150
|
+
*/
|
|
151
|
+
export function coveredAbove(surface, x, z, fromY, toY, scratch) {
|
|
152
|
+
return surface.sampleBand(x, z, scratch, fromY, toY);
|
|
153
|
+
}
|