@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,923 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A transform gizmo: what a ray is over, what a drag does to a transform, and the lines
|
|
3
|
+
* that draw it.
|
|
4
|
+
*
|
|
5
|
+
* **A generator and not a pass**, which is the argument `debugLines.ts` makes and which
|
|
6
|
+
* holds here with more force. `drawLines` has been on both backends since the polyline
|
|
7
|
+
* batch landed; what a gizmo adds is the arithmetic. Nothing in this file touches a
|
|
8
|
+
* context, so one implementation answers for WebGL2 and WebGPU alike and every test runs
|
|
9
|
+
* without either.
|
|
10
|
+
*
|
|
11
|
+
* **It says what, and dispatches nothing.** `registerPickable` settled this for picking
|
|
12
|
+
* and the same reasoning applies: enter, leave, capture and the difference between a click
|
|
13
|
+
* and a drag belong to the consumer, which already has that logic for anything with a drag
|
|
14
|
+
* in it. This is asked what a ray is over, and told when a drag begins, moves and ends.
|
|
15
|
+
*
|
|
16
|
+
* **It does not own the transform it edits.** `position`, `rotation` and `scale` are here
|
|
17
|
+
* because a drag has to put its answer somewhere; the caller copies them onto whatever it
|
|
18
|
+
* actually moves. A gizmo reaching into a `SceneNode` would be render code mutating scene
|
|
19
|
+
* state, which `ARCHITECTURE.md` forbids.
|
|
20
|
+
*
|
|
21
|
+
* **Nothing here throws and nothing allocates after construction**, for the reason
|
|
22
|
+
* `DebugLines` gives: a tool that threw would take the frame down at the moment somebody
|
|
23
|
+
* was trying to move something.
|
|
24
|
+
*
|
|
25
|
+
* A caller wires it in four lines:
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* camera.rayThrough(origin, direction, cssX, cssY, cssWidth, cssHeight);
|
|
29
|
+
* gizmo.size = gizmoScaleFor(camera, gizmo.position, cssHeight, 90);
|
|
30
|
+
* if (down && !wasDown) gizmo.beginDrag(origin, direction);
|
|
31
|
+
* else if (down) gizmo.updateDrag(origin, direction);
|
|
32
|
+
* else { gizmo.endDrag(); gizmo.hover(origin, direction); }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
import { quat, vec3 } from 'gl-matrix';
|
|
36
|
+
import { rayClosestOnLine, rayPlane, raySphere } from '../math/intersect.ts';
|
|
37
|
+
import { createLineSegments } from './linePoints.ts';
|
|
38
|
+
import type { LineSegments } from './linePoints.ts';
|
|
39
|
+
import type { Camera } from './camera.ts';
|
|
40
|
+
import type { Vec3 } from '../math/color.ts';
|
|
41
|
+
|
|
42
|
+
export const GIZMO_NONE = 0;
|
|
43
|
+
export const GIZMO_TRANSLATE_X = 1;
|
|
44
|
+
export const GIZMO_TRANSLATE_Y = 2;
|
|
45
|
+
export const GIZMO_TRANSLATE_Z = 3;
|
|
46
|
+
/** The plane handles are named for the axes they slide in, so `YZ` is normal to x. */
|
|
47
|
+
export const GIZMO_TRANSLATE_YZ = 4;
|
|
48
|
+
export const GIZMO_TRANSLATE_ZX = 5;
|
|
49
|
+
export const GIZMO_TRANSLATE_XY = 6;
|
|
50
|
+
export const GIZMO_ROTATE_X = 7;
|
|
51
|
+
export const GIZMO_ROTATE_Y = 8;
|
|
52
|
+
export const GIZMO_ROTATE_Z = 9;
|
|
53
|
+
export const GIZMO_SCALE_X = 10;
|
|
54
|
+
export const GIZMO_SCALE_Y = 11;
|
|
55
|
+
export const GIZMO_SCALE_Z = 12;
|
|
56
|
+
export const GIZMO_SCALE_UNIFORM = 13;
|
|
57
|
+
|
|
58
|
+
export type GizmoMode = 'translate' | 'rotate' | 'scale';
|
|
59
|
+
export type GizmoSpace = 'world' | 'local';
|
|
60
|
+
|
|
61
|
+
/** Buffer indices. Three axes, one neutral, one for whatever is highlighted. */
|
|
62
|
+
export const GIZMO_GROUP_X = 0;
|
|
63
|
+
export const GIZMO_GROUP_Y = 1;
|
|
64
|
+
export const GIZMO_GROUP_Z = 2;
|
|
65
|
+
export const GIZMO_GROUP_NEUTRAL = 3;
|
|
66
|
+
export const GIZMO_GROUP_ACTIVE = 4;
|
|
67
|
+
export const GIZMO_GROUP_COUNT = 5;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A colour per group, in the order the groups are indexed.
|
|
71
|
+
*
|
|
72
|
+
* Exported as data rather than baked into a draw call because this file draws nothing.
|
|
73
|
+
* A consumer with its own palette overrides them and nothing here notices.
|
|
74
|
+
*/
|
|
75
|
+
export const GIZMO_GROUP_COLORS: readonly Vec3[] = [
|
|
76
|
+
[0.9, 0.25, 0.25],
|
|
77
|
+
[0.35, 0.85, 0.3],
|
|
78
|
+
[0.3, 0.5, 0.95],
|
|
79
|
+
[0.75, 0.75, 0.78],
|
|
80
|
+
[1.0, 0.85, 0.2],
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
/* Every length below is a fraction of `size`, so the whole gizmo scales as one thing. */
|
|
84
|
+
const ARM_START = 0.15;
|
|
85
|
+
const ARM_END = 1.0;
|
|
86
|
+
const ARM_PICK_RADIUS = 0.08;
|
|
87
|
+
const HEAD_LENGTH = 0.2;
|
|
88
|
+
const HEAD_RADIUS = 0.06;
|
|
89
|
+
const PLANE_INNER = 0.28;
|
|
90
|
+
const PLANE_OUTER = 0.58;
|
|
91
|
+
const RING_RADIUS = 1.0;
|
|
92
|
+
const RING_PICK_HALF_WIDTH = 0.07;
|
|
93
|
+
/** Inside this radius a ring drag's angle is noise, so the drag holds what it had. */
|
|
94
|
+
const RING_MIN_GRAB = 0.2;
|
|
95
|
+
const CENTRE_RADIUS = 0.13;
|
|
96
|
+
const TIP_RADIUS = 0.07;
|
|
97
|
+
/** A scale can be driven small but never to zero, which is not invertible, or negative. */
|
|
98
|
+
const MIN_SCALE = 0.01;
|
|
99
|
+
|
|
100
|
+
const TWO_PI = Math.PI * 2;
|
|
101
|
+
|
|
102
|
+
const BASIS: readonly Vec3[] = [
|
|
103
|
+
[1, 0, 0],
|
|
104
|
+
[0, 1, 0],
|
|
105
|
+
[0, 0, 1],
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The world size that covers `pixels` screen pixels at the target's distance.
|
|
110
|
+
*
|
|
111
|
+
* A separate function rather than a method, which is what keeps every intersection and
|
|
112
|
+
* every drag in this file testable against a bare ray: the gizmo never learns what a
|
|
113
|
+
* camera is. A caller assigns the result to `size` once a frame.
|
|
114
|
+
*
|
|
115
|
+
* Perspective only, because `Camera` is. An orthographic camera's answer does not depend
|
|
116
|
+
* on distance at all, and the day one exists this grows a branch rather than a caller.
|
|
117
|
+
*/
|
|
118
|
+
export function gizmoScaleFor(
|
|
119
|
+
camera: Camera,
|
|
120
|
+
target: ArrayLike<number>,
|
|
121
|
+
cssHeight: number,
|
|
122
|
+
pixels: number,
|
|
123
|
+
): number {
|
|
124
|
+
const dx = (target[0] as number) - (camera.position[0] as number);
|
|
125
|
+
const dy = (target[1] as number) - (camera.position[1] as number);
|
|
126
|
+
const dz = (target[2] as number) - (camera.position[2] as number);
|
|
127
|
+
const distance = Math.hypot(dx, dy, dz);
|
|
128
|
+
const halfFov = (camera.fovYDeg * Math.PI) / 360;
|
|
129
|
+
const worldPerPixel = (2 * distance * Math.tan(halfFov)) / Math.max(cssHeight, 1);
|
|
130
|
+
return worldPerPixel * pixels;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export class Gizmo {
|
|
134
|
+
mode: GizmoMode = 'translate';
|
|
135
|
+
space: GizmoSpace = 'world';
|
|
136
|
+
/** The gizmo's own world size. See `gizmoScaleFor`. Non-positive draws and picks nothing. */
|
|
137
|
+
size = 1;
|
|
138
|
+
|
|
139
|
+
/** The transform being edited. Written by a drag; the caller copies it where it belongs. */
|
|
140
|
+
readonly position = new Float32Array(3);
|
|
141
|
+
/** A quaternion, `xyzw`, identity at construction. */
|
|
142
|
+
readonly rotation = new Float32Array([0, 0, 0, 1]);
|
|
143
|
+
readonly scale = new Float32Array([1, 1, 1]);
|
|
144
|
+
|
|
145
|
+
private readonly groups: LineSegments[] = [];
|
|
146
|
+
private readonly ringSegments: number;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The basis the handles point along, rebuilt on every pick and frozen for a drag.
|
|
150
|
+
*
|
|
151
|
+
* Three standing `Float32Array`s rather than one of nine with a `subarray` per read:
|
|
152
|
+
* `subarray` allocates a view object, and these are read several times per handle per
|
|
153
|
+
* pointer move.
|
|
154
|
+
*/
|
|
155
|
+
private readonly axes = [new Float32Array(3), new Float32Array(3), new Float32Array(3)];
|
|
156
|
+
private readonly dragAxes = [new Float32Array(3), new Float32Array(3), new Float32Array(3)];
|
|
157
|
+
|
|
158
|
+
private hoveredHandle = GIZMO_NONE;
|
|
159
|
+
private activeHandle = GIZMO_NONE;
|
|
160
|
+
|
|
161
|
+
/* Anchors, all captured by `beginDrag` and read by `updateDrag`. */
|
|
162
|
+
private readonly grabPosition = new Float32Array(3);
|
|
163
|
+
private readonly grabRotation = new Float32Array(4);
|
|
164
|
+
private readonly grabScale = new Float32Array(3);
|
|
165
|
+
private readonly grabPoint = new Float32Array(3);
|
|
166
|
+
private readonly grabViewNormal = new Float32Array(3);
|
|
167
|
+
private grabParam = 0;
|
|
168
|
+
private grabRadius = 0;
|
|
169
|
+
private previousAngle = 0;
|
|
170
|
+
private accumulated = 0;
|
|
171
|
+
|
|
172
|
+
/* Scratch, so a pointer move allocates nothing. */
|
|
173
|
+
private readonly closest = new Float32Array(3);
|
|
174
|
+
private readonly point = new Float32Array(3);
|
|
175
|
+
private readonly offset = new Float32Array(3);
|
|
176
|
+
private readonly turn = new Float32Array(4);
|
|
177
|
+
private readonly corners = new Float32Array(18);
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* `ringSegments` is the resolution of a rotation ring, and it also sets every buffer's
|
|
181
|
+
* capacity because a ring is the largest thing any one of them holds.
|
|
182
|
+
*/
|
|
183
|
+
constructor(ringSegments = 48) {
|
|
184
|
+
if (!(ringSegments >= 8))
|
|
185
|
+
throw new Error(`Gizmo: ringSegments must be at least 8, got ${ringSegments}`);
|
|
186
|
+
this.ringSegments = Math.floor(ringSegments);
|
|
187
|
+
const capacity = this.ringSegments + 16;
|
|
188
|
+
for (let group = 0; group < GIZMO_GROUP_COUNT; group++)
|
|
189
|
+
this.groups.push(createLineSegments(capacity));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** What a `hover` last found, or `GIZMO_NONE`. */
|
|
193
|
+
get hovered(): number {
|
|
194
|
+
return this.hoveredHandle;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** The handle a drag is on, or `GIZMO_NONE`. */
|
|
198
|
+
get active(): number {
|
|
199
|
+
return this.activeHandle;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
get dragging(): boolean {
|
|
203
|
+
return this.activeHandle !== GIZMO_NONE;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* How far the current rotation drag has turned, in radians, signed and unbounded.
|
|
208
|
+
*
|
|
209
|
+
* **This is the only place the unwrap in `dragRing` is observable, and that is not
|
|
210
|
+
* obvious.** The orientation is not: `quat.setAxisAngle` is 2π-periodic and a quaternion
|
|
211
|
+
* double-covers the rotations, so an accumulated angle that is wrong by a whole turn
|
|
212
|
+
* produces the same orientation, negated — which is the same rotation. What the unwrap
|
|
213
|
+
* buys is a continuous *number*: a readout that says 270° rather than −90°, and a caller
|
|
214
|
+
* that wants to snap to fifteen degrees or stop at a limit, both of which need the turn
|
|
215
|
+
* and not the pose. Zero when no rotation drag is running.
|
|
216
|
+
*/
|
|
217
|
+
get dragAngle(): number {
|
|
218
|
+
return this.activeHandle >= GIZMO_ROTATE_X && this.activeHandle <= GIZMO_ROTATE_Z
|
|
219
|
+
? this.accumulated
|
|
220
|
+
: 0;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** One group's geometry, filled by the last `build`. Draw it with `GIZMO_GROUP_COLORS[group]`. */
|
|
224
|
+
segments(group: number): LineSegments {
|
|
225
|
+
const at = this.groups[group];
|
|
226
|
+
if (at === undefined) throw new Error(`Gizmo: no group ${group}`);
|
|
227
|
+
return at;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The handle a ray is over, or `GIZMO_NONE`. No side effects; `hover` is the one that
|
|
232
|
+
* remembers.
|
|
233
|
+
*
|
|
234
|
+
* **Nearest along the ray wins, except that the centre handle wins outright**, which is
|
|
235
|
+
* one documented exception rather than a priority table: a priority table would let a
|
|
236
|
+
* plane handle behind the camera beat an arm in front of it, which a user sees as a
|
|
237
|
+
* click landing on the wrong thing.
|
|
238
|
+
*
|
|
239
|
+
* **As the radii stand the exception decides nothing**, and that is worth saying rather
|
|
240
|
+
* than implying otherwise: an arm's pick cylinder starts at `ARM_START` of the size and
|
|
241
|
+
* the centre's sphere ends at `CENTRE_RADIUS`, which is smaller, so the two regions do
|
|
242
|
+
* not meet. The ordering is what keeps a later change to either radius from quietly
|
|
243
|
+
* producing a centre nobody can click, which is the failure it is here to prevent.
|
|
244
|
+
*
|
|
245
|
+
* `direction` must be unit length. `camera.rayThrough` gives one.
|
|
246
|
+
*/
|
|
247
|
+
pick(origin: ArrayLike<number>, direction: ArrayLike<number>): number {
|
|
248
|
+
if (!(this.size > 0)) return GIZMO_NONE;
|
|
249
|
+
this.refreshAxes(this.axes);
|
|
250
|
+
|
|
251
|
+
if (this.mode === 'scale') {
|
|
252
|
+
const centre = raySphere(origin, direction, this.position, this.size * CENTRE_RADIUS);
|
|
253
|
+
if (centre >= 0) return GIZMO_SCALE_UNIFORM;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
let best = Infinity;
|
|
257
|
+
let handle = GIZMO_NONE;
|
|
258
|
+
|
|
259
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
260
|
+
if (this.mode === 'rotate') {
|
|
261
|
+
const t = this.pickRing(origin, direction, axis, this.axes);
|
|
262
|
+
if (t >= 0 && t < best) {
|
|
263
|
+
best = t;
|
|
264
|
+
handle = GIZMO_ROTATE_X + axis;
|
|
265
|
+
}
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const arm = this.pickArm(origin, direction, axis, this.axes);
|
|
270
|
+
if (arm >= 0 && arm < best) {
|
|
271
|
+
best = arm;
|
|
272
|
+
handle = (this.mode === 'translate' ? GIZMO_TRANSLATE_X : GIZMO_SCALE_X) + axis;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (this.mode === 'translate') {
|
|
276
|
+
const plane = this.pickPlane(origin, direction, axis, this.axes);
|
|
277
|
+
if (plane >= 0 && plane < best) {
|
|
278
|
+
best = plane;
|
|
279
|
+
handle = GIZMO_TRANSLATE_YZ + axis;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return handle;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** `pick`, remembered. Returns what it found. Ignored while a drag is running. */
|
|
288
|
+
hover(origin: ArrayLike<number>, direction: ArrayLike<number>): number {
|
|
289
|
+
if (this.dragging) return this.activeHandle;
|
|
290
|
+
this.hoveredHandle = this.pick(origin, direction);
|
|
291
|
+
return this.hoveredHandle;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Grab whatever the ray is over. Returns whether a drag started.
|
|
296
|
+
*
|
|
297
|
+
* **The transform and the axes are both captured here and neither is re-read until the
|
|
298
|
+
* drag ends.** Recomputing the basis from a rotation the drag is changing feeds the
|
|
299
|
+
* answer back into its own input, and what that looks like is a ring that accelerates
|
|
300
|
+
* away from the pointer.
|
|
301
|
+
*
|
|
302
|
+
* A grab whose anchor cannot be computed — a ray parallel to the axis it is grabbing —
|
|
303
|
+
* refuses rather than starting a drag with an arbitrary origin.
|
|
304
|
+
*/
|
|
305
|
+
beginDrag(origin: ArrayLike<number>, direction: ArrayLike<number>): boolean {
|
|
306
|
+
const handle = this.pick(origin, direction);
|
|
307
|
+
if (handle === GIZMO_NONE) return false;
|
|
308
|
+
|
|
309
|
+
for (let axis = 0; axis < 3; axis++)
|
|
310
|
+
(this.dragAxes[axis] as Float32Array).set(this.axes[axis] as Float32Array);
|
|
311
|
+
this.grabPosition.set(this.position);
|
|
312
|
+
this.grabRotation.set(this.rotation);
|
|
313
|
+
this.grabScale.set(this.scale);
|
|
314
|
+
this.accumulated = 0;
|
|
315
|
+
|
|
316
|
+
if (!this.anchor(handle, origin, direction)) return false;
|
|
317
|
+
this.activeHandle = handle;
|
|
318
|
+
this.hoveredHandle = handle;
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Move the drag. Returns whether the transform changed.
|
|
324
|
+
*
|
|
325
|
+
* **Every answer is absolute, computed from the anchor rather than accumulated from the
|
|
326
|
+
* last call**, so a drag cannot drift however many frames it runs for. Rotation is the
|
|
327
|
+
* one exception and §5 of the design says why: an angle has to be unwrapped against the
|
|
328
|
+
* previous one to survive the seam at ±π, so the total is accumulated and the *total* is
|
|
329
|
+
* what the transform is built from.
|
|
330
|
+
*
|
|
331
|
+
* **A degenerate ray keeps the previous value rather than producing one.** The
|
|
332
|
+
* alternative is the object teleporting at the moment the pointer crosses the plane it
|
|
333
|
+
* is dragging in, which is the single most annoying thing a gizmo can do.
|
|
334
|
+
*/
|
|
335
|
+
updateDrag(origin: ArrayLike<number>, direction: ArrayLike<number>): boolean {
|
|
336
|
+
const handle = this.activeHandle;
|
|
337
|
+
if (handle === GIZMO_NONE) return false;
|
|
338
|
+
|
|
339
|
+
if (handle >= GIZMO_TRANSLATE_X && handle <= GIZMO_TRANSLATE_Z) {
|
|
340
|
+
return this.dragAlongArm(origin, direction, handle - GIZMO_TRANSLATE_X, true);
|
|
341
|
+
}
|
|
342
|
+
if (handle >= GIZMO_TRANSLATE_YZ && handle <= GIZMO_TRANSLATE_XY) {
|
|
343
|
+
return this.dragInPlane(origin, direction, handle - GIZMO_TRANSLATE_YZ);
|
|
344
|
+
}
|
|
345
|
+
if (handle >= GIZMO_ROTATE_X && handle <= GIZMO_ROTATE_Z) {
|
|
346
|
+
return this.dragRing(origin, direction, handle - GIZMO_ROTATE_X);
|
|
347
|
+
}
|
|
348
|
+
if (handle >= GIZMO_SCALE_X && handle <= GIZMO_SCALE_Z) {
|
|
349
|
+
return this.dragAlongArm(origin, direction, handle - GIZMO_SCALE_X, false);
|
|
350
|
+
}
|
|
351
|
+
return this.dragUniform(origin, direction);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/** Let go. Safe to call on a frame with no drag running. */
|
|
355
|
+
endDrag(): void {
|
|
356
|
+
this.activeHandle = GIZMO_NONE;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Fill the five buffers for this frame's mode, transform and highlight.
|
|
361
|
+
*
|
|
362
|
+
* Cheap enough to call every frame — a rotation ring at the default resolution is 48
|
|
363
|
+
* segments of arithmetic — and it has to be, because the highlight changes with the
|
|
364
|
+
* pointer.
|
|
365
|
+
*/
|
|
366
|
+
build(): void {
|
|
367
|
+
for (const group of this.groups) group.count = 0;
|
|
368
|
+
if (!(this.size > 0)) return;
|
|
369
|
+
/* A running drag draws against the basis it grabbed. Refreshing it here would undo the
|
|
370
|
+
* freeze `beginDrag` took, and a local-space ring would chase its own rotation. */
|
|
371
|
+
if (!this.dragging) this.refreshAxes(this.axes);
|
|
372
|
+
const axes = this.dragging ? this.dragAxes : this.axes;
|
|
373
|
+
const lit = this.dragging ? this.activeHandle : this.hoveredHandle;
|
|
374
|
+
|
|
375
|
+
if (this.mode === 'translate') {
|
|
376
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
377
|
+
this.buildArm(axis, axes, this.groupFor(GIZMO_TRANSLATE_X + axis, axis, lit), true);
|
|
378
|
+
this.buildPlane(axis, axes, this.groupFor(GIZMO_TRANSLATE_YZ + axis, axis, lit));
|
|
379
|
+
}
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
if (this.mode === 'rotate') {
|
|
384
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
385
|
+
this.buildRing(axis, axes, this.groupFor(GIZMO_ROTATE_X + axis, axis, lit));
|
|
386
|
+
}
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
391
|
+
this.buildArm(axis, axes, this.groupFor(GIZMO_SCALE_X + axis, axis, lit), false);
|
|
392
|
+
}
|
|
393
|
+
this.buildOctahedron(
|
|
394
|
+
this.position[0] as number,
|
|
395
|
+
this.position[1] as number,
|
|
396
|
+
this.position[2] as number,
|
|
397
|
+
this.size * CENTRE_RADIUS,
|
|
398
|
+
axes,
|
|
399
|
+
lit === GIZMO_SCALE_UNIFORM ? GIZMO_GROUP_ACTIVE : GIZMO_GROUP_NEUTRAL,
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/** A handle's own colour group, unless it is the one lit. */
|
|
404
|
+
private groupFor(handle: number, axis: number, lit: number): number {
|
|
405
|
+
return handle === lit ? GIZMO_GROUP_ACTIVE : axis;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* The basis the handles point along.
|
|
410
|
+
*
|
|
411
|
+
* **Scale is always local whatever `space` says.** A non-uniform scale along a world
|
|
412
|
+
* axis is not representable in a translation-rotation-scale transform, so a gizmo
|
|
413
|
+
* offering it would shear the object and call it scaling.
|
|
414
|
+
*/
|
|
415
|
+
private refreshAxes(into: readonly Float32Array[]): void {
|
|
416
|
+
const local = this.space === 'local' || this.mode === 'scale';
|
|
417
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
418
|
+
const source = BASIS[axis] as Vec3;
|
|
419
|
+
const target = into[axis] as Float32Array;
|
|
420
|
+
if (local) vec3.transformQuat(target, source, this.rotation);
|
|
421
|
+
else target.set(source);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Where a ray meets an arm's cylinder, or `-1`.
|
|
427
|
+
*
|
|
428
|
+
* The region is a cylinder without caps: a closest point past either end of the segment
|
|
429
|
+
* is a miss rather than being clamped to the cap. It costs a sliver of pickable area at
|
|
430
|
+
* the two ends of a handle a user aims at the middle of, and it keeps this to one
|
|
431
|
+
* intersection.
|
|
432
|
+
*/
|
|
433
|
+
private pickArm(
|
|
434
|
+
origin: ArrayLike<number>,
|
|
435
|
+
direction: ArrayLike<number>,
|
|
436
|
+
axis: number,
|
|
437
|
+
axes: readonly Float32Array[],
|
|
438
|
+
): number {
|
|
439
|
+
const ray = this.closest;
|
|
440
|
+
if (!rayClosestOnLine(origin, direction, this.position, axes[axis] as Float32Array, ray)) {
|
|
441
|
+
return -1;
|
|
442
|
+
}
|
|
443
|
+
const along = ray[1] as number;
|
|
444
|
+
if (along < this.size * ARM_START || along > this.size * ARM_END) return -1;
|
|
445
|
+
if ((ray[2] as number) > this.size * ARM_PICK_RADIUS) return -1;
|
|
446
|
+
const distance = ray[0] as number;
|
|
447
|
+
return distance >= 0 ? distance : -1;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Where a ray meets a plane handle's quad, or `-1`.
|
|
452
|
+
*
|
|
453
|
+
* The quad sits in the positive quadrant of its two axes and stays there. Following the
|
|
454
|
+
* camera into whichever quadrant faces it is what a mature editor does and it is a
|
|
455
|
+
* second thing to get right; a fixed quadrant is honest and is visible from where it is.
|
|
456
|
+
*/
|
|
457
|
+
private pickPlane(
|
|
458
|
+
origin: ArrayLike<number>,
|
|
459
|
+
direction: ArrayLike<number>,
|
|
460
|
+
normalAxis: number,
|
|
461
|
+
axes: readonly Float32Array[],
|
|
462
|
+
): number {
|
|
463
|
+
const normal = axes[normalAxis] as Float32Array;
|
|
464
|
+
const distance = rayPlane(origin, direction, this.position, normal);
|
|
465
|
+
if (distance < 0) return -1;
|
|
466
|
+
|
|
467
|
+
this.offsetAt(origin, direction, distance);
|
|
468
|
+
const first = (normalAxis + 1) % 3;
|
|
469
|
+
const second = (normalAxis + 2) % 3;
|
|
470
|
+
const a = this.along(first, axes);
|
|
471
|
+
const b = this.along(second, axes);
|
|
472
|
+
const inner = this.size * PLANE_INNER;
|
|
473
|
+
const outer = this.size * PLANE_OUTER;
|
|
474
|
+
if (a < inner || a > outer || b < inner || b > outer) return -1;
|
|
475
|
+
return distance;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/** Where a ray meets a rotation ring's annulus, or `-1`. */
|
|
479
|
+
private pickRing(
|
|
480
|
+
origin: ArrayLike<number>,
|
|
481
|
+
direction: ArrayLike<number>,
|
|
482
|
+
axis: number,
|
|
483
|
+
axes: readonly Float32Array[],
|
|
484
|
+
): number {
|
|
485
|
+
const normal = axes[axis] as Float32Array;
|
|
486
|
+
const distance = rayPlane(origin, direction, this.position, normal);
|
|
487
|
+
if (distance < 0) return -1;
|
|
488
|
+
|
|
489
|
+
this.offsetAt(origin, direction, distance);
|
|
490
|
+
const radius = Math.hypot(
|
|
491
|
+
this.offset[0] as number,
|
|
492
|
+
this.offset[1] as number,
|
|
493
|
+
this.offset[2] as number,
|
|
494
|
+
);
|
|
495
|
+
if (Math.abs(radius - this.size * RING_RADIUS) > this.size * RING_PICK_HALF_WIDTH) return -1;
|
|
496
|
+
return distance;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/** Capture whatever the handle being grabbed needs. `false` refuses the drag. */
|
|
500
|
+
private anchor(handle: number, origin: ArrayLike<number>, direction: ArrayLike<number>): boolean {
|
|
501
|
+
if (handle >= GIZMO_TRANSLATE_X && handle <= GIZMO_TRANSLATE_Z) {
|
|
502
|
+
return this.anchorArm(origin, direction, handle - GIZMO_TRANSLATE_X);
|
|
503
|
+
}
|
|
504
|
+
if (handle >= GIZMO_TRANSLATE_YZ && handle <= GIZMO_TRANSLATE_XY) {
|
|
505
|
+
return this.anchorPlane(origin, direction, handle - GIZMO_TRANSLATE_YZ);
|
|
506
|
+
}
|
|
507
|
+
if (handle >= GIZMO_ROTATE_X && handle <= GIZMO_ROTATE_Z) {
|
|
508
|
+
return this.anchorRing(origin, direction, handle - GIZMO_ROTATE_X);
|
|
509
|
+
}
|
|
510
|
+
if (handle >= GIZMO_SCALE_X && handle <= GIZMO_SCALE_Z) {
|
|
511
|
+
return this.anchorArm(origin, direction, handle - GIZMO_SCALE_X);
|
|
512
|
+
}
|
|
513
|
+
return this.anchorUniform(origin, direction);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
private anchorArm(
|
|
517
|
+
origin: ArrayLike<number>,
|
|
518
|
+
direction: ArrayLike<number>,
|
|
519
|
+
axis: number,
|
|
520
|
+
): boolean {
|
|
521
|
+
const ray = this.closest;
|
|
522
|
+
const line = this.dragAxes[axis] as Float32Array;
|
|
523
|
+
if (!rayClosestOnLine(origin, direction, this.grabPosition, line, ray)) return false;
|
|
524
|
+
this.grabParam = ray[1] as number;
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
private anchorPlane(
|
|
529
|
+
origin: ArrayLike<number>,
|
|
530
|
+
direction: ArrayLike<number>,
|
|
531
|
+
normalAxis: number,
|
|
532
|
+
): boolean {
|
|
533
|
+
const normal = this.dragAxes[normalAxis] as Float32Array;
|
|
534
|
+
const distance = rayPlane(origin, direction, this.grabPosition, normal);
|
|
535
|
+
if (distance < 0) return false;
|
|
536
|
+
this.grabPoint[0] = (origin[0] as number) + (direction[0] as number) * distance;
|
|
537
|
+
this.grabPoint[1] = (origin[1] as number) + (direction[1] as number) * distance;
|
|
538
|
+
this.grabPoint[2] = (origin[2] as number) + (direction[2] as number) * distance;
|
|
539
|
+
return true;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
private anchorRing(
|
|
543
|
+
origin: ArrayLike<number>,
|
|
544
|
+
direction: ArrayLike<number>,
|
|
545
|
+
axis: number,
|
|
546
|
+
): boolean {
|
|
547
|
+
const angle = this.ringAngle(origin, direction, axis);
|
|
548
|
+
if (angle === null) return false;
|
|
549
|
+
this.previousAngle = angle;
|
|
550
|
+
return true;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
private anchorUniform(origin: ArrayLike<number>, direction: ArrayLike<number>): boolean {
|
|
554
|
+
/* The view plane at the moment of grabbing: the pointer's own direction is its normal,
|
|
555
|
+
* which is the view direction at that point and asks nothing of a camera. */
|
|
556
|
+
this.grabViewNormal[0] = direction[0] as number;
|
|
557
|
+
this.grabViewNormal[1] = direction[1] as number;
|
|
558
|
+
this.grabViewNormal[2] = direction[2] as number;
|
|
559
|
+
const distance = rayPlane(origin, direction, this.grabPosition, this.grabViewNormal);
|
|
560
|
+
if (distance < 0) return false;
|
|
561
|
+
this.offsetAt(origin, direction, distance);
|
|
562
|
+
this.grabRadius = Math.hypot(
|
|
563
|
+
this.offset[0] as number,
|
|
564
|
+
this.offset[1] as number,
|
|
565
|
+
this.offset[2] as number,
|
|
566
|
+
);
|
|
567
|
+
return true;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/** Translate along an arm, or scale along it. One intersection answers both. */
|
|
571
|
+
private dragAlongArm(
|
|
572
|
+
origin: ArrayLike<number>,
|
|
573
|
+
direction: ArrayLike<number>,
|
|
574
|
+
axis: number,
|
|
575
|
+
translate: boolean,
|
|
576
|
+
): boolean {
|
|
577
|
+
const ray = this.closest;
|
|
578
|
+
const line = this.dragAxes[axis] as Float32Array;
|
|
579
|
+
if (!rayClosestOnLine(origin, direction, this.grabPosition, line, ray)) return false;
|
|
580
|
+
const moved = (ray[1] as number) - this.grabParam;
|
|
581
|
+
|
|
582
|
+
if (translate) {
|
|
583
|
+
for (let component = 0; component < 3; component++) {
|
|
584
|
+
this.position[component] =
|
|
585
|
+
(this.grabPosition[component] as number) + (line[component] as number) * moved;
|
|
586
|
+
}
|
|
587
|
+
return true;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
this.scale[axis] = Math.max(
|
|
591
|
+
(this.grabScale[axis] as number) * (1 + moved / this.size),
|
|
592
|
+
MIN_SCALE,
|
|
593
|
+
);
|
|
594
|
+
return true;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
private dragInPlane(
|
|
598
|
+
origin: ArrayLike<number>,
|
|
599
|
+
direction: ArrayLike<number>,
|
|
600
|
+
normalAxis: number,
|
|
601
|
+
): boolean {
|
|
602
|
+
const normal = this.dragAxes[normalAxis] as Float32Array;
|
|
603
|
+
const distance = rayPlane(origin, direction, this.grabPosition, normal);
|
|
604
|
+
if (distance < 0) return false;
|
|
605
|
+
for (let component = 0; component < 3; component++) {
|
|
606
|
+
const hit = (origin[component] as number) + (direction[component] as number) * distance;
|
|
607
|
+
this.position[component] =
|
|
608
|
+
(this.grabPosition[component] as number) + (hit - (this.grabPoint[component] as number));
|
|
609
|
+
}
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Turn about a ring.
|
|
615
|
+
*
|
|
616
|
+
* **`atan2` answers in `(−π, π]`, so a drag crossing the seam reads as a jump of nearly
|
|
617
|
+
* a full turn.** Each update is unwrapped against the previous angle and the total
|
|
618
|
+
* accumulates, which is what makes a three-quarter turn a three-quarter turn instead of
|
|
619
|
+
* a quarter the other way — in the number. See `dragAngle` for why the orientation
|
|
620
|
+
* cannot show the difference, and why the unwrap is still not dead code.
|
|
621
|
+
*/
|
|
622
|
+
private dragRing(origin: ArrayLike<number>, direction: ArrayLike<number>, axis: number): boolean {
|
|
623
|
+
const angle = this.ringAngle(origin, direction, axis);
|
|
624
|
+
if (angle === null) return false;
|
|
625
|
+
|
|
626
|
+
let delta = angle - this.previousAngle;
|
|
627
|
+
if (delta > Math.PI) delta -= TWO_PI;
|
|
628
|
+
else if (delta < -Math.PI) delta += TWO_PI;
|
|
629
|
+
this.previousAngle = angle;
|
|
630
|
+
this.accumulated += delta;
|
|
631
|
+
|
|
632
|
+
quat.setAxisAngle(this.turn, this.dragAxes[axis] as Float32Array, this.accumulated);
|
|
633
|
+
quat.multiply(this.rotation, this.turn, this.grabRotation);
|
|
634
|
+
return true;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
private dragUniform(origin: ArrayLike<number>, direction: ArrayLike<number>): boolean {
|
|
638
|
+
const distance = rayPlane(origin, direction, this.grabPosition, this.grabViewNormal);
|
|
639
|
+
if (distance < 0) return false;
|
|
640
|
+
this.offsetAt(origin, direction, distance);
|
|
641
|
+
const radius = Math.hypot(
|
|
642
|
+
this.offset[0] as number,
|
|
643
|
+
this.offset[1] as number,
|
|
644
|
+
this.offset[2] as number,
|
|
645
|
+
);
|
|
646
|
+
const factor = 1 + (radius - this.grabRadius) / this.size;
|
|
647
|
+
for (let component = 0; component < 3; component++) {
|
|
648
|
+
this.scale[component] = Math.max((this.grabScale[component] as number) * factor, MIN_SCALE);
|
|
649
|
+
}
|
|
650
|
+
return true;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/**
|
|
654
|
+
* The angle a ray makes in a ring's plane, or `null` when there is none to speak of.
|
|
655
|
+
*
|
|
656
|
+
* Near the centre the hit is a point whose angle is dominated by whatever the last
|
|
657
|
+
* floating-point bit did, so a drag there would spin. Refusing keeps what the drag had.
|
|
658
|
+
*/
|
|
659
|
+
private ringAngle(
|
|
660
|
+
origin: ArrayLike<number>,
|
|
661
|
+
direction: ArrayLike<number>,
|
|
662
|
+
axis: number,
|
|
663
|
+
): number | null {
|
|
664
|
+
const normal = this.dragAxes[axis] as Float32Array;
|
|
665
|
+
const distance = rayPlane(origin, direction, this.grabPosition, normal);
|
|
666
|
+
if (distance < 0) return null;
|
|
667
|
+
|
|
668
|
+
for (let component = 0; component < 3; component++) {
|
|
669
|
+
this.offset[component] =
|
|
670
|
+
(origin[component] as number) +
|
|
671
|
+
(direction[component] as number) * distance -
|
|
672
|
+
(this.grabPosition[component] as number);
|
|
673
|
+
}
|
|
674
|
+
const radius = Math.hypot(
|
|
675
|
+
this.offset[0] as number,
|
|
676
|
+
this.offset[1] as number,
|
|
677
|
+
this.offset[2] as number,
|
|
678
|
+
);
|
|
679
|
+
if (radius < this.size * RING_MIN_GRAB) return null;
|
|
680
|
+
|
|
681
|
+
const first = (axis + 1) % 3;
|
|
682
|
+
const second = (axis + 2) % 3;
|
|
683
|
+
return Math.atan2(this.along(second, this.dragAxes), this.along(first, this.dragAxes));
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/** `offset` becomes the vector from the gizmo to the ray's point at `distance`. */
|
|
687
|
+
private offsetAt(
|
|
688
|
+
origin: ArrayLike<number>,
|
|
689
|
+
direction: ArrayLike<number>,
|
|
690
|
+
distance: number,
|
|
691
|
+
): void {
|
|
692
|
+
for (let component = 0; component < 3; component++) {
|
|
693
|
+
this.offset[component] =
|
|
694
|
+
(origin[component] as number) +
|
|
695
|
+
(direction[component] as number) * distance -
|
|
696
|
+
(this.position[component] as number);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/** How far `offset` reaches along one of the axes. */
|
|
701
|
+
private along(axis: number, axes: readonly Float32Array[]): number {
|
|
702
|
+
const vector = axes[axis] as Float32Array;
|
|
703
|
+
return (
|
|
704
|
+
(this.offset[0] as number) * (vector[0] as number) +
|
|
705
|
+
(this.offset[1] as number) * (vector[1] as number) +
|
|
706
|
+
(this.offset[2] as number) * (vector[2] as number)
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
private emit(
|
|
711
|
+
group: number,
|
|
712
|
+
ax: number,
|
|
713
|
+
ay: number,
|
|
714
|
+
az: number,
|
|
715
|
+
bx: number,
|
|
716
|
+
by: number,
|
|
717
|
+
bz: number,
|
|
718
|
+
): void {
|
|
719
|
+
const target = this.groups[group];
|
|
720
|
+
if (target === undefined) return;
|
|
721
|
+
const at = target.count;
|
|
722
|
+
/* Discarded rather than thrown, for the reason `DebugLines.dropped` exists. */
|
|
723
|
+
if (at >= target.capacity) return;
|
|
724
|
+
target.from[at * 3] = ax;
|
|
725
|
+
target.from[at * 3 + 1] = ay;
|
|
726
|
+
target.from[at * 3 + 2] = az;
|
|
727
|
+
target.to[at * 3] = bx;
|
|
728
|
+
target.to[at * 3 + 1] = by;
|
|
729
|
+
target.to[at * 3 + 2] = bz;
|
|
730
|
+
target.count = at + 1;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/** `point` becomes the gizmo origin plus a combination of the three axes. */
|
|
734
|
+
private at(
|
|
735
|
+
axes: readonly Float32Array[],
|
|
736
|
+
a: number,
|
|
737
|
+
u: number,
|
|
738
|
+
b: number,
|
|
739
|
+
v: number,
|
|
740
|
+
c: number,
|
|
741
|
+
w: number,
|
|
742
|
+
): void {
|
|
743
|
+
const first = axes[a] as Float32Array;
|
|
744
|
+
const second = axes[b] as Float32Array;
|
|
745
|
+
const third = axes[c] as Float32Array;
|
|
746
|
+
for (let component = 0; component < 3; component++) {
|
|
747
|
+
this.point[component] =
|
|
748
|
+
(this.position[component] as number) +
|
|
749
|
+
(first[component] as number) * u +
|
|
750
|
+
(second[component] as number) * v +
|
|
751
|
+
(third[component] as number) * w;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
private buildArm(
|
|
756
|
+
axis: number,
|
|
757
|
+
axes: readonly Float32Array[],
|
|
758
|
+
group: number,
|
|
759
|
+
arrow: boolean,
|
|
760
|
+
): void {
|
|
761
|
+
const first = (axis + 1) % 3;
|
|
762
|
+
const second = (axis + 2) % 3;
|
|
763
|
+
const tip = this.size * ARM_END;
|
|
764
|
+
const base = arrow ? tip - this.size * HEAD_LENGTH : tip - this.size * TIP_RADIUS;
|
|
765
|
+
|
|
766
|
+
this.at(axes, axis, this.size * ARM_START, first, 0, second, 0);
|
|
767
|
+
const sx = this.point[0] as number,
|
|
768
|
+
sy = this.point[1] as number,
|
|
769
|
+
sz = this.point[2] as number;
|
|
770
|
+
this.at(axes, axis, base, first, 0, second, 0);
|
|
771
|
+
this.emit(
|
|
772
|
+
group,
|
|
773
|
+
sx,
|
|
774
|
+
sy,
|
|
775
|
+
sz,
|
|
776
|
+
this.point[0] as number,
|
|
777
|
+
this.point[1] as number,
|
|
778
|
+
this.point[2] as number,
|
|
779
|
+
);
|
|
780
|
+
|
|
781
|
+
if (!arrow) {
|
|
782
|
+
this.at(axes, axis, tip, first, 0, second, 0);
|
|
783
|
+
this.buildOctahedron(
|
|
784
|
+
this.point[0] as number,
|
|
785
|
+
this.point[1] as number,
|
|
786
|
+
this.point[2] as number,
|
|
787
|
+
this.size * TIP_RADIUS,
|
|
788
|
+
axes,
|
|
789
|
+
group,
|
|
790
|
+
);
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/* A four-spoke cone: the tip to four points around the base, and the base square. */
|
|
795
|
+
this.at(axes, axis, tip, first, 0, second, 0);
|
|
796
|
+
const tx = this.point[0] as number,
|
|
797
|
+
ty = this.point[1] as number,
|
|
798
|
+
tz = this.point[2] as number;
|
|
799
|
+
const radius = this.size * HEAD_RADIUS;
|
|
800
|
+
let px = 0,
|
|
801
|
+
py = 0,
|
|
802
|
+
pz = 0;
|
|
803
|
+
for (let corner = 0; corner < 4; corner++) {
|
|
804
|
+
const angle = (corner / 4) * TWO_PI;
|
|
805
|
+
this.at(axes, axis, base, first, Math.cos(angle) * radius, second, Math.sin(angle) * radius);
|
|
806
|
+
const cx = this.point[0] as number,
|
|
807
|
+
cy = this.point[1] as number,
|
|
808
|
+
cz = this.point[2] as number;
|
|
809
|
+
this.emit(group, tx, ty, tz, cx, cy, cz);
|
|
810
|
+
if (corner > 0) this.emit(group, px, py, pz, cx, cy, cz);
|
|
811
|
+
if (corner === 3) {
|
|
812
|
+
this.at(axes, axis, base, first, radius, second, 0);
|
|
813
|
+
this.emit(
|
|
814
|
+
group,
|
|
815
|
+
cx,
|
|
816
|
+
cy,
|
|
817
|
+
cz,
|
|
818
|
+
this.point[0] as number,
|
|
819
|
+
this.point[1] as number,
|
|
820
|
+
this.point[2] as number,
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
px = cx;
|
|
824
|
+
py = cy;
|
|
825
|
+
pz = cz;
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
private buildPlane(normalAxis: number, axes: readonly Float32Array[], group: number): void {
|
|
830
|
+
const first = (normalAxis + 1) % 3;
|
|
831
|
+
const second = (normalAxis + 2) % 3;
|
|
832
|
+
const inner = this.size * PLANE_INNER;
|
|
833
|
+
const outer = this.size * PLANE_OUTER;
|
|
834
|
+
let px = 0,
|
|
835
|
+
py = 0,
|
|
836
|
+
pz = 0;
|
|
837
|
+
let fx = 0,
|
|
838
|
+
fy = 0,
|
|
839
|
+
fz = 0;
|
|
840
|
+
for (let corner = 0; corner < 4; corner++) {
|
|
841
|
+
const u = corner === 1 || corner === 2 ? outer : inner;
|
|
842
|
+
const v = corner >= 2 ? outer : inner;
|
|
843
|
+
this.at(axes, first, u, second, v, normalAxis, 0);
|
|
844
|
+
const cx = this.point[0] as number,
|
|
845
|
+
cy = this.point[1] as number,
|
|
846
|
+
cz = this.point[2] as number;
|
|
847
|
+
if (corner === 0) {
|
|
848
|
+
fx = cx;
|
|
849
|
+
fy = cy;
|
|
850
|
+
fz = cz;
|
|
851
|
+
} else {
|
|
852
|
+
this.emit(group, px, py, pz, cx, cy, cz);
|
|
853
|
+
}
|
|
854
|
+
if (corner === 3) this.emit(group, cx, cy, cz, fx, fy, fz);
|
|
855
|
+
px = cx;
|
|
856
|
+
py = cy;
|
|
857
|
+
pz = cz;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
private buildRing(axis: number, axes: readonly Float32Array[], group: number): void {
|
|
862
|
+
const first = (axis + 1) % 3;
|
|
863
|
+
const second = (axis + 2) % 3;
|
|
864
|
+
const radius = this.size * RING_RADIUS;
|
|
865
|
+
let px = 0,
|
|
866
|
+
py = 0,
|
|
867
|
+
pz = 0;
|
|
868
|
+
for (let step = 0; step <= this.ringSegments; step++) {
|
|
869
|
+
const angle = (step / this.ringSegments) * TWO_PI;
|
|
870
|
+
this.at(axes, first, Math.cos(angle) * radius, second, Math.sin(angle) * radius, axis, 0);
|
|
871
|
+
const cx = this.point[0] as number,
|
|
872
|
+
cy = this.point[1] as number,
|
|
873
|
+
cz = this.point[2] as number;
|
|
874
|
+
if (step > 0) this.emit(group, px, py, pz, cx, cy, cz);
|
|
875
|
+
px = cx;
|
|
876
|
+
py = cy;
|
|
877
|
+
pz = cz;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/**
|
|
882
|
+
* Six vertices on the axes and the twelve edges between them.
|
|
883
|
+
*
|
|
884
|
+
* Drawn as an octahedron and picked as a sphere of the same radius, so the region that
|
|
885
|
+
* responds is slightly larger than the shape — which errs toward being easy to grab.
|
|
886
|
+
*/
|
|
887
|
+
private buildOctahedron(
|
|
888
|
+
cx: number,
|
|
889
|
+
cy: number,
|
|
890
|
+
cz: number,
|
|
891
|
+
radius: number,
|
|
892
|
+
axes: readonly Float32Array[],
|
|
893
|
+
group: number,
|
|
894
|
+
): void {
|
|
895
|
+
const vertices = this.corners;
|
|
896
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
897
|
+
const vector = axes[axis] as Float32Array;
|
|
898
|
+
for (let component = 0; component < 3; component++) {
|
|
899
|
+
const offset = (vector[component] as number) * radius;
|
|
900
|
+
const centre = component === 0 ? cx : component === 1 ? cy : cz;
|
|
901
|
+
vertices[axis * 6 + component] = centre + offset;
|
|
902
|
+
vertices[axis * 6 + 3 + component] = centre - offset;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
/* Every +/- vertex of one axis joins every +/- vertex of the next: four edges a pair. */
|
|
906
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
907
|
+
const next = (axis + 1) % 3;
|
|
908
|
+
for (let a = 0; a < 2; a++) {
|
|
909
|
+
for (let b = 0; b < 2; b++) {
|
|
910
|
+
this.emit(
|
|
911
|
+
group,
|
|
912
|
+
vertices[axis * 6 + a * 3] as number,
|
|
913
|
+
vertices[axis * 6 + a * 3 + 1] as number,
|
|
914
|
+
vertices[axis * 6 + a * 3 + 2] as number,
|
|
915
|
+
vertices[next * 6 + b * 3] as number,
|
|
916
|
+
vertices[next * 6 + b * 3 + 1] as number,
|
|
917
|
+
vertices[next * 6 + b * 3 + 2] as number,
|
|
918
|
+
);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
}
|