@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,87 @@
|
|
|
1
|
+
import type { Camera } from './camera.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What a planar reflection *is*, before any of it touches a device.
|
|
5
|
+
*
|
|
6
|
+
* Three decisions, none of which is a binding: where the mirrored camera stands, which half of
|
|
7
|
+
* the world it may draw, and how large the target may be. A second copy of any of them is a
|
|
8
|
+
* mirror that disagrees with itself — a reflection shot from a slightly different place, or one
|
|
9
|
+
* that leaks the near bank of a pool into the water in front of it — and every one of those
|
|
10
|
+
* reads as a shading problem rather than as a camera one. That is the 2026-08-13 rule in
|
|
11
|
+
* `AGENTS.md`, applied to the pass with the most arithmetic in it.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Keeps fragments crossing the resting plane from opening a hairline seam.
|
|
16
|
+
*
|
|
17
|
+
* The clip is a plane test on a *displaced* surface, so geometry that touches the waterline
|
|
18
|
+
* lands on both sides of it by a fraction of a millimetre depending on the wave. Three
|
|
19
|
+
* centimetres of tolerance keeps the shoreline welded; more than that starts showing the
|
|
20
|
+
* underside of things standing in the water.
|
|
21
|
+
*/
|
|
22
|
+
const CLIP_TOLERANCE = 0.03;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Stand the camera on the other side of the plane, looking back.
|
|
26
|
+
*
|
|
27
|
+
* A mirror across a horizontal plane negates height about it and negates pitch, and leaves yaw
|
|
28
|
+
* and the lens alone. **The aspect is the target's rather than the canvas's**: a reflection is
|
|
29
|
+
* rendered at a scale, and projecting it at the canvas's aspect stretches the mirror against
|
|
30
|
+
* the surface it is sampled onto.
|
|
31
|
+
*/
|
|
32
|
+
export function mirrorCamera(source: Camera, planeY: number, aspect: number, out: Camera): void {
|
|
33
|
+
out.position[0] = source.position[0] ?? 0;
|
|
34
|
+
out.position[1] = planeY * 2 - (source.position[1] ?? 0);
|
|
35
|
+
out.position[2] = source.position[2] ?? 0;
|
|
36
|
+
out.yaw = source.yaw;
|
|
37
|
+
out.pitch = -source.pitch;
|
|
38
|
+
out.fovYDeg = source.fovYDeg;
|
|
39
|
+
out.near = source.near;
|
|
40
|
+
out.far = source.far;
|
|
41
|
+
out.updateMatrices(aspect);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The half-space the mirrored pass may draw, as `dot(vec4(worldPos, 1), plane) >= 0`.
|
|
46
|
+
*
|
|
47
|
+
* **A mirror reflects the scene on the viewer's side of the plane**, so which side that is
|
|
48
|
+
* follows the camera: above water it keeps y ≥ plane, below it keeps y ≤ plane. Deciding it
|
|
49
|
+
* from a constant instead is a reflection that inverts the moment a swimmer's head goes under.
|
|
50
|
+
*/
|
|
51
|
+
export function reflectionClipPlane(sourceY: number, planeY: number, out: Float32Array): void {
|
|
52
|
+
const side = sourceY >= planeY ? 1 : -1;
|
|
53
|
+
out[0] = 0;
|
|
54
|
+
out[1] = side;
|
|
55
|
+
out[2] = 0;
|
|
56
|
+
out[3] = -side * planeY + CLIP_TOLERANCE;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** How large a reflection target may be, given the drawing buffer and the device's ceiling. */
|
|
60
|
+
export interface ReflectionSize {
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Size the target, clamped by **one shared factor** rather than per axis.
|
|
67
|
+
*
|
|
68
|
+
* Clamping each axis independently squashes the reflection on a drawing buffer wider than the
|
|
69
|
+
* GPU's texture limit, because the mirror is then rendered at one aspect and sampled at
|
|
70
|
+
* another. Scaling both by the tighter of the two ratios keeps it square and merely smaller.
|
|
71
|
+
*/
|
|
72
|
+
export function reflectionTargetSize(
|
|
73
|
+
canvasWidth: number,
|
|
74
|
+
canvasHeight: number,
|
|
75
|
+
scale: number,
|
|
76
|
+
maxTextureSize: number,
|
|
77
|
+
out: ReflectionSize,
|
|
78
|
+
): ReflectionSize {
|
|
79
|
+
const targetScale = Math.min(
|
|
80
|
+
scale,
|
|
81
|
+
maxTextureSize / Math.max(canvasWidth, 1),
|
|
82
|
+
maxTextureSize / Math.max(canvasHeight, 1),
|
|
83
|
+
);
|
|
84
|
+
out.width = Math.max(Math.round(canvasWidth * targetScale), 1);
|
|
85
|
+
out.height = Math.max(Math.round(canvasHeight * targetScale), 1);
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { PlumePlacement } from './plumeRenderer.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The crossed quads a plume batch is drawn from, built once for both backends.
|
|
5
|
+
*
|
|
6
|
+
* **Two blades rather than a billboard, and two rather than three.** A single card turned to
|
|
7
|
+
* face the viewer has no three-dimensional structure to see — orbiting a fire showed the same
|
|
8
|
+
* silhouette from every angle — while a fixed cross has the parallax a volume has and never
|
|
9
|
+
* goes edge-on, because its partner is square-on at that exact moment. The third blade costs
|
|
10
|
+
* 50% more geometry for a difference the eye does not separate at these sizes.
|
|
11
|
+
*
|
|
12
|
+
* Here rather than in `plumeRenderer.ts` because a second copy of a mesh generator is a plume
|
|
13
|
+
* whose triangles differ per backend, which is the 2026-08-13 rule in `AGENTS.md`.
|
|
14
|
+
*/
|
|
15
|
+
export const PLUME_BLADES = 2;
|
|
16
|
+
export const PLUME_VERTS = PLUME_BLADES * 4;
|
|
17
|
+
|
|
18
|
+
/** Corners of one blade, as a quad. */
|
|
19
|
+
const CORNERS = [
|
|
20
|
+
[-1, -1],
|
|
21
|
+
[1, -1],
|
|
22
|
+
[1, 1],
|
|
23
|
+
[-1, 1],
|
|
24
|
+
] as const;
|
|
25
|
+
|
|
26
|
+
/** The five attribute streams and the index list. */
|
|
27
|
+
export interface PlumeGeometryData {
|
|
28
|
+
readonly centers: Float32Array;
|
|
29
|
+
readonly corners: Float32Array;
|
|
30
|
+
readonly sizes: Float32Array;
|
|
31
|
+
readonly seeds: Float32Array;
|
|
32
|
+
readonly blades: Float32Array;
|
|
33
|
+
readonly indices: Uint32Array;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function buildPlumeGeometry(plumes: readonly PlumePlacement[]): PlumeGeometryData {
|
|
37
|
+
const count = plumes.length;
|
|
38
|
+
const centers = new Float32Array(count * PLUME_VERTS * 3);
|
|
39
|
+
const corners = new Float32Array(count * PLUME_VERTS * 2);
|
|
40
|
+
const sizes = new Float32Array(count * PLUME_VERTS * 2);
|
|
41
|
+
const seeds = new Float32Array(count * PLUME_VERTS);
|
|
42
|
+
const blades = new Float32Array(count * PLUME_VERTS);
|
|
43
|
+
const indices = new Uint32Array(count * 6 * PLUME_BLADES);
|
|
44
|
+
|
|
45
|
+
for (let f = 0; f < count; f++) {
|
|
46
|
+
const plume = plumes[f];
|
|
47
|
+
if (plume === undefined) continue;
|
|
48
|
+
for (let b = 0; b < PLUME_BLADES; b++) {
|
|
49
|
+
for (let c = 0; c < 4; c++) {
|
|
50
|
+
const v = f * PLUME_VERTS + b * 4 + c;
|
|
51
|
+
const corner = CORNERS[c] ?? [0, 0];
|
|
52
|
+
centers[v * 3] = plume.x;
|
|
53
|
+
centers[v * 3 + 1] = plume.y;
|
|
54
|
+
centers[v * 3 + 2] = plume.z;
|
|
55
|
+
corners[v * 2] = corner[0];
|
|
56
|
+
corners[v * 2 + 1] = corner[1];
|
|
57
|
+
sizes[v * 2] = plume.width;
|
|
58
|
+
sizes[v * 2 + 1] = plume.height;
|
|
59
|
+
// Golden-ratio phase offset: neighbours never animate in step.
|
|
60
|
+
seeds[v] = f * 0.618;
|
|
61
|
+
// Which blade of the cross this vertex belongs to.
|
|
62
|
+
blades[v] = b;
|
|
63
|
+
}
|
|
64
|
+
const base = f * PLUME_VERTS + b * 4;
|
|
65
|
+
const i = (f * PLUME_BLADES + b) * 6;
|
|
66
|
+
indices[i] = base;
|
|
67
|
+
indices[i + 1] = base + 1;
|
|
68
|
+
indices[i + 2] = base + 2;
|
|
69
|
+
indices[i + 3] = base;
|
|
70
|
+
indices[i + 4] = base + 2;
|
|
71
|
+
indices[i + 5] = base + 3;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { centers, corners, sizes, seeds, blades, indices };
|
|
75
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { ARCANE_FRAG } from './shaders/arcane.ts';
|
|
2
|
+
import { FIRE_FRAG, PLUME_VERT } from './shaders/fire.ts';
|
|
3
|
+
import { SMOKE_FRAG } from './shaders/smoke.ts';
|
|
4
|
+
import { ARCANE_FRAG_WGSL, ARCANE_BINDINGS } from './shaders/generated/arcane.wgsl.ts';
|
|
5
|
+
import { FIRE_FRAG_WGSL, PLUME_VERT_WGSL, FIRE_BINDINGS } from './shaders/generated/fire.wgsl.ts';
|
|
6
|
+
import { SMOKE_FRAG_WGSL, SMOKE_BINDINGS } from './shaders/generated/smoke.wgsl.ts';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Which plume material a caller wants, by name rather than by source.
|
|
10
|
+
*
|
|
11
|
+
* **`PlumeOptions` used to take GLSL strings, and that could not cross to a second backend.**
|
|
12
|
+
* WebGPU has no runtime GLSL compiler and this package must never ship one — the toolchain is
|
|
13
|
+
* dev-only, for the licensing and size reasons the WGSL toolchain design
|
|
14
|
+
* records — so a caller-supplied `vertexSource` was a capability that existed on exactly one
|
|
15
|
+
* backend and could never exist on the other.
|
|
16
|
+
*
|
|
17
|
+
* Naming the material instead makes it universal by construction: each backend resolves the
|
|
18
|
+
* name to the shader it can actually compile, and neither can be handed something it cannot
|
|
19
|
+
* use. **The cost is real and was accepted deliberately**: a caller can no longer supply its
|
|
20
|
+
* own plume shader at all. That capability was documented — `uCameraRight` is set
|
|
21
|
+
* unconditionally precisely so a caller's own vertex shader could billboard against it — and
|
|
22
|
+
* it is gone. A world that needs a plume this engine does not ship now needs the engine to
|
|
23
|
+
* ship it.
|
|
24
|
+
*/
|
|
25
|
+
export type PlumeMaterial = 'fire' | 'smoke' | 'arcane';
|
|
26
|
+
|
|
27
|
+
/** The two source pairs one material resolves to, one per backend. */
|
|
28
|
+
export interface PlumeShaders {
|
|
29
|
+
readonly label: string;
|
|
30
|
+
readonly vertexSource: string;
|
|
31
|
+
readonly fragmentSource: string;
|
|
32
|
+
readonly vertexWgsl: string;
|
|
33
|
+
readonly fragmentWgsl: string;
|
|
34
|
+
/** What the generator recorded about the fragment stage's uniform block. */
|
|
35
|
+
readonly fragmentBindings: unknown;
|
|
36
|
+
readonly vertexBindings: unknown;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Every plume this engine ships, with both compilations of each.
|
|
41
|
+
*
|
|
42
|
+
* One table rather than a lookup per backend: a material present in one and absent from the
|
|
43
|
+
* other is precisely the drift the 2026-08-13 rule in `AGENTS.md` exists to prevent, and here
|
|
44
|
+
* it would be a plume that draws on WebGL2 and throws on WebGPU.
|
|
45
|
+
*/
|
|
46
|
+
const MATERIALS: Readonly<Record<PlumeMaterial, PlumeShaders>> = {
|
|
47
|
+
fire: {
|
|
48
|
+
label: 'plume:fire',
|
|
49
|
+
vertexSource: PLUME_VERT,
|
|
50
|
+
fragmentSource: FIRE_FRAG,
|
|
51
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
52
|
+
fragmentWgsl: FIRE_FRAG_WGSL,
|
|
53
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
54
|
+
fragmentBindings: FIRE_BINDINGS.FIRE_FRAG,
|
|
55
|
+
},
|
|
56
|
+
smoke: {
|
|
57
|
+
label: 'plume:smoke',
|
|
58
|
+
vertexSource: PLUME_VERT,
|
|
59
|
+
fragmentSource: SMOKE_FRAG,
|
|
60
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
61
|
+
fragmentWgsl: SMOKE_FRAG_WGSL,
|
|
62
|
+
/* Smoke shares the plume vertex stage; its own file records only the fragment one. */
|
|
63
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
64
|
+
fragmentBindings: SMOKE_BINDINGS.SMOKE_FRAG,
|
|
65
|
+
},
|
|
66
|
+
/*
|
|
67
|
+
* A radial counter-rotating swirl rather than a rising column, so it reads as a spell
|
|
68
|
+
* containing a thing rather than as a fire underneath it.
|
|
69
|
+
*
|
|
70
|
+
* **Added because a consumer already drew with it.** The shader has existed here since
|
|
71
|
+
* before the second backend and a consumer passed it as `ARCANE_FRAG`, which the move to
|
|
72
|
+
* named materials took away with nothing to replace it — the one effect in either consumer
|
|
73
|
+
* that the material table did not already cover. It is the only material that reads
|
|
74
|
+
* `uTint`, and that is why: an aura takes the day's glow colour, so relics shift with the
|
|
75
|
+
* palette exactly as the lamps do.
|
|
76
|
+
*/
|
|
77
|
+
arcane: {
|
|
78
|
+
label: 'plume:arcane',
|
|
79
|
+
vertexSource: PLUME_VERT,
|
|
80
|
+
fragmentSource: ARCANE_FRAG,
|
|
81
|
+
vertexWgsl: PLUME_VERT_WGSL,
|
|
82
|
+
fragmentWgsl: ARCANE_FRAG_WGSL,
|
|
83
|
+
/* Arcane shares the plume vertex stage; its own file records only the fragment one. */
|
|
84
|
+
vertexBindings: FIRE_BINDINGS.PLUME_VERT,
|
|
85
|
+
fragmentBindings: ARCANE_BINDINGS.ARCANE_FRAG,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/** Resolve a material name, or say which names exist. */
|
|
90
|
+
export function plumeShaders(material: PlumeMaterial): PlumeShaders {
|
|
91
|
+
const found = MATERIALS[material];
|
|
92
|
+
if (found === undefined) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`createPlumes: unknown plume material "${String(material)}". ` +
|
|
95
|
+
`Known materials: ${Object.keys(MATERIALS).join(', ')}.`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return found;
|
|
99
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { PLUME_VERTS } from './plumeGeometry.ts';
|
|
2
|
+
import type { FrameView } from './frameView.ts';
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
4
|
+
import { bindAtmosphere } from './atmosphere.ts';
|
|
5
|
+
import { plumeShaders, type PlumeMaterial } from './plumeMaterial.ts';
|
|
6
|
+
import { buildPlumeGeometry } from './plumeGeometry.ts';
|
|
7
|
+
import type { Atmosphere } from './atmosphere.ts';
|
|
8
|
+
import type { Vec3 } from '../math/color.ts';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Batched camera-facing quads for volumetric effects — flames, smoke, steam,
|
|
12
|
+
* dust. Game-agnostic: it knows positions, sizes and time, and nothing about
|
|
13
|
+
* what the plume represents.
|
|
14
|
+
*
|
|
15
|
+
* One VAO for the whole batch, four vertices per plume, everything animated on
|
|
16
|
+
* the GPU. The caller supplies the shader pair, so a new effect is a new
|
|
17
|
+
* fragment shader rather than a new renderer.
|
|
18
|
+
*/
|
|
19
|
+
export interface PlumePlacement {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
z: number;
|
|
23
|
+
/** Half-width and full height, metres. */
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type PlumeBlend = 'additive' | 'alpha';
|
|
29
|
+
|
|
30
|
+
export interface PlumeOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Which plume this is, by name.
|
|
33
|
+
*
|
|
34
|
+
* **This replaced a pair of GLSL source strings on 2026-08-13, and the replacement is a
|
|
35
|
+
* breaking change made on purpose.** A caller-supplied shader is a capability that can only
|
|
36
|
+
* ever exist on WebGL2: WebGPU has no runtime GLSL compiler and this package must not ship
|
|
37
|
+
* one. Naming the material lets each backend resolve what it can compile. See
|
|
38
|
+
* `plumeMaterial.ts` for what was given up.
|
|
39
|
+
*/
|
|
40
|
+
material: PlumeMaterial;
|
|
41
|
+
/** Emissive effects (fire) add light; dense ones (smoke) occlude it. */
|
|
42
|
+
blend: PlumeBlend;
|
|
43
|
+
/**
|
|
44
|
+
* How much the quads swell and shrink over time, 0 for a fixed size. Purely
|
|
45
|
+
* visual — anything gameplay depends on must keep its own fixed volume, or
|
|
46
|
+
* the simulation starts depending on the render clock.
|
|
47
|
+
*/
|
|
48
|
+
sizePulse?: number;
|
|
49
|
+
/**
|
|
50
|
+
* How far this plume leans in a given wind, metres per m/s at its crown.
|
|
51
|
+
* Smoke is carried; a flame is anchored to its fuel and barely bends.
|
|
52
|
+
*/
|
|
53
|
+
windResponse?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Colour handed to the fragment stage as `uTint`, or white when absent.
|
|
56
|
+
*
|
|
57
|
+
* Optional shader contract, the same arrangement `uNoiseOctaves` and
|
|
58
|
+
* `uCameraRight` already use: the uniform is set unconditionally and
|
|
59
|
+
* `uniformLocations` hands back null for a shader that ignores it, so `fire`
|
|
60
|
+
* and `smoke` are untouched by this existing.
|
|
61
|
+
*/
|
|
62
|
+
tint?: Vec3;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Blades in each plume's cross, and the vertices that costs.
|
|
67
|
+
*
|
|
68
|
+
* **Two, crossed at 90°, instead of one card turned to face the viewer.** A single
|
|
69
|
+
* billboard has no three-dimensional structure to see: orbiting a fire showed the
|
|
70
|
+
* identical silhouette from every angle, because every card shared one camera-derived
|
|
71
|
+
* axis and the whole plume swivelled as a sheet. Reported twice: the fire did not read
|
|
72
|
+
* as three-dimensional, it read as something that moved with the camera — and after a
|
|
73
|
+
* first attempt that only *leaned* edge-on cards toward the viewer, it still did,
|
|
74
|
+
* correctly, because leaning still rotates whichever cards are edge-on, so the ensemble
|
|
75
|
+
* still tracks the viewer.
|
|
76
|
+
*
|
|
77
|
+
* A cross cannot track anything: both blades are fixed in world space, so turning
|
|
78
|
+
* around a fire genuinely brings one broadside as the other goes edge-on, which is
|
|
79
|
+
* the parallax a volume has. It also removes the reason billboarding existed — a
|
|
80
|
+
* blade going edge-on no longer vanishes, because its partner is square-on at that
|
|
81
|
+
* exact moment.
|
|
82
|
+
*
|
|
83
|
+
* Two rather than three because the plumes blend additively and are drawn in
|
|
84
|
+
* quantity: the third blade costs 50% more geometry for a difference the eye does not
|
|
85
|
+
* separate at the sizes these are drawn.
|
|
86
|
+
*/
|
|
87
|
+
const BLADES = 2;
|
|
88
|
+
/* The shared count, so both backends step a plume's vertices the same way. */
|
|
89
|
+
const VERTS_PER_PLUME = PLUME_VERTS;
|
|
90
|
+
|
|
91
|
+
const CORNERS = [
|
|
92
|
+
[-1, -1],
|
|
93
|
+
[1, -1],
|
|
94
|
+
[1, 1],
|
|
95
|
+
[-1, 1],
|
|
96
|
+
] as const;
|
|
97
|
+
|
|
98
|
+
export class PlumeRenderer {
|
|
99
|
+
private readonly program: WebGLProgram;
|
|
100
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
101
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
102
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
103
|
+
private readonly indexCount: number;
|
|
104
|
+
/**
|
|
105
|
+
* The per-vertex size buffer, kept so a caller can turn individual plumes off.
|
|
106
|
+
*
|
|
107
|
+
* A batch is uploaded once because a fire does not move — but a *fire that is not always
|
|
108
|
+
* burning* does need saying. Oil slicks ignite on a cycle, and before this there was no way
|
|
109
|
+
* to draw one only while it was alight: the launch happened with an empty screen.
|
|
110
|
+
*/
|
|
111
|
+
private readonly sizeBuffer: WebGLBuffer;
|
|
112
|
+
private readonly sizes: Float32Array;
|
|
113
|
+
private readonly baseSizes: Float32Array;
|
|
114
|
+
private readonly blend: PlumeBlend;
|
|
115
|
+
private readonly sizePulse: number;
|
|
116
|
+
private readonly windResponse: number;
|
|
117
|
+
private readonly noiseOctaves: number;
|
|
118
|
+
private readonly tint: Vec3;
|
|
119
|
+
|
|
120
|
+
constructor(
|
|
121
|
+
gl: WebGL2RenderingContext,
|
|
122
|
+
plumes: readonly PlumePlacement[],
|
|
123
|
+
options: PlumeOptions,
|
|
124
|
+
noiseOctaves: number,
|
|
125
|
+
) {
|
|
126
|
+
const shaders = plumeShaders(options.material);
|
|
127
|
+
this.program = compileProgram(gl, shaders.vertexSource, shaders.fragmentSource, shaders.label);
|
|
128
|
+
this.uniforms = uniformLocations(gl, this.program, 'plumeRenderer');
|
|
129
|
+
this.blend = options.blend;
|
|
130
|
+
this.sizePulse = options.sizePulse ?? 0;
|
|
131
|
+
this.windResponse = options.windResponse ?? 0;
|
|
132
|
+
this.noiseOctaves = noiseOctaves;
|
|
133
|
+
this.tint = options.tint ?? [1, 1, 1];
|
|
134
|
+
|
|
135
|
+
/* Built in `plumeGeometry.ts`, so both backends lay out the same crossed quads. */
|
|
136
|
+
const { centers, corners, sizes, seeds, blades, indices } = buildPlumeGeometry(plumes);
|
|
137
|
+
this.indexCount = indices.length;
|
|
138
|
+
|
|
139
|
+
const vao = gl.createVertexArray();
|
|
140
|
+
if (vao === null) throw new Error(`${shaders.label}: createVertexArray failed`);
|
|
141
|
+
this.vao = vao;
|
|
142
|
+
gl.bindVertexArray(vao);
|
|
143
|
+
this.attach(gl, 0, centers, 3, shaders.label);
|
|
144
|
+
this.attach(gl, 1, corners, 2, shaders.label);
|
|
145
|
+
this.sizeBuffer = this.attach(gl, 2, sizes, 2, shaders.label);
|
|
146
|
+
this.attach(gl, 3, seeds, 1, shaders.label);
|
|
147
|
+
this.attach(gl, 4, blades, 1, shaders.label);
|
|
148
|
+
this.sizes = sizes;
|
|
149
|
+
// The authored sizes, so a hidden plume can be restored to exactly what it was.
|
|
150
|
+
this.baseSizes = new Float32Array(plumes.length * 2);
|
|
151
|
+
for (let f = 0; f < plumes.length; f++) {
|
|
152
|
+
const plume = plumes[f];
|
|
153
|
+
if (plume === undefined) continue;
|
|
154
|
+
this.baseSizes[f * 2] = plume.width;
|
|
155
|
+
this.baseSizes[f * 2 + 1] = plume.height;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const indexBuffer = gl.createBuffer();
|
|
159
|
+
if (indexBuffer === null) throw new Error(`${shaders.label}: createBuffer failed`);
|
|
160
|
+
this.buffers.push(indexBuffer);
|
|
161
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
162
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
163
|
+
gl.bindVertexArray(null);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Scale one plume, 0 to hide it.
|
|
168
|
+
*
|
|
169
|
+
* Writes only that plume's own vertices — every blade of its cross — so turning a slick's
|
|
170
|
+
* fire on costs a handful of floats rather than a re-upload of the batch. The caller owns
|
|
171
|
+
* *when*; the renderer has no idea what a slick is.
|
|
172
|
+
*/
|
|
173
|
+
setScale(gl: WebGL2RenderingContext, index: number, scale: number): void {
|
|
174
|
+
const span = VERTS_PER_PLUME * 2;
|
|
175
|
+
const base = index * span;
|
|
176
|
+
if (base < 0 || base + span > this.sizes.length) return;
|
|
177
|
+
const width = this.baseSizes[index * 2] ?? 0;
|
|
178
|
+
const height = this.baseSizes[index * 2 + 1] ?? 0;
|
|
179
|
+
for (let c = 0; c < VERTS_PER_PLUME; c++) {
|
|
180
|
+
this.sizes[base + c * 2] = width * scale;
|
|
181
|
+
this.sizes[base + c * 2 + 1] = height * scale;
|
|
182
|
+
}
|
|
183
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.sizeBuffer);
|
|
184
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, base * 4, this.sizes.subarray(base, base + span));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Draw the batch. Call after the sky: these blend without writing depth, and
|
|
189
|
+
* the sky at depth 1.0 under LEQUAL would otherwise overwrite anything drawn
|
|
190
|
+
* against open background.
|
|
191
|
+
*/
|
|
192
|
+
draw(
|
|
193
|
+
gl: WebGL2RenderingContext,
|
|
194
|
+
camera: FrameView,
|
|
195
|
+
timeSeconds: number,
|
|
196
|
+
atmosphere: Atmosphere,
|
|
197
|
+
underwaterEnabled: boolean,
|
|
198
|
+
atmosphereCameraY: number,
|
|
199
|
+
clipPlane: Float32Array | null,
|
|
200
|
+
windX = 0,
|
|
201
|
+
windZ = 0,
|
|
202
|
+
originX = 0,
|
|
203
|
+
originY = 0,
|
|
204
|
+
originZ = 0,
|
|
205
|
+
): void {
|
|
206
|
+
if (this.indexCount === 0) return;
|
|
207
|
+
const u = this.uniforms;
|
|
208
|
+
|
|
209
|
+
gl.useProgram(this.program);
|
|
210
|
+
gl.uniform2f(u['uWind'] ?? null, windX, windZ);
|
|
211
|
+
gl.uniform3f(u['uOrigin'] ?? null, originX, originY, originZ);
|
|
212
|
+
gl.uniform1f(u['uWindResponse'] ?? null, this.windResponse);
|
|
213
|
+
gl.uniformMatrix4fv(u['uViewProj'] ?? null, false, camera.viewProjection);
|
|
214
|
+
const v = camera.view;
|
|
215
|
+
/*
|
|
216
|
+
* The camera's own basis, for shader pairs that billboard. The plume shaders
|
|
217
|
+
* shipped here no longer do — they draw world-fixed crosses, because anything
|
|
218
|
+
* that rotates with the camera reads as flat (see `BLADES`) — but the uniform is
|
|
219
|
+
* part of the generic contract a caller may supply its own vertex shader against,
|
|
220
|
+
* and `uniformLocations` hands back null for a shader that ignores it.
|
|
221
|
+
*/
|
|
222
|
+
gl.uniform3f(u['uCameraRight'] ?? null, v[0] ?? 1, v[4] ?? 0, v[8] ?? 0);
|
|
223
|
+
gl.uniform3f(u['uCameraUp'] ?? null, v[1] ?? 0, v[5] ?? 1, v[9] ?? 0);
|
|
224
|
+
gl.uniform3fv(u['uCameraPos'] ?? null, camera.position);
|
|
225
|
+
gl.uniform1f(u['uTime'] ?? null, timeSeconds);
|
|
226
|
+
gl.uniform1f(u['uSizePulse'] ?? null, this.sizePulse);
|
|
227
|
+
// Optional shader contract: generic plume shaders may ignore these uniforms.
|
|
228
|
+
gl.uniform1i(u['uNoiseOctaves'] ?? null, this.noiseOctaves);
|
|
229
|
+
gl.uniform3f(u['uTint'] ?? null, this.tint[0], this.tint[1], this.tint[2]);
|
|
230
|
+
gl.uniform1i(u['uClipEnabled'] ?? null, clipPlane === null ? 0 : 1);
|
|
231
|
+
if (clipPlane !== null) gl.uniform4fv(u['uClipPlane'] ?? null, clipPlane);
|
|
232
|
+
bindAtmosphere(gl, u, atmosphere, atmosphereCameraY, underwaterEnabled);
|
|
233
|
+
|
|
234
|
+
gl.enable(gl.BLEND);
|
|
235
|
+
if (this.blend === 'additive') gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
|
|
236
|
+
else gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
237
|
+
gl.depthMask(false);
|
|
238
|
+
gl.disable(gl.CULL_FACE);
|
|
239
|
+
|
|
240
|
+
gl.bindVertexArray(this.vao);
|
|
241
|
+
gl.drawElements(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0);
|
|
242
|
+
gl.bindVertexArray(null);
|
|
243
|
+
|
|
244
|
+
gl.enable(gl.CULL_FACE);
|
|
245
|
+
gl.depthMask(true);
|
|
246
|
+
gl.disable(gl.BLEND);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
250
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
251
|
+
gl.deleteVertexArray(this.vao);
|
|
252
|
+
gl.deleteProgram(this.program);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** Uploads one attribute and returns its buffer, for the rare one a caller can change. */
|
|
256
|
+
private attach(
|
|
257
|
+
gl: WebGL2RenderingContext,
|
|
258
|
+
location: number,
|
|
259
|
+
data: Float32Array,
|
|
260
|
+
size: number,
|
|
261
|
+
label: string,
|
|
262
|
+
): WebGLBuffer {
|
|
263
|
+
const buffer = gl.createBuffer();
|
|
264
|
+
if (buffer === null) throw new Error(`${label}: createBuffer failed`);
|
|
265
|
+
this.buffers.push(buffer);
|
|
266
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
267
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
|
|
268
|
+
gl.enableVertexAttribArray(location);
|
|
269
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
270
|
+
return buffer;
|
|
271
|
+
}
|
|
272
|
+
}
|