@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,578 @@
|
|
|
1
|
+
/** Collision-safe, configurable third-person orbit camera rig. */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stations along the arm at which the ground is queried.
|
|
5
|
+
*
|
|
6
|
+
* Eight over a five-metre boom is a station every 60 cm, which is finer than the
|
|
7
|
+
* `Boom` smoothing that consumes the answer can respond to anyway. The cost is eight
|
|
8
|
+
* surface queries a frame on a path that already does a box sweep.
|
|
9
|
+
*/
|
|
10
|
+
const GROUND_SAMPLES = 8;
|
|
11
|
+
|
|
12
|
+
import { clamp, damp, dampTracking } from '../math/scalar.ts';
|
|
13
|
+
import { Boom } from './boom.ts';
|
|
14
|
+
import type { BoomTiming } from './boom.ts';
|
|
15
|
+
import { segmentHit } from '@driftengine/physics';
|
|
16
|
+
import type { ColliderSet } from '@driftengine/physics';
|
|
17
|
+
import { createSurfaceHit } from '../physics/ribbonSurface.ts';
|
|
18
|
+
import type { GroundSurface } from '../physics/ribbonSurface.ts';
|
|
19
|
+
import { Camera } from './camera.ts';
|
|
20
|
+
|
|
21
|
+
export interface ThirdPersonCameraOptions {
|
|
22
|
+
boomDistance: number;
|
|
23
|
+
boomRadius: number;
|
|
24
|
+
boomMinDistance: number;
|
|
25
|
+
positionLambda: number;
|
|
26
|
+
fovLambda: number;
|
|
27
|
+
pitchMin: number;
|
|
28
|
+
pitchMax: number;
|
|
29
|
+
initialPitch: number;
|
|
30
|
+
initialFovYDeg: number;
|
|
31
|
+
/**
|
|
32
|
+
* How fast the arm may change length. Absent keeps the numbers every rig had.
|
|
33
|
+
*
|
|
34
|
+
* **The defaults are written for an arm of several metres**, where the speed ceilings bind and
|
|
35
|
+
* the obstruction is a railing sweeping across for a few frames. On a short arm neither ceiling
|
|
36
|
+
* binds, only the damping acts, and easing into a wall is the wrong trade — see `BoomTiming`,
|
|
37
|
+
* which carries the measurement and the immediate-retract spelling.
|
|
38
|
+
*/
|
|
39
|
+
readonly boomTiming?: Partial<BoomTiming>;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the rig damps the roll it is handed. Absent means yes, which every rig had.
|
|
42
|
+
*
|
|
43
|
+
* **False is for a caller that has already damped it**, and that is not a niche: a consumer with
|
|
44
|
+
* a comfort setting on roll applies the same value to a first-person view, so a roll damped again
|
|
45
|
+
* here is damped twice and the setting stops meaning what it is asserted to mean. The rig's own
|
|
46
|
+
* damping exists so a subject snapping between surfaces cannot snap the view; a caller that has
|
|
47
|
+
* solved that itself is not asking for it twice.
|
|
48
|
+
*/
|
|
49
|
+
readonly dampRoll?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Something that can say how far an arm gets before it hits the world.
|
|
54
|
+
*
|
|
55
|
+
* **An alternative to the `ColliderSet`, on the seam `surface` already uses.** The rig tests its
|
|
56
|
+
* arm with `segmentHit` against a set of boxes, and a consumer whose world is a `PhysicsWorld`
|
|
57
|
+
* does not have one — so using the rig meant building and maintaining a second copy of the world
|
|
58
|
+
* for the camera alone, which is a cost large enough to have kept one consumer off the rig
|
|
59
|
+
* entirely.
|
|
60
|
+
*
|
|
61
|
+
* A segment and a radius in, metres along it or null out. Metres rather than a fraction because
|
|
62
|
+
* that is what a raycast answers and the rig knows its own length; null rather than the length
|
|
63
|
+
* because "nothing was hit" and "something was hit at the far end" are different facts, and a
|
|
64
|
+
* caller should not have to encode the first as the second.
|
|
65
|
+
*/
|
|
66
|
+
export interface BoomObstruction {
|
|
67
|
+
distance(
|
|
68
|
+
fromX: number,
|
|
69
|
+
fromY: number,
|
|
70
|
+
fromZ: number,
|
|
71
|
+
alongX: number,
|
|
72
|
+
alongY: number,
|
|
73
|
+
alongZ: number,
|
|
74
|
+
radius: number,
|
|
75
|
+
): number | null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Generic camera mechanism. The caller supplies its already-resolved target
|
|
80
|
+
* height and desired FOV, keeping crouch rules and speed effects in the game.
|
|
81
|
+
*/
|
|
82
|
+
export class ThirdPersonCamera {
|
|
83
|
+
readonly camera = new Camera();
|
|
84
|
+
|
|
85
|
+
private smoothX = 0;
|
|
86
|
+
private smoothY = 0;
|
|
87
|
+
private smoothZ = 0;
|
|
88
|
+
/**
|
|
89
|
+
* Where the target was last frame, so its velocity can be differenced out of it.
|
|
90
|
+
*
|
|
91
|
+
* **Differenced here rather than asked of the caller**, because every caller already hands the
|
|
92
|
+
* target over each frame and a second parameter for something derivable from the first is a
|
|
93
|
+
* signature every consumer has to be told about. It is exact for a target moving smoothly, which
|
|
94
|
+
* a vehicle under a fixed step with interpolation is: the engine's own harness measures the
|
|
95
|
+
* subject holding its world speed to within a twentieth of a per cent through frame jitter that
|
|
96
|
+
* moves this camera by 5%.
|
|
97
|
+
*/
|
|
98
|
+
/**
|
|
99
|
+
* The frame the arm is built in. World axes unless a caller says otherwise.
|
|
100
|
+
*
|
|
101
|
+
* **The arm used to be a spherical boom about world Y** — `-sin(yaw) cos(pitch)`, `-sin(pitch)`,
|
|
102
|
+
* `cos(yaw) cos(pitch)` — so a subject standing on a wall or a ceiling got an arm that still
|
|
103
|
+
* swung about world up, and the rig placed the eye through the surface the subject was standing
|
|
104
|
+
* on. `groundClear` cut the arm where the eye would go under the deck, which is the same
|
|
105
|
+
* assumption a second time.
|
|
106
|
+
*
|
|
107
|
+
* The rig already anticipated this case and stopped one step short of it: `targetRoll`'s comment
|
|
108
|
+
* says the rig knows nothing about banked surfaces, only that a camera can be tilted, and damps
|
|
109
|
+
* roll here so a subject snapping between surfaces cannot snap the view. The arm is carried the
|
|
110
|
+
* same distance now. Yaw and pitch keep their meaning and become angles inside this frame, so a
|
|
111
|
+
* caller that never sets one gets exactly the arm it always got.
|
|
112
|
+
*/
|
|
113
|
+
boomUpX = 0;
|
|
114
|
+
boomUpY = 1;
|
|
115
|
+
boomUpZ = 0;
|
|
116
|
+
/**
|
|
117
|
+
* The frame's forward, **readable because a caller that sets one needs to know what it became**.
|
|
118
|
+
*
|
|
119
|
+
* Both `setBoomUp` and `setBoomForward` orthogonalise against the other axis, so what the rig
|
|
120
|
+
* holds is rarely the vector it was handed — and a caller computing a roll, or asking where its
|
|
121
|
+
* subject's heading ended up, needs the one the arm is actually built from. Assigning these
|
|
122
|
+
* directly does not rebuild the frame; the two setters are what keep the three axes orthonormal.
|
|
123
|
+
*/
|
|
124
|
+
boomForwardX = 0;
|
|
125
|
+
boomForwardY = 0;
|
|
126
|
+
boomForwardZ = 1;
|
|
127
|
+
private boomRightX = 1;
|
|
128
|
+
private boomRightY = 0;
|
|
129
|
+
private boomRightZ = 0;
|
|
130
|
+
|
|
131
|
+
private lastTargetX = 0;
|
|
132
|
+
private lastTargetY = 0;
|
|
133
|
+
private lastTargetZ = 0;
|
|
134
|
+
private fov: number;
|
|
135
|
+
private roll = 0;
|
|
136
|
+
private snapped = false;
|
|
137
|
+
/**
|
|
138
|
+
* The arm out to the camera, and its speed limits.
|
|
139
|
+
*
|
|
140
|
+
* This rig used to apply the collision query's fraction directly. The query is a
|
|
141
|
+
* step function — a railing either blocks the arm or it does not — so the camera
|
|
142
|
+
* jumped by up to 4 m in a single frame every time one swept across it. That is
|
|
143
|
+
* the same artefact the replay camera was fixed for after it was reported as
|
|
144
|
+
* juddering and jumpy; this rig simply never got the fix, and a railed descent
|
|
145
|
+
* is where it would be worst.
|
|
146
|
+
*/
|
|
147
|
+
private readonly boom: Boom;
|
|
148
|
+
|
|
149
|
+
/** Reused by the ground query; the rig allocates nothing per frame. */
|
|
150
|
+
private readonly groundHit = createSurfaceHit();
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @param surface The walkable ground, where the caller has one. **Not optional in
|
|
154
|
+
* practice**, and the reason is worth stating: `colliders` is not the whole world.
|
|
155
|
+
* A consumer whose drivable surface is a banked ribbon cannot put it in the collider
|
|
156
|
+
* set — a world-axis box around a banked cross-section has a flat lid at its highest
|
|
157
|
+
* corner, which is floor where nothing is drawn and a wall where the next slab's lid
|
|
158
|
+
* stands above the character's feet. So that surface is invisible to `segmentHit`, and a
|
|
159
|
+
* boom tested only against boxes passes straight through the deck.
|
|
160
|
+
*
|
|
161
|
+
* Which is exactly what it did. On a descent, pitching the view down put the eye
|
|
162
|
+
* *under the track*, with the deck between the camera and the character: the rig sees the
|
|
163
|
+
* underside of the surface instead of the character, because dynamic surfaces are not
|
|
164
|
+
* part of what it tests against. Worse in replays, where the camera moves far more than
|
|
165
|
+
* a player ever moves it.
|
|
166
|
+
*/
|
|
167
|
+
constructor(
|
|
168
|
+
private readonly colliders: ColliderSet,
|
|
169
|
+
private readonly options: Readonly<ThirdPersonCameraOptions>,
|
|
170
|
+
private readonly surface: GroundSurface | null = null,
|
|
171
|
+
/**
|
|
172
|
+
* A world query for the arm, instead of the collider set.
|
|
173
|
+
*
|
|
174
|
+
* Fourth and defaulted, so no existing call site changes — the same shape `surface` was added
|
|
175
|
+
* in. When it is given, `colliders` is not consulted at all: a caller with one has the whole
|
|
176
|
+
* world behind it and a set of boxes beside it would be a second, partial answer to the same
|
|
177
|
+
* question. See `BoomObstruction` for why one consumer could not supply the set.
|
|
178
|
+
*/
|
|
179
|
+
private readonly obstruction: BoomObstruction | null = null,
|
|
180
|
+
) {
|
|
181
|
+
validateOptions(options);
|
|
182
|
+
this.boom = new Boom(options.boomTiming);
|
|
183
|
+
this.camera.pitch = options.initialPitch;
|
|
184
|
+
this.camera.fovYDeg = options.initialFovYDeg;
|
|
185
|
+
this.fov = options.initialFovYDeg;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Place the rig outright on the next update instead of gliding to it.
|
|
190
|
+
*
|
|
191
|
+
* The first update already does this — a camera that eases in from the origin
|
|
192
|
+
* on the first frame of a session is a swoop nobody asked for. This re-arms it,
|
|
193
|
+
* for a subject that has *moved without travelling*: a scrub bar dropped
|
|
194
|
+
* somewhere else in a replay, or a character put back on a checkpoint. Smoothing
|
|
195
|
+
* across that is a camera flying the length of the route with nothing in frame,
|
|
196
|
+
* which the replay camera has already been measured doing at 124 m in a single
|
|
197
|
+
* shot.
|
|
198
|
+
*
|
|
199
|
+
* Only the caller can tell that apart from a legitimately fast frame, which is
|
|
200
|
+
* why it is a method here rather than a distance threshold in `update`.
|
|
201
|
+
*/
|
|
202
|
+
/**
|
|
203
|
+
* How far out the arm may reach before the eye would drop below the ground, as a
|
|
204
|
+
* fraction of its length. 1 when the ground is nowhere near it.
|
|
205
|
+
*
|
|
206
|
+
* Sampled from the far end inward and returned on the first clear station, because the
|
|
207
|
+
* useful answer is the *longest* arm that works. `boomRadius` of clearance, so the eye
|
|
208
|
+
* stops above the deck rather than grazing it — the same margin the box query uses.
|
|
209
|
+
*/
|
|
210
|
+
private groundClear(boomX: number, boomY: number, boomZ: number, minFraction: number): number {
|
|
211
|
+
const surface = this.surface;
|
|
212
|
+
if (surface === null) return 1;
|
|
213
|
+
/*
|
|
214
|
+
* **A surface answers a height for an (x, z), so it describes a world-Y deck and nothing
|
|
215
|
+
* else.** "Under the deck" and "behind the support plane" are the same sentence only while up
|
|
216
|
+
* is world up; in any other frame this sampler has already chosen which axis is vertical and
|
|
217
|
+
* there is no reading of it that means what this test means. So it is skipped rather than
|
|
218
|
+
* approximated, and the arm is left to the collision sweep, which is frame-agnostic and is the
|
|
219
|
+
* instrument that actually stops the eye entering geometry.
|
|
220
|
+
*/
|
|
221
|
+
if (this.boomUpY < 0.999) return 1;
|
|
222
|
+
const hit = this.groundHit;
|
|
223
|
+
const clearance = this.options.boomRadius;
|
|
224
|
+
for (let i = GROUND_SAMPLES; i >= 1; i--) {
|
|
225
|
+
const t = i / GROUND_SAMPLES;
|
|
226
|
+
if (t < minFraction) break;
|
|
227
|
+
const y = this.smoothY + boomY * t;
|
|
228
|
+
if (!surface.sample(this.smoothX + boomX * t, this.smoothZ + boomZ * t, hit, y)) return t;
|
|
229
|
+
if (y >= hit.y + clearance) return t;
|
|
230
|
+
}
|
|
231
|
+
return minFraction;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Point the boom's up at a direction; the rest of the frame follows it.
|
|
236
|
+
*
|
|
237
|
+
* **Forward is carried from the frame it had rather than derived from a world axis**, which is
|
|
238
|
+
* what makes a body walking from a floor onto a wall and onto a ceiling continuous. Deriving it
|
|
239
|
+
* from a fixed reference would be one line shorter and would put a pole wherever `up` lined up
|
|
240
|
+
* with that reference: the arm would swing through a half turn as a subject crossed it, on a rig
|
|
241
|
+
* whose whole job is that the view does not snap.
|
|
242
|
+
*
|
|
243
|
+
* The fallbacks are only reached when the carried forward has become parallel to the new up,
|
|
244
|
+
* which a continuous rotation cannot do in one step and a teleport can. World Z first and world
|
|
245
|
+
* X behind it, so there is always an answer and it is never a normalised zero.
|
|
246
|
+
*
|
|
247
|
+
* A zero-length vector keeps the frame it had, for the reason `setUp` on the character
|
|
248
|
+
* controller gives: a NaN basis is a camera that is nowhere, and every number downstream of it
|
|
249
|
+
* reads as a rig that has failed rather than as an argument that was refused.
|
|
250
|
+
*/
|
|
251
|
+
setBoomUp(x: number, y: number, z: number): void {
|
|
252
|
+
const length = Math.sqrt(x * x + y * y + z * z);
|
|
253
|
+
if (length < 1e-6) return;
|
|
254
|
+
const ux = x / length;
|
|
255
|
+
const uy = y / length;
|
|
256
|
+
const uz = z / length;
|
|
257
|
+
if (this.setBasis(ux, uy, uz, this.boomForwardX, this.boomForwardY, this.boomForwardZ)) return;
|
|
258
|
+
if (this.setBasis(ux, uy, uz, 0, 0, 1)) return;
|
|
259
|
+
this.setBasis(ux, uy, uz, 1, 0, 0);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Point the boom's forward at a direction; the up is kept and the arm is rebuilt around it.
|
|
264
|
+
*
|
|
265
|
+
* **For a subject that has a heading of its own, which the carried forward cannot express.**
|
|
266
|
+
* `setBoomUp` keeps whatever forward the frame had, re-projected — the right default, because it
|
|
267
|
+
* is what makes a body walking from a floor onto a wall continuous, and because most subjects
|
|
268
|
+
* have no heading to speak of. What it cannot say is "behind *this*": a yaw of π puts the eye
|
|
269
|
+
* opposite a forward the caller never chose and, until this existed, could not read either. A
|
|
270
|
+
* subject spawning face-on to a wall got a shot framed at random, and a caller trying to work out
|
|
271
|
+
* how far to roll so that the support surface sits at the bottom of the picture had to know where
|
|
272
|
+
* the arm was — an azimuth measured from an axis nothing reported.
|
|
273
|
+
*
|
|
274
|
+
* **This is not a reversal of the carried forward and does not change it for anyone.** A caller
|
|
275
|
+
* that never calls this carries its forward exactly as before, and one that does still has it
|
|
276
|
+
* re-orthogonalised by every `setBoomUp` — the heading is a direction in the world, and the frame
|
|
277
|
+
* it lands in is the surface's.
|
|
278
|
+
*
|
|
279
|
+
* A zero-length vector, or one parallel to the current up, keeps the frame it had. **Deliberately
|
|
280
|
+
* not the fallback chain `setBoomUp` uses**, and the asymmetry is the point: that method must
|
|
281
|
+
* produce *some* forward because the up is what changed and a frame needs one, so an arbitrary
|
|
282
|
+
* axis is better than none. Here the forward is the argument, and answering a direction the
|
|
283
|
+
* caller did not ask for is precisely the failure this exists to fix.
|
|
284
|
+
*/
|
|
285
|
+
setBoomForward(x: number, y: number, z: number): void {
|
|
286
|
+
const length = Math.sqrt(x * x + y * y + z * z);
|
|
287
|
+
if (length < 1e-6) return;
|
|
288
|
+
this.setBasis(this.boomUpX, this.boomUpY, this.boomUpZ, x / length, y / length, z / length);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Build the three axes from an up and a candidate forward, or answer false and change nothing.
|
|
293
|
+
*
|
|
294
|
+
* Shared by both setters so that "orthogonalised against the other axis" means one piece of
|
|
295
|
+
* arithmetic rather than two that have to be kept in step. False is the parallel case: there is
|
|
296
|
+
* no forward perpendicular to an up it is already parallel to, and what each caller does about
|
|
297
|
+
* that is the one thing they do differently.
|
|
298
|
+
*/
|
|
299
|
+
private setBasis(
|
|
300
|
+
ux: number,
|
|
301
|
+
uy: number,
|
|
302
|
+
uz: number,
|
|
303
|
+
fx: number,
|
|
304
|
+
fy: number,
|
|
305
|
+
fz: number,
|
|
306
|
+
): boolean {
|
|
307
|
+
const into = fx * ux + fy * uy + fz * uz;
|
|
308
|
+
const px = fx - ux * into;
|
|
309
|
+
const py = fy - uy * into;
|
|
310
|
+
const pz = fz - uz * into;
|
|
311
|
+
const len = Math.sqrt(px * px + py * py + pz * pz);
|
|
312
|
+
if (len <= 1e-4) return false;
|
|
313
|
+
this.boomUpX = ux;
|
|
314
|
+
this.boomUpY = uy;
|
|
315
|
+
this.boomUpZ = uz;
|
|
316
|
+
this.boomForwardX = px / len;
|
|
317
|
+
this.boomForwardY = py / len;
|
|
318
|
+
this.boomForwardZ = pz / len;
|
|
319
|
+
/* Right-handed with the pair above, which is what makes yaw turn the way it always did. */
|
|
320
|
+
this.boomRightX = uy * this.boomForwardZ - uz * this.boomForwardY;
|
|
321
|
+
this.boomRightY = uz * this.boomForwardX - ux * this.boomForwardZ;
|
|
322
|
+
this.boomRightZ = ux * this.boomForwardY - uy * this.boomForwardX;
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
snap(): void {
|
|
327
|
+
this.snapped = false;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* How much of the arm is clear of the world, from whichever source the rig was given.
|
|
332
|
+
*
|
|
333
|
+
* The injected query wins outright where there is one, for the reason its own type gives: a
|
|
334
|
+
* caller with the whole world behind it does not also want a partial answer from a box set.
|
|
335
|
+
*/
|
|
336
|
+
private blockedFraction(boomX: number, boomY: number, boomZ: number): number {
|
|
337
|
+
const radius = this.options.boomRadius;
|
|
338
|
+
if (this.obstruction === null) {
|
|
339
|
+
return segmentHit(
|
|
340
|
+
this.smoothX,
|
|
341
|
+
this.smoothY,
|
|
342
|
+
this.smoothZ,
|
|
343
|
+
boomX,
|
|
344
|
+
boomY,
|
|
345
|
+
boomZ,
|
|
346
|
+
this.colliders,
|
|
347
|
+
radius,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
const metres = this.obstruction.distance(
|
|
351
|
+
this.smoothX,
|
|
352
|
+
this.smoothY,
|
|
353
|
+
this.smoothZ,
|
|
354
|
+
boomX,
|
|
355
|
+
boomY,
|
|
356
|
+
boomZ,
|
|
357
|
+
radius,
|
|
358
|
+
);
|
|
359
|
+
if (metres === null) return 1;
|
|
360
|
+
/* The arm's own length rather than the option's, because the arm is what was tested: a pitched
|
|
361
|
+
boom is `boomDistance` long by construction, and reading the option instead would be right
|
|
362
|
+
until somebody changes how the arm is built. */
|
|
363
|
+
const length = Math.sqrt(boomX * boomX + boomY * boomY + boomZ * boomZ);
|
|
364
|
+
if (length <= 1e-6) return 1;
|
|
365
|
+
return clamp(metres / length, 0, 1);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
update(
|
|
369
|
+
frameDt: number,
|
|
370
|
+
yaw: number,
|
|
371
|
+
pitch: number,
|
|
372
|
+
targetX: number,
|
|
373
|
+
targetY: number,
|
|
374
|
+
targetZ: number,
|
|
375
|
+
targetFovYDeg: number,
|
|
376
|
+
/**
|
|
377
|
+
* Roll, radians. The caller's policy: this rig knows nothing about banked
|
|
378
|
+
* surfaces, only that a camera can be tilted. Damped here rather than by
|
|
379
|
+
* the caller so a subject snapping between surfaces cannot snap the view.
|
|
380
|
+
*/
|
|
381
|
+
targetRoll = 0,
|
|
382
|
+
): void {
|
|
383
|
+
const cam = this.camera;
|
|
384
|
+
const options = this.options;
|
|
385
|
+
cam.yaw = yaw;
|
|
386
|
+
/*
|
|
387
|
+
* Damped unless the caller has already done it. See `ThirdPersonCameraOptions.dampRoll`: a
|
|
388
|
+
* consumer with a comfort setting on roll damps it once and applies the same value elsewhere,
|
|
389
|
+
* and damping it again here means the setting no longer says what it asserts.
|
|
390
|
+
*/
|
|
391
|
+
this.roll =
|
|
392
|
+
options.dampRoll === false
|
|
393
|
+
? targetRoll
|
|
394
|
+
: damp(this.roll, targetRoll, options.fovLambda, frameDt);
|
|
395
|
+
cam.roll = this.roll;
|
|
396
|
+
/*
|
|
397
|
+
* Absolute pitch, not a delta. Accumulating here would make the rig own how
|
|
398
|
+
* fast look responds, which is the caller's policy — and a caller whose
|
|
399
|
+
* pitch is simulation state (so an aim ray can be replayed) cannot let a
|
|
400
|
+
* render-rate camera hold the authoritative value. Still clamped, so a
|
|
401
|
+
* caller with no limits of its own cannot invert the view.
|
|
402
|
+
*/
|
|
403
|
+
cam.pitch = clamp(pitch, options.pitchMin, options.pitchMax);
|
|
404
|
+
|
|
405
|
+
// Captured before the placing branch clears it, because the arm below has to
|
|
406
|
+
// know whether this is the frame that places the rig.
|
|
407
|
+
const placing = !this.snapped;
|
|
408
|
+
if (!this.snapped) {
|
|
409
|
+
this.smoothX = targetX;
|
|
410
|
+
this.smoothY = targetY;
|
|
411
|
+
this.smoothZ = targetZ;
|
|
412
|
+
this.snapped = true;
|
|
413
|
+
} else {
|
|
414
|
+
/*
|
|
415
|
+
* **Tracking rather than a hold, and it is the default rather than an option.**
|
|
416
|
+
*
|
|
417
|
+
* `damp` is exact for a target standing still, and this one is a subject somebody is
|
|
418
|
+
* driving. Holding it still across the interval made the settled distance a function of the
|
|
419
|
+
* frame time — 1.586 m at 60 Hz against 1.376 m at 28 Hz for a 25 m/s subject at this
|
|
420
|
+
* lambda, so a machine that dropped rate re-framed the shot — and made the gap oscillate
|
|
421
|
+
* under uneven frames, which is what a consumer reported as the subject snapping about
|
|
422
|
+
* inside the picture. A camera arm following something that stands still is the rare case,
|
|
423
|
+
* which is why this is not a flag.
|
|
424
|
+
*
|
|
425
|
+
* The velocity is differenced from the target rather than asked for. See `lastTarget*`.
|
|
426
|
+
*/
|
|
427
|
+
const inverseDt = frameDt > 0 ? 1 / frameDt : 0;
|
|
428
|
+
const lambda = options.positionLambda;
|
|
429
|
+
const vx = (targetX - this.lastTargetX) * inverseDt;
|
|
430
|
+
const vy = (targetY - this.lastTargetY) * inverseDt;
|
|
431
|
+
const vz = (targetZ - this.lastTargetZ) * inverseDt;
|
|
432
|
+
this.smoothX = dampTracking(this.smoothX, targetX, vx, lambda, frameDt);
|
|
433
|
+
this.smoothY = dampTracking(this.smoothY, targetY, vy, lambda, frameDt);
|
|
434
|
+
this.smoothZ = dampTracking(this.smoothZ, targetZ, vz, lambda, frameDt);
|
|
435
|
+
}
|
|
436
|
+
this.lastTargetX = targetX;
|
|
437
|
+
this.lastTargetY = targetY;
|
|
438
|
+
this.lastTargetZ = targetZ;
|
|
439
|
+
|
|
440
|
+
/*
|
|
441
|
+
* **Roll and the field of view keep the hold, deliberately.** Both follow targets that step —
|
|
442
|
+
* a surface change, a speed band — and a one-frame `delta/dt` across a step is a spike, which
|
|
443
|
+
* `dampTracking` would then aim `v/lambda` beyond. The defect measured was the position lag,
|
|
444
|
+
* and a subject's position is the one of the three that moves smoothly by construction.
|
|
445
|
+
*/
|
|
446
|
+
this.fov = damp(this.fov, targetFovYDeg, options.fovLambda, frameDt);
|
|
447
|
+
cam.fovYDeg = this.fov;
|
|
448
|
+
|
|
449
|
+
const cosPitch = Math.cos(cam.pitch);
|
|
450
|
+
/*
|
|
451
|
+
* The same three terms as before, placed in the boom's frame rather than on the world axes.
|
|
452
|
+
* With the frame left at world up this is identical arithmetic: right is X, up is Y, forward
|
|
453
|
+
* is Z, and each term lands on the axis it used to be written against.
|
|
454
|
+
*/
|
|
455
|
+
const alongRight = -Math.sin(cam.yaw) * cosPitch * options.boomDistance;
|
|
456
|
+
const alongUp = -Math.sin(cam.pitch) * options.boomDistance;
|
|
457
|
+
const alongForward = Math.cos(cam.yaw) * cosPitch * options.boomDistance;
|
|
458
|
+
const boomX =
|
|
459
|
+
this.boomRightX * alongRight + this.boomUpX * alongUp + this.boomForwardX * alongForward;
|
|
460
|
+
const boomY =
|
|
461
|
+
this.boomRightY * alongRight + this.boomUpY * alongUp + this.boomForwardY * alongForward;
|
|
462
|
+
const boomZ =
|
|
463
|
+
this.boomRightZ * alongRight + this.boomUpZ * alongUp + this.boomForwardZ * alongForward;
|
|
464
|
+
const blocked = this.blockedFraction(boomX, boomY, boomZ);
|
|
465
|
+
const minFraction = options.boomMinDistance / options.boomDistance;
|
|
466
|
+
/*
|
|
467
|
+
* The ground blocks the arm as surely as a wall does, and it is not in `colliders`.
|
|
468
|
+
* Stepped rather than solved: the surface is an arbitrary query, not a plane, so the
|
|
469
|
+
* arm is sampled along its length and cut at the first station that would put the eye
|
|
470
|
+
* under the deck. A step function is all `segmentHit` returns either, and `Boom`
|
|
471
|
+
* already exists to smooth exactly that.
|
|
472
|
+
*/
|
|
473
|
+
const clearOfGround = this.groundClear(boomX, boomY, boomZ, minFraction);
|
|
474
|
+
const clear = Math.max(Math.min(blocked, clearOfGround), minFraction);
|
|
475
|
+
if (placing) this.boom.reset(clear);
|
|
476
|
+
else this.boom.step(clear, options.boomDistance, frameDt);
|
|
477
|
+
const fraction = this.boom.fraction;
|
|
478
|
+
|
|
479
|
+
cam.position[0] = this.smoothX + boomX * fraction;
|
|
480
|
+
cam.position[1] = this.smoothY + boomY * fraction;
|
|
481
|
+
cam.position[2] = this.smoothZ + boomZ * fraction;
|
|
482
|
+
this.aimAlongArm(boomX, boomY, boomZ);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Point the camera back down the arm, in the frame the arm was built in.
|
|
487
|
+
*
|
|
488
|
+
* **The arm moved into the boom's basis and the aim did not, and that half-migration is what this
|
|
489
|
+
* closes.** `update` placed the eye using `boomRight`/`boomUp`/`boomForward` and then set
|
|
490
|
+
* `cam.yaw`, `cam.pitch` and `cam.roll` — which `Camera.updateMatrices` reads against the *world*
|
|
491
|
+
* axes. The two agree only while up is world Y. With up at +X, an arm built at yaw 0 lies along
|
|
492
|
+
* the frame's forward while a camera at yaw 0 looks down world −Z: a right angle apart, so the
|
|
493
|
+
* rig put the eye in the right place and rendered the scene beside the subject, with no error
|
|
494
|
+
* anywhere. Reported from outside, where recovering the aim meant inverting this rig's own boom
|
|
495
|
+
* formula from outside it, against a sign convention nothing stated.
|
|
496
|
+
*
|
|
497
|
+
* **Derived rather than taken, so `update`'s signature is unchanged** — the same property R2 held
|
|
498
|
+
* to when it added `setBoomUp` rather than a `basis` parameter.
|
|
499
|
+
*
|
|
500
|
+
* The decomposition is exact and is the inverse of `updateMatrices`' own construction: forward
|
|
501
|
+
* fixes yaw and pitch, and the roll is the angle from the basis that construction would build at
|
|
502
|
+
* those two onto the up the arm was built against. **At the world basis every line here returns
|
|
503
|
+
* what was passed in**, which is asserted rather than assumed — `up` is world Y orthogonalised
|
|
504
|
+
* against forward, which is precisely the up `updateMatrices` derives, so the base roll is zero
|
|
505
|
+
* and the caller's damped roll is all that is left.
|
|
506
|
+
*/
|
|
507
|
+
private aimAlongArm(boomX: number, boomY: number, boomZ: number): void {
|
|
508
|
+
const cam = this.camera;
|
|
509
|
+
/* From the eye toward the subject, which is the arm reversed. The eye sits on that ray at any
|
|
510
|
+
boom fraction, so shortening the arm cannot change where the camera looks. */
|
|
511
|
+
const length = Math.sqrt(boomX * boomX + boomY * boomY + boomZ * boomZ);
|
|
512
|
+
if (length <= 1e-6) return;
|
|
513
|
+
const forwardX = -boomX / length;
|
|
514
|
+
const forwardY = -boomY / length;
|
|
515
|
+
const forwardZ = -boomZ / length;
|
|
516
|
+
|
|
517
|
+
/* `updateMatrices` reads exactly these two out of the direction it is given. */
|
|
518
|
+
const flat = Math.sqrt(forwardX * forwardX + forwardZ * forwardZ);
|
|
519
|
+
if (flat > 1e-6) cam.yaw = Math.atan2(forwardX, -forwardZ);
|
|
520
|
+
cam.pitch = Math.atan2(forwardY, flat);
|
|
521
|
+
|
|
522
|
+
/*
|
|
523
|
+
* The roll that carries the camera's own up onto the arm's.
|
|
524
|
+
*
|
|
525
|
+
* `updateMatrices` builds an unrolled pair from yaw and pitch and then turns it by `roll`,
|
|
526
|
+
* with `up' = up·cos(roll) − right·sin(roll)`. So the roll wanted here is the angle from that
|
|
527
|
+
* unrolled up onto the boom's up, and the caller's damped roll is added on top of it — a lean
|
|
528
|
+
* about the view, which is what a caller means by roll whatever frame it is standing in.
|
|
529
|
+
*/
|
|
530
|
+
const cosPitch = Math.cos(cam.pitch);
|
|
531
|
+
const sinPitch = Math.sin(cam.pitch);
|
|
532
|
+
const cosYaw = Math.cos(cam.yaw);
|
|
533
|
+
const sinYaw = Math.sin(cam.yaw);
|
|
534
|
+
const lean = cosPitch < 0 ? -1 : 1;
|
|
535
|
+
const rightX = lean * cosYaw;
|
|
536
|
+
const rightZ = lean * sinYaw;
|
|
537
|
+
const upX = -lean * sinYaw * sinPitch;
|
|
538
|
+
const upY = lean * cosPitch;
|
|
539
|
+
const upZ = lean * cosYaw * sinPitch;
|
|
540
|
+
|
|
541
|
+
/* The boom's up, with any component along the view removed: a roll is measured in the plane
|
|
542
|
+
across the view, and the two are not perpendicular for an arm that is pitched. */
|
|
543
|
+
const into = this.boomUpX * forwardX + this.boomUpY * forwardY + this.boomUpZ * forwardZ;
|
|
544
|
+
const wantX = this.boomUpX - forwardX * into;
|
|
545
|
+
const wantY = this.boomUpY - forwardY * into;
|
|
546
|
+
const wantZ = this.boomUpZ - forwardZ * into;
|
|
547
|
+
const wantLength = Math.sqrt(wantX * wantX + wantY * wantY + wantZ * wantZ);
|
|
548
|
+
if (wantLength <= 1e-6) {
|
|
549
|
+
/* Looking straight along the frame's own up: there is no plane to measure a roll in, so the
|
|
550
|
+
caller's is all there is, and the arm is at a pole where yaw is already arbitrary. */
|
|
551
|
+
cam.roll = this.roll;
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
const nx = wantX / wantLength;
|
|
555
|
+
const ny = wantY / wantLength;
|
|
556
|
+
const nz = wantZ / wantLength;
|
|
557
|
+
const alongUp = nx * upX + ny * upY + nz * upZ;
|
|
558
|
+
const alongRight = nx * rightX + nz * rightZ;
|
|
559
|
+
cam.roll = Math.atan2(-alongRight, alongUp) + this.roll;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function validateOptions(options: Readonly<ThirdPersonCameraOptions>): void {
|
|
564
|
+
if (options.boomDistance <= 0) {
|
|
565
|
+
throw new Error(`ThirdPersonCamera.boomDistance must be positive, got ${options.boomDistance}`);
|
|
566
|
+
}
|
|
567
|
+
if (options.boomRadius < 0) {
|
|
568
|
+
throw new Error(`ThirdPersonCamera.boomRadius must be non-negative, got ${options.boomRadius}`);
|
|
569
|
+
}
|
|
570
|
+
if (options.boomMinDistance < 0 || options.boomMinDistance > options.boomDistance) {
|
|
571
|
+
throw new Error(
|
|
572
|
+
`ThirdPersonCamera.boomMinDistance must be between 0 and boomDistance, got ${options.boomMinDistance}`,
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
if (options.pitchMin > options.pitchMax) {
|
|
576
|
+
throw new Error('ThirdPersonCamera.pitchMin must not exceed pitchMax');
|
|
577
|
+
}
|
|
578
|
+
}
|