@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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a frame asked of a backend, against what that backend allows.
|
|
3
|
+
*
|
|
4
|
+
* **This exists because a ceiling firing was unobservable.** The WebGPU backend holds ten per-frame
|
|
5
|
+
* ceilings — draws, material changes, overlays, water bodies, light volumes, plumes, three kinds of
|
|
6
|
+
* effect batch and the scatter shadow round — and past any of them it skips the work and writes one
|
|
7
|
+
* `console.warn` for the lifetime of the renderer. WebGL2 holds none of them and draws everything.
|
|
8
|
+
* So a scene over a ceiling renders differently on the two backends, silently, and a consumer
|
|
9
|
+
* developing against WebGL2 has no way to see it coming.
|
|
10
|
+
*
|
|
11
|
+
* **The cost of that was measured from outside.** A consumer spent weeks on ground that
|
|
12
|
+
* vanished and reappeared as the camera moved; its own report still lists, as the decisive
|
|
13
|
+
* experiment nobody has run, *"ask the reporter for the console"*. It wrote a draw counter and a
|
|
14
|
+
* per-material `reach` field of its own to guess at a worst case this renderer already knew
|
|
15
|
+
* exactly.
|
|
16
|
+
*
|
|
17
|
+
* **A count, not a log.** A warning cannot be asserted on, cannot be read from a headless check,
|
|
18
|
+
* and is gone by the time anybody looks. A number can be all three, and the whole point of the
|
|
19
|
+
* shape below is that `dropped` is one boolean a consumer's own suite can fail on.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** One ceiling's frame. Updated in place, so holding a reference to it is the intended use. */
|
|
23
|
+
export interface BudgetLine {
|
|
24
|
+
/** What a consumer would call the thing, not what the ring holding it is called. */
|
|
25
|
+
readonly name: string;
|
|
26
|
+
/**
|
|
27
|
+
* How many were **asked for**, including any that were refused.
|
|
28
|
+
*
|
|
29
|
+
* The distinction is the whole value of this field. A ring naturally knows how many slots it
|
|
30
|
+
* handed out, which tops out at the ceiling and says a frame is exactly full; what a consumer
|
|
31
|
+
* needs is how far past it the scene went, because that is the number that says how much to cut.
|
|
32
|
+
*/
|
|
33
|
+
readonly used: number;
|
|
34
|
+
/** The ceiling, or `null` where this backend imposes none. */
|
|
35
|
+
readonly ceiling: number | null;
|
|
36
|
+
/** How many were asked for and not drawn. */
|
|
37
|
+
readonly dropped: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The half a backend writes: a line it can count against.
|
|
42
|
+
*
|
|
43
|
+
* Separate from `BudgetLine` so that what a consumer is handed is read-only — a caller able to
|
|
44
|
+
* call `drop()` on the renderer's own budget could clear a check that was about to fail.
|
|
45
|
+
*/
|
|
46
|
+
export interface BudgetCounter extends BudgetLine {
|
|
47
|
+
/** One more of this thing was asked for, whether or not it will fit. */
|
|
48
|
+
ask(): void;
|
|
49
|
+
/** One of them was refused, and the frame is marked. */
|
|
50
|
+
drop(): void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
class Line implements BudgetCounter {
|
|
54
|
+
used = 0;
|
|
55
|
+
dropped = 0;
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
readonly name: string,
|
|
59
|
+
readonly ceiling: number | null,
|
|
60
|
+
private readonly budget: FrameBudget,
|
|
61
|
+
) {}
|
|
62
|
+
|
|
63
|
+
/** One more of this thing was asked for, whether or not it will fit. */
|
|
64
|
+
ask(): void {
|
|
65
|
+
this.used += 1;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** One of them was refused. Marks the frame, which is what a consumer asserts on. */
|
|
69
|
+
drop(): void {
|
|
70
|
+
this.dropped += 1;
|
|
71
|
+
this.budget.markDropped();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
reset(): void {
|
|
75
|
+
this.used = 0;
|
|
76
|
+
this.dropped = 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Every ceiling a backend imposes, counted for the frame just drawn.
|
|
82
|
+
*
|
|
83
|
+
* **The lines and the array holding them are allocated once and updated in place**, so a consumer
|
|
84
|
+
* reading this every frame allocates nothing — which is what `AGENTS.md` requires of anything on a
|
|
85
|
+
* per-frame path, and a budget nobody can afford to read every frame is a budget nobody reads.
|
|
86
|
+
*/
|
|
87
|
+
export class FrameBudget {
|
|
88
|
+
private readonly all: Line[] = [];
|
|
89
|
+
private anyDropped = false;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Declare a line. Called at construction, never in a frame.
|
|
93
|
+
*
|
|
94
|
+
* `ceiling` is `null` for a backend that imposes none — reported rather than omitted, because a
|
|
95
|
+
* line that disappears on one backend is a line a cross-backend check cannot compare.
|
|
96
|
+
*/
|
|
97
|
+
line(name: string, ceiling: number | null): BudgetCounter {
|
|
98
|
+
for (const existing of this.all) {
|
|
99
|
+
if (existing.name === name) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`frame budget: a line named ${name} is already declared. Two subsystems sharing one ` +
|
|
102
|
+
'ceiling constant still need a line each, or a consumer told which number ran out ' +
|
|
103
|
+
'cannot tell which of them to cut.',
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const line = new Line(name, ceiling, this);
|
|
108
|
+
this.all.push(line);
|
|
109
|
+
return line;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Every line, in the order declared. The same array every frame. */
|
|
113
|
+
get lines(): readonly BudgetLine[] {
|
|
114
|
+
return this.all;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Whether anything at all was refused this frame.
|
|
119
|
+
*
|
|
120
|
+
* **The one thing worth asserting on**, and the reason it is a field rather than a walk over
|
|
121
|
+
* `lines`: a consumer's headless check wants `expect(renderer.frameBudget.dropped).toBe(false)`
|
|
122
|
+
* on every scene it renders, and a check that has to know which lines exist is a check that
|
|
123
|
+
* misses the line added after it was written.
|
|
124
|
+
*/
|
|
125
|
+
get dropped(): boolean {
|
|
126
|
+
return this.anyDropped;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** @internal Marked by a line, not by a caller. */
|
|
130
|
+
markDropped(): void {
|
|
131
|
+
this.anyDropped = true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Start a frame. Keeps every line object; clears what they hold. */
|
|
135
|
+
reset(): void {
|
|
136
|
+
for (const line of this.all) line.reset();
|
|
137
|
+
this.anyDropped = false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { Renderer } from './webgl2/renderer.ts';
|
|
2
|
+
import { resolveRenderQuality, type RenderQualityOptions } from '../renderQuality.ts';
|
|
3
|
+
import type { RenderBackend, RendererApi } from './api.ts';
|
|
4
|
+
import { BACKEND_TIMEOUT_MS, forcedBackend, selectBackend } from './select.ts';
|
|
5
|
+
import { TIMED_OUT, withDeadline } from './deadline.ts';
|
|
6
|
+
import { mountSplash, type MountedSplash, type SplashOptions } from '../../ui/splash.ts';
|
|
7
|
+
|
|
8
|
+
/** Everything about selection a caller may want to decide instead of inherit. */
|
|
9
|
+
export interface CreateRendererOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Whether to try WebGPU at all. **Defaults to true**: WebGPU is the backend this engine is
|
|
12
|
+
* built on now, and WebGL2 is the fallback beneath it rather than the path of record.
|
|
13
|
+
*
|
|
14
|
+
* It defaulted to false for as long as the second backend was under construction, and the
|
|
15
|
+
* comment holding it there pointed at a numbered task in a plan. That is how a default
|
|
16
|
+
* outlives its reason: by the time it was wrong, every consumer in the workspace was already
|
|
17
|
+
* passing `true`, so the conservative default was overridden everywhere and true nowhere.
|
|
18
|
+
*
|
|
19
|
+
* **What this costs** is an `await` on `requestAdapter` in a boot that previously had none,
|
|
20
|
+
* on every consumer that never mentioned a backend. Pass `false` to decline it and get the
|
|
21
|
+
* old boot exactly. **What would make it wrong** is an adapter request slow enough to be felt
|
|
22
|
+
* at startup on a device that was never going to yield a device anyway; nothing measured here
|
|
23
|
+
* shows that, and the fallback is silent when it happens.
|
|
24
|
+
*/
|
|
25
|
+
readonly preferWebGpu?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* The query string to read `?backend=` from. Defaults to the document's own.
|
|
28
|
+
*
|
|
29
|
+
* Injectable because a test has no `location`, and because an application that routes
|
|
30
|
+
* without touching the address bar should be able to say what it means.
|
|
31
|
+
*/
|
|
32
|
+
readonly search?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Shader sources the acceptance probe compiles before a device is accepted. Empty by default.
|
|
35
|
+
*
|
|
36
|
+
* **Empty because it was measured, not assumed.** On an AMD Radeon RX 9070 XT (RADV, ANGLE over
|
|
37
|
+
* Vulkan) the draw-and-read check alone costs **4.2–5.4 ms** and catches a device that validates
|
|
38
|
+
* everything and rasterises nothing; adding all **46** generated WGSL modules costs a further
|
|
39
|
+
* **58–62 ms** on every boot and catches the class that
|
|
40
|
+
* `packages/core/src/render/shaders/uniformStride.test.ts` already catches at test time, by
|
|
41
|
+
* reading the committed files. Sixty milliseconds of every player's startup is a poor price for
|
|
42
|
+
* a second copy of a test.
|
|
43
|
+
*
|
|
44
|
+
* **What would make an empty default wrong** is a device-specific compile failure in a shader
|
|
45
|
+
* that test cannot model — which is precisely what the iOS black screen was before that test
|
|
46
|
+
* existed. A consumer shipping to a platform nobody has certified should pass the real set and
|
|
47
|
+
* take the cost: a slower boot is worth more than a black screen. `scripts/probe-check.mjs`
|
|
48
|
+
* re-measures both figures on any machine.
|
|
49
|
+
*/
|
|
50
|
+
readonly probeShaders?: readonly string[];
|
|
51
|
+
/**
|
|
52
|
+
* How long the WebGPU path may take before WebGL2 is answered instead. `Infinity` waits forever.
|
|
53
|
+
*
|
|
54
|
+
* **A preference that cannot fall back is not a preference.** Every other refusal arrives as an
|
|
55
|
+
* answer — a null adapter, a throw, a device that cannot draw — and each lands on WebGL2 with a
|
|
56
|
+
* reason. A request that never settles is none of those and has nothing under it: the boot stops
|
|
57
|
+
* at an `await`, nothing throws, and the player is left looking at the window the game was going
|
|
58
|
+
* to be drawn in. See `BACKEND_TIMEOUT_MS` for the default and what it was measured against.
|
|
59
|
+
*/
|
|
60
|
+
readonly backendTimeoutMs?: number;
|
|
61
|
+
/**
|
|
62
|
+
* The engine badge shown over the page until the first frame reaches the screen.
|
|
63
|
+
*
|
|
64
|
+
* **On by default, and that default is the feature.** A web-delivered game has no shell to
|
|
65
|
+
* show one for it — `drift-package` opens a window for exactly this and a browser tab has
|
|
66
|
+
* nowhere to put it — so the engine mounts it here, before the device probe, and a game
|
|
67
|
+
* inherits it by calling the function it was already calling. See `ui/splash.ts`.
|
|
68
|
+
*
|
|
69
|
+
* `false` declines it. Pass that for anything that is not a game booting: a site whose canvas
|
|
70
|
+
* is one section of a page, a tool that opens into its own interface, a demo harness. Those
|
|
71
|
+
* are the cases where a full-screen badge is an interruption rather than a cover, and they
|
|
72
|
+
* are the reason this is a decision rather than a behaviour.
|
|
73
|
+
*
|
|
74
|
+
* `?splash=0` and `?splash=1` override it either way without a code change, which is how the
|
|
75
|
+
* badge is looked at on a deployed build.
|
|
76
|
+
*/
|
|
77
|
+
readonly splash?: boolean | SplashOptions;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** What was built, and which path built it. */
|
|
81
|
+
export interface CreatedRenderer {
|
|
82
|
+
/** The renderer, behind the surface both backends satisfy. */
|
|
83
|
+
readonly renderer: RendererApi;
|
|
84
|
+
/** Which backend is actually drawing. Report this; never infer it. */
|
|
85
|
+
readonly backend: RenderBackend;
|
|
86
|
+
/** Why that backend, in words, for the frame meter and for bug reports. */
|
|
87
|
+
readonly reason: string;
|
|
88
|
+
/**
|
|
89
|
+
* What the part calls itself, from whichever backend was actually built.
|
|
90
|
+
*
|
|
91
|
+
* **The third of the same kind of fact as `backend` and `reason`, and it was the one missing.**
|
|
92
|
+
* `select.ts` already carried it to hand the WebGPU renderer a part number for the capability
|
|
93
|
+
* clamp, and then dropped it here — so `gpuCapability.ts`'s own claim that the string "is
|
|
94
|
+
* reported in the game's boot log, because the string a real device gives settles it in one
|
|
95
|
+
* message" was true of this repository's harness and not of a consumer, whose boot log could not
|
|
96
|
+
* print what it was never handed. Reported from outside 2026-08-28 as exactly that: a bug report
|
|
97
|
+
* that cannot say which GPU it came from.
|
|
98
|
+
*
|
|
99
|
+
* `''` where the browser declined to name the part, which is an ordinary answer rather than a
|
|
100
|
+
* failure — see `webgl2RendererName`.
|
|
101
|
+
*
|
|
102
|
+
* **For a log and a bug report, not for choosing a profile.** By the time this exists the
|
|
103
|
+
* renderer is built and every setting except the pixel density is memory allocated at
|
|
104
|
+
* construction. `describeGpu()` is the same question asked early enough to act on.
|
|
105
|
+
*/
|
|
106
|
+
readonly rendererName: string;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Which way this renderer's depth buffer actually runs.
|
|
110
|
+
*
|
|
111
|
+
* **The answer a consumer has to key their near plane on, and it is the *runtime* one.** The
|
|
112
|
+
* engine's own wish is the `REVERSED_DEPTH` constant; this is what the context granted. On
|
|
113
|
+
* WebGPU they always agree, because its clip space is already `[0, 1]`. On WebGL2 they can
|
|
114
|
+
* differ: reversing needs `EXT_clip_control`, and a context without it keeps the conventional
|
|
115
|
+
* sense — so a game that read the constant would pick a near plane the machine in front of it
|
|
116
|
+
* cannot honour.
|
|
117
|
+
*
|
|
118
|
+
* **Why it is reported at all.** A conventional buffer resolves about `z² / (near · 2^bits)`,
|
|
119
|
+
* which makes the near plane the only control there is, and a consumer that cannot ask has to
|
|
120
|
+
* choose for the worse case and gains nothing from the better one. Reported the way
|
|
121
|
+
* `rendererName` is, and for the same reason: it is a fact about the machine that only the
|
|
122
|
+
* renderer knows.
|
|
123
|
+
*/
|
|
124
|
+
readonly reversedDepth: boolean;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Hand the badge the one fact it is waiting for: a frame reached the screen.
|
|
129
|
+
*
|
|
130
|
+
* **Patched onto the instance and deleted by its own first call**, so what a game runs from the
|
|
131
|
+
* second frame on is the prototype method it would have run anyway. The alternative — a flag the
|
|
132
|
+
* backends check inside `endFrame` — puts a branch in the hot path of both renderers forever to
|
|
133
|
+
* learn something that is true exactly once, and puts the splash's name in `render/`, which is the
|
|
134
|
+
* boundary this whole module sits outside of.
|
|
135
|
+
*/
|
|
136
|
+
function presentOnFirstFrame(renderer: RendererApi, splash: MountedSplash): void {
|
|
137
|
+
const target = renderer as RendererApi & { endFrame(): void };
|
|
138
|
+
const inherited = target.endFrame.bind(target);
|
|
139
|
+
Object.defineProperty(target, 'endFrame', {
|
|
140
|
+
configurable: true,
|
|
141
|
+
writable: true,
|
|
142
|
+
value(): void {
|
|
143
|
+
inherited();
|
|
144
|
+
/* Before `present`, not after: the badge's removal must not be able to leave the patch
|
|
145
|
+
behind if it throws. Deleting an own property uncovers the prototype's. */
|
|
146
|
+
delete (target as Partial<Record<'endFrame', unknown>>).endFrame;
|
|
147
|
+
splash.present();
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Build a renderer on the best backend this browser will actually give us.
|
|
154
|
+
*
|
|
155
|
+
* **Asynchronous because it has to be.** `navigator.gpu.requestAdapter()` returns a promise
|
|
156
|
+
* and there is no synchronous way to learn whether a usable device exists. That is the one
|
|
157
|
+
* change this reaches into a consumer's boot sequence, and it is exactly why
|
|
158
|
+
* `new Renderer(canvas, quality)` keeps working untouched: three applications construct one
|
|
159
|
+
* today and none of them should be made to move on this plan's schedule.
|
|
160
|
+
*
|
|
161
|
+
* **Both backends are behind it now**, and which one a caller gets is this function's whole
|
|
162
|
+
* job: WebGPU where the browser offers a usable device, WebGL2 everywhere else. The returned
|
|
163
|
+
* `backend` and `reason` say which and why, and they are meant to be read — `reason` was
|
|
164
|
+
* returned and ignored by every caller for long enough that a silent fallback could be
|
|
165
|
+
* mistaken for a comparison.
|
|
166
|
+
*/
|
|
167
|
+
export async function createRenderer(
|
|
168
|
+
canvas: HTMLCanvasElement,
|
|
169
|
+
quality: RenderQualityOptions = {},
|
|
170
|
+
options: CreateRendererOptions = {},
|
|
171
|
+
): Promise<CreatedRenderer> {
|
|
172
|
+
const search = options.search ?? globalThis.location?.search ?? '';
|
|
173
|
+
|
|
174
|
+
/*
|
|
175
|
+
* **Mounted before the probe, because the probe is part of the wait.** `selectBackend` asks for
|
|
176
|
+
* an adapter, compiles what it was given and reads back a pixel; on a slow machine that is the
|
|
177
|
+
* first visible fraction of a second, and it happens over an empty canvas.
|
|
178
|
+
*/
|
|
179
|
+
const splashOptions: SplashOptions =
|
|
180
|
+
options.splash === undefined
|
|
181
|
+
? {}
|
|
182
|
+
: typeof options.splash === 'boolean'
|
|
183
|
+
? { enabled: options.splash }
|
|
184
|
+
: options.splash;
|
|
185
|
+
const splash = mountSplash({ search, ...splashOptions });
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Attach the badge to whichever renderer was built. Every return goes through here, including
|
|
189
|
+
* the two failure paths — a fallback still paints, and a badge that outlived a fallback would
|
|
190
|
+
* sit on the screen until the cap for a game that was running perfectly well underneath it.
|
|
191
|
+
*/
|
|
192
|
+
const built = (
|
|
193
|
+
result: Omit<CreatedRenderer, 'rendererName' | 'reversedDepth'>,
|
|
194
|
+
): CreatedRenderer => {
|
|
195
|
+
if (splash !== null) presentOnFirstFrame(result.renderer, splash);
|
|
196
|
+
/*
|
|
197
|
+
* **Read off the renderer here rather than carried down from the choice**, and the difference
|
|
198
|
+
* is the fallback. `choice.rendererName` is the *adapter's* name and is null on every WebGL2
|
|
199
|
+
* branch; more than that, a WebGPU surface that fails after a device was granted returns a
|
|
200
|
+
* WebGL2 renderer through this same wrapper, so the choice's name would then describe a
|
|
201
|
+
* backend that is not drawing. Every return goes through here and every renderer carries its
|
|
202
|
+
* own name, so there is one place and it cannot disagree with the object beside it.
|
|
203
|
+
*/
|
|
204
|
+
/*
|
|
205
|
+
* `reversedDepth` is read off the renderer for the same reason and with more force: on WebGL2
|
|
206
|
+
* it depends on an extension the context may not offer, so it is a property of the object
|
|
207
|
+
* that got built and of nothing upstream of it.
|
|
208
|
+
*/
|
|
209
|
+
return {
|
|
210
|
+
...result,
|
|
211
|
+
rendererName: result.renderer.rendererName,
|
|
212
|
+
reversedDepth: result.renderer.reversedDepth,
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* **One budget for the whole WebGPU branch, spent in two halves.**
|
|
218
|
+
*
|
|
219
|
+
* Acquisition is the first half and `selectBackend` bounds it. Construction is the second — a
|
|
220
|
+
* dynamically imported backend, a surface and a renderer — and it used to be bounded by nothing,
|
|
221
|
+
* which meant a boot could stall with a deadline visibly present and never firing. Reported from
|
|
222
|
+
* outside exactly that way: every GPU call in the hung page completed by hand in milliseconds
|
|
223
|
+
* while the engine's own boot never returned, because whatever it was waiting on was not inside
|
|
224
|
+
* the promise the deadline was racing.
|
|
225
|
+
*/
|
|
226
|
+
const budgetMs = options.backendTimeoutMs ?? BACKEND_TIMEOUT_MS;
|
|
227
|
+
const startedAt = Date.now();
|
|
228
|
+
const choice = await selectBackend(
|
|
229
|
+
search,
|
|
230
|
+
options.preferWebGpu ?? true,
|
|
231
|
+
quality.gpuTiming ?? false,
|
|
232
|
+
options.probeShaders ?? [],
|
|
233
|
+
budgetMs,
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
if (choice.backend === 'webgpu' && choice.device !== null) {
|
|
237
|
+
/*
|
|
238
|
+
* **A failure here falls back rather than propagating.** Everything up to this point
|
|
239
|
+
* proved a device exists; a canvas that will not give a `webgpu` context after that is
|
|
240
|
+
* a different fault, and one a consumer can do nothing about. Falling back draws the
|
|
241
|
+
* frame on WebGL2 and says why, which beats a black canvas and a stack trace.
|
|
242
|
+
*
|
|
243
|
+
* The device is destroyed on the way past, because the surface that would have owned it
|
|
244
|
+
* was never built and nothing else will free it.
|
|
245
|
+
*/
|
|
246
|
+
/*
|
|
247
|
+
* **What it was doing when it stopped, kept as a word.** A consumer cannot read a stack out of
|
|
248
|
+
* a packaged build with no developer tools, and the question a stalled boot raises is which of
|
|
249
|
+
* these three steps it is sitting in. The reason string carries the answer rather than a
|
|
250
|
+
* request to reproduce it under a debugger.
|
|
251
|
+
*/
|
|
252
|
+
let stage = 'importing the backend';
|
|
253
|
+
const device = choice.device;
|
|
254
|
+
try {
|
|
255
|
+
const construction = (async () => {
|
|
256
|
+
/*
|
|
257
|
+
* Imported dynamically so a bundler can split them out. A consumer that ends up on
|
|
258
|
+
* WebGL2 — every consumer today, and every browser without WebGPU afterwards — should
|
|
259
|
+
* not be made to download a backend it will never construct.
|
|
260
|
+
*
|
|
261
|
+
* **And it is an await over a network, which is why it is inside the race.** In a packaged
|
|
262
|
+
* artifact these chunks come back through the application's own protocol handler; a request
|
|
263
|
+
* that never answers is a boot that never finishes, and nothing about it is a GPU fault.
|
|
264
|
+
*/
|
|
265
|
+
const { createGpuSurface } = await import('./webgpu/device.ts');
|
|
266
|
+
const { WebGPURenderer } = await import('./webgpu/renderer.ts');
|
|
267
|
+
stage = 'creating the surface';
|
|
268
|
+
const surface = createGpuSurface(canvas, device);
|
|
269
|
+
stage = 'constructing the renderer';
|
|
270
|
+
return { surface, WebGPURenderer };
|
|
271
|
+
})();
|
|
272
|
+
|
|
273
|
+
const spent = Date.now() - startedAt;
|
|
274
|
+
const settled = await withDeadline(construction, budgetMs - spent);
|
|
275
|
+
if (settled === TIMED_OUT) {
|
|
276
|
+
device.destroy();
|
|
277
|
+
return built({
|
|
278
|
+
renderer: new Renderer(canvas, quality),
|
|
279
|
+
backend: 'webgl2',
|
|
280
|
+
reason: `WebGPU stalled while ${stage}, fell back after ${budgetMs} ms`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
const { surface, WebGPURenderer } = settled;
|
|
284
|
+
return built({
|
|
285
|
+
/*
|
|
286
|
+
* **No cast: `WebGPURenderer` satisfies `RendererApi` outright.** It implemented
|
|
287
|
+
* `Partial<RendererApi>` while its passes were being written and the cast here was what
|
|
288
|
+
* let an incomplete backend be returned behind the complete surface. That hole is
|
|
289
|
+
* closed, and closing it is what makes the derived type do the job it exists for —
|
|
290
|
+
* adding a method to `Renderer` now stops this backend compiling until it has one too.
|
|
291
|
+
*
|
|
292
|
+
* It takes the *resolved* profile rather than the options, because it reads its shadow
|
|
293
|
+
* terms off it and a bare options object leaves every unset field undefined. `Renderer`
|
|
294
|
+
* resolves internally, so the two backends get the same numbers by construction rather
|
|
295
|
+
* than from a copied set of defaults somebody has to keep in step.
|
|
296
|
+
*/
|
|
297
|
+
renderer: new WebGPURenderer(
|
|
298
|
+
surface,
|
|
299
|
+
resolveRenderQuality(quality),
|
|
300
|
+
/* The adapter's own words, so the capability clamp has a part number to
|
|
301
|
+
recognise rather than the literal string `WebGPU`. */
|
|
302
|
+
choice.rendererName ?? undefined,
|
|
303
|
+
),
|
|
304
|
+
backend: 'webgpu',
|
|
305
|
+
reason: choice.reason,
|
|
306
|
+
});
|
|
307
|
+
} catch (error) {
|
|
308
|
+
choice.device.destroy();
|
|
309
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
310
|
+
return built({
|
|
311
|
+
renderer: new Renderer(canvas, quality),
|
|
312
|
+
backend: 'webgl2',
|
|
313
|
+
reason: `WebGPU surface failed, fell back: ${detail}`,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
choice.device?.destroy();
|
|
319
|
+
/*
|
|
320
|
+
* **Asked for WebGPU and did not get it: say so, once, out loud.**
|
|
321
|
+
*
|
|
322
|
+
* `reason` has always been returned and a caller is free to ignore it, which every caller
|
|
323
|
+
* did — so a browser without WebGPU, a driver that refused a device and a misspelt query all
|
|
324
|
+
* produced the same thing: a perfectly ordinary WebGL2 frame and no indication that the
|
|
325
|
+
* request had been dropped. Somebody comparing the two backends then compares one of them
|
|
326
|
+
* with itself, which is the exact failure `shots.mjs --backend` exists to prevent, arrived at
|
|
327
|
+
* from the other direction.
|
|
328
|
+
*
|
|
329
|
+
* Only when it was asked for **explicitly** — a `?backend=webgpu` or a literal
|
|
330
|
+
* `preferWebGpu: true`. Since the default became true this is a narrower test than it reads,
|
|
331
|
+
* and deliberately so: every consumer now asks, so warning on the default would put a console
|
|
332
|
+
* line in front of every player whose browser simply has no WebGPU, which is most of the
|
|
333
|
+
* reason the fallback exists. Someone comparing the two backends states it, and gets told.
|
|
334
|
+
*/
|
|
335
|
+
if (forcedBackend(search) === 'webgpu' || options.preferWebGpu === true) {
|
|
336
|
+
console.warn(`[driftengine] WebGPU was asked for and is not being used: ${choice.reason}`);
|
|
337
|
+
}
|
|
338
|
+
return built({
|
|
339
|
+
renderer: new Renderer(canvas, quality),
|
|
340
|
+
backend: 'webgl2',
|
|
341
|
+
reason: choice.reason,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bound on a promise, and the sentinel that says it was reached.
|
|
3
|
+
*
|
|
4
|
+
* **Its own module because two callers share it and one of them learned the hard way that a bound
|
|
5
|
+
* on part of a path is not a bound on the path.** The WebGPU branch is an acquisition *and* a
|
|
6
|
+
* construction: an adapter, a device and a probe, then a dynamically imported backend, a surface
|
|
7
|
+
* and a renderer. Bounding only the first half leaves the second half unbounded, and a boot that
|
|
8
|
+
* stalls there stalls exactly as completely — with the added confusion that a deadline exists,
|
|
9
|
+
* visibly, and never fires. Reported from outside precisely that way.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Returned in place of a value that did not arrive in time. */
|
|
13
|
+
export const TIMED_OUT = Symbol('timed out');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* `work`, or `TIMED_OUT` if it has not settled within `ms`.
|
|
17
|
+
*
|
|
18
|
+
* `Infinity` and anything non-positive wait without bound, which is how a caller asks for the
|
|
19
|
+
* behaviour that existed before deadlines did. The timer is always cleared: a pending one keeps a
|
|
20
|
+
* process alive after the answer is known, which turns a passing suite into one that hangs at the
|
|
21
|
+
* end.
|
|
22
|
+
*
|
|
23
|
+
* **A synchronous stall is not covered and cannot be.** Nothing in JavaScript races a call that
|
|
24
|
+
* does not yield, so this bounds the awaits and says so rather than implying more.
|
|
25
|
+
*/
|
|
26
|
+
export async function withDeadline<T>(work: Promise<T>, ms: number): Promise<T | typeof TIMED_OUT> {
|
|
27
|
+
if (!Number.isFinite(ms) || ms <= 0) return work;
|
|
28
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
29
|
+
const deadline = new Promise<typeof TIMED_OUT>((resolve) => {
|
|
30
|
+
timer = setTimeout(() => resolve(TIMED_OUT), ms);
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
return await Promise.race([work, deadline]);
|
|
34
|
+
} finally {
|
|
35
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a WebGPU device can do what it is about to be asked to do.
|
|
3
|
+
*
|
|
4
|
+
* **Feature detection is not this.** `navigator.gpu` was present, an adapter was offered and a
|
|
5
|
+
* device was returned throughout the total iOS failure recorded in
|
|
6
|
+
* The iOS black-screen investigation: WebKit enforces a sixteen-byte stride
|
|
7
|
+
* for arrays in the uniform address space where Dawn does not, so the shaders that draw everything
|
|
8
|
+
* compiled on every desktop browser and on no iPhone. Nothing in the boot sequence asked, and the
|
|
9
|
+
* player got a black screen.
|
|
10
|
+
*
|
|
11
|
+
* Two checks, because neither finds the other's failures:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Compile what will be compiled.** Catches a device that rejects real source.
|
|
14
|
+
* 2. **Draw a known colour and read it back.** Catches a device that validates everything and
|
|
15
|
+
* rasterises nothing — which is a black screen with a clean log.
|
|
16
|
+
*
|
|
17
|
+
* **What this costs** is one pipeline and one 1x1 readback at boot, plus the compile of whatever
|
|
18
|
+
* `shaders` is given. **What would make it wrong** is a driver where the probe passes and real
|
|
19
|
+
* content fails anyway; this narrows that window and does not close it, and nothing short of
|
|
20
|
+
* running the game can.
|
|
21
|
+
*
|
|
22
|
+
* Not a hot path: called once, before the first frame.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** What the probe decided, and why. */
|
|
26
|
+
export interface ProbeVerdict {
|
|
27
|
+
readonly ok: boolean;
|
|
28
|
+
/** Why it was refused, in words a bug report can carry. Empty when `ok`. */
|
|
29
|
+
readonly reason: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Magenta, because an empty frame has no red and no blue in either colour space. */
|
|
33
|
+
const EXPECTED = [255, 0, 255, 255] as const;
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* Usage flags numerically rather than off `GPUTextureUsage` and friends, matching
|
|
37
|
+
* `render/webgpu/buffers.ts` and for its reason: those globals do not exist under vitest, and a
|
|
38
|
+
* probe that can only run on a device is a probe whose own logic nobody checks. The values are
|
|
39
|
+
* normative in the WebGPU specification, so nothing here is guessed.
|
|
40
|
+
*/
|
|
41
|
+
const TEXTURE_COPY_SRC = 0x0001;
|
|
42
|
+
const TEXTURE_RENDER_ATTACHMENT = 0x0010;
|
|
43
|
+
const BUFFER_MAP_READ = 0x0001;
|
|
44
|
+
const BUFFER_COPY_DST = 0x0008;
|
|
45
|
+
const MAP_MODE_READ = 0x0001;
|
|
46
|
+
|
|
47
|
+
/** 256 is the smallest bytes-per-row a texture-to-buffer copy accepts. */
|
|
48
|
+
const READBACK_BYTES = 256;
|
|
49
|
+
|
|
50
|
+
const DRAW_WGSL = `
|
|
51
|
+
@vertex fn vs(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {
|
|
52
|
+
var p = array(vec2f(-1.0, -3.0), vec2f(3.0, 1.0), vec2f(-1.0, 1.0));
|
|
53
|
+
return vec4f(p[i], 0.0, 1.0);
|
|
54
|
+
}
|
|
55
|
+
@fragment fn fs() -> @location(0) vec4f { return vec4f(1.0, 0.0, 1.0, 1.0); }
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
export async function probeDevice(
|
|
59
|
+
device: GPUDevice,
|
|
60
|
+
shaders: readonly string[],
|
|
61
|
+
): Promise<ProbeVerdict> {
|
|
62
|
+
/* Inside the try, with everything else: this function's contract is that it *answers* rather
|
|
63
|
+
than throws, and a device broken enough to reject an error scope must reach the same
|
|
64
|
+
fallback as one that draws black rather than an exception the caller has to catch. */
|
|
65
|
+
try {
|
|
66
|
+
device.pushErrorScope('validation');
|
|
67
|
+
for (const code of shaders) {
|
|
68
|
+
const info = await device.createShaderModule({ code }).getCompilationInfo();
|
|
69
|
+
const failure = info.messages.find((message) => message.type === 'error');
|
|
70
|
+
if (failure !== undefined) {
|
|
71
|
+
await device.popErrorScope();
|
|
72
|
+
return { ok: false, reason: `a shader did not compile: ${failure.message}` };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const pixel = await drawOnePixel(device);
|
|
77
|
+
const error = await device.popErrorScope();
|
|
78
|
+
if (error !== null) {
|
|
79
|
+
return { ok: false, reason: `the device refused something: ${error.message}` };
|
|
80
|
+
}
|
|
81
|
+
if (pixel === null) {
|
|
82
|
+
return { ok: false, reason: 'the device drew nothing that could be read back' };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const matches = EXPECTED.every((value, i) => Math.abs(value - (pixel[i] ?? 0)) <= 1);
|
|
86
|
+
if (!matches) {
|
|
87
|
+
return { ok: false, reason: `the device drew nothing: read ${[...pixel].join(',')}` };
|
|
88
|
+
}
|
|
89
|
+
return { ok: true, reason: '' };
|
|
90
|
+
} catch (cause) {
|
|
91
|
+
/* The scope has to be popped whatever happened, and a device that throws here may well
|
|
92
|
+
throw on the pop as well — which must not replace the interesting error with a dull one. */
|
|
93
|
+
try {
|
|
94
|
+
await device.popErrorScope();
|
|
95
|
+
} catch {
|
|
96
|
+
/* nothing to add: the throw below is the one worth reporting */
|
|
97
|
+
}
|
|
98
|
+
return { ok: false, reason: `the device threw during the probe: ${String(cause)}` };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** One triangle of known colour into a 1x1 target, read back. */
|
|
103
|
+
async function drawOnePixel(device: GPUDevice): Promise<Uint8Array | null> {
|
|
104
|
+
const module = device.createShaderModule({ code: DRAW_WGSL });
|
|
105
|
+
const pipeline = device.createRenderPipeline({
|
|
106
|
+
layout: 'auto',
|
|
107
|
+
vertex: { module, entryPoint: 'vs' },
|
|
108
|
+
fragment: { module, entryPoint: 'fs', targets: [{ format: 'rgba8unorm' }] },
|
|
109
|
+
primitive: { topology: 'triangle-list' },
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const target = device.createTexture({
|
|
113
|
+
size: { width: 1, height: 1 },
|
|
114
|
+
format: 'rgba8unorm',
|
|
115
|
+
usage: TEXTURE_RENDER_ATTACHMENT | TEXTURE_COPY_SRC,
|
|
116
|
+
label: 'probe.target',
|
|
117
|
+
});
|
|
118
|
+
const readback = device.createBuffer({
|
|
119
|
+
size: READBACK_BYTES,
|
|
120
|
+
usage: BUFFER_COPY_DST | BUFFER_MAP_READ,
|
|
121
|
+
label: 'probe.readback',
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const encoder = device.createCommandEncoder();
|
|
125
|
+
const pass = encoder.beginRenderPass({
|
|
126
|
+
colorAttachments: [
|
|
127
|
+
{
|
|
128
|
+
view: target.createView(),
|
|
129
|
+
loadOp: 'clear',
|
|
130
|
+
storeOp: 'store',
|
|
131
|
+
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
});
|
|
135
|
+
pass.setPipeline(pipeline);
|
|
136
|
+
pass.draw(3);
|
|
137
|
+
pass.end();
|
|
138
|
+
encoder.copyTextureToBuffer(
|
|
139
|
+
{ texture: target },
|
|
140
|
+
{ buffer: readback, bytesPerRow: READBACK_BYTES },
|
|
141
|
+
{ width: 1, height: 1 },
|
|
142
|
+
);
|
|
143
|
+
device.queue.submit([encoder.finish()]);
|
|
144
|
+
await device.queue.onSubmittedWorkDone();
|
|
145
|
+
|
|
146
|
+
await readback.mapAsync(MAP_MODE_READ);
|
|
147
|
+
const pixel = new Uint8Array(readback.getMappedRange().slice(0, 4));
|
|
148
|
+
readback.unmap();
|
|
149
|
+
readback.destroy();
|
|
150
|
+
target.destroy();
|
|
151
|
+
return pixel;
|
|
152
|
+
}
|