@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,95 @@
|
|
|
1
|
+
import type { MeshData } from '../../mesh.ts';
|
|
2
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The scatter pass: one base mesh drawn many times, deformed by wind in the vertex stage.
|
|
5
|
+
*
|
|
6
|
+
* **The first pass here that instances**, and the whole reason it is worth porting early: a
|
|
7
|
+
* field of grass is tens of thousands of copies of a few triangles, and everything else this
|
|
8
|
+
* backend draws is one copy of one mesh. The WebGPU shape of it is `stepMode: 'instance'` on
|
|
9
|
+
* a vertex buffer, which is `vertexAttribDivisor(location, 1)` with the divisor moved from
|
|
10
|
+
* the attribute to the buffer that carries it.
|
|
11
|
+
*/
|
|
12
|
+
/** One field's place in the block, as the generator recorded it. See `flatPass.StageBindings`. */
|
|
13
|
+
export type UniformFields = Readonly<Record<string, {
|
|
14
|
+
readonly offset: number;
|
|
15
|
+
readonly size: number;
|
|
16
|
+
readonly length?: number;
|
|
17
|
+
readonly stride?: number;
|
|
18
|
+
}>>;
|
|
19
|
+
export declare const SCATTER_DEPTH_FIELDS: UniformFields;
|
|
20
|
+
export declare const SCATTER_DEPTH_SIZE: 240;
|
|
21
|
+
export declare const SCATTER_VERT_FIELDS: UniformFields;
|
|
22
|
+
export declare const SCATTER_VERT_SIZE: 240;
|
|
23
|
+
export declare const SCATTER_FRAG_FIELDS: UniformFields;
|
|
24
|
+
export declare const SCATTER_FRAG_SIZE: 128;
|
|
25
|
+
export declare function scatterVertexLayouts(): GPUVertexBufferLayout[];
|
|
26
|
+
/** Geometry and placement on the device, behind the opaque handle the surface hands out. */
|
|
27
|
+
export interface GpuScatter {
|
|
28
|
+
readonly vertexBuffers: readonly GPUBuffer[];
|
|
29
|
+
readonly indexBuffer: GPUBuffer;
|
|
30
|
+
readonly indexCount: number;
|
|
31
|
+
/** How many instances the per-instance buffers were sized for. */
|
|
32
|
+
readonly capacity: number;
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Upload a base mesh and size the per-instance buffers.
|
|
37
|
+
*
|
|
38
|
+
* **Sized to capacity now and rewritten later**, matching `InstancedMesh`: growing a buffer
|
|
39
|
+
* mid-frame is a stall, and a scatter's capacity is known when it is built.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createGpuScatter(device: GPUDevice, base: MeshData, capacity: number): GpuScatter;
|
|
42
|
+
export declare function createScatterBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
43
|
+
export declare function createScatterBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, perPass: GPUBuffer, perFrame: GPUBuffer): GPUBindGroup;
|
|
44
|
+
/**
|
|
45
|
+
* The scatter *depth* pipeline: the same blades, bent the same way, into the shadow map.
|
|
46
|
+
*
|
|
47
|
+
* **It has to be the same deformation or the shadow comes loose from its caster.** The
|
|
48
|
+
* vertex stage is `SCATTER_DEPTH_VERT` rather than the frame's, but it reads the same wind
|
|
49
|
+
* block at the same offsets, so the two are fed from one `resolveScatterDeform`. A blade
|
|
50
|
+
* bent by one gust and shadowed by another is the failure this pairing exists to prevent —
|
|
51
|
+
* and it is why `ShadowCasterSink.scatter` takes the gust rather than looking it up.
|
|
52
|
+
*
|
|
53
|
+
* Paired with `DEPTH_FRAG`, exactly as `renderer.ts` pairs `scatterDepthProgram`.
|
|
54
|
+
*
|
|
55
|
+
* Single-sampled and no colour target: the shadow map is neither multisampled nor presented.
|
|
56
|
+
*/
|
|
57
|
+
export declare function scatterDepthPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout, shadowFormat: GPUTextureFormat, depthFragment: string): GPURenderPipeline;
|
|
58
|
+
/**
|
|
59
|
+
* The scatter pipeline.
|
|
60
|
+
*
|
|
61
|
+
* **Culling off, matching `renderer.ts`.** It brackets the scatter draw with
|
|
62
|
+
* `gl.disable(gl.CULL_FACE)`, because a blade of grass is a flat card with no back: cull it
|
|
63
|
+
* and half the field vanishes depending on which way the wind turned it.
|
|
64
|
+
*/
|
|
65
|
+
export declare function scatterPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
|
|
66
|
+
/**
|
|
67
|
+
* The layout the scatter depth pass binds against.
|
|
68
|
+
*
|
|
69
|
+
* The vertex block is the scatter one — wind and trample — and the fragment block and its
|
|
70
|
+
* previous-map sampler are the depth pass's own, unchanged, because the peel layer works the
|
|
71
|
+
* same way whatever geometry is filling it.
|
|
72
|
+
*
|
|
73
|
+
* **`hasDynamicOffset` on the vertex block, and it is a bug fix rather than a shape.** That
|
|
74
|
+
* block used to be one buffer rewritten before every batch, which is the failure `UniformRing`
|
|
75
|
+
* exists for: writes are ordered on the queue timeline and the encoder is submitted afterwards,
|
|
76
|
+
* so every scatter draw recorded before that submit reads the *last* write. Inside one
|
|
77
|
+
* directional layer that costs a batch the wrong gust. Inside a point light's bake it costs the
|
|
78
|
+
* wrong `uLightViewProj`, because six cube faces share one encoder — so a field of grass was
|
|
79
|
+
* rasterised into all six faces under the last face's projection, and five sixths of it landed
|
|
80
|
+
* in the octahedral map at directions nothing occupies. What that draws is a hard-edged patch of
|
|
81
|
+
* shadow on the ground beside a lamp with nothing above it to cast one.
|
|
82
|
+
*/
|
|
83
|
+
export declare function createScatterDepthBindGroupLayout(device: GPUDevice, fragBinding: number, fragSize: number, previous: {
|
|
84
|
+
texture: number;
|
|
85
|
+
sampler: number;
|
|
86
|
+
}): GPUBindGroupLayout;
|
|
87
|
+
/** `perDraw` is a `UniformRing`'s buffer now, bound one slot at a time. See the layout above. */
|
|
88
|
+
export declare function createScatterDepthBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, perDraw: GPUBuffer, frag: {
|
|
89
|
+
binding: number;
|
|
90
|
+
buffer: GPUBuffer;
|
|
91
|
+
size: number;
|
|
92
|
+
}, previous: {
|
|
93
|
+
texture: number;
|
|
94
|
+
sampler: number;
|
|
95
|
+
}, view: GPUTextureView, sampler: GPUSampler): GPUBindGroup;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { DEPTH_COMPARE } from '../../depthConvention.js';
|
|
2
|
+
import { SCATTER_BINDINGS, SCATTER_DEPTH_VERT_WGSL, SCATTER_FRAG_WGSL, SCATTER_VERT_WGSL, } from '../../shaders/generated/scatter.wgsl.js';
|
|
3
|
+
import { DEPTH_FORMAT } from './flatPass.js';
|
|
4
|
+
import { shaderModule } from './shaderModules.js';
|
|
5
|
+
/*
|
|
6
|
+
* Widened once here, for the reason `flatPass.ts` gives: the generated file is `as const`, so
|
|
7
|
+
* every field is its own literal type and indexing it by a computed name is an error. Checked
|
|
8
|
+
* against the real object rather than asserted about it — a generator that stopped emitting
|
|
9
|
+
* `offset` would fail on this line.
|
|
10
|
+
*/
|
|
11
|
+
export const SCATTER_DEPTH_FIELDS = SCATTER_BINDINGS.SCATTER_DEPTH_VERT.fields;
|
|
12
|
+
export const SCATTER_DEPTH_SIZE = SCATTER_BINDINGS.SCATTER_DEPTH_VERT.uniformSize;
|
|
13
|
+
export const SCATTER_VERT_FIELDS = SCATTER_BINDINGS.SCATTER_VERT.fields;
|
|
14
|
+
export const SCATTER_VERT_SIZE = SCATTER_BINDINGS.SCATTER_VERT.uniformSize;
|
|
15
|
+
export const SCATTER_FRAG_FIELDS = SCATTER_BINDINGS.SCATTER_FRAG.fields;
|
|
16
|
+
export const SCATTER_FRAG_SIZE = SCATTER_BINDINGS.SCATTER_FRAG.uniformSize;
|
|
17
|
+
const VERT_BINDING = SCATTER_BINDINGS.SCATTER_VERT.uniforms;
|
|
18
|
+
const FRAG_BINDING = SCATTER_BINDINGS.SCATTER_FRAG.uniforms;
|
|
19
|
+
const VISIBILITY_VERTEX = 0x1;
|
|
20
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
21
|
+
/** Buffer usage: VERTEX | COPY_DST, and INDEX | COPY_DST. See `buffers.ts`. */
|
|
22
|
+
const USAGE_VERTEX = 0x0020 | 0x0008;
|
|
23
|
+
const USAGE_INDEX = 0x0010 | 0x0008;
|
|
24
|
+
/**
|
|
25
|
+
* How the seven attributes are laid out, one buffer each.
|
|
26
|
+
*
|
|
27
|
+
* **Seven buffers rather than the two `flat` uses, and that is affordable here.**
|
|
28
|
+
* `maxVertexBuffers` is eight; `flat` interleaves because it declares ten attributes and
|
|
29
|
+
* would not fit. Seven does, and one buffer per attribute is what `InstancedMesh` already
|
|
30
|
+
* holds on the other backend, so the upload paths stay the same shape.
|
|
31
|
+
*
|
|
32
|
+
* The last four step per *instance*. That is the entire difference between a field of grass
|
|
33
|
+
* and one blade drawn tens of thousands of times in the same place.
|
|
34
|
+
*/
|
|
35
|
+
const ATTRIBUTES = [
|
|
36
|
+
{ location: 0, floats: 3, perInstance: false },
|
|
37
|
+
{ location: 1, floats: 3, perInstance: false },
|
|
38
|
+
{ location: 2, floats: 3, perInstance: false },
|
|
39
|
+
{ location: 3, floats: 3, perInstance: true },
|
|
40
|
+
{ location: 4, floats: 2, perInstance: true },
|
|
41
|
+
{ location: 5, floats: 3, perInstance: true },
|
|
42
|
+
{ location: 6, floats: 3, perInstance: true },
|
|
43
|
+
];
|
|
44
|
+
const FORMATS = {
|
|
45
|
+
2: 'float32x2',
|
|
46
|
+
3: 'float32x3',
|
|
47
|
+
};
|
|
48
|
+
export function scatterVertexLayouts() {
|
|
49
|
+
return ATTRIBUTES.map((attribute) => ({
|
|
50
|
+
arrayStride: attribute.floats * 4,
|
|
51
|
+
stepMode: attribute.perInstance ? 'instance' : 'vertex',
|
|
52
|
+
attributes: [
|
|
53
|
+
{
|
|
54
|
+
shaderLocation: attribute.location,
|
|
55
|
+
offset: 0,
|
|
56
|
+
format: FORMATS[attribute.floats],
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Upload a base mesh and size the per-instance buffers.
|
|
63
|
+
*
|
|
64
|
+
* **Sized to capacity now and rewritten later**, matching `InstancedMesh`: growing a buffer
|
|
65
|
+
* mid-frame is a stall, and a scatter's capacity is known when it is built.
|
|
66
|
+
*/
|
|
67
|
+
export function createGpuScatter(device, base, capacity) {
|
|
68
|
+
const buffers = [];
|
|
69
|
+
const upload = (data, label) => {
|
|
70
|
+
const buffer = device.createBuffer({
|
|
71
|
+
label,
|
|
72
|
+
size: Math.max(4, data.byteLength),
|
|
73
|
+
usage: USAGE_VERTEX,
|
|
74
|
+
});
|
|
75
|
+
device.queue.writeBuffer(buffer, 0, data);
|
|
76
|
+
buffers.push(buffer);
|
|
77
|
+
return buffer;
|
|
78
|
+
};
|
|
79
|
+
upload(base.positions, 'scatter.positions');
|
|
80
|
+
upload(base.normals, 'scatter.normals');
|
|
81
|
+
upload(base.colors, 'scatter.colors');
|
|
82
|
+
for (const attribute of ATTRIBUTES.filter((a) => a.perInstance)) {
|
|
83
|
+
const buffer = device.createBuffer({
|
|
84
|
+
label: `scatter.instance${attribute.location}`,
|
|
85
|
+
size: Math.max(4, capacity * attribute.floats * 4),
|
|
86
|
+
usage: USAGE_VERTEX,
|
|
87
|
+
});
|
|
88
|
+
buffers.push(buffer);
|
|
89
|
+
}
|
|
90
|
+
const indexBuffer = device.createBuffer({
|
|
91
|
+
label: 'scatter.indices',
|
|
92
|
+
size: Math.max(4, base.indices.byteLength),
|
|
93
|
+
usage: USAGE_INDEX,
|
|
94
|
+
});
|
|
95
|
+
device.queue.writeBuffer(indexBuffer, 0, base.indices);
|
|
96
|
+
return {
|
|
97
|
+
vertexBuffers: buffers,
|
|
98
|
+
indexBuffer,
|
|
99
|
+
indexCount: base.indices.length,
|
|
100
|
+
capacity,
|
|
101
|
+
dispose() {
|
|
102
|
+
for (const buffer of buffers)
|
|
103
|
+
buffer.destroy();
|
|
104
|
+
indexBuffer.destroy();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function createScatterBindGroupLayout(device) {
|
|
109
|
+
return device.createBindGroupLayout({
|
|
110
|
+
label: 'scatter.layout',
|
|
111
|
+
entries: [
|
|
112
|
+
/*
|
|
113
|
+
* **The vertex block is per draw and the fragment block is not.**
|
|
114
|
+
*
|
|
115
|
+
* The vertex block carries the gust and the trample field, and both arrive as arguments
|
|
116
|
+
* to `drawScatter` — so a scene bending its grass by one press field and its canopy by
|
|
117
|
+
* another gets whichever was written last for both, from a single buffer. That is not
|
|
118
|
+
* hypothetical elsewhere: the plume pass had exactly this and drew a flame bent by the
|
|
119
|
+
* smoke's wind response. The demo that exercises this today happens to pass both
|
|
120
|
+
* batches the same wind and no trample, which is luck rather than a guarantee.
|
|
121
|
+
*
|
|
122
|
+
* The fragment block holds the camera, the sun, the point lights and the medium, which
|
|
123
|
+
* are settled per pass rather than per batch. It stops being safe the day something
|
|
124
|
+
* per-batch is added to it, and that is what would make this a ring too.
|
|
125
|
+
*/
|
|
126
|
+
{
|
|
127
|
+
binding: VERT_BINDING,
|
|
128
|
+
visibility: VISIBILITY_VERTEX,
|
|
129
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: SCATTER_VERT_SIZE },
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
binding: FRAG_BINDING,
|
|
133
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
134
|
+
buffer: { type: 'uniform', minBindingSize: SCATTER_FRAG_SIZE },
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
export function createScatterBindGroup(device, layout, perPass, perFrame) {
|
|
140
|
+
return device.createBindGroup({
|
|
141
|
+
label: 'scatter.bindGroup',
|
|
142
|
+
layout,
|
|
143
|
+
entries: [
|
|
144
|
+
{ binding: VERT_BINDING, resource: { buffer: perPass, size: SCATTER_VERT_SIZE } },
|
|
145
|
+
{ binding: FRAG_BINDING, resource: { buffer: perFrame, size: SCATTER_FRAG_SIZE } },
|
|
146
|
+
],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The scatter *depth* pipeline: the same blades, bent the same way, into the shadow map.
|
|
151
|
+
*
|
|
152
|
+
* **It has to be the same deformation or the shadow comes loose from its caster.** The
|
|
153
|
+
* vertex stage is `SCATTER_DEPTH_VERT` rather than the frame's, but it reads the same wind
|
|
154
|
+
* block at the same offsets, so the two are fed from one `resolveScatterDeform`. A blade
|
|
155
|
+
* bent by one gust and shadowed by another is the failure this pairing exists to prevent —
|
|
156
|
+
* and it is why `ShadowCasterSink.scatter` takes the gust rather than looking it up.
|
|
157
|
+
*
|
|
158
|
+
* Paired with `DEPTH_FRAG`, exactly as `renderer.ts` pairs `scatterDepthProgram`.
|
|
159
|
+
*
|
|
160
|
+
* Single-sampled and no colour target: the shadow map is neither multisampled nor presented.
|
|
161
|
+
*/
|
|
162
|
+
export function scatterDepthPipeline(cache, device, layout, shadowFormat, depthFragment) {
|
|
163
|
+
return cache.get('scatter.depth', () => ({
|
|
164
|
+
label: 'scatter.depth',
|
|
165
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
166
|
+
vertex: {
|
|
167
|
+
module: shaderModule(device, {
|
|
168
|
+
label: 'scatter.depthVert',
|
|
169
|
+
code: SCATTER_DEPTH_VERT_WGSL,
|
|
170
|
+
}),
|
|
171
|
+
entryPoint: 'main',
|
|
172
|
+
buffers: scatterVertexLayouts(),
|
|
173
|
+
},
|
|
174
|
+
fragment: {
|
|
175
|
+
module: shaderModule(device, { label: 'depth.frag', code: depthFragment }),
|
|
176
|
+
entryPoint: 'main',
|
|
177
|
+
targets: [],
|
|
178
|
+
},
|
|
179
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
180
|
+
depthStencil: { format: shadowFormat, depthWriteEnabled: true, depthCompare: DEPTH_COMPARE },
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The scatter pipeline.
|
|
185
|
+
*
|
|
186
|
+
* **Culling off, matching `renderer.ts`.** It brackets the scatter draw with
|
|
187
|
+
* `gl.disable(gl.CULL_FACE)`, because a blade of grass is a flat card with no back: cull it
|
|
188
|
+
* and half the field vanishes depending on which way the wind turned it.
|
|
189
|
+
*/
|
|
190
|
+
export function scatterPipeline(cache, device, layout) {
|
|
191
|
+
return cache.get('scatter', () => ({
|
|
192
|
+
label: 'scatter',
|
|
193
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
194
|
+
vertex: {
|
|
195
|
+
module: shaderModule(device, { label: 'scatter.vert', code: SCATTER_VERT_WGSL }),
|
|
196
|
+
entryPoint: 'main',
|
|
197
|
+
buffers: scatterVertexLayouts(),
|
|
198
|
+
},
|
|
199
|
+
fragment: {
|
|
200
|
+
module: shaderModule(device, { label: 'scatter.frag', code: SCATTER_FRAG_WGSL }),
|
|
201
|
+
entryPoint: 'main',
|
|
202
|
+
targets: [{ format: cache.format }],
|
|
203
|
+
},
|
|
204
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
205
|
+
multisample: { count: cache.sampleCount },
|
|
206
|
+
depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: true, depthCompare: DEPTH_COMPARE },
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The layout the scatter depth pass binds against.
|
|
211
|
+
*
|
|
212
|
+
* The vertex block is the scatter one — wind and trample — and the fragment block and its
|
|
213
|
+
* previous-map sampler are the depth pass's own, unchanged, because the peel layer works the
|
|
214
|
+
* same way whatever geometry is filling it.
|
|
215
|
+
*
|
|
216
|
+
* **`hasDynamicOffset` on the vertex block, and it is a bug fix rather than a shape.** That
|
|
217
|
+
* block used to be one buffer rewritten before every batch, which is the failure `UniformRing`
|
|
218
|
+
* exists for: writes are ordered on the queue timeline and the encoder is submitted afterwards,
|
|
219
|
+
* so every scatter draw recorded before that submit reads the *last* write. Inside one
|
|
220
|
+
* directional layer that costs a batch the wrong gust. Inside a point light's bake it costs the
|
|
221
|
+
* wrong `uLightViewProj`, because six cube faces share one encoder — so a field of grass was
|
|
222
|
+
* rasterised into all six faces under the last face's projection, and five sixths of it landed
|
|
223
|
+
* in the octahedral map at directions nothing occupies. What that draws is a hard-edged patch of
|
|
224
|
+
* shadow on the ground beside a lamp with nothing above it to cast one.
|
|
225
|
+
*/
|
|
226
|
+
export function createScatterDepthBindGroupLayout(device, fragBinding, fragSize, previous) {
|
|
227
|
+
return device.createBindGroupLayout({
|
|
228
|
+
label: 'scatter.depthLayout',
|
|
229
|
+
entries: [
|
|
230
|
+
{
|
|
231
|
+
binding: VERT_BINDING,
|
|
232
|
+
visibility: VISIBILITY_VERTEX,
|
|
233
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: SCATTER_DEPTH_SIZE },
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
binding: fragBinding,
|
|
237
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
238
|
+
buffer: { type: 'uniform', minBindingSize: fragSize },
|
|
239
|
+
},
|
|
240
|
+
/* A depth format, for the reason `depthPass.ts` spells out over its own copy of this. */
|
|
241
|
+
{
|
|
242
|
+
binding: previous.texture,
|
|
243
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
244
|
+
texture: { sampleType: 'unfilterable-float' },
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
binding: previous.sampler,
|
|
248
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
249
|
+
sampler: { type: 'non-filtering' },
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/** `perDraw` is a `UniformRing`'s buffer now, bound one slot at a time. See the layout above. */
|
|
255
|
+
export function createScatterDepthBindGroup(device, layout, perDraw, frag, previous, view, sampler) {
|
|
256
|
+
return device.createBindGroup({
|
|
257
|
+
label: 'scatter.depthBindGroup',
|
|
258
|
+
layout,
|
|
259
|
+
entries: [
|
|
260
|
+
{ binding: VERT_BINDING, resource: { buffer: perDraw, size: SCATTER_DEPTH_SIZE } },
|
|
261
|
+
{ binding: frag.binding, resource: { buffer: frag.buffer, size: frag.size } },
|
|
262
|
+
{ binding: previous.texture, resource: view },
|
|
263
|
+
{ binding: previous.sampler, resource: sampler },
|
|
264
|
+
],
|
|
265
|
+
});
|
|
266
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { UniformFields } from './scatterPass.ts';
|
|
2
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
3
|
+
import type { SdfFont } from '../../sdfFont.ts';
|
|
4
|
+
import { SdfTextLayout, type SdfTextStyle } from '../../sdfTextLayout.ts';
|
|
5
|
+
import type { GpuSurfaceTexture } from './surfaceTexturePass.ts';
|
|
6
|
+
/**
|
|
7
|
+
* The SDF text pass: a string as flat, textured quads, drawn into the scene.
|
|
8
|
+
*
|
|
9
|
+
* Same job as `textPass.ts` for the engine's pixel font, and `sdfTextRenderer.ts`'s own class
|
|
10
|
+
* comment gives the reason this shape differs from that one: a distance field is sampled by
|
|
11
|
+
* the fragment shader, so a quad per glyph is the whole glyph — one indexed draw per string,
|
|
12
|
+
* no per-instance stepping. The layout is `sdfTextLayout.ts`'s and is shared with WebGL2; this
|
|
13
|
+
* owns only the buffers, the bind group and the pipeline.
|
|
14
|
+
*
|
|
15
|
+
* **World geometry, not a screen overlay — unlike `GpuText`.** It draws against the frame's
|
|
16
|
+
* own view-projection inside whatever pass is already open, the same one `drawMesh` uses, so
|
|
17
|
+
* it needs neither a pass of its own nor `openTextPass`'s depth clear. See `drawSdfText` in
|
|
18
|
+
* `webgpu/renderer.ts` for what that means for where this is called from.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SDF_TEXT_VERT_FIELDS: UniformFields;
|
|
21
|
+
export declare const SDF_TEXT_VERT_SIZE: 128;
|
|
22
|
+
export declare const SDF_TEXT_FRAG_FIELDS: UniformFields;
|
|
23
|
+
export declare const SDF_TEXT_FRAG_SIZE: 48;
|
|
24
|
+
/**
|
|
25
|
+
* One SDF text object on the device: the layout, and the three buffers it fills.
|
|
26
|
+
*
|
|
27
|
+
* **A plain indexed quad list, not `GpuText`'s instanced cube** — see this file's own doc
|
|
28
|
+
* comment. `positions`/`uvs` are re-uploaded only when `layout.set` says something moved,
|
|
29
|
+
* matching `SdfTextRenderer.upload`'s skip on the other backend; `indices` never changes after
|
|
30
|
+
* construction, matching `SdfTextLayout`'s own fixed `0,1,2,0,2,3` pattern.
|
|
31
|
+
*/
|
|
32
|
+
export declare class GpuSdfText {
|
|
33
|
+
private readonly device;
|
|
34
|
+
readonly layout: SdfTextLayout;
|
|
35
|
+
readonly positions: GPUBuffer;
|
|
36
|
+
readonly uvs: GPUBuffer;
|
|
37
|
+
readonly indices: GPUBuffer;
|
|
38
|
+
/** Set by `setText`; `drawSdfText` reads neither this class nor the atlas from anywhere else. */
|
|
39
|
+
font: SdfFont | null;
|
|
40
|
+
atlas: GpuSurfaceTexture | null;
|
|
41
|
+
constructor(device: GPUDevice);
|
|
42
|
+
/**
|
|
43
|
+
* Lay a string out against a font, and retain the atlas `drawSdfText` will sample.
|
|
44
|
+
*
|
|
45
|
+
* The engine fetches nothing: `font` was parsed from a metrics document the caller already
|
|
46
|
+
* had, and `atlas` is a `GpuSurfaceTexture` the caller already uploaded. A no-op, and no
|
|
47
|
+
* re-upload, when neither the text nor the style moved — see `SdfTextLayout.set`.
|
|
48
|
+
*/
|
|
49
|
+
setText(font: SdfFont, atlas: GpuSurfaceTexture, text: string, style: SdfTextStyle): void;
|
|
50
|
+
dispose(): void;
|
|
51
|
+
/** Both vertex buffers, from the arrays `layout.set` filled in place — the live prefix only. */
|
|
52
|
+
private upload;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `aPosition` at location 0, `aUv` at location 1 — pinned in `sdfText.ts` and read verbatim
|
|
56
|
+
* here rather than guessed, for the reason `sdfTextRenderer.ts`'s class comment gives. Neither
|
|
57
|
+
* is instanced: every vertex is its own quad corner, unlike `textVertexLayouts`'s per-instance
|
|
58
|
+
* cell and character.
|
|
59
|
+
*/
|
|
60
|
+
export declare function sdfTextVertexLayouts(): GPUVertexBufferLayout[];
|
|
61
|
+
/**
|
|
62
|
+
* Built from `SDFTEXT_BINDINGS`, not hand-numbered — the generator emits bindings per shader
|
|
63
|
+
* precisely so this always binds the numbers the shader actually declared.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createSdfTextBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
66
|
+
/**
|
|
67
|
+
* Bound once per atlas against both rings; a dynamic offset per string. See
|
|
68
|
+
* `createTextBindGroup` and, for why one bind group serves every draw against the same atlas,
|
|
69
|
+
* `webgpu/renderer.ts`'s `albedoBindGroups`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function createSdfTextBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, vertices: GPUBuffer, fragments: GPUBuffer, atlasView: GPUTextureView, atlasSampler: GPUSampler): GPUBindGroup;
|
|
72
|
+
/**
|
|
73
|
+
* The pipeline.
|
|
74
|
+
*
|
|
75
|
+
* **Alpha over, depth tested, depth not written — matching `filmPipeline`, not `textPipeline`.**
|
|
76
|
+
* `sdfTextRenderer.ts`'s own comment gives the reason: an SDF glyph's antialiased edge is
|
|
77
|
+
* coverage, not a solid surface, and writing depth from it punches a hole in whatever sits
|
|
78
|
+
* behind that edge. Depth *testing* is left at the pass's own ambient state rather than
|
|
79
|
+
* reasserted, the same assumption `drawTranslucentMesh` makes for the same reason — this draws
|
|
80
|
+
* inside the mesh pass, not a pass of its own.
|
|
81
|
+
*
|
|
82
|
+
* **Back faces culled**, matching the ambient state `bindMeshPass` sets for the whole mesh
|
|
83
|
+
* pass on the other backend (`gl.enable(CULL_FACE); gl.cullFace(BACK)`) and the convention
|
|
84
|
+
* `filmPipeline` already uses for ordinary world geometry drawn the same way.
|
|
85
|
+
*/
|
|
86
|
+
export declare function sdfTextPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { DEPTH_COMPARE } from '../../depthConvention.js';
|
|
2
|
+
import { SDFTEXT_BINDINGS, SDF_TEXT_FRAG_WGSL, SDF_TEXT_VERT_WGSL, } from '../../shaders/generated/sdfText.wgsl.js';
|
|
3
|
+
import { DEPTH_FORMAT } from './flatPass.js';
|
|
4
|
+
import { SdfTextLayout } from '../../sdfTextLayout.js';
|
|
5
|
+
import { shaderModule } from './shaderModules.js';
|
|
6
|
+
/**
|
|
7
|
+
* The SDF text pass: a string as flat, textured quads, drawn into the scene.
|
|
8
|
+
*
|
|
9
|
+
* Same job as `textPass.ts` for the engine's pixel font, and `sdfTextRenderer.ts`'s own class
|
|
10
|
+
* comment gives the reason this shape differs from that one: a distance field is sampled by
|
|
11
|
+
* the fragment shader, so a quad per glyph is the whole glyph — one indexed draw per string,
|
|
12
|
+
* no per-instance stepping. The layout is `sdfTextLayout.ts`'s and is shared with WebGL2; this
|
|
13
|
+
* owns only the buffers, the bind group and the pipeline.
|
|
14
|
+
*
|
|
15
|
+
* **World geometry, not a screen overlay — unlike `GpuText`.** It draws against the frame's
|
|
16
|
+
* own view-projection inside whatever pass is already open, the same one `drawMesh` uses, so
|
|
17
|
+
* it needs neither a pass of its own nor `openTextPass`'s depth clear. See `drawSdfText` in
|
|
18
|
+
* `webgpu/renderer.ts` for what that means for where this is called from.
|
|
19
|
+
*/
|
|
20
|
+
export const SDF_TEXT_VERT_FIELDS = SDFTEXT_BINDINGS.SDF_TEXT_VERT.fields;
|
|
21
|
+
export const SDF_TEXT_VERT_SIZE = SDFTEXT_BINDINGS.SDF_TEXT_VERT.uniformSize;
|
|
22
|
+
export const SDF_TEXT_FRAG_FIELDS = SDFTEXT_BINDINGS.SDF_TEXT_FRAG.fields;
|
|
23
|
+
export const SDF_TEXT_FRAG_SIZE = SDFTEXT_BINDINGS.SDF_TEXT_FRAG.uniformSize;
|
|
24
|
+
const VERT_BINDING = SDFTEXT_BINDINGS.SDF_TEXT_VERT.uniforms;
|
|
25
|
+
const FRAG_BINDING = SDFTEXT_BINDINGS.SDF_TEXT_FRAG.uniforms;
|
|
26
|
+
const ATLAS = SDFTEXT_BINDINGS.SDF_TEXT_FRAG.textures.uAtlas;
|
|
27
|
+
const VISIBILITY_VERTEX = 0x1;
|
|
28
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
29
|
+
const USAGE_VERTEX = 0x0020 | 0x0008; // VERTEX | COPY_DST
|
|
30
|
+
const USAGE_INDEX = 0x0010 | 0x0008; // INDEX | COPY_DST
|
|
31
|
+
/**
|
|
32
|
+
* One SDF text object on the device: the layout, and the three buffers it fills.
|
|
33
|
+
*
|
|
34
|
+
* **A plain indexed quad list, not `GpuText`'s instanced cube** — see this file's own doc
|
|
35
|
+
* comment. `positions`/`uvs` are re-uploaded only when `layout.set` says something moved,
|
|
36
|
+
* matching `SdfTextRenderer.upload`'s skip on the other backend; `indices` never changes after
|
|
37
|
+
* construction, matching `SdfTextLayout`'s own fixed `0,1,2,0,2,3` pattern.
|
|
38
|
+
*/
|
|
39
|
+
export class GpuSdfText {
|
|
40
|
+
device;
|
|
41
|
+
layout = new SdfTextLayout();
|
|
42
|
+
positions;
|
|
43
|
+
uvs;
|
|
44
|
+
indices;
|
|
45
|
+
/** Set by `setText`; `drawSdfText` reads neither this class nor the atlas from anywhere else. */
|
|
46
|
+
font = null;
|
|
47
|
+
atlas = null;
|
|
48
|
+
constructor(device) {
|
|
49
|
+
this.device = device;
|
|
50
|
+
this.positions = device.createBuffer({
|
|
51
|
+
label: 'sdfText.positions',
|
|
52
|
+
size: this.layout.positions.byteLength,
|
|
53
|
+
usage: USAGE_VERTEX,
|
|
54
|
+
});
|
|
55
|
+
this.uvs = device.createBuffer({
|
|
56
|
+
label: 'sdfText.uvs',
|
|
57
|
+
size: this.layout.uvs.byteLength,
|
|
58
|
+
usage: USAGE_VERTEX,
|
|
59
|
+
});
|
|
60
|
+
this.indices = device.createBuffer({
|
|
61
|
+
label: 'sdfText.indices',
|
|
62
|
+
size: this.layout.indices.byteLength,
|
|
63
|
+
usage: USAGE_INDEX,
|
|
64
|
+
});
|
|
65
|
+
device.queue.writeBuffer(this.indices, 0, this.layout.indices);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Lay a string out against a font, and retain the atlas `drawSdfText` will sample.
|
|
69
|
+
*
|
|
70
|
+
* The engine fetches nothing: `font` was parsed from a metrics document the caller already
|
|
71
|
+
* had, and `atlas` is a `GpuSurfaceTexture` the caller already uploaded. A no-op, and no
|
|
72
|
+
* re-upload, when neither the text nor the style moved — see `SdfTextLayout.set`.
|
|
73
|
+
*/
|
|
74
|
+
setText(font, atlas, text, style) {
|
|
75
|
+
this.font = font;
|
|
76
|
+
this.atlas = atlas;
|
|
77
|
+
if (this.layout.set(font, text, style))
|
|
78
|
+
this.upload();
|
|
79
|
+
}
|
|
80
|
+
dispose() {
|
|
81
|
+
this.positions.destroy();
|
|
82
|
+
this.uvs.destroy();
|
|
83
|
+
this.indices.destroy();
|
|
84
|
+
}
|
|
85
|
+
/** Both vertex buffers, from the arrays `layout.set` filled in place — the live prefix only. */
|
|
86
|
+
upload() {
|
|
87
|
+
const vertexCount = this.layout.quadCount * 4;
|
|
88
|
+
this.device.queue.writeBuffer(this.positions, 0, this.layout.positions, 0, vertexCount * 3);
|
|
89
|
+
this.device.queue.writeBuffer(this.uvs, 0, this.layout.uvs, 0, vertexCount * 2);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* `aPosition` at location 0, `aUv` at location 1 — pinned in `sdfText.ts` and read verbatim
|
|
94
|
+
* here rather than guessed, for the reason `sdfTextRenderer.ts`'s class comment gives. Neither
|
|
95
|
+
* is instanced: every vertex is its own quad corner, unlike `textVertexLayouts`'s per-instance
|
|
96
|
+
* cell and character.
|
|
97
|
+
*/
|
|
98
|
+
export function sdfTextVertexLayouts() {
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
arrayStride: 12,
|
|
102
|
+
attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
arrayStride: 8,
|
|
106
|
+
attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x2' }],
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Built from `SDFTEXT_BINDINGS`, not hand-numbered — the generator emits bindings per shader
|
|
112
|
+
* precisely so this always binds the numbers the shader actually declared.
|
|
113
|
+
*/
|
|
114
|
+
export function createSdfTextBindGroupLayout(device) {
|
|
115
|
+
return device.createBindGroupLayout({
|
|
116
|
+
label: 'sdfText.layout',
|
|
117
|
+
entries: [
|
|
118
|
+
{
|
|
119
|
+
binding: VERT_BINDING,
|
|
120
|
+
visibility: VISIBILITY_VERTEX,
|
|
121
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: SDF_TEXT_VERT_SIZE },
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
binding: FRAG_BINDING,
|
|
125
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
126
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: SDF_TEXT_FRAG_SIZE },
|
|
127
|
+
},
|
|
128
|
+
{ binding: ATLAS.texture, visibility: VISIBILITY_FRAGMENT, texture: {} },
|
|
129
|
+
{ binding: ATLAS.sampler, visibility: VISIBILITY_FRAGMENT, sampler: {} },
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Bound once per atlas against both rings; a dynamic offset per string. See
|
|
135
|
+
* `createTextBindGroup` and, for why one bind group serves every draw against the same atlas,
|
|
136
|
+
* `webgpu/renderer.ts`'s `albedoBindGroups`.
|
|
137
|
+
*/
|
|
138
|
+
export function createSdfTextBindGroup(device, layout, vertices, fragments, atlasView, atlasSampler) {
|
|
139
|
+
return device.createBindGroup({
|
|
140
|
+
label: 'sdfText.bindGroup',
|
|
141
|
+
layout,
|
|
142
|
+
entries: [
|
|
143
|
+
{ binding: VERT_BINDING, resource: { buffer: vertices, size: SDF_TEXT_VERT_SIZE } },
|
|
144
|
+
{ binding: FRAG_BINDING, resource: { buffer: fragments, size: SDF_TEXT_FRAG_SIZE } },
|
|
145
|
+
{ binding: ATLAS.texture, resource: atlasView },
|
|
146
|
+
{ binding: ATLAS.sampler, resource: atlasSampler },
|
|
147
|
+
],
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The pipeline.
|
|
152
|
+
*
|
|
153
|
+
* **Alpha over, depth tested, depth not written — matching `filmPipeline`, not `textPipeline`.**
|
|
154
|
+
* `sdfTextRenderer.ts`'s own comment gives the reason: an SDF glyph's antialiased edge is
|
|
155
|
+
* coverage, not a solid surface, and writing depth from it punches a hole in whatever sits
|
|
156
|
+
* behind that edge. Depth *testing* is left at the pass's own ambient state rather than
|
|
157
|
+
* reasserted, the same assumption `drawTranslucentMesh` makes for the same reason — this draws
|
|
158
|
+
* inside the mesh pass, not a pass of its own.
|
|
159
|
+
*
|
|
160
|
+
* **Back faces culled**, matching the ambient state `bindMeshPass` sets for the whole mesh
|
|
161
|
+
* pass on the other backend (`gl.enable(CULL_FACE); gl.cullFace(BACK)`) and the convention
|
|
162
|
+
* `filmPipeline` already uses for ordinary world geometry drawn the same way.
|
|
163
|
+
*/
|
|
164
|
+
export function sdfTextPipeline(cache, device, layout) {
|
|
165
|
+
return cache.get('sdfText', () => ({
|
|
166
|
+
label: 'sdfText',
|
|
167
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
168
|
+
vertex: {
|
|
169
|
+
module: shaderModule(device, { label: 'sdfText.vert', code: SDF_TEXT_VERT_WGSL }),
|
|
170
|
+
entryPoint: 'main',
|
|
171
|
+
buffers: sdfTextVertexLayouts(),
|
|
172
|
+
},
|
|
173
|
+
fragment: {
|
|
174
|
+
module: shaderModule(device, { label: 'sdfText.frag', code: SDF_TEXT_FRAG_WGSL }),
|
|
175
|
+
entryPoint: 'main',
|
|
176
|
+
targets: [
|
|
177
|
+
{
|
|
178
|
+
format: cache.format,
|
|
179
|
+
blend: {
|
|
180
|
+
color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
181
|
+
alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
primitive: { topology: 'triangle-list', cullMode: 'back' },
|
|
187
|
+
multisample: { count: cache.sampleCount },
|
|
188
|
+
depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: false, depthCompare: DEPTH_COMPARE },
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The module for this source, compiling it on the first ask only.
|
|
3
|
+
*
|
|
4
|
+
* A drop-in for `device.createShaderModule(descriptor)`, and deliberately the same shape so a
|
|
5
|
+
* call site reads the same after the change as before it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function shaderModule(device: GPUDevice, descriptor: GPUShaderModuleDescriptor): GPUShaderModule;
|
|
8
|
+
/** How many distinct sources this device has compiled. Read by tests and diagnostics. */
|
|
9
|
+
export declare function shaderModuleCount(device: GPUDevice): number;
|