@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,482 @@
|
|
|
1
|
+
import { DEPTH_COMPARE, DEPTH_FORMAT, depthOffsetForLayer } from '../../depthConvention.js';
|
|
2
|
+
import { FLAT_BINDINGS, FLAT_FRAG_WGSL, FLAT_VERT_WGSL, } from '../../shaders/generated/flat.wgsl.js';
|
|
3
|
+
import { vertexBufferLayouts } from './buffers.js';
|
|
4
|
+
import { shaderModule } from './shaderModules.js';
|
|
5
|
+
/**
|
|
6
|
+
* The key for a set of flags.
|
|
7
|
+
*
|
|
8
|
+
* **The rule is `variantKey` in `scripts/wgsl.ts` and this is a second statement of it**, which
|
|
9
|
+
* is exactly the kind of restatement that drifts — except that a drift here cannot be silent:
|
|
10
|
+
* `flatFragmentBindings` throws on a key the generated table does not hold, at construction,
|
|
11
|
+
* naming the key it looked for. `scripts/` is a build tool and nothing under `src/` may import
|
|
12
|
+
* it, so a copy is the only option and a loud one is the acceptable form of it.
|
|
13
|
+
*/
|
|
14
|
+
export function flatVariant(flags) {
|
|
15
|
+
const on = Object.keys(flags)
|
|
16
|
+
.filter((flag) => flags[flag])
|
|
17
|
+
.sort();
|
|
18
|
+
return on.length === 0 ? 'none' : on.join('+');
|
|
19
|
+
}
|
|
20
|
+
/*
|
|
21
|
+
* The generated file is `as const`, which makes every variant its own literal type and makes
|
|
22
|
+
* indexing it by a computed key an error. Declaring the shape once here is what lets the
|
|
23
|
+
* renderer choose a variant at runtime, and it is checked against the real object rather than
|
|
24
|
+
* asserted about it: a generator that stopped emitting `uniformSize` would fail here.
|
|
25
|
+
*/
|
|
26
|
+
const FRAGMENT_BINDINGS = FLAT_BINDINGS.flatFrag;
|
|
27
|
+
/**
|
|
28
|
+
* The vertex stage's four variants, keyed like the fragment stage's sixteen.
|
|
29
|
+
*
|
|
30
|
+
* **The morphed variants have a larger uniform block — 384 bytes against 240 — and every shared
|
|
31
|
+
* field keeps its offset anyway.** That is not luck: a block is packed in declaration order, and
|
|
32
|
+
* `flat/index.ts` declares morph's uniforms after every other one for exactly this reason. The
|
|
33
|
+
* assertion below is on the *offsets* rather than on the size, because the offsets are what the
|
|
34
|
+
* renderer writes by and a moved one does not fail — it puts the model matrix where the view
|
|
35
|
+
* projection should be and draws a scrambled frame.
|
|
36
|
+
*
|
|
37
|
+
* The first version of this guard compared only the unskinned and skinned sizes, which are equal
|
|
38
|
+
* because skinning added a sampler and no uniform. It would have stayed silent through exactly the
|
|
39
|
+
* change it was written to catch.
|
|
40
|
+
*/
|
|
41
|
+
const VERTEX_BINDINGS = FLAT_BINDINGS.flatVert;
|
|
42
|
+
/** The key for a set of vertex flags: the same rule `variantKey` uses, flags on, sorted, joined. */
|
|
43
|
+
export function flatVertexKey(skinned, morphed, instanced = false) {
|
|
44
|
+
const on = [];
|
|
45
|
+
/* Alphabetical, because the generator's own `variantKey` sorts and the two keys must agree. */
|
|
46
|
+
if (instanced)
|
|
47
|
+
on.push('instanced');
|
|
48
|
+
if (morphed)
|
|
49
|
+
on.push('morphed');
|
|
50
|
+
if (skinned)
|
|
51
|
+
on.push('skinned');
|
|
52
|
+
return on.length === 0 ? 'none' : on.join('+');
|
|
53
|
+
}
|
|
54
|
+
/** Everything the generator recorded about one variant of the vertex stage. */
|
|
55
|
+
export function flatVertexBindings(skinned, morphed = false, instanced = false) {
|
|
56
|
+
const key = flatVertexKey(skinned, morphed, instanced);
|
|
57
|
+
const found = VERTEX_BINDINGS[key];
|
|
58
|
+
if (found === undefined)
|
|
59
|
+
throw new Error(`flatPass: no vertex bindings for variant "${key}"`);
|
|
60
|
+
return found;
|
|
61
|
+
}
|
|
62
|
+
const PLAIN_VERTEX = flatVertexBindings(false);
|
|
63
|
+
/*
|
|
64
|
+
* **A variant may drop a field; it may never move one.**
|
|
65
|
+
*
|
|
66
|
+
* The renderer writes this block by offset, so two variants disagreeing about where a shared
|
|
67
|
+
* field lives is a scrambled frame rather than an error. The check was `undefined || moved` until
|
|
68
|
+
* the instanced variant, which legitimately declares neither `uModel` nor `uTint` — its placement
|
|
69
|
+
* and tint arrive as vertex attributes — and an absent field is not a moved one: nothing writes
|
|
70
|
+
* it, so nothing can write it to the wrong place.
|
|
71
|
+
*
|
|
72
|
+
* What still has to hold, and what this asserts, is that every field a variant *does* declare sits
|
|
73
|
+
* where the plain variant has it. That is what `flat/index.ts` declares the optional uniforms last
|
|
74
|
+
* for, and it was worth asserting: with `uModel` declared second, the instanced block put
|
|
75
|
+
* `uHasTangents` at 64 against the plain variant's 128, and a draw writing by the plain table
|
|
76
|
+
* would have put the tangent flag into the model matrix.
|
|
77
|
+
*
|
|
78
|
+
* **What would make this wrong** is a caller writing a field the variant it is drawing does not
|
|
79
|
+
* declare. That is the failure this no longer catches, and it is `drawInstanced`'s to avoid by
|
|
80
|
+
* writing the shared fields only.
|
|
81
|
+
*/
|
|
82
|
+
for (const [key, bindings] of Object.entries(VERTEX_BINDINGS)) {
|
|
83
|
+
for (const [field, shared] of Object.entries(PLAIN_VERTEX.fields)) {
|
|
84
|
+
const here = bindings.fields[field];
|
|
85
|
+
if (here !== undefined && here.offset !== shared.offset) {
|
|
86
|
+
throw new Error(`flatPass: vertex variant "${key}" puts ${field} at ${here.offset} where the ` +
|
|
87
|
+
`plain variant has it at ${shared.offset}. A variant may omit a field, but every field ` +
|
|
88
|
+
`it declares must sit where the plain variant has it, because the renderer writes them ` +
|
|
89
|
+
`by offset — declare a new flag's uniforms after the existing ones.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export const FLAT_VERT_FIELDS = FLAT_BINDINGS.flatVert.none.fields;
|
|
94
|
+
/**
|
|
95
|
+
* The **largest** variant's block, because one ring serves every draw.
|
|
96
|
+
*
|
|
97
|
+
* A ring strided for the plain block would leave a morphed draw writing its weights into the next
|
|
98
|
+
* slot, which is a scrambled neighbour rather than an error. The unused tail on a plain draw is
|
|
99
|
+
* 144 bytes a slot and is what a single ring costs.
|
|
100
|
+
*/
|
|
101
|
+
export const FLAT_VERT_SIZE = Math.max(...Object.values(VERTEX_BINDINGS).map((bindings) => bindings.uniformSize));
|
|
102
|
+
const FLAT_VERT_BINDING = PLAIN_VERTEX.uniforms;
|
|
103
|
+
/** Everything the generator recorded about one permutation of the fragment stage. */
|
|
104
|
+
export function flatFragmentBindings(variant) {
|
|
105
|
+
const found = FRAGMENT_BINDINGS[variant];
|
|
106
|
+
if (found === undefined)
|
|
107
|
+
throw new Error(`flatPass: no bindings for variant "${variant}"`);
|
|
108
|
+
return found;
|
|
109
|
+
}
|
|
110
|
+
/** The depth format both backends compare with. */
|
|
111
|
+
/* Re-exported so the twenty passes that already import it from here do not each learn a new
|
|
112
|
+
module; `depthConvention.ts` is where the decision lives and why. */
|
|
113
|
+
export { DEPTH_FORMAT } from '../../depthConvention.js';
|
|
114
|
+
const VISIBILITY_VERTEX = 0x1;
|
|
115
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
116
|
+
/**
|
|
117
|
+
* The layout this variant binds against.
|
|
118
|
+
*
|
|
119
|
+
* The vertex block is **dynamic**, because every draw supplies its own model matrix and tint
|
|
120
|
+
* from its own slot of one buffer. The fragment block is not: it holds the lights, the fog
|
|
121
|
+
* and the camera, settled once by `bindMeshPass` and unchanged between draws.
|
|
122
|
+
*/
|
|
123
|
+
export function createFlatBindGroupLayout(device, variant, skinned = false, morphed = false) {
|
|
124
|
+
const fragment = flatFragmentBindings(variant);
|
|
125
|
+
const entries = [
|
|
126
|
+
{
|
|
127
|
+
binding: FLAT_VERT_BINDING,
|
|
128
|
+
visibility: VISIBILITY_VERTEX,
|
|
129
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLAT_VERT_SIZE },
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
binding: fragment.uniforms,
|
|
133
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
134
|
+
/*
|
|
135
|
+
* Dynamic, because this block carries the material and a material changes between draws.
|
|
136
|
+
* See `WebGPURenderer.perFrame` for why one buffer cannot hold two answers.
|
|
137
|
+
*/
|
|
138
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: fragment.uniformSize },
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
/** What each sampler binding was declared as, so a shared one is declared once and agrees. */
|
|
142
|
+
const samplerKind = new Map();
|
|
143
|
+
for (const [name, texture] of Object.entries(fragment.textures)) {
|
|
144
|
+
/*
|
|
145
|
+
* A shadow map is a depth texture, and a depth texture's supported sample types are
|
|
146
|
+
* `UnfilterableFloat | Depth` — never plain `Float`, which is what an empty `texture: {}`
|
|
147
|
+
* asks for. Declaring the wrong one is rejected at bind time:
|
|
148
|
+
*
|
|
149
|
+
* None of the supported sample types (UnfilterableFloat|Depth) of [Texture
|
|
150
|
+
* "shadow.static"] match the expected sample types (Float)
|
|
151
|
+
*
|
|
152
|
+
* Unfilterable rather than a comparison sampler, because the shader does its own PCF
|
|
153
|
+
* loop over explicit taps rather than asking the hardware to compare and blend.
|
|
154
|
+
*/
|
|
155
|
+
const cube = texture.type === 'samplerCube';
|
|
156
|
+
/*
|
|
157
|
+
* The point-shadow array is a depth texture too, and is read the same way: `pointShadow`
|
|
158
|
+
* takes one `textureLod(maps, vec3(octEncode(dir), layer), 0.0)` per tap and estimates its
|
|
159
|
+
* own penumbra, so nothing here asks the hardware to filter.
|
|
160
|
+
*
|
|
161
|
+
* **`uEnvironment` is a cube and is *not* a shadow map.** It is a colour cubemap, and its
|
|
162
|
+
* mip chain **is** the roughness: a polished surface reads level 0 and a satin one reads
|
|
163
|
+
* further up, blending between them. That needs a filtering sampler and a filterable float,
|
|
164
|
+
* and declaring it `non-filtering` alongside the depth textures made the pipeline invalid —
|
|
165
|
+
* which, being a pipeline, drew nothing and said nothing beyond a device warning.
|
|
166
|
+
*
|
|
167
|
+
* Named explicitly rather than by a pattern. `uPointShadow0` did not end in `ShadowMap`, so
|
|
168
|
+
* a rule wide enough to catch the twelve cubes also caught the probe; naming the one
|
|
169
|
+
* exception was the answer then and there is one binding to catch now.
|
|
170
|
+
*/
|
|
171
|
+
const array = texture.type === 'sampler2DArray';
|
|
172
|
+
/*
|
|
173
|
+
* **An integer texture is its own sample type and cannot be anything else.** The froxel table
|
|
174
|
+
* is `rgba32uint`; declaring it `float` is rejected at bind time exactly as a depth texture
|
|
175
|
+
* declared `float` is, with the same shape of message and the same consequence — a bind group
|
|
176
|
+
* that is invalid, a pass that records nothing, and a frame that presents anyway.
|
|
177
|
+
*
|
|
178
|
+
* It is also the reason the entry below asks for a non-filtering sampler: WebGPU permits no
|
|
179
|
+
* other kind against a `uint` texture, and the shader never samples it — every read is a
|
|
180
|
+
* `texelFetch`, which is why the declaration shares a sampler rather than bringing its own.
|
|
181
|
+
*/
|
|
182
|
+
const integer = texture.type === 'usampler2D';
|
|
183
|
+
const isShadow = integer || (name !== 'uEnvironment' && (name.endsWith('ShadowMap') || cube || array));
|
|
184
|
+
entries.push({
|
|
185
|
+
binding: texture.texture,
|
|
186
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
187
|
+
texture: {
|
|
188
|
+
sampleType: integer ? 'uint' : isShadow ? 'unfilterable-float' : 'float',
|
|
189
|
+
...(cube ? { viewDimension: 'cube' } : {}),
|
|
190
|
+
...(array ? { viewDimension: '2d-array' } : {}),
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
/*
|
|
194
|
+
* **One entry per sampler *binding*, not per texture**, because the fifteen shadow
|
|
195
|
+
* declarations now share one. `// wgsl:share shadow` in `flat.ts` is what collapsed them,
|
|
196
|
+
* and it is what lets the environment probe fit under a sixteen-sampler ceiling at all.
|
|
197
|
+
* Declaring the same binding fifteen times is rejected outright.
|
|
198
|
+
*/
|
|
199
|
+
const declared = samplerKind.get(texture.sampler);
|
|
200
|
+
const kind = isShadow ? 'non-filtering' : 'filtering';
|
|
201
|
+
if (declared === undefined) {
|
|
202
|
+
samplerKind.set(texture.sampler, kind);
|
|
203
|
+
entries.push({
|
|
204
|
+
binding: texture.sampler,
|
|
205
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
206
|
+
sampler: { type: kind },
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
else if (declared !== kind) {
|
|
210
|
+
/*
|
|
211
|
+
* Loud, at init, because the alternative is silent and wrong. A group whose members
|
|
212
|
+
* disagree about filtering cannot share a sampler — `uEnvironment`'s mip chain *is* its
|
|
213
|
+
* roughness and needs a filtering one, where a depth cube cannot have it — and a marker
|
|
214
|
+
* that put them together would otherwise produce a pipeline that draws nothing and says
|
|
215
|
+
* nothing beyond a device warning.
|
|
216
|
+
*/
|
|
217
|
+
throw new Error(`flat: ${name} shares sampler binding ${texture.sampler} but wants ${kind} where the ` +
|
|
218
|
+
`group is ${declared}. Check its wgsl:share marker in flat.ts.`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/*
|
|
222
|
+
* The joint palette, on the **vertex** stage.
|
|
223
|
+
*
|
|
224
|
+
* `unfilterable-float`, because `rgba32float` is not filterable without an extension and the
|
|
225
|
+
* shader reads it with an integer fetch that involves no sampler at all. Declaring it filterable
|
|
226
|
+
* is a pipeline-creation failure rather than a wrong picture, which is the loud direction.
|
|
227
|
+
*
|
|
228
|
+
* Added only for the skinned variant, so an unskinned layout declares nothing the unskinned
|
|
229
|
+
* shader module cannot reach — a bind group layout and its module must agree exactly or WebGPU
|
|
230
|
+
* refuses the pipeline.
|
|
231
|
+
*/
|
|
232
|
+
if (morphed) {
|
|
233
|
+
const deltas = flatVertexBindings(skinned, true).textures['uMorphDeltas'];
|
|
234
|
+
if (deltas === undefined) {
|
|
235
|
+
throw new Error('flatPass: the morphed vertex shader declares no uMorphDeltas');
|
|
236
|
+
}
|
|
237
|
+
entries.push({
|
|
238
|
+
binding: deltas.texture,
|
|
239
|
+
visibility: VISIBILITY_VERTEX,
|
|
240
|
+
texture: { sampleType: 'unfilterable-float' },
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (skinned) {
|
|
244
|
+
const palette = flatVertexBindings(skinned, morphed).textures['uJointPalette'];
|
|
245
|
+
if (palette === undefined) {
|
|
246
|
+
throw new Error('flatPass: the skinned vertex shader declares no uJointPalette');
|
|
247
|
+
}
|
|
248
|
+
entries.push({
|
|
249
|
+
binding: palette.texture,
|
|
250
|
+
visibility: VISIBILITY_VERTEX,
|
|
251
|
+
texture: { sampleType: 'unfilterable-float' },
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return device.createBindGroupLayout({
|
|
255
|
+
label: `flat.layout:${variant}|${flatVertexKey(skinned, morphed)}`,
|
|
256
|
+
entries,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Bind the buffers and one view per declared texture.
|
|
261
|
+
*
|
|
262
|
+
* `resolve` is asked for a view by the shader's own name for it, so a caller supplies the
|
|
263
|
+
* shadow maps it has and a stand-in for the rest. **Every declared binding must be filled
|
|
264
|
+
* even when the shader never samples it** — `uAlbedoEnabled` is zero for nearly all geometry
|
|
265
|
+
* and WebGPU still requires something there, which is why `renderer.ts` keeps an
|
|
266
|
+
* `emptyTexture2D` for the same reason on the other side.
|
|
267
|
+
*/
|
|
268
|
+
export function createFlatBindGroup(device, layout, variant, perDraw, perFrame, resolve,
|
|
269
|
+
/** The palette view for a skinned bind group, or null for an unskinned one. */
|
|
270
|
+
palette = null,
|
|
271
|
+
/** The delta view for a morphed bind group, or null for an unmorphed one. */
|
|
272
|
+
deltas = null) {
|
|
273
|
+
const fragment = flatFragmentBindings(variant);
|
|
274
|
+
const entries = [
|
|
275
|
+
{
|
|
276
|
+
binding: FLAT_VERT_BINDING,
|
|
277
|
+
resource: { buffer: perDraw, size: FLAT_VERT_SIZE },
|
|
278
|
+
},
|
|
279
|
+
{ binding: fragment.uniforms, resource: { buffer: perFrame, size: fragment.uniformSize } },
|
|
280
|
+
];
|
|
281
|
+
/* The same dedupe the layout does, and for the same reason: the shadow bindings share one
|
|
282
|
+
sampler, and a bind group that filled it fifteen times would be rejected. Every member
|
|
283
|
+
resolves to the one object anyway — that is why sharing the declaration was free. */
|
|
284
|
+
const filled = new Set();
|
|
285
|
+
for (const [name, texture] of Object.entries(fragment.textures)) {
|
|
286
|
+
const supplied = resolve(name);
|
|
287
|
+
entries.push({ binding: texture.texture, resource: supplied.view });
|
|
288
|
+
if (filled.has(texture.sampler))
|
|
289
|
+
continue;
|
|
290
|
+
filled.add(texture.sampler);
|
|
291
|
+
entries.push({ binding: texture.sampler, resource: supplied.sampler });
|
|
292
|
+
}
|
|
293
|
+
if (deltas !== null) {
|
|
294
|
+
const binding = flatVertexBindings(palette !== null, true).textures['uMorphDeltas'];
|
|
295
|
+
if (binding === undefined) {
|
|
296
|
+
throw new Error('flatPass: the morphed vertex shader declares no uMorphDeltas');
|
|
297
|
+
}
|
|
298
|
+
entries.push({ binding: binding.texture, resource: deltas });
|
|
299
|
+
}
|
|
300
|
+
if (palette !== null) {
|
|
301
|
+
const binding = flatVertexBindings(true, deltas !== null).textures['uJointPalette'];
|
|
302
|
+
if (binding === undefined) {
|
|
303
|
+
throw new Error('flatPass: the skinned vertex shader declares no uJointPalette');
|
|
304
|
+
}
|
|
305
|
+
entries.push({ binding: binding.texture, resource: palette });
|
|
306
|
+
}
|
|
307
|
+
return device.createBindGroup({
|
|
308
|
+
label: `flat.bindGroup:${variant}|${flatVertexKey(palette !== null, deltas !== null)}`,
|
|
309
|
+
layout,
|
|
310
|
+
entries,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* The pipeline, cached by the state that distinguishes it.
|
|
315
|
+
*
|
|
316
|
+
* The key names the variant and which optional attributes the mesh supplied, because those
|
|
317
|
+
* two decide the fragment module and the vertex layout. Built once per mesh at construction
|
|
318
|
+
* time rather than per frame, which is the rule `PipelineCache` exists to keep.
|
|
319
|
+
*/
|
|
320
|
+
export function flatPipeline(cache, device, layout, variant, key, present,
|
|
321
|
+
/**
|
|
322
|
+
* Alpha-blended, for `drawTranslucentMesh`.
|
|
323
|
+
*
|
|
324
|
+
* **A second pipeline rather than a flag on the first**, because blend state is baked into a
|
|
325
|
+
* WebGPU pipeline where WebGL2 toggles it around the draw with `gl.enable(BLEND)`. Keyed
|
|
326
|
+
* separately, so one mesh drawn both ways gets both and neither is rebuilt per frame.
|
|
327
|
+
*
|
|
328
|
+
* Depth still written, matching the other backend: `drawTranslucentMesh` there leaves
|
|
329
|
+
* `depthMask` alone and only turns blending on. A translucent part of a loaded model is a
|
|
330
|
+
* pane of glass in a solid object, not a particle, and it has to occlude what is behind it
|
|
331
|
+
* for the rest of the model to sort correctly.
|
|
332
|
+
*/
|
|
333
|
+
translucent = false,
|
|
334
|
+
/** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
|
|
335
|
+
skinned = false,
|
|
336
|
+
/** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
|
|
337
|
+
morphed = false,
|
|
338
|
+
/**
|
|
339
|
+
* Whether this pipeline writes depth, and which coplanar layer it draws on.
|
|
340
|
+
*
|
|
341
|
+
* **Both are pipeline state here and per-draw state on the other backend**, which is why they
|
|
342
|
+
* arrive as arguments and why the caller's key has to carry them: two draws of one mesh that
|
|
343
|
+
* differ only in these would otherwise share a cached pipeline and the second would silently
|
|
344
|
+
* get the first one's depth behaviour.
|
|
345
|
+
*/
|
|
346
|
+
depthWrite = true, depthLayer = 0,
|
|
347
|
+
/** Whether placement and tint arrive per instance. See `FlatVertexOptions`. */
|
|
348
|
+
instanced = false,
|
|
349
|
+
/** Which order-independent buffer this pipeline writes, if any. The key must carry it. */
|
|
350
|
+
oit = 'none') {
|
|
351
|
+
return cache.get(key, () => flatDescriptor(cache, device, layout, variant, key, present, translucent, skinned, morphed, depthWrite, depthLayer, instanced, oit));
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* The same pipeline, compiled off the main thread.
|
|
355
|
+
*
|
|
356
|
+
* **Preferred by everything that builds a mesh**, which is all of them: `createRenderPipeline`
|
|
357
|
+
* defers the shader compile to the first draw, so a scene that builds its meshes and then
|
|
358
|
+
* renders pays for every one of them inside a single frame. On a phone that is seconds of a
|
|
359
|
+
* blocked GPU queue with an idle main thread, which is invisible to every timer that is not
|
|
360
|
+
* this one. The descriptor is identical; only when the driver does the work changes.
|
|
361
|
+
*/
|
|
362
|
+
export function flatPipelineAsync(cache, device, layout, variant, key, present, translucent = false,
|
|
363
|
+
/** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
|
|
364
|
+
skinned = false,
|
|
365
|
+
/** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
|
|
366
|
+
morphed = false) {
|
|
367
|
+
return cache.getAsync(key, () => flatDescriptor(cache, device, layout, variant, key, present, translucent, skinned, morphed));
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* The colour target for an order-independent pass, or null where this is an ordinary draw.
|
|
371
|
+
*
|
|
372
|
+
* **The accumulation sums and the revealage multiplies**, which is the whole mechanism: a sum and
|
|
373
|
+
* a product both commute, so the frame stops depending on the order its fragments arrived in.
|
|
374
|
+
* `orderIndependent.ts` holds the same arithmetic on the CPU, where it is asserted against numbers.
|
|
375
|
+
*
|
|
376
|
+
* The revealage pass draws with the *ordinary* shader — `(zero, one-minus-src-alpha)` multiplies
|
|
377
|
+
* whatever colour it computed by nothing, so only its alpha lands. Both passes therefore decide a
|
|
378
|
+
* fragment's alpha with the same code and cannot disagree about it.
|
|
379
|
+
*/
|
|
380
|
+
function oitTarget(oit) {
|
|
381
|
+
if (oit === 'accum') {
|
|
382
|
+
return {
|
|
383
|
+
format: 'rgba16float',
|
|
384
|
+
blend: {
|
|
385
|
+
color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
|
|
386
|
+
alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
if (oit === 'reveal') {
|
|
391
|
+
return {
|
|
392
|
+
format: 'r8unorm',
|
|
393
|
+
blend: {
|
|
394
|
+
color: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
395
|
+
alpha: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
/** The descriptor both paths build, written once so the two can never diverge. */
|
|
402
|
+
function flatDescriptor(cache, device, layout, variant, key, present, translucent,
|
|
403
|
+
/** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
|
|
404
|
+
skinned,
|
|
405
|
+
/** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
|
|
406
|
+
morphed = false,
|
|
407
|
+
/** Whether this pipeline writes depth. See `TranslucentMeshOptions.depthWrite`. */
|
|
408
|
+
depthWrite = true,
|
|
409
|
+
/** Which coplanar layer this pipeline draws on. See `TranslucentMeshOptions.depthLayer`. */
|
|
410
|
+
depthLayer = 0,
|
|
411
|
+
/** Whether placement and tint arrive per instance. See `FlatVertexOptions`. */
|
|
412
|
+
instanced = false,
|
|
413
|
+
/**
|
|
414
|
+
* Which order-independent transparency buffer this pipeline writes, if any.
|
|
415
|
+
*
|
|
416
|
+
* **A pipeline variant and not a shader one.** The two buffers are two blend states and two
|
|
417
|
+
* formats, both of which are pipeline state on this backend; the *shader* is the same one the
|
|
418
|
+
* ordinary translucent path uses, weighted by a uniform. That is what keeps this off
|
|
419
|
+
* `flatFrag`'s permutation axis, which `scripts/wgsl.ts` measures at about 247 KB gzipped.
|
|
420
|
+
*/
|
|
421
|
+
oit = 'none') {
|
|
422
|
+
const offset = depthOffsetForLayer(depthLayer);
|
|
423
|
+
return {
|
|
424
|
+
label: key,
|
|
425
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
426
|
+
vertex: {
|
|
427
|
+
/*
|
|
428
|
+
* Selected per draw, like the fragment variant beside it — and the layout, the bind group
|
|
429
|
+
* and the cache key all carry the same flag. Building a skinned module against an unskinned
|
|
430
|
+
* layout validates, draws, and is wrong, exactly as this file's header says.
|
|
431
|
+
*/
|
|
432
|
+
module: shaderModule(device, {
|
|
433
|
+
label: `flat.vert:${flatVertexKey(skinned, morphed, instanced)}`,
|
|
434
|
+
code: FLAT_VERT_WGSL[flatVertexKey(skinned, morphed, instanced)] ?? '',
|
|
435
|
+
}),
|
|
436
|
+
entryPoint: 'main',
|
|
437
|
+
buffers: vertexBufferLayouts(present, instanced),
|
|
438
|
+
},
|
|
439
|
+
fragment: {
|
|
440
|
+
module: shaderModule(device, {
|
|
441
|
+
label: `flat.frag:${variant}`,
|
|
442
|
+
code: FLAT_FRAG_WGSL[variant] ?? '',
|
|
443
|
+
}),
|
|
444
|
+
entryPoint: 'main',
|
|
445
|
+
targets: [
|
|
446
|
+
oitTarget(oit) ??
|
|
447
|
+
(translucent
|
|
448
|
+
? {
|
|
449
|
+
format: cache.format,
|
|
450
|
+
blend: {
|
|
451
|
+
color: {
|
|
452
|
+
srcFactor: 'src-alpha',
|
|
453
|
+
dstFactor: 'one-minus-src-alpha',
|
|
454
|
+
operation: 'add',
|
|
455
|
+
},
|
|
456
|
+
alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
457
|
+
},
|
|
458
|
+
}
|
|
459
|
+
: { format: cache.format }),
|
|
460
|
+
],
|
|
461
|
+
},
|
|
462
|
+
primitive: { topology: 'triangle-list', cullMode: 'back' },
|
|
463
|
+
multisample: { count: cache.sampleCount },
|
|
464
|
+
/*
|
|
465
|
+
* `less`, matching the WebGL2 path's `LESS` rather than `LEQUAL`, and for the reason
|
|
466
|
+
* `drawMesh` documents there: under `LEQUAL` two coplanar surfaces do not merely tie,
|
|
467
|
+
* they overwrite each other, and a unit of rounding decides which survives per pixel.
|
|
468
|
+
*/
|
|
469
|
+
depthStencil: {
|
|
470
|
+
format: DEPTH_FORMAT,
|
|
471
|
+
depthWriteEnabled: depthWrite,
|
|
472
|
+
depthCompare: DEPTH_COMPARE,
|
|
473
|
+
/*
|
|
474
|
+
* Baked in, where the other backend toggles it around the draw. Both read
|
|
475
|
+
* `depthOffsetForLayer`, so a layer is worth the same depth on either one, and a pipeline
|
|
476
|
+
* that asked for no layer carries the zeroes WebGPU's default already is.
|
|
477
|
+
*/
|
|
478
|
+
depthBias: offset.units,
|
|
479
|
+
depthBiasSlopeScale: offset.slope,
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { UniformFields } from './scatterPass.ts';
|
|
2
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The flock pass: ambient sky life, two triangles a bird, every path in the vertex shader.
|
|
5
|
+
*
|
|
6
|
+
* **The one effect in this backend that is neither blended nor additive.** A bird is opaque and
|
|
7
|
+
* writes depth like any other surface, which is what lets one pass in front of another. Nothing
|
|
8
|
+
* is culled: they are flat cards seen from both sides as they bank.
|
|
9
|
+
*/
|
|
10
|
+
export declare const FLOCK_VERT_FIELDS: UniformFields;
|
|
11
|
+
export declare const FLOCK_VERT_SIZE: 112;
|
|
12
|
+
export declare const FLOCK_FRAG_FIELDS: UniformFields;
|
|
13
|
+
export declare const FLOCK_FRAG_SIZE: 16;
|
|
14
|
+
/** A flock on the device, behind the surface's opaque handle. */
|
|
15
|
+
export interface GpuFlock {
|
|
16
|
+
readonly corners: GPUBuffer;
|
|
17
|
+
readonly wings: GPUBuffer;
|
|
18
|
+
readonly indices: GPUBuffer;
|
|
19
|
+
readonly vertexCount: number;
|
|
20
|
+
dispose(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare function createGpuFlock(device: GPUDevice, count: number): GpuFlock;
|
|
23
|
+
/** `aCorner`, `aWing`, `aIndex` — one buffer each, as `FlockRenderer` holds them. */
|
|
24
|
+
export declare function flockVertexLayouts(): GPUVertexBufferLayout[];
|
|
25
|
+
export declare function createFlockBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
26
|
+
export declare function createFlockBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, vertices: GPUBuffer, fragments: GPUBuffer): GPUBindGroup;
|
|
27
|
+
/**
|
|
28
|
+
* The pipeline.
|
|
29
|
+
*
|
|
30
|
+
* `less` and depth written, matching the flat pass: a bird is geometry in the world rather than
|
|
31
|
+
* an effect over it, and a flock that did not write depth would show every bird through every
|
|
32
|
+
* other one.
|
|
33
|
+
*/
|
|
34
|
+
export declare function flockPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { DEPTH_COMPARE } from '../../depthConvention.js';
|
|
2
|
+
import { FLOCK_BINDINGS, FLOCK_FRAG_WGSL, FLOCK_VERT_WGSL, } from '../../shaders/generated/flock.wgsl.js';
|
|
3
|
+
import { buildFlockGeometry } from '../../flockGeometry.js';
|
|
4
|
+
import { DEPTH_FORMAT } from './flatPass.js';
|
|
5
|
+
import { shaderModule } from './shaderModules.js';
|
|
6
|
+
/**
|
|
7
|
+
* The flock pass: ambient sky life, two triangles a bird, every path in the vertex shader.
|
|
8
|
+
*
|
|
9
|
+
* **The one effect in this backend that is neither blended nor additive.** A bird is opaque and
|
|
10
|
+
* writes depth like any other surface, which is what lets one pass in front of another. Nothing
|
|
11
|
+
* is culled: they are flat cards seen from both sides as they bank.
|
|
12
|
+
*/
|
|
13
|
+
export const FLOCK_VERT_FIELDS = FLOCK_BINDINGS.FLOCK_VERT.fields;
|
|
14
|
+
export const FLOCK_VERT_SIZE = FLOCK_BINDINGS.FLOCK_VERT.uniformSize;
|
|
15
|
+
export const FLOCK_FRAG_FIELDS = FLOCK_BINDINGS.FLOCK_FRAG.fields;
|
|
16
|
+
export const FLOCK_FRAG_SIZE = FLOCK_BINDINGS.FLOCK_FRAG.uniformSize;
|
|
17
|
+
const VERT_BINDING = FLOCK_BINDINGS.FLOCK_VERT.uniforms;
|
|
18
|
+
const FRAG_BINDING = FLOCK_BINDINGS.FLOCK_FRAG.uniforms;
|
|
19
|
+
const VISIBILITY_VERTEX = 0x1;
|
|
20
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
21
|
+
const USAGE_VERTEX = 0x0020 | 0x0008;
|
|
22
|
+
export function createGpuFlock(device, count) {
|
|
23
|
+
const geometry = buildFlockGeometry(count);
|
|
24
|
+
const upload = (data, label) => {
|
|
25
|
+
const buffer = device.createBuffer({
|
|
26
|
+
label,
|
|
27
|
+
size: Math.max(4, data.byteLength),
|
|
28
|
+
usage: USAGE_VERTEX,
|
|
29
|
+
});
|
|
30
|
+
device.queue.writeBuffer(buffer, 0, data);
|
|
31
|
+
return buffer;
|
|
32
|
+
};
|
|
33
|
+
const corners = upload(geometry.corners, 'flock.corners');
|
|
34
|
+
const wings = upload(geometry.wings, 'flock.wings');
|
|
35
|
+
const indices = upload(geometry.indices, 'flock.indices');
|
|
36
|
+
return {
|
|
37
|
+
corners,
|
|
38
|
+
wings,
|
|
39
|
+
indices,
|
|
40
|
+
vertexCount: geometry.vertexCount,
|
|
41
|
+
dispose() {
|
|
42
|
+
corners.destroy();
|
|
43
|
+
wings.destroy();
|
|
44
|
+
indices.destroy();
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** `aCorner`, `aWing`, `aIndex` — one buffer each, as `FlockRenderer` holds them. */
|
|
49
|
+
export function flockVertexLayouts() {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
arrayStride: 8,
|
|
53
|
+
attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
arrayStride: 4,
|
|
57
|
+
attributes: [{ shaderLocation: 1, offset: 0, format: 'float32' }],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
arrayStride: 4,
|
|
61
|
+
attributes: [{ shaderLocation: 2, offset: 0, format: 'float32' }],
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
export function createFlockBindGroupLayout(device) {
|
|
66
|
+
return device.createBindGroupLayout({
|
|
67
|
+
label: 'flock.layout',
|
|
68
|
+
entries: [
|
|
69
|
+
/*
|
|
70
|
+
* **Addressed by a dynamic offset, so a frame can draw more than one batch.**
|
|
71
|
+
*
|
|
72
|
+
* With one buffer rewritten between draws, every batch reads whatever was written last:
|
|
73
|
+
* `queue.write*` calls are ordered on the queue timeline and the encoder is submitted after
|
|
74
|
+
* every one of them. The picture is each batch wearing the last one's colour, width, time
|
|
75
|
+
* and placement. That is the hazard `UniformRing` exists for, recorded in `AGENTS.md` on
|
|
76
|
+
* 2026-08-27, and this pass was one of four still carrying it — invisible for as long as
|
|
77
|
+
* nothing drew two, which is exactly how water kept it for eight releases.
|
|
78
|
+
*
|
|
79
|
+
* WebGL2 needs none of this: it sets uniforms and draws in one stream.
|
|
80
|
+
*/
|
|
81
|
+
{
|
|
82
|
+
binding: VERT_BINDING,
|
|
83
|
+
visibility: VISIBILITY_VERTEX,
|
|
84
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLOCK_VERT_SIZE },
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
binding: FRAG_BINDING,
|
|
88
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
89
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLOCK_FRAG_SIZE },
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function createFlockBindGroup(device, layout, vertices, fragments) {
|
|
95
|
+
return device.createBindGroup({
|
|
96
|
+
label: 'flock.bindGroup',
|
|
97
|
+
layout,
|
|
98
|
+
entries: [
|
|
99
|
+
{ binding: VERT_BINDING, resource: { buffer: vertices, size: FLOCK_VERT_SIZE } },
|
|
100
|
+
{ binding: FRAG_BINDING, resource: { buffer: fragments, size: FLOCK_FRAG_SIZE } },
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The pipeline.
|
|
106
|
+
*
|
|
107
|
+
* `less` and depth written, matching the flat pass: a bird is geometry in the world rather than
|
|
108
|
+
* an effect over it, and a flock that did not write depth would show every bird through every
|
|
109
|
+
* other one.
|
|
110
|
+
*/
|
|
111
|
+
export function flockPipeline(cache, device, layout) {
|
|
112
|
+
return cache.get('flock', () => ({
|
|
113
|
+
label: 'flock',
|
|
114
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
115
|
+
vertex: {
|
|
116
|
+
module: shaderModule(device, { label: 'flock.vert', code: FLOCK_VERT_WGSL }),
|
|
117
|
+
entryPoint: 'main',
|
|
118
|
+
buffers: flockVertexLayouts(),
|
|
119
|
+
},
|
|
120
|
+
fragment: {
|
|
121
|
+
module: shaderModule(device, { label: 'flock.frag', code: FLOCK_FRAG_WGSL }),
|
|
122
|
+
entryPoint: 'main',
|
|
123
|
+
targets: [{ format: cache.format }],
|
|
124
|
+
},
|
|
125
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
126
|
+
multisample: { count: cache.sampleCount },
|
|
127
|
+
depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: true, depthCompare: DEPTH_COMPARE },
|
|
128
|
+
}));
|
|
129
|
+
}
|