@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,366 @@
|
|
|
1
|
+
import { FULLSCREEN_VERT_WGSL } from '../../shaders/generated/fullscreen.wgsl.js';
|
|
2
|
+
import { RUSH_BINDINGS, RUSH_FRAG_WGSL } from '../../shaders/generated/rush.wgsl.js';
|
|
3
|
+
import { BLOOM_BINDINGS, BLOOM_DOWNSAMPLE_FRAG_WGSL, BLOOM_PREFILTER_FRAG_WGSL, BLOOM_UPSAMPLE_FRAG_WGSL, } from '../../shaders/generated/bloom.wgsl.js';
|
|
4
|
+
import { AMBIENTOCCLUSION_BINDINGS as AO_BINDINGS, AO_BLUR_FRAG_WGSL, AO_FRAG_WGSL, } from '../../shaders/generated/ambientOcclusion.wgsl.js';
|
|
5
|
+
import { TEMPORALRESOLVE_BINDINGS as TAA_BINDINGS, TEMPORAL_RESOLVE_FRAG_WGSL, } from '../../shaders/generated/temporalResolve.wgsl.js';
|
|
6
|
+
import { OITRESOLVE_BINDINGS as OIT_BINDINGS, OIT_RESOLVE_FRAG_WGSL, } from '../../shaders/generated/oitResolve.wgsl.js';
|
|
7
|
+
import { DECALPROJECT_BINDINGS as DECAL_BINDINGS, DECAL_PROJECT_FRAG_WGSL, } from '../../shaders/generated/decalProject.wgsl.js';
|
|
8
|
+
import { SSRTRACE_BINDINGS as SSR_BINDINGS, SSR_TRACE_FRAG_WGSL, } from '../../shaders/generated/ssrTrace.wgsl.js';
|
|
9
|
+
import { SSRRESOLVE_BINDINGS as SSR_RESOLVE_BINDINGS, SSR_RESOLVE_FRAG_WGSL, } from '../../shaders/generated/ssrResolve.wgsl.js';
|
|
10
|
+
import { GLOBALMEDIUM_BINDINGS as MEDIUM_BINDINGS, MEDIUM_FRAG_WGSL, MEDIUM_UPSAMPLE_FRAG_WGSL, } from '../../shaders/generated/globalMedium.wgsl.js';
|
|
11
|
+
import { shaderModule } from './shaderModules.js';
|
|
12
|
+
/**
|
|
13
|
+
* The composite: everything that happens to the frame after the world is drawn.
|
|
14
|
+
*
|
|
15
|
+
* **The scene lands off-screen and one pass puts it on the canvas.** That pass is `rush.ts`, and
|
|
16
|
+
* it is one shader rather than four because every one of these effects reads the same resolved
|
|
17
|
+
* image: the speed blur, the camera motion blur, the occlusion it multiplies in, the bloom it
|
|
18
|
+
* adds and the tone curve it ends on. `sceneTarget.ts` makes the same argument on the other
|
|
19
|
+
* backend, and both are why `bindMeshPass` grades in the mesh pass *only* when there is no
|
|
20
|
+
* composite to grade in.
|
|
21
|
+
*
|
|
22
|
+
* **What differs here is depth.** WebGL2 resolves a multisampled depth buffer with
|
|
23
|
+
* `blitFramebuffer` and reads it back; WebGPU has no multisample depth resolve at all. So a
|
|
24
|
+
* frame that wants occlusion or motion blur gets a resolve of its own, written below, which
|
|
25
|
+
* reads sample zero through `texture_depth_multisampled_2d` and writes it to a single-sample
|
|
26
|
+
* float target the generated shaders can sample as an ordinary texture.
|
|
27
|
+
*/
|
|
28
|
+
export const RUSH_FRAG_FIELDS = RUSH_BINDINGS.RUSH_FRAG.fields;
|
|
29
|
+
export const RUSH_FRAG_SIZE = RUSH_BINDINGS.RUSH_FRAG.uniformSize;
|
|
30
|
+
const RUSH_UNIFORMS = RUSH_BINDINGS.RUSH_FRAG.uniforms;
|
|
31
|
+
const RUSH_TEXTURES = RUSH_BINDINGS.RUSH_FRAG.textures;
|
|
32
|
+
export const AO_FRAG_FIELDS = AO_BINDINGS.AO_FRAG.fields;
|
|
33
|
+
export const AO_FRAG_SIZE = AO_BINDINGS.AO_FRAG.uniformSize;
|
|
34
|
+
export const AO_BLUR_FIELDS = AO_BINDINGS.AO_BLUR_FRAG.fields;
|
|
35
|
+
export const AO_BLUR_SIZE = AO_BINDINGS.AO_BLUR_FRAG.uniformSize;
|
|
36
|
+
export const MEDIUM_FRAG_FIELDS = MEDIUM_BINDINGS.MEDIUM_FRAG.fields;
|
|
37
|
+
export const MEDIUM_FRAG_SIZE = MEDIUM_BINDINGS.MEDIUM_FRAG.uniformSize;
|
|
38
|
+
export const MEDIUM_UPSAMPLE_FIELDS = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.fields;
|
|
39
|
+
export const MEDIUM_UPSAMPLE_SIZE = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.uniformSize;
|
|
40
|
+
export const BLOOM_PREFILTER_FIELDS = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.fields;
|
|
41
|
+
/**
|
|
42
|
+
* The other two stages' blocks, read by name like every other block here.
|
|
43
|
+
*
|
|
44
|
+
* **Named rather than assumed to be the prefilter's**, because they are not: the downsample has
|
|
45
|
+
* a texel and no threshold, and the upsample has neither — it has a radius. All three happen to
|
|
46
|
+
* be sixteen bytes, which is exactly the coincidence that would let a wrong offset go unnoticed.
|
|
47
|
+
* `postField` throws on a name a block does not have, and that is the point of asking.
|
|
48
|
+
*/
|
|
49
|
+
export const BLOOM_DOWNSAMPLE_FIELDS = BLOOM_BINDINGS.BLOOM_DOWNSAMPLE_FRAG.fields;
|
|
50
|
+
export const BLOOM_UPSAMPLE_FIELDS = BLOOM_BINDINGS.BLOOM_UPSAMPLE_FRAG.fields;
|
|
51
|
+
/** The widest of the three, so one slot shape holds any stage's block. */
|
|
52
|
+
export const BLOOM_STAGE_SIZE = Math.max(BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.uniformSize, BLOOM_BINDINGS.BLOOM_DOWNSAMPLE_FRAG.uniformSize, BLOOM_BINDINGS.BLOOM_UPSAMPLE_FRAG.uniformSize);
|
|
53
|
+
const VISIBILITY_FRAGMENT = 0x2;
|
|
54
|
+
/**
|
|
55
|
+
* What the scene is drawn into when the composite exists.
|
|
56
|
+
*
|
|
57
|
+
* `rgba16float` where the profile asks for an HDR scene, because that is the whole point of one:
|
|
58
|
+
* a bright pixel keeps its range until the tone curve, instead of being clipped at 1 by the mesh
|
|
59
|
+
* pass and then tone-mapped from a value that has already lost the information. `renderer.ts`
|
|
60
|
+
* calls the same option `hdrScene` and `keepsRange` for the same reason — a bloom threshold in
|
|
61
|
+
* scene units means nothing against a clamped buffer.
|
|
62
|
+
*/
|
|
63
|
+
export function sceneColorFormat(hdr) {
|
|
64
|
+
return hdr ? 'rgba16float' : 'rgba8unorm';
|
|
65
|
+
}
|
|
66
|
+
/** A single-sample depth the generated shaders can sample. See the module comment. */
|
|
67
|
+
export const RESOLVED_DEPTH_FORMAT = 'r32float';
|
|
68
|
+
/**
|
|
69
|
+
* Sample zero of a multisampled depth buffer, written to a colour target.
|
|
70
|
+
*
|
|
71
|
+
* **Because WebGPU cannot resolve depth.** `blitFramebuffer` does it on the other backend and
|
|
72
|
+
* this has no equivalent, so the choice is between this and switching occlusion off at any
|
|
73
|
+
* sample count above one. Sample zero rather than an average, deliberately: occlusion and
|
|
74
|
+
* reprojection both want *a* surface's depth, and the mean of four samples across a silhouette
|
|
75
|
+
* is a depth where no surface is — which reads as a halo along every edge.
|
|
76
|
+
*/
|
|
77
|
+
const DEPTH_RESOLVE_WGSL = `
|
|
78
|
+
@group(0) @binding(0) var source: texture_depth_multisampled_2d;
|
|
79
|
+
|
|
80
|
+
@vertex
|
|
81
|
+
fn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
|
|
82
|
+
let x = f32((index << 1u) & 2u);
|
|
83
|
+
let y = f32(index & 2u);
|
|
84
|
+
return vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@fragment
|
|
88
|
+
fn fragmentMain(@builtin(position) position: vec4<f32>) -> @location(0) f32 {
|
|
89
|
+
return textureLoad(source, vec2<i32>(position.xy), 0);
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
/** The same, for a frame drawn at one sample: a plain copy so the composite has one input shape. */
|
|
93
|
+
const DEPTH_COPY_WGSL = `
|
|
94
|
+
@group(0) @binding(0) var source: texture_depth_2d;
|
|
95
|
+
|
|
96
|
+
@vertex
|
|
97
|
+
fn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
|
|
98
|
+
let x = f32((index << 1u) & 2u);
|
|
99
|
+
let y = f32(index & 2u);
|
|
100
|
+
return vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@fragment
|
|
104
|
+
fn fragmentMain(@builtin(position) position: vec4<f32>) -> @location(0) f32 {
|
|
105
|
+
return textureLoad(source, vec2<i32>(position.xy), 0);
|
|
106
|
+
}
|
|
107
|
+
`;
|
|
108
|
+
export function createDepthResolveLayout(device, multisampled) {
|
|
109
|
+
return device.createBindGroupLayout({
|
|
110
|
+
label: 'post.depthResolveLayout',
|
|
111
|
+
entries: [
|
|
112
|
+
{
|
|
113
|
+
binding: 0,
|
|
114
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
115
|
+
texture: { sampleType: 'depth', multisampled },
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export function depthResolvePipeline(cache, device, layout, multisampled) {
|
|
121
|
+
return cache.get(`post.depthResolve:${multisampled}`, () => {
|
|
122
|
+
const module = shaderModule(device, {
|
|
123
|
+
label: 'post.depthResolve',
|
|
124
|
+
code: multisampled ? DEPTH_RESOLVE_WGSL : DEPTH_COPY_WGSL,
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
label: `post.depthResolve:${multisampled}`,
|
|
128
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
129
|
+
vertex: { module, entryPoint: 'vertexMain' },
|
|
130
|
+
fragment: {
|
|
131
|
+
module,
|
|
132
|
+
entryPoint: 'fragmentMain',
|
|
133
|
+
targets: [{ format: RESOLVED_DEPTH_FORMAT }],
|
|
134
|
+
},
|
|
135
|
+
primitive: { topology: 'triangle-list' },
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* One texture, one sampler, one uniform block: the shape every stage of this chain has.
|
|
141
|
+
*
|
|
142
|
+
* The bloom stages and the occlusion blur all read a source and a size, so they share a layout
|
|
143
|
+
* builder rather than three copies of the same six lines.
|
|
144
|
+
*/
|
|
145
|
+
export function createPostStageLayout(device, uniformBinding, uniformSize, textures) {
|
|
146
|
+
const entries = [
|
|
147
|
+
{
|
|
148
|
+
binding: uniformBinding,
|
|
149
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
150
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: uniformSize },
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
for (const { binding, filterable = true, dimension = '2d' } of textures) {
|
|
154
|
+
/*
|
|
155
|
+
* **The resolved depth is `r32float`, which is `UnfilterableFloat` and nothing else.**
|
|
156
|
+
*
|
|
157
|
+
* The colour inputs are ordinary render targets and filter fine; this one does not, and
|
|
158
|
+
* declaring it alongside them is rejected in the words this backend has now heard three
|
|
159
|
+
* times: *"None of the supported sample types (UnfilterableFloat) of [Texture
|
|
160
|
+
* "post.resolvedDepth"] match the expected sample types (Float)"*. `depthPass.ts` learned
|
|
161
|
+
* it on a shadow map and `flatPass.ts` on the environment cube; the lesson is that a
|
|
162
|
+
* texture's filterability is a property of its format and never of the pass using it.
|
|
163
|
+
*
|
|
164
|
+
* `r16float` would filter, and would throw away the depth precision occlusion and
|
|
165
|
+
* reprojection are built on. So the format stays and the declaration bends.
|
|
166
|
+
*/
|
|
167
|
+
entries.push({
|
|
168
|
+
binding: binding.texture,
|
|
169
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
170
|
+
texture: filterable
|
|
171
|
+
? { viewDimension: dimension }
|
|
172
|
+
: { sampleType: 'unfilterable-float', viewDimension: dimension },
|
|
173
|
+
});
|
|
174
|
+
entries.push({
|
|
175
|
+
binding: binding.sampler,
|
|
176
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
177
|
+
sampler: { type: filterable ? 'filtering' : 'non-filtering' },
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return device.createBindGroupLayout({ label: 'post.stageLayout', entries });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Additive, for the way back up the bloom pyramid.
|
|
184
|
+
*
|
|
185
|
+
* Each level is added *into* the one above it rather than replacing it, so level 0 ends up
|
|
186
|
+
* holding every octave at once — which is what makes the falloff the sum of the octaves rather
|
|
187
|
+
* than one kernel's. `bloomPass.ts` reaches the same place with `blendFunc(ONE, ONE)` and a
|
|
188
|
+
* `loadOp` of `load` is the other half of it here: a cleared attachment would discard the
|
|
189
|
+
* level the downsample just wrote and add the octave to nothing.
|
|
190
|
+
*/
|
|
191
|
+
/**
|
|
192
|
+
* What composites the order-independent buffers over the finished scene.
|
|
193
|
+
*
|
|
194
|
+
* Against a fragment carrying the average colour and the revealage, this computes
|
|
195
|
+
* `average * (1 - reveal) + scene * reveal` — which is the resolve. Doing it in the blend rather
|
|
196
|
+
* than by sampling means the pass never reads the target it writes.
|
|
197
|
+
*/
|
|
198
|
+
export const OIT_COMPOSITE_BLEND = {
|
|
199
|
+
color: { srcFactor: 'one-minus-src-alpha', dstFactor: 'src-alpha', operation: 'add' },
|
|
200
|
+
alpha: { srcFactor: 'one-minus-src-alpha', dstFactor: 'src-alpha', operation: 'add' },
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* What a drawn decal does to the pixel under it: `dst * src`.
|
|
204
|
+
*
|
|
205
|
+
* White is the identity, so a fragment the projector missed changes nothing and the shader needs
|
|
206
|
+
* no branch and no discard. It multiplies the *lit* pixel, which is the whole reason a mark placed
|
|
207
|
+
* this late still takes the receiver's lighting — `decalProject.ts` argues that where it is
|
|
208
|
+
* written, and `decalPass.ts` sets the same pair on the other backend.
|
|
209
|
+
*/
|
|
210
|
+
/**
|
|
211
|
+
* What a global medium does to the pixel under it: `dst * transmittance + inscatter`.
|
|
212
|
+
*
|
|
213
|
+
* **The transfer equation for one segment, written as a blend state.** The march puts scattered
|
|
214
|
+
* light in `rgb` and how much of the frame survives the journey in `a`, so `(one, src-alpha)` is
|
|
215
|
+
* exactly the integral — and the composite therefore never samples the colour it is modifying,
|
|
216
|
+
* which is the read both backends are entitled to call undefined.
|
|
217
|
+
*
|
|
218
|
+
* Alpha is `(zero, one)`: the frame's own alpha is not the medium's to spend. The scene target
|
|
219
|
+
* carries it to the canvas, and a medium that wrote there would make a foggy frame translucent.
|
|
220
|
+
*/
|
|
221
|
+
export const MEDIUM_TRANSMIT_BLEND = {
|
|
222
|
+
color: { srcFactor: 'one', dstFactor: 'src-alpha', operation: 'add' },
|
|
223
|
+
alpha: { srcFactor: 'zero', dstFactor: 'one', operation: 'add' },
|
|
224
|
+
};
|
|
225
|
+
export const DECAL_MULTIPLY_BLEND = {
|
|
226
|
+
color: { srcFactor: 'zero', dstFactor: 'src', operation: 'add' },
|
|
227
|
+
alpha: { srcFactor: 'zero', dstFactor: 'src', operation: 'add' },
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* `over`, against colour a pass has already multiplied by its own coverage.
|
|
231
|
+
*
|
|
232
|
+
* What the screen-space reflection writes and what composites it: the trace multiplies what it
|
|
233
|
+
* found by how much of it lands, so two reflective surfaces overlapping layer the way two blended
|
|
234
|
+
* surfaces do rather than the way two independent guesses do — and the resolve then never has to
|
|
235
|
+
* sample the colour it is compositing onto.
|
|
236
|
+
*/
|
|
237
|
+
export const PREMULTIPLIED_OVER_BLEND = {
|
|
238
|
+
color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
239
|
+
alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
|
|
240
|
+
};
|
|
241
|
+
export const ADDITIVE_BLEND = {
|
|
242
|
+
color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
|
|
243
|
+
alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
|
|
244
|
+
};
|
|
245
|
+
/** A fullscreen pass over one or more inputs, writing to one colour target. */
|
|
246
|
+
export function postPipeline(cache, device, layout, key, fragment, format, blend) {
|
|
247
|
+
return cache.get(key, () => ({
|
|
248
|
+
label: key,
|
|
249
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
250
|
+
vertex: {
|
|
251
|
+
module: shaderModule(device, { label: 'post.vert', code: FULLSCREEN_VERT_WGSL }),
|
|
252
|
+
entryPoint: 'main',
|
|
253
|
+
},
|
|
254
|
+
fragment: {
|
|
255
|
+
module: shaderModule(device, { label: key, code: fragment }),
|
|
256
|
+
entryPoint: 'main',
|
|
257
|
+
targets: [blend === undefined ? { format } : { format, blend }],
|
|
258
|
+
},
|
|
259
|
+
/*
|
|
260
|
+
* No depth at all, which is what makes this different from every other pipeline here: the
|
|
261
|
+
* composite writes over a finished frame and has nothing to sort against. `sceneTarget.ts`
|
|
262
|
+
* disables the test, the write and culling by hand for the same draw.
|
|
263
|
+
*/
|
|
264
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
265
|
+
}));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The temporal resolve's block and its three inputs.
|
|
269
|
+
*
|
|
270
|
+
* Named like the occlusion's beside it, and for the same reason `BLOOM_DOWNSAMPLE_FIELDS` is: a
|
|
271
|
+
* block read by assumption rather than by name is a uniform written to the wrong offset, which
|
|
272
|
+
* draws a plausible picture.
|
|
273
|
+
*/
|
|
274
|
+
export const TAA_FRAG_FIELDS = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.fields;
|
|
275
|
+
export const TAA_FRAG_SIZE = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.uniformSize;
|
|
276
|
+
export const TAA_UNIFORMS = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.uniforms;
|
|
277
|
+
export const TAA_TEXTURES = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.textures;
|
|
278
|
+
/**
|
|
279
|
+
* The order-independent resolve's inputs. It has no uniform block of its own — the whole pass is
|
|
280
|
+
* two texture fetches and a divide — so only the textures are named here.
|
|
281
|
+
*/
|
|
282
|
+
export const OIT_TEXTURES = OIT_BINDINGS.OIT_RESOLVE_FRAG.textures;
|
|
283
|
+
/**
|
|
284
|
+
* A drawn decal's block and the one texture it reads.
|
|
285
|
+
*
|
|
286
|
+
* One block per mark and a frame may draw many, so the buffer holds an aligned slot each and the
|
|
287
|
+
* pass binds by dynamic offset — the arrangement the bloom chain already uses, and for the same
|
|
288
|
+
* reason: `queue.writeBuffer` does not interleave with recorded commands, so one block rewritten
|
|
289
|
+
* between two passes gives both passes the last write.
|
|
290
|
+
*/
|
|
291
|
+
export const DECAL_FRAG_FIELDS = DECAL_BINDINGS.DECAL_PROJECT_FRAG.fields;
|
|
292
|
+
export const DECAL_FRAG_SIZE = DECAL_BINDINGS.DECAL_PROJECT_FRAG.uniformSize;
|
|
293
|
+
export const DECAL_UNIFORMS = DECAL_BINDINGS.DECAL_PROJECT_FRAG.uniforms;
|
|
294
|
+
export const DECAL_TEXTURES = DECAL_BINDINGS.DECAL_PROJECT_FRAG.textures;
|
|
295
|
+
/**
|
|
296
|
+
* The reflection trace's block and its two inputs, and the resolve's one.
|
|
297
|
+
*
|
|
298
|
+
* One block per surface and a frame may draw several, so the buffer holds an aligned slot each and
|
|
299
|
+
* the pass binds by dynamic offset — the arrangement the bloom chain and the decals already use,
|
|
300
|
+
* and for the reason `bloomStaging` states: `queue.writeBuffer` does not interleave with recorded
|
|
301
|
+
* commands, so one block rewritten between two passes gives both passes the last write.
|
|
302
|
+
*/
|
|
303
|
+
export const SSR_FRAG_FIELDS = SSR_BINDINGS.SSR_TRACE_FRAG.fields;
|
|
304
|
+
export const SSR_FRAG_SIZE = SSR_BINDINGS.SSR_TRACE_FRAG.uniformSize;
|
|
305
|
+
export const SSR_UNIFORMS = SSR_BINDINGS.SSR_TRACE_FRAG.uniforms;
|
|
306
|
+
export const SSR_TEXTURES = SSR_BINDINGS.SSR_TRACE_FRAG.textures;
|
|
307
|
+
export const SSR_RESOLVE_TEXTURES = SSR_RESOLVE_BINDINGS.SSR_RESOLVE_FRAG.textures;
|
|
308
|
+
/**
|
|
309
|
+
* The resolve's layout: one texture and no uniform block.
|
|
310
|
+
*
|
|
311
|
+
* `createPostStageLayout` cannot express this — it makes a block mandatory, every other stage in
|
|
312
|
+
* the chain having one — and this pass has nothing to parameterise: it fetches a texel and hands it
|
|
313
|
+
* to the blend state. A buffer allocated, bound and never read is worse than a second builder.
|
|
314
|
+
*/
|
|
315
|
+
export function createSsrResolveLayout(device) {
|
|
316
|
+
const binding = SSR_RESOLVE_TEXTURES.uSsrReflection;
|
|
317
|
+
return device.createBindGroupLayout({
|
|
318
|
+
label: 'post.ssrResolveLayout',
|
|
319
|
+
entries: [
|
|
320
|
+
{
|
|
321
|
+
binding: binding.texture,
|
|
322
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
323
|
+
texture: { viewDimension: '2d' },
|
|
324
|
+
},
|
|
325
|
+
{ binding: binding.sampler, visibility: VISIBILITY_FRAGMENT, sampler: { type: 'filtering' } },
|
|
326
|
+
],
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* The resolve's layout: two textures and no uniform block.
|
|
331
|
+
*
|
|
332
|
+
* **`createPostStageLayout` cannot express this**, because every other pass in the chain has a
|
|
333
|
+
* block and it makes one mandatory. This pass has nothing to parameterise — it fetches the two
|
|
334
|
+
* buffers, divides and hands the result to the blend state — so a layout with a uniform binding
|
|
335
|
+
* nothing writes would be a buffer allocated, bound and never read.
|
|
336
|
+
*/
|
|
337
|
+
export function createOitResolveLayout(device) {
|
|
338
|
+
const entries = [];
|
|
339
|
+
for (const binding of [OIT_TEXTURES.uOitAccum, OIT_TEXTURES.uOitReveal]) {
|
|
340
|
+
entries.push({
|
|
341
|
+
binding: binding.texture,
|
|
342
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
343
|
+
texture: { viewDimension: '2d' },
|
|
344
|
+
});
|
|
345
|
+
entries.push({
|
|
346
|
+
binding: binding.sampler,
|
|
347
|
+
visibility: VISIBILITY_FRAGMENT,
|
|
348
|
+
sampler: { type: 'filtering' },
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return device.createBindGroupLayout({ label: 'post.oitResolveLayout', entries });
|
|
352
|
+
}
|
|
353
|
+
export { MEDIUM_FRAG_WGSL, MEDIUM_UPSAMPLE_FRAG_WGSL };
|
|
354
|
+
export const MEDIUM_UNIFORMS = MEDIUM_BINDINGS.MEDIUM_FRAG.uniforms;
|
|
355
|
+
export const MEDIUM_TEXTURES = MEDIUM_BINDINGS.MEDIUM_FRAG.textures;
|
|
356
|
+
export const MEDIUM_UPSAMPLE_UNIFORMS = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.uniforms;
|
|
357
|
+
export const MEDIUM_UPSAMPLE_TEXTURES = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.textures;
|
|
358
|
+
export { RUSH_FRAG_WGSL, AO_FRAG_WGSL, AO_BLUR_FRAG_WGSL, TEMPORAL_RESOLVE_FRAG_WGSL, OIT_RESOLVE_FRAG_WGSL, DECAL_PROJECT_FRAG_WGSL, SSR_TRACE_FRAG_WGSL, SSR_RESOLVE_FRAG_WGSL, };
|
|
359
|
+
export { BLOOM_PREFILTER_FRAG_WGSL, BLOOM_DOWNSAMPLE_FRAG_WGSL, BLOOM_UPSAMPLE_FRAG_WGSL };
|
|
360
|
+
export { RUSH_UNIFORMS, RUSH_TEXTURES };
|
|
361
|
+
export const AO_UNIFORMS = AO_BINDINGS.AO_FRAG.uniforms;
|
|
362
|
+
export const AO_TEXTURES = AO_BINDINGS.AO_FRAG.textures;
|
|
363
|
+
export const AO_BLUR_UNIFORMS = AO_BINDINGS.AO_BLUR_FRAG.uniforms;
|
|
364
|
+
export const AO_BLUR_TEXTURES = AO_BINDINGS.AO_BLUR_FRAG.textures;
|
|
365
|
+
export const BLOOM_UNIFORMS = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.uniforms;
|
|
366
|
+
export const BLOOM_TEXTURES = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.textures;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The room, captured into a cubemap so reflective surfaces can mirror it.
|
|
4
|
+
*
|
|
5
|
+
* `reflectionProbe.ts` carries the argument for the feature: a reflection is an improvement to
|
|
6
|
+
* an appearance rather than a requirement, the scene still renders without one, and a device
|
|
7
|
+
* that cannot afford six faces keeps everything else.
|
|
8
|
+
*
|
|
9
|
+
* **Two things differ from the other backend and both are the same difference.** WebGPU has no
|
|
10
|
+
* `generateMipmap`, and the chain here *is* the roughness — a polished surface samples level 0
|
|
11
|
+
* and a satin one samples further up, which is a blur that costs a fetch rather than a pass. So
|
|
12
|
+
* the chain is built by rendering each level from the one above it, six faces at a time, with a
|
|
13
|
+
* blit that samples a **cube** rather than a 2D texture.
|
|
14
|
+
*/
|
|
15
|
+
/** Where each face looks, in the order a cubemap's layers are indexed. */
|
|
16
|
+
export declare const PROBE_FACES: readonly {
|
|
17
|
+
readonly yaw: number;
|
|
18
|
+
readonly pitch: number;
|
|
19
|
+
}[];
|
|
20
|
+
export declare const PROBE_FOV_DEG = 90;
|
|
21
|
+
export declare const PROBE_NEAR_M = 0.1;
|
|
22
|
+
export declare const PROBE_FAR_M = 200;
|
|
23
|
+
/** `basisX`, `basisY`, `forward`, `level` — four vec4s, so one aligned block. */
|
|
24
|
+
export declare const PROBE_MIP_UNIFORM_SIZE = 64;
|
|
25
|
+
/**
|
|
26
|
+
* The axes of each cube face, as the direction of its centre and its two in-plane steps.
|
|
27
|
+
*
|
|
28
|
+
* Written out rather than derived from the yaw and pitch above, because a cube's face basis has
|
|
29
|
+
* a handedness convention that a camera does not: getting one sign wrong mirrors a single face
|
|
30
|
+
* of the blur and shows up as one edge of a reflection that does not line up.
|
|
31
|
+
*/
|
|
32
|
+
export declare const PROBE_FACE_BASIS: readonly {
|
|
33
|
+
readonly forward: readonly [number, number, number];
|
|
34
|
+
readonly basisX: readonly [number, number, number];
|
|
35
|
+
readonly basisY: readonly [number, number, number];
|
|
36
|
+
}[];
|
|
37
|
+
export declare function createProbeMipBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
38
|
+
export declare function probeMipPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout, format: GPUTextureFormat): GPURenderPipeline;
|
|
39
|
+
/** How many levels a cube of this size has, counting the one the bake fills. */
|
|
40
|
+
export declare function probeLevels(size: number): number;
|
|
41
|
+
/**
|
|
42
|
+
* The convolution's bind group, whose numbering is the generator's rather than this file's.
|
|
43
|
+
*
|
|
44
|
+
* **It cannot share `probe.mipLayout` and the reason is worth stating.** That layout was written
|
|
45
|
+
* by hand and numbered 0, 1, 2. The prefilter's WGSL is generated from GLSL, and the transform
|
|
46
|
+
* assigns its own numbers — the uniform block at 1 and a combined sampler split into a texture at
|
|
47
|
+
* 32 and a sampler at 33. Reusing the hand-written layout would be a pipeline whose bind group
|
|
48
|
+
* does not match its shader, which WebGPU reports at `finish` rather than at the call that caused
|
|
49
|
+
* it, as no picture from a frame that recorded correctly.
|
|
50
|
+
*
|
|
51
|
+
* The numbers are read from `PREFILTER_BINDINGS` rather than written again here, so the generator
|
|
52
|
+
* moving one cannot leave this silently wrong.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createProbePrefilterBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
55
|
+
/**
|
|
56
|
+
* Where each field lands in the convolution's uniform block, from the generator's own table.
|
|
57
|
+
*
|
|
58
|
+
* Restating these as literals at the write site is how a struct layout and its writer drift, and
|
|
59
|
+
* the drift is invisible: a roughness written at the wrong offset is a level convolved for some
|
|
60
|
+
* other roughness, which looks like a plausible reflection.
|
|
61
|
+
*/
|
|
62
|
+
export declare const PREFILTER_UNIFORM_OFFSETS: {
|
|
63
|
+
readonly uPrefilterEdge: {
|
|
64
|
+
readonly offset: 0;
|
|
65
|
+
readonly size: 4;
|
|
66
|
+
readonly type: "float";
|
|
67
|
+
};
|
|
68
|
+
readonly uPrefilterIrradiance: {
|
|
69
|
+
readonly offset: 4;
|
|
70
|
+
readonly size: 4;
|
|
71
|
+
readonly type: "float";
|
|
72
|
+
};
|
|
73
|
+
readonly uPrefilterBox: {
|
|
74
|
+
readonly offset: 8;
|
|
75
|
+
readonly size: 4;
|
|
76
|
+
readonly type: "float";
|
|
77
|
+
};
|
|
78
|
+
readonly uPrefilterLevel: {
|
|
79
|
+
readonly offset: 12;
|
|
80
|
+
readonly size: 4;
|
|
81
|
+
readonly type: "float";
|
|
82
|
+
};
|
|
83
|
+
readonly uPrefilterRoughness: {
|
|
84
|
+
readonly offset: 16;
|
|
85
|
+
readonly size: 4;
|
|
86
|
+
readonly type: "float";
|
|
87
|
+
};
|
|
88
|
+
readonly uPrefilterSamples: {
|
|
89
|
+
readonly offset: 20;
|
|
90
|
+
readonly size: 4;
|
|
91
|
+
readonly type: "float";
|
|
92
|
+
};
|
|
93
|
+
readonly uPrefilterSourceTexels: {
|
|
94
|
+
readonly offset: 24;
|
|
95
|
+
readonly size: 4;
|
|
96
|
+
readonly type: "float";
|
|
97
|
+
};
|
|
98
|
+
readonly uPrefilterSourceMaxLod: {
|
|
99
|
+
readonly offset: 28;
|
|
100
|
+
readonly size: 4;
|
|
101
|
+
readonly type: "float";
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/** The generator's binding numbers, named once so a bind group and its layout cannot disagree. */
|
|
105
|
+
export declare const PREFILTER_UNIFORM_BINDING: 1;
|
|
106
|
+
export declare const PREFILTER_TEXTURE_BINDING: 32;
|
|
107
|
+
export declare const PREFILTER_SAMPLER_BINDING: 33;
|
|
108
|
+
export declare function probePrefilterPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout, format: GPUTextureFormat): GPURenderPipeline;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { FULLSCREEN_VERT_WGSL } from '../../shaders/generated/fullscreen.wgsl.js';
|
|
2
|
+
import { PREFILTER_BINDINGS, PREFILTER_FRAG_WGSL } from '../../shaders/generated/prefilter.wgsl.js';
|
|
3
|
+
import { shaderModule } from './shaderModules.js';
|
|
4
|
+
/**
|
|
5
|
+
* The room, captured into a cubemap so reflective surfaces can mirror it.
|
|
6
|
+
*
|
|
7
|
+
* `reflectionProbe.ts` carries the argument for the feature: a reflection is an improvement to
|
|
8
|
+
* an appearance rather than a requirement, the scene still renders without one, and a device
|
|
9
|
+
* that cannot afford six faces keeps everything else.
|
|
10
|
+
*
|
|
11
|
+
* **Two things differ from the other backend and both are the same difference.** WebGPU has no
|
|
12
|
+
* `generateMipmap`, and the chain here *is* the roughness — a polished surface samples level 0
|
|
13
|
+
* and a satin one samples further up, which is a blur that costs a fetch rather than a pass. So
|
|
14
|
+
* the chain is built by rendering each level from the one above it, six faces at a time, with a
|
|
15
|
+
* blit that samples a **cube** rather than a 2D texture.
|
|
16
|
+
*/
|
|
17
|
+
/** Where each face looks, in the order a cubemap's layers are indexed. */
|
|
18
|
+
export const PROBE_FACES = [
|
|
19
|
+
{ yaw: Math.PI / 2, pitch: 0 },
|
|
20
|
+
{ yaw: -Math.PI / 2, pitch: 0 },
|
|
21
|
+
{ yaw: 0, pitch: Math.PI / 2 },
|
|
22
|
+
{ yaw: 0, pitch: -Math.PI / 2 },
|
|
23
|
+
/*
|
|
24
|
+
* **`+Z` is yaw `PI`, not yaw 0, and these two were the wrong way round.**
|
|
25
|
+
*
|
|
26
|
+
* `Camera`'s convention is that yaw 0 looks toward **-Z** and positive yaw turns toward +X, so
|
|
27
|
+
* cubemap layer 4, which the hardware reads as +Z, has to be rendered from yaw `PI`. This table
|
|
28
|
+
* had layer 4 at yaw 0, which put the -Z view in the +Z slot and the +Z view in the -Z slot —
|
|
29
|
+
* and it contradicted `PROBE_FACE_BASIS` in this same file, which has always said layer 4 is
|
|
30
|
+
* `forward: [0, 0, 1]`. `reflectionProbe.ts`'s table on the other backend has always been right.
|
|
31
|
+
*
|
|
32
|
+
* **It survived because a reflection of a swapped pair still looks like a reflection.** What
|
|
33
|
+
* finally separated them was projecting both backends' cubes onto spherical harmonics with one
|
|
34
|
+
* shared basis: every coefficient agreed except the linear Z, which came back +0.005 on one and
|
|
35
|
+
* -0.003 on the other. A sign, on the one axis these two faces span.
|
|
36
|
+
*/
|
|
37
|
+
{ yaw: Math.PI, pitch: 0 },
|
|
38
|
+
{ yaw: 0, pitch: 0 },
|
|
39
|
+
];
|
|
40
|
+
export const PROBE_FOV_DEG = 90;
|
|
41
|
+
export const PROBE_NEAR_M = 0.1;
|
|
42
|
+
export const PROBE_FAR_M = 200;
|
|
43
|
+
/**
|
|
44
|
+
* The blur that fills one mip level of one face from the level above.
|
|
45
|
+
*
|
|
46
|
+
* **Directions, not texture coordinates.** A cube level cannot be filled by sampling the 2D
|
|
47
|
+
* face above it: the neighbouring texels across an edge belong to a different face, and taking
|
|
48
|
+
* them from the same face is exactly how a seam appears along every edge. So the fragment
|
|
49
|
+
* rebuilds the direction its texel stands for and samples the cube, which crosses edges the way
|
|
50
|
+
* the hardware does when the shader reads it later.
|
|
51
|
+
*/
|
|
52
|
+
const PROBE_MIP_WGSL = `
|
|
53
|
+
struct Face { basisX: vec4<f32>, basisY: vec4<f32>, forward: vec4<f32>, level: vec4<f32> }
|
|
54
|
+
@group(0) @binding(0) var<uniform> face: Face;
|
|
55
|
+
@group(0) @binding(1) var source: texture_cube<f32>;
|
|
56
|
+
@group(0) @binding(2) var samp: sampler;
|
|
57
|
+
|
|
58
|
+
struct Varying {
|
|
59
|
+
@builtin(position) position: vec4<f32>,
|
|
60
|
+
@location(0) uv: vec2<f32>,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@vertex
|
|
64
|
+
fn vertexMain(@builtin(vertex_index) index: u32) -> Varying {
|
|
65
|
+
var out: Varying;
|
|
66
|
+
let x = f32((index << 1u) & 2u);
|
|
67
|
+
let y = f32(index & 2u);
|
|
68
|
+
out.uv = vec2<f32>(x, y);
|
|
69
|
+
out.position = vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@fragment
|
|
74
|
+
fn fragmentMain(in: Varying) -> @location(0) vec4<f32> {
|
|
75
|
+
// The texel's place on the face, in [-1, 1], and the direction it stands for.
|
|
76
|
+
let plane = in.uv * 2.0 - 1.0;
|
|
77
|
+
let dir = normalize(face.forward.xyz + face.basisX.xyz * plane.x + face.basisY.xyz * plane.y);
|
|
78
|
+
return textureSampleLevel(source, samp, dir, face.level.x);
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
/** `basisX`, `basisY`, `forward`, `level` — four vec4s, so one aligned block. */
|
|
82
|
+
export const PROBE_MIP_UNIFORM_SIZE = 64;
|
|
83
|
+
/**
|
|
84
|
+
* The axes of each cube face, as the direction of its centre and its two in-plane steps.
|
|
85
|
+
*
|
|
86
|
+
* Written out rather than derived from the yaw and pitch above, because a cube's face basis has
|
|
87
|
+
* a handedness convention that a camera does not: getting one sign wrong mirrors a single face
|
|
88
|
+
* of the blur and shows up as one edge of a reflection that does not line up.
|
|
89
|
+
*/
|
|
90
|
+
export const PROBE_FACE_BASIS = [
|
|
91
|
+
{ forward: [1, 0, 0], basisX: [0, 0, -1], basisY: [0, -1, 0] },
|
|
92
|
+
{ forward: [-1, 0, 0], basisX: [0, 0, 1], basisY: [0, -1, 0] },
|
|
93
|
+
{ forward: [0, 1, 0], basisX: [1, 0, 0], basisY: [0, 0, 1] },
|
|
94
|
+
{ forward: [0, -1, 0], basisX: [1, 0, 0], basisY: [0, 0, -1] },
|
|
95
|
+
{ forward: [0, 0, 1], basisX: [1, 0, 0], basisY: [0, -1, 0] },
|
|
96
|
+
{ forward: [0, 0, -1], basisX: [-1, 0, 0], basisY: [0, -1, 0] },
|
|
97
|
+
];
|
|
98
|
+
export function createProbeMipBindGroupLayout(device) {
|
|
99
|
+
return device.createBindGroupLayout({
|
|
100
|
+
label: 'probe.mipLayout',
|
|
101
|
+
entries: [
|
|
102
|
+
{
|
|
103
|
+
binding: 0,
|
|
104
|
+
visibility: 0x1 | 0x2,
|
|
105
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: PROBE_MIP_UNIFORM_SIZE },
|
|
106
|
+
},
|
|
107
|
+
{ binding: 1, visibility: 0x2, texture: { viewDimension: 'cube' } },
|
|
108
|
+
{ binding: 2, visibility: 0x2, sampler: {} },
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export function probeMipPipeline(cache, device, layout, format) {
|
|
113
|
+
return cache.get(`probe.mip:${format}`, () => {
|
|
114
|
+
const module = shaderModule(device, { label: 'probe.mip', code: PROBE_MIP_WGSL });
|
|
115
|
+
return {
|
|
116
|
+
label: `probe.mip:${format}`,
|
|
117
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
118
|
+
vertex: { module, entryPoint: 'vertexMain' },
|
|
119
|
+
fragment: { module, entryPoint: 'fragmentMain', targets: [{ format }] },
|
|
120
|
+
primitive: { topology: 'triangle-list' },
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/** How many levels a cube of this size has, counting the one the bake fills. */
|
|
125
|
+
export function probeLevels(size) {
|
|
126
|
+
return Math.floor(Math.log2(size)) + 1;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The convolution's bind group, whose numbering is the generator's rather than this file's.
|
|
130
|
+
*
|
|
131
|
+
* **It cannot share `probe.mipLayout` and the reason is worth stating.** That layout was written
|
|
132
|
+
* by hand and numbered 0, 1, 2. The prefilter's WGSL is generated from GLSL, and the transform
|
|
133
|
+
* assigns its own numbers — the uniform block at 1 and a combined sampler split into a texture at
|
|
134
|
+
* 32 and a sampler at 33. Reusing the hand-written layout would be a pipeline whose bind group
|
|
135
|
+
* does not match its shader, which WebGPU reports at `finish` rather than at the call that caused
|
|
136
|
+
* it, as no picture from a frame that recorded correctly.
|
|
137
|
+
*
|
|
138
|
+
* The numbers are read from `PREFILTER_BINDINGS` rather than written again here, so the generator
|
|
139
|
+
* moving one cannot leave this silently wrong.
|
|
140
|
+
*/
|
|
141
|
+
export function createProbePrefilterBindGroupLayout(device) {
|
|
142
|
+
const bindings = PREFILTER_BINDINGS.PREFILTER_FRAG;
|
|
143
|
+
const source = bindings.textures.uPrefilterSource;
|
|
144
|
+
return device.createBindGroupLayout({
|
|
145
|
+
label: 'probe.prefilterLayout',
|
|
146
|
+
entries: [
|
|
147
|
+
{
|
|
148
|
+
binding: bindings.uniforms,
|
|
149
|
+
visibility: 0x1 | 0x2,
|
|
150
|
+
buffer: {
|
|
151
|
+
type: 'uniform',
|
|
152
|
+
hasDynamicOffset: true,
|
|
153
|
+
minBindingSize: PROBE_MIP_UNIFORM_SIZE,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{ binding: source.texture, visibility: 0x2, texture: { viewDimension: 'cube' } },
|
|
157
|
+
{ binding: source.sampler, visibility: 0x2, sampler: {} },
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Where each field lands in the convolution's uniform block, from the generator's own table.
|
|
163
|
+
*
|
|
164
|
+
* Restating these as literals at the write site is how a struct layout and its writer drift, and
|
|
165
|
+
* the drift is invisible: a roughness written at the wrong offset is a level convolved for some
|
|
166
|
+
* other roughness, which looks like a plausible reflection.
|
|
167
|
+
*/
|
|
168
|
+
export const PREFILTER_UNIFORM_OFFSETS = PREFILTER_BINDINGS.PREFILTER_FRAG.fields;
|
|
169
|
+
/** The generator's binding numbers, named once so a bind group and its layout cannot disagree. */
|
|
170
|
+
export const PREFILTER_UNIFORM_BINDING = PREFILTER_BINDINGS.PREFILTER_FRAG.uniforms;
|
|
171
|
+
export const PREFILTER_TEXTURE_BINDING = PREFILTER_BINDINGS.PREFILTER_FRAG.textures.uPrefilterSource.texture;
|
|
172
|
+
export const PREFILTER_SAMPLER_BINDING = PREFILTER_BINDINGS.PREFILTER_FRAG.textures.uPrefilterSource.sampler;
|
|
173
|
+
export function probePrefilterPipeline(cache, device, layout, format) {
|
|
174
|
+
return cache.get(`probe.prefilter:${format}`, () => ({
|
|
175
|
+
label: `probe.prefilter:${format}`,
|
|
176
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
177
|
+
vertex: {
|
|
178
|
+
module: shaderModule(device, { label: 'probe.prefilter.vert', code: FULLSCREEN_VERT_WGSL }),
|
|
179
|
+
entryPoint: 'main',
|
|
180
|
+
},
|
|
181
|
+
fragment: {
|
|
182
|
+
module: shaderModule(device, { label: 'probe.prefilter', code: PREFILTER_FRAG_WGSL }),
|
|
183
|
+
entryPoint: 'main',
|
|
184
|
+
targets: [{ format }],
|
|
185
|
+
},
|
|
186
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
187
|
+
}));
|
|
188
|
+
}
|