@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,201 @@
|
|
|
1
|
+
/** Every probe in a grid as one array texture, and the scratch a bake fills it through. */
|
|
2
|
+
|
|
3
|
+
import { ggxMaxLevelFor, irradianceLevelFor, roughnessForLevel } from './prefilterEnvMap.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* What one level of one layer is for, since the chain carries two different integrals.
|
|
7
|
+
*
|
|
8
|
+
* Levels up to `ggxMaxLevel` are the reflection, convolved against the GGX lobe at the roughness
|
|
9
|
+
* `roughnessForLevel` gives them. The level above that is the diffuse ambient, convolved against
|
|
10
|
+
* the cosine. They are the same pass with a different weight, and telling them apart is a uniform.
|
|
11
|
+
*/
|
|
12
|
+
export type ProbeLevelKind = 'radiance' | 'irradiance';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Every probe of a grid as one `TEXTURE_2D_ARRAY` of octahedral maps.
|
|
16
|
+
*
|
|
17
|
+
* **One binding for any number of probes, which is the whole design.** GLSL ES cannot index a
|
|
18
|
+
* sampler array with a non-constant expression, so a grid of cubes would need a `samplerCube` each
|
|
19
|
+
* and a branch chain over them — the shape twelve point-shadow cubemaps had before
|
|
20
|
+
* `pointShadowArray.ts`, and the reason that file exists. A layer index has no such limit.
|
|
21
|
+
*
|
|
22
|
+
* **It replaces the `samplerCube` rather than joining it.** Fifteen of WebGL2's guaranteed sixteen
|
|
23
|
+
* texture units are spent, and `REFRACT_SCENE_TEXTURE_UNIT`'s comment says what the next sampler
|
|
24
|
+
* has to do about that: fold into an existing binding. This binds where the probe cube used to,
|
|
25
|
+
* and the irradiance level folds the diffuse term in beside the reflection, so the grid costs no
|
|
26
|
+
* units at all and unit 15 stays free.
|
|
27
|
+
*
|
|
28
|
+
* **The chain stops at the irradiance level.** `texStorage3D` may allocate fewer levels than a
|
|
29
|
+
* full chain, so there is nothing above it — a 256 edge is six levels rather than nine, and the
|
|
30
|
+
* levels that would have held one, four and sixteen texels are not allocated at all.
|
|
31
|
+
*/
|
|
32
|
+
export class EnvProbeArray {
|
|
33
|
+
/** The array the lit pass samples. Octahedral, one layer a probe, gutter included. */
|
|
34
|
+
readonly texture: WebGLTexture;
|
|
35
|
+
/** Texels a side, including the one-texel gutter `octInsetUv` insets past. */
|
|
36
|
+
readonly edge: number;
|
|
37
|
+
readonly layers: number;
|
|
38
|
+
/** The coarsest level the reflection reaches, which is `uEnvironmentMaxLod`. */
|
|
39
|
+
readonly ggxMaxLevel: number;
|
|
40
|
+
/** The level holding the cosine convolution, one above the reflection's coarsest. */
|
|
41
|
+
readonly irradianceLevel: number;
|
|
42
|
+
|
|
43
|
+
private readonly framebuffer: WebGLFramebuffer;
|
|
44
|
+
/** One flag a layer, because a grid may be baked a probe at a time across frames. */
|
|
45
|
+
private readonly baked: Uint8Array;
|
|
46
|
+
private bakedCount = 0;
|
|
47
|
+
/**
|
|
48
|
+
* Set once if the allocation is refused, and never cleared.
|
|
49
|
+
*
|
|
50
|
+
* A grid is an improvement to an appearance rather than a requirement, exactly as one probe was:
|
|
51
|
+
* a device that cannot afford the layers keeps the sky-and-ground gradient and loses nothing
|
|
52
|
+
* else. Sixty-four layers at the default edge is 43.7 MB, which is affordable on the parts this
|
|
53
|
+
* engine targets and is not affordable everywhere.
|
|
54
|
+
*/
|
|
55
|
+
private unusable = false;
|
|
56
|
+
|
|
57
|
+
constructor(gl: WebGL2RenderingContext, edge: number, layers: number, floatColor: boolean) {
|
|
58
|
+
this.edge = edge;
|
|
59
|
+
this.layers = Math.max(1, Math.trunc(layers));
|
|
60
|
+
this.ggxMaxLevel = ggxMaxLevelFor(edge);
|
|
61
|
+
this.irradianceLevel = irradianceLevelFor(edge);
|
|
62
|
+
this.baked = new Uint8Array(this.layers);
|
|
63
|
+
|
|
64
|
+
const texture = gl.createTexture();
|
|
65
|
+
if (texture === null) throw new Error('EnvProbeArray: createTexture failed');
|
|
66
|
+
this.texture = texture;
|
|
67
|
+
|
|
68
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
|
|
69
|
+
/*
|
|
70
|
+
* **Drained once before the allocation, because `getError` reports and clears.** Without this
|
|
71
|
+
* the check below answers for whatever happened earlier in the frame, and a grid would stand
|
|
72
|
+
* down over somebody else's mistake. One call rather than a loop: a context that answers an
|
|
73
|
+
* error forever is a context this would never leave.
|
|
74
|
+
*/
|
|
75
|
+
gl.getError();
|
|
76
|
+
gl.texStorage3D(
|
|
77
|
+
gl.TEXTURE_2D_ARRAY,
|
|
78
|
+
/* Up to and including the irradiance level, and nothing above it. */
|
|
79
|
+
this.irradianceLevel + 1,
|
|
80
|
+
floatColor ? gl.RGBA16F : gl.RGBA8,
|
|
81
|
+
edge,
|
|
82
|
+
edge,
|
|
83
|
+
this.layers,
|
|
84
|
+
);
|
|
85
|
+
/*
|
|
86
|
+
* **`LINEAR_MIPMAP_NEAREST`, and the choice is a statement rather than a saving.** A level's
|
|
87
|
+
* gutter is one texel wide, so its inset in normalised coordinates is `1 / edge` and differs
|
|
88
|
+
* between levels; hardware trilinear applies one coordinate to both levels it blends, so one
|
|
89
|
+
* of the two would be read at the wrong inset — by a thirty-second of the map at the top of
|
|
90
|
+
* the chain. The shader fetches two levels at their own insets and mixes them, so the only
|
|
91
|
+
* filtering asked of the hardware is bilinear inside one level.
|
|
92
|
+
*/
|
|
93
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
|
|
94
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
95
|
+
/*
|
|
96
|
+
* Clamped, and the gutter is what makes that correct. An octahedral map's border is a fold
|
|
97
|
+
* rather than an edge, so `CLAMP_TO_EDGE` repeating the last real texel would be wrong by
|
|
98
|
+
* 4.6e-2 in direction; the gutter holds the folded texel and the inset keeps every sample
|
|
99
|
+
* inside it, which is measured in `octahedral.test.ts`.
|
|
100
|
+
*/
|
|
101
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
102
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
103
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
104
|
+
|
|
105
|
+
if (gl.getError() !== gl.NO_ERROR) {
|
|
106
|
+
this.unusable = true;
|
|
107
|
+
console.warn(
|
|
108
|
+
`[driftengine] this device would not allocate ${this.layers} environment probe layers at ` +
|
|
109
|
+
`${edge}x${edge}. Reflective surfaces keep the sky-and-ground gradient and diffuse ` +
|
|
110
|
+
'ambient stays whatever the scene set. Nothing else is affected.',
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const framebuffer = gl.createFramebuffer();
|
|
115
|
+
if (framebuffer === null) throw new Error('EnvProbeArray: createFramebuffer failed');
|
|
116
|
+
this.framebuffer = framebuffer;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Convolve one probe's captured cube into one layer, every level of it.
|
|
121
|
+
*
|
|
122
|
+
* **The caller draws, and this owns the target**, which is the split `ReflectionProbe.prefilter`
|
|
123
|
+
* already makes with the pass that convolves: a probe has no business knowing what a shader is,
|
|
124
|
+
* and a pass has no business knowing which layer it is filling.
|
|
125
|
+
*
|
|
126
|
+
* **One draw a level rather than six.** A cube's convolution runs the triangle once per face per
|
|
127
|
+
* level; an octahedral map has no faces, so a level is one draw and a probe's convolution is six
|
|
128
|
+
* times fewer of them than the cube it replaces.
|
|
129
|
+
*
|
|
130
|
+
* **The source is a different texture object from the target and that is not tidiness.** WebGL2's
|
|
131
|
+
* rendering-feedback-loop check is per texture object rather than per image, so a draw that
|
|
132
|
+
* samples the array while any layer of it is attached is `INVALID_OPERATION` — on a layer it does
|
|
133
|
+
* not even write. `pointShadowArray.ts` records paying for this on a probe before that file
|
|
134
|
+
* existed. Here the source is the scratch cube and the target is the array, so it cannot arise.
|
|
135
|
+
*/
|
|
136
|
+
convolve(
|
|
137
|
+
gl: WebGL2RenderingContext,
|
|
138
|
+
layer: number,
|
|
139
|
+
run: (level: number, roughness: number, kind: ProbeLevelKind) => void,
|
|
140
|
+
): void {
|
|
141
|
+
if (this.unusable) return;
|
|
142
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
143
|
+
for (let level = 0; level <= this.irradianceLevel; level++) {
|
|
144
|
+
/* A level is half the width of the one below it, and the viewport has to say so or the
|
|
145
|
+
triangle covers a quarter of the target and leaves the rest at whatever was there. */
|
|
146
|
+
const size = Math.max(1, this.edge >> level);
|
|
147
|
+
gl.viewport(0, 0, size, size);
|
|
148
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, this.texture, level, layer);
|
|
149
|
+
if (level === 0 && gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
150
|
+
this.unusable = true;
|
|
151
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
152
|
+
console.warn(
|
|
153
|
+
'[driftengine] this driver will not render into an environment probe layer, so ' +
|
|
154
|
+
'reflective surfaces keep the sky-and-ground approximation. Nothing else is affected.',
|
|
155
|
+
);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const irradiance = level === this.irradianceLevel;
|
|
159
|
+
run(
|
|
160
|
+
level,
|
|
161
|
+
irradiance ? 1 : roughnessForLevel(level, this.ggxMaxLevel),
|
|
162
|
+
irradiance ? 'irradiance' : 'radiance',
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
166
|
+
if (this.baked[layer] !== 1) {
|
|
167
|
+
this.baked[layer] = 1;
|
|
168
|
+
this.bakedCount++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Whether the shader may sample this, which needs **every** layer filled.
|
|
174
|
+
*
|
|
175
|
+
* A grid baked a probe a frame passes through a state where some layers hold whatever the driver
|
|
176
|
+
* left in them, and a fragment blending eight corners reads four of those. The gate is therefore
|
|
177
|
+
* the whole grid rather than any part of it — the same rule one probe already had, where
|
|
178
|
+
* `uEnvironmentEnabled` stayed at zero until a bake finished, for the same reason: a car
|
|
179
|
+
* mirroring uninitialised memory is worse than a car mirroring a gradient.
|
|
180
|
+
*/
|
|
181
|
+
get ready(): boolean {
|
|
182
|
+
return !this.unusable && this.bakedCount === this.layers;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** How many layers have been convolved, for a caller pacing a bake across frames. */
|
|
186
|
+
get filled(): number {
|
|
187
|
+
return this.bakedCount;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Whether this allocated at all. False means the scene renders without a grid. */
|
|
191
|
+
get usable(): boolean {
|
|
192
|
+
return !this.unusable;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
196
|
+
gl.deleteFramebuffer(this.framebuffer);
|
|
197
|
+
gl.deleteTexture(this.texture);
|
|
198
|
+
this.baked.fill(0);
|
|
199
|
+
this.bakedCount = 0;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/** An equirectangular image resampled onto the six faces of a cube. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The direction a texel stands for, per face.
|
|
5
|
+
*
|
|
6
|
+
* `forward` is the face centre, `basisX` steps across a row and `basisY` down a column, matching
|
|
7
|
+
* `webgpu/probePass.ts`'s `PROBE_FACE_BASIS` exactly — the same table, and it is the same table
|
|
8
|
+
* because getting one sign wrong mirrors a single face, which projects to a plausible-looking
|
|
9
|
+
* wrong answer rather than to an error.
|
|
10
|
+
*
|
|
11
|
+
* **It lived in `irradianceSh.ts` until the spherical-harmonic path was retired**, and it moved
|
|
12
|
+
* here rather than being deleted with it: the capture is still a cube, so a loaded environment
|
|
13
|
+
* still has to know which direction each of its texels stands for. The prefilter's own copy went
|
|
14
|
+
* with the six-face loop, since an octahedral target has no faces at all.
|
|
15
|
+
*/
|
|
16
|
+
export const FACE_BASIS: readonly {
|
|
17
|
+
readonly forward: readonly [number, number, number];
|
|
18
|
+
readonly basisX: readonly [number, number, number];
|
|
19
|
+
readonly basisY: readonly [number, number, number];
|
|
20
|
+
}[] = [
|
|
21
|
+
{ forward: [1, 0, 0], basisX: [0, 0, -1], basisY: [0, -1, 0] },
|
|
22
|
+
{ forward: [-1, 0, 0], basisX: [0, 0, 1], basisY: [0, -1, 0] },
|
|
23
|
+
{ forward: [0, 1, 0], basisX: [1, 0, 0], basisY: [0, 0, 1] },
|
|
24
|
+
{ forward: [0, -1, 0], basisX: [1, 0, 0], basisY: [0, 0, -1] },
|
|
25
|
+
{ forward: [0, 0, 1], basisX: [1, 0, 0], basisY: [0, -1, 0] },
|
|
26
|
+
{ forward: [0, 0, -1], basisX: [-1, 0, 0], basisY: [0, -1, 0] },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/** What a decoded `.hdr` looks like, restated structurally so this imports no package. */
|
|
30
|
+
export interface EquirectSource {
|
|
31
|
+
readonly width: number;
|
|
32
|
+
readonly height: number;
|
|
33
|
+
/** `width * height * 3` linear values, row-major from the top. */
|
|
34
|
+
readonly data: Float32Array;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Resample an equirectangular environment onto six cube faces.
|
|
39
|
+
*
|
|
40
|
+
* **Backend-neutral, and it produces exactly what the projection already takes.** The output is the
|
|
41
|
+
* shape a bake produces — six `size * size * 4` arrays of linear RGBA in
|
|
42
|
+
* cubemap order — so a loaded environment joins the captured path at the same place a bake does,
|
|
43
|
+
* and everything downstream of the cube is one implementation rather than two.
|
|
44
|
+
*
|
|
45
|
+
* **The face basis is imported rather than restated.** This is the fourth place that table would
|
|
46
|
+
* have appeared, and its failure mode is the one the 2026-08-17 rule is about: a mirrored face
|
|
47
|
+
* projects perfectly well onto a wrong answer, and the last time two copies disagreed it took
|
|
48
|
+
* projecting both backends' cubes onto one shared basis to find a sign in the linear Z band.
|
|
49
|
+
*
|
|
50
|
+
* ## The convention, stated because there is no universal one
|
|
51
|
+
*
|
|
52
|
+
* - **Row 0 is the zenith.** `v = acos(y) / pi`, so the top of the image is `+Y`. Inverting this
|
|
53
|
+
* puts the sky underfoot, and every surface is then lit from below with nothing in the picture
|
|
54
|
+
* to say why.
|
|
55
|
+
* - **The centre column is `-Z`.** `u = 0.5 + atan2(x, -z) / 2pi`, which is the engine's own camera
|
|
56
|
+
* convention — yaw 0 looks toward `-Z` and positive yaw turns toward `+X` — so `+X` lands three
|
|
57
|
+
* quarters of the way across. Choosing the mirror of this passes every brightness check and
|
|
58
|
+
* every sky-is-up check, and shows only as a reflection that turns the wrong way.
|
|
59
|
+
*
|
|
60
|
+
* **What it costs** is bilinear sampling per texel of the destination, once, at load. **What would
|
|
61
|
+
* make it wrong** is a source small enough that the cube is upsampling it — at that point the faces
|
|
62
|
+
* carry interpolation rather than image, and the honest answer is a smaller cube.
|
|
63
|
+
*/
|
|
64
|
+
export function equirectToCubeFaces(source: EquirectSource, size: number): Float32Array[] {
|
|
65
|
+
if (size <= 0) throw new Error(`equirectToCubeFaces: a ${size}-texel face is not buildable`);
|
|
66
|
+
if (source.width <= 0 || source.height <= 0) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
`equirectToCubeFaces: a ${source.width} by ${source.height} source has nothing to sample`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const faces: Float32Array[] = [];
|
|
73
|
+
for (let face = 0; face < FACE_BASIS.length; face++) {
|
|
74
|
+
const basis = FACE_BASIS[face];
|
|
75
|
+
const pixels = new Float32Array(size * size * 4);
|
|
76
|
+
if (basis === undefined) {
|
|
77
|
+
faces.push(pixels);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
for (let y = 0; y < size; y++) {
|
|
81
|
+
/* Texel centres in [-1, 1], the same mapping the projection uses, so the two agree exactly. */
|
|
82
|
+
const v = ((y + 0.5) / size) * 2 - 1;
|
|
83
|
+
for (let x = 0; x < size; x++) {
|
|
84
|
+
const u = ((x + 0.5) / size) * 2 - 1;
|
|
85
|
+
const dx = basis.forward[0] + basis.basisX[0] * u + basis.basisY[0] * v;
|
|
86
|
+
const dy = basis.forward[1] + basis.basisX[1] * u + basis.basisY[1] * v;
|
|
87
|
+
const dz = basis.forward[2] + basis.basisX[2] * u + basis.basisY[2] * v;
|
|
88
|
+
const inverse = 1 / Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
89
|
+
sampleEquirect(
|
|
90
|
+
source,
|
|
91
|
+
dx * inverse,
|
|
92
|
+
dy * inverse,
|
|
93
|
+
dz * inverse,
|
|
94
|
+
pixels,
|
|
95
|
+
(y * size + x) * 4,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
faces.push(pixels);
|
|
100
|
+
}
|
|
101
|
+
return faces;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* One direction, bilinearly sampled out of the source, written as RGBA at `out`.
|
|
106
|
+
*
|
|
107
|
+
* **Wrapped in longitude and clamped in latitude**, which is what the sphere actually does: the
|
|
108
|
+
* seam at `u = 1` meets `u = 0` and is a real join, while the pole is a point and has no neighbour
|
|
109
|
+
* above it. Clamping both would put a visible seam down the back of every environment; wrapping
|
|
110
|
+
* both would sample the far side of the sky at the zenith.
|
|
111
|
+
*/
|
|
112
|
+
function sampleEquirect(
|
|
113
|
+
source: EquirectSource,
|
|
114
|
+
dx: number,
|
|
115
|
+
dy: number,
|
|
116
|
+
dz: number,
|
|
117
|
+
out: Float32Array,
|
|
118
|
+
at: number,
|
|
119
|
+
): void {
|
|
120
|
+
const { width, height, data } = source;
|
|
121
|
+
|
|
122
|
+
const u = 0.5 + Math.atan2(dx, -dz) / (2 * Math.PI);
|
|
123
|
+
const v = Math.acos(Math.min(1, Math.max(-1, dy))) / Math.PI;
|
|
124
|
+
|
|
125
|
+
/* Texel centres again, so a sample at the exact centre of a texel reads that texel and no other. */
|
|
126
|
+
const fx = u * width - 0.5;
|
|
127
|
+
const fy = v * height - 0.5;
|
|
128
|
+
const x0 = Math.floor(fx);
|
|
129
|
+
const y0 = Math.floor(fy);
|
|
130
|
+
const tx = fx - x0;
|
|
131
|
+
const ty = fy - y0;
|
|
132
|
+
|
|
133
|
+
const xa = wrap(x0, width);
|
|
134
|
+
const xb = wrap(x0 + 1, width);
|
|
135
|
+
const ya = clamp(y0, height);
|
|
136
|
+
const yb = clamp(y0 + 1, height);
|
|
137
|
+
|
|
138
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
139
|
+
const aa = data[(ya * width + xa) * 3 + channel] ?? 0;
|
|
140
|
+
const ba = data[(ya * width + xb) * 3 + channel] ?? 0;
|
|
141
|
+
const ab = data[(yb * width + xa) * 3 + channel] ?? 0;
|
|
142
|
+
const bb = data[(yb * width + xb) * 3 + channel] ?? 0;
|
|
143
|
+
const top = aa + (ba - aa) * tx;
|
|
144
|
+
const bottom = ab + (bb - ab) * tx;
|
|
145
|
+
out[at + channel] = top + (bottom - top) * ty;
|
|
146
|
+
}
|
|
147
|
+
/* One, because a cube sampler reads four channels whatever an environment meant by the fourth. */
|
|
148
|
+
out[at + 3] = 1;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Longitude wraps: the image's left edge is its right edge. */
|
|
152
|
+
function wrap(value: number, extent: number): number {
|
|
153
|
+
const wrapped = value % extent;
|
|
154
|
+
return wrapped < 0 ? wrapped + extent : wrapped;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Latitude clamps: there is nothing above the zenith to blend with. */
|
|
158
|
+
function clamp(value: number, extent: number): number {
|
|
159
|
+
return value < 0 ? 0 : value >= extent ? extent - 1 : value;
|
|
160
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A flock's static geometry, held once so both backends draw the same bird.
|
|
3
|
+
*
|
|
4
|
+
* Two triangles a bird, a body quad split into two wings, with a per-vertex weight that is 1 at
|
|
5
|
+
* a wingtip and 0 at the body so only the tips beat. Every bird's path is computed in the vertex
|
|
6
|
+
* shader from its index and the clock, so this is uploaded once and the frame loop does nothing.
|
|
7
|
+
*
|
|
8
|
+
* Shared rather than restated for the reason `waterGrid.ts` was extracted: a second corner table
|
|
9
|
+
* is a second bird, and a mesh that differs by a wing between backends is not something the
|
|
10
|
+
* parity gate can attribute.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Corner positions, in wingspans: tip, body front, body back. */
|
|
14
|
+
export const FLOCK_CORNERS: readonly (readonly [number, number])[] = [
|
|
15
|
+
[-1, 0],
|
|
16
|
+
[0, -0.35],
|
|
17
|
+
[0, 0.35],
|
|
18
|
+
[1, 0],
|
|
19
|
+
[0, 0.35],
|
|
20
|
+
[0, -0.35],
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/** 1 at a wingtip, 0 at the body, so only the tips beat. */
|
|
24
|
+
export const FLOCK_WING: readonly number[] = [1, 0, 0, 1, 0, 0];
|
|
25
|
+
|
|
26
|
+
/** The three static attribute streams a flock is drawn from. */
|
|
27
|
+
export interface FlockGeometry {
|
|
28
|
+
readonly corners: Float32Array;
|
|
29
|
+
readonly wings: Float32Array;
|
|
30
|
+
readonly indices: Float32Array;
|
|
31
|
+
readonly vertexCount: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function buildFlockGeometry(count: number): FlockGeometry {
|
|
35
|
+
if (count <= 0) throw new Error('A flock needs at least one bird.');
|
|
36
|
+
const perBird = FLOCK_CORNERS.length;
|
|
37
|
+
const corners = new Float32Array(count * perBird * 2);
|
|
38
|
+
const wings = new Float32Array(count * perBird);
|
|
39
|
+
const indices = new Float32Array(count * perBird);
|
|
40
|
+
let c = 0;
|
|
41
|
+
let w = 0;
|
|
42
|
+
for (let bird = 0; bird < count; bird++) {
|
|
43
|
+
for (let v = 0; v < perBird; v++) {
|
|
44
|
+
const corner = FLOCK_CORNERS[v] as readonly [number, number];
|
|
45
|
+
corners[c++] = corner[0];
|
|
46
|
+
corners[c++] = corner[1];
|
|
47
|
+
wings[w] = FLOCK_WING[v] ?? 0;
|
|
48
|
+
indices[w] = bird;
|
|
49
|
+
w++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { corners, wings, indices, vertexCount: count * perBird };
|
|
53
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { FrameView } from './frameView.ts';
|
|
2
|
+
import type { Vec3 } from '../math/color.ts';
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
4
|
+
import { FLOCK_FRAG, FLOCK_VERT } from './shaders/flock.ts';
|
|
5
|
+
import { buildFlockGeometry } from './flockGeometry.ts';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Ambient sky life. Entirely GPU-side: the geometry is uploaded once and every
|
|
9
|
+
* bird's path is computed in the vertex shader from its index and the clock.
|
|
10
|
+
*
|
|
11
|
+
* Deliberately not a simulation. Flocking behaviour would be CPU work every
|
|
12
|
+
* frame, forever, for something nobody looks at directly — and the thing it
|
|
13
|
+
* actually buys, a world that carries on without the player, comes from motion
|
|
14
|
+
* and silhouette rather than from correct boids.
|
|
15
|
+
*/
|
|
16
|
+
export interface FlockParams {
|
|
17
|
+
center: Vec3;
|
|
18
|
+
radius: number;
|
|
19
|
+
height: number;
|
|
20
|
+
count: number;
|
|
21
|
+
/** Metres per second along the orbit. */
|
|
22
|
+
speed: number;
|
|
23
|
+
/**
|
|
24
|
+
* Half the wingspan, in metres: a bird measures `2 * scale` from tip to tip.
|
|
25
|
+
*
|
|
26
|
+
* It said "wingspan, roughly", and it is out by a factor of two, which is not roughly.
|
|
27
|
+
* The corner table below puts the tips at plus and minus one before this multiplies
|
|
28
|
+
* them, so a caller asking for a 1.5 m bird is handed a 3 m one.
|
|
29
|
+
*/
|
|
30
|
+
scale: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class FlockRenderer {
|
|
34
|
+
private readonly program: WebGLProgram;
|
|
35
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
36
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
37
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
38
|
+
private readonly vertexCount: number;
|
|
39
|
+
|
|
40
|
+
constructor(gl: WebGL2RenderingContext, count: number) {
|
|
41
|
+
this.program = compileProgram(gl, FLOCK_VERT, FLOCK_FRAG, 'flock');
|
|
42
|
+
this.uniforms = uniformLocations(gl, this.program, 'flockRenderer');
|
|
43
|
+
|
|
44
|
+
/* Built in `flockGeometry.ts`, which is also where the count is validated. */
|
|
45
|
+
const geometry = buildFlockGeometry(count);
|
|
46
|
+
const { corners, wings, indices } = geometry;
|
|
47
|
+
this.vertexCount = geometry.vertexCount;
|
|
48
|
+
|
|
49
|
+
const vao = gl.createVertexArray();
|
|
50
|
+
if (vao === null) throw new Error('FlockRenderer: createVertexArray failed');
|
|
51
|
+
this.vao = vao;
|
|
52
|
+
gl.bindVertexArray(vao);
|
|
53
|
+
|
|
54
|
+
const attach = (data: Float32Array, location: number, size: number): void => {
|
|
55
|
+
const buffer = gl.createBuffer();
|
|
56
|
+
if (buffer === null) throw new Error('FlockRenderer: createBuffer failed');
|
|
57
|
+
this.buffers.push(buffer);
|
|
58
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
59
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
60
|
+
gl.enableVertexAttribArray(location);
|
|
61
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
62
|
+
};
|
|
63
|
+
attach(corners, 0, 2);
|
|
64
|
+
attach(wings, 1, 1);
|
|
65
|
+
attach(indices, 2, 1);
|
|
66
|
+
gl.bindVertexArray(null);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
draw(
|
|
70
|
+
gl: WebGL2RenderingContext,
|
|
71
|
+
camera: FrameView,
|
|
72
|
+
timeSeconds: number,
|
|
73
|
+
params: FlockParams,
|
|
74
|
+
tint: Vec3,
|
|
75
|
+
windX = 0,
|
|
76
|
+
windZ = 0,
|
|
77
|
+
): void {
|
|
78
|
+
const u = this.uniforms;
|
|
79
|
+
gl.useProgram(this.program);
|
|
80
|
+
gl.uniformMatrix4fv(u['uViewProj'] ?? null, false, camera.viewProjection);
|
|
81
|
+
/*
|
|
82
|
+
* No `uCameraPos` here, and the shader no longer declares one. It fed the banking that
|
|
83
|
+
* turned a wing plane toward the viewer, and that was reverted with the rest of the flock
|
|
84
|
+
* work when the shape being reported turned out to be the lighthouse beam rather than a
|
|
85
|
+
* bird. What was left behind was a declaration nothing read and an upload every frame to a
|
|
86
|
+
* location that had stopped existing. See AGENTS.md, 2026-08-10.
|
|
87
|
+
*/
|
|
88
|
+
gl.uniform3fv(u['uCenter'] ?? null, params.center);
|
|
89
|
+
gl.uniform1f(u['uRadius'] ?? null, params.radius);
|
|
90
|
+
gl.uniform1f(u['uHeight'] ?? null, params.height);
|
|
91
|
+
gl.uniform1f(u['uSpeed'] ?? null, params.speed);
|
|
92
|
+
gl.uniform1f(u['uCount'] ?? null, params.count);
|
|
93
|
+
gl.uniform1f(u['uScale'] ?? null, params.scale);
|
|
94
|
+
gl.uniform1f(u['uTime'] ?? null, timeSeconds);
|
|
95
|
+
gl.uniform3fv(u['uTint'] ?? null, tint);
|
|
96
|
+
gl.uniform2f(u['uWind'] ?? null, windX, windZ);
|
|
97
|
+
|
|
98
|
+
// Birds are flat and seen from both sides as they bank.
|
|
99
|
+
gl.disable(gl.CULL_FACE);
|
|
100
|
+
gl.bindVertexArray(this.vao);
|
|
101
|
+
gl.drawArrays(gl.TRIANGLES, 0, this.vertexCount);
|
|
102
|
+
gl.bindVertexArray(null);
|
|
103
|
+
gl.enable(gl.CULL_FACE);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
107
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
108
|
+
gl.deleteVertexArray(this.vao);
|
|
109
|
+
gl.deleteProgram(this.program);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a frame's draws are recorded, without allocating.
|
|
3
|
+
*
|
|
4
|
+
* A recorder is exactly the shape that wants an object per draw, and `AGENTS.md` forbids
|
|
5
|
+
* allocating while a frame is running. So a node is six integers in one `Int32Array` and a
|
|
6
|
+
* draw writes into it and returns: nothing constructed, nothing captured by a closure.
|
|
7
|
+
* `InstanceData` and the particle pools already work this way, so the pattern is established
|
|
8
|
+
* here rather than imported.
|
|
9
|
+
*
|
|
10
|
+
* Growth happens, and it happens where allocation is legal. A frame that records past
|
|
11
|
+
* capacity must not silently drop a draw — that is the failure this is designed against — so
|
|
12
|
+
* it grows, records `highWater`, and the next frame starts large enough for what the last one
|
|
13
|
+
* needed.
|
|
14
|
+
*/
|
|
15
|
+
export const NODE_STRIDE = 6;
|
|
16
|
+
|
|
17
|
+
const VERB = 0;
|
|
18
|
+
const READS = 1;
|
|
19
|
+
const WRITES = 2;
|
|
20
|
+
const STATE = 3;
|
|
21
|
+
const MATRIX = 4;
|
|
22
|
+
/*
|
|
23
|
+
* Slot 5 is reserved for the handle slice the executor will need. It is written as zero
|
|
24
|
+
* until then so the stride does not change when it is used, and every offset above stays
|
|
25
|
+
* where it is.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export interface Arena {
|
|
29
|
+
nodes: Int32Array;
|
|
30
|
+
count: number;
|
|
31
|
+
/** The most nodes any frame has recorded, so growth converges instead of repeating. */
|
|
32
|
+
highWater: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function createArena(capacity: number): Arena {
|
|
36
|
+
return { nodes: new Int32Array(capacity * NODE_STRIDE), count: 0, highWater: 0 };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Empty the arena for a new frame. Keeps the storage; that is the whole point. */
|
|
40
|
+
export function resetArena(arena: Arena): void {
|
|
41
|
+
arena.count = 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function nodeCount(arena: Arena): number {
|
|
45
|
+
return arena.count;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Record one node and return its index. */
|
|
49
|
+
export function recordNode(
|
|
50
|
+
arena: Arena,
|
|
51
|
+
verb: number,
|
|
52
|
+
reads: number,
|
|
53
|
+
writes: number,
|
|
54
|
+
state: number,
|
|
55
|
+
matrix: number,
|
|
56
|
+
): number {
|
|
57
|
+
const at = arena.count;
|
|
58
|
+
const need = (at + 1) * NODE_STRIDE;
|
|
59
|
+
if (need > arena.nodes.length) {
|
|
60
|
+
const grown = new Int32Array(Math.max(need, arena.nodes.length * 2));
|
|
61
|
+
grown.set(arena.nodes);
|
|
62
|
+
arena.nodes = grown;
|
|
63
|
+
}
|
|
64
|
+
const base = at * NODE_STRIDE;
|
|
65
|
+
arena.nodes[base + VERB] = verb;
|
|
66
|
+
arena.nodes[base + READS] = reads;
|
|
67
|
+
arena.nodes[base + WRITES] = writes;
|
|
68
|
+
arena.nodes[base + STATE] = state;
|
|
69
|
+
arena.nodes[base + MATRIX] = matrix;
|
|
70
|
+
arena.count = at + 1;
|
|
71
|
+
if (arena.count > arena.highWater) arena.highWater = arena.count;
|
|
72
|
+
return at;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function nodeVerb(arena: Arena, at: number): number {
|
|
76
|
+
return arena.nodes[at * NODE_STRIDE + VERB] ?? 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function nodeReads(arena: Arena, at: number): number {
|
|
80
|
+
return arena.nodes[at * NODE_STRIDE + READS] ?? 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function nodeWrites(arena: Arena, at: number): number {
|
|
84
|
+
return arena.nodes[at * NODE_STRIDE + WRITES] ?? 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function nodeState(arena: Arena, at: number): number {
|
|
88
|
+
return arena.nodes[at * NODE_STRIDE + STATE] ?? 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function nodeMatrix(arena: Arena, at: number): number {
|
|
92
|
+
return arena.nodes[at * NODE_STRIDE + MATRIX] ?? 0;
|
|
93
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The frame graph's pure half: what a frame touches, how a draw is recorded, and how records
|
|
3
|
+
* become passes.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here imports WebGL or WebGPU. The scheduler is arithmetic, which is what lets the
|
|
6
|
+
* only novel logic in the design be proven by assertion before any renderer is rewritten
|
|
7
|
+
* around it.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately not on the package barrel. Nothing outside `render/` may reach these yet;
|
|
10
|
+
* Phase B is what decides their public shape.
|
|
11
|
+
*/
|
|
12
|
+
export type { FrameResource } from './resources.ts';
|
|
13
|
+
export { FRAME_RESOURCES, RESOURCE_COUNT, maskOf, namesIn, resourceBit } from './resources.ts';
|
|
14
|
+
export type { Arena } from './arena.ts';
|
|
15
|
+
export {
|
|
16
|
+
NODE_STRIDE,
|
|
17
|
+
createArena,
|
|
18
|
+
nodeCount,
|
|
19
|
+
nodeMatrix,
|
|
20
|
+
nodeReads,
|
|
21
|
+
nodeState,
|
|
22
|
+
nodeVerb,
|
|
23
|
+
nodeWrites,
|
|
24
|
+
recordNode,
|
|
25
|
+
resetArena,
|
|
26
|
+
} from './arena.ts';
|
|
27
|
+
export type { ScheduledPass } from './schedule.ts';
|
|
28
|
+
export { schedule } from './schedule.ts';
|
|
29
|
+
export { keptNodes, scratchFor } from './replay.ts';
|