@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,108 @@
|
|
|
1
|
+
/** Model matrices for geometry that turns to face the viewer. */
|
|
2
|
+
|
|
3
|
+
import { mat4 } from 'gl-matrix';
|
|
4
|
+
import type { Camera } from './camera.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Orient a mesh so its +Z faces the camera, writing the model matrix in place.
|
|
8
|
+
*
|
|
9
|
+
* The two variants are a real distinction rather than a convenience pair, and picking
|
|
10
|
+
* the wrong one is the classic billboard mistake:
|
|
11
|
+
*
|
|
12
|
+
* - **Cylindrical** (`billboardMatrixY`) spins about the world Y axis only. Anything
|
|
13
|
+
* standing on the ground uses this — a figure, a sign, a tree. Look down at it from
|
|
14
|
+
* above and it stays upright, because a thing with feet does not tilt to face you.
|
|
15
|
+
* - **Spherical** (`billboardMatrix`) faces the camera on every axis. For something with
|
|
16
|
+
* no up of its own: a spark, a puff of smoke, a glow.
|
|
17
|
+
*
|
|
18
|
+
* Allocation-free: the caller owns the matrix and it is overwritten, so a frame drawing
|
|
19
|
+
* a hundred of these allocates nothing.
|
|
20
|
+
*/
|
|
21
|
+
export function billboardMatrixY(
|
|
22
|
+
out: mat4,
|
|
23
|
+
x: number,
|
|
24
|
+
y: number,
|
|
25
|
+
z: number,
|
|
26
|
+
cameraX: number,
|
|
27
|
+
cameraZ: number,
|
|
28
|
+
scaleX = 1,
|
|
29
|
+
scaleY = 1,
|
|
30
|
+
): void {
|
|
31
|
+
/*
|
|
32
|
+
* Yaw from the camera's *horizontal* offset only. Using the full 3D direction is what
|
|
33
|
+
* makes a standing figure lean back as the camera rises above it.
|
|
34
|
+
*/
|
|
35
|
+
const angle = Math.atan2(cameraX - x, cameraZ - z);
|
|
36
|
+
const sin = Math.sin(angle);
|
|
37
|
+
const cos = Math.cos(angle);
|
|
38
|
+
|
|
39
|
+
out[0] = cos * scaleX;
|
|
40
|
+
out[1] = 0;
|
|
41
|
+
out[2] = -sin * scaleX;
|
|
42
|
+
out[3] = 0;
|
|
43
|
+
|
|
44
|
+
out[4] = 0;
|
|
45
|
+
out[5] = scaleY;
|
|
46
|
+
out[6] = 0;
|
|
47
|
+
out[7] = 0;
|
|
48
|
+
|
|
49
|
+
out[8] = sin;
|
|
50
|
+
out[9] = 0;
|
|
51
|
+
out[10] = cos;
|
|
52
|
+
out[11] = 0;
|
|
53
|
+
|
|
54
|
+
out[12] = x;
|
|
55
|
+
out[13] = y;
|
|
56
|
+
out[14] = z;
|
|
57
|
+
out[15] = 1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Face the camera on every axis, for geometry with no up of its own.
|
|
62
|
+
*
|
|
63
|
+
* Built from the camera's own basis rather than from the direction to the eye, so a row
|
|
64
|
+
* of these stays mutually parallel instead of fanning out toward the viewer — the
|
|
65
|
+
* difference is obvious the moment two are near each other at the screen edge.
|
|
66
|
+
*/
|
|
67
|
+
export function billboardMatrix(
|
|
68
|
+
out: mat4,
|
|
69
|
+
x: number,
|
|
70
|
+
y: number,
|
|
71
|
+
z: number,
|
|
72
|
+
camera: Camera,
|
|
73
|
+
scaleX = 1,
|
|
74
|
+
scaleY = 1,
|
|
75
|
+
): void {
|
|
76
|
+
// The view matrix's upper 3x3 is the camera basis, transposed; its rows are the
|
|
77
|
+
// world-space right/up/forward we want the quad's axes to be.
|
|
78
|
+
const view = camera.view;
|
|
79
|
+
const rightX = view[0];
|
|
80
|
+
const rightY = view[4];
|
|
81
|
+
const rightZ = view[8];
|
|
82
|
+
const upX = view[1];
|
|
83
|
+
const upY = view[5];
|
|
84
|
+
const upZ = view[9];
|
|
85
|
+
const forwardX = view[2];
|
|
86
|
+
const forwardY = view[6];
|
|
87
|
+
const forwardZ = view[10];
|
|
88
|
+
|
|
89
|
+
out[0] = rightX * scaleX;
|
|
90
|
+
out[1] = rightY * scaleX;
|
|
91
|
+
out[2] = rightZ * scaleX;
|
|
92
|
+
out[3] = 0;
|
|
93
|
+
|
|
94
|
+
out[4] = upX * scaleY;
|
|
95
|
+
out[5] = upY * scaleY;
|
|
96
|
+
out[6] = upZ * scaleY;
|
|
97
|
+
out[7] = 0;
|
|
98
|
+
|
|
99
|
+
out[8] = forwardX;
|
|
100
|
+
out[9] = forwardY;
|
|
101
|
+
out[10] = forwardZ;
|
|
102
|
+
out[11] = 0;
|
|
103
|
+
|
|
104
|
+
out[12] = x;
|
|
105
|
+
out[13] = y;
|
|
106
|
+
out[14] = z;
|
|
107
|
+
out[15] = 1;
|
|
108
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How wide the bloom pyramid is, how far it reaches, and where it stops.
|
|
3
|
+
*
|
|
4
|
+
* **Backend-neutral because both backends build the same pyramid**, and a difference in any of
|
|
5
|
+
* these three numbers is a difference in the picture that nothing else would explain. The WebGL2
|
|
6
|
+
* pass held the only copy and the WebGPU composite was written without it, which is how one
|
|
7
|
+
* backend ended up running the first stage of eleven and calling it bloom: it drew, it validated,
|
|
8
|
+
* and the frame it produced was a thresholded image with no blur in it at all. Measured on
|
|
9
|
+
* night-court, that was 7,512 pixels moved against WebGL2's 47,574.
|
|
10
|
+
*
|
|
11
|
+
* `bloomPass.ts` binds these on one side and `webgpu/renderer.ts` on the other.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How many halvings the chain may take.
|
|
16
|
+
*
|
|
17
|
+
* Six covers a 4K frame down to about 30 pixels across, which is where a level stops describing
|
|
18
|
+
* a halo and starts describing the whole screen. Fewer would put an end on the falloff; more
|
|
19
|
+
* would spend draws on levels that add a flat tint.
|
|
20
|
+
*/
|
|
21
|
+
export const BLOOM_LEVELS = 6;
|
|
22
|
+
|
|
23
|
+
/** Below this a level is too small to describe anything but an average of the frame. */
|
|
24
|
+
export const BLOOM_MIN_SIDE = 8;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* How far the tent reaches on the way back up, in UV.
|
|
28
|
+
*
|
|
29
|
+
* In UV rather than in texels, so the spread is the same fraction of the picture on every
|
|
30
|
+
* display and at every level of the chain. This is the "one radius" of the three numbers this
|
|
31
|
+
* effect is allowed: it is fixed rather than exposed because nobody has asked to move it, and a
|
|
32
|
+
* caller who does gets it as a construction-time option rather than as a magic literal here.
|
|
33
|
+
*/
|
|
34
|
+
export const BLOOM_FILTER_RADIUS_UV = 0.005;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* What is wrong with a profile that asked for bloom, in words, or null when nothing is.
|
|
38
|
+
*
|
|
39
|
+
* **Shared because it is a fact about the profile rather than about a backend**, and because a
|
|
40
|
+
* warning that only one backend says is a warning half the consumers never see. WebGL2 said both
|
|
41
|
+
* of these at init and this backend said something else entirely from its setters — that the
|
|
42
|
+
* composite did not exist yet, which stopped being true the day it landed and went on being
|
|
43
|
+
* printed. A stale warning is worse than none: it tells somebody a working feature is broken.
|
|
44
|
+
*
|
|
45
|
+
* Not a clamp and not a refusal. The effect still runs and still spreads whatever passes its
|
|
46
|
+
* threshold. What it cannot do is separate a light from a white wall, because on a target that
|
|
47
|
+
* does not keep the range they arrive as the same colour. That is the class of fault this engine
|
|
48
|
+
* has shipped twice under other names — a shadow strength of zero behind an enabled shadow pass,
|
|
49
|
+
* an exposure with no curve to be exposed into — where everything is switched on, nothing is
|
|
50
|
+
* wrong, and nothing happens.
|
|
51
|
+
*/
|
|
52
|
+
export function bloomProfileWarning(quality: {
|
|
53
|
+
readonly bloom: number;
|
|
54
|
+
readonly screenEffects: boolean;
|
|
55
|
+
readonly hdrScene: boolean;
|
|
56
|
+
readonly bloomThreshold: number;
|
|
57
|
+
}): string | null {
|
|
58
|
+
if (quality.bloom <= 0) return null;
|
|
59
|
+
if (!quality.screenEffects) {
|
|
60
|
+
return (
|
|
61
|
+
'bloom needs screenEffects, since without the off-screen target there is no finished ' +
|
|
62
|
+
'frame to threshold. It is off.'
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
if (!quality.hdrScene) {
|
|
66
|
+
return (
|
|
67
|
+
`bloom is on with hdrScene off, so the scene is clipped to 0..1 before the composite ` +
|
|
68
|
+
`sees it and a threshold of ${quality.bloomThreshold} in scene units can only mean ` +
|
|
69
|
+
`whiteness. Turn hdrScene on, or set a threshold below 1.`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** One level of the pyramid: level 0 is half the frame and each one after it half again. */
|
|
76
|
+
export interface BloomLevelSize {
|
|
77
|
+
readonly width: number;
|
|
78
|
+
readonly height: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The pyramid for a frame of this size, largest first, or an empty list where none would fit.
|
|
83
|
+
*
|
|
84
|
+
* Empty is a real answer rather than a failure: a frame small enough that its half is under
|
|
85
|
+
* `BLOOM_MIN_SIDE` has nowhere for a halo to live, and a caller reads that as "no bloom this
|
|
86
|
+
* frame" exactly as it reads a target that would not allocate.
|
|
87
|
+
*/
|
|
88
|
+
export function bloomLevelSizes(width: number, height: number): BloomLevelSize[] {
|
|
89
|
+
const sizes: BloomLevelSize[] = [];
|
|
90
|
+
let levelWidth = width;
|
|
91
|
+
let levelHeight = height;
|
|
92
|
+
for (let level = 0; level < BLOOM_LEVELS; level++) {
|
|
93
|
+
levelWidth = Math.floor(levelWidth / 2);
|
|
94
|
+
levelHeight = Math.floor(levelHeight / 2);
|
|
95
|
+
/* Below this a level is a handful of texels describing the whole frame, which adds a
|
|
96
|
+
flat tint rather than a halo, and one more halving of a 3-pixel side is 1. */
|
|
97
|
+
if (levelWidth < BLOOM_MIN_SIDE || levelHeight < BLOOM_MIN_SIDE) break;
|
|
98
|
+
sizes.push({ width: levelWidth, height: levelHeight });
|
|
99
|
+
}
|
|
100
|
+
return sizes;
|
|
101
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BLOOM_DOWNSAMPLE_FRAG,
|
|
3
|
+
BLOOM_PREFILTER_FRAG,
|
|
4
|
+
BLOOM_UPSAMPLE_FRAG,
|
|
5
|
+
} from './shaders/bloom.ts';
|
|
6
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.ts';
|
|
7
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
8
|
+
import { BLOOM_FILTER_RADIUS_UV, bloomLevelSizes } from './bloomChain.ts';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The bloom chain: threshold the frame, halve it repeatedly, and add it back up.
|
|
12
|
+
*
|
|
13
|
+
* Its own module rather than more of `SceneTarget`, for the same reason `AmbientOcclusionPass`
|
|
14
|
+
* is: that class owns where the frame lands and how it reaches the canvas, and this owns one
|
|
15
|
+
* effect's targets and programs. The composite adds the texture this returns and knows nothing
|
|
16
|
+
* else about it.
|
|
17
|
+
*
|
|
18
|
+
* **A pyramid rather than one wide blur.** A gaussian broad enough to look like glare is
|
|
19
|
+
* hundreds of taps at full resolution. Halving the frame six times and adding the levels back
|
|
20
|
+
* costs about a third of a full-resolution pass in total, and the sum of the octaves is a
|
|
21
|
+
* falloff with no end to it, which is what a real glare has and a single kernel does not.
|
|
22
|
+
*/
|
|
23
|
+
export class BloomPass {
|
|
24
|
+
/** The chain, level 0 at half the frame and each one after it half again. */
|
|
25
|
+
private readonly levels: {
|
|
26
|
+
texture: WebGLTexture;
|
|
27
|
+
framebuffer: WebGLFramebuffer;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
}[] = [];
|
|
31
|
+
private width = 0;
|
|
32
|
+
private height = 0;
|
|
33
|
+
/**
|
|
34
|
+
* Set once if a target will not complete, after which this pass does nothing and says so once.
|
|
35
|
+
*
|
|
36
|
+
* The alternative to an honest "off" is a frame with a texture nobody wrote added into it,
|
|
37
|
+
* and the last time an effect here sampled an unwritten target the failure presented as the
|
|
38
|
+
* driver being at fault. See `sceneTarget.ts`.
|
|
39
|
+
*/
|
|
40
|
+
private unavailable = false;
|
|
41
|
+
/** Half floats where the part will render to them. See the note in `allocate`. */
|
|
42
|
+
private readonly floatColor: boolean;
|
|
43
|
+
|
|
44
|
+
private readonly prefilterProgram: WebGLProgram;
|
|
45
|
+
private readonly prefilterUniforms: Record<string, WebGLUniformLocation | null>;
|
|
46
|
+
private readonly downsampleProgram: WebGLProgram;
|
|
47
|
+
private readonly downsampleUniforms: Record<string, WebGLUniformLocation | null>;
|
|
48
|
+
private readonly upsampleProgram: WebGLProgram;
|
|
49
|
+
private readonly upsampleUniforms: Record<string, WebGLUniformLocation | null>;
|
|
50
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
51
|
+
/** Scratch for the source texel size, so a per-frame pass allocates nothing. */
|
|
52
|
+
private readonly texel = new Float32Array(2);
|
|
53
|
+
|
|
54
|
+
constructor(private readonly gl: WebGL2RenderingContext) {
|
|
55
|
+
/*
|
|
56
|
+
* The same extension the scene target asks for, and asked for here too rather than passed
|
|
57
|
+
* in: a chain of eight-bit levels would clip the very values it exists to spread, so a
|
|
58
|
+
* threshold above 1 would produce a black bloom on a part that has the extension for the
|
|
59
|
+
* scene and not for this. Without it the levels are eight-bit and bloom still works on
|
|
60
|
+
* whatever survives below 1, which is what the scene target itself is doing in that case.
|
|
61
|
+
*/
|
|
62
|
+
this.floatColor = gl.getExtension('EXT_color_buffer_float') !== null;
|
|
63
|
+
|
|
64
|
+
this.prefilterProgram = compileProgram(
|
|
65
|
+
gl,
|
|
66
|
+
FULLSCREEN_VERT,
|
|
67
|
+
BLOOM_PREFILTER_FRAG,
|
|
68
|
+
'bloomPrefilter',
|
|
69
|
+
);
|
|
70
|
+
this.prefilterUniforms = uniformLocations(gl, this.prefilterProgram, 'bloomPrefilter');
|
|
71
|
+
this.downsampleProgram = compileProgram(
|
|
72
|
+
gl,
|
|
73
|
+
FULLSCREEN_VERT,
|
|
74
|
+
BLOOM_DOWNSAMPLE_FRAG,
|
|
75
|
+
'bloomDownsample',
|
|
76
|
+
);
|
|
77
|
+
this.downsampleUniforms = uniformLocations(gl, this.downsampleProgram, 'bloomDownsample');
|
|
78
|
+
this.upsampleProgram = compileProgram(
|
|
79
|
+
gl,
|
|
80
|
+
FULLSCREEN_VERT,
|
|
81
|
+
BLOOM_UPSAMPLE_FRAG,
|
|
82
|
+
'bloomUpsample',
|
|
83
|
+
);
|
|
84
|
+
this.upsampleUniforms = uniformLocations(gl, this.upsampleProgram, 'bloomUpsample');
|
|
85
|
+
|
|
86
|
+
const vao = gl.createVertexArray();
|
|
87
|
+
if (vao === null) throw new Error('BloomPass: createVertexArray failed');
|
|
88
|
+
this.vao = vao;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private ensureSize(width: number, height: number): boolean {
|
|
92
|
+
if (this.unavailable) return false;
|
|
93
|
+
if (this.width === width && this.height === height && this.levels.length > 0) return true;
|
|
94
|
+
const { gl } = this;
|
|
95
|
+
this.width = width;
|
|
96
|
+
this.height = height;
|
|
97
|
+
this.release();
|
|
98
|
+
|
|
99
|
+
/* The shape of the pyramid is shared, so the other backend cannot build a different one. */
|
|
100
|
+
for (const { width: levelWidth, height: levelHeight } of bloomLevelSizes(width, height)) {
|
|
101
|
+
const texture = this.allocate(levelWidth, levelHeight);
|
|
102
|
+
const framebuffer = gl.createFramebuffer();
|
|
103
|
+
if (texture === null || framebuffer === null) break;
|
|
104
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
105
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
106
|
+
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
107
|
+
gl.deleteFramebuffer(framebuffer);
|
|
108
|
+
gl.deleteTexture(texture);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
this.levels.push({ texture, framebuffer, width: levelWidth, height: levelHeight });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
115
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
116
|
+
|
|
117
|
+
if (this.levels.length === 0) {
|
|
118
|
+
this.unavailable = true;
|
|
119
|
+
console.warn(
|
|
120
|
+
'BloomPass: no level of the chain would allocate, so bloom is off. The frame itself ' +
|
|
121
|
+
'is unaffected.',
|
|
122
|
+
);
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private allocate(width: number, height: number): WebGLTexture | null {
|
|
129
|
+
const { gl } = this;
|
|
130
|
+
const texture = gl.createTexture();
|
|
131
|
+
if (texture === null) return null;
|
|
132
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
133
|
+
/*
|
|
134
|
+
* `RGBA16F` where it is renderable. Half floats are filterable in WebGL2 without an
|
|
135
|
+
* extension — it is *rendering* to them that needs `EXT_color_buffer_float` — so linear
|
|
136
|
+
* filtering below is safe either way.
|
|
137
|
+
*/
|
|
138
|
+
if (this.floatColor) {
|
|
139
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, width, height, 0, gl.RGBA, gl.HALF_FLOAT, null);
|
|
140
|
+
} else {
|
|
141
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
142
|
+
}
|
|
143
|
+
/* Linear, because every stage samples between texels on purpose: that is where the spread
|
|
144
|
+
comes from, and NEAREST here would show the pyramid as blocks. */
|
|
145
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
146
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
147
|
+
/* Clamped, or a tap past the edge pulls the opposite side of the screen into the corner —
|
|
148
|
+
and at the deepest level, where one texel is a large part of the frame, that is a bright
|
|
149
|
+
smear from somewhere the viewer is not looking. */
|
|
150
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
151
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
152
|
+
return texture;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Build the frame's bloom. Returns the texture to add, or null if this pass could not run,
|
|
157
|
+
* which the caller must read as "no bloom" rather than as black.
|
|
158
|
+
*
|
|
159
|
+
* `threshold` is in scene units, so it only separates a light from white paint on a target
|
|
160
|
+
* that kept the range. The caller owns that decision and the warning that goes with it.
|
|
161
|
+
*/
|
|
162
|
+
run(scene: WebGLTexture, width: number, height: number, threshold: number): WebGLTexture | null {
|
|
163
|
+
if (!this.ensureSize(width, height)) return null;
|
|
164
|
+
const { gl } = this;
|
|
165
|
+
const levels = this.levels;
|
|
166
|
+
const top = levels[0];
|
|
167
|
+
if (top === undefined) return null;
|
|
168
|
+
|
|
169
|
+
/* One triangle over targets with no depth attachment. Anything inherited from the scene
|
|
170
|
+
pass would be tested against a buffer that is not there. */
|
|
171
|
+
gl.disable(gl.DEPTH_TEST);
|
|
172
|
+
gl.disable(gl.BLEND);
|
|
173
|
+
gl.disable(gl.CULL_FACE);
|
|
174
|
+
gl.depthMask(false);
|
|
175
|
+
gl.bindVertexArray(this.vao);
|
|
176
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
177
|
+
|
|
178
|
+
/* Threshold, full resolution into level 0. The only stage that reads the scene. */
|
|
179
|
+
gl.useProgram(this.prefilterProgram);
|
|
180
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, top.framebuffer);
|
|
181
|
+
gl.viewport(0, 0, top.width, top.height);
|
|
182
|
+
gl.bindTexture(gl.TEXTURE_2D, scene);
|
|
183
|
+
gl.uniform1i(this.prefilterUniforms['uSource'] ?? null, 0);
|
|
184
|
+
gl.uniform1f(this.prefilterUniforms['uThreshold'] ?? null, threshold);
|
|
185
|
+
this.uploadTexel(this.prefilterUniforms, width, height);
|
|
186
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
187
|
+
|
|
188
|
+
/* Down the chain. Each level reads the one above it, which was written a draw ago. */
|
|
189
|
+
gl.useProgram(this.downsampleProgram);
|
|
190
|
+
gl.uniform1i(this.downsampleUniforms['uSource'] ?? null, 0);
|
|
191
|
+
for (let index = 1; index < levels.length; index++) {
|
|
192
|
+
const target = levels[index];
|
|
193
|
+
const source = levels[index - 1];
|
|
194
|
+
if (target === undefined || source === undefined) break;
|
|
195
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);
|
|
196
|
+
gl.viewport(0, 0, target.width, target.height);
|
|
197
|
+
gl.bindTexture(gl.TEXTURE_2D, source.texture);
|
|
198
|
+
this.uploadTexel(this.downsampleUniforms, source.width, source.height);
|
|
199
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* And back up, adding into each level rather than replacing it, so level 0 ends up holding
|
|
204
|
+
* every octave at once. Additive blending rather than a second target to ping-pong through:
|
|
205
|
+
* a level is only ever read while a *different* level is bound, so there is no feedback.
|
|
206
|
+
*/
|
|
207
|
+
gl.enable(gl.BLEND);
|
|
208
|
+
gl.blendFunc(gl.ONE, gl.ONE);
|
|
209
|
+
gl.useProgram(this.upsampleProgram);
|
|
210
|
+
gl.uniform1i(this.upsampleUniforms['uSource'] ?? null, 0);
|
|
211
|
+
gl.uniform1f(this.upsampleUniforms['uRadius'] ?? null, BLOOM_FILTER_RADIUS_UV);
|
|
212
|
+
for (let index = levels.length - 1; index > 0; index--) {
|
|
213
|
+
const target = levels[index - 1];
|
|
214
|
+
const source = levels[index];
|
|
215
|
+
if (target === undefined || source === undefined) break;
|
|
216
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, target.framebuffer);
|
|
217
|
+
gl.viewport(0, 0, target.width, target.height);
|
|
218
|
+
gl.bindTexture(gl.TEXTURE_2D, source.texture);
|
|
219
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
gl.disable(gl.BLEND);
|
|
223
|
+
gl.bindVertexArray(null);
|
|
224
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
225
|
+
return top.texture;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** One source texel in UV, which is what the thirteen taps are laid out in. */
|
|
229
|
+
private uploadTexel(
|
|
230
|
+
uniforms: Record<string, WebGLUniformLocation | null>,
|
|
231
|
+
width: number,
|
|
232
|
+
height: number,
|
|
233
|
+
): void {
|
|
234
|
+
this.texel[0] = 1 / width;
|
|
235
|
+
this.texel[1] = 1 / height;
|
|
236
|
+
this.gl.uniform2fv(uniforms['uTexel'] ?? null, this.texel);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private release(): void {
|
|
240
|
+
const { gl } = this;
|
|
241
|
+
for (const level of this.levels) {
|
|
242
|
+
gl.deleteFramebuffer(level.framebuffer);
|
|
243
|
+
gl.deleteTexture(level.texture);
|
|
244
|
+
}
|
|
245
|
+
this.levels.length = 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
dispose(): void {
|
|
249
|
+
const { gl } = this;
|
|
250
|
+
this.release();
|
|
251
|
+
gl.deleteProgram(this.prefilterProgram);
|
|
252
|
+
gl.deleteProgram(this.downsampleProgram);
|
|
253
|
+
gl.deleteProgram(this.upsampleProgram);
|
|
254
|
+
gl.deleteVertexArray(this.vao);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
2
|
+
import { BOLT_FRAG, BOLT_VERT } from './shaders/bolt.ts';
|
|
3
|
+
import { buildSegmentQuads, expandBoltSegments } from './segmentQuads.ts';
|
|
4
|
+
import type { BoltSegments } from './boltPool.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One draw call for a pool of electrical arcs.
|
|
8
|
+
*
|
|
9
|
+
* Four vertices per segment rather than instancing, because a segment's two
|
|
10
|
+
* endpoints *are* its geometry — there is no repeated base shape to instance, and
|
|
11
|
+
* an instanced version would upload the same two positions per vertex anyway.
|
|
12
|
+
*
|
|
13
|
+
* Additive and depth-tested without writing depth, like every other emissive
|
|
14
|
+
* effect here: an arc adds light to what is behind it and must not occlude
|
|
15
|
+
* whatever is drawn next.
|
|
16
|
+
*/
|
|
17
|
+
export class BoltBatch {
|
|
18
|
+
readonly program: WebGLProgram;
|
|
19
|
+
readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
20
|
+
|
|
21
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
22
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
23
|
+
private readonly fromBuffer: WebGLBuffer;
|
|
24
|
+
private readonly toBuffer: WebGLBuffer;
|
|
25
|
+
private readonly arcBuffer: WebGLBuffer;
|
|
26
|
+
/** Scratch, expanded from the pool's per-segment arrays to per-vertex ones. */
|
|
27
|
+
private readonly from: Float32Array;
|
|
28
|
+
private readonly to: Float32Array;
|
|
29
|
+
private readonly arc: Float32Array;
|
|
30
|
+
private readonly capacity: number;
|
|
31
|
+
|
|
32
|
+
constructor(gl: WebGL2RenderingContext, capacity: number, label: string) {
|
|
33
|
+
this.program = compileProgram(gl, BOLT_VERT, BOLT_FRAG, label);
|
|
34
|
+
this.uniforms = uniformLocations(gl, this.program, 'boltBatch');
|
|
35
|
+
this.capacity = capacity;
|
|
36
|
+
|
|
37
|
+
const verts = capacity * 4;
|
|
38
|
+
this.from = new Float32Array(verts * 3);
|
|
39
|
+
this.to = new Float32Array(verts * 3);
|
|
40
|
+
this.arc = new Float32Array(verts * 4);
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* The corner layout and the index list are the only static data: which end of
|
|
44
|
+
* the segment a vertex sits at, and which side of it. Everything else arrives
|
|
45
|
+
* per frame. Built in `segmentQuads.ts`, so both backends draw one arc.
|
|
46
|
+
*/
|
|
47
|
+
const { corners, indices } = buildSegmentQuads(capacity);
|
|
48
|
+
|
|
49
|
+
const vao = gl.createVertexArray();
|
|
50
|
+
if (vao === null) throw new Error(`${label}: createVertexArray failed`);
|
|
51
|
+
this.vao = vao;
|
|
52
|
+
gl.bindVertexArray(vao);
|
|
53
|
+
this.fromBuffer = this.dynamic(gl, 0, verts * 3, 3, label);
|
|
54
|
+
this.toBuffer = this.dynamic(gl, 1, verts * 3, 3, label);
|
|
55
|
+
this.staticAttr(gl, 2, corners, 2, label);
|
|
56
|
+
this.arcBuffer = this.dynamic(gl, 3, verts * 4, 4, label);
|
|
57
|
+
|
|
58
|
+
const indexBuffer = gl.createBuffer();
|
|
59
|
+
if (indexBuffer === null) throw new Error(`${label}: createBuffer failed`);
|
|
60
|
+
this.buffers.push(indexBuffer);
|
|
61
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
62
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
63
|
+
gl.bindVertexArray(null);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Send this frame's arcs, expanding each segment to its four vertices.
|
|
68
|
+
*
|
|
69
|
+
* The expansion is `segmentQuads.ts`'s because it is a fact about how the geometry is drawn
|
|
70
|
+
* rather than about GL — the pool is deliberately GL-free and testable, and the WebGPU batch
|
|
71
|
+
* needs exactly the same four vertices.
|
|
72
|
+
*/
|
|
73
|
+
upload(gl: WebGL2RenderingContext, data: BoltSegments): number {
|
|
74
|
+
const count = expandBoltSegments(data, this.capacity, this.from, this.to, this.arc);
|
|
75
|
+
if (count === 0) return 0;
|
|
76
|
+
const verts = count * 4;
|
|
77
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.fromBuffer);
|
|
78
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.from, 0, verts * 3);
|
|
79
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.toBuffer);
|
|
80
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.to, 0, verts * 3);
|
|
81
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.arcBuffer);
|
|
82
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.arc, 0, verts * 4);
|
|
83
|
+
return count;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
drawTo(gl: WebGL2RenderingContext, segmentCount: number): void {
|
|
87
|
+
if (segmentCount === 0) return;
|
|
88
|
+
gl.enable(gl.BLEND);
|
|
89
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
|
|
90
|
+
gl.depthMask(false);
|
|
91
|
+
gl.disable(gl.CULL_FACE);
|
|
92
|
+
|
|
93
|
+
gl.bindVertexArray(this.vao);
|
|
94
|
+
gl.drawElements(gl.TRIANGLES, segmentCount * 6, gl.UNSIGNED_INT, 0);
|
|
95
|
+
gl.bindVertexArray(null);
|
|
96
|
+
|
|
97
|
+
gl.enable(gl.CULL_FACE);
|
|
98
|
+
gl.depthMask(true);
|
|
99
|
+
gl.disable(gl.BLEND);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
103
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
104
|
+
this.buffers.length = 0;
|
|
105
|
+
gl.deleteVertexArray(this.vao);
|
|
106
|
+
gl.deleteProgram(this.program);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private dynamic(
|
|
110
|
+
gl: WebGL2RenderingContext,
|
|
111
|
+
location: number,
|
|
112
|
+
floats: number,
|
|
113
|
+
size: number,
|
|
114
|
+
label: string,
|
|
115
|
+
): WebGLBuffer {
|
|
116
|
+
const buffer = gl.createBuffer();
|
|
117
|
+
if (buffer === null) throw new Error(`${label}: createBuffer failed`);
|
|
118
|
+
this.buffers.push(buffer);
|
|
119
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
120
|
+
gl.bufferData(gl.ARRAY_BUFFER, floats * 4, gl.DYNAMIC_DRAW);
|
|
121
|
+
gl.enableVertexAttribArray(location);
|
|
122
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
123
|
+
return buffer;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private staticAttr(
|
|
127
|
+
gl: WebGL2RenderingContext,
|
|
128
|
+
location: number,
|
|
129
|
+
data: Float32Array,
|
|
130
|
+
size: number,
|
|
131
|
+
label: string,
|
|
132
|
+
): void {
|
|
133
|
+
const buffer = gl.createBuffer();
|
|
134
|
+
if (buffer === null) throw new Error(`${label}: createBuffer failed`);
|
|
135
|
+
this.buffers.push(buffer);
|
|
136
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
137
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
138
|
+
gl.enableVertexAttribArray(location);
|
|
139
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
140
|
+
}
|
|
141
|
+
}
|