@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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A ceiling on how many pixels one frame may be, independent of how big the window is.
|
|
3
|
+
*
|
|
4
|
+
* `maxDevicePixelRatio` caps *density* — pixels per CSS pixel — which is the right lever
|
|
5
|
+
* for "is this panel high-DPI" and the wrong one for "how much frame is this". Density
|
|
6
|
+
* held constant, the cost of a frame is still whatever area the player last dragged their
|
|
7
|
+
* window to, and the frame is roughly 90% fragment-bound, so window size is an
|
|
8
|
+
* uncontrolled multiplier on the whole renderer.
|
|
9
|
+
*
|
|
10
|
+
* That is fine right up until it isn't, because vsync quantises the consequence. A frame
|
|
11
|
+
* that fits a 120 Hz slot with 5% to spare and then grows 10% does not run 10% slower; it
|
|
12
|
+
* misses the slot and is shown at 60. Going fullscreen is exactly such a growth — the
|
|
13
|
+
* browser's toolbar was the margin — so the symptom arrives as "fullscreen halves the
|
|
14
|
+
* frame rate", which sounds like a bug in fullscreen and is arithmetic about area.
|
|
15
|
+
*
|
|
16
|
+
* A budget makes that cost bounded and, more usefully, *legible*: a player can move it
|
|
17
|
+
* and watch the frame rate move, which is the same argument that put the resolution lever
|
|
18
|
+
* on the settings screen. Zero means uncapped, for a machine that would rather have the
|
|
19
|
+
* pixels.
|
|
20
|
+
*/
|
|
21
|
+
/** Mutable so the caller can own one and keep `resize` allocation-free. */
|
|
22
|
+
export interface BufferSize {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Fit `width` x `height` under `maxPixels`, preserving aspect, into `out`.
|
|
28
|
+
*
|
|
29
|
+
* Writes rather than returns, because `Renderer.resize` runs every frame and per-frame
|
|
30
|
+
* allocation is forbidden (AGENTS.md). Non-positive and non-finite budgets mean uncapped:
|
|
31
|
+
* this runs in the frame loop, where a corrupt stored setting has to degrade to the old
|
|
32
|
+
* behaviour rather than throw.
|
|
33
|
+
*
|
|
34
|
+
* Scaled by the square root of the ratio, so both axes shrink together and
|
|
35
|
+
* `Renderer.aspect` still describes the shot the camera composed for. Rounded *down*, so
|
|
36
|
+
* the budget is a promise rather than an approximation — the whole point is that a number
|
|
37
|
+
* a player chose is the number they get.
|
|
38
|
+
*/
|
|
39
|
+
export declare function fitToPixelBudget(width: number, height: number, maxPixels: number, out: BufferSize): void;
|
|
40
|
+
/**
|
|
41
|
+
* The size the next frame is drawn at, into `out`.
|
|
42
|
+
*
|
|
43
|
+
* **A locked buffer is handed back exactly, and no cap of any kind touches it.** That is
|
|
44
|
+
* the one rule in here that is not about performance: a lock is a caller naming a size for
|
|
45
|
+
* a reason no quality setting can see — a clip is 1080x1920 whatever anybody's frame rate
|
|
46
|
+
* is, and `Renderer.aspect` follows the lock so the replay's shots are composed for the
|
|
47
|
+
* *file* rather than for the window it is being written from. A budget applied over the
|
|
48
|
+
* top would silently write a file that is not the size it claims and re-frame every shot
|
|
49
|
+
* in it. Pass `dpr` already clamped; unlocked, the CSS box is scaled by it and then fitted
|
|
50
|
+
* under `maxPixels`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function drawingBufferSize(cssWidth: number, cssHeight: number, dpr: number, lockedWidth: number, lockedHeight: number, maxPixels: number, out: BufferSize): void;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A ceiling on how many pixels one frame may be, independent of how big the window is.
|
|
3
|
+
*
|
|
4
|
+
* `maxDevicePixelRatio` caps *density* — pixels per CSS pixel — which is the right lever
|
|
5
|
+
* for "is this panel high-DPI" and the wrong one for "how much frame is this". Density
|
|
6
|
+
* held constant, the cost of a frame is still whatever area the player last dragged their
|
|
7
|
+
* window to, and the frame is roughly 90% fragment-bound, so window size is an
|
|
8
|
+
* uncontrolled multiplier on the whole renderer.
|
|
9
|
+
*
|
|
10
|
+
* That is fine right up until it isn't, because vsync quantises the consequence. A frame
|
|
11
|
+
* that fits a 120 Hz slot with 5% to spare and then grows 10% does not run 10% slower; it
|
|
12
|
+
* misses the slot and is shown at 60. Going fullscreen is exactly such a growth — the
|
|
13
|
+
* browser's toolbar was the margin — so the symptom arrives as "fullscreen halves the
|
|
14
|
+
* frame rate", which sounds like a bug in fullscreen and is arithmetic about area.
|
|
15
|
+
*
|
|
16
|
+
* A budget makes that cost bounded and, more usefully, *legible*: a player can move it
|
|
17
|
+
* and watch the frame rate move, which is the same argument that put the resolution lever
|
|
18
|
+
* on the settings screen. Zero means uncapped, for a machine that would rather have the
|
|
19
|
+
* pixels.
|
|
20
|
+
*/
|
|
21
|
+
/** Smallest drawing buffer worth asking a driver for; zero is a GL error, not a picture. */
|
|
22
|
+
const MIN_SIDE = 2;
|
|
23
|
+
/**
|
|
24
|
+
* Fit `width` x `height` under `maxPixels`, preserving aspect, into `out`.
|
|
25
|
+
*
|
|
26
|
+
* Writes rather than returns, because `Renderer.resize` runs every frame and per-frame
|
|
27
|
+
* allocation is forbidden (AGENTS.md). Non-positive and non-finite budgets mean uncapped:
|
|
28
|
+
* this runs in the frame loop, where a corrupt stored setting has to degrade to the old
|
|
29
|
+
* behaviour rather than throw.
|
|
30
|
+
*
|
|
31
|
+
* Scaled by the square root of the ratio, so both axes shrink together and
|
|
32
|
+
* `Renderer.aspect` still describes the shot the camera composed for. Rounded *down*, so
|
|
33
|
+
* the budget is a promise rather than an approximation — the whole point is that a number
|
|
34
|
+
* a player chose is the number they get.
|
|
35
|
+
*/
|
|
36
|
+
export function fitToPixelBudget(width, height, maxPixels, out) {
|
|
37
|
+
out.width = width;
|
|
38
|
+
out.height = height;
|
|
39
|
+
if (!Number.isFinite(maxPixels) || maxPixels <= 0)
|
|
40
|
+
return;
|
|
41
|
+
const pixels = width * height;
|
|
42
|
+
if (pixels <= maxPixels)
|
|
43
|
+
return;
|
|
44
|
+
const scale = Math.sqrt(maxPixels / pixels);
|
|
45
|
+
out.width = Math.max(MIN_SIDE, Math.floor(width * scale));
|
|
46
|
+
out.height = Math.max(MIN_SIDE, Math.floor(height * scale));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The size the next frame is drawn at, into `out`.
|
|
50
|
+
*
|
|
51
|
+
* **A locked buffer is handed back exactly, and no cap of any kind touches it.** That is
|
|
52
|
+
* the one rule in here that is not about performance: a lock is a caller naming a size for
|
|
53
|
+
* a reason no quality setting can see — a clip is 1080x1920 whatever anybody's frame rate
|
|
54
|
+
* is, and `Renderer.aspect` follows the lock so the replay's shots are composed for the
|
|
55
|
+
* *file* rather than for the window it is being written from. A budget applied over the
|
|
56
|
+
* top would silently write a file that is not the size it claims and re-frame every shot
|
|
57
|
+
* in it. Pass `dpr` already clamped; unlocked, the CSS box is scaled by it and then fitted
|
|
58
|
+
* under `maxPixels`.
|
|
59
|
+
*/
|
|
60
|
+
export function drawingBufferSize(cssWidth, cssHeight, dpr, lockedWidth, lockedHeight, maxPixels, out) {
|
|
61
|
+
if (lockedWidth > 0 && lockedHeight > 0) {
|
|
62
|
+
out.width = lockedWidth;
|
|
63
|
+
out.height = lockedHeight;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
fitToPixelBudget(Math.round(cssWidth * dpr), Math.round(cssHeight * dpr), maxPixels, out);
|
|
67
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1x1 placeholders for sampler slots a pass declares but does not use.
|
|
3
|
+
*
|
|
4
|
+
* A shader's sampler uniforms exist whether or not the feature behind them is switched
|
|
5
|
+
* on: the flat pass declares three directional shadow maps and twelve cubemaps, and a
|
|
6
|
+
* quality profile with shadows off still compiles every one of them. The obvious way to
|
|
7
|
+
* say "there is nothing here" is to bind `null` to the unit, and it is wrong.
|
|
8
|
+
*
|
|
9
|
+
* A sampler bound to no texture is *incomplete*. The GL spec says sampling one yields
|
|
10
|
+
* zero, which sounds like a safe default and is only safe if the sample never executes.
|
|
11
|
+
* The guards in this engine are runtime values — `uShadowStrength <= 0.0`, an index
|
|
12
|
+
* compared against -1 — so a driver is free to fetch the descriptor before it evaluates
|
|
13
|
+
* the branch that would have skipped it. Descriptor fetches are scalar loads, and a
|
|
14
|
+
* descriptor for a texture that does not exist is not guaranteed to point anywhere.
|
|
15
|
+
*
|
|
16
|
+
* On a Radeon RX 9070 XT (RDNA4, Mesa 25.2.8) that read lands outside the process's GPU
|
|
17
|
+
* address space and faults:
|
|
18
|
+
*
|
|
19
|
+
* amdgpu: [gfxhub] page fault ... Faulty UTCL2 client ID: SQC (data)
|
|
20
|
+
* amdgpu: ring gfx_0.0.0 timeout -> Ring gfx_0.0.0 reset -> device wedged
|
|
21
|
+
*
|
|
22
|
+
* The context dies, the compositor stalls for a second or two while the driver resets the
|
|
23
|
+
* card, and nothing in the API reports an error — the page simply loses its context a few
|
|
24
|
+
* seconds in. Binding a real texture costs one 1x1 upload per renderer and removes the
|
|
25
|
+
* question: every declared sampler has something complete behind it, whether the pass
|
|
26
|
+
* reads it or not. three.js keeps an empty texture per target for the same reason.
|
|
27
|
+
*
|
|
28
|
+
* Not a workaround for one card. An incomplete sampler is undefined territory that
|
|
29
|
+
* happens to be survivable on most drivers, and this makes the engine stop relying on
|
|
30
|
+
* that.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* A complete 1x1 texture for any unused `sampler2D` slot.
|
|
34
|
+
*
|
|
35
|
+
* `NEAREST` and `CLAMP_TO_EDGE` because a single texel has no mip chain: leaving the
|
|
36
|
+
* default `LINEAR_MIPMAP_LINEAR` minification filter on a texture with only level 0 makes
|
|
37
|
+
* it incomplete again, which is the exact state this exists to avoid.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createEmptyTexture2D(gl: WebGL2RenderingContext): WebGLTexture;
|
|
40
|
+
/**
|
|
41
|
+
* The same for an unused `sampler2DArray` slot: one layer, one texel.
|
|
42
|
+
*
|
|
43
|
+
* The point-shadow array exists only once a world has said how many lights it has, and a scene is
|
|
44
|
+
* free to draw before it does. One layer rather than the full pool's worth, because nothing reads
|
|
45
|
+
* it: `uPointShadowLayer` is −1 for every light while this is bound, and the layer index never
|
|
46
|
+
* reaches a fetch. It is here to be *complete*, which is the whole subject of this file.
|
|
47
|
+
*
|
|
48
|
+
* White rather than black, matching the one-texel cube the WebGPU side keeps and for its reason:
|
|
49
|
+
* a full-depth texel reads as an occluder at the far plane, so the worst a lookup that should not
|
|
50
|
+
* have happened can do is find nothing in the way. Zeroes would mean an occluder pressed against
|
|
51
|
+
* every lamp, and every surface in the scene in shadow.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createEmptyTexture2DArray(gl: WebGL2RenderingContext): WebGLTexture;
|
|
54
|
+
/**
|
|
55
|
+
* The same for an unused `samplerCube` slot.
|
|
56
|
+
*
|
|
57
|
+
* All six faces are supplied: a cubemap missing any one of them is incomplete however
|
|
58
|
+
* complete the other five are.
|
|
59
|
+
*/
|
|
60
|
+
export declare function createEmptyTextureCube(gl: WebGL2RenderingContext): WebGLTexture;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1x1 placeholders for sampler slots a pass declares but does not use.
|
|
3
|
+
*
|
|
4
|
+
* A shader's sampler uniforms exist whether or not the feature behind them is switched
|
|
5
|
+
* on: the flat pass declares three directional shadow maps and twelve cubemaps, and a
|
|
6
|
+
* quality profile with shadows off still compiles every one of them. The obvious way to
|
|
7
|
+
* say "there is nothing here" is to bind `null` to the unit, and it is wrong.
|
|
8
|
+
*
|
|
9
|
+
* A sampler bound to no texture is *incomplete*. The GL spec says sampling one yields
|
|
10
|
+
* zero, which sounds like a safe default and is only safe if the sample never executes.
|
|
11
|
+
* The guards in this engine are runtime values — `uShadowStrength <= 0.0`, an index
|
|
12
|
+
* compared against -1 — so a driver is free to fetch the descriptor before it evaluates
|
|
13
|
+
* the branch that would have skipped it. Descriptor fetches are scalar loads, and a
|
|
14
|
+
* descriptor for a texture that does not exist is not guaranteed to point anywhere.
|
|
15
|
+
*
|
|
16
|
+
* On a Radeon RX 9070 XT (RDNA4, Mesa 25.2.8) that read lands outside the process's GPU
|
|
17
|
+
* address space and faults:
|
|
18
|
+
*
|
|
19
|
+
* amdgpu: [gfxhub] page fault ... Faulty UTCL2 client ID: SQC (data)
|
|
20
|
+
* amdgpu: ring gfx_0.0.0 timeout -> Ring gfx_0.0.0 reset -> device wedged
|
|
21
|
+
*
|
|
22
|
+
* The context dies, the compositor stalls for a second or two while the driver resets the
|
|
23
|
+
* card, and nothing in the API reports an error — the page simply loses its context a few
|
|
24
|
+
* seconds in. Binding a real texture costs one 1x1 upload per renderer and removes the
|
|
25
|
+
* question: every declared sampler has something complete behind it, whether the pass
|
|
26
|
+
* reads it or not. three.js keeps an empty texture per target for the same reason.
|
|
27
|
+
*
|
|
28
|
+
* Not a workaround for one card. An incomplete sampler is undefined territory that
|
|
29
|
+
* happens to be survivable on most drivers, and this makes the engine stop relying on
|
|
30
|
+
* that.
|
|
31
|
+
*/
|
|
32
|
+
/** Opaque black, which is what a shadow lookup should read where nothing occludes. */
|
|
33
|
+
const ONE_BLACK_TEXEL = new Uint8Array([0, 0, 0, 255]);
|
|
34
|
+
/** Full depth, which is the far plane: an occluder as far away as the light reaches. */
|
|
35
|
+
const ONE_WHITE_TEXEL = new Uint8Array([255]);
|
|
36
|
+
function allocate(gl, label) {
|
|
37
|
+
const texture = gl.createTexture();
|
|
38
|
+
if (texture === null)
|
|
39
|
+
throw new Error(`${label}: createTexture failed`);
|
|
40
|
+
return texture;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A complete 1x1 texture for any unused `sampler2D` slot.
|
|
44
|
+
*
|
|
45
|
+
* `NEAREST` and `CLAMP_TO_EDGE` because a single texel has no mip chain: leaving the
|
|
46
|
+
* default `LINEAR_MIPMAP_LINEAR` minification filter on a texture with only level 0 makes
|
|
47
|
+
* it incomplete again, which is the exact state this exists to avoid.
|
|
48
|
+
*/
|
|
49
|
+
export function createEmptyTexture2D(gl) {
|
|
50
|
+
const texture = allocate(gl, 'emptyTexture2D');
|
|
51
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
52
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, ONE_BLACK_TEXEL);
|
|
53
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
54
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
55
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
56
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
57
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
58
|
+
return texture;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The same for an unused `sampler2DArray` slot: one layer, one texel.
|
|
62
|
+
*
|
|
63
|
+
* The point-shadow array exists only once a world has said how many lights it has, and a scene is
|
|
64
|
+
* free to draw before it does. One layer rather than the full pool's worth, because nothing reads
|
|
65
|
+
* it: `uPointShadowLayer` is −1 for every light while this is bound, and the layer index never
|
|
66
|
+
* reaches a fetch. It is here to be *complete*, which is the whole subject of this file.
|
|
67
|
+
*
|
|
68
|
+
* White rather than black, matching the one-texel cube the WebGPU side keeps and for its reason:
|
|
69
|
+
* a full-depth texel reads as an occluder at the far plane, so the worst a lookup that should not
|
|
70
|
+
* have happened can do is find nothing in the way. Zeroes would mean an occluder pressed against
|
|
71
|
+
* every lamp, and every surface in the scene in shadow.
|
|
72
|
+
*/
|
|
73
|
+
export function createEmptyTexture2DArray(gl) {
|
|
74
|
+
const texture = allocate(gl, 'emptyTexture2DArray');
|
|
75
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
|
|
76
|
+
gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.R8, 1, 1, 1);
|
|
77
|
+
gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, 1, 1, 1, gl.RED, gl.UNSIGNED_BYTE, ONE_WHITE_TEXEL);
|
|
78
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
79
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
80
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
81
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
82
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
83
|
+
return texture;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The same for an unused `samplerCube` slot.
|
|
87
|
+
*
|
|
88
|
+
* All six faces are supplied: a cubemap missing any one of them is incomplete however
|
|
89
|
+
* complete the other five are.
|
|
90
|
+
*/
|
|
91
|
+
export function createEmptyTextureCube(gl) {
|
|
92
|
+
const texture = allocate(gl, 'emptyTextureCube');
|
|
93
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);
|
|
94
|
+
for (let face = 0; face < 6; face++) {
|
|
95
|
+
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, ONE_BLACK_TEXEL);
|
|
96
|
+
}
|
|
97
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
98
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
99
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
100
|
+
gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
101
|
+
gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);
|
|
102
|
+
return texture;
|
|
103
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Every probe in a grid as one array texture, and the scratch a bake fills it through. */
|
|
2
|
+
/**
|
|
3
|
+
* What one level of one layer is for, since the chain carries two different integrals.
|
|
4
|
+
*
|
|
5
|
+
* Levels up to `ggxMaxLevel` are the reflection, convolved against the GGX lobe at the roughness
|
|
6
|
+
* `roughnessForLevel` gives them. The level above that is the diffuse ambient, convolved against
|
|
7
|
+
* the cosine. They are the same pass with a different weight, and telling them apart is a uniform.
|
|
8
|
+
*/
|
|
9
|
+
export type ProbeLevelKind = 'radiance' | 'irradiance';
|
|
10
|
+
/**
|
|
11
|
+
* Every probe of a grid as one `TEXTURE_2D_ARRAY` of octahedral maps.
|
|
12
|
+
*
|
|
13
|
+
* **One binding for any number of probes, which is the whole design.** GLSL ES cannot index a
|
|
14
|
+
* sampler array with a non-constant expression, so a grid of cubes would need a `samplerCube` each
|
|
15
|
+
* and a branch chain over them — the shape twelve point-shadow cubemaps had before
|
|
16
|
+
* `pointShadowArray.ts`, and the reason that file exists. A layer index has no such limit.
|
|
17
|
+
*
|
|
18
|
+
* **It replaces the `samplerCube` rather than joining it.** Fifteen of WebGL2's guaranteed sixteen
|
|
19
|
+
* texture units are spent, and `REFRACT_SCENE_TEXTURE_UNIT`'s comment says what the next sampler
|
|
20
|
+
* has to do about that: fold into an existing binding. This binds where the probe cube used to,
|
|
21
|
+
* and the irradiance level folds the diffuse term in beside the reflection, so the grid costs no
|
|
22
|
+
* units at all and unit 15 stays free.
|
|
23
|
+
*
|
|
24
|
+
* **The chain stops at the irradiance level.** `texStorage3D` may allocate fewer levels than a
|
|
25
|
+
* full chain, so there is nothing above it — a 256 edge is six levels rather than nine, and the
|
|
26
|
+
* levels that would have held one, four and sixteen texels are not allocated at all.
|
|
27
|
+
*/
|
|
28
|
+
export declare class EnvProbeArray {
|
|
29
|
+
/** The array the lit pass samples. Octahedral, one layer a probe, gutter included. */
|
|
30
|
+
readonly texture: WebGLTexture;
|
|
31
|
+
/** Texels a side, including the one-texel gutter `octInsetUv` insets past. */
|
|
32
|
+
readonly edge: number;
|
|
33
|
+
readonly layers: number;
|
|
34
|
+
/** The coarsest level the reflection reaches, which is `uEnvironmentMaxLod`. */
|
|
35
|
+
readonly ggxMaxLevel: number;
|
|
36
|
+
/** The level holding the cosine convolution, one above the reflection's coarsest. */
|
|
37
|
+
readonly irradianceLevel: number;
|
|
38
|
+
private readonly framebuffer;
|
|
39
|
+
/** One flag a layer, because a grid may be baked a probe at a time across frames. */
|
|
40
|
+
private readonly baked;
|
|
41
|
+
private bakedCount;
|
|
42
|
+
/**
|
|
43
|
+
* Set once if the allocation is refused, and never cleared.
|
|
44
|
+
*
|
|
45
|
+
* A grid is an improvement to an appearance rather than a requirement, exactly as one probe was:
|
|
46
|
+
* a device that cannot afford the layers keeps the sky-and-ground gradient and loses nothing
|
|
47
|
+
* else. Sixty-four layers at the default edge is 43.7 MB, which is affordable on the parts this
|
|
48
|
+
* engine targets and is not affordable everywhere.
|
|
49
|
+
*/
|
|
50
|
+
private unusable;
|
|
51
|
+
constructor(gl: WebGL2RenderingContext, edge: number, layers: number, floatColor: boolean);
|
|
52
|
+
/**
|
|
53
|
+
* Convolve one probe's captured cube into one layer, every level of it.
|
|
54
|
+
*
|
|
55
|
+
* **The caller draws, and this owns the target**, which is the split `ReflectionProbe.prefilter`
|
|
56
|
+
* already makes with the pass that convolves: a probe has no business knowing what a shader is,
|
|
57
|
+
* and a pass has no business knowing which layer it is filling.
|
|
58
|
+
*
|
|
59
|
+
* **One draw a level rather than six.** A cube's convolution runs the triangle once per face per
|
|
60
|
+
* level; an octahedral map has no faces, so a level is one draw and a probe's convolution is six
|
|
61
|
+
* times fewer of them than the cube it replaces.
|
|
62
|
+
*
|
|
63
|
+
* **The source is a different texture object from the target and that is not tidiness.** WebGL2's
|
|
64
|
+
* rendering-feedback-loop check is per texture object rather than per image, so a draw that
|
|
65
|
+
* samples the array while any layer of it is attached is `INVALID_OPERATION` — on a layer it does
|
|
66
|
+
* not even write. `pointShadowArray.ts` records paying for this on a probe before that file
|
|
67
|
+
* existed. Here the source is the scratch cube and the target is the array, so it cannot arise.
|
|
68
|
+
*/
|
|
69
|
+
convolve(gl: WebGL2RenderingContext, layer: number, run: (level: number, roughness: number, kind: ProbeLevelKind) => void): void;
|
|
70
|
+
/**
|
|
71
|
+
* Whether the shader may sample this, which needs **every** layer filled.
|
|
72
|
+
*
|
|
73
|
+
* A grid baked a probe a frame passes through a state where some layers hold whatever the driver
|
|
74
|
+
* left in them, and a fragment blending eight corners reads four of those. The gate is therefore
|
|
75
|
+
* the whole grid rather than any part of it — the same rule one probe already had, where
|
|
76
|
+
* `uEnvironmentEnabled` stayed at zero until a bake finished, for the same reason: a car
|
|
77
|
+
* mirroring uninitialised memory is worse than a car mirroring a gradient.
|
|
78
|
+
*/
|
|
79
|
+
get ready(): boolean;
|
|
80
|
+
/** How many layers have been convolved, for a caller pacing a bake across frames. */
|
|
81
|
+
get filled(): number;
|
|
82
|
+
/** Whether this allocated at all. False means the scene renders without a grid. */
|
|
83
|
+
get usable(): boolean;
|
|
84
|
+
dispose(gl: WebGL2RenderingContext): void;
|
|
85
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** Every probe in a grid as one array texture, and the scratch a bake fills it through. */
|
|
2
|
+
import { ggxMaxLevelFor, irradianceLevelFor, roughnessForLevel } from './prefilterEnvMap.js';
|
|
3
|
+
/**
|
|
4
|
+
* Every probe of a grid as one `TEXTURE_2D_ARRAY` of octahedral maps.
|
|
5
|
+
*
|
|
6
|
+
* **One binding for any number of probes, which is the whole design.** GLSL ES cannot index a
|
|
7
|
+
* sampler array with a non-constant expression, so a grid of cubes would need a `samplerCube` each
|
|
8
|
+
* and a branch chain over them — the shape twelve point-shadow cubemaps had before
|
|
9
|
+
* `pointShadowArray.ts`, and the reason that file exists. A layer index has no such limit.
|
|
10
|
+
*
|
|
11
|
+
* **It replaces the `samplerCube` rather than joining it.** Fifteen of WebGL2's guaranteed sixteen
|
|
12
|
+
* texture units are spent, and `REFRACT_SCENE_TEXTURE_UNIT`'s comment says what the next sampler
|
|
13
|
+
* has to do about that: fold into an existing binding. This binds where the probe cube used to,
|
|
14
|
+
* and the irradiance level folds the diffuse term in beside the reflection, so the grid costs no
|
|
15
|
+
* units at all and unit 15 stays free.
|
|
16
|
+
*
|
|
17
|
+
* **The chain stops at the irradiance level.** `texStorage3D` may allocate fewer levels than a
|
|
18
|
+
* full chain, so there is nothing above it — a 256 edge is six levels rather than nine, and the
|
|
19
|
+
* levels that would have held one, four and sixteen texels are not allocated at all.
|
|
20
|
+
*/
|
|
21
|
+
export class EnvProbeArray {
|
|
22
|
+
/** The array the lit pass samples. Octahedral, one layer a probe, gutter included. */
|
|
23
|
+
texture;
|
|
24
|
+
/** Texels a side, including the one-texel gutter `octInsetUv` insets past. */
|
|
25
|
+
edge;
|
|
26
|
+
layers;
|
|
27
|
+
/** The coarsest level the reflection reaches, which is `uEnvironmentMaxLod`. */
|
|
28
|
+
ggxMaxLevel;
|
|
29
|
+
/** The level holding the cosine convolution, one above the reflection's coarsest. */
|
|
30
|
+
irradianceLevel;
|
|
31
|
+
framebuffer;
|
|
32
|
+
/** One flag a layer, because a grid may be baked a probe at a time across frames. */
|
|
33
|
+
baked;
|
|
34
|
+
bakedCount = 0;
|
|
35
|
+
/**
|
|
36
|
+
* Set once if the allocation is refused, and never cleared.
|
|
37
|
+
*
|
|
38
|
+
* A grid is an improvement to an appearance rather than a requirement, exactly as one probe was:
|
|
39
|
+
* a device that cannot afford the layers keeps the sky-and-ground gradient and loses nothing
|
|
40
|
+
* else. Sixty-four layers at the default edge is 43.7 MB, which is affordable on the parts this
|
|
41
|
+
* engine targets and is not affordable everywhere.
|
|
42
|
+
*/
|
|
43
|
+
unusable = false;
|
|
44
|
+
constructor(gl, edge, layers, floatColor) {
|
|
45
|
+
this.edge = edge;
|
|
46
|
+
this.layers = Math.max(1, Math.trunc(layers));
|
|
47
|
+
this.ggxMaxLevel = ggxMaxLevelFor(edge);
|
|
48
|
+
this.irradianceLevel = irradianceLevelFor(edge);
|
|
49
|
+
this.baked = new Uint8Array(this.layers);
|
|
50
|
+
const texture = gl.createTexture();
|
|
51
|
+
if (texture === null)
|
|
52
|
+
throw new Error('EnvProbeArray: createTexture failed');
|
|
53
|
+
this.texture = texture;
|
|
54
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
|
|
55
|
+
/*
|
|
56
|
+
* **Drained once before the allocation, because `getError` reports and clears.** Without this
|
|
57
|
+
* the check below answers for whatever happened earlier in the frame, and a grid would stand
|
|
58
|
+
* down over somebody else's mistake. One call rather than a loop: a context that answers an
|
|
59
|
+
* error forever is a context this would never leave.
|
|
60
|
+
*/
|
|
61
|
+
gl.getError();
|
|
62
|
+
gl.texStorage3D(gl.TEXTURE_2D_ARRAY,
|
|
63
|
+
/* Up to and including the irradiance level, and nothing above it. */
|
|
64
|
+
this.irradianceLevel + 1, floatColor ? gl.RGBA16F : gl.RGBA8, edge, edge, this.layers);
|
|
65
|
+
/*
|
|
66
|
+
* **`LINEAR_MIPMAP_NEAREST`, and the choice is a statement rather than a saving.** A level's
|
|
67
|
+
* gutter is one texel wide, so its inset in normalised coordinates is `1 / edge` and differs
|
|
68
|
+
* between levels; hardware trilinear applies one coordinate to both levels it blends, so one
|
|
69
|
+
* of the two would be read at the wrong inset — by a thirty-second of the map at the top of
|
|
70
|
+
* the chain. The shader fetches two levels at their own insets and mixes them, so the only
|
|
71
|
+
* filtering asked of the hardware is bilinear inside one level.
|
|
72
|
+
*/
|
|
73
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
|
|
74
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
75
|
+
/*
|
|
76
|
+
* Clamped, and the gutter is what makes that correct. An octahedral map's border is a fold
|
|
77
|
+
* rather than an edge, so `CLAMP_TO_EDGE` repeating the last real texel would be wrong by
|
|
78
|
+
* 4.6e-2 in direction; the gutter holds the folded texel and the inset keeps every sample
|
|
79
|
+
* inside it, which is measured in `octahedral.test.ts`.
|
|
80
|
+
*/
|
|
81
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
82
|
+
gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
83
|
+
gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
|
|
84
|
+
if (gl.getError() !== gl.NO_ERROR) {
|
|
85
|
+
this.unusable = true;
|
|
86
|
+
console.warn(`[driftengine] this device would not allocate ${this.layers} environment probe layers at ` +
|
|
87
|
+
`${edge}x${edge}. Reflective surfaces keep the sky-and-ground gradient and diffuse ` +
|
|
88
|
+
'ambient stays whatever the scene set. Nothing else is affected.');
|
|
89
|
+
}
|
|
90
|
+
const framebuffer = gl.createFramebuffer();
|
|
91
|
+
if (framebuffer === null)
|
|
92
|
+
throw new Error('EnvProbeArray: createFramebuffer failed');
|
|
93
|
+
this.framebuffer = framebuffer;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Convolve one probe's captured cube into one layer, every level of it.
|
|
97
|
+
*
|
|
98
|
+
* **The caller draws, and this owns the target**, which is the split `ReflectionProbe.prefilter`
|
|
99
|
+
* already makes with the pass that convolves: a probe has no business knowing what a shader is,
|
|
100
|
+
* and a pass has no business knowing which layer it is filling.
|
|
101
|
+
*
|
|
102
|
+
* **One draw a level rather than six.** A cube's convolution runs the triangle once per face per
|
|
103
|
+
* level; an octahedral map has no faces, so a level is one draw and a probe's convolution is six
|
|
104
|
+
* times fewer of them than the cube it replaces.
|
|
105
|
+
*
|
|
106
|
+
* **The source is a different texture object from the target and that is not tidiness.** WebGL2's
|
|
107
|
+
* rendering-feedback-loop check is per texture object rather than per image, so a draw that
|
|
108
|
+
* samples the array while any layer of it is attached is `INVALID_OPERATION` — on a layer it does
|
|
109
|
+
* not even write. `pointShadowArray.ts` records paying for this on a probe before that file
|
|
110
|
+
* existed. Here the source is the scratch cube and the target is the array, so it cannot arise.
|
|
111
|
+
*/
|
|
112
|
+
convolve(gl, layer, run) {
|
|
113
|
+
if (this.unusable)
|
|
114
|
+
return;
|
|
115
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
116
|
+
for (let level = 0; level <= this.irradianceLevel; level++) {
|
|
117
|
+
/* A level is half the width of the one below it, and the viewport has to say so or the
|
|
118
|
+
triangle covers a quarter of the target and leaves the rest at whatever was there. */
|
|
119
|
+
const size = Math.max(1, this.edge >> level);
|
|
120
|
+
gl.viewport(0, 0, size, size);
|
|
121
|
+
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, this.texture, level, layer);
|
|
122
|
+
if (level === 0 && gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
|
|
123
|
+
this.unusable = true;
|
|
124
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
125
|
+
console.warn('[driftengine] this driver will not render into an environment probe layer, so ' +
|
|
126
|
+
'reflective surfaces keep the sky-and-ground approximation. Nothing else is affected.');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const irradiance = level === this.irradianceLevel;
|
|
130
|
+
run(level, irradiance ? 1 : roughnessForLevel(level, this.ggxMaxLevel), irradiance ? 'irradiance' : 'radiance');
|
|
131
|
+
}
|
|
132
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
133
|
+
if (this.baked[layer] !== 1) {
|
|
134
|
+
this.baked[layer] = 1;
|
|
135
|
+
this.bakedCount++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Whether the shader may sample this, which needs **every** layer filled.
|
|
140
|
+
*
|
|
141
|
+
* A grid baked a probe a frame passes through a state where some layers hold whatever the driver
|
|
142
|
+
* left in them, and a fragment blending eight corners reads four of those. The gate is therefore
|
|
143
|
+
* the whole grid rather than any part of it — the same rule one probe already had, where
|
|
144
|
+
* `uEnvironmentEnabled` stayed at zero until a bake finished, for the same reason: a car
|
|
145
|
+
* mirroring uninitialised memory is worse than a car mirroring a gradient.
|
|
146
|
+
*/
|
|
147
|
+
get ready() {
|
|
148
|
+
return !this.unusable && this.bakedCount === this.layers;
|
|
149
|
+
}
|
|
150
|
+
/** How many layers have been convolved, for a caller pacing a bake across frames. */
|
|
151
|
+
get filled() {
|
|
152
|
+
return this.bakedCount;
|
|
153
|
+
}
|
|
154
|
+
/** Whether this allocated at all. False means the scene renders without a grid. */
|
|
155
|
+
get usable() {
|
|
156
|
+
return !this.unusable;
|
|
157
|
+
}
|
|
158
|
+
dispose(gl) {
|
|
159
|
+
gl.deleteFramebuffer(this.framebuffer);
|
|
160
|
+
gl.deleteTexture(this.texture);
|
|
161
|
+
this.baked.fill(0);
|
|
162
|
+
this.bakedCount = 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** An equirectangular image resampled onto the six faces of a cube. */
|
|
2
|
+
/**
|
|
3
|
+
* The direction a texel stands for, per face.
|
|
4
|
+
*
|
|
5
|
+
* `forward` is the face centre, `basisX` steps across a row and `basisY` down a column, matching
|
|
6
|
+
* `webgpu/probePass.ts`'s `PROBE_FACE_BASIS` exactly — the same table, and it is the same table
|
|
7
|
+
* because getting one sign wrong mirrors a single face, which projects to a plausible-looking
|
|
8
|
+
* wrong answer rather than to an error.
|
|
9
|
+
*
|
|
10
|
+
* **It lived in `irradianceSh.ts` until the spherical-harmonic path was retired**, and it moved
|
|
11
|
+
* here rather than being deleted with it: the capture is still a cube, so a loaded environment
|
|
12
|
+
* still has to know which direction each of its texels stands for. The prefilter's own copy went
|
|
13
|
+
* with the six-face loop, since an octahedral target has no faces at all.
|
|
14
|
+
*/
|
|
15
|
+
export declare const FACE_BASIS: readonly {
|
|
16
|
+
readonly forward: readonly [number, number, number];
|
|
17
|
+
readonly basisX: readonly [number, number, number];
|
|
18
|
+
readonly basisY: readonly [number, number, number];
|
|
19
|
+
}[];
|
|
20
|
+
/** What a decoded `.hdr` looks like, restated structurally so this imports no package. */
|
|
21
|
+
export interface EquirectSource {
|
|
22
|
+
readonly width: number;
|
|
23
|
+
readonly height: number;
|
|
24
|
+
/** `width * height * 3` linear values, row-major from the top. */
|
|
25
|
+
readonly data: Float32Array;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resample an equirectangular environment onto six cube faces.
|
|
29
|
+
*
|
|
30
|
+
* **Backend-neutral, and it produces exactly what the projection already takes.** The output is the
|
|
31
|
+
* shape a bake produces — six `size * size * 4` arrays of linear RGBA in
|
|
32
|
+
* cubemap order — so a loaded environment joins the captured path at the same place a bake does,
|
|
33
|
+
* and everything downstream of the cube is one implementation rather than two.
|
|
34
|
+
*
|
|
35
|
+
* **The face basis is imported rather than restated.** This is the fourth place that table would
|
|
36
|
+
* have appeared, and its failure mode is the one the 2026-08-17 rule is about: a mirrored face
|
|
37
|
+
* projects perfectly well onto a wrong answer, and the last time two copies disagreed it took
|
|
38
|
+
* projecting both backends' cubes onto one shared basis to find a sign in the linear Z band.
|
|
39
|
+
*
|
|
40
|
+
* ## The convention, stated because there is no universal one
|
|
41
|
+
*
|
|
42
|
+
* - **Row 0 is the zenith.** `v = acos(y) / pi`, so the top of the image is `+Y`. Inverting this
|
|
43
|
+
* puts the sky underfoot, and every surface is then lit from below with nothing in the picture
|
|
44
|
+
* to say why.
|
|
45
|
+
* - **The centre column is `-Z`.** `u = 0.5 + atan2(x, -z) / 2pi`, which is the engine's own camera
|
|
46
|
+
* convention — yaw 0 looks toward `-Z` and positive yaw turns toward `+X` — so `+X` lands three
|
|
47
|
+
* quarters of the way across. Choosing the mirror of this passes every brightness check and
|
|
48
|
+
* every sky-is-up check, and shows only as a reflection that turns the wrong way.
|
|
49
|
+
*
|
|
50
|
+
* **What it costs** is bilinear sampling per texel of the destination, once, at load. **What would
|
|
51
|
+
* make it wrong** is a source small enough that the cube is upsampling it — at that point the faces
|
|
52
|
+
* carry interpolation rather than image, and the honest answer is a smaller cube.
|
|
53
|
+
*/
|
|
54
|
+
export declare function equirectToCubeFaces(source: EquirectSource, size: number): Float32Array[];
|