@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a WebGPU frame cost, from the GPU rather than from a clock.
|
|
3
|
+
*
|
|
4
|
+
* **This backend shipped without one, and that is why a phone was slow for a release without
|
|
5
|
+
* anybody being able to say by how much.** `WebGpuRenderer.gpuTimer` was a stub reporting
|
|
6
|
+
* `available: false` and `null` forever, so every GPU figure this project has ever quoted came
|
|
7
|
+
* from WebGL2 — the backend phones do not use. The consumer's own rule is that a
|
|
8
|
+
* GPU verdict needs `gpuSamples > 0`, which on the shipping backend could never be satisfied,
|
|
9
|
+
* so the frame meter, the FPS report and the diagnostics bundle all had a hole exactly where
|
|
10
|
+
* the answer was.
|
|
11
|
+
*
|
|
12
|
+
* **Nothing here is new API.** It implements `FrameTimer`, the same interface `GpuTimer`
|
|
13
|
+
* implements over `EXT_disjoint_timer_query_webgl2`, so the game that already calls
|
|
14
|
+
* `beginFrame`, `begin('rest')`, `end`, `endFrame` and `poll` starts getting numbers without
|
|
15
|
+
* one line changing over there.
|
|
16
|
+
*
|
|
17
|
+
* **The one shape difference, and it is forced by the API.** WebGL2 brackets an arbitrary run
|
|
18
|
+
* of commands with `TIME_ELAPSED_EXT`. WebGPU cannot: a timestamp is written at the start and
|
|
19
|
+
* the end of a *render pass*, declared on the pass descriptor. So the bracket becomes an
|
|
20
|
+
* attribution rather than a measurement — `begin(slot)` records which slot is open,
|
|
21
|
+
* `writesFor` hands the next query pair to each pass the renderer opens and remembers where it
|
|
22
|
+
* belonged, and the readback sums the pass deltas per slot. A pass drawn without calling
|
|
23
|
+
* `writesFor` is GPU time the total silently omits, which is the one way to get a wrong number
|
|
24
|
+
* out of this rather than no number.
|
|
25
|
+
*
|
|
26
|
+
* **Never blocks.** A frame resolves its queries into a staging buffer and asks for the
|
|
27
|
+
* mapping; the answer lands a frame or two later and is reported then. A timer that waited for
|
|
28
|
+
* its own frame would be a stall, which is the one thing a profiler must not add.
|
|
29
|
+
*/
|
|
30
|
+
import type { FrameTimer } from '../timer.ts';
|
|
31
|
+
import { type GpuSample, type GpuSlot } from '../../gpuTimer.ts';
|
|
32
|
+
export declare class GpuTimestamps implements FrameTimer {
|
|
33
|
+
/** False where the adapter withheld `timestamp-query`, which is a normal state. */
|
|
34
|
+
readonly available: boolean;
|
|
35
|
+
private readonly querySet;
|
|
36
|
+
private readonly resolveBuffer;
|
|
37
|
+
private readonly readBuffer;
|
|
38
|
+
private readonly sampleEvery;
|
|
39
|
+
/** Which slot each timed pass of the frame being recorded belongs to. */
|
|
40
|
+
private readonly passSlots;
|
|
41
|
+
/** The same, for the frame whose readback is in flight; the recorder reuses the other. */
|
|
42
|
+
private readonly inFlightSlots;
|
|
43
|
+
private passCount;
|
|
44
|
+
private inFlightCount;
|
|
45
|
+
private openSlot;
|
|
46
|
+
private frame;
|
|
47
|
+
private measuring;
|
|
48
|
+
/** Whether this frame's queries have already been copied out; a second copy is a no-op. */
|
|
49
|
+
private resolved;
|
|
50
|
+
private readbackBusy;
|
|
51
|
+
private readonly pending;
|
|
52
|
+
private lastSample;
|
|
53
|
+
get sampling(): boolean;
|
|
54
|
+
constructor(device: GPUDevice, enabled?: boolean, sampleEvery?: number);
|
|
55
|
+
/**
|
|
56
|
+
* Whether this frame is measured. Called once per frame, before any `begin`.
|
|
57
|
+
*
|
|
58
|
+
* Declines while a readback is still in flight, and that is not politeness: the read buffer
|
|
59
|
+
* belongs to the driver until the mapping lands, and copying into a mapped buffer is a
|
|
60
|
+
* validation error rather than a slow frame.
|
|
61
|
+
*/
|
|
62
|
+
beginFrame(): boolean;
|
|
63
|
+
/** Open a bracket. Every pass opened until `end` is attributed to this slot. */
|
|
64
|
+
begin(slot: GpuSlot): void;
|
|
65
|
+
end(): void;
|
|
66
|
+
/**
|
|
67
|
+
* The query pair for the pass about to be opened, or undefined where there is nothing to
|
|
68
|
+
* measure with.
|
|
69
|
+
*
|
|
70
|
+
* Undefined is a legal value for `timestampWrites`, so a caller passes this straight into
|
|
71
|
+
* the descriptor without branching, and an unmeasured frame costs one property write.
|
|
72
|
+
*/
|
|
73
|
+
writesFor(): GPURenderPassTimestampWrites | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Copy the frame's queries out, on the frame's own encoder, before it is submitted.
|
|
76
|
+
*
|
|
77
|
+
* The renderer calls this rather than `endFrame`, because by the time the consumer ends the
|
|
78
|
+
* frame the encoder it would have to ride on has already been finished and submitted.
|
|
79
|
+
*/
|
|
80
|
+
resolve(encoder: GPUCommandEncoder): void;
|
|
81
|
+
/** Close the frame and ask for the mapping. Nothing waits for it. */
|
|
82
|
+
endFrame(): void;
|
|
83
|
+
private readBack;
|
|
84
|
+
/** The oldest finished sample, or null. Never blocks. */
|
|
85
|
+
poll(): GpuSample | null;
|
|
86
|
+
/**
|
|
87
|
+
* The whole of the last resolved frame in milliseconds, or null where nothing measured.
|
|
88
|
+
*
|
|
89
|
+
* Summed because the three brackets partition the frame rather than overlapping, which is
|
|
90
|
+
* the same arithmetic `GpuTimer.lastFrameMs` does over the same three names.
|
|
91
|
+
*/
|
|
92
|
+
lastFrameMs(): number | null;
|
|
93
|
+
dispose(): void;
|
|
94
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { GPU_SLOTS } from '../../gpuTimer.js';
|
|
2
|
+
/**
|
|
3
|
+
* Passes one frame may time.
|
|
4
|
+
*
|
|
5
|
+
* The heaviest frame measured on this engine is twenty — the game's courtyard, with three shadow
|
|
6
|
+
* layers, six cubemap faces, two mirrors and the occlusion chain. Thirty-two leaves room for a
|
|
7
|
+
* scene heavier than any that exists without allocating a query set nobody fills.
|
|
8
|
+
*/
|
|
9
|
+
const MAX_TIMED_PASSES = 32;
|
|
10
|
+
const QUERIES_PER_PASS = 2;
|
|
11
|
+
const BYTES_PER_QUERY = 8;
|
|
12
|
+
const NS_PER_MS = 1e6;
|
|
13
|
+
/** Resolved frames waiting for `poll`. Past this a frame is skipped rather than queued. */
|
|
14
|
+
const POOL_DEPTH = 4;
|
|
15
|
+
/*
|
|
16
|
+
* Numeric rather than `GPUBufferUsage.*`, matching the rest of this directory. Those globals
|
|
17
|
+
* do not exist under vitest, and a timer that cannot be constructed in a test is a timer whose
|
|
18
|
+
* arithmetic nobody checks.
|
|
19
|
+
*/
|
|
20
|
+
const USAGE_QUERY_RESOLVE = 0x0200;
|
|
21
|
+
const USAGE_COPY_SRC = 0x0004;
|
|
22
|
+
const USAGE_COPY_DST = 0x0008;
|
|
23
|
+
const USAGE_MAP_READ = 0x0001;
|
|
24
|
+
const MAP_MODE_READ = 0x0001;
|
|
25
|
+
/** Slot to index, so a frame's attribution is a `Uint8Array` and costs no allocation. */
|
|
26
|
+
const SLOT_INDEX = { shadows: 0, reflection: 1, rest: 2 };
|
|
27
|
+
export class GpuTimestamps {
|
|
28
|
+
/** False where the adapter withheld `timestamp-query`, which is a normal state. */
|
|
29
|
+
available;
|
|
30
|
+
querySet = null;
|
|
31
|
+
resolveBuffer = null;
|
|
32
|
+
readBuffer = null;
|
|
33
|
+
sampleEvery;
|
|
34
|
+
/** Which slot each timed pass of the frame being recorded belongs to. */
|
|
35
|
+
passSlots = new Uint8Array(MAX_TIMED_PASSES);
|
|
36
|
+
/** The same, for the frame whose readback is in flight; the recorder reuses the other. */
|
|
37
|
+
inFlightSlots = new Uint8Array(MAX_TIMED_PASSES);
|
|
38
|
+
passCount = 0;
|
|
39
|
+
inFlightCount = 0;
|
|
40
|
+
openSlot = null;
|
|
41
|
+
frame = 0;
|
|
42
|
+
measuring = false;
|
|
43
|
+
/** Whether this frame's queries have already been copied out; a second copy is a no-op. */
|
|
44
|
+
resolved = false;
|
|
45
|
+
readbackBusy = false;
|
|
46
|
+
pending = [];
|
|
47
|
+
lastSample = null;
|
|
48
|
+
get sampling() {
|
|
49
|
+
return this.measuring;
|
|
50
|
+
}
|
|
51
|
+
constructor(device, enabled = false, sampleEvery = 8) {
|
|
52
|
+
this.sampleEvery = Math.max(1, Math.floor(sampleEvery));
|
|
53
|
+
/*
|
|
54
|
+
* Both halves, and `enabled` is the one that matters. A timer costs two queries a pass and
|
|
55
|
+
* attaches a block to every pass descriptor in the frame, so an implementation that
|
|
56
|
+
* disagrees about any of it invalidates the command buffer and the frame draws nothing.
|
|
57
|
+
* That risk belongs to whoever asked to measure, never to every consumer by default.
|
|
58
|
+
*/
|
|
59
|
+
this.available = enabled && (device.features?.has('timestamp-query') ?? false);
|
|
60
|
+
if (!this.available)
|
|
61
|
+
return;
|
|
62
|
+
const count = MAX_TIMED_PASSES * QUERIES_PER_PASS;
|
|
63
|
+
const bytes = count * BYTES_PER_QUERY;
|
|
64
|
+
this.querySet = device.createQuerySet({ label: 'gpu.timestamps', type: 'timestamp', count });
|
|
65
|
+
/*
|
|
66
|
+
* Two buffers, because one cannot be both. `QUERY_RESOLVE` is where the driver writes and
|
|
67
|
+
* `MAP_READ` is what this side may look at, and the flags are mutually exclusive.
|
|
68
|
+
*/
|
|
69
|
+
this.resolveBuffer = device.createBuffer({
|
|
70
|
+
label: 'gpu.timestamps.resolve',
|
|
71
|
+
size: bytes,
|
|
72
|
+
usage: USAGE_QUERY_RESOLVE | USAGE_COPY_SRC,
|
|
73
|
+
});
|
|
74
|
+
this.readBuffer = device.createBuffer({
|
|
75
|
+
label: 'gpu.timestamps.read',
|
|
76
|
+
size: bytes,
|
|
77
|
+
usage: USAGE_COPY_DST | USAGE_MAP_READ,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Whether this frame is measured. Called once per frame, before any `begin`.
|
|
82
|
+
*
|
|
83
|
+
* Declines while a readback is still in flight, and that is not politeness: the read buffer
|
|
84
|
+
* belongs to the driver until the mapping lands, and copying into a mapped buffer is a
|
|
85
|
+
* validation error rather than a slow frame.
|
|
86
|
+
*/
|
|
87
|
+
beginFrame() {
|
|
88
|
+
if (this.querySet === null)
|
|
89
|
+
return false;
|
|
90
|
+
const measured = this.frame % this.sampleEvery === 0;
|
|
91
|
+
this.frame++;
|
|
92
|
+
this.measuring = measured && !this.readbackBusy && this.pending.length < POOL_DEPTH;
|
|
93
|
+
if (this.measuring) {
|
|
94
|
+
this.passCount = 0;
|
|
95
|
+
this.resolved = false;
|
|
96
|
+
this.openSlot = null;
|
|
97
|
+
}
|
|
98
|
+
return this.measuring;
|
|
99
|
+
}
|
|
100
|
+
/** Open a bracket. Every pass opened until `end` is attributed to this slot. */
|
|
101
|
+
begin(slot) {
|
|
102
|
+
if (!this.measuring || this.openSlot !== null)
|
|
103
|
+
return;
|
|
104
|
+
this.openSlot = slot;
|
|
105
|
+
}
|
|
106
|
+
end() {
|
|
107
|
+
this.openSlot = null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The query pair for the pass about to be opened, or undefined where there is nothing to
|
|
111
|
+
* measure with.
|
|
112
|
+
*
|
|
113
|
+
* Undefined is a legal value for `timestampWrites`, so a caller passes this straight into
|
|
114
|
+
* the descriptor without branching, and an unmeasured frame costs one property write.
|
|
115
|
+
*/
|
|
116
|
+
writesFor() {
|
|
117
|
+
if (!this.measuring || this.resolved || this.querySet === null)
|
|
118
|
+
return undefined;
|
|
119
|
+
if (this.passCount >= MAX_TIMED_PASSES)
|
|
120
|
+
return undefined;
|
|
121
|
+
const index = this.passCount;
|
|
122
|
+
this.passSlots[index] = SLOT_INDEX[this.openSlot ?? 'rest'];
|
|
123
|
+
this.passCount++;
|
|
124
|
+
return {
|
|
125
|
+
querySet: this.querySet,
|
|
126
|
+
beginningOfPassWriteIndex: index * QUERIES_PER_PASS,
|
|
127
|
+
endOfPassWriteIndex: index * QUERIES_PER_PASS + 1,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Copy the frame's queries out, on the frame's own encoder, before it is submitted.
|
|
132
|
+
*
|
|
133
|
+
* The renderer calls this rather than `endFrame`, because by the time the consumer ends the
|
|
134
|
+
* frame the encoder it would have to ride on has already been finished and submitted.
|
|
135
|
+
*/
|
|
136
|
+
resolve(encoder) {
|
|
137
|
+
if (!this.measuring || this.resolved || this.readbackBusy)
|
|
138
|
+
return;
|
|
139
|
+
if (this.querySet === null || this.resolveBuffer === null || this.readBuffer === null)
|
|
140
|
+
return;
|
|
141
|
+
if (this.passCount === 0)
|
|
142
|
+
return;
|
|
143
|
+
const count = this.passCount * QUERIES_PER_PASS;
|
|
144
|
+
encoder.resolveQuerySet(this.querySet, 0, count, this.resolveBuffer, 0);
|
|
145
|
+
encoder.copyBufferToBuffer(this.resolveBuffer, 0, this.readBuffer, 0, count * BYTES_PER_QUERY);
|
|
146
|
+
this.resolved = true;
|
|
147
|
+
}
|
|
148
|
+
/** Close the frame and ask for the mapping. Nothing waits for it. */
|
|
149
|
+
endFrame() {
|
|
150
|
+
if (!this.measuring)
|
|
151
|
+
return;
|
|
152
|
+
this.measuring = false;
|
|
153
|
+
this.openSlot = null;
|
|
154
|
+
if (!this.resolved || this.readbackBusy)
|
|
155
|
+
return;
|
|
156
|
+
this.inFlightSlots.set(this.passSlots);
|
|
157
|
+
this.inFlightCount = this.passCount;
|
|
158
|
+
this.readbackBusy = true;
|
|
159
|
+
this.readBack();
|
|
160
|
+
}
|
|
161
|
+
readBack() {
|
|
162
|
+
const buffer = this.readBuffer;
|
|
163
|
+
if (buffer === null)
|
|
164
|
+
return;
|
|
165
|
+
void buffer.mapAsync(MAP_MODE_READ).then(() => {
|
|
166
|
+
const stamps = new BigUint64Array(buffer.getMappedRange());
|
|
167
|
+
const parts = { shadows: 0, reflection: 0, rest: 0 };
|
|
168
|
+
for (let i = 0; i < this.inFlightCount; i++) {
|
|
169
|
+
const started = stamps[i * QUERIES_PER_PASS] ?? 0n;
|
|
170
|
+
const finished = stamps[i * QUERIES_PER_PASS + 1] ?? 0n;
|
|
171
|
+
/*
|
|
172
|
+
* A pair the driver never wrote reads as two zeros, and a disjoint one can read
|
|
173
|
+
* backwards. Both mean "no measurement", and neither is worth reporting as a
|
|
174
|
+
* confident 0.0 — see `FrameTimer` on why an invented zero is the worst answer here.
|
|
175
|
+
*/
|
|
176
|
+
if (finished <= started)
|
|
177
|
+
continue;
|
|
178
|
+
const slot = GPU_SLOTS[this.inFlightSlots[i] ?? 2] ?? 'rest';
|
|
179
|
+
parts[slot] += Number(finished - started) / NS_PER_MS;
|
|
180
|
+
}
|
|
181
|
+
buffer.unmap();
|
|
182
|
+
this.lastSample = parts;
|
|
183
|
+
if (this.pending.length < POOL_DEPTH)
|
|
184
|
+
this.pending.push(parts);
|
|
185
|
+
this.readbackBusy = false;
|
|
186
|
+
}, () => {
|
|
187
|
+
/* A lost device or a cancelled mapping is not a reason to stop drawing. */
|
|
188
|
+
this.readbackBusy = false;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** The oldest finished sample, or null. Never blocks. */
|
|
192
|
+
poll() {
|
|
193
|
+
return this.pending.shift() ?? null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* The whole of the last resolved frame in milliseconds, or null where nothing measured.
|
|
197
|
+
*
|
|
198
|
+
* Summed because the three brackets partition the frame rather than overlapping, which is
|
|
199
|
+
* the same arithmetic `GpuTimer.lastFrameMs` does over the same three names.
|
|
200
|
+
*/
|
|
201
|
+
lastFrameMs() {
|
|
202
|
+
if (this.lastSample === null)
|
|
203
|
+
return null;
|
|
204
|
+
return this.lastSample.shadows + this.lastSample.reflection + this.lastSample.rest;
|
|
205
|
+
}
|
|
206
|
+
dispose() {
|
|
207
|
+
this.querySet?.destroy();
|
|
208
|
+
this.resolveBuffer?.destroy();
|
|
209
|
+
this.readBuffer?.destroy();
|
|
210
|
+
this.pending.length = 0;
|
|
211
|
+
this.lastSample = null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
2
|
+
/**
|
|
3
|
+
* `color` (4), and nothing else.
|
|
4
|
+
*
|
|
5
|
+
* The rect's bounds and the canvas size were in here to place the quad and are not needed to
|
|
6
|
+
* cover a viewport that is already the rect. Kept out rather than left unread: an unused uniform
|
|
7
|
+
* is a field somebody later writes and expects to matter.
|
|
8
|
+
*/
|
|
9
|
+
export declare const INSET_UNIFORM_SIZE = 16;
|
|
10
|
+
export declare function createInsetBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
|
|
11
|
+
export declare function createInsetBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, uniforms: GPUBuffer): GPUBindGroup;
|
|
12
|
+
/**
|
|
13
|
+
* The clearing quad.
|
|
14
|
+
*
|
|
15
|
+
* `writeColor` off is the depth-only case — `beginInset(rect, null)`, where the frame behind
|
|
16
|
+
* survives so what is drawn next sits over the scene rather than over a rectangle of flat
|
|
17
|
+
* colour. `depthCompare: 'always'` because a clear does not ask permission.
|
|
18
|
+
*/
|
|
19
|
+
export declare function insetPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout, writeColor: boolean): GPURenderPipeline;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DEPTH_FORMAT } from './flatPass.js';
|
|
2
|
+
import { shaderModule } from './shaderModules.js';
|
|
3
|
+
/**
|
|
4
|
+
* Clearing a *rectangle* of the frame, which WebGPU has no operation for.
|
|
5
|
+
*
|
|
6
|
+
* `beginInset` on WebGL2 is `gl.scissor` plus `gl.clear`, and the scissor confines the clear.
|
|
7
|
+
* WebGPU clears at `loadOp`, which applies to the whole attachment and cannot be confined —
|
|
8
|
+
* reopening the pass to clear would throw away the frame outside the inset, and clearing only
|
|
9
|
+
* depth that way would silently un-occlude everything a scene draws *after* `endInset`.
|
|
10
|
+
*
|
|
11
|
+
* So the rect is drawn rather than cleared: one quad at the far plane, depth always written,
|
|
12
|
+
* colour written or masked off depending on whether the caller asked for a colour.
|
|
13
|
+
*
|
|
14
|
+
* **Its own shader, and it is allowed to be.** This is not generated from GLSL and has no
|
|
15
|
+
* WebGL2 counterpart to stay honest against — the counterpart is `gl.clear`. The mip blit in
|
|
16
|
+
* `surfaceTexturePass.ts` is here for the same reason.
|
|
17
|
+
*/
|
|
18
|
+
const INSET_WGSL = `
|
|
19
|
+
struct Rect {
|
|
20
|
+
color: vec4<f32>,
|
|
21
|
+
}
|
|
22
|
+
@group(0) @binding(0) var<uniform> rect: Rect;
|
|
23
|
+
|
|
24
|
+
@vertex
|
|
25
|
+
fn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
|
|
26
|
+
/*
|
|
27
|
+
* The whole of the current viewport, which is the inset, because \`beginInset\` has already
|
|
28
|
+
* set it.
|
|
29
|
+
*
|
|
30
|
+
* **It used to place the quad from the rect's own CSS pixels and that is one transform too
|
|
31
|
+
* many.** Clip space is relative to the viewport in force, not to the canvas, so a quad
|
|
32
|
+
* describing "this box within the canvas" was mapped into the box a second time: it came out
|
|
33
|
+
* small and pushed toward a corner, leaving most of the inset uncleared. What a caller then
|
|
34
|
+
* saw was whatever had been in the frame there, or nothing at all where the frame was
|
|
35
|
+
* transparent — reported from the game as a hole where a portrait should be. The content
|
|
36
|
+
* inside the inset was always correct, which is what made it look like a missing draw rather
|
|
37
|
+
* than a misplaced one.
|
|
38
|
+
*/
|
|
39
|
+
var corner = array<vec2<f32>, 6>(
|
|
40
|
+
vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 0.0), vec2<f32>(1.0, 1.0),
|
|
41
|
+
vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 1.0), vec2<f32>(0.0, 1.0),
|
|
42
|
+
);
|
|
43
|
+
let ndc = corner[index] * 2.0 - vec2<f32>(1.0, 1.0);
|
|
44
|
+
// z = 1: the far plane, which is what a depth clear writes.
|
|
45
|
+
return vec4<f32>(ndc, 1.0, 1.0);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@fragment
|
|
49
|
+
fn fragmentMain() -> @location(0) vec4<f32> {
|
|
50
|
+
return rect.color;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
/**
|
|
54
|
+
* `color` (4), and nothing else.
|
|
55
|
+
*
|
|
56
|
+
* The rect's bounds and the canvas size were in here to place the quad and are not needed to
|
|
57
|
+
* cover a viewport that is already the rect. Kept out rather than left unread: an unused uniform
|
|
58
|
+
* is a field somebody later writes and expects to matter.
|
|
59
|
+
*/
|
|
60
|
+
export const INSET_UNIFORM_SIZE = 16;
|
|
61
|
+
export function createInsetBindGroupLayout(device) {
|
|
62
|
+
return device.createBindGroupLayout({
|
|
63
|
+
label: 'inset.layout',
|
|
64
|
+
entries: [
|
|
65
|
+
{
|
|
66
|
+
binding: 0,
|
|
67
|
+
visibility: 0x1 | 0x2,
|
|
68
|
+
buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: INSET_UNIFORM_SIZE },
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export function createInsetBindGroup(device, layout, uniforms) {
|
|
74
|
+
return device.createBindGroup({
|
|
75
|
+
label: 'inset.bindGroup',
|
|
76
|
+
layout,
|
|
77
|
+
entries: [{ binding: 0, resource: { buffer: uniforms, size: INSET_UNIFORM_SIZE } }],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The clearing quad.
|
|
82
|
+
*
|
|
83
|
+
* `writeColor` off is the depth-only case — `beginInset(rect, null)`, where the frame behind
|
|
84
|
+
* survives so what is drawn next sits over the scene rather than over a rectangle of flat
|
|
85
|
+
* colour. `depthCompare: 'always'` because a clear does not ask permission.
|
|
86
|
+
*/
|
|
87
|
+
export function insetPipeline(cache, device, layout, writeColor) {
|
|
88
|
+
return cache.get(`inset|${writeColor ? 'color' : 'depth'}`, () => {
|
|
89
|
+
const module = shaderModule(device, { label: 'inset', code: INSET_WGSL });
|
|
90
|
+
return {
|
|
91
|
+
label: `inset|${writeColor ? 'color' : 'depth'}`,
|
|
92
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
|
|
93
|
+
vertex: { module, entryPoint: 'vertexMain' },
|
|
94
|
+
fragment: {
|
|
95
|
+
module,
|
|
96
|
+
entryPoint: 'fragmentMain',
|
|
97
|
+
targets: [{ format: cache.format, writeMask: writeColor ? 0xf : 0 }],
|
|
98
|
+
},
|
|
99
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
100
|
+
multisample: { count: cache.sampleCount },
|
|
101
|
+
depthStencil: {
|
|
102
|
+
format: DEPTH_FORMAT,
|
|
103
|
+
depthWriteEnabled: true,
|
|
104
|
+
depthCompare: 'always',
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { MeshInstances } from '../../instances.ts';
|
|
2
|
+
import type { GpuMesh } from './buffers.ts';
|
|
3
|
+
/**
|
|
4
|
+
* One mesh's per-instance buffer on the device.
|
|
5
|
+
*
|
|
6
|
+
* **Attached to a mesh rather than owning one.** The geometry an instanced draw repeats is
|
|
7
|
+
* usually the expensive kind — a loaded model rather than a blade of grass — so this holds a
|
|
8
|
+
* reference to the mesh a consumer already uploaded and adds only the placement.
|
|
9
|
+
*
|
|
10
|
+
* The staging array is allocated here and rewritten in place, which is what keeps a frame that
|
|
11
|
+
* re-uploads a moving batch allocation-free.
|
|
12
|
+
*/
|
|
13
|
+
export declare class GpuInstancedBatch {
|
|
14
|
+
readonly buffer: GPUBuffer;
|
|
15
|
+
readonly mesh: GpuMesh;
|
|
16
|
+
readonly capacity: number;
|
|
17
|
+
private readonly staging;
|
|
18
|
+
constructor(device: GPUDevice, mesh: GpuMesh, capacity: number, label: string);
|
|
19
|
+
/**
|
|
20
|
+
* Pack and push `data.count` instances, in one write.
|
|
21
|
+
*
|
|
22
|
+
* Only the live prefix, for the reason `uploadScatter` gives: the rest is not drawn and
|
|
23
|
+
* uploading it would be per-frame waste with nothing reading it.
|
|
24
|
+
*/
|
|
25
|
+
upload(queue: GPUQueue, data: MeshInstances): void;
|
|
26
|
+
dispose(): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { INSTANCE_FLOATS, INSTANCE_STRIDE, packInstances } from '../../instances.js';
|
|
2
|
+
/** VERTEX | COPY_DST, spelled the way every other pass here spells it. */
|
|
3
|
+
const USAGE_VERTEX = 0x0020 | 0x0008;
|
|
4
|
+
/**
|
|
5
|
+
* One mesh's per-instance buffer on the device.
|
|
6
|
+
*
|
|
7
|
+
* **Attached to a mesh rather than owning one.** The geometry an instanced draw repeats is
|
|
8
|
+
* usually the expensive kind — a loaded model rather than a blade of grass — so this holds a
|
|
9
|
+
* reference to the mesh a consumer already uploaded and adds only the placement.
|
|
10
|
+
*
|
|
11
|
+
* The staging array is allocated here and rewritten in place, which is what keeps a frame that
|
|
12
|
+
* re-uploads a moving batch allocation-free.
|
|
13
|
+
*/
|
|
14
|
+
export class GpuInstancedBatch {
|
|
15
|
+
buffer;
|
|
16
|
+
mesh;
|
|
17
|
+
capacity;
|
|
18
|
+
staging;
|
|
19
|
+
constructor(device, mesh, capacity, label) {
|
|
20
|
+
this.mesh = mesh;
|
|
21
|
+
this.capacity = capacity;
|
|
22
|
+
this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
|
|
23
|
+
this.buffer = device.createBuffer({
|
|
24
|
+
/*
|
|
25
|
+
* Labelled, and it is not decoration: a WebGPU validation failure arrives at `submit`
|
|
26
|
+
* naming the resource it was about, and an unlabelled buffer names nothing.
|
|
27
|
+
*/
|
|
28
|
+
label,
|
|
29
|
+
size: capacity * INSTANCE_STRIDE,
|
|
30
|
+
usage: USAGE_VERTEX,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Pack and push `data.count` instances, in one write.
|
|
35
|
+
*
|
|
36
|
+
* Only the live prefix, for the reason `uploadScatter` gives: the rest is not drawn and
|
|
37
|
+
* uploading it would be per-frame waste with nothing reading it.
|
|
38
|
+
*/
|
|
39
|
+
upload(queue, data) {
|
|
40
|
+
const count = Math.min(data.count, this.capacity);
|
|
41
|
+
if (count === 0)
|
|
42
|
+
return;
|
|
43
|
+
packInstances(data, this.staging);
|
|
44
|
+
queue.writeBuffer(this.buffer, 0, this.staging, 0, count * INSTANCE_FLOATS);
|
|
45
|
+
}
|
|
46
|
+
dispose() {
|
|
47
|
+
this.buffer.destroy();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type StageBindings } from './flatPass.ts';
|
|
2
|
+
import type { PipelineCache } from './pipelineCache.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The light-volume pass: a closed hull, and a march down the view ray inside it.
|
|
5
|
+
*
|
|
6
|
+
* The geometry decides which pixels run and nothing else, so this is an ordinary indexed mesh
|
|
7
|
+
* draw with an unusual pipeline: **additive, depth tested, depth never written, and culling
|
|
8
|
+
* chosen per draw** rather than fixed.
|
|
9
|
+
*
|
|
10
|
+
* Culling is the part that is not boilerplate. A volume seen from outside is entered at its
|
|
11
|
+
* front faces and a volume seen from inside is entered at its back ones, so which face survives
|
|
12
|
+
* is a property of where the camera stands — `resolveLightVolume` answers it, and this file
|
|
13
|
+
* turns the answer into one of two pipelines.
|
|
14
|
+
*/
|
|
15
|
+
/** Which permutation of the fragment stage: the sun-shadow lookup compiled in, or not. */
|
|
16
|
+
export type LightVolumeVariant = 'none' | 'directionalShadows';
|
|
17
|
+
export declare const LIGHT_VOLUME_VERT_FIELDS: {
|
|
18
|
+
readonly uViewProj: {
|
|
19
|
+
readonly offset: 0;
|
|
20
|
+
readonly size: 64;
|
|
21
|
+
readonly type: "mat4";
|
|
22
|
+
};
|
|
23
|
+
readonly uModel: {
|
|
24
|
+
readonly offset: 64;
|
|
25
|
+
readonly size: 64;
|
|
26
|
+
readonly type: "mat4";
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare const LIGHT_VOLUME_VERT_SIZE: 128;
|
|
30
|
+
/** Everything the generator recorded about one permutation of the fragment stage. */
|
|
31
|
+
export declare function lightVolumeFragmentBindings(variant: LightVolumeVariant): StageBindings;
|
|
32
|
+
/**
|
|
33
|
+
* The layout this variant binds against. **Both blocks are dynamic.**
|
|
34
|
+
*
|
|
35
|
+
* Unlike the flat pass, where the fragment block holds the lights and the fog and is settled
|
|
36
|
+
* once a frame, every field here belongs to one volume: its strength, its reach, its aperture,
|
|
37
|
+
* its own placement and the camera expressed in its own space. Two beams in a frame have
|
|
38
|
+
* nothing in common to hoist, so both blocks come out of a ring a slot at a time — see
|
|
39
|
+
* `UniformRing` for what a single buffer does to a second draw.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createLightVolumeBindGroupLayout(device: GPUDevice, variant: LightVolumeVariant): GPUBindGroupLayout;
|
|
42
|
+
/**
|
|
43
|
+
* Bind the two rings and one view per declared map.
|
|
44
|
+
*
|
|
45
|
+
* `resolve` is asked by the shader's own name for each map, so the caller supplies what it has
|
|
46
|
+
* and a stand-in for the rest. **The stand-in has to read as unoccluded, not as absent**: the
|
|
47
|
+
* dynamic layer is sampled unconditionally, and `occlusion()` calls any stored depth below the
|
|
48
|
+
* receiver's a blocker — so a stand-in of zero would put the whole beam in shadow, which is a
|
|
49
|
+
* picture rather than an error. A white one-pixel texture is depth 1, the far plane, nothing in
|
|
50
|
+
* the way. `emptyTexture.ts` is the same value on the other backend for the same reason.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createLightVolumeBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, variant: LightVolumeVariant, vertices: GPUBuffer, fragments: GPUBuffer, resolve: (name: string) => {
|
|
53
|
+
view: GPUTextureView;
|
|
54
|
+
sampler: GPUSampler;
|
|
55
|
+
}): GPUBindGroup;
|
|
56
|
+
/**
|
|
57
|
+
* The pipeline for one variant and one side of the hull.
|
|
58
|
+
*
|
|
59
|
+
* **`src-alpha, one`, which is `gl.blendFunc(SRC_ALPHA, ONE)` and the whole reason this pass
|
|
60
|
+
* exists.** Alpha blending moves what is behind a surface *toward* it, so an unlit beam drawn
|
|
61
|
+
* that way comes out darker than the sky and sweeps a solid dark wedge across the frame; see
|
|
62
|
+
* the history at the top of `shaders/lightVolume.ts`. The shader puts its energy in the colour
|
|
63
|
+
* and leaves alpha at 1, because a blend that multiplies by alpha squares anything written to
|
|
64
|
+
* both.
|
|
65
|
+
*
|
|
66
|
+
* The alpha channel is left as it was rather than accumulated, which differs from the GL call
|
|
67
|
+
* — `blendFunc` sets both channels — and is invisible here because the swap chain is
|
|
68
|
+
* configured `alphaMode: 'opaque'` and the composited alpha is discarded. It would stop being
|
|
69
|
+
* invisible the day a consumer wants the canvas composited against the page behind it, and
|
|
70
|
+
* that is the line to change.
|
|
71
|
+
*
|
|
72
|
+
* **Depth tested, never written.** A beam passes behind whatever stands in front of it, and
|
|
73
|
+
* occludes nothing itself: a volume of light is not a surface.
|
|
74
|
+
*/
|
|
75
|
+
export declare function lightVolumePipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout, variant: LightVolumeVariant, cullMode: GPUCullMode, present: Readonly<Record<string, boolean>>, key: string): GPURenderPipeline;
|