@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,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A hint, from the renderer string, about whether this part can hold the good profile.
|
|
3
|
+
*
|
|
4
|
+
* **It is a hint and never the authority.** A device database is a thing to maintain and
|
|
5
|
+
* it is wrong about every GPU nobody has tested, so the unknown case is deliberately *not*
|
|
6
|
+
* weak: guessing weak on the unknown would ship a soft picture to every device released
|
|
7
|
+
* after this line was written. `ResolutionGovernor` is what corrects a wrong guess, in both
|
|
8
|
+
* directions, from measurement rather than from a table.
|
|
9
|
+
*
|
|
10
|
+
* The families listed are the ones this project has evidence for, and each is a
|
|
11
|
+
* measurement rather than a reputation:
|
|
12
|
+
*
|
|
13
|
+
* - **Adreno 5xx/6xx and 70x/71x** — `NFD6QQ`, an Adreno 619 at 156.66 ms a frame that
|
|
14
|
+
* then lost its context outright, and `JBL3XG`, an Adreno 710 at 112 ms. Both were
|
|
15
|
+
* opened at the desktop profile because the default quality is a constant.
|
|
16
|
+
* - **Intel HD/UHD** — a UHD 630 that was unplayable fullscreen and *"perfetto"* in a
|
|
17
|
+
* small window, which is the signature of a part using system RAM as VRAM.
|
|
18
|
+
* - **Mali-G3x/G5x and PowerVR** — the same class as those Adrenos by every public number.
|
|
19
|
+
* No report from either yet; listed because the cost of being wrong is a picture one
|
|
20
|
+
* step softer than it needed to be, and the cost of omitting them is another `NFD6QQ`.
|
|
21
|
+
*
|
|
22
|
+
* Adreno 72x-8xx and the Immortalis Malis are excluded on purpose. `JBL3XG`'s 710 is the
|
|
23
|
+
* one 7xx data point and it belongs to the mid-range; the flagships hold the budget. If a
|
|
24
|
+
* second 7xx report lands, move that whole family here rather than special-casing a number.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* **WebGPU does not hand out part numbers, and that changes what this table can match.**
|
|
28
|
+
*
|
|
29
|
+
* `UNMASKED_RENDERER_WEBGL` gives a string like `ANGLE (Qualcomm, Adreno (TM) 619, OpenGL ES
|
|
30
|
+
* 3.2)`. `GPUAdapterInfo` deliberately does not: it reports a vendor and an *architecture
|
|
31
|
+
* bucket*, to reduce fingerprinting entropy. Measured on this machine, an RX 9070 XT reports
|
|
32
|
+
* `vendor: "amd", architecture: "rdna-4"` and nothing else — no model, no description.
|
|
33
|
+
*
|
|
34
|
+
* So the patterns below have to recognise both shapes, and the bucketed one costs precision:
|
|
35
|
+
* `adreno-7xx` cannot distinguish the 710 that was measured at 112 ms a frame from the 740 in
|
|
36
|
+
* a current flagship. **It is therefore deliberately absent**, on the same reasoning that keeps
|
|
37
|
+
* the unknown part unclamped — guessing weak is a soft picture for somebody who did not need
|
|
38
|
+
* one, and `ResolutionGovernor` corrects a wrong guess from measurement in either direction.
|
|
39
|
+
*
|
|
40
|
+
* The bucket spellings are inferred from the specification's vocabulary rather than read off a
|
|
41
|
+
* device this project owns, so a phone that ought to clamp and does not is a bug in these two
|
|
42
|
+
* lines rather than in the mechanism. `Renderer.rendererName` is reported in the game's boot
|
|
43
|
+
* log for exactly that reason: the string a real device gives settles it in one message.
|
|
44
|
+
*/
|
|
45
|
+
const WEAK_ARCHITECTURES: readonly RegExp[] = [/adreno-[56]xx/, /mali-g[35]x/];
|
|
46
|
+
|
|
47
|
+
const WEAK_FAMILIES: readonly RegExp[] = [
|
|
48
|
+
...WEAK_ARCHITECTURES,
|
|
49
|
+
// Adreno 5xx and 6xx entirely, plus the 700 and 710 mid-range.
|
|
50
|
+
/adreno\s*(?:\(tm\))?\s*[56]\d\d/,
|
|
51
|
+
/adreno\s*(?:\(tm\))?\s*7[01]\d/,
|
|
52
|
+
// `Intel(R) HD Graphics 520`, `Intel(R) UHD Graphics 630`, and the same without the (R).
|
|
53
|
+
/intel(?:\(r\))?\s+u?hd\s+graphics/,
|
|
54
|
+
// Mali-G31 through G57. The Immortalis and G6xx/G7xx parts are not here.
|
|
55
|
+
/mali-g[35]\d/,
|
|
56
|
+
/powervr/,
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/** Whether this renderer string names a part known to struggle with the good profile. */
|
|
60
|
+
export function isWeakGpuFamily(rendererName: string): boolean {
|
|
61
|
+
const name = rendererName.toLowerCase();
|
|
62
|
+
return WEAK_FAMILIES.some((pattern) => pattern.test(name));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* What a WebGPU adapter calls the part, in the shape the table above matches.
|
|
67
|
+
*
|
|
68
|
+
* **Here rather than inline in `selectBackend`, because two callers need the identical string.**
|
|
69
|
+
* The backend selection builds it to hand the renderer a part number for the clamp, and
|
|
70
|
+
* `describeGpu` builds it to answer a consumer choosing a profile *before* a renderer exists. Two
|
|
71
|
+
* spellings of this join is the 2026-08-13 rule's first clause exactly: one decision, two
|
|
72
|
+
* implementations, and the drift shows up as a clamp that fires in one path and not the other.
|
|
73
|
+
*
|
|
74
|
+
* Every field is optional and browsers withhold them to differing degrees, so they are joined
|
|
75
|
+
* rather than formatted: a string with a vendor and nothing else is still something the table can
|
|
76
|
+
* recognise. An empty result falls back to the literal `WebGPU`, so nothing that prints it gets a
|
|
77
|
+
* blank — which is also why `isWeakGpuFamily('WebGPU')` is false and must stay false.
|
|
78
|
+
*/
|
|
79
|
+
export function adapterRendererName(info: GPUAdapterInfo | undefined): string {
|
|
80
|
+
return (
|
|
81
|
+
[info?.description, info?.vendor, info?.architecture, info?.device]
|
|
82
|
+
.filter((part) => typeof part === 'string' && part.length > 0)
|
|
83
|
+
.join(' ')
|
|
84
|
+
.trim() || 'WebGPU'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* What a WebGL2 context calls the part.
|
|
90
|
+
*
|
|
91
|
+
* `WEBGL_debug_renderer_info` is an extension and a browser may withhold it, so the empty string
|
|
92
|
+
* is an ordinary answer and not a failure — `isWeakGpuFamily('')` is false, which is the same
|
|
93
|
+
* "unknown is not weak" rule the table above is built on.
|
|
94
|
+
*/
|
|
95
|
+
export function webgl2RendererName(gl: WebGL2RenderingContext): string {
|
|
96
|
+
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
|
|
97
|
+
if (debugInfo === null) return '';
|
|
98
|
+
return String((gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) as unknown) ?? '');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** What part this machine has, as far as the browser will say. See `describeGpu`. */
|
|
102
|
+
export interface GpuIdentity {
|
|
103
|
+
/**
|
|
104
|
+
* The part's own string, or `''` where the browser declined to name it.
|
|
105
|
+
*
|
|
106
|
+
* The same string `RendererApi.rendererName` carries once a renderer exists, from the same two
|
|
107
|
+
* derivations — this is that answer, moved earlier.
|
|
108
|
+
*/
|
|
109
|
+
readonly rendererName: string;
|
|
110
|
+
/** `isWeakGpuFamily(rendererName)`, so a caller does not have to remember to ask. */
|
|
111
|
+
readonly weak: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Which API answered, and **never a prediction of the backend `createRenderer` will build on.**
|
|
114
|
+
*
|
|
115
|
+
* Naming the part and choosing a backend are different questions with different costs: this
|
|
116
|
+
* asks an adapter for its name, and the selection asks for a *device*, compiles what it was
|
|
117
|
+
* given and reads back a pixel. A machine can name a WebGPU adapter and still end up on WebGL2.
|
|
118
|
+
* The field is here so a bug report can say where the string came from, not so a caller can
|
|
119
|
+
* branch on it.
|
|
120
|
+
*/
|
|
121
|
+
readonly source: 'webgpu' | 'webgl2' | 'none';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The seams a test needs. A caller in a browser passes none of them. */
|
|
125
|
+
export interface DescribeGpuOptions {
|
|
126
|
+
/** Whether to ask WebGPU first. Defaults to true, matching `createRenderer`. */
|
|
127
|
+
readonly preferWebGpu?: boolean;
|
|
128
|
+
/** Defaults to `navigator.gpu`. */
|
|
129
|
+
readonly gpu?: GPU | null;
|
|
130
|
+
/**
|
|
131
|
+
* Where the WebGL2 fallback reads its string from. Defaults to a **detached** canvas.
|
|
132
|
+
*
|
|
133
|
+
* **Detached, and that is the whole reason this is not read off the caller's canvas.** A second
|
|
134
|
+
* `getContext('webgl2')` on one canvas returns the *existing* context and silently ignores the
|
|
135
|
+
* attributes, so whoever calls first decides `alpha`, `antialias` and `powerPreference` for
|
|
136
|
+
* everybody — and `Renderer` chooses `antialias` from the very profile a caller is here to
|
|
137
|
+
* decide. Reading the name off the real canvas would settle a rendering attribute as a side
|
|
138
|
+
* effect of asking a question. `webgl2/renderer.ts` records the same trap from the other side,
|
|
139
|
+
* where a consumer doing this by hand was the bug.
|
|
140
|
+
*/
|
|
141
|
+
readonly createCanvas?: () => HTMLCanvasElement | null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const UNKNOWN: GpuIdentity = { rendererName: '', weak: false, source: 'none' };
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Ask what part this machine has, **before** building a renderer.
|
|
148
|
+
*
|
|
149
|
+
* **The gap this closes:** `isWeakGpuFamily` is exported for a consumer to classify the part it is
|
|
150
|
+
* running on, and until now the only string to hand it arrived on a renderer that had already been
|
|
151
|
+
* constructed — by which time the profile has been consumed and, as `applyResolutionScale` puts
|
|
152
|
+
* it, everything except the pixel density is memory allocated at construction. So the one function
|
|
153
|
+
* the engine offers for this decision took an argument the engine would not give you in time.
|
|
154
|
+
* Reported from outside 2026-08-28, by a consumer that had fallen back to `(pointer: coarse)`
|
|
155
|
+
* instead: a good proxy, right about a phone and wrong about a weak desktop, which is exactly the
|
|
156
|
+
* case `isWeakGpuFamily` exists for.
|
|
157
|
+
*
|
|
158
|
+
* **WebGL2 is asked first, and that order is a measurement rather than a preference.** The first
|
|
159
|
+
* version of this asked WebGPU first, and on this machine it answered `amd rdna-4` where the built
|
|
160
|
+
* WebGL2 renderer answered `ANGLE (AMD, Vulkan 1.4.354 (AMD Radeon RX 9070 XT (RADV GFX1201)
|
|
161
|
+
* (0x00007550)), radv)` — the same part, two spellings, and only one of them carries a model
|
|
162
|
+
* number. That is not cosmetic: `GPUAdapterInfo` reports an *architecture bucket* to limit
|
|
163
|
+
* fingerprinting, so `adreno-7xx` is one string for both the 710 measured at 112 ms a frame and
|
|
164
|
+
* the 740 in a flagship, and the table above deliberately refuses to clamp it. The unmasked
|
|
165
|
+
* WebGL2 string says `Adreno (TM) 710` and the table does clamp that. Asking the API that names
|
|
166
|
+
* the part first therefore gives a **more accurate verdict on the devices this table exists for**,
|
|
167
|
+
* and it costs an adapter request less on every machine that answers.
|
|
168
|
+
*
|
|
169
|
+
* **So this can be more precise than the renderer's own `rendererName`, and a caller comparing
|
|
170
|
+
* the two should expect that** rather than read it as a fault: a WebGPU renderer on that phone
|
|
171
|
+
* knows only `adreno-7xx` and its internal clamp cannot fire, while a consumer that called this
|
|
172
|
+
* has the part number and can choose a profile the clamp could not reach.
|
|
173
|
+
*
|
|
174
|
+
* **What it costs** is one detached WebGL2 context, created and immediately handed back, and — only
|
|
175
|
+
* where that declines to name the part — one adapter request. An adapter request, not a device
|
|
176
|
+
* request, which is the cheap half of what `selectBackend` does. Only a consumer that asks pays it.
|
|
177
|
+
*
|
|
178
|
+
* **Why this rather than a callback inside `createRenderer`.** Handing the profile in as a function
|
|
179
|
+
* of the part was the alternative and was not taken: the WebGL2 name cannot be read off the real
|
|
180
|
+
* canvas before the profile is chosen anyway, since that canvas's `antialias` comes *from* the
|
|
181
|
+
* profile; and a fallback from WebGPU to WebGL2 mid-creation would have to call that function a
|
|
182
|
+
* second time with a different identity, which is a re-entrancy trap inside the one function every
|
|
183
|
+
* consumer calls. This keeps the decision in the consumer's hands and the signature unchanged.
|
|
184
|
+
*
|
|
185
|
+
* **Nothing here throws.** A machine that will name itself through neither API is an ordinary
|
|
186
|
+
* outcome and answers `source: 'none'` with an empty name — which `isWeakGpuFamily` reads as *not
|
|
187
|
+
* weak*, the same "unknown is not weak" rule the table is built on. A caller gets the good profile
|
|
188
|
+
* and `ResolutionGovernor` corrects it from measurement, which is the design.
|
|
189
|
+
*/
|
|
190
|
+
export async function describeGpu(options: DescribeGpuOptions = {}): Promise<GpuIdentity> {
|
|
191
|
+
const named = (rendererName: string, source: 'webgpu' | 'webgl2'): GpuIdentity => ({
|
|
192
|
+
rendererName,
|
|
193
|
+
weak: isWeakGpuFamily(rendererName),
|
|
194
|
+
source,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/* WebGL2 first: it is the API that gives a model number. See the header for the measurement. */
|
|
198
|
+
const canvas =
|
|
199
|
+
options.createCanvas === undefined
|
|
200
|
+
? (globalThis.document?.createElement('canvas') ?? null)
|
|
201
|
+
: options.createCanvas();
|
|
202
|
+
if (canvas !== null) {
|
|
203
|
+
let gl: WebGL2RenderingContext | null = null;
|
|
204
|
+
try {
|
|
205
|
+
gl = canvas.getContext('webgl2');
|
|
206
|
+
} catch {
|
|
207
|
+
gl = null;
|
|
208
|
+
}
|
|
209
|
+
if (gl !== null) {
|
|
210
|
+
const name = webgl2RendererName(gl);
|
|
211
|
+
/*
|
|
212
|
+
* Handed back promptly rather than left to the collector. A detached canvas holding a live
|
|
213
|
+
* context is a GPU allocation nothing will use again, and a boot that leaks one on every
|
|
214
|
+
* consumer is the kind of cost this function has no business adding.
|
|
215
|
+
*/
|
|
216
|
+
gl.getExtension('WEBGL_lose_context')?.loseContext();
|
|
217
|
+
if (name !== '') return named(name, 'webgl2');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/*
|
|
222
|
+
* Only where WebGL2 declined to name the part — a browser withholding
|
|
223
|
+
* `WEBGL_debug_renderer_info`, or one with no WebGL2 at all. The bucketed adapter string is
|
|
224
|
+
* less precise and is better than nothing.
|
|
225
|
+
*/
|
|
226
|
+
if (options.preferWebGpu ?? true) {
|
|
227
|
+
const gpu = options.gpu === undefined ? globalThis.navigator?.gpu : options.gpu;
|
|
228
|
+
if (gpu != null) {
|
|
229
|
+
try {
|
|
230
|
+
const adapter = await gpu.requestAdapter();
|
|
231
|
+
/*
|
|
232
|
+
* A browser that offers no adapter has told us nothing about the part, so this answers
|
|
233
|
+
* unknown rather than `WebGPU` — the literal the join defaults to would be a name nobody
|
|
234
|
+
* can act on standing where the absence of one is the honest answer.
|
|
235
|
+
*/
|
|
236
|
+
if (adapter !== null) return named(adapterRendererName(adapter.info), 'webgpu');
|
|
237
|
+
} catch {
|
|
238
|
+
/* An adapter request that throws is a machine without usable WebGPU. */
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return UNKNOWN;
|
|
244
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long the GPU actually spent, in three parts.
|
|
3
|
+
*
|
|
4
|
+
* Wall clock cannot answer this. It is vsync-capped long before a GPU is saturated, so
|
|
5
|
+
* every configuration from Low to 4K High reads the same on a clock while the GPU times
|
|
6
|
+
* behind them span 13.5x. That gap is the difference between a machine with headroom and
|
|
7
|
+
* one running the game at 3 fps.
|
|
8
|
+
*
|
|
9
|
+
* **The frame is partitioned, not nested.** `TIME_ELAPSED_EXT` cannot nest, so there is
|
|
10
|
+
* no whole-frame query wrapped around two inner ones — three sequential brackets sum to
|
|
11
|
+
* the frame instead, and `rest` earns its slot by being the number that says *this one
|
|
12
|
+
* is not shadows*.
|
|
13
|
+
*
|
|
14
|
+
* Sampled one frame in eight. Seven samples a second is ample for a distribution, and it
|
|
15
|
+
* removes any argument about query overhead on drivers nobody here owns.
|
|
16
|
+
*/
|
|
17
|
+
import type { FrameTimer } from './backend/timer.ts';
|
|
18
|
+
|
|
19
|
+
export const GPU_SLOTS = ['shadows', 'reflection', 'rest'] as const;
|
|
20
|
+
|
|
21
|
+
export type GpuSlot = (typeof GPU_SLOTS)[number];
|
|
22
|
+
|
|
23
|
+
/** Milliseconds per bracket. */
|
|
24
|
+
export interface GpuSample {
|
|
25
|
+
readonly shadows: number;
|
|
26
|
+
readonly reflection: number;
|
|
27
|
+
readonly rest: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface TimerExtension {
|
|
31
|
+
readonly TIME_ELAPSED_EXT: number;
|
|
32
|
+
readonly GPU_DISJOINT_EXT: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** In flight at once. Past this a frame is skipped rather than allocating. */
|
|
36
|
+
const POOL_DEPTH = 4;
|
|
37
|
+
|
|
38
|
+
const NS_PER_MS = 1e6;
|
|
39
|
+
|
|
40
|
+
export class GpuTimer implements FrameTimer {
|
|
41
|
+
/** False where the extension is missing or disabled, which is a normal state. */
|
|
42
|
+
readonly available: boolean;
|
|
43
|
+
|
|
44
|
+
/** Samples the driver said were untrustworthy. Reported, never silently dropped. */
|
|
45
|
+
disjointDrops = 0;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The last sample `poll` resolved, held so `lastFrameMs` can answer without re-reading.
|
|
49
|
+
*
|
|
50
|
+
* Null until one resolves, and null is the honest answer for a device with no extension:
|
|
51
|
+
* unmeasured is not zero.
|
|
52
|
+
*/
|
|
53
|
+
private lastSample: GpuSample | null = null;
|
|
54
|
+
|
|
55
|
+
private readonly ext: TimerExtension | null;
|
|
56
|
+
private readonly sampleEvery: number;
|
|
57
|
+
/** Completed triples waiting to be read, oldest first. */
|
|
58
|
+
private readonly inFlight: { queries: WebGLQuery[]; slots: GpuSlot[] }[] = [];
|
|
59
|
+
private current: { queries: WebGLQuery[]; slots: GpuSlot[] } | null = null;
|
|
60
|
+
private open = false;
|
|
61
|
+
private frame = 0;
|
|
62
|
+
private measuring = false;
|
|
63
|
+
/** Whether `beginFrame` said yes for the frame being drawn. */
|
|
64
|
+
get sampling(): boolean {
|
|
65
|
+
return this.measuring;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
constructor(
|
|
69
|
+
private readonly gl: WebGL2RenderingContext,
|
|
70
|
+
sampleEvery = 8,
|
|
71
|
+
) {
|
|
72
|
+
this.ext = gl.getExtension('EXT_disjoint_timer_query_webgl2') as TimerExtension | null;
|
|
73
|
+
this.available = this.ext !== null;
|
|
74
|
+
this.sampleEvery = Math.max(1, Math.floor(sampleEvery));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Whether this frame is measured. Call once per frame, before any `begin`.
|
|
79
|
+
*
|
|
80
|
+
* `begin` and `end` do nothing on an unmeasured frame, so the skipped frames really
|
|
81
|
+
* are free rather than merely cheap.
|
|
82
|
+
*/
|
|
83
|
+
beginFrame(): boolean {
|
|
84
|
+
if (this.ext === null) return false;
|
|
85
|
+
const measured = this.frame % this.sampleEvery === 0;
|
|
86
|
+
this.frame++;
|
|
87
|
+
this.measuring = measured && this.inFlight.length < POOL_DEPTH;
|
|
88
|
+
if (this.measuring) this.current = { queries: [], slots: [] };
|
|
89
|
+
return this.measuring;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Close the frame and queue it for reading.
|
|
94
|
+
*
|
|
95
|
+
* Explicit rather than counting to three, because the shadow pass runs **several
|
|
96
|
+
* times a frame** — static, the depth peel, then dynamic — and the reflection pass
|
|
97
|
+
* may not run at all when water is off. A frame is over when the caller says so,
|
|
98
|
+
* and `poll` sums the brackets per slot, so three shadow passes are one shadow
|
|
99
|
+
* number rather than three partial ones.
|
|
100
|
+
*/
|
|
101
|
+
endFrame(): void {
|
|
102
|
+
if (!this.measuring || this.current === null) return;
|
|
103
|
+
if (this.current.queries.length > 0) this.inFlight.push(this.current);
|
|
104
|
+
this.current = null;
|
|
105
|
+
this.measuring = false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Open a bracket. Never two at once — `TIME_ELAPSED_EXT` cannot nest, and the
|
|
110
|
+
* partition is what guarantees `end` runs before the next `begin`.
|
|
111
|
+
*/
|
|
112
|
+
begin(slot: GpuSlot): void {
|
|
113
|
+
if (!this.measuring || this.ext === null || this.open) return;
|
|
114
|
+
const query = this.gl.createQuery();
|
|
115
|
+
if (query === null) return;
|
|
116
|
+
this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, query);
|
|
117
|
+
this.current?.queries.push(query);
|
|
118
|
+
this.current?.slots.push(slot);
|
|
119
|
+
this.open = true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
end(): void {
|
|
123
|
+
if (!this.measuring || this.ext === null || !this.open) return;
|
|
124
|
+
this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);
|
|
125
|
+
this.open = false;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* The oldest finished sample, or null. Never blocks and never waits for a result:
|
|
130
|
+
* a diagnostic that stalls the pipeline to measure it is measuring itself.
|
|
131
|
+
*/
|
|
132
|
+
poll(): GpuSample | null {
|
|
133
|
+
if (this.ext === null) return null;
|
|
134
|
+
const oldest = this.inFlight[0];
|
|
135
|
+
if (oldest === undefined) return null;
|
|
136
|
+
|
|
137
|
+
for (const query of oldest.queries) {
|
|
138
|
+
const ready = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT_AVAILABLE) as boolean;
|
|
139
|
+
if (!ready) return null;
|
|
140
|
+
}
|
|
141
|
+
this.inFlight.shift();
|
|
142
|
+
|
|
143
|
+
const disjoint = this.gl.getParameter(this.ext.GPU_DISJOINT_EXT) as boolean;
|
|
144
|
+
if (disjoint) {
|
|
145
|
+
this.disjointDrops++;
|
|
146
|
+
for (const query of oldest.queries) this.gl.deleteQuery(query);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Summed per slot, not assigned: the shadow pass runs once per layer, so a frame
|
|
151
|
+
// holds several `shadows` brackets and the answer is their total.
|
|
152
|
+
const parts: Record<GpuSlot, number> = { shadows: 0, reflection: 0, rest: 0 };
|
|
153
|
+
for (let i = 0; i < oldest.queries.length; i++) {
|
|
154
|
+
const query = oldest.queries[i] as WebGLQuery;
|
|
155
|
+
const slot = oldest.slots[i] as GpuSlot;
|
|
156
|
+
parts[slot] += (this.gl.getQueryParameter(query, this.gl.QUERY_RESULT) as number) / NS_PER_MS;
|
|
157
|
+
this.gl.deleteQuery(query);
|
|
158
|
+
}
|
|
159
|
+
this.lastSample = parts;
|
|
160
|
+
return parts;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The whole of the last resolved frame, in milliseconds, or null where nothing measured.
|
|
165
|
+
*
|
|
166
|
+
* The three brackets are summed because they partition the frame rather than overlapping:
|
|
167
|
+
* `shadows` and `reflection` are the passes drawn before the scene, `rest` is everything
|
|
168
|
+
* after. A caller wanting the breakdown reads `poll`, which is what the frame meter does.
|
|
169
|
+
*/
|
|
170
|
+
lastFrameMs(): number | null {
|
|
171
|
+
if (this.lastSample === null) return null;
|
|
172
|
+
return this.lastSample.shadows + this.lastSample.reflection + this.lastSample.rest;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
dispose(): void {
|
|
176
|
+
for (const pending of this.inFlight) {
|
|
177
|
+
for (const query of pending.queries) this.gl.deleteQuery(query);
|
|
178
|
+
}
|
|
179
|
+
this.inFlight.length = 0;
|
|
180
|
+
this.current = null;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** IEEE 754 binary16 conversion, shared by everything that has to hand a device half floats. */
|
|
2
|
+
|
|
3
|
+
/** IEEE 754 binary16, via a float32 view, which is the only exact way to read the bits. */
|
|
4
|
+
const conversion = new ArrayBuffer(4);
|
|
5
|
+
const asFloat = new Float32Array(conversion);
|
|
6
|
+
const asUint = new Uint32Array(conversion);
|
|
7
|
+
|
|
8
|
+
export function halfBits(value: number): number {
|
|
9
|
+
asFloat[0] = value;
|
|
10
|
+
const bits = asUint[0] ?? 0;
|
|
11
|
+
const sign = (bits >>> 16) & 0x8000;
|
|
12
|
+
let exponent = (bits >>> 23) & 0xff;
|
|
13
|
+
let mantissa = bits & 0x7fffff;
|
|
14
|
+
|
|
15
|
+
/* Infinity and NaN carry straight across; a NaN must stay a NaN rather than becoming infinity. */
|
|
16
|
+
if (exponent === 0xff) return sign | 0x7c00 | (mantissa === 0 ? 0 : 0x200);
|
|
17
|
+
|
|
18
|
+
/* Rebias 127 to 15. Above half's range saturates to infinity rather than wrapping to zero. */
|
|
19
|
+
exponent = exponent - 127 + 15;
|
|
20
|
+
if (exponent >= 0x1f) return sign | 0x7c00;
|
|
21
|
+
if (exponent <= 0) {
|
|
22
|
+
/*
|
|
23
|
+
* Subnormal. An environment's darkest texels live here, and flushing them to zero is what
|
|
24
|
+
* makes a night sky's gradient band — so they are shifted rather than discarded.
|
|
25
|
+
*/
|
|
26
|
+
if (exponent < -10) return sign;
|
|
27
|
+
mantissa |= 0x800000;
|
|
28
|
+
const shift = 14 - exponent;
|
|
29
|
+
return sign | (mantissa >>> shift);
|
|
30
|
+
}
|
|
31
|
+
return sign | (exponent << 10) | (mantissa >>> 13);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** A whole array of floats as binary16, which is what a `r16float` or `rgba16float` upload wants. */
|
|
35
|
+
export function toHalfFloats(values: Float32Array): Uint16Array {
|
|
36
|
+
const out = new Uint16Array(values.length);
|
|
37
|
+
for (let i = 0; i < values.length; i++) out[i] = halfBits(values[i] ?? 0);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A slot table addressed by generational handles.
|
|
3
|
+
*
|
|
4
|
+
* **The handle arithmetic, and nothing about what a handle names.** It came out of `pass.ts`
|
|
5
|
+
* when a second registry wanted exactly this: two copies of a generation rule are two chances to
|
|
6
|
+
* get the invalidation wrong, and the failure mode is a handle answering to whoever took its slot
|
|
7
|
+
* next — a use-after-free that reads as a leak.
|
|
8
|
+
*
|
|
9
|
+
* The definition type is a parameter rather than a union of the two kinds it holds. A union would
|
|
10
|
+
* oblige every caller to narrow a value it already knows the type of, and would make adding a
|
|
11
|
+
* third kind an edit to this file rather than to the caller that wanted it.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** How many bits of a handle are the slot. 4,096 registered definitions is far past generous. */
|
|
15
|
+
const SLOT_BITS = 12;
|
|
16
|
+
const SLOT_MASK = (1 << SLOT_BITS) - 1;
|
|
17
|
+
|
|
18
|
+
export interface HandleRegistry<T> {
|
|
19
|
+
definitions: (T | undefined)[];
|
|
20
|
+
/** Bumped whenever a slot is released, which is what invalidates the handles that named it. */
|
|
21
|
+
generations: number[];
|
|
22
|
+
/** Slots released and not yet reused, so registration does not grow the array forever. */
|
|
23
|
+
free: number[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function createHandleRegistry<T>(): HandleRegistry<T> {
|
|
27
|
+
return { definitions: [], generations: [], free: [] };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Take a slot and return the handle that names it.
|
|
32
|
+
*
|
|
33
|
+
* Handles start at 1: zero is a generation-0 slot-0 handle and would be indistinguishable from
|
|
34
|
+
* the number a caller gets from an uninitialised field, so generations start at 1 instead.
|
|
35
|
+
*/
|
|
36
|
+
export function registerIn<T>(registry: HandleRegistry<T>, definition: T): number {
|
|
37
|
+
const slot = registry.free.pop() ?? registry.definitions.length;
|
|
38
|
+
registry.definitions[slot] = definition;
|
|
39
|
+
registry.generations[slot] ??= 1;
|
|
40
|
+
return ((registry.generations[slot] ?? 1) << SLOT_BITS) | slot;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The definition a handle names, or `undefined` if it names one that has been released. */
|
|
44
|
+
export function definitionAt<T>(registry: HandleRegistry<T>, handle: number): T | undefined {
|
|
45
|
+
if (handle <= 0) return undefined;
|
|
46
|
+
const slot = handle & SLOT_MASK;
|
|
47
|
+
if (registry.generations[slot] !== handle >>> SLOT_BITS) return undefined;
|
|
48
|
+
return registry.definitions[slot];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Release a slot.
|
|
53
|
+
*
|
|
54
|
+
* Guarded on the handle still being live, so calling it twice frees the slot once — a slot
|
|
55
|
+
* pushed onto `free` twice is a slot handed to two different definitions.
|
|
56
|
+
*/
|
|
57
|
+
export function unregisterIn<T>(registry: HandleRegistry<T>, handle: number): T | undefined {
|
|
58
|
+
const definition = definitionAt(registry, handle);
|
|
59
|
+
if (definition === undefined) return undefined;
|
|
60
|
+
const slot = handle & SLOT_MASK;
|
|
61
|
+
registry.definitions[slot] = undefined;
|
|
62
|
+
registry.generations[slot] = (registry.generations[slot] ?? 1) + 1;
|
|
63
|
+
registry.free.push(slot);
|
|
64
|
+
return definition;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Release every slot still held, handing each definition to the caller on the way out.
|
|
69
|
+
*
|
|
70
|
+
* **Teardown's half of `unregisterIn`, and it was missing.** Both renderers hold registries like
|
|
71
|
+
* this one and neither emptied one when it was disposed, so a definition kept whatever `init`
|
|
72
|
+
* built — a pipeline, a bind group, its buffers — for as long as the process lived. A private
|
|
73
|
+
* field going out of scope is not a GPU object being destroyed. Written here rather than once per
|
|
74
|
+
* backend for the reason this module exists at all: two copies of a lifetime rule are two chances
|
|
75
|
+
* to get it wrong, and the one that is wrong is the one nobody reads.
|
|
76
|
+
*
|
|
77
|
+
* `release` is the caller's, because the device object a definition must be handed is the only
|
|
78
|
+
* part of this that is per-backend — and on one of them there is a condition on handing it over
|
|
79
|
+
* at all.
|
|
80
|
+
*
|
|
81
|
+
* Each slot is released *before* its definition is told, so a `release` that reaches back into
|
|
82
|
+
* this registry finds a slot already gone rather than one it can free twice.
|
|
83
|
+
*/
|
|
84
|
+
export function drainRegistry<T>(
|
|
85
|
+
registry: HandleRegistry<T>,
|
|
86
|
+
release: (definition: T) => void,
|
|
87
|
+
): void {
|
|
88
|
+
for (let slot = 0; slot < registry.definitions.length; slot += 1) {
|
|
89
|
+
if (registry.definitions[slot] === undefined) continue;
|
|
90
|
+
/* Rebuilt rather than remembered: the generation bump that invalidates the handles naming
|
|
91
|
+
this slot is `unregisterIn`'s to make, and making it twice is how a slot is freed twice. */
|
|
92
|
+
const handle = ((registry.generations[slot] ?? 1) << SLOT_BITS) | slot;
|
|
93
|
+
const definition = unregisterIn(registry, handle);
|
|
94
|
+
if (definition !== undefined) release(definition);
|
|
95
|
+
}
|
|
96
|
+
}
|