@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,201 @@
|
|
|
1
|
+
import { countCells, forEachCell, measureText, GLYPH_HEIGHT } from '../geometry/pixelFont.js';
|
|
2
|
+
/**
|
|
3
|
+
* Where a string becomes cells, for both backends.
|
|
4
|
+
*
|
|
5
|
+
* **Nothing here names a device.** Laying a message out is arithmetic over the pixel font —
|
|
6
|
+
* which cells are lit, how wide the result is, which character each cell belongs to for the
|
|
7
|
+
* arrival stagger — and it produced the same two arrays whichever API was going to upload
|
|
8
|
+
* them. Keeping it in the WebGL2 class meant a second backend would have had to reimplement
|
|
9
|
+
* it, and the rule this repository learned the hard way is that anything both backends decide
|
|
10
|
+
* lives in one module and is bound twice. `waterGrid.ts` and `plumeGeometry.ts` are the same
|
|
11
|
+
* shape.
|
|
12
|
+
*
|
|
13
|
+
* A backend owns the buffers and the pipeline; this owns what goes in them.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* How many cells one text object may hold.
|
|
17
|
+
*
|
|
18
|
+
* Sized for a long notification rather than a paragraph — this is a display face for short
|
|
19
|
+
* shouted strings, and anything approaching a sentence should be DOM text, which is what a
|
|
20
|
+
* screen reader can read and a translator can translate.
|
|
21
|
+
*/
|
|
22
|
+
export const MAX_CELLS = 900;
|
|
23
|
+
export const DEFAULT_TEXT_STYLE = {
|
|
24
|
+
cellSize: 6,
|
|
25
|
+
charOffset: 0,
|
|
26
|
+
color: [1, 1, 1],
|
|
27
|
+
glow: 0.5,
|
|
28
|
+
alpha: 1,
|
|
29
|
+
reveal: 1,
|
|
30
|
+
spin: 0,
|
|
31
|
+
punch: 0,
|
|
32
|
+
bob: 0,
|
|
33
|
+
};
|
|
34
|
+
/** Width of a string in pixels at a given cell size, without laying it out. */
|
|
35
|
+
export function textWidthPx(text, cellSize) {
|
|
36
|
+
return measureText(text) * cellSize;
|
|
37
|
+
}
|
|
38
|
+
export function textHeightPx(cellSize) {
|
|
39
|
+
return GLYPH_HEIGHT * cellSize;
|
|
40
|
+
}
|
|
41
|
+
export class TextLayout {
|
|
42
|
+
/** Reused every upload; text changes far too often to allocate per change. */
|
|
43
|
+
cells = new Float32Array(MAX_CELLS * 2);
|
|
44
|
+
chars = new Float32Array(MAX_CELLS);
|
|
45
|
+
instanceCount = 0;
|
|
46
|
+
/** Characters in the current content, for the per-character stagger. */
|
|
47
|
+
charCount = 1;
|
|
48
|
+
lastKey = '';
|
|
49
|
+
widthCells = 0;
|
|
50
|
+
/** Width of the last laid-out string, in pixels at a given cell size. */
|
|
51
|
+
widthPx(cellSize) {
|
|
52
|
+
return this.widthCells * cellSize;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Lay a string out, and say whether anything moved.
|
|
56
|
+
*
|
|
57
|
+
* **The return value is the whole point of the skip.** Most frames show the same message as
|
|
58
|
+
* the frame before, and re-uploading a buffer to say so is the sort of cost that only shows
|
|
59
|
+
* up on a phone. The arrays are reused in place, so a caller has no other way to tell.
|
|
60
|
+
*/
|
|
61
|
+
setText(text) {
|
|
62
|
+
if (text === this.lastKey)
|
|
63
|
+
return false;
|
|
64
|
+
this.lastKey = text;
|
|
65
|
+
this.widthCells = measureText(text);
|
|
66
|
+
/*
|
|
67
|
+
* Truncate rather than throw: a frame with a clipped message is better than a frame that
|
|
68
|
+
* does not render, and this is a display face being handed runtime strings.
|
|
69
|
+
*/
|
|
70
|
+
if (countCells(text) > MAX_CELLS)
|
|
71
|
+
this.instanceCount = 0;
|
|
72
|
+
let index = 0;
|
|
73
|
+
forEachCell(text, (x, y, charIndex) => {
|
|
74
|
+
if (index >= MAX_CELLS)
|
|
75
|
+
return;
|
|
76
|
+
this.cells[index * 2] = x;
|
|
77
|
+
this.cells[index * 2 + 1] = y;
|
|
78
|
+
this.chars[index] = charIndex;
|
|
79
|
+
index++;
|
|
80
|
+
});
|
|
81
|
+
this.instanceCount = index;
|
|
82
|
+
this.charCount = Math.max(1, text.length);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A solid rectangle of cells, for a keycap or a backing plate.
|
|
87
|
+
*
|
|
88
|
+
* Not text. A run of block glyphs looks like the same thing and is not: glyphs are spaced a
|
|
89
|
+
* cell apart, so the "plate" comes out striped and sized in whole glyph widths rather than
|
|
90
|
+
* in cells — which is exactly how the first keycap ended up wider than the word it was
|
|
91
|
+
* behind.
|
|
92
|
+
*
|
|
93
|
+
* `bottomCell` is where the rectangle starts vertically, in the same baseline-relative cells
|
|
94
|
+
* the glyphs use, so -1 gives a cell of padding below.
|
|
95
|
+
*/
|
|
96
|
+
setPlate(widthCells, heightCells, bottomCell) {
|
|
97
|
+
const key = `plate:${widthCells}:${heightCells}:${bottomCell}`;
|
|
98
|
+
if (key === this.lastKey)
|
|
99
|
+
return false;
|
|
100
|
+
this.lastKey = key;
|
|
101
|
+
this.widthCells = widthCells;
|
|
102
|
+
let index = 0;
|
|
103
|
+
for (let x = 0; x < widthCells && index < MAX_CELLS; x++) {
|
|
104
|
+
for (let y = 0; y < heightCells && index < MAX_CELLS; y++) {
|
|
105
|
+
this.cells[index * 2] = x;
|
|
106
|
+
this.cells[index * 2 + 1] = bottomCell + y;
|
|
107
|
+
/*
|
|
108
|
+
* One "character", so a plate arrives as a single unit rather than assembling column
|
|
109
|
+
* by column behind the word it belongs to.
|
|
110
|
+
*/
|
|
111
|
+
this.chars[index] = 0;
|
|
112
|
+
index++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
this.instanceCount = index;
|
|
116
|
+
this.charCount = 1;
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** A unit cube centred on the origin: six faces, two triangles each. */
|
|
121
|
+
function buildCube() {
|
|
122
|
+
const faces = [
|
|
123
|
+
{
|
|
124
|
+
normal: [0, 0, 1],
|
|
125
|
+
corners: [
|
|
126
|
+
[-1, -1, 1],
|
|
127
|
+
[1, -1, 1],
|
|
128
|
+
[1, 1, 1],
|
|
129
|
+
[-1, 1, 1],
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
normal: [0, 0, -1],
|
|
134
|
+
corners: [
|
|
135
|
+
[1, -1, -1],
|
|
136
|
+
[-1, -1, -1],
|
|
137
|
+
[-1, 1, -1],
|
|
138
|
+
[1, 1, -1],
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
normal: [1, 0, 0],
|
|
143
|
+
corners: [
|
|
144
|
+
[1, -1, 1],
|
|
145
|
+
[1, -1, -1],
|
|
146
|
+
[1, 1, -1],
|
|
147
|
+
[1, 1, 1],
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
normal: [-1, 0, 0],
|
|
152
|
+
corners: [
|
|
153
|
+
[-1, -1, -1],
|
|
154
|
+
[-1, -1, 1],
|
|
155
|
+
[-1, 1, 1],
|
|
156
|
+
[-1, 1, -1],
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
normal: [0, 1, 0],
|
|
161
|
+
corners: [
|
|
162
|
+
[-1, 1, 1],
|
|
163
|
+
[1, 1, 1],
|
|
164
|
+
[1, 1, -1],
|
|
165
|
+
[-1, 1, -1],
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
normal: [0, -1, 0],
|
|
170
|
+
corners: [
|
|
171
|
+
[-1, -1, -1],
|
|
172
|
+
[1, -1, -1],
|
|
173
|
+
[1, -1, 1],
|
|
174
|
+
[-1, -1, 1],
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
const positions = [];
|
|
179
|
+
const normals = [];
|
|
180
|
+
for (const face of faces) {
|
|
181
|
+
const [a, b, c, d] = face.corners;
|
|
182
|
+
/*
|
|
183
|
+
* Wound clockwise, which is backwards — deliberately. The vertex shader flips Y to put the
|
|
184
|
+
* origin at the top left, and a mirror reverses winding, so faces authored the usual way
|
|
185
|
+
* come out back-facing and every one of them is culled. The symptom is text that renders
|
|
186
|
+
* with no GL error and no pixels, which is a genuinely difficult thing to look at and
|
|
187
|
+
* diagnose.
|
|
188
|
+
*/
|
|
189
|
+
for (const corner of [a, c, b, a, d, c]) {
|
|
190
|
+
positions.push(corner[0], corner[1], corner[2]);
|
|
191
|
+
normals.push(face.normal[0], face.normal[1], face.normal[2]);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
positions: new Float32Array(positions),
|
|
196
|
+
normals: new Float32Array(normals),
|
|
197
|
+
vertexCount: positions.length / 3,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** Unit cube, as position/normal pairs. Two triangles per face. Built once, shared by both. */
|
|
201
|
+
export const TEXT_CUBE = buildCube();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TextStyle } from './textLayout.ts';
|
|
2
|
+
export declare class TextRenderer {
|
|
3
|
+
private readonly gl;
|
|
4
|
+
private readonly program;
|
|
5
|
+
private readonly uniforms;
|
|
6
|
+
private readonly vao;
|
|
7
|
+
private readonly cellBuffer;
|
|
8
|
+
private readonly charBuffer;
|
|
9
|
+
private readonly buffers;
|
|
10
|
+
private readonly layout;
|
|
11
|
+
constructor(gl: WebGL2RenderingContext);
|
|
12
|
+
/** Width of the last laid-out string, in pixels at a given cell size. */
|
|
13
|
+
widthPx(cellSize: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* Lay a string out. The upload is skipped when the text has not changed, because most frames
|
|
16
|
+
* show the same message as the frame before and re-uploading a buffer to say so is the sort
|
|
17
|
+
* of cost that only shows up on a phone.
|
|
18
|
+
*/
|
|
19
|
+
setText(text: string): void;
|
|
20
|
+
/** A solid rectangle of cells, for a keycap or a backing plate. See `TextLayout.setPlate`. */
|
|
21
|
+
setPlate(widthCells: number, heightCells: number, bottomCell: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* @param originX left edge, in pixels from the left of the viewport.
|
|
24
|
+
* @param originY baseline, in pixels from the top.
|
|
25
|
+
*/
|
|
26
|
+
draw(viewportWidth: number, viewportHeight: number, originX: number, originY: number, style: TextStyle, timeSec: number): void;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
/** Both instance buffers, from the arrays the layout filled in place. */
|
|
29
|
+
private upload;
|
|
30
|
+
private staticAttribute;
|
|
31
|
+
private instanceAttribute;
|
|
32
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { MAX_CELLS, TEXT_CUBE, TextLayout } from './textLayout.js';
|
|
2
|
+
import { compileProgram, uniformLocations } from './shader.js';
|
|
3
|
+
import { TEXT_FRAG, TEXT_VERT } from './shaders/text.js';
|
|
4
|
+
/**
|
|
5
|
+
* Text as geometry, on WebGL2.
|
|
6
|
+
*
|
|
7
|
+
* Every lit cell of every glyph is an instanced cube, so a message catches light, has depth,
|
|
8
|
+
* and can rotate — rather than being a flat sticker over a flat-shaded world. One draw call
|
|
9
|
+
* per string.
|
|
10
|
+
*
|
|
11
|
+
* **The layout is not here.** Which cells are lit is arithmetic over the pixel font and is the
|
|
12
|
+
* same on either backend, so it lives in `textLayout.ts` and this owns only the buffers, the
|
|
13
|
+
* program and the state the draw needs. See that file for why.
|
|
14
|
+
*
|
|
15
|
+
* Reached through `renderer.createText()` and the renderer's own `setText` / `drawText` /
|
|
16
|
+
* `disposeText`, never constructed by a caller: a caller holding a context is a caller pinned
|
|
17
|
+
* to one backend, which is what kept `showroom` on WebGL2.
|
|
18
|
+
*/
|
|
19
|
+
/** WebGL2's clip space is the shader's own, so the correction it binds is nothing. */
|
|
20
|
+
const TEXT_IDENTITY = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
21
|
+
export class TextRenderer {
|
|
22
|
+
gl;
|
|
23
|
+
program;
|
|
24
|
+
uniforms;
|
|
25
|
+
vao;
|
|
26
|
+
cellBuffer;
|
|
27
|
+
charBuffer;
|
|
28
|
+
buffers = [];
|
|
29
|
+
layout = new TextLayout();
|
|
30
|
+
constructor(gl) {
|
|
31
|
+
this.gl = gl;
|
|
32
|
+
this.program = compileProgram(gl, TEXT_VERT, TEXT_FRAG, 'text');
|
|
33
|
+
this.uniforms = uniformLocations(gl, this.program, 'textRenderer');
|
|
34
|
+
const vao = gl.createVertexArray();
|
|
35
|
+
if (vao === null)
|
|
36
|
+
throw new Error('Failed to create text VAO');
|
|
37
|
+
this.vao = vao;
|
|
38
|
+
gl.bindVertexArray(vao);
|
|
39
|
+
this.staticAttribute(0, TEXT_CUBE.positions, 3);
|
|
40
|
+
this.staticAttribute(1, TEXT_CUBE.normals, 3);
|
|
41
|
+
this.cellBuffer = this.instanceAttribute(2, MAX_CELLS * 2, 2);
|
|
42
|
+
this.charBuffer = this.instanceAttribute(3, MAX_CELLS, 1);
|
|
43
|
+
gl.bindVertexArray(null);
|
|
44
|
+
}
|
|
45
|
+
/** Width of the last laid-out string, in pixels at a given cell size. */
|
|
46
|
+
widthPx(cellSize) {
|
|
47
|
+
return this.layout.widthPx(cellSize);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Lay a string out. The upload is skipped when the text has not changed, because most frames
|
|
51
|
+
* show the same message as the frame before and re-uploading a buffer to say so is the sort
|
|
52
|
+
* of cost that only shows up on a phone.
|
|
53
|
+
*/
|
|
54
|
+
setText(text) {
|
|
55
|
+
if (this.layout.setText(text))
|
|
56
|
+
this.upload();
|
|
57
|
+
}
|
|
58
|
+
/** A solid rectangle of cells, for a keycap or a backing plate. See `TextLayout.setPlate`. */
|
|
59
|
+
setPlate(widthCells, heightCells, bottomCell) {
|
|
60
|
+
if (this.layout.setPlate(widthCells, heightCells, bottomCell))
|
|
61
|
+
this.upload();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* @param originX left edge, in pixels from the left of the viewport.
|
|
65
|
+
* @param originY baseline, in pixels from the top.
|
|
66
|
+
*/
|
|
67
|
+
draw(viewportWidth, viewportHeight, originX, originY, style, timeSec) {
|
|
68
|
+
if (this.layout.instanceCount === 0 || style.alpha <= 0)
|
|
69
|
+
return;
|
|
70
|
+
const gl = this.gl;
|
|
71
|
+
gl.useProgram(this.program);
|
|
72
|
+
gl.bindVertexArray(this.vao);
|
|
73
|
+
/*
|
|
74
|
+
* Text gets a fresh depth buffer rather than no depth test at all.
|
|
75
|
+
*
|
|
76
|
+
* Turning depth off entirely is the obvious move and it is wrong: the cubes are solid, so
|
|
77
|
+
* with nothing sorting them the last face in the buffer wins and every letter renders as
|
|
78
|
+
* one flat facet. Clearing depth puts the whole message in front of the scene while still
|
|
79
|
+
* letting its own geometry sort against itself, which is what gives the glyphs their edges.
|
|
80
|
+
*/
|
|
81
|
+
// The mask goes up *before* the clear. `glClear` respects it, and the pass that ran before
|
|
82
|
+
// this one — the plumes — leaves depth writes disabled, so clearing first silently did
|
|
83
|
+
// nothing and the text was depth-tested against whatever the scene had already written. It
|
|
84
|
+
// rendered on some frames and not others, with no GL error either way.
|
|
85
|
+
gl.depthMask(true);
|
|
86
|
+
gl.clear(gl.DEPTH_BUFFER_BIT);
|
|
87
|
+
gl.enable(gl.DEPTH_TEST);
|
|
88
|
+
/*
|
|
89
|
+
* **The equal-admitting compare in whichever direction this context tests.** Text lies flush on
|
|
90
|
+
* the surface it labels, so it needs the case that keeps a coplanar fragment — `LEQUAL` where
|
|
91
|
+
* nearer is smaller and `GEQUAL` where nearer is larger. Derived from the compare already set
|
|
92
|
+
* rather than named, because this file has no way to know which way the frame is drawing and a
|
|
93
|
+
* constant here silently drops every glyph on a reversed one.
|
|
94
|
+
*/
|
|
95
|
+
const current = gl.getParameter(gl.DEPTH_FUNC);
|
|
96
|
+
const reversed = current === gl.GREATER || current === gl.GEQUAL;
|
|
97
|
+
gl.depthFunc(reversed ? gl.GEQUAL : gl.LEQUAL);
|
|
98
|
+
gl.enable(gl.BLEND);
|
|
99
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
100
|
+
setVec2(gl, this.uniforms['uViewport'], viewportWidth, viewportHeight);
|
|
101
|
+
setVec2(gl, this.uniforms['uOrigin'], originX, originY);
|
|
102
|
+
setFloat(gl, this.uniforms['uCellSize'], style.cellSize);
|
|
103
|
+
// Far enough that a whole line barely converges, near enough that a rotating character
|
|
104
|
+
// reads as turning rather than shearing.
|
|
105
|
+
setFloat(gl, this.uniforms['uDepth'], Math.max(viewportWidth, 600) * 1.4);
|
|
106
|
+
setFloat(gl, this.uniforms['uReveal'], style.reveal);
|
|
107
|
+
setFloat(gl, this.uniforms['uCharCount'], Math.max(1, style.charSpan ?? this.layout.charCount));
|
|
108
|
+
setFloat(gl, this.uniforms['uCharOffset'], style.charOffset ?? 0);
|
|
109
|
+
setFloat(gl, this.uniforms['uSpin'], style.spin);
|
|
110
|
+
setFloat(gl, this.uniforms['uPunch'], style.punch);
|
|
111
|
+
setFloat(gl, this.uniforms['uBob'], style.bob);
|
|
112
|
+
setFloat(gl, this.uniforms['uTime'], timeSec);
|
|
113
|
+
setFloat(gl, this.uniforms['uGlow'], style.glow);
|
|
114
|
+
setFloat(gl, this.uniforms['uAlpha'], style.alpha);
|
|
115
|
+
/* Identity: this backend's clip space is the one the shader was written against. */
|
|
116
|
+
const correction = this.uniforms['uClipCorrection'];
|
|
117
|
+
if (correction !== undefined)
|
|
118
|
+
gl.uniformMatrix4fv(correction, false, TEXT_IDENTITY);
|
|
119
|
+
const color = this.uniforms['uColor'];
|
|
120
|
+
if (color !== undefined) {
|
|
121
|
+
gl.uniform3f(color, style.color[0], style.color[1], style.color[2]);
|
|
122
|
+
}
|
|
123
|
+
gl.drawArraysInstanced(gl.TRIANGLES, 0, TEXT_CUBE.vertexCount, this.layout.instanceCount);
|
|
124
|
+
gl.bindVertexArray(null);
|
|
125
|
+
}
|
|
126
|
+
dispose() {
|
|
127
|
+
const gl = this.gl;
|
|
128
|
+
for (const buffer of this.buffers)
|
|
129
|
+
gl.deleteBuffer(buffer);
|
|
130
|
+
this.buffers.length = 0;
|
|
131
|
+
gl.deleteVertexArray(this.vao);
|
|
132
|
+
gl.deleteProgram(this.program);
|
|
133
|
+
}
|
|
134
|
+
/** Both instance buffers, from the arrays the layout filled in place. */
|
|
135
|
+
upload() {
|
|
136
|
+
const gl = this.gl;
|
|
137
|
+
const count = this.layout.instanceCount;
|
|
138
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.cellBuffer);
|
|
139
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.layout.cells, 0, count * 2);
|
|
140
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.charBuffer);
|
|
141
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.layout.chars, 0, count);
|
|
142
|
+
}
|
|
143
|
+
staticAttribute(location, data, size) {
|
|
144
|
+
const gl = this.gl;
|
|
145
|
+
const buffer = gl.createBuffer();
|
|
146
|
+
if (buffer === null)
|
|
147
|
+
throw new Error('Failed to create text buffer');
|
|
148
|
+
this.buffers.push(buffer);
|
|
149
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
150
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
151
|
+
gl.enableVertexAttribArray(location);
|
|
152
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
153
|
+
return buffer;
|
|
154
|
+
}
|
|
155
|
+
instanceAttribute(location, floats, size) {
|
|
156
|
+
const gl = this.gl;
|
|
157
|
+
const buffer = gl.createBuffer();
|
|
158
|
+
if (buffer === null)
|
|
159
|
+
throw new Error('Failed to create text buffer');
|
|
160
|
+
this.buffers.push(buffer);
|
|
161
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
162
|
+
gl.bufferData(gl.ARRAY_BUFFER, floats * 4, gl.DYNAMIC_DRAW);
|
|
163
|
+
gl.enableVertexAttribArray(location);
|
|
164
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
165
|
+
gl.vertexAttribDivisor(location, 1);
|
|
166
|
+
return buffer;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function setFloat(gl, location, value) {
|
|
170
|
+
if (location !== undefined)
|
|
171
|
+
gl.uniform1f(location, value);
|
|
172
|
+
}
|
|
173
|
+
function setVec2(gl, location, x, y) {
|
|
174
|
+
if (location !== undefined)
|
|
175
|
+
gl.uniform2f(location, x, y);
|
|
176
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/** Collision-safe, configurable third-person orbit camera rig. */
|
|
2
|
+
import type { BoomTiming } from './boom.ts';
|
|
3
|
+
import type { ColliderSet } from '@driftengine/physics';
|
|
4
|
+
import type { GroundSurface } from '../physics/ribbonSurface.ts';
|
|
5
|
+
import { Camera } from './camera.ts';
|
|
6
|
+
export interface ThirdPersonCameraOptions {
|
|
7
|
+
boomDistance: number;
|
|
8
|
+
boomRadius: number;
|
|
9
|
+
boomMinDistance: number;
|
|
10
|
+
positionLambda: number;
|
|
11
|
+
fovLambda: number;
|
|
12
|
+
pitchMin: number;
|
|
13
|
+
pitchMax: number;
|
|
14
|
+
initialPitch: number;
|
|
15
|
+
initialFovYDeg: number;
|
|
16
|
+
/**
|
|
17
|
+
* How fast the arm may change length. Absent keeps the numbers every rig had.
|
|
18
|
+
*
|
|
19
|
+
* **The defaults are written for an arm of several metres**, where the speed ceilings bind and
|
|
20
|
+
* the obstruction is a railing sweeping across for a few frames. On a short arm neither ceiling
|
|
21
|
+
* binds, only the damping acts, and easing into a wall is the wrong trade — see `BoomTiming`,
|
|
22
|
+
* which carries the measurement and the immediate-retract spelling.
|
|
23
|
+
*/
|
|
24
|
+
readonly boomTiming?: Partial<BoomTiming>;
|
|
25
|
+
/**
|
|
26
|
+
* Whether the rig damps the roll it is handed. Absent means yes, which every rig had.
|
|
27
|
+
*
|
|
28
|
+
* **False is for a caller that has already damped it**, and that is not a niche: a consumer with
|
|
29
|
+
* a comfort setting on roll applies the same value to a first-person view, so a roll damped again
|
|
30
|
+
* here is damped twice and the setting stops meaning what it is asserted to mean. The rig's own
|
|
31
|
+
* damping exists so a subject snapping between surfaces cannot snap the view; a caller that has
|
|
32
|
+
* solved that itself is not asking for it twice.
|
|
33
|
+
*/
|
|
34
|
+
readonly dampRoll?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Something that can say how far an arm gets before it hits the world.
|
|
38
|
+
*
|
|
39
|
+
* **An alternative to the `ColliderSet`, on the seam `surface` already uses.** The rig tests its
|
|
40
|
+
* arm with `segmentHit` against a set of boxes, and a consumer whose world is a `PhysicsWorld`
|
|
41
|
+
* does not have one — so using the rig meant building and maintaining a second copy of the world
|
|
42
|
+
* for the camera alone, which is a cost large enough to have kept one consumer off the rig
|
|
43
|
+
* entirely.
|
|
44
|
+
*
|
|
45
|
+
* A segment and a radius in, metres along it or null out. Metres rather than a fraction because
|
|
46
|
+
* that is what a raycast answers and the rig knows its own length; null rather than the length
|
|
47
|
+
* because "nothing was hit" and "something was hit at the far end" are different facts, and a
|
|
48
|
+
* caller should not have to encode the first as the second.
|
|
49
|
+
*/
|
|
50
|
+
export interface BoomObstruction {
|
|
51
|
+
distance(fromX: number, fromY: number, fromZ: number, alongX: number, alongY: number, alongZ: number, radius: number): number | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generic camera mechanism. The caller supplies its already-resolved target
|
|
55
|
+
* height and desired FOV, keeping crouch rules and speed effects in the game.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ThirdPersonCamera {
|
|
58
|
+
private readonly colliders;
|
|
59
|
+
private readonly options;
|
|
60
|
+
private readonly surface;
|
|
61
|
+
/**
|
|
62
|
+
* A world query for the arm, instead of the collider set.
|
|
63
|
+
*
|
|
64
|
+
* Fourth and defaulted, so no existing call site changes — the same shape `surface` was added
|
|
65
|
+
* in. When it is given, `colliders` is not consulted at all: a caller with one has the whole
|
|
66
|
+
* world behind it and a set of boxes beside it would be a second, partial answer to the same
|
|
67
|
+
* question. See `BoomObstruction` for why one consumer could not supply the set.
|
|
68
|
+
*/
|
|
69
|
+
private readonly obstruction;
|
|
70
|
+
readonly camera: Camera;
|
|
71
|
+
private smoothX;
|
|
72
|
+
private smoothY;
|
|
73
|
+
private smoothZ;
|
|
74
|
+
/**
|
|
75
|
+
* Where the target was last frame, so its velocity can be differenced out of it.
|
|
76
|
+
*
|
|
77
|
+
* **Differenced here rather than asked of the caller**, because every caller already hands the
|
|
78
|
+
* target over each frame and a second parameter for something derivable from the first is a
|
|
79
|
+
* signature every consumer has to be told about. It is exact for a target moving smoothly, which
|
|
80
|
+
* a vehicle under a fixed step with interpolation is: the engine's own harness measures the
|
|
81
|
+
* subject holding its world speed to within a twentieth of a per cent through frame jitter that
|
|
82
|
+
* moves this camera by 5%.
|
|
83
|
+
*/
|
|
84
|
+
/**
|
|
85
|
+
* The frame the arm is built in. World axes unless a caller says otherwise.
|
|
86
|
+
*
|
|
87
|
+
* **The arm used to be a spherical boom about world Y** — `-sin(yaw) cos(pitch)`, `-sin(pitch)`,
|
|
88
|
+
* `cos(yaw) cos(pitch)` — so a subject standing on a wall or a ceiling got an arm that still
|
|
89
|
+
* swung about world up, and the rig placed the eye through the surface the subject was standing
|
|
90
|
+
* on. `groundClear` cut the arm where the eye would go under the deck, which is the same
|
|
91
|
+
* assumption a second time.
|
|
92
|
+
*
|
|
93
|
+
* The rig already anticipated this case and stopped one step short of it: `targetRoll`'s comment
|
|
94
|
+
* says the rig knows nothing about banked surfaces, only that a camera can be tilted, and damps
|
|
95
|
+
* roll here so a subject snapping between surfaces cannot snap the view. The arm is carried the
|
|
96
|
+
* same distance now. Yaw and pitch keep their meaning and become angles inside this frame, so a
|
|
97
|
+
* caller that never sets one gets exactly the arm it always got.
|
|
98
|
+
*/
|
|
99
|
+
boomUpX: number;
|
|
100
|
+
boomUpY: number;
|
|
101
|
+
boomUpZ: number;
|
|
102
|
+
/**
|
|
103
|
+
* The frame's forward, **readable because a caller that sets one needs to know what it became**.
|
|
104
|
+
*
|
|
105
|
+
* Both `setBoomUp` and `setBoomForward` orthogonalise against the other axis, so what the rig
|
|
106
|
+
* holds is rarely the vector it was handed — and a caller computing a roll, or asking where its
|
|
107
|
+
* subject's heading ended up, needs the one the arm is actually built from. Assigning these
|
|
108
|
+
* directly does not rebuild the frame; the two setters are what keep the three axes orthonormal.
|
|
109
|
+
*/
|
|
110
|
+
boomForwardX: number;
|
|
111
|
+
boomForwardY: number;
|
|
112
|
+
boomForwardZ: number;
|
|
113
|
+
private boomRightX;
|
|
114
|
+
private boomRightY;
|
|
115
|
+
private boomRightZ;
|
|
116
|
+
private lastTargetX;
|
|
117
|
+
private lastTargetY;
|
|
118
|
+
private lastTargetZ;
|
|
119
|
+
private fov;
|
|
120
|
+
private roll;
|
|
121
|
+
private snapped;
|
|
122
|
+
/**
|
|
123
|
+
* The arm out to the camera, and its speed limits.
|
|
124
|
+
*
|
|
125
|
+
* This rig used to apply the collision query's fraction directly. The query is a
|
|
126
|
+
* step function — a railing either blocks the arm or it does not — so the camera
|
|
127
|
+
* jumped by up to 4 m in a single frame every time one swept across it. That is
|
|
128
|
+
* the same artefact the replay camera was fixed for after it was reported as
|
|
129
|
+
* juddering and jumpy; this rig simply never got the fix, and a railed descent
|
|
130
|
+
* is where it would be worst.
|
|
131
|
+
*/
|
|
132
|
+
private readonly boom;
|
|
133
|
+
/** Reused by the ground query; the rig allocates nothing per frame. */
|
|
134
|
+
private readonly groundHit;
|
|
135
|
+
/**
|
|
136
|
+
* @param surface The walkable ground, where the caller has one. **Not optional in
|
|
137
|
+
* practice**, and the reason is worth stating: `colliders` is not the whole world.
|
|
138
|
+
* A consumer whose drivable surface is a banked ribbon cannot put it in the collider
|
|
139
|
+
* set — a world-axis box around a banked cross-section has a flat lid at its highest
|
|
140
|
+
* corner, which is floor where nothing is drawn and a wall where the next slab's lid
|
|
141
|
+
* stands above the character's feet. So that surface is invisible to `segmentHit`, and a
|
|
142
|
+
* boom tested only against boxes passes straight through the deck.
|
|
143
|
+
*
|
|
144
|
+
* Which is exactly what it did. On a descent, pitching the view down put the eye
|
|
145
|
+
* *under the track*, with the deck between the camera and the character: the rig sees the
|
|
146
|
+
* underside of the surface instead of the character, because dynamic surfaces are not
|
|
147
|
+
* part of what it tests against. Worse in replays, where the camera moves far more than
|
|
148
|
+
* a player ever moves it.
|
|
149
|
+
*/
|
|
150
|
+
constructor(colliders: ColliderSet, options: Readonly<ThirdPersonCameraOptions>, surface?: GroundSurface | null,
|
|
151
|
+
/**
|
|
152
|
+
* A world query for the arm, instead of the collider set.
|
|
153
|
+
*
|
|
154
|
+
* Fourth and defaulted, so no existing call site changes — the same shape `surface` was added
|
|
155
|
+
* in. When it is given, `colliders` is not consulted at all: a caller with one has the whole
|
|
156
|
+
* world behind it and a set of boxes beside it would be a second, partial answer to the same
|
|
157
|
+
* question. See `BoomObstruction` for why one consumer could not supply the set.
|
|
158
|
+
*/
|
|
159
|
+
obstruction?: BoomObstruction | null);
|
|
160
|
+
/**
|
|
161
|
+
* Place the rig outright on the next update instead of gliding to it.
|
|
162
|
+
*
|
|
163
|
+
* The first update already does this — a camera that eases in from the origin
|
|
164
|
+
* on the first frame of a session is a swoop nobody asked for. This re-arms it,
|
|
165
|
+
* for a subject that has *moved without travelling*: a scrub bar dropped
|
|
166
|
+
* somewhere else in a replay, or a character put back on a checkpoint. Smoothing
|
|
167
|
+
* across that is a camera flying the length of the route with nothing in frame,
|
|
168
|
+
* which the replay camera has already been measured doing at 124 m in a single
|
|
169
|
+
* shot.
|
|
170
|
+
*
|
|
171
|
+
* Only the caller can tell that apart from a legitimately fast frame, which is
|
|
172
|
+
* why it is a method here rather than a distance threshold in `update`.
|
|
173
|
+
*/
|
|
174
|
+
/**
|
|
175
|
+
* How far out the arm may reach before the eye would drop below the ground, as a
|
|
176
|
+
* fraction of its length. 1 when the ground is nowhere near it.
|
|
177
|
+
*
|
|
178
|
+
* Sampled from the far end inward and returned on the first clear station, because the
|
|
179
|
+
* useful answer is the *longest* arm that works. `boomRadius` of clearance, so the eye
|
|
180
|
+
* stops above the deck rather than grazing it — the same margin the box query uses.
|
|
181
|
+
*/
|
|
182
|
+
private groundClear;
|
|
183
|
+
/**
|
|
184
|
+
* Point the boom's up at a direction; the rest of the frame follows it.
|
|
185
|
+
*
|
|
186
|
+
* **Forward is carried from the frame it had rather than derived from a world axis**, which is
|
|
187
|
+
* what makes a body walking from a floor onto a wall and onto a ceiling continuous. Deriving it
|
|
188
|
+
* from a fixed reference would be one line shorter and would put a pole wherever `up` lined up
|
|
189
|
+
* with that reference: the arm would swing through a half turn as a subject crossed it, on a rig
|
|
190
|
+
* whose whole job is that the view does not snap.
|
|
191
|
+
*
|
|
192
|
+
* The fallbacks are only reached when the carried forward has become parallel to the new up,
|
|
193
|
+
* which a continuous rotation cannot do in one step and a teleport can. World Z first and world
|
|
194
|
+
* X behind it, so there is always an answer and it is never a normalised zero.
|
|
195
|
+
*
|
|
196
|
+
* A zero-length vector keeps the frame it had, for the reason `setUp` on the character
|
|
197
|
+
* controller gives: a NaN basis is a camera that is nowhere, and every number downstream of it
|
|
198
|
+
* reads as a rig that has failed rather than as an argument that was refused.
|
|
199
|
+
*/
|
|
200
|
+
setBoomUp(x: number, y: number, z: number): void;
|
|
201
|
+
/**
|
|
202
|
+
* Point the boom's forward at a direction; the up is kept and the arm is rebuilt around it.
|
|
203
|
+
*
|
|
204
|
+
* **For a subject that has a heading of its own, which the carried forward cannot express.**
|
|
205
|
+
* `setBoomUp` keeps whatever forward the frame had, re-projected — the right default, because it
|
|
206
|
+
* is what makes a body walking from a floor onto a wall continuous, and because most subjects
|
|
207
|
+
* have no heading to speak of. What it cannot say is "behind *this*": a yaw of π puts the eye
|
|
208
|
+
* opposite a forward the caller never chose and, until this existed, could not read either. A
|
|
209
|
+
* subject spawning face-on to a wall got a shot framed at random, and a caller trying to work out
|
|
210
|
+
* how far to roll so that the support surface sits at the bottom of the picture had to know where
|
|
211
|
+
* the arm was — an azimuth measured from an axis nothing reported.
|
|
212
|
+
*
|
|
213
|
+
* **This is not a reversal of the carried forward and does not change it for anyone.** A caller
|
|
214
|
+
* that never calls this carries its forward exactly as before, and one that does still has it
|
|
215
|
+
* re-orthogonalised by every `setBoomUp` — the heading is a direction in the world, and the frame
|
|
216
|
+
* it lands in is the surface's.
|
|
217
|
+
*
|
|
218
|
+
* A zero-length vector, or one parallel to the current up, keeps the frame it had. **Deliberately
|
|
219
|
+
* not the fallback chain `setBoomUp` uses**, and the asymmetry is the point: that method must
|
|
220
|
+
* produce *some* forward because the up is what changed and a frame needs one, so an arbitrary
|
|
221
|
+
* axis is better than none. Here the forward is the argument, and answering a direction the
|
|
222
|
+
* caller did not ask for is precisely the failure this exists to fix.
|
|
223
|
+
*/
|
|
224
|
+
setBoomForward(x: number, y: number, z: number): void;
|
|
225
|
+
/**
|
|
226
|
+
* Build the three axes from an up and a candidate forward, or answer false and change nothing.
|
|
227
|
+
*
|
|
228
|
+
* Shared by both setters so that "orthogonalised against the other axis" means one piece of
|
|
229
|
+
* arithmetic rather than two that have to be kept in step. False is the parallel case: there is
|
|
230
|
+
* no forward perpendicular to an up it is already parallel to, and what each caller does about
|
|
231
|
+
* that is the one thing they do differently.
|
|
232
|
+
*/
|
|
233
|
+
private setBasis;
|
|
234
|
+
snap(): void;
|
|
235
|
+
/**
|
|
236
|
+
* How much of the arm is clear of the world, from whichever source the rig was given.
|
|
237
|
+
*
|
|
238
|
+
* The injected query wins outright where there is one, for the reason its own type gives: a
|
|
239
|
+
* caller with the whole world behind it does not also want a partial answer from a box set.
|
|
240
|
+
*/
|
|
241
|
+
private blockedFraction;
|
|
242
|
+
update(frameDt: number, yaw: number, pitch: number, targetX: number, targetY: number, targetZ: number, targetFovYDeg: number,
|
|
243
|
+
/**
|
|
244
|
+
* Roll, radians. The caller's policy: this rig knows nothing about banked
|
|
245
|
+
* surfaces, only that a camera can be tilted. Damped here rather than by
|
|
246
|
+
* the caller so a subject snapping between surfaces cannot snap the view.
|
|
247
|
+
*/
|
|
248
|
+
targetRoll?: number): void;
|
|
249
|
+
/**
|
|
250
|
+
* Point the camera back down the arm, in the frame the arm was built in.
|
|
251
|
+
*
|
|
252
|
+
* **The arm moved into the boom's basis and the aim did not, and that half-migration is what this
|
|
253
|
+
* closes.** `update` placed the eye using `boomRight`/`boomUp`/`boomForward` and then set
|
|
254
|
+
* `cam.yaw`, `cam.pitch` and `cam.roll` — which `Camera.updateMatrices` reads against the *world*
|
|
255
|
+
* axes. The two agree only while up is world Y. With up at +X, an arm built at yaw 0 lies along
|
|
256
|
+
* the frame's forward while a camera at yaw 0 looks down world −Z: a right angle apart, so the
|
|
257
|
+
* rig put the eye in the right place and rendered the scene beside the subject, with no error
|
|
258
|
+
* anywhere. Reported from outside, where recovering the aim meant inverting this rig's own boom
|
|
259
|
+
* formula from outside it, against a sign convention nothing stated.
|
|
260
|
+
*
|
|
261
|
+
* **Derived rather than taken, so `update`'s signature is unchanged** — the same property R2 held
|
|
262
|
+
* to when it added `setBoomUp` rather than a `basis` parameter.
|
|
263
|
+
*
|
|
264
|
+
* The decomposition is exact and is the inverse of `updateMatrices`' own construction: forward
|
|
265
|
+
* fixes yaw and pitch, and the roll is the angle from the basis that construction would build at
|
|
266
|
+
* those two onto the up the arm was built against. **At the world basis every line here returns
|
|
267
|
+
* what was passed in**, which is asserted rather than assumed — `up` is world Y orthogonalised
|
|
268
|
+
* against forward, which is precisely the up `updateMatrices` derives, so the base roll is zero
|
|
269
|
+
* and the caller's damped roll is all that is left.
|
|
270
|
+
*/
|
|
271
|
+
private aimAlongArm;
|
|
272
|
+
}
|