@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,25 @@
|
|
|
1
|
+
import type { PlumePlacement } from './plumeRenderer.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The crossed quads a plume batch is drawn from, built once for both backends.
|
|
4
|
+
*
|
|
5
|
+
* **Two blades rather than a billboard, and two rather than three.** A single card turned to
|
|
6
|
+
* face the viewer has no three-dimensional structure to see — orbiting a fire showed the same
|
|
7
|
+
* silhouette from every angle — while a fixed cross has the parallax a volume has and never
|
|
8
|
+
* goes edge-on, because its partner is square-on at that exact moment. The third blade costs
|
|
9
|
+
* 50% more geometry for a difference the eye does not separate at these sizes.
|
|
10
|
+
*
|
|
11
|
+
* Here rather than in `plumeRenderer.ts` because a second copy of a mesh generator is a plume
|
|
12
|
+
* whose triangles differ per backend, which is the 2026-08-13 rule in `AGENTS.md`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PLUME_BLADES = 2;
|
|
15
|
+
export declare const PLUME_VERTS: number;
|
|
16
|
+
/** The five attribute streams and the index list. */
|
|
17
|
+
export interface PlumeGeometryData {
|
|
18
|
+
readonly centers: Float32Array;
|
|
19
|
+
readonly corners: Float32Array;
|
|
20
|
+
readonly sizes: Float32Array;
|
|
21
|
+
readonly seeds: Float32Array;
|
|
22
|
+
readonly blades: Float32Array;
|
|
23
|
+
readonly indices: Uint32Array;
|
|
24
|
+
}
|
|
25
|
+
export declare function buildPlumeGeometry(plumes: readonly PlumePlacement[]): PlumeGeometryData;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The crossed quads a plume batch is drawn from, built once for both backends.
|
|
3
|
+
*
|
|
4
|
+
* **Two blades rather than a billboard, and two rather than three.** A single card turned to
|
|
5
|
+
* face the viewer has no three-dimensional structure to see — orbiting a fire showed the same
|
|
6
|
+
* silhouette from every angle — while a fixed cross has the parallax a volume has and never
|
|
7
|
+
* goes edge-on, because its partner is square-on at that exact moment. The third blade costs
|
|
8
|
+
* 50% more geometry for a difference the eye does not separate at these sizes.
|
|
9
|
+
*
|
|
10
|
+
* Here rather than in `plumeRenderer.ts` because a second copy of a mesh generator is a plume
|
|
11
|
+
* whose triangles differ per backend, which is the 2026-08-13 rule in `AGENTS.md`.
|
|
12
|
+
*/
|
|
13
|
+
export const PLUME_BLADES = 2;
|
|
14
|
+
export const PLUME_VERTS = PLUME_BLADES * 4;
|
|
15
|
+
/** Corners of one blade, as a quad. */
|
|
16
|
+
const CORNERS = [
|
|
17
|
+
[-1, -1],
|
|
18
|
+
[1, -1],
|
|
19
|
+
[1, 1],
|
|
20
|
+
[-1, 1],
|
|
21
|
+
];
|
|
22
|
+
export function buildPlumeGeometry(plumes) {
|
|
23
|
+
const count = plumes.length;
|
|
24
|
+
const centers = new Float32Array(count * PLUME_VERTS * 3);
|
|
25
|
+
const corners = new Float32Array(count * PLUME_VERTS * 2);
|
|
26
|
+
const sizes = new Float32Array(count * PLUME_VERTS * 2);
|
|
27
|
+
const seeds = new Float32Array(count * PLUME_VERTS);
|
|
28
|
+
const blades = new Float32Array(count * PLUME_VERTS);
|
|
29
|
+
const indices = new Uint32Array(count * 6 * PLUME_BLADES);
|
|
30
|
+
for (let f = 0; f < count; f++) {
|
|
31
|
+
const plume = plumes[f];
|
|
32
|
+
if (plume === undefined)
|
|
33
|
+
continue;
|
|
34
|
+
for (let b = 0; b < PLUME_BLADES; b++) {
|
|
35
|
+
for (let c = 0; c < 4; c++) {
|
|
36
|
+
const v = f * PLUME_VERTS + b * 4 + c;
|
|
37
|
+
const corner = CORNERS[c] ?? [0, 0];
|
|
38
|
+
centers[v * 3] = plume.x;
|
|
39
|
+
centers[v * 3 + 1] = plume.y;
|
|
40
|
+
centers[v * 3 + 2] = plume.z;
|
|
41
|
+
corners[v * 2] = corner[0];
|
|
42
|
+
corners[v * 2 + 1] = corner[1];
|
|
43
|
+
sizes[v * 2] = plume.width;
|
|
44
|
+
sizes[v * 2 + 1] = plume.height;
|
|
45
|
+
// Golden-ratio phase offset: neighbours never animate in step.
|
|
46
|
+
seeds[v] = f * 0.618;
|
|
47
|
+
// Which blade of the cross this vertex belongs to.
|
|
48
|
+
blades[v] = b;
|
|
49
|
+
}
|
|
50
|
+
const base = f * PLUME_VERTS + b * 4;
|
|
51
|
+
const i = (f * PLUME_BLADES + b) * 6;
|
|
52
|
+
indices[i] = base;
|
|
53
|
+
indices[i + 1] = base + 1;
|
|
54
|
+
indices[i + 2] = base + 2;
|
|
55
|
+
indices[i + 3] = base;
|
|
56
|
+
indices[i + 4] = base + 2;
|
|
57
|
+
indices[i + 5] = base + 3;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { centers, corners, sizes, seeds, blades, indices };
|
|
61
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which plume material a caller wants, by name rather than by source.
|
|
3
|
+
*
|
|
4
|
+
* **`PlumeOptions` used to take GLSL strings, and that could not cross to a second backend.**
|
|
5
|
+
* WebGPU has no runtime GLSL compiler and this package must never ship one — the toolchain is
|
|
6
|
+
* dev-only, for the licensing and size reasons the WGSL toolchain design
|
|
7
|
+
* records — so a caller-supplied `vertexSource` was a capability that existed on exactly one
|
|
8
|
+
* backend and could never exist on the other.
|
|
9
|
+
*
|
|
10
|
+
* Naming the material instead makes it universal by construction: each backend resolves the
|
|
11
|
+
* name to the shader it can actually compile, and neither can be handed something it cannot
|
|
12
|
+
* use. **The cost is real and was accepted deliberately**: a caller can no longer supply its
|
|
13
|
+
* own plume shader at all. That capability was documented — `uCameraRight` is set
|
|
14
|
+
* unconditionally precisely so a caller's own vertex shader could billboard against it — and
|
|
15
|
+
* it is gone. A world that needs a plume this engine does not ship now needs the engine to
|
|
16
|
+
* ship it.
|
|
17
|
+
*/
|
|
18
|
+
export type PlumeMaterial = 'fire' | 'smoke' | 'arcane';
|
|
19
|
+
/** The two source pairs one material resolves to, one per backend. */
|
|
20
|
+
export interface PlumeShaders {
|
|
21
|
+
readonly label: string;
|
|
22
|
+
readonly vertexSource: string;
|
|
23
|
+
readonly fragmentSource: string;
|
|
24
|
+
readonly vertexWgsl: string;
|
|
25
|
+
readonly fragmentWgsl: string;
|
|
26
|
+
/** What the generator recorded about the fragment stage's uniform block. */
|
|
27
|
+
readonly fragmentBindings: unknown;
|
|
28
|
+
readonly vertexBindings: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** Resolve a material name, or say which names exist. */
|
|
31
|
+
export declare function plumeShaders(material: PlumeMaterial): PlumeShaders;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ARCANE_FRAG } from './shaders/arcane.js';
|
|
2
|
+
import { FIRE_FRAG, PLUME_VERT } from './shaders/fire.js';
|
|
3
|
+
import { SMOKE_FRAG } from './shaders/smoke.js';
|
|
4
|
+
import { ARCANE_FRAG_WGSL, ARCANE_BINDINGS } from './shaders/generated/arcane.wgsl.js';
|
|
5
|
+
import { FIRE_FRAG_WGSL, PLUME_VERT_WGSL, FIRE_BINDINGS } from './shaders/generated/fire.wgsl.js';
|
|
6
|
+
import { SMOKE_FRAG_WGSL, SMOKE_BINDINGS } from './shaders/generated/smoke.wgsl.js';
|
|
7
|
+
/**
|
|
8
|
+
* Every plume this engine ships, with both compilations of each.
|
|
9
|
+
*
|
|
10
|
+
* One table rather than a lookup per backend: a material present in one and absent from the
|
|
11
|
+
* other is precisely the drift the 2026-08-13 rule in `AGENTS.md` exists to prevent, and here
|
|
12
|
+
* it would be a plume that draws on WebGL2 and throws on WebGPU.
|
|
13
|
+
*/
|
|
14
|
+
const MATERIALS = {
|
|
15
|
+
fire: {
|
|
16
|
+
label: 'plume:fire',
|
|
17
|
+
vertexSource: PLUME_VERT,
|
|
18
|
+
fragmentSource: FIRE_FRAG,
|
|
19
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
20
|
+
fragmentWgsl: FIRE_FRAG_WGSL,
|
|
21
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
22
|
+
fragmentBindings: FIRE_BINDINGS.FIRE_FRAG,
|
|
23
|
+
},
|
|
24
|
+
smoke: {
|
|
25
|
+
label: 'plume:smoke',
|
|
26
|
+
vertexSource: PLUME_VERT,
|
|
27
|
+
fragmentSource: SMOKE_FRAG,
|
|
28
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
29
|
+
fragmentWgsl: SMOKE_FRAG_WGSL,
|
|
30
|
+
/* Smoke shares the plume vertex stage; its own file records only the fragment one. */
|
|
31
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
32
|
+
fragmentBindings: SMOKE_BINDINGS.SMOKE_FRAG,
|
|
33
|
+
},
|
|
34
|
+
/*
|
|
35
|
+
* A radial counter-rotating swirl rather than a rising column, so it reads as a spell
|
|
36
|
+
* containing a thing rather than as a fire underneath it.
|
|
37
|
+
*
|
|
38
|
+
* **Added because a consumer already drew with it.** The shader has existed here since
|
|
39
|
+
* before the second backend and a consumer passed it as `ARCANE_FRAG`, which the move to
|
|
40
|
+
* named materials took away with nothing to replace it — the one effect in either consumer
|
|
41
|
+
* that the material table did not already cover. It is the only material that reads
|
|
42
|
+
* `uTint`, and that is why: an aura takes the day's glow colour, so relics shift with the
|
|
43
|
+
* palette exactly as the lamps do.
|
|
44
|
+
*/
|
|
45
|
+
arcane: {
|
|
46
|
+
label: 'plume:arcane',
|
|
47
|
+
vertexSource: PLUME_VERT,
|
|
48
|
+
fragmentSource: ARCANE_FRAG,
|
|
49
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
50
|
+
fragmentWgsl: ARCANE_FRAG_WGSL,
|
|
51
|
+
/* Arcane shares the plume vertex stage; its own file records only the fragment one. */
|
|
52
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
53
|
+
fragmentBindings: ARCANE_BINDINGS.ARCANE_FRAG,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
/** Resolve a material name, or say which names exist. */
|
|
57
|
+
export function plumeShaders(material) {
|
|
58
|
+
const found = MATERIALS[material];
|
|
59
|
+
if (found === undefined) {
|
|
60
|
+
throw new Error(`createPlumes: unknown plume material "${String(material)}". ` +
|
|
61
|
+
`Known materials: ${Object.keys(MATERIALS).join(', ')}.`);
|
|
62
|
+
}
|
|
63
|
+
return found;
|
|
64
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { FrameView } from './frameView.ts';
|
|
2
|
+
import { type PlumeMaterial } from './plumeMaterial.ts';
|
|
3
|
+
import type { Atmosphere } from './atmosphere.ts';
|
|
4
|
+
import type { Vec3 } from '../math/color.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Batched camera-facing quads for volumetric effects — flames, smoke, steam,
|
|
7
|
+
* dust. Game-agnostic: it knows positions, sizes and time, and nothing about
|
|
8
|
+
* what the plume represents.
|
|
9
|
+
*
|
|
10
|
+
* One VAO for the whole batch, four vertices per plume, everything animated on
|
|
11
|
+
* the GPU. The caller supplies the shader pair, so a new effect is a new
|
|
12
|
+
* fragment shader rather than a new renderer.
|
|
13
|
+
*/
|
|
14
|
+
export interface PlumePlacement {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
z: number;
|
|
18
|
+
/** Half-width and full height, metres. */
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
22
|
+
export type PlumeBlend = 'additive' | 'alpha';
|
|
23
|
+
export interface PlumeOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Which plume this is, by name.
|
|
26
|
+
*
|
|
27
|
+
* **This replaced a pair of GLSL source strings on 2026-08-13, and the replacement is a
|
|
28
|
+
* breaking change made on purpose.** A caller-supplied shader is a capability that can only
|
|
29
|
+
* ever exist on WebGL2: WebGPU has no runtime GLSL compiler and this package must not ship
|
|
30
|
+
* one. Naming the material lets each backend resolve what it can compile. See
|
|
31
|
+
* `plumeMaterial.ts` for what was given up.
|
|
32
|
+
*/
|
|
33
|
+
material: PlumeMaterial;
|
|
34
|
+
/** Emissive effects (fire) add light; dense ones (smoke) occlude it. */
|
|
35
|
+
blend: PlumeBlend;
|
|
36
|
+
/**
|
|
37
|
+
* How much the quads swell and shrink over time, 0 for a fixed size. Purely
|
|
38
|
+
* visual — anything gameplay depends on must keep its own fixed volume, or
|
|
39
|
+
* the simulation starts depending on the render clock.
|
|
40
|
+
*/
|
|
41
|
+
sizePulse?: number;
|
|
42
|
+
/**
|
|
43
|
+
* How far this plume leans in a given wind, metres per m/s at its crown.
|
|
44
|
+
* Smoke is carried; a flame is anchored to its fuel and barely bends.
|
|
45
|
+
*/
|
|
46
|
+
windResponse?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Colour handed to the fragment stage as `uTint`, or white when absent.
|
|
49
|
+
*
|
|
50
|
+
* Optional shader contract, the same arrangement `uNoiseOctaves` and
|
|
51
|
+
* `uCameraRight` already use: the uniform is set unconditionally and
|
|
52
|
+
* `uniformLocations` hands back null for a shader that ignores it, so `fire`
|
|
53
|
+
* and `smoke` are untouched by this existing.
|
|
54
|
+
*/
|
|
55
|
+
tint?: Vec3;
|
|
56
|
+
}
|
|
57
|
+
export declare class PlumeRenderer {
|
|
58
|
+
private readonly program;
|
|
59
|
+
private readonly uniforms;
|
|
60
|
+
private readonly vao;
|
|
61
|
+
private readonly buffers;
|
|
62
|
+
private readonly indexCount;
|
|
63
|
+
/**
|
|
64
|
+
* The per-vertex size buffer, kept so a caller can turn individual plumes off.
|
|
65
|
+
*
|
|
66
|
+
* A batch is uploaded once because a fire does not move — but a *fire that is not always
|
|
67
|
+
* burning* does need saying. Oil slicks ignite on a cycle, and before this there was no way
|
|
68
|
+
* to draw one only while it was alight: the launch happened with an empty screen.
|
|
69
|
+
*/
|
|
70
|
+
private readonly sizeBuffer;
|
|
71
|
+
private readonly sizes;
|
|
72
|
+
private readonly baseSizes;
|
|
73
|
+
private readonly blend;
|
|
74
|
+
private readonly sizePulse;
|
|
75
|
+
private readonly windResponse;
|
|
76
|
+
private readonly noiseOctaves;
|
|
77
|
+
private readonly tint;
|
|
78
|
+
constructor(gl: WebGL2RenderingContext, plumes: readonly PlumePlacement[], options: PlumeOptions, noiseOctaves: number);
|
|
79
|
+
/**
|
|
80
|
+
* Scale one plume, 0 to hide it.
|
|
81
|
+
*
|
|
82
|
+
* Writes only that plume's own vertices — every blade of its cross — so turning a slick's
|
|
83
|
+
* fire on costs a handful of floats rather than a re-upload of the batch. The caller owns
|
|
84
|
+
* *when*; the renderer has no idea what a slick is.
|
|
85
|
+
*/
|
|
86
|
+
setScale(gl: WebGL2RenderingContext, index: number, scale: number): void;
|
|
87
|
+
/**
|
|
88
|
+
* Draw the batch. Call after the sky: these blend without writing depth, and
|
|
89
|
+
* the sky at depth 1.0 under LEQUAL would otherwise overwrite anything drawn
|
|
90
|
+
* against open background.
|
|
91
|
+
*/
|
|
92
|
+
draw(gl: WebGL2RenderingContext, camera: FrameView, timeSeconds: number, atmosphere: Atmosphere, underwaterEnabled: boolean, atmosphereCameraY: number, clipPlane: Float32Array | null, windX?: number, windZ?: number, originX?: number, originY?: number, originZ?: number): void;
|
|
93
|
+
dispose(gl: WebGL2RenderingContext): void;
|
|
94
|
+
/** Uploads one attribute and returns its buffer, for the rare one a caller can change. */
|
|
95
|
+
private attach;
|
|
96
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { PLUME_VERTS } from './plumeGeometry.js';
|
|
2
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
3
|
+
import { bindAtmosphere } from './atmosphere.js';
|
|
4
|
+
import { plumeShaders } from './plumeMaterial.js';
|
|
5
|
+
import { buildPlumeGeometry } from './plumeGeometry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Blades in each plume's cross, and the vertices that costs.
|
|
8
|
+
*
|
|
9
|
+
* **Two, crossed at 90°, instead of one card turned to face the viewer.** A single
|
|
10
|
+
* billboard has no three-dimensional structure to see: orbiting a fire showed the
|
|
11
|
+
* identical silhouette from every angle, because every card shared one camera-derived
|
|
12
|
+
* axis and the whole plume swivelled as a sheet. Reported twice: the fire did not read
|
|
13
|
+
* as three-dimensional, it read as something that moved with the camera — and after a
|
|
14
|
+
* first attempt that only *leaned* edge-on cards toward the viewer, it still did,
|
|
15
|
+
* correctly, because leaning still rotates whichever cards are edge-on, so the ensemble
|
|
16
|
+
* still tracks the viewer.
|
|
17
|
+
*
|
|
18
|
+
* A cross cannot track anything: both blades are fixed in world space, so turning
|
|
19
|
+
* around a fire genuinely brings one broadside as the other goes edge-on, which is
|
|
20
|
+
* the parallax a volume has. It also removes the reason billboarding existed — a
|
|
21
|
+
* blade going edge-on no longer vanishes, because its partner is square-on at that
|
|
22
|
+
* exact moment.
|
|
23
|
+
*
|
|
24
|
+
* Two rather than three because the plumes blend additively and are drawn in
|
|
25
|
+
* quantity: the third blade costs 50% more geometry for a difference the eye does not
|
|
26
|
+
* separate at the sizes these are drawn.
|
|
27
|
+
*/
|
|
28
|
+
const BLADES = 2;
|
|
29
|
+
/* The shared count, so both backends step a plume's vertices the same way. */
|
|
30
|
+
const VERTS_PER_PLUME = PLUME_VERTS;
|
|
31
|
+
const CORNERS = [
|
|
32
|
+
[-1, -1],
|
|
33
|
+
[1, -1],
|
|
34
|
+
[1, 1],
|
|
35
|
+
[-1, 1],
|
|
36
|
+
];
|
|
37
|
+
export class PlumeRenderer {
|
|
38
|
+
program;
|
|
39
|
+
uniforms;
|
|
40
|
+
vao;
|
|
41
|
+
buffers = [];
|
|
42
|
+
indexCount;
|
|
43
|
+
/**
|
|
44
|
+
* The per-vertex size buffer, kept so a caller can turn individual plumes off.
|
|
45
|
+
*
|
|
46
|
+
* A batch is uploaded once because a fire does not move — but a *fire that is not always
|
|
47
|
+
* burning* does need saying. Oil slicks ignite on a cycle, and before this there was no way
|
|
48
|
+
* to draw one only while it was alight: the launch happened with an empty screen.
|
|
49
|
+
*/
|
|
50
|
+
sizeBuffer;
|
|
51
|
+
sizes;
|
|
52
|
+
baseSizes;
|
|
53
|
+
blend;
|
|
54
|
+
sizePulse;
|
|
55
|
+
windResponse;
|
|
56
|
+
noiseOctaves;
|
|
57
|
+
tint;
|
|
58
|
+
constructor(gl, plumes, options, noiseOctaves) {
|
|
59
|
+
const shaders = plumeShaders(options.material);
|
|
60
|
+
this.program = compileProgram(gl, shaders.vertexSource, shaders.fragmentSource, shaders.label);
|
|
61
|
+
this.uniforms = uniformLocations(gl, this.program, 'plumeRenderer');
|
|
62
|
+
this.blend = options.blend;
|
|
63
|
+
this.sizePulse = options.sizePulse ?? 0;
|
|
64
|
+
this.windResponse = options.windResponse ?? 0;
|
|
65
|
+
this.noiseOctaves = noiseOctaves;
|
|
66
|
+
this.tint = options.tint ?? [1, 1, 1];
|
|
67
|
+
/* Built in `plumeGeometry.ts`, so both backends lay out the same crossed quads. */
|
|
68
|
+
const { centers, corners, sizes, seeds, blades, indices } = buildPlumeGeometry(plumes);
|
|
69
|
+
this.indexCount = indices.length;
|
|
70
|
+
const vao = gl.createVertexArray();
|
|
71
|
+
if (vao === null)
|
|
72
|
+
throw new Error(`${shaders.label}: createVertexArray failed`);
|
|
73
|
+
this.vao = vao;
|
|
74
|
+
gl.bindVertexArray(vao);
|
|
75
|
+
this.attach(gl, 0, centers, 3, shaders.label);
|
|
76
|
+
this.attach(gl, 1, corners, 2, shaders.label);
|
|
77
|
+
this.sizeBuffer = this.attach(gl, 2, sizes, 2, shaders.label);
|
|
78
|
+
this.attach(gl, 3, seeds, 1, shaders.label);
|
|
79
|
+
this.attach(gl, 4, blades, 1, shaders.label);
|
|
80
|
+
this.sizes = sizes;
|
|
81
|
+
// The authored sizes, so a hidden plume can be restored to exactly what it was.
|
|
82
|
+
this.baseSizes = new Float32Array(plumes.length * 2);
|
|
83
|
+
for (let f = 0; f < plumes.length; f++) {
|
|
84
|
+
const plume = plumes[f];
|
|
85
|
+
if (plume === undefined)
|
|
86
|
+
continue;
|
|
87
|
+
this.baseSizes[f * 2] = plume.width;
|
|
88
|
+
this.baseSizes[f * 2 + 1] = plume.height;
|
|
89
|
+
}
|
|
90
|
+
const indexBuffer = gl.createBuffer();
|
|
91
|
+
if (indexBuffer === null)
|
|
92
|
+
throw new Error(`${shaders.label}: createBuffer failed`);
|
|
93
|
+
this.buffers.push(indexBuffer);
|
|
94
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
95
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
96
|
+
gl.bindVertexArray(null);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Scale one plume, 0 to hide it.
|
|
100
|
+
*
|
|
101
|
+
* Writes only that plume's own vertices — every blade of its cross — so turning a slick's
|
|
102
|
+
* fire on costs a handful of floats rather than a re-upload of the batch. The caller owns
|
|
103
|
+
* *when*; the renderer has no idea what a slick is.
|
|
104
|
+
*/
|
|
105
|
+
setScale(gl, index, scale) {
|
|
106
|
+
const span = VERTS_PER_PLUME * 2;
|
|
107
|
+
const base = index * span;
|
|
108
|
+
if (base < 0 || base + span > this.sizes.length)
|
|
109
|
+
return;
|
|
110
|
+
const width = this.baseSizes[index * 2] ?? 0;
|
|
111
|
+
const height = this.baseSizes[index * 2 + 1] ?? 0;
|
|
112
|
+
for (let c = 0; c < VERTS_PER_PLUME; c++) {
|
|
113
|
+
this.sizes[base + c * 2] = width * scale;
|
|
114
|
+
this.sizes[base + c * 2 + 1] = height * scale;
|
|
115
|
+
}
|
|
116
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);
|
|
117
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, base * 4, this.sizes.subarray(base, base + span));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Draw the batch. Call after the sky: these blend without writing depth, and
|
|
121
|
+
* the sky at depth 1.0 under LEQUAL would otherwise overwrite anything drawn
|
|
122
|
+
* against open background.
|
|
123
|
+
*/
|
|
124
|
+
draw(gl, camera, timeSeconds, atmosphere, underwaterEnabled, atmosphereCameraY, clipPlane, windX = 0, windZ = 0, originX = 0, originY = 0, originZ = 0) {
|
|
125
|
+
if (this.indexCount === 0)
|
|
126
|
+
return;
|
|
127
|
+
const u = this.uniforms;
|
|
128
|
+
gl.useProgram(this.program);
|
|
129
|
+
gl.uniform2f(u['uWind'] ?? null, windX, windZ);
|
|
130
|
+
gl.uniform3f(u['uOrigin'] ?? null, originX, originY, originZ);
|
|
131
|
+
gl.uniform1f(u['uWindResponse'] ?? null, this.windResponse);
|
|
132
|
+
gl.uniformMatrix4fv(u['uViewProj'] ?? null, false, camera.viewProjection);
|
|
133
|
+
const v = camera.view;
|
|
134
|
+
/*
|
|
135
|
+
* The camera's own basis, for shader pairs that billboard. The plume shaders
|
|
136
|
+
* shipped here no longer do — they draw world-fixed crosses, because anything
|
|
137
|
+
* that rotates with the camera reads as flat (see `BLADES`) — but the uniform is
|
|
138
|
+
* part of the generic contract a caller may supply its own vertex shader against,
|
|
139
|
+
* and `uniformLocations` hands back null for a shader that ignores it.
|
|
140
|
+
*/
|
|
141
|
+
gl.uniform3f(u['uCameraRight'] ?? null, v[0] ?? 1, v[4] ?? 0, v[8] ?? 0);
|
|
142
|
+
gl.uniform3f(u['uCameraUp'] ?? null, v[1] ?? 0, v[5] ?? 1, v[9] ?? 0);
|
|
143
|
+
gl.uniform3fv(u['uCameraPos'] ?? null, camera.position);
|
|
144
|
+
gl.uniform1f(u['uTime'] ?? null, timeSeconds);
|
|
145
|
+
gl.uniform1f(u['uSizePulse'] ?? null, this.sizePulse);
|
|
146
|
+
// Optional shader contract: generic plume shaders may ignore these uniforms.
|
|
147
|
+
gl.uniform1i(u['uNoiseOctaves'] ?? null, this.noiseOctaves);
|
|
148
|
+
gl.uniform3f(u['uTint'] ?? null, this.tint[0], this.tint[1], this.tint[2]);
|
|
149
|
+
gl.uniform1i(u['uClipEnabled'] ?? null, clipPlane === null ? 0 : 1);
|
|
150
|
+
if (clipPlane !== null)
|
|
151
|
+
gl.uniform4fv(u['uClipPlane'] ?? null, clipPlane);
|
|
152
|
+
bindAtmosphere(gl, u, atmosphere, atmosphereCameraY, underwaterEnabled);
|
|
153
|
+
gl.enable(gl.BLEND);
|
|
154
|
+
if (this.blend === 'additive')
|
|
155
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
|
|
156
|
+
else
|
|
157
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
158
|
+
gl.depthMask(false);
|
|
159
|
+
gl.disable(gl.CULL_FACE);
|
|
160
|
+
gl.bindVertexArray(this.vao);
|
|
161
|
+
gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);
|
|
162
|
+
gl.bindVertexArray(null);
|
|
163
|
+
gl.enable(gl.CULL_FACE);
|
|
164
|
+
gl.depthMask(true);
|
|
165
|
+
gl.disable(gl.BLEND);
|
|
166
|
+
}
|
|
167
|
+
dispose(gl) {
|
|
168
|
+
for (const buffer of this.buffers)
|
|
169
|
+
gl.deleteBuffer(buffer);
|
|
170
|
+
gl.deleteVertexArray(this.vao);
|
|
171
|
+
gl.deleteProgram(this.program);
|
|
172
|
+
}
|
|
173
|
+
/** Uploads one attribute and returns its buffer, for the rare one a caller can change. */
|
|
174
|
+
attach(gl, location, data, size, label) {
|
|
175
|
+
const buffer = gl.createBuffer();
|
|
176
|
+
if (buffer === null)
|
|
177
|
+
throw new Error(`${label}: createBuffer failed`);
|
|
178
|
+
this.buffers.push(buffer);
|
|
179
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
180
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
|
|
181
|
+
gl.enableVertexAttribArray(location);
|
|
182
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
183
|
+
return buffer;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/** Allocation-free selection and packing of point lights for a fixed shader budget. */
|
|
2
|
+
export declare const DEFAULT_POINT_LIGHT_VIEW_RANGE = 180;
|
|
3
|
+
export interface PointLightSource {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
z: number;
|
|
7
|
+
r: number;
|
|
8
|
+
g: number;
|
|
9
|
+
b: number;
|
|
10
|
+
/** Distance in metres at which illumination falls to zero. */
|
|
11
|
+
radius: number;
|
|
12
|
+
/** Colour modulation amplitude; zero keeps a steady source. */
|
|
13
|
+
flicker: number;
|
|
14
|
+
/** Shadow cubemap near plane in metres. */
|
|
15
|
+
shadowNear: number;
|
|
16
|
+
/** Physical emitter radius in metres, used to derive penumbra width. */
|
|
17
|
+
sourceRadius: number;
|
|
18
|
+
/**
|
|
19
|
+
* Where a spot points, as a world-space direction. Absent makes this a point light.
|
|
20
|
+
*
|
|
21
|
+
* Normalised here rather than trusted, because an un-normalised direction scales the cosine the
|
|
22
|
+
* cone is compared against and shows as a cone of the wrong width — which reads as the angle
|
|
23
|
+
* having been set wrong rather than as the vector.
|
|
24
|
+
*/
|
|
25
|
+
dirX?: number;
|
|
26
|
+
dirY?: number;
|
|
27
|
+
dirZ?: number;
|
|
28
|
+
/**
|
|
29
|
+
* The cone's inner and outer half-angles in degrees. Full brightness inside the inner, nothing
|
|
30
|
+
* outside the outer, a smooth edge between.
|
|
31
|
+
*
|
|
32
|
+
* **A narrow cone is not free**, and the cost is the shadow rather than the shading. A spot's
|
|
33
|
+
* shadow takes a layer of the same octahedral array a point light's does, and that layer covers
|
|
34
|
+
* the whole sphere — so a 45 degree cone uses about 15% of it, roughly 0.38 of the linear
|
|
35
|
+
* resolution, and a 10 degree cone about 0.13. Comfortable for a lamp; visibly coarse for a
|
|
36
|
+
* stage spotlight, which is the measurement that would justify giving spots a perspective map.
|
|
37
|
+
*/
|
|
38
|
+
coneInnerDeg?: number;
|
|
39
|
+
coneOuterDeg?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Which photometric profile shapes this light, as a row of the atlas `setIesProfiles` uploaded.
|
|
42
|
+
*
|
|
43
|
+
* **Applies to a point light as well as a spot.** A bare bulb has a measured distribution too,
|
|
44
|
+
* and a fixture's own profile is usually a better description of it than any cone. Absent, or
|
|
45
|
+
* negative, is a light with no profile.
|
|
46
|
+
*/
|
|
47
|
+
iesProfile?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Whether this light is worth a shadow cubemap. Defaults to true.
|
|
50
|
+
*
|
|
51
|
+
* A light whose `radius` is animated invalidates its own map every frame —
|
|
52
|
+
* `matchesSource` compares the range, because the range *is* the cube's far plane —
|
|
53
|
+
* so it is perpetually stale and takes bake budget forever. With a fixed budget of a
|
|
54
|
+
* couple of faces a frame, a handful of those starve every real lamp in the world,
|
|
55
|
+
* and only the one nearest light ever finishes a bake.
|
|
56
|
+
*
|
|
57
|
+
* That is not hypothetical: pulsing floor markers animate a squared fade into
|
|
58
|
+
* `radius` every frame, and a courtyard full of them left exactly one lamp casting.
|
|
59
|
+
* They are floor lighting 35 cm off the deck and were never meant to cast at all.
|
|
60
|
+
*/
|
|
61
|
+
castsShadow?: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface PointLightBuffer {
|
|
64
|
+
readonly positions: Float32Array;
|
|
65
|
+
readonly colors: Float32Array;
|
|
66
|
+
readonly radii: Float32Array;
|
|
67
|
+
/**
|
|
68
|
+
* Each selected light's emitter radius, in metres, packed beside its falloff radius.
|
|
69
|
+
*
|
|
70
|
+
* **A light has a size, and a highlight has to know it.** The shading treated every source as
|
|
71
|
+
* a mathematical point, so its reflection in a polished surface was a point too: smaller than
|
|
72
|
+
* a fragment, landing in some pixels and not their neighbours. That is the bright speckle a
|
|
73
|
+
* dark glossy model shows under a close lamp, and it cannot be filtered away afterwards
|
|
74
|
+
* because the information was never sampled. A real emitter subtends an angle, and a headlight
|
|
75
|
+
* a few centimetres from a wing subtends a very large one.
|
|
76
|
+
*
|
|
77
|
+
* `sourceRadius` already said this and only the shadow pass was listening, which is why the
|
|
78
|
+
* penumbra was right and the highlight was not.
|
|
79
|
+
*/
|
|
80
|
+
readonly sourceRadii: Float32Array;
|
|
81
|
+
/**
|
|
82
|
+
* How many sources were offered this frame, against the `count` that won a slot.
|
|
83
|
+
*
|
|
84
|
+
* **Reported from outside, and it turned an afternoon into a glance.** A scene was submitting
|
|
85
|
+
* 63 lights against a budget of 10, so the whole budget went to static scenery between 7 and
|
|
86
|
+
* 23 metres away and the rig that answered the music never got a slot. Nothing flickered and
|
|
87
|
+
* nothing warned, because the selection did exactly what it documents; the symptom reported by
|
|
88
|
+
* a person was "the lights are poor", which leads nobody to a light budget. The count had to be
|
|
89
|
+
* recovered by walking the array in a console.
|
|
90
|
+
*
|
|
91
|
+
* Reading it costs nothing and it is the only figure that makes the ratio visible: 63 offered
|
|
92
|
+
* and 10 bound is a scene to prune, 12 offered and 10 bound is a scene that is fine.
|
|
93
|
+
*/
|
|
94
|
+
considered: number;
|
|
95
|
+
count: number;
|
|
96
|
+
readonly sourceIndex: Int32Array;
|
|
97
|
+
/**
|
|
98
|
+
* How present each chosen light is, 0 to 1, against the two boundaries it can be
|
|
99
|
+
* crossing: the edge of view range, and the budget cut it shares with the nearest
|
|
100
|
+
* light that missed the set.
|
|
101
|
+
*
|
|
102
|
+
* Deliberately not folded into `colors`. Most of the shading is a colour multiply
|
|
103
|
+
* and would not care, but the emissive term is not — a lit inlay is dimmed by
|
|
104
|
+
* *whichever* lamp shadows it hardest, regardless of that lamp's colour, so a light
|
|
105
|
+
* arriving at zero brightness would still switch a shadow onto the start line. The
|
|
106
|
+
* weight has to reach the shader as itself.
|
|
107
|
+
*/
|
|
108
|
+
readonly weights: Float32Array;
|
|
109
|
+
/**
|
|
110
|
+
* Three per slot: where a spot points, normalised. Zeroes for a point light.
|
|
111
|
+
*
|
|
112
|
+
* Filled for every slot rather than only for spots, because a slot keeps whatever the last light
|
|
113
|
+
* to hold it wrote — and a stale direction on a light that is now a point is a cone pointing
|
|
114
|
+
* somewhere it was never aimed.
|
|
115
|
+
*/
|
|
116
|
+
readonly directions: Float32Array;
|
|
117
|
+
/** Two per slot: the cosine of the inner cone angle, then of the outer. */
|
|
118
|
+
readonly coneCos: Float32Array;
|
|
119
|
+
/** One per slot: a row of the photometric atlas, or −1 for a light with no profile. */
|
|
120
|
+
readonly iesProfiles: Float32Array;
|
|
121
|
+
/** Internal insertion-sort storage; exposed only to keep one flat object. */
|
|
122
|
+
readonly scratchDistance: Float32Array;
|
|
123
|
+
/**
|
|
124
|
+
* The nearest `POINT_SHADOW_POOL` lights, nearest first — a superset of the shaded
|
|
125
|
+
* ones, and the reason a light no longer pops when it enters the sampled set.
|
|
126
|
+
*
|
|
127
|
+
* Before the shadow pool every light owned a permanent cubemap, so being chosen for
|
|
128
|
+
* shading meant the shadow was already correct. Borrowed maps broke that: joining
|
|
129
|
+
* the set meant evicting somebody and baking six faces at two a frame. The pool has
|
|
130
|
+
* always had four slots more than the shader can bind; these are the lights they are
|
|
131
|
+
* for, kept baked *before* they are wanted.
|
|
132
|
+
*/
|
|
133
|
+
readonly shadowIndex: Int32Array;
|
|
134
|
+
shadowCount: number;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A buffer for the selection to fill, sized to what the caller can actually bind.
|
|
138
|
+
*
|
|
139
|
+
* **`capacity` exists because clustered lighting can carry far more than the shader's uniform
|
|
140
|
+
* arrays.** The froxel table takes up to `MAX_CLUSTERED_LIGHTS`, and this helper used to hand it
|
|
141
|
+
* sixteen whatever a world offered — so the capability was real and unreachable through the one
|
|
142
|
+
* path every consumer uses. A consumer with `RenderQuality.clusteredLights` on asks for a wider
|
|
143
|
+
* buffer; everything else takes the default and is unchanged.
|
|
144
|
+
*
|
|
145
|
+
* **`scratchDistance` grows with it**, and that is not incidental: the shaded list is kept sorted
|
|
146
|
+
* in it, so a buffer wider than the array holding its distances writes past the end. It was sized
|
|
147
|
+
* from `POINT_SHADOW_POOL` because the pool happened to be the larger of the two.
|
|
148
|
+
*/
|
|
149
|
+
export declare function createPointLightBuffer(capacity?: number): PointLightBuffer;
|
|
150
|
+
/**
|
|
151
|
+
* Select nearest lights whose influence may still be visible and pack them in
|
|
152
|
+
* shader order. The caller owns `out`; no sort arrays or temporary objects are
|
|
153
|
+
* created in this per-frame path.
|
|
154
|
+
*
|
|
155
|
+
* **Two points, because the two lists answer two questions.** `x, y, z` is where the frame is
|
|
156
|
+
* being *shaded* from — the camera — and it orders and culls the shaded list. `castX, castY,
|
|
157
|
+
* castZ` is where whatever might *cast* is standing, and it orders and culls the shadow pool.
|
|
158
|
+
* `AGENTS.md` had already decided which point the pool belongs to: *"a character's shadow only
|
|
159
|
+
* has to exist near the light they are standing at"* — they, not the viewer.
|
|
160
|
+
*
|
|
161
|
+
* They were one argument until 2026-08-25, and a third-person camera is exactly where that
|
|
162
|
+
* hurts: it sits behind its subject, so a fire the subject is standing next to got **no map at
|
|
163
|
+
* all** whenever the camera was further from it than the fire's radius. The scene stayed
|
|
164
|
+
* perfectly lit, which is why nobody could tell it from a bake that never ran.
|
|
165
|
+
*
|
|
166
|
+
* What it gives up: three more numbers on an already-long parameter list, spelled as numbers
|
|
167
|
+
* rather than a vector to match the point above it. What would make it wrong: a consumer with
|
|
168
|
+
* several casters far apart, which one point cannot describe — the pool would then want a set of
|
|
169
|
+
* reference points and a rank over the nearest of them, which is a bigger change than this one
|
|
170
|
+
* and is not what any consumer here has.
|
|
171
|
+
*
|
|
172
|
+
* The default is the shading point, so an existing caller selects bit-identically: `castX = x`
|
|
173
|
+
* makes the distance the *same arithmetic on the same operands*, not merely a close number.
|
|
174
|
+
*/
|
|
175
|
+
export declare function selectPointLights(sources: readonly PointLightSource[], x: number, y: number, z: number, out: PointLightBuffer, timeSeconds?: number, viewRange?: number, castX?: number, castY?: number, castZ?: number): void;
|