@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,598 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The froxel table: what it looks like in memory, and the CPU binner that fills it.
|
|
3
|
+
*
|
|
4
|
+
* **One table, two producers, one reader.** A compute shader writes this on WebGPU and this file
|
|
5
|
+
* writes it on WebGL2, and the lit pass fetches it the same way on both. That is the 2026-08-13
|
|
6
|
+
* rule applied literally — the decision is backend-neutral and only the binding is per-backend —
|
|
7
|
+
* and it is why the table is a *texture* rather than a storage buffer, which only one backend has.
|
|
8
|
+
*
|
|
9
|
+
* **The layout is chosen so the two producers can be compared, not merely trusted.** The
|
|
10
|
+
* 2026-08-17 rule says two implementations of one decision drift, and drift invisibly when the
|
|
11
|
+
* constants are identical; a CPU binner and a GPU binner are exactly that. So every choice here
|
|
12
|
+
* that could have gone either way went the way that makes a byte-for-byte comparison possible:
|
|
13
|
+
* fixed slots rather than an appended list, an integer ordering rather than a distance sort, and
|
|
14
|
+
* an overflow rule both can evaluate. `scripts/cluster-check.mjs` is the comparison.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Tiles across the screen. */
|
|
18
|
+
export const CLUSTER_X = 16;
|
|
19
|
+
/** Tiles down the screen. */
|
|
20
|
+
export const CLUSTER_Y = 9;
|
|
21
|
+
/** Depth slices, partitioned exponentially. */
|
|
22
|
+
export const CLUSTER_Z = 24;
|
|
23
|
+
|
|
24
|
+
export const CLUSTER_COUNT = CLUSTER_X * CLUSTER_Y * CLUSTER_Z;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Texels a cluster occupies: one for its count, seven holding four light indices each.
|
|
28
|
+
*
|
|
29
|
+
* **Fixed rather than packed, and that is what removes the atomics.** One invocation owns one
|
|
30
|
+
* cluster and writes only its own run, so nothing is appended to a shared list, there is no
|
|
31
|
+
* counter to increment atomically and no compaction pass. That is also what lets the GPU binner
|
|
32
|
+
* write through a *write-only* storage texture, which is all core WGSL gives.
|
|
33
|
+
*/
|
|
34
|
+
export const CLUSTER_TEXELS = 5;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* How many lights one cluster can hold. Four index texels at four indices each.
|
|
38
|
+
*
|
|
39
|
+
* **Sixteen because that is `MAX_POINT_LIGHTS`, and the equality is the point.** The light loop's
|
|
40
|
+
* bound has to be a constant and there is only one loop, so a larger cap here would raise it for
|
|
41
|
+
* the fixed path too — a scene that never asks for froxels would carry a loop bound of 28 where it
|
|
42
|
+
* carries 16 today, which on the driver that faulted under the full shader is precisely the sort
|
|
43
|
+
* of change nobody would attribute to clustering. Equal bounds mean the fixed path is untouched.
|
|
44
|
+
*
|
|
45
|
+
* **It is not the old limit wearing a new hat.** Sixteen was a budget for the *whole scene*, chosen
|
|
46
|
+
* by distance with a contention band because somebody always had to be last. Sixteen per froxel is
|
|
47
|
+
* a different sixteen in every froxel, out of `MAX_CLUSTERED_LIGHTS` in the scene.
|
|
48
|
+
*/
|
|
49
|
+
export const MAX_LIGHTS_PER_CLUSTER = (CLUSTER_TEXELS - 1) * 4;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* How many lights the clustered path carries at once.
|
|
53
|
+
*
|
|
54
|
+
* **This is the number that replaces `MAX_POINT_LIGHTS`**, and it is not bounded by the same
|
|
55
|
+
* thing: the sixteen is a uniform-array size and an iteration of the widest shader's light loop,
|
|
56
|
+
* while this is a row count in a texture nobody iterates in full. 320 lights is three rows.
|
|
57
|
+
*
|
|
58
|
+
* 320 rather than 256 because the light region has to end on a row boundary — see `TABLE_WIDTH` —
|
|
59
|
+
* and at three texels a light, 320 is the smallest count at or above 256 that does.
|
|
60
|
+
*/
|
|
61
|
+
export const MAX_CLUSTERED_LIGHTS = 320;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Texels one light's record occupies: position and radius, colour and emitter size, then the
|
|
65
|
+
* weight and the shadow slot.
|
|
66
|
+
*
|
|
67
|
+
* **The shadow slot is an index into the existing sixteen-wide shadow uniforms, not a layer.**
|
|
68
|
+
* Clustering lifts how many lights *shade* a fragment; it does not lift how many shadow maps
|
|
69
|
+
* exist, and it should not — the pool is twenty-two octahedral layers at 1024, 92.3 MB, and that
|
|
70
|
+
* is a memory budget rather than a shader limit. So a clustered light either holds one of those
|
|
71
|
+
* slots or casts no shadow, exactly as a light does today, and `-1` says which.
|
|
72
|
+
*
|
|
73
|
+
* GLSL ES can index a *uniform array* with a non-constant expression; it is only sampler arrays
|
|
74
|
+
* it cannot. That is what lets a light index the shadow uniforms by a number read from a texture,
|
|
75
|
+
* and it is the same fact the octahedral array texture was built on.
|
|
76
|
+
*/
|
|
77
|
+
export const LIGHT_TEXELS = 5;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Where each field of a light's record sits, as an offset in `uint`s from `lightBase`.
|
|
81
|
+
*
|
|
82
|
+
* **Written out rather than left to the two writers to agree on**, because there are two: this
|
|
83
|
+
* file's CPU binner and `clusterBinner.ts`'s WGSL kernel, and the 2026-08-17 rule is that two
|
|
84
|
+
* implementations of one decision drift invisibly when the constants are identical.
|
|
85
|
+
* `scripts/cluster-check.mjs` compares the tables byte for byte and is the backstop; this table is
|
|
86
|
+
* so that the two are written from one statement rather than compared after the fact.
|
|
87
|
+
*
|
|
88
|
+
* Slots 10 to 15 arrived with the fourth texel and the spot fields fill them exactly — direction,
|
|
89
|
+
* two cone cosines, and a profile index — with nothing spare. Slots 10 and 11 were already free
|
|
90
|
+
* inside the third texel and were being written as literal zeros.
|
|
91
|
+
*
|
|
92
|
+
* **A fifth texel arrived 2026-08-27 for the photometric azimuth**, and the reason it is affordable
|
|
93
|
+
* is a measurement rather than a shrug: the light region is `MAX_CLUSTERED_LIGHTS * LIGHT_TEXELS`
|
|
94
|
+
* texels — 20 KB at four — against a froxel region of 270 KB, so a fifth texel is **5 KB of 290,
|
|
95
|
+
* 1.7% of the table**. The obvious reading is that a fifth of four is a quarter, and that is a
|
|
96
|
+
* quarter of the *smaller* half. Slot 19 is spare.
|
|
97
|
+
*
|
|
98
|
+
* **Why the azimuth needs a vector at all**, rather than being derived from the direction: there is
|
|
99
|
+
* no continuous field of unit vectors tangent to a sphere — the hairy ball theorem — so *any*
|
|
100
|
+
* reference derived from the aim alone has a direction in which it flips, and an asymmetric fixture
|
|
101
|
+
* rotating through that direction would snap its pattern round. The two obvious constructions put
|
|
102
|
+
* that singularity where these fixtures actually point: `cross(worldUp, dir)` fails for a light
|
|
103
|
+
* aimed straight down, which is a street light.
|
|
104
|
+
*/
|
|
105
|
+
export const LIGHT_RECORD = {
|
|
106
|
+
positionX: 0,
|
|
107
|
+
positionY: 1,
|
|
108
|
+
positionZ: 2,
|
|
109
|
+
radius: 3,
|
|
110
|
+
colorR: 4,
|
|
111
|
+
colorG: 5,
|
|
112
|
+
colorB: 6,
|
|
113
|
+
sourceRadius: 7,
|
|
114
|
+
weight: 8,
|
|
115
|
+
shadowSlot: 9,
|
|
116
|
+
directionX: 10,
|
|
117
|
+
directionY: 11,
|
|
118
|
+
directionZ: 12,
|
|
119
|
+
cosInner: 13,
|
|
120
|
+
cosOuter: 14,
|
|
121
|
+
iesProfile: 15,
|
|
122
|
+
/** The fixture's azimuth zero, in world space. See the note above on why it cannot be derived. */
|
|
123
|
+
iesAxisX: 16,
|
|
124
|
+
iesAxisY: 17,
|
|
125
|
+
iesAxisZ: 18,
|
|
126
|
+
/** A tile of the cookie atlas, or negative for none. Slot 19, the one the fifth texel spared. */
|
|
127
|
+
cookie: 19,
|
|
128
|
+
} as const;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The cone a light with no cone has: one that admits every direction, exactly.
|
|
132
|
+
*
|
|
133
|
+
* **`smoothstep(cosOuter, cosInner, dot(-L, dir))` must return exactly 1 for a point light**, and
|
|
134
|
+
* these two values are what make it. Every direction on the sphere has `dot >= -1`, so with the
|
|
135
|
+
* outer edge at −2 and the inner at −1 the argument is always at or past the upper edge and
|
|
136
|
+
* `smoothstep` is 1 — no branch, no special case, and the published scenes stay bit-identical by
|
|
137
|
+
* construction rather than by measurement.
|
|
138
|
+
*
|
|
139
|
+
* **Not −1 and −1**, which is the spelling that suggests itself: `smoothstep(a, a, x)` is undefined
|
|
140
|
+
* when the two edges are equal and a driver may answer either bound.
|
|
141
|
+
*/
|
|
142
|
+
export const POINT_LIGHT_COS_INNER = -1;
|
|
143
|
+
export const POINT_LIGHT_COS_OUTER = -2;
|
|
144
|
+
|
|
145
|
+
/** A light carrying no IES profile. Matches the shader's own test against a negative index. */
|
|
146
|
+
export const NO_IES_PROFILE = -1;
|
|
147
|
+
|
|
148
|
+
/** The record's `w` when a light holds no shadow slot. */
|
|
149
|
+
export const NO_SHADOW_SLOT = -1;
|
|
150
|
+
|
|
151
|
+
/** Texels the light records occupy, which is where the cluster runs begin. */
|
|
152
|
+
export const LIGHT_REGION_TEXELS = MAX_CLUSTERED_LIGHTS * LIGHT_TEXELS;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Texels across the table.
|
|
156
|
+
*
|
|
157
|
+
* **320, so that neither region straddles a row.** 320 divides by `CLUSTER_TEXELS`, so a cluster's
|
|
158
|
+
* run of five is 64 clusters to a row and never wraps — a cluster split across two rows would need
|
|
159
|
+
* the shader to carry the wrap, and getting that wrong reads as lights belonging to the froxel
|
|
160
|
+
* next door. It divides `LIGHT_REGION_TEXELS` exactly too, so the cluster region starts at the
|
|
161
|
+
* beginning of a row.
|
|
162
|
+
*/
|
|
163
|
+
export const TABLE_WIDTH = 320;
|
|
164
|
+
|
|
165
|
+
/** Rows: three of light records and 54 of cluster runs. 292 KB of `RGBA32UI`, allocated once. */
|
|
166
|
+
export const TABLE_HEIGHT = (LIGHT_REGION_TEXELS + CLUSTER_COUNT * CLUSTER_TEXELS) / TABLE_WIDTH;
|
|
167
|
+
|
|
168
|
+
/** The table, as the `Uint32Array` both a texture upload and a readback comparison want. */
|
|
169
|
+
export function createClusterTable(): Uint32Array {
|
|
170
|
+
return new Uint32Array(TABLE_WIDTH * TABLE_HEIGHT * 4);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** The first `uint` of a cluster's run: its count. Its indices follow four to a texel. */
|
|
174
|
+
export function clusterBase(cluster: number): number {
|
|
175
|
+
return (LIGHT_REGION_TEXELS + cluster * CLUSTER_TEXELS) * 4;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** The first `uint` of a light's record. */
|
|
179
|
+
export function lightBase(light: number): number {
|
|
180
|
+
return light * LIGHT_TEXELS * 4;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Which depth slice a view-space depth falls in.
|
|
185
|
+
*
|
|
186
|
+
* Exponential rather than linear, which is what every published clustered renderer settled on: a
|
|
187
|
+
* linear partition spends most of its slices where the eye has no depth discrimination left, and
|
|
188
|
+
* puts almost every light in a scene into the first one.
|
|
189
|
+
*
|
|
190
|
+
* Clamped at both ends rather than allowed to run off. A fragment exactly on the far plane is a
|
|
191
|
+
* real fragment and must land in the last slice, not one past it.
|
|
192
|
+
*/
|
|
193
|
+
export function sliceOfViewDepth(z: number, near: number, far: number): number {
|
|
194
|
+
if (!(z > near)) return 0;
|
|
195
|
+
const slice = Math.floor((Math.log(z / near) / Math.log(far / near)) * CLUSTER_Z);
|
|
196
|
+
return slice < 0 ? 0 : slice > CLUSTER_Z - 1 ? CLUSTER_Z - 1 : slice;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** The view-space depth a slice begins at. */
|
|
200
|
+
export function sliceNearDepth(slice: number, near: number, far: number): number {
|
|
201
|
+
return near * (far / near) ** (slice / CLUSTER_Z);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The axis-aligned bounds of one cluster, in view space, as `[minX, minY, minZ, maxX, maxY, maxZ]`
|
|
206
|
+
* with z a positive depth.
|
|
207
|
+
*
|
|
208
|
+
* **The AABB of the cluster's eight corners, which is larger than the cluster.** A froxel is a
|
|
209
|
+
* truncated pyramid and its bounding box is not tight at the near end; the cost of that is a light
|
|
210
|
+
* occasionally binned into a cluster it only *nearly* touches, which shades a few fragments
|
|
211
|
+
* against a light contributing almost nothing. The alternative — testing the sphere against six
|
|
212
|
+
* planes — is exact, costs four more dot products per light per cluster, and is what to reach for
|
|
213
|
+
* if a profile ever indicts this. It is stated rather than hidden because the looseness is
|
|
214
|
+
* visible in the conformance script's borderline count and would otherwise read as a bug.
|
|
215
|
+
*/
|
|
216
|
+
export function clusterViewBounds(
|
|
217
|
+
i: number,
|
|
218
|
+
j: number,
|
|
219
|
+
k: number,
|
|
220
|
+
near: number,
|
|
221
|
+
far: number,
|
|
222
|
+
tanHalfFovY: number,
|
|
223
|
+
aspect: number,
|
|
224
|
+
out: Float32Array,
|
|
225
|
+
): void {
|
|
226
|
+
const zNear = sliceNearDepth(k, near, far);
|
|
227
|
+
const zFar = sliceNearDepth(k + 1, near, far);
|
|
228
|
+
|
|
229
|
+
/* NDC edges of the tile. The y axis runs the same way as the view's, so no flip lives here. */
|
|
230
|
+
const xLo = -1 + (2 * i) / CLUSTER_X;
|
|
231
|
+
const xHi = -1 + (2 * (i + 1)) / CLUSTER_X;
|
|
232
|
+
const yLo = -1 + (2 * j) / CLUSTER_Y;
|
|
233
|
+
const yHi = -1 + (2 * (j + 1)) / CLUSTER_Y;
|
|
234
|
+
|
|
235
|
+
const halfHNear = zNear * tanHalfFovY;
|
|
236
|
+
const halfHFar = zFar * tanHalfFovY;
|
|
237
|
+
const halfWNear = halfHNear * aspect;
|
|
238
|
+
const halfWFar = halfHFar * aspect;
|
|
239
|
+
|
|
240
|
+
/* Four products a side, because a tile straddling zero has its extreme at the far plane on
|
|
241
|
+
both sides while one entirely to one side has its minimum at the near plane. */
|
|
242
|
+
out[0] = Math.min(xLo * halfWNear, xLo * halfWFar, xHi * halfWNear, xHi * halfWFar);
|
|
243
|
+
out[3] = Math.max(xLo * halfWNear, xLo * halfWFar, xHi * halfWNear, xHi * halfWFar);
|
|
244
|
+
out[1] = Math.min(yLo * halfHNear, yLo * halfHFar, yHi * halfHNear, yHi * halfHFar);
|
|
245
|
+
out[4] = Math.max(yLo * halfHNear, yLo * halfHFar, yHi * halfHNear, yHi * halfHFar);
|
|
246
|
+
out[2] = zNear;
|
|
247
|
+
out[5] = zFar;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** The light arrays the binner reads, in the shape `Environment` already carries them. */
|
|
251
|
+
export interface ClusterLightSet {
|
|
252
|
+
readonly count: number;
|
|
253
|
+
/** Three per light, world space. */
|
|
254
|
+
readonly positions: Float32Array;
|
|
255
|
+
/** Three per light. */
|
|
256
|
+
readonly colors: Float32Array;
|
|
257
|
+
/** One per light: the distance at which illumination falls to zero. */
|
|
258
|
+
readonly radii: Float32Array;
|
|
259
|
+
/** One per light: emitter size in metres. See `sphereLobe`. */
|
|
260
|
+
readonly sourceRadii: Float32Array;
|
|
261
|
+
/** One per light: how present it is, which is what makes a light arrive rather than appear. */
|
|
262
|
+
readonly weights: Float32Array;
|
|
263
|
+
/**
|
|
264
|
+
* Three per light: the direction a spot points, normalised. Absent means every light is a point.
|
|
265
|
+
*
|
|
266
|
+
* Optional, so a consumer that has never heard of spot lights passes exactly what it passed
|
|
267
|
+
* before and gets exactly what it got before — the collapse `POINT_LIGHT_COS_OUTER` describes.
|
|
268
|
+
*/
|
|
269
|
+
readonly directions?: Float32Array;
|
|
270
|
+
/** Two per light: the cosine of the inner cone angle, then of the outer. See the constants. */
|
|
271
|
+
readonly coneCos?: Float32Array;
|
|
272
|
+
/** Three per light: a photometric profile's azimuth zero. See `PointLightSet.lightIesAxes`. */
|
|
273
|
+
readonly iesAxes?: Float32Array;
|
|
274
|
+
/** One per light: a tile of the cookie atlas, or negative. See `PointLightSet.lightCookies`. */
|
|
275
|
+
readonly cookies?: Float32Array;
|
|
276
|
+
/** One per light: an index into the IES atlas, or −1. */
|
|
277
|
+
readonly iesProfiles?: Float32Array;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* Scratch, at module scope, because `buildLightClusters` runs per frame on WebGL2 and the house
|
|
282
|
+
* rule forbids allocating there.
|
|
283
|
+
*/
|
|
284
|
+
const bounds = new Float32Array(6);
|
|
285
|
+
/** View-space light centres, kept for the overflow rule, which needs them after the fact. */
|
|
286
|
+
const viewX = new Float32Array(MAX_CLUSTERED_LIGHTS);
|
|
287
|
+
const viewY = new Float32Array(MAX_CLUSTERED_LIGHTS);
|
|
288
|
+
const viewZ = new Float32Array(MAX_CLUSTERED_LIGHTS);
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* A float reinterpreted as the `uint` that carries its bits, and back.
|
|
292
|
+
*
|
|
293
|
+
* The table is `RGBA32UI` because the *indices* are integers and an integer is what a texture can
|
|
294
|
+
* carry exactly. The light records in the same texture are floats, so they travel as their own bit
|
|
295
|
+
* pattern and the shader reads them with `uintBitsToFloat`. One texture, one texture unit, two
|
|
296
|
+
* kinds of payload — rather than a second unit for three rows of numbers.
|
|
297
|
+
*/
|
|
298
|
+
const bits = new ArrayBuffer(4);
|
|
299
|
+
const bitsFloat = new Float32Array(bits);
|
|
300
|
+
const bitsUint = new Uint32Array(bits);
|
|
301
|
+
|
|
302
|
+
function floatBits(value: number): number {
|
|
303
|
+
bitsFloat[0] = value;
|
|
304
|
+
return bitsUint[0] ?? 0;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** The squared distance from a point to an axis-aligned box, zero inside it. */
|
|
308
|
+
function distanceSqToBounds(x: number, y: number, z: number, b: Float32Array): number {
|
|
309
|
+
const dx = x < (b[0] ?? 0) ? (b[0] ?? 0) - x : x > (b[3] ?? 0) ? x - (b[3] ?? 0) : 0;
|
|
310
|
+
const dy = y < (b[1] ?? 0) ? (b[1] ?? 0) - y : y > (b[4] ?? 0) ? y - (b[4] ?? 0) : 0;
|
|
311
|
+
const dz = z < (b[2] ?? 0) ? (b[2] ?? 0) - z : z > (b[5] ?? 0) ? z - (b[5] ?? 0) : 0;
|
|
312
|
+
return dx * dx + dy * dy + dz * dz;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/** Insertion sort over a cluster's index slots. At most 28 integers, so this is not a hot loop. */
|
|
316
|
+
function sortIndices(table: Uint32Array, base: number, count: number): void {
|
|
317
|
+
for (let n = 1; n < count; n++) {
|
|
318
|
+
const value = table[base + 4 + n] ?? 0;
|
|
319
|
+
let m = n - 1;
|
|
320
|
+
while (m >= 0 && (table[base + 4 + m] ?? 0) > value) {
|
|
321
|
+
table[base + 4 + m + 1] = table[base + 4 + m] ?? 0;
|
|
322
|
+
m--;
|
|
323
|
+
}
|
|
324
|
+
table[base + 4 + m + 1] = value;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Fill the table with this frame's light assignment, and answer how many lights it carried.
|
|
330
|
+
*
|
|
331
|
+
* **A cluster's list is written in increasing light index, and that is a decision about the gate
|
|
332
|
+
* rather than about the picture.** Sorting by distance was the first design and it is wrong for
|
|
333
|
+
* one reason that only appears at the conformance check: a float comparison cannot be relied on to
|
|
334
|
+
* rank two nearly equidistant lights the same way in JavaScript and in WGSL. Contraction,
|
|
335
|
+
* evaluation order, and a JS number that is a double until something rounds it are each enough to
|
|
336
|
+
* swap them, and the byte comparison would then fail on a scene where both binners were correct.
|
|
337
|
+
* An integer key has no such freedom.
|
|
338
|
+
*
|
|
339
|
+
* **A float decides one thing only: which lights survive an overflow.** A full cluster meeting a
|
|
340
|
+
* nearer light drops its farthest, and the survivors are re-sorted ascending before the next one
|
|
341
|
+
* arrives, so the bytes stay deterministic even though the membership was chosen by a comparison
|
|
342
|
+
* allowed to differ in its last bit. Keeping the first N encountered was the alternative and it
|
|
343
|
+
* can drop the lamp a viewer is standing under in favour of 28 distant ones, which the fidelity
|
|
344
|
+
* bar does not allow.
|
|
345
|
+
*
|
|
346
|
+
* **Positions are stored in world space and binned in view space.** The lit pass computes
|
|
347
|
+
* `uLightPos[i] - vWorldPos` and the clustered arm must reach the same arithmetic from a different
|
|
348
|
+
* place — storing view-space positions would make the two arms differ by a transform, and the
|
|
349
|
+
* zero-pixel gate between them would stop meaning anything.
|
|
350
|
+
*
|
|
351
|
+
* **Measured, because this runs on the main thread on WebGL2 and a cost nobody measured is a cost
|
|
352
|
+
* nobody can defend.** On this machine, lights of radius 8 in a 0.1 to 500 frustum:
|
|
353
|
+
*
|
|
354
|
+
* 16 lights 0.411 ms a frame
|
|
355
|
+
* 64 lights 1.037 ms a frame
|
|
356
|
+
* 256 lights 2.589 ms a frame
|
|
357
|
+
*
|
|
358
|
+
* Sixteen is today's budget and is nearly free. **256 is 16% of a 60 fps frame**, which is
|
|
359
|
+
* affordable and is not nothing — and it is the honest argument for the GPU binner rather than a
|
|
360
|
+
* stopwatch on a shader. The floor is the per-frame clear of the cluster region; the slope is the
|
|
361
|
+
* tile box, which grows with a light's screen area rather than with the light count, so a scene of
|
|
362
|
+
* small lamps costs far less than this and one of vast overlapping radii costs more.
|
|
363
|
+
*
|
|
364
|
+
* **Re-measured after the tile box moved inside the slice loop**, which is what made the two
|
|
365
|
+
* binners agree: 0.386, 0.895 and 2.001 ms before, so correctness cost between 6% and 29%. Worth
|
|
366
|
+
* recording, because the earlier numbers were for a binner that dropped lights.
|
|
367
|
+
*
|
|
368
|
+
* `shadowSlots` is how many of the shadow uniform slots are live this frame, which is what
|
|
369
|
+
* decides whether a light's record names one. See `LIGHT_TEXELS`.
|
|
370
|
+
*
|
|
371
|
+
* Fills a caller-owned table and allocates nothing.
|
|
372
|
+
*/
|
|
373
|
+
export function buildLightClusters(
|
|
374
|
+
lights: ClusterLightSet,
|
|
375
|
+
view: Float32Array,
|
|
376
|
+
near: number,
|
|
377
|
+
far: number,
|
|
378
|
+
tanHalfFovY: number,
|
|
379
|
+
aspect: number,
|
|
380
|
+
table: Uint32Array,
|
|
381
|
+
shadowSlots: number,
|
|
382
|
+
): number {
|
|
383
|
+
const count = Math.min(lights.count, MAX_CLUSTERED_LIGHTS);
|
|
384
|
+
|
|
385
|
+
/*
|
|
386
|
+
* The whole cluster region, not just the counts.
|
|
387
|
+
*
|
|
388
|
+
* **An index past the count is never read, so this looks like waste and is not.** The GPU binner
|
|
389
|
+
* writes a cluster's eight texels in one go — a write-only storage texture has no read-modify-
|
|
390
|
+
* write — so its unused slots are zero. If this left last frame's indices sitting there, the two
|
|
391
|
+
* tables would differ in bytes neither shader can see, and the conformance script would have to
|
|
392
|
+
* learn which differences to forgive. A `fill` is a memset and costs less than the loop it
|
|
393
|
+
* replaces; agreeing about the invisible bytes is what keeps the comparison exact.
|
|
394
|
+
*/
|
|
395
|
+
table.fill(0, LIGHT_REGION_TEXELS * 4);
|
|
396
|
+
|
|
397
|
+
for (let light = 0; light < count; light++) {
|
|
398
|
+
const x = lights.positions[light * 3] ?? 0;
|
|
399
|
+
const y = lights.positions[light * 3 + 1] ?? 0;
|
|
400
|
+
const z = lights.positions[light * 3 + 2] ?? 0;
|
|
401
|
+
const radius = lights.radii[light] ?? 0;
|
|
402
|
+
|
|
403
|
+
/* The record, as the shader reads it. World space; see the note above. */
|
|
404
|
+
const record = lightBase(light);
|
|
405
|
+
table[record] = floatBits(x);
|
|
406
|
+
table[record + 1] = floatBits(y);
|
|
407
|
+
table[record + 2] = floatBits(z);
|
|
408
|
+
table[record + 3] = floatBits(radius);
|
|
409
|
+
table[record + 4] = floatBits(lights.colors[light * 3] ?? 0);
|
|
410
|
+
table[record + 5] = floatBits(lights.colors[light * 3 + 1] ?? 0);
|
|
411
|
+
table[record + 6] = floatBits(lights.colors[light * 3 + 2] ?? 0);
|
|
412
|
+
table[record + 7] = floatBits(lights.sourceRadii[light] ?? 0);
|
|
413
|
+
table[record + 8] = floatBits(lights.weights[light] ?? 1);
|
|
414
|
+
/*
|
|
415
|
+
* Signed, and carried as a float's bits like everything else in the record so the shader
|
|
416
|
+
* reads the whole texel one way. The first `MAX_POINT_LIGHTS` lights keep the shadow slots
|
|
417
|
+
* they already have — `resolvePointLights` orders them so the ones worth shadowing come
|
|
418
|
+
* first — and everything past that is a light without a map, which is what a scene with two
|
|
419
|
+
* hundred lamps has anyway.
|
|
420
|
+
*/
|
|
421
|
+
table[record + LIGHT_RECORD.shadowSlot] = floatBits(
|
|
422
|
+
light < shadowSlots ? light : NO_SHADOW_SLOT,
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
/*
|
|
426
|
+
* The cone, and a light that declared none gets the one that admits everything. Written for
|
|
427
|
+
* every light rather than only for spots, because the shader reads the same six slots either
|
|
428
|
+
* way and a record left at whatever the last frame put there is a cone nobody asked for.
|
|
429
|
+
*/
|
|
430
|
+
const cone = lights.coneCos;
|
|
431
|
+
const directions = lights.directions;
|
|
432
|
+
const iesAxes = lights.iesAxes;
|
|
433
|
+
table[record + LIGHT_RECORD.directionX] = floatBits(directions?.[light * 3] ?? 0);
|
|
434
|
+
table[record + LIGHT_RECORD.directionY] = floatBits(directions?.[light * 3 + 1] ?? 0);
|
|
435
|
+
table[record + LIGHT_RECORD.directionZ] = floatBits(directions?.[light * 3 + 2] ?? 0);
|
|
436
|
+
table[record + LIGHT_RECORD.cosInner] = floatBits(cone?.[light * 2] ?? POINT_LIGHT_COS_INNER);
|
|
437
|
+
table[record + LIGHT_RECORD.cosOuter] = floatBits(
|
|
438
|
+
cone?.[light * 2 + 1] ?? POINT_LIGHT_COS_OUTER,
|
|
439
|
+
);
|
|
440
|
+
table[record + LIGHT_RECORD.iesProfile] = floatBits(
|
|
441
|
+
lights.iesProfiles?.[light] ?? NO_IES_PROFILE,
|
|
442
|
+
);
|
|
443
|
+
/* Zero where a consumer gave none, which the shader reads as "no usable reference" and falls
|
|
444
|
+
back to the first plane — the behaviour every symmetric profile has anyway. */
|
|
445
|
+
table[record + LIGHT_RECORD.iesAxisX] = floatBits(iesAxes?.[light * 3] ?? 0);
|
|
446
|
+
table[record + LIGHT_RECORD.iesAxisY] = floatBits(iesAxes?.[light * 3 + 1] ?? 0);
|
|
447
|
+
table[record + LIGHT_RECORD.iesAxisZ] = floatBits(iesAxes?.[light * 3 + 2] ?? 0);
|
|
448
|
+
table[record + LIGHT_RECORD.cookie] = floatBits(lights.cookies?.[light] ?? NO_IES_PROFILE);
|
|
449
|
+
|
|
450
|
+
/* Column-major, as gl-matrix builds it. The view looks down -z, so depth is -vz. */
|
|
451
|
+
const vx = (view[0] ?? 0) * x + (view[4] ?? 0) * y + (view[8] ?? 0) * z + (view[12] ?? 0);
|
|
452
|
+
const vy = (view[1] ?? 0) * x + (view[5] ?? 0) * y + (view[9] ?? 0) * z + (view[13] ?? 0);
|
|
453
|
+
const vz = (view[2] ?? 0) * x + (view[6] ?? 0) * y + (view[10] ?? 0) * z + (view[14] ?? 0);
|
|
454
|
+
const depth = -vz;
|
|
455
|
+
viewX[light] = vx;
|
|
456
|
+
viewY[light] = vy;
|
|
457
|
+
viewZ[light] = depth;
|
|
458
|
+
|
|
459
|
+
/* Entirely behind the camera, so no cluster can reach it. */
|
|
460
|
+
if (depth + radius <= 0) continue;
|
|
461
|
+
|
|
462
|
+
/*
|
|
463
|
+
* The slices the sphere could possibly touch. The tiles are derived per slice, below.
|
|
464
|
+
*
|
|
465
|
+
* **Two versions of this were wrong before the conformance script settled it**, and both were
|
|
466
|
+
* wrong in the same direction: they skipped clusters the exact test would have accepted, so
|
|
467
|
+
* WebGL2 simply lacked lights that WebGPU had. Recorded because the reasoning is seductive.
|
|
468
|
+
*
|
|
469
|
+
* The first projected the sphere at its *nearest* depth, on the argument that a light subtends
|
|
470
|
+
* its largest angle there. That holds for a light straddling the view axis and fails beside
|
|
471
|
+
* it: dividing by the smallest half-height magnifies both endpoints *away* from the centre, so
|
|
472
|
+
* an off-axis interval slides off screen and clamps to one edge tile. A light 8.9 m below the
|
|
473
|
+
* axis at 8.2 m depth with an 8 m radius spanned NDC -58 to -3 there, against -1.8 to -0.09 at
|
|
474
|
+
* the far end of its own extent.
|
|
475
|
+
*
|
|
476
|
+
* The second took the extremes across the sphere's own depth range, which fixed that case and
|
|
477
|
+
* not the next one: **a froxel's box spans its slice's depth range, not the sphere's**, and a
|
|
478
|
+
* slice reaching past the sphere is wider in world x than anything the sphere's extent
|
|
479
|
+
* describes.
|
|
480
|
+
*
|
|
481
|
+
* So the tile box is derived from the slice, inside the loop, by inverting exactly the bounds
|
|
482
|
+
* `clusterViewBounds` builds. It is tight and it is conservative by construction rather than
|
|
483
|
+
* by an argument, which is what the two attempts above were.
|
|
484
|
+
*/
|
|
485
|
+
const kLo = sliceOfViewDepth(depth - radius, near, far);
|
|
486
|
+
const kHi = sliceOfViewDepth(depth + radius, near, far);
|
|
487
|
+
const xLo = vx - radius;
|
|
488
|
+
const xHi = vx + radius;
|
|
489
|
+
const yLo = vy - radius;
|
|
490
|
+
const yHi = vy + radius;
|
|
491
|
+
|
|
492
|
+
const radiusSq = radius * radius;
|
|
493
|
+
for (let k = kLo; k <= kHi; k++) {
|
|
494
|
+
/* The same two depths `clusterViewBounds` builds this slice's box from. */
|
|
495
|
+
const halfHNear = sliceNearDepth(k, near, far) * tanHalfFovY;
|
|
496
|
+
const halfHFar = sliceNearDepth(k + 1, near, far) * tanHalfFovY;
|
|
497
|
+
const halfWNear = halfHNear * aspect;
|
|
498
|
+
const halfWFar = halfHFar * aspect;
|
|
499
|
+
const iLo = tileOf(
|
|
500
|
+
Math.min(xLo / halfWNear, xLo / halfWFar, xHi / halfWNear, xHi / halfWFar),
|
|
501
|
+
CLUSTER_X,
|
|
502
|
+
);
|
|
503
|
+
const iHi = tileOf(
|
|
504
|
+
Math.max(xLo / halfWNear, xLo / halfWFar, xHi / halfWNear, xHi / halfWFar),
|
|
505
|
+
CLUSTER_X,
|
|
506
|
+
);
|
|
507
|
+
const jLo = tileOf(
|
|
508
|
+
Math.min(yLo / halfHNear, yLo / halfHFar, yHi / halfHNear, yHi / halfHFar),
|
|
509
|
+
CLUSTER_Y,
|
|
510
|
+
);
|
|
511
|
+
const jHi = tileOf(
|
|
512
|
+
Math.max(yLo / halfHNear, yLo / halfHFar, yHi / halfHNear, yHi / halfHFar),
|
|
513
|
+
CLUSTER_Y,
|
|
514
|
+
);
|
|
515
|
+
for (let j = jLo; j <= jHi; j++) {
|
|
516
|
+
for (let i = iLo; i <= iHi; i++) {
|
|
517
|
+
clusterViewBounds(i, j, k, near, far, tanHalfFovY, aspect, bounds);
|
|
518
|
+
if (distanceSqToBounds(vx, vy, depth, bounds) > radiusSq) continue;
|
|
519
|
+
insert(
|
|
520
|
+
table,
|
|
521
|
+
i + j * CLUSTER_X + k * CLUSTER_X * CLUSTER_Y,
|
|
522
|
+
light,
|
|
523
|
+
near,
|
|
524
|
+
far,
|
|
525
|
+
tanHalfFovY,
|
|
526
|
+
aspect,
|
|
527
|
+
);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return count;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/** An NDC coordinate to a tile index, clamped. */
|
|
536
|
+
function tileOf(ndc: number, tiles: number): number {
|
|
537
|
+
const tile = Math.floor((ndc + 1) * 0.5 * tiles);
|
|
538
|
+
return tile < 0 ? 0 : tile > tiles - 1 ? tiles - 1 : tile;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Put a light into a cluster, applying the overflow rule.
|
|
543
|
+
*
|
|
544
|
+
* Lights arrive in increasing index, so the common path appends and the list is already sorted.
|
|
545
|
+
* The sort only runs on the rare path where a replacement broke that order.
|
|
546
|
+
*/
|
|
547
|
+
function insert(
|
|
548
|
+
table: Uint32Array,
|
|
549
|
+
cluster: number,
|
|
550
|
+
light: number,
|
|
551
|
+
near: number,
|
|
552
|
+
far: number,
|
|
553
|
+
tanHalfFovY: number,
|
|
554
|
+
aspect: number,
|
|
555
|
+
): void {
|
|
556
|
+
const base = clusterBase(cluster);
|
|
557
|
+
const count = table[base] ?? 0;
|
|
558
|
+
if (count < MAX_LIGHTS_PER_CLUSTER) {
|
|
559
|
+
table[base + 4 + count] = light;
|
|
560
|
+
table[base] = count + 1;
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/*
|
|
565
|
+
* Full. Drop the farthest member if this one is nearer, measured from the cluster's own centre.
|
|
566
|
+
* Rare enough that recomputing the members' distances beats carrying 96,768 floats of scratch
|
|
567
|
+
* for a case most frames never reach.
|
|
568
|
+
*/
|
|
569
|
+
const k = Math.floor(cluster / (CLUSTER_X * CLUSTER_Y));
|
|
570
|
+
const j = Math.floor((cluster - k * CLUSTER_X * CLUSTER_Y) / CLUSTER_X);
|
|
571
|
+
const i = cluster - k * CLUSTER_X * CLUSTER_Y - j * CLUSTER_X;
|
|
572
|
+
clusterViewBounds(i, j, k, near, far, tanHalfFovY, aspect, bounds);
|
|
573
|
+
const cx = ((bounds[0] ?? 0) + (bounds[3] ?? 0)) * 0.5;
|
|
574
|
+
const cy = ((bounds[1] ?? 0) + (bounds[4] ?? 0)) * 0.5;
|
|
575
|
+
const cz = ((bounds[2] ?? 0) + (bounds[5] ?? 0)) * 0.5;
|
|
576
|
+
|
|
577
|
+
const mine = centreDistanceSq(light, cx, cy, cz);
|
|
578
|
+
let worstSlot = -1;
|
|
579
|
+
let worst = mine;
|
|
580
|
+
for (let n = 0; n < MAX_LIGHTS_PER_CLUSTER; n++) {
|
|
581
|
+
const held = table[base + 4 + n] ?? 0;
|
|
582
|
+
const d = centreDistanceSq(held, cx, cy, cz);
|
|
583
|
+
if (d > worst) {
|
|
584
|
+
worst = d;
|
|
585
|
+
worstSlot = n;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
if (worstSlot < 0) return;
|
|
589
|
+
table[base + 4 + worstSlot] = light;
|
|
590
|
+
sortIndices(table, base, MAX_LIGHTS_PER_CLUSTER);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
function centreDistanceSq(light: number, cx: number, cy: number, cz: number): number {
|
|
594
|
+
const dx = (viewX[light] ?? 0) - cx;
|
|
595
|
+
const dy = (viewY[light] ?? 0) - cy;
|
|
596
|
+
const dz = (viewZ[light] ?? 0) - cz;
|
|
597
|
+
return dx * dx + dy * dy + dz * dz;
|
|
598
|
+
}
|