@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,133 @@
|
|
|
1
|
+
import type { BudgetCounter } from '../budget.ts';
|
|
2
|
+
/**
|
|
3
|
+
* WebGPU's default minimum alignment for a dynamic uniform offset.
|
|
4
|
+
*
|
|
5
|
+
* Exported because the bloom chain lays out its stages by hand rather than through this class —
|
|
6
|
+
* its blocks never change between frames, so it has nothing to reset and nothing to flush — and
|
|
7
|
+
* an alignment restated somewhere else is an alignment that can disagree.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DYNAMIC_ALIGNMENT = 256;
|
|
10
|
+
/**
|
|
11
|
+
* Per-draw uniforms, in slots, written once and bound by offset.
|
|
12
|
+
*
|
|
13
|
+
* **This exists because `queue.writeBuffer` does not interleave with draw commands.** Writes
|
|
14
|
+
* are ordered on the queue timeline and the encoder's commands are submitted afterwards, so
|
|
15
|
+
* writing one model matrix into one buffer between two `draw` calls gives *both* draws the
|
|
16
|
+
* last matrix written. The picture is every object stacked at the position of whichever was
|
|
17
|
+
* drawn last, which looks like a transform bug and is not one.
|
|
18
|
+
*
|
|
19
|
+
* So each draw takes its own slot, all the slots are uploaded in a single write at the end
|
|
20
|
+
* of the frame, and the draw binds its slot with a dynamic offset. One upload per frame
|
|
21
|
+
* rather than one per draw, and no allocation in the frame loop: the staging array is
|
|
22
|
+
* allocated once and reused, which is what `AGENTS.md` requires of a per-frame path.
|
|
23
|
+
*/
|
|
24
|
+
export declare class UniformRing {
|
|
25
|
+
private readonly budget;
|
|
26
|
+
/**
|
|
27
|
+
* The device buffer every bind group over this ring holds.
|
|
28
|
+
*
|
|
29
|
+
* **Not `readonly`, because `growTo` replaces it**, and a bind group built against the old one
|
|
30
|
+
* is invalid the moment it does. That is the whole reason `growTo` reports whether it happened.
|
|
31
|
+
*/
|
|
32
|
+
buffer: GPUBuffer;
|
|
33
|
+
/** Bytes per slot, rounded up to the alignment a dynamic offset requires. */
|
|
34
|
+
readonly slotSize: number;
|
|
35
|
+
private readonly device;
|
|
36
|
+
private readonly usage;
|
|
37
|
+
private readonly label;
|
|
38
|
+
private staging;
|
|
39
|
+
private floats;
|
|
40
|
+
private ints;
|
|
41
|
+
private capacity;
|
|
42
|
+
private used;
|
|
43
|
+
/**
|
|
44
|
+
* `label` names the buffer on the device, and it is not decoration.
|
|
45
|
+
*
|
|
46
|
+
* A validation failure arrives at `queue.submit` naming the resource it was about, and the
|
|
47
|
+
* only reason that message is readable is that somebody labelled the resource — the shadow
|
|
48
|
+
* peel's root cause read *"of [Texture "shadow.static"]"*. A dozen rings all called
|
|
49
|
+
* `uniforms.ring` would name none of themselves. See `device.ts`.
|
|
50
|
+
*
|
|
51
|
+
* `budget` is the line this ring's ceiling is reported on, and most rings have none.
|
|
52
|
+
* **Only one ring of a pair carries it**: several subsystems take a vertex slot and a fragment
|
|
53
|
+
* slot together, from two rings of equal capacity, and refuse the work if either is null — so a
|
|
54
|
+
* line on both would count every water body twice and report a ceiling of sixteen exceeded at
|
|
55
|
+
* eight. The vertex ring carries it by convention and the fragment ring beside it carries none.
|
|
56
|
+
*/
|
|
57
|
+
constructor(device: GPUDevice, bytesPerSlot: number, slots: number, usage: number, label?: string, budget?: BudgetCounter | null);
|
|
58
|
+
/** How many slots this ring holds. What a frame may take before `allocate` starts refusing. */
|
|
59
|
+
get slots(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Make room for at least `slots`, and say whether the buffer was replaced.
|
|
62
|
+
*
|
|
63
|
+
* **Called at the start of a frame and nowhere else**, which is what keeps `allocate`'s refusal
|
|
64
|
+
* to grow intact: there is no encoder open, everything from the last frame has been submitted,
|
|
65
|
+
* and nothing has been written into the staging that discarding it would lose. Growing where
|
|
66
|
+
* `allocate` runs out would stall the frame to make room, which is the thing this class exists
|
|
67
|
+
* to avoid and still does.
|
|
68
|
+
*
|
|
69
|
+
* **A `true` means every bind group holding `buffer` is now invalid.** The old buffer is
|
|
70
|
+
* destroyed rather than dropped: commands already submitted against it keep it alive until they
|
|
71
|
+
* retire, which is the implementation's job, and nothing recorded for *this* frame exists yet.
|
|
72
|
+
*
|
|
73
|
+
* Refuses past `MAX_RING_BYTES` and says `false`, leaving the ring it has — a frame asking for
|
|
74
|
+
* more than that goes back to skipping the work and reporting it.
|
|
75
|
+
*/
|
|
76
|
+
growTo(slots: number): boolean;
|
|
77
|
+
/** How many slots have been taken this frame. */
|
|
78
|
+
get count(): number;
|
|
79
|
+
/** Start a frame. Slots are reused; nothing is freed. */
|
|
80
|
+
reset(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Take the next slot and return its byte offset, or null when the ring is full.
|
|
83
|
+
*
|
|
84
|
+
* **Null rather than growing.** Growing means allocating a buffer mid-frame, which is the
|
|
85
|
+
* thing this class exists to avoid; a caller that runs out should skip the draw and say so
|
|
86
|
+
* once, not stall the frame to make room.
|
|
87
|
+
*
|
|
88
|
+
* **And say so in a number as well as in a line of text.** Every caller already wrote one
|
|
89
|
+
* `console.warn` per renderer lifetime and nothing else, which is unobservable from a headless
|
|
90
|
+
* check and gone by the time anybody looks — a consumer lost weeks to a ceiling whose
|
|
91
|
+
* open lead was still *"ask the reporter for the console"*. The count is taken here rather than
|
|
92
|
+
* at the callers because here is the only place that knows both halves: what was asked for, and
|
|
93
|
+
* whether it fit.
|
|
94
|
+
*
|
|
95
|
+
* **What comes back is a byte offset, not an index**, and it is what `setBindGroup` wants.
|
|
96
|
+
*
|
|
97
|
+
* Said plainly because the name says "slot" and the value is already scaled: a caller that
|
|
98
|
+
* multiplies it by `slotSize` on the way to a dynamic offset lands a whole ring away. That
|
|
99
|
+
* happened — the second panel of a frame addressed 65,536 into a 16,384-byte ring — and the
|
|
100
|
+
* only reason it took a minute rather than an afternoon is that `device.ts` now prints what
|
|
101
|
+
* the device rejected, naming the buffer and both numbers.
|
|
102
|
+
*/
|
|
103
|
+
allocate(): number | null;
|
|
104
|
+
/** Write floats into a slot, at a byte offset within it. */
|
|
105
|
+
writeFloats(slot: number, byteOffset: number, values: ArrayLike<number>): void;
|
|
106
|
+
/**
|
|
107
|
+
* Write one float into a slot.
|
|
108
|
+
*
|
|
109
|
+
* Separate from `writeFloats` because the alternative at a call site with a dozen scalars in
|
|
110
|
+
* it is a one-element array per field — either allocated in the frame loop, which
|
|
111
|
+
* `AGENTS.md` forbids, or a shared scratch that reads as a value being passed when it is a
|
|
112
|
+
* buffer being reused.
|
|
113
|
+
*/
|
|
114
|
+
writeFloat(slot: number, byteOffset: number, value: number): void;
|
|
115
|
+
/** Write one integer into a slot. Separate because a `Float32Array` cannot hold an `i32`. */
|
|
116
|
+
writeInt(slot: number, byteOffset: number, value: number): void;
|
|
117
|
+
/**
|
|
118
|
+
* Copy a whole prepared block into a slot, bit for bit.
|
|
119
|
+
*
|
|
120
|
+
* **Through the integer view, and that is not a detail.** A block that mixes floats and
|
|
121
|
+
* `i32`s copied through `Float32Array` is a numeric conversion, and `-1` as an `i32` is
|
|
122
|
+
* `0xFFFFFFFF`, which read as a float is a NaN — free to be canonicalised to a different NaN
|
|
123
|
+
* on the way through. `-1` is the *sentinel* for "this light has no shadow cubemap", so that
|
|
124
|
+
* conversion would turn "no point shadows" into a number matching nothing or, worse,
|
|
125
|
+
* something. Bug 9 on this branch was that sentinel being wrong in the other direction.
|
|
126
|
+
*
|
|
127
|
+
* `Int32Array.set` from an `Int32Array` is an exact copy of every bit, whatever the bits mean.
|
|
128
|
+
*/
|
|
129
|
+
writeBlock(slot: number, block: Int32Array): void;
|
|
130
|
+
/** Upload every slot taken this frame, in one write. */
|
|
131
|
+
flush(): void;
|
|
132
|
+
dispose(): void;
|
|
133
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGPU's default minimum alignment for a dynamic uniform offset.
|
|
3
|
+
*
|
|
4
|
+
* Exported because the bloom chain lays out its stages by hand rather than through this class —
|
|
5
|
+
* its blocks never change between frames, so it has nothing to reset and nothing to flush — and
|
|
6
|
+
* an alignment restated somewhere else is an alignment that can disagree.
|
|
7
|
+
*/
|
|
8
|
+
export const DYNAMIC_ALIGNMENT = 256;
|
|
9
|
+
/**
|
|
10
|
+
* The most staging one ring may hold, and therefore the most device memory it may take.
|
|
11
|
+
*
|
|
12
|
+
* **A ceiling on the growth, because a runaway consumer should degrade rather than crash.** Past
|
|
13
|
+
* this the ring refuses to grow and goes on skipping work and reporting it, which is the right end
|
|
14
|
+
* state for a frame asking for something no device should be asked for. What growth changes is
|
|
15
|
+
* where that line sits: at a number chosen against a phone's memory rather than at whatever the
|
|
16
|
+
* ring happened to be constructed with.
|
|
17
|
+
*
|
|
18
|
+
* Sixty-four mebibytes is far past any legitimate scene — the flat vertex ring's slot is 1,540
|
|
19
|
+
* bytes, so this is forty-three thousand draws, and the fragment ring's is at most 13,312, which
|
|
20
|
+
* is five thousand material changes in one frame. The device buffer matches the staging, so a ring
|
|
21
|
+
* at this ceiling holds 128 MiB in total and only ever reaches it by being asked to.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_RING_BYTES = 64 * 1024 * 1024;
|
|
24
|
+
/**
|
|
25
|
+
* Per-draw uniforms, in slots, written once and bound by offset.
|
|
26
|
+
*
|
|
27
|
+
* **This exists because `queue.writeBuffer` does not interleave with draw commands.** Writes
|
|
28
|
+
* are ordered on the queue timeline and the encoder's commands are submitted afterwards, so
|
|
29
|
+
* writing one model matrix into one buffer between two `draw` calls gives *both* draws the
|
|
30
|
+
* last matrix written. The picture is every object stacked at the position of whichever was
|
|
31
|
+
* drawn last, which looks like a transform bug and is not one.
|
|
32
|
+
*
|
|
33
|
+
* So each draw takes its own slot, all the slots are uploaded in a single write at the end
|
|
34
|
+
* of the frame, and the draw binds its slot with a dynamic offset. One upload per frame
|
|
35
|
+
* rather than one per draw, and no allocation in the frame loop: the staging array is
|
|
36
|
+
* allocated once and reused, which is what `AGENTS.md` requires of a per-frame path.
|
|
37
|
+
*/
|
|
38
|
+
export class UniformRing {
|
|
39
|
+
budget;
|
|
40
|
+
/**
|
|
41
|
+
* The device buffer every bind group over this ring holds.
|
|
42
|
+
*
|
|
43
|
+
* **Not `readonly`, because `growTo` replaces it**, and a bind group built against the old one
|
|
44
|
+
* is invalid the moment it does. That is the whole reason `growTo` reports whether it happened.
|
|
45
|
+
*/
|
|
46
|
+
buffer;
|
|
47
|
+
/** Bytes per slot, rounded up to the alignment a dynamic offset requires. */
|
|
48
|
+
slotSize;
|
|
49
|
+
device;
|
|
50
|
+
usage;
|
|
51
|
+
label;
|
|
52
|
+
staging;
|
|
53
|
+
floats;
|
|
54
|
+
ints;
|
|
55
|
+
capacity;
|
|
56
|
+
used = 0;
|
|
57
|
+
/**
|
|
58
|
+
* `label` names the buffer on the device, and it is not decoration.
|
|
59
|
+
*
|
|
60
|
+
* A validation failure arrives at `queue.submit` naming the resource it was about, and the
|
|
61
|
+
* only reason that message is readable is that somebody labelled the resource — the shadow
|
|
62
|
+
* peel's root cause read *"of [Texture "shadow.static"]"*. A dozen rings all called
|
|
63
|
+
* `uniforms.ring` would name none of themselves. See `device.ts`.
|
|
64
|
+
*
|
|
65
|
+
* `budget` is the line this ring's ceiling is reported on, and most rings have none.
|
|
66
|
+
* **Only one ring of a pair carries it**: several subsystems take a vertex slot and a fragment
|
|
67
|
+
* slot together, from two rings of equal capacity, and refuse the work if either is null — so a
|
|
68
|
+
* line on both would count every water body twice and report a ceiling of sixteen exceeded at
|
|
69
|
+
* eight. The vertex ring carries it by convention and the fragment ring beside it carries none.
|
|
70
|
+
*/
|
|
71
|
+
constructor(device, bytesPerSlot, slots, usage, label = 'uniforms.ring', budget = null) {
|
|
72
|
+
this.budget = budget;
|
|
73
|
+
this.device = device;
|
|
74
|
+
this.usage = usage;
|
|
75
|
+
this.label = label;
|
|
76
|
+
this.slotSize = Math.ceil(bytesPerSlot / DYNAMIC_ALIGNMENT) * DYNAMIC_ALIGNMENT;
|
|
77
|
+
this.capacity = slots;
|
|
78
|
+
this.staging = new ArrayBuffer(this.slotSize * slots);
|
|
79
|
+
this.floats = new Float32Array(this.staging);
|
|
80
|
+
this.ints = new Int32Array(this.staging);
|
|
81
|
+
this.buffer = device.createBuffer({
|
|
82
|
+
label,
|
|
83
|
+
size: this.staging.byteLength,
|
|
84
|
+
usage,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** How many slots this ring holds. What a frame may take before `allocate` starts refusing. */
|
|
88
|
+
get slots() {
|
|
89
|
+
return this.capacity;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Make room for at least `slots`, and say whether the buffer was replaced.
|
|
93
|
+
*
|
|
94
|
+
* **Called at the start of a frame and nowhere else**, which is what keeps `allocate`'s refusal
|
|
95
|
+
* to grow intact: there is no encoder open, everything from the last frame has been submitted,
|
|
96
|
+
* and nothing has been written into the staging that discarding it would lose. Growing where
|
|
97
|
+
* `allocate` runs out would stall the frame to make room, which is the thing this class exists
|
|
98
|
+
* to avoid and still does.
|
|
99
|
+
*
|
|
100
|
+
* **A `true` means every bind group holding `buffer` is now invalid.** The old buffer is
|
|
101
|
+
* destroyed rather than dropped: commands already submitted against it keep it alive until they
|
|
102
|
+
* retire, which is the implementation's job, and nothing recorded for *this* frame exists yet.
|
|
103
|
+
*
|
|
104
|
+
* Refuses past `MAX_RING_BYTES` and says `false`, leaving the ring it has — a frame asking for
|
|
105
|
+
* more than that goes back to skipping the work and reporting it.
|
|
106
|
+
*/
|
|
107
|
+
growTo(slots) {
|
|
108
|
+
if (slots <= this.capacity)
|
|
109
|
+
return false;
|
|
110
|
+
const bytes = this.slotSize * slots;
|
|
111
|
+
if (bytes > MAX_RING_BYTES)
|
|
112
|
+
return false;
|
|
113
|
+
this.buffer.destroy();
|
|
114
|
+
this.capacity = slots;
|
|
115
|
+
this.staging = new ArrayBuffer(bytes);
|
|
116
|
+
this.floats = new Float32Array(this.staging);
|
|
117
|
+
this.ints = new Int32Array(this.staging);
|
|
118
|
+
this.buffer = this.device.createBuffer({
|
|
119
|
+
label: this.label,
|
|
120
|
+
size: bytes,
|
|
121
|
+
usage: this.usage,
|
|
122
|
+
});
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
/** How many slots have been taken this frame. */
|
|
126
|
+
get count() {
|
|
127
|
+
return this.used;
|
|
128
|
+
}
|
|
129
|
+
/** Start a frame. Slots are reused; nothing is freed. */
|
|
130
|
+
reset() {
|
|
131
|
+
this.used = 0;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Take the next slot and return its byte offset, or null when the ring is full.
|
|
135
|
+
*
|
|
136
|
+
* **Null rather than growing.** Growing means allocating a buffer mid-frame, which is the
|
|
137
|
+
* thing this class exists to avoid; a caller that runs out should skip the draw and say so
|
|
138
|
+
* once, not stall the frame to make room.
|
|
139
|
+
*
|
|
140
|
+
* **And say so in a number as well as in a line of text.** Every caller already wrote one
|
|
141
|
+
* `console.warn` per renderer lifetime and nothing else, which is unobservable from a headless
|
|
142
|
+
* check and gone by the time anybody looks — a consumer lost weeks to a ceiling whose
|
|
143
|
+
* open lead was still *"ask the reporter for the console"*. The count is taken here rather than
|
|
144
|
+
* at the callers because here is the only place that knows both halves: what was asked for, and
|
|
145
|
+
* whether it fit.
|
|
146
|
+
*
|
|
147
|
+
* **What comes back is a byte offset, not an index**, and it is what `setBindGroup` wants.
|
|
148
|
+
*
|
|
149
|
+
* Said plainly because the name says "slot" and the value is already scaled: a caller that
|
|
150
|
+
* multiplies it by `slotSize` on the way to a dynamic offset lands a whole ring away. That
|
|
151
|
+
* happened — the second panel of a frame addressed 65,536 into a 16,384-byte ring — and the
|
|
152
|
+
* only reason it took a minute rather than an afternoon is that `device.ts` now prints what
|
|
153
|
+
* the device rejected, naming the buffer and both numbers.
|
|
154
|
+
*/
|
|
155
|
+
allocate() {
|
|
156
|
+
this.budget?.ask();
|
|
157
|
+
if (this.used >= this.capacity) {
|
|
158
|
+
this.budget?.drop();
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const offset = this.used * this.slotSize;
|
|
162
|
+
this.used += 1;
|
|
163
|
+
return offset;
|
|
164
|
+
}
|
|
165
|
+
/** Write floats into a slot, at a byte offset within it. */
|
|
166
|
+
writeFloats(slot, byteOffset, values) {
|
|
167
|
+
this.floats.set(values, (slot + byteOffset) / 4);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Write one float into a slot.
|
|
171
|
+
*
|
|
172
|
+
* Separate from `writeFloats` because the alternative at a call site with a dozen scalars in
|
|
173
|
+
* it is a one-element array per field — either allocated in the frame loop, which
|
|
174
|
+
* `AGENTS.md` forbids, or a shared scratch that reads as a value being passed when it is a
|
|
175
|
+
* buffer being reused.
|
|
176
|
+
*/
|
|
177
|
+
writeFloat(slot, byteOffset, value) {
|
|
178
|
+
this.floats[(slot + byteOffset) / 4] = value;
|
|
179
|
+
}
|
|
180
|
+
/** Write one integer into a slot. Separate because a `Float32Array` cannot hold an `i32`. */
|
|
181
|
+
writeInt(slot, byteOffset, value) {
|
|
182
|
+
this.ints[(slot + byteOffset) / 4] = value;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Copy a whole prepared block into a slot, bit for bit.
|
|
186
|
+
*
|
|
187
|
+
* **Through the integer view, and that is not a detail.** A block that mixes floats and
|
|
188
|
+
* `i32`s copied through `Float32Array` is a numeric conversion, and `-1` as an `i32` is
|
|
189
|
+
* `0xFFFFFFFF`, which read as a float is a NaN — free to be canonicalised to a different NaN
|
|
190
|
+
* on the way through. `-1` is the *sentinel* for "this light has no shadow cubemap", so that
|
|
191
|
+
* conversion would turn "no point shadows" into a number matching nothing or, worse,
|
|
192
|
+
* something. Bug 9 on this branch was that sentinel being wrong in the other direction.
|
|
193
|
+
*
|
|
194
|
+
* `Int32Array.set` from an `Int32Array` is an exact copy of every bit, whatever the bits mean.
|
|
195
|
+
*/
|
|
196
|
+
writeBlock(slot, block) {
|
|
197
|
+
this.ints.set(block, slot / 4);
|
|
198
|
+
}
|
|
199
|
+
/** Upload every slot taken this frame, in one write. */
|
|
200
|
+
flush() {
|
|
201
|
+
if (this.used === 0)
|
|
202
|
+
return;
|
|
203
|
+
this.device.queue.writeBuffer(this.buffer, 0, this.staging, 0, this.used * this.slotSize);
|
|
204
|
+
}
|
|
205
|
+
dispose() {
|
|
206
|
+
this.buffer.destroy();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
2
|
+
import type { UniformFields } from './scatterPass.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The water pass: two sheets and a patch, displaced by a wave field in the vertex stage.
|
|
5
|
+
*
|
|
6
|
+
* **One vertex attribute for the whole surface.** `aGrid` is a `vec2` of grid coordinates and
|
|
7
|
+
* everything else — height, normal, crest, the reflection's clip position — is computed from
|
|
8
|
+
* it. So the geometry here is a buffer of pairs and an index list, and the interesting part is
|
|
9
|
+
* entirely in the shader and the uniforms.
|
|
10
|
+
*/
|
|
11
|
+
export declare const WATER_VERT_FIELDS: UniformFields;
|
|
12
|
+
export declare const WATER_VERT_SIZE: 208;
|
|
13
|
+
export declare const WATER_FRAG_FIELDS: UniformFields;
|
|
14
|
+
export declare const WATER_FRAG_SIZE: 1248;
|
|
15
|
+
/** The two meshes and the numbers the grid decided, behind the surface's opaque handle. */
|
|
16
|
+
export interface GpuWater {
|
|
17
|
+
/** The ocean: near sheet and far skirt in one buffer. */
|
|
18
|
+
readonly sheet: {
|
|
19
|
+
buffer: GPUBuffer;
|
|
20
|
+
index: GPUBuffer;
|
|
21
|
+
count: number;
|
|
22
|
+
};
|
|
23
|
+
/** A unit square, scaled per draw: every bounded body shares this one mesh. */
|
|
24
|
+
readonly patch: {
|
|
25
|
+
buffer: GPUBuffer;
|
|
26
|
+
index: GPUBuffer;
|
|
27
|
+
count: number;
|
|
28
|
+
};
|
|
29
|
+
readonly cellSize: number;
|
|
30
|
+
readonly nearHalfExtent: number;
|
|
31
|
+
readonly farHalfExtent: number;
|
|
32
|
+
readonly reflectionFilterTaps: number;
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
35
|
+
export declare function createGpuWater(device: GPUDevice, resolution: number, nearExtent: number, farHalfExtent: number, reflectionFilterTaps: number): GpuWater;
|
|
36
|
+
export declare function waterVertexLayouts(): GPUVertexBufferLayout[];
|
|
37
|
+
/**
|
|
38
|
+
* The water bind group's layout, whose two buffers are addressed by a dynamic offset.
|
|
39
|
+
*
|
|
40
|
+
* **A frame draws more than one body of water and this is what makes that true here.** A ditch at
|
|
41
|
+
* its own level, a fountain in a courtyard and the sea beyond them are three draws, and with one
|
|
42
|
+
* buffer rewritten between them all three read whatever was written last: `queue.write*` calls are
|
|
43
|
+
* ordered on the queue timeline and the encoder is submitted after every one of them, so the
|
|
44
|
+
* picture is every body wearing the last one's extents, level and colour. That is the hazard
|
|
45
|
+
* `UniformRing` exists for, recorded in `AGENTS.md` on 2026-08-27, and water was the pass still
|
|
46
|
+
* carrying it — invisible for as long as no scene drew two, which is exactly how the joint palette
|
|
47
|
+
* survived eight releases.
|
|
48
|
+
*
|
|
49
|
+
* WebGL2 needs none of this: it sets uniforms and draws in one stream. Per the 2026-08-13 rule
|
|
50
|
+
* that makes it a binder's problem here and not a decision anybody has to take twice.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createWaterBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
53
|
+
/**
|
|
54
|
+
* The bind group over both rings and the mirror.
|
|
55
|
+
*
|
|
56
|
+
* **One mirror serves every body, and that is correct rather than a limit worked around.** The
|
|
57
|
+
* frame renders at most one planar reflection, at one plane height; `reflectionFor` hands it to the
|
|
58
|
+
* body whose level matches and hands nothing to the rest, which then draw with
|
|
59
|
+
* `uReflectionEnabled` at zero and never sample the view this group still holds.
|
|
60
|
+
*/
|
|
61
|
+
export declare function createWaterBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, perDraw: GPUBuffer, perFrame: GPUBuffer, reflection: GPUTextureView, sampler: GPUSampler): GPUBindGroup;
|
|
62
|
+
/**
|
|
63
|
+
* The water pipeline.
|
|
64
|
+
*
|
|
65
|
+
* **Blended, and culling off.** `renderer.ts` brackets the draw with
|
|
66
|
+
* `SRC_ALPHA, ONE_MINUS_SRC_ALPHA` and `gl.disable(gl.CULL_FACE)` — the second because waves
|
|
67
|
+
* are displaced far enough that back faces show at grazing angles, which is a surface you can
|
|
68
|
+
* see the underside of rather than a winding mistake.
|
|
69
|
+
*
|
|
70
|
+
* **Depth tested and not written**, which is what a transparent surface wants: it must not
|
|
71
|
+
* occlude what comes after it, and it must still be occluded by what came before.
|
|
72
|
+
*/
|
|
73
|
+
export declare function waterPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { DEPTH_COMPARE } from '../../depthConvention.js';
|
|
2
|
+
import { WATER_BINDINGS, WATER_FRAG_WGSL, WATER_VERT_WGSL, } from '../../shaders/generated/water.wgsl.js';
|
|
3
|
+
import { PATCH_RESOLUTION, buildUnitSheet, buildWaterGrid } from '../../waterGrid.js';
|
|
4
|
+
import { DEPTH_FORMAT } from './flatPass.js';
|
|
5
|
+
import { shaderModule } from './shaderModules.js';
|
|
6
|
+
/**
|
|
7
|
+
* The water pass: two sheets and a patch, displaced by a wave field in the vertex stage.
|
|
8
|
+
*
|
|
9
|
+
* **One vertex attribute for the whole surface.** `aGrid` is a `vec2` of grid coordinates and
|
|
10
|
+
* everything else — height, normal, crest, the reflection's clip position — is computed from
|
|
11
|
+
* it. So the geometry here is a buffer of pairs and an index list, and the interesting part is
|
|
12
|
+
* entirely in the shader and the uniforms.
|
|
13
|
+
*/
|
|
14
|
+
export const WATER_VERT_FIELDS = WATER_BINDINGS.WATER_VERT.fields;
|
|
15
|
+
export const WATER_VERT_SIZE = WATER_BINDINGS.WATER_VERT.uniformSize;
|
|
16
|
+
export const WATER_FRAG_FIELDS = WATER_BINDINGS.WATER_FRAG.fields;
|
|
17
|
+
export const WATER_FRAG_SIZE = WATER_BINDINGS.WATER_FRAG.uniformSize;
|
|
18
|
+
const VERT_BINDING = WATER_BINDINGS.WATER_VERT.uniforms;
|
|
19
|
+
const FRAG_BINDING = WATER_BINDINGS.WATER_FRAG.uniforms;
|
|
20
|
+
const REFLECTION = WATER_BINDINGS.WATER_FRAG.textures.uReflectionMap;
|
|
21
|
+
const VISIBILITY_VERTEX = 0x1;
|
|
22
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
23
|
+
const USAGE_VERTEX = 0x0020 | 0x0008;
|
|
24
|
+
const USAGE_INDEX = 0x0010 | 0x0008;
|
|
25
|
+
export function createGpuWater(device, resolution, nearExtent, farHalfExtent, reflectionFilterTaps) {
|
|
26
|
+
const upload = (offsets, indices, label) => {
|
|
27
|
+
const buffer = device.createBuffer({
|
|
28
|
+
label: `${label}.offsets`,
|
|
29
|
+
size: Math.max(4, offsets.byteLength),
|
|
30
|
+
usage: USAGE_VERTEX,
|
|
31
|
+
});
|
|
32
|
+
device.queue.writeBuffer(buffer, 0, offsets);
|
|
33
|
+
const index = device.createBuffer({
|
|
34
|
+
label: `${label}.indices`,
|
|
35
|
+
size: Math.max(4, indices.byteLength),
|
|
36
|
+
usage: USAGE_INDEX,
|
|
37
|
+
});
|
|
38
|
+
device.queue.writeBuffer(index, 0, indices);
|
|
39
|
+
return { buffer, index, count: indices.length };
|
|
40
|
+
};
|
|
41
|
+
const grid = buildWaterGrid(resolution, nearExtent, farHalfExtent);
|
|
42
|
+
const sheet = upload(grid.offsets, grid.indices, 'water.sheet');
|
|
43
|
+
const unit = buildUnitSheet(PATCH_RESOLUTION);
|
|
44
|
+
const patch = upload(unit.offsets, unit.indices, 'water.patch');
|
|
45
|
+
return {
|
|
46
|
+
sheet,
|
|
47
|
+
patch,
|
|
48
|
+
cellSize: grid.cellSize,
|
|
49
|
+
nearHalfExtent: grid.nearHalfExtent,
|
|
50
|
+
farHalfExtent: grid.farHalfExtent,
|
|
51
|
+
reflectionFilterTaps,
|
|
52
|
+
dispose() {
|
|
53
|
+
sheet.buffer.destroy();
|
|
54
|
+
sheet.index.destroy();
|
|
55
|
+
patch.buffer.destroy();
|
|
56
|
+
patch.index.destroy();
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function waterVertexLayouts() {
|
|
61
|
+
return [
|
|
62
|
+
{
|
|
63
|
+
arrayStride: 2 * 4,
|
|
64
|
+
stepMode: 'vertex',
|
|
65
|
+
attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The water bind group's layout, whose two buffers are addressed by a dynamic offset.
|
|
71
|
+
*
|
|
72
|
+
* **A frame draws more than one body of water and this is what makes that true here.** A ditch at
|
|
73
|
+
* its own level, a fountain in a courtyard and the sea beyond them are three draws, and with one
|
|
74
|
+
* buffer rewritten between them all three read whatever was written last: `queue.write*` calls are
|
|
75
|
+
* ordered on the queue timeline and the encoder is submitted after every one of them, so the
|
|
76
|
+
* picture is every body wearing the last one's extents, level and colour. That is the hazard
|
|
77
|
+
* `UniformRing` exists for, recorded in `AGENTS.md` on 2026-08-27, and water was the pass still
|
|
78
|
+
* carrying it — invisible for as long as no scene drew two, which is exactly how the joint palette
|
|
79
|
+
* survived eight releases.
|
|
80
|
+
*
|
|
81
|
+
* WebGL2 needs none of this: it sets uniforms and draws in one stream. Per the 2026-08-13 rule
|
|
82
|
+
* that makes it a binder's problem here and not a decision anybody has to take twice.
|
|
83
|
+
*/
|
|
84
|
+
export function createWaterBindGroupLayout(device) {
|
|
85
|
+
return device.createBindGroupLayout({
|
|
86
|
+
label: 'water.layout',
|
|
87
|
+
entries: [
|
|
88
|
+
{
|
|
89
|
+
binding: VERT_BINDING,
|
|
90
|
+
visibility: VISIBILITY_VERTEX,
|
|
91
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: WATER_VERT_SIZE },
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
binding: FRAG_BINDING,
|
|
95
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
96
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: WATER_FRAG_SIZE },
|
|
97
|
+
},
|
|
98
|
+
{ binding: REFLECTION.texture, visibility: VISIBILITY_FRAGMENT, texture: {} },
|
|
99
|
+
{ binding: REFLECTION.sampler, visibility: VISIBILITY_FRAGMENT, sampler: {} },
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The bind group over both rings and the mirror.
|
|
105
|
+
*
|
|
106
|
+
* **One mirror serves every body, and that is correct rather than a limit worked around.** The
|
|
107
|
+
* frame renders at most one planar reflection, at one plane height; `reflectionFor` hands it to the
|
|
108
|
+
* body whose level matches and hands nothing to the rest, which then draw with
|
|
109
|
+
* `uReflectionEnabled` at zero and never sample the view this group still holds.
|
|
110
|
+
*/
|
|
111
|
+
export function createWaterBindGroup(device, layout, perDraw, perFrame, reflection, sampler) {
|
|
112
|
+
return device.createBindGroup({
|
|
113
|
+
label: 'water.bindGroup',
|
|
114
|
+
layout,
|
|
115
|
+
entries: [
|
|
116
|
+
{ binding: VERT_BINDING, resource: { buffer: perDraw, size: WATER_VERT_SIZE } },
|
|
117
|
+
{ binding: FRAG_BINDING, resource: { buffer: perFrame, size: WATER_FRAG_SIZE } },
|
|
118
|
+
{ binding: REFLECTION.texture, resource: reflection },
|
|
119
|
+
{ binding: REFLECTION.sampler, resource: sampler },
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The water pipeline.
|
|
125
|
+
*
|
|
126
|
+
* **Blended, and culling off.** `renderer.ts` brackets the draw with
|
|
127
|
+
* `SRC_ALPHA, ONE_MINUS_SRC_ALPHA` and `gl.disable(gl.CULL_FACE)` — the second because waves
|
|
128
|
+
* are displaced far enough that back faces show at grazing angles, which is a surface you can
|
|
129
|
+
* see the underside of rather than a winding mistake.
|
|
130
|
+
*
|
|
131
|
+
* **Depth tested and not written**, which is what a transparent surface wants: it must not
|
|
132
|
+
* occlude what comes after it, and it must still be occluded by what came before.
|
|
133
|
+
*/
|
|
134
|
+
export function waterPipeline(cache, device, layout) {
|
|
135
|
+
return cache.get('water', () => ({
|
|
136
|
+
label: 'water',
|
|
137
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
138
|
+
vertex: {
|
|
139
|
+
module: shaderModule(device, { label: 'water.vert', code: WATER_VERT_WGSL }),
|
|
140
|
+
entryPoint: 'main',
|
|
141
|
+
buffers: waterVertexLayouts(),
|
|
142
|
+
},
|
|
143
|
+
fragment: {
|
|
144
|
+
module: shaderModule(device, { label: 'water.frag', code: WATER_FRAG_WGSL }),
|
|
145
|
+
entryPoint: 'main',
|
|
146
|
+
targets: [
|
|
147
|
+
{
|
|
148
|
+
format: cache.format,
|
|
149
|
+
blend: {
|
|
150
|
+
color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
151
|
+
alpha: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
157
|
+
multisample: { count: cache.sampleCount },
|
|
158
|
+
depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: false, depthCompare: DEPTH_COMPARE },
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { UniformFields } from './scatterPass.ts';
|
|
2
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The wind-streak pass: a lattice of debris that follows the camera and wraps.
|
|
5
|
+
*
|
|
6
|
+
* **Nothing here is per frame except ten uniforms.** The whole effect lives in the vertex
|
|
7
|
+
* shader — a particle's place comes from its index and the clock, and the box it sits in wraps
|
|
8
|
+
* around the camera — so there is no spawning, no pooling and no upload once the lattice is
|
|
9
|
+
* built.
|
|
10
|
+
*
|
|
11
|
+
* Blended over what is behind it rather than added, because dust in air occludes: this is the
|
|
12
|
+
* one effect in this backend that is neither opaque nor additive.
|
|
13
|
+
*/
|
|
14
|
+
export declare const WIND_STREAK_VERT_FIELDS: UniformFields;
|
|
15
|
+
export declare const WIND_STREAK_VERT_SIZE: 128;
|
|
16
|
+
export declare const WIND_STREAK_FRAG_FIELDS: UniformFields;
|
|
17
|
+
export declare const WIND_STREAK_FRAG_SIZE: 16;
|
|
18
|
+
/** A lattice on the device, behind the surface's opaque handle. */
|
|
19
|
+
export interface GpuWindStreaks {
|
|
20
|
+
readonly corners: GPUBuffer;
|
|
21
|
+
readonly indices: GPUBuffer;
|
|
22
|
+
readonly vertexCount: number;
|
|
23
|
+
readonly cellSize: number;
|
|
24
|
+
readonly count: number;
|
|
25
|
+
readonly onsetSpeed: number;
|
|
26
|
+
readonly fullSpeed: number;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function createGpuWindStreaks(device: GPUDevice, count: number, cellSize: number, onsetSpeed: number, fullSpeed: number): GpuWindStreaks;
|
|
30
|
+
/**
|
|
31
|
+
* `aCorner` and `aIndex`, one buffer each, matching what `WindStreakRenderer` binds.
|
|
32
|
+
*
|
|
33
|
+
* Not interleaved, because they are two separate arrays on both sides and two of eight slots is
|
|
34
|
+
* nothing. The flat pass interleaves only because ten attributes will not fit.
|
|
35
|
+
*/
|
|
36
|
+
export declare function windStreakVertexLayouts(): GPUVertexBufferLayout[];
|
|
37
|
+
export declare function createWindStreakBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
38
|
+
export declare function createWindStreakBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, vertices: GPUBuffer, fragments: GPUBuffer): GPUBindGroup;
|
|
39
|
+
/**
|
|
40
|
+
* The pipeline.
|
|
41
|
+
*
|
|
42
|
+
* **Alpha over, depth tested, depth not written, nothing culled.** A streak is a two-sided
|
|
43
|
+
* card carried past the camera at any angle, so culling it would drop half of them for no
|
|
44
|
+
* saving; writing depth would let a translucent smear occlude whatever is drawn after it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function windStreakPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
|