@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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcendentals that give the same bits on every JavaScript engine.
|
|
3
|
+
*
|
|
4
|
+
* **Not more accurate than `Math`, and that is not what they are for.** These are within a couple
|
|
5
|
+
* of units in the last place of correctly rounded, which is about what a platform `sin` gives you.
|
|
6
|
+
* What they are is *reproducible*: ECMAScript declines to specify `sin`, `cos`, `exp`, `acos` and
|
|
7
|
+
* eighteen more, so two engines may differ by an ulp, and an ulp is enough to make two peers running
|
|
8
|
+
* the same simulation disagree — first invisibly, then completely.
|
|
9
|
+
*
|
|
10
|
+
* `scripts/determinism.mjs` is the gate that refuses the unspecified ones inside the simulation set
|
|
11
|
+
* and names the twenty-two. Its header carries the other half of the argument: `+ - * /` are IEEE
|
|
12
|
+
* 754 operations by specification, JavaScript permits no fused-multiply-add contraction, and
|
|
13
|
+
* `Math.sqrt` is required correctly rounded and is *not* on that list. **So everything below uses
|
|
14
|
+
* only those five operations**, which is the whole design: reproducibility by construction rather
|
|
15
|
+
* than by hoping two engines chose the same algorithm.
|
|
16
|
+
*
|
|
17
|
+
* ---
|
|
18
|
+
*
|
|
19
|
+
* ## What is here, and what is deliberately not
|
|
20
|
+
*
|
|
21
|
+
* `exactSin`, `exactCos`, `exactExp`, `exactAcos`. Four, because four is what the engine and its
|
|
22
|
+
* first consumer actually reach for: the terrain binding's slope angle needs `acos`, a lockstep
|
|
23
|
+
* fixture rotating anything needs `sin` and `cos`, and exponential decay needs `exp`.
|
|
24
|
+
*
|
|
25
|
+
* **`atan2` is absent.** It is the obvious fifth and nothing here needs one: `shape.ts` sorts by a
|
|
26
|
+
* comparison key computed from two in-plane axes rather than by an angle, and `joints.ts` compares
|
|
27
|
+
* a quaternion component against a half-angle's sine. *Reversed by* a site that genuinely needs a
|
|
28
|
+
* signed angle from two components, at which point it arrives with its own golden vectors.
|
|
29
|
+
*
|
|
30
|
+
* ## Nothing in core imports these
|
|
31
|
+
*
|
|
32
|
+
* Deliberately. `core-only` is the one size figure in this repository that every consumer pays, and
|
|
33
|
+
* a module reachable from `createRenderer` is in it whether anybody calls it or not. These are
|
|
34
|
+
* reached by the script bindings and by consumers who ask for them, so tree-shaking keeps them out
|
|
35
|
+
* of a bundle that does not, which is measured rather than assumed.
|
|
36
|
+
*
|
|
37
|
+
* ## The coefficients
|
|
38
|
+
*
|
|
39
|
+
* The polynomial and rational coefficients are fdlibm's, which is the ancestor of most platform
|
|
40
|
+
* libms and is public domain. They are written as literals: **a literal is the same number on
|
|
41
|
+
* every engine, which is the only property being bought.** Their provenance matters less than their
|
|
42
|
+
* fixity — a coefficient somebody re-derived to one more digit is a different function, and
|
|
43
|
+
* `exact.test.ts`'s golden bit patterns are what would catch that.
|
|
44
|
+
*/
|
|
45
|
+
/*
|
|
46
|
+
* π/2 in four pieces, most significant first, so a large multiple of it can be removed without
|
|
47
|
+
* losing the small remainder in the subtraction.
|
|
48
|
+
*
|
|
49
|
+
* **Two pieces are not enough and the measurement says so**: at an angle of 740 radians a two-part
|
|
50
|
+
* reduction leaves `sin` and `cos` 18.5 ulps out, because `k * PIO2_1` needs more than 53 bits once
|
|
51
|
+
* `k` grows. Three brings it under two ulps for the cost of two multiplies.
|
|
52
|
+
*
|
|
53
|
+
* **`PIO2_TAIL` and `PIO2_TAIL_LO` are one number in two halves, not two successive corrections.**
|
|
54
|
+
* fdlibm carries a fourth constant, `pio2_1t`, which is the tail for its *single*-iteration path;
|
|
55
|
+
* `pio2_2` is the same tail rounded differently, with `pio2_2t` as its own tail, and the two paths
|
|
56
|
+
* are alternatives. Refining the first with the second is not more accurate, it is wrong: it
|
|
57
|
+
* subtracts the tail twice and took `sin` to 2.2e11 ulps out, which is how this comment came to be
|
|
58
|
+
* here.
|
|
59
|
+
*/
|
|
60
|
+
const PIO2_1 = 1.5707963267341256;
|
|
61
|
+
const PIO2_TAIL = 6.077100506303966e-11;
|
|
62
|
+
const PIO2_TAIL_LO = 2.0222662487959506e-21;
|
|
63
|
+
const TWO_OVER_PI = 0.6366197723675814;
|
|
64
|
+
const HALF_PI = 1.5707963267948966;
|
|
65
|
+
const PI = 3.141592653589793;
|
|
66
|
+
/* fdlibm's `__kernel_sin` coefficients. */
|
|
67
|
+
const S1 = -1.6666666666666632e-1;
|
|
68
|
+
const S2 = 8.3333333333224894e-3;
|
|
69
|
+
const S3 = -1.984126982985795e-4;
|
|
70
|
+
const S4 = 2.7557313707070068e-6;
|
|
71
|
+
const S5 = -2.5050760253406863e-8;
|
|
72
|
+
const S6 = 1.5896909952115501e-10;
|
|
73
|
+
/* fdlibm's `__kernel_cos` coefficients. */
|
|
74
|
+
const C1 = 4.1666666666666602e-2;
|
|
75
|
+
const C2 = -1.3888888888874109e-3;
|
|
76
|
+
const C3 = 2.480158728947673e-5;
|
|
77
|
+
const C4 = -2.7557314351390663e-7;
|
|
78
|
+
const C5 = 2.0875723212981748e-9;
|
|
79
|
+
const C6 = -1.1359647557788195e-11;
|
|
80
|
+
/* fdlibm's `asin` rational, numerator then denominator. */
|
|
81
|
+
const P0 = 1.6666666666666666e-1;
|
|
82
|
+
const P1 = -3.2556581862240092e-1;
|
|
83
|
+
const P2 = 2.0121253213486293e-1;
|
|
84
|
+
const P3 = -4.0055534500679411e-2;
|
|
85
|
+
const P4 = 7.9153499428981453e-4;
|
|
86
|
+
const P5 = 3.4793310759602117e-5;
|
|
87
|
+
const Q1 = -2.4033949117344142;
|
|
88
|
+
const Q2 = 2.0209457602335057;
|
|
89
|
+
const Q3 = -6.8828397160545329e-1;
|
|
90
|
+
const Q4 = 7.7038150555901935e-2;
|
|
91
|
+
/** ln 2, split for the same reason π/2 is. */
|
|
92
|
+
const LN2_HI = 0.6931471803691238;
|
|
93
|
+
const LN2_LO = 1.9082149292705877e-10;
|
|
94
|
+
const ONE_OVER_LN2 = 1.4426950408889634;
|
|
95
|
+
/** 2^(2^i), for i = 0 to 9. Every one is exact, so a product of them is exact. */
|
|
96
|
+
const POW2 = [
|
|
97
|
+
2, 4, 16, 256, 65536, 4294967296, 1.8446744073709552e19, 3.402823669209385e38,
|
|
98
|
+
1.157920892373162e77, 1.3407807929942597e154,
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* Two to an integer power, by binary decomposition of the exponent.
|
|
102
|
+
*
|
|
103
|
+
* Multiplication by a power of two is exact in IEEE 754, so this is exact wherever it does not
|
|
104
|
+
* overflow — which is what makes it a legitimate substitute for the `Math.pow` a range reduction
|
|
105
|
+
* would otherwise reach for.
|
|
106
|
+
*
|
|
107
|
+
* A large negative exponent lands on zero instead of a subnormal, because the reciprocal is taken
|
|
108
|
+
* after the product overflows. That is `exp` underflowing to zero, which is where it was going.
|
|
109
|
+
*/
|
|
110
|
+
function pow2(exponent) {
|
|
111
|
+
let remaining = exponent < 0 ? -exponent : exponent;
|
|
112
|
+
let result = 1;
|
|
113
|
+
let index = 0;
|
|
114
|
+
while (remaining > 0 && index < POW2.length) {
|
|
115
|
+
if ((remaining & 1) === 1)
|
|
116
|
+
result *= POW2[index];
|
|
117
|
+
remaining >>= 1;
|
|
118
|
+
index += 1;
|
|
119
|
+
}
|
|
120
|
+
return exponent < 0 ? 1 / result : result;
|
|
121
|
+
}
|
|
122
|
+
/** sin on [-π/4, π/4]. */
|
|
123
|
+
function sinKernel(x) {
|
|
124
|
+
const z = x * x;
|
|
125
|
+
const poly = S1 + z * (S2 + z * (S3 + z * (S4 + z * (S5 + z * S6))));
|
|
126
|
+
return x + x * z * poly;
|
|
127
|
+
}
|
|
128
|
+
/** cos on [-π/4, π/4]. */
|
|
129
|
+
function cosKernel(x) {
|
|
130
|
+
const z = x * x;
|
|
131
|
+
const poly = C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6))));
|
|
132
|
+
return 1 - 0.5 * z + z * z * poly;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fold an angle into [-π/4, π/4] and say which quadrant it came from.
|
|
136
|
+
*
|
|
137
|
+
* Cody-Waite: the multiple of π/2 is removed in pieces, so the subtraction that produces a small
|
|
138
|
+
* remainder from two large numbers does not lose the bits it is supposed to keep. One-piece
|
|
139
|
+
* reduction is accurate to about 1e-8 at an angle of a thousand radians, which for a simulation
|
|
140
|
+
* that accumulates rotation is the difference between an object facing forward and facing sideways
|
|
141
|
+
* after a few minutes.
|
|
142
|
+
*/
|
|
143
|
+
function reduce(x) {
|
|
144
|
+
const k = Math.round(x * TWO_OVER_PI);
|
|
145
|
+
/* The leading piece, whose product with `k` is exact for every `k` a simulation reaches. */
|
|
146
|
+
const head = x - k * PIO2_1;
|
|
147
|
+
/*
|
|
148
|
+
* The tail, in two halves. `head - tail` loses the bits below its own last place, and
|
|
149
|
+
* `PIO2_TAIL_LO - (head - r - tail)` is exactly those bits recovered — the same
|
|
150
|
+
* subtract-and-recover fdlibm uses on its two-iteration path.
|
|
151
|
+
*/
|
|
152
|
+
const tail = k * PIO2_TAIL;
|
|
153
|
+
let r = head - tail;
|
|
154
|
+
const lost = k * PIO2_TAIL_LO - (head - r - tail);
|
|
155
|
+
r = r - lost;
|
|
156
|
+
return { r, quadrant: ((k % 4) + 4) % 4 };
|
|
157
|
+
}
|
|
158
|
+
/** `Math.sin`, reproducibly. NaN in, NaN out; an infinity answers NaN, as `Math.sin` does. */
|
|
159
|
+
export function exactSin(x) {
|
|
160
|
+
if (!Number.isFinite(x))
|
|
161
|
+
return Number.NaN;
|
|
162
|
+
const { r, quadrant } = reduce(x);
|
|
163
|
+
switch (quadrant) {
|
|
164
|
+
case 0:
|
|
165
|
+
return sinKernel(r);
|
|
166
|
+
case 1:
|
|
167
|
+
return cosKernel(r);
|
|
168
|
+
case 2:
|
|
169
|
+
return -sinKernel(r);
|
|
170
|
+
default:
|
|
171
|
+
return -cosKernel(r);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** `Math.cos`, reproducibly. */
|
|
175
|
+
export function exactCos(x) {
|
|
176
|
+
if (!Number.isFinite(x))
|
|
177
|
+
return Number.NaN;
|
|
178
|
+
const { r, quadrant } = reduce(x);
|
|
179
|
+
switch (quadrant) {
|
|
180
|
+
case 0:
|
|
181
|
+
return cosKernel(r);
|
|
182
|
+
case 1:
|
|
183
|
+
return -sinKernel(r);
|
|
184
|
+
case 2:
|
|
185
|
+
return -cosKernel(r);
|
|
186
|
+
default:
|
|
187
|
+
return sinKernel(r);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* `Math.exp`, reproducibly.
|
|
192
|
+
*
|
|
193
|
+
* Reduce by a multiple of ln 2 into [-ln2/2, ln2/2], sum the Taylor series there, and scale by a
|
|
194
|
+
* power of two. **A degree-14 series and not a shorter minimax**, because on that interval the
|
|
195
|
+
* fifteenth term is about 4e-20 — below the precision of a double — so the series is exact to the
|
|
196
|
+
* representation and there is nothing a fitted polynomial would buy.
|
|
197
|
+
*/
|
|
198
|
+
export function exactExp(x) {
|
|
199
|
+
if (Number.isNaN(x))
|
|
200
|
+
return Number.NaN;
|
|
201
|
+
if (x === Number.POSITIVE_INFINITY)
|
|
202
|
+
return Number.POSITIVE_INFINITY;
|
|
203
|
+
if (x === Number.NEGATIVE_INFINITY)
|
|
204
|
+
return 0;
|
|
205
|
+
if (x > 709.782712893384)
|
|
206
|
+
return Number.POSITIVE_INFINITY;
|
|
207
|
+
if (x < -745.1332191019411)
|
|
208
|
+
return 0;
|
|
209
|
+
const k = Math.round(x * ONE_OVER_LN2);
|
|
210
|
+
const r = x - k * LN2_HI - k * LN2_LO;
|
|
211
|
+
/* Horner over 1/n!, highest term first. */
|
|
212
|
+
let sum = 1 / 87178291200; // 1/14!
|
|
213
|
+
sum = 1 / 6227020800 + r * sum; // 1/13!
|
|
214
|
+
sum = 1 / 479001600 + r * sum; // 1/12!
|
|
215
|
+
sum = 1 / 39916800 + r * sum; // 1/11!
|
|
216
|
+
sum = 1 / 3628800 + r * sum; // 1/10!
|
|
217
|
+
sum = 1 / 362880 + r * sum; // 1/9!
|
|
218
|
+
sum = 1 / 40320 + r * sum; // 1/8!
|
|
219
|
+
sum = 1 / 5040 + r * sum; // 1/7!
|
|
220
|
+
sum = 1 / 720 + r * sum; // 1/6!
|
|
221
|
+
sum = 1 / 120 + r * sum; // 1/5!
|
|
222
|
+
sum = 1 / 24 + r * sum; // 1/4!
|
|
223
|
+
sum = 1 / 6 + r * sum; // 1/3!
|
|
224
|
+
sum = 0.5 + r * sum;
|
|
225
|
+
sum = 1 + r * sum;
|
|
226
|
+
sum = 1 + r * sum;
|
|
227
|
+
return sum * pow2(k);
|
|
228
|
+
}
|
|
229
|
+
/** fdlibm's `asin` rational on `z = x²`, valid where `z` is small. */
|
|
230
|
+
function asinRational(z) {
|
|
231
|
+
const numerator = z * (P0 + z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5)))));
|
|
232
|
+
const denominator = 1 + z * (Q1 + z * (Q2 + z * (Q3 + z * Q4)));
|
|
233
|
+
return numerator / denominator;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* `Math.acos`, reproducibly. Outside [-1, 1] this answers NaN, as `Math.acos` does.
|
|
237
|
+
*
|
|
238
|
+
* Three branches rather than one, and the split at ±0.5 is the reason it is accurate near the ends:
|
|
239
|
+
* `acos` has infinite derivative at ±1, so a polynomial in `x` loses its footing there. Substituting
|
|
240
|
+
* `s = sqrt((1 ∓ x)/2)` moves the awkward point to zero, where a polynomial is comfortable — which
|
|
241
|
+
* is also why `sqrt` being exactly rounded matters here rather than being a convenience.
|
|
242
|
+
*/
|
|
243
|
+
export function exactAcos(x) {
|
|
244
|
+
if (Number.isNaN(x) || x > 1 || x < -1)
|
|
245
|
+
return Number.NaN;
|
|
246
|
+
if (x === 1)
|
|
247
|
+
return 0;
|
|
248
|
+
if (x === -1)
|
|
249
|
+
return PI;
|
|
250
|
+
if (x >= 0.5) {
|
|
251
|
+
const z = (1 - x) / 2;
|
|
252
|
+
const s = Math.sqrt(z);
|
|
253
|
+
return 2 * (s + s * asinRational(z));
|
|
254
|
+
}
|
|
255
|
+
if (x <= -0.5) {
|
|
256
|
+
const z = (1 + x) / 2;
|
|
257
|
+
const s = Math.sqrt(z);
|
|
258
|
+
return PI - 2 * (s + s * asinRational(z));
|
|
259
|
+
}
|
|
260
|
+
const z = x * x;
|
|
261
|
+
return HALF_PI - (x + x * asinRational(z));
|
|
262
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ReadonlyMat4 } from 'gl-matrix';
|
|
2
|
+
/**
|
|
3
|
+
* The six planes bounding what a camera can see, and whether a sphere is among them.
|
|
4
|
+
*
|
|
5
|
+
* **A `Float32Array(24)` rather than six objects**, for the reason every hot path in this engine
|
|
6
|
+
* gives: a visibility test runs per draw per frame, and an array of plane objects is six
|
|
7
|
+
* dereferences a test and an allocation per rebuild.
|
|
8
|
+
*
|
|
9
|
+
* Planes are stored as `(nx, ny, nz, d)` with the normal pointing *inwards*, so a point is inside
|
|
10
|
+
* the frustum when `n · p + d >= 0` for all six.
|
|
11
|
+
*/
|
|
12
|
+
export type Frustum = Float32Array;
|
|
13
|
+
export declare function createFrustum(): Frustum;
|
|
14
|
+
/**
|
|
15
|
+
* Pull the six planes out of a view-projection matrix.
|
|
16
|
+
*
|
|
17
|
+
* **This is Gribb and Hartmann, and it is worth naming because it looks like a trick.** A
|
|
18
|
+
* view-projection takes a world point to clip space, where being inside the frustum is
|
|
19
|
+
* `-w <= x <= w` and the same for y and z. Writing `x >= -w` as `x + w >= 0` and substituting the
|
|
20
|
+
* matrix rows gives a plane equation in world coordinates directly — so the left plane is row 4
|
|
21
|
+
* plus row 1, the right is row 4 minus row 1, and so on. No inversion, no corner extraction.
|
|
22
|
+
*
|
|
23
|
+
* **Normalising is not tidiness.** Straight out of the matrix a plane's normal has an arbitrary
|
|
24
|
+
* length, so `n · p + d` is a distance in some unscaled clip unit. Dividing through by the
|
|
25
|
+
* normal's length makes it a distance in world units, which is the only form a radius in metres
|
|
26
|
+
* can be compared against. Skipping it produces a test that is *nearly* right, and wrong by a
|
|
27
|
+
* factor that changes with the field of view.
|
|
28
|
+
*
|
|
29
|
+
* gl-matrix stores column-major, so `m[column * 4 + row]`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function frustumFromViewProjection(m: ReadonlyMat4, out: Frustum): Frustum;
|
|
32
|
+
/**
|
|
33
|
+
* Whether a world-space sphere is anywhere inside the frustum.
|
|
34
|
+
*
|
|
35
|
+
* **The question is "outside any one plane", not "inside every plane".** A sphere is rejected
|
|
36
|
+
* only when it lies entirely on the far side of a single plane; anything else is kept. Asking
|
|
37
|
+
* whether the *centre* is inside all six is the version that looks equivalent and is not — it
|
|
38
|
+
* throws away everything larger than the view, so a room the camera is standing in vanishes.
|
|
39
|
+
*
|
|
40
|
+
* Conservative at the corners: a sphere can be outside the frustum and still be within radius of
|
|
41
|
+
* all six planes, near an edge. That costs a draw that turns out to be invisible and never costs
|
|
42
|
+
* a draw that was visible, which is the only asymmetry a cull may have.
|
|
43
|
+
*/
|
|
44
|
+
export declare function sphereInFrustum(frustum: Frustum, x: number, y: number, z: number, radius: number): boolean;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Left, right, bottom, top, near, far — the order the extraction below produces. */
|
|
2
|
+
const PLANE_COUNT = 6;
|
|
3
|
+
export function createFrustum() {
|
|
4
|
+
return new Float32Array(PLANE_COUNT * 4);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Pull the six planes out of a view-projection matrix.
|
|
8
|
+
*
|
|
9
|
+
* **This is Gribb and Hartmann, and it is worth naming because it looks like a trick.** A
|
|
10
|
+
* view-projection takes a world point to clip space, where being inside the frustum is
|
|
11
|
+
* `-w <= x <= w` and the same for y and z. Writing `x >= -w` as `x + w >= 0` and substituting the
|
|
12
|
+
* matrix rows gives a plane equation in world coordinates directly — so the left plane is row 4
|
|
13
|
+
* plus row 1, the right is row 4 minus row 1, and so on. No inversion, no corner extraction.
|
|
14
|
+
*
|
|
15
|
+
* **Normalising is not tidiness.** Straight out of the matrix a plane's normal has an arbitrary
|
|
16
|
+
* length, so `n · p + d` is a distance in some unscaled clip unit. Dividing through by the
|
|
17
|
+
* normal's length makes it a distance in world units, which is the only form a radius in metres
|
|
18
|
+
* can be compared against. Skipping it produces a test that is *nearly* right, and wrong by a
|
|
19
|
+
* factor that changes with the field of view.
|
|
20
|
+
*
|
|
21
|
+
* gl-matrix stores column-major, so `m[column * 4 + row]`.
|
|
22
|
+
*/
|
|
23
|
+
export function frustumFromViewProjection(m, out) {
|
|
24
|
+
const m0 = m[0] ?? 0;
|
|
25
|
+
const m1 = m[1] ?? 0;
|
|
26
|
+
const m2 = m[2] ?? 0;
|
|
27
|
+
const m3 = m[3] ?? 0;
|
|
28
|
+
const m4 = m[4] ?? 0;
|
|
29
|
+
const m5 = m[5] ?? 0;
|
|
30
|
+
const m6 = m[6] ?? 0;
|
|
31
|
+
const m7 = m[7] ?? 0;
|
|
32
|
+
const m8 = m[8] ?? 0;
|
|
33
|
+
const m9 = m[9] ?? 0;
|
|
34
|
+
const m10 = m[10] ?? 0;
|
|
35
|
+
const m11 = m[11] ?? 0;
|
|
36
|
+
const m12 = m[12] ?? 0;
|
|
37
|
+
const m13 = m[13] ?? 0;
|
|
38
|
+
const m14 = m[14] ?? 0;
|
|
39
|
+
const m15 = m[15] ?? 0;
|
|
40
|
+
/* Row 4 ± row 1, 2, 3. Row r of a column-major matrix is m[r], m[4+r], m[8+r], m[12+r]. */
|
|
41
|
+
setPlane(out, 0, m3 + m0, m7 + m4, m11 + m8, m15 + m12);
|
|
42
|
+
setPlane(out, 1, m3 - m0, m7 - m4, m11 - m8, m15 - m12);
|
|
43
|
+
setPlane(out, 2, m3 + m1, m7 + m5, m11 + m9, m15 + m13);
|
|
44
|
+
setPlane(out, 3, m3 - m1, m7 - m5, m11 - m9, m15 - m13);
|
|
45
|
+
/*
|
|
46
|
+
* **Near is `row4 + row3` and not `row3` alone**, which is the WebGL convention where clip z
|
|
47
|
+
* runs -w..w. WebGPU's runs 0..w and its near plane really is row 3 — but every matrix in this
|
|
48
|
+
* engine is built by gl-matrix's `perspective`, which is the OpenGL convention, and the
|
|
49
|
+
* WebGPU backend corrects it with `CLIP_CORRECTION` at the last moment before drawing. So the
|
|
50
|
+
* matrix reaching here is the OpenGL one on both backends, and one extraction serves both.
|
|
51
|
+
*/
|
|
52
|
+
setPlane(out, 4, m3 + m2, m7 + m6, m11 + m10, m15 + m14);
|
|
53
|
+
setPlane(out, 5, m3 - m2, m7 - m6, m11 - m10, m15 - m14);
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
function setPlane(out, index, x, y, z, d) {
|
|
57
|
+
const length = Math.sqrt(x * x + y * y + z * z);
|
|
58
|
+
/* A degenerate matrix gives a zero-length normal; leaving it unscaled is better than NaN,
|
|
59
|
+
and the plane then accepts everything, which is the safe direction for a cull to fail. */
|
|
60
|
+
const scale = length > 1e-12 ? 1 / length : 0;
|
|
61
|
+
const at = index * 4;
|
|
62
|
+
out[at] = x * scale;
|
|
63
|
+
out[at + 1] = y * scale;
|
|
64
|
+
out[at + 2] = z * scale;
|
|
65
|
+
out[at + 3] = d * scale;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Whether a world-space sphere is anywhere inside the frustum.
|
|
69
|
+
*
|
|
70
|
+
* **The question is "outside any one plane", not "inside every plane".** A sphere is rejected
|
|
71
|
+
* only when it lies entirely on the far side of a single plane; anything else is kept. Asking
|
|
72
|
+
* whether the *centre* is inside all six is the version that looks equivalent and is not — it
|
|
73
|
+
* throws away everything larger than the view, so a room the camera is standing in vanishes.
|
|
74
|
+
*
|
|
75
|
+
* Conservative at the corners: a sphere can be outside the frustum and still be within radius of
|
|
76
|
+
* all six planes, near an edge. That costs a draw that turns out to be invisible and never costs
|
|
77
|
+
* a draw that was visible, which is the only asymmetry a cull may have.
|
|
78
|
+
*/
|
|
79
|
+
export function sphereInFrustum(frustum, x, y, z, radius) {
|
|
80
|
+
for (let plane = 0; plane < PLANE_COUNT; plane += 1) {
|
|
81
|
+
const at = plane * 4;
|
|
82
|
+
const distance = (frustum[at] ?? 0) * x +
|
|
83
|
+
(frustum[at + 1] ?? 0) * y +
|
|
84
|
+
(frustum[at + 2] ?? 0) * z +
|
|
85
|
+
(frustum[at + 3] ?? 0);
|
|
86
|
+
if (distance < -radius)
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ray against shapes, for picking. Pure arithmetic, no allocation, no renderer.
|
|
3
|
+
*
|
|
4
|
+
* Separate from `src/render/` because none of it touches a context and all of it is
|
|
5
|
+
* testable without one — the same split `textLayout.ts` makes for the same reason.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The slab method: clip the ray against three pairs of parallel planes and keep the
|
|
9
|
+
* overlap.
|
|
10
|
+
*
|
|
11
|
+
* **The divide by a zero direction component is deliberate.** A ray parallel to an axis
|
|
12
|
+
* gives ±Infinity for that slab, and the min/max below then either keep the interval
|
|
13
|
+
* whole (the origin is between the planes) or collapse it (it is not), which is the right
|
|
14
|
+
* answer both times. Special-casing zero to avoid the divide is how this gets broken.
|
|
15
|
+
*
|
|
16
|
+
* Returns the near distance, `0` when the origin is inside, `-1` on a miss. Distance
|
|
17
|
+
* rather than a boolean because a pick has to choose the nearest of several hits.
|
|
18
|
+
*/
|
|
19
|
+
export declare function rayAabb(origin: ArrayLike<number>, direction: ArrayLike<number>, min: ArrayLike<number>, max: ArrayLike<number>): number;
|
|
20
|
+
/**
|
|
21
|
+
* Möller–Trumbore, indexed and two-sided.
|
|
22
|
+
*
|
|
23
|
+
* Takes vertex *indices* into a flat position array rather than three points, so a caller
|
|
24
|
+
* walking an index buffer allocates nothing per triangle — which is the whole reason
|
|
25
|
+
* picking can afford a narrow phase at pointer-move rates.
|
|
26
|
+
*
|
|
27
|
+
* **Two-sided deliberately.** Culling back faces would make a pick miss a surface the
|
|
28
|
+
* camera has got behind, and what that looks like to somebody using it is a click passing
|
|
29
|
+
* through the object to whatever is beyond it.
|
|
30
|
+
*/
|
|
31
|
+
export declare function rayTriangle(origin: ArrayLike<number>, direction: ArrayLike<number>, positions: ArrayLike<number>, a: number, b: number, c: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* Where a ray meets an infinite plane, or `-1`.
|
|
34
|
+
*
|
|
35
|
+
* The plane is a point and a normal rather than four coefficients, because every caller
|
|
36
|
+
* here has a point — a gizmo's origin, a target's position — and would otherwise compute
|
|
37
|
+
* `d` to have it undone one line later.
|
|
38
|
+
*
|
|
39
|
+
* **A ray within `1e-6` of parallel is a miss and not a hit at infinity.** The alternative
|
|
40
|
+
* returns a number that is finite, enormous and wrong, and what a caller does with it is
|
|
41
|
+
* teleport whatever it was dragging. Callers that grab against a plane depend on this
|
|
42
|
+
* refusal; see `gizmo.ts`.
|
|
43
|
+
*
|
|
44
|
+
* The normal does not have to be unit length, but `direction` and `normal` must be in the
|
|
45
|
+
* same space, and a plane behind the ray reports `-1` the way every other miss does.
|
|
46
|
+
*/
|
|
47
|
+
export declare function rayPlane(origin: ArrayLike<number>, direction: ArrayLike<number>, point: ArrayLike<number>, normal: ArrayLike<number>): number;
|
|
48
|
+
/**
|
|
49
|
+
* The closest approach between a ray and an infinite line, written into `out`.
|
|
50
|
+
*
|
|
51
|
+
* `out` receives three numbers: the ray's parameter, the line's parameter, and the
|
|
52
|
+
* distance between the two closest points. Three outputs is why this takes a buffer where
|
|
53
|
+
* everything else in this file returns a number — a caller picking a gizmo handle needs
|
|
54
|
+
* all three at once, and needs them without allocating on every pointer move.
|
|
55
|
+
*
|
|
56
|
+
* Returns `false` for two lines within `1e-6` of parallel, and **writes nothing in that
|
|
57
|
+
* case**. There is no closest pair to report: every point on one line is equidistant from
|
|
58
|
+
* the other, so any answer would be arbitrary, and a caller dragging along the line has to
|
|
59
|
+
* keep what it had rather than jump to whichever point the arithmetic happened to land on.
|
|
60
|
+
*
|
|
61
|
+
* `direction` and `axis` must both be unit length. That is what makes the returned
|
|
62
|
+
* parameters distances rather than multiples of two different vectors' lengths.
|
|
63
|
+
*/
|
|
64
|
+
export declare function rayClosestOnLine(origin: ArrayLike<number>, direction: ArrayLike<number>, point: ArrayLike<number>, axis: ArrayLike<number>, out: Float32Array): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* The nearest positive distance along a ray to a sphere's surface, or `-1`.
|
|
67
|
+
*
|
|
68
|
+
* **An origin inside the sphere reports the far root rather than a miss**, which is the
|
|
69
|
+
* same choice `rayAabb` makes for the same reason: a camera that has got inside something
|
|
70
|
+
* pickable is still looking at it, and reporting a miss makes the object impossible to
|
|
71
|
+
* click from close up.
|
|
72
|
+
*
|
|
73
|
+
* `direction` must be unit length, which is what lets the quadratic drop its leading
|
|
74
|
+
* coefficient.
|
|
75
|
+
*/
|
|
76
|
+
export declare function raySphere(origin: ArrayLike<number>, direction: ArrayLike<number>, centre: ArrayLike<number>, radius: number): number;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ray against shapes, for picking. Pure arithmetic, no allocation, no renderer.
|
|
3
|
+
*
|
|
4
|
+
* Separate from `src/render/` because none of it touches a context and all of it is
|
|
5
|
+
* testable without one — the same split `textLayout.ts` makes for the same reason.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The slab method: clip the ray against three pairs of parallel planes and keep the
|
|
9
|
+
* overlap.
|
|
10
|
+
*
|
|
11
|
+
* **The divide by a zero direction component is deliberate.** A ray parallel to an axis
|
|
12
|
+
* gives ±Infinity for that slab, and the min/max below then either keep the interval
|
|
13
|
+
* whole (the origin is between the planes) or collapse it (it is not), which is the right
|
|
14
|
+
* answer both times. Special-casing zero to avoid the divide is how this gets broken.
|
|
15
|
+
*
|
|
16
|
+
* Returns the near distance, `0` when the origin is inside, `-1` on a miss. Distance
|
|
17
|
+
* rather than a boolean because a pick has to choose the nearest of several hits.
|
|
18
|
+
*/
|
|
19
|
+
export function rayAabb(origin, direction, min, max) {
|
|
20
|
+
let near = -Infinity;
|
|
21
|
+
let far = Infinity;
|
|
22
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
23
|
+
const inverse = 1 / direction[axis];
|
|
24
|
+
let t0 = (min[axis] - origin[axis]) * inverse;
|
|
25
|
+
let t1 = (max[axis] - origin[axis]) * inverse;
|
|
26
|
+
if (t0 > t1) {
|
|
27
|
+
const swap = t0;
|
|
28
|
+
t0 = t1;
|
|
29
|
+
t1 = swap;
|
|
30
|
+
}
|
|
31
|
+
if (t0 > near)
|
|
32
|
+
near = t0;
|
|
33
|
+
if (t1 < far)
|
|
34
|
+
far = t1;
|
|
35
|
+
if (near > far)
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
38
|
+
if (far < 0)
|
|
39
|
+
return -1;
|
|
40
|
+
return near < 0 ? 0 : near;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Möller–Trumbore, indexed and two-sided.
|
|
44
|
+
*
|
|
45
|
+
* Takes vertex *indices* into a flat position array rather than three points, so a caller
|
|
46
|
+
* walking an index buffer allocates nothing per triangle — which is the whole reason
|
|
47
|
+
* picking can afford a narrow phase at pointer-move rates.
|
|
48
|
+
*
|
|
49
|
+
* **Two-sided deliberately.** Culling back faces would make a pick miss a surface the
|
|
50
|
+
* camera has got behind, and what that looks like to somebody using it is a click passing
|
|
51
|
+
* through the object to whatever is beyond it.
|
|
52
|
+
*/
|
|
53
|
+
export function rayTriangle(origin, direction, positions, a, b, c) {
|
|
54
|
+
const ax = positions[a * 3];
|
|
55
|
+
const ay = positions[a * 3 + 1];
|
|
56
|
+
const az = positions[a * 3 + 2];
|
|
57
|
+
const e1x = positions[b * 3] - ax;
|
|
58
|
+
const e1y = positions[b * 3 + 1] - ay;
|
|
59
|
+
const e1z = positions[b * 3 + 2] - az;
|
|
60
|
+
const e2x = positions[c * 3] - ax;
|
|
61
|
+
const e2y = positions[c * 3 + 1] - ay;
|
|
62
|
+
const e2z = positions[c * 3 + 2] - az;
|
|
63
|
+
const px = direction[1] * e2z - direction[2] * e2y;
|
|
64
|
+
const py = direction[2] * e2x - direction[0] * e2z;
|
|
65
|
+
const pz = direction[0] * e2y - direction[1] * e2x;
|
|
66
|
+
const determinant = e1x * px + e1y * py + e1z * pz;
|
|
67
|
+
/* Near zero is a ray in the triangle's own plane: no single crossing to report. */
|
|
68
|
+
if (determinant > -1e-9 && determinant < 1e-9)
|
|
69
|
+
return -1;
|
|
70
|
+
const inverse = 1 / determinant;
|
|
71
|
+
const tx = origin[0] - ax;
|
|
72
|
+
const ty = origin[1] - ay;
|
|
73
|
+
const tz = origin[2] - az;
|
|
74
|
+
const u = (tx * px + ty * py + tz * pz) * inverse;
|
|
75
|
+
if (u < 0 || u > 1)
|
|
76
|
+
return -1;
|
|
77
|
+
const qx = ty * e1z - tz * e1y;
|
|
78
|
+
const qy = tz * e1x - tx * e1z;
|
|
79
|
+
const qz = tx * e1y - ty * e1x;
|
|
80
|
+
const v = (direction[0] * qx +
|
|
81
|
+
direction[1] * qy +
|
|
82
|
+
direction[2] * qz) *
|
|
83
|
+
inverse;
|
|
84
|
+
if (v < 0 || u + v > 1)
|
|
85
|
+
return -1;
|
|
86
|
+
const distance = (e2x * qx + e2y * qy + e2z * qz) * inverse;
|
|
87
|
+
return distance > 1e-6 ? distance : -1;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Where a ray meets an infinite plane, or `-1`.
|
|
91
|
+
*
|
|
92
|
+
* The plane is a point and a normal rather than four coefficients, because every caller
|
|
93
|
+
* here has a point — a gizmo's origin, a target's position — and would otherwise compute
|
|
94
|
+
* `d` to have it undone one line later.
|
|
95
|
+
*
|
|
96
|
+
* **A ray within `1e-6` of parallel is a miss and not a hit at infinity.** The alternative
|
|
97
|
+
* returns a number that is finite, enormous and wrong, and what a caller does with it is
|
|
98
|
+
* teleport whatever it was dragging. Callers that grab against a plane depend on this
|
|
99
|
+
* refusal; see `gizmo.ts`.
|
|
100
|
+
*
|
|
101
|
+
* The normal does not have to be unit length, but `direction` and `normal` must be in the
|
|
102
|
+
* same space, and a plane behind the ray reports `-1` the way every other miss does.
|
|
103
|
+
*/
|
|
104
|
+
export function rayPlane(origin, direction, point, normal) {
|
|
105
|
+
const denominator = direction[0] * normal[0] +
|
|
106
|
+
direction[1] * normal[1] +
|
|
107
|
+
direction[2] * normal[2];
|
|
108
|
+
if (denominator > -1e-6 && denominator < 1e-6)
|
|
109
|
+
return -1;
|
|
110
|
+
const numerator = (point[0] - origin[0]) * normal[0] +
|
|
111
|
+
(point[1] - origin[1]) * normal[1] +
|
|
112
|
+
(point[2] - origin[2]) * normal[2];
|
|
113
|
+
const distance = numerator / denominator;
|
|
114
|
+
return distance >= 0 ? distance : -1;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The closest approach between a ray and an infinite line, written into `out`.
|
|
118
|
+
*
|
|
119
|
+
* `out` receives three numbers: the ray's parameter, the line's parameter, and the
|
|
120
|
+
* distance between the two closest points. Three outputs is why this takes a buffer where
|
|
121
|
+
* everything else in this file returns a number — a caller picking a gizmo handle needs
|
|
122
|
+
* all three at once, and needs them without allocating on every pointer move.
|
|
123
|
+
*
|
|
124
|
+
* Returns `false` for two lines within `1e-6` of parallel, and **writes nothing in that
|
|
125
|
+
* case**. There is no closest pair to report: every point on one line is equidistant from
|
|
126
|
+
* the other, so any answer would be arbitrary, and a caller dragging along the line has to
|
|
127
|
+
* keep what it had rather than jump to whichever point the arithmetic happened to land on.
|
|
128
|
+
*
|
|
129
|
+
* `direction` and `axis` must both be unit length. That is what makes the returned
|
|
130
|
+
* parameters distances rather than multiples of two different vectors' lengths.
|
|
131
|
+
*/
|
|
132
|
+
export function rayClosestOnLine(origin, direction, point, axis, out) {
|
|
133
|
+
const dx = direction[0];
|
|
134
|
+
const dy = direction[1];
|
|
135
|
+
const dz = direction[2];
|
|
136
|
+
const ax = axis[0];
|
|
137
|
+
const ay = axis[1];
|
|
138
|
+
const az = axis[2];
|
|
139
|
+
const dotDA = dx * ax + dy * ay + dz * az;
|
|
140
|
+
/* Both are unit, so this is 1 - cos²: the squared sine of the angle between them. */
|
|
141
|
+
const denominator = 1 - dotDA * dotDA;
|
|
142
|
+
if (denominator < 1e-6)
|
|
143
|
+
return false;
|
|
144
|
+
const wx = origin[0] - point[0];
|
|
145
|
+
const wy = origin[1] - point[1];
|
|
146
|
+
const wz = origin[2] - point[2];
|
|
147
|
+
const dotDW = dx * wx + dy * wy + dz * wz;
|
|
148
|
+
const dotAW = ax * wx + ay * wy + az * wz;
|
|
149
|
+
const rayT = (dotDA * dotAW - dotDW) / denominator;
|
|
150
|
+
const lineS = (dotAW - dotDA * dotDW) / denominator;
|
|
151
|
+
const px = wx + dx * rayT - ax * lineS;
|
|
152
|
+
const py = wy + dy * rayT - ay * lineS;
|
|
153
|
+
const pz = wz + dz * rayT - az * lineS;
|
|
154
|
+
out[0] = rayT;
|
|
155
|
+
out[1] = lineS;
|
|
156
|
+
out[2] = Math.sqrt(px * px + py * py + pz * pz);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The nearest positive distance along a ray to a sphere's surface, or `-1`.
|
|
161
|
+
*
|
|
162
|
+
* **An origin inside the sphere reports the far root rather than a miss**, which is the
|
|
163
|
+
* same choice `rayAabb` makes for the same reason: a camera that has got inside something
|
|
164
|
+
* pickable is still looking at it, and reporting a miss makes the object impossible to
|
|
165
|
+
* click from close up.
|
|
166
|
+
*
|
|
167
|
+
* `direction` must be unit length, which is what lets the quadratic drop its leading
|
|
168
|
+
* coefficient.
|
|
169
|
+
*/
|
|
170
|
+
export function raySphere(origin, direction, centre, radius) {
|
|
171
|
+
const ox = origin[0] - centre[0];
|
|
172
|
+
const oy = origin[1] - centre[1];
|
|
173
|
+
const oz = origin[2] - centre[2];
|
|
174
|
+
const b = ox * direction[0] + oy * direction[1] + oz * direction[2];
|
|
175
|
+
const c = ox * ox + oy * oy + oz * oz - radius * radius;
|
|
176
|
+
const discriminant = b * b - c;
|
|
177
|
+
if (discriminant < 0)
|
|
178
|
+
return -1;
|
|
179
|
+
const root = Math.sqrt(discriminant);
|
|
180
|
+
const near = -b - root;
|
|
181
|
+
if (near >= 0)
|
|
182
|
+
return near;
|
|
183
|
+
const far = -b + root;
|
|
184
|
+
return far >= 0 ? far : -1;
|
|
185
|
+
}
|