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