@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,790 @@
1
+ /**
2
+ * A banked surface swept along a spline: the drawn slab and the colliders that
3
+ * stop you falling through it.
4
+ *
5
+ * Collision is the mesh: every drawn triangle of the deck becomes a wedge with
6
+ * the slab's depth under it, so the geometry a player sees is exactly the
7
+ * geometry that stops them — banked, climbing, or twisted. The exact ground
8
+ * they *stand* on still comes from `RibbonSurface`, which answers from the
9
+ * curve itself; the wedges keep a body out of the slab from every other
10
+ * direction.
11
+ */
12
+ import type { MeshData } from '../render/mesh.ts';
13
+ import type { Vec3 } from '../math/color.ts';
14
+ import type { Collider } from '@driftengine/physics';
15
+ import { colliderFromShape } from '@driftengine/physics';
16
+ import { hullShape } from '@driftengine/physics';
17
+ import { Spline, createSplineSample } from './spline.ts';
18
+
19
+ /** A stretch of arc length where the surface simply is not there. */
20
+ export interface RibbonHole {
21
+ fromM: number;
22
+ toM: number;
23
+ }
24
+
25
+ export interface RibbonOptions {
26
+ color: Vec3;
27
+ emissive?: number;
28
+ /** Distance between cross-sections. Smaller is smoother and heavier. */
29
+ stepM?: number;
30
+ /** Depth of the slab below the surface. */
31
+ thicknessM?: number;
32
+ /** Interruptions: an unbridged track is a jump, and jumps are the point. */
33
+ holes?: readonly RibbonHole[];
34
+ /**
35
+ * Called per cross-section to vary the surface along the route.
36
+ *
37
+ * Writes the colour into `out` and returns the emissive strength. The hook
38
+ * exists so a generator can give each stretch its own material without
39
+ * building a separate ribbon per segment — a route in one flat tone reads as
40
+ * a painted strip rather than as something built.
41
+ */
42
+ shade?: (distanceM: number, out: Vec3) => number;
43
+ /**
44
+ * Build only a band along one edge instead of the whole surface.
45
+ *
46
+ * For kerbs: a strip this wide, inset from the chosen edge and lifted clear,
47
+ * with the surface's own banking. Doing it as a second ribbon rather than as
48
+ * geometry bolted on afterwards means the kerb follows the bank exactly, and
49
+ * it is the banking that makes an edge hard to read without one.
50
+ */
51
+ edgeBandM?: number;
52
+ edgeSide?: -1 | 1;
53
+ /**
54
+ * Build a band between two *absolute* lateral offsets instead of edge-relative
55
+ * ones — for anything painted at a particular place across the surface rather
56
+ * than along its edge.
57
+ *
58
+ * The alternative is to lay a row of small boxes along the route, and it does
59
+ * not work: an axis-aligned box cannot follow a curve, so the row steps into a
60
+ * zigzag and reads as a staircase of holes rather than as a marking. Built as a
61
+ * ribbon it follows the centreline and the bank exactly, for free.
62
+ */
63
+ lateralFromM?: number;
64
+ lateralToM?: number;
65
+ /** Restrict the build to a stretch of the curve. */
66
+ fromM?: number;
67
+ toM?: number;
68
+ /** Raise the whole band by this much, so a kerb stands proud of the surface. */
69
+ liftM?: number;
70
+ /**
71
+ * How far below the drawn surface the collider hulls' tops sit, metres.
72
+ *
73
+ * A consumer's ground query rides the *smooth* curve; the hulls are the
74
+ * *faceted* mesh, and at a crest a facet ridge stands a few centimetres
75
+ * proud of the curve — each ridge a micro-wall under a character's feet if the
76
+ * hulls are exactly flush. The give hands the top few centimetres to the
77
+ * smooth query and everything beneath to the hull: a tolerance between two
78
+ * representations of the same surface, not a hole in the world — the slab's
79
+ * sides and underside stay exactly where they are drawn. Zero means flush.
80
+ */
81
+ colliderGiveM?: number;
82
+ }
83
+
84
+ /**
85
+ * Spacing of the cross-sections a ribbon's mesh is built from, metres.
86
+ *
87
+ * Exported because it is not only the builder's business: `RibbonSurface` has to know it to
88
+ * agree with the geometry at a hole's edge, where the mesh deliberately keeps the bordering
89
+ * section. A copy of this number in the physics module is a copy that drifts.
90
+ */
91
+ export const RIBBON_STEP_M = 2;
92
+ const DEFAULT_STEP_M = RIBBON_STEP_M;
93
+ const DEFAULT_THICKNESS_M = 0.6;
94
+ /**
95
+ * Default collider give: comfortably past the sagitta of a `RIBBON_STEP_M`
96
+ * facet at the tightest curvature a route reaches (a hairpin near 6 m radius:
97
+ * 2² / (8 · 6) ≈ 0.08), because a give that only just covers the facet error
98
+ * still brushes the character at every ridge — felt as braking on exactly the
99
+ * curves a route wants taken at speed. Small enough that nothing passes
100
+ * through the gap: it is backed by solid hull immediately beneath, and only
101
+ * the top eases — sides and underside collide exactly where they are drawn.
102
+ */
103
+ export const RIBBON_COLLIDER_GIVE_M = 0.15;
104
+ /**
105
+ * How far a drawn facet may fall short of the curve it approximates, metres.
106
+ *
107
+ * Comfortably inside `RIBBON_COLLIDER_GIVE_M`, because that give is the whole
108
+ * budget for the two representations of a deck disagreeing: the smooth curve a
109
+ * ground query rides, and the facets that are drawn and collided. Spend the
110
+ * budget on the facet error and there is nothing left for the give's own job.
111
+ */
112
+ const MAX_FACET_SLIP_M = 0.05;
113
+ /**
114
+ * Ceiling on the cuts one step may be divided into.
115
+ *
116
+ * A route that still slips past `MAX_FACET_SLIP_M` at eight cuts is turning
117
+ * roughly sixty times faster than the geometry it is made of, and no amount of
118
+ * subdivision makes that stretch good — it is a generator bug, and quietly
119
+ * spending a hundred facets on it would hide the bug rather than the seam.
120
+ */
121
+ const MAX_FACET_CUTS = 8;
122
+ /**
123
+ * How far a quad's fourth corner may sit off the plane of the other three and
124
+ * still be collided as one hull rather than two wedges, metres.
125
+ *
126
+ * A flat quad is its own convex hull, so splitting it buys nothing and costs a
127
+ * collider — and most of a route is flat in this sense: it is only where the
128
+ * bank rolls that a quad warps at all. A centimetre is far below the give, so
129
+ * a quad that passes here cannot stand meaningfully proud of itself.
130
+ */
131
+ const FLAT_QUAD_M = 0.01;
132
+
133
+ export interface RibbonMesh {
134
+ mesh: MeshData;
135
+ colliders: Collider[];
136
+ }
137
+
138
+ function inHole(holes: readonly RibbonHole[] | undefined, d: number): boolean {
139
+ if (holes === undefined) return false;
140
+ for (const hole of holes) {
141
+ if (d > hole.fromM && d < hole.toM) return true;
142
+ }
143
+ return false;
144
+ }
145
+
146
+ /**
147
+ * Accumulator for one ribbon. Kept local rather than reusing `MeshBuilder`
148
+ * because that one only knows how to emit axis-aligned boxes, and every face
149
+ * here is oblique.
150
+ */
151
+ class Strip {
152
+ readonly positions: number[] = [];
153
+ readonly normals: number[] = [];
154
+ readonly colors: number[] = [];
155
+ readonly emissive: number[] = [];
156
+ readonly indices: number[] = [];
157
+ private count = 0;
158
+
159
+ quad(
160
+ ax: number,
161
+ ay: number,
162
+ az: number,
163
+ bx: number,
164
+ by: number,
165
+ bz: number,
166
+ cx: number,
167
+ cy: number,
168
+ cz: number,
169
+ dx: number,
170
+ dy: number,
171
+ dz: number,
172
+ color: Vec3,
173
+ emissive: number,
174
+ ): void {
175
+ // Flat-shaded, so the normal is the triangle's own and every face carries
176
+ // its own four vertices. Computing it rather than passing it in means the
177
+ // stored normal cannot disagree with the winding.
178
+ const ux = bx - ax;
179
+ const uy = by - ay;
180
+ const uz = bz - az;
181
+ const vx = cx - ax;
182
+ const vy = cy - ay;
183
+ const vz = cz - az;
184
+ let nx = uy * vz - uz * vy;
185
+ let ny = uz * vx - ux * vz;
186
+ let nz = ux * vy - uy * vx;
187
+ const len = Math.hypot(nx, ny, nz);
188
+ if (len < 1e-12) return;
189
+ nx /= len;
190
+ ny /= len;
191
+ nz /= len;
192
+
193
+ const i = this.count;
194
+ this.positions.push(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz);
195
+ for (let v = 0; v < 4; v++) {
196
+ this.normals.push(nx, ny, nz);
197
+ this.colors.push(color[0], color[1], color[2]);
198
+ this.emissive.push(emissive);
199
+ }
200
+ this.indices.push(i, i + 1, i + 2, i, i + 2, i + 3);
201
+ this.count += 4;
202
+ }
203
+
204
+ build(): MeshData {
205
+ return {
206
+ positions: new Float32Array(this.positions),
207
+ normals: new Float32Array(this.normals),
208
+ colors: new Float32Array(this.colors),
209
+ emissive: new Float32Array(this.emissive),
210
+ indices: new Uint32Array(this.indices),
211
+ };
212
+ }
213
+ }
214
+
215
+ /** Four corners of one cross-section: left/right, top/bottom. */
216
+ interface Section {
217
+ lx: number;
218
+ ly: number;
219
+ lz: number;
220
+ rx: number;
221
+ ry: number;
222
+ rz: number;
223
+ lbx: number;
224
+ lby: number;
225
+ lbz: number;
226
+ rbx: number;
227
+ rby: number;
228
+ rbz: number;
229
+ /** Collider give along this section's normal — subtracted from the top corners only. */
230
+ gx: number;
231
+ gy: number;
232
+ gz: number;
233
+ }
234
+
235
+ function makeSection(): Section {
236
+ return {
237
+ lx: 0,
238
+ ly: 0,
239
+ lz: 0,
240
+ rx: 0,
241
+ ry: 0,
242
+ rz: 0,
243
+ lbx: 0,
244
+ lby: 0,
245
+ lbz: 0,
246
+ rbx: 0,
247
+ rby: 0,
248
+ rbz: 0,
249
+ gx: 0,
250
+ gy: 0,
251
+ gz: 0,
252
+ };
253
+ }
254
+
255
+ export function buildRibbon(spline: Spline, options: RibbonOptions): RibbonMesh {
256
+ const step = options.stepM ?? DEFAULT_STEP_M;
257
+ const thickness = options.thicknessM ?? DEFAULT_THICKNESS_M;
258
+ const emissive = options.emissive ?? 0;
259
+ const strip = new Strip();
260
+ const colliders: Collider[] = [];
261
+
262
+ if (spline.lengthM <= 0 || step <= 0) {
263
+ return { mesh: strip.build(), colliders };
264
+ }
265
+
266
+ const sample = createSplineSample();
267
+ const color: Vec3 = [options.color[0], options.color[1], options.color[2]];
268
+ let emissiveNow = emissive;
269
+ const previous = makeSection();
270
+ const current = makeSection();
271
+ /** Scratch: the midpoint a facet is measured against, and the cuts it earns. */
272
+ const probe = makeSection();
273
+ const sub = makeSection();
274
+ let havePrevious = false;
275
+
276
+ const wedgePoints: number[] = [];
277
+ /**
278
+ * Extra ease for the quad being emitted, on top of the constant give.
279
+ *
280
+ * The give is sized for a facet's own sagitta; what it cannot know is how far
281
+ * *this* quad falls short of the curve, which on a fast camber reversal is
282
+ * several times larger and does not shrink to nothing even at the cut ceiling.
283
+ * A collider standing proud of the smooth surface is the worst failure this
284
+ * builder has: the ground query puts a character at the curve's height, the hull
285
+ * is above them, and a body inside its own floor cannot move in any direction
286
+ * — on that camber, a hill simply cannot be climbed. So whatever the cuts
287
+ * could not remove is handed to the ease instead. Sitting *below* the drawn
288
+ * deck costs nothing; the surface owns the ride, and the slab is solid the
289
+ * whole way down.
290
+ */
291
+ let extraEase = 0;
292
+ /**
293
+ * Extra ease across the section, on top of `extraEase` along it.
294
+ *
295
+ * `extraEase` was sized for camber: it travels along a section's normal, and
296
+ * a normal-direction push cannot touch an error that lives in a completely
297
+ * different direction. On a curve tight enough that the half-width is a real
298
+ * fraction of the radius — a hairpin's inner rail, a chicane's apex — the
299
+ * chord between two cross-sections' inner corners cuts across the true
300
+ * offset curve rather than following it, because the inner boundary sweeps a
301
+ * *tighter* radius than the centreline (`radius − half`, shrinking toward
302
+ * zero as the half-width closes on the radius) while the chord stays
303
+ * straight. The result stands proud sideways instead of vertically: a hull
304
+ * a hand's width into the lane a character is looking straight down, on
305
+ * flat, ordinary-looking track. It reads as the player colliding with the
306
+ * track itself, worst while sliding — measured at a hairpin
307
+ * where the chord missed the true inner boundary by most of a metre and
308
+ * cost a character their whole speed on an axis nothing was drawn across.
309
+ *
310
+ * `cuts` already measures this: `leftSlip`/`rightSlip` below are the same
311
+ * per-edge chord error the cut count is chosen from. What was missing was
312
+ * anywhere for the *leftover* of that specific error to go once the cut
313
+ * ceiling was reached — `extraEase` only ever paid down the diagonal
314
+ * (camber) term. This pays the lateral remainder by drawing both top
315
+ * corners in toward the section's own centreline, which can only ever
316
+ * shrink the hull — the ground a character stands on is still the smooth
317
+ * curve `RibbonSurface` answers from, never this mesh, so a hull inset by
318
+ * centimetres at an extreme apex changes nothing about where a body can
319
+ * walk, only how snugly its sides are held.
320
+ */
321
+ let lateralEase = 0;
322
+
323
+ /** One corner of a wedge: the eased top corner, and the bottom under it. */
324
+ const corner = (s: Section, right: boolean): void => {
325
+ // The give travels along the section's own normal; so does the extra.
326
+ const ex =
327
+ s.gx === 0 && s.gy === 0 && s.gz === 0 ? 0 : extraEase / Math.hypot(s.gx, s.gy, s.gz);
328
+ const gx = s.gx * (1 + ex);
329
+ const gy = s.gy * (1 + ex);
330
+ const gz = s.gz * (1 + ex);
331
+ let topX = right ? s.rx : s.lx;
332
+ let topY = right ? s.ry : s.ly;
333
+ let topZ = right ? s.rz : s.lz;
334
+ if (lateralEase > 0) {
335
+ let dx = s.rx - s.lx;
336
+ let dy = s.ry - s.ly;
337
+ let dz = s.rz - s.lz;
338
+ const dl = Math.hypot(dx, dy, dz);
339
+ if (dl > 1e-9) {
340
+ const inset = (Math.min(lateralEase, dl * 0.45) / dl) * (right ? -1 : 1);
341
+ dx *= inset;
342
+ dy *= inset;
343
+ dz *= inset;
344
+ topX += dx;
345
+ topY += dy;
346
+ topZ += dz;
347
+ }
348
+ }
349
+ if (right) {
350
+ wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.rbx, s.rby, s.rbz);
351
+ } else {
352
+ wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.lbx, s.lby, s.lbz);
353
+ }
354
+ };
355
+
356
+ /**
357
+ * The collision under one drawn quad: two wedges, one per drawn triangle.
358
+ *
359
+ * A convex hull's *top face is a plane*, and the deck between two
360
+ * cross-sections is not one. Hulling the whole quad therefore bridged its
361
+ * warp, and the bridge stood proud of the deck the player walks on: measured
362
+ * across a day's route, up to **6 m** of warp on one in eight spans, leaving
363
+ * hull tops as much as 0.6 m above the drawn surface. A character standing where
364
+ * the deck is drawn was then *inside* solid collision — unable to lift, so
365
+ * auto-step could not fire, unable to move, so a full run died against
366
+ * nothing visible. Reported on the same span every time: on a steep hill the
367
+ * player stops climbing, forward input leaves them standing still, and they
368
+ * are stuck inside the track's own parts.
369
+ *
370
+ * Splitting the quad laterally was an attempt to bound that bridge, and it
371
+ * could not: following a 24° roll to within four centimetres needs ninety
372
+ * strips, and the cap of six left five sixths of the error in place. A
373
+ * triangle needs no bound. Its three corners *define* a plane, so this wedge's
374
+ * top face is the drawn triangle exactly — the same corners, the same diagonal
375
+ * `Strip.quad` indexes — and the pair of them tiles the quad with no seam
376
+ * between and none to the neighbouring span. Two wedges per quad is also
377
+ * fewer colliders than the strips averaged.
378
+ *
379
+ * The bottom corners hang under their own cross-section's normal, so a side
380
+ * face can still be a little warped where the bank rolls. That bulge is
381
+ * lateral, under the deck, bounded by the slab's own depth, and shared with
382
+ * the wedge next door: it is not somewhere anyone stands.
383
+ */
384
+ const wedgeQuad = (p: Section, c: Section): void => {
385
+ /*
386
+ * Flat enough to be its own hull? Then one collider, not two. The warp is
387
+ * the current-left corner's distance from the plane of the other three.
388
+ */
389
+ const ax = p.lx - p.gx;
390
+ const ay = p.ly - p.gy;
391
+ const az = p.lz - p.gz;
392
+ const e1x = p.rx - p.gx - ax;
393
+ const e1y = p.ry - p.gy - ay;
394
+ const e1z = p.rz - p.gz - az;
395
+ const e2x = c.rx - c.gx - ax;
396
+ const e2y = c.ry - c.gy - ay;
397
+ const e2z = c.rz - c.gz - az;
398
+ let nx = e1y * e2z - e1z * e2y;
399
+ let ny = e1z * e2x - e1x * e2z;
400
+ let nz = e1x * e2y - e1y * e2x;
401
+ const nl = Math.hypot(nx, ny, nz);
402
+ if (nl > 1e-9) {
403
+ nx /= nl;
404
+ ny /= nl;
405
+ nz /= nl;
406
+ const warp = Math.abs(
407
+ (c.lx - c.gx - ax) * nx + (c.ly - c.gy - ay) * ny + (c.lz - c.gz - az) * nz,
408
+ );
409
+ if (warp <= FLAT_QUAD_M) {
410
+ wedgePoints.length = 0;
411
+ corner(p, false);
412
+ corner(p, true);
413
+ corner(c, true);
414
+ corner(c, false);
415
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
416
+ return;
417
+ }
418
+ }
419
+ // The diagonal the mesh indexes: previous-left to current-right.
420
+ wedgePoints.length = 0;
421
+ corner(p, false);
422
+ corner(p, true);
423
+ corner(c, true);
424
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
425
+ wedgePoints.length = 0;
426
+ corner(p, false);
427
+ corner(c, true);
428
+ corner(c, false);
429
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
430
+ };
431
+
432
+ const band = options.edgeBandM ?? 0;
433
+ const edgeSide = options.edgeSide ?? 1;
434
+ const lift = options.liftM ?? 0;
435
+ const give = options.colliderGiveM ?? RIBBON_COLLIDER_GIVE_M;
436
+ /*
437
+ * The lateral range is normalised, and that is a correctness fix rather than tidiness.
438
+ *
439
+ * A slab built from a *descending* range comes out inside-out: measured signed volume
440
+ * +256 one way round and -256 the other. With back-face culling — which the renderer
441
+ * uses everywhere — an inside-out slab is **invisible from outside**, so you look
442
+ * straight through it. That is exactly what shows up under a canal bridge: the ceiling
443
+ * looks glassy and transparent from below, and fixing one side leaves the opposite one
444
+ * untouched — because a canal on one hand
445
+ * multiplies every offset by -1, which reverses the order and turns every band it
446
+ * builds inside out.
447
+ *
448
+ * Fixing it here rather than at the call sites is the point: a caller expressing
449
+ * "from the coping to the far bank" has said something about *space*, not about winding,
450
+ * and no caller should have to know that the difference is visible.
451
+ */
452
+ const rangeA = options.lateralFromM;
453
+ const rangeB = options.lateralToM;
454
+ const swap = rangeA !== undefined && rangeB !== undefined && rangeA > rangeB;
455
+ const lateralFrom = swap ? rangeB : rangeA;
456
+ const lateralTo = swap ? rangeA : rangeB;
457
+ const absolute = lateralFrom !== undefined && lateralTo !== undefined;
458
+
459
+ const fill = (d: number, into: Section): void => {
460
+ spline.sampleAt(d, sample);
461
+ const half = sample.widthM * 0.5;
462
+ /*
463
+ * Three ways to span a cross-section: the whole surface, a band inset from
464
+ * one edge (a kerb), or a band between two given offsets (a marking).
465
+ */
466
+ /*
467
+ * Ordered, and the order is what decides the triangle winding.
468
+ *
469
+ * Every quad in this builder puts the first offset at the section's *left* corner
470
+ * and the second at its right, and back faces are culled — so if the two ever
471
+ * arrive the other way round, the piece is built inside out. That is exactly what
472
+ * happened, and it was invisible for as long as it was symmetric:
473
+ *
474
+ * - the full surface spans `-half` to `+half`, left before right, correct;
475
+ * - a kerb at `edgeSide = -1` spans `-half` to `-half + band`, also correct;
476
+ * - a kerb at `edgeSide = +1` spans `+half` to `+half - band` — **reversed**, so
477
+ * its top face points into the deck and is culled, and what shows through is the
478
+ * surface underneath and the band's own underside.
479
+ *
480
+ * One kerb of the two, on one side of every route, worst where a curve brings it to
481
+ * a grazing angle. Once the depth layers had cleaned up the left, the right was
482
+ * unchanged: borders and lines still fighting the main surface, worst on curves.
483
+ *
484
+ * The `absolute` case has the same hazard from the same cause — the canal passes its
485
+ * two offsets multiplied by a side — so this is not special-cased to kerbs. Sorting
486
+ * the pair costs nothing and makes the winding a property of the builder rather than
487
+ * of what a caller happened to pass.
488
+ */
489
+ const edgeA = absolute ? (lateralFrom as number) : band > 0 ? half * edgeSide : -half;
490
+ const edgeB = absolute ? (lateralTo as number) : band > 0 ? (half - band) * edgeSide : half;
491
+ const outer = Math.min(edgeA, edgeB);
492
+ const inner = Math.max(edgeA, edgeB);
493
+ const cx = sample.x + sample.normalX * lift;
494
+ const cy = sample.y + sample.normalY * lift;
495
+ const cz = sample.z + sample.normalZ * lift;
496
+ const lx = cx + sample.rightX * outer;
497
+ const ly = cy + sample.rightY * outer;
498
+ const lz = cz + sample.rightZ * outer;
499
+ const rx = cx + sample.rightX * inner;
500
+ const ry = cy + sample.rightY * inner;
501
+ const rz = cz + sample.rightZ * inner;
502
+ into.lx = lx;
503
+ into.ly = ly;
504
+ into.lz = lz;
505
+ into.rx = rx;
506
+ into.ry = ry;
507
+ into.rz = rz;
508
+ into.lbx = lx - sample.normalX * thickness;
509
+ into.lby = ly - sample.normalY * thickness;
510
+ into.lbz = lz - sample.normalZ * thickness;
511
+ into.rbx = rx - sample.normalX * thickness;
512
+ into.rby = ry - sample.normalY * thickness;
513
+ into.rbz = rz - sample.normalZ * thickness;
514
+ // The collider's top eases below the drawn one by the give, never past the slab.
515
+ const ease = Math.min(give, thickness * 0.5);
516
+ into.gx = sample.normalX * ease;
517
+ into.gy = sample.normalY * ease;
518
+ into.gz = sample.normalZ * ease;
519
+ };
520
+
521
+ /** One drawn facet of the slab: four faces, and the collision under them. */
522
+ const slab = (p: Section, c: Section): void => {
523
+ // Top, then bottom, then the two sides. Orders chosen so each quad's
524
+ // computed normal points out of the slab; the winding test proves it.
525
+ strip.quad(
526
+ p.lx,
527
+ p.ly,
528
+ p.lz,
529
+ p.rx,
530
+ p.ry,
531
+ p.rz,
532
+ c.rx,
533
+ c.ry,
534
+ c.rz,
535
+ c.lx,
536
+ c.ly,
537
+ c.lz,
538
+ color,
539
+ emissiveNow,
540
+ );
541
+ strip.quad(
542
+ c.lbx,
543
+ c.lby,
544
+ c.lbz,
545
+ c.rbx,
546
+ c.rby,
547
+ c.rbz,
548
+ p.rbx,
549
+ p.rby,
550
+ p.rbz,
551
+ p.lbx,
552
+ p.lby,
553
+ p.lbz,
554
+ color,
555
+ emissiveNow,
556
+ );
557
+ strip.quad(
558
+ p.rx,
559
+ p.ry,
560
+ p.rz,
561
+ p.rbx,
562
+ p.rby,
563
+ p.rbz,
564
+ c.rbx,
565
+ c.rby,
566
+ c.rbz,
567
+ c.rx,
568
+ c.ry,
569
+ c.rz,
570
+ color,
571
+ emissiveNow,
572
+ );
573
+ strip.quad(
574
+ p.lbx,
575
+ p.lby,
576
+ p.lbz,
577
+ p.lx,
578
+ p.ly,
579
+ p.lz,
580
+ c.lx,
581
+ c.ly,
582
+ c.lz,
583
+ c.lbx,
584
+ c.lby,
585
+ c.lbz,
586
+ color,
587
+ emissiveNow,
588
+ );
589
+ // Drawn and collided in the same breath, from the same corners.
590
+ wedgeQuad(p, c);
591
+ };
592
+
593
+ const copy = (from: Section, to: Section): void => {
594
+ to.lx = from.lx;
595
+ to.ly = from.ly;
596
+ to.lz = from.lz;
597
+ to.rx = from.rx;
598
+ to.ry = from.ry;
599
+ to.rz = from.rz;
600
+ to.lbx = from.lbx;
601
+ to.lby = from.lby;
602
+ to.lbz = from.lbz;
603
+ to.rbx = from.rbx;
604
+ to.rby = from.rby;
605
+ to.rbz = from.rbz;
606
+ // The give travels with the section it was measured on. It did not have to
607
+ // before, when only `current` was ever collided; now a wedge takes two
608
+ // cross-sections and half of every quad would have stood flush with the
609
+ // drawn deck — a micro-wall at each facet ridge, the whole way along.
610
+ to.gx = from.gx;
611
+ to.gy = from.gy;
612
+ to.gz = from.gz;
613
+ };
614
+
615
+ /** Seal the open end of a piece so the slab is a closed solid. */
616
+ const cap = (s: Section, facingForward: boolean): void => {
617
+ if (facingForward) {
618
+ strip.quad(
619
+ s.rx,
620
+ s.ry,
621
+ s.rz,
622
+ s.rbx,
623
+ s.rby,
624
+ s.rbz,
625
+ s.lbx,
626
+ s.lby,
627
+ s.lbz,
628
+ s.lx,
629
+ s.ly,
630
+ s.lz,
631
+ color,
632
+ emissiveNow,
633
+ );
634
+ } else {
635
+ strip.quad(
636
+ s.lx,
637
+ s.ly,
638
+ s.lz,
639
+ s.lbx,
640
+ s.lby,
641
+ s.lbz,
642
+ s.rbx,
643
+ s.rby,
644
+ s.rbz,
645
+ s.rx,
646
+ s.ry,
647
+ s.rz,
648
+ color,
649
+ emissiveNow,
650
+ );
651
+ }
652
+ };
653
+
654
+ // One extra step so the final cross-section lands exactly on the end.
655
+ const startAt = Math.max(0, options.fromM ?? 0);
656
+ const endAt = Math.min(spline.lengthM, options.toM ?? spline.lengthM);
657
+ const span = endAt - startAt;
658
+ if (span <= 0) return { mesh: strip.build(), colliders };
659
+ const steps = Math.max(1, Math.ceil(span / step));
660
+ const exactStep = span / steps;
661
+
662
+ for (let i = 0; i <= steps; i++) {
663
+ const d = startAt + i * exactStep;
664
+ /*
665
+ * A cross-section is present when the surface exists on at least one side
666
+ * of it. That is what makes a hole's edge sharp: the section bordering a
667
+ * hole is still built, so the piece before it gets its end cap in the right
668
+ * place rather than stopping a step short.
669
+ */
670
+ const before = i > 0 && !inHole(options.holes, d - exactStep * 0.5);
671
+ const after = i < steps && !inHole(options.holes, d + exactStep * 0.5);
672
+ if (!before && !after) {
673
+ if (havePrevious) {
674
+ cap(previous, true);
675
+ havePrevious = false;
676
+ }
677
+ continue;
678
+ }
679
+
680
+ fill(d, current);
681
+ if (options.shade !== undefined) emissiveNow = options.shade(d, color);
682
+
683
+ if (!before) {
684
+ // Opening a new piece.
685
+ cap(current, false);
686
+ copy(current, previous);
687
+ havePrevious = true;
688
+ continue;
689
+ }
690
+
691
+ if (havePrevious) {
692
+ /*
693
+ * As many facets as this stretch of curve needs, never fewer.
694
+ *
695
+ * `step` is one number for a whole route, and a route does not turn at one
696
+ * rate. Where a route reverses its camber — one measured case rolls 17° one
697
+ * way to 16° the other inside nine metres, across a deck 17 m wide — a 2 m facet
698
+ * cuts that corner by **0.85 m**. Everything downstream then disagrees
699
+ * about where the deck is: `RibbonSurface` answers from the smooth curve
700
+ * and puts a character most of a metre inside the drawn slab, where they are
701
+ * buried in their own floor. Buried, they cannot lift, so auto-step cannot
702
+ * fire, so they cannot walk — on that exact camber the player stays stuck
703
+ * the moment they try to run, with impacts on every ridge from the same gap.
704
+ *
705
+ * So the builder measures its own error and subdivides until it is small,
706
+ * rather than trusting a constant. Only the fast-turning spans pay, and
707
+ * they are the ones that were broken.
708
+ */
709
+ const dPrev = d - exactStep;
710
+ fill((dPrev + d) * 0.5, probe);
711
+ /*
712
+ * Measured at the *diagonal*, which is where a quad is furthest from the
713
+ * curve it stands for.
714
+ *
715
+ * Two cross-sections that differ in bank are skew lines, and the surface
716
+ * ruled between them is not flat — but two triangles are. Both of them
717
+ * share the diagonal, so along that diagonal the drawn deck is the plain
718
+ * average of two opposite corners, while the real deck at the same place
719
+ * is the mid-section's own centre. The gap between those is the whole
720
+ * error, and it is *linear* in the step: half a metre of bank roll across
721
+ * a seventeen-metre deck puts fourteen centimetres of it under a character's
722
+ * feet, which is the give's entire budget spent before the give does any
723
+ * of its own work.
724
+ *
725
+ * Measuring the edges instead — the obvious thing, and what this did
726
+ * first — sees almost none of it: a chord along an edge is out by
727
+ * millimetres where the diagonal is out by a hand's width.
728
+ */
729
+ const diagSlip = Math.hypot(
730
+ (probe.lx + probe.rx) * 0.5 - (previous.lx + current.rx) * 0.5,
731
+ (probe.ly + probe.ry) * 0.5 - (previous.ly + current.ry) * 0.5,
732
+ (probe.lz + probe.rz) * 0.5 - (previous.lz + current.rz) * 0.5,
733
+ );
734
+ const leftSlip = Math.hypot(
735
+ probe.lx - (previous.lx + current.lx) * 0.5,
736
+ probe.ly - (previous.ly + current.ly) * 0.5,
737
+ probe.lz - (previous.lz + current.lz) * 0.5,
738
+ );
739
+ const rightSlip = Math.hypot(
740
+ probe.rx - (previous.rx + current.rx) * 0.5,
741
+ probe.ry - (previous.ry + current.ry) * 0.5,
742
+ probe.rz - (previous.rz + current.rz) * 0.5,
743
+ );
744
+ const slip = Math.max(diagSlip, leftSlip, rightSlip);
745
+ const cuts =
746
+ slip > MAX_FACET_SLIP_M ? Math.min(MAX_FACET_CUTS, Math.ceil(slip / MAX_FACET_SLIP_M)) : 1;
747
+ /*
748
+ * Whatever a whole number of cuts could not take out, the ease takes.
749
+ * Never past the slab's own depth, so a wedge cannot turn inside out.
750
+ */
751
+ extraEase = Math.min(Math.max(0, slip / cuts - MAX_FACET_SLIP_M), thickness * 0.5);
752
+ /*
753
+ * The edge-specific half of the same leftover, paid across the section
754
+ * instead of along it — see `lateralEase` above. `leftSlip`/`rightSlip`
755
+ * are exactly the per-edge error `cuts` was chosen from; only their
756
+ * share of what the cut ceiling could not remove needs paying here.
757
+ */
758
+ lateralEase = Math.min(
759
+ Math.max(0, Math.max(leftSlip, rightSlip) / cuts - MAX_FACET_SLIP_M),
760
+ 1.5,
761
+ );
762
+ for (let s = 1; s <= cuts; s++) {
763
+ if (s < cuts) {
764
+ const dSub = dPrev + exactStep * (s / cuts);
765
+ fill(dSub, sub);
766
+ if (options.shade !== undefined) emissiveNow = options.shade(dSub, color);
767
+ slab(previous, sub);
768
+ copy(sub, previous);
769
+ } else {
770
+ if (options.shade !== undefined) emissiveNow = options.shade(d, color);
771
+ slab(previous, current);
772
+ }
773
+ }
774
+ extraEase = 0;
775
+ lateralEase = 0;
776
+ }
777
+
778
+ copy(current, previous);
779
+ havePrevious = true;
780
+
781
+ if (!after) {
782
+ cap(current, true);
783
+ havePrevious = false;
784
+ }
785
+ }
786
+
787
+ if (havePrevious) cap(previous, true);
788
+
789
+ return { mesh: strip.build(), colliders };
790
+ }