@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,130 @@
|
|
|
1
|
+
import type { FrameView } from './frameView.ts';
|
|
2
|
+
import type { Vec3 } from '../math/color.ts';
|
|
3
|
+
import { compileProgram, uniformLocations } from './shader.ts';
|
|
4
|
+
import { WIND_STREAK_FRAG, WIND_STREAK_VERT } from './shaders/windStreaks.ts';
|
|
5
|
+
import {
|
|
6
|
+
WIND_STREAK_DEFAULTS,
|
|
7
|
+
buildWindStreakLattice,
|
|
8
|
+
createResolvedWindStreaks,
|
|
9
|
+
resolveWindStreaks,
|
|
10
|
+
windStreakStrength,
|
|
11
|
+
type WindStreakSettings,
|
|
12
|
+
} from './windStreakDraw.ts';
|
|
13
|
+
import type { WindField } from './windField.ts';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Makes the wind visible once it is strong enough to be worth seeing.
|
|
17
|
+
*
|
|
18
|
+
* The threshold matters as much as the effect. Debris in a light breeze is
|
|
19
|
+
* visual noise across the whole game; debris only when it is genuinely blowing
|
|
20
|
+
* is information — it tells the player why their glide is drifting, at the one
|
|
21
|
+
* moment they need to know.
|
|
22
|
+
*
|
|
23
|
+
* **The thresholds, the drift rate and the lattice are in `windStreakDraw.ts`**, so the WebGPU
|
|
24
|
+
* pass shows the same weather rather than its own approximation of it.
|
|
25
|
+
*/
|
|
26
|
+
export type WindStreakOptions = WindStreakSettings;
|
|
27
|
+
|
|
28
|
+
export class WindStreakRenderer {
|
|
29
|
+
private readonly program: WebGLProgram;
|
|
30
|
+
private readonly uniforms: Record<string, WebGLUniformLocation>;
|
|
31
|
+
private readonly vao: WebGLVertexArrayObject;
|
|
32
|
+
private readonly buffers: WebGLBuffer[] = [];
|
|
33
|
+
private readonly vertexCount: number;
|
|
34
|
+
private readonly count: number;
|
|
35
|
+
/** Exposed so callers can size their own budgets against it. */
|
|
36
|
+
private readonly cellSize: number;
|
|
37
|
+
private readonly onsetSpeed: number;
|
|
38
|
+
private readonly fullSpeed: number;
|
|
39
|
+
|
|
40
|
+
constructor(gl: WebGL2RenderingContext, options: WindStreakOptions = {}) {
|
|
41
|
+
this.count = options.count ?? WIND_STREAK_DEFAULTS.count;
|
|
42
|
+
this.cellSize = options.cellSize ?? WIND_STREAK_DEFAULTS.cellSize;
|
|
43
|
+
this.onsetSpeed = options.onsetSpeed ?? WIND_STREAK_DEFAULTS.onsetSpeed;
|
|
44
|
+
this.fullSpeed = options.fullSpeed ?? WIND_STREAK_DEFAULTS.fullSpeed;
|
|
45
|
+
|
|
46
|
+
this.program = compileProgram(gl, WIND_STREAK_VERT, WIND_STREAK_FRAG, 'windStreaks');
|
|
47
|
+
this.uniforms = uniformLocations(gl, this.program, 'windStreakRenderer');
|
|
48
|
+
|
|
49
|
+
const lattice = buildWindStreakLattice(this.count);
|
|
50
|
+
const { corners, indices } = lattice;
|
|
51
|
+
this.vertexCount = lattice.vertexCount;
|
|
52
|
+
|
|
53
|
+
const vao = gl.createVertexArray();
|
|
54
|
+
if (vao === null) throw new Error('WindStreakRenderer: createVertexArray failed');
|
|
55
|
+
this.vao = vao;
|
|
56
|
+
gl.bindVertexArray(vao);
|
|
57
|
+
const attach = (data: Float32Array, location: number, size: number): void => {
|
|
58
|
+
const buffer = gl.createBuffer();
|
|
59
|
+
if (buffer === null) throw new Error('WindStreakRenderer: createBuffer failed');
|
|
60
|
+
this.buffers.push(buffer);
|
|
61
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
62
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
63
|
+
gl.enableVertexAttribArray(location);
|
|
64
|
+
gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
|
|
65
|
+
};
|
|
66
|
+
attach(corners, 0, 2);
|
|
67
|
+
attach(indices, 1, 1);
|
|
68
|
+
gl.bindVertexArray(null);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** How visible the wind is right now, 0 when there is nothing to show. */
|
|
72
|
+
strengthFor(speed: number): number {
|
|
73
|
+
return windStreakStrength(speed, this.onsetSpeed, this.fullSpeed);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Refilled per call rather than allocated; this is a per-frame path. */
|
|
77
|
+
private readonly resolved = createResolvedWindStreaks();
|
|
78
|
+
|
|
79
|
+
draw(
|
|
80
|
+
gl: WebGL2RenderingContext,
|
|
81
|
+
camera: FrameView,
|
|
82
|
+
wind: WindField,
|
|
83
|
+
timeSeconds: number,
|
|
84
|
+
tint: Vec3,
|
|
85
|
+
/** True when the camera is below the waterline. */
|
|
86
|
+
submerged = false,
|
|
87
|
+
): void {
|
|
88
|
+
/* Chosen in `windStreakDraw.ts` so both backends show the same weather. */
|
|
89
|
+
const settled = resolveWindStreaks(
|
|
90
|
+
wind.speed,
|
|
91
|
+
wind.driftX,
|
|
92
|
+
wind.driftZ,
|
|
93
|
+
this.onsetSpeed,
|
|
94
|
+
this.fullSpeed,
|
|
95
|
+
submerged,
|
|
96
|
+
this.resolved,
|
|
97
|
+
);
|
|
98
|
+
if (!settled.visible) return;
|
|
99
|
+
|
|
100
|
+
const u = this.uniforms;
|
|
101
|
+
gl.useProgram(this.program);
|
|
102
|
+
gl.uniformMatrix4fv(u['uViewProj'] ?? null, false, camera.viewProjection);
|
|
103
|
+
gl.uniform3fv(u['uCameraPos'] ?? null, camera.position);
|
|
104
|
+
gl.uniform2f(u['uWind'] ?? null, wind.velocityX, wind.velocityZ);
|
|
105
|
+
gl.uniform2f(u['uDrift'] ?? null, settled.driftX, settled.driftZ);
|
|
106
|
+
gl.uniform1f(u['uSpeed'] ?? null, wind.speed);
|
|
107
|
+
gl.uniform1f(u['uStrength'] ?? null, settled.strength);
|
|
108
|
+
gl.uniform1f(u['uCount'] ?? null, this.count);
|
|
109
|
+
gl.uniform1f(u['uCellSize'] ?? null, this.cellSize);
|
|
110
|
+
gl.uniform1f(u['uTime'] ?? null, timeSeconds);
|
|
111
|
+
gl.uniform3fv(u['uTint'] ?? null, tint);
|
|
112
|
+
|
|
113
|
+
gl.enable(gl.BLEND);
|
|
114
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
115
|
+
gl.depthMask(false);
|
|
116
|
+
gl.disable(gl.CULL_FACE);
|
|
117
|
+
gl.bindVertexArray(this.vao);
|
|
118
|
+
gl.drawArrays(gl.TRIANGLES, 0, this.vertexCount);
|
|
119
|
+
gl.bindVertexArray(null);
|
|
120
|
+
gl.enable(gl.CULL_FACE);
|
|
121
|
+
gl.depthMask(true);
|
|
122
|
+
gl.disable(gl.BLEND);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
dispose(gl: WebGL2RenderingContext): void {
|
|
126
|
+
for (const buffer of this.buffers) gl.deleteBuffer(buffer);
|
|
127
|
+
gl.deleteVertexArray(this.vao);
|
|
128
|
+
gl.deleteProgram(this.program);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { mat4, quat } from 'gl-matrix';
|
|
2
|
+
|
|
3
|
+
import { createBounds } from '../math/bounds.ts';
|
|
4
|
+
import type { Bounds } from '../math/bounds.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A transform with a parent, and the world matrix it derives.
|
|
8
|
+
*
|
|
9
|
+
* **Additive and never required.** Three consumers describe their worlds their own way and none of
|
|
10
|
+
* them has to adopt this; nothing in the renderer knows a node exists. What it offers is the one
|
|
11
|
+
* thing an immediate-mode API makes a caller repeat — composing a child's placement out of its
|
|
12
|
+
* parent's — done once, and done only for what moved.
|
|
13
|
+
*
|
|
14
|
+
* **It does not draw, and that is deliberate rather than unfinished.** The render graph work
|
|
15
|
+
* established that a caller's draw order carries meaning: alpha and depth make *after* different
|
|
16
|
+
* from *before*, and it is why a registered pass runs where a caller invokes it rather than at a
|
|
17
|
+
* phase the engine picks. A traversal that issued draws would take that back. `visitVisible`
|
|
18
|
+
* yields nodes; what to do with one is the caller's.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Bumped on every world recomputation, so a caller can tell whether anything happened. */
|
|
22
|
+
let revisions = 0;
|
|
23
|
+
|
|
24
|
+
export class SceneNode {
|
|
25
|
+
/** Local translation. Written in place; call `markMoved` if you write it directly. */
|
|
26
|
+
readonly position = new Float32Array([0, 0, 0]);
|
|
27
|
+
/**
|
|
28
|
+
* Local rotation, as a quaternion.
|
|
29
|
+
*
|
|
30
|
+
* **A quaternion and not the yaw this engine uses everywhere else.** Every rotation in the tree
|
|
31
|
+
* today is a yaw or a matrix, because nothing has needed to *interpolate* one — and a node is
|
|
32
|
+
* what animation will hold, where "rigid TRS, then skinning" is the first line of that track.
|
|
33
|
+
* Interpolating Euler angles gives gimbal artefacts and a path through orientations nobody
|
|
34
|
+
* authored, and carrying the right type from the start is cheaper than migrating every node a
|
|
35
|
+
* consumer has built.
|
|
36
|
+
*/
|
|
37
|
+
readonly rotation = new Float32Array([0, 0, 0, 1]);
|
|
38
|
+
readonly scale = new Float32Array([1, 1, 1]);
|
|
39
|
+
|
|
40
|
+
readonly localMatrix = new Float32Array(16);
|
|
41
|
+
readonly worldMatrix = new Float32Array(16);
|
|
42
|
+
|
|
43
|
+
parent: SceneNode | null = null;
|
|
44
|
+
readonly children: SceneNode[] = [];
|
|
45
|
+
|
|
46
|
+
/** What `worldMatrix` was last recomputed at. See `revisions`. */
|
|
47
|
+
worldRevision = 0;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* This node's own geometry, in its own space, or null for a node that only groups.
|
|
51
|
+
*
|
|
52
|
+
* Set from a mesh's `bounds`, which the renderer measures at upload — so a caller hands over
|
|
53
|
+
* what it already has rather than describing its geometry twice.
|
|
54
|
+
*/
|
|
55
|
+
private localBounds: Bounds | null = null;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* A sphere enclosing this node's geometry **and every descendant's**.
|
|
59
|
+
*
|
|
60
|
+
* **The union is what makes a traversal a partition rather than a loop.** A parent that can be
|
|
61
|
+
* tested once and answer for everything beneath it lets a frustum discard a subtree; a parent
|
|
62
|
+
* covering only its own geometry answers for nothing, and the walk has to visit every node to
|
|
63
|
+
* find out — which is the linear scan a hierarchy exists to replace.
|
|
64
|
+
*
|
|
65
|
+
* A node with no geometry and no children is a point at its own origin, which is the honest
|
|
66
|
+
* answer and is never inside a frustum by accident: a zero radius passes only where the point
|
|
67
|
+
* itself does.
|
|
68
|
+
*/
|
|
69
|
+
readonly worldBounds: Bounds = createBounds();
|
|
70
|
+
|
|
71
|
+
/** This node's own transform has changed and `localMatrix` is stale. */
|
|
72
|
+
private localDirty = true;
|
|
73
|
+
/** This node or something above it has moved, so `worldMatrix` is stale. */
|
|
74
|
+
private worldDirty = true;
|
|
75
|
+
/** What `worldBounds` was last unioned at, so a child moving alone is still noticed. */
|
|
76
|
+
private boundsRevision = -1;
|
|
77
|
+
|
|
78
|
+
constructor() {
|
|
79
|
+
mat4.identity(this.localMatrix);
|
|
80
|
+
mat4.identity(this.worldMatrix);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
setPosition(x: number, y: number, z: number): void {
|
|
84
|
+
this.position[0] = x;
|
|
85
|
+
this.position[1] = y;
|
|
86
|
+
this.position[2] = z;
|
|
87
|
+
this.markMoved();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
setScale(x: number, y: number, z: number): void {
|
|
91
|
+
this.scale[0] = x;
|
|
92
|
+
this.scale[1] = y;
|
|
93
|
+
this.scale[2] = z;
|
|
94
|
+
this.markMoved();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Say what geometry this node holds, in its own space.
|
|
99
|
+
*
|
|
100
|
+
* Held by reference rather than copied: a mesh's bounds do not change after upload, and a
|
|
101
|
+
* caller passing the same mesh to a thousand nodes should not pay for a thousand copies.
|
|
102
|
+
*/
|
|
103
|
+
setBounds(bounds: Bounds | null): void {
|
|
104
|
+
this.localBounds = bounds;
|
|
105
|
+
this.markMoved();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Whether this node has geometry of its own, as opposed to only grouping others. */
|
|
109
|
+
get hasGeometry(): boolean {
|
|
110
|
+
return this.localBounds !== null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Set the rotation from an axis and an angle in radians. The axis need not be normalised. */
|
|
114
|
+
setRotationAxisAngle(x: number, y: number, z: number, radians: number): void {
|
|
115
|
+
const length = Math.sqrt(x * x + y * y + z * z);
|
|
116
|
+
const scale = length > 1e-12 ? 1 / length : 0;
|
|
117
|
+
quat.setAxisAngle(this.rotation, [x * scale, y * scale, z * scale], radians);
|
|
118
|
+
this.markMoved();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Say that this node's transform was written directly.
|
|
123
|
+
*
|
|
124
|
+
* `position`, `rotation` and `scale` are handed out as arrays a caller can write in place,
|
|
125
|
+
* because copying three vectors per node per frame is the allocation-free path an animation
|
|
126
|
+
* system wants. The cost is that this class cannot see the write, so a caller doing it says so.
|
|
127
|
+
*/
|
|
128
|
+
markMoved(): void {
|
|
129
|
+
this.localDirty = true;
|
|
130
|
+
this.markSubtreeStale();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Put `child` under this node, taking it from wherever it was.
|
|
135
|
+
*
|
|
136
|
+
* **A cycle is refused here rather than discovered while walking**, because a walk that meets
|
|
137
|
+
* one does not throw: it recurses until the stack is gone, inside a frame loop, with the tab
|
|
138
|
+
* stopped and no useful trace. The check walks up from this node, which is the depth of the
|
|
139
|
+
* tree and not its size.
|
|
140
|
+
*/
|
|
141
|
+
attachChild(child: SceneNode): void {
|
|
142
|
+
if (child === this) throw new Error('SceneNode: a node cannot be its own child (cycle)');
|
|
143
|
+
for (let at: SceneNode | null = this; at !== null; at = at.parent) {
|
|
144
|
+
if (at === child) throw new Error('SceneNode: that would make a cycle');
|
|
145
|
+
}
|
|
146
|
+
if (child.parent === this) return;
|
|
147
|
+
child.parent?.detachChild(child);
|
|
148
|
+
child.parent = this;
|
|
149
|
+
this.children.push(child);
|
|
150
|
+
child.markSubtreeStale();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
detachChild(child: SceneNode): void {
|
|
154
|
+
const at = this.children.indexOf(child);
|
|
155
|
+
if (at < 0) return;
|
|
156
|
+
this.children.splice(at, 1);
|
|
157
|
+
child.parent = null;
|
|
158
|
+
child.markSubtreeStale();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Bring this node and everything under it up to date.
|
|
163
|
+
*
|
|
164
|
+
* **Only what moved.** A hierarchy that recomputes every world matrix every frame is slower
|
|
165
|
+
* than the callers it replaces, which already keep matrices they touch only when something
|
|
166
|
+
* moves. A clean subtree is skipped entirely, which is what makes the walk proportional to what
|
|
167
|
+
* changed rather than to the size of the world.
|
|
168
|
+
*
|
|
169
|
+
* **Its ancestors are brought up to date first, and that is a correctness fix rather than a
|
|
170
|
+
* courtesy.** Without it, updating a branch after moving something above it composes against a
|
|
171
|
+
* stale parent and puts the whole branch in the wrong place — silently, with no error and a
|
|
172
|
+
* plausible-looking matrix. Walking up costs the depth of the tree, not its size, and touches
|
|
173
|
+
* only this node's own ancestors: a sibling subtree is not recomputed for it.
|
|
174
|
+
*/
|
|
175
|
+
updateWorld(): void {
|
|
176
|
+
this.refreshAncestors();
|
|
177
|
+
this.recompute(this.parent?.worldMatrix ?? null, false);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** @internal Bring this node's ancestor chain up to date, root first. */
|
|
181
|
+
private refreshAncestors(): void {
|
|
182
|
+
const parent = this.parent;
|
|
183
|
+
if (parent === null) return;
|
|
184
|
+
parent.refreshAncestors();
|
|
185
|
+
parent.recomputeSelf(parent.parent?.worldMatrix ?? null);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @internal Recompute just this node's matrices, leaving its children alone.
|
|
190
|
+
*
|
|
191
|
+
* **`worldDirty` is left set on purpose.** This node's children have not been recomputed, and
|
|
192
|
+
* clearing it here would let a later `updateWorld` at the root decide the subtree is clean and
|
|
193
|
+
* skip them. `recompute` is what clears it, once the whole subtree really is current.
|
|
194
|
+
*/
|
|
195
|
+
private recomputeSelf(parentWorld: Float32Array | null): void {
|
|
196
|
+
if (this.worldDirty) this.composeWorld(parentWorld);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** @internal Recompute this subtree. `forced` is set when an ancestor recomputed. */
|
|
200
|
+
protected recompute(parentWorld: Float32Array | null, forced: boolean): void {
|
|
201
|
+
const changed = forced || this.worldDirty;
|
|
202
|
+
if (changed) {
|
|
203
|
+
this.composeWorld(parentWorld);
|
|
204
|
+
this.worldDirty = false;
|
|
205
|
+
}
|
|
206
|
+
for (const child of this.children) child.recompute(this.worldMatrix, changed);
|
|
207
|
+
if (changed || this.childBoundsMoved()) this.unionBounds();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* @internal Whether any child's world bounds are newer than this node's own union.
|
|
212
|
+
*
|
|
213
|
+
* A child that moved without this node moving still grows the parent, and the walk above has
|
|
214
|
+
* already recomputed it by the time this asks.
|
|
215
|
+
*/
|
|
216
|
+
private childBoundsMoved(): boolean {
|
|
217
|
+
for (const child of this.children) {
|
|
218
|
+
if (child.worldRevision > this.boundsRevision) return true;
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @internal This node's geometry, placed, then grown to hold every child.
|
|
225
|
+
*
|
|
226
|
+
* Growing a sphere to contain another is the standard construction: if one already contains the
|
|
227
|
+
* other it is unchanged, and otherwise the new sphere spans from the far side of each. Written
|
|
228
|
+
* out rather than taken from a library because it runs per node per change and the three-line
|
|
229
|
+
* version allocates a vector.
|
|
230
|
+
*/
|
|
231
|
+
private unionBounds(): void {
|
|
232
|
+
const local = this.localBounds;
|
|
233
|
+
let cx = this.worldMatrix[12] ?? 0;
|
|
234
|
+
let cy = this.worldMatrix[13] ?? 0;
|
|
235
|
+
let cz = this.worldMatrix[14] ?? 0;
|
|
236
|
+
let radius = 0;
|
|
237
|
+
|
|
238
|
+
if (local !== null) {
|
|
239
|
+
const lx = local.centre[0] ?? 0;
|
|
240
|
+
const ly = local.centre[1] ?? 0;
|
|
241
|
+
const lz = local.centre[2] ?? 0;
|
|
242
|
+
const m = this.worldMatrix;
|
|
243
|
+
cx = (m[0] ?? 0) * lx + (m[4] ?? 0) * ly + (m[8] ?? 0) * lz + (m[12] ?? 0);
|
|
244
|
+
cy = (m[1] ?? 0) * lx + (m[5] ?? 0) * ly + (m[9] ?? 0) * lz + (m[13] ?? 0);
|
|
245
|
+
cz = (m[2] ?? 0) * lx + (m[6] ?? 0) * ly + (m[10] ?? 0) * lz + (m[14] ?? 0);
|
|
246
|
+
/* The largest axis scale, for the reason `boundsVisible` gives at length. */
|
|
247
|
+
const sx = axisScale(m, 0);
|
|
248
|
+
const sy = axisScale(m, 4);
|
|
249
|
+
const sz = axisScale(m, 8);
|
|
250
|
+
radius = local.radius * Math.max(sx, sy, sz);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
let started = local !== null;
|
|
254
|
+
for (const child of this.children) {
|
|
255
|
+
const other = child.worldBounds;
|
|
256
|
+
/* A child that is a point with nothing under it contributes nothing. */
|
|
257
|
+
if (other.radius === 0 && !child.hasGeometry && child.children.length === 0) continue;
|
|
258
|
+
const ox = other.centre[0] ?? 0;
|
|
259
|
+
const oy = other.centre[1] ?? 0;
|
|
260
|
+
const oz = other.centre[2] ?? 0;
|
|
261
|
+
if (!started) {
|
|
262
|
+
cx = ox;
|
|
263
|
+
cy = oy;
|
|
264
|
+
cz = oz;
|
|
265
|
+
radius = other.radius;
|
|
266
|
+
started = true;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const dx = ox - cx;
|
|
270
|
+
const dy = oy - cy;
|
|
271
|
+
const dz = oz - cz;
|
|
272
|
+
const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
273
|
+
if (distance + other.radius <= radius) continue;
|
|
274
|
+
if (distance + radius <= other.radius) {
|
|
275
|
+
cx = ox;
|
|
276
|
+
cy = oy;
|
|
277
|
+
cz = oz;
|
|
278
|
+
radius = other.radius;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const grown = (distance + radius + other.radius) * 0.5;
|
|
282
|
+
const along = distance > 1e-12 ? (grown - radius) / distance : 0;
|
|
283
|
+
cx += dx * along;
|
|
284
|
+
cy += dy * along;
|
|
285
|
+
cz += dz * along;
|
|
286
|
+
radius = grown;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
this.worldBounds.centre[0] = cx;
|
|
290
|
+
this.worldBounds.centre[1] = cy;
|
|
291
|
+
this.worldBounds.centre[2] = cz;
|
|
292
|
+
this.worldBounds.radius = radius;
|
|
293
|
+
this.worldBounds.min[0] = cx - radius;
|
|
294
|
+
this.worldBounds.min[1] = cy - radius;
|
|
295
|
+
this.worldBounds.min[2] = cz - radius;
|
|
296
|
+
this.worldBounds.max[0] = cx + radius;
|
|
297
|
+
this.worldBounds.max[1] = cy + radius;
|
|
298
|
+
this.worldBounds.max[2] = cz + radius;
|
|
299
|
+
revisions += 1;
|
|
300
|
+
this.boundsRevision = revisions;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** @internal The composition itself, in one place so the two callers cannot drift. */
|
|
304
|
+
private composeWorld(parentWorld: Float32Array | null): void {
|
|
305
|
+
if (this.localDirty) {
|
|
306
|
+
mat4.fromRotationTranslationScale(this.localMatrix, this.rotation, this.position, this.scale);
|
|
307
|
+
this.localDirty = false;
|
|
308
|
+
}
|
|
309
|
+
if (parentWorld === null) this.worldMatrix.set(this.localMatrix);
|
|
310
|
+
else mat4.multiply(this.worldMatrix, parentWorld, this.localMatrix);
|
|
311
|
+
revisions += 1;
|
|
312
|
+
this.worldRevision = revisions;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/** @internal Mark this node and everything under it as needing a new world matrix. */
|
|
316
|
+
protected markSubtreeStale(): void {
|
|
317
|
+
if (this.worldDirty) return;
|
|
318
|
+
this.worldDirty = true;
|
|
319
|
+
for (const child of this.children) child.markSubtreeStale();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* The length of one of a matrix's three basis columns.
|
|
325
|
+
*
|
|
326
|
+
* `Math.sqrt` of a sum of squares rather than `Math.hypot`, which `scripts/determinism.mjs` refuses
|
|
327
|
+
* inside the simulation set: ECMAScript declines to specify `hypot`, so two engines may answer an
|
|
328
|
+
* ulp apart and a world matrix feeds a query. What `hypot` buys and this gives up is range — a sum
|
|
329
|
+
* of squares overflows above about 1e154 — and a basis column of a transform is near one.
|
|
330
|
+
*/
|
|
331
|
+
function axisScale(m: ArrayLike<number>, at: number): number {
|
|
332
|
+
const x = m[at] ?? 0;
|
|
333
|
+
const y = m[at + 1] ?? 0;
|
|
334
|
+
const z = m[at + 2] ?? 0;
|
|
335
|
+
return Math.sqrt(x * x + y * y + z * z);
|
|
336
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { sphereInFrustum } from '../math/frustum.ts';
|
|
2
|
+
import type { Frustum } from '../math/frustum.ts';
|
|
3
|
+
import type { SceneNode } from './node.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* What a traversal discarded, and what it handed over.
|
|
7
|
+
*
|
|
8
|
+
* **The pruned count is a measurement rather than a curiosity.** A hierarchy that prunes nothing
|
|
9
|
+
* is a linear scan with extra steps, and the only way to know which one a given world produces is
|
|
10
|
+
* to count. A caller printing this beside its frame time is what turns "the partition helps" from
|
|
11
|
+
* a belief into a number.
|
|
12
|
+
*/
|
|
13
|
+
export interface VisitResult {
|
|
14
|
+
/** Nodes with geometry handed to the visitor. */
|
|
15
|
+
visited: number;
|
|
16
|
+
/** Subtrees rejected whole, each standing for every node beneath it. */
|
|
17
|
+
pruned: number;
|
|
18
|
+
/** Nodes reached and tested, which is what `pruned` saved a multiple of. */
|
|
19
|
+
tested: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Walk a hierarchy, skipping any subtree the frustum rejects.
|
|
24
|
+
*
|
|
25
|
+
* **This is the spatial partition, and there is no second structure.** A node's world bounds
|
|
26
|
+
* enclose every descendant's, so rejecting a parent rejects everything under it — which is what a
|
|
27
|
+
* bounding-volume hierarchy is. The caller builds it by describing its world, and the pruning is
|
|
28
|
+
* free. `IMPROVEMENTS.md` recorded a trigger for building a BVH; this retires it rather than
|
|
29
|
+
* meeting it.
|
|
30
|
+
*
|
|
31
|
+
* **It does not draw.** `visit` is handed a node and the caller decides what verb that is worth,
|
|
32
|
+
* in whatever order it likes. The render graph work established that draw order carries meaning,
|
|
33
|
+
* and a traversal that issued draws would be deciding it.
|
|
34
|
+
*
|
|
35
|
+
* **A node with no geometry is not visited, but its children are.** A group is scaffolding, and
|
|
36
|
+
* handing one to a visitor gives a caller something with nothing to draw.
|
|
37
|
+
*
|
|
38
|
+
* Allocates nothing: `out` is the caller's, and the visitor is called rather than collected.
|
|
39
|
+
*/
|
|
40
|
+
export function visitVisible(
|
|
41
|
+
root: SceneNode,
|
|
42
|
+
frustum: Frustum,
|
|
43
|
+
visit: (node: SceneNode) => void,
|
|
44
|
+
out: VisitResult,
|
|
45
|
+
): VisitResult {
|
|
46
|
+
out.visited = 0;
|
|
47
|
+
out.pruned = 0;
|
|
48
|
+
out.tested = 0;
|
|
49
|
+
walk(root, frustum, visit, out);
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function walk(
|
|
54
|
+
node: SceneNode,
|
|
55
|
+
frustum: Frustum,
|
|
56
|
+
visit: (node: SceneNode) => void,
|
|
57
|
+
out: VisitResult,
|
|
58
|
+
): void {
|
|
59
|
+
out.tested += 1;
|
|
60
|
+
const bounds = node.worldBounds;
|
|
61
|
+
if (
|
|
62
|
+
!sphereInFrustum(
|
|
63
|
+
frustum,
|
|
64
|
+
bounds.centre[0] ?? 0,
|
|
65
|
+
bounds.centre[1] ?? 0,
|
|
66
|
+
bounds.centre[2] ?? 0,
|
|
67
|
+
bounds.radius,
|
|
68
|
+
)
|
|
69
|
+
) {
|
|
70
|
+
out.pruned += 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (node.hasGeometry) {
|
|
74
|
+
out.visited += 1;
|
|
75
|
+
visit(node);
|
|
76
|
+
}
|
|
77
|
+
for (const child of node.children) walk(child, frustum, visit, out);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function createVisitResult(): VisitResult {
|
|
81
|
+
return { visited: 0, pruned: 0, tested: 0 };
|
|
82
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a browser can record a clip in, and what that choice commits the file to.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `frameRecorder.ts`, and the reason is the caller rather than the code.
|
|
5
|
+
* A game asks `supportedClipMimeType` at boot to decide whether an export button
|
|
6
|
+
* should exist at all, which is a question about the *browser* — but asking it used to
|
|
7
|
+
* drag `FrameRecorder` and `offerClip` into the same bundle chunk, and those are only
|
|
8
|
+
* wanted once somebody actually exports something. A probe with no imports of its own
|
|
9
|
+
* can be read from anywhere for nothing.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Container and codec preferences, best first.
|
|
14
|
+
*
|
|
15
|
+
* **The first two ask for AAC by name, and that is the point of them.** The list used
|
|
16
|
+
* to open with `video/mp4;codecs=avc1`, which names the video codec and leaves the
|
|
17
|
+
* audio to the browser — so a recording that *could* have been AAC was only AAC if the
|
|
18
|
+
* browser felt like it, and there was no way to find out afterwards which it had been.
|
|
19
|
+
* Asking explicitly makes the answer a fact `isTypeSupported` reports before a single
|
|
20
|
+
* frame is recorded, and `describeClipMime` reads it back off the accepted string.
|
|
21
|
+
*
|
|
22
|
+
* This matters more than it looks, because the audio codec is what decides whether the
|
|
23
|
+
* file can be posted. MP4 carrying Opus is legal ISO and Android's MediaCodec cannot
|
|
24
|
+
* decode it, so the TikTok app refuses it outright.
|
|
25
|
+
*
|
|
26
|
+
* `avc1` unqualified follows the profile-qualified form because a build can accept the
|
|
27
|
+
* general string and reject a specific profile, and either is better than falling to
|
|
28
|
+
* WebM. WebM stays last: it is a real file that real desktop uploaders take, and it is
|
|
29
|
+
* the only thing some browsers can produce.
|
|
30
|
+
*/
|
|
31
|
+
const MIME_CANDIDATES = [
|
|
32
|
+
'video/mp4;codecs="avc1.640028,mp4a.40.2"',
|
|
33
|
+
'video/mp4;codecs="avc1,mp4a.40.2"',
|
|
34
|
+
/*
|
|
35
|
+
* Opus named on purpose, and *above* the bare `avc1` that would otherwise match it.
|
|
36
|
+
*
|
|
37
|
+
* It looks like asking for the worse file, and it is not: on a build with no AAC
|
|
38
|
+
* encoder the browser picks Opus for `codecs=avc1` anyway — verified, it is what every
|
|
39
|
+
* `MediaRecorder` clip in this project has carried — so the choice is not between AAC
|
|
40
|
+
* and Opus here, it is between an Opus file that says so and an Opus file that does
|
|
41
|
+
* not. Naming it turns a vague "could not confirm AAC" into the accurate warning, with
|
|
42
|
+
* the remux to go with it. Anywhere AAC exists, the two candidates above match first.
|
|
43
|
+
*/
|
|
44
|
+
'video/mp4;codecs="avc1,opus"',
|
|
45
|
+
'video/mp4;codecs=avc1',
|
|
46
|
+
'video/webm;codecs=vp9,opus',
|
|
47
|
+
'video/webm;codecs=vp8,opus',
|
|
48
|
+
'video/webm',
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
/** What a recording MIME type commits the file to. See `describeClipMime`. */
|
|
52
|
+
export interface ClipMimeDescription {
|
|
53
|
+
readonly container: 'mp4' | 'webm' | 'unknown';
|
|
54
|
+
/**
|
|
55
|
+
* `unspecified` is not a synonym for "fine". It means the string named no audio
|
|
56
|
+
* codec, so the browser chose one and the file does not say which — the state this
|
|
57
|
+
* type exists to stop a caller from having to guess about.
|
|
58
|
+
*/
|
|
59
|
+
readonly audio: 'aac' | 'opus' | 'unspecified';
|
|
60
|
+
/**
|
|
61
|
+
* True only for MP4 carrying AAC: the one combination every share target on a phone
|
|
62
|
+
* ingests without transcoding.
|
|
63
|
+
*
|
|
64
|
+
* Deliberately false for `unspecified`, which is a claim about knowledge rather than
|
|
65
|
+
* about the file. A caller that reports "this may not upload" on a file that turns
|
|
66
|
+
* out fine has been slightly annoying; one that stays quiet on a file that dies at
|
|
67
|
+
* an upload screen has wasted a clip nobody can re-record.
|
|
68
|
+
*/
|
|
69
|
+
readonly shareable: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Read back what a recording MIME type promises, without recording anything.
|
|
74
|
+
*
|
|
75
|
+
* Pure, and string-parsing rather than clever: the accepted candidate above is the only
|
|
76
|
+
* evidence available about a `MediaRecorder` file's audio codec, since the blob's `type`
|
|
77
|
+
* is just the string it was handed.
|
|
78
|
+
*/
|
|
79
|
+
export function describeClipMime(mime: string): ClipMimeDescription {
|
|
80
|
+
const lower = mime.toLowerCase();
|
|
81
|
+
const container = lower.startsWith('video/mp4')
|
|
82
|
+
? 'mp4'
|
|
83
|
+
: lower.startsWith('video/webm')
|
|
84
|
+
? 'webm'
|
|
85
|
+
: 'unknown';
|
|
86
|
+
// `mp4a.40.2` is AAC-LC; `mp4a.40.5`/`.29` are the HE variants, all of them AAC as
|
|
87
|
+
// far as anything receiving the file is concerned.
|
|
88
|
+
const audio = lower.includes('mp4a.40') ? 'aac' : lower.includes('opus') ? 'opus' : 'unspecified';
|
|
89
|
+
return { container, audio, shareable: container === 'mp4' && audio === 'aac' };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Whether this browser can record at all, and in what.
|
|
94
|
+
*
|
|
95
|
+
* MP4 first where it exists, because it is the format every social app accepts
|
|
96
|
+
* without transcoding — a WebM upload that silently fails on a phone is worse
|
|
97
|
+
* than no export button.
|
|
98
|
+
*/
|
|
99
|
+
export function supportedClipMimeType(): string | null {
|
|
100
|
+
if (typeof MediaRecorder === 'undefined') return null;
|
|
101
|
+
for (const mime of MIME_CANDIDATES) {
|
|
102
|
+
try {
|
|
103
|
+
if (MediaRecorder.isTypeSupported(mime)) return mime;
|
|
104
|
+
} catch {
|
|
105
|
+
// Some engines throw rather than returning false. Same answer either way.
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|