@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,196 @@
|
|
|
1
|
+
import { mat4 } from 'gl-matrix';
|
|
2
|
+
import { decalScissor } from './decalProjector.js';
|
|
3
|
+
import { DEPTH_01_TO_CLIP } from './lightVolumeDraw.js';
|
|
4
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
5
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
|
|
6
|
+
import { SSR_RESOLVE_FRAG } from './shaders/ssrResolve.js';
|
|
7
|
+
import { SSR_TRACE_FRAG } from './shaders/ssrTrace.js';
|
|
8
|
+
/**
|
|
9
|
+
* Screen-space reflection on WebGL2: a scissored trace per surface, then one composite.
|
|
10
|
+
*
|
|
11
|
+
* **The trace writes into a target of its own and that is not an optimisation.** It samples the
|
|
12
|
+
* finished scene colour to find out what a ray hit, so writing into the scene would be a feedback
|
|
13
|
+
* loop — `GL_INVALID_OPERATION` once per draw and undefined rasterisation, which `OitPass` records
|
|
14
|
+
* paying for. One extra full-frame attachment buys the separation, and it also makes several
|
|
15
|
+
* reflective surfaces accumulate as premultiplied layers rather than as independent guesses.
|
|
16
|
+
*
|
|
17
|
+
* **Two passes, and the second is one fetch.** The composite is done by the blend state:
|
|
18
|
+
* `(ONE, ONE_MINUS_SRC_ALPHA)` against premultiplied texels is `over`, so the resolve never samples
|
|
19
|
+
* the colour it is compositing onto either.
|
|
20
|
+
*/
|
|
21
|
+
export class SsrPass {
|
|
22
|
+
gl;
|
|
23
|
+
floatColor;
|
|
24
|
+
trace;
|
|
25
|
+
traceUniforms;
|
|
26
|
+
resolve;
|
|
27
|
+
resolveUniforms;
|
|
28
|
+
vao;
|
|
29
|
+
reflection = null;
|
|
30
|
+
framebuffer = null;
|
|
31
|
+
width = 0;
|
|
32
|
+
height = 0;
|
|
33
|
+
/** `inverse(viewProjection) * DEPTH_01_TO_CLIP`, rebuilt once a frame rather than per surface. */
|
|
34
|
+
depthToWorld = new Float32Array(16);
|
|
35
|
+
scissor = new Int32Array(4);
|
|
36
|
+
constructor(gl,
|
|
37
|
+
/**
|
|
38
|
+
* Whether the scene it reflects is a float target.
|
|
39
|
+
*
|
|
40
|
+
* The reflection buffer matches it. A half-float scene composited through an eight-bit
|
|
41
|
+
* reflection would clip every highlight the reflection carries, which is exactly the part of a
|
|
42
|
+
* scene that shows in a wet floor.
|
|
43
|
+
*/
|
|
44
|
+
floatColor) {
|
|
45
|
+
this.gl = gl;
|
|
46
|
+
this.floatColor = floatColor;
|
|
47
|
+
this.trace = compileProgram(gl, FULLSCREEN_VERT, SSR_TRACE_FRAG, 'ssrTrace');
|
|
48
|
+
this.traceUniforms = uniformLocations(gl, this.trace, 'ssrTrace');
|
|
49
|
+
this.resolve = compileProgram(gl, FULLSCREEN_VERT, SSR_RESOLVE_FRAG, 'ssrResolve');
|
|
50
|
+
this.resolveUniforms = uniformLocations(gl, this.resolve, 'ssrResolve');
|
|
51
|
+
const vao = gl.createVertexArray();
|
|
52
|
+
if (vao === null)
|
|
53
|
+
throw new Error('SsrPass: createVertexArray failed');
|
|
54
|
+
this.vao = vao;
|
|
55
|
+
}
|
|
56
|
+
ensureSize(width, height) {
|
|
57
|
+
const { gl } = this;
|
|
58
|
+
if (this.width === width && this.height === height)
|
|
59
|
+
return;
|
|
60
|
+
this.width = width;
|
|
61
|
+
this.height = height;
|
|
62
|
+
/* Unit 0, chosen rather than inherited: `bindTexture` binds to whichever unit is active, and
|
|
63
|
+
the renderer leaves that wherever its last pass finished. `OitPass` records what leaving it
|
|
64
|
+
there cost — a feedback loop reported once per draw. */
|
|
65
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
66
|
+
if (this.reflection === null)
|
|
67
|
+
this.reflection = gl.createTexture();
|
|
68
|
+
gl.bindTexture(gl.TEXTURE_2D, this.reflection);
|
|
69
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, this.floatColor ? gl.RGBA16F : gl.RGBA8, width, height, 0, gl.RGBA, this.floatColor ? gl.HALF_FLOAT : gl.UNSIGNED_BYTE, null);
|
|
70
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
71
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
72
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
73
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
74
|
+
if (this.framebuffer === null)
|
|
75
|
+
this.framebuffer = gl.createFramebuffer();
|
|
76
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
77
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.reflection, 0);
|
|
78
|
+
/* No depth: the trace decides everything from the depth it *samples*, and an attachment here
|
|
79
|
+
would be one more thing to be caught reading. */
|
|
80
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
81
|
+
/* And released, so nothing carries this target into a sampler of another pass. */
|
|
82
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* March every recorded surface into the reflection buffer.
|
|
86
|
+
*
|
|
87
|
+
* `viewProjection` is the **raw** camera matrix. `DEPTH_01_TO_CLIP` turns a stored depth back
|
|
88
|
+
* into the clip space that matrix was built in, and the trace projects its samples back through
|
|
89
|
+
* the same matrix — pairing either with the clip-corrected one applies the remap twice.
|
|
90
|
+
*/
|
|
91
|
+
traceReflections(queue, scene, depth, viewProjection, eye, width, height, edgeFade) {
|
|
92
|
+
if (queue.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
const { gl } = this;
|
|
95
|
+
const u = this.traceUniforms;
|
|
96
|
+
this.ensureSize(width, height);
|
|
97
|
+
mat4.invert(this.depthToWorld, viewProjection);
|
|
98
|
+
mat4.multiply(this.depthToWorld, this.depthToWorld, DEPTH_01_TO_CLIP);
|
|
99
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
|
|
100
|
+
gl.viewport(0, 0, width, height);
|
|
101
|
+
gl.disable(gl.DEPTH_TEST);
|
|
102
|
+
gl.depthMask(false);
|
|
103
|
+
gl.disable(gl.CULL_FACE);
|
|
104
|
+
/* Cleared whole, then scissored: the resolve reads every pixel and an uncleared one outside
|
|
105
|
+
every box would composite last frame's reflection over this frame's scene. */
|
|
106
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
107
|
+
gl.clearBufferfv(gl.COLOR, 0, [0, 0, 0, 0]);
|
|
108
|
+
gl.enable(gl.BLEND);
|
|
109
|
+
/* Premultiplied `over`, so two overlapping surfaces layer rather than replace. */
|
|
110
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
111
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
112
|
+
gl.useProgram(this.trace);
|
|
113
|
+
gl.bindVertexArray(this.vao);
|
|
114
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
115
|
+
gl.bindTexture(gl.TEXTURE_2D, depth);
|
|
116
|
+
gl.uniform1i(u['uSsrDepth'] ?? null, 0);
|
|
117
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
118
|
+
gl.bindTexture(gl.TEXTURE_2D, scene);
|
|
119
|
+
gl.uniform1i(u['uSsrScene'] ?? null, 1);
|
|
120
|
+
gl.uniformMatrix4fv(u['uSsrDepthToWorld'] ?? null, false, this.depthToWorld);
|
|
121
|
+
/* No Y flip on this backend: `gl.scissor` and the framebuffer both count rows from the bottom,
|
|
122
|
+
which is the space the raw matrix already emits. See `CLIP_Y_FLIP`. */
|
|
123
|
+
gl.uniformMatrix4fv(u['uSsrViewProj'] ?? null, false, viewProjection);
|
|
124
|
+
gl.uniform3f(u['uSsrEye'] ?? null, eye[0] ?? 0, eye[1] ?? 0, eye[2] ?? 0);
|
|
125
|
+
gl.uniform1f(u['uSsrEdgeFade'] ?? null, edgeFade);
|
|
126
|
+
queue.replay((surface) => {
|
|
127
|
+
if (!decalScissor(viewProjection, surface.surfaceToWorld, width, height, false, this.scissor)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
gl.scissor(this.scissor[0] ?? 0, this.scissor[1] ?? 0, this.scissor[2] ?? 0, this.scissor[3] ?? 0);
|
|
131
|
+
gl.uniformMatrix4fv(u['uWorldToSurface'] ?? null, false, surface.worldToSurface);
|
|
132
|
+
gl.uniform3fv(u['uSsrAxis'] ?? null, surface.axis);
|
|
133
|
+
gl.uniform3fv(u['uSsrTint'] ?? null, surface.tint);
|
|
134
|
+
gl.uniform1f(u['uSsrStrength'] ?? null, surface.strength);
|
|
135
|
+
gl.uniform1f(u['uSsrFacingCos'] ?? null, surface.facingCos);
|
|
136
|
+
gl.uniform1f(u['uSsrReach'] ?? null, surface.reachM);
|
|
137
|
+
gl.uniform1f(u['uSsrThickness'] ?? null, surface.thicknessM);
|
|
138
|
+
gl.uniform1f(u['uSsrSteps'] ?? null, surface.steps);
|
|
139
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
140
|
+
});
|
|
141
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
142
|
+
gl.scissor(0, 0, width, height);
|
|
143
|
+
gl.bindVertexArray(null);
|
|
144
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
145
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
146
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
147
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
148
|
+
gl.disable(gl.BLEND);
|
|
149
|
+
gl.depthMask(true);
|
|
150
|
+
gl.enable(gl.DEPTH_TEST);
|
|
151
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
152
|
+
}
|
|
153
|
+
/** Composite what the trace found over whatever framebuffer is bound. */
|
|
154
|
+
resolveReflections() {
|
|
155
|
+
const { gl } = this;
|
|
156
|
+
if (this.reflection === null)
|
|
157
|
+
return;
|
|
158
|
+
gl.disable(gl.DEPTH_TEST);
|
|
159
|
+
gl.depthMask(false);
|
|
160
|
+
gl.disable(gl.CULL_FACE);
|
|
161
|
+
gl.enable(gl.BLEND);
|
|
162
|
+
/* Premultiplied `over`: the trace already multiplied its colour by the coverage it found. */
|
|
163
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
164
|
+
gl.useProgram(this.resolve);
|
|
165
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
166
|
+
gl.bindTexture(gl.TEXTURE_2D, this.reflection);
|
|
167
|
+
gl.uniform1i(this.resolveUniforms['uSsrReflection'] ?? null, 0);
|
|
168
|
+
gl.bindVertexArray(this.vao);
|
|
169
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
170
|
+
gl.bindVertexArray(null);
|
|
171
|
+
/*
|
|
172
|
+
* **Released, and `OitPass` says why at length.** A binding outlives the frame it was made in,
|
|
173
|
+
* so unit 0 would keep the reflection buffer — which the *next* frame then attaches as its own
|
|
174
|
+
* target while a program still declares a sampler on that unit. That is a feedback loop,
|
|
175
|
+
* reported once per draw and rasterising something undefined.
|
|
176
|
+
*/
|
|
177
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
178
|
+
gl.disable(gl.BLEND);
|
|
179
|
+
gl.depthMask(true);
|
|
180
|
+
gl.enable(gl.DEPTH_TEST);
|
|
181
|
+
}
|
|
182
|
+
dispose() {
|
|
183
|
+
const { gl } = this;
|
|
184
|
+
if (this.reflection !== null)
|
|
185
|
+
gl.deleteTexture(this.reflection);
|
|
186
|
+
if (this.framebuffer !== null)
|
|
187
|
+
gl.deleteFramebuffer(this.framebuffer);
|
|
188
|
+
gl.deleteProgram(this.trace);
|
|
189
|
+
gl.deleteProgram(this.resolve);
|
|
190
|
+
gl.deleteVertexArray(this.vao);
|
|
191
|
+
this.reflection = null;
|
|
192
|
+
this.framebuffer = null;
|
|
193
|
+
this.width = 0;
|
|
194
|
+
this.height = 0;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, roughly horizontal sheet, described by the cross-sections it is
|
|
3
|
+
* swept through, and the triangles that cover it.
|
|
4
|
+
*
|
|
5
|
+
* Cross-sections rather than rectangles, because the things this describes
|
|
6
|
+
* follow a route: a channel of water beside a path, the underside of a bridge
|
|
7
|
+
* over it. A chain of independent rectangles laid along a curve leaves a notch
|
|
8
|
+
* at every joint — small, and exactly the kind of small that reads as broken
|
|
9
|
+
* once light is crawling across it. Consecutive spans share their edge, so a
|
|
10
|
+
* curving sheet is closed by construction.
|
|
11
|
+
*
|
|
12
|
+
* Nothing here knows what a sheet is *for*. It takes numbers.
|
|
13
|
+
*/
|
|
14
|
+
/** One cross-section: the two ends of a straight edge across the sheet. */
|
|
15
|
+
export interface SheetSpan {
|
|
16
|
+
x0: number;
|
|
17
|
+
z0: number;
|
|
18
|
+
x1: number;
|
|
19
|
+
z1: number;
|
|
20
|
+
/** Resting height of the sheet at this cross-section. */
|
|
21
|
+
y: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SheetMesh {
|
|
24
|
+
/** Resting position, 3 floats per vertex. A shader may displace it. */
|
|
25
|
+
positions: Float32Array;
|
|
26
|
+
/**
|
|
27
|
+
* Where the vertex sits inside its own sheet, 0..1 along and across.
|
|
28
|
+
*
|
|
29
|
+
* So a shader can dissolve its own boundary. It reaches 0 and 1 exactly at the
|
|
30
|
+
* outermost vertices rather than approaching them, which is the lesson the
|
|
31
|
+
* ocean's rim already paid for: a fade that only nearly closes leaves a hard
|
|
32
|
+
* edge, and a hard edge reads as geometry rather than as water.
|
|
33
|
+
*/
|
|
34
|
+
locals: Float32Array;
|
|
35
|
+
/** Two numbers carried from each sheet onto every one of its vertices. */
|
|
36
|
+
params: Float32Array;
|
|
37
|
+
vertexCount: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cover each sheet in cells no coarser than `cellM`.
|
|
41
|
+
*
|
|
42
|
+
* Vertices are duplicated at cell boundaries rather than shared. That is safe
|
|
43
|
+
* here in a way it would not be in general: every displacement applied to this
|
|
44
|
+
* mesh is a pure function of the resting position, so two vertices at the same
|
|
45
|
+
* place move to the same place and the seam cannot open.
|
|
46
|
+
*
|
|
47
|
+
* `params` is called once per sheet at build time — never per frame — and writes
|
|
48
|
+
* the two floats each of that sheet's vertices carries.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildSheets<T extends {
|
|
51
|
+
spans: readonly SheetSpan[];
|
|
52
|
+
}>(sheets: readonly T[], cellM: number, params: (sheet: T, out: Float32Array) => void): SheetMesh;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, roughly horizontal sheet, described by the cross-sections it is
|
|
3
|
+
* swept through, and the triangles that cover it.
|
|
4
|
+
*
|
|
5
|
+
* Cross-sections rather than rectangles, because the things this describes
|
|
6
|
+
* follow a route: a channel of water beside a path, the underside of a bridge
|
|
7
|
+
* over it. A chain of independent rectangles laid along a curve leaves a notch
|
|
8
|
+
* at every joint — small, and exactly the kind of small that reads as broken
|
|
9
|
+
* once light is crawling across it. Consecutive spans share their edge, so a
|
|
10
|
+
* curving sheet is closed by construction.
|
|
11
|
+
*
|
|
12
|
+
* Nothing here knows what a sheet is *for*. It takes numbers.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* One vertex, bilinearly placed between two cross-sections.
|
|
16
|
+
*
|
|
17
|
+
* @param along 0 at span `a`, 1 at span `b`.
|
|
18
|
+
* @param across 0 at the spans' first end, 1 at their second.
|
|
19
|
+
* @param joint index of `a` within the sheet, and how many joints it has, so the
|
|
20
|
+
* local coordinate measures the whole sheet rather than this piece of it.
|
|
21
|
+
*/
|
|
22
|
+
function emitVertex(into, a, b, along, across, joint, joints) {
|
|
23
|
+
const ax = a.x0 + (a.x1 - a.x0) * across;
|
|
24
|
+
const az = a.z0 + (a.z1 - a.z0) * across;
|
|
25
|
+
const bx = b.x0 + (b.x1 - b.x0) * across;
|
|
26
|
+
const bz = b.z0 + (b.z1 - b.z0) * across;
|
|
27
|
+
into.positions.push(ax + (bx - ax) * along, a.y + (b.y - a.y) * along, az + (bz - az) * along);
|
|
28
|
+
into.locals.push((joint + along) / joints, across);
|
|
29
|
+
into.params.push(into.param0, into.param1);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cover each sheet in cells no coarser than `cellM`.
|
|
33
|
+
*
|
|
34
|
+
* Vertices are duplicated at cell boundaries rather than shared. That is safe
|
|
35
|
+
* here in a way it would not be in general: every displacement applied to this
|
|
36
|
+
* mesh is a pure function of the resting position, so two vertices at the same
|
|
37
|
+
* place move to the same place and the seam cannot open.
|
|
38
|
+
*
|
|
39
|
+
* `params` is called once per sheet at build time — never per frame — and writes
|
|
40
|
+
* the two floats each of that sheet's vertices carries.
|
|
41
|
+
*/
|
|
42
|
+
export function buildSheets(sheets, cellM, params) {
|
|
43
|
+
const into = {
|
|
44
|
+
positions: [],
|
|
45
|
+
locals: [],
|
|
46
|
+
params: [],
|
|
47
|
+
param0: 0,
|
|
48
|
+
param1: 0,
|
|
49
|
+
};
|
|
50
|
+
const scratch = new Float32Array(2);
|
|
51
|
+
const cell = cellM > 0 ? cellM : 0;
|
|
52
|
+
for (const sheet of sheets) {
|
|
53
|
+
const spans = sheet.spans;
|
|
54
|
+
if (cell <= 0 || spans.length < 2)
|
|
55
|
+
continue;
|
|
56
|
+
scratch[0] = 0;
|
|
57
|
+
scratch[1] = 0;
|
|
58
|
+
params(sheet, scratch);
|
|
59
|
+
into.param0 = scratch[0] ?? 0;
|
|
60
|
+
into.param1 = scratch[1] ?? 0;
|
|
61
|
+
const joints = spans.length - 1;
|
|
62
|
+
for (let s = 0; s < joints; s++) {
|
|
63
|
+
const a = spans[s];
|
|
64
|
+
const b = spans[s + 1];
|
|
65
|
+
/*
|
|
66
|
+
* How finely this piece has to be cut: the longest edge on each axis, so a
|
|
67
|
+
* widening channel is sampled by its wide end rather than its narrow one.
|
|
68
|
+
*/
|
|
69
|
+
const alongLength = Math.max(Math.hypot(b.x0 - a.x0, b.z0 - a.z0), Math.hypot(b.x1 - a.x1, b.z1 - a.z1));
|
|
70
|
+
const acrossLength = Math.max(Math.hypot(a.x1 - a.x0, a.z1 - a.z0), Math.hypot(b.x1 - b.x0, b.z1 - b.z0));
|
|
71
|
+
if (!(alongLength > 0) || !(acrossLength > 0))
|
|
72
|
+
continue;
|
|
73
|
+
const alongCells = Math.max(1, Math.ceil(alongLength / cell));
|
|
74
|
+
const acrossCells = Math.max(1, Math.ceil(acrossLength / cell));
|
|
75
|
+
for (let i = 0; i < alongCells; i++) {
|
|
76
|
+
const t0 = i / alongCells;
|
|
77
|
+
const t1 = (i + 1) / alongCells;
|
|
78
|
+
for (let j = 0; j < acrossCells; j++) {
|
|
79
|
+
const s0 = j / acrossCells;
|
|
80
|
+
const s1 = (j + 1) / acrossCells;
|
|
81
|
+
// Two triangles per cell, wound counter-clockwise from above so the
|
|
82
|
+
// sheet's front face is its top.
|
|
83
|
+
emitVertex(into, a, b, t0, s0, s, joints);
|
|
84
|
+
emitVertex(into, a, b, t1, s0, s, joints);
|
|
85
|
+
emitVertex(into, a, b, t1, s1, s, joints);
|
|
86
|
+
emitVertex(into, a, b, t0, s0, s, joints);
|
|
87
|
+
emitVertex(into, a, b, t1, s1, s, joints);
|
|
88
|
+
emitVertex(into, a, b, t0, s1, s, joints);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
positions: new Float32Array(into.positions),
|
|
95
|
+
locals: new Float32Array(into.locals),
|
|
96
|
+
params: new Float32Array(into.params),
|
|
97
|
+
vertexCount: into.positions.length / 3,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/** A GPU image the caller supplies, sampled by the flat shader as surface colour. */
|
|
2
|
+
/**
|
|
3
|
+
* How a texture behaves past its edges and between its texels.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately small. Every knob here is one a tiling world actually needs; anything
|
|
6
|
+
* beyond it — swizzles, borders, compressed formats — is a format decision that
|
|
7
|
+
* belongs to whoever is generating the pixels, not to the surface that shows them.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Everything the flat pass needs to know about a surface, in one call.
|
|
11
|
+
*
|
|
12
|
+
* **Shaped for what comes after it.** ORM is the next map and emissive the one after; both are a
|
|
13
|
+
* field here rather than a fourth and fifth setter, which is the whole reason this replaced
|
|
14
|
+
* `setSurfaceTexture` rather than sitting beside it. A consumer setting four maps in four calls is
|
|
15
|
+
* four chances to forget one, and four resets `bindMeshPass` has to reason about.
|
|
16
|
+
*
|
|
17
|
+
* **Every field is independent.** A material with a `normal` and no `albedo` is a legitimate one —
|
|
18
|
+
* vertex colour with authored normals — and shades as such rather than as no material at all.
|
|
19
|
+
*
|
|
20
|
+
* **Generic over the texture, for the reason `SurfaceTextureHandle` exists.** The two backends have
|
|
21
|
+
* different texture classes and the public API speaks in an opaque handle; parameterising here lets
|
|
22
|
+
* each renderer take its own concrete type while a consumer sees one shape. Defaulted to the
|
|
23
|
+
* WebGL2 class so the common spelling stays `SurfaceMaterial`.
|
|
24
|
+
*/
|
|
25
|
+
export interface SurfaceMaterial<Texture = SurfaceTexture> {
|
|
26
|
+
albedo?: Texture | null;
|
|
27
|
+
/**
|
|
28
|
+
* Surface-space directions, turned into world space through the mesh's tangent frame.
|
|
29
|
+
*
|
|
30
|
+
* Read by the flat pass since 2026-08-22, from the attribute at location 10 where the mesh has
|
|
31
|
+
* one and from a per-fragment cotangent frame where it does not. `normalStrength` gates it.
|
|
32
|
+
* See `docs/RENDERING.md` for the normal-map path.
|
|
33
|
+
*/
|
|
34
|
+
normal?: Texture | null;
|
|
35
|
+
/**
|
|
36
|
+
* Occlusion in R, roughness in G, metallic in B, in one image.
|
|
37
|
+
*
|
|
38
|
+
* glTF's packing, because that is what an import carries, and one unit for three channels rather
|
|
39
|
+
* than three units for three maps. Sampled linear and never sRGB: these numbers *are* the data.
|
|
40
|
+
*/
|
|
41
|
+
orm?: Texture | null;
|
|
42
|
+
/**
|
|
43
|
+
* Where a surface glows, and in what colour.
|
|
44
|
+
*
|
|
45
|
+
* **It modulates the surface's own emission rather than creating it**, which is glTF's rule
|
|
46
|
+
* — emitted colour is `emissiveFactor * emissiveTexture` — and is the one thing about this map
|
|
47
|
+
* that surprises people. A mesh whose `emissive` attribute is 0 emits nothing however bright
|
|
48
|
+
* the image it binds, because there is nothing for the image to scale. An import carries the
|
|
49
|
+
* factor for you: `gltf.ts` puts `max(emissiveFactor)` in the attribute and the factor itself
|
|
50
|
+
* in `emissiveColor`. A procedurally built mesh has to say so the same way it says its colour,
|
|
51
|
+
* which is in vertex data, because that is what makes a whole world one draw call here.
|
|
52
|
+
*
|
|
53
|
+
* Sampled **sRGB**, unlike `normal` and `orm`: this one is a colour a person picked, where
|
|
54
|
+
* those two are numbers. glTF says the same.
|
|
55
|
+
*/
|
|
56
|
+
emissive?: Texture | null;
|
|
57
|
+
/** Repeats across the mesh's own UV range, per axis. Applies to every map the material holds. */
|
|
58
|
+
uScale?: number;
|
|
59
|
+
vScale?: number;
|
|
60
|
+
/** Alpha below which a fragment is discarded. See `uAlbedoCutout`. */
|
|
61
|
+
cutout?: number;
|
|
62
|
+
/**
|
|
63
|
+
* How hard the normal map turns the shading normal.
|
|
64
|
+
*
|
|
65
|
+
* **Defaults to 1 when a `normal` is supplied and 0 when it is not**, because binding a map and
|
|
66
|
+
* saying nothing about strength means "use it" rather than "use it at nothing".
|
|
67
|
+
*/
|
|
68
|
+
normalStrength?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Scales the ORM map's G channel. glTF's `roughnessFactor`. Default 1.
|
|
71
|
+
*
|
|
72
|
+
* The map *replaces* the mesh's own roughness attribute rather than scaling it, and this is what
|
|
73
|
+
* gives back the scaling. Scaling the attribute was the alternative and it is wrong outside an
|
|
74
|
+
* import: `vertexDefaults.ts` hands an absent roughness **0.4277**, not 1, so every procedurally
|
|
75
|
+
* built mesh would read far glossier than the image it was handed, with nothing in the API to
|
|
76
|
+
* say it would.
|
|
77
|
+
*/
|
|
78
|
+
roughnessScale?: number;
|
|
79
|
+
/** Scales the ORM map's B channel. glTF's `metallicFactor`. Default 1. */
|
|
80
|
+
metallicScale?: number;
|
|
81
|
+
/**
|
|
82
|
+
* How much of the ORM map's R channel to apply. glTF's `occlusionTexture.strength`. Default 1.
|
|
83
|
+
*
|
|
84
|
+
* **0 is no occlusion, not full occlusion.** glTF defines it as `1 + strength * (texel - 1)`, so
|
|
85
|
+
* the shader mixes from 1 rather than multiplying — a multiply at 0 would black the surface out,
|
|
86
|
+
* which is the opposite of what the caller asked for.
|
|
87
|
+
*/
|
|
88
|
+
occlusionStrength?: number;
|
|
89
|
+
/**
|
|
90
|
+
* Scales the emissive map, per channel. Default 1.
|
|
91
|
+
*
|
|
92
|
+
* The counterpart of `roughnessScale` and `metallicScale`: a factor that multiplies a texture is
|
|
93
|
+
* not a value, and this is where the multiplier lives once an image supplies the shape. A
|
|
94
|
+
* consumer who wants a bound map twice as bright asks here rather than rebuilding the mesh.
|
|
95
|
+
*/
|
|
96
|
+
emissiveScale?: readonly [number, number, number];
|
|
97
|
+
}
|
|
98
|
+
export interface SurfaceTextureOptions {
|
|
99
|
+
/**
|
|
100
|
+
* `repeat` tiles the image, `clamp` stretches its edge texels.
|
|
101
|
+
*
|
|
102
|
+
* Repeat is the default because the case this exists for is a wall: one small image
|
|
103
|
+
* covering a large surface, with `uvScale` deciding how often it lands. Clamp is for
|
|
104
|
+
* an image that is a *picture* — a portrait, a sign — where a second copy of it
|
|
105
|
+
* appearing past the edge is a bug rather than a pattern.
|
|
106
|
+
*/
|
|
107
|
+
wrap?: 'repeat' | 'clamp';
|
|
108
|
+
/**
|
|
109
|
+
* How the image's values are encoded, so the shader can sample light rather than pixels.
|
|
110
|
+
*
|
|
111
|
+
* `linear` is the default and the old behaviour: the bytes are handed to the shader as
|
|
112
|
+
* they are. That is right for a mask, a height field, anything whose numbers *are* the
|
|
113
|
+
* data.
|
|
114
|
+
*
|
|
115
|
+
* `srgb` is right for anything that was authored to be looked at — a photo, a painted
|
|
116
|
+
* canvas, a biome tile. Those bytes are display values, and shading maths is linear, so
|
|
117
|
+
* multiplying a light into them without decoding first is a category error: mid-greys
|
|
118
|
+
* come out roughly twice as bright as they should, and the mistake is invisible until an
|
|
119
|
+
* output transform is applied and everything blows out at once. The GPU decodes
|
|
120
|
+
* `SRGB8_ALPHA8` in the sampler, so this costs nothing per fetch and, unlike decoding in
|
|
121
|
+
* the shader, it happens *before* filtering — which is the only place it is correct.
|
|
122
|
+
*/
|
|
123
|
+
colorSpace?: 'linear' | 'srgb';
|
|
124
|
+
/**
|
|
125
|
+
* How a texel is chosen when the image is magnified: smoothed between texels, or taken whole.
|
|
126
|
+
*
|
|
127
|
+
* **`linear` is the default and is every surface that shipped before this**, which is right for
|
|
128
|
+
* anything photographic: a wall, a painted canvas, a biome tile, where the texel grid is an
|
|
129
|
+
* artefact of resolution rather than the subject.
|
|
130
|
+
*
|
|
131
|
+
* `nearest` is for an image whose *pixels are the subject* — pixel art, an icon atlas, a
|
|
132
|
+
* hand-authored tile. **Reported by a consumer whose block atlas is exactly that**: linear
|
|
133
|
+
* magnification turns an authored tile into a smear as the camera approaches, and there was no
|
|
134
|
+
* way to ask for anything else. They composed their atlas with `imageSmoothingEnabled = false`
|
|
135
|
+
* and kept tiles at twice the resolution they wanted, and neither touches magnification — the
|
|
136
|
+
* smoothing happens in the sampler, after everything a caller controls.
|
|
137
|
+
*
|
|
138
|
+
* **Minification still blends between mip levels**, and that is not the option being ignored. A
|
|
139
|
+
* tiled floor at a grazing angle minifies far past one texel per pixel, which is what mips exist
|
|
140
|
+
* for; taking the nearest *level* as well would trade a smear for a visible pop as the camera
|
|
141
|
+
* pulls back. So the choice applies where it was asked about, and within a level either way.
|
|
142
|
+
*
|
|
143
|
+
* `@driftengine/ui2d` takes the same option and defaults it the other way, because a sprite sheet
|
|
144
|
+
* is usually pixel art and a world surface usually is not.
|
|
145
|
+
*/
|
|
146
|
+
filter?: 'linear' | 'nearest';
|
|
147
|
+
/**
|
|
148
|
+
* Build a mip chain. On by default, and it is not a quality preference.
|
|
149
|
+
*
|
|
150
|
+
* A tiled surface seen at a grazing angle — which is every floor and every corridor
|
|
151
|
+
* wall — minifies far past one texel per pixel, and without mips that undersampling
|
|
152
|
+
* is aliasing that *crawls* as the camera moves. It is the single most visible
|
|
153
|
+
* artefact a textured world can have. Off is for a texture drawn at roughly its own
|
|
154
|
+
* size, where the chain is memory spent on levels nothing will sample.
|
|
155
|
+
*/
|
|
156
|
+
mipmap?: boolean;
|
|
157
|
+
/**
|
|
158
|
+
* Anisotropic samples, when the extension is present. 1 disables it.
|
|
159
|
+
*
|
|
160
|
+
* Mips fix the crawling and cost sharpness: a floor stretching to the horizon picks
|
|
161
|
+
* its mip from the *worse* of the two axes, so it blurs along the one that was still
|
|
162
|
+
* well sampled. Anisotropy is the standard repair, it is cheap at these sizes, and
|
|
163
|
+
* on a machine without the extension the clamp below silently leaves it at 1.
|
|
164
|
+
*/
|
|
165
|
+
anisotropy?: number;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* An image uploaded once and bound per draw.
|
|
169
|
+
*
|
|
170
|
+
* The engine ships no image assets and fetches nothing — that payload rule is intact
|
|
171
|
+
* and this does not weaken it. What it takes is a `TexImageSource` the *consumer*
|
|
172
|
+
* already has: a canvas it generated procedurally at runtime, an `ImageBitmap` it
|
|
173
|
+
* decoded, a video frame. The engine owns the GPU object and the sampler state; where
|
|
174
|
+
* the pixels came from is the caller's business and stays that way.
|
|
175
|
+
*/
|
|
176
|
+
export declare class SurfaceTexture {
|
|
177
|
+
private texture;
|
|
178
|
+
private readonly mipmapped;
|
|
179
|
+
/** Whether the sampler decodes sRGB on fetch. See `colorSpace`. */
|
|
180
|
+
private readonly srgb;
|
|
181
|
+
constructor(gl: WebGL2RenderingContext, source: TexImageSource, options?: SurfaceTextureOptions);
|
|
182
|
+
/**
|
|
183
|
+
* Replace the pixels, keeping the GPU object and its sampler state.
|
|
184
|
+
*
|
|
185
|
+
* For a source that changes — a canvas being redrawn, a decoded frame. Re-uploading
|
|
186
|
+
* beats constructing a second texture because the binding the caller already handed
|
|
187
|
+
* to a draw stays valid, and because a texture created per frame is a leak in every
|
|
188
|
+
* case where the caller forgets the matching dispose.
|
|
189
|
+
*
|
|
190
|
+
* Not a hot path: it re-uploads the whole image and regenerates the chain. A caller
|
|
191
|
+
* doing this every frame at any size wants to know that it costs what it costs.
|
|
192
|
+
*/
|
|
193
|
+
update(gl: WebGL2RenderingContext, source: TexImageSource): void;
|
|
194
|
+
/** Bind to a unit for sampling. Engine-internal: the renderer owns unit assignment. */
|
|
195
|
+
bind(gl: WebGL2RenderingContext, unit: number): void;
|
|
196
|
+
dispose(gl: WebGL2RenderingContext): void;
|
|
197
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** A GPU image the caller supplies, sampled by the flat shader as surface colour. */
|
|
2
|
+
const DEFAULT_ANISOTROPY = 4;
|
|
3
|
+
/**
|
|
4
|
+
* An image uploaded once and bound per draw.
|
|
5
|
+
*
|
|
6
|
+
* The engine ships no image assets and fetches nothing — that payload rule is intact
|
|
7
|
+
* and this does not weaken it. What it takes is a `TexImageSource` the *consumer*
|
|
8
|
+
* already has: a canvas it generated procedurally at runtime, an `ImageBitmap` it
|
|
9
|
+
* decoded, a video frame. The engine owns the GPU object and the sampler state; where
|
|
10
|
+
* the pixels came from is the caller's business and stays that way.
|
|
11
|
+
*/
|
|
12
|
+
export class SurfaceTexture {
|
|
13
|
+
texture;
|
|
14
|
+
mipmapped;
|
|
15
|
+
/** Whether the sampler decodes sRGB on fetch. See `colorSpace`. */
|
|
16
|
+
srgb;
|
|
17
|
+
constructor(gl, source, options = {}) {
|
|
18
|
+
const texture = gl.createTexture();
|
|
19
|
+
if (texture === null)
|
|
20
|
+
throw new Error('SurfaceTexture: createTexture failed');
|
|
21
|
+
this.texture = texture;
|
|
22
|
+
this.mipmapped = options.mipmap ?? true;
|
|
23
|
+
this.srgb = (options.colorSpace ?? 'linear') === 'srgb';
|
|
24
|
+
const wrap = (options.wrap ?? 'repeat') === 'repeat' ? gl.REPEAT : gl.CLAMP_TO_EDGE;
|
|
25
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
26
|
+
/*
|
|
27
|
+
* **Not flipped, and this used to be, which is the bug it is written down for.**
|
|
28
|
+
*
|
|
29
|
+
* The flip was here with a comment saying every source is a 2D drawing surface whose Y
|
|
30
|
+
* runs down from the top-left, so without it "every texture arrives mirrored". That is
|
|
31
|
+
* true of a canvas and **WebGL ignores `UNPACK_FLIP_Y_WEBGL` entirely for an
|
|
32
|
+
* `ImageBitmap`**, which carries its own orientation. So the two source types the same
|
|
33
|
+
* method accepts arrived the opposite way up from each other, and nothing caught it
|
|
34
|
+
* because every canvas-sourced texture in this repository was symmetric under a vertical
|
|
35
|
+
* flip: eroded noise, a radial halo, a sleeve blurred to 24 pixels and back. One consumer
|
|
36
|
+
* painted lettering to a canvas beside a sleeve decoded as a bitmap and the text was
|
|
37
|
+
* upside down.
|
|
38
|
+
*
|
|
39
|
+
* **Made to agree by dropping the flip rather than by extending it**, and the direction
|
|
40
|
+
* is a deliberate choice about blast radius rather than a coin toss: `drftLoader` builds
|
|
41
|
+
* every model texture from an `ImageBitmap`, so flipping bitmaps to match canvases would
|
|
42
|
+
* turn over every painted surface on every loaded model. Dropping it changes only
|
|
43
|
+
* canvas-sourced textures, and every one of those that exists today is symmetric.
|
|
44
|
+
*
|
|
45
|
+
* A caller that was mirroring its own canvas to cancel this must stop.
|
|
46
|
+
*/
|
|
47
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, this.srgb ? gl.SRGB8_ALPHA8 : gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
48
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);
|
|
49
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);
|
|
50
|
+
/* Nearest where the caller said their pixels are the subject; see `filter`. The mip chain is
|
|
51
|
+
still blended between levels, because that is minification and this option is about
|
|
52
|
+
magnification. */
|
|
53
|
+
const nearest = options.filter === 'nearest';
|
|
54
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, nearest ? gl.NEAREST : gl.LINEAR);
|
|
55
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, this.mipmapped
|
|
56
|
+
? nearest
|
|
57
|
+
? gl.NEAREST_MIPMAP_LINEAR
|
|
58
|
+
: gl.LINEAR_MIPMAP_LINEAR
|
|
59
|
+
: nearest
|
|
60
|
+
? gl.NEAREST
|
|
61
|
+
: gl.LINEAR);
|
|
62
|
+
if (this.mipmapped)
|
|
63
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
64
|
+
applyAnisotropy(gl, options.anisotropy ?? DEFAULT_ANISOTROPY);
|
|
65
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Replace the pixels, keeping the GPU object and its sampler state.
|
|
69
|
+
*
|
|
70
|
+
* For a source that changes — a canvas being redrawn, a decoded frame. Re-uploading
|
|
71
|
+
* beats constructing a second texture because the binding the caller already handed
|
|
72
|
+
* to a draw stays valid, and because a texture created per frame is a leak in every
|
|
73
|
+
* case where the caller forgets the matching dispose.
|
|
74
|
+
*
|
|
75
|
+
* Not a hot path: it re-uploads the whole image and regenerates the chain. A caller
|
|
76
|
+
* doing this every frame at any size wants to know that it costs what it costs.
|
|
77
|
+
*/
|
|
78
|
+
update(gl, source) {
|
|
79
|
+
if (this.texture === null)
|
|
80
|
+
return;
|
|
81
|
+
gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
|
82
|
+
/* Unflipped, matching the constructor. See it for why, and for what it cost. */
|
|
83
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, this.srgb ? gl.SRGB8_ALPHA8 : gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
84
|
+
if (this.mipmapped)
|
|
85
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
86
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
87
|
+
}
|
|
88
|
+
/** Bind to a unit for sampling. Engine-internal: the renderer owns unit assignment. */
|
|
89
|
+
bind(gl, unit) {
|
|
90
|
+
gl.activeTexture(gl.TEXTURE0 + unit);
|
|
91
|
+
gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
|
92
|
+
}
|
|
93
|
+
dispose(gl) {
|
|
94
|
+
if (this.texture === null)
|
|
95
|
+
return;
|
|
96
|
+
gl.deleteTexture(this.texture);
|
|
97
|
+
this.texture = null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set anisotropic filtering when the driver offers it, and stay silent when it does not.
|
|
102
|
+
*
|
|
103
|
+
* Silent because the extension is an enhancement with an exact fallback — the same
|
|
104
|
+
* texture, filtered isotropically — so a machine without it renders a slightly softer
|
|
105
|
+
* floor rather than a broken one. Nothing here should fail init over that.
|
|
106
|
+
*/
|
|
107
|
+
function applyAnisotropy(gl, requested) {
|
|
108
|
+
if (requested <= 1)
|
|
109
|
+
return;
|
|
110
|
+
const ext = gl.getExtension('EXT_texture_filter_anisotropic') ??
|
|
111
|
+
gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');
|
|
112
|
+
if (ext === null)
|
|
113
|
+
return;
|
|
114
|
+
const max = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
|
|
115
|
+
gl.texParameterf(gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(requested, max));
|
|
116
|
+
}
|