@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,215 @@
|
|
|
1
|
+
/** Photometric profiles packed into one texture a light can index into. */
|
|
2
|
+
|
|
3
|
+
/** What a reader produces, restated structurally so core imports no package. See `readIesProfile`. */
|
|
4
|
+
export interface PhotometricProfile {
|
|
5
|
+
readonly verticalAngles: Float32Array;
|
|
6
|
+
readonly horizontalAngles: Float32Array;
|
|
7
|
+
readonly candela: Float32Array;
|
|
8
|
+
readonly maxCandela: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Columns across the atlas: one row per profile, sampled by vertical angle.
|
|
13
|
+
*
|
|
14
|
+
* **A power of two, and 128 rather than 64 because the interesting part of a real distribution is
|
|
15
|
+
* narrow.** A spot fixture puts its whole falloff inside a few degrees of the beam edge, and at 64
|
|
16
|
+
* columns that edge is two texels wide and reads as a step. What a larger number costs is four
|
|
17
|
+
* kilobytes a profile, which is nothing against the image it replaces.
|
|
18
|
+
*/
|
|
19
|
+
export const IES_ATLAS_WIDTH = 128;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* `planes` rows of intensity per profile, normalised to the profile's peak, indexed by angle.
|
|
23
|
+
*
|
|
24
|
+
* **Resampled to a regular grid here rather than in the reader**, because that is a decision about
|
|
25
|
+
* a texture and not about a file: LM-63 is dense where a distribution changes and sparse where it
|
|
26
|
+
* does not, and a shader cannot sample an irregular table without carrying it.
|
|
27
|
+
*
|
|
28
|
+
* **Asymmetric fixtures keep their horizontal planes as of 2026-08-27.** This function flattened
|
|
29
|
+
* to the first plane and said in its own comment what to reach for instead — "a row per horizontal
|
|
30
|
+
* plane with the light carrying a plane count" — and that is what this is. A street light and a
|
|
31
|
+
* wall washer are the fixtures that are not axially symmetric, and they are exactly the fixtures
|
|
32
|
+
* whose whole point is that they throw more one way than another.
|
|
33
|
+
*
|
|
34
|
+
* **One plane count for the atlas rather than one per profile**, and every profile is padded to
|
|
35
|
+
* it. The shader's row is `profile * planes + plane`; a per-profile count would need a second
|
|
36
|
+
* number in a light's record to divide by, and a light's record is where space is expensive.
|
|
37
|
+
* Padding a symmetric profile repeats its single row, which costs `width` floats a plane — half a
|
|
38
|
+
* kilobyte — against the image an IES profile replaces. **A set with nothing asymmetric in it
|
|
39
|
+
* comes out at one plane and is bit-identical to what this produced before planes existed**, which
|
|
40
|
+
* is what keeps the common case free.
|
|
41
|
+
*
|
|
42
|
+
* **The planes are resampled onto a regular 0-to-360 arc**, for the reason the vertical angles are
|
|
43
|
+
* resampled onto a fixed one: the shader maps an azimuth to a plane by arithmetic and carries no
|
|
44
|
+
* per-profile angle list to search. A file measuring 0 and 180 packed into four planes has its
|
|
45
|
+
* measured values at planes 0 and 2 and the interpolation between them at 1 and 3, which is what a
|
|
46
|
+
* fixture symmetric about its own axis actually throws.
|
|
47
|
+
*
|
|
48
|
+
* **A profile occupies `planes + 1` rows, and the extra one repeats the first.** That is what lets
|
|
49
|
+
* the shader do the whole azimuth blend in **one** fetch, with the texture's own linear filter
|
|
50
|
+
* between adjacent rows: without the wrap row the plane after the last would have to blend back to
|
|
51
|
+
* the first, which a fractional row cannot express — it would reach into the *next profile's*
|
|
52
|
+
* first plane instead. The alternative was two explicit fetches and a `mix`, which was written,
|
|
53
|
+
* measured at **+18,315 gzipped bytes on `core-only`** across the sixteen fragment permutations,
|
|
54
|
+
* and replaced by this. One row a profile is 512 bytes.
|
|
55
|
+
*
|
|
56
|
+
* **Normalised to each profile's own peak** because the shader multiplies it into a light's
|
|
57
|
+
* colour, which already carries the intensity a consumer chose. A profile that also carried
|
|
58
|
+
* absolute candela would multiply the two and make every IES light either black or blinding. The
|
|
59
|
+
* peak is the *profile's*, not the plane's: normalising each plane to itself would make every
|
|
60
|
+
* plane reach 1 and throw away the asymmetry this exists to carry.
|
|
61
|
+
*/
|
|
62
|
+
export function packIesAtlas(
|
|
63
|
+
profiles: readonly PhotometricProfile[],
|
|
64
|
+
width: number = IES_ATLAS_WIDTH,
|
|
65
|
+
): { data: Float32Array; width: number; height: number; planes: number } {
|
|
66
|
+
/*
|
|
67
|
+
* **One row of ones when there is nothing to pack, rather than a zero-height texture.**
|
|
68
|
+
*
|
|
69
|
+
* A sampler declared in the shader must have a complete texture bound whether or not any branch
|
|
70
|
+
* reads it — the argument `emptyTexture.ts` makes — and a zero-height allocation is an
|
|
71
|
+
* `INVALID_VALUE` rather than an empty one. Ones rather than zeros because this value multiplies
|
|
72
|
+
* a light's colour: an all-zero fallback would switch off every light that reached it.
|
|
73
|
+
*/
|
|
74
|
+
if (profiles.length === 0) {
|
|
75
|
+
return { data: new Float32Array(width).fill(1), width, height: 1, planes: 1 };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The widest fixture decides the grid, so no profile is resampled *down* and loses a lobe. */
|
|
79
|
+
let planes = 1;
|
|
80
|
+
for (const profile of profiles) {
|
|
81
|
+
planes = Math.max(planes, profile?.horizontalAngles.length ?? 1);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* The wrap row: `planes + 1` per profile, the last repeating the first. See the note above. */
|
|
85
|
+
const rows = planes + 1;
|
|
86
|
+
const height = profiles.length * rows;
|
|
87
|
+
const data = new Float32Array(width * height);
|
|
88
|
+
for (let index = 0; index < profiles.length; index++) {
|
|
89
|
+
const profile = profiles[index];
|
|
90
|
+
for (let row = 0; row < rows; row++) {
|
|
91
|
+
const at = (index * rows + row) * width;
|
|
92
|
+
if (profile === undefined) {
|
|
93
|
+
data.fill(1, at, at + width);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
/* Row `planes` is plane 0 again, which is what makes the blend wrap rather than bleed. */
|
|
97
|
+
packRow(profile, row % planes, planes, data, at, width);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { data, width, height, planes };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Where a plane of the regular grid falls among the angles a file measured, as a pair and a mix.
|
|
105
|
+
*
|
|
106
|
+
* **Wrapped rather than clamped at the top**, which is the difference between an azimuth and a
|
|
107
|
+
* vertical angle: a fixture measured at 0 and 180 is symmetric about its own axis and 270 degrees
|
|
108
|
+
* is the same as 90, so the plane past the last measurement interpolates back toward the first.
|
|
109
|
+
* Clamping instead would flatten one whole side of every two-plane fixture.
|
|
110
|
+
*
|
|
111
|
+
* A file that measures a full 360 — the last angle equal to the first — is handled by the same
|
|
112
|
+
* arithmetic, because the wrap lands on that duplicate.
|
|
113
|
+
*/
|
|
114
|
+
function planeSpan(
|
|
115
|
+
horizontal: Float32Array,
|
|
116
|
+
plane: number,
|
|
117
|
+
planes: number,
|
|
118
|
+
): { lower: number; upper: number; mix: number } {
|
|
119
|
+
const count = horizontal.length;
|
|
120
|
+
if (count <= 1) return { lower: 0, upper: 0, mix: 0 };
|
|
121
|
+
const azimuth = (plane / planes) * 360;
|
|
122
|
+
|
|
123
|
+
let upper = 0;
|
|
124
|
+
while (upper < count && (horizontal[upper] ?? 0) <= azimuth) upper += 1;
|
|
125
|
+
if (upper === 0) return { lower: 0, upper: 0, mix: 0 };
|
|
126
|
+
if (upper >= count) {
|
|
127
|
+
/* Past the last measured plane: back toward the first, across whatever arc is left. */
|
|
128
|
+
const last = horizontal[count - 1] ?? 0;
|
|
129
|
+
const span = 360 - last + (horizontal[0] ?? 0);
|
|
130
|
+
return {
|
|
131
|
+
lower: count - 1,
|
|
132
|
+
upper: 0,
|
|
133
|
+
mix: span > 0 ? Math.min(1, Math.max(0, (azimuth - last) / span)) : 0,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const a = horizontal[upper - 1] ?? 0;
|
|
137
|
+
const b = horizontal[upper] ?? a;
|
|
138
|
+
return { lower: upper - 1, upper, mix: b > a ? (azimuth - a) / (b - a) : 0 };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* One profile into one row, sampled at `width` even steps across a **fixed 0 to 180 degree arc**.
|
|
143
|
+
*
|
|
144
|
+
* **Fixed rather than the profile's own range, and that is what keeps a light's record to one
|
|
145
|
+
* slot.** A row spanning whatever a file happened to measure would need the light to carry the
|
|
146
|
+
* first angle and the span as well, so the shader could map an angle back into the row — three
|
|
147
|
+
* values where the froxel record has exactly one free. Pinning every row to the same arc makes the
|
|
148
|
+
* lookup `angle / 180`, and the row index is then all a light needs.
|
|
149
|
+
*
|
|
150
|
+
* **Outside the measured range a row holds the nearest measured value**, which is correct rather
|
|
151
|
+
* than merely safe: a downlight measured 0 to 90 emits nothing above the horizontal, and its last
|
|
152
|
+
* sample is already the near-zero that says so. **What would make it wrong** is a file measured
|
|
153
|
+
* over a partial arc that does *not* fall to zero at its end — a fixture with a documented cutoff
|
|
154
|
+
* — where clamping extends its last value across everything beyond. That is a real shape and it is
|
|
155
|
+
* rare, and the tell is a profile whose final candela is a large fraction of its peak.
|
|
156
|
+
*/
|
|
157
|
+
function packRow(
|
|
158
|
+
profile: PhotometricProfile,
|
|
159
|
+
plane: number,
|
|
160
|
+
planes: number,
|
|
161
|
+
out: Float32Array,
|
|
162
|
+
offset: number,
|
|
163
|
+
width: number,
|
|
164
|
+
): void {
|
|
165
|
+
const angles = profile.verticalAngles;
|
|
166
|
+
const count = angles.length;
|
|
167
|
+
const peak = profile.maxCandela > 0 ? profile.maxCandela : 1;
|
|
168
|
+
/* The candela grid is horizontal-major: all vertical angles of the first plane, then the next.
|
|
169
|
+
So a plane is a run of `count` values, and blending two planes is a blend of two runs. */
|
|
170
|
+
const span = planeSpan(profile.horizontalAngles, plane, planes);
|
|
171
|
+
const lowerAt = span.lower * count;
|
|
172
|
+
const upperAt = span.upper * count;
|
|
173
|
+
|
|
174
|
+
for (let column = 0; column < width; column++) {
|
|
175
|
+
/* Texel centres over the whole arc, so column 0 is 0 degrees and the last is 180. */
|
|
176
|
+
const angle = width === 1 ? 0 : (column / (width - 1)) * 180;
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
* Linear between the two measured angles either side. A nearest-neighbour lookup on a table
|
|
180
|
+
* that is sparse in the flat regions produces visible steps exactly where the distribution is
|
|
181
|
+
* smooth, which reads as banding in the light rather than as a sampling choice.
|
|
182
|
+
*/
|
|
183
|
+
let upper = 1;
|
|
184
|
+
while (upper < count && (angles[upper] ?? 0) < angle) upper += 1;
|
|
185
|
+
const lower = Math.max(0, Math.min(upper - 1, count - 1));
|
|
186
|
+
const top = Math.min(upper, count - 1);
|
|
187
|
+
const a = angles[lower] ?? 0;
|
|
188
|
+
const b = angles[top] ?? a;
|
|
189
|
+
const mix = b > a ? Math.min(1, Math.max(0, (angle - a) / (b - a))) : 0;
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* Two interpolations, and the order is not arbitrary: vertical within each of the two planes
|
|
193
|
+
* either side, then horizontal between the two results. Blending the planes first and then
|
|
194
|
+
* sampling would be the same number for a linear grid and is not one for a real fixture,
|
|
195
|
+
* whose vertical lists are the same but whose lobes are not.
|
|
196
|
+
*/
|
|
197
|
+
const lowPlane = interpolate(profile.candela, lowerAt, lower, top, mix);
|
|
198
|
+
const highPlane =
|
|
199
|
+
span.lower === span.upper ? lowPlane : interpolate(profile.candela, upperAt, lower, top, mix);
|
|
200
|
+
out[offset + column] = (lowPlane + (highPlane - lowPlane) * span.mix) / peak;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** One plane's value between two vertical samples, at `at` in the horizontal-major grid. */
|
|
205
|
+
function interpolate(
|
|
206
|
+
candela: Float32Array,
|
|
207
|
+
at: number,
|
|
208
|
+
lower: number,
|
|
209
|
+
upper: number,
|
|
210
|
+
mix: number,
|
|
211
|
+
): number {
|
|
212
|
+
const low = candela[at + lower] ?? 0;
|
|
213
|
+
const high = candela[at + upper] ?? low;
|
|
214
|
+
return low + (high - low) * mix;
|
|
215
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An image's texels, exactly as they were encoded — which a canvas cannot give you.
|
|
3
|
+
*
|
|
4
|
+
* **Every ordinary way of reading an image back in a browser is lossy where alpha varies, and this
|
|
5
|
+
* was measured rather than assumed.** A 2D canvas stores colour *premultiplied*: `drawImage`
|
|
6
|
+
* multiplies each channel by the alpha and `getImageData` divides it back out, so every value
|
|
7
|
+
* round-trips through `round(round(c * a / 255) * 255 / a)`. WebCodecs is no better — Chrome
|
|
8
|
+
* decodes a WebP with alpha to a premultiplied `BGRA` frame, and `VideoFrame.copyTo` un-premultiplies
|
|
9
|
+
* it, arriving at the same arithmetic. Both were run against a lossless WebP whose values are known:
|
|
10
|
+
* worst channel off by **3 of 255**, and every deviation predicted exactly by that expression.
|
|
11
|
+
*
|
|
12
|
+
* The one route that is exact is a texture upload with the unpack flag off and a read back, and
|
|
13
|
+
* that is what this is: 0 of 255 on the same file.
|
|
14
|
+
*
|
|
15
|
+
* **For a picture none of this matters and for data it is a corruption.** The case it was found on
|
|
16
|
+
* is a `.sog` Gaussian capture, whose `sh0` image carries three *codebook indices* in RGB beside an
|
|
17
|
+
* opacity in alpha — so a premultiplying read lands the index several entries away wherever a
|
|
18
|
+
* Gaussian is transparent, and the capture's colours come back tied to its own transparency. Any
|
|
19
|
+
* image used as a lookup rather than as a picture has the same problem.
|
|
20
|
+
*
|
|
21
|
+
* **Here rather than in the package that needed it**, because `AGENTS.md` allows raw WebGL only
|
|
22
|
+
* under `packages/core/src/render/` and this is raw WebGL. `@driftengine/splats` takes a decoder as
|
|
23
|
+
* a parameter for exactly this reason and a consumer hands it this one.
|
|
24
|
+
*
|
|
25
|
+
* **What it costs, stated because the driver says it out loud**: `readPixels` synchronises the
|
|
26
|
+
* pipeline, and Chrome logs *"GPU stall due to ReadPixels"* once per image. That is the price of
|
|
27
|
+
* exactness and it is paid at load rather than per frame — five stalls for a Gaussian capture,
|
|
28
|
+
* none afterwards. Nothing here belongs in a frame, and `AGENTS.md`'s rule about the hot path is
|
|
29
|
+
* the reason this is a loader and not a per-frame utility.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** One decoded image: 8-bit RGBA, row-major from the top left, unpremultiplied. */
|
|
33
|
+
export interface ImageTexels {
|
|
34
|
+
readonly width: number;
|
|
35
|
+
readonly height: number;
|
|
36
|
+
readonly rgba: Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** What turns an encoded image's bytes into texels. */
|
|
40
|
+
export type ImageTexelDecoder = (bytes: Uint8Array, type?: string) => Promise<ImageTexels>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A decoder that reads texels back exactly, over a context of its own.
|
|
44
|
+
*
|
|
45
|
+
* **One context for every image it decodes**, created on the first call and kept: a WebGL context
|
|
46
|
+
* is a scarce resource — browsers cap them somewhere around sixteen — and one per image is a
|
|
47
|
+
* capture that stops decoding partway through with a context-lost warning.
|
|
48
|
+
*
|
|
49
|
+
* `preserveDrawingBuffer` is not set and nothing is ever drawn: the texture is attached to a
|
|
50
|
+
* framebuffer and read, which is the whole pipeline. `antialias: false` and `depth: false` because
|
|
51
|
+
* neither is allocated for a path that rasterises nothing.
|
|
52
|
+
*/
|
|
53
|
+
export function createImageTexelDecoder(): ImageTexelDecoder {
|
|
54
|
+
let gl: WebGL2RenderingContext | null = null;
|
|
55
|
+
let texture: WebGLTexture | null = null;
|
|
56
|
+
let framebuffer: WebGLFramebuffer | null = null;
|
|
57
|
+
|
|
58
|
+
return async (bytes: Uint8Array, type = 'image/webp'): Promise<ImageTexels> => {
|
|
59
|
+
const bitmap = await createImageBitmap(new Blob([bytes as unknown as BlobPart], { type }), {
|
|
60
|
+
/* Both off, and both matter. Premultiplying here is the loss this module exists to avoid;
|
|
61
|
+
a colour-space conversion would rewrite values that are not colours at all. */
|
|
62
|
+
premultiplyAlpha: 'none',
|
|
63
|
+
colorSpaceConversion: 'none',
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (gl === null) {
|
|
67
|
+
const canvas =
|
|
68
|
+
typeof OffscreenCanvas === 'undefined'
|
|
69
|
+
? (document.createElement('canvas') as HTMLCanvasElement)
|
|
70
|
+
: new OffscreenCanvas(1, 1);
|
|
71
|
+
gl = canvas.getContext('webgl2', {
|
|
72
|
+
alpha: true,
|
|
73
|
+
antialias: false,
|
|
74
|
+
depth: false,
|
|
75
|
+
stencil: false,
|
|
76
|
+
}) as WebGL2RenderingContext | null;
|
|
77
|
+
if (gl === null) {
|
|
78
|
+
bitmap.close();
|
|
79
|
+
throw new Error(
|
|
80
|
+
'createImageTexelDecoder: no WebGL2 context, and no other browser API reads an ' +
|
|
81
|
+
'image back without premultiplying it. Supply a decoder of your own.',
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
texture = gl.createTexture();
|
|
85
|
+
framebuffer = gl.createFramebuffer();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const width = bitmap.width;
|
|
89
|
+
const height = bitmap.height;
|
|
90
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
91
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
92
|
+
gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
|
|
93
|
+
gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
|
|
94
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, bitmap);
|
|
95
|
+
bitmap.close();
|
|
96
|
+
|
|
97
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
98
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
99
|
+
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
100
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
101
|
+
throw new Error('createImageTexelDecoder: this driver will not read back an RGBA8 texture.');
|
|
102
|
+
}
|
|
103
|
+
const rgba = new Uint8Array(width * height * 4);
|
|
104
|
+
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, rgba);
|
|
105
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
106
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
107
|
+
return { width, height, rgba };
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { MeshData } from './mesh.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One base mesh drawn many times in a single call.
|
|
5
|
+
*
|
|
6
|
+
* A field of grass is tens of thousands of copies of the same few triangles.
|
|
7
|
+
* Submitted individually that is tens of thousands of draw calls, which is the
|
|
8
|
+
* one thing a browser renderer cannot absorb; as instances it is one call and
|
|
9
|
+
* the GPU does the rest. This is what makes "dress the world" affordable at all.
|
|
10
|
+
*
|
|
11
|
+
* Per-instance attributes advance once per instance rather than once per vertex
|
|
12
|
+
* (`vertexAttribDivisor`), so the base mesh is uploaded once and never again.
|
|
13
|
+
*/
|
|
14
|
+
export interface InstanceData {
|
|
15
|
+
/** 3 floats each: world position. */
|
|
16
|
+
readonly positions: Float32Array;
|
|
17
|
+
/** 2 floats each: uniform scale, then yaw in radians. */
|
|
18
|
+
readonly scaleAndYaw: Float32Array;
|
|
19
|
+
/** 3 floats each: multiplied into the base mesh's colour. */
|
|
20
|
+
readonly tints: Float32Array;
|
|
21
|
+
/**
|
|
22
|
+
* 3 floats each: how far this instance bends, how much the gust moves it,
|
|
23
|
+
* and a phase offset.
|
|
24
|
+
*
|
|
25
|
+
* Per instance rather than global so a field does not sway in lockstep —
|
|
26
|
+
* uniform motion is the single clearest sign that foliage is a texture with
|
|
27
|
+
* an animation on it rather than many separate plants.
|
|
28
|
+
*/
|
|
29
|
+
readonly windResponse: Float32Array;
|
|
30
|
+
readonly capacity: number;
|
|
31
|
+
/** How many instances are live; the rest of the buffer is ignored. */
|
|
32
|
+
count: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function createInstanceData(capacity: number): InstanceData {
|
|
36
|
+
return {
|
|
37
|
+
positions: new Float32Array(capacity * 3),
|
|
38
|
+
scaleAndYaw: new Float32Array(capacity * 2),
|
|
39
|
+
tints: new Float32Array(capacity * 3),
|
|
40
|
+
windResponse: new Float32Array(capacity * 3),
|
|
41
|
+
capacity,
|
|
42
|
+
count: 0,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function writeInstance(
|
|
47
|
+
data: InstanceData,
|
|
48
|
+
index: number,
|
|
49
|
+
x: number,
|
|
50
|
+
y: number,
|
|
51
|
+
z: number,
|
|
52
|
+
scale: number,
|
|
53
|
+
yaw: number,
|
|
54
|
+
tintR: number,
|
|
55
|
+
tintG: number,
|
|
56
|
+
tintB: number,
|
|
57
|
+
bend: number,
|
|
58
|
+
flutter: number,
|
|
59
|
+
phase: number,
|
|
60
|
+
): void {
|
|
61
|
+
if (index < 0 || index >= data.capacity) {
|
|
62
|
+
throw new Error(`Instance ${index} is outside capacity ${data.capacity}`);
|
|
63
|
+
}
|
|
64
|
+
const p = index * 3;
|
|
65
|
+
data.positions[p] = x;
|
|
66
|
+
data.positions[p + 1] = y;
|
|
67
|
+
data.positions[p + 2] = z;
|
|
68
|
+
|
|
69
|
+
const s = index * 2;
|
|
70
|
+
data.scaleAndYaw[s] = scale;
|
|
71
|
+
data.scaleAndYaw[s + 1] = yaw;
|
|
72
|
+
|
|
73
|
+
data.tints[p] = tintR;
|
|
74
|
+
data.tints[p + 1] = tintG;
|
|
75
|
+
data.tints[p + 2] = tintB;
|
|
76
|
+
|
|
77
|
+
data.windResponse[p] = bend;
|
|
78
|
+
data.windResponse[p + 1] = flutter;
|
|
79
|
+
data.windResponse[p + 2] = phase;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export class InstancedMesh {
|
|
83
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
84
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
85
|
+
private readonly indexCount: number;
|
|
86
|
+
private readonly positionBuffer: WebGLBuffer;
|
|
87
|
+
private readonly scaleBuffer: WebGLBuffer;
|
|
88
|
+
private readonly tintBuffer: WebGLBuffer;
|
|
89
|
+
private readonly windBuffer: WebGLBuffer;
|
|
90
|
+
|
|
91
|
+
constructor(gl: WebGL2RenderingContext, base: MeshData, capacity: number) {
|
|
92
|
+
/*
|
|
93
|
+
* **Refused rather than dropped.** The per-vertex channel sits at location 13, which this path
|
|
94
|
+
* spends on `aInstanceModel2` — eleven base attributes plus five per-instance is exactly the
|
|
95
|
+
* sixteen WebGL2 guarantees, so there is nothing left to put it in. Drawing the mesh anyway
|
|
96
|
+
* would read the absent-attribute constant and produce a plausible picture: leaves that never
|
|
97
|
+
* move, a cave face at full sun, a pane at full opacity, with nothing anywhere saying why.
|
|
98
|
+
* That is the silent no-op `AGENTS.md` forbids, so it throws at construction instead.
|
|
99
|
+
*
|
|
100
|
+
* **The escape hatch is written down and untaken**: the instance tint could ride in the `w`
|
|
101
|
+
* lanes of the four model columns, which an affine matrix leaves unused, freeing location 15
|
|
102
|
+
* — at the cost of narrowing instance transforms to affine and making a projective one
|
|
103
|
+
* silently wrong. Not paid for yet, because the obvious instanced case for sway is a field of
|
|
104
|
+
* vegetation and `ScatterBatch` already draws that with wind of its own. A consumer filing
|
|
105
|
+
* instanced geometry that needs a lane is what reverses it.
|
|
106
|
+
*/
|
|
107
|
+
if (base.channel !== undefined) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
'InstancedMesh: this mesh carries a per-vertex channel, which needs attribute location ' +
|
|
110
|
+
'13, and an instanced draw already spends 11 through 15 on its transform and tint. ' +
|
|
111
|
+
'Draw it as an ordinary mesh, or drop the channel — the sway, sky and alpha lanes ' +
|
|
112
|
+
'cannot reach an instanced pipeline.',
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
const vao = gl.createVertexArray();
|
|
116
|
+
if (vao === null) throw new Error('InstancedMesh: createVertexArray failed');
|
|
117
|
+
this.vao = vao;
|
|
118
|
+
gl.bindVertexArray(vao);
|
|
119
|
+
|
|
120
|
+
const make = (): WebGLBuffer => {
|
|
121
|
+
const buffer = gl.createBuffer();
|
|
122
|
+
if (buffer === null) throw new Error('InstancedMesh: createBuffer failed');
|
|
123
|
+
this.buffers.push(buffer);
|
|
124
|
+
return buffer;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// Base mesh: divisor 0, so these advance per vertex as usual.
|
|
128
|
+
const attach = (data: Float32Array, location: number, size: number): void => {
|
|
129
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, make());
|
|
130
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
131
|
+
gl.enableVertexAttribArray(location);
|
|
132
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
133
|
+
};
|
|
134
|
+
attach(base.positions, 0, 3);
|
|
135
|
+
attach(base.normals, 1, 3);
|
|
136
|
+
attach(base.colors, 2, 3);
|
|
137
|
+
|
|
138
|
+
const indexBuffer = make();
|
|
139
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
140
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, base.indices, gl.STATIC_DRAW);
|
|
141
|
+
this.indexCount = base.indices.length;
|
|
142
|
+
|
|
143
|
+
// Per-instance: divisor 1, so each advances once per copy rather than once
|
|
144
|
+
// per vertex. Sized to capacity now and rewritten later, because resizing a
|
|
145
|
+
// buffer mid-frame is a stall.
|
|
146
|
+
const instanced = (location: number, size: number): WebGLBuffer => {
|
|
147
|
+
const buffer = make();
|
|
148
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
149
|
+
gl.bufferData(gl.ARRAY_BUFFER, capacity * size * 4, gl.DYNAMIC_DRAW);
|
|
150
|
+
gl.enableVertexAttribArray(location);
|
|
151
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
152
|
+
gl.vertexAttribDivisor(location, 1);
|
|
153
|
+
return buffer;
|
|
154
|
+
};
|
|
155
|
+
this.positionBuffer = instanced(3, 3);
|
|
156
|
+
this.scaleBuffer = instanced(4, 2);
|
|
157
|
+
this.tintBuffer = instanced(5, 3);
|
|
158
|
+
this.windBuffer = instanced(6, 3);
|
|
159
|
+
|
|
160
|
+
gl.bindVertexArray(null);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Upload placement. Called at load; scatter does not move once placed. */
|
|
164
|
+
upload(gl: WebGL2RenderingContext, data: InstanceData): void {
|
|
165
|
+
const put = (buffer: WebGLBuffer, values: Float32Array, perInstance: number): void => {
|
|
166
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
167
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, values.subarray(0, data.count * perInstance));
|
|
168
|
+
};
|
|
169
|
+
put(this.positionBuffer, data.positions, 3);
|
|
170
|
+
put(this.scaleBuffer, data.scaleAndYaw, 2);
|
|
171
|
+
put(this.tintBuffer, data.tints, 3);
|
|
172
|
+
put(this.windBuffer, data.windResponse, 3);
|
|
173
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
draw(gl: WebGL2RenderingContext, count: number): void {
|
|
177
|
+
if (count <= 0) return;
|
|
178
|
+
gl.bindVertexArray(this.vao);
|
|
179
|
+
gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0, count);
|
|
180
|
+
gl.bindVertexArray(null);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
184
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
185
|
+
gl.deleteVertexArray(this.vao);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One base mesh's per-instance placement and colour.
|
|
3
|
+
*
|
|
4
|
+
* **Many copies of one mesh are one draw and one material.** A street of thirty cars of five
|
|
5
|
+
* models is five draws rather than thirty, and — the half that is easy to miss — five *material*
|
|
6
|
+
* changes rather than thirty, which on the WebGPU backend is the scarcer of the two.
|
|
7
|
+
*
|
|
8
|
+
* Distinct from `InstanceData`, which `createScatter` takes, and deliberately not merged with it:
|
|
9
|
+
* a scatter instance carries a uniform scale, a yaw and a wind response, because it describes a
|
|
10
|
+
* plant. This one carries a full transform, because a vehicle pitches and rolls on its suspension
|
|
11
|
+
* and a yaw cannot say so.
|
|
12
|
+
*
|
|
13
|
+
* **What it gives up** is a matrix per instance where a scatter spends five floats: 76 bytes
|
|
14
|
+
* against 44, and no wind. **What would make it wrong** is a caller wanting per-instance
|
|
15
|
+
* anything else — an opacity, a morph weight — which wants another attribute, and the sixteen
|
|
16
|
+
* WebGL2 guarantees are already spent.
|
|
17
|
+
*/
|
|
18
|
+
export interface MeshInstances {
|
|
19
|
+
/**
|
|
20
|
+
* Sixteen floats each, column-major: one model matrix per instance.
|
|
21
|
+
*
|
|
22
|
+
* The same layout `drawMesh` takes, so a caller that already builds a matrix per object passes
|
|
23
|
+
* what it has rather than decomposing it.
|
|
24
|
+
*/
|
|
25
|
+
readonly models: Float32Array;
|
|
26
|
+
/**
|
|
27
|
+
* Three floats each, multiplied into the base mesh's colour exactly as `drawMesh`'s tint is.
|
|
28
|
+
*
|
|
29
|
+
* White is the identity. A batch whose instances share a colour still spends three floats each
|
|
30
|
+
* — the alternative is a second batch per colour, which is the thing this exists to avoid.
|
|
31
|
+
*/
|
|
32
|
+
readonly tints: Float32Array;
|
|
33
|
+
/** How many instances the arrays hold. Fixed at creation; the buffers are sized from it. */
|
|
34
|
+
readonly capacity: number;
|
|
35
|
+
/** How many are live. The rest of the buffer is neither uploaded nor drawn. */
|
|
36
|
+
count: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Allocate both arrays at `capacity`, empty.
|
|
41
|
+
*
|
|
42
|
+
* Allocated once and rewritten in place, never per frame — the arrays are the caller's to fill
|
|
43
|
+
* and the count is the caller's to set, which is what keeps a frame that redraws a batch
|
|
44
|
+
* allocation-free.
|
|
45
|
+
*/
|
|
46
|
+
export function createMeshInstances(capacity: number): MeshInstances {
|
|
47
|
+
return {
|
|
48
|
+
models: new Float32Array(capacity * 16),
|
|
49
|
+
tints: new Float32Array(capacity * 3),
|
|
50
|
+
capacity,
|
|
51
|
+
count: 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Floats one instance occupies in the interleaved vertex buffer: sixteen of matrix, three of
|
|
57
|
+
* tint, and one of padding.
|
|
58
|
+
*
|
|
59
|
+
* **Padded to twenty so the stride is 80 bytes rather than 76.** A vertex buffer's stride must be
|
|
60
|
+
* a multiple of four on both backends, which 76 already is — the padding is for the *attribute*
|
|
61
|
+
* offsets: the tint sits at byte 64 and a three-float attribute ending at 76 leaves the next
|
|
62
|
+
* instance's first column starting there, which is legal but puts every second instance on an
|
|
63
|
+
* offset no driver aligns well. One wasted float an instance is 4 bytes against 76.
|
|
64
|
+
*/
|
|
65
|
+
export const INSTANCE_FLOATS = 20;
|
|
66
|
+
|
|
67
|
+
/** Bytes one instance occupies. See `INSTANCE_FLOATS`. */
|
|
68
|
+
export const INSTANCE_STRIDE = INSTANCE_FLOATS * 4;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Interleave `count` instances into `out`, matrix then tint, at `INSTANCE_FLOATS` apart.
|
|
72
|
+
*
|
|
73
|
+
* **Interleaved rather than two buffers** so a batch's upload is one `writeBuffer` and an
|
|
74
|
+
* instance's colour sits beside the matrix that places it. Shared by both backends, because
|
|
75
|
+
* which floats go where is a decision and not a binding — the rule this repository draws around
|
|
76
|
+
* `resolveAtmosphere` and `resolvePointLights`.
|
|
77
|
+
*
|
|
78
|
+
* Writes nothing beyond `count`, and allocates nothing: `out` is the caller's staging array.
|
|
79
|
+
*/
|
|
80
|
+
export function packInstances(instances: MeshInstances, out: Float32Array): void {
|
|
81
|
+
const { models, tints } = instances;
|
|
82
|
+
const count = Math.min(instances.count, instances.capacity);
|
|
83
|
+
for (let i = 0; i < count; i += 1) {
|
|
84
|
+
const at = i * INSTANCE_FLOATS;
|
|
85
|
+
const m = i * 16;
|
|
86
|
+
for (let c = 0; c < 16; c += 1) out[at + c] = models[m + c] as number;
|
|
87
|
+
const t = i * 3;
|
|
88
|
+
out[at + 16] = tints[t] as number;
|
|
89
|
+
out[at + 17] = tints[t + 1] as number;
|
|
90
|
+
out[at + 18] = tints[t + 2] as number;
|
|
91
|
+
}
|
|
92
|
+
}
|