@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,642 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Where is the ground in this column, and which way does it face?"
|
|
3
|
+
*
|
|
4
|
+
* The AABB strip a ribbon builds keeps a character inside the world; it is a poor
|
|
5
|
+
* description of the *surface*, because a world-axis box over a banked strip has
|
|
6
|
+
* a flat top at the height of the strip's highest corner. Stand on that and you
|
|
7
|
+
* hover through every corner in the game.
|
|
8
|
+
*
|
|
9
|
+
* So the two are split. Boxes stop you falling through; this answers what you
|
|
10
|
+
* are standing on, exactly, from the curve itself.
|
|
11
|
+
*
|
|
12
|
+
* The cost of "exactly" is a nearest-point search along a spline, which is not
|
|
13
|
+
* something to do from scratch inside a fixed tick. A uniform grid of seed arc
|
|
14
|
+
* lengths turns it into a lookup plus a handful of Newton steps — a fixed count,
|
|
15
|
+
* so two machines get bit-identical answers, which the replay contract requires.
|
|
16
|
+
*/
|
|
17
|
+
import { Spline, createSplineSample } from '../geometry/spline.ts';
|
|
18
|
+
import { RIBBON_STEP_M } from '../geometry/ribbon.ts';
|
|
19
|
+
import type { RibbonHole } from '../geometry/ribbon.ts';
|
|
20
|
+
|
|
21
|
+
export interface SurfaceHit {
|
|
22
|
+
/** Height of the surface in the queried column. */
|
|
23
|
+
y: number;
|
|
24
|
+
normalX: number;
|
|
25
|
+
normalY: number;
|
|
26
|
+
normalZ: number;
|
|
27
|
+
/** Direction of travel at the nearest point on the centreline. */
|
|
28
|
+
tangentX: number;
|
|
29
|
+
tangentY: number;
|
|
30
|
+
tangentZ: number;
|
|
31
|
+
/** Arc length of that nearest point. How far along the route you are. */
|
|
32
|
+
distanceM: number;
|
|
33
|
+
/** Signed offset from the centreline, positive to the character's right. */
|
|
34
|
+
lateralM: number;
|
|
35
|
+
/** Half the surface's width here — how much room is left before the edge. */
|
|
36
|
+
halfWidthM: number;
|
|
37
|
+
bankRad: number;
|
|
38
|
+
/**
|
|
39
|
+
* Which way *up* looks here — the ruled surface's own normal, not the
|
|
40
|
+
* cross-section's.
|
|
41
|
+
*
|
|
42
|
+
* A separate field because it answers a separate question. `normal` is the
|
|
43
|
+
* ground a character stands on and every movement rule is tuned against it: how
|
|
44
|
+
* steep is this to walk, which way does gravity pull along it, is it floor or
|
|
45
|
+
* is it wall. That question is about the cross-section, and its answer is the
|
|
46
|
+
* same all the way across the deck.
|
|
47
|
+
*
|
|
48
|
+
* This one is about how the surface *looks* where you are standing on it, and
|
|
49
|
+
* on a deck whose bank rolls it is a very different number: the ruled surface
|
|
50
|
+
* climbs far more steeply along the route near its edges than the centreline
|
|
51
|
+
* does — 57° measured on one chicane against the centreline's 11°, and
|
|
52
|
+
* past vertical on a chute. Correct geometry, and correct for orienting a body
|
|
53
|
+
* that has to look like it is on the deck. Fed to the walking rules instead it
|
|
54
|
+
* takes the ground away: a character met a chicane's edge as a wall and fell down
|
|
55
|
+
* it at 20 m/s a hand's width above the deck, never landing, which is exactly
|
|
56
|
+
* what flying looks like.
|
|
57
|
+
*/
|
|
58
|
+
tiltX: number;
|
|
59
|
+
tiltY: number;
|
|
60
|
+
tiltZ: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function createSurfaceHit(): SurfaceHit {
|
|
64
|
+
return {
|
|
65
|
+
y: 0,
|
|
66
|
+
normalX: 0,
|
|
67
|
+
normalY: 1,
|
|
68
|
+
normalZ: 0,
|
|
69
|
+
tangentX: 1,
|
|
70
|
+
tangentY: 0,
|
|
71
|
+
tangentZ: 0,
|
|
72
|
+
distanceM: 0,
|
|
73
|
+
lateralM: 0,
|
|
74
|
+
halfWidthM: 0,
|
|
75
|
+
bankRad: 0,
|
|
76
|
+
tiltX: 0,
|
|
77
|
+
tiltY: 1,
|
|
78
|
+
tiltZ: 0,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Anything that can answer "where is the ground here?".
|
|
84
|
+
*
|
|
85
|
+
* The seam a controller depends on, rather than on `RibbonSurface` itself: a
|
|
86
|
+
* game with heightmap terrain, or a test with three lines of arithmetic, is a
|
|
87
|
+
* valid ground surface and neither should have to build a spline to say so.
|
|
88
|
+
*/
|
|
89
|
+
export interface GroundSurface {
|
|
90
|
+
/**
|
|
91
|
+
* @param atY Height of whatever is asking, so a route that passes over itself
|
|
92
|
+
* can answer with the deck *under* them rather than the highest one in the
|
|
93
|
+
* column. Omitted means "the highest", which is right for a caller that has
|
|
94
|
+
* no position — a generator placing a lamp, say.
|
|
95
|
+
*/
|
|
96
|
+
sample(x: number, z: number, out: SurfaceHit, atY?: number): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* The **highest** floor in this column whose face lies in `[loY, hiY)`, exactly.
|
|
99
|
+
*
|
|
100
|
+
* A second question, not a variant of the first, and the reason it cannot be
|
|
101
|
+
* expressed as one: `sample` scores candidates by nearness to the asker and
|
|
102
|
+
* breaks ties *against* whatever is above them, because what you are standing
|
|
103
|
+
* on is the thing under your feet. "Is there a floor in the way" asks about a
|
|
104
|
+
* band that is entirely above the asker, so that scoring is pointed at the
|
|
105
|
+
* exact answer wanted — a deck a metre up loses to the deck underfoot and the
|
|
106
|
+
* caller is told the column is clear.
|
|
107
|
+
*
|
|
108
|
+
* So this is a filter and not a score: every face in the band qualifies, the
|
|
109
|
+
* highest wins, and nothing outside the band can outrank anything inside it.
|
|
110
|
+
* No reference height, no tie-break, nothing to tune.
|
|
111
|
+
*
|
|
112
|
+
* Half-open on purpose. A caller testing "between my step ceiling and my head"
|
|
113
|
+
* owns both of its own bounds, and a face exactly at head height is one the
|
|
114
|
+
* body passes under rather than into.
|
|
115
|
+
*/
|
|
116
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface RibbonSurfaceOptions {
|
|
120
|
+
/** Side of a seed grid cell, metres. */
|
|
121
|
+
cellM?: number;
|
|
122
|
+
/** Stretches of arc length where there is no surface at all. */
|
|
123
|
+
holes?: readonly RibbonHole[];
|
|
124
|
+
/**
|
|
125
|
+
* Extra width, each side, that still counts as being over the surface.
|
|
126
|
+
* A character is a box, not a point, and the edge should be forgiving by about
|
|
127
|
+
* half of one.
|
|
128
|
+
*/
|
|
129
|
+
marginM?: number;
|
|
130
|
+
/**
|
|
131
|
+
* How far the *mesh* keeps deck past the start of a hole, metres — one cross-section step.
|
|
132
|
+
*
|
|
133
|
+
* A hole is authored as a span of arc length and a ribbon's geometry cannot cut exactly
|
|
134
|
+
* there. `buildRibbon` keeps the cross-section that *borders* a hole, deliberately, so the
|
|
135
|
+
* deck before it gets its end cap in the right place instead of stopping a step short — so
|
|
136
|
+
* the drawn lip can reach a full step into the authored span. A surface that does not know
|
|
137
|
+
* that figure reports no ground under deck a character can plainly see and is standing on.
|
|
138
|
+
*
|
|
139
|
+
* Defaults to the ribbon builder's own default step, so a caller who has not changed the
|
|
140
|
+
* step does not have to say so; a caller who has must pass it, or the two disagree by the
|
|
141
|
+
* difference.
|
|
142
|
+
*/
|
|
143
|
+
holeEdgeM?: number;
|
|
144
|
+
/**
|
|
145
|
+
* Width of the raised trim down each edge, metres, and how far it stands proud.
|
|
146
|
+
*
|
|
147
|
+
* A kerb is drawn as its own ribbon over the outermost band of the deck, lifted a
|
|
148
|
+
* few centimetres — and a surface that does not know about it reports the deck's
|
|
149
|
+
* height under geometry the player can plainly see they are standing on, so their
|
|
150
|
+
* feet sink into it. The two figures are the same ones the kerb ribbon is built from,
|
|
151
|
+
* passed here so the drawn trim and the walkable floor cannot disagree.
|
|
152
|
+
*
|
|
153
|
+
* Zero by default, which is every consumer that has no trim: the arithmetic below is
|
|
154
|
+
* skipped entirely rather than adding zero.
|
|
155
|
+
*/
|
|
156
|
+
edgeBandM?: number;
|
|
157
|
+
edgeLiftM?: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Seed-grid resolution.
|
|
162
|
+
*
|
|
163
|
+
* Only has to get the Newton refinement into the right basin, so it is sized
|
|
164
|
+
* for build cost rather than accuracy — the answer is exact either way. At 1.5
|
|
165
|
+
* a wide track stamped over two hundred thousand cells per world and a
|
|
166
|
+
* two-year sweep of the generator took sixteen seconds.
|
|
167
|
+
*/
|
|
168
|
+
const DEFAULT_CELL_M = 3;
|
|
169
|
+
/**
|
|
170
|
+
* Candidate seeds kept per cell, from arc lengths far enough apart to be
|
|
171
|
+
* different passes of the route.
|
|
172
|
+
*
|
|
173
|
+
* One is not enough, and the failure is severe rather than cosmetic. Where a
|
|
174
|
+
* route doubles back, two stretches of it share a column; a cell seeded from
|
|
175
|
+
* whichever happened to be marginally closer sends the refinement to the wrong
|
|
176
|
+
* pass, which reports a lateral offset outside the surface, which reports *no
|
|
177
|
+
* ground*. With the ribbon contributing no collision boxes there is nothing to
|
|
178
|
+
* catch that, so a single bad query is a fall through the floor — which is
|
|
179
|
+
* exactly what showed up on the twisted sections.
|
|
180
|
+
*
|
|
181
|
+
* Four, separated by eight metres rather than twenty-five. The separation is what
|
|
182
|
+
* decides whether the two legs of a hairpin get their own slots, and a one-bar
|
|
183
|
+
* hairpin at 168 BPM is only about twelve metres of arc long — so at
|
|
184
|
+
* twenty-five, both legs collapsed into a single slot and the loser was
|
|
185
|
+
* unreachable. Which is exactly the fall-through reported on 180-degree ribbons.
|
|
186
|
+
*/
|
|
187
|
+
const SEEDS_PER_CELL = 4;
|
|
188
|
+
/** How far apart two seeds must be to count as different passes. */
|
|
189
|
+
const SEED_SEPARATION_M = 8;
|
|
190
|
+
/**
|
|
191
|
+
* How much a deck *above* the asker is penalised when two are equally near.
|
|
192
|
+
*
|
|
193
|
+
* Small, and only a tie-breaker: at equal distance the floor you are standing on
|
|
194
|
+
* is the one below you. Large enough to decide a tie, small enough that a deck
|
|
195
|
+
* genuinely closer above still wins — which is what a character rising through a
|
|
196
|
+
* split needs.
|
|
197
|
+
*/
|
|
198
|
+
const OVERPASS_TIE_BREAK = 0.4;
|
|
199
|
+
const DEFAULT_MARGIN_M = 0.35;
|
|
200
|
+
|
|
201
|
+
/** Spacing of the centreline samples stamped into the seed grid. */
|
|
202
|
+
const SEED_STEP_M = 1.5;
|
|
203
|
+
/**
|
|
204
|
+
* Newton steps taken to refine a seed into the exact surface point.
|
|
205
|
+
*
|
|
206
|
+
* Fixed rather than convergence-tested, and that is the important part: a loop
|
|
207
|
+
* that stops "when close enough" runs a different number of times on different
|
|
208
|
+
* hardware, and a physics step whose result depends on that is a replay that
|
|
209
|
+
* diverges. Five is comfortably enough from a seed within one cell.
|
|
210
|
+
*/
|
|
211
|
+
const REFINE_STEPS = 5;
|
|
212
|
+
/**
|
|
213
|
+
* Half-span of the symmetric difference the swept normal is built from, metres.
|
|
214
|
+
*
|
|
215
|
+
* Short enough to follow a camber reversal — they run over a handful of metres —
|
|
216
|
+
* and long enough that the difference is not reading the spline's own numerical
|
|
217
|
+
* noise. See `sweptNormal`.
|
|
218
|
+
*/
|
|
219
|
+
const NORMAL_SPAN_M = 0.5;
|
|
220
|
+
|
|
221
|
+
export class RibbonSurface {
|
|
222
|
+
private readonly spline: Spline;
|
|
223
|
+
private readonly holes: readonly RibbonHole[];
|
|
224
|
+
private readonly margin: number;
|
|
225
|
+
private readonly holeEdge: number;
|
|
226
|
+
/** Raised trim down each edge; see `RibbonSurfaceOptions.edgeBandM`. */
|
|
227
|
+
private readonly edgeBand: number;
|
|
228
|
+
private readonly edgeLift: number;
|
|
229
|
+
/**
|
|
230
|
+
* The mesh's own cross-section pitch, derived exactly as `buildRibbon` derives
|
|
231
|
+
* it, so this surface can name the intervals the mesh really drew.
|
|
232
|
+
*/
|
|
233
|
+
private readonly meshStep: number;
|
|
234
|
+
|
|
235
|
+
private readonly cell: number;
|
|
236
|
+
private readonly originX: number;
|
|
237
|
+
private readonly originZ: number;
|
|
238
|
+
private readonly cellsX: number;
|
|
239
|
+
private readonly cellsZ: number;
|
|
240
|
+
/**
|
|
241
|
+
* Candidate arc lengths per cell — `SEEDS_PER_CELL` slots each, -1 where
|
|
242
|
+
* unused.
|
|
243
|
+
*/
|
|
244
|
+
private readonly seeds: Float32Array;
|
|
245
|
+
|
|
246
|
+
private readonly scratch = createSplineSample();
|
|
247
|
+
/** Second scratch: the swept normal needs a neighbour without losing `scratch`. */
|
|
248
|
+
private readonly frame = createSplineSample();
|
|
249
|
+
|
|
250
|
+
constructor(spline: Spline, options: RibbonSurfaceOptions = {}) {
|
|
251
|
+
this.spline = spline;
|
|
252
|
+
this.holes = options.holes ?? [];
|
|
253
|
+
this.margin = options.marginM ?? DEFAULT_MARGIN_M;
|
|
254
|
+
this.holeEdge = options.holeEdgeM ?? RIBBON_STEP_M;
|
|
255
|
+
this.edgeBand = options.edgeBandM ?? 0;
|
|
256
|
+
this.edgeLift = options.edgeLiftM ?? 0;
|
|
257
|
+
// `buildRibbon` fits a whole number of steps across the spline and uses the
|
|
258
|
+
// resulting exact pitch; matching it here is what makes `inHole` exact.
|
|
259
|
+
this.meshStep =
|
|
260
|
+
spline.lengthM > 0
|
|
261
|
+
? spline.lengthM / Math.max(1, Math.ceil(spline.lengthM / this.holeEdge))
|
|
262
|
+
: this.holeEdge;
|
|
263
|
+
this.cell = options.cellM ?? DEFAULT_CELL_M;
|
|
264
|
+
|
|
265
|
+
if (spline.lengthM <= 0) {
|
|
266
|
+
this.originX = 0;
|
|
267
|
+
this.originZ = 0;
|
|
268
|
+
this.cellsX = 0;
|
|
269
|
+
this.cellsZ = 0;
|
|
270
|
+
this.seeds = new Float32Array(0);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Two passes over the centreline: one to size the grid, one to fill it.
|
|
275
|
+
// Sizing from the real samples rather than from the control points, because
|
|
276
|
+
// a curve bulges outside its own hull.
|
|
277
|
+
let minX = Infinity;
|
|
278
|
+
let maxX = -Infinity;
|
|
279
|
+
let minZ = Infinity;
|
|
280
|
+
let maxZ = -Infinity;
|
|
281
|
+
let maxHalf = 0;
|
|
282
|
+
const steps = Math.max(1, Math.ceil(spline.lengthM / SEED_STEP_M));
|
|
283
|
+
for (let i = 0; i <= steps; i++) {
|
|
284
|
+
spline.sampleAt((i / steps) * spline.lengthM, this.scratch);
|
|
285
|
+
if (this.scratch.x < minX) minX = this.scratch.x;
|
|
286
|
+
if (this.scratch.x > maxX) maxX = this.scratch.x;
|
|
287
|
+
if (this.scratch.z < minZ) minZ = this.scratch.z;
|
|
288
|
+
if (this.scratch.z > maxZ) maxZ = this.scratch.z;
|
|
289
|
+
const half = this.scratch.widthM * 0.5;
|
|
290
|
+
if (half > maxHalf) maxHalf = half;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const pad = maxHalf + this.margin + this.cell * 2;
|
|
294
|
+
this.originX = minX - pad;
|
|
295
|
+
this.originZ = minZ - pad;
|
|
296
|
+
this.cellsX = Math.max(1, Math.ceil((maxX - minX + pad * 2) / this.cell));
|
|
297
|
+
this.cellsZ = Math.max(1, Math.ceil((maxZ - minZ + pad * 2) / this.cell));
|
|
298
|
+
this.seeds = new Float32Array(this.cellsX * this.cellsZ * SEEDS_PER_CELL).fill(-1);
|
|
299
|
+
|
|
300
|
+
/*
|
|
301
|
+
* Stamp each centreline sample into the cells it could plausibly serve,
|
|
302
|
+
* keeping whichever arc length is nearest to each cell's centre. A cell
|
|
303
|
+
* touched by two passes of a hairpin ends up seeded from the nearer one,
|
|
304
|
+
* which is what stops the refinement snapping a character onto the other
|
|
305
|
+
* carriageway.
|
|
306
|
+
*/
|
|
307
|
+
const reach = maxHalf + this.margin + this.cell;
|
|
308
|
+
const span = Math.ceil(reach / this.cell);
|
|
309
|
+
const best = new Float32Array(this.cellsX * this.cellsZ * SEEDS_PER_CELL).fill(Infinity);
|
|
310
|
+
for (let i = 0; i <= steps; i++) {
|
|
311
|
+
const d = (i / steps) * spline.lengthM;
|
|
312
|
+
spline.sampleAt(d, this.scratch);
|
|
313
|
+
const cx = Math.floor((this.scratch.x - this.originX) / this.cell);
|
|
314
|
+
const cz = Math.floor((this.scratch.z - this.originZ) / this.cell);
|
|
315
|
+
for (let gz = cz - span; gz <= cz + span; gz++) {
|
|
316
|
+
if (gz < 0 || gz >= this.cellsZ) continue;
|
|
317
|
+
for (let gx = cx - span; gx <= cx + span; gx++) {
|
|
318
|
+
if (gx < 0 || gx >= this.cellsX) continue;
|
|
319
|
+
const px = this.originX + (gx + 0.5) * this.cell;
|
|
320
|
+
const pz = this.originZ + (gz + 0.5) * this.cell;
|
|
321
|
+
const dx = px - this.scratch.x;
|
|
322
|
+
const dz = pz - this.scratch.z;
|
|
323
|
+
const distanceSq = dx * dx + dz * dz;
|
|
324
|
+
this.offer((gz * this.cellsX + gx) * SEEDS_PER_CELL, d, distanceSq, best);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Record an arc length as a candidate for one cell.
|
|
332
|
+
*
|
|
333
|
+
* Slots hold *distinct passes*: an arc length close to one already held
|
|
334
|
+
* replaces it if nearer, and only a genuinely separate stretch of route takes
|
|
335
|
+
* a new slot. Without that rule all three slots fill with neighbouring
|
|
336
|
+
* samples from the same pass and the structure buys nothing.
|
|
337
|
+
*/
|
|
338
|
+
private offer(base: number, d: number, distanceSq: number, best: Float32Array): void {
|
|
339
|
+
for (let k = 0; k < SEEDS_PER_CELL; k++) {
|
|
340
|
+
const held = this.seeds[base + k] ?? -1;
|
|
341
|
+
if (held < 0) {
|
|
342
|
+
this.seeds[base + k] = d;
|
|
343
|
+
best[base + k] = distanceSq;
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (Math.abs(held - d) < SEED_SEPARATION_M) {
|
|
347
|
+
if (distanceSq < (best[base + k] ?? Infinity)) {
|
|
348
|
+
this.seeds[base + k] = d;
|
|
349
|
+
best[base + k] = distanceSq;
|
|
350
|
+
}
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Every slot is taken by a different pass: displace the worst of them.
|
|
355
|
+
let worst = 0;
|
|
356
|
+
for (let k = 1; k < SEEDS_PER_CELL; k++) {
|
|
357
|
+
if ((best[base + k] ?? 0) > (best[base + worst] ?? 0)) worst = k;
|
|
358
|
+
}
|
|
359
|
+
if (distanceSq < (best[base + worst] ?? Infinity)) {
|
|
360
|
+
this.seeds[base + worst] = d;
|
|
361
|
+
best[base + worst] = distanceSq;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Is this arc length inside a hole — measured as the *mesh* cuts one, not as the plan
|
|
367
|
+
* states one?
|
|
368
|
+
*
|
|
369
|
+
* `buildRibbon` lays a whole number of equal steps along the spline and draws the quad
|
|
370
|
+
* between two consecutive cross-sections exactly when that quad's **midpoint** lies
|
|
371
|
+
* outside the authored hole. So the drawn deck is a union of whole step intervals, and
|
|
372
|
+
* a hole boundary falling mid-interval leaves the whole interval drawn. This asks the
|
|
373
|
+
* mesh's own question, in the mesh's own words, and cannot drift from it.
|
|
374
|
+
*
|
|
375
|
+
* It used to shrink every hole by a **full step at each end regardless of alignment**,
|
|
376
|
+
* which is that overhang's worst case rather than its actual size: where a boundary
|
|
377
|
+
* already sits on the step grid the mesh overhangs by nothing at all, and the surface
|
|
378
|
+
* was handing out up to a step of deck that was never drawn — at *every* gap, ramp and
|
|
379
|
+
* platform run. It showed up everywhere as the same report: every pad ending and every
|
|
380
|
+
* ribbon ending carried a phantom area the player could walk out onto without falling.
|
|
381
|
+
* Measured live on one route (`blocks` at 216–246 m, mesh pitch 1.9935 m): a character
|
|
382
|
+
* stood still at 245.8 m over open air with this answering a metre of deck under them.
|
|
383
|
+
*
|
|
384
|
+
* Exact costs one floor and one multiply.
|
|
385
|
+
*/
|
|
386
|
+
private inHole(d: number): boolean {
|
|
387
|
+
if (this.holes.length === 0) return false;
|
|
388
|
+
const mid = (Math.floor(d / this.meshStep) + 0.5) * this.meshStep;
|
|
389
|
+
for (const hole of this.holes) {
|
|
390
|
+
if (hole.toM <= hole.fromM) continue;
|
|
391
|
+
if (mid > hole.fromM && mid < hole.toM) return true;
|
|
392
|
+
}
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* How the surface *looks* where it is being stood on — see `SurfaceHit.tilt`.
|
|
398
|
+
*
|
|
399
|
+
* A cross-section's own normal describes the *centreline*, and it is the same
|
|
400
|
+
* answer all the way across the deck — which is only true while the section
|
|
401
|
+
* is carried along unchanged. Where the bank rolls, the surface a character
|
|
402
|
+
* stands on is a ruled one, and near its edges it climbs far more steeply
|
|
403
|
+
* along the route than the centreline does: measured on one camber reversal,
|
|
404
|
+
* 33° at the edge against the 11° the centreline reports. Everything that reads
|
|
405
|
+
* this then believes a hill is gentle when it is not — the body stands bolt
|
|
406
|
+
* upright on it instead of following the surface's own tilt, and the same
|
|
407
|
+
* understatement decides step limits and grip.
|
|
408
|
+
*
|
|
409
|
+
* So it is built from both of the surface's own tangents. Across is `right`;
|
|
410
|
+
* along is the centreline's tangent plus however fast `right` itself is
|
|
411
|
+
* turning, times how far out you are — the term that is exactly zero on a
|
|
412
|
+
* straight or evenly-banked stretch, and the whole story on a rolling one. The
|
|
413
|
+
* derivative is a symmetric difference over a fixed span, so it costs two
|
|
414
|
+
* spline samples and cannot vary between machines.
|
|
415
|
+
*/
|
|
416
|
+
private sweptNormal(d: number, lateral: number, out: SurfaceHit): void {
|
|
417
|
+
const behind = Math.max(0, d - NORMAL_SPAN_M);
|
|
418
|
+
const ahead = Math.min(this.spline.lengthM, d + NORMAL_SPAN_M);
|
|
419
|
+
const gap = ahead - behind;
|
|
420
|
+
if (gap < 1e-6 || lateral === 0) {
|
|
421
|
+
out.tiltX = this.scratch.normalX;
|
|
422
|
+
out.tiltY = this.scratch.normalY;
|
|
423
|
+
out.tiltZ = this.scratch.normalZ;
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
this.spline.sampleAt(behind, this.frame);
|
|
428
|
+
const bx = this.frame.rightX;
|
|
429
|
+
const by = this.frame.rightY;
|
|
430
|
+
const bz = this.frame.rightZ;
|
|
431
|
+
this.spline.sampleAt(ahead, this.frame);
|
|
432
|
+
const dRx = (this.frame.rightX - bx) / gap;
|
|
433
|
+
const dRy = (this.frame.rightY - by) / gap;
|
|
434
|
+
const dRz = (this.frame.rightZ - bz) / gap;
|
|
435
|
+
|
|
436
|
+
// Along the surface, at this lateral offset.
|
|
437
|
+
const ax = this.scratch.tangentX + dRx * lateral;
|
|
438
|
+
const ay = this.scratch.tangentY + dRy * lateral;
|
|
439
|
+
const az = this.scratch.tangentZ + dRz * lateral;
|
|
440
|
+
// Across it.
|
|
441
|
+
const cx = this.scratch.rightX;
|
|
442
|
+
const cy = this.scratch.rightY;
|
|
443
|
+
const cz = this.scratch.rightZ;
|
|
444
|
+
|
|
445
|
+
let nx = ay * cz - az * cy;
|
|
446
|
+
let ny = az * cx - ax * cz;
|
|
447
|
+
let nz = ax * cy - ay * cx;
|
|
448
|
+
const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
449
|
+
if (len < 1e-9) {
|
|
450
|
+
out.tiltX = this.scratch.normalX;
|
|
451
|
+
out.tiltY = this.scratch.normalY;
|
|
452
|
+
out.tiltZ = this.scratch.normalZ;
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
nx /= len;
|
|
456
|
+
ny /= len;
|
|
457
|
+
nz /= len;
|
|
458
|
+
// Keep the side the cross-section chose; the cross product does not know it.
|
|
459
|
+
const sign =
|
|
460
|
+
nx * this.scratch.normalX + ny * this.scratch.normalY + nz * this.scratch.normalZ < 0
|
|
461
|
+
? -1
|
|
462
|
+
: 1;
|
|
463
|
+
out.tiltX = nx * sign;
|
|
464
|
+
out.tiltY = ny * sign;
|
|
465
|
+
out.tiltZ = nz * sign;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Ask what the surface is doing in the column above/below `(x, z)`.
|
|
470
|
+
*
|
|
471
|
+
* Returns false where there is no surface — off the edge, past either end, or
|
|
472
|
+
* over a hole — and leaves `out` untouched in that case.
|
|
473
|
+
*/
|
|
474
|
+
sample(x: number, z: number, out: SurfaceHit, atY = Infinity): boolean {
|
|
475
|
+
const base = this.cellBase(x, z);
|
|
476
|
+
if (base < 0) return false;
|
|
477
|
+
|
|
478
|
+
/*
|
|
479
|
+
* Every candidate pass through this column; the one *nearest the asker's
|
|
480
|
+
* height* wins.
|
|
481
|
+
*
|
|
482
|
+
* Nearest, not "highest at or below". The earlier rule was written for a
|
|
483
|
+
* flyover, where the decks are metres apart and below is obviously right —
|
|
484
|
+
* but the common case is a hairpin, where the two legs sit at *similar*
|
|
485
|
+
* heights. There, picking the lower one hands a character a surface half a metre
|
|
486
|
+
* beneath their feet: too far to snap to, so they are left airborne over
|
|
487
|
+
* ground that is directly under them, and they fall. Reported twice against
|
|
488
|
+
* 180-degree ribbons: the player passes through the surface and drops.
|
|
489
|
+
*
|
|
490
|
+
* Nearest is also still correct for the flyover: a character on the upper deck
|
|
491
|
+
* is nearest to the upper deck.
|
|
492
|
+
*/
|
|
493
|
+
/*
|
|
494
|
+
* A caller with no height — a generator placing a lamp, say — gets the
|
|
495
|
+
* highest. Scoring by distance needs something to be distant *from*, and
|
|
496
|
+
* `Math.abs(y - Infinity)` is Infinity for every candidate, so a naive
|
|
497
|
+
* nearest rule silently reports no ground at all to every such caller.
|
|
498
|
+
*/
|
|
499
|
+
const located = Number.isFinite(atY);
|
|
500
|
+
let winner = -1;
|
|
501
|
+
let best = Infinity;
|
|
502
|
+
for (let k = 0; k < SEEDS_PER_CELL; k++) {
|
|
503
|
+
const seed = this.seeds[base + k] ?? -1;
|
|
504
|
+
if (seed < 0) continue;
|
|
505
|
+
if (!this.trySeed(x, z, seed, out)) continue;
|
|
506
|
+
// Ties broken toward the surface *below*, which is the one being stood on.
|
|
507
|
+
const score = located
|
|
508
|
+
? Math.abs(out.y - atY) + (out.y > atY ? OVERPASS_TIE_BREAK : 0)
|
|
509
|
+
: -out.y;
|
|
510
|
+
if (score < best) {
|
|
511
|
+
best = score;
|
|
512
|
+
winner = seed;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (winner < 0) return false;
|
|
516
|
+
return this.trySeed(x, z, winner, out);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/** See `GroundSurface.sampleBand`: the highest pass in the band, exactly. */
|
|
520
|
+
sampleBand(x: number, z: number, out: SurfaceHit, loY: number, hiY: number): boolean {
|
|
521
|
+
const base = this.cellBase(x, z);
|
|
522
|
+
if (base < 0) return false;
|
|
523
|
+
|
|
524
|
+
let winner = -1;
|
|
525
|
+
let bestY = -Infinity;
|
|
526
|
+
for (let k = 0; k < SEEDS_PER_CELL; k++) {
|
|
527
|
+
const seed = this.seeds[base + k] ?? -1;
|
|
528
|
+
if (seed < 0) continue;
|
|
529
|
+
if (!this.trySeed(x, z, seed, out)) continue;
|
|
530
|
+
if (out.y < loY || out.y >= hiY) continue;
|
|
531
|
+
if (out.y > bestY) {
|
|
532
|
+
bestY = out.y;
|
|
533
|
+
winner = seed;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
if (winner < 0) return false;
|
|
537
|
+
return this.trySeed(x, z, winner, out);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Index of this column's seed slots, or -1 where the grid does not reach.
|
|
542
|
+
*
|
|
543
|
+
* Shared by both queries so the two can never disagree about which cell a
|
|
544
|
+
* column falls in.
|
|
545
|
+
*/
|
|
546
|
+
private cellBase(x: number, z: number): number {
|
|
547
|
+
if (this.seeds.length === 0) return -1;
|
|
548
|
+
const gx = Math.floor((x - this.originX) / this.cell);
|
|
549
|
+
const gz = Math.floor((z - this.originZ) / this.cell);
|
|
550
|
+
if (gx < 0 || gx >= this.cellsX || gz < 0 || gz >= this.cellsZ) return -1;
|
|
551
|
+
return (gz * this.cellsX + gx) * SEEDS_PER_CELL;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Refine one candidate seed and report whether it lands on the surface.
|
|
556
|
+
*
|
|
557
|
+
* Split out so the query can try several; on its own this is the original
|
|
558
|
+
* single-seed search.
|
|
559
|
+
*/
|
|
560
|
+
private trySeed(x: number, z: number, seed: number, out: SurfaceHit): boolean {
|
|
561
|
+
/*
|
|
562
|
+
* Refine the seed into the exact surface point, solving for arc length and
|
|
563
|
+
* lateral offset *together*.
|
|
564
|
+
*
|
|
565
|
+
* Solving them separately — walk along the tangent to the nearest point on
|
|
566
|
+
* the centreline, then measure sideways from there — is the obvious
|
|
567
|
+
* approach and it is wrong on the one shape this milestone is built out of.
|
|
568
|
+
* A banked surface normal on a climbing track leans backward along the
|
|
569
|
+
* direction of travel, so a point offset sideways on the surface is also
|
|
570
|
+
* displaced slightly *forward*, and the nearest centreline point is no
|
|
571
|
+
* longer the one you are standing on. It cost about six millimetres of
|
|
572
|
+
* height on a 0.45 rad bank, which is nothing to look at and exactly the
|
|
573
|
+
* kind of thing that grows teeth on a steeper corner.
|
|
574
|
+
*
|
|
575
|
+
* Two unknowns, two equations, one 2×2 solve per step:
|
|
576
|
+
* P − C(d) = δd · tangent + u · right, in the horizontal plane.
|
|
577
|
+
*/
|
|
578
|
+
let d = seed;
|
|
579
|
+
let lateral = 0;
|
|
580
|
+
for (let i = 0; i <= REFINE_STEPS; i++) {
|
|
581
|
+
this.spline.sampleAt(d, this.scratch);
|
|
582
|
+
const px = x - this.scratch.x;
|
|
583
|
+
const pz = z - this.scratch.z;
|
|
584
|
+
const tx = this.scratch.tangentX;
|
|
585
|
+
const tz = this.scratch.tangentZ;
|
|
586
|
+
const rx = this.scratch.rightX;
|
|
587
|
+
const rz = this.scratch.rightZ;
|
|
588
|
+
const det = tx * rz - tz * rx;
|
|
589
|
+
if (Math.abs(det) < 1e-9) break;
|
|
590
|
+
lateral = (tx * pz - tz * px) / det;
|
|
591
|
+
// The last pass reads the offset at the settled arc length rather than
|
|
592
|
+
// moving again, so the two answers describe the same point.
|
|
593
|
+
if (i === REFINE_STEPS) break;
|
|
594
|
+
d += (px * rz - pz * rx) / det;
|
|
595
|
+
if (d < 0) d = 0;
|
|
596
|
+
else if (d > this.spline.lengthM) d = this.spline.lengthM;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/*
|
|
600
|
+
* The ends are exclusive. A track has to stop somewhere, and clamping the
|
|
601
|
+
* search means every column beyond the summit would otherwise report the
|
|
602
|
+
* summit's own surface — invisible floor stretching to the horizon, in the
|
|
603
|
+
* one place a fall is meant to be possible.
|
|
604
|
+
*/
|
|
605
|
+
if (d <= 0 || d >= this.spline.lengthM) {
|
|
606
|
+
const overshoot = d <= 0 ? -1 : 1;
|
|
607
|
+
this.spline.sampleAt(d, this.scratch);
|
|
608
|
+
const ahead =
|
|
609
|
+
(x - this.scratch.x) * this.scratch.tangentX + (z - this.scratch.z) * this.scratch.tangentZ;
|
|
610
|
+
if (ahead * overshoot > 1e-4) return false;
|
|
611
|
+
}
|
|
612
|
+
if (this.inHole(d)) return false;
|
|
613
|
+
|
|
614
|
+
const halfWidth = this.scratch.widthM * 0.5;
|
|
615
|
+
if (Math.abs(lateral) > halfWidth + this.margin) return false;
|
|
616
|
+
|
|
617
|
+
out.y = this.scratch.y + this.scratch.rightY * lateral;
|
|
618
|
+
/*
|
|
619
|
+
* The kerb is floor too.
|
|
620
|
+
*
|
|
621
|
+
* Its band is the outermost `edgeBand` of each side and it stands `edgeLift` proud,
|
|
622
|
+
* exactly as the trim ribbon is drawn — so standing on one puts the feet on top of
|
|
623
|
+
* it instead of through it. The normal is untouched: a kerb's top is parallel to the
|
|
624
|
+
* deck it edges, so what changes is the height and nothing else.
|
|
625
|
+
*/
|
|
626
|
+
if (this.edgeLift > 0 && halfWidth - Math.abs(lateral) <= this.edgeBand) {
|
|
627
|
+
out.y += this.edgeLift;
|
|
628
|
+
}
|
|
629
|
+
out.normalX = this.scratch.normalX;
|
|
630
|
+
out.normalY = this.scratch.normalY;
|
|
631
|
+
out.normalZ = this.scratch.normalZ;
|
|
632
|
+
this.sweptNormal(d, lateral, out);
|
|
633
|
+
out.tangentX = this.scratch.tangentX;
|
|
634
|
+
out.tangentY = this.scratch.tangentY;
|
|
635
|
+
out.tangentZ = this.scratch.tangentZ;
|
|
636
|
+
out.distanceM = d;
|
|
637
|
+
out.lateralM = lateral;
|
|
638
|
+
out.halfWidthM = halfWidth;
|
|
639
|
+
out.bankRad = this.scratch.bankRad;
|
|
640
|
+
return true;
|
|
641
|
+
}
|
|
642
|
+
}
|