@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,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Occlusion culling: a small depth buffer of declared occluders, a max pyramid over it, and a
|
|
3
|
+
* rectangle test per object.
|
|
4
|
+
*
|
|
5
|
+
* **On the CPU, and that is the decision the whole design turns on.** The two obvious answers are
|
|
6
|
+
* hardware occlusion queries and a GPU depth pyramid, and each of them fails a rule this engine
|
|
7
|
+
* already holds. A query answers a frame late and needs a bounding-box draw per candidate, so a
|
|
8
|
+
* newly-visible object pops in — and the two backends spell it differently, which is the parity
|
|
9
|
+
* risk `AGENTS.md` names. A GPU pyramid over the frame's own depth has to be *read back* to cull on
|
|
10
|
+
* the CPU, which stalls, or tested in a compute shader, which WebGL2 does not have at all. Neither
|
|
11
|
+
* of them can be tested without a GPU, and this repository's whole culling story — `sphereInFrustum`,
|
|
12
|
+
* `boundsVisible`, `lodForBounds` — is assertions over arithmetic.
|
|
13
|
+
*
|
|
14
|
+
* So: **the consumer declares its occluders** — a wall, a building, a terrain slab, the few large
|
|
15
|
+
* things a scene is actually hidden by — and this rasterises them into a buffer a few hundred
|
|
16
|
+
* texels wide. *What that gives up* is that a small object never occludes anything: a crowd does
|
|
17
|
+
* not hide the crowd behind it. *What would reverse it* is a scene whose occlusion is genuinely
|
|
18
|
+
* made of small things, where the answer is a query-based scheme and its one-frame latency.
|
|
19
|
+
*
|
|
20
|
+
* **Everything here errs toward drawing.** A cull that is wrong in the other direction is a hole in
|
|
21
|
+
* the world, and there is no threshold that makes it acceptable. Three constructions keep it that
|
|
22
|
+
* way and each is worth naming:
|
|
23
|
+
*
|
|
24
|
+
* - **Back faces, not front.** A box hides whatever is behind its *far* surface, so the buffer
|
|
25
|
+
* holds the depth of the occluder's back and an object is culled only when it is deeper than
|
|
26
|
+
* that. Rasterising the near face would cull everything inside the box as well.
|
|
27
|
+
* - **Eroded by one texel.** A triangle sampled at texel centres covers up to half a texel more
|
|
28
|
+
* than it should at every silhouette. One dilation of the *unwritten* texels takes that back, at
|
|
29
|
+
* the cost of a one-texel border of occluder nobody misses.
|
|
30
|
+
* - **A max pyramid, tested against the object's nearest point.** The object is culled only if
|
|
31
|
+
* every texel its rectangle touches is already covered by something nearer, which is what taking
|
|
32
|
+
* the maximum bound over the rectangle and comparing the object's minimum depth says.
|
|
33
|
+
*/
|
|
34
|
+
/** What an unwritten texel holds: the far plane, which occludes nothing. */
|
|
35
|
+
const FAR = 1;
|
|
36
|
+
export class OcclusionBuffer {
|
|
37
|
+
/**
|
|
38
|
+
* The pyramid, level 0 first, each level a quarter of the one before.
|
|
39
|
+
*
|
|
40
|
+
* One allocation per level rather than one buffer with offsets, because the test indexes a level
|
|
41
|
+
* by its own width and an offset table would be a second thing to keep in step.
|
|
42
|
+
*/
|
|
43
|
+
levels = [];
|
|
44
|
+
widths = [];
|
|
45
|
+
heights = [];
|
|
46
|
+
built = false;
|
|
47
|
+
occluders = 0;
|
|
48
|
+
/** The view-projection this frame's occluders were rasterised through. */
|
|
49
|
+
viewProj = new Float32Array(16);
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.resize(options);
|
|
52
|
+
}
|
|
53
|
+
get width() {
|
|
54
|
+
return this.widths[0] ?? 0;
|
|
55
|
+
}
|
|
56
|
+
get height() {
|
|
57
|
+
return this.heights[0] ?? 0;
|
|
58
|
+
}
|
|
59
|
+
/** How many occluders were declared this frame. Zero means every test answers "draw it". */
|
|
60
|
+
get declared() {
|
|
61
|
+
return this.occluders;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Rebuild the pyramid for a new size. Called when the drawing buffer's aspect changes.
|
|
65
|
+
*
|
|
66
|
+
* Levels stop at 1x1: the coarsest level is one texel covering the whole frame, which is what a
|
|
67
|
+
* rectangle spanning the screen is tested against.
|
|
68
|
+
*/
|
|
69
|
+
resize(options) {
|
|
70
|
+
const width = Math.max(1, Math.round(options.width));
|
|
71
|
+
const height = Math.max(1, Math.round(options.height));
|
|
72
|
+
if (width === this.widths[0] && height === this.heights[0])
|
|
73
|
+
return;
|
|
74
|
+
this.levels = [];
|
|
75
|
+
this.widths = [];
|
|
76
|
+
this.heights = [];
|
|
77
|
+
let w = width;
|
|
78
|
+
let h = height;
|
|
79
|
+
for (;;) {
|
|
80
|
+
this.levels.push(new Float32Array(w * h));
|
|
81
|
+
this.widths.push(w);
|
|
82
|
+
this.heights.push(h);
|
|
83
|
+
if (w === 1 && h === 1)
|
|
84
|
+
break;
|
|
85
|
+
w = Math.max(1, w >> 1);
|
|
86
|
+
h = Math.max(1, h >> 1);
|
|
87
|
+
}
|
|
88
|
+
this.built = false;
|
|
89
|
+
}
|
|
90
|
+
/** Start a frame: clear to the far plane and take the matrix everything will be projected by. */
|
|
91
|
+
begin(viewProj) {
|
|
92
|
+
const base = this.levels[0];
|
|
93
|
+
if (base !== undefined)
|
|
94
|
+
base.fill(FAR);
|
|
95
|
+
for (let i = 0; i < 16; i++)
|
|
96
|
+
this.viewProj[i] = viewProj[i] ?? 0;
|
|
97
|
+
this.built = false;
|
|
98
|
+
this.occluders = 0;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Declare one occluder: a box in local space, placed by a model matrix.
|
|
102
|
+
*
|
|
103
|
+
* **A box rather than the mesh**, which is the same bargain a bounding sphere makes for the
|
|
104
|
+
* frustum: an occluder that is smaller than the thing it stands for is conservative, and a
|
|
105
|
+
* consumer knows the box that fits inside its wall. *What would make it wrong* is a consumer
|
|
106
|
+
* handing the mesh's own bounds for a shape with a hole in it, which would occlude through the
|
|
107
|
+
* hole — so the parameter is the box you may safely be hidden by, not the box you occupy.
|
|
108
|
+
*/
|
|
109
|
+
addOccluder(min, max, model) {
|
|
110
|
+
for (let corner = 0; corner < 8; corner++) {
|
|
111
|
+
const x = corner & 1 ? (max[0] ?? 0) : (min[0] ?? 0);
|
|
112
|
+
const y = corner & 2 ? (max[1] ?? 0) : (min[1] ?? 0);
|
|
113
|
+
const z = corner & 4 ? (max[2] ?? 0) : (min[2] ?? 0);
|
|
114
|
+
const wx = (model[0] ?? 0) * x + (model[4] ?? 0) * y + (model[8] ?? 0) * z + (model[12] ?? 0);
|
|
115
|
+
const wy = (model[1] ?? 0) * x + (model[5] ?? 0) * y + (model[9] ?? 0) * z + (model[13] ?? 0);
|
|
116
|
+
const wz = (model[2] ?? 0) * x + (model[6] ?? 0) * y + (model[10] ?? 0) * z + (model[14] ?? 0);
|
|
117
|
+
if (!this.project(wx, wy, wz, corner))
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.occluders++;
|
|
121
|
+
/*
|
|
122
|
+
* The six faces, wound so that each is counter-clockwise seen from outside. Only the ones
|
|
123
|
+
* facing *away* from the camera are rasterised: a box hides what is behind its far surface,
|
|
124
|
+
* and the near one would cull the box's own interior.
|
|
125
|
+
*/
|
|
126
|
+
for (let face = 0; face < 6; face++) {
|
|
127
|
+
const a = FACES[face * 4] ?? 0;
|
|
128
|
+
const b = FACES[face * 4 + 1] ?? 0;
|
|
129
|
+
const c = FACES[face * 4 + 2] ?? 0;
|
|
130
|
+
const d = FACES[face * 4 + 3] ?? 0;
|
|
131
|
+
/* Screen-space winding: a back face comes out clockwise once projected. */
|
|
132
|
+
if (signedArea(CORNERS, a, b, c) >= 0)
|
|
133
|
+
continue;
|
|
134
|
+
this.triangle(a, b, c);
|
|
135
|
+
this.triangle(a, c, d);
|
|
136
|
+
}
|
|
137
|
+
this.built = false;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Whether a bounding sphere is entirely behind the declared occluders.
|
|
141
|
+
*
|
|
142
|
+
* **False whenever anything is uncertain**, which is every case the arithmetic cannot settle: no
|
|
143
|
+
* occluders, a sphere crossing the near plane, a rectangle off the side of the frame. Drawing
|
|
144
|
+
* something hidden costs a draw call; culling something visible is a hole.
|
|
145
|
+
*/
|
|
146
|
+
occluded(bounds, model) {
|
|
147
|
+
if (this.occluders === 0)
|
|
148
|
+
return false;
|
|
149
|
+
if (!this.built)
|
|
150
|
+
this.buildPyramid();
|
|
151
|
+
const cx = bounds.centre[0] ?? 0;
|
|
152
|
+
const cy = bounds.centre[1] ?? 0;
|
|
153
|
+
const cz = bounds.centre[2] ?? 0;
|
|
154
|
+
const m0 = model[0] ?? 0;
|
|
155
|
+
const m1 = model[1] ?? 0;
|
|
156
|
+
const m2 = model[2] ?? 0;
|
|
157
|
+
const m4 = model[4] ?? 0;
|
|
158
|
+
const m5 = model[5] ?? 0;
|
|
159
|
+
const m6 = model[6] ?? 0;
|
|
160
|
+
const m8 = model[8] ?? 0;
|
|
161
|
+
const m9 = model[9] ?? 0;
|
|
162
|
+
const m10 = model[10] ?? 0;
|
|
163
|
+
const x = m0 * cx + m4 * cy + m8 * cz + (model[12] ?? 0);
|
|
164
|
+
const y = m1 * cx + m5 * cy + m9 * cz + (model[13] ?? 0);
|
|
165
|
+
const z = m2 * cx + m6 * cy + m10 * cz + (model[14] ?? 0);
|
|
166
|
+
/* The same largest-axis rule `boundsVisible` uses, and for the same reason. */
|
|
167
|
+
const sx = Math.sqrt(m0 * m0 + m1 * m1 + m2 * m2);
|
|
168
|
+
const sy = Math.sqrt(m4 * m4 + m5 * m5 + m6 * m6);
|
|
169
|
+
const sz = Math.sqrt(m8 * m8 + m9 * m9 + m10 * m10);
|
|
170
|
+
const radius = bounds.radius * Math.max(sx, sy, sz);
|
|
171
|
+
/* The cube that contains the sphere, which contains the object. Conservative twice over. */
|
|
172
|
+
let minX = Infinity;
|
|
173
|
+
let minY = Infinity;
|
|
174
|
+
let minZ = Infinity;
|
|
175
|
+
let maxX = -Infinity;
|
|
176
|
+
let maxY = -Infinity;
|
|
177
|
+
for (let corner = 0; corner < 8; corner++) {
|
|
178
|
+
const px = corner & 1 ? x + radius : x - radius;
|
|
179
|
+
const py = corner & 2 ? y + radius : y - radius;
|
|
180
|
+
const pz = corner & 4 ? z + radius : z - radius;
|
|
181
|
+
if (!this.project(px, py, pz, 0))
|
|
182
|
+
return false;
|
|
183
|
+
minX = Math.min(minX, CORNERS[0] ?? 0);
|
|
184
|
+
maxX = Math.max(maxX, CORNERS[0] ?? 0);
|
|
185
|
+
minY = Math.min(minY, CORNERS[1] ?? 0);
|
|
186
|
+
maxY = Math.max(maxY, CORNERS[1] ?? 0);
|
|
187
|
+
minZ = Math.min(minZ, CORNERS[2] ?? 0);
|
|
188
|
+
}
|
|
189
|
+
const width = this.widths[0] ?? 1;
|
|
190
|
+
const height = this.heights[0] ?? 1;
|
|
191
|
+
/* Off the side of the frame: the frustum test owns that answer, and this one abstains. */
|
|
192
|
+
if (minX < 0 || minY < 0 || maxX > width || maxY > height)
|
|
193
|
+
return false;
|
|
194
|
+
/*
|
|
195
|
+
* The coarsest level whose texel is at least as wide as the rectangle, so the test reads at
|
|
196
|
+
* most two texels each way. `Math.log2` would say the same thing and is one of the calls this
|
|
197
|
+
* repository's determinism gate refuses elsewhere; a shift loop says it in integers.
|
|
198
|
+
*/
|
|
199
|
+
let level = 0;
|
|
200
|
+
let span = Math.max(maxX - minX, maxY - minY);
|
|
201
|
+
while (span > 1 && level + 1 < this.levels.length) {
|
|
202
|
+
span *= 0.5;
|
|
203
|
+
level++;
|
|
204
|
+
}
|
|
205
|
+
const buffer = this.levels[level];
|
|
206
|
+
const lw = this.widths[level] ?? 1;
|
|
207
|
+
const lh = this.heights[level] ?? 1;
|
|
208
|
+
if (buffer === undefined)
|
|
209
|
+
return false;
|
|
210
|
+
const scale = 1 / (1 << level);
|
|
211
|
+
const x0 = Math.max(0, Math.floor(minX * scale));
|
|
212
|
+
const y0 = Math.max(0, Math.floor(minY * scale));
|
|
213
|
+
const x1 = Math.min(lw - 1, Math.floor(maxX * scale));
|
|
214
|
+
const y1 = Math.min(lh - 1, Math.floor(maxY * scale));
|
|
215
|
+
let bound = -Infinity;
|
|
216
|
+
for (let ty = y0; ty <= y1; ty++) {
|
|
217
|
+
for (let tx = x0; tx <= x1; tx++) {
|
|
218
|
+
const value = buffer[ty * lw + tx] ?? FAR;
|
|
219
|
+
if (value > bound)
|
|
220
|
+
bound = value;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/* Culled only when the object's nearest point is behind everything covering its rectangle. */
|
|
224
|
+
return minZ > bound;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* A world point into buffer coordinates and depth, written into `CORNERS` at `slot`.
|
|
228
|
+
*
|
|
229
|
+
* Returns false for a point at or behind the eye, where the perspective divide has no meaning —
|
|
230
|
+
* and a false anywhere abandons the whole shape, occluder or occludee, because a partial
|
|
231
|
+
* projection is exactly the kind of half-answer that produces a hole.
|
|
232
|
+
*/
|
|
233
|
+
project(x, y, z, slot) {
|
|
234
|
+
const m = this.viewProj;
|
|
235
|
+
const cx = (m[0] ?? 0) * x + (m[4] ?? 0) * y + (m[8] ?? 0) * z + (m[12] ?? 0);
|
|
236
|
+
const cy = (m[1] ?? 0) * x + (m[5] ?? 0) * y + (m[9] ?? 0) * z + (m[13] ?? 0);
|
|
237
|
+
const cz = (m[2] ?? 0) * x + (m[6] ?? 0) * y + (m[10] ?? 0) * z + (m[14] ?? 0);
|
|
238
|
+
const cw = (m[3] ?? 0) * x + (m[7] ?? 0) * y + (m[11] ?? 0) * z + (m[15] ?? 0);
|
|
239
|
+
if (cw <= 1e-6)
|
|
240
|
+
return false;
|
|
241
|
+
const inverse = 1 / cw;
|
|
242
|
+
CORNERS[slot * 3] = (cx * inverse * 0.5 + 0.5) * (this.widths[0] ?? 1);
|
|
243
|
+
CORNERS[slot * 3 + 1] = (cy * inverse * 0.5 + 0.5) * (this.heights[0] ?? 1);
|
|
244
|
+
CORNERS[slot * 3 + 2] = cz * inverse;
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* One triangle of an occluder's back face into level 0, keeping the nearest depth per texel.
|
|
249
|
+
*
|
|
250
|
+
* A half-space rasteriser over the triangle's own bounding box, sampling at texel centres. Depth
|
|
251
|
+
* is interpolated in screen space rather than perspective-correct — which for a *bound* is the
|
|
252
|
+
* safe direction only if it never under-estimates, so the depth written is the plane's value at
|
|
253
|
+
* the texel centre plus half a texel of gradient each way. A bound that is too far occludes less.
|
|
254
|
+
*/
|
|
255
|
+
triangle(a, b, c) {
|
|
256
|
+
const buffer = this.levels[0];
|
|
257
|
+
if (buffer === undefined)
|
|
258
|
+
return;
|
|
259
|
+
const width = this.widths[0] ?? 1;
|
|
260
|
+
const height = this.heights[0] ?? 1;
|
|
261
|
+
const ax = CORNERS[a * 3] ?? 0;
|
|
262
|
+
const ay = CORNERS[a * 3 + 1] ?? 0;
|
|
263
|
+
const az = CORNERS[a * 3 + 2] ?? 0;
|
|
264
|
+
const bx = CORNERS[b * 3] ?? 0;
|
|
265
|
+
const by = CORNERS[b * 3 + 1] ?? 0;
|
|
266
|
+
const bz = CORNERS[b * 3 + 2] ?? 0;
|
|
267
|
+
const cx = CORNERS[c * 3] ?? 0;
|
|
268
|
+
const cy = CORNERS[c * 3 + 1] ?? 0;
|
|
269
|
+
const cz = CORNERS[c * 3 + 2] ?? 0;
|
|
270
|
+
const area = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);
|
|
271
|
+
if (area === 0)
|
|
272
|
+
return;
|
|
273
|
+
const inverseArea = 1 / area;
|
|
274
|
+
const x0 = Math.max(0, Math.floor(Math.min(ax, bx, cx)));
|
|
275
|
+
const x1 = Math.min(width - 1, Math.ceil(Math.max(ax, bx, cx)));
|
|
276
|
+
const y0 = Math.max(0, Math.floor(Math.min(ay, by, cy)));
|
|
277
|
+
const y1 = Math.min(height - 1, Math.ceil(Math.max(ay, by, cy)));
|
|
278
|
+
for (let ty = y0; ty <= y1; ty++) {
|
|
279
|
+
const py = ty + 0.5;
|
|
280
|
+
for (let tx = x0; tx <= x1; tx++) {
|
|
281
|
+
const px = tx + 0.5;
|
|
282
|
+
const w0 = ((bx - ax) * (py - ay) - (by - ay) * (px - ax)) * inverseArea;
|
|
283
|
+
const w1 = ((cx - bx) * (py - by) - (cy - by) * (px - bx)) * inverseArea;
|
|
284
|
+
const w2 = ((ax - cx) * (py - cy) - (ay - cy) * (px - cx)) * inverseArea;
|
|
285
|
+
if (w0 < 0 || w1 < 0 || w2 < 0)
|
|
286
|
+
continue;
|
|
287
|
+
/* Barycentrics: w1 belongs to a, w2 to b, w0 to c. */
|
|
288
|
+
const depth = w1 * az + w2 * bz + w0 * cz;
|
|
289
|
+
const at = ty * width + tx;
|
|
290
|
+
if (depth < (buffer[at] ?? FAR))
|
|
291
|
+
buffer[at] = depth;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Erode by one texel, then reduce by maximum into every coarser level.
|
|
297
|
+
*
|
|
298
|
+
* **The erosion is what makes the whole thing conservative** and it costs one pass: a triangle
|
|
299
|
+
* sampled at texel centres covers up to half a texel too much at every silhouette, so any texel
|
|
300
|
+
* next to an unwritten one gives its bound back. The reduction is a maximum because the test asks
|
|
301
|
+
* "is every texel under this rectangle already covered by something nearer", and a maximum over
|
|
302
|
+
* children answers that for the parent.
|
|
303
|
+
*/
|
|
304
|
+
buildPyramid() {
|
|
305
|
+
const base = this.levels[0];
|
|
306
|
+
const width = this.widths[0] ?? 1;
|
|
307
|
+
const height = this.heights[0] ?? 1;
|
|
308
|
+
if (base !== undefined) {
|
|
309
|
+
if (ERODED.length < base.length)
|
|
310
|
+
ERODED = new Float32Array(base.length);
|
|
311
|
+
for (let y = 0; y < height; y++) {
|
|
312
|
+
for (let x = 0; x < width; x++) {
|
|
313
|
+
let value = base[y * width + x] ?? FAR;
|
|
314
|
+
for (let dy = -1; dy <= 1 && value < FAR; dy++) {
|
|
315
|
+
const ny = y + dy;
|
|
316
|
+
if (ny < 0 || ny >= height) {
|
|
317
|
+
value = FAR;
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
321
|
+
const nx = x + dx;
|
|
322
|
+
if (nx < 0 || nx >= width) {
|
|
323
|
+
value = FAR;
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
const neighbour = base[ny * width + nx] ?? FAR;
|
|
327
|
+
if (neighbour > value)
|
|
328
|
+
value = neighbour;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
ERODED[y * width + x] = value;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
base.set(ERODED.subarray(0, base.length));
|
|
335
|
+
}
|
|
336
|
+
for (let level = 1; level < this.levels.length; level++) {
|
|
337
|
+
const source = this.levels[level - 1];
|
|
338
|
+
const target = this.levels[level];
|
|
339
|
+
const sw = this.widths[level - 1] ?? 1;
|
|
340
|
+
const sh = this.heights[level - 1] ?? 1;
|
|
341
|
+
const tw = this.widths[level] ?? 1;
|
|
342
|
+
const th = this.heights[level] ?? 1;
|
|
343
|
+
if (source === undefined || target === undefined)
|
|
344
|
+
continue;
|
|
345
|
+
for (let y = 0; y < th; y++) {
|
|
346
|
+
for (let x = 0; x < tw; x++) {
|
|
347
|
+
const sx = Math.min(x * 2, sw - 1);
|
|
348
|
+
const sy = Math.min(y * 2, sh - 1);
|
|
349
|
+
const sx1 = Math.min(sx + 1, sw - 1);
|
|
350
|
+
const sy1 = Math.min(sy + 1, sh - 1);
|
|
351
|
+
target[y * tw + x] = Math.max(source[sy * sw + sx] ?? FAR, source[sy * sw + sx1] ?? FAR, source[sy1 * sw + sx] ?? FAR, source[sy1 * sw + sx1] ?? FAR);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
this.built = true;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/** Eight projected corners, xy in buffer texels and z in normalised device coordinates. */
|
|
359
|
+
const CORNERS = new Float64Array(24);
|
|
360
|
+
/** Scratch for the erosion, grown to whatever the largest buffer has needed. */
|
|
361
|
+
let ERODED = new Float32Array(0);
|
|
362
|
+
/**
|
|
363
|
+
* The six faces of a corner-indexed box, each wound counter-clockwise seen from outside.
|
|
364
|
+
*
|
|
365
|
+
* Corner `i` takes `max` on axis `k` where bit `k` of `i` is set, which is the same numbering
|
|
366
|
+
* `boxShape` uses in the physics package — written out rather than derived, because the loop that
|
|
367
|
+
* derives it is longer than the table.
|
|
368
|
+
*/
|
|
369
|
+
const FACES = new Uint8Array([
|
|
370
|
+
1, 3, 7, 5, 4, 6, 2, 0, 2, 6, 7, 3, 0, 1, 5, 4, 4, 5, 7, 6, 0, 2, 3, 1,
|
|
371
|
+
]);
|
|
372
|
+
/** Twice the signed area of a projected triangle: positive is counter-clockwise on screen. */
|
|
373
|
+
function signedArea(corners, a, b, c) {
|
|
374
|
+
const ax = corners[a * 3] ?? 0;
|
|
375
|
+
const ay = corners[a * 3 + 1] ?? 0;
|
|
376
|
+
return (((corners[b * 3] ?? 0) - ax) * ((corners[c * 3 + 1] ?? 0) - ay) -
|
|
377
|
+
((corners[b * 3 + 1] ?? 0) - ay) * ((corners[c * 3] ?? 0) - ax));
|
|
378
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order-independent transparency on WebGL2: two targets, two passes over the same geometry, and a
|
|
3
|
+
* resolve.
|
|
4
|
+
*
|
|
5
|
+
* **The accumulation and the revealage are two blend states**, and a single pass cannot hold two.
|
|
6
|
+
* Writing both from one pass needs a second fragment output, which is another `flatFrag`
|
|
7
|
+
* permutation — measured at about 247 KB gzipped and paid by every consumer whether or not they
|
|
8
|
+
* enable this. Submitting the geometry twice costs the frames that asked for the effect and
|
|
9
|
+
* nothing else, which is why `TranslucentQueue` exists.
|
|
10
|
+
*
|
|
11
|
+
* **Both passes depth-test against the opaque scene and neither writes depth.** They borrow the
|
|
12
|
+
* scene target's own depth texture rather than allocating one, so a pane behind a wall is rejected
|
|
13
|
+
* exactly where the wall is — and because both passes share it, they cover precisely the same
|
|
14
|
+
* fragments.
|
|
15
|
+
*
|
|
16
|
+
* **The revealage pass draws with the ordinary shader.** Its blend is `(ZERO,
|
|
17
|
+
* ONE_MINUS_SRC_ALPHA)`, so whatever colour the fragment computed is multiplied away and only its
|
|
18
|
+
* alpha reaches the target. That is deliberate rather than thrifty: both passes run the same code
|
|
19
|
+
* to decide what alpha a fragment has, so they cannot disagree about it. The cost is that the
|
|
20
|
+
* lighting is computed twice for translucent surfaces, which is stated here rather than hidden.
|
|
21
|
+
*/
|
|
22
|
+
export declare class OitPass {
|
|
23
|
+
private readonly gl;
|
|
24
|
+
private readonly program;
|
|
25
|
+
private readonly uniforms;
|
|
26
|
+
private readonly vao;
|
|
27
|
+
private accum;
|
|
28
|
+
private reveal;
|
|
29
|
+
private accumFbo;
|
|
30
|
+
private revealFbo;
|
|
31
|
+
private width;
|
|
32
|
+
private height;
|
|
33
|
+
private depth;
|
|
34
|
+
/**
|
|
35
|
+
* Whether the context will render to a half-float colour target.
|
|
36
|
+
*
|
|
37
|
+
* **Asked here rather than taken from the scene target**, which is a different question: the
|
|
38
|
+
* scene is float only where a consumer asked for `hdrScene`, and this needs one either way. The
|
|
39
|
+
* accumulation is a *sum* of colour times weight and the weight reaches three thousand, so a
|
|
40
|
+
* single bright layer overflows eight bits immediately and every pane comes out white — an
|
|
41
|
+
* eight-bit fallback is not a quieter version of this effect, so where the extension is absent
|
|
42
|
+
* it refuses and says so once.
|
|
43
|
+
*/
|
|
44
|
+
private readonly floatColor;
|
|
45
|
+
constructor(gl: WebGL2RenderingContext);
|
|
46
|
+
/** Whether this context can run the effect at all. See `floatColor`. */
|
|
47
|
+
get available(): boolean;
|
|
48
|
+
private ensureSize;
|
|
49
|
+
/**
|
|
50
|
+
* Run the translucent set into the two buffers.
|
|
51
|
+
*
|
|
52
|
+
* `submit` is called twice with the weighting flag it should set: once accumulating, once
|
|
53
|
+
* multiplying revealage. Depth writes are off for both and restored after, because a translucent
|
|
54
|
+
* surface that wrote depth would hide the ones behind it and there would be nothing to blend.
|
|
55
|
+
*/
|
|
56
|
+
accumulateOit(width: number, height: number, depth: WebGLTexture, submit: (weighted: boolean) => void): void;
|
|
57
|
+
/**
|
|
58
|
+
* Composite the two buffers over whatever framebuffer is bound.
|
|
59
|
+
*
|
|
60
|
+
* **The blend does the compositing, not a texture read.** `(ONE_MINUS_SRC_ALPHA, SRC_ALPHA)`
|
|
61
|
+
* against a fragment carrying the average colour and the revealage computes
|
|
62
|
+
* `average * (1 - reveal) + scene * reveal`, which is the resolve — so this pass never samples
|
|
63
|
+
* the target it is writing, and cannot be caught in the feedback loop that would be.
|
|
64
|
+
*/
|
|
65
|
+
resolveOit(): void;
|
|
66
|
+
dispose(): void;
|
|
67
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
2
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
|
|
3
|
+
import { OIT_RESOLVE_FRAG } from './shaders/oitResolve.js';
|
|
4
|
+
/**
|
|
5
|
+
* Order-independent transparency on WebGL2: two targets, two passes over the same geometry, and a
|
|
6
|
+
* resolve.
|
|
7
|
+
*
|
|
8
|
+
* **The accumulation and the revealage are two blend states**, and a single pass cannot hold two.
|
|
9
|
+
* Writing both from one pass needs a second fragment output, which is another `flatFrag`
|
|
10
|
+
* permutation — measured at about 247 KB gzipped and paid by every consumer whether or not they
|
|
11
|
+
* enable this. Submitting the geometry twice costs the frames that asked for the effect and
|
|
12
|
+
* nothing else, which is why `TranslucentQueue` exists.
|
|
13
|
+
*
|
|
14
|
+
* **Both passes depth-test against the opaque scene and neither writes depth.** They borrow the
|
|
15
|
+
* scene target's own depth texture rather than allocating one, so a pane behind a wall is rejected
|
|
16
|
+
* exactly where the wall is — and because both passes share it, they cover precisely the same
|
|
17
|
+
* fragments.
|
|
18
|
+
*
|
|
19
|
+
* **The revealage pass draws with the ordinary shader.** Its blend is `(ZERO,
|
|
20
|
+
* ONE_MINUS_SRC_ALPHA)`, so whatever colour the fragment computed is multiplied away and only its
|
|
21
|
+
* alpha reaches the target. That is deliberate rather than thrifty: both passes run the same code
|
|
22
|
+
* to decide what alpha a fragment has, so they cannot disagree about it. The cost is that the
|
|
23
|
+
* lighting is computed twice for translucent surfaces, which is stated here rather than hidden.
|
|
24
|
+
*/
|
|
25
|
+
export class OitPass {
|
|
26
|
+
gl;
|
|
27
|
+
program;
|
|
28
|
+
uniforms;
|
|
29
|
+
vao;
|
|
30
|
+
accum = null;
|
|
31
|
+
reveal = null;
|
|
32
|
+
accumFbo = null;
|
|
33
|
+
revealFbo = null;
|
|
34
|
+
width = 0;
|
|
35
|
+
height = 0;
|
|
36
|
+
depth = null;
|
|
37
|
+
/**
|
|
38
|
+
* Whether the context will render to a half-float colour target.
|
|
39
|
+
*
|
|
40
|
+
* **Asked here rather than taken from the scene target**, which is a different question: the
|
|
41
|
+
* scene is float only where a consumer asked for `hdrScene`, and this needs one either way. The
|
|
42
|
+
* accumulation is a *sum* of colour times weight and the weight reaches three thousand, so a
|
|
43
|
+
* single bright layer overflows eight bits immediately and every pane comes out white — an
|
|
44
|
+
* eight-bit fallback is not a quieter version of this effect, so where the extension is absent
|
|
45
|
+
* it refuses and says so once.
|
|
46
|
+
*/
|
|
47
|
+
floatColor;
|
|
48
|
+
constructor(gl) {
|
|
49
|
+
this.gl = gl;
|
|
50
|
+
this.floatColor = gl.getExtension('EXT_color_buffer_float') !== null;
|
|
51
|
+
this.program = compileProgram(gl, FULLSCREEN_VERT, OIT_RESOLVE_FRAG, 'oitResolve');
|
|
52
|
+
this.uniforms = uniformLocations(gl, this.program, 'oitPass');
|
|
53
|
+
const vao = gl.createVertexArray();
|
|
54
|
+
if (vao === null)
|
|
55
|
+
throw new Error('OitPass: createVertexArray failed');
|
|
56
|
+
this.vao = vao;
|
|
57
|
+
}
|
|
58
|
+
/** Whether this context can run the effect at all. See `floatColor`. */
|
|
59
|
+
get available() {
|
|
60
|
+
return this.floatColor;
|
|
61
|
+
}
|
|
62
|
+
ensureSize(width, height, depth) {
|
|
63
|
+
const { gl } = this;
|
|
64
|
+
if (this.width === width && this.height === height && this.depth === depth)
|
|
65
|
+
return;
|
|
66
|
+
this.width = width;
|
|
67
|
+
this.height = height;
|
|
68
|
+
this.depth = depth;
|
|
69
|
+
/*
|
|
70
|
+
* **Unit 0, chosen rather than inherited.** `bindTexture` binds to whatever unit is active,
|
|
71
|
+
* and the renderer leaves that wherever its last pass finished — unit 7 in practice. Allocating
|
|
72
|
+
* here without setting it left the revealage texture bound to unit 7 for the life of the
|
|
73
|
+
* context, and the pass below then attached that same texture as its render target: a feedback
|
|
74
|
+
* loop, reported once per draw as `GL_INVALID_OPERATION` and rasterising something undefined.
|
|
75
|
+
* It cost 120 pixels of a frame that had to be identical, and it was found by asking which
|
|
76
|
+
* texture was on which unit rather than by reasoning about it.
|
|
77
|
+
*/
|
|
78
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
79
|
+
if (this.accum === null)
|
|
80
|
+
this.accum = gl.createTexture();
|
|
81
|
+
gl.bindTexture(gl.TEXTURE_2D, this.accum);
|
|
82
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, width, height, 0, gl.RGBA, gl.HALF_FLOAT, null);
|
|
83
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
84
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
85
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
86
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
87
|
+
/* One channel, because revealage is one number. `r8` rather than `r16f`: it holds a product of
|
|
88
|
+
values in 0..1 and never leaves that range, and eight bits of it is a step of 1/255 in how
|
|
89
|
+
much scene shows through — below what a viewer can see against a blended layer. */
|
|
90
|
+
if (this.reveal === null)
|
|
91
|
+
this.reveal = gl.createTexture();
|
|
92
|
+
gl.bindTexture(gl.TEXTURE_2D, this.reveal);
|
|
93
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, null);
|
|
94
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
95
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
96
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
97
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
98
|
+
/*
|
|
99
|
+
* **The scene's own depth on both, and that is what makes the two passes agree.** They test
|
|
100
|
+
* against the opaque world and never write, so a pane behind a wall is rejected at the wall on
|
|
101
|
+
* both — and a fragment that reached the accumulation reached the revealage too, which the
|
|
102
|
+
* resolve assumes and could not otherwise rely on.
|
|
103
|
+
*/
|
|
104
|
+
if (this.accumFbo === null)
|
|
105
|
+
this.accumFbo = gl.createFramebuffer();
|
|
106
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.accumFbo);
|
|
107
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.accum, 0);
|
|
108
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
|
|
109
|
+
if (this.revealFbo === null)
|
|
110
|
+
this.revealFbo = gl.createFramebuffer();
|
|
111
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.revealFbo);
|
|
112
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.reveal, 0);
|
|
113
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
|
|
114
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
115
|
+
/* And released, so nothing carries a target of this pass into a sampler of another. */
|
|
116
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Run the translucent set into the two buffers.
|
|
120
|
+
*
|
|
121
|
+
* `submit` is called twice with the weighting flag it should set: once accumulating, once
|
|
122
|
+
* multiplying revealage. Depth writes are off for both and restored after, because a translucent
|
|
123
|
+
* surface that wrote depth would hide the ones behind it and there would be nothing to blend.
|
|
124
|
+
*/
|
|
125
|
+
accumulateOit(width, height, depth, submit) {
|
|
126
|
+
const { gl } = this;
|
|
127
|
+
this.ensureSize(width, height, depth);
|
|
128
|
+
gl.viewport(0, 0, width, height);
|
|
129
|
+
gl.enable(gl.DEPTH_TEST);
|
|
130
|
+
gl.depthMask(false);
|
|
131
|
+
gl.enable(gl.BLEND);
|
|
132
|
+
/* Weighted colour, summed. Cleared to zero: nothing accumulated is a sum of nothing. */
|
|
133
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.accumFbo);
|
|
134
|
+
gl.clearBufferfv(gl.COLOR, 0, [0, 0, 0, 0]);
|
|
135
|
+
gl.blendFunc(gl.ONE, gl.ONE);
|
|
136
|
+
submit(true);
|
|
137
|
+
/*
|
|
138
|
+
* Revealage, multiplied. **Cleared to one**, which is "nothing has covered this pixel yet" —
|
|
139
|
+
* cleared to zero the resolve would show no scene anywhere the effect ran, which is a black
|
|
140
|
+
* frame that looks like the blend rather than like the clear.
|
|
141
|
+
*/
|
|
142
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.revealFbo);
|
|
143
|
+
gl.clearBufferfv(gl.COLOR, 0, [1, 1, 1, 1]);
|
|
144
|
+
gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_ALPHA);
|
|
145
|
+
submit(false);
|
|
146
|
+
gl.depthMask(true);
|
|
147
|
+
gl.disable(gl.BLEND);
|
|
148
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Composite the two buffers over whatever framebuffer is bound.
|
|
152
|
+
*
|
|
153
|
+
* **The blend does the compositing, not a texture read.** `(ONE_MINUS_SRC_ALPHA, SRC_ALPHA)`
|
|
154
|
+
* against a fragment carrying the average colour and the revealage computes
|
|
155
|
+
* `average * (1 - reveal) + scene * reveal`, which is the resolve — so this pass never samples
|
|
156
|
+
* the target it is writing, and cannot be caught in the feedback loop that would be.
|
|
157
|
+
*/
|
|
158
|
+
resolveOit() {
|
|
159
|
+
const { gl } = this;
|
|
160
|
+
if (this.accum === null || this.reveal === null)
|
|
161
|
+
return;
|
|
162
|
+
gl.disable(gl.DEPTH_TEST);
|
|
163
|
+
gl.depthMask(false);
|
|
164
|
+
gl.disable(gl.CULL_FACE);
|
|
165
|
+
gl.enable(gl.BLEND);
|
|
166
|
+
gl.blendFunc(gl.ONE_MINUS_SRC_ALPHA, gl.SRC_ALPHA);
|
|
167
|
+
gl.useProgram(this.program);
|
|
168
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
169
|
+
gl.bindTexture(gl.TEXTURE_2D, this.accum);
|
|
170
|
+
gl.uniform1i(this.uniforms['uOitAccum'] ?? null, 0);
|
|
171
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
172
|
+
gl.bindTexture(gl.TEXTURE_2D, this.reveal);
|
|
173
|
+
gl.uniform1i(this.uniforms['uOitReveal'] ?? null, 1);
|
|
174
|
+
gl.bindVertexArray(this.vao);
|
|
175
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
176
|
+
gl.bindVertexArray(null);
|
|
177
|
+
/*
|
|
178
|
+
* **Released, and this is the bug that made it necessary.** A binding outlives the frame it
|
|
179
|
+
* was made in, so unit 0 kept the accumulation texture — which the *next* frame then attaches
|
|
180
|
+
* as its own colour target while the flat program still declares a sampler on that unit. That
|
|
181
|
+
* is a feedback loop: WebGL2 reports `GL_INVALID_OPERATION: Feedback loop formed between
|
|
182
|
+
* Framebuffer and active Texture` once per draw and then rasterises something undefined. It
|
|
183
|
+
* cost 120 pixels of a frame that had to be identical, which is what found it.
|
|
184
|
+
*/
|
|
185
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
186
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
187
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
188
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
189
|
+
gl.disable(gl.BLEND);
|
|
190
|
+
gl.depthMask(true);
|
|
191
|
+
gl.enable(gl.DEPTH_TEST);
|
|
192
|
+
}
|
|
193
|
+
dispose() {
|
|
194
|
+
const { gl } = this;
|
|
195
|
+
if (this.accum !== null)
|
|
196
|
+
gl.deleteTexture(this.accum);
|
|
197
|
+
if (this.reveal !== null)
|
|
198
|
+
gl.deleteTexture(this.reveal);
|
|
199
|
+
if (this.accumFbo !== null)
|
|
200
|
+
gl.deleteFramebuffer(this.accumFbo);
|
|
201
|
+
if (this.revealFbo !== null)
|
|
202
|
+
gl.deleteFramebuffer(this.revealFbo);
|
|
203
|
+
gl.deleteProgram(this.program);
|
|
204
|
+
gl.deleteVertexArray(this.vao);
|
|
205
|
+
this.accum = null;
|
|
206
|
+
this.reveal = null;
|
|
207
|
+
this.accumFbo = null;
|
|
208
|
+
this.revealFbo = null;
|
|
209
|
+
this.width = 0;
|
|
210
|
+
this.height = 0;
|
|
211
|
+
this.depth = null;
|
|
212
|
+
}
|
|
213
|
+
}
|