@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,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A decal projected onto whatever the depth buffer holds.
|
|
3
|
+
*
|
|
4
|
+
* **The pass is the inverse of the camera and nothing else.** Each pixel inside the projector's
|
|
5
|
+
* scissor rectangle is turned back into the world point its depth stands for, that point is put
|
|
6
|
+
* into the box's own space, and a mark lands where all three coordinates come back within one. No
|
|
7
|
+
* geometry is clipped and no mesh is built, so the receiving surface may deform, stream in, or be
|
|
8
|
+
* drawn by something with no CPU-side geometry at all — which is exactly what `projectDecal`
|
|
9
|
+
* cannot do and the whole reason this exists beside it.
|
|
10
|
+
*
|
|
11
|
+
* **It multiplies rather than covers, and that is a design decision rather than a shortcut.** A
|
|
12
|
+
* forward renderer has no G-buffer, so by the time this runs the receiving pixel is already lit
|
|
13
|
+
* and there is nowhere to write an albedo. Painting a flat colour over it would light the mark by
|
|
14
|
+
* nothing at all: a scorch mark in an unlit corner would glow. Multiplying takes the receiver's
|
|
15
|
+
* lighting exactly — for a diffuse surface it is identical to having marked the albedo before the
|
|
16
|
+
* light was applied — at the cost that a mark can darken and tint and can never brighten. Scorch,
|
|
17
|
+
* oil, blood, wet patches and blob shadows are what that covers; a glowing rune is not.
|
|
18
|
+
*
|
|
19
|
+
* **Nothing here branches and nothing discards.** White is the identity of a multiply, so a pixel
|
|
20
|
+
* the projector misses writes white and changes nothing, which means the whole shader is one
|
|
21
|
+
* straight line. That is not tidiness: the surface normal comes from the derivatives of the
|
|
22
|
+
* reconstructed position, and a derivative taken inside non-uniform control flow is undefined —
|
|
23
|
+
* the rule `AGENTS.md` states for `texture()` in a branch, arriving through the other door.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { glslIsFarDepth } from '../depthConvention.ts';
|
|
27
|
+
|
|
28
|
+
export const DECAL_PROJECT_FRAG = `#version 300 es
|
|
29
|
+
precision highp float;
|
|
30
|
+
|
|
31
|
+
in vec2 vUv;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The depth the frame has drawn, as a copy.
|
|
35
|
+
*
|
|
36
|
+
* **A copy and never the attachment.** Sampling a texture that is attached to the bound
|
|
37
|
+
* framebuffer is undefined in WebGL2, and undefined here means a plausible picture on this driver
|
|
38
|
+
* and a different one on the next: \`SceneTarget.snapshotDepth\` exists for exactly this, and the
|
|
39
|
+
* WebGPU backend reads its resolved depth for the same reason.
|
|
40
|
+
*
|
|
41
|
+
* \`highp\` because it is a 32-bit depth and the reconstruction below is a division by it.
|
|
42
|
+
*/
|
|
43
|
+
uniform highp sampler2D uDecalDepth;
|
|
44
|
+
/**
|
|
45
|
+
* Screen position and stored depth back to the world, which is
|
|
46
|
+
* \`inverse(viewProjection) * DEPTH_01_TO_CLIP\`.
|
|
47
|
+
*
|
|
48
|
+
* The Y-flipped variant of that constant is what the other backend passes, and \`lightVolumeDraw.ts\`
|
|
49
|
+
* carries the derivation and what one missing negation costs.
|
|
50
|
+
*/
|
|
51
|
+
uniform mat4 uDecalDepthToWorld;
|
|
52
|
+
/** World space into the projector's unit box. See \`worldToDecalMatrix\`. */
|
|
53
|
+
uniform mat4 uWorldToDecal;
|
|
54
|
+
/** Where the eye is, which is what gives the reconstructed normal a defined sign. */
|
|
55
|
+
uniform vec3 uDecalEye;
|
|
56
|
+
/** The projection axis, normalised. A surface is marked when it faces back along this. */
|
|
57
|
+
uniform vec3 uDecalAxis;
|
|
58
|
+
/** What the mark multiplies the surface by. */
|
|
59
|
+
uniform vec3 uDecalColor;
|
|
60
|
+
/** How much of that colour lands. */
|
|
61
|
+
uniform float uDecalOpacity;
|
|
62
|
+
/** How far a surface may be turned from facing the projector, as a cosine. */
|
|
63
|
+
uniform float uDecalFacingCos;
|
|
64
|
+
/** How much of the mark's radius is edge. */
|
|
65
|
+
uniform float uDecalSoftness;
|
|
66
|
+
|
|
67
|
+
out vec4 fragColor;
|
|
68
|
+
|
|
69
|
+
void main() {
|
|
70
|
+
float stored = textureLod(uDecalDepth, vUv, 0.0).r;
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
* The pixel's world position. \`vUv * 2 - 1\` is the screen half of it and \`stored\` the depth
|
|
74
|
+
* half, and the matrix carries the remap from the buffer's sense to the clip space the camera
|
|
75
|
+
* was built in — including, on one backend, the Y flip that the generated WGSL applies to every
|
|
76
|
+
* vertex stage.
|
|
77
|
+
*/
|
|
78
|
+
vec4 world = uDecalDepthToWorld * vec4(vUv * 2.0 - 1.0, stored, 1.0);
|
|
79
|
+
vec3 point = world.xyz / world.w;
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* **The surface normal from the reconstruction's own derivatives**, because there is no normal
|
|
83
|
+
* buffer to read one from and adding one means a second colour attachment on every draw path in
|
|
84
|
+
* the engine. Two neighbouring pixels of the same surface span it, so their cross product is its
|
|
85
|
+
* plane — noisy along a silhouette, where one of the two neighbours is a different surface
|
|
86
|
+
* altogether, and exact everywhere else.
|
|
87
|
+
*
|
|
88
|
+
* **Turned to face the eye rather than trusted.** Which way \`cross\` points depends on which way
|
|
89
|
+
* the framebuffer's rows run, and the two backends disagree about that — so a sign taken from
|
|
90
|
+
* the cross product alone marks the tops of things on one and the undersides on the other, with
|
|
91
|
+
* nothing raising. A visible surface faces the eye by definition, so that is what fixes it.
|
|
92
|
+
*/
|
|
93
|
+
vec3 plane = cross(dFdx(point), dFdy(point));
|
|
94
|
+
float span = length(plane);
|
|
95
|
+
vec3 normal = span > 0.0 ? plane / span : uDecalAxis;
|
|
96
|
+
normal *= sign(dot(uDecalEye - point, normal));
|
|
97
|
+
|
|
98
|
+
vec3 box = (uWorldToDecal * vec4(point, 1.0)).xyz;
|
|
99
|
+
|
|
100
|
+
/* Inside the box on every axis, as a product of three steps rather than three branches. */
|
|
101
|
+
vec3 inside = step(abs(box), vec3(1.0));
|
|
102
|
+
float mark = inside.x * inside.y * inside.z;
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* An ellipse across the face with a soft edge, rather than the box's own rectangle. A mark with
|
|
106
|
+
* no texture has nothing else to shape it, and a hard rectangle reads as a decal cut out with
|
|
107
|
+
* scissors.
|
|
108
|
+
*/
|
|
109
|
+
float radius = length(box.xy);
|
|
110
|
+
mark *= 1.0 - smoothstep(1.0 - uDecalSoftness, 1.0, radius);
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Faded rather than cut where the surface turns away from the projector. A wall standing edge-on
|
|
114
|
+
* to the projector occupies one pixel of depth per metre of wall, so an unfaded mark aimed at
|
|
115
|
+
* the floor smears the whole depth of the box up it — the classic failure of a projected decal,
|
|
116
|
+
* and what \`facingCos\` is for on the static half of this too.
|
|
117
|
+
*/
|
|
118
|
+
float facing = dot(normal, -uDecalAxis);
|
|
119
|
+
mark *= smoothstep(uDecalFacingCos, min(1.0, uDecalFacingCos + 0.25), facing);
|
|
120
|
+
|
|
121
|
+
/* Nothing was drawn here at all, so there is no surface to mark — only the sky. */
|
|
122
|
+
mark *= ${glslIsFarDepth('stored')} ? 0.0 : 1.0;
|
|
123
|
+
|
|
124
|
+
/* White is the identity of a multiply, so a pixel the projector missed changes nothing. */
|
|
125
|
+
fragColor = vec4(mix(vec3(1.0), uDecalColor, mark * uDecalOpacity), 1.0);
|
|
126
|
+
}
|
|
127
|
+
`;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { resolveConditionals } from './conditionals.ts';
|
|
2
|
+
import { SKINNING_GLSL } from './skinning.ts';
|
|
3
|
+
import { CHANNEL_ATTRIBUTE, CHANNEL_BEND } from './vertexChannel.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Depth-only shadow pass. Its optional peel mode rejects the first recorded
|
|
7
|
+
* surface so the next independently fading occluder can be retained.
|
|
8
|
+
*
|
|
9
|
+
* **Two vertex variants, skinned and not**, for the reason `ShadowCasterSink.scatter` already
|
|
10
|
+
* states about the wind: handing the depth pass a different deformation from the colour pass is
|
|
11
|
+
* how a shadow comes loose from its caster. A skinned character cast rigidly does not drift
|
|
12
|
+
* slightly — it casts its bind pose, so a running figure throws the shadow of a statue.
|
|
13
|
+
*
|
|
14
|
+
* The permutation rather than a uniform gate is the same decision `skinning.ts` measured for the
|
|
15
|
+
* flat shader, and it is cheaper here: this vertex shader is a fifth the size of that one, so the
|
|
16
|
+
* second copy dedupes almost entirely inside deflate's window.
|
|
17
|
+
*/
|
|
18
|
+
const DEPTH_VERT_SOURCE = `#version 300 es
|
|
19
|
+
layout(location = 0) in vec3 aPosition;
|
|
20
|
+
#if SKINNED
|
|
21
|
+
${SKINNING_GLSL}
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
uniform mat4 uLightViewProj;
|
|
25
|
+
/*
|
|
26
|
+
* Placement last, and in the instanced variant not at all — see the flat shader, where the same
|
|
27
|
+
* arrangement is load-bearing. Here it costs nothing to keep: uModel is already the last field,
|
|
28
|
+
* so the instanced block is this one without its tail and uLightViewProj does not move.
|
|
29
|
+
*/
|
|
30
|
+
#if INSTANCED
|
|
31
|
+
/**
|
|
32
|
+
* One instance's placement, four vec4 columns, at the same locations the flat stage uses.
|
|
33
|
+
*
|
|
34
|
+
* No tint: this stage writes depth and nothing samples its colour.
|
|
35
|
+
*
|
|
36
|
+
* The same exclusions apply and for the same reasons — skinning owns locations 11 and 12, and a
|
|
37
|
+
* shadow must be deformed exactly as its caster is or it comes loose from the body casting it.
|
|
38
|
+
*/
|
|
39
|
+
layout(location = 11) in vec4 aInstanceModel0;
|
|
40
|
+
layout(location = 12) in vec4 aInstanceModel1;
|
|
41
|
+
layout(location = 13) in vec4 aInstanceModel2;
|
|
42
|
+
layout(location = 14) in vec4 aInstanceModel3;
|
|
43
|
+
#else
|
|
44
|
+
uniform mat4 uModel;
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* **The same channel and the same bend the colour pass runs, and it is not optional here.**
|
|
48
|
+
* scatter.ts records why it shares one expression between its two programs: a canopy that bends
|
|
49
|
+
* in the picture and stands still in the shadow map slides its whole shade off the ground it
|
|
50
|
+
* belongs to, and the offset follows the gust, so it never reads as a fixed error anybody could
|
|
51
|
+
* find by looking at one frame.
|
|
52
|
+
*
|
|
53
|
+
* Only .x is read. The sky and alpha lanes are shading, and this stage writes depth.
|
|
54
|
+
*/
|
|
55
|
+
${CHANNEL_ATTRIBUTE}
|
|
56
|
+
${CHANNEL_BEND}
|
|
57
|
+
#endif
|
|
58
|
+
|
|
59
|
+
out vec4 vLightPosition;
|
|
60
|
+
|
|
61
|
+
void main() {
|
|
62
|
+
#if SKINNED
|
|
63
|
+
/* In model space, before uModel, because a palette entry already carries the bind pose —
|
|
64
|
+
the same order the flat shader applies it in, and the two must agree or a shadow parts
|
|
65
|
+
from the body casting it. */
|
|
66
|
+
vec4 local = skinMatrix() * vec4(aPosition, 1.0);
|
|
67
|
+
#else
|
|
68
|
+
vec4 local = vec4(aPosition, 1.0);
|
|
69
|
+
#endif
|
|
70
|
+
#if INSTANCED
|
|
71
|
+
mat4 model = mat4(aInstanceModel0, aInstanceModel1, aInstanceModel2, aInstanceModel3);
|
|
72
|
+
#else
|
|
73
|
+
mat4 model = uModel;
|
|
74
|
+
#endif
|
|
75
|
+
vec4 world = model * local;
|
|
76
|
+
#if INSTANCED
|
|
77
|
+
vec3 bent = world.xyz;
|
|
78
|
+
#else
|
|
79
|
+
vec3 bent = channelBend(world.xyz, aChannel.x);
|
|
80
|
+
#endif
|
|
81
|
+
vLightPosition = uLightViewProj * vec4(bent, world.w);
|
|
82
|
+
gl_Position = vLightPosition;
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
/** The rigid variant: the world, a prop, a mesh with no rig behind it. */
|
|
87
|
+
export const DEPTH_VERT = resolveConditionals(
|
|
88
|
+
DEPTH_VERT_SOURCE,
|
|
89
|
+
{ SKINNED: false, INSTANCED: false },
|
|
90
|
+
'depth',
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
/** The skinned variant, which reads a joint palette and moves the vertex by it. */
|
|
94
|
+
export const DEPTH_SKINNED_VERT = resolveConditionals(
|
|
95
|
+
DEPTH_VERT_SOURCE,
|
|
96
|
+
{ SKINNED: true, INSTANCED: false },
|
|
97
|
+
'depth-skinned',
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The variant an instanced draw casts its shadow through.
|
|
102
|
+
*
|
|
103
|
+
* **It exists because a shadow is not optional.** An instanced mesh whose depth pass still read
|
|
104
|
+
* uModel would cast every instance's shadow from the last matrix uploaded — one shadow in the
|
|
105
|
+
* right place and the rest stacked underneath it, which reads as a lighting fault rather than as
|
|
106
|
+
* a missing variant, and is the shape the per-draw ring exists to prevent one level up.
|
|
107
|
+
*/
|
|
108
|
+
export const DEPTH_INSTANCED_VERT = resolveConditionals(
|
|
109
|
+
DEPTH_VERT_SOURCE,
|
|
110
|
+
{ SKINNED: false, INSTANCED: true },
|
|
111
|
+
'depth-instanced',
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
export const DEPTH_FRAG = `#version 300 es
|
|
115
|
+
precision highp float;
|
|
116
|
+
in vec4 vLightPosition;
|
|
117
|
+
|
|
118
|
+
uniform highp sampler2D uPreviousShadowMap;
|
|
119
|
+
uniform int uPeelShadowLayer;
|
|
120
|
+
|
|
121
|
+
void main() {
|
|
122
|
+
if (uPeelShadowLayer != 0) {
|
|
123
|
+
vec3 p = vLightPosition.xyz / vLightPosition.w;
|
|
124
|
+
vec2 uv = p.xy * 0.5 + 0.5;
|
|
125
|
+
float previousDepth = texture(uPreviousShadowMap, uv).r;
|
|
126
|
+
// Discard the already-recorded surface and everything in front of it. The
|
|
127
|
+
// ordinary depth test then stores the next independently fading occluder.
|
|
128
|
+
if (gl_FragCoord.z <= previousDepth + 0.00001) discard;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { glslSceneDepthToNdc } from '../depthConvention.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Depth of field: a circle of confusion from the depth buffer, and a disc blur that follows it.
|
|
4
|
+
*
|
|
5
|
+
* **A snippet spliced into the composite rather than a pass of its own**, because the composite
|
|
6
|
+
* already holds everything this needs — the resolved scene, its depth, and a place in the chain
|
|
7
|
+
* where the picture is finished but not yet graded. A second fullscreen pass would mean a second
|
|
8
|
+
* read and a second write of the whole frame to add eight taps to the pixels that are out of
|
|
9
|
+
* focus, which is the shape `ambientOcclusion.ts` takes only because it must blur its own noisy
|
|
10
|
+
* estimate first. Nothing here is noisy.
|
|
11
|
+
*
|
|
12
|
+
* **Off costs one comparison.** `uDofStrength` at zero is a branch on a uniform — provably uniform
|
|
13
|
+
* control flow, so it is not the 2026-08-07 case — and the frame is the frame that existed before
|
|
14
|
+
* the effect did, bit for bit.
|
|
15
|
+
*
|
|
16
|
+
* **The model, and why it is stated in metres.** A lens has a plane it is focused on and a depth
|
|
17
|
+
* either side of it that is acceptably sharp; past that, a point becomes a disc whose diameter
|
|
18
|
+
* grows with how far out of focus it is. So the two numbers a caller gives are a *distance* and a
|
|
19
|
+
* *range*, both in metres of the world, and the shader turns them into a radius in pixels. A
|
|
20
|
+
* formulation in depth-buffer units would be cheaper and would mean nothing to anyone: a camera
|
|
21
|
+
* focuses on a thing at a distance, not on a value of `gl_FragCoord.z`.
|
|
22
|
+
*
|
|
23
|
+
* **What the ramp is, exactly.** Zero inside `range` metres of the plane, reaching full blur one
|
|
24
|
+
* more `range` beyond it, clamped there. Linear rather than physical: a real circle of confusion
|
|
25
|
+
* grows without bound behind the plane and toward the lens in front of it, and reproducing that
|
|
26
|
+
* needs an aperture, a focal length and a sensor size — three numbers a game camera does not have
|
|
27
|
+
* and would have to invent. *What that gives up* is that a caller cannot reproduce a particular
|
|
28
|
+
* lens. *What would reverse it* is a consumer matching real optics, and the answer then is those
|
|
29
|
+
* three numbers rather than a different curve on these two.
|
|
30
|
+
*
|
|
31
|
+
* **The bleed, and the one line that handles it.** The classic artefact of a gather blur is a
|
|
32
|
+
* sharp foreground subject collecting colour from the blurred background behind it, so it wears a
|
|
33
|
+
* halo of whatever it is standing in front of. A tap here is weighted by whether it is *behind*
|
|
34
|
+
* the pixel it is blurring into — which it may always contribute to — or in front of it, where it
|
|
35
|
+
* contributes only as far as it is itself defocused. That is one compare per tap and it removes
|
|
36
|
+
* the halo. *What it does not do* is spread a blurred foreground *over* a sharp background, which
|
|
37
|
+
* a gather cannot do at all: no tap on the background ever reaches out to find it. A scatter pass
|
|
38
|
+
* or a separate near field is the answer, and neither is here.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/** How many taps the disc takes. Eight, fixed, so the cost of the effect is a constant. */
|
|
42
|
+
export const DOF_TAPS = 8;
|
|
43
|
+
|
|
44
|
+
export const DEPTH_OF_FIELD_GLSL = `
|
|
45
|
+
/** Where the lens is focused, in metres from the camera. */
|
|
46
|
+
uniform float uFocusDistance;
|
|
47
|
+
/**
|
|
48
|
+
* How many metres either side of that plane stay sharp, and over how many more the blur reaches
|
|
49
|
+
* full strength. One number for both, because two would be a second dial with no second question.
|
|
50
|
+
*/
|
|
51
|
+
uniform float uFocusRange;
|
|
52
|
+
/**
|
|
53
|
+
* The widest the blur may reach, as a fraction of the frame's height. 0 turns the effect off and
|
|
54
|
+
* is the whole of the off path.
|
|
55
|
+
*/
|
|
56
|
+
uniform float uDofStrength;
|
|
57
|
+
/**
|
|
58
|
+
* \`vec2(height / width, 1.0)\`, so a radius given in fractions of the frame's height traces a
|
|
59
|
+
* circle on screen rather than an ellipse stretched by the aspect.
|
|
60
|
+
*/
|
|
61
|
+
uniform vec2 uDofAspect;
|
|
62
|
+
/**
|
|
63
|
+
* The four elements of the inverse projection that turn a depth sample into a view-space distance:
|
|
64
|
+
* \`(m[10], m[14], m[11], m[15])\` in gl-matrix's column-major order, which are \`M[2][2]\`,
|
|
65
|
+
* \`M[2][3]\`, \`M[3][2]\` and \`M[3][3]\`.
|
|
66
|
+
*
|
|
67
|
+
* Four floats rather than the whole matrix, because the other twelve are multiplied by the x and y
|
|
68
|
+
* of a clip position this never needs: a perspective projection's inverse has zeroes where they
|
|
69
|
+
* would land. \`ambientOcclusion.ts\` uploads the full \`uInvProjection\` because it reconstructs a
|
|
70
|
+
* *position* and needs them.
|
|
71
|
+
*/
|
|
72
|
+
uniform vec4 uDepthToView;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Metres in front of the camera, from a depth sample.
|
|
76
|
+
*
|
|
77
|
+
* \`depth * 2.0 - 1.0\` is the same recovery \`cameraBlur\` makes and for the same reason: the depth
|
|
78
|
+
* attachment holds [0, 1] on both backends, the projection whose inverse this carries is the
|
|
79
|
+
* uncorrected OpenGL-convention one, and the engine settles the difference between the two clip
|
|
80
|
+
* spaces in the matrix rather than in the shaders.
|
|
81
|
+
*/
|
|
82
|
+
float viewDepthOf(vec2 uv) {
|
|
83
|
+
float z = ${glslSceneDepthToNdc('textureLod(uDepth, uv, 0.0).r')};
|
|
84
|
+
return -(uDepthToView.x * z + uDepthToView.y) / (uDepthToView.z * z + uDepthToView.w);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** 0 inside the sharp zone, 1 at full blur. See the header for the shape of the ramp. */
|
|
88
|
+
float circleOfConfusion(float viewDepth) {
|
|
89
|
+
float offPlane = abs(viewDepth - uFocusDistance) - uFocusRange;
|
|
90
|
+
return clamp(offPlane / uFocusRange, 0.0, 1.0);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The eight offsets of the disc, written out.
|
|
95
|
+
*
|
|
96
|
+
* A golden-angle spiral at radii spaced by \`sqrt((i + 0.5) / 8)\`, which fills a disc evenly
|
|
97
|
+
* rather than stacking the taps into a ring. Literals rather than a loop over \`cos\` and \`sin\`,
|
|
98
|
+
* because these are constants and evaluating them per pixel is eight transcendentals for a table.
|
|
99
|
+
* Successive taps turned by the golden angle never line up into spokes, which is the same
|
|
100
|
+
* property \`ambientOcclusion.ts\` picks it for.
|
|
101
|
+
*
|
|
102
|
+
* The colour comes back premultiplied by the weight and the weight rides in \`w\`, rather than an
|
|
103
|
+
* \`inout\` parameter — one value out of one function, which is what the generator translates most
|
|
104
|
+
* predictably.
|
|
105
|
+
*/
|
|
106
|
+
vec4 dofTap(vec2 direction, float radius, float centreDepth) {
|
|
107
|
+
vec2 uv = vUv + direction * radius * uDofAspect;
|
|
108
|
+
float depth = viewDepthOf(uv);
|
|
109
|
+
/* Behind the pixel it is blurring into, or defocused enough to have spread this far. */
|
|
110
|
+
float weight = depth >= centreDepth ? 1.0 : circleOfConfusion(depth);
|
|
111
|
+
/* textureLod: this is reached through a branch on the circle of confusion, which varies across
|
|
112
|
+
the frame, so it is not uniform control flow. Identical output — one storage level. */
|
|
113
|
+
return vec4(textureLod(uScene, uv, 0.0).rgb * weight, weight);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The disc, gathered.
|
|
118
|
+
*
|
|
119
|
+
* The centre sample is the colour handed in rather than a fresh fetch, so a pixel that has already
|
|
120
|
+
* been camera-blurred keeps that blur at the middle of its own disc. *What that gives up* is that
|
|
121
|
+
* the eight taps read the unblurred scene, so the two effects compose approximately rather than
|
|
122
|
+
* exactly. *What would make it wrong* is a consumer running both at full strength and caring which
|
|
123
|
+
* order they were applied in, and the answer then is a second scene target for the intermediate.
|
|
124
|
+
*/
|
|
125
|
+
vec3 depthOfField(vec3 centre) {
|
|
126
|
+
float depth = viewDepthOf(vUv);
|
|
127
|
+
float coc = circleOfConfusion(depth);
|
|
128
|
+
if (coc <= 0.0) return centre;
|
|
129
|
+
float radius = coc * uDofStrength;
|
|
130
|
+
vec4 sum = vec4(centre, 1.0);
|
|
131
|
+
sum += dofTap(vec2( 0.250000, 0.000000), radius, depth);
|
|
132
|
+
sum += dofTap(vec2(-0.319290, 0.292496), radius, depth);
|
|
133
|
+
sum += dofTap(vec2( 0.048872, -0.556877), radius, depth);
|
|
134
|
+
sum += dofTap(vec2( 0.402444, 0.524918), radius, depth);
|
|
135
|
+
sum += dofTap(vec2(-0.738535, -0.130636), radius, depth);
|
|
136
|
+
sum += dofTap(vec2( 0.699605, -0.445031), radius, depth);
|
|
137
|
+
sum += dofTap(vec2(-0.234004, 0.870484), radius, depth);
|
|
138
|
+
sum += dofTap(vec2(-0.446271, -0.859268), radius, depth);
|
|
139
|
+
return sum.rgb / sum.w;
|
|
140
|
+
}
|
|
141
|
+
`;
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { FOG_GLSL } from './fog.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A thin, wet, iridescent film lying on a surface.
|
|
5
|
+
*
|
|
6
|
+
* The material an oil slick is made of, described without knowing what oil is.
|
|
7
|
+
* Flat dark geometry cannot do this job — it reads as a hole in the world, which
|
|
8
|
+
* is exactly how the first version looked. What makes a film read as *wet* is
|
|
9
|
+
* that it changes with the angle you see it from: almost black looking straight
|
|
10
|
+
* down, and a shifting sheen at a glance.
|
|
11
|
+
*
|
|
12
|
+
* Textureless, per the standing rule. The iridescence is a hue swept by the
|
|
13
|
+
* view angle plus a slow travelling ripple, both evaluated per fragment; the
|
|
14
|
+
* rainbow is generated rather than sampled.
|
|
15
|
+
*/
|
|
16
|
+
export const FILM_VERT = `#version 300 es
|
|
17
|
+
precision highp float;
|
|
18
|
+
|
|
19
|
+
layout(location = 0) in vec3 aPosition;
|
|
20
|
+
layout(location = 1) in vec3 aNormal;
|
|
21
|
+
layout(location = 2) in vec3 aColor;
|
|
22
|
+
/*
|
|
23
|
+
* Coverage, on the attribute the mesh format calls emissive.
|
|
24
|
+
*
|
|
25
|
+
* A film has no use for self-illumination, and it very much needs an edge that
|
|
26
|
+
* dissolves: the first oil was flat squares, and a hard straight edge is what made
|
|
27
|
+
* it read as a decal dropped on the world rather than a puddle lying in it. One
|
|
28
|
+
* float per vertex, 1 in the middle of a slick and 0 at its rim.
|
|
29
|
+
*/
|
|
30
|
+
layout(location = 3) in float aCoverage;
|
|
31
|
+
|
|
32
|
+
uniform mat4 uViewProj;
|
|
33
|
+
/* The mirrored camera's projection, so a film can sample the planar target the way water does. */
|
|
34
|
+
uniform mat4 uReflectionViewProj;
|
|
35
|
+
|
|
36
|
+
out vec3 vWorld;
|
|
37
|
+
out vec3 vNormal;
|
|
38
|
+
out vec3 vTint;
|
|
39
|
+
out vec4 vReflectionClip;
|
|
40
|
+
out float vCoverage;
|
|
41
|
+
|
|
42
|
+
void main() {
|
|
43
|
+
vWorld = aPosition;
|
|
44
|
+
vNormal = normalize(aNormal);
|
|
45
|
+
vTint = aColor;
|
|
46
|
+
vCoverage = aCoverage;
|
|
47
|
+
vReflectionClip = uReflectionViewProj * vec4(aPosition, 1.0);
|
|
48
|
+
gl_Position = uViewProj * vec4(aPosition, 1.0);
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
export const FILM_FRAG = `#version 300 es
|
|
53
|
+
precision highp float;
|
|
54
|
+
|
|
55
|
+
in vec3 vWorld;
|
|
56
|
+
in vec3 vNormal;
|
|
57
|
+
in vec3 vTint;
|
|
58
|
+
in vec4 vReflectionClip;
|
|
59
|
+
/*
|
|
60
|
+
* The scene mirrored across the plane this film lies on, and how much of it to show.
|
|
61
|
+
*
|
|
62
|
+
* **Sheen is iridescence and this is the image**, which is the split a consumer asked for after
|
|
63
|
+
* finding that raising sheen to make a road wetter only made it oilier. A wet street at night is
|
|
64
|
+
* defined by everything above it appearing twice, and no amount of interference pattern is that.
|
|
65
|
+
*
|
|
66
|
+
* The projection is the water shader's, unchanged and deliberately so: reproducing it outside the
|
|
67
|
+
* engine is the piece most likely to be subtly wrong and least likely to be noticed, since a
|
|
68
|
+
* mirror off by a small skew looks like a wet road until somebody puts a straight line across it.
|
|
69
|
+
*/
|
|
70
|
+
uniform sampler2D uReflectionMap;
|
|
71
|
+
uniform int uReflectionEnabled;
|
|
72
|
+
uniform float uReflectionStrength;
|
|
73
|
+
in float vCoverage;
|
|
74
|
+
|
|
75
|
+
uniform vec3 uCameraPos;
|
|
76
|
+
uniform float uTime;
|
|
77
|
+
/*
|
|
78
|
+
* The mirrored pass clips at the water plane, and it does so **in the fragment
|
|
79
|
+
* shader** rather than with gl_ClipDistance.
|
|
80
|
+
*
|
|
81
|
+
* That is not a style choice. Clip distances in WebGL2 need
|
|
82
|
+
* EXT_clip_cull_distance both enabled on the context and declared with an
|
|
83
|
+
* #extension line, and without the declaration the shader fails to *compile* —
|
|
84
|
+
* which, since programs are built when the renderer is constructed, takes the
|
|
85
|
+
* whole boot with it and leaves a black screen. This shader had never been
|
|
86
|
+
* compiled when it was written, so the mistake sat harmlessly in the file until
|
|
87
|
+
* the day it was wired to something. Discarding is what flat.ts does, it needs
|
|
88
|
+
* no extension, and a film is a thin translucent layer where the cost of a
|
|
89
|
+
* discarded fragment is nothing.
|
|
90
|
+
*/
|
|
91
|
+
uniform vec4 uClipPlane;
|
|
92
|
+
uniform int uClipEnabled;
|
|
93
|
+
${FOG_GLSL}
|
|
94
|
+
/** How strong the sheen is. Zero leaves a plain dark film. */
|
|
95
|
+
uniform float uSheen;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* How rough the film's own surface is, 0 to 1, and how coarse that roughness is.
|
|
99
|
+
*
|
|
100
|
+
* **A film had exactly one finish before this: mirror.** That is right for standing water and
|
|
101
|
+
* wrong for the thing this pass is most used for, because a wet road is not a mirror — it is
|
|
102
|
+
* water lying *in* aggregate, and the stone underneath breaks the reflection into a smear. With
|
|
103
|
+
* no way to say so, a patch of film over a textured road met it at a hard rim: mirror on one
|
|
104
|
+
* side, stone on the other, with nothing able to cross it. Feathering the coverage cannot fix
|
|
105
|
+
* that, and it was tried — the alpha was never what the eye was reading.
|
|
106
|
+
*
|
|
107
|
+
* So the reflection is displaced by a noise field rather than blurred. **Displaced, because a
|
|
108
|
+
* blur is the wrong phenomenon**: a rough surface does not soften what it reflects, it scatters
|
|
109
|
+
* it, and a lamp on wet tarmac smears into a streak rather than becoming a soft disc. It is also
|
|
110
|
+
* what a blur cannot afford here — the mirror has no mip chain (see the \`textureLod\` note
|
|
111
|
+
* below), so softening it honestly would cost several taps where this costs none.
|
|
112
|
+
*
|
|
113
|
+
* \`uFilmRoughnessCycles\` is bumps to the metre, and it is the same quantity
|
|
114
|
+
* \`Renderer.setSurfaceRelief\` takes. **Matching it to the surface underneath is the point**:
|
|
115
|
+
* given the same field at the same scale, the water is broken up by the aggregate that the dry
|
|
116
|
+
* road beside it is showing, and the two stop being different materials.
|
|
117
|
+
*
|
|
118
|
+
* Zero is the mirror this pass has always been, exactly, so nothing that does not ask for
|
|
119
|
+
* roughness renders differently.
|
|
120
|
+
*/
|
|
121
|
+
uniform float uFilmRoughness;
|
|
122
|
+
uniform float uFilmRoughnessCycles;
|
|
123
|
+
|
|
124
|
+
out vec4 fragColor;
|
|
125
|
+
|
|
126
|
+
/** A hue wheel, without a texture. Standard 6-segment ramp. */
|
|
127
|
+
vec3 hue(float h) {
|
|
128
|
+
h = fract(h) * 6.0;
|
|
129
|
+
vec3 c = clamp(vec3(abs(h - 3.0) - 1.0, 2.0 - abs(h - 2.0), 2.0 - abs(h - 4.0)), 0.0, 1.0);
|
|
130
|
+
return c;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The same value noise \`flat.ts\` builds its relief from, and deliberately the same.
|
|
135
|
+
*
|
|
136
|
+
* Copied rather than shared because these two shaders have no common include beyond the fog, and
|
|
137
|
+
* a film that used a *different* field would defeat the whole purpose of taking a cycle count:
|
|
138
|
+
* the water would be broken up by one pattern and the road by another, which is two materials
|
|
139
|
+
* again with extra steps.
|
|
140
|
+
*/
|
|
141
|
+
float filmHash(vec3 p) {
|
|
142
|
+
p = fract(p * 0.1031);
|
|
143
|
+
p += dot(p, p.zyx + 31.32);
|
|
144
|
+
return fract((p.x + p.y) * p.z);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
float filmNoise(vec3 p) {
|
|
148
|
+
vec3 i = floor(p);
|
|
149
|
+
vec3 f = fract(p);
|
|
150
|
+
vec3 u = f * f * (3.0 - 2.0 * f);
|
|
151
|
+
return mix(
|
|
152
|
+
mix(
|
|
153
|
+
mix(filmHash(i + vec3(0.0, 0.0, 0.0)), filmHash(i + vec3(1.0, 0.0, 0.0)), u.x),
|
|
154
|
+
mix(filmHash(i + vec3(0.0, 1.0, 0.0)), filmHash(i + vec3(1.0, 1.0, 0.0)), u.x),
|
|
155
|
+
u.y
|
|
156
|
+
),
|
|
157
|
+
mix(
|
|
158
|
+
mix(filmHash(i + vec3(0.0, 0.0, 1.0)), filmHash(i + vec3(1.0, 0.0, 1.0)), u.x),
|
|
159
|
+
mix(filmHash(i + vec3(0.0, 1.0, 1.0)), filmHash(i + vec3(1.0, 1.0, 1.0)), u.x),
|
|
160
|
+
u.y
|
|
161
|
+
),
|
|
162
|
+
u.z
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void main() {
|
|
167
|
+
if (uClipEnabled != 0 && dot(vec4(vWorld, 1.0), uClipPlane) < 0.0) discard;
|
|
168
|
+
|
|
169
|
+
vec3 view = normalize(uCameraPos - vWorld);
|
|
170
|
+
float facing = max(dot(normalize(vNormal), view), 0.0);
|
|
171
|
+
/*
|
|
172
|
+
* Fresnel-ish: dark looking straight down at it, bright at a grazing angle.
|
|
173
|
+
* This is the whole effect — it is what makes a wet patch look wet rather
|
|
174
|
+
* than looking like a patch of dark paint.
|
|
175
|
+
*/
|
|
176
|
+
float grazing = pow(1.0 - facing, 3.0);
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
* A slow travelling interference, so the sheen crawls rather than sitting
|
|
180
|
+
* still. Two frequencies that do not divide each other, or the pattern
|
|
181
|
+
* repeats visibly across a long slick.
|
|
182
|
+
*/
|
|
183
|
+
float ripple =
|
|
184
|
+
sin(vWorld.x * 0.73 + vWorld.z * 0.41 + uTime * 0.55) *
|
|
185
|
+
cos(vWorld.z * 0.91 - vWorld.x * 0.29 - uTime * 0.37);
|
|
186
|
+
|
|
187
|
+
vec3 sheen = hue(grazing * 1.35 + ripple * 0.14 + 0.55);
|
|
188
|
+
/*
|
|
189
|
+
* Dark underneath, so the film always reads as *less* than the surface it lies on even where
|
|
190
|
+
* the sheen is strongest — but not so dark that it disappears.
|
|
191
|
+
*
|
|
192
|
+
* A slick that has just launched somebody has to be findable afterwards. It was rounded,
|
|
193
|
+
* feathered and iridescent — and at a fifth of an opaque tint on a pale deck at dusk,
|
|
194
|
+
* invisible. A hazard you cannot find is not a hazard, it is a trap.
|
|
195
|
+
*
|
|
196
|
+
* So the base is darker and the sheen has a floor: even looking straight down, where the
|
|
197
|
+
* Fresnel term is nearly nothing, a slick is a distinctly wet patch rather than a faint one.
|
|
198
|
+
*/
|
|
199
|
+
vec3 base = vTint * 0.9;
|
|
200
|
+
vec3 color = base + sheen * uSheen * (0.22 + grazing * 0.75);
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* The mirrored scene, under the sheen rather than instead of it.
|
|
204
|
+
*
|
|
205
|
+
* Screen-space from the mirrored clip position, exactly as the water pass does it, with the
|
|
206
|
+
* same fade as the sample leaves the target: a reflection that stopped dead at the edge of its
|
|
207
|
+
* own buffer would draw a line across the road where nothing is.
|
|
208
|
+
*
|
|
209
|
+
* Weighted by the grazing term as well as by strength, because that is what a reflection does:
|
|
210
|
+
* a wet surface underfoot shows almost nothing and the same surface down the street shows the
|
|
211
|
+
* whole scene. Added before the fog so the image recedes with everything else in the frame.
|
|
212
|
+
*/
|
|
213
|
+
if (uReflectionEnabled != 0 && uReflectionStrength > 0.0 && vReflectionClip.w > 0.0) {
|
|
214
|
+
vec2 reflectionUv = vReflectionClip.xy / vReflectionClip.w * 0.5 + 0.5;
|
|
215
|
+
vec2 border = min(reflectionUv, 1.0 - reflectionUv);
|
|
216
|
+
float valid = smoothstep(0.0, 0.025, min(border.x, border.y));
|
|
217
|
+
/*
|
|
218
|
+
* An explicit level, not an implicit one, and the branch above is the whole reason.
|
|
219
|
+
*
|
|
220
|
+
* An implicit derivative inside control flow that is not provably uniform is what lets a
|
|
221
|
+
* compiler flatten the branch and pay for every arm — AGENTS.md, 2026-08-07 — and WGSL
|
|
222
|
+
* does not merely warn: the module fails to compile with "textureSample must only be
|
|
223
|
+
* called from uniform control flow", which invalidates the pipeline, which invalidates
|
|
224
|
+
* the command buffer, and the frame still presents. The fifth time on this branch. The
|
|
225
|
+
* mirror has no mip chain, so level 0 is the only level there is; the water shader
|
|
226
|
+
* reaches the same conclusion for the same lookup.
|
|
227
|
+
*/
|
|
228
|
+
/*
|
|
229
|
+
* The aggregate under the water, as a displacement of what the water shows.
|
|
230
|
+
*
|
|
231
|
+
* The gradient of the same field the road's relief uses, taken across the surface and used
|
|
232
|
+
* to push the lookup. **Stretched along the reflection rather than isotropic**, and that is
|
|
233
|
+
* the half that makes it read as a road: a reflection on a rough horizontal surface smears
|
|
234
|
+
* *towards the viewer*, because a bump tilts the ray in the plane it is already travelling
|
|
235
|
+
* in. Displacing in a circle gives frosted glass instead, which is a different wet thing.
|
|
236
|
+
*
|
|
237
|
+
* Scaled by the grazing term for the same reason the mirror is: looking straight down at a
|
|
238
|
+
* puddle the reflection is compressed into almost nothing and a displacement of it would be
|
|
239
|
+
* enormous, so the scatter has to fall off exactly where the image does.
|
|
240
|
+
*/
|
|
241
|
+
if (uFilmRoughness > 0.0) {
|
|
242
|
+
vec3 at = vWorld * uFilmRoughnessCycles;
|
|
243
|
+
float here = filmNoise(at);
|
|
244
|
+
vec2 slope = vec2(
|
|
245
|
+
filmNoise(at + vec3(0.5, 0.0, 0.0)) - here,
|
|
246
|
+
filmNoise(at + vec3(0.0, 0.0, 0.5)) - here
|
|
247
|
+
);
|
|
248
|
+
/* Along the view, which on a horizontal film is where the image runs. */
|
|
249
|
+
vec2 along = normalize(vec2(view.x, view.z) + vec2(1e-5, 0.0));
|
|
250
|
+
vec2 smear = along * dot(slope, along) * 3.0 + slope * 0.35;
|
|
251
|
+
reflectionUv += smear * uFilmRoughness * 0.016 * (0.2 + grazing * 0.8);
|
|
252
|
+
/* Re-fade at the border: a displaced sample can leave the target the original did not. */
|
|
253
|
+
vec2 movedBorder = min(reflectionUv, 1.0 - reflectionUv);
|
|
254
|
+
valid = min(valid, smoothstep(0.0, 0.025, min(movedBorder.x, movedBorder.y)));
|
|
255
|
+
}
|
|
256
|
+
vec3 mirrored = textureLod(uReflectionMap, clamp(reflectionUv, 0.0, 1.0), 0.0).rgb;
|
|
257
|
+
color = mix(color, mirrored, valid * uReflectionStrength * (0.25 + grazing * 0.75));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// The same fog every other pass applies — and now literally the same code, which
|
|
261
|
+
// it was not: this ran its own curve while claiming otherwise, so a slick receded
|
|
262
|
+
// at a different rate than the deck it was lying on.
|
|
263
|
+
float fog = mediumFog(length(uCameraPos - vWorld), vWorld.y);
|
|
264
|
+
color = mix(color, mediumColor(), fog);
|
|
265
|
+
|
|
266
|
+
/*
|
|
267
|
+
* Alpha from coverage, squared.
|
|
268
|
+
*
|
|
269
|
+
* Squared because a linear ramp across the rim still reads as a visible band —
|
|
270
|
+
* the eye finds the constant-gradient edge. Squaring pushes the falloff outward
|
|
271
|
+
* so the slick has a soft shoulder and no perceptible boundary. The sheen fades
|
|
272
|
+
* with it, which is right: the thinnest part of a film is the least iridescent.
|
|
273
|
+
*/
|
|
274
|
+
/*
|
|
275
|
+
* Alpha from coverage, and the rim is what is squared — not the whole patch.
|
|
276
|
+
*
|
|
277
|
+
* Squaring the coverage outright made the *middle* translucent too, which is most of why a
|
|
278
|
+
* slick could not be found. The shoulder still needs to be soft, so the square is mixed in
|
|
279
|
+
* near the edge only: solid through the body, dissolving at the rim.
|
|
280
|
+
*/
|
|
281
|
+
float coverage = clamp(vCoverage, 0.0, 1.0);
|
|
282
|
+
float alpha = mix(coverage * coverage, coverage, 0.65) * 0.92;
|
|
283
|
+
fragColor = vec4(color, alpha);
|
|
284
|
+
}
|
|
285
|
+
`;
|