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