@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,546 @@
1
+ import { colliderFromShape } from '@driftengine/physics';
2
+ import { hullShape } from '@driftengine/physics';
3
+ import { Spline, createSplineSample } from './spline.js';
4
+ /**
5
+ * Spacing of the cross-sections a ribbon's mesh is built from, metres.
6
+ *
7
+ * Exported because it is not only the builder's business: `RibbonSurface` has to know it to
8
+ * agree with the geometry at a hole's edge, where the mesh deliberately keeps the bordering
9
+ * section. A copy of this number in the physics module is a copy that drifts.
10
+ */
11
+ export const RIBBON_STEP_M = 2;
12
+ const DEFAULT_STEP_M = RIBBON_STEP_M;
13
+ const DEFAULT_THICKNESS_M = 0.6;
14
+ /**
15
+ * Default collider give: comfortably past the sagitta of a `RIBBON_STEP_M`
16
+ * facet at the tightest curvature a route reaches (a hairpin near 6 m radius:
17
+ * 2² / (8 · 6) ≈ 0.08), because a give that only just covers the facet error
18
+ * still brushes the character at every ridge — felt as braking on exactly the
19
+ * curves a route wants taken at speed. Small enough that nothing passes
20
+ * through the gap: it is backed by solid hull immediately beneath, and only
21
+ * the top eases — sides and underside collide exactly where they are drawn.
22
+ */
23
+ export const RIBBON_COLLIDER_GIVE_M = 0.15;
24
+ /**
25
+ * How far a drawn facet may fall short of the curve it approximates, metres.
26
+ *
27
+ * Comfortably inside `RIBBON_COLLIDER_GIVE_M`, because that give is the whole
28
+ * budget for the two representations of a deck disagreeing: the smooth curve a
29
+ * ground query rides, and the facets that are drawn and collided. Spend the
30
+ * budget on the facet error and there is nothing left for the give's own job.
31
+ */
32
+ const MAX_FACET_SLIP_M = 0.05;
33
+ /**
34
+ * Ceiling on the cuts one step may be divided into.
35
+ *
36
+ * A route that still slips past `MAX_FACET_SLIP_M` at eight cuts is turning
37
+ * roughly sixty times faster than the geometry it is made of, and no amount of
38
+ * subdivision makes that stretch good — it is a generator bug, and quietly
39
+ * spending a hundred facets on it would hide the bug rather than the seam.
40
+ */
41
+ const MAX_FACET_CUTS = 8;
42
+ /**
43
+ * How far a quad's fourth corner may sit off the plane of the other three and
44
+ * still be collided as one hull rather than two wedges, metres.
45
+ *
46
+ * A flat quad is its own convex hull, so splitting it buys nothing and costs a
47
+ * collider — and most of a route is flat in this sense: it is only where the
48
+ * bank rolls that a quad warps at all. A centimetre is far below the give, so
49
+ * a quad that passes here cannot stand meaningfully proud of itself.
50
+ */
51
+ const FLAT_QUAD_M = 0.01;
52
+ function inHole(holes, d) {
53
+ if (holes === undefined)
54
+ return false;
55
+ for (const hole of holes) {
56
+ if (d > hole.fromM && d < hole.toM)
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+ /**
62
+ * Accumulator for one ribbon. Kept local rather than reusing `MeshBuilder`
63
+ * because that one only knows how to emit axis-aligned boxes, and every face
64
+ * here is oblique.
65
+ */
66
+ class Strip {
67
+ positions = [];
68
+ normals = [];
69
+ colors = [];
70
+ emissive = [];
71
+ indices = [];
72
+ count = 0;
73
+ quad(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, color, emissive) {
74
+ // Flat-shaded, so the normal is the triangle's own and every face carries
75
+ // its own four vertices. Computing it rather than passing it in means the
76
+ // stored normal cannot disagree with the winding.
77
+ const ux = bx - ax;
78
+ const uy = by - ay;
79
+ const uz = bz - az;
80
+ const vx = cx - ax;
81
+ const vy = cy - ay;
82
+ const vz = cz - az;
83
+ let nx = uy * vz - uz * vy;
84
+ let ny = uz * vx - ux * vz;
85
+ let nz = ux * vy - uy * vx;
86
+ const len = Math.hypot(nx, ny, nz);
87
+ if (len < 1e-12)
88
+ return;
89
+ nx /= len;
90
+ ny /= len;
91
+ nz /= len;
92
+ const i = this.count;
93
+ this.positions.push(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz);
94
+ for (let v = 0; v < 4; v++) {
95
+ this.normals.push(nx, ny, nz);
96
+ this.colors.push(color[0], color[1], color[2]);
97
+ this.emissive.push(emissive);
98
+ }
99
+ this.indices.push(i, i + 1, i + 2, i, i + 2, i + 3);
100
+ this.count += 4;
101
+ }
102
+ build() {
103
+ return {
104
+ positions: new Float32Array(this.positions),
105
+ normals: new Float32Array(this.normals),
106
+ colors: new Float32Array(this.colors),
107
+ emissive: new Float32Array(this.emissive),
108
+ indices: new Uint32Array(this.indices),
109
+ };
110
+ }
111
+ }
112
+ function makeSection() {
113
+ return {
114
+ lx: 0,
115
+ ly: 0,
116
+ lz: 0,
117
+ rx: 0,
118
+ ry: 0,
119
+ rz: 0,
120
+ lbx: 0,
121
+ lby: 0,
122
+ lbz: 0,
123
+ rbx: 0,
124
+ rby: 0,
125
+ rbz: 0,
126
+ gx: 0,
127
+ gy: 0,
128
+ gz: 0,
129
+ };
130
+ }
131
+ export function buildRibbon(spline, options) {
132
+ const step = options.stepM ?? DEFAULT_STEP_M;
133
+ const thickness = options.thicknessM ?? DEFAULT_THICKNESS_M;
134
+ const emissive = options.emissive ?? 0;
135
+ const strip = new Strip();
136
+ const colliders = [];
137
+ if (spline.lengthM <= 0 || step <= 0) {
138
+ return { mesh: strip.build(), colliders };
139
+ }
140
+ const sample = createSplineSample();
141
+ const color = [options.color[0], options.color[1], options.color[2]];
142
+ let emissiveNow = emissive;
143
+ const previous = makeSection();
144
+ const current = makeSection();
145
+ /** Scratch: the midpoint a facet is measured against, and the cuts it earns. */
146
+ const probe = makeSection();
147
+ const sub = makeSection();
148
+ let havePrevious = false;
149
+ const wedgePoints = [];
150
+ /**
151
+ * Extra ease for the quad being emitted, on top of the constant give.
152
+ *
153
+ * The give is sized for a facet's own sagitta; what it cannot know is how far
154
+ * *this* quad falls short of the curve, which on a fast camber reversal is
155
+ * several times larger and does not shrink to nothing even at the cut ceiling.
156
+ * A collider standing proud of the smooth surface is the worst failure this
157
+ * builder has: the ground query puts a character at the curve's height, the hull
158
+ * is above them, and a body inside its own floor cannot move in any direction
159
+ * — on that camber, a hill simply cannot be climbed. So whatever the cuts
160
+ * could not remove is handed to the ease instead. Sitting *below* the drawn
161
+ * deck costs nothing; the surface owns the ride, and the slab is solid the
162
+ * whole way down.
163
+ */
164
+ let extraEase = 0;
165
+ /**
166
+ * Extra ease across the section, on top of `extraEase` along it.
167
+ *
168
+ * `extraEase` was sized for camber: it travels along a section's normal, and
169
+ * a normal-direction push cannot touch an error that lives in a completely
170
+ * different direction. On a curve tight enough that the half-width is a real
171
+ * fraction of the radius — a hairpin's inner rail, a chicane's apex — the
172
+ * chord between two cross-sections' inner corners cuts across the true
173
+ * offset curve rather than following it, because the inner boundary sweeps a
174
+ * *tighter* radius than the centreline (`radius − half`, shrinking toward
175
+ * zero as the half-width closes on the radius) while the chord stays
176
+ * straight. The result stands proud sideways instead of vertically: a hull
177
+ * a hand's width into the lane a character is looking straight down, on
178
+ * flat, ordinary-looking track. It reads as the player colliding with the
179
+ * track itself, worst while sliding — measured at a hairpin
180
+ * where the chord missed the true inner boundary by most of a metre and
181
+ * cost a character their whole speed on an axis nothing was drawn across.
182
+ *
183
+ * `cuts` already measures this: `leftSlip`/`rightSlip` below are the same
184
+ * per-edge chord error the cut count is chosen from. What was missing was
185
+ * anywhere for the *leftover* of that specific error to go once the cut
186
+ * ceiling was reached — `extraEase` only ever paid down the diagonal
187
+ * (camber) term. This pays the lateral remainder by drawing both top
188
+ * corners in toward the section's own centreline, which can only ever
189
+ * shrink the hull — the ground a character stands on is still the smooth
190
+ * curve `RibbonSurface` answers from, never this mesh, so a hull inset by
191
+ * centimetres at an extreme apex changes nothing about where a body can
192
+ * walk, only how snugly its sides are held.
193
+ */
194
+ let lateralEase = 0;
195
+ /** One corner of a wedge: the eased top corner, and the bottom under it. */
196
+ const corner = (s, right) => {
197
+ // The give travels along the section's own normal; so does the extra.
198
+ const ex = s.gx === 0 && s.gy === 0 && s.gz === 0 ? 0 : extraEase / Math.hypot(s.gx, s.gy, s.gz);
199
+ const gx = s.gx * (1 + ex);
200
+ const gy = s.gy * (1 + ex);
201
+ const gz = s.gz * (1 + ex);
202
+ let topX = right ? s.rx : s.lx;
203
+ let topY = right ? s.ry : s.ly;
204
+ let topZ = right ? s.rz : s.lz;
205
+ if (lateralEase > 0) {
206
+ let dx = s.rx - s.lx;
207
+ let dy = s.ry - s.ly;
208
+ let dz = s.rz - s.lz;
209
+ const dl = Math.hypot(dx, dy, dz);
210
+ if (dl > 1e-9) {
211
+ const inset = (Math.min(lateralEase, dl * 0.45) / dl) * (right ? -1 : 1);
212
+ dx *= inset;
213
+ dy *= inset;
214
+ dz *= inset;
215
+ topX += dx;
216
+ topY += dy;
217
+ topZ += dz;
218
+ }
219
+ }
220
+ if (right) {
221
+ wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.rbx, s.rby, s.rbz);
222
+ }
223
+ else {
224
+ wedgePoints.push(topX - gx, topY - gy, topZ - gz, s.lbx, s.lby, s.lbz);
225
+ }
226
+ };
227
+ /**
228
+ * The collision under one drawn quad: two wedges, one per drawn triangle.
229
+ *
230
+ * A convex hull's *top face is a plane*, and the deck between two
231
+ * cross-sections is not one. Hulling the whole quad therefore bridged its
232
+ * warp, and the bridge stood proud of the deck the player walks on: measured
233
+ * across a day's route, up to **6 m** of warp on one in eight spans, leaving
234
+ * hull tops as much as 0.6 m above the drawn surface. A character standing where
235
+ * the deck is drawn was then *inside* solid collision — unable to lift, so
236
+ * auto-step could not fire, unable to move, so a full run died against
237
+ * nothing visible. Reported on the same span every time: on a steep hill the
238
+ * player stops climbing, forward input leaves them standing still, and they
239
+ * are stuck inside the track's own parts.
240
+ *
241
+ * Splitting the quad laterally was an attempt to bound that bridge, and it
242
+ * could not: following a 24° roll to within four centimetres needs ninety
243
+ * strips, and the cap of six left five sixths of the error in place. A
244
+ * triangle needs no bound. Its three corners *define* a plane, so this wedge's
245
+ * top face is the drawn triangle exactly — the same corners, the same diagonal
246
+ * `Strip.quad` indexes — and the pair of them tiles the quad with no seam
247
+ * between and none to the neighbouring span. Two wedges per quad is also
248
+ * fewer colliders than the strips averaged.
249
+ *
250
+ * The bottom corners hang under their own cross-section's normal, so a side
251
+ * face can still be a little warped where the bank rolls. That bulge is
252
+ * lateral, under the deck, bounded by the slab's own depth, and shared with
253
+ * the wedge next door: it is not somewhere anyone stands.
254
+ */
255
+ const wedgeQuad = (p, c) => {
256
+ /*
257
+ * Flat enough to be its own hull? Then one collider, not two. The warp is
258
+ * the current-left corner's distance from the plane of the other three.
259
+ */
260
+ const ax = p.lx - p.gx;
261
+ const ay = p.ly - p.gy;
262
+ const az = p.lz - p.gz;
263
+ const e1x = p.rx - p.gx - ax;
264
+ const e1y = p.ry - p.gy - ay;
265
+ const e1z = p.rz - p.gz - az;
266
+ const e2x = c.rx - c.gx - ax;
267
+ const e2y = c.ry - c.gy - ay;
268
+ const e2z = c.rz - c.gz - az;
269
+ let nx = e1y * e2z - e1z * e2y;
270
+ let ny = e1z * e2x - e1x * e2z;
271
+ let nz = e1x * e2y - e1y * e2x;
272
+ const nl = Math.hypot(nx, ny, nz);
273
+ if (nl > 1e-9) {
274
+ nx /= nl;
275
+ ny /= nl;
276
+ nz /= nl;
277
+ const warp = Math.abs((c.lx - c.gx - ax) * nx + (c.ly - c.gy - ay) * ny + (c.lz - c.gz - az) * nz);
278
+ if (warp <= FLAT_QUAD_M) {
279
+ wedgePoints.length = 0;
280
+ corner(p, false);
281
+ corner(p, true);
282
+ corner(c, true);
283
+ corner(c, false);
284
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
285
+ return;
286
+ }
287
+ }
288
+ // The diagonal the mesh indexes: previous-left to current-right.
289
+ wedgePoints.length = 0;
290
+ corner(p, false);
291
+ corner(p, true);
292
+ corner(c, true);
293
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
294
+ wedgePoints.length = 0;
295
+ corner(p, false);
296
+ corner(c, true);
297
+ corner(c, false);
298
+ colliders.push(colliderFromShape(hullShape(wedgePoints)));
299
+ };
300
+ const band = options.edgeBandM ?? 0;
301
+ const edgeSide = options.edgeSide ?? 1;
302
+ const lift = options.liftM ?? 0;
303
+ const give = options.colliderGiveM ?? RIBBON_COLLIDER_GIVE_M;
304
+ /*
305
+ * The lateral range is normalised, and that is a correctness fix rather than tidiness.
306
+ *
307
+ * A slab built from a *descending* range comes out inside-out: measured signed volume
308
+ * +256 one way round and -256 the other. With back-face culling — which the renderer
309
+ * uses everywhere — an inside-out slab is **invisible from outside**, so you look
310
+ * straight through it. That is exactly what shows up under a canal bridge: the ceiling
311
+ * looks glassy and transparent from below, and fixing one side leaves the opposite one
312
+ * untouched — because a canal on one hand
313
+ * multiplies every offset by -1, which reverses the order and turns every band it
314
+ * builds inside out.
315
+ *
316
+ * Fixing it here rather than at the call sites is the point: a caller expressing
317
+ * "from the coping to the far bank" has said something about *space*, not about winding,
318
+ * and no caller should have to know that the difference is visible.
319
+ */
320
+ const rangeA = options.lateralFromM;
321
+ const rangeB = options.lateralToM;
322
+ const swap = rangeA !== undefined && rangeB !== undefined && rangeA > rangeB;
323
+ const lateralFrom = swap ? rangeB : rangeA;
324
+ const lateralTo = swap ? rangeA : rangeB;
325
+ const absolute = lateralFrom !== undefined && lateralTo !== undefined;
326
+ const fill = (d, into) => {
327
+ spline.sampleAt(d, sample);
328
+ const half = sample.widthM * 0.5;
329
+ /*
330
+ * Three ways to span a cross-section: the whole surface, a band inset from
331
+ * one edge (a kerb), or a band between two given offsets (a marking).
332
+ */
333
+ /*
334
+ * Ordered, and the order is what decides the triangle winding.
335
+ *
336
+ * Every quad in this builder puts the first offset at the section's *left* corner
337
+ * and the second at its right, and back faces are culled — so if the two ever
338
+ * arrive the other way round, the piece is built inside out. That is exactly what
339
+ * happened, and it was invisible for as long as it was symmetric:
340
+ *
341
+ * - the full surface spans `-half` to `+half`, left before right, correct;
342
+ * - a kerb at `edgeSide = -1` spans `-half` to `-half + band`, also correct;
343
+ * - a kerb at `edgeSide = +1` spans `+half` to `+half - band` — **reversed**, so
344
+ * its top face points into the deck and is culled, and what shows through is the
345
+ * surface underneath and the band's own underside.
346
+ *
347
+ * One kerb of the two, on one side of every route, worst where a curve brings it to
348
+ * a grazing angle. Once the depth layers had cleaned up the left, the right was
349
+ * unchanged: borders and lines still fighting the main surface, worst on curves.
350
+ *
351
+ * The `absolute` case has the same hazard from the same cause — the canal passes its
352
+ * two offsets multiplied by a side — so this is not special-cased to kerbs. Sorting
353
+ * the pair costs nothing and makes the winding a property of the builder rather than
354
+ * of what a caller happened to pass.
355
+ */
356
+ const edgeA = absolute ? lateralFrom : band > 0 ? half * edgeSide : -half;
357
+ const edgeB = absolute ? lateralTo : band > 0 ? (half - band) * edgeSide : half;
358
+ const outer = Math.min(edgeA, edgeB);
359
+ const inner = Math.max(edgeA, edgeB);
360
+ const cx = sample.x + sample.normalX * lift;
361
+ const cy = sample.y + sample.normalY * lift;
362
+ const cz = sample.z + sample.normalZ * lift;
363
+ const lx = cx + sample.rightX * outer;
364
+ const ly = cy + sample.rightY * outer;
365
+ const lz = cz + sample.rightZ * outer;
366
+ const rx = cx + sample.rightX * inner;
367
+ const ry = cy + sample.rightY * inner;
368
+ const rz = cz + sample.rightZ * inner;
369
+ into.lx = lx;
370
+ into.ly = ly;
371
+ into.lz = lz;
372
+ into.rx = rx;
373
+ into.ry = ry;
374
+ into.rz = rz;
375
+ into.lbx = lx - sample.normalX * thickness;
376
+ into.lby = ly - sample.normalY * thickness;
377
+ into.lbz = lz - sample.normalZ * thickness;
378
+ into.rbx = rx - sample.normalX * thickness;
379
+ into.rby = ry - sample.normalY * thickness;
380
+ into.rbz = rz - sample.normalZ * thickness;
381
+ // The collider's top eases below the drawn one by the give, never past the slab.
382
+ const ease = Math.min(give, thickness * 0.5);
383
+ into.gx = sample.normalX * ease;
384
+ into.gy = sample.normalY * ease;
385
+ into.gz = sample.normalZ * ease;
386
+ };
387
+ /** One drawn facet of the slab: four faces, and the collision under them. */
388
+ const slab = (p, c) => {
389
+ // Top, then bottom, then the two sides. Orders chosen so each quad's
390
+ // computed normal points out of the slab; the winding test proves it.
391
+ strip.quad(p.lx, p.ly, p.lz, p.rx, p.ry, p.rz, c.rx, c.ry, c.rz, c.lx, c.ly, c.lz, color, emissiveNow);
392
+ strip.quad(c.lbx, c.lby, c.lbz, c.rbx, c.rby, c.rbz, p.rbx, p.rby, p.rbz, p.lbx, p.lby, p.lbz, color, emissiveNow);
393
+ strip.quad(p.rx, p.ry, p.rz, p.rbx, p.rby, p.rbz, c.rbx, c.rby, c.rbz, c.rx, c.ry, c.rz, color, emissiveNow);
394
+ strip.quad(p.lbx, p.lby, p.lbz, p.lx, p.ly, p.lz, c.lx, c.ly, c.lz, c.lbx, c.lby, c.lbz, color, emissiveNow);
395
+ // Drawn and collided in the same breath, from the same corners.
396
+ wedgeQuad(p, c);
397
+ };
398
+ const copy = (from, to) => {
399
+ to.lx = from.lx;
400
+ to.ly = from.ly;
401
+ to.lz = from.lz;
402
+ to.rx = from.rx;
403
+ to.ry = from.ry;
404
+ to.rz = from.rz;
405
+ to.lbx = from.lbx;
406
+ to.lby = from.lby;
407
+ to.lbz = from.lbz;
408
+ to.rbx = from.rbx;
409
+ to.rby = from.rby;
410
+ to.rbz = from.rbz;
411
+ // The give travels with the section it was measured on. It did not have to
412
+ // before, when only `current` was ever collided; now a wedge takes two
413
+ // cross-sections and half of every quad would have stood flush with the
414
+ // drawn deck — a micro-wall at each facet ridge, the whole way along.
415
+ to.gx = from.gx;
416
+ to.gy = from.gy;
417
+ to.gz = from.gz;
418
+ };
419
+ /** Seal the open end of a piece so the slab is a closed solid. */
420
+ const cap = (s, facingForward) => {
421
+ if (facingForward) {
422
+ strip.quad(s.rx, s.ry, s.rz, s.rbx, s.rby, s.rbz, s.lbx, s.lby, s.lbz, s.lx, s.ly, s.lz, color, emissiveNow);
423
+ }
424
+ else {
425
+ strip.quad(s.lx, s.ly, s.lz, s.lbx, s.lby, s.lbz, s.rbx, s.rby, s.rbz, s.rx, s.ry, s.rz, color, emissiveNow);
426
+ }
427
+ };
428
+ // One extra step so the final cross-section lands exactly on the end.
429
+ const startAt = Math.max(0, options.fromM ?? 0);
430
+ const endAt = Math.min(spline.lengthM, options.toM ?? spline.lengthM);
431
+ const span = endAt - startAt;
432
+ if (span <= 0)
433
+ return { mesh: strip.build(), colliders };
434
+ const steps = Math.max(1, Math.ceil(span / step));
435
+ const exactStep = span / steps;
436
+ for (let i = 0; i <= steps; i++) {
437
+ const d = startAt + i * exactStep;
438
+ /*
439
+ * A cross-section is present when the surface exists on at least one side
440
+ * of it. That is what makes a hole's edge sharp: the section bordering a
441
+ * hole is still built, so the piece before it gets its end cap in the right
442
+ * place rather than stopping a step short.
443
+ */
444
+ const before = i > 0 && !inHole(options.holes, d - exactStep * 0.5);
445
+ const after = i < steps && !inHole(options.holes, d + exactStep * 0.5);
446
+ if (!before && !after) {
447
+ if (havePrevious) {
448
+ cap(previous, true);
449
+ havePrevious = false;
450
+ }
451
+ continue;
452
+ }
453
+ fill(d, current);
454
+ if (options.shade !== undefined)
455
+ emissiveNow = options.shade(d, color);
456
+ if (!before) {
457
+ // Opening a new piece.
458
+ cap(current, false);
459
+ copy(current, previous);
460
+ havePrevious = true;
461
+ continue;
462
+ }
463
+ if (havePrevious) {
464
+ /*
465
+ * As many facets as this stretch of curve needs, never fewer.
466
+ *
467
+ * `step` is one number for a whole route, and a route does not turn at one
468
+ * rate. Where a route reverses its camber — one measured case rolls 17° one
469
+ * way to 16° the other inside nine metres, across a deck 17 m wide — a 2 m facet
470
+ * cuts that corner by **0.85 m**. Everything downstream then disagrees
471
+ * about where the deck is: `RibbonSurface` answers from the smooth curve
472
+ * and puts a character most of a metre inside the drawn slab, where they are
473
+ * buried in their own floor. Buried, they cannot lift, so auto-step cannot
474
+ * fire, so they cannot walk — on that exact camber the player stays stuck
475
+ * the moment they try to run, with impacts on every ridge from the same gap.
476
+ *
477
+ * So the builder measures its own error and subdivides until it is small,
478
+ * rather than trusting a constant. Only the fast-turning spans pay, and
479
+ * they are the ones that were broken.
480
+ */
481
+ const dPrev = d - exactStep;
482
+ fill((dPrev + d) * 0.5, probe);
483
+ /*
484
+ * Measured at the *diagonal*, which is where a quad is furthest from the
485
+ * curve it stands for.
486
+ *
487
+ * Two cross-sections that differ in bank are skew lines, and the surface
488
+ * ruled between them is not flat — but two triangles are. Both of them
489
+ * share the diagonal, so along that diagonal the drawn deck is the plain
490
+ * average of two opposite corners, while the real deck at the same place
491
+ * is the mid-section's own centre. The gap between those is the whole
492
+ * error, and it is *linear* in the step: half a metre of bank roll across
493
+ * a seventeen-metre deck puts fourteen centimetres of it under a character's
494
+ * feet, which is the give's entire budget spent before the give does any
495
+ * of its own work.
496
+ *
497
+ * Measuring the edges instead — the obvious thing, and what this did
498
+ * first — sees almost none of it: a chord along an edge is out by
499
+ * millimetres where the diagonal is out by a hand's width.
500
+ */
501
+ const diagSlip = Math.hypot((probe.lx + probe.rx) * 0.5 - (previous.lx + current.rx) * 0.5, (probe.ly + probe.ry) * 0.5 - (previous.ly + current.ry) * 0.5, (probe.lz + probe.rz) * 0.5 - (previous.lz + current.rz) * 0.5);
502
+ const leftSlip = Math.hypot(probe.lx - (previous.lx + current.lx) * 0.5, probe.ly - (previous.ly + current.ly) * 0.5, probe.lz - (previous.lz + current.lz) * 0.5);
503
+ const rightSlip = Math.hypot(probe.rx - (previous.rx + current.rx) * 0.5, probe.ry - (previous.ry + current.ry) * 0.5, probe.rz - (previous.rz + current.rz) * 0.5);
504
+ const slip = Math.max(diagSlip, leftSlip, rightSlip);
505
+ const cuts = slip > MAX_FACET_SLIP_M ? Math.min(MAX_FACET_CUTS, Math.ceil(slip / MAX_FACET_SLIP_M)) : 1;
506
+ /*
507
+ * Whatever a whole number of cuts could not take out, the ease takes.
508
+ * Never past the slab's own depth, so a wedge cannot turn inside out.
509
+ */
510
+ extraEase = Math.min(Math.max(0, slip / cuts - MAX_FACET_SLIP_M), thickness * 0.5);
511
+ /*
512
+ * The edge-specific half of the same leftover, paid across the section
513
+ * instead of along it — see `lateralEase` above. `leftSlip`/`rightSlip`
514
+ * are exactly the per-edge error `cuts` was chosen from; only their
515
+ * share of what the cut ceiling could not remove needs paying here.
516
+ */
517
+ lateralEase = Math.min(Math.max(0, Math.max(leftSlip, rightSlip) / cuts - MAX_FACET_SLIP_M), 1.5);
518
+ for (let s = 1; s <= cuts; s++) {
519
+ if (s < cuts) {
520
+ const dSub = dPrev + exactStep * (s / cuts);
521
+ fill(dSub, sub);
522
+ if (options.shade !== undefined)
523
+ emissiveNow = options.shade(dSub, color);
524
+ slab(previous, sub);
525
+ copy(sub, previous);
526
+ }
527
+ else {
528
+ if (options.shade !== undefined)
529
+ emissiveNow = options.shade(d, color);
530
+ slab(previous, current);
531
+ }
532
+ }
533
+ extraEase = 0;
534
+ lateralEase = 0;
535
+ }
536
+ copy(current, previous);
537
+ havePrevious = true;
538
+ if (!after) {
539
+ cap(current, true);
540
+ havePrevious = false;
541
+ }
542
+ }
543
+ if (havePrevious)
544
+ cap(previous, true);
545
+ return { mesh: strip.build(), colliders };
546
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Closing the inside of a model that is only a surface.
3
+ *
4
+ * **The problem is common and it is not a defect in any one asset.** A great many bought models
5
+ * are exterior shells: a car with no cabin, a building with no rooms, a figure that is skin and
6
+ * nothing under it. Drawn on their own they are correct, and the moment a viewer can see through
7
+ * an opening in them — a grille, a vent, a window aperture, a doorway — they look straight
8
+ * through the object and out the far side. It reads as a rendering fault and is not one.
9
+ *
10
+ * Two pieces are needed and neither replaces the other, which is the whole design here:
11
+ *
12
+ * - **A copy of the model, drawn inside itself.** It follows every curve exactly, because it *is*
13
+ * every curve, so it backs each panel with no tuning and no knowledge of what the model is. It
14
+ * cannot help with an opening, because a copy of a shell has the same hole in the same place.
15
+ * - **A generated solid, behind it.** It has no holes, so it is what a viewer sees through one.
16
+ * It cannot follow a surface, so it is held well inside and never asked to.
17
+ *
18
+ * **Everything here takes sizes and numbers.** What a subject looks like is the caller's to state,
19
+ * through `profile`: this module knows about bounds and fractions and nothing about cars.
20
+ */
21
+ import type { MeshData } from '../render/mesh.ts';
22
+ import type { Vec3 } from '../math/color.ts';
23
+ /**
24
+ * One station along the model, from one end to the other.
25
+ *
26
+ * Every value is a fraction, so a profile is a shape rather than a size and the same one fits a
27
+ * model of any dimensions. `width` and `roofWidth` are of the half width; `waist` and `top` are
28
+ * of the height.
29
+ */
30
+ export interface ShellStation {
31
+ /** Where along the long axis this station sits, 0 at one end and 1 at the other. */
32
+ readonly at: number;
33
+ /** Half width of the lower mass here. */
34
+ readonly width: number;
35
+ /** Where the lower mass stops and the upper one begins. Equal to `top` for a single mass. */
36
+ readonly waist: number;
37
+ /** Half width of the upper mass. Zero where there is none. */
38
+ readonly roofWidth: number;
39
+ /** The top of the upper mass, or of the lower one where there is no upper. */
40
+ readonly top: number;
41
+ }
42
+ /**
43
+ * A plain inset block, which is the safe answer for a shape nothing is known about.
44
+ *
45
+ * Deliberately not clever. A profile that guessed at a silhouette would be wrong for most models
46
+ * and wrong in the one direction that shows: standing out through the surface it is meant to sit
47
+ * behind. A caller that knows what its subject looks like passes a better one.
48
+ */
49
+ export declare const DEFAULT_SHELL_PROFILE: readonly ShellStation[];
50
+ export interface ShellFillOptions {
51
+ /** Near black by default, because a fill is read as the absence of a hole rather than as a thing. */
52
+ readonly color?: Vec3;
53
+ /**
54
+ * How far inside the model's own width and height the solid sits, 0 to 1.
55
+ *
56
+ * **Well inside, and the default says so.** A stack of boxes is a bounding volume and most
57
+ * models are curved, so a solid sized to touch the surface stands through it somewhere. It does
58
+ * not need to reach: the copy of the model backs the surface, and this only has to sit behind
59
+ * the openings.
60
+ */
61
+ readonly inset?: number;
62
+ /** The same, along the long axis, where a shape usually tapers hardest. */
63
+ readonly lengthInset?: number;
64
+ /** How many boxes the solid is built from. More follows a profile more closely. */
65
+ readonly slices?: number;
66
+ /** What the subject looks like from the side. See `ShellStation`. */
67
+ readonly profile?: readonly ShellStation[];
68
+ /** Lifts the solid off the model's floor, as a fraction of height. */
69
+ readonly floor?: number;
70
+ }
71
+ /**
72
+ * A solid to stand inside a hollow model, sized from the space it has to fill.
73
+ *
74
+ * `size` is the model's own extent in metres and `baseY` where its underside sits, which is all
75
+ * this needs: the solid is centred on the origin in x and z, as a fitted model is.
76
+ */
77
+ export declare function buildShellFill(size: {
78
+ readonly x: number;
79
+ readonly y: number;
80
+ readonly z: number;
81
+ }, baseY: number, options?: ShellFillOptions): MeshData;
82
+ /**
83
+ * The same surface, in one flat colour and facing both ways.
84
+ *
85
+ * This is the half that follows the model exactly. Drawn slightly smaller and inside the original
86
+ * it backs every panel with no tuning at all, and it is given a single colour because otherwise
87
+ * an opening shows the model's own brightwork through it, which is what it exists to hide.
88
+ *
89
+ * Both windings are emitted for the reason `addSolidBox` emits both: a shell is opaque only from
90
+ * the side its triangles face, and this one is looked at from inside as often as out. Normals are
91
+ * negated with the reversed copy, or the inward face is shaded as though lit from within.
92
+ */
93
+ export declare function shellSkin(mesh: MeshData, color?: Vec3): MeshData;
94
+ /**
95
+ * A uniform scale about a height, for drawing a skin just inside the model it came from.
96
+ *
97
+ * The translation column is what keeps the shrink centred on the model rather than on the world
98
+ * origin: scaling about zero would drop it through whatever it stands on by a fraction of its own
99
+ * height, which is small enough to look like a shadow fault rather than like this.
100
+ */
101
+ export declare function shellFillMatrix(scale: number, centreY: number, out: Float32Array): Float32Array;