@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,211 @@
|
|
|
1
|
+
import { FOG_GLSL } from './fog.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Instanced scatter: grass, flowers, foliage — anything there are thousands of.
|
|
5
|
+
*
|
|
6
|
+
* Two programs, one material. The visible one lights and fogs the batch; the depth
|
|
7
|
+
* one records it as an occluder for a shadow map. They share the instance transform
|
|
8
|
+
* below, and that sharing is the point: a caster whose depth is computed from a
|
|
9
|
+
* different pose than its picture is a shadow that has come loose from the thing
|
|
10
|
+
* casting it.
|
|
11
|
+
*
|
|
12
|
+
* Lighting deliberately mirrors the flat material's terms (sun, ambient, fog),
|
|
13
|
+
* because scatter has to sit in the same world as the geometry it stands on. A
|
|
14
|
+
* separate lighting model is exactly how foliage ends up looking pasted onto a
|
|
15
|
+
* scene rather than growing out of it.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Where an instance's vertex ends up: scaled, turned, bent by the wind, pressed by
|
|
20
|
+
* whatever walked through it.
|
|
21
|
+
*
|
|
22
|
+
* Shared source rather than two copies, because the two programs have to agree
|
|
23
|
+
* *exactly*. A canopy bends by tens of centimetres at its crown, and a crown is
|
|
24
|
+
* metres across — so a depth pass that skipped the bend would slide a tree's whole
|
|
25
|
+
* shade off the deck it belongs to, drifting as the gust changed. One expression,
|
|
26
|
+
* two callers.
|
|
27
|
+
*/
|
|
28
|
+
const SCATTER_DEFORM = `
|
|
29
|
+
uniform vec2 uWindDirection;
|
|
30
|
+
uniform float uWindSpeed;
|
|
31
|
+
uniform float uWindGust;
|
|
32
|
+
uniform float uWindTime;
|
|
33
|
+
/* Spatial frequency of the travelling gust, per metre. */
|
|
34
|
+
uniform vec2 uWindSpatialPhase;
|
|
35
|
+
/*
|
|
36
|
+
* Where something heavy has just been: xyz world position, w how pressed, 0 unused.
|
|
37
|
+
*
|
|
38
|
+
* Uniforms rather than a texture or a re-upload, because this is the hottest shader
|
|
39
|
+
* in the game and the effect is a metre wide. Eight of them is about two seconds of
|
|
40
|
+
* trail at running pace. See TrampleField.
|
|
41
|
+
*/
|
|
42
|
+
uniform vec4 uTrample[8];
|
|
43
|
+
/* How far a press reaches, metres, and how much of a plant it takes away. */
|
|
44
|
+
uniform float uTrampleRadius;
|
|
45
|
+
uniform float uTrampleDepth;
|
|
46
|
+
|
|
47
|
+
/* Yaw as (sin, cos). Computed once per vertex and shared by position and normal. */
|
|
48
|
+
vec2 scatterYaw(float yaw) {
|
|
49
|
+
return vec2(sin(yaw), cos(yaw));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* The instance's local offset from its root, after scale, yaw, wind and trampling. */
|
|
53
|
+
vec3 scatterOffset(
|
|
54
|
+
vec3 position,
|
|
55
|
+
vec3 instancePos,
|
|
56
|
+
vec2 scaleYaw,
|
|
57
|
+
vec3 windResponse,
|
|
58
|
+
vec2 yawTrig
|
|
59
|
+
) {
|
|
60
|
+
float s = yawTrig.x;
|
|
61
|
+
float c = yawTrig.y;
|
|
62
|
+
|
|
63
|
+
vec3 local = position * scaleYaw.x;
|
|
64
|
+
vec3 rotated = vec3(local.x * c + local.z * s, local.y, -local.x * s + local.z * c);
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Wind phase comes from world position, so neighbouring plants are never in
|
|
68
|
+
* lockstep and a gust visibly travels across a field instead of the whole
|
|
69
|
+
* field pulsing at once. Direction and strength come from the shared wind —
|
|
70
|
+
* this adds spatial variation, never a second wind.
|
|
71
|
+
*
|
|
72
|
+
* Amplitude rises with the square of height, so the base stays planted and
|
|
73
|
+
* only the tip travels. A linear falloff slides the whole plant sideways,
|
|
74
|
+
* which reads as the ground moving.
|
|
75
|
+
*/
|
|
76
|
+
float phase = dot(instancePos.xz, uWindSpatialPhase) + uWindTime + windResponse.z;
|
|
77
|
+
float rooted = clamp(rotated.y * windResponse.x, 0.0, 1.0);
|
|
78
|
+
float bend = (uWindSpeed + uWindGust * windResponse.y) * sin(phase) * rooted * rooted;
|
|
79
|
+
rotated.xz += uWindDirection * bend;
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* Trampling: pressed toward the ground and pushed away from whatever pressed it.
|
|
83
|
+
*
|
|
84
|
+
* The strongest press wins rather than the sum. Two overlapping presses adding up
|
|
85
|
+
* would drive a blade through the deck, and a character crossing their own trail is
|
|
86
|
+
* exactly when that would happen.
|
|
87
|
+
*
|
|
88
|
+
* Direction comes from the *press*, so a plant leans away from where the foot was
|
|
89
|
+
* instead of all of them lying the same way, which is what makes it read as
|
|
90
|
+
* something having gone through rather than as a second wind.
|
|
91
|
+
*/
|
|
92
|
+
float pressed = 0.0;
|
|
93
|
+
vec2 away = vec2(0.0);
|
|
94
|
+
for (int i = 0; i < 8; i++) {
|
|
95
|
+
vec4 p = uTrample[i];
|
|
96
|
+
if (p.w <= 0.0) continue;
|
|
97
|
+
vec3 offset = instancePos - p.xyz;
|
|
98
|
+
float dist = length(offset);
|
|
99
|
+
if (dist >= uTrampleRadius) continue;
|
|
100
|
+
float fade = 1.0 - dist / uTrampleRadius;
|
|
101
|
+
float strength = p.w * fade * fade;
|
|
102
|
+
if (strength <= pressed) continue;
|
|
103
|
+
pressed = strength;
|
|
104
|
+
// Degenerate at the exact centre, where any direction is as good as another.
|
|
105
|
+
away = dist > 1e-4 ? offset.xz / dist : vec2(0.0);
|
|
106
|
+
}
|
|
107
|
+
if (pressed > 0.0) {
|
|
108
|
+
float take = pressed * uTrampleDepth;
|
|
109
|
+
// Height goes first — a flattened plant is shorter, and the fold outward is
|
|
110
|
+
// what makes the loss of height read as bending rather than as sinking.
|
|
111
|
+
rotated.y *= 1.0 - take;
|
|
112
|
+
rotated.xz += away * take * rotated.y * 1.4;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return rotated;
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
|
|
119
|
+
export const SCATTER_VERT = `#version 300 es
|
|
120
|
+
layout(location = 0) in vec3 aPosition;
|
|
121
|
+
layout(location = 1) in vec3 aNormal;
|
|
122
|
+
layout(location = 2) in vec3 aColor;
|
|
123
|
+
layout(location = 3) in vec3 aInstancePos;
|
|
124
|
+
layout(location = 4) in vec2 aScaleYaw;
|
|
125
|
+
layout(location = 5) in vec3 aTint;
|
|
126
|
+
layout(location = 6) in vec3 aWindResponse;
|
|
127
|
+
|
|
128
|
+
uniform mat4 uViewProj;
|
|
129
|
+
${SCATTER_DEFORM}
|
|
130
|
+
out vec3 vColor;
|
|
131
|
+
out vec3 vNormal;
|
|
132
|
+
out vec3 vWorldPos;
|
|
133
|
+
|
|
134
|
+
void main() {
|
|
135
|
+
vec2 yawTrig = scatterYaw(aScaleYaw.y);
|
|
136
|
+
vec3 rotated = scatterOffset(aPosition, aInstancePos, aScaleYaw, aWindResponse, yawTrig);
|
|
137
|
+
vec3 world = aInstancePos + rotated;
|
|
138
|
+
|
|
139
|
+
float s = yawTrig.x;
|
|
140
|
+
float c = yawTrig.y;
|
|
141
|
+
vColor = aColor * aTint;
|
|
142
|
+
vNormal = vec3(aNormal.x * c + aNormal.z * s, aNormal.y, -aNormal.x * s + aNormal.z * c);
|
|
143
|
+
vWorldPos = world;
|
|
144
|
+
gl_Position = uViewProj * vec4(world, 1.0);
|
|
145
|
+
}
|
|
146
|
+
`;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The same batch, recorded as a shadow caster.
|
|
150
|
+
*
|
|
151
|
+
* Pairs with `DEPTH_FRAG`, whose peel mode needs `vLightPosition` — so the two
|
|
152
|
+
* scatter programs and the rigid depth program all speak the same depth protocol,
|
|
153
|
+
* and a batch can be submitted to any layer a rigid mesh can.
|
|
154
|
+
*
|
|
155
|
+
* Only the four attributes the transform needs are declared. The instanced VAO
|
|
156
|
+
* also carries normals, colours and tints; a depth pass has no use for them and a
|
|
157
|
+
* program is not obliged to read every attribute a VAO offers.
|
|
158
|
+
*/
|
|
159
|
+
export const SCATTER_DEPTH_VERT = `#version 300 es
|
|
160
|
+
layout(location = 0) in vec3 aPosition;
|
|
161
|
+
layout(location = 3) in vec3 aInstancePos;
|
|
162
|
+
layout(location = 4) in vec2 aScaleYaw;
|
|
163
|
+
layout(location = 6) in vec3 aWindResponse;
|
|
164
|
+
|
|
165
|
+
uniform mat4 uLightViewProj;
|
|
166
|
+
${SCATTER_DEFORM}
|
|
167
|
+
out vec4 vLightPosition;
|
|
168
|
+
|
|
169
|
+
void main() {
|
|
170
|
+
vec3 rotated = scatterOffset(
|
|
171
|
+
aPosition,
|
|
172
|
+
aInstancePos,
|
|
173
|
+
aScaleYaw,
|
|
174
|
+
aWindResponse,
|
|
175
|
+
scatterYaw(aScaleYaw.y)
|
|
176
|
+
);
|
|
177
|
+
vLightPosition = uLightViewProj * vec4(aInstancePos + rotated, 1.0);
|
|
178
|
+
gl_Position = vLightPosition;
|
|
179
|
+
}
|
|
180
|
+
`;
|
|
181
|
+
|
|
182
|
+
export const SCATTER_FRAG = `#version 300 es
|
|
183
|
+
precision highp float;
|
|
184
|
+
|
|
185
|
+
in vec3 vColor;
|
|
186
|
+
in vec3 vNormal;
|
|
187
|
+
in vec3 vWorldPos;
|
|
188
|
+
|
|
189
|
+
uniform vec3 uDirectionalDir;
|
|
190
|
+
uniform vec3 uDirectionalColor;
|
|
191
|
+
uniform vec3 uAmbient;
|
|
192
|
+
uniform vec3 uCameraPos;
|
|
193
|
+
${FOG_GLSL}
|
|
194
|
+
|
|
195
|
+
out vec4 outColor;
|
|
196
|
+
|
|
197
|
+
void main() {
|
|
198
|
+
vec3 n = normalize(vNormal);
|
|
199
|
+
/*
|
|
200
|
+
* Two-sided. A blade of grass is a flat sliver seen from both faces, and
|
|
201
|
+
* lighting its back face as though it faced away leaves half of every field
|
|
202
|
+
* black — the cheapest and most obvious foliage tell there is.
|
|
203
|
+
*/
|
|
204
|
+
float ndl = abs(dot(n, uDirectionalDir));
|
|
205
|
+
vec3 lit = vColor * (uAmbient + uDirectionalColor * ndl);
|
|
206
|
+
|
|
207
|
+
float fog = mediumFog(distance(vWorldPos, uCameraPos), vWorldPos.y);
|
|
208
|
+
|
|
209
|
+
outColor = vec4(mix(lit, mediumColor(), fog), 1.0);
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { OUTPUT_TRANSFORM_GLSL } from './outputTransform.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Text from a multi-channel signed distance field.
|
|
5
|
+
*
|
|
6
|
+
* GLSL is the source of truth; `npm run wgsl` produces the WGSL beside it. Written to the
|
|
7
|
+
* same rules every other shader here follows, which is why the sampler is `textureLod`:
|
|
8
|
+
* the alpha test is not uniform control flow.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const SDF_TEXT_VERT = `#version 300 es
|
|
12
|
+
precision highp float;
|
|
13
|
+
|
|
14
|
+
layout(location = 0) in vec3 aPosition;
|
|
15
|
+
layout(location = 1) in vec2 aUv;
|
|
16
|
+
|
|
17
|
+
uniform mat4 uViewProj;
|
|
18
|
+
uniform mat4 uModel;
|
|
19
|
+
|
|
20
|
+
out vec2 vUv;
|
|
21
|
+
|
|
22
|
+
void main() {
|
|
23
|
+
vUv = aUv;
|
|
24
|
+
gl_Position = uViewProj * uModel * vec4(aPosition, 1.0);
|
|
25
|
+
}
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
export const SDF_TEXT_FRAG = `#version 300 es
|
|
29
|
+
precision highp float;
|
|
30
|
+
|
|
31
|
+
in vec2 vUv;
|
|
32
|
+
|
|
33
|
+
uniform sampler2D uAtlas;
|
|
34
|
+
uniform vec3 uColor;
|
|
35
|
+
uniform float uOpacity;
|
|
36
|
+
/* Texels the field spans, from the atlas metrics. Scales the antialiasing band. */
|
|
37
|
+
uniform float uDistanceRange;
|
|
38
|
+
uniform vec2 uAtlasSize;
|
|
39
|
+
|
|
40
|
+
out vec4 outColor;
|
|
41
|
+
${OUTPUT_TRANSFORM_GLSL}
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* The middle of the three channels.
|
|
45
|
+
*
|
|
46
|
+
* A single-channel field rounds every corner off at small sizes, because one distance
|
|
47
|
+
* cannot describe two edges meeting. Three channels carry the corner and the median
|
|
48
|
+
* recovers it.
|
|
49
|
+
*/
|
|
50
|
+
float median(vec3 rgb) {
|
|
51
|
+
return max(min(rgb.r, rgb.g), min(max(rgb.r, rgb.g), rgb.b));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void main() {
|
|
55
|
+
vec3 sampled = textureLod(uAtlas, vUv, 0.0).rgb;
|
|
56
|
+
float distance = median(sampled) - 0.5;
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* The band is one pixel wide *in screen space*, which is what lets one atlas serve every
|
|
60
|
+
* size. A constant band is tuned for one size and is wrong at all the others.
|
|
61
|
+
*/
|
|
62
|
+
vec2 texelsPerPixel = fwidth(vUv) * uAtlasSize;
|
|
63
|
+
float pixelRange = max(0.5 * (texelsPerPixel.x + texelsPerPixel.y), 0.0001);
|
|
64
|
+
float coverage = clamp(distance * uDistanceRange / pixelRange + 0.5, 0.0, 1.0);
|
|
65
|
+
|
|
66
|
+
outColor = vec4(applyOutputTransform(uColor), coverage * uOpacity);
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vertex-stage skinning prelude: the palette, its two attributes, and the weighted matrix.
|
|
3
|
+
*
|
|
4
|
+
* Included by `flat/index.ts` inside `#if SKINNED`, so `resolveConditionals` cuts every line of it
|
|
5
|
+
* out of the unskinned variant. **Absent rather than gated**, and that is measured: the vertex
|
|
6
|
+
* shader had no permutation axis at all before this, so a second variant costs **1,118 bytes
|
|
7
|
+
* gzipped**, measured on the regenerated file — two 4.4 KB strings that mostly dedupe inside
|
|
8
|
+
* deflate's 32 KB window — where a uniform gate
|
|
9
|
+
* would cost every vertex of every static mesh in the engine a branch it can never take. The
|
|
10
|
+
* 2^n cost `ARCHITECTURE.md` §1 is written about is a property of the *fragment* corpus, whose
|
|
11
|
+
* permutations are each larger than that window.
|
|
12
|
+
*
|
|
13
|
+
* What it costs is one more axis for `scripts/wgsl.ts` to expand and a second program on WebGL2.
|
|
14
|
+
* What would make it wrong is a second vertex flag: four variants dedupe less well than two, so
|
|
15
|
+
* re-measure before adding one.
|
|
16
|
+
*/
|
|
17
|
+
export const SKINNING_GLSL = `
|
|
18
|
+
/**
|
|
19
|
+
* The joint palette, four texels a matrix, one row.
|
|
20
|
+
*
|
|
21
|
+
* A texture rather than a \`uniform mat4[]\`. The 2026-08-07 rule that keeps samples out of
|
|
22
|
+
* unprovable branches is about *implicit derivatives*, which a vertex stage does not compute, so
|
|
23
|
+
* it has nothing to say here — and \`texelFetch\` takes an integer coordinate with no level
|
|
24
|
+
* inferred at all. What a uniform array would have cost is the cap: MAX_VERTEX_UNIFORM_VECTORS is
|
|
25
|
+
* 256 on the WebGL2 floor and this shader already spends fifteen, which leaves sixty joints.
|
|
26
|
+
*
|
|
27
|
+
* What this costs is a texture upload per skinned draw. What would make it wrong is a profile
|
|
28
|
+
* showing that upload is the limit; the fix is one texture for every character with a row offset.
|
|
29
|
+
*/
|
|
30
|
+
uniform highp sampler2D uJointPalette;
|
|
31
|
+
|
|
32
|
+
layout(location = 11) in vec4 aJoints;
|
|
33
|
+
layout(location = 12) in vec4 aWeights;
|
|
34
|
+
|
|
35
|
+
/** One joint's matrix, read as four consecutive texels of row 0. */
|
|
36
|
+
mat4 jointMatrix(int index) {
|
|
37
|
+
int x = index * 4;
|
|
38
|
+
return mat4(
|
|
39
|
+
texelFetch(uJointPalette, ivec2(x, 0), 0),
|
|
40
|
+
texelFetch(uJointPalette, ivec2(x + 1, 0), 0),
|
|
41
|
+
texelFetch(uJointPalette, ivec2(x + 2, 0), 0),
|
|
42
|
+
texelFetch(uJointPalette, ivec2(x + 3, 0), 0));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The four influences, weighted.
|
|
47
|
+
*
|
|
48
|
+
* Weights are normalised by the importer rather than here: normalising per vertex per frame costs
|
|
49
|
+
* a divide on every vertex to correct data an importer should have fixed once, and \`gltfSkin.ts\`
|
|
50
|
+
* warns when a set does not sum to one. What would make it wrong is a caller building a MeshData
|
|
51
|
+
* by hand with unnormalised weights, which shades slightly dark or bright rather than breaking.
|
|
52
|
+
*/
|
|
53
|
+
mat4 skinMatrix() {
|
|
54
|
+
return jointMatrix(int(aJoints.x)) * aWeights.x
|
|
55
|
+
+ jointMatrix(int(aJoints.y)) * aWeights.y
|
|
56
|
+
+ jointMatrix(int(aJoints.z)) * aWeights.z
|
|
57
|
+
+ jointMatrix(int(aJoints.w)) * aWeights.w;
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { glslFarDepth } from '../depthConvention.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Procedural gradient sky drawn as a single attribute-less fullscreen triangle.
|
|
4
|
+
* Ray direction is reconstructed per-fragment from the inverse view-projection,
|
|
5
|
+
* so the sky is correct under any camera. Drawn last at the far plane, so early-z wins —
|
|
6
|
+
* and the far plane is 0 under reversed depth and 1 otherwise, which is why the value is
|
|
7
|
+
* interpolated rather than written. A sky that says 1.0 in a reversed engine is drawn at the
|
|
8
|
+
* *near* plane and covers the world; measured, that was 743,669 changed pixels of 921,600.
|
|
9
|
+
*/
|
|
10
|
+
export const SKY_VERT = `#version 300 es
|
|
11
|
+
const vec2 POS[3] = vec2[3](vec2(-1., -1.), vec2(3., -1.), vec2(-1., 3.));
|
|
12
|
+
|
|
13
|
+
out vec2 vNdc;
|
|
14
|
+
|
|
15
|
+
void main() {
|
|
16
|
+
vNdc = POS[gl_VertexID];
|
|
17
|
+
/* The far plane, whichever way depth runs: see glslFarDepth. */
|
|
18
|
+
gl_Position = vec4(vNdc, ${glslFarDepth()}, 1.0);
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
|
|
22
|
+
export const SKY_FRAG = `#version 300 es
|
|
23
|
+
precision highp float;
|
|
24
|
+
|
|
25
|
+
in vec2 vNdc;
|
|
26
|
+
|
|
27
|
+
uniform mat4 uInvViewProj;
|
|
28
|
+
uniform vec3 uCameraPos;
|
|
29
|
+
uniform vec3 uTopColor;
|
|
30
|
+
uniform vec3 uHorizonColor;
|
|
31
|
+
uniform vec3 uDeepColor;
|
|
32
|
+
uniform vec3 uSunDir;
|
|
33
|
+
uniform vec3 uSunColor;
|
|
34
|
+
uniform float uSunDiscExponent;
|
|
35
|
+
uniform vec3 uMoonDir;
|
|
36
|
+
uniform vec3 uMoonColor;
|
|
37
|
+
uniform float uMoonAngularRadius;
|
|
38
|
+
uniform float uMoonPhase;
|
|
39
|
+
uniform float uNightFactor;
|
|
40
|
+
uniform vec2 uCloudOffset;
|
|
41
|
+
uniform vec3 uUnderwaterColor;
|
|
42
|
+
uniform float uUnderwaterFactor;
|
|
43
|
+
|
|
44
|
+
out vec4 outColor;
|
|
45
|
+
|
|
46
|
+
float hash21(vec2 p) {
|
|
47
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
float valueNoise(vec2 p) {
|
|
51
|
+
vec2 i = floor(p);
|
|
52
|
+
vec2 f = fract(p);
|
|
53
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
54
|
+
float a = hash21(i);
|
|
55
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
56
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
57
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
58
|
+
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Three octaves is the ceiling — drop to two before cutting anything else. */
|
|
62
|
+
float fbm(vec2 p) {
|
|
63
|
+
float v = valueNoise(p) * 0.5;
|
|
64
|
+
v += valueNoise(p * 2.03) * 0.3;
|
|
65
|
+
v += valueNoise(p * 4.01) * 0.2;
|
|
66
|
+
return v;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void main() {
|
|
70
|
+
vec4 world = uInvViewProj * vec4(vNdc, 1.0, 1.0);
|
|
71
|
+
vec3 dir = normalize(world.xyz / world.w - uCameraPos);
|
|
72
|
+
|
|
73
|
+
float t = dir.y;
|
|
74
|
+
vec3 col = t >= 0.0
|
|
75
|
+
? mix(uHorizonColor, uTopColor, pow(min(t, 1.0), 0.55))
|
|
76
|
+
: mix(uHorizonColor, uDeepColor, min(-t * 1.8, 1.0));
|
|
77
|
+
|
|
78
|
+
// Celestial bodies belong to the sky, not to the void underneath. Seeing the
|
|
79
|
+
// sun below the horizon made the world read as unbounded in every direction;
|
|
80
|
+
// fading them out at the horizon leaves the deep reading as depth instead.
|
|
81
|
+
float aboveHorizon = smoothstep(-0.04, 0.06, dir.y);
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* Sunset.
|
|
85
|
+
*
|
|
86
|
+
* Low sunlight crosses far more atmosphere than high sunlight, and that path
|
|
87
|
+
* scatters the blue out of it — which is why the sun reddens as it drops and
|
|
88
|
+
* why the glow around it spreads into a band rather than staying a disc. Both
|
|
89
|
+
* effects peak right at the horizon and are gone within a few degrees of it,
|
|
90
|
+
* so they are driven by the sun's own elevation rather than by the clock.
|
|
91
|
+
*
|
|
92
|
+
* TWO EDGES, BECAUSE A SUNSET ENDS. This shipped with only the upper one, so every
|
|
93
|
+
* sun below the horizon read as maximum sunset and stayed there all the way to
|
|
94
|
+
* straight down — and a sun direction of (0, -1, 0) is what a night world writes to
|
|
95
|
+
* mean "there is no sun in this sky". A consumer measured the result on a black
|
|
96
|
+
* sun: 87% more red in the sky than the same frame with the sun pointing up, a warm
|
|
97
|
+
* band over a third of the picture in an arctic snowfield, and the world's own
|
|
98
|
+
* blue-grey horizon arriving with its channel order reversed. Four night worlds were
|
|
99
|
+
* not started over it, and this repository's own storm sea shipped it. The lower
|
|
100
|
+
* edge is where astronomical twilight ends, near -0.31, so the term now fades out
|
|
101
|
+
* over the same range the sky it models does.
|
|
102
|
+
*
|
|
103
|
+
* What it gives up: the glow is a function of the sun's elevation and nothing else,
|
|
104
|
+
* so a caller cannot place one where its own sun is not. That is deliberate — a knob
|
|
105
|
+
* here would let a world disagree with itself — but it is also what makes this wrong
|
|
106
|
+
* for a body that is not our sun in our atmosphere. A world lit by something that
|
|
107
|
+
* scatters differently needs its own term, not a wider edge here.
|
|
108
|
+
*
|
|
109
|
+
* Written ascending-and-inverted rather than as a descending smoothstep, whose
|
|
110
|
+
* result GLSL ES leaves undefined when edge0 >= edge1. Every implementation seen so
|
|
111
|
+
* far computes the ramp anybody would expect, which is why the descending form
|
|
112
|
+
* survived this long, but the spec does not owe us that.
|
|
113
|
+
*/
|
|
114
|
+
float sunset = (1.0 - smoothstep(-0.03, 0.30, uSunDir.y)) *
|
|
115
|
+
smoothstep(-0.35, -0.05, uSunDir.y);
|
|
116
|
+
vec3 ember = vec3(1.0, 0.36, 0.13);
|
|
117
|
+
|
|
118
|
+
float s = max(dot(dir, uSunDir), 0.0);
|
|
119
|
+
// The disc itself reddens; the last sliver above the horizon is nearly blood
|
|
120
|
+
// orange, which is the moment the whole effect is remembered for.
|
|
121
|
+
vec3 discColor = mix(uSunColor, uSunColor * ember, sunset * 0.85);
|
|
122
|
+
col += discColor * (
|
|
123
|
+
pow(s, uSunDiscExponent) * 1.2 +
|
|
124
|
+
pow(s, max(uSunDiscExponent / 75.0, 1.0)) * 0.12
|
|
125
|
+
) * aboveHorizon;
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* The band. Brightest toward the sun's bearing and hugging the horizon,
|
|
129
|
+
* falling off both with angle around the compass and with height — a sunset
|
|
130
|
+
* is a direction, not a uniform warm wash, and washing the whole dome is what
|
|
131
|
+
* makes a fake one look like a colour filter.
|
|
132
|
+
*/
|
|
133
|
+
vec2 sunBearing = normalize(uSunDir.xz + vec2(1e-5));
|
|
134
|
+
vec2 viewBearing = normalize(dir.xz + vec2(1e-5));
|
|
135
|
+
float toward = max(dot(viewBearing, sunBearing), 0.0);
|
|
136
|
+
/*
|
|
137
|
+
* Measured from the horizon, and falling three times faster below it than above.
|
|
138
|
+
*
|
|
139
|
+
* This was abs(dir.y), which is symmetric, so the band was mirrored twenty-seven
|
|
140
|
+
* degrees down into the deep — visible in any world whose ground does not cover
|
|
141
|
+
* the lower half of the frame, and captured in the -Y face of every environment
|
|
142
|
+
* probe, where it tinted reflections warm. Nothing in the sky mirrors a sunset
|
|
143
|
+
* below the horizon; what is down there is ground, and the ground is drawn by
|
|
144
|
+
* somebody else.
|
|
145
|
+
*
|
|
146
|
+
* Not gated by aboveHorizon like the sun disc and the moon are: that factor is
|
|
147
|
+
* only 0.4 at a dir.y of zero, which is exactly where this term is brightest, so
|
|
148
|
+
* multiplying by it would cut the band's core to a third and change every sunset
|
|
149
|
+
* to fix a night. Falling faster below instead leaves everything at or above the
|
|
150
|
+
* horizon bit-for-bit as it was, and the horizon line itself unbroken. What it
|
|
151
|
+
* gives up: a camera under the world, or above a planet seen from outside its
|
|
152
|
+
* atmosphere, sees the glow end sooner than the geometry does.
|
|
153
|
+
*/
|
|
154
|
+
float fromHorizon = dir.y >= 0.0 ? dir.y : -dir.y * 3.0;
|
|
155
|
+
float band = pow(1.0 - min(fromHorizon * 2.2, 1.0), 2.6);
|
|
156
|
+
col += ember * sunset * band * (0.18 + 0.75 * pow(toward, 2.2));
|
|
157
|
+
|
|
158
|
+
/*
|
|
159
|
+
* Belt of Venus: the sky opposite a setting sun takes a cool pink-violet from
|
|
160
|
+
* light already reddened on its way past. Subtle, but its absence is why an
|
|
161
|
+
* artificial sunset feels like it is only happening on one side.
|
|
162
|
+
*/
|
|
163
|
+
float away = max(-dot(viewBearing, sunBearing), 0.0);
|
|
164
|
+
col += vec3(0.42, 0.28, 0.45) * sunset * band * away * 0.22;
|
|
165
|
+
|
|
166
|
+
/*
|
|
167
|
+
* Moon: a shaded procedural sphere-disc, not one dot subtracted from another.
|
|
168
|
+
* The local sphere normal gives a curved terminator and limb; lunar phase
|
|
169
|
+
* supplies the light direction around that sphere. Low-frequency noise adds
|
|
170
|
+
* maria without a texture file, while a faint earthshine keeps the dark limb
|
|
171
|
+
* just legible instead of cutting a mathematically black hole in the sky.
|
|
172
|
+
*/
|
|
173
|
+
vec3 moonReference = abs(uMoonDir.y) < 0.98
|
|
174
|
+
? vec3(0.0, 1.0, 0.0)
|
|
175
|
+
: vec3(1.0, 0.0, 0.0);
|
|
176
|
+
vec3 moonRight = normalize(cross(moonReference, uMoonDir));
|
|
177
|
+
vec3 moonUp = cross(uMoonDir, moonRight);
|
|
178
|
+
float moonRadius = clamp(uMoonAngularRadius, 0.001, 0.5);
|
|
179
|
+
vec2 moonUv = vec2(dot(dir, moonRight), dot(dir, moonUp)) / moonRadius;
|
|
180
|
+
float moonRadiusSq = dot(moonUv, moonUv);
|
|
181
|
+
float moonFacing = step(0.0, dot(dir, uMoonDir));
|
|
182
|
+
float moonDisc = (1.0 - smoothstep(0.90, 1.0, moonRadiusSq)) * moonFacing;
|
|
183
|
+
if (moonDisc > 0.0) {
|
|
184
|
+
float sphereZ = sqrt(max(1.0 - moonRadiusSq, 0.0));
|
|
185
|
+
vec3 surfaceNormal = normalize(vec3(moonUv, sphereZ));
|
|
186
|
+
float phaseAngle = uMoonPhase * 6.28318530718;
|
|
187
|
+
vec3 phaseLight = vec3(sin(phaseAngle), 0.0, -cos(phaseAngle));
|
|
188
|
+
float phaseShade = max(dot(surfaceNormal, phaseLight), 0.0);
|
|
189
|
+
float maria = valueNoise(moonUv * 3.2 + vec2(4.7, 9.1)) * 0.68 +
|
|
190
|
+
valueNoise(moonUv * 9.3 - vec2(7.4, 2.6)) * 0.32;
|
|
191
|
+
float albedo = mix(0.56, 1.02, maria);
|
|
192
|
+
float limb = mix(0.72, 1.0, sphereZ);
|
|
193
|
+
float earthshine = 0.035;
|
|
194
|
+
float lunarLight = earthshine + (1.0 - earthshine) * phaseShade;
|
|
195
|
+
col += uMoonColor * albedo * limb * lunarLight * moonDisc *
|
|
196
|
+
1.35 * uNightFactor * aboveHorizon;
|
|
197
|
+
}
|
|
198
|
+
float phaseIllumination = 0.5 - cos(uMoonPhase * 6.28318530718) * 0.5;
|
|
199
|
+
float moonHalo = (1.0 - smoothstep(1.0, 3.0, length(moonUv))) * moonFacing;
|
|
200
|
+
col += uMoonColor * moonHalo * 0.08 * phaseIllumination *
|
|
201
|
+
uNightFactor * aboveHorizon;
|
|
202
|
+
|
|
203
|
+
if (dir.y > 0.0) {
|
|
204
|
+
// Stars. Stereographic projection: unlike dir.xz/dir.y it stays finite and
|
|
205
|
+
// near-uniform all the way to the horizon, so stars don't smear into grain.
|
|
206
|
+
// Each cell holds one jittered *point* — lighting the whole cell would draw
|
|
207
|
+
// square blocks, which is what "random pixels" looks like.
|
|
208
|
+
if (uNightFactor > 0.0) {
|
|
209
|
+
vec2 p = dir.xz / (1.0 + dir.y) * 26.0;
|
|
210
|
+
vec2 cell = floor(p);
|
|
211
|
+
float h = hash21(cell);
|
|
212
|
+
if (h > 0.93) {
|
|
213
|
+
vec2 jitter = vec2(hash21(cell + 17.3), hash21(cell + 41.7));
|
|
214
|
+
float d = length(fract(p) - jitter);
|
|
215
|
+
float star = smoothstep(0.10, 0.0, d) * (0.4 + h * 0.6);
|
|
216
|
+
// Fade out near the horizon, where haze would swallow them anyway.
|
|
217
|
+
col += vec3(0.86, 0.91, 1.0) * star * uNightFactor * smoothstep(0.03, 0.3, dir.y);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Clouds: banded value noise on a layer above the camera, carried by the
|
|
222
|
+
// world's wind — the same signal the smoke and the grass answer to, so the
|
|
223
|
+
// largest moving thing in frame agrees with the smallest.
|
|
224
|
+
// The floor on dir.y bounds the perspective stretch near the horizon.
|
|
225
|
+
if (dir.y > 0.02) {
|
|
226
|
+
vec2 uv = dir.xz / max(dir.y, 0.16) * 0.09 + uCloudOffset * 0.012;
|
|
227
|
+
float band = smoothstep(0.46, 0.60, fbm(uv));
|
|
228
|
+
float fade = smoothstep(0.02, 0.30, dir.y);
|
|
229
|
+
vec3 cloudCol = mix(uHorizonColor, vec3(1.0), 0.45) * mix(1.0, 0.32, uNightFactor);
|
|
230
|
+
col = mix(col, cloudCol, band * fade * 0.8);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// There is no outdoor sky inside a water column. Retain a little vertical
|
|
235
|
+
// gradient so the surface remains legible above and depth reads darker
|
|
236
|
+
// below, while celestial bodies and clouds disappear with the same smooth
|
|
237
|
+
// surface transition used by the geometry passes.
|
|
238
|
+
float waterLight = mix(0.62, 1.08, clamp(dir.y * 0.5 + 0.5, 0.0, 1.0));
|
|
239
|
+
col = mix(col, uUnderwaterColor * waterLight, uUnderwaterFactor);
|
|
240
|
+
|
|
241
|
+
outColor = vec4(col, 1.0);
|
|
242
|
+
}
|
|
243
|
+
`;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { FOG_GLSL } from './fog.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Smoke: a column that rises, expands and dissipates. Shares the plume
|
|
5
|
+
* billboard vertex shader with fire — only the fragment behaviour differs.
|
|
6
|
+
*
|
|
7
|
+
* Alpha-blended rather than additive: smoke occludes what is behind it, and
|
|
8
|
+
* adding it would make it glow instead of darken.
|
|
9
|
+
*/
|
|
10
|
+
export const SMOKE_FRAG = `#version 300 es
|
|
11
|
+
precision highp float;
|
|
12
|
+
|
|
13
|
+
in vec2 vUv;
|
|
14
|
+
in float vSeed;
|
|
15
|
+
in float vDistance;
|
|
16
|
+
in vec3 vWorldPos;
|
|
17
|
+
|
|
18
|
+
uniform float uTime;
|
|
19
|
+
${FOG_GLSL}
|
|
20
|
+
uniform int uNoiseOctaves;
|
|
21
|
+
uniform vec4 uClipPlane;
|
|
22
|
+
uniform int uClipEnabled;
|
|
23
|
+
|
|
24
|
+
out vec4 outColor;
|
|
25
|
+
|
|
26
|
+
float hash21(vec2 p) {
|
|
27
|
+
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
float valueNoise(vec2 p) {
|
|
31
|
+
vec2 i = floor(p);
|
|
32
|
+
vec2 f = fract(p);
|
|
33
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
34
|
+
return mix(
|
|
35
|
+
mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x),
|
|
36
|
+
mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), u.x),
|
|
37
|
+
u.y
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
float billow(vec2 p, float t) {
|
|
42
|
+
float v = valueNoise(p * 2.2 + vec2(0.0, -t * 0.55)) * 0.55;
|
|
43
|
+
if (uNoiseOctaves == 1) return v / 0.55;
|
|
44
|
+
v += valueNoise(p * 4.7 + vec2(t * 0.12, -t * 0.9)) * 0.29;
|
|
45
|
+
if (uNoiseOctaves == 2) return v / 0.84;
|
|
46
|
+
return v + valueNoise(p * 9.3 + vec2(-t * 0.09, -t * 1.4)) * 0.16;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void main() {
|
|
50
|
+
if (uClipEnabled != 0 && dot(vec4(vWorldPos, 1.0), uClipPlane) < 0.0) discard;
|
|
51
|
+
|
|
52
|
+
float t = uTime + vSeed * 53.0;
|
|
53
|
+
float height = vUv.y;
|
|
54
|
+
|
|
55
|
+
// Widens as it climbs: sample a compressed space low down, a stretched one up
|
|
56
|
+
// top. Narrow at the bottom is what lets it sit inside the flame's tip.
|
|
57
|
+
float spread = mix(0.5, 1.0, height);
|
|
58
|
+
float centred = (vUv.x - 0.5) / spread + 0.5;
|
|
59
|
+
|
|
60
|
+
// Soft horizontal falloff rather than a hard cut — a clipped edge here shows
|
|
61
|
+
// the quad and is the single most obvious way smoke reads as fake.
|
|
62
|
+
float sides = smoothstep(0.0, 0.55, 1.0 - clamp(abs(centred - 0.5) * 2.0, 0.0, 1.0));
|
|
63
|
+
if (sides <= 0.001) discard;
|
|
64
|
+
|
|
65
|
+
// Leans away over its height instead of rising ruler-straight.
|
|
66
|
+
float drift = (valueNoise(vec2(t * 0.21, vSeed * 7.0)) - 0.5) * 0.6 * height * height;
|
|
67
|
+
float n = billow(vec2(centred + drift, height), t);
|
|
68
|
+
|
|
69
|
+
float density = n * sides * 1.35 - height * 0.88;
|
|
70
|
+
if (density <= 0.02) discard;
|
|
71
|
+
|
|
72
|
+
// Colour tells the story of the plume: ember-lit where it leaves the flame,
|
|
73
|
+
// cooling through soot, then dispersing into the fog. Starting at flat grey
|
|
74
|
+
// is what made it look like a separate object parked above the fire.
|
|
75
|
+
vec3 col = mix(vec3(0.90, 0.42, 0.16), vec3(0.11, 0.10, 0.10), smoothstep(0.0, 0.34, height));
|
|
76
|
+
vec3 atmosphereColor = mediumColor();
|
|
77
|
+
col = mix(col, atmosphereColor, smoothstep(0.30, 0.95, height));
|
|
78
|
+
|
|
79
|
+
// Fade in at the base so it emerges out of the flame, and out at the top so
|
|
80
|
+
// it dissipates rather than ending.
|
|
81
|
+
float emerge = smoothstep(0.0, 0.30, height);
|
|
82
|
+
float dissipate = 1.0 - smoothstep(0.22, 0.75, height);
|
|
83
|
+
|
|
84
|
+
float fog = mediumFog(vDistance, vWorldPos.y);
|
|
85
|
+
col = mix(col, atmosphereColor, fog);
|
|
86
|
+
float alpha = clamp(density * 0.95, 0.0, 1.0) * emerge * dissipate * 0.13;
|
|
87
|
+
outColor = vec4(col, alpha * (1.0 - fog));
|
|
88
|
+
}
|
|
89
|
+
`;
|