@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,132 @@
|
|
|
1
|
+
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
2
|
+
import type { Atmosphere } from './atmosphere.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Where the camera stands relative to a volume of light, decided once for both backends.
|
|
5
|
+
*
|
|
6
|
+
* **The interesting half of `drawLightVolume` is arithmetic, not binding.** The march runs
|
|
7
|
+
* entirely in the volume's own space, so the camera has to arrive there rather than the other
|
|
8
|
+
* way round — one inverse per draw against one transform per fragment — and whether it arrives
|
|
9
|
+
* *inside* the cone decides which half of the hull is kept.
|
|
10
|
+
*
|
|
11
|
+
* Both answers are a rule rather than a binding, which is why they are here and not in either
|
|
12
|
+
* renderer. A second copy of the inside test is a beam that vanishes when somebody walks into
|
|
13
|
+
* it on one backend and not the other, and nothing would raise: the frame is a plausible one
|
|
14
|
+
* either way. That is the 2026-08-13 rule in `AGENTS.md`, and `resolveAtmosphere`,
|
|
15
|
+
* `resolvePointLights` and `resolveWater` are the same split applied to their own passes.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* A stored depth in [0,1] back to the clip space `viewProjection` was built in, which is [-1,1].
|
|
19
|
+
*
|
|
20
|
+
* The march's scene-depth clamp feeds the shader `vec4(uv * 2 - 1, stored, 1)` and multiplies it
|
|
21
|
+
* by `inverse(viewProjection * model)`, which is built from the **raw** matrix on both backends.
|
|
22
|
+
* `uv` is `gl_FragCoord.xy * uInvViewport`, so what arrives is a screen position and a depth, and
|
|
23
|
+
* this is what turns the depth half of it into the NDC z that inverse expects.
|
|
24
|
+
*
|
|
25
|
+
* Here rather than in either renderer for the reason at the top of this file: it is a rule, and
|
|
26
|
+
* two copies of a rule is a beam that clamps differently depending on who drew it.
|
|
27
|
+
*
|
|
28
|
+
* Column major: (x, y, z, 1) -> (x, y, 2z - 1, 1) conventionally, and (x, y, 1 - 2z, 1) once
|
|
29
|
+
* depth is reversed, because a reversed buffer stores `0.5 - 0.5z` and this is its inverse.
|
|
30
|
+
*
|
|
31
|
+
* **This one is for a backend whose framebuffer Y runs up. See `DEPTH_01_TO_CLIP_Y_DOWN`, which
|
|
32
|
+
* is the same remap for one whose Y runs down, and read its derivation before touching either.**
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEPTH_01_TO_CLIP: ReadonlyMat4;
|
|
35
|
+
/**
|
|
36
|
+
* The same remap, **and a Y flip**, for a backend whose framebuffer Y runs down.
|
|
37
|
+
*
|
|
38
|
+
* **The two backends do not share one matrix here, and the argument that they could is the
|
|
39
|
+
* defect this constant exists to close.** It ran like this: WebGPU's framebuffer `v` is top-down
|
|
40
|
+
* so `2v - 1 = -ndc.y`, and the scene was drawn through a `CLIP_CORRECTION` that negates Y, so
|
|
41
|
+
* the two negations cancel and the raw view-projection's own NDC comes back out. Every step of
|
|
42
|
+
* that is true except the one it leaves out.
|
|
43
|
+
*
|
|
44
|
+
* **The generated shaders flip Y a second time.** `scripts/wgsl.ts` runs naga without
|
|
45
|
+
* `--keep-coordinate-space`, so every WGSL vertex entry point this engine ships ends with
|
|
46
|
+
* `gl_Position.y = -gl_Position.y` — check any file under `shaders/generated`, they all carry
|
|
47
|
+
* it. That is what makes the frame land the right way up *despite* `CLIP_CORRECTION`, and it is
|
|
48
|
+
* why `sky.ts` needs `INVERSE_CLIP_CORRECTION` to unproject the clip position it wrote itself.
|
|
49
|
+
* So the Y the rasteriser actually used is the raw matrix's Y, not its negation, and `2v - 1`
|
|
50
|
+
* is the negation of the value the clamp has to be handed.
|
|
51
|
+
*
|
|
52
|
+
* **What one missing negation does to a beam**: the depth fetched is the right pixel's, and the
|
|
53
|
+
* screen position it is unprojected through is that pixel mirrored about the middle of the frame.
|
|
54
|
+
* The reconstructed point sits at the true distance along the mirrored ray, so projecting it back
|
|
55
|
+
* onto the true one shortens it by `cos(2t)`, where `t` is the vertical angle the pixel sits at
|
|
56
|
+
* off the view axis. Exact along the frame's horizontal centre line, zero at 45 degrees off it,
|
|
57
|
+
* and negative past that — which discards the fragment outright.
|
|
58
|
+
*
|
|
59
|
+
* **Measured before it was believed**, by writing the reconstructed distance out as colour and
|
|
60
|
+
* photographing `demo/dev/volume.html` on both backends: against a scene the clamp could reach,
|
|
61
|
+
* the ratio of the two ran 0.927, 0.941, 0.964, 0.968, 0.986, 0.987 down the beam where
|
|
62
|
+
* `cos(2t)` is 0.911, 0.934, 0.954, 0.970, 0.983, 0.993. Five hypotheses formed by reading the
|
|
63
|
+
* shader were wrong before this one was formed by reading a photograph.
|
|
64
|
+
*
|
|
65
|
+
* A landscape frame at a 48-degree vertical field of view never gets far enough off axis for
|
|
66
|
+
* this to be more than a dim band on the floor, which is why the harness page agreed to within
|
|
67
|
+
* a few thousand pixels for four capture rounds. A portrait one, which is what one consumer
|
|
68
|
+
* composes, reaches the angles that take the top off a shaft.
|
|
69
|
+
*
|
|
70
|
+
* Column major: (x, y, z, 1) -> (x, -y, 2z - 1, 1).
|
|
71
|
+
*/
|
|
72
|
+
export declare const DEPTH_01_TO_CLIP_Y_DOWN: ReadonlyMat4;
|
|
73
|
+
/** The two things a light-volume draw has to work out before it can bind anything. */
|
|
74
|
+
export interface ResolvedLightVolume {
|
|
75
|
+
/** The camera in the volume's own space, which is the frame the whole march happens in. */
|
|
76
|
+
readonly cameraLocal: Float32Array;
|
|
77
|
+
/**
|
|
78
|
+
* Whether the camera is inside the cone.
|
|
79
|
+
*
|
|
80
|
+
* From outside, the hull's front faces are where a view ray enters it. From inside they are
|
|
81
|
+
* behind the viewer, so keeping them makes a beam disappear the moment somebody steps into
|
|
82
|
+
* it — which the pass this replaced avoided by culling nothing at all, an option a closed
|
|
83
|
+
* hull does not have: every pixel would then be marched twice and arrive at double
|
|
84
|
+
* brightness.
|
|
85
|
+
*/
|
|
86
|
+
inside: boolean;
|
|
87
|
+
}
|
|
88
|
+
export declare function createResolvedLightVolume(): ResolvedLightVolume;
|
|
89
|
+
/**
|
|
90
|
+
* Put the camera in the volume's space and decide which half of the hull survives.
|
|
91
|
+
*
|
|
92
|
+
* `length` and `spread` are the *draw call's* numbers rather than the geometry's, which is the
|
|
93
|
+
* same pair the shader fades against — so a hull built wider than the aperture it is drawn
|
|
94
|
+
* with is culled by the aperture, exactly as it is shaded by it.
|
|
95
|
+
*
|
|
96
|
+
* **A singular model matrix leaves the previous answer in place rather than raising.** That is
|
|
97
|
+
* `mat4.invert`'s own behaviour and it is kept: this runs in the frame loop, where `AGENTS.md`
|
|
98
|
+
* forbids throwing, and a degenerate transform means the caller has already collapsed the hull
|
|
99
|
+
* to nothing, so there are no pixels for a stale camera position to be wrong about.
|
|
100
|
+
*/
|
|
101
|
+
export declare function resolveLightVolume(model: ReadonlyMat4, cameraPosition: ArrayLike<number>, length: number, spread: number, out: ResolvedLightVolume): ResolvedLightVolume;
|
|
102
|
+
/**
|
|
103
|
+
* How much of a beam the air is thick enough to show, from the medium it stands in.
|
|
104
|
+
*
|
|
105
|
+
* **The shader's own header says a beam is more visible in fog and nothing made it so.** Every
|
|
106
|
+
* term in that program is deliberately unlit, unfogged and unscaled by night, for reasons that
|
|
107
|
+
* file records at length and that are all correct: fog *dims* a surface, and dimming the thing
|
|
108
|
+
* that is being lit by ninety metres of medium is what made the first two attempts vanish. What
|
|
109
|
+
* was left out is the other direction. A headlight cone in clear air and the same cone in thick
|
|
110
|
+
* fog were the same picture, because `strength` is a number the caller authored once and nothing
|
|
111
|
+
* between it and the frame knew what the weather was.
|
|
112
|
+
*
|
|
113
|
+
* That was reported from outside as the largest gap in one of eight weather states, and the
|
|
114
|
+
* criterion it fails is worth quoting: fog should change how the road is *perceived* rather than
|
|
115
|
+
* filter the frame. At night in thick fog the beam **is** the road. Without it, driving in fog is
|
|
116
|
+
* driving in a grey box.
|
|
117
|
+
*
|
|
118
|
+
* **A multiplier on the CPU rather than a uniform**, which is the reason this is four lines: the
|
|
119
|
+
* shader clamps `uStrength` to 1, so a gain could only ever go downward anyway, and the whole
|
|
120
|
+
* effect is one number per draw rather than one per fragment. Nothing recompiles, nothing is
|
|
121
|
+
* bound, and both backends cannot disagree because there is only this function — which is what
|
|
122
|
+
* this file is for.
|
|
123
|
+
*
|
|
124
|
+
* **Density is taken where the volume is, not where the camera is.** `fogDensityAtEye` reads a
|
|
125
|
+
* height against the haze's own falloff, and a car in a valley of fog with the camera on the
|
|
126
|
+
* ridge above it is exactly the case that distinction exists for. The height comes from the model
|
|
127
|
+
* matrix's translation, so a beam attached to something moving carries its own weather.
|
|
128
|
+
*
|
|
129
|
+
* Returns 1 where the air is at least as thick as `fullAtDensity`, which keeps this incapable of
|
|
130
|
+
* brightening a beam past what its author asked for.
|
|
131
|
+
*/
|
|
132
|
+
export declare function volumeMediumGain(atmosphere: Atmosphere, model: ReadonlyMat4, fullAtDensity: number): number;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { REVERSED_DEPTH } from './depthConvention.js';
|
|
2
|
+
import { mat4 } from 'gl-matrix';
|
|
3
|
+
import { fogDensityAtEye } from './atmosphere.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where the camera stands relative to a volume of light, decided once for both backends.
|
|
6
|
+
*
|
|
7
|
+
* **The interesting half of `drawLightVolume` is arithmetic, not binding.** The march runs
|
|
8
|
+
* entirely in the volume's own space, so the camera has to arrive there rather than the other
|
|
9
|
+
* way round — one inverse per draw against one transform per fragment — and whether it arrives
|
|
10
|
+
* *inside* the cone decides which half of the hull is kept.
|
|
11
|
+
*
|
|
12
|
+
* Both answers are a rule rather than a binding, which is why they are here and not in either
|
|
13
|
+
* renderer. A second copy of the inside test is a beam that vanishes when somebody walks into
|
|
14
|
+
* it on one backend and not the other, and nothing would raise: the frame is a plausible one
|
|
15
|
+
* either way. That is the 2026-08-13 rule in `AGENTS.md`, and `resolveAtmosphere`,
|
|
16
|
+
* `resolvePointLights` and `resolveWater` are the same split applied to their own passes.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* A stored depth in [0,1] back to the clip space `viewProjection` was built in, which is [-1,1].
|
|
20
|
+
*
|
|
21
|
+
* The march's scene-depth clamp feeds the shader `vec4(uv * 2 - 1, stored, 1)` and multiplies it
|
|
22
|
+
* by `inverse(viewProjection * model)`, which is built from the **raw** matrix on both backends.
|
|
23
|
+
* `uv` is `gl_FragCoord.xy * uInvViewport`, so what arrives is a screen position and a depth, and
|
|
24
|
+
* this is what turns the depth half of it into the NDC z that inverse expects.
|
|
25
|
+
*
|
|
26
|
+
* Here rather than in either renderer for the reason at the top of this file: it is a rule, and
|
|
27
|
+
* two copies of a rule is a beam that clamps differently depending on who drew it.
|
|
28
|
+
*
|
|
29
|
+
* Column major: (x, y, z, 1) -> (x, y, 2z - 1, 1) conventionally, and (x, y, 1 - 2z, 1) once
|
|
30
|
+
* depth is reversed, because a reversed buffer stores `0.5 - 0.5z` and this is its inverse.
|
|
31
|
+
*
|
|
32
|
+
* **This one is for a backend whose framebuffer Y runs up. See `DEPTH_01_TO_CLIP_Y_DOWN`, which
|
|
33
|
+
* is the same remap for one whose Y runs down, and read its derivation before touching either.**
|
|
34
|
+
*/
|
|
35
|
+
export const DEPTH_01_TO_CLIP = new Float32Array([
|
|
36
|
+
1,
|
|
37
|
+
0,
|
|
38
|
+
0,
|
|
39
|
+
0,
|
|
40
|
+
0,
|
|
41
|
+
1,
|
|
42
|
+
0,
|
|
43
|
+
0,
|
|
44
|
+
0,
|
|
45
|
+
0,
|
|
46
|
+
REVERSED_DEPTH ? -2 : 2,
|
|
47
|
+
0,
|
|
48
|
+
0,
|
|
49
|
+
0,
|
|
50
|
+
REVERSED_DEPTH ? 1 : -1,
|
|
51
|
+
1,
|
|
52
|
+
]);
|
|
53
|
+
/**
|
|
54
|
+
* The same remap, **and a Y flip**, for a backend whose framebuffer Y runs down.
|
|
55
|
+
*
|
|
56
|
+
* **The two backends do not share one matrix here, and the argument that they could is the
|
|
57
|
+
* defect this constant exists to close.** It ran like this: WebGPU's framebuffer `v` is top-down
|
|
58
|
+
* so `2v - 1 = -ndc.y`, and the scene was drawn through a `CLIP_CORRECTION` that negates Y, so
|
|
59
|
+
* the two negations cancel and the raw view-projection's own NDC comes back out. Every step of
|
|
60
|
+
* that is true except the one it leaves out.
|
|
61
|
+
*
|
|
62
|
+
* **The generated shaders flip Y a second time.** `scripts/wgsl.ts` runs naga without
|
|
63
|
+
* `--keep-coordinate-space`, so every WGSL vertex entry point this engine ships ends with
|
|
64
|
+
* `gl_Position.y = -gl_Position.y` — check any file under `shaders/generated`, they all carry
|
|
65
|
+
* it. That is what makes the frame land the right way up *despite* `CLIP_CORRECTION`, and it is
|
|
66
|
+
* why `sky.ts` needs `INVERSE_CLIP_CORRECTION` to unproject the clip position it wrote itself.
|
|
67
|
+
* So the Y the rasteriser actually used is the raw matrix's Y, not its negation, and `2v - 1`
|
|
68
|
+
* is the negation of the value the clamp has to be handed.
|
|
69
|
+
*
|
|
70
|
+
* **What one missing negation does to a beam**: the depth fetched is the right pixel's, and the
|
|
71
|
+
* screen position it is unprojected through is that pixel mirrored about the middle of the frame.
|
|
72
|
+
* The reconstructed point sits at the true distance along the mirrored ray, so projecting it back
|
|
73
|
+
* onto the true one shortens it by `cos(2t)`, where `t` is the vertical angle the pixel sits at
|
|
74
|
+
* off the view axis. Exact along the frame's horizontal centre line, zero at 45 degrees off it,
|
|
75
|
+
* and negative past that — which discards the fragment outright.
|
|
76
|
+
*
|
|
77
|
+
* **Measured before it was believed**, by writing the reconstructed distance out as colour and
|
|
78
|
+
* photographing `demo/dev/volume.html` on both backends: against a scene the clamp could reach,
|
|
79
|
+
* the ratio of the two ran 0.927, 0.941, 0.964, 0.968, 0.986, 0.987 down the beam where
|
|
80
|
+
* `cos(2t)` is 0.911, 0.934, 0.954, 0.970, 0.983, 0.993. Five hypotheses formed by reading the
|
|
81
|
+
* shader were wrong before this one was formed by reading a photograph.
|
|
82
|
+
*
|
|
83
|
+
* A landscape frame at a 48-degree vertical field of view never gets far enough off axis for
|
|
84
|
+
* this to be more than a dim band on the floor, which is why the harness page agreed to within
|
|
85
|
+
* a few thousand pixels for four capture rounds. A portrait one, which is what one consumer
|
|
86
|
+
* composes, reaches the angles that take the top off a shaft.
|
|
87
|
+
*
|
|
88
|
+
* Column major: (x, y, z, 1) -> (x, -y, 2z - 1, 1).
|
|
89
|
+
*/
|
|
90
|
+
export const DEPTH_01_TO_CLIP_Y_DOWN = new Float32Array([
|
|
91
|
+
1,
|
|
92
|
+
0,
|
|
93
|
+
0,
|
|
94
|
+
0,
|
|
95
|
+
0,
|
|
96
|
+
-1,
|
|
97
|
+
0,
|
|
98
|
+
0,
|
|
99
|
+
0,
|
|
100
|
+
0,
|
|
101
|
+
REVERSED_DEPTH ? -2 : 2,
|
|
102
|
+
0,
|
|
103
|
+
0,
|
|
104
|
+
0,
|
|
105
|
+
REVERSED_DEPTH ? 1 : -1,
|
|
106
|
+
1,
|
|
107
|
+
]);
|
|
108
|
+
export function createResolvedLightVolume() {
|
|
109
|
+
return { cameraLocal: new Float32Array(3), inside: false };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Scratch for the inverse model matrix. Module scope because this is a per-frame path and
|
|
113
|
+
* `AGENTS.md` allows no allocation in one.
|
|
114
|
+
*/
|
|
115
|
+
const scratchInverse = mat4.create();
|
|
116
|
+
/**
|
|
117
|
+
* Put the camera in the volume's space and decide which half of the hull survives.
|
|
118
|
+
*
|
|
119
|
+
* `length` and `spread` are the *draw call's* numbers rather than the geometry's, which is the
|
|
120
|
+
* same pair the shader fades against — so a hull built wider than the aperture it is drawn
|
|
121
|
+
* with is culled by the aperture, exactly as it is shaded by it.
|
|
122
|
+
*
|
|
123
|
+
* **A singular model matrix leaves the previous answer in place rather than raising.** That is
|
|
124
|
+
* `mat4.invert`'s own behaviour and it is kept: this runs in the frame loop, where `AGENTS.md`
|
|
125
|
+
* forbids throwing, and a degenerate transform means the caller has already collapsed the hull
|
|
126
|
+
* to nothing, so there are no pixels for a stale camera position to be wrong about.
|
|
127
|
+
*/
|
|
128
|
+
export function resolveLightVolume(model, cameraPosition, length, spread, out) {
|
|
129
|
+
mat4.invert(scratchInverse, model);
|
|
130
|
+
const m = scratchInverse;
|
|
131
|
+
const x = cameraPosition[0] ?? 0;
|
|
132
|
+
const y = cameraPosition[1] ?? 0;
|
|
133
|
+
const z = cameraPosition[2] ?? 0;
|
|
134
|
+
const local = out.cameraLocal;
|
|
135
|
+
local[0] = (m[0] ?? 0) * x + (m[4] ?? 0) * y + (m[8] ?? 0) * z + (m[12] ?? 0);
|
|
136
|
+
local[1] = (m[1] ?? 0) * x + (m[5] ?? 0) * y + (m[9] ?? 0) * z + (m[13] ?? 0);
|
|
137
|
+
local[2] = (m[2] ?? 0) * x + (m[6] ?? 0) * y + (m[10] ?? 0) * z + (m[14] ?? 0);
|
|
138
|
+
const axial = local[2] ?? 0;
|
|
139
|
+
const radial = Math.hypot(local[0] ?? 0, local[1] ?? 0);
|
|
140
|
+
out.inside = axial >= 0 && axial <= length && radial <= spread * axial;
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* How much of a beam the air is thick enough to show, from the medium it stands in.
|
|
145
|
+
*
|
|
146
|
+
* **The shader's own header says a beam is more visible in fog and nothing made it so.** Every
|
|
147
|
+
* term in that program is deliberately unlit, unfogged and unscaled by night, for reasons that
|
|
148
|
+
* file records at length and that are all correct: fog *dims* a surface, and dimming the thing
|
|
149
|
+
* that is being lit by ninety metres of medium is what made the first two attempts vanish. What
|
|
150
|
+
* was left out is the other direction. A headlight cone in clear air and the same cone in thick
|
|
151
|
+
* fog were the same picture, because `strength` is a number the caller authored once and nothing
|
|
152
|
+
* between it and the frame knew what the weather was.
|
|
153
|
+
*
|
|
154
|
+
* That was reported from outside as the largest gap in one of eight weather states, and the
|
|
155
|
+
* criterion it fails is worth quoting: fog should change how the road is *perceived* rather than
|
|
156
|
+
* filter the frame. At night in thick fog the beam **is** the road. Without it, driving in fog is
|
|
157
|
+
* driving in a grey box.
|
|
158
|
+
*
|
|
159
|
+
* **A multiplier on the CPU rather than a uniform**, which is the reason this is four lines: the
|
|
160
|
+
* shader clamps `uStrength` to 1, so a gain could only ever go downward anyway, and the whole
|
|
161
|
+
* effect is one number per draw rather than one per fragment. Nothing recompiles, nothing is
|
|
162
|
+
* bound, and both backends cannot disagree because there is only this function — which is what
|
|
163
|
+
* this file is for.
|
|
164
|
+
*
|
|
165
|
+
* **Density is taken where the volume is, not where the camera is.** `fogDensityAtEye` reads a
|
|
166
|
+
* height against the haze's own falloff, and a car in a valley of fog with the camera on the
|
|
167
|
+
* ridge above it is exactly the case that distinction exists for. The height comes from the model
|
|
168
|
+
* matrix's translation, so a beam attached to something moving carries its own weather.
|
|
169
|
+
*
|
|
170
|
+
* Returns 1 where the air is at least as thick as `fullAtDensity`, which keeps this incapable of
|
|
171
|
+
* brightening a beam past what its author asked for.
|
|
172
|
+
*/
|
|
173
|
+
export function volumeMediumGain(atmosphere, model, fullAtDensity) {
|
|
174
|
+
if (!(fullAtDensity > 0))
|
|
175
|
+
return 1;
|
|
176
|
+
const density = fogDensityAtEye(atmosphere, model[13] ?? 0);
|
|
177
|
+
if (!(density > 0))
|
|
178
|
+
return 0;
|
|
179
|
+
const gain = density / fullAtDensity;
|
|
180
|
+
return gain >= 1 ? 1 : gain;
|
|
181
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { LineSegments } from './linePoints.ts';
|
|
2
|
+
/**
|
|
3
|
+
* One draw call for a polyline with a real width — an audio waveform, a trail, a plotted
|
|
4
|
+
* curve, anything that is a stroke rather than a surface.
|
|
5
|
+
*
|
|
6
|
+
* Four vertices per segment rather than instancing, exactly as `BoltBatch` is: a segment's
|
|
7
|
+
* two endpoints *are* its geometry, so there is no repeated base shape to instance and an
|
|
8
|
+
* instanced version would upload the same two positions per vertex anyway. `SEGMENT_CORNERS`
|
|
9
|
+
* and the index list come from `segmentQuads.ts`, shared with the arc renderer so the two
|
|
10
|
+
* cannot drift into two different meshes for the same segment.
|
|
11
|
+
*
|
|
12
|
+
* **Alpha blended, depth tested, depth write off — not additive.** An arc is light arriving
|
|
13
|
+
* and adds to what is behind it; a line is a surface-ish thing that occludes in colour but
|
|
14
|
+
* must not cut a hole in the depth buffer from its own soft antialiased edge. That is the
|
|
15
|
+
* rule the SDF text renderer follows for the same reason, and `drawTo` leaves depth
|
|
16
|
+
* *testing* alone the way that renderer does, on the assumption that the mesh pass already
|
|
17
|
+
* has it enabled with `LEQUAL` — this is world geometry, not a screen overlay recovering
|
|
18
|
+
* state from whatever ran before it.
|
|
19
|
+
*/
|
|
20
|
+
export declare class LineBatch {
|
|
21
|
+
readonly program: WebGLProgram;
|
|
22
|
+
readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
23
|
+
private readonly vao;
|
|
24
|
+
private readonly buffers;
|
|
25
|
+
private readonly fromBuffer;
|
|
26
|
+
private readonly toBuffer;
|
|
27
|
+
/** Scratch, expanded from the segment list's per-segment arrays to per-vertex ones. */
|
|
28
|
+
private readonly from;
|
|
29
|
+
private readonly to;
|
|
30
|
+
private readonly capacity;
|
|
31
|
+
constructor(gl: WebGL2RenderingContext, capacity: number, label: string);
|
|
32
|
+
/**
|
|
33
|
+
* Send this frame's polyline, expanding each segment to its four vertices.
|
|
34
|
+
*
|
|
35
|
+
* The expansion is written here rather than folded into `expandBoltSegments`: that
|
|
36
|
+
* function reads a `BoltSegments` — five arrays beyond `from`/`to` — and teaching it to
|
|
37
|
+
* read a `LineSegments` too would grow a union that couples two renderers sharing only a
|
|
38
|
+
* quad. This walk is the same shape with none of that: two positions in, copied to four
|
|
39
|
+
* vertices each.
|
|
40
|
+
*/
|
|
41
|
+
upload(gl: WebGL2RenderingContext, data: LineSegments): number;
|
|
42
|
+
/**
|
|
43
|
+
* @param additive Whether this stroke is *light arriving* rather than a thing in the world.
|
|
44
|
+
*
|
|
45
|
+
* **It states what the stroke is; it does not turn a line into a bolt.** `AGENTS.md` forbids a
|
|
46
|
+
* mode flag on one verb to get the other, and this is not one: a bolt jitters along its own path
|
|
47
|
+
* because it is lightning, and that is a fact about its *geometry* which nothing here changes. A
|
|
48
|
+
* line asked to be additive still follows the path it was given, still has a clean edge, and is
|
|
49
|
+
* still fogged. What changes is that it adds to what is behind it instead of covering it.
|
|
50
|
+
*
|
|
51
|
+
* Reported by a consumer drawing a glowing block outline: the only additive stroke was
|
|
52
|
+
* `drawBolts`, which jitters, so they drew two alpha-blended passes at different softness and
|
|
53
|
+
* measured what it cost — against a bright surface it tints toward the glow colour instead of
|
|
54
|
+
* adding light to it, which is visible on sand at noon and indistinguishable in a cave.
|
|
55
|
+
*/
|
|
56
|
+
drawTo(gl: WebGL2RenderingContext, segmentCount: number, additive?: boolean): void;
|
|
57
|
+
dispose(gl: WebGL2RenderingContext): void;
|
|
58
|
+
private dynamic;
|
|
59
|
+
private staticAttr;
|
|
60
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
2
|
+
import { LINE_FRAG, LINE_VERT } from './shaders/line.js';
|
|
3
|
+
import { buildSegmentQuads } from './segmentQuads.js';
|
|
4
|
+
/**
|
|
5
|
+
* One draw call for a polyline with a real width — an audio waveform, a trail, a plotted
|
|
6
|
+
* curve, anything that is a stroke rather than a surface.
|
|
7
|
+
*
|
|
8
|
+
* Four vertices per segment rather than instancing, exactly as `BoltBatch` is: a segment's
|
|
9
|
+
* two endpoints *are* its geometry, so there is no repeated base shape to instance and an
|
|
10
|
+
* instanced version would upload the same two positions per vertex anyway. `SEGMENT_CORNERS`
|
|
11
|
+
* and the index list come from `segmentQuads.ts`, shared with the arc renderer so the two
|
|
12
|
+
* cannot drift into two different meshes for the same segment.
|
|
13
|
+
*
|
|
14
|
+
* **Alpha blended, depth tested, depth write off — not additive.** An arc is light arriving
|
|
15
|
+
* and adds to what is behind it; a line is a surface-ish thing that occludes in colour but
|
|
16
|
+
* must not cut a hole in the depth buffer from its own soft antialiased edge. That is the
|
|
17
|
+
* rule the SDF text renderer follows for the same reason, and `drawTo` leaves depth
|
|
18
|
+
* *testing* alone the way that renderer does, on the assumption that the mesh pass already
|
|
19
|
+
* has it enabled with `LEQUAL` — this is world geometry, not a screen overlay recovering
|
|
20
|
+
* state from whatever ran before it.
|
|
21
|
+
*/
|
|
22
|
+
export class LineBatch {
|
|
23
|
+
program;
|
|
24
|
+
uniforms;
|
|
25
|
+
vao;
|
|
26
|
+
buffers = [];
|
|
27
|
+
fromBuffer;
|
|
28
|
+
toBuffer;
|
|
29
|
+
/** Scratch, expanded from the segment list's per-segment arrays to per-vertex ones. */
|
|
30
|
+
from;
|
|
31
|
+
to;
|
|
32
|
+
capacity;
|
|
33
|
+
constructor(gl, capacity, label) {
|
|
34
|
+
this.program = compileProgram(gl, LINE_VERT, LINE_FRAG, label);
|
|
35
|
+
this.uniforms = uniformLocations(gl, this.program, 'lineBatch');
|
|
36
|
+
this.capacity = capacity;
|
|
37
|
+
const verts = capacity * 4;
|
|
38
|
+
this.from = new Float32Array(verts * 3);
|
|
39
|
+
this.to = new Float32Array(verts * 3);
|
|
40
|
+
/*
|
|
41
|
+
* The corner layout and the index list are the only static data: which end of the
|
|
42
|
+
* segment a vertex sits at, and which side of it. Everything else arrives per frame.
|
|
43
|
+
* Built in `segmentQuads.ts`, so both a bolt and a line draw the same quad.
|
|
44
|
+
*/
|
|
45
|
+
const { corners, indices } = buildSegmentQuads(capacity);
|
|
46
|
+
const vao = gl.createVertexArray();
|
|
47
|
+
if (vao === null)
|
|
48
|
+
throw new Error(`${label}: createVertexArray failed`);
|
|
49
|
+
this.vao = vao;
|
|
50
|
+
gl.bindVertexArray(vao);
|
|
51
|
+
// Locations pinned to `line.ts`'s own `layout(location = ...)` qualifiers: 0 aFrom, 1
|
|
52
|
+
// aTo, 2 aCorner. There is no third dynamic attribute — a line has no envelope to carry.
|
|
53
|
+
this.fromBuffer = this.dynamic(gl, 0, verts * 3, 3, label);
|
|
54
|
+
this.toBuffer = this.dynamic(gl, 1, verts * 3, 3, label);
|
|
55
|
+
this.staticAttr(gl, 2, corners, 2, label);
|
|
56
|
+
const indexBuffer = gl.createBuffer();
|
|
57
|
+
if (indexBuffer === null)
|
|
58
|
+
throw new Error(`${label}: createBuffer failed`);
|
|
59
|
+
this.buffers.push(indexBuffer);
|
|
60
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
61
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
62
|
+
gl.bindVertexArray(null);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Send this frame's polyline, expanding each segment to its four vertices.
|
|
66
|
+
*
|
|
67
|
+
* The expansion is written here rather than folded into `expandBoltSegments`: that
|
|
68
|
+
* function reads a `BoltSegments` — five arrays beyond `from`/`to` — and teaching it to
|
|
69
|
+
* read a `LineSegments` too would grow a union that couples two renderers sharing only a
|
|
70
|
+
* quad. This walk is the same shape with none of that: two positions in, copied to four
|
|
71
|
+
* vertices each.
|
|
72
|
+
*/
|
|
73
|
+
upload(gl, data) {
|
|
74
|
+
const count = Math.min(data.count, this.capacity);
|
|
75
|
+
for (let s = 0; s < count; s++) {
|
|
76
|
+
const fx = data.from[s * 3];
|
|
77
|
+
const fy = data.from[s * 3 + 1];
|
|
78
|
+
const fz = data.from[s * 3 + 2];
|
|
79
|
+
const tx = data.to[s * 3];
|
|
80
|
+
const ty = data.to[s * 3 + 1];
|
|
81
|
+
const tz = data.to[s * 3 + 2];
|
|
82
|
+
for (let c = 0; c < 4; c++) {
|
|
83
|
+
const v = s * 4 + c;
|
|
84
|
+
this.from[v * 3] = fx;
|
|
85
|
+
this.from[v * 3 + 1] = fy;
|
|
86
|
+
this.from[v * 3 + 2] = fz;
|
|
87
|
+
this.to[v * 3] = tx;
|
|
88
|
+
this.to[v * 3 + 1] = ty;
|
|
89
|
+
this.to[v * 3 + 2] = tz;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (count === 0)
|
|
93
|
+
return 0;
|
|
94
|
+
const verts = count * 4;
|
|
95
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.fromBuffer);
|
|
96
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.from, 0, verts * 3);
|
|
97
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.toBuffer);
|
|
98
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.to, 0, verts * 3);
|
|
99
|
+
return count;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @param additive Whether this stroke is *light arriving* rather than a thing in the world.
|
|
103
|
+
*
|
|
104
|
+
* **It states what the stroke is; it does not turn a line into a bolt.** `AGENTS.md` forbids a
|
|
105
|
+
* mode flag on one verb to get the other, and this is not one: a bolt jitters along its own path
|
|
106
|
+
* because it is lightning, and that is a fact about its *geometry* which nothing here changes. A
|
|
107
|
+
* line asked to be additive still follows the path it was given, still has a clean edge, and is
|
|
108
|
+
* still fogged. What changes is that it adds to what is behind it instead of covering it.
|
|
109
|
+
*
|
|
110
|
+
* Reported by a consumer drawing a glowing block outline: the only additive stroke was
|
|
111
|
+
* `drawBolts`, which jitters, so they drew two alpha-blended passes at different softness and
|
|
112
|
+
* measured what it cost — against a bright surface it tints toward the glow colour instead of
|
|
113
|
+
* adding light to it, which is visible on sand at noon and indistinguishable in a cave.
|
|
114
|
+
*/
|
|
115
|
+
drawTo(gl, segmentCount, additive = false) {
|
|
116
|
+
if (segmentCount === 0)
|
|
117
|
+
return;
|
|
118
|
+
gl.enable(gl.BLEND);
|
|
119
|
+
gl.blendFunc(gl.SRC_ALPHA, additive ? gl.ONE : gl.ONE_MINUS_SRC_ALPHA);
|
|
120
|
+
gl.depthMask(false);
|
|
121
|
+
// The quad billboards toward the view direction the same way a bolt's does — see
|
|
122
|
+
// `line.ts`'s own `cross(dir, view)` — so its winding can flip with the camera exactly
|
|
123
|
+
// as a bolt's can, and culling it would drop the line from half the angles it is seen.
|
|
124
|
+
gl.disable(gl.CULL_FACE);
|
|
125
|
+
gl.bindVertexArray(this.vao);
|
|
126
|
+
gl.drawElements(gl.TRIANGLES, segmentCount * 6, gl.UNSIGNED_INT, 0);
|
|
127
|
+
gl.bindVertexArray(null);
|
|
128
|
+
gl.enable(gl.CULL_FACE);
|
|
129
|
+
gl.depthMask(true);
|
|
130
|
+
gl.disable(gl.BLEND);
|
|
131
|
+
}
|
|
132
|
+
dispose(gl) {
|
|
133
|
+
for (const buffer of this.buffers)
|
|
134
|
+
gl.deleteBuffer(buffer);
|
|
135
|
+
this.buffers.length = 0;
|
|
136
|
+
gl.deleteVertexArray(this.vao);
|
|
137
|
+
gl.deleteProgram(this.program);
|
|
138
|
+
}
|
|
139
|
+
dynamic(gl, location, floats, size, label) {
|
|
140
|
+
const buffer = gl.createBuffer();
|
|
141
|
+
if (buffer === null)
|
|
142
|
+
throw new Error(`${label}: createBuffer failed`);
|
|
143
|
+
this.buffers.push(buffer);
|
|
144
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
145
|
+
gl.bufferData(gl.ARRAY_BUFFER, floats * 4, gl.DYNAMIC_DRAW);
|
|
146
|
+
gl.enableVertexAttribArray(location);
|
|
147
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
148
|
+
return buffer;
|
|
149
|
+
}
|
|
150
|
+
staticAttr(gl, location, data, size, label) {
|
|
151
|
+
const buffer = gl.createBuffer();
|
|
152
|
+
if (buffer === null)
|
|
153
|
+
throw new Error(`${label}: createBuffer failed`);
|
|
154
|
+
this.buffers.push(buffer);
|
|
155
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
156
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
157
|
+
gl.enableVertexAttribArray(location);
|
|
158
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A polyline as the segments a renderer draws, rewritten in place.
|
|
3
|
+
*
|
|
4
|
+
* **No GL here**, for the reason `sdfTextLayout.ts` gives: which segments a point list
|
|
5
|
+
* produces is the same arithmetic on either backend, so it lives once and the two renderers
|
|
6
|
+
* own only their buffers. It is also the half worth testing, and testing it needs no context.
|
|
7
|
+
*
|
|
8
|
+
* A caller owns one of these for the life of its polyline and rewrites it per frame. That is
|
|
9
|
+
* the whole shape of the thing: an audio waveform, a moving trail and a plotted curve all
|
|
10
|
+
* have a fixed point count and moving points, and none of them should be allocating.
|
|
11
|
+
*/
|
|
12
|
+
export interface LineSegments {
|
|
13
|
+
/** `from` and `to` per segment, three floats each, live segments first. */
|
|
14
|
+
from: Float32Array;
|
|
15
|
+
to: Float32Array;
|
|
16
|
+
/** How many segments of the above are live. */
|
|
17
|
+
count: number;
|
|
18
|
+
readonly capacity: number;
|
|
19
|
+
}
|
|
20
|
+
/** Room for `capacity` segments, which is one fewer than the points that fill them. */
|
|
21
|
+
export declare function createLineSegments(capacity: number): LineSegments;
|
|
22
|
+
/**
|
|
23
|
+
* Rewrite a polyline from a flat point list, three floats a point.
|
|
24
|
+
*
|
|
25
|
+
* Returns how many segments were written, which is `pointCount - 1` clamped to capacity: a
|
|
26
|
+
* caller that overruns loses its tail rather than its frame, the same rule
|
|
27
|
+
* `expandBoltSegments` follows.
|
|
28
|
+
*
|
|
29
|
+
* A list of one point writes nothing rather than a zero-length segment. A degenerate segment
|
|
30
|
+
* is not harmless: its direction is undefined, so the shader falls back to an arbitrary
|
|
31
|
+
* perpendicular and draws a quad of full width pointing nowhere.
|
|
32
|
+
*/
|
|
33
|
+
export declare function setPolyline(out: LineSegments, points: ArrayLike<number>, pointCount: number): number;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A polyline as the segments a renderer draws, rewritten in place.
|
|
3
|
+
*
|
|
4
|
+
* **No GL here**, for the reason `sdfTextLayout.ts` gives: which segments a point list
|
|
5
|
+
* produces is the same arithmetic on either backend, so it lives once and the two renderers
|
|
6
|
+
* own only their buffers. It is also the half worth testing, and testing it needs no context.
|
|
7
|
+
*
|
|
8
|
+
* A caller owns one of these for the life of its polyline and rewrites it per frame. That is
|
|
9
|
+
* the whole shape of the thing: an audio waveform, a moving trail and a plotted curve all
|
|
10
|
+
* have a fixed point count and moving points, and none of them should be allocating.
|
|
11
|
+
*/
|
|
12
|
+
/** Room for `capacity` segments, which is one fewer than the points that fill them. */
|
|
13
|
+
export function createLineSegments(capacity) {
|
|
14
|
+
return {
|
|
15
|
+
from: new Float32Array(capacity * 3),
|
|
16
|
+
to: new Float32Array(capacity * 3),
|
|
17
|
+
count: 0,
|
|
18
|
+
capacity,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Rewrite a polyline from a flat point list, three floats a point.
|
|
23
|
+
*
|
|
24
|
+
* Returns how many segments were written, which is `pointCount - 1` clamped to capacity: a
|
|
25
|
+
* caller that overruns loses its tail rather than its frame, the same rule
|
|
26
|
+
* `expandBoltSegments` follows.
|
|
27
|
+
*
|
|
28
|
+
* A list of one point writes nothing rather than a zero-length segment. A degenerate segment
|
|
29
|
+
* is not harmless: its direction is undefined, so the shader falls back to an arbitrary
|
|
30
|
+
* perpendicular and draws a quad of full width pointing nowhere.
|
|
31
|
+
*/
|
|
32
|
+
export function setPolyline(out, points, pointCount) {
|
|
33
|
+
const count = Math.max(0, Math.min(pointCount - 1, out.capacity));
|
|
34
|
+
for (let s = 0; s < count; s++) {
|
|
35
|
+
const a = s * 3;
|
|
36
|
+
const b = a + 3;
|
|
37
|
+
out.from[a] = points[a];
|
|
38
|
+
out.from[a + 1] = points[a + 1];
|
|
39
|
+
out.from[a + 2] = points[a + 2];
|
|
40
|
+
out.to[a] = points[b];
|
|
41
|
+
out.to[a + 1] = points[b + 1];
|
|
42
|
+
out.to[a + 2] = points[b + 2];
|
|
43
|
+
}
|
|
44
|
+
out.count = count;
|
|
45
|
+
return count;
|
|
46
|
+
}
|