@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,109 @@
1
+ /**
2
+ * A colour grade: a lookup table over display values, applied where the output transform is.
3
+ *
4
+ * **A look, not a conversion, and the difference decides where it goes.** `outputTransform.ts` is
5
+ * the conversion from scene units to display values and every pass has to agree about it. A grade
6
+ * is what a colourist did afterwards — the same three numbers in, three different numbers out —
7
+ * and it is *display-referred*, which is what every `.cube` a grading tool exports is. So it is
8
+ * applied **after** the transform and never before it.
9
+ *
10
+ * **It rides the composite and needs `screenEffects`, which is the same rule `hdrScene` already
11
+ * carries and in the same words**: without a composite there is nothing at the end to grade in.
12
+ * Every forward pass grades *itself* when nothing follows it, so a lookup table applied there
13
+ * would need a sampler in six programs to reach a consumer who has deliberately switched
14
+ * post-processing off — and a consumer who switched post-processing off did not ask for a grade.
15
+ * `setColourGrade` says so out loud rather than doing nothing, because a look that silently does
16
+ * not apply is the failure this repository's rules exist to prevent.
17
+ *
18
+ * **`RGBA8` and trilinear, which is what a lookup table is everywhere.** The alpha channel is
19
+ * unused and opaque; a three-channel texture would save a quarter and is not a format WebGL2 can
20
+ * filter as a 3D target. The filtering is what makes a 32-lattice table smooth — without it the
21
+ * grade bands, which is the one artefact a grade must never introduce.
22
+ */
23
+
24
+ /** A cube of display values: `size` on each axis, `size ** 3 * 4` bytes, red varying fastest. */
25
+ export interface ColourGradeLut {
26
+ /** Lattice points along each axis. 32 and 33 are what grading tools export. */
27
+ readonly size: number;
28
+ /** `RGBA8`, `size ** 3 * 4` bytes, indexed `((b * size + g) * size + r) * 4`. */
29
+ readonly data: Uint8Array;
30
+ }
31
+
32
+ /**
33
+ * The lattice the placeholder is built at, and **two is exact rather than merely small**.
34
+ *
35
+ * Identity is a linear function and a trilinear fetch through a lattice whose corners hold their
36
+ * own coordinates reproduces a linear function exactly. So the texture bound when nothing is
37
+ * graded is the right answer if anything ever samples it, rather than an inert stand-in that
38
+ * happens not to be read — which is the same reasoning the ambient-occlusion and bloom
39
+ * placeholders give for being a real texture rather than an unbound unit.
40
+ */
41
+ export const GRADE_PLACEHOLDER_SIZE = 2;
42
+
43
+ /**
44
+ * The largest lattice accepted, because the cost is cubic and a caller will not feel it.
45
+ *
46
+ * 64 is a megabyte of texture; 128 would be eight. Refused by name rather than resampled, because
47
+ * a resample is a look the caller did not choose — and a grade that is quietly not the grade
48
+ * somebody authored is worse than one that will not load.
49
+ */
50
+ export const MAX_GRADE_SIZE = 64;
51
+
52
+ /**
53
+ * A table that changes nothing.
54
+ *
55
+ * Live code rather than a test fixture: it is what a frame with no grade has bound, and it is what
56
+ * a consumer starts from when building one by hand.
57
+ */
58
+ export function identityGradeLut(size: number): ColourGradeLut {
59
+ const data = new Uint8Array(size * size * size * 4);
60
+ const last = size > 1 ? size - 1 : 1;
61
+ let at = 0;
62
+ /*
63
+ * Blue slowest, red fastest — the order a 3D texture is stored in, and the order the fetch
64
+ * assumes. Walking it the other way builds a table that is valid, filters correctly, and swaps
65
+ * the picture's colour axes, which reads as a bad export rather than as a packing bug.
66
+ */
67
+ for (let b = 0; b < size; b++) {
68
+ for (let g = 0; g < size; g++) {
69
+ for (let r = 0; r < size; r++) {
70
+ data[at] = Math.round((r / last) * 255);
71
+ data[at + 1] = Math.round((g / last) * 255);
72
+ data[at + 2] = Math.round((b / last) * 255);
73
+ data[at + 3] = 255;
74
+ at += 4;
75
+ }
76
+ }
77
+ }
78
+ return { size, data };
79
+ }
80
+
81
+ /**
82
+ * Refuse a table that is not one, at init, naming what was expected.
83
+ *
84
+ * **Fail fast and loud is the rule and this is where it applies**: a lookup table of the wrong
85
+ * length is a file read wrongly, and it still uploads, still filters and still draws a picture —
86
+ * one whose colours are a scrambled function of the right ones. Nothing downstream can tell.
87
+ */
88
+ export function validateGradeLut(lut: ColourGradeLut): void {
89
+ if (!Number.isInteger(lut.size) || lut.size < 2) {
90
+ throw new Error(
91
+ `setColourGrade: a lookup table needs at least 2 lattice points a side, got ${lut.size}. ` +
92
+ 'A single texel is a constant colour, not a grade.',
93
+ );
94
+ }
95
+ if (lut.size > MAX_GRADE_SIZE) {
96
+ throw new Error(
97
+ `setColourGrade: ${lut.size} lattice points a side is past the ceiling of ` +
98
+ `${MAX_GRADE_SIZE}, which is a megabyte of texture. Resample it yourself if that is ` +
99
+ 'what you meant — this will not do it silently, because a resample is a look.',
100
+ );
101
+ }
102
+ const expected = lut.size ** 3 * 4;
103
+ if (lut.data.length !== expected) {
104
+ throw new Error(
105
+ `setColourGrade: a ${lut.size}-lattice table expects ${expected} bytes of RGBA8 and this ` +
106
+ `one has ${lut.data.length}. Red varies fastest, then green, then blue.`,
107
+ );
108
+ }
109
+ }
@@ -0,0 +1,83 @@
1
+ import { createHandleRegistry, definitionAt, type HandleRegistry } from './handleRegistry.ts';
2
+
3
+ /**
4
+ * A compute definition a package contributes, and the two things it is handed.
5
+ *
6
+ * **This is `pass.ts` again, for the one stage that only one backend has.** A package that wants
7
+ * a radix sort, a light binner or a skinning kernel has nowhere to put it: the renderer's verb
8
+ * surface is fixed and nothing outside `render/` can add to it. `registerPass` answered that for
9
+ * drawing; this answers it for the stage before drawing.
10
+ */
11
+
12
+ /**
13
+ * What a registered definition is handed once, at registration, to build its resources.
14
+ *
15
+ * **There is no WebGL2 arm, and that absence is the type saying so.** `PassDevice` is a union
16
+ * because both backends can draw. WebGL2 has no compute shaders — not "not yet", the language has
17
+ * none — so a second arm would be a shape a contributor could switch on and never reach.
18
+ * `Renderer.computeSupported` answers `false` there and `registerCompute` refuses in words.
19
+ *
20
+ * Tagged all the same, so that a second arm arriving later is a compile error at every
21
+ * contributor rather than a silent widening, and so this reads as the same shape as `PassDevice`
22
+ * to somebody who has just read that one.
23
+ */
24
+ export type ComputeDevice = { readonly backend: 'webgpu'; readonly device: GPUDevice };
25
+
26
+ /**
27
+ * What it is handed at each dispatch.
28
+ *
29
+ * **The engine opens the pass and hands it over, rather than handing over the command encoder.**
30
+ * A definition holding the encoder could open a compute pass while a render pass was open, which
31
+ * WebGPU forbids and which reports itself at `submit` rather than at the call that caused it —
32
+ * the failure shape the 2026-08-14 rule is about, where the result is no picture from a frame
33
+ * that recorded correctly. Handing over the pass keeps that invariant in one place instead of in
34
+ * every contributor.
35
+ *
36
+ * A definition that needs an encoder of its own for a readback still has one: it holds `device`
37
+ * from `init`, and a `copyBufferToBuffer` submitted afterwards sees this dispatch's result,
38
+ * because submission order is execution order.
39
+ */
40
+ export type ComputeContext = { readonly backend: 'webgpu'; readonly pass: GPUComputePassEncoder };
41
+
42
+ export interface ComputeDefinition {
43
+ /** For diagnostics, and for the label the backend gives the encoder and the pass. */
44
+ readonly label: string;
45
+ /** Build pipelines and buffers. Called once, when the definition is registered. */
46
+ init?(device: ComputeDevice): void;
47
+ /**
48
+ * Set a pipeline, set bind groups, and call `dispatchWorkgroups`.
49
+ *
50
+ * **The workgroup count is yours and does not cross the surface**, exactly as a contributed
51
+ * pass issues its own draw calls. The count comes from data the definition owns — a light
52
+ * count, a cluster count — so a renderer-side `(x, y, z)` would be one fact in two places, and
53
+ * the renderer's copy would be the one nobody updated.
54
+ *
55
+ * **Allocates nothing.** This is a per-frame path and the house rule about them binds a
56
+ * contributor exactly as it binds the renderer.
57
+ */
58
+ dispatch(ctx: ComputeContext): void;
59
+ /** Release what `init` built. Called on `unregisterCompute` and when the renderer is disposed. */
60
+ dispose?(device: ComputeDevice): void;
61
+ }
62
+
63
+ /**
64
+ * A registered definition, as the caller holds it.
65
+ *
66
+ * A slot and a generation packed into one number, for the reason `PassHandle` explains: a handle
67
+ * kept past `unregisterCompute` answers nothing rather than answering to whoever took the slot.
68
+ */
69
+ export type ComputeHandle = number;
70
+
71
+ export type ComputeRegistry = HandleRegistry<ComputeDefinition>;
72
+
73
+ export function createComputeRegistry(): ComputeRegistry {
74
+ return createHandleRegistry<ComputeDefinition>();
75
+ }
76
+
77
+ /** The definition a handle names, or `undefined` if it names one that has been released. */
78
+ export function computeAt(
79
+ registry: ComputeRegistry,
80
+ handle: ComputeHandle,
81
+ ): ComputeDefinition | undefined {
82
+ return definitionAt(registry, handle);
83
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Notice a lost drawing context, notice it coming back, and ask the browser for it.
3
+ *
4
+ * The engine owns the GL context, so it owns noticing both halves. A game reaching for
5
+ * `renderer.canvas.addEventListener('webglcontextlost')` would be the game reaching into
6
+ * the engine's internals.
7
+ *
8
+ * `preventDefault` is not politeness: it is the browser's signal that the page intends to
9
+ * restore rather than to die. Without it the context is gone for good and the player is
10
+ * looking at a black canvas that nothing will ever repaint.
11
+ *
12
+ * **The restore is a separate sink, and that is the point.** Routing it to `onLost` would
13
+ * report a fault at the moment the fault ended, which reads in a bug report as a device
14
+ * that lost its context twice. `NFD6QQ` is the report that proved the restore half was
15
+ * missing altogether: the promise `preventDefault` makes was made 29 s into a session on
16
+ * an Adreno 619, and nothing in either repository had ever been listening to keep it.
17
+ *
18
+ * Restoring is *not* the same as redrawing. Every resource the renderer holds is created
19
+ * in its constructor and `readonly` thereafter — the same reason a quality change is
20
+ * construction-time — so a listener that wants pixels again has to take the page through
21
+ * a reload. This function only makes the moment observable.
22
+ */
23
+ /**
24
+ * Returns a detach function, which a renderer that can be torn down has to call.
25
+ *
26
+ * The listeners used to be anonymous and therefore unremovable. That is invisible in a
27
+ * game whose renderer lives as long as its page, and a leak in one that does not: a game
28
+ * embedded in a website is mounted and unmounted every time the player enters and leaves
29
+ * it, and each mount left a pair of listeners holding the previous renderer alive through
30
+ * their closures.
31
+ */
32
+ export function attachContextLoss(
33
+ canvas: HTMLCanvasElement,
34
+ onLost: () => void,
35
+ onRestored: () => void,
36
+ ): () => void {
37
+ const lost = (event: Event): void => {
38
+ event.preventDefault();
39
+ onLost();
40
+ };
41
+ const restored = (): void => {
42
+ onRestored();
43
+ };
44
+ canvas.addEventListener('webglcontextlost', lost);
45
+ canvas.addEventListener('webglcontextrestored', restored);
46
+ return () => {
47
+ canvas.removeEventListener('webglcontextlost', lost);
48
+ canvas.removeEventListener('webglcontextrestored', restored);
49
+ };
50
+ }
@@ -0,0 +1,411 @@
1
+ import { createLineSegments } from './linePoints.ts';
2
+ import type { LineSegments } from './linePoints.ts';
3
+ import type { MeshData } from './mesh.ts';
4
+ import type { ConvexShape } from '@driftengine/physics';
5
+ import type { PhysicsWorld } from '@driftengine/physics';
6
+
7
+ /**
8
+ * Debug geometry, as line segments the renderer already knows how to draw.
9
+ *
10
+ * **This is the generator and not a pass**, and that is the whole reason it is small: `drawLines`
11
+ * has shipped on both backends since the polyline batch landed, with a world-space width and a
12
+ * pixel floor so a distant line does not strobe. What was missing was anything that turns what you
13
+ * want to *see* — a mesh's normals, the colliders a body actually carries — into segments, so every
14
+ * consumer who wanted a normals key wrote the geometry themselves or, far more often, did not.
15
+ *
16
+ * **What its absence has cost, measured rather than supposed.** One consumer wrote geometry with
17
+ * downward normals four separate times: their roads, their ditch banks, their roof planes, and
18
+ * every building in their world lit inside out. Each was found by looking at a screenshot and
19
+ * wondering why tarmac was black at midday, because a flipped normal near a lamp is a dimmer
20
+ * surface rather than an absent one and only a directional light makes it plain. A key that draws
21
+ * normals turns each of those into a ten-second job.
22
+ *
23
+ * **Nothing here throws and nothing here allocates after construction.** A debug drawer that threw
24
+ * when it ran out of room would take the frame with it at exactly the moment somebody was trying to
25
+ * see what was wrong, which is the opposite of its job; so a segment past capacity is counted in
26
+ * `dropped` and discarded, and a consumer who cares reads that number and builds a bigger one.
27
+ */
28
+ export class DebugLines {
29
+ readonly segments: LineSegments;
30
+ private overflow = 0;
31
+
32
+ constructor(capacity: number) {
33
+ if (!(capacity > 0)) throw new Error(`DebugLines: capacity must be positive, got ${capacity}`);
34
+ this.segments = createLineSegments(capacity);
35
+ }
36
+
37
+ /** Segments asked for since the last `clear` that there was no room for. */
38
+ get dropped(): number {
39
+ return this.overflow;
40
+ }
41
+
42
+ clear(): void {
43
+ this.segments.count = 0;
44
+ this.overflow = 0;
45
+ }
46
+
47
+ segment(ax: number, ay: number, az: number, bx: number, by: number, bz: number): void {
48
+ const at = this.segments.count;
49
+ if (at >= this.segments.capacity) {
50
+ this.overflow++;
51
+ return;
52
+ }
53
+ this.segments.from[at * 3] = ax;
54
+ this.segments.from[at * 3 + 1] = ay;
55
+ this.segments.from[at * 3 + 2] = az;
56
+ this.segments.to[at * 3] = bx;
57
+ this.segments.to[at * 3 + 1] = by;
58
+ this.segments.to[at * 3 + 2] = bz;
59
+ this.segments.count = at + 1;
60
+ }
61
+
62
+ /**
63
+ * A spike out of every vertex along its normal.
64
+ *
65
+ * `stride` skips vertices, because a mesh of a hundred thousand vertices is a hundred thousand
66
+ * segments and a screen with nothing legible on it. The default draws them all, which is right
67
+ * for the small piece of geometry somebody is actually staring at.
68
+ *
69
+ * **A mesh built from flat faces has four coincident normals per quad**, so what appears is one
70
+ * spike per corner rather than one per face, and that is the honest picture: the attribute is per
71
+ * vertex and this draws the attribute.
72
+ */
73
+ normals(mesh: MeshData, length = 0.25, stride = 1): void {
74
+ const count = mesh.positions.length / 3;
75
+ for (let v = 0; v < count; v += stride) {
76
+ const x = mesh.positions[v * 3] ?? 0;
77
+ const y = mesh.positions[v * 3 + 1] ?? 0;
78
+ const z = mesh.positions[v * 3 + 2] ?? 0;
79
+ this.segment(
80
+ x,
81
+ y,
82
+ z,
83
+ x + (mesh.normals[v * 3] ?? 0) * length,
84
+ y + (mesh.normals[v * 3 + 1] ?? 0) * length,
85
+ z + (mesh.normals[v * 3 + 2] ?? 0) * length,
86
+ );
87
+ }
88
+ }
89
+
90
+ /** The twelve edges of a world-axis box. */
91
+ box(cx: number, cy: number, cz: number, hx: number, hy: number, hz: number): void {
92
+ for (const [a, b] of BOX_EDGES) {
93
+ this.segment(
94
+ cx + hx * (a[0] ?? 0),
95
+ cy + hy * (a[1] ?? 0),
96
+ cz + hz * (a[2] ?? 0),
97
+ cx + hx * (b[0] ?? 0),
98
+ cy + hy * (b[1] ?? 0),
99
+ cz + hz * (b[2] ?? 0),
100
+ );
101
+ }
102
+ }
103
+
104
+ /** Three great circles, which is a sphere as far as an eye looking for one is concerned. */
105
+ sphere(cx: number, cy: number, cz: number, radius: number, points = 24): void {
106
+ this.circle(cx, cy, cz, radius, 1, 0, 0, 0, 0, 1, points);
107
+ this.circle(cx, cy, cz, radius, 1, 0, 0, 0, 1, 0, points);
108
+ this.circle(cx, cy, cz, radius, 0, 1, 0, 0, 0, 1, points);
109
+ }
110
+
111
+ /**
112
+ * A closed ring of `points` segments, in the plane the two unit vectors span.
113
+ *
114
+ * The basis is passed in rather than derived from an axis because every caller here already has
115
+ * one, and deriving a perpendicular from an axis has a degenerate case that a caller with a real
116
+ * basis does not need to think about.
117
+ */
118
+ circle(
119
+ cx: number,
120
+ cy: number,
121
+ cz: number,
122
+ radius: number,
123
+ ux: number,
124
+ uy: number,
125
+ uz: number,
126
+ vx: number,
127
+ vy: number,
128
+ vz: number,
129
+ points = 24,
130
+ ): void {
131
+ let px = cx + ux * radius;
132
+ let py = cy + uy * radius;
133
+ let pz = cz + uz * radius;
134
+ for (let i = 1; i <= points; i++) {
135
+ const angle = (i / points) * Math.PI * 2;
136
+ const c = Math.cos(angle) * radius;
137
+ const s = Math.sin(angle) * radius;
138
+ const nx = cx + ux * c + vx * s;
139
+ const ny = cy + uy * c + vy * s;
140
+ const nz = cz + uz * c + vz * s;
141
+ this.segment(px, py, pz, nx, ny, nz);
142
+ px = nx;
143
+ py = ny;
144
+ pz = nz;
145
+ }
146
+ }
147
+
148
+ /**
149
+ * One collider, placed by a body's position and orientation.
150
+ *
151
+ * **Dispatched on what the shape *is* rather than on a stored kind**, which is the same
152
+ * discrimination the narrow phase makes: a `sideRadius` is a cylinder, a `triangles` is a mesh, a
153
+ * `radius` over one point is a sphere and over two is a capsule, and anything with faces is a
154
+ * polytope drawn along its own face loops. A shape that grows a new representation appears here
155
+ * as its polytope hull rather than as nothing, which is the failure worth having.
156
+ */
157
+ shape(
158
+ shape: ConvexShape,
159
+ px: number,
160
+ py: number,
161
+ pz: number,
162
+ qx = 0,
163
+ qy = 0,
164
+ qz = 0,
165
+ qw = 1,
166
+ ): void {
167
+ const points = shape.vertices.length / 3;
168
+ const at = (i: number, out: number[]): void => {
169
+ rotate(
170
+ shape.vertices[i * 3] ?? 0,
171
+ shape.vertices[i * 3 + 1] ?? 0,
172
+ shape.vertices[i * 3 + 2] ?? 0,
173
+ qx,
174
+ qy,
175
+ qz,
176
+ qw,
177
+ out,
178
+ );
179
+ out[0] = (out[0] ?? 0) + px;
180
+ out[1] = (out[1] ?? 0) + py;
181
+ out[2] = (out[2] ?? 0) + pz;
182
+ };
183
+
184
+ const mesh = shape.triangles;
185
+ if (mesh !== undefined) {
186
+ for (let t = 0; t < mesh.triangleCount; t++) {
187
+ for (let e = 0; e < 3; e++) {
188
+ const i = mesh.indices[t * 3 + e] ?? 0;
189
+ const j = mesh.indices[t * 3 + ((e + 1) % 3)] ?? 0;
190
+ /* Each interior edge belongs to two triangles; drawing it once is the same picture at
191
+ half the segments, which matters when the capacity is what stops the drawing. */
192
+ if (i > j) continue;
193
+ rotate(
194
+ mesh.positions[i * 3] ?? 0,
195
+ mesh.positions[i * 3 + 1] ?? 0,
196
+ mesh.positions[i * 3 + 2] ?? 0,
197
+ qx,
198
+ qy,
199
+ qz,
200
+ qw,
201
+ A,
202
+ );
203
+ rotate(
204
+ mesh.positions[j * 3] ?? 0,
205
+ mesh.positions[j * 3 + 1] ?? 0,
206
+ mesh.positions[j * 3 + 2] ?? 0,
207
+ qx,
208
+ qy,
209
+ qz,
210
+ qw,
211
+ B,
212
+ );
213
+ this.segment(
214
+ (A[0] ?? 0) + px,
215
+ (A[1] ?? 0) + py,
216
+ (A[2] ?? 0) + pz,
217
+ (B[0] ?? 0) + px,
218
+ (B[1] ?? 0) + py,
219
+ (B[2] ?? 0) + pz,
220
+ );
221
+ }
222
+ }
223
+ return;
224
+ }
225
+
226
+ if (points === 1) {
227
+ at(0, A);
228
+ this.sphere(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, shape.radius);
229
+ return;
230
+ }
231
+
232
+ if (points === 2 && (shape.radius > 0 || shape.sideRadius > 0)) {
233
+ at(0, A);
234
+ at(1, B);
235
+ const round = shape.sideRadius > 0 ? shape.sideRadius : shape.radius;
236
+ basis(A, B, U, V);
237
+ if (shape.sideRadius > 0) {
238
+ /* A cylinder: two flat caps and a straight side, with a sharp rim between them. */
239
+ this.circle(
240
+ A[0] ?? 0,
241
+ A[1] ?? 0,
242
+ A[2] ?? 0,
243
+ round,
244
+ U[0] ?? 0,
245
+ U[1] ?? 0,
246
+ U[2] ?? 0,
247
+ V[0] ?? 0,
248
+ V[1] ?? 0,
249
+ V[2] ?? 0,
250
+ );
251
+ this.circle(
252
+ B[0] ?? 0,
253
+ B[1] ?? 0,
254
+ B[2] ?? 0,
255
+ round,
256
+ U[0] ?? 0,
257
+ U[1] ?? 0,
258
+ U[2] ?? 0,
259
+ V[0] ?? 0,
260
+ V[1] ?? 0,
261
+ V[2] ?? 0,
262
+ );
263
+ } else {
264
+ /* A capsule: a ball at each end, which is what its rounding actually is. */
265
+ this.sphere(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, round);
266
+ this.sphere(B[0] ?? 0, B[1] ?? 0, B[2] ?? 0, round);
267
+ }
268
+ for (const [sx, sy] of SIDE_ANGLES) {
269
+ const ox = (U[0] ?? 0) * sx * round + (V[0] ?? 0) * sy * round;
270
+ const oy = (U[1] ?? 0) * sx * round + (V[1] ?? 0) * sy * round;
271
+ const oz = (U[2] ?? 0) * sx * round + (V[2] ?? 0) * sy * round;
272
+ this.segment(
273
+ (A[0] ?? 0) + ox,
274
+ (A[1] ?? 0) + oy,
275
+ (A[2] ?? 0) + oz,
276
+ (B[0] ?? 0) + ox,
277
+ (B[1] ?? 0) + oy,
278
+ (B[2] ?? 0) + oz,
279
+ );
280
+ }
281
+ return;
282
+ }
283
+
284
+ const faces = shape.faceVertexStart.length - 1;
285
+ for (let f = 0; f < faces; f++) {
286
+ const start = shape.faceVertexStart[f] ?? 0;
287
+ const end = shape.faceVertexStart[f + 1] ?? 0;
288
+ for (let k = start; k < end; k++) {
289
+ const i = shape.faceVertexIndices[k] ?? 0;
290
+ const j = shape.faceVertexIndices[k + 1 === end ? start : k + 1] ?? 0;
291
+ /* Every edge is in two face loops, once each way round. Keeping the ascending one draws it
292
+ exactly once. */
293
+ if (i > j) continue;
294
+ at(i, A);
295
+ at(j, B);
296
+ this.segment(A[0] ?? 0, A[1] ?? 0, A[2] ?? 0, B[0] ?? 0, B[1] ?? 0, B[2] ?? 0);
297
+ }
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Every body's collider in a world, where it is this tick.
303
+ *
304
+ * The other half of the key the report asked for. Bodies with no shape are skipped rather than
305
+ * refused: a world may hold one for a frame while it is being built.
306
+ */
307
+ colliders(world: PhysicsWorld): void {
308
+ const bodies = world.bodies;
309
+ for (let i = 0; i < bodies.count; i++) {
310
+ const shape = bodies.shape[i];
311
+ if (shape === undefined) continue;
312
+ this.shape(
313
+ shape,
314
+ bodies.posX[i] ?? 0,
315
+ bodies.posY[i] ?? 0,
316
+ bodies.posZ[i] ?? 0,
317
+ bodies.rotX[i] ?? 0,
318
+ bodies.rotY[i] ?? 0,
319
+ bodies.rotZ[i] ?? 0,
320
+ bodies.rotW[i] ?? 1,
321
+ );
322
+ }
323
+ }
324
+ }
325
+
326
+ /** Scratch, at module scope because a debug frame draws thousands of these. */
327
+ const A: number[] = [0, 0, 0];
328
+ const B: number[] = [0, 0, 0];
329
+ const U: number[] = [0, 0, 0];
330
+ const V: number[] = [0, 0, 0];
331
+
332
+ /** Where the four side lines of a capsule or cylinder sit around its axis. */
333
+ const SIDE_ANGLES: readonly (readonly [number, number])[] = [
334
+ [1, 0],
335
+ [0, 1],
336
+ [-1, 0],
337
+ [0, -1],
338
+ ];
339
+
340
+ const BOX_EDGES: readonly (readonly [readonly number[], readonly number[]])[] = (() => {
341
+ const corners: number[][] = [];
342
+ for (const x of [-1, 1])
343
+ for (const y of [-1, 1]) for (const z of [-1, 1]) corners.push([x, y, z]);
344
+ const edges: [number[], number[]][] = [];
345
+ for (let i = 0; i < corners.length; i++) {
346
+ for (let j = i + 1; j < corners.length; j++) {
347
+ const a = corners[i] as number[];
348
+ const b = corners[j] as number[];
349
+ let differing = 0;
350
+ for (let k = 0; k < 3; k++) if (a[k] !== b[k]) differing++;
351
+ if (differing === 1) edges.push([a, b]);
352
+ }
353
+ }
354
+ return edges;
355
+ })();
356
+
357
+ /** `q * v * q⁻¹`, the standard two-cross form, into `out`. */
358
+ function rotate(
359
+ x: number,
360
+ y: number,
361
+ z: number,
362
+ qx: number,
363
+ qy: number,
364
+ qz: number,
365
+ qw: number,
366
+ out: number[],
367
+ ): void {
368
+ const tx = 2 * (qy * z - qz * y);
369
+ const ty = 2 * (qz * x - qx * z);
370
+ const tz = 2 * (qx * y - qy * x);
371
+ out[0] = x + qw * tx + (qy * tz - qz * ty);
372
+ out[1] = y + qw * ty + (qz * tx - qx * tz);
373
+ out[2] = z + qw * tz + (qx * ty - qy * tx);
374
+ }
375
+
376
+ /**
377
+ * Two unit vectors perpendicular to the segment `a → b`, and to each other.
378
+ *
379
+ * The perpendicular is taken against whichever world axis the segment points along least, which is
380
+ * what stops the cross product collapsing for an axis-aligned shape — and every capsule and
381
+ * cylinder anybody builds is axis-aligned, so the degenerate case is the common one rather than the
382
+ * exotic one.
383
+ */
384
+ function basis(a: number[], b: number[], u: number[], v: number[]): void {
385
+ let ax = (b[0] ?? 0) - (a[0] ?? 0);
386
+ let ay = (b[1] ?? 0) - (a[1] ?? 0);
387
+ let az = (b[2] ?? 0) - (a[2] ?? 0);
388
+ const length = Math.hypot(ax, ay, az) || 1;
389
+ ax /= length;
390
+ ay /= length;
391
+ az /= length;
392
+ const absX = Math.abs(ax);
393
+ const absY = Math.abs(ay);
394
+ const absZ = Math.abs(az);
395
+ const px = absX <= absY && absX <= absZ ? 1 : 0;
396
+ const py = absY < absX && absY <= absZ ? 1 : 0;
397
+ const pz = px === 0 && py === 0 ? 1 : 0;
398
+ let ux = ay * pz - az * py;
399
+ let uy = az * px - ax * pz;
400
+ let uz = ax * py - ay * px;
401
+ const ulength = Math.hypot(ux, uy, uz) || 1;
402
+ ux /= ulength;
403
+ uy /= ulength;
404
+ uz /= ulength;
405
+ u[0] = ux;
406
+ u[1] = uy;
407
+ u[2] = uz;
408
+ v[0] = ay * uz - az * uy;
409
+ v[1] = az * ux - ax * uz;
410
+ v[2] = ax * uy - ay * ux;
411
+ }