@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,74 @@
|
|
|
1
|
+
import { type HandleRegistry } from './handleRegistry.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A compute definition a package contributes, and the two things it is handed.
|
|
4
|
+
*
|
|
5
|
+
* **This is `pass.ts` again, for the one stage that only one backend has.** A package that wants
|
|
6
|
+
* a radix sort, a light binner or a skinning kernel has nowhere to put it: the renderer's verb
|
|
7
|
+
* surface is fixed and nothing outside `render/` can add to it. `registerPass` answered that for
|
|
8
|
+
* drawing; this answers it for the stage before drawing.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* What a registered definition is handed once, at registration, to build its resources.
|
|
12
|
+
*
|
|
13
|
+
* **There is no WebGL2 arm, and that absence is the type saying so.** `PassDevice` is a union
|
|
14
|
+
* because both backends can draw. WebGL2 has no compute shaders — not "not yet", the language has
|
|
15
|
+
* none — so a second arm would be a shape a contributor could switch on and never reach.
|
|
16
|
+
* `Renderer.computeSupported` answers `false` there and `registerCompute` refuses in words.
|
|
17
|
+
*
|
|
18
|
+
* Tagged all the same, so that a second arm arriving later is a compile error at every
|
|
19
|
+
* contributor rather than a silent widening, and so this reads as the same shape as `PassDevice`
|
|
20
|
+
* to somebody who has just read that one.
|
|
21
|
+
*/
|
|
22
|
+
export type ComputeDevice = {
|
|
23
|
+
readonly backend: 'webgpu';
|
|
24
|
+
readonly device: GPUDevice;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* What it is handed at each dispatch.
|
|
28
|
+
*
|
|
29
|
+
* **The engine opens the pass and hands it over, rather than handing over the command encoder.**
|
|
30
|
+
* A definition holding the encoder could open a compute pass while a render pass was open, which
|
|
31
|
+
* WebGPU forbids and which reports itself at `submit` rather than at the call that caused it —
|
|
32
|
+
* the failure shape the 2026-08-14 rule is about, where the result is no picture from a frame
|
|
33
|
+
* that recorded correctly. Handing over the pass keeps that invariant in one place instead of in
|
|
34
|
+
* every contributor.
|
|
35
|
+
*
|
|
36
|
+
* A definition that needs an encoder of its own for a readback still has one: it holds `device`
|
|
37
|
+
* from `init`, and a `copyBufferToBuffer` submitted afterwards sees this dispatch's result,
|
|
38
|
+
* because submission order is execution order.
|
|
39
|
+
*/
|
|
40
|
+
export type ComputeContext = {
|
|
41
|
+
readonly backend: 'webgpu';
|
|
42
|
+
readonly pass: GPUComputePassEncoder;
|
|
43
|
+
};
|
|
44
|
+
export interface ComputeDefinition {
|
|
45
|
+
/** For diagnostics, and for the label the backend gives the encoder and the pass. */
|
|
46
|
+
readonly label: string;
|
|
47
|
+
/** Build pipelines and buffers. Called once, when the definition is registered. */
|
|
48
|
+
init?(device: ComputeDevice): void;
|
|
49
|
+
/**
|
|
50
|
+
* Set a pipeline, set bind groups, and call `dispatchWorkgroups`.
|
|
51
|
+
*
|
|
52
|
+
* **The workgroup count is yours and does not cross the surface**, exactly as a contributed
|
|
53
|
+
* pass issues its own draw calls. The count comes from data the definition owns — a light
|
|
54
|
+
* count, a cluster count — so a renderer-side `(x, y, z)` would be one fact in two places, and
|
|
55
|
+
* the renderer's copy would be the one nobody updated.
|
|
56
|
+
*
|
|
57
|
+
* **Allocates nothing.** This is a per-frame path and the house rule about them binds a
|
|
58
|
+
* contributor exactly as it binds the renderer.
|
|
59
|
+
*/
|
|
60
|
+
dispatch(ctx: ComputeContext): void;
|
|
61
|
+
/** Release what `init` built. Called on `unregisterCompute` and when the renderer is disposed. */
|
|
62
|
+
dispose?(device: ComputeDevice): void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A registered definition, as the caller holds it.
|
|
66
|
+
*
|
|
67
|
+
* A slot and a generation packed into one number, for the reason `PassHandle` explains: a handle
|
|
68
|
+
* kept past `unregisterCompute` answers nothing rather than answering to whoever took the slot.
|
|
69
|
+
*/
|
|
70
|
+
export type ComputeHandle = number;
|
|
71
|
+
export type ComputeRegistry = HandleRegistry<ComputeDefinition>;
|
|
72
|
+
export declare function createComputeRegistry(): ComputeRegistry;
|
|
73
|
+
/** The definition a handle names, or `undefined` if it names one that has been released. */
|
|
74
|
+
export declare function computeAt(registry: ComputeRegistry, handle: ComputeHandle): ComputeDefinition | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createHandleRegistry, definitionAt } from './handleRegistry.js';
|
|
2
|
+
export function createComputeRegistry() {
|
|
3
|
+
return createHandleRegistry();
|
|
4
|
+
}
|
|
5
|
+
/** The definition a handle names, or `undefined` if it names one that has been released. */
|
|
6
|
+
export function computeAt(registry, handle) {
|
|
7
|
+
return definitionAt(registry, handle);
|
|
8
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notice a lost drawing context, notice it coming back, and ask the browser for it.
|
|
3
|
+
*
|
|
4
|
+
* The engine owns the GL context, so it owns noticing both halves. A game reaching for
|
|
5
|
+
* `renderer.canvas.addEventListener('webglcontextlost')` would be the game reaching into
|
|
6
|
+
* the engine's internals.
|
|
7
|
+
*
|
|
8
|
+
* `preventDefault` is not politeness: it is the browser's signal that the page intends to
|
|
9
|
+
* restore rather than to die. Without it the context is gone for good and the player is
|
|
10
|
+
* looking at a black canvas that nothing will ever repaint.
|
|
11
|
+
*
|
|
12
|
+
* **The restore is a separate sink, and that is the point.** Routing it to `onLost` would
|
|
13
|
+
* report a fault at the moment the fault ended, which reads in a bug report as a device
|
|
14
|
+
* that lost its context twice. `NFD6QQ` is the report that proved the restore half was
|
|
15
|
+
* missing altogether: the promise `preventDefault` makes was made 29 s into a session on
|
|
16
|
+
* an Adreno 619, and nothing in either repository had ever been listening to keep it.
|
|
17
|
+
*
|
|
18
|
+
* Restoring is *not* the same as redrawing. Every resource the renderer holds is created
|
|
19
|
+
* in its constructor and `readonly` thereafter — the same reason a quality change is
|
|
20
|
+
* construction-time — so a listener that wants pixels again has to take the page through
|
|
21
|
+
* a reload. This function only makes the moment observable.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Returns a detach function, which a renderer that can be torn down has to call.
|
|
25
|
+
*
|
|
26
|
+
* The listeners used to be anonymous and therefore unremovable. That is invisible in a
|
|
27
|
+
* game whose renderer lives as long as its page, and a leak in one that does not: a game
|
|
28
|
+
* embedded in a website is mounted and unmounted every time the player enters and leaves
|
|
29
|
+
* it, and each mount left a pair of listeners holding the previous renderer alive through
|
|
30
|
+
* their closures.
|
|
31
|
+
*/
|
|
32
|
+
export declare function attachContextLoss(canvas: HTMLCanvasElement, onLost: () => void, onRestored: () => void): () => void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notice a lost drawing context, notice it coming back, and ask the browser for it.
|
|
3
|
+
*
|
|
4
|
+
* The engine owns the GL context, so it owns noticing both halves. A game reaching for
|
|
5
|
+
* `renderer.canvas.addEventListener('webglcontextlost')` would be the game reaching into
|
|
6
|
+
* the engine's internals.
|
|
7
|
+
*
|
|
8
|
+
* `preventDefault` is not politeness: it is the browser's signal that the page intends to
|
|
9
|
+
* restore rather than to die. Without it the context is gone for good and the player is
|
|
10
|
+
* looking at a black canvas that nothing will ever repaint.
|
|
11
|
+
*
|
|
12
|
+
* **The restore is a separate sink, and that is the point.** Routing it to `onLost` would
|
|
13
|
+
* report a fault at the moment the fault ended, which reads in a bug report as a device
|
|
14
|
+
* that lost its context twice. `NFD6QQ` is the report that proved the restore half was
|
|
15
|
+
* missing altogether: the promise `preventDefault` makes was made 29 s into a session on
|
|
16
|
+
* an Adreno 619, and nothing in either repository had ever been listening to keep it.
|
|
17
|
+
*
|
|
18
|
+
* Restoring is *not* the same as redrawing. Every resource the renderer holds is created
|
|
19
|
+
* in its constructor and `readonly` thereafter — the same reason a quality change is
|
|
20
|
+
* construction-time — so a listener that wants pixels again has to take the page through
|
|
21
|
+
* a reload. This function only makes the moment observable.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Returns a detach function, which a renderer that can be torn down has to call.
|
|
25
|
+
*
|
|
26
|
+
* The listeners used to be anonymous and therefore unremovable. That is invisible in a
|
|
27
|
+
* game whose renderer lives as long as its page, and a leak in one that does not: a game
|
|
28
|
+
* embedded in a website is mounted and unmounted every time the player enters and leaves
|
|
29
|
+
* it, and each mount left a pair of listeners holding the previous renderer alive through
|
|
30
|
+
* their closures.
|
|
31
|
+
*/
|
|
32
|
+
export function attachContextLoss(canvas, onLost, onRestored) {
|
|
33
|
+
const lost = (event) => {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
onLost();
|
|
36
|
+
};
|
|
37
|
+
const restored = () => {
|
|
38
|
+
onRestored();
|
|
39
|
+
};
|
|
40
|
+
canvas.addEventListener('webglcontextlost', lost);
|
|
41
|
+
canvas.addEventListener('webglcontextrestored', restored);
|
|
42
|
+
return () => {
|
|
43
|
+
canvas.removeEventListener('webglcontextlost', lost);
|
|
44
|
+
canvas.removeEventListener('webglcontextrestored', restored);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { LineSegments } from './linePoints.ts';
|
|
2
|
+
import type { MeshData } from './mesh.ts';
|
|
3
|
+
import type { ConvexShape } from '@driftengine/physics';
|
|
4
|
+
import type { PhysicsWorld } from '@driftengine/physics';
|
|
5
|
+
/**
|
|
6
|
+
* Debug geometry, as line segments the renderer already knows how to draw.
|
|
7
|
+
*
|
|
8
|
+
* **This is the generator and not a pass**, and that is the whole reason it is small: `drawLines`
|
|
9
|
+
* has shipped on both backends since the polyline batch landed, with a world-space width and a
|
|
10
|
+
* pixel floor so a distant line does not strobe. What was missing was anything that turns what you
|
|
11
|
+
* want to *see* — a mesh's normals, the colliders a body actually carries — into segments, so every
|
|
12
|
+
* consumer who wanted a normals key wrote the geometry themselves or, far more often, did not.
|
|
13
|
+
*
|
|
14
|
+
* **What its absence has cost, measured rather than supposed.** One consumer wrote geometry with
|
|
15
|
+
* downward normals four separate times: their roads, their ditch banks, their roof planes, and
|
|
16
|
+
* every building in their world lit inside out. Each was found by looking at a screenshot and
|
|
17
|
+
* wondering why tarmac was black at midday, because a flipped normal near a lamp is a dimmer
|
|
18
|
+
* surface rather than an absent one and only a directional light makes it plain. A key that draws
|
|
19
|
+
* normals turns each of those into a ten-second job.
|
|
20
|
+
*
|
|
21
|
+
* **Nothing here throws and nothing here allocates after construction.** A debug drawer that threw
|
|
22
|
+
* when it ran out of room would take the frame with it at exactly the moment somebody was trying to
|
|
23
|
+
* see what was wrong, which is the opposite of its job; so a segment past capacity is counted in
|
|
24
|
+
* `dropped` and discarded, and a consumer who cares reads that number and builds a bigger one.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DebugLines {
|
|
27
|
+
readonly segments: LineSegments;
|
|
28
|
+
private overflow;
|
|
29
|
+
constructor(capacity: number);
|
|
30
|
+
/** Segments asked for since the last `clear` that there was no room for. */
|
|
31
|
+
get dropped(): number;
|
|
32
|
+
clear(): void;
|
|
33
|
+
segment(ax: number, ay: number, az: number, bx: number, by: number, bz: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* A spike out of every vertex along its normal.
|
|
36
|
+
*
|
|
37
|
+
* `stride` skips vertices, because a mesh of a hundred thousand vertices is a hundred thousand
|
|
38
|
+
* segments and a screen with nothing legible on it. The default draws them all, which is right
|
|
39
|
+
* for the small piece of geometry somebody is actually staring at.
|
|
40
|
+
*
|
|
41
|
+
* **A mesh built from flat faces has four coincident normals per quad**, so what appears is one
|
|
42
|
+
* spike per corner rather than one per face, and that is the honest picture: the attribute is per
|
|
43
|
+
* vertex and this draws the attribute.
|
|
44
|
+
*/
|
|
45
|
+
normals(mesh: MeshData, length?: number, stride?: number): void;
|
|
46
|
+
/** The twelve edges of a world-axis box. */
|
|
47
|
+
box(cx: number, cy: number, cz: number, hx: number, hy: number, hz: number): void;
|
|
48
|
+
/** Three great circles, which is a sphere as far as an eye looking for one is concerned. */
|
|
49
|
+
sphere(cx: number, cy: number, cz: number, radius: number, points?: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* A closed ring of `points` segments, in the plane the two unit vectors span.
|
|
52
|
+
*
|
|
53
|
+
* The basis is passed in rather than derived from an axis because every caller here already has
|
|
54
|
+
* one, and deriving a perpendicular from an axis has a degenerate case that a caller with a real
|
|
55
|
+
* basis does not need to think about.
|
|
56
|
+
*/
|
|
57
|
+
circle(cx: number, cy: number, cz: number, radius: number, ux: number, uy: number, uz: number, vx: number, vy: number, vz: number, points?: number): void;
|
|
58
|
+
/**
|
|
59
|
+
* One collider, placed by a body's position and orientation.
|
|
60
|
+
*
|
|
61
|
+
* **Dispatched on what the shape *is* rather than on a stored kind**, which is the same
|
|
62
|
+
* discrimination the narrow phase makes: a `sideRadius` is a cylinder, a `triangles` is a mesh, a
|
|
63
|
+
* `radius` over one point is a sphere and over two is a capsule, and anything with faces is a
|
|
64
|
+
* polytope drawn along its own face loops. A shape that grows a new representation appears here
|
|
65
|
+
* as its polytope hull rather than as nothing, which is the failure worth having.
|
|
66
|
+
*/
|
|
67
|
+
shape(shape: ConvexShape, px: number, py: number, pz: number, qx?: number, qy?: number, qz?: number, qw?: number): void;
|
|
68
|
+
/**
|
|
69
|
+
* Every body's collider in a world, where it is this tick.
|
|
70
|
+
*
|
|
71
|
+
* The other half of the key the report asked for. Bodies with no shape are skipped rather than
|
|
72
|
+
* refused: a world may hold one for a frame while it is being built.
|
|
73
|
+
*/
|
|
74
|
+
colliders(world: PhysicsWorld): void;
|
|
75
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { createLineSegments } from './linePoints.js';
|
|
2
|
+
/**
|
|
3
|
+
* Debug geometry, as line segments the renderer already knows how to draw.
|
|
4
|
+
*
|
|
5
|
+
* **This is the generator and not a pass**, and that is the whole reason it is small: `drawLines`
|
|
6
|
+
* has shipped on both backends since the polyline batch landed, with a world-space width and a
|
|
7
|
+
* pixel floor so a distant line does not strobe. What was missing was anything that turns what you
|
|
8
|
+
* want to *see* — a mesh's normals, the colliders a body actually carries — into segments, so every
|
|
9
|
+
* consumer who wanted a normals key wrote the geometry themselves or, far more often, did not.
|
|
10
|
+
*
|
|
11
|
+
* **What its absence has cost, measured rather than supposed.** One consumer wrote geometry with
|
|
12
|
+
* downward normals four separate times: their roads, their ditch banks, their roof planes, and
|
|
13
|
+
* every building in their world lit inside out. Each was found by looking at a screenshot and
|
|
14
|
+
* wondering why tarmac was black at midday, because a flipped normal near a lamp is a dimmer
|
|
15
|
+
* surface rather than an absent one and only a directional light makes it plain. A key that draws
|
|
16
|
+
* normals turns each of those into a ten-second job.
|
|
17
|
+
*
|
|
18
|
+
* **Nothing here throws and nothing here allocates after construction.** A debug drawer that threw
|
|
19
|
+
* when it ran out of room would take the frame with it at exactly the moment somebody was trying to
|
|
20
|
+
* see what was wrong, which is the opposite of its job; so a segment past capacity is counted in
|
|
21
|
+
* `dropped` and discarded, and a consumer who cares reads that number and builds a bigger one.
|
|
22
|
+
*/
|
|
23
|
+
export class DebugLines {
|
|
24
|
+
segments;
|
|
25
|
+
overflow = 0;
|
|
26
|
+
constructor(capacity) {
|
|
27
|
+
if (!(capacity > 0))
|
|
28
|
+
throw new Error(`DebugLines: capacity must be positive, got ${capacity}`);
|
|
29
|
+
this.segments = createLineSegments(capacity);
|
|
30
|
+
}
|
|
31
|
+
/** Segments asked for since the last `clear` that there was no room for. */
|
|
32
|
+
get dropped() {
|
|
33
|
+
return this.overflow;
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this.segments.count = 0;
|
|
37
|
+
this.overflow = 0;
|
|
38
|
+
}
|
|
39
|
+
segment(ax, ay, az, bx, by, bz) {
|
|
40
|
+
const at = this.segments.count;
|
|
41
|
+
if (at >= this.segments.capacity) {
|
|
42
|
+
this.overflow++;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.segments.from[at * 3] = ax;
|
|
46
|
+
this.segments.from[at * 3 + 1] = ay;
|
|
47
|
+
this.segments.from[at * 3 + 2] = az;
|
|
48
|
+
this.segments.to[at * 3] = bx;
|
|
49
|
+
this.segments.to[at * 3 + 1] = by;
|
|
50
|
+
this.segments.to[at * 3 + 2] = bz;
|
|
51
|
+
this.segments.count = at + 1;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A spike out of every vertex along its normal.
|
|
55
|
+
*
|
|
56
|
+
* `stride` skips vertices, because a mesh of a hundred thousand vertices is a hundred thousand
|
|
57
|
+
* segments and a screen with nothing legible on it. The default draws them all, which is right
|
|
58
|
+
* for the small piece of geometry somebody is actually staring at.
|
|
59
|
+
*
|
|
60
|
+
* **A mesh built from flat faces has four coincident normals per quad**, so what appears is one
|
|
61
|
+
* spike per corner rather than one per face, and that is the honest picture: the attribute is per
|
|
62
|
+
* vertex and this draws the attribute.
|
|
63
|
+
*/
|
|
64
|
+
normals(mesh, length = 0.25, stride = 1) {
|
|
65
|
+
const count = mesh.positions.length / 3;
|
|
66
|
+
for (let v = 0; v < count; v += stride) {
|
|
67
|
+
const x = mesh.positions[v * 3] ?? 0;
|
|
68
|
+
const y = mesh.positions[v * 3 + 1] ?? 0;
|
|
69
|
+
const z = mesh.positions[v * 3 + 2] ?? 0;
|
|
70
|
+
this.segment(x, y, z, x + (mesh.normals[v * 3] ?? 0) * length, y + (mesh.normals[v * 3 + 1] ?? 0) * length, z + (mesh.normals[v * 3 + 2] ?? 0) * length);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** The twelve edges of a world-axis box. */
|
|
74
|
+
box(cx, cy, cz, hx, hy, hz) {
|
|
75
|
+
for (const [a, b] of BOX_EDGES) {
|
|
76
|
+
this.segment(cx + hx * (a[0] ?? 0), cy + hy * (a[1] ?? 0), cz + hz * (a[2] ?? 0), cx + hx * (b[0] ?? 0), cy + hy * (b[1] ?? 0), cz + hz * (b[2] ?? 0));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** Three great circles, which is a sphere as far as an eye looking for one is concerned. */
|
|
80
|
+
sphere(cx, cy, cz, radius, points = 24) {
|
|
81
|
+
this.circle(cx, cy, cz, radius, 1, 0, 0, 0, 0, 1, points);
|
|
82
|
+
this.circle(cx, cy, cz, radius, 1, 0, 0, 0, 1, 0, points);
|
|
83
|
+
this.circle(cx, cy, cz, radius, 0, 1, 0, 0, 0, 1, points);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A closed ring of `points` segments, in the plane the two unit vectors span.
|
|
87
|
+
*
|
|
88
|
+
* The basis is passed in rather than derived from an axis because every caller here already has
|
|
89
|
+
* one, and deriving a perpendicular from an axis has a degenerate case that a caller with a real
|
|
90
|
+
* basis does not need to think about.
|
|
91
|
+
*/
|
|
92
|
+
circle(cx, cy, cz, radius, ux, uy, uz, vx, vy, vz, points = 24) {
|
|
93
|
+
let px = cx + ux * radius;
|
|
94
|
+
let py = cy + uy * radius;
|
|
95
|
+
let pz = cz + uz * radius;
|
|
96
|
+
for (let i = 1; i <= points; i++) {
|
|
97
|
+
const angle = (i / points) * Math.PI * 2;
|
|
98
|
+
const c = Math.cos(angle) * radius;
|
|
99
|
+
const s = Math.sin(angle) * radius;
|
|
100
|
+
const nx = cx + ux * c + vx * s;
|
|
101
|
+
const ny = cy + uy * c + vy * s;
|
|
102
|
+
const nz = cz + uz * c + vz * s;
|
|
103
|
+
this.segment(px, py, pz, nx, ny, nz);
|
|
104
|
+
px = nx;
|
|
105
|
+
py = ny;
|
|
106
|
+
pz = nz;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* One collider, placed by a body's position and orientation.
|
|
111
|
+
*
|
|
112
|
+
* **Dispatched on what the shape *is* rather than on a stored kind**, which is the same
|
|
113
|
+
* discrimination the narrow phase makes: a `sideRadius` is a cylinder, a `triangles` is a mesh, a
|
|
114
|
+
* `radius` over one point is a sphere and over two is a capsule, and anything with faces is a
|
|
115
|
+
* polytope drawn along its own face loops. A shape that grows a new representation appears here
|
|
116
|
+
* as its polytope hull rather than as nothing, which is the failure worth having.
|
|
117
|
+
*/
|
|
118
|
+
shape(shape, px, py, pz, qx = 0, qy = 0, qz = 0, qw = 1) {
|
|
119
|
+
const points = shape.vertices.length / 3;
|
|
120
|
+
const at = (i, out) => {
|
|
121
|
+
rotate(shape.vertices[i * 3] ?? 0, shape.vertices[i * 3 + 1] ?? 0, shape.vertices[i * 3 + 2] ?? 0, qx, qy, qz, qw, out);
|
|
122
|
+
out[0] = (out[0] ?? 0) + px;
|
|
123
|
+
out[1] = (out[1] ?? 0) + py;
|
|
124
|
+
out[2] = (out[2] ?? 0) + pz;
|
|
125
|
+
};
|
|
126
|
+
const mesh = shape.triangles;
|
|
127
|
+
if (mesh !== undefined) {
|
|
128
|
+
for (let t = 0; t < mesh.triangleCount; t++) {
|
|
129
|
+
for (let e = 0; e < 3; e++) {
|
|
130
|
+
const i = mesh.indices[t * 3 + e] ?? 0;
|
|
131
|
+
const j = mesh.indices[t * 3 + ((e + 1) % 3)] ?? 0;
|
|
132
|
+
/* Each interior edge belongs to two triangles; drawing it once is the same picture at
|
|
133
|
+
half the segments, which matters when the capacity is what stops the drawing. */
|
|
134
|
+
if (i > j)
|
|
135
|
+
continue;
|
|
136
|
+
rotate(mesh.positions[i * 3] ?? 0, mesh.positions[i * 3 + 1] ?? 0, mesh.positions[i * 3 + 2] ?? 0, qx, qy, qz, qw, A);
|
|
137
|
+
rotate(mesh.positions[j * 3] ?? 0, mesh.positions[j * 3 + 1] ?? 0, mesh.positions[j * 3 + 2] ?? 0, qx, qy, qz, qw, B);
|
|
138
|
+
this.segment((A[0] ?? 0) + px, (A[1] ?? 0) + py, (A[2] ?? 0) + pz, (B[0] ?? 0) + px, (B[1] ?? 0) + py, (B[2] ?? 0) + pz);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (points === 1) {
|
|
144
|
+
at(0, A);
|
|
145
|
+
this.sphere(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, shape.radius);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (points === 2 && (shape.radius > 0 || shape.sideRadius > 0)) {
|
|
149
|
+
at(0, A);
|
|
150
|
+
at(1, B);
|
|
151
|
+
const round = shape.sideRadius > 0 ? shape.sideRadius : shape.radius;
|
|
152
|
+
basis(A, B, U, V);
|
|
153
|
+
if (shape.sideRadius > 0) {
|
|
154
|
+
/* A cylinder: two flat caps and a straight side, with a sharp rim between them. */
|
|
155
|
+
this.circle(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, round, U[0] ?? 0, U[1] ?? 0, U[2] ?? 0, V[0] ?? 0, V[1] ?? 0, V[2] ?? 0);
|
|
156
|
+
this.circle(B[0] ?? 0, B[1] ?? 0, B[2] ?? 0, round, U[0] ?? 0, U[1] ?? 0, U[2] ?? 0, V[0] ?? 0, V[1] ?? 0, V[2] ?? 0);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
/* A capsule: a ball at each end, which is what its rounding actually is. */
|
|
160
|
+
this.sphere(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, round);
|
|
161
|
+
this.sphere(B[0] ?? 0, B[1] ?? 0, B[2] ?? 0, round);
|
|
162
|
+
}
|
|
163
|
+
for (const [sx, sy] of SIDE_ANGLES) {
|
|
164
|
+
const ox = (U[0] ?? 0) * sx * round + (V[0] ?? 0) * sy * round;
|
|
165
|
+
const oy = (U[1] ?? 0) * sx * round + (V[1] ?? 0) * sy * round;
|
|
166
|
+
const oz = (U[2] ?? 0) * sx * round + (V[2] ?? 0) * sy * round;
|
|
167
|
+
this.segment((A[0] ?? 0) + ox, (A[1] ?? 0) + oy, (A[2] ?? 0) + oz, (B[0] ?? 0) + ox, (B[1] ?? 0) + oy, (B[2] ?? 0) + oz);
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const faces = shape.faceVertexStart.length - 1;
|
|
172
|
+
for (let f = 0; f < faces; f++) {
|
|
173
|
+
const start = shape.faceVertexStart[f] ?? 0;
|
|
174
|
+
const end = shape.faceVertexStart[f + 1] ?? 0;
|
|
175
|
+
for (let k = start; k < end; k++) {
|
|
176
|
+
const i = shape.faceVertexIndices[k] ?? 0;
|
|
177
|
+
const j = shape.faceVertexIndices[k + 1 === end ? start : k + 1] ?? 0;
|
|
178
|
+
/* Every edge is in two face loops, once each way round. Keeping the ascending one draws it
|
|
179
|
+
exactly once. */
|
|
180
|
+
if (i > j)
|
|
181
|
+
continue;
|
|
182
|
+
at(i, A);
|
|
183
|
+
at(j, B);
|
|
184
|
+
this.segment(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, B[0] ?? 0, B[1] ?? 0, B[2] ?? 0);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Every body's collider in a world, where it is this tick.
|
|
190
|
+
*
|
|
191
|
+
* The other half of the key the report asked for. Bodies with no shape are skipped rather than
|
|
192
|
+
* refused: a world may hold one for a frame while it is being built.
|
|
193
|
+
*/
|
|
194
|
+
colliders(world) {
|
|
195
|
+
const bodies = world.bodies;
|
|
196
|
+
for (let i = 0; i < bodies.count; i++) {
|
|
197
|
+
const shape = bodies.shape[i];
|
|
198
|
+
if (shape === undefined)
|
|
199
|
+
continue;
|
|
200
|
+
this.shape(shape, bodies.posX[i] ?? 0, bodies.posY[i] ?? 0, bodies.posZ[i] ?? 0, bodies.rotX[i] ?? 0, bodies.rotY[i] ?? 0, bodies.rotZ[i] ?? 0, bodies.rotW[i] ?? 1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Scratch, at module scope because a debug frame draws thousands of these. */
|
|
205
|
+
const A = [0, 0, 0];
|
|
206
|
+
const B = [0, 0, 0];
|
|
207
|
+
const U = [0, 0, 0];
|
|
208
|
+
const V = [0, 0, 0];
|
|
209
|
+
/** Where the four side lines of a capsule or cylinder sit around its axis. */
|
|
210
|
+
const SIDE_ANGLES = [
|
|
211
|
+
[1, 0],
|
|
212
|
+
[0, 1],
|
|
213
|
+
[-1, 0],
|
|
214
|
+
[0, -1],
|
|
215
|
+
];
|
|
216
|
+
const BOX_EDGES = (() => {
|
|
217
|
+
const corners = [];
|
|
218
|
+
for (const x of [-1, 1])
|
|
219
|
+
for (const y of [-1, 1])
|
|
220
|
+
for (const z of [-1, 1])
|
|
221
|
+
corners.push([x, y, z]);
|
|
222
|
+
const edges = [];
|
|
223
|
+
for (let i = 0; i < corners.length; i++) {
|
|
224
|
+
for (let j = i + 1; j < corners.length; j++) {
|
|
225
|
+
const a = corners[i];
|
|
226
|
+
const b = corners[j];
|
|
227
|
+
let differing = 0;
|
|
228
|
+
for (let k = 0; k < 3; k++)
|
|
229
|
+
if (a[k] !== b[k])
|
|
230
|
+
differing++;
|
|
231
|
+
if (differing === 1)
|
|
232
|
+
edges.push([a, b]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return edges;
|
|
236
|
+
})();
|
|
237
|
+
/** `q * v * q⁻¹`, the standard two-cross form, into `out`. */
|
|
238
|
+
function rotate(x, y, z, qx, qy, qz, qw, out) {
|
|
239
|
+
const tx = 2 * (qy * z - qz * y);
|
|
240
|
+
const ty = 2 * (qz * x - qx * z);
|
|
241
|
+
const tz = 2 * (qx * y - qy * x);
|
|
242
|
+
out[0] = x + qw * tx + (qy * tz - qz * ty);
|
|
243
|
+
out[1] = y + qw * ty + (qz * tx - qx * tz);
|
|
244
|
+
out[2] = z + qw * tz + (qx * ty - qy * tx);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Two unit vectors perpendicular to the segment `a → b`, and to each other.
|
|
248
|
+
*
|
|
249
|
+
* The perpendicular is taken against whichever world axis the segment points along least, which is
|
|
250
|
+
* what stops the cross product collapsing for an axis-aligned shape — and every capsule and
|
|
251
|
+
* cylinder anybody builds is axis-aligned, so the degenerate case is the common one rather than the
|
|
252
|
+
* exotic one.
|
|
253
|
+
*/
|
|
254
|
+
function basis(a, b, u, v) {
|
|
255
|
+
let ax = (b[0] ?? 0) - (a[0] ?? 0);
|
|
256
|
+
let ay = (b[1] ?? 0) - (a[1] ?? 0);
|
|
257
|
+
let az = (b[2] ?? 0) - (a[2] ?? 0);
|
|
258
|
+
const length = Math.hypot(ax, ay, az) || 1;
|
|
259
|
+
ax /= length;
|
|
260
|
+
ay /= length;
|
|
261
|
+
az /= length;
|
|
262
|
+
const absX = Math.abs(ax);
|
|
263
|
+
const absY = Math.abs(ay);
|
|
264
|
+
const absZ = Math.abs(az);
|
|
265
|
+
const px = absX <= absY && absX <= absZ ? 1 : 0;
|
|
266
|
+
const py = absY < absX && absY <= absZ ? 1 : 0;
|
|
267
|
+
const pz = px === 0 && py === 0 ? 1 : 0;
|
|
268
|
+
let ux = ay * pz - az * py;
|
|
269
|
+
let uy = az * px - ax * pz;
|
|
270
|
+
let uz = ax * py - ay * px;
|
|
271
|
+
const ulength = Math.hypot(ux, uy, uz) || 1;
|
|
272
|
+
ux /= ulength;
|
|
273
|
+
uy /= ulength;
|
|
274
|
+
uz /= ulength;
|
|
275
|
+
u[0] = ux;
|
|
276
|
+
u[1] = uy;
|
|
277
|
+
u[2] = uz;
|
|
278
|
+
v[0] = ay * uz - az * uy;
|
|
279
|
+
v[1] = az * ux - ax * uz;
|
|
280
|
+
v[2] = ax * uy - ay * ux;
|
|
281
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
2
|
+
import type { DecalQueue } from './decalQueue.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Drawn decals on WebGL2: one scissored triangle per mark, multiplied into the finished scene.
|
|
5
|
+
*
|
|
6
|
+
* **The whole pass is a blend state and a rectangle.** There is no geometry, no vertex buffer and
|
|
7
|
+
* no depth test: the mark is decided per pixel from the depth copy, so the only thing the
|
|
8
|
+
* rasteriser is asked for is coverage of the part of the screen the projector box can possibly
|
|
9
|
+
* reach. `decalScissor` computes that from the box's eight corners, which is what stands in for
|
|
10
|
+
* drawing the box as a mesh and is argued there.
|
|
11
|
+
*
|
|
12
|
+
* **`(ZERO, SRC_COLOR)` is the effect.** The result is `dst * src`, so a fragment writing white
|
|
13
|
+
* changes nothing and one writing the mark's colour tints what is under it — including the
|
|
14
|
+
* receiver's lighting, which is the reason to multiply and is stated at length in the shader.
|
|
15
|
+
*/
|
|
16
|
+
export declare class DecalPass {
|
|
17
|
+
private readonly gl;
|
|
18
|
+
private readonly program;
|
|
19
|
+
private readonly uniforms;
|
|
20
|
+
private readonly vao;
|
|
21
|
+
/** `inverse(viewProjection) * DEPTH_01_TO_CLIP`, rebuilt once a frame rather than per mark. */
|
|
22
|
+
private readonly depthToWorld;
|
|
23
|
+
private readonly scissor;
|
|
24
|
+
constructor(gl: WebGL2RenderingContext);
|
|
25
|
+
/**
|
|
26
|
+
* Mark the bound framebuffer with everything the queue recorded.
|
|
27
|
+
*
|
|
28
|
+
* `viewProjection` is the **raw** camera matrix, not the clip-corrected one: `DEPTH_01_TO_CLIP`
|
|
29
|
+
* turns a stored depth back into the clip space that matrix was built in, and pairing it with
|
|
30
|
+
* the corrected one applies the remap twice. `lightVolumeDraw.ts` carries that derivation.
|
|
31
|
+
*/
|
|
32
|
+
drawDecals(queue: DecalQueue, depth: WebGLTexture, viewProjection: ReadonlyMat4, eye: ArrayLike<number>, width: number, height: number): void;
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 { DECAL_PROJECT_FRAG } from './shaders/decalProject.js';
|
|
6
|
+
import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
|
|
7
|
+
/**
|
|
8
|
+
* Drawn decals on WebGL2: one scissored triangle per mark, multiplied into the finished scene.
|
|
9
|
+
*
|
|
10
|
+
* **The whole pass is a blend state and a rectangle.** There is no geometry, no vertex buffer and
|
|
11
|
+
* no depth test: the mark is decided per pixel from the depth copy, so the only thing the
|
|
12
|
+
* rasteriser is asked for is coverage of the part of the screen the projector box can possibly
|
|
13
|
+
* reach. `decalScissor` computes that from the box's eight corners, which is what stands in for
|
|
14
|
+
* drawing the box as a mesh and is argued there.
|
|
15
|
+
*
|
|
16
|
+
* **`(ZERO, SRC_COLOR)` is the effect.** The result is `dst * src`, so a fragment writing white
|
|
17
|
+
* changes nothing and one writing the mark's colour tints what is under it — including the
|
|
18
|
+
* receiver's lighting, which is the reason to multiply and is stated at length in the shader.
|
|
19
|
+
*/
|
|
20
|
+
export class DecalPass {
|
|
21
|
+
gl;
|
|
22
|
+
program;
|
|
23
|
+
uniforms;
|
|
24
|
+
vao;
|
|
25
|
+
/** `inverse(viewProjection) * DEPTH_01_TO_CLIP`, rebuilt once a frame rather than per mark. */
|
|
26
|
+
depthToWorld = new Float32Array(16);
|
|
27
|
+
scissor = new Int32Array(4);
|
|
28
|
+
constructor(gl) {
|
|
29
|
+
this.gl = gl;
|
|
30
|
+
this.program = compileProgram(gl, FULLSCREEN_VERT, DECAL_PROJECT_FRAG, 'decalProject');
|
|
31
|
+
this.uniforms = uniformLocations(gl, this.program, 'decalPass');
|
|
32
|
+
const vao = gl.createVertexArray();
|
|
33
|
+
if (vao === null)
|
|
34
|
+
throw new Error('DecalPass: createVertexArray failed');
|
|
35
|
+
this.vao = vao;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Mark the bound framebuffer with everything the queue recorded.
|
|
39
|
+
*
|
|
40
|
+
* `viewProjection` is the **raw** camera matrix, not the clip-corrected one: `DEPTH_01_TO_CLIP`
|
|
41
|
+
* turns a stored depth back into the clip space that matrix was built in, and pairing it with
|
|
42
|
+
* the corrected one applies the remap twice. `lightVolumeDraw.ts` carries that derivation.
|
|
43
|
+
*/
|
|
44
|
+
drawDecals(queue, depth, viewProjection, eye, width, height) {
|
|
45
|
+
if (queue.length === 0)
|
|
46
|
+
return;
|
|
47
|
+
const { gl } = this;
|
|
48
|
+
const u = this.uniforms;
|
|
49
|
+
mat4.invert(this.depthToWorld, viewProjection);
|
|
50
|
+
mat4.multiply(this.depthToWorld, this.depthToWorld, DEPTH_01_TO_CLIP);
|
|
51
|
+
gl.useProgram(this.program);
|
|
52
|
+
gl.bindVertexArray(this.vao);
|
|
53
|
+
gl.disable(gl.DEPTH_TEST);
|
|
54
|
+
gl.depthMask(false);
|
|
55
|
+
gl.disable(gl.CULL_FACE);
|
|
56
|
+
gl.enable(gl.BLEND);
|
|
57
|
+
gl.blendFunc(gl.ZERO, gl.SRC_COLOR);
|
|
58
|
+
gl.enable(gl.SCISSOR_TEST);
|
|
59
|
+
/* Unit 0, chosen rather than inherited: `bindTexture` binds to whichever unit is active, and
|
|
60
|
+
the renderer leaves that wherever its last pass finished. `OitPass` records what leaving it
|
|
61
|
+
there cost. */
|
|
62
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
63
|
+
gl.bindTexture(gl.TEXTURE_2D, depth);
|
|
64
|
+
gl.uniform1i(u['uDecalDepth'] ?? null, 0);
|
|
65
|
+
gl.uniformMatrix4fv(u['uDecalDepthToWorld'] ?? null, false, this.depthToWorld);
|
|
66
|
+
gl.uniform3f(u['uDecalEye'] ?? null, eye[0] ?? 0, eye[1] ?? 0, eye[2] ?? 0);
|
|
67
|
+
queue.replay((decal) => {
|
|
68
|
+
/* False when the box is off-screen or wholly behind the eye, and then this mark costs a
|
|
69
|
+
matrix multiply and no fragments at all. */
|
|
70
|
+
if (!decalScissor(viewProjection, decal.decalToWorld, width, height, false, this.scissor)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
gl.scissor(this.scissor[0] ?? 0, this.scissor[1] ?? 0, this.scissor[2] ?? 0, this.scissor[3] ?? 0);
|
|
74
|
+
gl.uniformMatrix4fv(u['uWorldToDecal'] ?? null, false, decal.worldToDecal);
|
|
75
|
+
gl.uniform3fv(u['uDecalAxis'] ?? null, decal.axis);
|
|
76
|
+
gl.uniform3fv(u['uDecalColor'] ?? null, decal.color);
|
|
77
|
+
gl.uniform1f(u['uDecalOpacity'] ?? null, decal.opacity);
|
|
78
|
+
gl.uniform1f(u['uDecalFacingCos'] ?? null, decal.facingCos);
|
|
79
|
+
gl.uniform1f(u['uDecalSoftness'] ?? null, decal.softness);
|
|
80
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
81
|
+
});
|
|
82
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
83
|
+
/* And the whole viewport back, so a later `enable` inherits a rectangle that is not one mark's
|
|
84
|
+
corner of the screen. */
|
|
85
|
+
gl.scissor(0, 0, width, height);
|
|
86
|
+
gl.bindVertexArray(null);
|
|
87
|
+
/*
|
|
88
|
+
* **Released, and `OitPass` says why at length.** A binding outlives the frame it was made in,
|
|
89
|
+
* so unit 0 would keep the depth copy — which a later pass attaches as its own target while a
|
|
90
|
+
* program still declares a sampler on that unit. That is a feedback loop: reported once per
|
|
91
|
+
* draw and rasterising something undefined.
|
|
92
|
+
*/
|
|
93
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
94
|
+
gl.disable(gl.BLEND);
|
|
95
|
+
gl.depthMask(true);
|
|
96
|
+
gl.enable(gl.DEPTH_TEST);
|
|
97
|
+
}
|
|
98
|
+
dispose() {
|
|
99
|
+
const { gl } = this;
|
|
100
|
+
gl.deleteProgram(this.program);
|
|
101
|
+
gl.deleteVertexArray(this.vao);
|
|
102
|
+
}
|
|
103
|
+
}
|