@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.
Files changed (955) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +9 -0
  4. package/dist/behavior/behaviorTree.d.ts +140 -0
  5. package/dist/behavior/behaviorTree.js +289 -0
  6. package/dist/build/shaderComments.d.ts +64 -0
  7. package/dist/build/shaderComments.js +0 -0
  8. package/dist/cinematic/player.d.ts +80 -0
  9. package/dist/cinematic/player.js +184 -0
  10. package/dist/cinematic/script.d.ts +63 -0
  11. package/dist/cinematic/script.js +141 -0
  12. package/dist/core/bootGate.d.ts +37 -0
  13. package/dist/core/bootGate.js +47 -0
  14. package/dist/core/loadTracker.d.ts +78 -0
  15. package/dist/core/loadTracker.js +106 -0
  16. package/dist/core/loop.d.ts +118 -0
  17. package/dist/core/loop.js +84 -0
  18. package/dist/core/messageQueue.d.ts +61 -0
  19. package/dist/core/messageQueue.js +104 -0
  20. package/dist/core/onceSet.d.ts +27 -0
  21. package/dist/core/onceSet.js +62 -0
  22. package/dist/core/preferences.d.ts +47 -0
  23. package/dist/core/preferences.js +140 -0
  24. package/dist/core/remoteSave.d.ts +154 -0
  25. package/dist/core/remoteSave.js +249 -0
  26. package/dist/core/rng.d.ts +64 -0
  27. package/dist/core/rng.js +72 -0
  28. package/dist/core/stepBudget.d.ts +91 -0
  29. package/dist/core/stepBudget.js +105 -0
  30. package/dist/core/storage.d.ts +52 -0
  31. package/dist/core/storage.js +85 -0
  32. package/dist/core/tickTrace.d.ts +72 -0
  33. package/dist/core/tickTrace.js +102 -0
  34. package/dist/core/timeCurve.d.ts +83 -0
  35. package/dist/core/timeCurve.js +107 -0
  36. package/dist/core/withDefaults.d.ts +21 -0
  37. package/dist/core/withDefaults.js +29 -0
  38. package/dist/dev/contactProbe.d.ts +41 -0
  39. package/dist/dev/contactProbe.js +58 -0
  40. package/dist/dev/fpsMeter.d.ts +45 -0
  41. package/dist/dev/fpsMeter.js +86 -0
  42. package/dist/environment/celestialClock.d.ts +141 -0
  43. package/dist/environment/celestialClock.js +262 -0
  44. package/dist/geometry/decal.d.ts +61 -0
  45. package/dist/geometry/decal.js +178 -0
  46. package/dist/geometry/filmPatch.d.ts +35 -0
  47. package/dist/geometry/filmPatch.js +112 -0
  48. package/dist/geometry/growable.d.ts +70 -0
  49. package/dist/geometry/growable.js +167 -0
  50. package/dist/geometry/lightVolume.d.ts +76 -0
  51. package/dist/geometry/lightVolume.js +65 -0
  52. package/dist/geometry/meshBuilder.d.ts +426 -0
  53. package/dist/geometry/meshBuilder.js +1184 -0
  54. package/dist/geometry/pixelFont.d.ts +59 -0
  55. package/dist/geometry/pixelFont.js +179 -0
  56. package/dist/geometry/ribbon.d.ts +101 -0
  57. package/dist/geometry/ribbon.js +546 -0
  58. package/dist/geometry/shellFill.d.ts +101 -0
  59. package/dist/geometry/shellFill.js +203 -0
  60. package/dist/geometry/spline.d.ts +162 -0
  61. package/dist/geometry/spline.js +527 -0
  62. package/dist/geometry/tangents.d.ts +30 -0
  63. package/dist/geometry/tangents.js +142 -0
  64. package/dist/geometry/textMesh.d.ts +51 -0
  65. package/dist/geometry/textMesh.js +57 -0
  66. package/dist/geometry/treeBuilder.d.ts +37 -0
  67. package/dist/geometry/treeBuilder.js +56 -0
  68. package/dist/host/display.d.ts +135 -0
  69. package/dist/host/display.js +114 -0
  70. package/dist/host/files.d.ts +25 -0
  71. package/dist/host/files.js +44 -0
  72. package/dist/host/lifecycle.d.ts +45 -0
  73. package/dist/host/lifecycle.js +28 -0
  74. package/dist/host/platformServices.d.ts +23 -0
  75. package/dist/host/platformServices.js +1 -0
  76. package/dist/host/screen.d.ts +49 -0
  77. package/dist/host/screen.js +90 -0
  78. package/dist/index.d.ts +289 -0
  79. package/dist/index.js +320 -0
  80. package/dist/input/actionMap.d.ts +181 -0
  81. package/dist/input/actionMap.js +314 -0
  82. package/dist/input/activeDevice.d.ts +55 -0
  83. package/dist/input/activeDevice.js +83 -0
  84. package/dist/input/gamepadIdentity.d.ts +43 -0
  85. package/dist/input/gamepadIdentity.js +108 -0
  86. package/dist/input/gamepadMapping.d.ts +56 -0
  87. package/dist/input/gamepadMapping.js +91 -0
  88. package/dist/input/input.d.ts +281 -0
  89. package/dist/input/input.js +703 -0
  90. package/dist/input/inputHarness.d.ts +42 -0
  91. package/dist/input/inputHarness.js +193 -0
  92. package/dist/input/rightGesture.d.ts +57 -0
  93. package/dist/input/rightGesture.js +49 -0
  94. package/dist/input/rumble.d.ts +71 -0
  95. package/dist/input/rumble.js +119 -0
  96. package/dist/input/touchControls.d.ts +138 -0
  97. package/dist/input/touchControls.js +352 -0
  98. package/dist/input/typingTarget.d.ts +6 -0
  99. package/dist/input/typingTarget.js +27 -0
  100. package/dist/math/bounds.d.ts +61 -0
  101. package/dist/math/bounds.js +121 -0
  102. package/dist/math/color.d.ts +8 -0
  103. package/dist/math/color.js +35 -0
  104. package/dist/math/exact.d.ts +66 -0
  105. package/dist/math/exact.js +262 -0
  106. package/dist/math/frustum.d.ts +44 -0
  107. package/dist/math/frustum.js +90 -0
  108. package/dist/math/intersect.d.ts +76 -0
  109. package/dist/math/intersect.js +185 -0
  110. package/dist/math/scalar.d.ts +51 -0
  111. package/dist/math/scalar.js +99 -0
  112. package/dist/math/spring.d.ts +59 -0
  113. package/dist/math/spring.js +88 -0
  114. package/dist/nav/navGraph.d.ts +71 -0
  115. package/dist/nav/navGraph.js +111 -0
  116. package/dist/nav/navPath.d.ts +93 -0
  117. package/dist/nav/navPath.js +162 -0
  118. package/dist/nav/navSearch.d.ts +74 -0
  119. package/dist/nav/navSearch.js +198 -0
  120. package/dist/physics/boxSurface.d.ts +48 -0
  121. package/dist/physics/boxSurface.js +73 -0
  122. package/dist/physics/colliderSurface.d.ts +46 -0
  123. package/dist/physics/colliderSurface.js +146 -0
  124. package/dist/physics/compositeSurface.d.ts +33 -0
  125. package/dist/physics/compositeSurface.js +108 -0
  126. package/dist/physics/heightSurface.d.ts +103 -0
  127. package/dist/physics/heightSurface.js +153 -0
  128. package/dist/physics/ribbonSurface.d.ts +239 -0
  129. package/dist/physics/ribbonSurface.js +522 -0
  130. package/dist/render/ambientOcclusionPass.d.ts +53 -0
  131. package/dist/render/ambientOcclusionPass.js +179 -0
  132. package/dist/render/areaLights.d.ts +116 -0
  133. package/dist/render/areaLights.js +91 -0
  134. package/dist/render/areaShadowSet.d.ts +184 -0
  135. package/dist/render/areaShadowSet.js +277 -0
  136. package/dist/render/atmosphere.d.ts +94 -0
  137. package/dist/render/atmosphere.js +91 -0
  138. package/dist/render/backend/api.d.ts +496 -0
  139. package/dist/render/backend/api.js +1 -0
  140. package/dist/render/backend/budget.d.ts +82 -0
  141. package/dist/render/backend/budget.js +99 -0
  142. package/dist/render/backend/createRenderer.d.ts +135 -0
  143. package/dist/render/backend/createRenderer.js +201 -0
  144. package/dist/render/backend/deadline.d.ts +24 -0
  145. package/dist/render/backend/deadline.js +38 -0
  146. package/dist/render/backend/probe.d.ts +30 -0
  147. package/dist/render/backend/probe.js +129 -0
  148. package/dist/render/backend/select.d.ts +70 -0
  149. package/dist/render/backend/select.js +249 -0
  150. package/dist/render/backend/timer.d.ts +50 -0
  151. package/dist/render/backend/timer.js +1 -0
  152. package/dist/render/backend/webgl2/instanced.d.ts +21 -0
  153. package/dist/render/backend/webgl2/instanced.js +42 -0
  154. package/dist/render/backend/webgl2/morphTexture.d.ts +21 -0
  155. package/dist/render/backend/webgl2/morphTexture.js +55 -0
  156. package/dist/render/backend/webgl2/renderer.d.ts +3027 -0
  157. package/dist/render/backend/webgl2/renderer.js +6041 -0
  158. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +32 -0
  159. package/dist/render/backend/webgl2/skinPaletteTexture.js +68 -0
  160. package/dist/render/backend/webgpu/boltPass.d.ts +42 -0
  161. package/dist/render/backend/webgpu/boltPass.js +160 -0
  162. package/dist/render/backend/webgpu/buffers.d.ts +159 -0
  163. package/dist/render/backend/webgpu/buffers.js +402 -0
  164. package/dist/render/backend/webgpu/causticsPass.d.ts +36 -0
  165. package/dist/render/backend/webgpu/causticsPass.js +138 -0
  166. package/dist/render/backend/webgpu/clusterBinner.d.ts +51 -0
  167. package/dist/render/backend/webgpu/clusterBinner.js +206 -0
  168. package/dist/render/backend/webgpu/depthPass.d.ts +114 -0
  169. package/dist/render/backend/webgpu/depthPass.js +228 -0
  170. package/dist/render/backend/webgpu/device.d.ts +52 -0
  171. package/dist/render/backend/webgpu/device.js +121 -0
  172. package/dist/render/backend/webgpu/drawCommand.d.ts +43 -0
  173. package/dist/render/backend/webgpu/drawCommand.js +54 -0
  174. package/dist/render/backend/webgpu/environmentTexels.d.ts +28 -0
  175. package/dist/render/backend/webgpu/environmentTexels.js +79 -0
  176. package/dist/render/backend/webgpu/filmPass.d.ts +29 -0
  177. package/dist/render/backend/webgpu/filmPass.js +97 -0
  178. package/dist/render/backend/webgpu/flatPass.d.ts +213 -0
  179. package/dist/render/backend/webgpu/flatPass.js +482 -0
  180. package/dist/render/backend/webgpu/flockPass.d.ts +34 -0
  181. package/dist/render/backend/webgpu/flockPass.js +129 -0
  182. package/dist/render/backend/webgpu/gpuTimestamps.d.ts +94 -0
  183. package/dist/render/backend/webgpu/gpuTimestamps.js +213 -0
  184. package/dist/render/backend/webgpu/insetPass.d.ts +19 -0
  185. package/dist/render/backend/webgpu/insetPass.js +108 -0
  186. package/dist/render/backend/webgpu/instanced.d.ts +27 -0
  187. package/dist/render/backend/webgpu/instanced.js +49 -0
  188. package/dist/render/backend/webgpu/lightVolumePass.d.ts +75 -0
  189. package/dist/render/backend/webgpu/lightVolumePass.js +154 -0
  190. package/dist/render/backend/webgpu/linePass.d.ts +90 -0
  191. package/dist/render/backend/webgpu/linePass.js +220 -0
  192. package/dist/render/backend/webgpu/morphTexture.d.ts +18 -0
  193. package/dist/render/backend/webgpu/morphTexture.js +51 -0
  194. package/dist/render/backend/webgpu/panelPass.d.ts +37 -0
  195. package/dist/render/backend/webgpu/panelPass.js +114 -0
  196. package/dist/render/backend/webgpu/particlePass.d.ts +89 -0
  197. package/dist/render/backend/webgpu/particlePass.js +280 -0
  198. package/dist/render/backend/webgpu/pipelineCache.d.ts +93 -0
  199. package/dist/render/backend/webgpu/pipelineCache.js +140 -0
  200. package/dist/render/backend/webgpu/plumePass.d.ts +69 -0
  201. package/dist/render/backend/webgpu/plumePass.js +213 -0
  202. package/dist/render/backend/webgpu/pointShadowPass.d.ts +88 -0
  203. package/dist/render/backend/webgpu/pointShadowPass.js +280 -0
  204. package/dist/render/backend/webgpu/postPass.d.ts +342 -0
  205. package/dist/render/backend/webgpu/postPass.js +366 -0
  206. package/dist/render/backend/webgpu/probePass.d.ts +108 -0
  207. package/dist/render/backend/webgpu/probePass.js +188 -0
  208. package/dist/render/backend/webgpu/reflectionPass.d.ts +29 -0
  209. package/dist/render/backend/webgpu/reflectionPass.js +87 -0
  210. package/dist/render/backend/webgpu/renderer.d.ts +3082 -0
  211. package/dist/render/backend/webgpu/renderer.js +10911 -0
  212. package/dist/render/backend/webgpu/scatterPass.d.ts +95 -0
  213. package/dist/render/backend/webgpu/scatterPass.js +266 -0
  214. package/dist/render/backend/webgpu/sdfTextPass.d.ts +86 -0
  215. package/dist/render/backend/webgpu/sdfTextPass.js +190 -0
  216. package/dist/render/backend/webgpu/shaderModules.d.ts +9 -0
  217. package/dist/render/backend/webgpu/shaderModules.js +45 -0
  218. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +23 -0
  219. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +208 -0
  220. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +67 -0
  221. package/dist/render/backend/webgpu/skinPaletteRing.js +97 -0
  222. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +17 -0
  223. package/dist/render/backend/webgpu/skinPaletteTexture.js +68 -0
  224. package/dist/render/backend/webgpu/skyPass.d.ts +102 -0
  225. package/dist/render/backend/webgpu/skyPass.js +70 -0
  226. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +41 -0
  227. package/dist/render/backend/webgpu/surfaceTexturePass.js +228 -0
  228. package/dist/render/backend/webgpu/textPass.d.ts +73 -0
  229. package/dist/render/backend/webgpu/textPass.js +190 -0
  230. package/dist/render/backend/webgpu/uniformRing.d.ts +133 -0
  231. package/dist/render/backend/webgpu/uniformRing.js +208 -0
  232. package/dist/render/backend/webgpu/waterPass.d.ts +73 -0
  233. package/dist/render/backend/webgpu/waterPass.js +160 -0
  234. package/dist/render/backend/webgpu/windStreakPass.d.ts +46 -0
  235. package/dist/render/backend/webgpu/windStreakPass.js +153 -0
  236. package/dist/render/billboard.d.ts +27 -0
  237. package/dist/render/billboard.js +79 -0
  238. package/dist/render/bloomChain.d.ts +66 -0
  239. package/dist/render/bloomChain.js +83 -0
  240. package/dist/render/bloomPass.d.ts +54 -0
  241. package/dist/render/bloomPass.js +219 -0
  242. package/dist/render/boltBatch.d.ts +39 -0
  243. package/dist/render/boltBatch.js +121 -0
  244. package/dist/render/boltPool.d.ts +135 -0
  245. package/dist/render/boltPool.js +259 -0
  246. package/dist/render/boom.d.ts +46 -0
  247. package/dist/render/boom.js +81 -0
  248. package/dist/render/camera.d.ts +119 -0
  249. package/dist/render/camera.js +304 -0
  250. package/dist/render/causticsRenderer.d.ts +63 -0
  251. package/dist/render/causticsRenderer.js +119 -0
  252. package/dist/render/cinematicCamera.d.ts +102 -0
  253. package/dist/render/cinematicCamera.js +227 -0
  254. package/dist/render/clusteredLights.d.ts +260 -0
  255. package/dist/render/clusteredLights.js +479 -0
  256. package/dist/render/colourGrade.d.ts +62 -0
  257. package/dist/render/colourGrade.js +91 -0
  258. package/dist/render/compute.d.ts +74 -0
  259. package/dist/render/compute.js +8 -0
  260. package/dist/render/contextLoss.d.ts +32 -0
  261. package/dist/render/contextLoss.js +46 -0
  262. package/dist/render/debugLines.d.ts +75 -0
  263. package/dist/render/debugLines.js +281 -0
  264. package/dist/render/decalPass.d.ts +34 -0
  265. package/dist/render/decalPass.js +103 -0
  266. package/dist/render/decalProjector.d.ts +140 -0
  267. package/dist/render/decalProjector.js +282 -0
  268. package/dist/render/decalQueue.d.ts +53 -0
  269. package/dist/render/decalQueue.js +87 -0
  270. package/dist/render/depthConvention.d.ts +314 -0
  271. package/dist/render/depthConvention.js +346 -0
  272. package/dist/render/drawingBuffer.d.ts +52 -0
  273. package/dist/render/drawingBuffer.js +67 -0
  274. package/dist/render/emptyTexture.d.ts +60 -0
  275. package/dist/render/emptyTexture.js +103 -0
  276. package/dist/render/envProbeArray.d.ts +85 -0
  277. package/dist/render/envProbeArray.js +164 -0
  278. package/dist/render/equirectToCube.d.ts +54 -0
  279. package/dist/render/equirectToCube.js +123 -0
  280. package/dist/render/flockGeometry.d.ts +23 -0
  281. package/dist/render/flockGeometry.js +43 -0
  282. package/dist/render/flockRenderer.d.ts +37 -0
  283. package/dist/render/flockRenderer.js +70 -0
  284. package/dist/render/frame/arena.d.ts +32 -0
  285. package/dist/render/frame/arena.js +65 -0
  286. package/dist/render/frame/index.d.ts +18 -0
  287. package/dist/render/frame/index.js +4 -0
  288. package/dist/render/frame/replay.d.ts +34 -0
  289. package/dist/render/frame/replay.js +48 -0
  290. package/dist/render/frame/resources.d.ts +25 -0
  291. package/dist/render/frame/resources.js +55 -0
  292. package/dist/render/frame/schedule.d.ts +37 -0
  293. package/dist/render/frame/schedule.js +61 -0
  294. package/dist/render/frameView.d.ts +19 -0
  295. package/dist/render/frameView.js +1 -0
  296. package/dist/render/gizmo.d.ts +236 -0
  297. package/dist/render/gizmo.js +727 -0
  298. package/dist/render/globalMedium.d.ts +124 -0
  299. package/dist/render/globalMedium.js +100 -0
  300. package/dist/render/globalMediumPass.d.ts +101 -0
  301. package/dist/render/globalMediumPass.js +250 -0
  302. package/dist/render/gpuCapability.d.ts +111 -0
  303. package/dist/render/gpuCapability.js +194 -0
  304. package/dist/render/gpuTimer.d.ts +87 -0
  305. package/dist/render/gpuTimer.js +145 -0
  306. package/dist/render/halfFloat.d.ts +4 -0
  307. package/dist/render/halfFloat.js +38 -0
  308. package/dist/render/handleRegistry.d.ts +54 -0
  309. package/dist/render/handleRegistry.js +84 -0
  310. package/dist/render/iesProfile.d.ts +64 -0
  311. package/dist/render/iesProfile.js +179 -0
  312. package/dist/render/imageTexels.d.ts +50 -0
  313. package/dist/render/imageTexels.js +91 -0
  314. package/dist/render/instancedMesh.d.ts +48 -0
  315. package/dist/render/instancedMesh.js +127 -0
  316. package/dist/render/instances.d.ts +69 -0
  317. package/dist/render/instances.js +52 -0
  318. package/dist/render/lightBudget.d.ts +397 -0
  319. package/dist/render/lightBudget.js +524 -0
  320. package/dist/render/lightMatrix.d.ts +3 -0
  321. package/dist/render/lightMatrix.js +45 -0
  322. package/dist/render/lightVolumeDraw.d.ts +132 -0
  323. package/dist/render/lightVolumeDraw.js +181 -0
  324. package/dist/render/lineBatch.d.ts +60 -0
  325. package/dist/render/lineBatch.js +160 -0
  326. package/dist/render/linePoints.d.ts +33 -0
  327. package/dist/render/linePoints.js +46 -0
  328. package/dist/render/livePointShadowSet.d.ts +72 -0
  329. package/dist/render/livePointShadowSet.js +258 -0
  330. package/dist/render/lod.d.ts +35 -0
  331. package/dist/render/lod.js +65 -0
  332. package/dist/render/mesh.d.ts +177 -0
  333. package/dist/render/mesh.js +466 -0
  334. package/dist/render/occlusion.d.ts +81 -0
  335. package/dist/render/occlusion.js +378 -0
  336. package/dist/render/oitPass.d.ts +67 -0
  337. package/dist/render/oitPass.js +213 -0
  338. package/dist/render/orderIndependent.d.ts +92 -0
  339. package/dist/render/orderIndependent.js +108 -0
  340. package/dist/render/particleBatch.d.ts +140 -0
  341. package/dist/render/particleBatch.js +186 -0
  342. package/dist/render/particleMaterial.d.ts +54 -0
  343. package/dist/render/particleMaterial.js +42 -0
  344. package/dist/render/particlePool.d.ts +124 -0
  345. package/dist/render/particlePool.js +182 -0
  346. package/dist/render/pass.d.ts +195 -0
  347. package/dist/render/pass.js +9 -0
  348. package/dist/render/passTarget.d.ts +86 -0
  349. package/dist/render/passTarget.js +121 -0
  350. package/dist/render/pickable.d.ts +31 -0
  351. package/dist/render/pickable.js +172 -0
  352. package/dist/render/planarReflection.d.ts +59 -0
  353. package/dist/render/planarReflection.js +194 -0
  354. package/dist/render/planarReflectionDraw.d.ts +31 -0
  355. package/dist/render/planarReflectionDraw.js +65 -0
  356. package/dist/render/plumeGeometry.d.ts +25 -0
  357. package/dist/render/plumeGeometry.js +61 -0
  358. package/dist/render/plumeMaterial.d.ts +31 -0
  359. package/dist/render/plumeMaterial.js +64 -0
  360. package/dist/render/plumeRenderer.d.ts +96 -0
  361. package/dist/render/plumeRenderer.js +185 -0
  362. package/dist/render/pointLightSelection.d.ts +175 -0
  363. package/dist/render/pointLightSelection.js +301 -0
  364. package/dist/render/pointShadowArray.d.ts +95 -0
  365. package/dist/render/pointShadowArray.js +219 -0
  366. package/dist/render/pointShadowBudget.d.ts +118 -0
  367. package/dist/render/pointShadowBudget.js +221 -0
  368. package/dist/render/pointShadowImage.d.ts +265 -0
  369. package/dist/render/pointShadowImage.js +339 -0
  370. package/dist/render/pointShadowMap.d.ts +93 -0
  371. package/dist/render/pointShadowMap.js +167 -0
  372. package/dist/render/pointShadowSystem.d.ts +195 -0
  373. package/dist/render/pointShadowSystem.js +336 -0
  374. package/dist/render/prefilterEnvMap.d.ts +124 -0
  375. package/dist/render/prefilterEnvMap.js +146 -0
  376. package/dist/render/prefilterPass.d.ts +44 -0
  377. package/dist/render/prefilterPass.js +98 -0
  378. package/dist/render/probeGrid.d.ts +122 -0
  379. package/dist/render/probeGrid.js +174 -0
  380. package/dist/render/rainField.d.ts +99 -0
  381. package/dist/render/rainField.js +168 -0
  382. package/dist/render/reflectionProbe.d.ts +188 -0
  383. package/dist/render/reflectionProbe.js +437 -0
  384. package/dist/render/renderQuality.d.ts +699 -0
  385. package/dist/render/renderQuality.js +293 -0
  386. package/dist/render/rendererHarness.d.ts +39 -0
  387. package/dist/render/rendererHarness.js +185 -0
  388. package/dist/render/resolutionGovernor.d.ts +107 -0
  389. package/dist/render/resolutionGovernor.js +144 -0
  390. package/dist/render/scatterDeform.d.ts +17 -0
  391. package/dist/render/scatterDeform.js +46 -0
  392. package/dist/render/sceneTarget.d.ts +288 -0
  393. package/dist/render/sceneTarget.js +856 -0
  394. package/dist/render/screenSpaceReflection.d.ts +233 -0
  395. package/dist/render/screenSpaceReflection.js +415 -0
  396. package/dist/render/sdfFont.d.ts +77 -0
  397. package/dist/render/sdfFont.js +86 -0
  398. package/dist/render/sdfTextLayout.d.ts +46 -0
  399. package/dist/render/sdfTextLayout.js +145 -0
  400. package/dist/render/sdfTextRenderer.d.ts +75 -0
  401. package/dist/render/sdfTextRenderer.js +194 -0
  402. package/dist/render/seaState.d.ts +25 -0
  403. package/dist/render/seaState.js +34 -0
  404. package/dist/render/segmentQuads.d.ts +29 -0
  405. package/dist/render/segmentQuads.js +75 -0
  406. package/dist/render/shader.d.ts +5 -0
  407. package/dist/render/shader.js +172 -0
  408. package/dist/render/shaders/ambientOcclusion.d.ts +45 -0
  409. package/dist/render/shaders/ambientOcclusion.js +352 -0
  410. package/dist/render/shaders/arcane.d.ts +19 -0
  411. package/dist/render/shaders/arcane.js +102 -0
  412. package/dist/render/shaders/bloom.d.ts +70 -0
  413. package/dist/render/shaders/bloom.js +227 -0
  414. package/dist/render/shaders/bolt.d.ts +17 -0
  415. package/dist/render/shaders/bolt.js +161 -0
  416. package/dist/render/shaders/caustics.d.ts +38 -0
  417. package/dist/render/shaders/caustics.js +167 -0
  418. package/dist/render/shaders/conditionals.d.ts +21 -0
  419. package/dist/render/shaders/conditionals.js +55 -0
  420. package/dist/render/shaders/decalProject.d.ts +25 -0
  421. package/dist/render/shaders/decalProject.js +125 -0
  422. package/dist/render/shaders/depth.d.ts +14 -0
  423. package/dist/render/shaders/depth.js +114 -0
  424. package/dist/render/shaders/depthOfField.d.ts +41 -0
  425. package/dist/render/shaders/depthOfField.js +139 -0
  426. package/dist/render/shaders/film.d.ts +15 -0
  427. package/dist/render/shaders/film.js +283 -0
  428. package/dist/render/shaders/fire.d.ts +12 -0
  429. package/dist/render/shaders/fire.js +178 -0
  430. package/dist/render/shaders/flat/directionalShadow.d.ts +1 -0
  431. package/dist/render/shaders/flat/directionalShadow.js +195 -0
  432. package/dist/render/shaders/flat/index.d.ts +135 -0
  433. package/dist/render/shaders/flat/index.js +387 -0
  434. package/dist/render/shaders/flat/lobes.d.ts +1 -0
  435. package/dist/render/shaders/flat/lobes.js +398 -0
  436. package/dist/render/shaders/flat/main.d.ts +2 -0
  437. package/dist/render/shaders/flat/main.js +1630 -0
  438. package/dist/render/shaders/flat/pointShadow.d.ts +1 -0
  439. package/dist/render/shaders/flat/pointShadow.js +322 -0
  440. package/dist/render/shaders/flat/preamble.d.ts +15 -0
  441. package/dist/render/shaders/flat/preamble.js +864 -0
  442. package/dist/render/shaders/flat/probeGrid.d.ts +21 -0
  443. package/dist/render/shaders/flat/probeGrid.js +151 -0
  444. package/dist/render/shaders/flat/surface.d.ts +2 -0
  445. package/dist/render/shaders/flat/surface.js +40 -0
  446. package/dist/render/shaders/flock.d.ts +11 -0
  447. package/dist/render/shaders/flock.js +102 -0
  448. package/dist/render/shaders/fog.d.ts +37 -0
  449. package/dist/render/shaders/fog.js +98 -0
  450. package/dist/render/shaders/fullscreen.d.ts +16 -0
  451. package/dist/render/shaders/fullscreen.js +27 -0
  452. package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +65 -0
  453. package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +71 -0
  454. package/dist/render/shaders/generated/arcane.wgsl.d.ts +90 -0
  455. package/dist/render/shaders/generated/arcane.wgsl.js +96 -0
  456. package/dist/render/shaders/generated/bloom.wgsl.d.ts +69 -0
  457. package/dist/render/shaders/generated/bloom.wgsl.js +75 -0
  458. package/dist/render/shaders/generated/bolt.wgsl.d.ts +118 -0
  459. package/dist/render/shaders/generated/bolt.wgsl.js +124 -0
  460. package/dist/render/shaders/generated/caustics.wgsl.d.ts +118 -0
  461. package/dist/render/shaders/generated/caustics.wgsl.js +124 -0
  462. package/dist/render/shaders/generated/decalProject.wgsl.d.ts +61 -0
  463. package/dist/render/shaders/generated/decalProject.wgsl.js +67 -0
  464. package/dist/render/shaders/generated/depth.wgsl.d.ts +131 -0
  465. package/dist/render/shaders/generated/depth.wgsl.js +137 -0
  466. package/dist/render/shaders/generated/film.wgsl.d.ts +134 -0
  467. package/dist/render/shaders/generated/film.wgsl.js +140 -0
  468. package/dist/render/shaders/generated/fire.wgsl.d.ts +128 -0
  469. package/dist/render/shaders/generated/fire.wgsl.js +134 -0
  470. package/dist/render/shaders/generated/flat.wgsl.d.ts +9163 -0
  471. package/dist/render/shaders/generated/flat.wgsl.js +9192 -0
  472. package/dist/render/shaders/generated/flock.wgsl.d.ts +73 -0
  473. package/dist/render/shaders/generated/flock.wgsl.js +79 -0
  474. package/dist/render/shaders/generated/fullscreen.wgsl.d.ts +12 -0
  475. package/dist/render/shaders/generated/fullscreen.wgsl.js +18 -0
  476. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +130 -0
  477. package/dist/render/shaders/generated/globalMedium.wgsl.js +136 -0
  478. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +230 -0
  479. package/dist/render/shaders/generated/lightVolume.wgsl.js +239 -0
  480. package/dist/render/shaders/generated/line.wgsl.d.ts +128 -0
  481. package/dist/render/shaders/generated/line.wgsl.js +134 -0
  482. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +51 -0
  483. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +57 -0
  484. package/dist/render/shaders/generated/oitResolve.wgsl.d.ts +23 -0
  485. package/dist/render/shaders/generated/oitResolve.wgsl.js +29 -0
  486. package/dist/render/shaders/generated/panel.wgsl.d.ts +48 -0
  487. package/dist/render/shaders/generated/panel.wgsl.js +54 -0
  488. package/dist/render/shaders/generated/particle.wgsl.d.ts +332 -0
  489. package/dist/render/shaders/generated/particle.wgsl.js +338 -0
  490. package/dist/render/shaders/generated/prefilter.wgsl.d.ts +61 -0
  491. package/dist/render/shaders/generated/prefilter.wgsl.js +67 -0
  492. package/dist/render/shaders/generated/rush.wgsl.d.ts +131 -0
  493. package/dist/render/shaders/generated/rush.wgsl.js +137 -0
  494. package/dist/render/shaders/generated/scatter.wgsl.d.ts +195 -0
  495. package/dist/render/shaders/generated/scatter.wgsl.js +201 -0
  496. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +69 -0
  497. package/dist/render/shaders/generated/sdfText.wgsl.js +75 -0
  498. package/dist/render/shaders/generated/sky.wgsl.d.ts +100 -0
  499. package/dist/render/shaders/generated/sky.wgsl.js +106 -0
  500. package/dist/render/shaders/generated/smoke.wgsl.d.ts +85 -0
  501. package/dist/render/shaders/generated/smoke.wgsl.js +91 -0
  502. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +18 -0
  503. package/dist/render/shaders/generated/ssrResolve.wgsl.js +24 -0
  504. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +86 -0
  505. package/dist/render/shaders/generated/ssrTrace.wgsl.js +92 -0
  506. package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +46 -0
  507. package/dist/render/shaders/generated/temporalResolve.wgsl.js +52 -0
  508. package/dist/render/shaders/generated/text.wgsl.d.ts +98 -0
  509. package/dist/render/shaders/generated/text.wgsl.js +104 -0
  510. package/dist/render/shaders/generated/water.wgsl.d.ts +247 -0
  511. package/dist/render/shaders/generated/water.wgsl.js +253 -0
  512. package/dist/render/shaders/generated/windStreaks.wgsl.d.ts +73 -0
  513. package/dist/render/shaders/generated/windStreaks.wgsl.js +79 -0
  514. package/dist/render/shaders/gerstner.d.ts +21 -0
  515. package/dist/render/shaders/gerstner.js +110 -0
  516. package/dist/render/shaders/globalMedium.d.ts +56 -0
  517. package/dist/render/shaders/globalMedium.js +393 -0
  518. package/dist/render/shaders/lightVolume.d.ts +61 -0
  519. package/dist/render/shaders/lightVolume.js +527 -0
  520. package/dist/render/shaders/line.d.ts +18 -0
  521. package/dist/render/shaders/line.js +122 -0
  522. package/dist/render/shaders/morph.d.ts +26 -0
  523. package/dist/render/shaders/morph.js +61 -0
  524. package/dist/render/shaders/octahedral.d.ts +76 -0
  525. package/dist/render/shaders/octahedral.js +161 -0
  526. package/dist/render/shaders/octahedralResolve.d.ts +25 -0
  527. package/dist/render/shaders/octahedralResolve.js +81 -0
  528. package/dist/render/shaders/oitResolve.d.ts +17 -0
  529. package/dist/render/shaders/oitResolve.js +42 -0
  530. package/dist/render/shaders/outputTransform.d.ts +37 -0
  531. package/dist/render/shaders/outputTransform.js +106 -0
  532. package/dist/render/shaders/panel.d.ts +17 -0
  533. package/dist/render/shaders/panel.js +50 -0
  534. package/dist/render/shaders/particle.d.ts +82 -0
  535. package/dist/render/shaders/particle.js +431 -0
  536. package/dist/render/shaders/prefilter.d.ts +37 -0
  537. package/dist/render/shaders/prefilter.js +276 -0
  538. package/dist/render/shaders/rush.d.ts +21 -0
  539. package/dist/render/shaders/rush.js +355 -0
  540. package/dist/render/shaders/scatter.d.ts +14 -0
  541. package/dist/render/shaders/scatter.js +206 -0
  542. package/dist/render/shaders/sdfText.d.ts +9 -0
  543. package/dist/render/shaders/sdfText.js +65 -0
  544. package/dist/render/shaders/skinning.d.ts +17 -0
  545. package/dist/render/shaders/skinning.js +59 -0
  546. package/dist/render/shaders/sky.d.ts +10 -0
  547. package/dist/render/shaders/sky.js +242 -0
  548. package/dist/render/shaders/smoke.d.ts +8 -0
  549. package/dist/render/shaders/smoke.js +88 -0
  550. package/dist/render/shaders/ssrResolve.d.ts +15 -0
  551. package/dist/render/shaders/ssrResolve.js +28 -0
  552. package/dist/render/shaders/ssrTrace.d.ts +22 -0
  553. package/dist/render/shaders/ssrTrace.js +230 -0
  554. package/dist/render/shaders/tangentFrame.d.ts +17 -0
  555. package/dist/render/shaders/tangentFrame.js +70 -0
  556. package/dist/render/shaders/temporalResolve.d.ts +1 -0
  557. package/dist/render/shaders/temporalResolve.js +150 -0
  558. package/dist/render/shaders/text.d.ts +17 -0
  559. package/dist/render/shaders/text.js +155 -0
  560. package/dist/render/shaders/vertexChannel.d.ts +39 -0
  561. package/dist/render/shaders/vertexChannel.js +69 -0
  562. package/dist/render/shaders/water.d.ts +18 -0
  563. package/dist/render/shaders/water.js +354 -0
  564. package/dist/render/shaders/windStreaks.d.ts +14 -0
  565. package/dist/render/shaders/windStreaks.js +129 -0
  566. package/dist/render/shadowCasters.d.ts +107 -0
  567. package/dist/render/shadowCasters.js +1 -0
  568. package/dist/render/shadowMap.d.ts +10 -0
  569. package/dist/render/shadowMap.js +80 -0
  570. package/dist/render/shotPlacement.d.ts +80 -0
  571. package/dist/render/shotPlacement.js +183 -0
  572. package/dist/render/skinPalette.d.ts +90 -0
  573. package/dist/render/skinPalette.js +136 -0
  574. package/dist/render/ssrPass.d.ts +59 -0
  575. package/dist/render/ssrPass.js +196 -0
  576. package/dist/render/surfaceSheet.d.ts +52 -0
  577. package/dist/render/surfaceSheet.js +99 -0
  578. package/dist/render/surfaceTexture.d.ts +197 -0
  579. package/dist/render/surfaceTexture.js +116 -0
  580. package/dist/render/temporalAa.d.ts +104 -0
  581. package/dist/render/temporalAa.js +194 -0
  582. package/dist/render/temporalPass.d.ts +54 -0
  583. package/dist/render/temporalPass.js +135 -0
  584. package/dist/render/textLayout.d.ts +88 -0
  585. package/dist/render/textLayout.js +201 -0
  586. package/dist/render/textRenderer.d.ts +32 -0
  587. package/dist/render/textRenderer.js +176 -0
  588. package/dist/render/thirdPersonCamera.d.ts +272 -0
  589. package/dist/render/thirdPersonCamera.js +479 -0
  590. package/dist/render/trample.d.ts +57 -0
  591. package/dist/render/trample.js +134 -0
  592. package/dist/render/translucentQueue.d.ts +76 -0
  593. package/dist/render/translucentQueue.js +90 -0
  594. package/dist/render/uniformVectorBudget.d.ts +105 -0
  595. package/dist/render/uniformVectorBudget.js +201 -0
  596. package/dist/render/uploadStep.d.ts +14 -0
  597. package/dist/render/uploadStep.js +14 -0
  598. package/dist/render/vertexDefaults.d.ts +48 -0
  599. package/dist/render/vertexDefaults.js +111 -0
  600. package/dist/render/visibility.d.ts +22 -0
  601. package/dist/render/visibility.js +47 -0
  602. package/dist/render/waterDraw.d.ts +57 -0
  603. package/dist/render/waterDraw.js +102 -0
  604. package/dist/render/waterGrid.d.ts +62 -0
  605. package/dist/render/waterGrid.js +151 -0
  606. package/dist/render/waterRenderer.d.ts +163 -0
  607. package/dist/render/waterRenderer.js +165 -0
  608. package/dist/render/wind.d.ts +45 -0
  609. package/dist/render/wind.js +32 -0
  610. package/dist/render/windField.d.ts +34 -0
  611. package/dist/render/windField.js +13 -0
  612. package/dist/render/windStreakDraw.d.ts +73 -0
  613. package/dist/render/windStreakDraw.js +86 -0
  614. package/dist/render/windStreakRenderer.d.ts +37 -0
  615. package/dist/render/windStreakRenderer.js +86 -0
  616. package/dist/scene/node.d.ts +128 -0
  617. package/dist/scene/node.js +319 -0
  618. package/dist/scene/visit.d.ts +38 -0
  619. package/dist/scene/visit.js +43 -0
  620. package/dist/ui/clipMime.d.ts +46 -0
  621. package/dist/ui/clipMime.js +88 -0
  622. package/dist/ui/exportTarget.d.ts +305 -0
  623. package/dist/ui/exportTarget.js +368 -0
  624. package/dist/ui/frameOverlay.d.ts +59 -0
  625. package/dist/ui/frameOverlay.js +76 -0
  626. package/dist/ui/framePacer.d.ts +142 -0
  627. package/dist/ui/framePacer.js +284 -0
  628. package/dist/ui/frameRecorder.d.ts +188 -0
  629. package/dist/ui/frameRecorder.js +221 -0
  630. package/dist/ui/fullscreen.d.ts +72 -0
  631. package/dist/ui/fullscreen.js +92 -0
  632. package/dist/ui/pixelCursor.d.ts +28 -0
  633. package/dist/ui/pixelCursor.js +66 -0
  634. package/dist/ui/splash.d.ts +86 -0
  635. package/dist/ui/splash.js +300 -0
  636. package/dist/ui/stillFrame.d.ts +22 -0
  637. package/dist/ui/stillFrame.js +40 -0
  638. package/package.json +60 -0
  639. package/src/behavior/behaviorTree.ts +346 -0
  640. package/src/build/shaderComments.ts +0 -0
  641. package/src/cinematic/player.ts +209 -0
  642. package/src/cinematic/script.ts +231 -0
  643. package/src/core/bootGate.ts +49 -0
  644. package/src/core/loadTracker.ts +144 -0
  645. package/src/core/loop.ts +211 -0
  646. package/src/core/messageQueue.ts +145 -0
  647. package/src/core/onceSet.ts +65 -0
  648. package/src/core/preferences.ts +177 -0
  649. package/src/core/remoteSave.ts +347 -0
  650. package/src/core/rng.ts +101 -0
  651. package/src/core/stepBudget.ts +136 -0
  652. package/src/core/storage.ts +114 -0
  653. package/src/core/tickTrace.ts +129 -0
  654. package/src/core/timeCurve.ts +175 -0
  655. package/src/core/withDefaults.ts +28 -0
  656. package/src/dev/contactProbe.ts +115 -0
  657. package/src/dev/fpsMeter.ts +101 -0
  658. package/src/environment/celestialClock.ts +385 -0
  659. package/src/geometry/decal.ts +260 -0
  660. package/src/geometry/filmPatch.ts +158 -0
  661. package/src/geometry/growable.ts +165 -0
  662. package/src/geometry/lightVolume.ts +161 -0
  663. package/src/geometry/meshBuilder.ts +1397 -0
  664. package/src/geometry/pixelFont.ts +189 -0
  665. package/src/geometry/ribbon.ts +790 -0
  666. package/src/geometry/shellFill.ts +265 -0
  667. package/src/geometry/spline.ts +659 -0
  668. package/src/geometry/tangents.ts +173 -0
  669. package/src/geometry/textMesh.ts +96 -0
  670. package/src/geometry/treeBuilder.ts +114 -0
  671. package/src/host/display.ts +180 -0
  672. package/src/host/files.ts +77 -0
  673. package/src/host/lifecycle.ts +63 -0
  674. package/src/host/platformServices.ts +23 -0
  675. package/src/host/screen.ts +134 -0
  676. package/src/index.ts +730 -0
  677. package/src/input/actionMap.ts +377 -0
  678. package/src/input/activeDevice.ts +86 -0
  679. package/src/input/gamepadIdentity.ts +131 -0
  680. package/src/input/gamepadMapping.ts +121 -0
  681. package/src/input/input.ts +872 -0
  682. package/src/input/inputHarness.ts +226 -0
  683. package/src/input/rightGesture.ts +76 -0
  684. package/src/input/rumble.ts +138 -0
  685. package/src/input/touchControls.ts +451 -0
  686. package/src/input/typingTarget.ts +26 -0
  687. package/src/math/bounds.ts +153 -0
  688. package/src/math/color.ts +37 -0
  689. package/src/math/exact.ts +274 -0
  690. package/src/math/frustum.ts +115 -0
  691. package/src/math/intersect.ts +228 -0
  692. package/src/math/scalar.ts +109 -0
  693. package/src/math/spring.ts +106 -0
  694. package/src/nav/navGraph.ts +168 -0
  695. package/src/nav/navPath.ts +217 -0
  696. package/src/nav/navSearch.ts +200 -0
  697. package/src/physics/boxSurface.ts +96 -0
  698. package/src/physics/colliderSurface.ts +213 -0
  699. package/src/physics/compositeSurface.ts +111 -0
  700. package/src/physics/heightSurface.ts +234 -0
  701. package/src/physics/ribbonSurface.ts +642 -0
  702. package/src/render/ambientOcclusionPass.ts +200 -0
  703. package/src/render/areaLights.ts +194 -0
  704. package/src/render/areaShadowSet.ts +405 -0
  705. package/src/render/atmosphere.ts +186 -0
  706. package/src/render/backend/api.ts +802 -0
  707. package/src/render/backend/budget.ts +139 -0
  708. package/src/render/backend/createRenderer.ts +343 -0
  709. package/src/render/backend/deadline.ts +37 -0
  710. package/src/render/backend/probe.ts +152 -0
  711. package/src/render/backend/select.ts +288 -0
  712. package/src/render/backend/timer.ts +59 -0
  713. package/src/render/backend/webgl2/instanced.ts +46 -0
  714. package/src/render/backend/webgl2/morphTexture.ts +58 -0
  715. package/src/render/backend/webgl2/renderer.ts +7484 -0
  716. package/src/render/backend/webgl2/skinPaletteTexture.ts +70 -0
  717. package/src/render/backend/webgpu/boltPass.ts +205 -0
  718. package/src/render/backend/webgpu/buffers.ts +553 -0
  719. package/src/render/backend/webgpu/causticsPass.ts +174 -0
  720. package/src/render/backend/webgpu/clusterBinner.ts +259 -0
  721. package/src/render/backend/webgpu/depthPass.ts +261 -0
  722. package/src/render/backend/webgpu/device.ts +148 -0
  723. package/src/render/backend/webgpu/drawCommand.ts +79 -0
  724. package/src/render/backend/webgpu/environmentTexels.ts +96 -0
  725. package/src/render/backend/webgpu/filmPass.ts +123 -0
  726. package/src/render/backend/webgpu/flatPass.ts +635 -0
  727. package/src/render/backend/webgpu/flockPass.ts +163 -0
  728. package/src/render/backend/webgpu/gpuTimestamps.ts +255 -0
  729. package/src/render/backend/webgpu/insetPass.ts +123 -0
  730. package/src/render/backend/webgpu/instanced.ts +55 -0
  731. package/src/render/backend/webgpu/lightVolumePass.ts +203 -0
  732. package/src/render/backend/webgpu/linePass.ts +270 -0
  733. package/src/render/backend/webgpu/morphTexture.ts +61 -0
  734. package/src/render/backend/webgpu/panelPass.ts +138 -0
  735. package/src/render/backend/webgpu/particlePass.ts +370 -0
  736. package/src/render/backend/webgpu/pipelineCache.ts +152 -0
  737. package/src/render/backend/webgpu/plumePass.ts +292 -0
  738. package/src/render/backend/webgpu/pointShadowPass.ts +368 -0
  739. package/src/render/backend/webgpu/postPass.ts +470 -0
  740. package/src/render/backend/webgpu/probePass.ts +218 -0
  741. package/src/render/backend/webgpu/reflectionPass.ts +137 -0
  742. package/src/render/backend/webgpu/renderer.ts +13004 -0
  743. package/src/render/backend/webgpu/scatterPass.ts +354 -0
  744. package/src/render/backend/webgpu/sdfTextPass.ts +220 -0
  745. package/src/render/backend/webgpu/shaderModules.ts +49 -0
  746. package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +219 -0
  747. package/src/render/backend/webgpu/skinPaletteRing.ts +105 -0
  748. package/src/render/backend/webgpu/skinPaletteTexture.ts +79 -0
  749. package/src/render/backend/webgpu/skyPass.ts +85 -0
  750. package/src/render/backend/webgpu/surfaceTexturePass.ts +257 -0
  751. package/src/render/backend/webgpu/textPass.ts +224 -0
  752. package/src/render/backend/webgpu/uniformRing.ts +228 -0
  753. package/src/render/backend/webgpu/waterPass.ts +211 -0
  754. package/src/render/backend/webgpu/windStreakPass.ts +196 -0
  755. package/src/render/billboard.ts +108 -0
  756. package/src/render/bloomChain.ts +101 -0
  757. package/src/render/bloomPass.ts +256 -0
  758. package/src/render/boltBatch.ts +141 -0
  759. package/src/render/boltPool.ts +360 -0
  760. package/src/render/boom.ts +123 -0
  761. package/src/render/camera.ts +348 -0
  762. package/src/render/causticsRenderer.ts +171 -0
  763. package/src/render/cinematicCamera.ts +278 -0
  764. package/src/render/clusteredLights.ts +598 -0
  765. package/src/render/colourGrade.ts +109 -0
  766. package/src/render/compute.ts +83 -0
  767. package/src/render/contextLoss.ts +50 -0
  768. package/src/render/debugLines.ts +411 -0
  769. package/src/render/decalPass.ts +124 -0
  770. package/src/render/decalProjector.ts +390 -0
  771. package/src/render/decalQueue.ts +110 -0
  772. package/src/render/depthConvention.ts +383 -0
  773. package/src/render/drawingBuffer.ts +89 -0
  774. package/src/render/emptyTexture.ts +130 -0
  775. package/src/render/envProbeArray.ts +201 -0
  776. package/src/render/equirectToCube.ts +160 -0
  777. package/src/render/flockGeometry.ts +53 -0
  778. package/src/render/flockRenderer.ts +111 -0
  779. package/src/render/frame/arena.ts +93 -0
  780. package/src/render/frame/index.ts +29 -0
  781. package/src/render/frame/replay.ts +50 -0
  782. package/src/render/frame/resources.ts +61 -0
  783. package/src/render/frame/schedule.ts +85 -0
  784. package/src/render/frameView.ts +20 -0
  785. package/src/render/gizmo.ts +923 -0
  786. package/src/render/globalMedium.ts +154 -0
  787. package/src/render/globalMediumPass.ts +323 -0
  788. package/src/render/gpuCapability.ts +244 -0
  789. package/src/render/gpuTimer.ts +182 -0
  790. package/src/render/halfFloat.ts +39 -0
  791. package/src/render/handleRegistry.ts +96 -0
  792. package/src/render/iesProfile.ts +215 -0
  793. package/src/render/imageTexels.ts +109 -0
  794. package/src/render/instancedMesh.ts +187 -0
  795. package/src/render/instances.ts +92 -0
  796. package/src/render/lightBudget.ts +655 -0
  797. package/src/render/lightMatrix.ts +69 -0
  798. package/src/render/lightVolumeDraw.ts +216 -0
  799. package/src/render/lineBatch.ts +180 -0
  800. package/src/render/linePoints.ts +61 -0
  801. package/src/render/livePointShadowSet.ts +285 -0
  802. package/src/render/lod.ts +86 -0
  803. package/src/render/mesh.ts +536 -0
  804. package/src/render/occlusion.ts +406 -0
  805. package/src/render/oitPass.ts +230 -0
  806. package/src/render/orderIndependent.ts +136 -0
  807. package/src/render/particleBatch.ts +299 -0
  808. package/src/render/particleMaterial.ts +84 -0
  809. package/src/render/particlePool.ts +291 -0
  810. package/src/render/pass.ts +203 -0
  811. package/src/render/passTarget.ts +225 -0
  812. package/src/render/pickable.ts +222 -0
  813. package/src/render/planarReflection.ts +233 -0
  814. package/src/render/planarReflectionDraw.ts +87 -0
  815. package/src/render/plumeGeometry.ts +75 -0
  816. package/src/render/plumeMaterial.ts +99 -0
  817. package/src/render/plumeRenderer.ts +272 -0
  818. package/src/render/pointLightSelection.ts +447 -0
  819. package/src/render/pointShadowArray.ts +276 -0
  820. package/src/render/pointShadowBudget.ts +305 -0
  821. package/src/render/pointShadowImage.ts +470 -0
  822. package/src/render/pointShadowMap.ts +228 -0
  823. package/src/render/pointShadowSystem.ts +408 -0
  824. package/src/render/prefilterEnvMap.ts +162 -0
  825. package/src/render/prefilterPass.ts +115 -0
  826. package/src/render/probeGrid.ts +248 -0
  827. package/src/render/rainField.ts +240 -0
  828. package/src/render/reflectionProbe.ts +530 -0
  829. package/src/render/renderQuality.ts +1054 -0
  830. package/src/render/rendererHarness.ts +214 -0
  831. package/src/render/resolutionGovernor.ts +189 -0
  832. package/src/render/scatterDeform.ts +72 -0
  833. package/src/render/sceneTarget.ts +1032 -0
  834. package/src/render/screenSpaceReflection.ts +524 -0
  835. package/src/render/sdfFont.ts +157 -0
  836. package/src/render/sdfTextLayout.ts +206 -0
  837. package/src/render/sdfTextRenderer.ts +233 -0
  838. package/src/render/seaState.ts +55 -0
  839. package/src/render/segmentQuads.ts +92 -0
  840. package/src/render/shader.ts +190 -0
  841. package/src/render/shaders/ambientOcclusion.ts +354 -0
  842. package/src/render/shaders/arcane.ts +103 -0
  843. package/src/render/shaders/bloom.ts +232 -0
  844. package/src/render/shaders/bolt.ts +164 -0
  845. package/src/render/shaders/caustics.ts +169 -0
  846. package/src/render/shaders/conditionals.ts +58 -0
  847. package/src/render/shaders/decalProject.ts +127 -0
  848. package/src/render/shaders/depth.ts +131 -0
  849. package/src/render/shaders/depthOfField.ts +141 -0
  850. package/src/render/shaders/film.ts +285 -0
  851. package/src/render/shaders/fire.ts +180 -0
  852. package/src/render/shaders/flat/directionalShadow.ts +196 -0
  853. package/src/render/shaders/flat/index.ts +502 -0
  854. package/src/render/shaders/flat/lobes.ts +399 -0
  855. package/src/render/shaders/flat/main.ts +1631 -0
  856. package/src/render/shaders/flat/pointShadow.ts +323 -0
  857. package/src/render/shaders/flat/preamble.ts +875 -0
  858. package/src/render/shaders/flat/probeGrid.ts +152 -0
  859. package/src/render/shaders/flat/surface.ts +41 -0
  860. package/src/render/shaders/flock.ts +103 -0
  861. package/src/render/shaders/fog.ts +99 -0
  862. package/src/render/shaders/fullscreen.ts +28 -0
  863. package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +74 -0
  864. package/src/render/shaders/generated/arcane.wgsl.ts +98 -0
  865. package/src/render/shaders/generated/bloom.wgsl.ts +79 -0
  866. package/src/render/shaders/generated/bolt.wgsl.ts +127 -0
  867. package/src/render/shaders/generated/caustics.wgsl.ts +127 -0
  868. package/src/render/shaders/generated/decalProject.wgsl.ts +69 -0
  869. package/src/render/shaders/generated/depth.wgsl.ts +142 -0
  870. package/src/render/shaders/generated/film.wgsl.ts +143 -0
  871. package/src/render/shaders/generated/fire.wgsl.ts +137 -0
  872. package/src/render/shaders/generated/flat.wgsl.ts +9195 -0
  873. package/src/render/shaders/generated/flock.wgsl.ts +82 -0
  874. package/src/render/shaders/generated/fullscreen.wgsl.ts +20 -0
  875. package/src/render/shaders/generated/globalMedium.wgsl.ts +139 -0
  876. package/src/render/shaders/generated/lightVolume.wgsl.ts +242 -0
  877. package/src/render/shaders/generated/line.wgsl.ts +137 -0
  878. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +60 -0
  879. package/src/render/shaders/generated/oitResolve.wgsl.ts +31 -0
  880. package/src/render/shaders/generated/panel.wgsl.ts +57 -0
  881. package/src/render/shaders/generated/particle.wgsl.ts +343 -0
  882. package/src/render/shaders/generated/prefilter.wgsl.ts +69 -0
  883. package/src/render/shaders/generated/rush.wgsl.ts +139 -0
  884. package/src/render/shaders/generated/scatter.wgsl.ts +205 -0
  885. package/src/render/shaders/generated/sdfText.wgsl.ts +78 -0
  886. package/src/render/shaders/generated/sky.wgsl.ts +109 -0
  887. package/src/render/shaders/generated/smoke.wgsl.ts +93 -0
  888. package/src/render/shaders/generated/ssrResolve.wgsl.ts +26 -0
  889. package/src/render/shaders/generated/ssrTrace.wgsl.ts +94 -0
  890. package/src/render/shaders/generated/temporalResolve.wgsl.ts +54 -0
  891. package/src/render/shaders/generated/text.wgsl.ts +107 -0
  892. package/src/render/shaders/generated/water.wgsl.ts +256 -0
  893. package/src/render/shaders/generated/windStreaks.wgsl.ts +82 -0
  894. package/src/render/shaders/gerstner.ts +110 -0
  895. package/src/render/shaders/globalMedium.ts +396 -0
  896. package/src/render/shaders/lightVolume.ts +546 -0
  897. package/src/render/shaders/line.ts +125 -0
  898. package/src/render/shaders/morph.ts +62 -0
  899. package/src/render/shaders/octahedral.ts +170 -0
  900. package/src/render/shaders/octahedralResolve.ts +83 -0
  901. package/src/render/shaders/oitResolve.ts +42 -0
  902. package/src/render/shaders/outputTransform.ts +107 -0
  903. package/src/render/shaders/panel.ts +51 -0
  904. package/src/render/shaders/particle.ts +438 -0
  905. package/src/render/shaders/prefilter.ts +278 -0
  906. package/src/render/shaders/rush.ts +357 -0
  907. package/src/render/shaders/scatter.ts +211 -0
  908. package/src/render/shaders/sdfText.ts +68 -0
  909. package/src/render/shaders/skinning.ts +59 -0
  910. package/src/render/shaders/sky.ts +243 -0
  911. package/src/render/shaders/smoke.ts +89 -0
  912. package/src/render/shaders/ssrResolve.ts +28 -0
  913. package/src/render/shaders/ssrTrace.ts +233 -0
  914. package/src/render/shaders/tangentFrame.ts +70 -0
  915. package/src/render/shaders/temporalResolve.ts +151 -0
  916. package/src/render/shaders/text.ts +156 -0
  917. package/src/render/shaders/vertexChannel.ts +71 -0
  918. package/src/render/shaders/water.ts +356 -0
  919. package/src/render/shaders/windStreaks.ts +130 -0
  920. package/src/render/shadowCasters.ts +124 -0
  921. package/src/render/shadowMap.ts +89 -0
  922. package/src/render/shotPlacement.ts +266 -0
  923. package/src/render/skinPalette.ts +157 -0
  924. package/src/render/ssrPass.ts +241 -0
  925. package/src/render/surfaceSheet.ts +158 -0
  926. package/src/render/surfaceTexture.ts +310 -0
  927. package/src/render/temporalAa.ts +221 -0
  928. package/src/render/temporalPass.ts +153 -0
  929. package/src/render/textLayout.ts +239 -0
  930. package/src/render/textRenderer.ts +201 -0
  931. package/src/render/thirdPersonCamera.ts +578 -0
  932. package/src/render/trample.ts +140 -0
  933. package/src/render/translucentQueue.ts +161 -0
  934. package/src/render/uniformVectorBudget.ts +246 -0
  935. package/src/render/uploadStep.ts +14 -0
  936. package/src/render/vertexDefaults.ts +115 -0
  937. package/src/render/visibility.ts +56 -0
  938. package/src/render/waterDraw.ts +167 -0
  939. package/src/render/waterGrid.ts +180 -0
  940. package/src/render/waterRenderer.ts +352 -0
  941. package/src/render/wind.ts +79 -0
  942. package/src/render/windField.ts +50 -0
  943. package/src/render/windStreakDraw.ts +131 -0
  944. package/src/render/windStreakRenderer.ts +130 -0
  945. package/src/scene/node.ts +336 -0
  946. package/src/scene/visit.ts +82 -0
  947. package/src/ui/clipMime.ts +109 -0
  948. package/src/ui/exportTarget.ts +491 -0
  949. package/src/ui/frameOverlay.ts +159 -0
  950. package/src/ui/framePacer.ts +351 -0
  951. package/src/ui/frameRecorder.ts +333 -0
  952. package/src/ui/fullscreen.ts +113 -0
  953. package/src/ui/pixelCursor.ts +99 -0
  954. package/src/ui/splash.ts +347 -0
  955. package/src/ui/stillFrame.ts +44 -0
