@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,790 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A banked surface swept along a spline: the drawn slab and the colliders that
|
|
3
|
+
* stop you falling through it.
|
|
4
|
+
*
|
|
5
|
+
* Collision is the mesh: every drawn triangle of the deck becomes a wedge with
|
|
6
|
+
* the slab's depth under it, so the geometry a player sees is exactly the
|
|
7
|
+
* geometry that stops them — banked, climbing, or twisted. The exact ground
|
|
8
|
+
* they *stand* on still comes from `RibbonSurface`, which answers from the
|
|
9
|
+
* curve itself; the wedges keep a body out of the slab from every other
|
|
10
|
+
* direction.
|
|
11
|
+
*/
|
|
12
|
+
import type { MeshData } from '../render/mesh.ts';
|
|
13
|
+
import type { Vec3 } from '../math/color.ts';
|
|
14
|
+
import type { Collider } from '@driftengine/physics';
|
|
15
|
+
import { colliderFromShape } from '@driftengine/physics';
|
|
16
|
+
import { hullShape } from '@driftengine/physics';
|
|
17
|
+
import { Spline, createSplineSample } from './spline.ts';
|
|
18
|
+
|
|
19
|
+
/** A stretch of arc length where the surface simply is not there. */
|
|
20
|
+
export interface RibbonHole {
|
|
21
|
+
fromM: number;
|
|
22
|
+
toM: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface RibbonOptions {
|
|
26
|
+
color: Vec3;
|
|
27
|
+
emissive?: number;
|
|
28
|
+
/** Distance between cross-sections. Smaller is smoother and heavier. */
|
|
29
|
+
stepM?: number;
|
|
30
|
+
/** Depth of the slab below the surface. */
|
|
31
|
+
thicknessM?: number;
|
|
32
|
+
/** Interruptions: an unbridged track is a jump, and jumps are the point. */
|
|
33
|
+
holes?: readonly RibbonHole[];
|
|
34
|
+
/**
|
|
35
|
+
* Called per cross-section to vary the surface along the route.
|
|
36
|
+
*
|
|
37
|
+
* Writes the colour into `out` and returns the emissive strength. The hook
|
|
38
|
+
* exists so a generator can give each stretch its own material without
|
|
39
|
+
* building a separate ribbon per segment — a route in one flat tone reads as
|
|
40
|
+
* a painted strip rather than as something built.
|
|
41
|
+
*/
|
|
42
|
+
shade?: (distanceM: number, out: Vec3) => number;
|
|
43
|
+
/**
|
|
44
|
+
* Build only a band along one edge instead of the whole surface.
|
|
45
|
+
*
|
|
46
|
+
* For kerbs: a strip this wide, inset from the chosen edge and lifted clear,
|
|
47
|
+
* with the surface's own banking. Doing it as a second ribbon rather than as
|
|
48
|
+
* geometry bolted on afterwards means the kerb follows the bank exactly, and
|
|
49
|
+
* it is the banking that makes an edge hard to read without one.
|
|
50
|
+
*/
|
|
51
|
+
edgeBandM?: number;
|
|
52
|
+
edgeSide?: -1 | 1;
|
|
53
|
+
/**
|
|
54
|
+
* Build a band between two *absolute* lateral offsets instead of edge-relative
|
|
55
|
+
* ones — for anything painted at a particular place across the surface rather
|
|
56
|
+
* than along its edge.
|
|
57
|
+
*
|
|
58
|
+
* The alternative is to lay a row of small boxes along the route, and it does
|
|
59
|
+
* not work: an axis-aligned box cannot follow a curve, so the row steps into a
|
|
60
|
+
* zigzag and reads as a staircase of holes rather than as a marking. Built as a
|
|
61
|
+
* ribbon it follows the centreline and the bank exactly, for free.
|
|
62
|
+
*/
|
|
63
|
+
lateralFromM?: number;
|
|
64
|
+
lateralToM?: number;
|
|
65
|
+
/** Restrict the build to a stretch of the curve. */
|
|
66
|
+
fromM?: number;
|
|
67
|
+
toM?: number;
|
|
68
|
+
/** Raise the whole band by this much, so a kerb stands proud of the surface. */
|
|
69
|
+
liftM?: number;
|
|
70
|
+
/**
|
|
71
|
+
* How far below the drawn surface the collider hulls' tops sit, metres.
|
|
72
|
+
*
|
|
73
|
+
* A consumer's ground query rides the *smooth* curve; the hulls are the
|
|
74
|
+
* *faceted* mesh, and at a crest a facet ridge stands a few centimetres
|
|
75
|
+
* proud of the curve — each ridge a micro-wall under a character's feet if the
|
|
76
|
+
* hulls are exactly flush. The give hands the top few centimetres to the
|
|
77
|
+
* smooth query and everything beneath to the hull: a tolerance between two
|
|
78
|
+
* representations of the same surface, not a hole in the world — the slab's
|
|
79
|
+
* sides and underside stay exactly where they are drawn. Zero means flush.
|
|
80
|
+
*/
|
|
81
|
+
colliderGiveM?: number;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Spacing of the cross-sections a ribbon's mesh is built from, metres.
|
|
86
|
+
*
|
|
87
|
+
* Exported because it is not only the builder's business: `RibbonSurface` has to know it to
|
|
88
|
+
* agree with the geometry at a hole's edge, where the mesh deliberately keeps the bordering
|
|
89
|
+
* section. A copy of this number in the physics module is a copy that drifts.
|
|
90
|
+
*/
|
|
91
|
+
export const RIBBON_STEP_M = 2;
|
|
92
|
+
const DEFAULT_STEP_M = RIBBON_STEP_M;
|
|
93
|
+
const DEFAULT_THICKNESS_M = 0.6;
|
|
94
|
+
/**
|
|
95
|
+
* Default collider give: comfortably past the sagitta of a `RIBBON_STEP_M`
|
|
96
|
+
* facet at the tightest curvature a route reaches (a hairpin near 6 m radius:
|
|
97
|
+
* 2² / (8 · 6) ≈ 0.08), because a give that only just covers the facet error
|
|
98
|
+
* still brushes the character at every ridge — felt as braking on exactly the
|
|
99
|
+
* curves a route wants taken at speed. Small enough that nothing passes
|
|
100
|
+
* through the gap: it is backed by solid hull immediately beneath, and only
|
|
101
|
+
* the top eases — sides and underside collide exactly where they are drawn.
|
|
102
|
+
*/
|
|
103
|
+
export const RIBBON_COLLIDER_GIVE_M = 0.15;
|
|
104
|
+
/**
|
|
105
|
+
* How far a drawn facet may fall short of the curve it approximates, metres.
|
|
106
|
+
*
|
|
107
|
+
* Comfortably inside `RIBBON_COLLIDER_GIVE_M`, because that give is the whole
|
|
108
|
+
* budget for the two representations of a deck disagreeing: the smooth curve a
|
|
109
|
+
* ground query rides, and the facets that are drawn and collided. Spend the
|
|
110
|
+
* budget on the facet error and there is nothing left for the give's own job.
|
|
111
|
+
*/
|
|
112
|
+
const MAX_FACET_SLIP_M = 0.05;
|
|
113
|
+
/**
|
|
114
|
+
* Ceiling on the cuts one step may be divided into.
|
|
115
|
+
*
|
|
116
|
+
* A route that still slips past `MAX_FACET_SLIP_M` at eight cuts is turning
|
|
117
|
+
* roughly sixty times faster than the geometry it is made of, and no amount of
|
|
118
|
+
* subdivision makes that stretch good — it is a generator bug, and quietly
|
|
119
|
+
* spending a hundred facets on it would hide the bug rather than the seam.
|
|
120
|
+
*/
|
|
121
|
+
const MAX_FACET_CUTS = 8;
|
|
122
|
+
/**
|
|
123
|
+
* How far a quad's fourth corner may sit off the plane of the other three and
|
|
124
|
+
* still be collided as one hull rather than two wedges, metres.
|
|
125
|
+
*
|
|
126
|
+
* A flat quad is its own convex hull, so splitting it buys nothing and costs a
|
|
127
|
+
* collider — and most of a route is flat in this sense: it is only where the
|
|
128
|
+
* bank rolls that a quad warps at all. A centimetre is far below the give, so
|
|
129
|
+
* a quad that passes here cannot stand meaningfully proud of itself.
|
|
130
|
+
*/
|
|
131
|
+
const FLAT_QUAD_M = 0.01;
|
|
132
|
+
|
|
133
|
+
export interface RibbonMesh {
|
|
134
|
+
mesh: MeshData;
|
|
135
|
+
colliders: Collider[];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function inHole(holes: readonly RibbonHole[] | undefined, d: number): boolean {
|
|
139
|
+
if (holes === undefined) return false;
|
|
140
|
+
for (const hole of holes) {
|
|
141
|
+
if (d > hole.fromM && d < hole.toM) return true;
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Accumulator for one ribbon. Kept local rather than reusing `MeshBuilder`
|
|
148
|
+
* because that one only knows how to emit axis-aligned boxes, and every face
|
|
149
|
+
* here is oblique.
|
|
150
|
+
*/
|
|
151
|
+
class Strip {
|
|
152
|
+
readonly positions: number[] = [];
|
|
153
|
+
readonly normals: number[] = [];
|
|
154
|
+
readonly colors: number[] = [];
|
|
155
|
+
readonly emissive: number[] = [];
|
|
156
|
+
readonly indices: number[] = [];
|
|
157
|
+
private count = 0;
|
|
158
|
+
|
|
159
|
+
quad(
|
|
160
|
+
ax: number,
|
|
161
|
+
ay: number,
|
|
162
|
+
az: number,
|
|
163
|
+
bx: number,
|
|
164
|
+
by: number,
|
|
165
|
+
bz: number,
|
|
166
|
+
cx: number,
|
|
167
|
+
cy: number,
|
|
168
|
+
cz: number,
|
|
169
|
+
dx: number,
|
|
170
|
+
dy: number,
|
|
171
|
+
dz: number,
|
|
172
|
+
color: Vec3,
|
|
173
|
+
emissive: number,
|
|
174
|
+
): void {
|
|
175
|
+
// Flat-shaded, so the normal is the triangle's own and every face carries
|
|
176
|
+
// its own four vertices. Computing it rather than passing it in means the
|
|
177
|
+
// stored normal cannot disagree with the winding.
|
|
178
|
+
const ux = bx - ax;
|
|
179
|
+
const uy = by - ay;
|
|
180
|
+
const uz = bz - az;
|
|
181
|
+
const vx = cx - ax;
|
|
182
|
+
const vy = cy - ay;
|
|
183
|
+
const vz = cz - az;
|
|
184
|
+
let nx = uy * vz - uz * vy;
|
|
185
|
+
let ny = uz * vx - ux * vz;
|
|
186
|
+
let nz = ux * vy - uy * vx;
|
|
187
|
+
const len = Math.hypot(nx, ny, nz);
|
|
188
|
+
if (len < 1e-12) return;
|
|
189
|
+
nx /= len;
|
|
190
|
+
ny /= len;
|
|
191
|
+
nz /= len;
|
|
192
|
+
|
|
193
|
+
const i = this.count;
|
|
194
|
+
this.positions.push(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz);
|
|
195
|
+
for (let v = 0; v < 4; v++) {
|
|
196
|
+
this.normals.push(nx, ny, nz);
|
|
197
|
+
this.colors.push(color[0], color[1], color[2]);
|
|
198
|
+
this.emissive.push(emissive);
|
|
199
|
+
}
|
|
200
|
+
this.indices.push(i, i + 1, i + 2, i, i + 2, i + 3);
|
|
201
|
+
this.count += 4;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
build(): MeshData {
|
|
205
|
+
return {
|
|
206
|
+
positions: new Float32Array(this.positions),
|
|
207
|
+
normals: new Float32Array(this.normals),
|
|
208
|
+
colors: new Float32Array(this.colors),
|
|
209
|
+
emissive: new Float32Array(this.emissive),
|
|
210
|
+
indices: new Uint32Array(this.indices),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Four corners of one cross-section: left/right, top/bottom. */
|
|
216
|
+
interface Section {
|
|
217
|
+
lx: number;
|
|
218
|
+
ly: number;
|
|
219
|
+
lz: number;
|
|
220
|
+
rx: number;
|
|
221
|
+
ry: number;
|
|
222
|
+
rz: number;
|
|
223
|
+
lbx: number;
|
|
224
|
+
lby: number;
|
|
225
|
+
lbz: number;
|
|
226
|
+
rbx: number;
|
|
227
|
+
rby: number;
|
|
228
|
+
rbz: number;
|
|
229
|
+
/** Collider give along this section's normal — subtracted from the top corners only. */
|
|
230
|
+
gx: number;
|
|
231
|
+
gy: number;
|
|
232
|
+
gz: number;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function makeSection(): Section {
|
|
236
|
+
return {
|
|
237
|
+
lx: 0,
|
|
238
|
+
ly: 0,
|
|
239
|
+
lz: 0,
|
|
240
|
+
rx: 0,
|
|
241
|
+
ry: 0,
|
|
242
|
+
rz: 0,
|
|
243
|
+
lbx: 0,
|
|
244
|
+
lby: 0,
|
|
245
|
+
lbz: 0,
|
|
246
|
+
rbx: 0,
|
|
247
|
+
rby: 0,
|
|
248
|
+
rbz: 0,
|
|
249
|
+
gx: 0,
|
|
250
|
+
gy: 0,
|
|
251
|
+
gz: 0,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function buildRibbon(spline: Spline, options: RibbonOptions): RibbonMesh {
|
|
256
|
+
const step = options.stepM ?? DEFAULT_STEP_M;
|
|
257
|
+
const thickness = options.thicknessM ?? DEFAULT_THICKNESS_M;
|
|
258
|
+
const emissive = options.emissive ?? 0;
|
|
259
|
+
const strip = new Strip();
|
|
260
|
+
const colliders: Collider[] = [];
|
|
261
|
+
|
|
262
|
+
if (spline.lengthM <= 0 || step <= 0) {
|
|
263
|
+
return { mesh: strip.build(), colliders };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const sample = createSplineSample();
|
|
267
|
+
const color: Vec3 = [options.color[0], options.color[1], options.color[2]];
|
|
268
|
+
let emissiveNow = emissive;
|
|
269
|
+
const previous = makeSection();
|
|
270
|
+
const current = makeSection();
|
|
271
|
+
/** Scratch: the midpoint a facet is measured against, and the cuts it earns. */
|
|
272
|
+
const probe = makeSection();
|
|
273
|
+
const sub = makeSection();
|
|
274
|
+
let havePrevious = false;
|
|
275
|
+
|
|
276
|
+
const wedgePoints: number[] = [];
|
|
277
|
+
/**
|
|
278
|
+
* Extra ease for the quad being emitted, on top of the constant give.
|
|
279
|
+
*
|
|
280
|
+
* The give is sized for a facet's own sagitta; what it cannot know is how far
|
|
281
|
+
* *this* quad falls short of the curve, which on a fast camber reversal is
|
|
282
|
+
* several times larger and does not shrink to nothing even at the cut ceiling.
|
|
283
|
+
* A collider standing proud of the smooth surface is the worst failure this
|
|
284
|
+
* builder has: the ground query puts a character at the curve's height, the hull
|
|
285
|
+
* is above them, and a body inside its own floor cannot move in any direction
|
|
286
|
+
* — on that camber, a hill simply cannot be climbed. So whatever the cuts
|
|
287
|
+
* could not remove is handed to the ease instead. Sitting *below* the drawn
|
|
288
|
+
* deck costs nothing; the surface owns the ride, and the slab is solid the
|
|
289
|
+
* whole way down.
|
|
290
|
+
*/
|
|
291
|
+
let extraEase = 0;
|
|
292
|
+
/**
|
|
293
|
+
* Extra ease across the section, on top of `extraEase` along it.
|
|
294
|
+
*
|
|
295
|
+
* `extraEase` was sized for camber: it travels along a section's normal, and
|
|
296
|
+
* a normal-direction push cannot touch an error that lives in a completely
|
|
297
|
+
* different direction. On a curve tight enough that the half-width is a real
|
|
298
|
+
* fraction of the radius — a hairpin's inner rail, a chicane's apex — the
|
|
299
|
+
* chord between two cross-sections' inner corners cuts across the true
|
|
300
|
+
* offset curve rather than following it, because the inner boundary sweeps a
|
|
301
|
+
* *tighter* radius than the centreline (`radius − half`, shrinking toward
|
|
302
|
+
* zero as the half-width closes on the radius) while the chord stays
|
|
303
|
+
* straight. The result stands proud sideways instead of vertically: a hull
|
|
304
|
+
* a hand's width into the lane a character is looking straight down, on
|
|
305
|
+
* flat, ordinary-looking track. It reads as the player colliding with the
|
|
306
|
+
* track itself, worst while sliding — measured at a hairpin
|
|
307
|
+
* where the chord missed the true inner boundary by most of a metre and
|
|
308
|
+
* cost a character their whole speed on an axis nothing was drawn across.
|
|
309
|
+
*
|
|
310
|
+
* `cuts` already measures this: `leftSlip`/`rightSlip` below are the same
|
|
311
|
+
* per-edge chord error the cut count is chosen from. What was missing was
|
|
312
|
+
* anywhere for the *leftover* of that specific error to go once the cut
|
|
313
|
+
* ceiling was reached — `extraEase` only ever paid down the diagonal
|
|
314
|
+
* (camber) term. This pays the lateral remainder by drawing both top
|
|
315
|
+
* corners in toward the section's own centreline, which can only ever
|
|
316
|
+
* shrink the hull — the ground a character stands on is still the smooth
|
|
317
|
+
* curve `RibbonSurface` answers from, never this mesh, so a hull inset by
|
|
318
|
+
* centimetres at an extreme apex changes nothing about where a body can
|
|
319
|
+
* walk, only how snugly its sides are held.
|
|
320
|
+
*/
|
|
321
|
+
let lateralEase = 0;
|
|
322
|
+
|
|
323
|
+
/** One corner of a wedge: the eased top corner, and the bottom under it. */
|
|
324
|
+
const corner = (s: Section, right: boolean): void => {
|
|
325
|
+
// The give travels along the section's own normal; so does the extra.
|
|
326
|
+
const ex =
|
|
327
|
+
s.gx === 0 && s.gy === 0 && s.gz === 0 ? 0 : extraEase / Math.hypot(s.gx, s.gy, s.gz);
|
|
328
|
+
const gx = s.gx * (1 + ex);
|
|
329
|
+
const gy = s.gy * (1 + ex);
|
|
330
|
+
const gz = s.gz * (1 + ex);
|
|
331
|
+
let topX = right ? s.rx : s.lx;
|
|
332
|
+
let topY = right ? s.ry : s.ly;
|
|
333
|
+
let topZ = right ? s.rz : s.lz;
|
|
334
|
+
if (lateralEase > 0) {
|
|
335
|
+
let dx = s.rx - s.lx;
|
|
336
|
+
let dy = s.ry - s.ly;
|
|
337
|
+
let dz = s.rz - s.lz;
|
|
338
|
+
const dl = Math.hypot(dx, dy, dz);
|
|
339
|
+
if (dl > 1e-9) {
|
|
340
|
+
const inset = (Math.min(lateralEase, dl * 0.45) / dl) * (right ? -1 : 1);
|
|
341
|
+
dx *= inset;
|
|
342
|
+
dy *= inset;
|
|
343
|
+
dz *= inset;
|
|
344
|
+
topX += dx;
|
|
345
|
+
topY += dy;
|
|
346
|
+
topZ += dz;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (right) {
|
|
350
|
+
wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.rbx, s.rby, s.rbz);
|
|
351
|
+
} else {
|
|
352
|
+
wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.lbx, s.lby, s.lbz);
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* The collision under one drawn quad: two wedges, one per drawn triangle.
|
|
358
|
+
*
|
|
359
|
+
* A convex hull's *top face is a plane*, and the deck between two
|
|
360
|
+
* cross-sections is not one. Hulling the whole quad therefore bridged its
|
|
361
|
+
* warp, and the bridge stood proud of the deck the player walks on: measured
|
|
362
|
+
* across a day's route, up to **6 m** of warp on one in eight spans, leaving
|
|
363
|
+
* hull tops as much as 0.6 m above the drawn surface. A character standing where
|
|
364
|
+
* the deck is drawn was then *inside* solid collision — unable to lift, so
|
|
365
|
+
* auto-step could not fire, unable to move, so a full run died against
|
|
366
|
+
* nothing visible. Reported on the same span every time: on a steep hill the
|
|
367
|
+
* player stops climbing, forward input leaves them standing still, and they
|
|
368
|
+
* are stuck inside the track's own parts.
|
|
369
|
+
*
|
|
370
|
+
* Splitting the quad laterally was an attempt to bound that bridge, and it
|
|
371
|
+
* could not: following a 24° roll to within four centimetres needs ninety
|
|
372
|
+
* strips, and the cap of six left five sixths of the error in place. A
|
|
373
|
+
* triangle needs no bound. Its three corners *define* a plane, so this wedge's
|
|
374
|
+
* top face is the drawn triangle exactly — the same corners, the same diagonal
|
|
375
|
+
* `Strip.quad` indexes — and the pair of them tiles the quad with no seam
|
|
376
|
+
* between and none to the neighbouring span. Two wedges per quad is also
|
|
377
|
+
* fewer colliders than the strips averaged.
|
|
378
|
+
*
|
|
379
|
+
* The bottom corners hang under their own cross-section's normal, so a side
|
|
380
|
+
* face can still be a little warped where the bank rolls. That bulge is
|
|
381
|
+
* lateral, under the deck, bounded by the slab's own depth, and shared with
|
|
382
|
+
* the wedge next door: it is not somewhere anyone stands.
|
|
383
|
+
*/
|
|
384
|
+
const wedgeQuad = (p: Section, c: Section): void => {
|
|
385
|
+
/*
|
|
386
|
+
* Flat enough to be its own hull? Then one collider, not two. The warp is
|
|
387
|
+
* the current-left corner's distance from the plane of the other three.
|
|
388
|
+
*/
|
|
389
|
+
const ax = p.lx - p.gx;
|
|
390
|
+
const ay = p.ly - p.gy;
|
|
391
|
+
const az = p.lz - p.gz;
|
|
392
|
+
const e1x = p.rx - p.gx - ax;
|
|
393
|
+
const e1y = p.ry - p.gy - ay;
|
|
394
|
+
const e1z = p.rz - p.gz - az;
|
|
395
|
+
const e2x = c.rx - c.gx - ax;
|
|
396
|
+
const e2y = c.ry - c.gy - ay;
|
|
397
|
+
const e2z = c.rz - c.gz - az;
|
|
398
|
+
let nx = e1y * e2z - e1z * e2y;
|
|
399
|
+
let ny = e1z * e2x - e1x * e2z;
|
|
400
|
+
let nz = e1x * e2y - e1y * e2x;
|
|
401
|
+
const nl = Math.hypot(nx, ny, nz);
|
|
402
|
+
if (nl > 1e-9) {
|
|
403
|
+
nx /= nl;
|
|
404
|
+
ny /= nl;
|
|
405
|
+
nz /= nl;
|
|
406
|
+
const warp = Math.abs(
|
|
407
|
+
(c.lx - c.gx - ax) * nx + (c.ly - c.gy - ay) * ny + (c.lz - c.gz - az) * nz,
|
|
408
|
+
);
|
|
409
|
+
if (warp <= FLAT_QUAD_M) {
|
|
410
|
+
wedgePoints.length = 0;
|
|
411
|
+
corner(p, false);
|
|
412
|
+
corner(p, true);
|
|
413
|
+
corner(c, true);
|
|
414
|
+
corner(c, false);
|
|
415
|
+
colliders.push(colliderFromShape(hullShape(wedgePoints)));
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// The diagonal the mesh indexes: previous-left to current-right.
|
|
420
|
+
wedgePoints.length = 0;
|
|
421
|
+
corner(p, false);
|
|
422
|
+
corner(p, true);
|
|
423
|
+
corner(c, true);
|
|
424
|
+
colliders.push(colliderFromShape(hullShape(wedgePoints)));
|
|
425
|
+
wedgePoints.length = 0;
|
|
426
|
+
corner(p, false);
|
|
427
|
+
corner(c, true);
|
|
428
|
+
corner(c, false);
|
|
429
|
+
colliders.push(colliderFromShape(hullShape(wedgePoints)));
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
const band = options.edgeBandM ?? 0;
|
|
433
|
+
const edgeSide = options.edgeSide ?? 1;
|
|
434
|
+
const lift = options.liftM ?? 0;
|
|
435
|
+
const give = options.colliderGiveM ?? RIBBON_COLLIDER_GIVE_M;
|
|
436
|
+
/*
|
|
437
|
+
* The lateral range is normalised, and that is a correctness fix rather than tidiness.
|
|
438
|
+
*
|
|
439
|
+
* A slab built from a *descending* range comes out inside-out: measured signed volume
|
|
440
|
+
* +256 one way round and -256 the other. With back-face culling — which the renderer
|
|
441
|
+
* uses everywhere — an inside-out slab is **invisible from outside**, so you look
|
|
442
|
+
* straight through it. That is exactly what shows up under a canal bridge: the ceiling
|
|
443
|
+
* looks glassy and transparent from below, and fixing one side leaves the opposite one
|
|
444
|
+
* untouched — because a canal on one hand
|
|
445
|
+
* multiplies every offset by -1, which reverses the order and turns every band it
|
|
446
|
+
* builds inside out.
|
|
447
|
+
*
|
|
448
|
+
* Fixing it here rather than at the call sites is the point: a caller expressing
|
|
449
|
+
* "from the coping to the far bank" has said something about *space*, not about winding,
|
|
450
|
+
* and no caller should have to know that the difference is visible.
|
|
451
|
+
*/
|
|
452
|
+
const rangeA = options.lateralFromM;
|
|
453
|
+
const rangeB = options.lateralToM;
|
|
454
|
+
const swap = rangeA !== undefined && rangeB !== undefined && rangeA > rangeB;
|
|
455
|
+
const lateralFrom = swap ? rangeB : rangeA;
|
|
456
|
+
const lateralTo = swap ? rangeA : rangeB;
|
|
457
|
+
const absolute = lateralFrom !== undefined && lateralTo !== undefined;
|
|
458
|
+
|
|
459
|
+
const fill = (d: number, into: Section): void => {
|
|
460
|
+
spline.sampleAt(d, sample);
|
|
461
|
+
const half = sample.widthM * 0.5;
|
|
462
|
+
/*
|
|
463
|
+
* Three ways to span a cross-section: the whole surface, a band inset from
|
|
464
|
+
* one edge (a kerb), or a band between two given offsets (a marking).
|
|
465
|
+
*/
|
|
466
|
+
/*
|
|
467
|
+
* Ordered, and the order is what decides the triangle winding.
|
|
468
|
+
*
|
|
469
|
+
* Every quad in this builder puts the first offset at the section's *left* corner
|
|
470
|
+
* and the second at its right, and back faces are culled — so if the two ever
|
|
471
|
+
* arrive the other way round, the piece is built inside out. That is exactly what
|
|
472
|
+
* happened, and it was invisible for as long as it was symmetric:
|
|
473
|
+
*
|
|
474
|
+
* - the full surface spans `-half` to `+half`, left before right, correct;
|
|
475
|
+
* - a kerb at `edgeSide = -1` spans `-half` to `-half + band`, also correct;
|
|
476
|
+
* - a kerb at `edgeSide = +1` spans `+half` to `+half - band` — **reversed**, so
|
|
477
|
+
* its top face points into the deck and is culled, and what shows through is the
|
|
478
|
+
* surface underneath and the band's own underside.
|
|
479
|
+
*
|
|
480
|
+
* One kerb of the two, on one side of every route, worst where a curve brings it to
|
|
481
|
+
* a grazing angle. Once the depth layers had cleaned up the left, the right was
|
|
482
|
+
* unchanged: borders and lines still fighting the main surface, worst on curves.
|
|
483
|
+
*
|
|
484
|
+
* The `absolute` case has the same hazard from the same cause — the canal passes its
|
|
485
|
+
* two offsets multiplied by a side — so this is not special-cased to kerbs. Sorting
|
|
486
|
+
* the pair costs nothing and makes the winding a property of the builder rather than
|
|
487
|
+
* of what a caller happened to pass.
|
|
488
|
+
*/
|
|
489
|
+
const edgeA = absolute ? (lateralFrom as number) : band > 0 ? half * edgeSide : -half;
|
|
490
|
+
const edgeB = absolute ? (lateralTo as number) : band > 0 ? (half - band) * edgeSide : half;
|
|
491
|
+
const outer = Math.min(edgeA, edgeB);
|
|
492
|
+
const inner = Math.max(edgeA, edgeB);
|
|
493
|
+
const cx = sample.x + sample.normalX * lift;
|
|
494
|
+
const cy = sample.y + sample.normalY * lift;
|
|
495
|
+
const cz = sample.z + sample.normalZ * lift;
|
|
496
|
+
const lx = cx + sample.rightX * outer;
|
|
497
|
+
const ly = cy + sample.rightY * outer;
|
|
498
|
+
const lz = cz + sample.rightZ * outer;
|
|
499
|
+
const rx = cx + sample.rightX * inner;
|
|
500
|
+
const ry = cy + sample.rightY * inner;
|
|
501
|
+
const rz = cz + sample.rightZ * inner;
|
|
502
|
+
into.lx = lx;
|
|
503
|
+
into.ly = ly;
|
|
504
|
+
into.lz = lz;
|
|
505
|
+
into.rx = rx;
|
|
506
|
+
into.ry = ry;
|
|
507
|
+
into.rz = rz;
|
|
508
|
+
into.lbx = lx - sample.normalX * thickness;
|
|
509
|
+
into.lby = ly - sample.normalY * thickness;
|
|
510
|
+
into.lbz = lz - sample.normalZ * thickness;
|
|
511
|
+
into.rbx = rx - sample.normalX * thickness;
|
|
512
|
+
into.rby = ry - sample.normalY * thickness;
|
|
513
|
+
into.rbz = rz - sample.normalZ * thickness;
|
|
514
|
+
// The collider's top eases below the drawn one by the give, never past the slab.
|
|
515
|
+
const ease = Math.min(give, thickness * 0.5);
|
|
516
|
+
into.gx = sample.normalX * ease;
|
|
517
|
+
into.gy = sample.normalY * ease;
|
|
518
|
+
into.gz = sample.normalZ * ease;
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
/** One drawn facet of the slab: four faces, and the collision under them. */
|
|
522
|
+
const slab = (p: Section, c: Section): void => {
|
|
523
|
+
// Top, then bottom, then the two sides. Orders chosen so each quad's
|
|
524
|
+
// computed normal points out of the slab; the winding test proves it.
|
|
525
|
+
strip.quad(
|
|
526
|
+
p.lx,
|
|
527
|
+
p.ly,
|
|
528
|
+
p.lz,
|
|
529
|
+
p.rx,
|
|
530
|
+
p.ry,
|
|
531
|
+
p.rz,
|
|
532
|
+
c.rx,
|
|
533
|
+
c.ry,
|
|
534
|
+
c.rz,
|
|
535
|
+
c.lx,
|
|
536
|
+
c.ly,
|
|
537
|
+
c.lz,
|
|
538
|
+
color,
|
|
539
|
+
emissiveNow,
|
|
540
|
+
);
|
|
541
|
+
strip.quad(
|
|
542
|
+
c.lbx,
|
|
543
|
+
c.lby,
|
|
544
|
+
c.lbz,
|
|
545
|
+
c.rbx,
|
|
546
|
+
c.rby,
|
|
547
|
+
c.rbz,
|
|
548
|
+
p.rbx,
|
|
549
|
+
p.rby,
|
|
550
|
+
p.rbz,
|
|
551
|
+
p.lbx,
|
|
552
|
+
p.lby,
|
|
553
|
+
p.lbz,
|
|
554
|
+
color,
|
|
555
|
+
emissiveNow,
|
|
556
|
+
);
|
|
557
|
+
strip.quad(
|
|
558
|
+
p.rx,
|
|
559
|
+
p.ry,
|
|
560
|
+
p.rz,
|
|
561
|
+
p.rbx,
|
|
562
|
+
p.rby,
|
|
563
|
+
p.rbz,
|
|
564
|
+
c.rbx,
|
|
565
|
+
c.rby,
|
|
566
|
+
c.rbz,
|
|
567
|
+
c.rx,
|
|
568
|
+
c.ry,
|
|
569
|
+
c.rz,
|
|
570
|
+
color,
|
|
571
|
+
emissiveNow,
|
|
572
|
+
);
|
|
573
|
+
strip.quad(
|
|
574
|
+
p.lbx,
|
|
575
|
+
p.lby,
|
|
576
|
+
p.lbz,
|
|
577
|
+
p.lx,
|
|
578
|
+
p.ly,
|
|
579
|
+
p.lz,
|
|
580
|
+
c.lx,
|
|
581
|
+
c.ly,
|
|
582
|
+
c.lz,
|
|
583
|
+
c.lbx,
|
|
584
|
+
c.lby,
|
|
585
|
+
c.lbz,
|
|
586
|
+
color,
|
|
587
|
+
emissiveNow,
|
|
588
|
+
);
|
|
589
|
+
// Drawn and collided in the same breath, from the same corners.
|
|
590
|
+
wedgeQuad(p, c);
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
const copy = (from: Section, to: Section): void => {
|
|
594
|
+
to.lx = from.lx;
|
|
595
|
+
to.ly = from.ly;
|
|
596
|
+
to.lz = from.lz;
|
|
597
|
+
to.rx = from.rx;
|
|
598
|
+
to.ry = from.ry;
|
|
599
|
+
to.rz = from.rz;
|
|
600
|
+
to.lbx = from.lbx;
|
|
601
|
+
to.lby = from.lby;
|
|
602
|
+
to.lbz = from.lbz;
|
|
603
|
+
to.rbx = from.rbx;
|
|
604
|
+
to.rby = from.rby;
|
|
605
|
+
to.rbz = from.rbz;
|
|
606
|
+
// The give travels with the section it was measured on. It did not have to
|
|
607
|
+
// before, when only `current` was ever collided; now a wedge takes two
|
|
608
|
+
// cross-sections and half of every quad would have stood flush with the
|
|
609
|
+
// drawn deck — a micro-wall at each facet ridge, the whole way along.
|
|
610
|
+
to.gx = from.gx;
|
|
611
|
+
to.gy = from.gy;
|
|
612
|
+
to.gz = from.gz;
|
|
613
|
+
};
|
|
614
|
+
|
|
615
|
+
/** Seal the open end of a piece so the slab is a closed solid. */
|
|
616
|
+
const cap = (s: Section, facingForward: boolean): void => {
|
|
617
|
+
if (facingForward) {
|
|
618
|
+
strip.quad(
|
|
619
|
+
s.rx,
|
|
620
|
+
s.ry,
|
|
621
|
+
s.rz,
|
|
622
|
+
s.rbx,
|
|
623
|
+
s.rby,
|
|
624
|
+
s.rbz,
|
|
625
|
+
s.lbx,
|
|
626
|
+
s.lby,
|
|
627
|
+
s.lbz,
|
|
628
|
+
s.lx,
|
|
629
|
+
s.ly,
|
|
630
|
+
s.lz,
|
|
631
|
+
color,
|
|
632
|
+
emissiveNow,
|
|
633
|
+
);
|
|
634
|
+
} else {
|
|
635
|
+
strip.quad(
|
|
636
|
+
s.lx,
|
|
637
|
+
s.ly,
|
|
638
|
+
s.lz,
|
|
639
|
+
s.lbx,
|
|
640
|
+
s.lby,
|
|
641
|
+
s.lbz,
|
|
642
|
+
s.rbx,
|
|
643
|
+
s.rby,
|
|
644
|
+
s.rbz,
|
|
645
|
+
s.rx,
|
|
646
|
+
s.ry,
|
|
647
|
+
s.rz,
|
|
648
|
+
color,
|
|
649
|
+
emissiveNow,
|
|
650
|
+
);
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
|
|
654
|
+
// One extra step so the final cross-section lands exactly on the end.
|
|
655
|
+
const startAt = Math.max(0, options.fromM ?? 0);
|
|
656
|
+
const endAt = Math.min(spline.lengthM, options.toM ?? spline.lengthM);
|
|
657
|
+
const span = endAt - startAt;
|
|
658
|
+
if (span <= 0) return { mesh: strip.build(), colliders };
|
|
659
|
+
const steps = Math.max(1, Math.ceil(span / step));
|
|
660
|
+
const exactStep = span / steps;
|
|
661
|
+
|
|
662
|
+
for (let i = 0; i <= steps; i++) {
|
|
663
|
+
const d = startAt + i * exactStep;
|
|
664
|
+
/*
|
|
665
|
+
* A cross-section is present when the surface exists on at least one side
|
|
666
|
+
* of it. That is what makes a hole's edge sharp: the section bordering a
|
|
667
|
+
* hole is still built, so the piece before it gets its end cap in the right
|
|
668
|
+
* place rather than stopping a step short.
|
|
669
|
+
*/
|
|
670
|
+
const before = i > 0 && !inHole(options.holes, d - exactStep * 0.5);
|
|
671
|
+
const after = i < steps && !inHole(options.holes, d + exactStep * 0.5);
|
|
672
|
+
if (!before && !after) {
|
|
673
|
+
if (havePrevious) {
|
|
674
|
+
cap(previous, true);
|
|
675
|
+
havePrevious = false;
|
|
676
|
+
}
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
fill(d, current);
|
|
681
|
+
if (options.shade !== undefined) emissiveNow = options.shade(d, color);
|
|
682
|
+
|
|
683
|
+
if (!before) {
|
|
684
|
+
// Opening a new piece.
|
|
685
|
+
cap(current, false);
|
|
686
|
+
copy(current, previous);
|
|
687
|
+
havePrevious = true;
|
|
688
|
+
continue;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
if (havePrevious) {
|
|
692
|
+
/*
|
|
693
|
+
* As many facets as this stretch of curve needs, never fewer.
|
|
694
|
+
*
|
|
695
|
+
* `step` is one number for a whole route, and a route does not turn at one
|
|
696
|
+
* rate. Where a route reverses its camber — one measured case rolls 17° one
|
|
697
|
+
* way to 16° the other inside nine metres, across a deck 17 m wide — a 2 m facet
|
|
698
|
+
* cuts that corner by **0.85 m**. Everything downstream then disagrees
|
|
699
|
+
* about where the deck is: `RibbonSurface` answers from the smooth curve
|
|
700
|
+
* and puts a character most of a metre inside the drawn slab, where they are
|
|
701
|
+
* buried in their own floor. Buried, they cannot lift, so auto-step cannot
|
|
702
|
+
* fire, so they cannot walk — on that exact camber the player stays stuck
|
|
703
|
+
* the moment they try to run, with impacts on every ridge from the same gap.
|
|
704
|
+
*
|
|
705
|
+
* So the builder measures its own error and subdivides until it is small,
|
|
706
|
+
* rather than trusting a constant. Only the fast-turning spans pay, and
|
|
707
|
+
* they are the ones that were broken.
|
|
708
|
+
*/
|
|
709
|
+
const dPrev = d - exactStep;
|
|
710
|
+
fill((dPrev + d) * 0.5, probe);
|
|
711
|
+
/*
|
|
712
|
+
* Measured at the *diagonal*, which is where a quad is furthest from the
|
|
713
|
+
* curve it stands for.
|
|
714
|
+
*
|
|
715
|
+
* Two cross-sections that differ in bank are skew lines, and the surface
|
|
716
|
+
* ruled between them is not flat — but two triangles are. Both of them
|
|
717
|
+
* share the diagonal, so along that diagonal the drawn deck is the plain
|
|
718
|
+
* average of two opposite corners, while the real deck at the same place
|
|
719
|
+
* is the mid-section's own centre. The gap between those is the whole
|
|
720
|
+
* error, and it is *linear* in the step: half a metre of bank roll across
|
|
721
|
+
* a seventeen-metre deck puts fourteen centimetres of it under a character's
|
|
722
|
+
* feet, which is the give's entire budget spent before the give does any
|
|
723
|
+
* of its own work.
|
|
724
|
+
*
|
|
725
|
+
* Measuring the edges instead — the obvious thing, and what this did
|
|
726
|
+
* first — sees almost none of it: a chord along an edge is out by
|
|
727
|
+
* millimetres where the diagonal is out by a hand's width.
|
|
728
|
+
*/
|
|
729
|
+
const diagSlip = Math.hypot(
|
|
730
|
+
(probe.lx + probe.rx) * 0.5 - (previous.lx + current.rx) * 0.5,
|
|
731
|
+
(probe.ly + probe.ry) * 0.5 - (previous.ly + current.ry) * 0.5,
|
|
732
|
+
(probe.lz + probe.rz) * 0.5 - (previous.lz + current.rz) * 0.5,
|
|
733
|
+
);
|
|
734
|
+
const leftSlip = Math.hypot(
|
|
735
|
+
probe.lx - (previous.lx + current.lx) * 0.5,
|
|
736
|
+
probe.ly - (previous.ly + current.ly) * 0.5,
|
|
737
|
+
probe.lz - (previous.lz + current.lz) * 0.5,
|
|
738
|
+
);
|
|
739
|
+
const rightSlip = Math.hypot(
|
|
740
|
+
probe.rx - (previous.rx + current.rx) * 0.5,
|
|
741
|
+
probe.ry - (previous.ry + current.ry) * 0.5,
|
|
742
|
+
probe.rz - (previous.rz + current.rz) * 0.5,
|
|
743
|
+
);
|
|
744
|
+
const slip = Math.max(diagSlip, leftSlip, rightSlip);
|
|
745
|
+
const cuts =
|
|
746
|
+
slip > MAX_FACET_SLIP_M ? Math.min(MAX_FACET_CUTS, Math.ceil(slip / MAX_FACET_SLIP_M)) : 1;
|
|
747
|
+
/*
|
|
748
|
+
* Whatever a whole number of cuts could not take out, the ease takes.
|
|
749
|
+
* Never past the slab's own depth, so a wedge cannot turn inside out.
|
|
750
|
+
*/
|
|
751
|
+
extraEase = Math.min(Math.max(0, slip / cuts - MAX_FACET_SLIP_M), thickness * 0.5);
|
|
752
|
+
/*
|
|
753
|
+
* The edge-specific half of the same leftover, paid across the section
|
|
754
|
+
* instead of along it — see `lateralEase` above. `leftSlip`/`rightSlip`
|
|
755
|
+
* are exactly the per-edge error `cuts` was chosen from; only their
|
|
756
|
+
* share of what the cut ceiling could not remove needs paying here.
|
|
757
|
+
*/
|
|
758
|
+
lateralEase = Math.min(
|
|
759
|
+
Math.max(0, Math.max(leftSlip, rightSlip) / cuts - MAX_FACET_SLIP_M),
|
|
760
|
+
1.5,
|
|
761
|
+
);
|
|
762
|
+
for (let s = 1; s <= cuts; s++) {
|
|
763
|
+
if (s < cuts) {
|
|
764
|
+
const dSub = dPrev + exactStep * (s / cuts);
|
|
765
|
+
fill(dSub, sub);
|
|
766
|
+
if (options.shade !== undefined) emissiveNow = options.shade(dSub, color);
|
|
767
|
+
slab(previous, sub);
|
|
768
|
+
copy(sub, previous);
|
|
769
|
+
} else {
|
|
770
|
+
if (options.shade !== undefined) emissiveNow = options.shade(d, color);
|
|
771
|
+
slab(previous, current);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
extraEase = 0;
|
|
775
|
+
lateralEase = 0;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
copy(current, previous);
|
|
779
|
+
havePrevious = true;
|
|
780
|
+
|
|
781
|
+
if (!after) {
|
|
782
|
+
cap(current, true);
|
|
783
|
+
havePrevious = false;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
if (havePrevious) cap(previous, true);
|
|
788
|
+
|
|
789
|
+
return { mesh: strip.build(), colliders };
|
|
790
|
+
}
|