@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,305 @@
1
+ import type { FramePacingReport } from './framePacer.ts';
2
+ import type { FrameOverlay } from './frameOverlay.ts';
3
+ /**
4
+ * The surface a clip is recorded from: a fixed-size frame, composited and paced.
5
+ *
6
+ * Three things it fixes, all of which were visible in the first export:
7
+ *
8
+ * **Aspect is rendered, not cropped.** The scene is drawn at the export's own
9
+ * pixel size, so a vertical clip is *framed* vertically. Cropping a 16:9 view to
10
+ * 9:16 throws away 44% of the width, and the subject is exactly what falls
11
+ * outside — the shot was composed for the other rectangle.
12
+ *
13
+ * **The frame is composited.** The scene canvas is copied into a target of
14
+ * exactly the requested size and the mark is stamped on top, so branding is
15
+ * inside the video rather than in DOM that the capture never sees.
16
+ *
17
+ * **Frames are paced.** `captureStream(0)` records nothing until asked, so every
18
+ * frame in the file is one the renderer actually finished. Capturing at a rate
19
+ * the renderer cannot hold samples some frames twice and misses the next, which
20
+ * is what uneven duplication looks like: judder.
21
+ *
22
+ * **The honest limit.** `MediaRecorder` timestamps by wall clock, so an export
23
+ * runs in real time and no amount of pacing changes that. There is no in-browser
24
+ * way to render slower than real time and still have the audio line up, short of
25
+ * shipping a muxer — which is a dependency, and the standing rule says no. What
26
+ * pacing *can* do is make every frame in the file the same distance from the last,
27
+ * by counting animation frames rather than milliseconds — see `FramePacer`. A
28
+ * device that cannot hold the requested rate then records a slower clip rather than
29
+ * a juddering one, and the measurement in `pacing` says which it was.
30
+ */
31
+ export interface LockableSurface {
32
+ /** Pin the drawing buffer to an exact pixel size, ignoring CSS and DPR. */
33
+ lockDrawingBuffer(width: number, height: number): void;
34
+ unlockDrawingBuffer(): void;
35
+ }
36
+ export interface ExportTargetOptions {
37
+ /** The canvas the scene is drawn into. */
38
+ readonly source: HTMLCanvasElement;
39
+ /** Whoever owns that canvas's drawing-buffer size. */
40
+ readonly surface: LockableSurface;
41
+ readonly width: number;
42
+ readonly height: number;
43
+ readonly fps: number;
44
+ /**
45
+ * Stamped into every frame, and baked once.
46
+ *
47
+ * Accepts a function of the final frame size, because the size is not always
48
+ * the one asked for — a device that cannot hold the rate records smaller. A
49
+ * mark laid out for the larger frame and drawn into the smaller one lands on
50
+ * fractional pixels, which is the difference between a wordmark and a smudge.
51
+ */
52
+ readonly overlay?: FrameOverlay | ((width: number, height: number) => FrameOverlay);
53
+ /**
54
+ * Drawn into every frame, live.
55
+ *
56
+ * The counterpart to `overlay`, which is baked once because a wordmark and a
57
+ * share code do not change. Anything that *does* change per frame — a
58
+ * speedometer, a clock, a lap counter — cannot go through that path at all, and
59
+ * re-baking an overlay each frame would allocate a canvas per frame to say so.
60
+ * So this is handed the composite's own context instead and draws straight into
61
+ * it, after the scene and after the baked mark.
62
+ *
63
+ * Called once per composed frame, including the still-image path, so a still
64
+ * carries whatever a clip would. Receives the *final* frame size for the same
65
+ * reason `overlay` does: a device that cannot hold the rate records smaller, and
66
+ * an instrument laid out for the larger frame lands on fractional pixels.
67
+ *
68
+ * The context is owned by the target: a hook that leaves transforms, clips or
69
+ * composite state behind will corrupt later frames, so it must restore what it
70
+ * changes. Save/restore is wrapped here so the common case needs no discipline.
71
+ */
72
+ readonly drawFrame?: (ctx: CanvasRenderingContext2D, width: number, height: number) => void;
73
+ /**
74
+ * The renderer's own presented-frame count, e.g. `() => renderer.presentedFrames`.
75
+ *
76
+ * Optional, and reached for no reason but this: `compose()` composites once per encoded
77
+ * frame regardless of whether the renderer presented anything new since the call before —
78
+ * it has no way to ask, only to draw whatever is on `source` right now — so a scene that
79
+ * presents nothing between two frames of an export is composited twice, byte-identical, at
80
+ * two different timestamps. Passing this closes the loop: `duplicateFrame` after `compose()`
81
+ * says whether that just happened, read out of the renderer rather than guessed at from
82
+ * outside it. Omit it and `compose()` behaves exactly as before — nothing here forces or
83
+ * skips a draw, it only reports what already happened.
84
+ */
85
+ readonly presentedFrames?: () => number;
86
+ }
87
+ /**
88
+ * How much smaller the fallback frame is, per side.
89
+ *
90
+ * Two thirds, which takes 1080x1920 to exactly 720x1280 and costs 56% of the
91
+ * pixels — enough to buy back a frame rate, little enough that the clip is still
92
+ * sharp on a phone. The choice between them is made from a *measurement* of what
93
+ * the renderer is actually managing, never from a device string: the same model
94
+ * of phone runs at two different rates depending on how warm it is.
95
+ */
96
+ export declare const EXPORT_FALLBACK_SCALE: number;
97
+ export interface ExportSize {
98
+ readonly width: number;
99
+ readonly height: number;
100
+ /** True when the measurement forced the smaller frame. */
101
+ readonly reduced: boolean;
102
+ }
103
+ /**
104
+ * The size asked for, evened — for an encode whose schedule is *ours*.
105
+ *
106
+ * The counterpart to `exportSizeFor`, and the distinction is the whole point.
107
+ * `exportSizeFor` trades pixels for frame rate, which is the right trade for a
108
+ * real-time recorder: `MediaRecorder` stamps by wall clock, so a device that
109
+ * cannot draw an export-size frame in 16 ms produces a *worse file*, and a
110
+ * smaller frame it can hold is the better clip.
111
+ *
112
+ * An offline encode makes no such trade, because it has no clock to lose to.
113
+ * Every frame is stamped with where it belongs (see `frameTimestampUs`), so a
114
+ * device that needs 40 ms a frame produces the same file as one that needs 4 —
115
+ * it just waits longer for it. Reducing there buys nothing but a shorter wait,
116
+ * and it is paid for in the one thing the clip is for.
117
+ *
118
+ * That mattered most on exactly the devices least able to argue: the reduction
119
+ * gate is `measuredFps × windowPixels / exportPixels ≥ targetFps × 1.15`, which
120
+ * at a vsync-capped 60 fps needs a drawing buffer of 2.38 Mpx to clear. A phone
121
+ * has about 1.5 Mpx (a ~412×915 viewport at a DPR capped to 2), so *no* 60 Hz
122
+ * phone could ever earn the full frame: every mobile clip came out 720×1280 at
123
+ * 6.1 Mbit/s where a desktop's was 1080×1920 at 13.7. Same shot, same 60 fps,
124
+ * a quarter of the detail — which gets reported as a difference in "graphics
125
+ * detail" rather than in frame rate. It was neither; it was pixels.
126
+ *
127
+ * Both dimensions stay even, for the same reason as below.
128
+ */
129
+ export declare function exportSizeExact(width: number, height: number): ExportSize;
130
+ /**
131
+ * The frame size to record at, given what the renderer is currently managing.
132
+ *
133
+ * Both dimensions stay even: every H.264 encoder in the share path wants an even
134
+ * width and height, and an odd one is either rejected or silently padded.
135
+ */
136
+ export declare function exportSizeFor(width: number, height: number, measuredFps: number, targetFps: number,
137
+ /**
138
+ * Pixels the measurement was taken at — the window's own drawing buffer.
139
+ *
140
+ * Without it the comparison is between a rate measured on a 1200x700 window and
141
+ * a demand made of a 1080x1920 frame, which is three times the pixels: a
142
+ * machine holding a comfortable 100 fps in the window is credited with being
143
+ * able to hold it at the export size, and it cannot. That optimism is why an
144
+ * export dropped frames on hardware whose preview was flawless. Omit for the
145
+ * old behaviour, which is to trust the raw number.
146
+ */
147
+ measuredAtPixels?: number): ExportSize;
148
+ /**
149
+ * Frame rates a clip may be recorded at, best first.
150
+ *
151
+ * A ladder rather than a constant: a clip records at 120 if it can, else 60, else 30,
152
+ * falling one rung at a time rather than straight to the floor.
153
+ * Each rung is half the one above it so a display's refresh divides cleanly by the
154
+ * stride the pacer ends up using, which is what keeps the cadence even.
155
+ */
156
+ export declare const CLIP_FPS_LADDER: readonly number[];
157
+ /**
158
+ * The highest rate on the ladder this device can actually deliver, at this size.
159
+ *
160
+ * **The default is the device's own maximum** rather than a fixed rate. The ladder
161
+ * therefore starts above any
162
+ * panel this is likely to meet and walks down, so a 165 Hz monitor records 165 rather
163
+ * than being rounded to the nearest tidy number. The rungs are the rates real displays
164
+ * actually run at; anything between them is served by the next one down, which the
165
+ * pacer can hit with a whole stride.
166
+ *
167
+ * Two ceilings, and both are hard. **A clip cannot be captured faster than the game
168
+ * is drawn**, because `FramePacer` takes every n-th animation frame, so a 60 Hz panel
169
+ * cannot produce a 120 fps file however fast the machine is; asking anyway would
170
+ * write a file claiming 120 while holding 60, which is precisely the lie the frame
171
+ * schedule exists to prevent. And **the export size is not the window size**, so the
172
+ * measured rate is scaled by pixel count exactly as `exportSizeFor` scales it, or a
173
+ * machine comfortable in a small window is credited with a 1080x1920 frame it cannot
174
+ * push.
175
+ *
176
+ * Returns the lowest rung when nothing clears, rather than nothing: at that point the
177
+ * device is slow enough that `exportSizeFor` is about to reduce the frame, and the
178
+ * lower rate is what makes that reduction sufficient.
179
+ */
180
+ export declare function clipFpsFor(width: number, height: number, measuredFps: number,
181
+ /** Pixels the measurement was taken at. Zero trusts the raw number, as above. */
182
+ measuredAtPixels?: number, ladder?: readonly number[]): number;
183
+ /** The aspect ratio a camera must be given to frame for this export. */
184
+ export declare function exportAspect(width: number, height: number): number;
185
+ /**
186
+ * Bits per second for a frame size and rate.
187
+ *
188
+ * Scaled to the pixel count rather than fixed. A constant 8 Mbit/s is generous
189
+ * at 720p and thin at 1080x1920, and thin bitrate on high-motion footage reads
190
+ * to the eye as stutter rather than as softness — a fast-cut gameplay edit is
191
+ * nothing but high motion, so this is not a subtle effect. Bounded at both ends: below the
192
+ * floor the picture falls apart, above the ceiling the upload is the slow part
193
+ * of sharing.
194
+ */
195
+ export declare function clipBitrate(width: number, height: number, fps: number): number;
196
+ /**
197
+ * Whether a frame read at `presentedCount` repeats the one composed at `lastPresentedCount`.
198
+ *
199
+ * `null` says nothing has been composed yet, so a first frame is never a duplicate of a frame
200
+ * that never happened — a literal `0` there would misread the renderer's own starting count as
201
+ * a repeat of it. Pulled out of `compose()` on purpose: it is the one piece of that method's
202
+ * job that touches no canvas, so it is the one piece a test can hold to account without a DOM —
203
+ * this repository's tests run in `node`, per `vitest.config.ts`, and `ExportTarget` itself
204
+ * creates a real `<canvas>` at construction.
205
+ */
206
+ export declare function isDuplicateFrame(lastPresentedCount: number | null, presentedCount: number): boolean;
207
+ export declare class ExportTarget {
208
+ private readonly options;
209
+ private readonly composite;
210
+ private readonly ctx;
211
+ private readonly pacer;
212
+ private mark;
213
+ private stream;
214
+ private videoTrack;
215
+ private acquired;
216
+ /** The instant this animation frame was decided on — see `captureDue`. */
217
+ private frameAtMs;
218
+ /**
219
+ * The renderer's `presentedFrames` as of the last `compose()`, or null before the first one.
220
+ *
221
+ * Null rather than 0, deliberately: a renderer's own count starts at 0 too, and a first
222
+ * frame compared against that literal would read as a duplicate of a frame that never
223
+ * happened. Null can only mean "nothing composed yet".
224
+ */
225
+ private lastPresentedFrames;
226
+ /** What the last `compose()` found. See `duplicateFrame`. */
227
+ private wasDuplicate;
228
+ constructor(options: ExportTargetOptions);
229
+ get width(): number;
230
+ get height(): number;
231
+ get aspect(): number;
232
+ /**
233
+ * Take over the render surface and hand back the stream to record.
234
+ *
235
+ * `captureStream(0)` rather than a frame rate: the recorder then takes a frame
236
+ * only when `frameRendered` says one is ready, so it can never sample the same
237
+ * rendered frame twice.
238
+ */
239
+ /**
240
+ * Take over the render surface and bake the mark, without a stream.
241
+ *
242
+ * For an offline render, which composites and encodes frames itself and has nothing to
243
+ * stream to. `acquire` is this plus a stream; keeping them separate means the offline
244
+ * path never creates a `MediaStream` it would only have to stop.
245
+ */
246
+ lock(): void;
247
+ /** Whether the source canvas has actually taken the locked size yet. */
248
+ get ready(): boolean;
249
+ acquire(): MediaStream;
250
+ /**
251
+ * Whether the next frame drawn will be kept.
252
+ *
253
+ * Asked *before* rendering, so the render loop can skip a frame the recorder
254
+ * would only throw away — see `FramePacer.due` for why that is a correctness
255
+ * matter and not merely a saving.
256
+ *
257
+ * **Call this once per animation frame, drawing or not.** The instant is kept and
258
+ * reused when the frame is handed over, so the schedule is queried and advanced
259
+ * on one clock. It used to take a second reading at the end of the render pass,
260
+ * which put the pacer's grid a whole render ahead of the frames arriving and cost
261
+ * most of the rate: target 60 fps on a 60 Hz display captured 59.5 when a frame
262
+ * cost 4 ms, 40 at 6 ms and 30 at 12 ms, and an export-size frame always costs
263
+ * more than 6 ms.
264
+ */
265
+ captureDue(nowMs: number): boolean;
266
+ /**
267
+ * One rendered frame. Composites and offers it to the recorder if it is due.
268
+ *
269
+ * Must be called at the end of the render pass, in the same task: a WebGL
270
+ * drawing buffer is only guaranteed readable until the browser composites the
271
+ * page, so copying it from a timer produces black frames on some drivers.
272
+ *
273
+ * Takes no instant on purpose — it uses the one `captureDue` was given for this
274
+ * frame. There is no second clock to get wrong.
275
+ *
276
+ * Returns true when the frame was captured, so a caller can count.
277
+ */
278
+ frameRendered(): boolean;
279
+ /**
280
+ * Draw the current scene plus the mark into the composite.
281
+ *
282
+ * Also the still-image path: a downloadable frame is the cheapest shareable
283
+ * artefact there is, and it must carry the same mark as the clip.
284
+ *
285
+ * **Draws unconditionally, even when `duplicateFrame` is about to say the source has not
286
+ * changed.** Deciding what to do with a repeated frame — drop it, hold the last one longer,
287
+ * encode it anyway — is a policy choice about the file being produced, and this class
288
+ * produces composites rather than files; see `presentedFrames` on `ExportTargetOptions` for
289
+ * where that decision gets the information it needs to make it.
290
+ */
291
+ compose(): HTMLCanvasElement;
292
+ /**
293
+ * Whether the frame `compose()` just drew is byte-identical to the one before it, because
294
+ * the renderer's own count of presented frames did not move between the two calls.
295
+ *
296
+ * False when `presentedFrames` was never supplied, and false for the very first `compose()`
297
+ * regardless — a frame nothing has been compared against yet is not a repeat of anything.
298
+ */
299
+ get duplicateFrame(): boolean;
300
+ get pacing(): FramePacingReport;
301
+ /** Start the measurement over, keeping the schedule. See `FramePacer`. */
302
+ resetPacing(): void;
303
+ /** Give the surface back. Safe to call more than once. */
304
+ release(): void;
305
+ }
@@ -0,0 +1,368 @@
1
+ import { FramePacer } from './framePacer.js';
2
+ import { bakeOverlay } from './frameOverlay.js';
3
+ /**
4
+ * How much smaller the fallback frame is, per side.
5
+ *
6
+ * Two thirds, which takes 1080x1920 to exactly 720x1280 and costs 56% of the
7
+ * pixels — enough to buy back a frame rate, little enough that the clip is still
8
+ * sharp on a phone. The choice between them is made from a *measurement* of what
9
+ * the renderer is actually managing, never from a device string: the same model
10
+ * of phone runs at two different rates depending on how warm it is.
11
+ */
12
+ export const EXPORT_FALLBACK_SCALE = 2 / 3;
13
+ /**
14
+ * The share of the target rate the renderer has to be holding to earn the full
15
+ * frame. Below it, the export is already dropping frames before the extra
16
+ * composite work is added.
17
+ */
18
+ const FULL_SIZE_FPS_MARGIN = 1.15;
19
+ /**
20
+ * The size asked for, evened — for an encode whose schedule is *ours*.
21
+ *
22
+ * The counterpart to `exportSizeFor`, and the distinction is the whole point.
23
+ * `exportSizeFor` trades pixels for frame rate, which is the right trade for a
24
+ * real-time recorder: `MediaRecorder` stamps by wall clock, so a device that
25
+ * cannot draw an export-size frame in 16 ms produces a *worse file*, and a
26
+ * smaller frame it can hold is the better clip.
27
+ *
28
+ * An offline encode makes no such trade, because it has no clock to lose to.
29
+ * Every frame is stamped with where it belongs (see `frameTimestampUs`), so a
30
+ * device that needs 40 ms a frame produces the same file as one that needs 4 —
31
+ * it just waits longer for it. Reducing there buys nothing but a shorter wait,
32
+ * and it is paid for in the one thing the clip is for.
33
+ *
34
+ * That mattered most on exactly the devices least able to argue: the reduction
35
+ * gate is `measuredFps × windowPixels / exportPixels ≥ targetFps × 1.15`, which
36
+ * at a vsync-capped 60 fps needs a drawing buffer of 2.38 Mpx to clear. A phone
37
+ * has about 1.5 Mpx (a ~412×915 viewport at a DPR capped to 2), so *no* 60 Hz
38
+ * phone could ever earn the full frame: every mobile clip came out 720×1280 at
39
+ * 6.1 Mbit/s where a desktop's was 1080×1920 at 13.7. Same shot, same 60 fps,
40
+ * a quarter of the detail — which gets reported as a difference in "graphics
41
+ * detail" rather than in frame rate. It was neither; it was pixels.
42
+ *
43
+ * Both dimensions stay even, for the same reason as below.
44
+ */
45
+ export function exportSizeExact(width, height) {
46
+ return { width: even(width), height: even(height), reduced: false };
47
+ }
48
+ /**
49
+ * The frame size to record at, given what the renderer is currently managing.
50
+ *
51
+ * Both dimensions stay even: every H.264 encoder in the share path wants an even
52
+ * width and height, and an odd one is either rejected or silently padded.
53
+ */
54
+ export function exportSizeFor(width, height, measuredFps, targetFps,
55
+ /**
56
+ * Pixels the measurement was taken at — the window's own drawing buffer.
57
+ *
58
+ * Without it the comparison is between a rate measured on a 1200x700 window and
59
+ * a demand made of a 1080x1920 frame, which is three times the pixels: a
60
+ * machine holding a comfortable 100 fps in the window is credited with being
61
+ * able to hold it at the export size, and it cannot. That optimism is why an
62
+ * export dropped frames on hardware whose preview was flawless. Omit for the
63
+ * old behaviour, which is to trust the raw number.
64
+ */
65
+ measuredAtPixels = 0) {
66
+ /*
67
+ * Fill rate is the binding cost here — shadow maps, water, the film pass are
68
+ * all per-pixel — so the estimate is linear in pixel count. Crude, and far
69
+ * closer than assuming the frame is free.
70
+ */
71
+ const estimate = measuredAtPixels > 0
72
+ ? (measuredFps * measuredAtPixels) / Math.max(width * height, 1)
73
+ : measuredFps;
74
+ if (measuredFps <= 0 || estimate >= targetFps * FULL_SIZE_FPS_MARGIN) {
75
+ return exportSizeExact(width, height);
76
+ }
77
+ return {
78
+ width: even(width * EXPORT_FALLBACK_SCALE),
79
+ height: even(height * EXPORT_FALLBACK_SCALE),
80
+ reduced: true,
81
+ };
82
+ }
83
+ /**
84
+ * Frame rates a clip may be recorded at, best first.
85
+ *
86
+ * A ladder rather than a constant: a clip records at 120 if it can, else 60, else 30,
87
+ * falling one rung at a time rather than straight to the floor.
88
+ * Each rung is half the one above it so a display's refresh divides cleanly by the
89
+ * stride the pacer ends up using, which is what keeps the cadence even.
90
+ */
91
+ export const CLIP_FPS_LADDER = [240, 165, 144, 120, 90, 60, 30];
92
+ /**
93
+ * The highest rate on the ladder this device can actually deliver, at this size.
94
+ *
95
+ * **The default is the device's own maximum** rather than a fixed rate. The ladder
96
+ * therefore starts above any
97
+ * panel this is likely to meet and walks down, so a 165 Hz monitor records 165 rather
98
+ * than being rounded to the nearest tidy number. The rungs are the rates real displays
99
+ * actually run at; anything between them is served by the next one down, which the
100
+ * pacer can hit with a whole stride.
101
+ *
102
+ * Two ceilings, and both are hard. **A clip cannot be captured faster than the game
103
+ * is drawn**, because `FramePacer` takes every n-th animation frame, so a 60 Hz panel
104
+ * cannot produce a 120 fps file however fast the machine is; asking anyway would
105
+ * write a file claiming 120 while holding 60, which is precisely the lie the frame
106
+ * schedule exists to prevent. And **the export size is not the window size**, so the
107
+ * measured rate is scaled by pixel count exactly as `exportSizeFor` scales it, or a
108
+ * machine comfortable in a small window is credited with a 1080x1920 frame it cannot
109
+ * push.
110
+ *
111
+ * Returns the lowest rung when nothing clears, rather than nothing: at that point the
112
+ * device is slow enough that `exportSizeFor` is about to reduce the frame, and the
113
+ * lower rate is what makes that reduction sufficient.
114
+ */
115
+ export function clipFpsFor(width, height, measuredFps,
116
+ /** Pixels the measurement was taken at. Zero trusts the raw number, as above. */
117
+ measuredAtPixels = 0, ladder = CLIP_FPS_LADDER) {
118
+ const lowest = ladder[ladder.length - 1] ?? 30;
119
+ if (!Number.isFinite(measuredFps) || measuredFps <= 0)
120
+ return lowest;
121
+ const estimate = measuredAtPixels > 0
122
+ ? (measuredFps * measuredAtPixels) / Math.max(width * height, 1)
123
+ : measuredFps;
124
+ for (const rate of ladder) {
125
+ // Never above what the display itself produces, and never above what the frame
126
+ // costs allow at export size.
127
+ if (rate > measuredFps)
128
+ continue;
129
+ if (estimate >= rate * FULL_SIZE_FPS_MARGIN)
130
+ return rate;
131
+ }
132
+ return lowest;
133
+ }
134
+ /** The aspect ratio a camera must be given to frame for this export. */
135
+ export function exportAspect(width, height) {
136
+ return width / Math.max(height, 1);
137
+ }
138
+ /**
139
+ * Bits per second for a frame size and rate.
140
+ *
141
+ * Scaled to the pixel count rather than fixed. A constant 8 Mbit/s is generous
142
+ * at 720p and thin at 1080x1920, and thin bitrate on high-motion footage reads
143
+ * to the eye as stutter rather than as softness — a fast-cut gameplay edit is
144
+ * nothing but high motion, so this is not a subtle effect. Bounded at both ends: below the
145
+ * floor the picture falls apart, above the ceiling the upload is the slow part
146
+ * of sharing.
147
+ */
148
+ export function clipBitrate(width, height, fps) {
149
+ const bitsPerPixel = 0.11;
150
+ const raw = width * height * fps * bitsPerPixel;
151
+ return Math.round(Math.min(Math.max(raw, 2_500_000), 24_000_000));
152
+ }
153
+ function even(value) {
154
+ return Math.max(2, Math.round(value / 2) * 2);
155
+ }
156
+ /**
157
+ * Whether a frame read at `presentedCount` repeats the one composed at `lastPresentedCount`.
158
+ *
159
+ * `null` says nothing has been composed yet, so a first frame is never a duplicate of a frame
160
+ * that never happened — a literal `0` there would misread the renderer's own starting count as
161
+ * a repeat of it. Pulled out of `compose()` on purpose: it is the one piece of that method's
162
+ * job that touches no canvas, so it is the one piece a test can hold to account without a DOM —
163
+ * this repository's tests run in `node`, per `vitest.config.ts`, and `ExportTarget` itself
164
+ * creates a real `<canvas>` at construction.
165
+ */
166
+ export function isDuplicateFrame(lastPresentedCount, presentedCount) {
167
+ return lastPresentedCount !== null && presentedCount === lastPresentedCount;
168
+ }
169
+ export class ExportTarget {
170
+ options;
171
+ composite;
172
+ ctx;
173
+ pacer;
174
+ mark = null;
175
+ stream = null;
176
+ videoTrack = null;
177
+ acquired = false;
178
+ /** The instant this animation frame was decided on — see `captureDue`. */
179
+ frameAtMs = 0;
180
+ /**
181
+ * The renderer's `presentedFrames` as of the last `compose()`, or null before the first one.
182
+ *
183
+ * Null rather than 0, deliberately: a renderer's own count starts at 0 too, and a first
184
+ * frame compared against that literal would read as a duplicate of a frame that never
185
+ * happened. Null can only mean "nothing composed yet".
186
+ */
187
+ lastPresentedFrames = null;
188
+ /** What the last `compose()` found. See `duplicateFrame`. */
189
+ wasDuplicate = false;
190
+ constructor(options) {
191
+ this.options = options;
192
+ const canvas = document.createElement('canvas');
193
+ canvas.width = options.width;
194
+ canvas.height = options.height;
195
+ const ctx = canvas.getContext('2d', { alpha: false });
196
+ if (ctx === null)
197
+ throw new Error('This browser cannot composite an export frame.');
198
+ this.composite = canvas;
199
+ this.ctx = ctx;
200
+ this.pacer = new FramePacer(options.fps);
201
+ }
202
+ get width() {
203
+ return this.options.width;
204
+ }
205
+ get height() {
206
+ return this.options.height;
207
+ }
208
+ get aspect() {
209
+ return exportAspect(this.options.width, this.options.height);
210
+ }
211
+ /**
212
+ * Take over the render surface and hand back the stream to record.
213
+ *
214
+ * `captureStream(0)` rather than a frame rate: the recorder then takes a frame
215
+ * only when `frameRendered` says one is ready, so it can never sample the same
216
+ * rendered frame twice.
217
+ */
218
+ /**
219
+ * Take over the render surface and bake the mark, without a stream.
220
+ *
221
+ * For an offline render, which composites and encodes frames itself and has nothing to
222
+ * stream to. `acquire` is this plus a stream; keeping them separate means the offline
223
+ * path never creates a `MediaStream` it would only have to stop.
224
+ */
225
+ lock() {
226
+ if (this.acquired)
227
+ return;
228
+ this.options.surface.lockDrawingBuffer(this.options.width, this.options.height);
229
+ this.acquired = true;
230
+ const { overlay, width, height } = this.options;
231
+ const resolved = typeof overlay === 'function' ? overlay(width, height) : overlay;
232
+ this.mark = resolved === undefined ? null : bakeOverlay(resolved, width, height);
233
+ }
234
+ /** Whether the source canvas has actually taken the locked size yet. */
235
+ get ready() {
236
+ const { source, width, height } = this.options;
237
+ return source.width === width && source.height === height;
238
+ }
239
+ acquire() {
240
+ if (this.stream !== null)
241
+ return this.stream;
242
+ this.lock();
243
+ const stream = this.composite.captureStream(0);
244
+ this.stream = stream;
245
+ this.videoTrack = stream.getVideoTracks()[0] ?? null;
246
+ return stream;
247
+ }
248
+ /**
249
+ * Whether the next frame drawn will be kept.
250
+ *
251
+ * Asked *before* rendering, so the render loop can skip a frame the recorder
252
+ * would only throw away — see `FramePacer.due` for why that is a correctness
253
+ * matter and not merely a saving.
254
+ *
255
+ * **Call this once per animation frame, drawing or not.** The instant is kept and
256
+ * reused when the frame is handed over, so the schedule is queried and advanced
257
+ * on one clock. It used to take a second reading at the end of the render pass,
258
+ * which put the pacer's grid a whole render ahead of the frames arriving and cost
259
+ * most of the rate: target 60 fps on a 60 Hz display captured 59.5 when a frame
260
+ * cost 4 ms, 40 at 6 ms and 30 at 12 ms, and an export-size frame always costs
261
+ * more than 6 ms.
262
+ */
263
+ captureDue(nowMs) {
264
+ this.frameAtMs = nowMs;
265
+ if (this.stream === null)
266
+ return true;
267
+ return this.pacer.due(nowMs);
268
+ }
269
+ /**
270
+ * One rendered frame. Composites and offers it to the recorder if it is due.
271
+ *
272
+ * Must be called at the end of the render pass, in the same task: a WebGL
273
+ * drawing buffer is only guaranteed readable until the browser composites the
274
+ * page, so copying it from a timer produces black frames on some drivers.
275
+ *
276
+ * Takes no instant on purpose — it uses the one `captureDue` was given for this
277
+ * frame. There is no second clock to get wrong.
278
+ *
279
+ * Returns true when the frame was captured, so a caller can count.
280
+ */
281
+ frameRendered() {
282
+ if (this.stream === null)
283
+ return false;
284
+ /*
285
+ * Until the lock has actually taken effect the scene canvas is still the
286
+ * window's size, and copying it would stretch the first frames to the export
287
+ * aspect — the exact distortion this class exists to avoid. Skipping them
288
+ * costs a fraction of a second of clip and guarantees every recorded frame
289
+ * is genuinely the requested shape.
290
+ */
291
+ const { source } = this.options;
292
+ if (source.width !== this.options.width || source.height !== this.options.height)
293
+ return false;
294
+ if (!this.pacer.offer(this.frameAtMs))
295
+ return false;
296
+ this.compose();
297
+ const track = this.videoTrack;
298
+ if (track !== null && 'requestFrame' in track) {
299
+ track.requestFrame();
300
+ }
301
+ return true;
302
+ }
303
+ /**
304
+ * Draw the current scene plus the mark into the composite.
305
+ *
306
+ * Also the still-image path: a downloadable frame is the cheapest shareable
307
+ * artefact there is, and it must carry the same mark as the clip.
308
+ *
309
+ * **Draws unconditionally, even when `duplicateFrame` is about to say the source has not
310
+ * changed.** Deciding what to do with a repeated frame — drop it, hold the last one longer,
311
+ * encode it anyway — is a policy choice about the file being produced, and this class
312
+ * produces composites rather than files; see `presentedFrames` on `ExportTargetOptions` for
313
+ * where that decision gets the information it needs to make it.
314
+ */
315
+ compose() {
316
+ const { source, width, height, drawFrame, presentedFrames } = this.options;
317
+ if (presentedFrames !== undefined) {
318
+ const count = presentedFrames();
319
+ this.wasDuplicate = isDuplicateFrame(this.lastPresentedFrames, count);
320
+ this.lastPresentedFrames = count;
321
+ }
322
+ this.ctx.drawImage(source, 0, 0, width, height);
323
+ if (this.mark !== null)
324
+ this.ctx.drawImage(this.mark, 0, 0);
325
+ if (drawFrame !== undefined) {
326
+ // Wrapped, so a hook cannot leak transform or composite state into the next
327
+ // frame — see `drawFrame`. Cheap: save/restore on a 2D context is a stack push.
328
+ this.ctx.save();
329
+ drawFrame(this.ctx, width, height);
330
+ this.ctx.restore();
331
+ }
332
+ return this.composite;
333
+ }
334
+ /**
335
+ * Whether the frame `compose()` just drew is byte-identical to the one before it, because
336
+ * the renderer's own count of presented frames did not move between the two calls.
337
+ *
338
+ * False when `presentedFrames` was never supplied, and false for the very first `compose()`
339
+ * regardless — a frame nothing has been compared against yet is not a repeat of anything.
340
+ */
341
+ get duplicateFrame() {
342
+ return this.wasDuplicate;
343
+ }
344
+ get pacing() {
345
+ return this.pacer.report;
346
+ }
347
+ /** Start the measurement over, keeping the schedule. See `FramePacer`. */
348
+ resetPacing() {
349
+ this.pacer.resetMeasurement();
350
+ }
351
+ /** Give the surface back. Safe to call more than once. */
352
+ release() {
353
+ if (this.acquired) {
354
+ this.options.surface.unlockDrawingBuffer();
355
+ this.acquired = false;
356
+ }
357
+ // Only the track this class created. The audio the caller mixed in belongs
358
+ // to the audio graph and must survive to be recorded again.
359
+ this.videoTrack?.stop();
360
+ this.videoTrack = null;
361
+ this.stream = null;
362
+ this.mark = null;
363
+ /* So a caller that locks the same instance again starts with nothing to compare against,
364
+ rather than measuring its next frame against a session that already ended. */
365
+ this.lastPresentedFrames = null;
366
+ this.wasDuplicate = false;
367
+ }
368
+ }