@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,352 @@
|
|
|
1
|
+
import type { FrameView } from './frameView.ts';
|
|
2
|
+
import type { Vec3 } from '../math/color.ts';
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
4
|
+
import { PATCH_RESOLUTION, buildUnitSheet, buildWaterGrid } from './waterGrid.ts';
|
|
5
|
+
import { WATER_FRAG, WATER_VERT } from './shaders/water.ts';
|
|
6
|
+
import { bindAtmosphere } from './atmosphere.ts';
|
|
7
|
+
import type { Atmosphere } from './atmosphere.ts';
|
|
8
|
+
import type { PlanarReflection } from './planarReflection.ts';
|
|
9
|
+
import { bindPointLights } from './lightBudget.ts';
|
|
10
|
+
import type { PointLightSet } from './lightBudget.ts';
|
|
11
|
+
import { DEFAULT_RENDER_QUALITY } from './renderQuality.ts';
|
|
12
|
+
import { createResolvedWater, resolveWater, waterAppearance } from './waterDraw.ts';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* An endless wave surface. Game-agnostic: it takes a height, colours and a
|
|
16
|
+
* lighting environment, and knows nothing about what the water is for.
|
|
17
|
+
*
|
|
18
|
+
* The mesh is a fixed grid that follows the camera and is snapped to whole
|
|
19
|
+
* cells in the vertex shader, so a bounded vertex budget covers an unbounded
|
|
20
|
+
* ocean without the surface sliding underfoot. Displacement is Gerstner, so
|
|
21
|
+
* crests are sharp and troughs broad rather than a rolling sine blanket.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* A body of water: the sea, a fountain's basin, a tank, a puddle.
|
|
25
|
+
*
|
|
26
|
+
* One description and one material for all of them. The sea is not a special
|
|
27
|
+
* case with a shader of its own — it is this, unbounded and dense, and a
|
|
28
|
+
* fountain is this, bounded and clear. The first attempt gave a basin its own
|
|
29
|
+
* faked surface, and the correction was the right one: water should be a single
|
|
30
|
+
* configurable concept — density, visibility, up to fully transparent — rather
|
|
31
|
+
* than a trick per body of water. The sea is water too, and it gets the same
|
|
32
|
+
* reusable component with the same abilities.
|
|
33
|
+
*
|
|
34
|
+
* So every body gets the waves, the Fresnel, the specular, the fog and the
|
|
35
|
+
* planar reflection, and differs only in these numbers.
|
|
36
|
+
*/
|
|
37
|
+
export interface WaterBody {
|
|
38
|
+
/** Resting height of the surface. */
|
|
39
|
+
level: number;
|
|
40
|
+
deepColor: Vec3;
|
|
41
|
+
shallowColor: Vec3;
|
|
42
|
+
/**
|
|
43
|
+
* How much of what lies beneath it the water hides, looked straight down,
|
|
44
|
+
* 0 to 1. A sea hides its own floor; a fountain shows the tiles at the bottom
|
|
45
|
+
* of it; zero is glass. Only this end is configurable — at a grazing angle
|
|
46
|
+
* every water surface goes reflective, which is Fresnel rather than a property
|
|
47
|
+
* of the liquid.
|
|
48
|
+
*/
|
|
49
|
+
density?: number;
|
|
50
|
+
/** The surface's overall visibility, 0 to 1. Zero draws nothing. */
|
|
51
|
+
visibility?: number;
|
|
52
|
+
/**
|
|
53
|
+
* How much it mirrors regardless of viewing angle, 0 to 1.
|
|
54
|
+
*
|
|
55
|
+
* Zero is physics — reflection by Fresnel alone, which is what an ocean does and
|
|
56
|
+
* what leaves a basin looking blank from directly above, since at that angle the
|
|
57
|
+
* Fresnel term is a few percent. A pool is looked *into*, so it is allowed to
|
|
58
|
+
* cheat; the sea is not, and keeps zero.
|
|
59
|
+
*/
|
|
60
|
+
mirror?: number;
|
|
61
|
+
/**
|
|
62
|
+
* How built-up its waves are, as a multiple of what the wind is doing.
|
|
63
|
+
*
|
|
64
|
+
* One is the open sea. A basin wants a fraction of it: the same wave field at
|
|
65
|
+
* a scale where it reads as a surface breathing rather than as a swell rolling
|
|
66
|
+
* through somebody's fountain.
|
|
67
|
+
*/
|
|
68
|
+
waveScale?: number;
|
|
69
|
+
/**
|
|
70
|
+
* How worked-up this body is on its own, 0 to 1, ignoring the wind entirely.
|
|
71
|
+
*
|
|
72
|
+
* For water the weather cannot reach: a cistern, a flooded corridor, a tank. Zero is
|
|
73
|
+
* as near still as this surface goes — never glass, because dead-flat water reads as a
|
|
74
|
+
* mirror rather than as calm — and one matches a fully developed sea.
|
|
75
|
+
*
|
|
76
|
+
* Omitted, the body takes its state from the wind it is drawn with, which is what an
|
|
77
|
+
* ocean, a lake or a fountain in a courtyard should do.
|
|
78
|
+
*/
|
|
79
|
+
agitation?: number;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A bounded body: where it is, how far it reaches along each of its own axes, and which way
|
|
83
|
+
* those axes point.
|
|
84
|
+
*
|
|
85
|
+
* Omitted, the body is the endless ocean — the camera-following sheet the sea has always been.
|
|
86
|
+
* Given, it is a fixed rectangle of water sitting exactly where it was put.
|
|
87
|
+
*
|
|
88
|
+
* **It was a centre and one half-extent until 2026-08-28, and a square cannot bound a channel.**
|
|
89
|
+
* Reported from outside: a 3 by 21 metre ditch bounded by the square that contains it floods
|
|
90
|
+
* eighteen metres of field either side, so the workaround was a single *unbounded* body at the
|
|
91
|
+
* ditches' water level with the world's whole ground raised above it — a technically flooded
|
|
92
|
+
* world, held up by a rule nobody can see, that nothing anywhere may be drawn below the water
|
|
93
|
+
* line. It cost that consumer one bug already: a distant ground plane 1.6 m down, correct for its
|
|
94
|
+
* own reasons, put the village in a lake.
|
|
95
|
+
*
|
|
96
|
+
* **What this cannot do is bend.** A canal that turns is one body per straight run, and where two
|
|
97
|
+
* runs meet at a corner their sheets overlap and the blend doubles there. That is cheap to place
|
|
98
|
+
* and honest about what it draws; **what would change it** is a consumer measuring that seam as
|
|
99
|
+
* the problem, which is the day `bounds` grows a polyline and a width.
|
|
100
|
+
*/
|
|
101
|
+
bounds?: WaterBounds;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Where a bounded body sits, how far it reaches and which way it faces.
|
|
106
|
+
*
|
|
107
|
+
* **Extents are measured along the body's own axes**, `x` across and `z` along `forward`, which is
|
|
108
|
+
* how `addOrientedBox` measures a box: one convention for an oriented thing in this engine, so a
|
|
109
|
+
* reader who has met one has met both.
|
|
110
|
+
*/
|
|
111
|
+
export interface WaterBounds {
|
|
112
|
+
centreX: number;
|
|
113
|
+
centreZ: number;
|
|
114
|
+
/**
|
|
115
|
+
* Half-extent along both axes, metres: the shorthand for a square.
|
|
116
|
+
*
|
|
117
|
+
* A pool, a tank and a puddle are square often enough to be worth one number, and this is that
|
|
118
|
+
* number. `halfX` and `halfZ` override it **per axis**, so `{ halfM: 9, halfX: 2 }` is two metres
|
|
119
|
+
* across and nine along. The cost is two ways to say one square; the rule is stated here and
|
|
120
|
+
* applied in exactly one place, `resolveWater`.
|
|
121
|
+
*/
|
|
122
|
+
halfM?: number;
|
|
123
|
+
/** Half-extent across the body, metres. A channel is narrow in this one. */
|
|
124
|
+
halfX?: number;
|
|
125
|
+
/** Half-extent along `forward`, metres. A channel is long in this one. */
|
|
126
|
+
halfZ?: number;
|
|
127
|
+
/**
|
|
128
|
+
* Which way the body's own +z points, in world XZ. Unset, it points along world +z.
|
|
129
|
+
*
|
|
130
|
+
* **A direction and not an angle**, because a consumer bounding a channel, a ditch or a gutter
|
|
131
|
+
* arrives holding the direction the run takes — from a road graph, a spline's tangent, two
|
|
132
|
+
* endpoints — and converting that to radians and back is arithmetic nobody needs. It is
|
|
133
|
+
* normalised on the way in, so a length here is not a scale, and a direction of no length at all
|
|
134
|
+
* is read as unturned instead of producing a sheet at NaN.
|
|
135
|
+
*/
|
|
136
|
+
forwardX?: number;
|
|
137
|
+
forwardZ?: number;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** @deprecated The old name for an unbounded {@link WaterBody}. */
|
|
141
|
+
export type WaterSettings = WaterBody;
|
|
142
|
+
|
|
143
|
+
/** Vertices per side of a bounded body's sheet. A pool is not an ocean. */
|
|
144
|
+
|
|
145
|
+
export class WaterRenderer {
|
|
146
|
+
private readonly program: WebGLProgram;
|
|
147
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
148
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
149
|
+
/** A unit sheet, scaled per draw: every bounded body shares this one mesh. */
|
|
150
|
+
private readonly patchVao: WebGLVertexArrayObject;
|
|
151
|
+
private readonly patchIndexCount: number;
|
|
152
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
153
|
+
private readonly indexCount: number;
|
|
154
|
+
private readonly cellSize: number;
|
|
155
|
+
private readonly nearHalfExtent: number;
|
|
156
|
+
private readonly farHalfExtent: number;
|
|
157
|
+
private readonly reflectionFilterTaps: number;
|
|
158
|
+
/** Refilled per draw rather than allocated; see `createResolvedWater`. */
|
|
159
|
+
private readonly resolved = createResolvedWater();
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @param resolution cells per side of the wave-bearing near sheet.
|
|
163
|
+
* @param nearExtent total width of that sheet, in world metres.
|
|
164
|
+
* @param farHalfExtent how far the flat skirt carries the ocean out. There is
|
|
165
|
+
* no point setting this far beyond the camera's far plane — geometry past it
|
|
166
|
+
* is clipped, not drawn — so this only has to outrun the fog. See
|
|
167
|
+
* `buildWaterGrid` for why these are two meshes and not one.
|
|
168
|
+
*/
|
|
169
|
+
constructor(
|
|
170
|
+
gl: WebGL2RenderingContext,
|
|
171
|
+
resolution = 128,
|
|
172
|
+
nearExtent = 500,
|
|
173
|
+
farHalfExtent = 4000,
|
|
174
|
+
reflectionFilterTaps = DEFAULT_RENDER_QUALITY.waterReflectionFilterTaps,
|
|
175
|
+
) {
|
|
176
|
+
this.program = compileProgram(gl, WATER_VERT, WATER_FRAG, 'water');
|
|
177
|
+
this.uniforms = uniformLocations(gl, this.program, 'waterRenderer');
|
|
178
|
+
this.reflectionFilterTaps = reflectionFilterTaps;
|
|
179
|
+
|
|
180
|
+
const grid = buildWaterGrid(resolution, nearExtent, farHalfExtent);
|
|
181
|
+
// Exactly the near cell size: snapping by anything else re-samples the wave
|
|
182
|
+
// field as the camera moves, which reads as the surface swimming.
|
|
183
|
+
this.cellSize = grid.cellSize;
|
|
184
|
+
this.nearHalfExtent = grid.nearHalfExtent;
|
|
185
|
+
this.farHalfExtent = grid.farHalfExtent;
|
|
186
|
+
const indices = grid.indices;
|
|
187
|
+
this.indexCount = indices.length;
|
|
188
|
+
|
|
189
|
+
const vao = gl.createVertexArray();
|
|
190
|
+
if (vao === null) throw new Error('WaterRenderer: createVertexArray failed');
|
|
191
|
+
this.vao = vao;
|
|
192
|
+
gl.bindVertexArray(vao);
|
|
193
|
+
|
|
194
|
+
const gridBuffer = gl.createBuffer();
|
|
195
|
+
if (gridBuffer === null) throw new Error('WaterRenderer: createBuffer failed');
|
|
196
|
+
this.buffers.push(gridBuffer);
|
|
197
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, gridBuffer);
|
|
198
|
+
gl.bufferData(gl.ARRAY_BUFFER, grid.offsets, gl.STATIC_DRAW);
|
|
199
|
+
gl.enableVertexAttribArray(0);
|
|
200
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
201
|
+
|
|
202
|
+
const indexBuffer = gl.createBuffer();
|
|
203
|
+
if (indexBuffer === null) throw new Error('WaterRenderer: createBuffer failed');
|
|
204
|
+
this.buffers.push(indexBuffer);
|
|
205
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
|
206
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
|
|
207
|
+
gl.bindVertexArray(null);
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* And the unit sheet every bounded body is drawn from. One mesh in [-1, 1],
|
|
211
|
+
* scaled by the body's own half-extent in the vertex shader — so a fountain
|
|
212
|
+
* costs a uniform rather than a mesh, and a hundred puddles cost the same.
|
|
213
|
+
*/
|
|
214
|
+
const patch = buildUnitSheet(PATCH_RESOLUTION);
|
|
215
|
+
this.patchIndexCount = patch.indices.length;
|
|
216
|
+
const patchVao = gl.createVertexArray();
|
|
217
|
+
if (patchVao === null) throw new Error('WaterRenderer: createVertexArray failed');
|
|
218
|
+
this.patchVao = patchVao;
|
|
219
|
+
gl.bindVertexArray(patchVao);
|
|
220
|
+
const patchGrid = gl.createBuffer();
|
|
221
|
+
if (patchGrid === null) throw new Error('WaterRenderer: createBuffer failed');
|
|
222
|
+
this.buffers.push(patchGrid);
|
|
223
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, patchGrid);
|
|
224
|
+
gl.bufferData(gl.ARRAY_BUFFER, patch.offsets, gl.STATIC_DRAW);
|
|
225
|
+
gl.enableVertexAttribArray(0);
|
|
226
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
227
|
+
const patchIndices = gl.createBuffer();
|
|
228
|
+
if (patchIndices === null) throw new Error('WaterRenderer: createBuffer failed');
|
|
229
|
+
this.buffers.push(patchIndices);
|
|
230
|
+
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, patchIndices);
|
|
231
|
+
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, patch.indices, gl.STATIC_DRAW);
|
|
232
|
+
gl.bindVertexArray(null);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Draw the surface. Call *after* the sky: water writes depth and is occluded
|
|
237
|
+
* by geometry in front of it, but its far edge fades out, and that fade needs
|
|
238
|
+
* the sky already behind it to blend into.
|
|
239
|
+
*/
|
|
240
|
+
draw(
|
|
241
|
+
gl: WebGL2RenderingContext,
|
|
242
|
+
camera: FrameView,
|
|
243
|
+
timeSeconds: number,
|
|
244
|
+
settings: WaterBody,
|
|
245
|
+
directionalDir: Vec3,
|
|
246
|
+
directionalColor: Vec3,
|
|
247
|
+
ambient: Vec3,
|
|
248
|
+
atmosphere: Atmosphere,
|
|
249
|
+
underwaterEnabled: boolean,
|
|
250
|
+
reflection: PlanarReflection | null,
|
|
251
|
+
lights: PointLightSet | null = null,
|
|
252
|
+
lightFalloff: 'smooth' | 'inverseSquare' = 'smooth',
|
|
253
|
+
windX = 0,
|
|
254
|
+
windZ = 0,
|
|
255
|
+
): void {
|
|
256
|
+
const u = this.uniforms;
|
|
257
|
+
const reflectionReady = reflection?.isReadyFor(settings.level) ?? false;
|
|
258
|
+
gl.useProgram(this.program);
|
|
259
|
+
gl.uniformMatrix4fv(u['uViewProj'] ?? null, false, camera.viewProjection);
|
|
260
|
+
gl.uniformMatrix4fv(
|
|
261
|
+
u['uReflectionViewProj'] ?? null,
|
|
262
|
+
false,
|
|
263
|
+
reflection?.viewProjection ?? camera.viewProjection,
|
|
264
|
+
);
|
|
265
|
+
gl.uniform3fv(u['uCameraPos'] ?? null, camera.position);
|
|
266
|
+
gl.uniform1f(u['uTime'] ?? null, timeSeconds);
|
|
267
|
+
/*
|
|
268
|
+
* Where the sheet is laid, and how far one unit of it reaches. The ocean
|
|
269
|
+
* snaps to whole cells under the camera — anything else re-samples the wave
|
|
270
|
+
* field as it moves, which reads as the surface swimming — and a bounded body
|
|
271
|
+
* simply sits where it was put.
|
|
272
|
+
*/
|
|
273
|
+
/* Laid and settled in `waterDraw.ts`, so both backends get the same sea. */
|
|
274
|
+
const w = resolveWater(
|
|
275
|
+
settings,
|
|
276
|
+
camera.position[0] ?? 0,
|
|
277
|
+
camera.position[2] ?? 0,
|
|
278
|
+
this.cellSize,
|
|
279
|
+
this.nearHalfExtent,
|
|
280
|
+
this.farHalfExtent,
|
|
281
|
+
windX,
|
|
282
|
+
windZ,
|
|
283
|
+
this.resolved,
|
|
284
|
+
);
|
|
285
|
+
gl.uniform2fv(u['uGridOrigin'] ?? null, w.origin);
|
|
286
|
+
/* Pairs since 2026-08-28: a body is bounded along each of its own axes, and the direction
|
|
287
|
+
those axes take is the fourth of them. The ocean passes one number twice. */
|
|
288
|
+
gl.uniform2fv(u['uGridSpan'] ?? null, w.span);
|
|
289
|
+
gl.uniform2fv(u['uGridHalf'] ?? null, w.half);
|
|
290
|
+
gl.uniform2fv(u['uNearHalf'] ?? null, w.nearHalf);
|
|
291
|
+
gl.uniform2fv(u['uGridForward'] ?? null, w.forward);
|
|
292
|
+
/*
|
|
293
|
+
* `uGridScale` used to be uploaded here and is not, because the shader stopped reading it
|
|
294
|
+
* when the grid snapping moved to the CPU. The uniform went on being written to a location
|
|
295
|
+
* that no longer existed, which uploads to nothing and says nothing.
|
|
296
|
+
*/
|
|
297
|
+
const look = waterAppearance(settings);
|
|
298
|
+
gl.uniform1f(u['uNadirOpacity'] ?? null, look.nadirOpacity);
|
|
299
|
+
gl.uniform1f(u['uVisibility'] ?? null, look.visibility);
|
|
300
|
+
gl.uniform1f(u['uMirror'] ?? null, look.mirror);
|
|
301
|
+
gl.uniform2fv(u['uWindDir'] ?? null, w.windDir);
|
|
302
|
+
gl.uniform1f(u['uWaveGain'] ?? null, w.waveGain);
|
|
303
|
+
gl.uniform1f(u['uFoamGain'] ?? null, w.foamGain);
|
|
304
|
+
gl.uniform1f(u['uWaterLevel'] ?? null, settings.level);
|
|
305
|
+
gl.uniform3fv(u['uDeepColor'] ?? null, settings.deepColor);
|
|
306
|
+
gl.uniform3fv(u['uShallowColor'] ?? null, settings.shallowColor);
|
|
307
|
+
gl.uniform3fv(u['uDirectionalDir'] ?? null, directionalDir);
|
|
308
|
+
gl.uniform3fv(u['uDirectionalColor'] ?? null, directionalColor);
|
|
309
|
+
gl.uniform3fv(u['uAmbient'] ?? null, ambient);
|
|
310
|
+
// Water is lit by the world's lamps as well as by its sky. Indoors they are all of it.
|
|
311
|
+
bindPointLights(gl, u, lights, lightFalloff);
|
|
312
|
+
bindAtmosphere(gl, u, atmosphere, camera.position[1] ?? 0, underwaterEnabled);
|
|
313
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
314
|
+
gl.bindTexture(
|
|
315
|
+
gl.TEXTURE_2D,
|
|
316
|
+
reflectionReady && reflection !== null ? reflection.texture : null,
|
|
317
|
+
);
|
|
318
|
+
gl.uniform1i(u['uReflectionMap'] ?? null, 0);
|
|
319
|
+
gl.uniform1i(u['uReflectionEnabled'] ?? null, reflectionReady ? 1 : 0);
|
|
320
|
+
gl.uniform2f(
|
|
321
|
+
u['uReflectionTexelSize'] ?? null,
|
|
322
|
+
reflectionReady && reflection !== null ? 1 / reflection.textureWidth : 1,
|
|
323
|
+
reflectionReady && reflection !== null ? 1 / reflection.textureHeight : 1,
|
|
324
|
+
);
|
|
325
|
+
gl.uniform1i(u['uReflectionFilterTaps'] ?? null, this.reflectionFilterTaps);
|
|
326
|
+
|
|
327
|
+
gl.enable(gl.BLEND);
|
|
328
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
329
|
+
// Waves are displaced far enough that back faces show at grazing angles.
|
|
330
|
+
gl.disable(gl.CULL_FACE);
|
|
331
|
+
|
|
332
|
+
gl.bindVertexArray(w.bounded ? this.patchVao : this.vao);
|
|
333
|
+
gl.drawElements(
|
|
334
|
+
gl.TRIANGLES,
|
|
335
|
+
w.bounded ? this.patchIndexCount : this.indexCount,
|
|
336
|
+
gl.UNSIGNED_INT,
|
|
337
|
+
0,
|
|
338
|
+
);
|
|
339
|
+
gl.bindVertexArray(null);
|
|
340
|
+
|
|
341
|
+
gl.enable(gl.CULL_FACE);
|
|
342
|
+
gl.disable(gl.BLEND);
|
|
343
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
347
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
348
|
+
gl.deleteVertexArray(this.vao);
|
|
349
|
+
gl.deleteVertexArray(this.patchVao);
|
|
350
|
+
gl.deleteProgram(this.program);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One wind, sampled by everything that moves in it.
|
|
3
|
+
*
|
|
4
|
+
* Grass, foliage, smoke, clouds and water all bend to weather. If each system
|
|
5
|
+
* animates on its own noise they disagree — smoke drifting one way while grass
|
|
6
|
+
* leans another is the single clearest tell that a scene is a collection of
|
|
7
|
+
* effects rather than a place. So the signal lives here, once, and every
|
|
8
|
+
* consumer samples it.
|
|
9
|
+
*
|
|
10
|
+
* Cyclic by construction: the sum of a fundamental and integer harmonics
|
|
11
|
+
* repeats exactly at the fundamental's period. That matters because a run is
|
|
12
|
+
* recorded and replayed — a replay watched an hour later must see the same gust
|
|
13
|
+
* the character did, and a signal that drifts cannot offer that.
|
|
14
|
+
*
|
|
15
|
+
* Game-agnostic: a profile carries no date, no biome, no game-specific meaning.
|
|
16
|
+
*/
|
|
17
|
+
export interface WindProfile {
|
|
18
|
+
/** Prevailing direction; normalised on sampling, so any non-zero pair works. */
|
|
19
|
+
directionX: number;
|
|
20
|
+
directionZ: number;
|
|
21
|
+
/** Speed with no gust, in metres per second. */
|
|
22
|
+
baseSpeed: number;
|
|
23
|
+
/** Peak deviation from the base, either way. */
|
|
24
|
+
gustSpeed: number;
|
|
25
|
+
/** How far the direction swings from prevailing, radians. */
|
|
26
|
+
directionWander: number;
|
|
27
|
+
/** Period after which the whole signal repeats exactly. */
|
|
28
|
+
cycleSeconds: number;
|
|
29
|
+
/** Offset into the cycle, so two profiles are not in lockstep. */
|
|
30
|
+
phase: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface WindState {
|
|
34
|
+
velocityX: number;
|
|
35
|
+
velocityZ: number;
|
|
36
|
+
/** Magnitude of the velocity, always non-negative. */
|
|
37
|
+
speed: number;
|
|
38
|
+
/** Gust component alone, -1..1, for effects that want the deviation. */
|
|
39
|
+
gust: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function createWindState(): WindState {
|
|
43
|
+
return { velocityX: 0, velocityZ: 0, speed: 0, gust: 0 };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Sample the profile at a time. Writes into `out` and allocates nothing — this
|
|
48
|
+
* runs every frame for every system that cares about weather.
|
|
49
|
+
*/
|
|
50
|
+
export function sampleWind(profile: WindProfile, timeSeconds: number, out: WindState): void {
|
|
51
|
+
if (!(profile.cycleSeconds > 0)) {
|
|
52
|
+
throw new Error('WindProfile.cycleSeconds must be positive');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const fundamental = (Math.PI * 2) / profile.cycleSeconds;
|
|
56
|
+
const t = timeSeconds + profile.phase;
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Integer harmonics only. A non-integer multiple would give a signal that
|
|
60
|
+
* looks organic but never actually closes, so a replay hours later would show
|
|
61
|
+
* different weather from the run it is replaying.
|
|
62
|
+
*/
|
|
63
|
+
const a = Math.sin(fundamental * t);
|
|
64
|
+
const b = Math.sin(fundamental * 2 * t + 1.1);
|
|
65
|
+
const c = Math.sin(fundamental * 3 * t + 2.7);
|
|
66
|
+
|
|
67
|
+
// Weights sum to 1, so the gust stays inside ±gustSpeed however the
|
|
68
|
+
// harmonics happen to line up.
|
|
69
|
+
const gust = a * 0.55 + b * 0.3 + c * 0.15;
|
|
70
|
+
const speed = Math.max(0, profile.baseSpeed + gust * profile.gustSpeed);
|
|
71
|
+
|
|
72
|
+
const baseAngle = Math.atan2(profile.directionZ, profile.directionX);
|
|
73
|
+
const angle = baseAngle + (b * 0.6 + c * 0.4) * profile.directionWander;
|
|
74
|
+
|
|
75
|
+
out.gust = gust;
|
|
76
|
+
out.speed = speed;
|
|
77
|
+
out.velocityX = Math.cos(angle) * speed;
|
|
78
|
+
out.velocityZ = Math.sin(angle) * speed;
|
|
79
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { sampleWind } from './wind.ts';
|
|
2
|
+
import type { WindProfile, WindState } from './wind.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The world's wind, as one value passed to everything that moves in it.
|
|
6
|
+
*
|
|
7
|
+
* Six draw calls each taking two or three loose floats is a contract nobody can
|
|
8
|
+
* see: the rule "everything shares one wind" lives only in the discipline of
|
|
9
|
+
* whoever writes the next call site. As a type it is checkable at a glance, and
|
|
10
|
+
* adding a seventh consumer is a matter of accepting the same object rather
|
|
11
|
+
* than remembering to pass matching numbers.
|
|
12
|
+
*
|
|
13
|
+
* Sample once per frame and pass it down. A system that samples its own is a
|
|
14
|
+
* second wind however identical the inputs, because nothing then guarantees the
|
|
15
|
+
* two stay in step.
|
|
16
|
+
*/
|
|
17
|
+
export interface WindField extends WindState {
|
|
18
|
+
/**
|
|
19
|
+
* Accumulated travel, for anything positioned by wind rather than displaced
|
|
20
|
+
* by it — clouds, most obviously.
|
|
21
|
+
*
|
|
22
|
+
* Accumulated rather than derived from `velocity x time`, and that is the
|
|
23
|
+
* whole reason this lives on the type. The bearing wanders, so multiplying a
|
|
24
|
+
* *changing* direction by an absolute clock jumps whatever it positions the
|
|
25
|
+
* instant the direction moves, by an amount proportional to how long the game
|
|
26
|
+
* has been running. It is invisible in a short test and violent later.
|
|
27
|
+
*/
|
|
28
|
+
driftX: number;
|
|
29
|
+
driftZ: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function createWindField(): WindField {
|
|
33
|
+
return { velocityX: 0, velocityZ: 0, speed: 0, gust: 0, driftX: 0, driftZ: 0 };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Advance the field one frame. `driftScale` converts wind speed into travel for
|
|
38
|
+
* whatever the drift is positioning.
|
|
39
|
+
*/
|
|
40
|
+
export function advanceWindField(
|
|
41
|
+
field: WindField,
|
|
42
|
+
profile: WindProfile,
|
|
43
|
+
timeSeconds: number,
|
|
44
|
+
frameDt: number,
|
|
45
|
+
driftScale: number,
|
|
46
|
+
): void {
|
|
47
|
+
sampleWind(profile, timeSeconds, field);
|
|
48
|
+
field.driftX += field.velocityX * driftScale * frameDt;
|
|
49
|
+
field.driftZ += field.velocityZ * driftScale * frameDt;
|
|
50
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visible wind: how much of it to show, where it has drifted to, and its lattice.
|
|
3
|
+
*
|
|
4
|
+
* **Three rules and one geometry, held once for both backends.** Each of them is the kind of
|
|
5
|
+
* thing a second implementation gets *nearly* right, which is the failure mode `AGENTS.md`
|
|
6
|
+
* 2026-08-13 is about: debris that thins in at a different wind speed, or travels at a
|
|
7
|
+
* different rate from the clouds, is weather that does not cohere, and nothing raises.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** What the caller wants of a lattice, before any of it reaches the device. */
|
|
11
|
+
export interface WindStreakSettings {
|
|
12
|
+
/** How many streaks the lattice holds. */
|
|
13
|
+
count?: number;
|
|
14
|
+
/** Side of the box that follows the camera, metres. */
|
|
15
|
+
cellSize?: number;
|
|
16
|
+
/** Wind speed at which streaks begin to appear. */
|
|
17
|
+
onsetSpeed?: number;
|
|
18
|
+
/** Wind speed at which they are at full strength. */
|
|
19
|
+
fullSpeed?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The defaults, in one place because two copies is two thresholds.
|
|
24
|
+
*
|
|
25
|
+
* Calibrated against the wind the game actually produces rather than against a
|
|
26
|
+
* plausible-sounding number. An early pass used an onset of 3.4 and full strength at 8 while
|
|
27
|
+
* the windiest day of the year peaked at 7.3, so the effect would have shipped essentially
|
|
28
|
+
* invisible. Raised again afterwards: at the lower onset it showed on ordinary breezy days,
|
|
29
|
+
* where visible debris is not what a breeze looks like. It belongs to storms, which is also the
|
|
30
|
+
* only time it is telling the player anything.
|
|
31
|
+
*/
|
|
32
|
+
export const WIND_STREAK_DEFAULTS = {
|
|
33
|
+
count: 520,
|
|
34
|
+
cellSize: 110,
|
|
35
|
+
onsetSpeed: 6,
|
|
36
|
+
fullSpeed: 11,
|
|
37
|
+
} as const;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* How far the debris field trails the wind's own accumulated drift.
|
|
41
|
+
*
|
|
42
|
+
* Debris rides the same drift the clouds do, multiplied, so near and far weather travel
|
|
43
|
+
* together instead of at two unrelated rates. A second copy of this number is exactly that
|
|
44
|
+
* disagreement, and it would read as the sky and the air being blown by different winds.
|
|
45
|
+
*/
|
|
46
|
+
const DRIFT_GAIN = 14;
|
|
47
|
+
|
|
48
|
+
/** Six vertices a streak, as two triangles. Shared so both backends build one lattice. */
|
|
49
|
+
export const WIND_STREAK_CORNERS: readonly (readonly [number, number])[] = [
|
|
50
|
+
[-1, -1],
|
|
51
|
+
[1, -1],
|
|
52
|
+
[1, 1],
|
|
53
|
+
[-1, -1],
|
|
54
|
+
[1, 1],
|
|
55
|
+
[-1, 1],
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
/** The two static attribute streams a lattice is drawn from: the corner, and which streak. */
|
|
59
|
+
export interface WindStreakLattice {
|
|
60
|
+
readonly corners: Float32Array;
|
|
61
|
+
readonly indices: Float32Array;
|
|
62
|
+
readonly vertexCount: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Build the lattice for `count` streaks.
|
|
67
|
+
*
|
|
68
|
+
* Nothing here is per frame: the whole effect is a repeating box that follows the camera and
|
|
69
|
+
* wraps, computed in the vertex shader from an index and the clock, so this runs once and the
|
|
70
|
+
* frame loop uploads nothing.
|
|
71
|
+
*/
|
|
72
|
+
export function buildWindStreakLattice(count: number): WindStreakLattice {
|
|
73
|
+
const perStreak = WIND_STREAK_CORNERS.length;
|
|
74
|
+
const corners = new Float32Array(count * perStreak * 2);
|
|
75
|
+
const indices = new Float32Array(count * perStreak);
|
|
76
|
+
let c = 0;
|
|
77
|
+
let i = 0;
|
|
78
|
+
for (let streak = 0; streak < count; streak++) {
|
|
79
|
+
for (const corner of WIND_STREAK_CORNERS) {
|
|
80
|
+
corners[c++] = corner[0];
|
|
81
|
+
corners[c++] = corner[1];
|
|
82
|
+
indices[i++] = streak;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { corners, indices, vertexCount: count * perStreak };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** What one frame's draw needs beyond the camera and the tint. */
|
|
89
|
+
export interface ResolvedWindStreaks {
|
|
90
|
+
/** How visible the wind is right now, 0 to 1. */
|
|
91
|
+
strength: number;
|
|
92
|
+
/** Where the field has drifted to, in metres. */
|
|
93
|
+
driftX: number;
|
|
94
|
+
driftZ: number;
|
|
95
|
+
/** Whether the draw is worth making at all. A calm day costs no draw, not a faded one. */
|
|
96
|
+
visible: boolean;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function createResolvedWindStreaks(): ResolvedWindStreaks {
|
|
100
|
+
return { strength: 0, driftX: 0, driftZ: 0, visible: false };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** How visible the wind is at one speed. Its own function because callers size budgets on it. */
|
|
104
|
+
export function windStreakStrength(speed: number, onsetSpeed: number, fullSpeed: number): number {
|
|
105
|
+
const t = (speed - onsetSpeed) / Math.max(fullSpeed - onsetSpeed, 1e-4);
|
|
106
|
+
return Math.min(Math.max(t, 0), 1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Settle a frame's streaks into a target the caller owns.
|
|
111
|
+
*
|
|
112
|
+
* **`submerged` is decided by the engine and not by the call site.** Every pass already knows
|
|
113
|
+
* where the waterline is, and leaving it to each caller is how one of them ends up raining dust
|
|
114
|
+
* into the sea. Nothing blows through water: it is the kind of detail that, once noticed,
|
|
115
|
+
* cannot be unnoticed.
|
|
116
|
+
*/
|
|
117
|
+
export function resolveWindStreaks(
|
|
118
|
+
speed: number,
|
|
119
|
+
driftX: number,
|
|
120
|
+
driftZ: number,
|
|
121
|
+
onsetSpeed: number,
|
|
122
|
+
fullSpeed: number,
|
|
123
|
+
submerged: boolean,
|
|
124
|
+
out: ResolvedWindStreaks,
|
|
125
|
+
): ResolvedWindStreaks {
|
|
126
|
+
out.strength = windStreakStrength(speed, onsetSpeed, fullSpeed);
|
|
127
|
+
out.driftX = driftX * DRIFT_GAIN;
|
|
128
|
+
out.driftZ = driftZ * DRIFT_GAIN;
|
|
129
|
+
out.visible = !submerged && out.strength > 0.001;
|
|
130
|
+
return out;
|
|
131
|
+
}
|