@@ -0,0 +1,659 @@
1
+ /**
2
+ * An arc-length parameterised curve with a rotation-minimising frame — the
3
+ * spine every banked surface in the engine is built on.
4
+ *
5
+ * Two properties do all the work, and both are the difference between a track
6
+ * and a mess:
7
+ *
8
+ * **Sampled by distance, not by parameter.** A Catmull-Rom curve evaluated at
9
+ * evenly spaced `t` bunches its samples where the curve is tight and stretches
10
+ * them on the straights. A surface built that way has triangles the size of a
11
+ * room on the fast sections and a width that pulses through every bend.
12
+ *
13
+ * **The frame is transported, not recomputed.** Deriving an up-vector from
14
+ * world up at each sample flips it the moment the tangent passes vertical, and
15
+ * the surface turns inside out for one segment — a hole that appears on exactly
16
+ * one shape and is invisible everywhere else. Carrying the frame forward from
17
+ * the previous sample cannot flip, because there is nothing to flip relative to.
18
+ *
19
+ * The engine never learns what this curve is *for*. It takes numbers.
20
+ */
21
+ import type { Vec3 } from '../math/color.ts';
22
+
23
+ export interface SplinePoint {
24
+ x: number;
25
+ y: number;
26
+ z: number;
27
+ /**
28
+ * Roll about the direction of travel, radians. Positive lifts the right-hand
29
+ * edge — the bank of a left-hand corner.
30
+ */
31
+ bankRad: number;
32
+ /** Full width of the surface here, metres. */
33
+ widthM: number;
34
+ }
35
+
36
+ /**
37
+ * One evaluated point. Written into by `sampleAt`, never returned, because this
38
+ * runs inside the fixed tick.
39
+ */
40
+ export interface SplineSample {
41
+ x: number;
42
+ y: number;
43
+ z: number;
44
+ /** Unit direction of travel. */
45
+ tangentX: number;
46
+ tangentY: number;
47
+ tangentZ: number;
48
+ /** Unit surface up, after banking. */
49
+ normalX: number;
50
+ normalY: number;
51
+ normalZ: number;
52
+ /** Unit across-surface, after banking. Points to the character's right. */
53
+ rightX: number;
54
+ rightY: number;
55
+ rightZ: number;
56
+ bankRad: number;
57
+ widthM: number;
58
+ }
59
+
60
+ export function createSplineSample(): SplineSample {
61
+ return {
62
+ x: 0,
63
+ y: 0,
64
+ z: 0,
65
+ tangentX: 1,
66
+ tangentY: 0,
67
+ tangentZ: 0,
68
+ normalX: 0,
69
+ normalY: 1,
70
+ normalZ: 0,
71
+ rightX: 0,
72
+ rightY: 0,
73
+ rightZ: 1,
74
+ bankRad: 0,
75
+ widthM: 0,
76
+ };
77
+ }
78
+
79
+ /**
80
+ * Target spacing of the internal arc-length table.
81
+ *
82
+ * Fine enough that interpolating the curve parameter within one cell is
83
+ * indistinguishable from solving for it, and coarse enough that a 400 m track
84
+ * costs a few thousand entries.
85
+ */
86
+ const TABLE_STEP_M = 0.25;
87
+ const MIN_STEPS_PER_SEGMENT = 4;
88
+ /** Centripetal parameterisation: the exponent that avoids cusps and loops. */
89
+ const KNOT_ALPHA = 0.5;
90
+ /** Chord length below which two control points count as the same place. */
91
+ const DEGENERATE_CHORD = 1e-6;
92
+ /** Parameter offset used for the finite-difference tangent. */
93
+ const TANGENT_DU = 1e-3;
94
+
95
+ /** One component of a centripetal Catmull-Rom, via Barry–Goldman. */
96
+ function barryGoldman(
97
+ p0: number,
98
+ p1: number,
99
+ p2: number,
100
+ p3: number,
101
+ t0: number,
102
+ t1: number,
103
+ t2: number,
104
+ t3: number,
105
+ t: number,
106
+ ): number {
107
+ const a1 = ((t1 - t) * p0 + (t - t0) * p1) / (t1 - t0);
108
+ const a2 = ((t2 - t) * p1 + (t - t1) * p2) / (t2 - t1);
109
+ const a3 = ((t3 - t) * p2 + (t - t2) * p3) / (t3 - t2);
110
+ const b1 = ((t2 - t) * a1 + (t - t0) * a2) / (t2 - t0);
111
+ const b2 = ((t3 - t) * a2 + (t - t1) * a3) / (t3 - t1);
112
+ return ((t2 - t) * b1 + (t - t1) * b2) / (t2 - t1);
113
+ }
114
+
115
+ function smoothstep01(u: number): number {
116
+ return u * u * (3 - 2 * u);
117
+ }
118
+
119
+ export class Spline {
120
+ private readonly px: Float64Array;
121
+ private readonly py: Float64Array;
122
+ private readonly pz: Float64Array;
123
+ private readonly bank: Float64Array;
124
+ private readonly width: Float64Array;
125
+ /** Number of curve segments: one fewer than the control points. */
126
+ private readonly segments: number;
127
+
128
+ /**
129
+ * The control points with a reflected phantom at each end, so a segment reads its
130
+ * four points as `ex[s] … ex[s + 3]` with no bounds test and no end case.
131
+ *
132
+ * The reflection is what makes the curve reach its own endpoints rather than
133
+ * stopping one control point short, and it used to be recomputed — with its two
134
+ * branches — inside every evaluation. It is a property of the point list, so it is
135
+ * computed once with the point list.
136
+ */
137
+ private readonly ex: Float64Array;
138
+ private readonly ey: Float64Array;
139
+ private readonly ez: Float64Array;
140
+
141
+ /**
142
+ * Centripetal knots per segment, as the three non-zero values: `t0` is always 0.
143
+ *
144
+ * These cost three `hypot`s and three square roots, and they depend only on which
145
+ * segment you are in — never on where you are inside it. Evaluating the curve
146
+ * recomputed them every time regardless, which was the single most expensive thing
147
+ * the engine did: **`sampleAt` alone evaluates three times** (the point, and one
148
+ * either side for the central-difference tangent), so one sample paid for nine of
149
+ * each. The arc-length table is thousands of evaluations per curve, `buildRibbon`
150
+ * is thousands more, and the simulation samples the route every tick.
151
+ *
152
+ * Hoisting them changes no arithmetic: the same expression on the same inputs, run
153
+ * once per segment instead of once per ask.
154
+ */
155
+ private readonly knot1: Float64Array;
156
+ private readonly knot2: Float64Array;
157
+ private readonly knot3: Float64Array;
158
+
159
+ /** Arc-length table, in parallel columns. */
160
+ private readonly tableParam: Float64Array;
161
+ private readonly tableDist: Float64Array;
162
+ private readonly tableX: Float64Array;
163
+ private readonly tableY: Float64Array;
164
+ private readonly tableZ: Float64Array;
165
+ private readonly tableUpX: Float64Array;
166
+ private readonly tableUpY: Float64Array;
167
+ private readonly tableUpZ: Float64Array;
168
+ private readonly length: number;
169
+
170
+ constructor(points: readonly SplinePoint[]) {
171
+ const count = points.length;
172
+ this.px = new Float64Array(Math.max(count, 1));
173
+ this.py = new Float64Array(Math.max(count, 1));
174
+ this.pz = new Float64Array(Math.max(count, 1));
175
+ this.bank = new Float64Array(Math.max(count, 1));
176
+ this.width = new Float64Array(Math.max(count, 1));
177
+ for (let i = 0; i < count; i++) {
178
+ const p = points[i] as SplinePoint;
179
+ this.px[i] = p.x;
180
+ this.py[i] = p.y;
181
+ this.pz[i] = p.z;
182
+ this.bank[i] = p.bankRad;
183
+ this.width[i] = p.widthM;
184
+ }
185
+ this.segments = Math.max(count - 1, 0);
186
+
187
+ // --- Phantom ends and knots -------------------------------------------
188
+ // Four entries even for a curve with no segments, so nothing here can read past
189
+ // its own array. A single point reflects onto itself, which is the same
190
+ // degenerate answer the branched form gave.
191
+ const extended = Math.max(count + 2, 4);
192
+ this.ex = new Float64Array(extended);
193
+ this.ey = new Float64Array(extended);
194
+ this.ez = new Float64Array(extended);
195
+ for (let i = 0; i < count; i++) {
196
+ this.ex[i + 1] = this.px[i] as number;
197
+ this.ey[i + 1] = this.py[i] as number;
198
+ this.ez[i + 1] = this.pz[i] as number;
199
+ }
200
+ if (count < 2) {
201
+ const x = this.px[0] ?? 0;
202
+ const y = this.py[0] ?? 0;
203
+ const z = this.pz[0] ?? 0;
204
+ this.ex.fill(x);
205
+ this.ey.fill(y);
206
+ this.ez.fill(z);
207
+ } else {
208
+ this.ex[0] = 2 * (this.px[0] as number) - (this.px[1] as number);
209
+ this.ey[0] = 2 * (this.py[0] as number) - (this.py[1] as number);
210
+ this.ez[0] = 2 * (this.pz[0] as number) - (this.pz[1] as number);
211
+ const last = count - 1;
212
+ this.ex[count + 1] = 2 * (this.px[last] as number) - (this.px[last - 1] as number);
213
+ this.ey[count + 1] = 2 * (this.py[last] as number) - (this.py[last - 1] as number);
214
+ this.ez[count + 1] = 2 * (this.pz[last] as number) - (this.pz[last - 1] as number);
215
+ }
216
+
217
+ this.knot1 = new Float64Array(Math.max(this.segments, 1));
218
+ this.knot2 = new Float64Array(Math.max(this.segments, 1));
219
+ this.knot3 = new Float64Array(Math.max(this.segments, 1));
220
+ for (let s = 0; s < this.segments; s++) {
221
+ // Every gap is floored: a repeated control point would otherwise divide by
222
+ // zero and take the whole track with it.
223
+ const k1 = Math.max(
224
+ Math.hypot(
225
+ (this.ex[s + 1] as number) - (this.ex[s] as number),
226
+ (this.ey[s + 1] as number) - (this.ey[s] as number),
227
+ (this.ez[s + 1] as number) - (this.ez[s] as number),
228
+ ) ** KNOT_ALPHA,
229
+ DEGENERATE_CHORD,
230
+ );
231
+ const k2 =
232
+ k1 +
233
+ Math.max(
234
+ Math.hypot(
235
+ (this.ex[s + 2] as number) - (this.ex[s + 1] as number),
236
+ (this.ey[s + 2] as number) - (this.ey[s + 1] as number),
237
+ (this.ez[s + 2] as number) - (this.ez[s + 1] as number),
238
+ ) ** KNOT_ALPHA,
239
+ DEGENERATE_CHORD,
240
+ );
241
+ this.knot1[s] = k1;
242
+ this.knot2[s] = k2;
243
+ this.knot3[s] =
244
+ k2 +
245
+ Math.max(
246
+ Math.hypot(
247
+ (this.ex[s + 3] as number) - (this.ex[s + 2] as number),
248
+ (this.ey[s + 3] as number) - (this.ey[s + 2] as number),
249
+ (this.ez[s + 3] as number) - (this.ez[s + 2] as number),
250
+ ) ** KNOT_ALPHA,
251
+ DEGENERATE_CHORD,
252
+ );
253
+ }
254
+
255
+ // --- Arc-length table -------------------------------------------------
256
+ // Step counts first, so the columns can be sized exactly rather than grown.
257
+ let total = 1;
258
+ const stepsPerSegment = new Int32Array(Math.max(this.segments, 1));
259
+ for (let s = 0; s < this.segments; s++) {
260
+ const chord = Math.hypot(
261
+ (this.px[s + 1] ?? 0) - (this.px[s] ?? 0),
262
+ (this.py[s + 1] ?? 0) - (this.py[s] ?? 0),
263
+ (this.pz[s + 1] ?? 0) - (this.pz[s] ?? 0),
264
+ );
265
+ const steps = Math.max(MIN_STEPS_PER_SEGMENT, Math.ceil(chord / TABLE_STEP_M));
266
+ stepsPerSegment[s] = steps;
267
+ total += steps;
268
+ }
269
+
270
+ this.tableParam = new Float64Array(total);
271
+ this.tableDist = new Float64Array(total);
272
+ this.tableX = new Float64Array(total);
273
+ this.tableY = new Float64Array(total);
274
+ this.tableZ = new Float64Array(total);
275
+ this.tableUpX = new Float64Array(total);
276
+ this.tableUpY = new Float64Array(total);
277
+ this.tableUpZ = new Float64Array(total);
278
+
279
+ let n = 0;
280
+ let dist = 0;
281
+ let lastX = 0;
282
+ let lastY = 0;
283
+ let lastZ = 0;
284
+ for (let s = 0; s < this.segments; s++) {
285
+ const steps = stepsPerSegment[s] ?? MIN_STEPS_PER_SEGMENT;
286
+ for (let k = s === 0 ? 0 : 1; k <= steps; k++) {
287
+ const u = k / steps;
288
+ this.evaluate(s, u, TEMP);
289
+ if (n > 0) dist += Math.hypot(TEMP[0] - lastX, TEMP[1] - lastY, TEMP[2] - lastZ);
290
+ this.tableParam[n] = s + u;
291
+ this.tableDist[n] = dist;
292
+ this.tableX[n] = TEMP[0] as number;
293
+ this.tableY[n] = TEMP[1] as number;
294
+ this.tableZ[n] = TEMP[2] as number;
295
+ lastX = TEMP[0] as number;
296
+ lastY = TEMP[1] as number;
297
+ lastZ = TEMP[2] as number;
298
+ n++;
299
+ }
300
+ }
301
+ if (this.segments === 0) {
302
+ this.tableParam[0] = 0;
303
+ this.tableDist[0] = 0;
304
+ this.tableX[0] = this.px[0] ?? 0;
305
+ this.tableY[0] = this.py[0] ?? 0;
306
+ this.tableZ[0] = this.pz[0] ?? 0;
307
+ n = 1;
308
+ }
309
+ /*
310
+ * A curve through coincident control points has a length of a few floating
311
+ * point crumbs rather than exactly zero, and every consumer that loops
312
+ * `for (d = 0; d < length; d += step)` would build one degenerate
313
+ * cross-section from it. Floor it: below a micrometre this is a point.
314
+ */
315
+ const measured = this.tableDist[n - 1] ?? 0;
316
+ this.length = measured < DEGENERATE_CHORD ? 0 : measured;
317
+
318
+ this.transportFrames(n);
319
+ }
320
+
321
+ get lengthM(): number {
322
+ return this.length;
323
+ }
324
+
325
+ /** Control points, for callers that need the authored shape back. */
326
+ get pointCount(): number {
327
+ return this.segments + 1;
328
+ }
329
+
330
+ /**
331
+ * Where an arc length falls in control-point terms: `index + fraction`.
332
+ *
333
+ * The inverse of `distanceAtPoint`, for a caller that measured something along
334
+ * the curve and needs to write the answer back onto the points that produced it.
335
+ * The fraction matters as much as the index — bank and width are blended between
336
+ * two control points, so attributing a measurement to one of them without
337
+ * knowing which one dominates there gets the wrong point by half the time.
338
+ */
339
+ pointParamAt(distanceM: number): number {
340
+ if (this.segments === 0) return 0;
341
+ const d = Math.min(Math.max(distanceM, 0), this.length);
342
+ const i = Math.min(this.findCell(d), this.tableParam.length - 1);
343
+ return Math.min(this.tableParam[i] ?? 0, this.segments);
344
+ }
345
+
346
+ /**
347
+ * Arc length at control point `index`.
348
+ *
349
+ * A generator authors in control points — "the gap runs from the sixth point
350
+ * to the eighth" — but everything downstream is in metres, and the conversion
351
+ * is only knowable once the curve exists. Without this the caller has to
352
+ * guess, and a guessed hole is a hole in the wrong place.
353
+ */
354
+ distanceAtPoint(index: number): number {
355
+ if (this.segments === 0) return 0;
356
+ const target = Math.min(Math.max(index, 0), this.segments);
357
+ // The table always contains an entry at each integer parameter, because
358
+ // every segment is walked from its own u = 0.
359
+ let lo = 0;
360
+ let hi = this.tableParam.length - 1;
361
+ while (lo < hi) {
362
+ const mid = (lo + hi) >> 1;
363
+ if ((this.tableParam[mid] ?? 0) < target - 1e-9) lo = mid + 1;
364
+ else hi = mid;
365
+ }
366
+ return this.tableDist[lo] ?? 0;
367
+ }
368
+
369
+ /**
370
+ * Carry an up-vector along the curve rather than deriving one at each sample.
371
+ *
372
+ * Each step rotates the previous up by the rotation that takes the previous
373
+ * tangent onto this one — the discrete rotation-minimising frame. On a planar
374
+ * curve it holds up exactly constant; through a climb past vertical it simply
375
+ * follows, because it never consults world up again after the first sample.
376
+ */
377
+ private transportFrames(count: number): void {
378
+ if (count === 0) return;
379
+
380
+ this.tangentAt(0, count, TEMP);
381
+ let tx = TEMP[0] as number;
382
+ let ty = TEMP[1] as number;
383
+ let tz = TEMP[2] as number;
384
+
385
+ // Seed from world up, or from world forward where the curve starts
386
+ // vertical and world up would give nothing to cross with.
387
+ let ux = 0;
388
+ let uy = 1;
389
+ let uz = 0;
390
+ if (Math.abs(ty) > 0.999) {
391
+ ux = 0;
392
+ uy = 0;
393
+ uz = 1;
394
+ }
395
+ let dot = ux * tx + uy * ty + uz * tz;
396
+ ux -= tx * dot;
397
+ uy -= ty * dot;
398
+ uz -= tz * dot;
399
+ let inv = 1 / (Math.hypot(ux, uy, uz) || 1);
400
+ ux *= inv;
401
+ uy *= inv;
402
+ uz *= inv;
403
+ this.tableUpX[0] = ux;
404
+ this.tableUpY[0] = uy;
405
+ this.tableUpZ[0] = uz;
406
+
407
+ for (let i = 1; i < count; i++) {
408
+ this.tangentAt(i, count, TEMP);
409
+ const nx = TEMP[0] as number;
410
+ const ny = TEMP[1] as number;
411
+ const nz = TEMP[2] as number;
412
+
413
+ // Rodrigues about (previous tangent × this tangent), by the angle
414
+ // between them. Degenerate when they are parallel, which is the common
415
+ // case on a straight — hence the guard rather than a branchless form.
416
+ const ax = ty * nz - tz * ny;
417
+ const ay = tz * nx - tx * nz;
418
+ const az = tx * ny - ty * nx;
419
+ const sin = Math.hypot(ax, ay, az);
420
+ if (sin > 1e-9) {
421
+ const cos = tx * nx + ty * ny + tz * nz;
422
+ const kx = ax / sin;
423
+ const ky = ay / sin;
424
+ const kz = az / sin;
425
+ const kDotU = kx * ux + ky * uy + kz * uz;
426
+ const cx = ky * uz - kz * uy;
427
+ const cy = kz * ux - kx * uz;
428
+ const cz = kx * uy - ky * ux;
429
+ const rx = ux * cos + cx * sin + kx * kDotU * (1 - cos);
430
+ const ry = uy * cos + cy * sin + ky * kDotU * (1 - cos);
431
+ const rz = uz * cos + cz * sin + kz * kDotU * (1 - cos);
432
+ ux = rx;
433
+ uy = ry;
434
+ uz = rz;
435
+ }
436
+
437
+ // Re-orthogonalise every step. Without it the transported frame drifts
438
+ // off the plane over a few thousand samples and the surface shears.
439
+ dot = ux * nx + uy * ny + uz * nz;
440
+ ux -= nx * dot;
441
+ uy -= ny * dot;
442
+ uz -= nz * dot;
443
+ inv = 1 / (Math.hypot(ux, uy, uz) || 1);
444
+ ux *= inv;
445
+ uy *= inv;
446
+ uz *= inv;
447
+
448
+ this.tableUpX[i] = ux;
449
+ this.tableUpY[i] = uy;
450
+ this.tableUpZ[i] = uz;
451
+ tx = nx;
452
+ ty = ny;
453
+ tz = nz;
454
+ }
455
+ }
456
+
457
+ /** Unit tangent at table entry `i`, from its neighbours' positions. */
458
+ private tangentAt(i: number, count: number, out: Float64Array): void {
459
+ const a = Math.max(i - 1, 0);
460
+ const b = Math.min(i + 1, count - 1);
461
+ let dx = (this.tableX[b] ?? 0) - (this.tableX[a] ?? 0);
462
+ let dy = (this.tableY[b] ?? 0) - (this.tableY[a] ?? 0);
463
+ let dz = (this.tableZ[b] ?? 0) - (this.tableZ[a] ?? 0);
464
+ const len = Math.hypot(dx, dy, dz);
465
+ if (len < 1e-12) {
466
+ dx = 1;
467
+ dy = 0;
468
+ dz = 0;
469
+ } else {
470
+ dx /= len;
471
+ dy /= len;
472
+ dz /= len;
473
+ }
474
+ out[0] = dx;
475
+ out[1] = dy;
476
+ out[2] = dz;
477
+ }
478
+
479
+ /**
480
+ * Curve position at segment `s`, local parameter `u`, into `out[0..2]`.
481
+ *
482
+ * Nothing here depends on anything but `u`: the four points are read straight out
483
+ * of the phantom-extended arrays and the knots were measured when the curve was
484
+ * built. What is left is the interpolation itself, which is the only part that
485
+ * could not have been done in advance.
486
+ */
487
+ private evaluate(s: number, u: number, out: Float64Array): void {
488
+ const x0 = this.ex[s] as number;
489
+ const y0 = this.ey[s] as number;
490
+ const z0 = this.ez[s] as number;
491
+ const x1 = this.ex[s + 1] as number;
492
+ const y1 = this.ey[s + 1] as number;
493
+ const z1 = this.ez[s + 1] as number;
494
+ const x2 = this.ex[s + 2] as number;
495
+ const y2 = this.ey[s + 2] as number;
496
+ const z2 = this.ez[s + 2] as number;
497
+ const x3 = this.ex[s + 3] as number;
498
+ const y3 = this.ey[s + 3] as number;
499
+ const z3 = this.ez[s + 3] as number;
500
+
501
+ const t0 = 0;
502
+ const t1 = this.knot1[s] as number;
503
+ const t2 = this.knot2[s] as number;
504
+ const t3 = this.knot3[s] as number;
505
+ const t = t1 + (t2 - t1) * u;
506
+
507
+ out[0] = barryGoldman(x0, x1, x2, x3, t0, t1, t2, t3, t);
508
+ out[1] = barryGoldman(y0, y1, y2, y3, t0, t1, t2, t3, t);
509
+ out[2] = barryGoldman(z0, z1, z2, z3, t0, t1, t2, t3, t);
510
+ }
511
+
512
+ /** Curve position at a global parameter (segment index plus local u). */
513
+ private evaluateParam(param: number, out: Float64Array): void {
514
+ const clamped = Math.min(Math.max(param, 0), this.segments);
515
+ let s = Math.floor(clamped);
516
+ let u = clamped - s;
517
+ if (s >= this.segments) {
518
+ s = Math.max(this.segments - 1, 0);
519
+ u = 1;
520
+ }
521
+ this.evaluate(s, u, out);
522
+ }
523
+
524
+ /** Largest table index whose distance is at most `d`. */
525
+ private findCell(d: number): number {
526
+ let lo = 0;
527
+ let hi = this.tableDist.length - 1;
528
+ while (lo < hi) {
529
+ const mid = (lo + hi + 1) >> 1;
530
+ if ((this.tableDist[mid] ?? 0) <= d) lo = mid;
531
+ else hi = mid - 1;
532
+ }
533
+ return lo;
534
+ }
535
+
536
+ /**
537
+ * Evaluate the curve at an arc length, clamped to its ends.
538
+ *
539
+ * Allocation-free by contract: it is called from the simulation, from the
540
+ * generator and from the mesh builder, and the first of those makes it a hot
541
+ * path rule rather than a preference.
542
+ */
543
+ sampleAt(distanceM: number, out: SplineSample): void {
544
+ if (this.segments === 0 || this.length <= 0) {
545
+ out.x = this.px[0] ?? 0;
546
+ out.y = this.py[0] ?? 0;
547
+ out.z = this.pz[0] ?? 0;
548
+ out.tangentX = 1;
549
+ out.tangentY = 0;
550
+ out.tangentZ = 0;
551
+ out.normalX = 0;
552
+ out.normalY = 1;
553
+ out.normalZ = 0;
554
+ out.rightX = 0;
555
+ out.rightY = 0;
556
+ out.rightZ = 1;
557
+ out.bankRad = this.bank[0] ?? 0;
558
+ out.widthM = this.width[0] ?? 0;
559
+ return;
560
+ }
561
+
562
+ const d = Math.min(Math.max(distanceM, 0), this.length);
563
+ const i = Math.min(this.findCell(d), this.tableDist.length - 2);
564
+ const d0 = this.tableDist[i] ?? 0;
565
+ const d1 = this.tableDist[i + 1] ?? d0;
566
+ const span = d1 - d0;
567
+ const alpha = span > 1e-12 ? (d - d0) / span : 0;
568
+
569
+ const param =
570
+ (this.tableParam[i] ?? 0) +
571
+ ((this.tableParam[i + 1] ?? 0) - (this.tableParam[i] ?? 0)) * alpha;
572
+
573
+ this.evaluateParam(param, TEMP);
574
+ out.x = TEMP[0] as number;
575
+ out.y = TEMP[1] as number;
576
+ out.z = TEMP[2] as number;
577
+
578
+ // Tangent from a central difference on the curve itself rather than from
579
+ // the table, so it stays exact where the table is coarse.
580
+ this.evaluateParam(param - TANGENT_DU, TEMP);
581
+ const ax = TEMP[0] as number;
582
+ const ay = TEMP[1] as number;
583
+ const az = TEMP[2] as number;
584
+ this.evaluateParam(param + TANGENT_DU, TEMP);
585
+ let tx = (TEMP[0] as number) - ax;
586
+ let ty = (TEMP[1] as number) - ay;
587
+ let tz = (TEMP[2] as number) - az;
588
+ const tLen = Math.hypot(tx, ty, tz);
589
+ if (tLen < 1e-12) {
590
+ tx = 1;
591
+ ty = 0;
592
+ tz = 0;
593
+ } else {
594
+ tx /= tLen;
595
+ ty /= tLen;
596
+ tz /= tLen;
597
+ }
598
+ out.tangentX = tx;
599
+ out.tangentY = ty;
600
+ out.tangentZ = tz;
601
+
602
+ let ux =
603
+ (this.tableUpX[i] ?? 0) + ((this.tableUpX[i + 1] ?? 0) - (this.tableUpX[i] ?? 0)) * alpha;
604
+ let uy =
605
+ (this.tableUpY[i] ?? 1) + ((this.tableUpY[i + 1] ?? 1) - (this.tableUpY[i] ?? 1)) * alpha;
606
+ let uz =
607
+ (this.tableUpZ[i] ?? 0) + ((this.tableUpZ[i + 1] ?? 0) - (this.tableUpZ[i] ?? 0)) * alpha;
608
+ const uDot = ux * tx + uy * ty + uz * tz;
609
+ ux -= tx * uDot;
610
+ uy -= ty * uDot;
611
+ uz -= tz * uDot;
612
+ const uLen = Math.hypot(ux, uy, uz) || 1;
613
+ ux /= uLen;
614
+ uy /= uLen;
615
+ uz /= uLen;
616
+
617
+ // right = tangent × up, normal = right × tangent. Both unit, both exactly
618
+ // perpendicular to the tangent, which is what the surface frame promises.
619
+ let rx = ty * uz - tz * uy;
620
+ let ry = tz * ux - tx * uz;
621
+ let rz = tx * uy - ty * ux;
622
+ const rLen = Math.hypot(rx, ry, rz) || 1;
623
+ rx /= rLen;
624
+ ry /= rLen;
625
+ rz /= rLen;
626
+ const nx = ry * tz - rz * ty;
627
+ const ny = rz * tx - rx * tz;
628
+ const nz = rx * ty - ry * tx;
629
+
630
+ // Bank and width follow the control points through a smoothstep. Linear
631
+ // would put a crease across the surface at every control point, and the
632
+ // character would hit it as a bump nobody authored.
633
+ const clamped = Math.min(Math.max(param, 0), this.segments);
634
+ const seg = Math.min(Math.floor(clamped), Math.max(this.segments - 1, 0));
635
+ const blend = smoothstep01(Math.min(Math.max(clamped - seg, 0), 1));
636
+ const bank0 = this.bank[seg] ?? 0;
637
+ const bank1 = this.bank[seg + 1] ?? bank0;
638
+ const width0 = this.width[seg] ?? 0;
639
+ const width1 = this.width[seg + 1] ?? width0;
640
+ const bank = bank0 + (bank1 - bank0) * blend;
641
+ out.bankRad = bank;
642
+ out.widthM = width0 + (width1 - width0) * blend;
643
+
644
+ const cos = Math.cos(bank);
645
+ const sin = Math.sin(bank);
646
+ out.rightX = rx * cos + nx * sin;
647
+ out.rightY = ry * cos + ny * sin;
648
+ out.rightZ = rz * cos + nz * sin;
649
+ out.normalX = nx * cos - rx * sin;
650
+ out.normalY = ny * cos - ry * sin;
651
+ out.normalZ = nz * cos - rz * sin;
652
+ }
653
+ }
654
+
655
+ /** Module-level scratch. One curve is evaluated at a time, on one thread. */
656
+ const TEMP = new Float64Array(3);
657
+
658
+ /** Convenience for callers building control points from a colour-carrying path. */
659
+ export type SplineColor = Vec3;