@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,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order-independent transparency: the arithmetic, so it can be asserted without a device.
|
|
3
|
+
*
|
|
4
|
+
* **Two panes of glass should not depend on which was submitted first.** Sorted alpha blending is
|
|
5
|
+
* order-dependent by construction — `over` does not commute — so a translucent set is drawn back to
|
|
6
|
+
* front and anything the sort cannot separate flickers or wins arbitrarily: two panes that
|
|
7
|
+
* intersect, a pane containing another, a pane and the smoke inside it. A consumer's answer is
|
|
8
|
+
* usually to sort harder, which cannot fix an intersection at all.
|
|
9
|
+
*
|
|
10
|
+
* **Weighted blending replaces the ordering with a sum.** Each fragment contributes its colour
|
|
11
|
+
* scaled by a weight that falls off with distance, and separately multiplies a running
|
|
12
|
+
* transmittance. A sum and a product both commute, so the frame does not depend on the order the
|
|
13
|
+
* fragments arrived in — which is the property the census row asks for, and it is asserted here
|
|
14
|
+
* against numbers rather than argued about.
|
|
15
|
+
*
|
|
16
|
+
* **It is an approximation of the ordering and exact for one layer**, which is the honest way to
|
|
17
|
+
* state what it buys: with a single translucent surface there is no ordering to approximate and
|
|
18
|
+
* this reproduces `over` precisely, and the test beside it pins that. With several, near layers
|
|
19
|
+
* count for more than far ones and the result is plausible rather than correct — which is what a
|
|
20
|
+
* pane of glass needs and what a stained-glass window with eight overlapping leaves does not.
|
|
21
|
+
*
|
|
22
|
+
* McGuire and Bavoil, *Weighted Blended Order-Independent Transparency*, JCGT 2013 — equation 9
|
|
23
|
+
* for the weight, and its recommended constants, which are what the clamps below are.
|
|
24
|
+
*
|
|
25
|
+
* The one thing here that is not arithmetic is `OIT_MULTISAMPLE_REFUSAL`, and it is here for the
|
|
26
|
+
* same reason: it is a decision both backends take, so it is written once where neither owns it.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** A colour the accumulation is working on, as three numbers rather than a texture fetch. */
|
|
30
|
+
export type Rgb = readonly [number, number, number];
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* What the two targets hold between them.
|
|
34
|
+
*
|
|
35
|
+
* `accum` is the weighted sum of premultiplied colour with the weighted alpha in its fourth
|
|
36
|
+
* channel; `reveal` is the running product of what each layer let through. On a GPU these are two
|
|
37
|
+
* render targets with two blend states — additive for one, multiplicative for the other — and this
|
|
38
|
+
* object is the same numbers on the CPU so the algebra has somewhere to be tested.
|
|
39
|
+
*/
|
|
40
|
+
export interface OitAccumulator {
|
|
41
|
+
accum: [number, number, number, number];
|
|
42
|
+
/** One is "nothing has covered this pixel yet", which is why it is not zero. */
|
|
43
|
+
reveal: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** An empty pixel: nothing accumulated, everything still revealed. */
|
|
47
|
+
export function newOitAccumulator(): OitAccumulator {
|
|
48
|
+
return { accum: [0, 0, 0, 0], reveal: 1 };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* How much a fragment at `viewDepth` metres and this alpha counts for.
|
|
53
|
+
*
|
|
54
|
+
* **A near fragment must count for more than a far one**, or the accumulation is an unweighted
|
|
55
|
+
* average: a pane thirty metres away would contribute as much as one against the camera, which
|
|
56
|
+
* reads as fog rather than as glass.
|
|
57
|
+
*
|
|
58
|
+
* **Clamped at both ends, and the clamp is what keeps this stable in float.** Without a ceiling a
|
|
59
|
+
* fragment on the near plane takes a weight large enough to swamp every other layer, and their
|
|
60
|
+
* contributions are then lost to rounding inside a 16-bit target; without a floor a distant one
|
|
61
|
+
* rounds to nothing and vanishes rather than fading.
|
|
62
|
+
*/
|
|
63
|
+
export function oitWeight(viewDepth: number, alpha: number): number {
|
|
64
|
+
const z = Math.max(0, viewDepth) / 200;
|
|
65
|
+
const falloff = 0.03 / (1e-5 + z * z * z * z);
|
|
66
|
+
return alpha * Math.min(3e3, Math.max(1e-2, falloff));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Fold one fragment in.
|
|
71
|
+
*
|
|
72
|
+
* **A sum and a product, which is the whole mechanism**: both commute, so the pixel does not
|
|
73
|
+
* depend on the order its fragments arrived in. A change that made either depend on order — an
|
|
74
|
+
* `if` on what is already there, a max instead of a sum — breaks the row this exists to close, and
|
|
75
|
+
* the test beside this fails before it reaches a GPU.
|
|
76
|
+
*/
|
|
77
|
+
export function accumulateOit(
|
|
78
|
+
state: OitAccumulator,
|
|
79
|
+
colour: Rgb,
|
|
80
|
+
alpha: number,
|
|
81
|
+
viewDepth: number,
|
|
82
|
+
): void {
|
|
83
|
+
const w = oitWeight(viewDepth, alpha);
|
|
84
|
+
state.accum[0] += colour[0] * alpha * w;
|
|
85
|
+
state.accum[1] += colour[1] * alpha * w;
|
|
86
|
+
state.accum[2] += colour[2] * alpha * w;
|
|
87
|
+
state.accum[3] += alpha * w;
|
|
88
|
+
state.reveal *= 1 - alpha;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The two targets composited over what is behind them.
|
|
93
|
+
*
|
|
94
|
+
* The weighted sum divided by the weighted alpha is the average colour the layers make; `reveal`
|
|
95
|
+
* says how much of the background still shows through. For one layer that reduces exactly to
|
|
96
|
+
* `colour * alpha + background * (1 - alpha)`, which is `over` — the anchor the test asserts.
|
|
97
|
+
*/
|
|
98
|
+
export function resolveOit(state: OitAccumulator, background: Rgb): [number, number, number] {
|
|
99
|
+
/* Guarded because a pixel no fragment touched has a weighted alpha of zero, and the reveal of
|
|
100
|
+
one below then discards whatever this produced anyway. */
|
|
101
|
+
const weight = Math.max(state.accum[3], 1e-5);
|
|
102
|
+
const average: [number, number, number] = [
|
|
103
|
+
state.accum[0] / weight,
|
|
104
|
+
state.accum[1] / weight,
|
|
105
|
+
state.accum[2] / weight,
|
|
106
|
+
];
|
|
107
|
+
const covered = 1 - state.reveal;
|
|
108
|
+
return [
|
|
109
|
+
average[0] * covered + background[0] * state.reveal,
|
|
110
|
+
average[1] * covered + background[1] * state.reveal,
|
|
111
|
+
average[2] * covered + background[2] * state.reveal,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* What both backends say when a profile asks for this and multisampling excludes it.
|
|
117
|
+
*
|
|
118
|
+
* **One string rather than one per backend, and that is rule 1 of the parity hard rule**:
|
|
119
|
+
* decisions live in backend-neutral code and only the binding is per-backend. The engine already
|
|
120
|
+
* paid for the other arrangement — `compositeWantsDepth` was two copies of one expression, depth
|
|
121
|
+
* of field was added to one of them, and the effect then ran against a discarded attachment. A
|
|
122
|
+
* refusal is a smaller thing than a depth attachment and drifts exactly as easily: the decal and
|
|
123
|
+
* reflection refusals beside this one are duplicated literals whose two halves have to be diffed
|
|
124
|
+
* by eye to know they still agree.
|
|
125
|
+
*
|
|
126
|
+
* **Why the effect is excluded rather than degraded.** Both passes attach the scene target's own
|
|
127
|
+
* depth and test against it, and above one sample the frame is not drawn into that texture — it
|
|
128
|
+
* is drawn into a multisampled renderbuffer, and the texture receives a copy at the end of the
|
|
129
|
+
* frame if anything asked for one. So the panes would be rejected against the frame before, or
|
|
130
|
+
* against a texture nothing has ever written.
|
|
131
|
+
*/
|
|
132
|
+
export const OIT_MULTISAMPLE_REFUSAL =
|
|
133
|
+
"driftengine: order-independent transparency attaches the scene target's own depth and tests " +
|
|
134
|
+
'against it, and a multisampled frame is not drawn into that texture — so translucent draws ' +
|
|
135
|
+
'stay sorted and blended wherever `sceneSamples` is above one. Antialiasing and this effect ' +
|
|
136
|
+
'are a choice of one.';
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
2
|
+
import { particleShaders, type ParticleMaterial } from './particleMaterial.ts';
|
|
3
|
+
import { PARTICLE_BLADES, PARTICLE_INDICES, PARTICLE_VERTS } from './shaders/particle.ts';
|
|
4
|
+
import type { ParticleInstances } from './particlePool.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* One draw call for a live particle pool: one camera-facing quad per particle, or a
|
|
8
|
+
* crossed pair of world-fixed ones when `facing` asks for them.
|
|
9
|
+
*
|
|
10
|
+
* Instanced: the cross is uploaded once as eight vertices, and each frame only the
|
|
11
|
+
* per-particle stream is re-sent. That is the difference between this and the
|
|
12
|
+
* scatter path it replaces — `InstancedMesh` is built for data that never changes
|
|
13
|
+
* after placement, and a particle system's data changes entirely every frame.
|
|
14
|
+
*
|
|
15
|
+
* Blending and depth are the batch's own decision because they are a property of
|
|
16
|
+
* the *material*: smoke occludes what is behind it and sparks add to it, and a
|
|
17
|
+
* caller that had to remember which would eventually forget. Neither writes depth
|
|
18
|
+
* — a soft particle that did would punch a hole in everything drawn after it.
|
|
19
|
+
*/
|
|
20
|
+
export type ParticleBlend = 'additive' | 'alpha';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* How a particle's quads are turned.
|
|
24
|
+
*
|
|
25
|
+
* `'camera'` is one quad facing the viewer, and the default. `'cross'` is the pair of
|
|
26
|
+
* world-fixed blades this batch drew before the option existed — see `uCameraFacing` in
|
|
27
|
+
* `shaders/particle.ts` for the artifact that made the default the other one, and for what
|
|
28
|
+
* the cross still buys a caller who wants it back.
|
|
29
|
+
*/
|
|
30
|
+
export type ParticleFacing = 'camera' | 'cross';
|
|
31
|
+
|
|
32
|
+
export interface ParticleBatchOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Which particle this is, by name.
|
|
35
|
+
*
|
|
36
|
+
* **This replaced a GLSL source string on 2026-08-13**, the same change and for the same
|
|
37
|
+
* reason as `PlumeOptions.material`: a caller-supplied shader is a capability that can only
|
|
38
|
+
* ever exist on WebGL2, and naming the material lets each backend resolve what it can
|
|
39
|
+
* compile. See `particleMaterial.ts`.
|
|
40
|
+
*/
|
|
41
|
+
material: ParticleMaterial;
|
|
42
|
+
blend: ParticleBlend;
|
|
43
|
+
/**
|
|
44
|
+
* Seconds of travel a particle is stretched along. 0 for smoke.
|
|
45
|
+
*
|
|
46
|
+
* **The velocity it stretches along is a direction to be drawn on, not a motion being
|
|
47
|
+
* simulated, and it must stay that way.** Nothing here integrates it: a caller writes both
|
|
48
|
+
* position and velocity every frame, so a deterministic consumer that computes where a
|
|
49
|
+
* particle *is* from its own plan can still ask for the streak that a moving thing has. That
|
|
50
|
+
* is load-bearing outside this repository, where a corona's streamers are the spark material
|
|
51
|
+
* stretched radially and nothing about them moves. Advancing position from this would take
|
|
52
|
+
* the feature away from every caller that is not running a simulation.
|
|
53
|
+
*/
|
|
54
|
+
stretchSec?: number;
|
|
55
|
+
/** How hard the noise erodes a puff, 0 to 1. Ignored by the spark and mote materials. */
|
|
56
|
+
erosion?: number;
|
|
57
|
+
/** How far past white a spark's core may go. Ignored by the smoke and mote materials. */
|
|
58
|
+
coreGain?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Whether the medium's fog and underwater tint reach this pool. Ignored by the spark and
|
|
61
|
+
* smoke materials, which stay unconditionally fogged — a real ember and real grit belong in
|
|
62
|
+
* the same haze as the rest of the world, matching every particle drawn before this option
|
|
63
|
+
* existed. Defaults to false, because a caller reaching for `'mote'` over `'spark'`/`'smoke'`
|
|
64
|
+
* is usually asking for exactly what those two cannot draw: an unlit point exactly its own
|
|
65
|
+
* colour, untouched by distance. See `PARTICLE_MOTE_FRAG`'s own comment on `uFogEnabled`.
|
|
66
|
+
*/
|
|
67
|
+
fog?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether each particle is one camera-facing quad or a world-fixed cross of two.
|
|
70
|
+
*
|
|
71
|
+
* Defaults to `'camera'`, and **this default changed** — every particle drawn before it
|
|
72
|
+
* was a cross. A cross has a blade edge-on down each of two world axes, and a sprite
|
|
73
|
+
* squeezed into a one-pixel column spends its whole brightness there: a bright straight
|
|
74
|
+
* line through the middle, worst on the additive materials, and a pair of them from
|
|
75
|
+
* directly above. Consider `'cross'` when the camera stays near horizontal and the
|
|
76
|
+
* parallax of two blades is worth more than a stable brightness, which is the trade the
|
|
77
|
+
* shader's own comment on `uCameraFacing` lays out.
|
|
78
|
+
*/
|
|
79
|
+
facing?: ParticleFacing;
|
|
80
|
+
/**
|
|
81
|
+
* Another batch whose compiled program this one should reuse.
|
|
82
|
+
*
|
|
83
|
+
* Several pools legitimately share a *material* while needing their own buffers —
|
|
84
|
+
* a game may have four kinds of smoke, each with its own colours, lifetime and
|
|
85
|
+
* capacity, all drawn by one fragment shader. Without this each of them compiles
|
|
86
|
+
* the same source again, which is pure boot time on the device where boot time is
|
|
87
|
+
* scarcest. The per-material constants stay per batch, because they are the point
|
|
88
|
+
* of having several.
|
|
89
|
+
*
|
|
90
|
+
* Only valid for the same `material`, and **that is now checked** — it was not, and could
|
|
91
|
+
* not be, while the material was an opaque source string a caller supplied. Naming it made
|
|
92
|
+
* the constraint expressible, so a spark batch reusing a smoke program fails at construction
|
|
93
|
+
* with both names rather than drawing sparks that look like smoke.
|
|
94
|
+
*/
|
|
95
|
+
reuse?: ParticleBatch;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Corners of one blade, as a triangle-strip-friendly quad. */
|
|
99
|
+
const CORNERS = [
|
|
100
|
+
[-1, -1],
|
|
101
|
+
[1, -1],
|
|
102
|
+
[1, 1],
|
|
103
|
+
[-1, 1],
|
|
104
|
+
] as const;
|
|
105
|
+
|
|
106
|
+
export class ParticleBatch {
|
|
107
|
+
readonly program: WebGLProgram;
|
|
108
|
+
readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
109
|
+
|
|
110
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
111
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
112
|
+
private readonly positionBuffer: WebGLBuffer;
|
|
113
|
+
private readonly sizeBuffer: WebGLBuffer;
|
|
114
|
+
private readonly spinBuffer: WebGLBuffer;
|
|
115
|
+
private readonly colorBuffer: WebGLBuffer;
|
|
116
|
+
private readonly alphaBuffer: WebGLBuffer;
|
|
117
|
+
private readonly ageBuffer: WebGLBuffer;
|
|
118
|
+
private readonly seedBuffer: WebGLBuffer;
|
|
119
|
+
private readonly velocityBuffer: WebGLBuffer;
|
|
120
|
+
private readonly blend: ParticleBlend;
|
|
121
|
+
private readonly stretchSec: number;
|
|
122
|
+
private readonly erosion: number;
|
|
123
|
+
private readonly coreGain: number;
|
|
124
|
+
private readonly fog: boolean;
|
|
125
|
+
private readonly facing: ParticleFacing;
|
|
126
|
+
/** False when the program belongs to another batch, so `dispose` leaves it alone. */
|
|
127
|
+
private readonly ownsProgram: boolean;
|
|
128
|
+
/** Which material compiled this batch's program, so `reuse` can be checked. */
|
|
129
|
+
readonly material: ParticleMaterial;
|
|
130
|
+
|
|
131
|
+
constructor(gl: WebGL2RenderingContext, capacity: number, options: ParticleBatchOptions) {
|
|
132
|
+
/* The vertex stage comes with the material now; it used to be a separate argument that
|
|
133
|
+
every caller passed the same value for. */
|
|
134
|
+
const shaders = particleShaders(options.material);
|
|
135
|
+
const shared = options.reuse;
|
|
136
|
+
if (shared !== undefined && shared.material !== options.material) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`createParticles: cannot reuse a "${shared.material}" program for a ` +
|
|
139
|
+
`"${options.material}" batch. \`reuse\` shares one compiled material between pools.`,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
this.ownsProgram = shared === undefined;
|
|
143
|
+
this.material = options.material;
|
|
144
|
+
this.program =
|
|
145
|
+
shared?.program ??
|
|
146
|
+
compileProgram(gl, shaders.vertexSource, shaders.fragmentSource, shaders.label);
|
|
147
|
+
this.uniforms = shared?.uniforms ?? uniformLocations(gl, this.program, 'particleBatch');
|
|
148
|
+
this.blend = options.blend;
|
|
149
|
+
this.stretchSec = options.stretchSec ?? 0;
|
|
150
|
+
this.erosion = options.erosion ?? 0;
|
|
151
|
+
this.coreGain = options.coreGain ?? 1;
|
|
152
|
+
this.fog = options.fog ?? false;
|
|
153
|
+
this.facing = options.facing ?? 'camera';
|
|
154
|
+
|
|
155
|
+
const corners = new Float32Array(PARTICLE_VERTS * 2);
|
|
156
|
+
const blades = new Float32Array(PARTICLE_VERTS);
|
|
157
|
+
const indices = new Uint16Array(PARTICLE_INDICES);
|
|
158
|
+
for (let b = 0; b < PARTICLE_BLADES; b++) {
|
|
159
|
+
for (let c = 0; c < 4; c++) {
|
|
160
|
+
const v = b * 4 + c;
|
|
161
|
+
const corner = CORNERS[c] ?? [0, 0];
|
|
162
|
+
corners[v * 2] = corner[0];
|
|
163
|
+
corners[v * 2 + 1] = corner[1];
|
|
164
|
+
blades[v] = b;
|
|
165
|
+
}
|
|
166
|
+
const base = b * 4;
|
|
167
|
+
const i = b * 6;
|
|
168
|
+
indices[i] = base;
|
|
169
|
+
indices[i + 1] = base + 1;
|
|
170
|
+
indices[i + 2] = base + 2;
|
|
171
|
+
indices[i + 3] = base;
|
|
172
|
+
indices[i + 4] = base + 2;
|
|
173
|
+
indices[i + 5] = base + 3;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const vao = gl.createVertexArray();
|
|
177
|
+
if (vao === null) throw new Error(`${shaders.label}: createVertexArray failed`);
|
|
178
|
+
this.vao = vao;
|
|
179
|
+
gl.bindVertexArray(vao);
|
|
180
|
+
|
|
181
|
+
this.attach(gl, 0, corners, 2, 0, shaders.label);
|
|
182
|
+
this.attach(gl, 1, blades, 1, 0, shaders.label);
|
|
183
|
+
this.positionBuffer = this.attach(gl, 2, capacity * 3, 3, 1, shaders.label);
|
|
184
|
+
this.sizeBuffer = this.attach(gl, 3, capacity, 1, 1, shaders.label);
|
|
185
|
+
this.spinBuffer = this.attach(gl, 4, capacity, 1, 1, shaders.label);
|
|
186
|
+
this.colorBuffer = this.attach(gl, 5, capacity * 3, 3, 1, shaders.label);
|
|
187
|
+
this.alphaBuffer = this.attach(gl, 6, capacity, 1, 1, shaders.label);
|
|
188
|
+
this.ageBuffer = this.attach(gl, 7, capacity, 1, 1, shaders.label);
|
|
189
|
+
this.seedBuffer = this.attach(gl, 8, capacity, 1, 1, shaders.label);
|
|
190
|
+
this.velocityBuffer = this.attach(gl, 9, capacity * 3, 3, 1, shaders.label);
|
|
191
|
+
|
|
192
|
+
const indexBuffer = gl.createBuffer();
|
|
193
|
+
if (indexBuffer === null) throw new Error(`${shaders.label}: createBuffer failed`);
|
|
194
|
+
this.buffers.push(indexBuffer);
|
|
195
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
196
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
197
|
+
gl.bindVertexArray(null);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Send this frame's particles.
|
|
202
|
+
*
|
|
203
|
+
* Only the live prefix of each array, which is what the pool's compaction
|
|
204
|
+
* exists for: a pool at a tenth of its capacity uploads a tenth of the bytes.
|
|
205
|
+
*/
|
|
206
|
+
upload(gl: WebGL2RenderingContext, data: ParticleInstances): void {
|
|
207
|
+
const n = data.count;
|
|
208
|
+
if (n === 0) return;
|
|
209
|
+
this.send(gl, this.positionBuffer, data.positions, n * 3);
|
|
210
|
+
this.send(gl, this.sizeBuffer, data.sizes, n);
|
|
211
|
+
this.send(gl, this.spinBuffer, data.spins, n);
|
|
212
|
+
this.send(gl, this.colorBuffer, data.colors, n * 3);
|
|
213
|
+
this.send(gl, this.alphaBuffer, data.alphas, n);
|
|
214
|
+
this.send(gl, this.ageBuffer, data.ages, n);
|
|
215
|
+
this.send(gl, this.seedBuffer, data.seeds, n);
|
|
216
|
+
this.send(gl, this.velocityBuffer, data.velocities, n * 3);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Bind this material's own constants. Called once per draw, before `drawTo`. */
|
|
220
|
+
bindMaterial(gl: WebGL2RenderingContext): void {
|
|
221
|
+
const u = this.uniforms;
|
|
222
|
+
gl.uniform1f(u['uStretchSec'] ?? null, this.stretchSec);
|
|
223
|
+
gl.uniform1f(u['uCameraFacing'] ?? null, this.facing === 'camera' ? 1 : 0);
|
|
224
|
+
gl.uniform1f(u['uErosion'] ?? null, this.erosion);
|
|
225
|
+
gl.uniform1f(u['uCoreGain'] ?? null, this.coreGain);
|
|
226
|
+
/* Only the mote program declares uFogEnabled, so this is a no-op — not a leak into the
|
|
227
|
+
next draw — on the other two: `u['uFogEnabled']` is undefined there and gl.uniform1i
|
|
228
|
+
silently ignores a null location. */
|
|
229
|
+
gl.uniform1i(u['uFogEnabled'] ?? null, this.fog ? 1 : 0);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Draw the live particles.
|
|
234
|
+
*
|
|
235
|
+
* Depth *tested* but not written, so a puff is correctly hidden behind the deck
|
|
236
|
+
* and never hides a puff behind it. Culling off, because a blade seen from
|
|
237
|
+
* behind is exactly as valid as one seen from the front.
|
|
238
|
+
*/
|
|
239
|
+
drawTo(gl: WebGL2RenderingContext, count: number): void {
|
|
240
|
+
if (count === 0) return;
|
|
241
|
+
gl.enable(gl.BLEND);
|
|
242
|
+
if (this.blend === 'additive') gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
|
|
243
|
+
else gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
244
|
+
gl.depthMask(false);
|
|
245
|
+
gl.disable(gl.CULL_FACE);
|
|
246
|
+
|
|
247
|
+
gl.bindVertexArray(this.vao);
|
|
248
|
+
gl.drawElementsInstanced(gl.TRIANGLES, PARTICLE_INDICES, gl.UNSIGNED_SHORT, 0, count);
|
|
249
|
+
gl.bindVertexArray(null);
|
|
250
|
+
|
|
251
|
+
gl.enable(gl.CULL_FACE);
|
|
252
|
+
gl.depthMask(true);
|
|
253
|
+
gl.disable(gl.BLEND);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
257
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
258
|
+
this.buffers.length = 0;
|
|
259
|
+
gl.deleteVertexArray(this.vao);
|
|
260
|
+
if (this.ownsProgram) gl.deleteProgram(this.program);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
private send(
|
|
264
|
+
gl: WebGL2RenderingContext,
|
|
265
|
+
buffer: WebGLBuffer,
|
|
266
|
+
data: Float32Array,
|
|
267
|
+
length: number,
|
|
268
|
+
): void {
|
|
269
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
270
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, data, 0, length);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* One attribute buffer. `divisor` 0 is per-vertex, 1 is per-instance — the whole
|
|
275
|
+
* mechanism by which eight vertices draw a thousand particles.
|
|
276
|
+
*/
|
|
277
|
+
private attach(
|
|
278
|
+
gl: WebGL2RenderingContext,
|
|
279
|
+
location: number,
|
|
280
|
+
dataOrFloats: Float32Array | number,
|
|
281
|
+
size: number,
|
|
282
|
+
divisor: number,
|
|
283
|
+
label: string,
|
|
284
|
+
): WebGLBuffer {
|
|
285
|
+
const buffer = gl.createBuffer();
|
|
286
|
+
if (buffer === null) throw new Error(`${label}: createBuffer failed`);
|
|
287
|
+
this.buffers.push(buffer);
|
|
288
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
289
|
+
if (typeof dataOrFloats === 'number') {
|
|
290
|
+
gl.bufferData(gl.ARRAY_BUFFER, dataOrFloats * 4, gl.DYNAMIC_DRAW);
|
|
291
|
+
} else {
|
|
292
|
+
gl.bufferData(gl.ARRAY_BUFFER, dataOrFloats, gl.STATIC_DRAW);
|
|
293
|
+
}
|
|
294
|
+
gl.enableVertexAttribArray(location);
|
|
295
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
296
|
+
gl.vertexAttribDivisor(location, divisor);
|
|
297
|
+
return buffer;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PARTICLE_MOTE_FRAG,
|
|
3
|
+
PARTICLE_SMOKE_FRAG,
|
|
4
|
+
PARTICLE_SPARK_FRAG,
|
|
5
|
+
PARTICLE_VERT,
|
|
6
|
+
} from './shaders/particle.ts';
|
|
7
|
+
import {
|
|
8
|
+
PARTICLE_BINDINGS,
|
|
9
|
+
PARTICLE_MOTE_FRAG_WGSL,
|
|
10
|
+
PARTICLE_SMOKE_FRAG_WGSL,
|
|
11
|
+
PARTICLE_SPARK_FRAG_WGSL,
|
|
12
|
+
PARTICLE_VERT_WGSL,
|
|
13
|
+
} from './shaders/generated/particle.wgsl.ts';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Which particle material a caller wants, by name rather than by source.
|
|
17
|
+
*
|
|
18
|
+
* **The same change `PlumeMaterial` documents, for the same reason.**
|
|
19
|
+
* `ParticleBatchOptions.fragmentSource` was a GLSL string, and a caller-supplied GLSL string
|
|
20
|
+
* is a capability that can only ever exist on WebGL2 — WebGPU has no runtime compiler and this
|
|
21
|
+
* package must never ship one. Naming the material lets each backend resolve what it can
|
|
22
|
+
* compile.
|
|
23
|
+
*
|
|
24
|
+
* **The three are not interchangeable and never were**, which is why the names read as
|
|
25
|
+
* materials rather than as shaders: `erosion` is ignored by the spark and the mote, `coreGain`
|
|
26
|
+
* by the smoke and the mote, and `fog` by the spark and the smoke — and the options already
|
|
27
|
+
* document that. Naming them makes the pairing explicit instead of leaving it to a caller to
|
|
28
|
+
* match a source with the constants that suit it.
|
|
29
|
+
*/
|
|
30
|
+
export type ParticleMaterial = 'smoke' | 'spark' | 'mote';
|
|
31
|
+
|
|
32
|
+
/** Both compilations of one material, and what the generator recorded about each stage. */
|
|
33
|
+
export interface ParticleShaders {
|
|
34
|
+
readonly label: string;
|
|
35
|
+
readonly vertexSource: string;
|
|
36
|
+
readonly fragmentSource: string;
|
|
37
|
+
readonly vertexWgsl: string;
|
|
38
|
+
readonly fragmentWgsl: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Every particle material this engine ships.
|
|
43
|
+
*
|
|
44
|
+
* One table with both compilations, rather than a lookup per backend — a material present in
|
|
45
|
+
* one and absent from the other is the drift the 2026-08-13 rule in `AGENTS.md` prevents.
|
|
46
|
+
*/
|
|
47
|
+
const MATERIALS: Readonly<Record<ParticleMaterial, ParticleShaders>> = {
|
|
48
|
+
smoke: {
|
|
49
|
+
label: 'particle:smoke',
|
|
50
|
+
vertexSource: PARTICLE_VERT,
|
|
51
|
+
fragmentSource: PARTICLE_SMOKE_FRAG,
|
|
52
|
+
vertexWgsl: PARTICLE_VERT_WGSL,
|
|
53
|
+
fragmentWgsl: PARTICLE_SMOKE_FRAG_WGSL,
|
|
54
|
+
},
|
|
55
|
+
spark: {
|
|
56
|
+
label: 'particle:spark',
|
|
57
|
+
vertexSource: PARTICLE_VERT,
|
|
58
|
+
fragmentSource: PARTICLE_SPARK_FRAG,
|
|
59
|
+
vertexWgsl: PARTICLE_VERT_WGSL,
|
|
60
|
+
fragmentWgsl: PARTICLE_SPARK_FRAG_WGSL,
|
|
61
|
+
},
|
|
62
|
+
mote: {
|
|
63
|
+
label: 'particle:mote',
|
|
64
|
+
vertexSource: PARTICLE_VERT,
|
|
65
|
+
fragmentSource: PARTICLE_MOTE_FRAG,
|
|
66
|
+
vertexWgsl: PARTICLE_VERT_WGSL,
|
|
67
|
+
fragmentWgsl: PARTICLE_MOTE_FRAG_WGSL,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** What the generator recorded about the shared vertex stage. */
|
|
72
|
+
export const PARTICLE_VERT_BINDINGS = PARTICLE_BINDINGS.PARTICLE_VERT;
|
|
73
|
+
|
|
74
|
+
/** Resolve a material name, or say which names exist. */
|
|
75
|
+
export function particleShaders(material: ParticleMaterial): ParticleShaders {
|
|
76
|
+
const found = MATERIALS[material];
|
|
77
|
+
if (found === undefined) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`createParticles: unknown particle material "${String(material)}". ` +
|
|
80
|
+
`Known materials: ${Object.keys(MATERIALS).join(', ')}.`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
return found;
|
|
84
|
+
}
|