@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,301 @@
|
|
|
1
|
+
/** Allocation-free selection and packing of point lights for a fixed shader budget. */
|
|
2
|
+
import { POINT_LIGHT_COS_INNER, POINT_LIGHT_COS_OUTER } from './clusteredLights.js';
|
|
3
|
+
import { MAX_POINT_LIGHTS, POINT_SHADOW_POOL } from './lightBudget.js';
|
|
4
|
+
export const DEFAULT_POINT_LIGHT_VIEW_RANGE = 180;
|
|
5
|
+
/**
|
|
6
|
+
* How far out a light fades to nothing, in metres before its cull distance.
|
|
7
|
+
*
|
|
8
|
+
* One of the two boundaries a light can cross. The range is deliberately vast, so that
|
|
9
|
+
* a light never surprises the player by switching on in front of them — and a vaster
|
|
10
|
+
* range only helps if arriving at it is a ramp.
|
|
11
|
+
*/
|
|
12
|
+
const FADE_BAND_M = 40;
|
|
13
|
+
/**
|
|
14
|
+
* How near the first excluded light has to be before the last chosen ones dim.
|
|
15
|
+
*
|
|
16
|
+
* The other boundary, and the one that actually flickers. A world carries more lights
|
|
17
|
+
* than `MAX_POINT_LIGHTS`, so somebody is always last, and membership used to be a
|
|
18
|
+
* step: the light holding the final slot contributed everything and the one behind it
|
|
19
|
+
* nothing. Ordinary camera drift traded them, and both the light and its shadow
|
|
20
|
+
* switched — reported, plainly, as lights that behave like on/off switches.
|
|
21
|
+
*
|
|
22
|
+
* Measured in a lamp-lit courtyard: six lamps and a brazier sit inside 8.7 m
|
|
23
|
+
* against a budget of eight, and a gate's two lights are 12.52 m away *each*,
|
|
24
|
+
* equidistant by construction. They straddle the cut, so exactly one of them was ever
|
|
25
|
+
* rendered and which one flipped as the camera orbited: one post shadowed, the
|
|
26
|
+
* identical one beside it bare.
|
|
27
|
+
*
|
|
28
|
+
* Hysteresis was tried here first and cannot fix this. A slower swap is still a swap
|
|
29
|
+
* and the loser is still hard off, and worse, an incumbent's advantage puts the
|
|
30
|
+
* newcomer's arrival *inside* the band rather than at its edge, so the crossfade it
|
|
31
|
+
* was paired with reintroduced the pop it exists to remove. Fading against the
|
|
32
|
+
* boundary subsumes it: at the tie both contenders are at nothing, so the trade is
|
|
33
|
+
* free, and nothing is sticky because nothing visible is at stake.
|
|
34
|
+
*
|
|
35
|
+
* Three metres dims only what is genuinely contested. A row of lamps every twelve
|
|
36
|
+
* metres never notices; two lights the same distance away always do. It is also long
|
|
37
|
+
* enough at running pace to cover a six-face bake, so a light finishes its shadow map
|
|
38
|
+
* while it is still too dim to show one.
|
|
39
|
+
*/
|
|
40
|
+
const CONTENTION_BAND_M = 3;
|
|
41
|
+
/** Sort keys for the shadow list, which is ordered independently of the shaded one. */
|
|
42
|
+
const shadowRank = new Float32Array(POINT_SHADOW_POOL);
|
|
43
|
+
/**
|
|
44
|
+
* A buffer for the selection to fill, sized to what the caller can actually bind.
|
|
45
|
+
*
|
|
46
|
+
* **`capacity` exists because clustered lighting can carry far more than the shader's uniform
|
|
47
|
+
* arrays.** The froxel table takes up to `MAX_CLUSTERED_LIGHTS`, and this helper used to hand it
|
|
48
|
+
* sixteen whatever a world offered — so the capability was real and unreachable through the one
|
|
49
|
+
* path every consumer uses. A consumer with `RenderQuality.clusteredLights` on asks for a wider
|
|
50
|
+
* buffer; everything else takes the default and is unchanged.
|
|
51
|
+
*
|
|
52
|
+
* **`scratchDistance` grows with it**, and that is not incidental: the shaded list is kept sorted
|
|
53
|
+
* in it, so a buffer wider than the array holding its distances writes past the end. It was sized
|
|
54
|
+
* from `POINT_SHADOW_POOL` because the pool happened to be the larger of the two.
|
|
55
|
+
*/
|
|
56
|
+
export function createPointLightBuffer(capacity = MAX_POINT_LIGHTS) {
|
|
57
|
+
const shaded = Math.max(1, Math.floor(capacity));
|
|
58
|
+
return {
|
|
59
|
+
positions: new Float32Array(shaded * 3),
|
|
60
|
+
colors: new Float32Array(shaded * 3),
|
|
61
|
+
radii: new Float32Array(shaded),
|
|
62
|
+
sourceRadii: new Float32Array(shaded),
|
|
63
|
+
considered: 0,
|
|
64
|
+
count: 0,
|
|
65
|
+
sourceIndex: new Int32Array(shaded),
|
|
66
|
+
weights: new Float32Array(shaded),
|
|
67
|
+
directions: new Float32Array(shaded * 3),
|
|
68
|
+
coneCos: new Float32Array(shaded * 2),
|
|
69
|
+
/* −1 rather than 0, because row 0 is a real fixture and a light that asked for none must not
|
|
70
|
+
be shaped by whichever profile happened to load first. */
|
|
71
|
+
iesProfiles: new Float32Array(shaded).fill(-1),
|
|
72
|
+
scratchDistance: new Float32Array(Math.max(shaded, POINT_SHADOW_POOL)),
|
|
73
|
+
shadowIndex: new Int32Array(POINT_SHADOW_POOL),
|
|
74
|
+
shadowCount: 0,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Select nearest lights whose influence may still be visible and pack them in
|
|
79
|
+
* shader order. The caller owns `out`; no sort arrays or temporary objects are
|
|
80
|
+
* created in this per-frame path.
|
|
81
|
+
*
|
|
82
|
+
* **Two points, because the two lists answer two questions.** `x, y, z` is where the frame is
|
|
83
|
+
* being *shaded* from — the camera — and it orders and culls the shaded list. `castX, castY,
|
|
84
|
+
* castZ` is where whatever might *cast* is standing, and it orders and culls the shadow pool.
|
|
85
|
+
* `AGENTS.md` had already decided which point the pool belongs to: *"a character's shadow only
|
|
86
|
+
* has to exist near the light they are standing at"* — they, not the viewer.
|
|
87
|
+
*
|
|
88
|
+
* They were one argument until 2026-08-25, and a third-person camera is exactly where that
|
|
89
|
+
* hurts: it sits behind its subject, so a fire the subject is standing next to got **no map at
|
|
90
|
+
* all** whenever the camera was further from it than the fire's radius. The scene stayed
|
|
91
|
+
* perfectly lit, which is why nobody could tell it from a bake that never ran.
|
|
92
|
+
*
|
|
93
|
+
* What it gives up: three more numbers on an already-long parameter list, spelled as numbers
|
|
94
|
+
* rather than a vector to match the point above it. What would make it wrong: a consumer with
|
|
95
|
+
* several casters far apart, which one point cannot describe — the pool would then want a set of
|
|
96
|
+
* reference points and a rank over the nearest of them, which is a bigger change than this one
|
|
97
|
+
* and is not what any consumer here has.
|
|
98
|
+
*
|
|
99
|
+
* The default is the shading point, so an existing caller selects bit-identically: `castX = x`
|
|
100
|
+
* makes the distance the *same arithmetic on the same operands*, not merely a close number.
|
|
101
|
+
*/
|
|
102
|
+
export function selectPointLights(sources, x, y, z, out, timeSeconds = 0, viewRange = DEFAULT_POINT_LIGHT_VIEW_RANGE, castX = x, castY = y, castZ = z) {
|
|
103
|
+
out.count = 0;
|
|
104
|
+
out.shadowCount = 0;
|
|
105
|
+
/*
|
|
106
|
+
* How many the shaded list holds, read off the buffer rather than from the shader's budget.
|
|
107
|
+
* A caller that asked for a wider one gets it; the default is `MAX_POINT_LIGHTS` exactly.
|
|
108
|
+
*/
|
|
109
|
+
const shadedCapacity = out.radii.length;
|
|
110
|
+
/* Everything offered, whether or not it wins a slot or is even in range. See `considered`. */
|
|
111
|
+
out.considered = sources.length;
|
|
112
|
+
/*
|
|
113
|
+
* The nearest light that did not make the set: the boundary the last chosen ones
|
|
114
|
+
* fade against. `Infinity` while the world has fewer lights in range than the
|
|
115
|
+
* shader binds, which is the case where nothing is contested and nothing dims.
|
|
116
|
+
*/
|
|
117
|
+
let cutSq = Infinity;
|
|
118
|
+
for (let sourceIndex = 0; sourceIndex < sources.length; sourceIndex++) {
|
|
119
|
+
const light = sources[sourceIndex];
|
|
120
|
+
if (light === undefined)
|
|
121
|
+
continue;
|
|
122
|
+
/*
|
|
123
|
+
* A light with no radius illuminates nothing, and it must not take a slot from
|
|
124
|
+
* one that does. Consumers switch sources on and off by their radius — an oil
|
|
125
|
+
* slick is dark until it catches, a floor marker until it is stood on — so a world
|
|
126
|
+
* carries far more sources than it ever lights at once, and without this a
|
|
127
|
+
* character standing among forty dark markers would have the braziers around them
|
|
128
|
+
* pushed out of the buffer by markers emitting nothing.
|
|
129
|
+
*/
|
|
130
|
+
if (light.radius <= 0)
|
|
131
|
+
continue;
|
|
132
|
+
const dx = light.x - x;
|
|
133
|
+
const dy = light.y - y;
|
|
134
|
+
const dz = light.z - z;
|
|
135
|
+
const distanceSq = dx * dx + dy * dy + dz * dz;
|
|
136
|
+
const cullDistance = viewRange + light.radius;
|
|
137
|
+
if (distanceSq > cullDistance * cullDistance)
|
|
138
|
+
continue;
|
|
139
|
+
/*
|
|
140
|
+
* Two lists, kept apart on purpose.
|
|
141
|
+
*
|
|
142
|
+
* The **shaded** list is the shader's nearest `MAX_POINT_LIGHTS`, culled at
|
|
143
|
+
* `viewRange + radius` so a light fades out rather than cutting at its own edge.
|
|
144
|
+
*
|
|
145
|
+
* The **shadow** list is who gets a cubemap, and it uses a different, stricter
|
|
146
|
+
* test: a light only qualifies inside its own radius, where the falloff
|
|
147
|
+
* `1 - dist / radius` means it is actually lighting anything. That is `decb3a2`'s
|
|
148
|
+
* rule — *"Acquisition now uses the same range test as release"* — which the pool
|
|
149
|
+
* rewrite lost by driving slots from the shaded list instead. A lamp a hundred
|
|
150
|
+
* metres away then takes a pool slot, thrashes it, and starves the lamp overhead
|
|
151
|
+
* of the map it needs: flashing squares when that bug first shipped, shadows that
|
|
152
|
+
* exist only near an emitter now.
|
|
153
|
+
*
|
|
154
|
+
* Sharing one sorted list is what made them drift apart, so they do not share one.
|
|
155
|
+
*/
|
|
156
|
+
let slot = out.count;
|
|
157
|
+
while (slot > 0 && (out.scratchDistance[slot - 1] ?? 0) > distanceSq)
|
|
158
|
+
slot--;
|
|
159
|
+
if (slot >= shadedCapacity) {
|
|
160
|
+
// Rejected outright, so it is a candidate for the boundary the set fades against.
|
|
161
|
+
if (distanceSq < cutSq)
|
|
162
|
+
cutSq = distanceSq;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// Full, so making room drops whoever was last off the end — and that is the
|
|
166
|
+
// nearest light not in the set unless something nearer is rejected later.
|
|
167
|
+
if (out.count >= shadedCapacity) {
|
|
168
|
+
const displaced = out.scratchDistance[shadedCapacity - 1] ?? Infinity;
|
|
169
|
+
if (displaced < cutSq)
|
|
170
|
+
cutSq = displaced;
|
|
171
|
+
}
|
|
172
|
+
const last = Math.min(out.count, shadedCapacity - 1);
|
|
173
|
+
for (let index = last; index > slot; index--) {
|
|
174
|
+
out.scratchDistance[index] = out.scratchDistance[index - 1] ?? 0;
|
|
175
|
+
out.radii[index] = out.radii[index - 1] ?? 0;
|
|
176
|
+
out.sourceRadii[index] = out.sourceRadii[index - 1] ?? 0;
|
|
177
|
+
out.sourceIndex[index] = out.sourceIndex[index - 1] ?? -1;
|
|
178
|
+
for (let component = 0; component < 3; component++) {
|
|
179
|
+
out.positions[index * 3 + component] = out.positions[(index - 1) * 3 + component] ?? 0;
|
|
180
|
+
out.colors[index * 3 + component] = out.colors[(index - 1) * 3 + component] ?? 0;
|
|
181
|
+
out.directions[index * 3 + component] = out.directions[(index - 1) * 3 + component] ?? 0;
|
|
182
|
+
}
|
|
183
|
+
out.coneCos[index * 2] = out.coneCos[(index - 1) * 2] ?? 0;
|
|
184
|
+
out.coneCos[index * 2 + 1] = out.coneCos[(index - 1) * 2 + 1] ?? 0;
|
|
185
|
+
out.iesProfiles[index] = out.iesProfiles[index - 1] ?? -1;
|
|
186
|
+
}
|
|
187
|
+
out.scratchDistance[slot] = distanceSq;
|
|
188
|
+
out.sourceIndex[slot] = sourceIndex;
|
|
189
|
+
out.radii[slot] = light.radius;
|
|
190
|
+
out.sourceRadii[slot] = Math.max(light.sourceRadius, 0);
|
|
191
|
+
out.positions[slot * 3] = light.x;
|
|
192
|
+
out.positions[slot * 3 + 1] = light.y;
|
|
193
|
+
out.positions[slot * 3 + 2] = light.z;
|
|
194
|
+
const scale = flickerScale(light, timeSeconds);
|
|
195
|
+
out.colors[slot * 3] = light.r * scale;
|
|
196
|
+
out.colors[slot * 3 + 1] = light.g * scale;
|
|
197
|
+
out.colors[slot * 3 + 2] = light.b * scale;
|
|
198
|
+
/*
|
|
199
|
+
* **Normalised here rather than trusted**, because the cone is a comparison against a cosine
|
|
200
|
+
* and an un-normalised direction scales that cosine — so a vector of length 2 gives a cone of
|
|
201
|
+
* the wrong width, which reads as the angle having been set wrong rather than the vector.
|
|
202
|
+
* A zero-length direction is a light that declared no cone, and it takes the open pair.
|
|
203
|
+
*/
|
|
204
|
+
const dx = light.dirX ?? 0;
|
|
205
|
+
const dy = light.dirY ?? 0;
|
|
206
|
+
const dz = light.dirZ ?? 0;
|
|
207
|
+
const length = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
208
|
+
const aimed = length > 1e-6 && light.coneOuterDeg !== undefined;
|
|
209
|
+
const inverse = aimed ? 1 / length : 0;
|
|
210
|
+
out.directions[slot * 3] = dx * inverse;
|
|
211
|
+
out.directions[slot * 3 + 1] = dy * inverse;
|
|
212
|
+
out.directions[slot * 3 + 2] = dz * inverse;
|
|
213
|
+
if (aimed) {
|
|
214
|
+
/*
|
|
215
|
+
* Clamped so the inner edge never passes the outer. A caller that swaps them would
|
|
216
|
+
* otherwise get `smoothstep` with its edges inverted, which is a cone that is dark in the
|
|
217
|
+
* middle and bright at the rim — a picture nobody would attribute to two numbers being the
|
|
218
|
+
* wrong way round.
|
|
219
|
+
*/
|
|
220
|
+
const outerDeg = Math.min(89.9, Math.max(0, light.coneOuterDeg ?? 45));
|
|
221
|
+
const innerDeg = Math.min(outerDeg, Math.max(0, light.coneInnerDeg ?? outerDeg * 0.75));
|
|
222
|
+
out.coneCos[slot * 2] = Math.cos((innerDeg * Math.PI) / 180);
|
|
223
|
+
out.coneCos[slot * 2 + 1] = Math.cos((outerDeg * Math.PI) / 180);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
out.coneCos[slot * 2] = POINT_LIGHT_COS_INNER;
|
|
227
|
+
out.coneCos[slot * 2 + 1] = POINT_LIGHT_COS_OUTER;
|
|
228
|
+
}
|
|
229
|
+
/*
|
|
230
|
+
* The profile applies to a point light as readily as to a spot: a bare bulb has a measured
|
|
231
|
+
* distribution too, and the arithmetic does not care whether a cone is also being applied.
|
|
232
|
+
* Restricting it to spots would be a smaller feature for no saving.
|
|
233
|
+
*/
|
|
234
|
+
out.iesProfiles[slot] = light.iesProfile ?? -1;
|
|
235
|
+
if (out.count < shadedCapacity)
|
|
236
|
+
out.count++;
|
|
237
|
+
}
|
|
238
|
+
/*
|
|
239
|
+
* Inside its own radius, so it is lighting something and therefore has something
|
|
240
|
+
* to cast. Nearest first, capped at the pool, and independent of whether the
|
|
241
|
+
* shader had a slot left for it.
|
|
242
|
+
*
|
|
243
|
+
* **Measured from the caster and not from the camera**, and the guard and the rank read the
|
|
244
|
+
* same point on purpose: reading two would fill the pool nearest-to-camera and then evict
|
|
245
|
+
* the very lamp the subject is standing under, which is the shape of every pool bug this
|
|
246
|
+
* file already carries a paragraph about.
|
|
247
|
+
*
|
|
248
|
+
* Computed unconditionally rather than behind `castX === x`. At the default the operands are
|
|
249
|
+
* identical, so this is the same product of the same subtractions and the result is bit
|
|
250
|
+
* identical — a branch would buy a few flops per light and cost the guarantee that a caller
|
|
251
|
+
* who says nothing gets exactly what it got before.
|
|
252
|
+
*/
|
|
253
|
+
// A light that animates its radius, or is simply not meant to cast, never takes
|
|
254
|
+
// a slot: it would be stale every frame and starve the lamps that do cast.
|
|
255
|
+
if (light.castsShadow === false)
|
|
256
|
+
continue;
|
|
257
|
+
const cx = light.x - castX;
|
|
258
|
+
const cy = light.y - castY;
|
|
259
|
+
const cz = light.z - castZ;
|
|
260
|
+
const castDistanceSq = cx * cx + cy * cy + cz * cz;
|
|
261
|
+
if (castDistanceSq >= light.radius * light.radius)
|
|
262
|
+
continue;
|
|
263
|
+
let shadowSlot = out.shadowCount;
|
|
264
|
+
while (shadowSlot > 0 && (shadowRank[shadowSlot - 1] ?? 0) > castDistanceSq)
|
|
265
|
+
shadowSlot--;
|
|
266
|
+
if (shadowSlot >= POINT_SHADOW_POOL)
|
|
267
|
+
continue;
|
|
268
|
+
const lastShadow = Math.min(out.shadowCount, POINT_SHADOW_POOL - 1);
|
|
269
|
+
for (let index = lastShadow; index > shadowSlot; index--) {
|
|
270
|
+
shadowRank[index] = shadowRank[index - 1] ?? 0;
|
|
271
|
+
out.shadowIndex[index] = out.shadowIndex[index - 1] ?? -1;
|
|
272
|
+
}
|
|
273
|
+
shadowRank[shadowSlot] = castDistanceSq;
|
|
274
|
+
out.shadowIndex[shadowSlot] = sourceIndex;
|
|
275
|
+
if (out.shadowCount < POINT_SHADOW_POOL)
|
|
276
|
+
out.shadowCount++;
|
|
277
|
+
}
|
|
278
|
+
/*
|
|
279
|
+
* How present each of them is, now that the set — and with it the boundary — is
|
|
280
|
+
* known. A second pass over at most eight entries, which is why the cut can be a
|
|
281
|
+
* fact about the whole frame rather than a guess made light by light.
|
|
282
|
+
*
|
|
283
|
+
* The two boundaries are independent and a light can be near both, so it takes
|
|
284
|
+
* whichever says it is fainter.
|
|
285
|
+
*/
|
|
286
|
+
const cut = Math.sqrt(cutSq);
|
|
287
|
+
for (let index = 0; index < out.count; index++) {
|
|
288
|
+
const distance = Math.sqrt(out.scratchDistance[index] ?? 0);
|
|
289
|
+
const cullDistance = viewRange + (out.radii[index] ?? 0);
|
|
290
|
+
const arriving = (cullDistance - distance) / FADE_BAND_M;
|
|
291
|
+
const contested = (cut - distance) / CONTENTION_BAND_M;
|
|
292
|
+
out.weights[index] = Math.max(0, Math.min(1, arriving, contested));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function flickerScale(light, timeSeconds) {
|
|
296
|
+
if (light.flicker <= 0)
|
|
297
|
+
return 1;
|
|
298
|
+
const phase = light.x * 0.7 + light.z * 1.3;
|
|
299
|
+
const wobble = Math.sin(timeSeconds * 11.3 + phase) * 0.55 + Math.sin(timeSeconds * 27.7 + phase * 2.1) * 0.45;
|
|
300
|
+
return 1 + light.flicker * wobble;
|
|
301
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The edge of one light's octahedral map.
|
|
3
|
+
*
|
|
4
|
+
* Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
|
|
5
|
+
* cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
|
|
6
|
+
* 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
|
|
7
|
+
* is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
|
|
8
|
+
*/
|
|
9
|
+
export declare const OCTAHEDRAL_EDGE = 1024;
|
|
10
|
+
/**
|
|
11
|
+
* What a `PointShadowMap` needs of the array: somewhere to render a face, and somewhere to put it.
|
|
12
|
+
*
|
|
13
|
+
* An interface rather than the class, so a map can be built without a device at all — the pooling
|
|
14
|
+
* rules are worth testing on their own and none of them is about a texture.
|
|
15
|
+
*/
|
|
16
|
+
export interface PointShadowTarget {
|
|
17
|
+
beginFace(gl: WebGL2RenderingContext): void;
|
|
18
|
+
resolveFace(gl: WebGL2RenderingContext, layer: number, face: number, far: number, near: number): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Every point light's shadow as one array texture, and the scratch that fills it.
|
|
22
|
+
*
|
|
23
|
+
* **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
|
|
24
|
+
* the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
|
|
25
|
+
* region of the map is disjoint from the other five and is written in full the moment that face is
|
|
26
|
+
* resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
|
|
27
|
+
* how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
|
|
28
|
+
* second face to still be around.
|
|
29
|
+
*
|
|
30
|
+
* **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
|
|
31
|
+
* check is per texture object rather than per image: a draw that samples the array while any layer
|
|
32
|
+
* of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
|
|
33
|
+
* before this file existed. So the resolve reads the scratch and writes the array, and the two are
|
|
34
|
+
* never the same object.
|
|
35
|
+
*/
|
|
36
|
+
export declare class PointShadowArray implements PointShadowTarget {
|
|
37
|
+
readonly texture: WebGLTexture;
|
|
38
|
+
/**
|
|
39
|
+
* How many layers this array holds: the point pool, the two live transition maps, and two more
|
|
40
|
+
* for each rectangle a world said would cast. See the constructor's `extraLayers`.
|
|
41
|
+
*/
|
|
42
|
+
readonly layers: number;
|
|
43
|
+
private readonly framebuffer;
|
|
44
|
+
private readonly scratchTexture;
|
|
45
|
+
private readonly scratchFramebuffer;
|
|
46
|
+
/** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
|
|
47
|
+
private readonly parked;
|
|
48
|
+
private readonly faceSize;
|
|
49
|
+
private readonly program;
|
|
50
|
+
private readonly uniforms;
|
|
51
|
+
private readonly vao;
|
|
52
|
+
constructor(gl: WebGL2RenderingContext, faceSize: number, lightCount: number,
|
|
53
|
+
/**
|
|
54
|
+
* Layers above the point pool, for the rectangles a world says will cast.
|
|
55
|
+
*
|
|
56
|
+
* **Sized from the declaration for the same reason the point half is**, and it is the whole of
|
|
57
|
+
* what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
|
|
58
|
+
* and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
|
|
59
|
+
* allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
|
|
60
|
+
* is the same expression as the line below — one function, because the array sizing itself and
|
|
61
|
+
* the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
|
|
62
|
+
* map.
|
|
63
|
+
*/
|
|
64
|
+
extraLayers?: number);
|
|
65
|
+
/**
|
|
66
|
+
* Bind the scratch as the render target for one face of one bake, and clear it.
|
|
67
|
+
*
|
|
68
|
+
* **The previous face's resolve left the scratch bound for sampling, and it is about to be the
|
|
69
|
+
* target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
|
|
70
|
+
* `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
|
|
71
|
+
* because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
|
|
72
|
+
* enough whether the shader branch reads it or not. Found by capturing `night-court` and
|
|
73
|
+
* `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
|
|
74
|
+
* nothing stale to bake.
|
|
75
|
+
*
|
|
76
|
+
* `beginShadowPass` carries the identical fix for the directional maps, and this is the same
|
|
77
|
+
* rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
|
|
78
|
+
* is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
|
|
79
|
+
* would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
|
|
80
|
+
*/
|
|
81
|
+
beginFace(gl: WebGL2RenderingContext): void;
|
|
82
|
+
/**
|
|
83
|
+
* Write the scratch's contents into `layer`'s region for `face`.
|
|
84
|
+
*
|
|
85
|
+
* `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
|
|
86
|
+
* the previous bake of this light left in it, so a fragment that lost a comparison would leave
|
|
87
|
+
* half of one image and half of another — a shadow baked around two different places at once,
|
|
88
|
+
* which is the failure `PointShadowImage.planBake` exists to prevent one level up.
|
|
89
|
+
*
|
|
90
|
+
* Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
|
|
91
|
+
* from an empty vertex array.
|
|
92
|
+
*/
|
|
93
|
+
resolveFace(gl: WebGL2RenderingContext, layer: number, face: number, far: number, near: number): void;
|
|
94
|
+
dispose(gl: WebGL2RenderingContext): void;
|
|
95
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { mat3 } from 'gl-matrix';
|
|
2
|
+
import { createEmptyTexture2D } from './emptyTexture.js';
|
|
3
|
+
import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from './lightBudget.js';
|
|
4
|
+
import { pointShadowFaceRotation } from './pointShadowImage.js';
|
|
5
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
6
|
+
import { OCTAHEDRAL_RESOLVE_FRAG, OCTAHEDRAL_RESOLVE_VERT } from './shaders/octahedralResolve.js';
|
|
7
|
+
/**
|
|
8
|
+
* The edge of one light's octahedral map.
|
|
9
|
+
*
|
|
10
|
+
* Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
|
|
11
|
+
* cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
|
|
12
|
+
* 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
|
|
13
|
+
* is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
|
|
14
|
+
*/
|
|
15
|
+
export const OCTAHEDRAL_EDGE = 1024;
|
|
16
|
+
/** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
|
|
17
|
+
const faceRotation = mat3.create();
|
|
18
|
+
/**
|
|
19
|
+
* Every point light's shadow as one array texture, and the scratch that fills it.
|
|
20
|
+
*
|
|
21
|
+
* **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
|
|
22
|
+
* the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
|
|
23
|
+
* region of the map is disjoint from the other five and is written in full the moment that face is
|
|
24
|
+
* resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
|
|
25
|
+
* how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
|
|
26
|
+
* second face to still be around.
|
|
27
|
+
*
|
|
28
|
+
* **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
|
|
29
|
+
* check is per texture object rather than per image: a draw that samples the array while any layer
|
|
30
|
+
* of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
|
|
31
|
+
* before this file existed. So the resolve reads the scratch and writes the array, and the two are
|
|
32
|
+
* never the same object.
|
|
33
|
+
*/
|
|
34
|
+
export class PointShadowArray {
|
|
35
|
+
texture;
|
|
36
|
+
/**
|
|
37
|
+
* How many layers this array holds: the point pool, the two live transition maps, and two more
|
|
38
|
+
* for each rectangle a world said would cast. See the constructor's `extraLayers`.
|
|
39
|
+
*/
|
|
40
|
+
layers;
|
|
41
|
+
framebuffer;
|
|
42
|
+
scratchTexture;
|
|
43
|
+
scratchFramebuffer;
|
|
44
|
+
/** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
|
|
45
|
+
parked;
|
|
46
|
+
faceSize;
|
|
47
|
+
program;
|
|
48
|
+
uniforms;
|
|
49
|
+
vao;
|
|
50
|
+
constructor(gl, faceSize, lightCount,
|
|
51
|
+
/**
|
|
52
|
+
* Layers above the point pool, for the rectangles a world says will cast.
|
|
53
|
+
*
|
|
54
|
+
* **Sized from the declaration for the same reason the point half is**, and it is the whole of
|
|
55
|
+
* what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
|
|
56
|
+
* and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
|
|
57
|
+
* allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
|
|
58
|
+
* is the same expression as the line below — one function, because the array sizing itself and
|
|
59
|
+
* the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
|
|
60
|
+
* map.
|
|
61
|
+
*/
|
|
62
|
+
extraLayers = 0) {
|
|
63
|
+
this.faceSize = faceSize;
|
|
64
|
+
/*
|
|
65
|
+
* Sized from the world rather than from the maximum. `texStorage3D` is immutable, so the
|
|
66
|
+
* alternative is handing a three-light world the storage for twenty-two — which is the mistake
|
|
67
|
+
* `lightBudget.ts` calls the most expensive the renderer has made, wearing a new shape.
|
|
68
|
+
*/
|
|
69
|
+
this.layers =
|
|
70
|
+
Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
|
|
71
|
+
const texture = gl.createTexture();
|
|
72
|
+
if (texture === null)
|
|
73
|
+
throw new Error('PointShadowArray: createTexture failed');
|
|
74
|
+
this.texture = texture;
|
|
75
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
|
|
76
|
+
gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.DEPTH_COMPONENT24, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, this.layers);
|
|
77
|
+
/* One storage level and no filtering, so textureLod(..., 0.0) is the only fetch there is. */
|
|
78
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
79
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
80
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
81
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
82
|
+
const scratchTexture = gl.createTexture();
|
|
83
|
+
if (scratchTexture === null)
|
|
84
|
+
throw new Error('PointShadowArray: createTexture failed');
|
|
85
|
+
this.scratchTexture = scratchTexture;
|
|
86
|
+
gl.bindTexture(gl.TEXTURE_2D, scratchTexture);
|
|
87
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.DEPTH_COMPONENT24, faceSize, faceSize);
|
|
88
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
89
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
90
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
91
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
92
|
+
this.parked = createEmptyTexture2D(gl);
|
|
93
|
+
const scratchFramebuffer = gl.createFramebuffer();
|
|
94
|
+
if (scratchFramebuffer === null)
|
|
95
|
+
throw new Error('PointShadowArray: createFramebuffer failed');
|
|
96
|
+
this.scratchFramebuffer = scratchFramebuffer;
|
|
97
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, scratchFramebuffer);
|
|
98
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, scratchTexture, 0);
|
|
99
|
+
/* Depth-only: without this WebGL expects a colour attachment. */
|
|
100
|
+
gl.drawBuffers([gl.NONE]);
|
|
101
|
+
gl.readBuffer(gl.NONE);
|
|
102
|
+
/*
|
|
103
|
+
* The resolve program, built **before** the completeness check below, because that check may
|
|
104
|
+
* return early on a lost context and every field has to be assigned by then. `PointShadowMap`
|
|
105
|
+
* and `ShadowMap` both hold that shape; here it is load-bearing rather than incidental, since
|
|
106
|
+
* `program`, `uniforms` and `vao` are all `readonly`.
|
|
107
|
+
*/
|
|
108
|
+
this.program = compileProgram(gl, OCTAHEDRAL_RESOLVE_VERT, OCTAHEDRAL_RESOLVE_FRAG, 'octahedralResolve');
|
|
109
|
+
this.uniforms = uniformLocations(gl, this.program, 'octahedralResolve');
|
|
110
|
+
const vao = gl.createVertexArray();
|
|
111
|
+
if (vao === null)
|
|
112
|
+
throw new Error('PointShadowArray: createVertexArray failed');
|
|
113
|
+
this.vao = vao;
|
|
114
|
+
const framebuffer = gl.createFramebuffer();
|
|
115
|
+
if (framebuffer === null)
|
|
116
|
+
throw new Error('PointShadowArray: createFramebuffer failed');
|
|
117
|
+
this.framebuffer = framebuffer;
|
|
118
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
119
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, texture, 0, 0);
|
|
120
|
+
gl.drawBuffers([gl.NONE]);
|
|
121
|
+
gl.readBuffer(gl.NONE);
|
|
122
|
+
/*
|
|
123
|
+
* Asked once, here, for the reason `pointShadowMap.ts` records at length: it is a synchronous
|
|
124
|
+
* query, so the driver must drain what it has queued before it can answer, and asking it per
|
|
125
|
+
* face put a pipeline flush inside the render loop for the life of the session — 95.6% of a
|
|
126
|
+
* 69 ms frame. Every layer shares one texture, one size and one format, so a configuration
|
|
127
|
+
* complete for layer 0 is complete for all of them, and nothing about that can change later.
|
|
128
|
+
*/
|
|
129
|
+
const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
|
|
130
|
+
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
131
|
+
/*
|
|
132
|
+
* A lost context reports every attachment unusable, and that is not a misconfiguration the
|
|
133
|
+
* caller can fix — see `planarReflection.ts`. Init still throws, because the context cannot
|
|
134
|
+
* be lost before it exists.
|
|
135
|
+
*/
|
|
136
|
+
if (gl.isContextLost())
|
|
137
|
+
return;
|
|
138
|
+
throw new Error(`PointShadowArray: framebuffer incomplete (0x${status.toString(16)})`);
|
|
139
|
+
}
|
|
140
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
141
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
142
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Bind the scratch as the render target for one face of one bake, and clear it.
|
|
146
|
+
*
|
|
147
|
+
* **The previous face's resolve left the scratch bound for sampling, and it is about to be the
|
|
148
|
+
* target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
|
|
149
|
+
* `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
|
|
150
|
+
* because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
|
|
151
|
+
* enough whether the shader branch reads it or not. Found by capturing `night-court` and
|
|
152
|
+
* `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
|
|
153
|
+
* nothing stale to bake.
|
|
154
|
+
*
|
|
155
|
+
* `beginShadowPass` carries the identical fix for the directional maps, and this is the same
|
|
156
|
+
* rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
|
|
157
|
+
* is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
|
|
158
|
+
* would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
|
|
159
|
+
*/
|
|
160
|
+
beginFace(gl) {
|
|
161
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
162
|
+
gl.bindTexture(gl.TEXTURE_2D, this.parked);
|
|
163
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
|
|
164
|
+
gl.viewport(0, 0, this.faceSize, this.faceSize);
|
|
165
|
+
gl.clear(gl.DEPTH_BUFFER_BIT);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Write the scratch's contents into `layer`'s region for `face`.
|
|
169
|
+
*
|
|
170
|
+
* `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
|
|
171
|
+
* the previous bake of this light left in it, so a fragment that lost a comparison would leave
|
|
172
|
+
* half of one image and half of another — a shadow baked around two different places at once,
|
|
173
|
+
* which is the failure `PointShadowImage.planBake` exists to prevent one level up.
|
|
174
|
+
*
|
|
175
|
+
* Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
|
|
176
|
+
* from an empty vertex array.
|
|
177
|
+
*/
|
|
178
|
+
resolveFace(gl, layer, face, far, near) {
|
|
179
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
180
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, this.texture, 0, layer);
|
|
181
|
+
gl.viewport(0, 0, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE);
|
|
182
|
+
gl.useProgram(this.program);
|
|
183
|
+
gl.bindVertexArray(this.vao);
|
|
184
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
185
|
+
gl.bindTexture(gl.TEXTURE_2D, this.scratchTexture);
|
|
186
|
+
gl.uniform1i(this.uniforms['uFace'] ?? null, 0);
|
|
187
|
+
gl.uniform1i(this.uniforms['uFaceIndex'] ?? null, face);
|
|
188
|
+
gl.uniformMatrix3fv(this.uniforms['uFaceRotation'] ?? null, false, pointShadowFaceRotation(face, faceRotation));
|
|
189
|
+
gl.uniform1f(this.uniforms['uFar'] ?? null, far);
|
|
190
|
+
gl.uniform1f(this.uniforms['uNear'] ?? null, near);
|
|
191
|
+
gl.uniform1f(this.uniforms['uEdge'] ?? null, OCTAHEDRAL_EDGE);
|
|
192
|
+
gl.disable(gl.CULL_FACE);
|
|
193
|
+
gl.enable(gl.DEPTH_TEST);
|
|
194
|
+
gl.depthMask(true);
|
|
195
|
+
/*
|
|
196
|
+
* **Saved and restored rather than put back to a named compare.** This used to end with
|
|
197
|
+
* `depthFunc(LESS)`, which was the frame's compare when it was written and stopped being it
|
|
198
|
+
* the moment the engine could draw reversed: after one point-shadow copy the whole rest of the
|
|
199
|
+
* frame tested the wrong way, and a scene with point shadows lost most of its pixels. Reading
|
|
200
|
+
* the state back costs one `getParameter` on a path that already binds a framebuffer, and it
|
|
201
|
+
* cannot go stale the way a constant can.
|
|
202
|
+
*/
|
|
203
|
+
const wasDepthFunc = gl.getParameter(gl.DEPTH_FUNC);
|
|
204
|
+
gl.depthFunc(gl.ALWAYS);
|
|
205
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
206
|
+
gl.depthFunc(wasDepthFunc);
|
|
207
|
+
gl.bindVertexArray(null);
|
|
208
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
209
|
+
}
|
|
210
|
+
dispose(gl) {
|
|
211
|
+
gl.deleteFramebuffer(this.framebuffer);
|
|
212
|
+
gl.deleteFramebuffer(this.scratchFramebuffer);
|
|
213
|
+
gl.deleteTexture(this.texture);
|
|
214
|
+
gl.deleteTexture(this.scratchTexture);
|
|
215
|
+
gl.deleteTexture(this.parked);
|
|
216
|
+
gl.deleteProgram(this.program);
|
|
217
|
+
gl.deleteVertexArray(this.vao);
|
|
218
|
+
}
|
|
219
|
+
}
|