@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,124 @@
|
|
|
1
|
+
import { mat4 } from 'gl-matrix';
|
|
2
|
+
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
3
|
+
|
|
4
|
+
import { decalScissor } from './decalProjector.ts';
|
|
5
|
+
import type { DecalQueue } from './decalQueue.ts';
|
|
6
|
+
import { DEPTH_01_TO_CLIP } from './lightVolumeDraw.ts';
|
|
7
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
8
|
+
import { DECAL_PROJECT_FRAG } from './shaders/decalProject.ts';
|
|
9
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.ts';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Drawn decals on WebGL2: one scissored triangle per mark, multiplied into the finished scene.
|
|
13
|
+
*
|
|
14
|
+
* **The whole pass is a blend state and a rectangle.** There is no geometry, no vertex buffer and
|
|
15
|
+
* no depth test: the mark is decided per pixel from the depth copy, so the only thing the
|
|
16
|
+
* rasteriser is asked for is coverage of the part of the screen the projector box can possibly
|
|
17
|
+
* reach. `decalScissor` computes that from the box's eight corners, which is what stands in for
|
|
18
|
+
* drawing the box as a mesh and is argued there.
|
|
19
|
+
*
|
|
20
|
+
* **`(ZERO, SRC_COLOR)` is the effect.** The result is `dst * src`, so a fragment writing white
|
|
21
|
+
* changes nothing and one writing the mark's colour tints what is under it — including the
|
|
22
|
+
* receiver's lighting, which is the reason to multiply and is stated at length in the shader.
|
|
23
|
+
*/
|
|
24
|
+
export class DecalPass {
|
|
25
|
+
private readonly program: WebGLProgram;
|
|
26
|
+
private readonly uniforms: Record<string, WebGLUniformLocation | null>;
|
|
27
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
28
|
+
|
|
29
|
+
/** `inverse(viewProjection) * DEPTH_01_TO_CLIP`, rebuilt once a frame rather than per mark. */
|
|
30
|
+
private readonly depthToWorld = new Float32Array(16);
|
|
31
|
+
private readonly scissor = new Int32Array(4);
|
|
32
|
+
|
|
33
|
+
constructor(private readonly gl: WebGL2RenderingContext) {
|
|
34
|
+
this.program = compileProgram(gl, FULLSCREEN_VERT, DECAL_PROJECT_FRAG, 'decalProject');
|
|
35
|
+
this.uniforms = uniformLocations(gl, this.program, 'decalPass');
|
|
36
|
+
const vao = gl.createVertexArray();
|
|
37
|
+
if (vao === null) throw new Error('DecalPass: createVertexArray failed');
|
|
38
|
+
this.vao = vao;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Mark the bound framebuffer with everything the queue recorded.
|
|
43
|
+
*
|
|
44
|
+
* `viewProjection` is the **raw** camera matrix, not the clip-corrected one: `DEPTH_01_TO_CLIP`
|
|
45
|
+
* turns a stored depth back into the clip space that matrix was built in, and pairing it with
|
|
46
|
+
* the corrected one applies the remap twice. `lightVolumeDraw.ts` carries that derivation.
|
|
47
|
+
*/
|
|
48
|
+
drawDecals(
|
|
49
|
+
queue: DecalQueue,
|
|
50
|
+
depth: WebGLTexture,
|
|
51
|
+
viewProjection: ReadonlyMat4,
|
|
52
|
+
eye: ArrayLike<number>,
|
|
53
|
+
width: number,
|
|
54
|
+
height: number,
|
|
55
|
+
): void {
|
|
56
|
+
if (queue.length === 0) return;
|
|
57
|
+
const { gl } = this;
|
|
58
|
+
const u = this.uniforms;
|
|
59
|
+
|
|
60
|
+
mat4.invert(this.depthToWorld, viewProjection);
|
|
61
|
+
mat4.multiply(this.depthToWorld, this.depthToWorld, DEPTH_01_TO_CLIP);
|
|
62
|
+
|
|
63
|
+
gl.useProgram(this.program);
|
|
64
|
+
gl.bindVertexArray(this.vao);
|
|
65
|
+
gl.disable(gl.DEPTH_TEST);
|
|
66
|
+
gl.depthMask(false);
|
|
67
|
+
gl.disable(gl.CULL_FACE);
|
|
68
|
+
gl.enable(gl.BLEND);
|
|
69
|
+
gl.blendFunc(gl.ZERO, gl.SRC_COLOR);
|
|
70
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
71
|
+
|
|
72
|
+
/* Unit 0, chosen rather than inherited: `bindTexture` binds to whichever unit is active, and
|
|
73
|
+
the renderer leaves that wherever its last pass finished. `OitPass` records what leaving it
|
|
74
|
+
there cost. */
|
|
75
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
76
|
+
gl.bindTexture(gl.TEXTURE_2D, depth);
|
|
77
|
+
gl.uniform1i(u['uDecalDepth'] ?? null, 0);
|
|
78
|
+
gl.uniformMatrix4fv(u['uDecalDepthToWorld'] ?? null, false, this.depthToWorld);
|
|
79
|
+
gl.uniform3f(u['uDecalEye'] ?? null, eye[0] ?? 0, eye[1] ?? 0, eye[2] ?? 0);
|
|
80
|
+
|
|
81
|
+
queue.replay((decal) => {
|
|
82
|
+
/* False when the box is off-screen or wholly behind the eye, and then this mark costs a
|
|
83
|
+
matrix multiply and no fragments at all. */
|
|
84
|
+
if (!decalScissor(viewProjection, decal.decalToWorld, width, height, false, this.scissor)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
gl.scissor(
|
|
88
|
+
this.scissor[0] ?? 0,
|
|
89
|
+
this.scissor[1] ?? 0,
|
|
90
|
+
this.scissor[2] ?? 0,
|
|
91
|
+
this.scissor[3] ?? 0,
|
|
92
|
+
);
|
|
93
|
+
gl.uniformMatrix4fv(u['uWorldToDecal'] ?? null, false, decal.worldToDecal);
|
|
94
|
+
gl.uniform3fv(u['uDecalAxis'] ?? null, decal.axis);
|
|
95
|
+
gl.uniform3fv(u['uDecalColor'] ?? null, decal.color);
|
|
96
|
+
gl.uniform1f(u['uDecalOpacity'] ?? null, decal.opacity);
|
|
97
|
+
gl.uniform1f(u['uDecalFacingCos'] ?? null, decal.facingCos);
|
|
98
|
+
gl.uniform1f(u['uDecalSoftness'] ?? null, decal.softness);
|
|
99
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
103
|
+
/* And the whole viewport back, so a later `enable` inherits a rectangle that is not one mark's
|
|
104
|
+
corner of the screen. */
|
|
105
|
+
gl.scissor(0, 0, width, height);
|
|
106
|
+
gl.bindVertexArray(null);
|
|
107
|
+
/*
|
|
108
|
+
* **Released, and `OitPass` says why at length.** A binding outlives the frame it was made in,
|
|
109
|
+
* so unit 0 would keep the depth copy — which a later pass attaches as its own target while a
|
|
110
|
+
* program still declares a sampler on that unit. That is a feedback loop: reported once per
|
|
111
|
+
* draw and rasterising something undefined.
|
|
112
|
+
*/
|
|
113
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
114
|
+
gl.disable(gl.BLEND);
|
|
115
|
+
gl.depthMask(true);
|
|
116
|
+
gl.enable(gl.DEPTH_TEST);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
dispose(): void {
|
|
120
|
+
const { gl } = this;
|
|
121
|
+
gl.deleteProgram(this.program);
|
|
122
|
+
gl.deleteVertexArray(this.vao);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import type { ReadonlyMat4, ReadonlyVec3 } from 'gl-matrix';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A decal evaluated at render time: a box, the depth buffer, and whatever surface is inside it.
|
|
5
|
+
*
|
|
6
|
+
* **`projectDecal` is the other half of this and neither replaces the other.** That one clips the
|
|
7
|
+
* receiving surface's own triangles to a projector box and lifts them off along their normals, so
|
|
8
|
+
* the mark *is* the surface: it follows every curve and bump exactly, it is lit as the surface is
|
|
9
|
+
* lit, and it costs nothing per frame. What it cannot do is change afterwards. The clip happens
|
|
10
|
+
* once, against the mesh as it stood, so a mark on something that later deforms rides the old
|
|
11
|
+
* shape, and a mark on something that streams in later cannot be made at all because there was
|
|
12
|
+
* nothing to clip.
|
|
13
|
+
*
|
|
14
|
+
* **This is the projector kept alive instead.** Nothing is clipped and no mesh is built: the pass
|
|
15
|
+
* reads the depth the frame has already drawn, turns each pixel back into the world point it
|
|
16
|
+
* stands for, and asks whether that point is inside the box. A surface that deforms, streams in,
|
|
17
|
+
* or is drawn by something with no CPU-side geometry at all — a heightfield, a skinned mesh, an
|
|
18
|
+
* instanced crowd — is marked on the frame it is drawn, because the mark is decided from the
|
|
19
|
+
* picture rather than from the mesh.
|
|
20
|
+
*
|
|
21
|
+
* **What it costs, and it is the honest half of the trade.** The mark is applied to the finished
|
|
22
|
+
* pixel rather than to the surface's albedo, so it multiplies what is already there: it can
|
|
23
|
+
* darken, stain and tint, and it cannot brighten or add a highlight. It has no geometry of its
|
|
24
|
+
* own, so it takes the receiver's lighting exactly — which is the *reason* to multiply rather
|
|
25
|
+
* than an accident of it — and a purely diffuse receiver is shaded as though the albedo had been
|
|
26
|
+
* marked before the light was applied. And it knows only what the depth buffer knows: anything
|
|
27
|
+
* that drew without writing depth, a beam or a particle, is in front of the mark and is darkened
|
|
28
|
+
* with it.
|
|
29
|
+
*
|
|
30
|
+
* The shape is procedural — an ellipse across the box's face with a soft edge, faded where the
|
|
31
|
+
* surface turns away from the projector. A textured mark is what it does not do yet, and
|
|
32
|
+
* `docs/CAPABILITIES.md` says so where it says the rest.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/** The box a projector occupies. Every field is world space. */
|
|
36
|
+
export interface DecalBox {
|
|
37
|
+
/** Middle of the projector box. */
|
|
38
|
+
readonly center: ReadonlyVec3;
|
|
39
|
+
/** Half-size across, up, and along the projection. The third is how deep the box reaches. */
|
|
40
|
+
readonly halfExtents: ReadonlyVec3;
|
|
41
|
+
/**
|
|
42
|
+
* The direction the decal is projected *along* — for a mark on the ground, straight down.
|
|
43
|
+
*
|
|
44
|
+
* A surface is marked when it faces back along this. Need not be normalised.
|
|
45
|
+
*/
|
|
46
|
+
readonly forward: ReadonlyVec3;
|
|
47
|
+
/** Which way is up in the decal's own image, so a mark can be turned. Need not be normalised. */
|
|
48
|
+
readonly up: ReadonlyVec3;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface DecalProjectorOptions extends DecalBox {
|
|
52
|
+
/** What the mark multiplies the surface by. White marks nothing; black is a hole. */
|
|
53
|
+
readonly color?: ReadonlyVec3;
|
|
54
|
+
/** How much of that colour lands, 0 to 1. */
|
|
55
|
+
readonly opacity?: number;
|
|
56
|
+
/**
|
|
57
|
+
* How far from facing the projector a surface may be turned and still be marked, as a cosine.
|
|
58
|
+
*
|
|
59
|
+
* **The stretch this prevents is the classic failure of a projected decal.** A wall standing
|
|
60
|
+
* edge-on to the projector occupies one pixel of depth per metre of wall, so a mark aimed at the
|
|
61
|
+
* floor smears the full depth of the box up it in a long streak. `projectDecal` has the same
|
|
62
|
+
* number for the same reason, and this one is read from the depth buffer's own derivatives
|
|
63
|
+
* rather than from a vertex normal.
|
|
64
|
+
*/
|
|
65
|
+
readonly facingCos?: number;
|
|
66
|
+
/** How much of the mark's radius is edge, 0 for a hard ellipse and 1 for all falloff. */
|
|
67
|
+
readonly softness?: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Scratch for the orthonormal frame, so building a matrix allocates nothing. */
|
|
71
|
+
const RIGHT = new Float64Array(3);
|
|
72
|
+
const UP = new Float64Array(3);
|
|
73
|
+
const FORWARD = new Float64Array(3);
|
|
74
|
+
/** The eight corners of the box, projected, for the scissor bound. */
|
|
75
|
+
const CORNER = new Float64Array(4);
|
|
76
|
+
|
|
77
|
+
function frame(box: DecalBox): void {
|
|
78
|
+
const f = box.forward;
|
|
79
|
+
const length = Math.hypot(f[0] ?? 0, f[1] ?? 0, f[2] ?? 0);
|
|
80
|
+
if (length === 0) throw new Error('DecalProjector: forward has no direction');
|
|
81
|
+
FORWARD[0] = (f[0] ?? 0) / length;
|
|
82
|
+
FORWARD[1] = (f[1] ?? 0) / length;
|
|
83
|
+
FORWARD[2] = (f[2] ?? 0) / length;
|
|
84
|
+
|
|
85
|
+
const u = box.up;
|
|
86
|
+
/* right = up x forward, which is the frame `projectDecal` builds and the one a caller's `up`
|
|
87
|
+
therefore already means. */
|
|
88
|
+
RIGHT[0] = (u[1] ?? 0) * FORWARD[2] - (u[2] ?? 0) * FORWARD[1];
|
|
89
|
+
RIGHT[1] = (u[2] ?? 0) * FORWARD[0] - (u[0] ?? 0) * FORWARD[2];
|
|
90
|
+
RIGHT[2] = (u[0] ?? 0) * FORWARD[1] - (u[1] ?? 0) * FORWARD[0];
|
|
91
|
+
const across = Math.hypot(RIGHT[0], RIGHT[1], RIGHT[2]);
|
|
92
|
+
if (across === 0) {
|
|
93
|
+
throw new Error('DecalProjector: up is parallel to forward, so the box has no orientation');
|
|
94
|
+
}
|
|
95
|
+
RIGHT[0] /= across;
|
|
96
|
+
RIGHT[1] /= across;
|
|
97
|
+
RIGHT[2] /= across;
|
|
98
|
+
|
|
99
|
+
/* Re-derived so the frame is orthonormal even where the caller's up was not perpendicular —
|
|
100
|
+
which is what a caller aiming a projector by hand hands in, and what shears the mark if it is
|
|
101
|
+
taken as given. */
|
|
102
|
+
UP[0] = FORWARD[1] * RIGHT[2] - FORWARD[2] * RIGHT[1];
|
|
103
|
+
UP[1] = FORWARD[2] * RIGHT[0] - FORWARD[0] * RIGHT[2];
|
|
104
|
+
UP[2] = FORWARD[0] * RIGHT[1] - FORWARD[1] * RIGHT[0];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** `-0` back to `0`, and anything else through untouched — including a NaN, which `|| 0` would eat. */
|
|
108
|
+
function zeroed(value: number): number {
|
|
109
|
+
return value === 0 ? 0 : value;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function extents(box: DecalBox): [number, number, number] {
|
|
113
|
+
const hx = box.halfExtents[0] ?? 0;
|
|
114
|
+
const hy = box.halfExtents[1] ?? 0;
|
|
115
|
+
const hz = box.halfExtents[2] ?? 0;
|
|
116
|
+
if (!(hx > 0 && hy > 0 && hz > 0)) {
|
|
117
|
+
throw new Error(`DecalProjector: halfExtents must be positive, got ${hx}, ${hy}, ${hz}`);
|
|
118
|
+
}
|
|
119
|
+
return [hx, hy, hz];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* World space into the projector's unit box, column major.
|
|
124
|
+
*
|
|
125
|
+
* The box is `[-1, 1]` on every axis: x across the mark, y up it, z along the projection. A
|
|
126
|
+
* fragment is inside the projector exactly when all three come back within one, which is the whole
|
|
127
|
+
* of the test the shader runs.
|
|
128
|
+
*/
|
|
129
|
+
export function worldToDecalMatrix(out: Float32Array, box: DecalBox): Float32Array {
|
|
130
|
+
frame(box);
|
|
131
|
+
const [hx, hy, hz] = extents(box);
|
|
132
|
+
const c = box.center;
|
|
133
|
+
const cx = c[0] ?? 0;
|
|
134
|
+
const cy = c[1] ?? 0;
|
|
135
|
+
const cz = c[2] ?? 0;
|
|
136
|
+
|
|
137
|
+
/* The rows are the axes divided by their half-extent, and the translation is the centre run
|
|
138
|
+
through them and negated: an orthonormal frame's inverse is its transpose, so this is the
|
|
139
|
+
inverse of `decalToWorldMatrix` written out rather than computed.
|
|
140
|
+
|
|
141
|
+
The translations go through `zeroed` because negating a centre on an axis produces `-0`, which
|
|
142
|
+
is equal to zero in every arithmetic use and not under `Object.is` — so two projectors alike in
|
|
143
|
+
every way a GPU can see would compare unequal. `depthOffsetForLayer` records the same trap. */
|
|
144
|
+
out[0] = RIGHT[0] / hx;
|
|
145
|
+
out[4] = RIGHT[1] / hx;
|
|
146
|
+
out[8] = RIGHT[2] / hx;
|
|
147
|
+
out[12] = zeroed(-(RIGHT[0] * cx + RIGHT[1] * cy + RIGHT[2] * cz) / hx);
|
|
148
|
+
|
|
149
|
+
out[1] = UP[0] / hy;
|
|
150
|
+
out[5] = UP[1] / hy;
|
|
151
|
+
out[9] = UP[2] / hy;
|
|
152
|
+
out[13] = zeroed(-(UP[0] * cx + UP[1] * cy + UP[2] * cz) / hy);
|
|
153
|
+
|
|
154
|
+
out[2] = FORWARD[0] / hz;
|
|
155
|
+
out[6] = FORWARD[1] / hz;
|
|
156
|
+
out[10] = FORWARD[2] / hz;
|
|
157
|
+
out[14] = zeroed(-(FORWARD[0] * cx + FORWARD[1] * cy + FORWARD[2] * cz) / hz);
|
|
158
|
+
|
|
159
|
+
out[3] = 0;
|
|
160
|
+
out[7] = 0;
|
|
161
|
+
out[11] = 0;
|
|
162
|
+
out[15] = 1;
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The unit box back out into the world, column major.
|
|
168
|
+
*
|
|
169
|
+
* Only the scissor needs this — it projects the eight corners to find what part of the screen the
|
|
170
|
+
* box can possibly cover — but it is written here beside its inverse so the two cannot drift, and
|
|
171
|
+
* a test asserts they round-trip.
|
|
172
|
+
*/
|
|
173
|
+
export function decalToWorldMatrix(out: Float32Array, box: DecalBox): Float32Array {
|
|
174
|
+
frame(box);
|
|
175
|
+
const [hx, hy, hz] = extents(box);
|
|
176
|
+
const c = box.center;
|
|
177
|
+
|
|
178
|
+
out[0] = RIGHT[0] * hx;
|
|
179
|
+
out[1] = RIGHT[1] * hx;
|
|
180
|
+
out[2] = RIGHT[2] * hx;
|
|
181
|
+
out[3] = 0;
|
|
182
|
+
|
|
183
|
+
out[4] = UP[0] * hy;
|
|
184
|
+
out[5] = UP[1] * hy;
|
|
185
|
+
out[6] = UP[2] * hy;
|
|
186
|
+
out[7] = 0;
|
|
187
|
+
|
|
188
|
+
out[8] = FORWARD[0] * hz;
|
|
189
|
+
out[9] = FORWARD[1] * hz;
|
|
190
|
+
out[10] = FORWARD[2] * hz;
|
|
191
|
+
out[11] = 0;
|
|
192
|
+
|
|
193
|
+
out[12] = c[0] ?? 0;
|
|
194
|
+
out[13] = c[1] ?? 0;
|
|
195
|
+
out[14] = c[2] ?? 0;
|
|
196
|
+
out[15] = 1;
|
|
197
|
+
return out;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** One pixel of slack, because the frame may be jittered and a bound is rounded. */
|
|
201
|
+
const SCISSOR_PAD = 1;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* The part of the screen a projector can possibly mark, as a scissor rectangle.
|
|
205
|
+
*
|
|
206
|
+
* **This is what stands in for drawing the box as geometry**, and the trade is deliberate. A box
|
|
207
|
+
* submitted as a mesh covers its own silhouette exactly, and costs a vertex buffer, an index
|
|
208
|
+
* buffer, a choice between front and back faces depending on whether the camera is inside it, and
|
|
209
|
+
* a near-plane case where the front faces are clipped away. A rectangle around the same eight
|
|
210
|
+
* corners costs none of those and over-covers by the difference between a silhouette and its
|
|
211
|
+
* bounding box — at worst about twice the fragments, each of them one depth fetch and one matrix
|
|
212
|
+
* multiply before it decides it is outside the box. For a pass that is otherwise two textures and
|
|
213
|
+
* a blend state, that is the cheaper half.
|
|
214
|
+
*
|
|
215
|
+
* **A corner behind the camera is the trap, and it does not look like one.** Dividing clip space
|
|
216
|
+
* by a negative `w` mirrors the point through the origin, so a box the camera stands inside
|
|
217
|
+
* produces eight perfectly ordinary screen positions describing a rectangle that is nowhere near
|
|
218
|
+
* the truth — the mark then appears in a patch of the frame it has nothing to do with, and the
|
|
219
|
+
* rest of it silently does not draw. So a box with any corner at or behind the eye is scissored to
|
|
220
|
+
* the whole viewport, which is always correct and merely costs more, and one with *every* corner
|
|
221
|
+
* behind is skipped entirely.
|
|
222
|
+
*
|
|
223
|
+
* `yDown` is which way the caller's framebuffer counts rows: false for WebGL2's `gl.scissor`,
|
|
224
|
+
* whose origin is the bottom left, and true for WebGPU's `setScissorRect`, whose origin is the top
|
|
225
|
+
* left. Both describe the same pixels, and the pair is here rather than in either backend for the
|
|
226
|
+
* reason `DEPTH_01_TO_CLIP_Y_DOWN` gives at length: a convention held in two places is a pass that
|
|
227
|
+
* marks the mirror image of what it should on one backend and nothing raises.
|
|
228
|
+
*
|
|
229
|
+
* Returns false when there is nothing to draw, and fills `out` with `[x, y, width, height]` when
|
|
230
|
+
* there is.
|
|
231
|
+
*/
|
|
232
|
+
export function decalScissor(
|
|
233
|
+
viewProjection: ReadonlyMat4,
|
|
234
|
+
decalToWorld: ReadonlyMat4,
|
|
235
|
+
width: number,
|
|
236
|
+
height: number,
|
|
237
|
+
yDown: boolean,
|
|
238
|
+
out: Int32Array,
|
|
239
|
+
): boolean {
|
|
240
|
+
let minX = Infinity;
|
|
241
|
+
let maxX = -Infinity;
|
|
242
|
+
let minY = Infinity;
|
|
243
|
+
let maxY = -Infinity;
|
|
244
|
+
let behind = 0;
|
|
245
|
+
|
|
246
|
+
for (let corner = 0; corner < 8; corner++) {
|
|
247
|
+
const bx = (corner & 1) === 0 ? -1 : 1;
|
|
248
|
+
const by = (corner & 2) === 0 ? -1 : 1;
|
|
249
|
+
const bz = (corner & 4) === 0 ? -1 : 1;
|
|
250
|
+
|
|
251
|
+
/* Box space to world, then world to clip, without a scratch matrix: two transforms of one
|
|
252
|
+
point is less work than the 4x4 multiply that would fuse them, and this runs per decal. */
|
|
253
|
+
for (let row = 0; row < 4; row++) {
|
|
254
|
+
CORNER[row] =
|
|
255
|
+
(decalToWorld[row] ?? 0) * bx +
|
|
256
|
+
(decalToWorld[4 + row] ?? 0) * by +
|
|
257
|
+
(decalToWorld[8 + row] ?? 0) * bz +
|
|
258
|
+
(decalToWorld[12 + row] ?? 0);
|
|
259
|
+
}
|
|
260
|
+
const wx = CORNER[0] ?? 0;
|
|
261
|
+
const wy = CORNER[1] ?? 0;
|
|
262
|
+
const wz = CORNER[2] ?? 0;
|
|
263
|
+
const clipX =
|
|
264
|
+
(viewProjection[0] ?? 0) * wx +
|
|
265
|
+
(viewProjection[4] ?? 0) * wy +
|
|
266
|
+
(viewProjection[8] ?? 0) * wz +
|
|
267
|
+
(viewProjection[12] ?? 0);
|
|
268
|
+
const clipY =
|
|
269
|
+
(viewProjection[1] ?? 0) * wx +
|
|
270
|
+
(viewProjection[5] ?? 0) * wy +
|
|
271
|
+
(viewProjection[9] ?? 0) * wz +
|
|
272
|
+
(viewProjection[13] ?? 0);
|
|
273
|
+
const clipW =
|
|
274
|
+
(viewProjection[3] ?? 0) * wx +
|
|
275
|
+
(viewProjection[7] ?? 0) * wy +
|
|
276
|
+
(viewProjection[11] ?? 0) * wz +
|
|
277
|
+
(viewProjection[15] ?? 0);
|
|
278
|
+
|
|
279
|
+
if (clipW <= 1e-6) {
|
|
280
|
+
behind++;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const ndcX = clipX / clipW;
|
|
284
|
+
const ndcY = clipY / clipW;
|
|
285
|
+
if (ndcX < minX) minX = ndcX;
|
|
286
|
+
if (ndcX > maxX) maxX = ndcX;
|
|
287
|
+
if (ndcY < minY) minY = ndcY;
|
|
288
|
+
if (ndcY > maxY) maxY = ndcY;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (behind === 8) return false;
|
|
292
|
+
if (behind > 0) {
|
|
293
|
+
out[0] = 0;
|
|
294
|
+
out[1] = 0;
|
|
295
|
+
out[2] = width;
|
|
296
|
+
out[3] = height;
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
const left = Math.max(0, Math.floor(((minX + 1) / 2) * width) - SCISSOR_PAD);
|
|
301
|
+
const right = Math.min(width, Math.ceil(((maxX + 1) / 2) * width) + SCISSOR_PAD);
|
|
302
|
+
const bottom = Math.max(0, Math.floor(((minY + 1) / 2) * height) - SCISSOR_PAD);
|
|
303
|
+
const top = Math.min(height, Math.ceil(((maxY + 1) / 2) * height) + SCISSOR_PAD);
|
|
304
|
+
if (right <= left || top <= bottom) return false;
|
|
305
|
+
|
|
306
|
+
out[0] = left;
|
|
307
|
+
out[1] = yDown ? height - top : bottom;
|
|
308
|
+
out[2] = right - left;
|
|
309
|
+
out[3] = top - bottom;
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* A projector a consumer holds and moves.
|
|
315
|
+
*
|
|
316
|
+
* **Held rather than passed per call**, because that is what the row is for: a mark that follows
|
|
317
|
+
* something is a pose written every frame, and rebuilding two matrices from four vectors is the
|
|
318
|
+
* whole of that. Both matrices live in the object and are rewritten in place, so a scene with a
|
|
319
|
+
* hundred marks allocates on the frame it creates them and never again.
|
|
320
|
+
*/
|
|
321
|
+
export class DecalProjector {
|
|
322
|
+
/** World space into the unit box. Rewritten in place by `setPose` and `setSize`. */
|
|
323
|
+
readonly worldToDecal = new Float32Array(16);
|
|
324
|
+
/** The unit box back into the world, for the scissor bound. */
|
|
325
|
+
readonly decalToWorld = new Float32Array(16);
|
|
326
|
+
/** The projection axis, normalised, which the facing test compares a surface normal against. */
|
|
327
|
+
readonly axis = new Float32Array(3);
|
|
328
|
+
/** What the mark multiplies the surface by. */
|
|
329
|
+
readonly color = new Float32Array(3);
|
|
330
|
+
|
|
331
|
+
opacity: number;
|
|
332
|
+
facingCos: number;
|
|
333
|
+
softness: number;
|
|
334
|
+
|
|
335
|
+
private readonly box: {
|
|
336
|
+
center: Float32Array;
|
|
337
|
+
halfExtents: Float32Array;
|
|
338
|
+
forward: Float32Array;
|
|
339
|
+
up: Float32Array;
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
constructor(options: DecalProjectorOptions) {
|
|
343
|
+
this.box = {
|
|
344
|
+
center: Float32Array.from(options.center as ArrayLike<number>),
|
|
345
|
+
halfExtents: Float32Array.from(options.halfExtents as ArrayLike<number>),
|
|
346
|
+
forward: Float32Array.from(options.forward as ArrayLike<number>),
|
|
347
|
+
up: Float32Array.from(options.up as ArrayLike<number>),
|
|
348
|
+
};
|
|
349
|
+
this.color.set(options.color === undefined ? [1, 1, 1] : (options.color as ArrayLike<number>));
|
|
350
|
+
this.opacity = options.opacity ?? 1;
|
|
351
|
+
/* The same 0.1 `projectDecal` defaults to, which keeps everything within about 84 degrees of
|
|
352
|
+
facing — and for the same reason, stated there. */
|
|
353
|
+
this.facingCos = options.facingCos ?? 0.1;
|
|
354
|
+
/* A quarter of the radius as edge. A hard ellipse reads as a decal that was cut out with
|
|
355
|
+
scissors, and a mark with no texture has nothing else to soften it. */
|
|
356
|
+
this.softness = options.softness ?? 0.25;
|
|
357
|
+
this.rebuild();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** Move the projector. Allocation-free, so a mark may follow something every frame. */
|
|
361
|
+
setPose(center: ReadonlyVec3, forward: ReadonlyVec3, up: ReadonlyVec3): void {
|
|
362
|
+
this.box.center.set(center as ArrayLike<number>);
|
|
363
|
+
this.box.forward.set(forward as ArrayLike<number>);
|
|
364
|
+
this.box.up.set(up as ArrayLike<number>);
|
|
365
|
+
this.rebuild();
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** Resize the box, on the same terms. */
|
|
369
|
+
setSize(halfExtents: ReadonlyVec3): void {
|
|
370
|
+
this.box.halfExtents.set(halfExtents as ArrayLike<number>);
|
|
371
|
+
this.rebuild();
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
setColor(color: ReadonlyVec3): void {
|
|
375
|
+
this.color.set(color as ArrayLike<number>);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
private rebuild(): void {
|
|
379
|
+
worldToDecalMatrix(this.worldToDecal, this.box);
|
|
380
|
+
decalToWorldMatrix(this.decalToWorld, this.box);
|
|
381
|
+
/* `frame` left the normalised axis in its scratch, and reading it back here would couple this
|
|
382
|
+
to the order those two ran in. Normalised again instead: it is three multiplies once per
|
|
383
|
+
pose, against a coupling that would break silently. */
|
|
384
|
+
const f = this.box.forward;
|
|
385
|
+
const length = Math.hypot(f[0] ?? 0, f[1] ?? 0, f[2] ?? 0);
|
|
386
|
+
this.axis[0] = (f[0] ?? 0) / length;
|
|
387
|
+
this.axis[1] = (f[1] ?? 0) / length;
|
|
388
|
+
this.axis[2] = (f[2] ?? 0) / length;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { DecalProjector } from './decalProjector.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The frame's drawn decals, held until the pass that reads the depth buffer can run.
|
|
5
|
+
*
|
|
6
|
+
* **The pass cannot run where the call is made.** A projected decal is decided from the depth the
|
|
7
|
+
* frame has drawn, so it has to happen once the opaque world is finished — and a consumer submits
|
|
8
|
+
* a mark wherever in its own frame the thing that made the mark lives. So `drawDecal` records and
|
|
9
|
+
* the renderer replays, exactly as `TranslucentQueue` does for the order-independent passes.
|
|
10
|
+
*
|
|
11
|
+
* **Everything is copied, and that is the whole correctness of this file.** A projector is an
|
|
12
|
+
* object a consumer keeps and moves: it is submitted, then moved to follow whatever it is stuck
|
|
13
|
+
* to, and submitted again next frame. A queue holding the reference would replay every mark
|
|
14
|
+
* wearing the last pose written — one wheel's skid under every wheel — which is a plausible
|
|
15
|
+
* picture rather than an obviously broken one, and that is the kind that gets blamed on the pass.
|
|
16
|
+
*
|
|
17
|
+
* **Records are pooled and never released**, for the reason `AGENTS.md` gives: `reset` returns the
|
|
18
|
+
* count to zero and keeps the storage, so a steady scene allocates on its first frame and never
|
|
19
|
+
* again.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* How many marks one frame may draw.
|
|
24
|
+
*
|
|
25
|
+
* **A cap rather than an open number**, because each is a scissored pass of its own with a uniform
|
|
26
|
+
* slot behind it, and the slots are one buffer written before the passes are recorded. Thirty-two
|
|
27
|
+
* is more than a scene has needed: a mark is a projector kept alive per frame, and a world with
|
|
28
|
+
* more than thirty-two of them in view at once wants `projectDecal`, which costs nothing per frame
|
|
29
|
+
* and is what the static half of this row is for.
|
|
30
|
+
*/
|
|
31
|
+
export const MAX_DRAWN_DECALS = 32;
|
|
32
|
+
|
|
33
|
+
/** One recorded mark. Every field is a copy of what the projector held when it was submitted. */
|
|
34
|
+
export interface DrawnDecal {
|
|
35
|
+
readonly worldToDecal: Float32Array;
|
|
36
|
+
readonly decalToWorld: Float32Array;
|
|
37
|
+
readonly axis: Float32Array;
|
|
38
|
+
readonly color: Float32Array;
|
|
39
|
+
opacity: number;
|
|
40
|
+
facingCos: number;
|
|
41
|
+
softness: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function newRecord(): DrawnDecal {
|
|
45
|
+
return {
|
|
46
|
+
worldToDecal: new Float32Array(16),
|
|
47
|
+
decalToWorld: new Float32Array(16),
|
|
48
|
+
axis: new Float32Array(3),
|
|
49
|
+
color: new Float32Array(3),
|
|
50
|
+
opacity: 1,
|
|
51
|
+
facingCos: 0.1,
|
|
52
|
+
softness: 0.25,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class DecalQueue {
|
|
57
|
+
private readonly pool: DrawnDecal[] = [];
|
|
58
|
+
private count = 0;
|
|
59
|
+
/** Set once when the cap is first reached, so a scene over it says so and then draws. */
|
|
60
|
+
private warned = false;
|
|
61
|
+
|
|
62
|
+
/** How many marks this frame has recorded. */
|
|
63
|
+
get length(): number {
|
|
64
|
+
return this.count;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
|
|
68
|
+
get capacity(): number {
|
|
69
|
+
return this.pool.length;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
record(projector: DecalProjector): void {
|
|
73
|
+
if (this.count >= MAX_DRAWN_DECALS) {
|
|
74
|
+
if (!this.warned) {
|
|
75
|
+
this.warned = true;
|
|
76
|
+
console.warn(
|
|
77
|
+
`driftengine: more than ${MAX_DRAWN_DECALS} drawn decals in one frame, so the rest are ` +
|
|
78
|
+
'dropped. A mark that never moves is cheaper as projectDecal, which builds it once.',
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let record = this.pool[this.count];
|
|
85
|
+
if (record === undefined) {
|
|
86
|
+
record = newRecord();
|
|
87
|
+
this.pool.push(record);
|
|
88
|
+
}
|
|
89
|
+
record.worldToDecal.set(projector.worldToDecal);
|
|
90
|
+
record.decalToWorld.set(projector.decalToWorld);
|
|
91
|
+
record.axis.set(projector.axis);
|
|
92
|
+
record.color.set(projector.color);
|
|
93
|
+
record.opacity = Math.min(1, Math.max(0, projector.opacity));
|
|
94
|
+
record.facingCos = projector.facingCos;
|
|
95
|
+
record.softness = Math.min(1, Math.max(0, projector.softness));
|
|
96
|
+
this.count++;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
replay(each: (decal: DrawnDecal) => void): void {
|
|
100
|
+
for (let i = 0; i < this.count; i++) {
|
|
101
|
+
const record = this.pool[i];
|
|
102
|
+
if (record !== undefined) each(record);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Empty it for the next frame, keeping the storage. */
|
|
107
|
+
reset(): void {
|
|
108
|
+
this.count = 0;
|
|
109
|
+
}
|
|
110
|
+
}
|