@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,84 @@
1
+ /**
2
+ * A slot table addressed by generational handles.
3
+ *
4
+ * **The handle arithmetic, and nothing about what a handle names.** It came out of `pass.ts`
5
+ * when a second registry wanted exactly this: two copies of a generation rule are two chances to
6
+ * get the invalidation wrong, and the failure mode is a handle answering to whoever took its slot
7
+ * next — a use-after-free that reads as a leak.
8
+ *
9
+ * The definition type is a parameter rather than a union of the two kinds it holds. A union would
10
+ * oblige every caller to narrow a value it already knows the type of, and would make adding a
11
+ * third kind an edit to this file rather than to the caller that wanted it.
12
+ */
13
+ /** How many bits of a handle are the slot. 4,096 registered definitions is far past generous. */
14
+ const SLOT_BITS = 12;
15
+ const SLOT_MASK = (1 << SLOT_BITS) - 1;
16
+ export function createHandleRegistry() {
17
+ return { definitions: [], generations: [], free: [] };
18
+ }
19
+ /**
20
+ * Take a slot and return the handle that names it.
21
+ *
22
+ * Handles start at 1: zero is a generation-0 slot-0 handle and would be indistinguishable from
23
+ * the number a caller gets from an uninitialised field, so generations start at 1 instead.
24
+ */
25
+ export function registerIn(registry, definition) {
26
+ const slot = registry.free.pop() ?? registry.definitions.length;
27
+ registry.definitions[slot] = definition;
28
+ registry.generations[slot] ??= 1;
29
+ return ((registry.generations[slot] ?? 1) << SLOT_BITS) | slot;
30
+ }
31
+ /** The definition a handle names, or `undefined` if it names one that has been released. */
32
+ export function definitionAt(registry, handle) {
33
+ if (handle <= 0)
34
+ return undefined;
35
+ const slot = handle & SLOT_MASK;
36
+ if (registry.generations[slot] !== handle >>> SLOT_BITS)
37
+ return undefined;
38
+ return registry.definitions[slot];
39
+ }
40
+ /**
41
+ * Release a slot.
42
+ *
43
+ * Guarded on the handle still being live, so calling it twice frees the slot once — a slot
44
+ * pushed onto `free` twice is a slot handed to two different definitions.
45
+ */
46
+ export function unregisterIn(registry, handle) {
47
+ const definition = definitionAt(registry, handle);
48
+ if (definition === undefined)
49
+ return undefined;
50
+ const slot = handle & SLOT_MASK;
51
+ registry.definitions[slot] = undefined;
52
+ registry.generations[slot] = (registry.generations[slot] ?? 1) + 1;
53
+ registry.free.push(slot);
54
+ return definition;
55
+ }
56
+ /**
57
+ * Release every slot still held, handing each definition to the caller on the way out.
58
+ *
59
+ * **Teardown's half of `unregisterIn`, and it was missing.** Both renderers hold registries like
60
+ * this one and neither emptied one when it was disposed, so a definition kept whatever `init`
61
+ * built — a pipeline, a bind group, its buffers — for as long as the process lived. A private
62
+ * field going out of scope is not a GPU object being destroyed. Written here rather than once per
63
+ * backend for the reason this module exists at all: two copies of a lifetime rule are two chances
64
+ * to get it wrong, and the one that is wrong is the one nobody reads.
65
+ *
66
+ * `release` is the caller's, because the device object a definition must be handed is the only
67
+ * part of this that is per-backend — and on one of them there is a condition on handing it over
68
+ * at all.
69
+ *
70
+ * Each slot is released *before* its definition is told, so a `release` that reaches back into
71
+ * this registry finds a slot already gone rather than one it can free twice.
72
+ */
73
+ export function drainRegistry(registry, release) {
74
+ for (let slot = 0; slot < registry.definitions.length; slot += 1) {
75
+ if (registry.definitions[slot] === undefined)
76
+ continue;
77
+ /* Rebuilt rather than remembered: the generation bump that invalidates the handles naming
78
+ this slot is `unregisterIn`'s to make, and making it twice is how a slot is freed twice. */
79
+ const handle = ((registry.generations[slot] ?? 1) << SLOT_BITS) | slot;
80
+ const definition = unregisterIn(registry, handle);
81
+ if (definition !== undefined)
82
+ release(definition);
83
+ }
84
+ }
@@ -0,0 +1,64 @@
1
+ /** Photometric profiles packed into one texture a light can index into. */
2
+ /** What a reader produces, restated structurally so core imports no package. See `readIesProfile`. */
3
+ export interface PhotometricProfile {
4
+ readonly verticalAngles: Float32Array;
5
+ readonly horizontalAngles: Float32Array;
6
+ readonly candela: Float32Array;
7
+ readonly maxCandela: number;
8
+ }
9
+ /**
10
+ * Columns across the atlas: one row per profile, sampled by vertical angle.
11
+ *
12
+ * **A power of two, and 128 rather than 64 because the interesting part of a real distribution is
13
+ * narrow.** A spot fixture puts its whole falloff inside a few degrees of the beam edge, and at 64
14
+ * columns that edge is two texels wide and reads as a step. What a larger number costs is four
15
+ * kilobytes a profile, which is nothing against the image it replaces.
16
+ */
17
+ export declare const IES_ATLAS_WIDTH = 128;
18
+ /**
19
+ * `planes` rows of intensity per profile, normalised to the profile's peak, indexed by angle.
20
+ *
21
+ * **Resampled to a regular grid here rather than in the reader**, because that is a decision about
22
+ * a texture and not about a file: LM-63 is dense where a distribution changes and sparse where it
23
+ * does not, and a shader cannot sample an irregular table without carrying it.
24
+ *
25
+ * **Asymmetric fixtures keep their horizontal planes as of 2026-08-27.** This function flattened
26
+ * to the first plane and said in its own comment what to reach for instead — "a row per horizontal
27
+ * plane with the light carrying a plane count" — and that is what this is. A street light and a
28
+ * wall washer are the fixtures that are not axially symmetric, and they are exactly the fixtures
29
+ * whose whole point is that they throw more one way than another.
30
+ *
31
+ * **One plane count for the atlas rather than one per profile**, and every profile is padded to
32
+ * it. The shader's row is `profile * planes + plane`; a per-profile count would need a second
33
+ * number in a light's record to divide by, and a light's record is where space is expensive.
34
+ * Padding a symmetric profile repeats its single row, which costs `width` floats a plane — half a
35
+ * kilobyte — against the image an IES profile replaces. **A set with nothing asymmetric in it
36
+ * comes out at one plane and is bit-identical to what this produced before planes existed**, which
37
+ * is what keeps the common case free.
38
+ *
39
+ * **The planes are resampled onto a regular 0-to-360 arc**, for the reason the vertical angles are
40
+ * resampled onto a fixed one: the shader maps an azimuth to a plane by arithmetic and carries no
41
+ * per-profile angle list to search. A file measuring 0 and 180 packed into four planes has its
42
+ * measured values at planes 0 and 2 and the interpolation between them at 1 and 3, which is what a
43
+ * fixture symmetric about its own axis actually throws.
44
+ *
45
+ * **A profile occupies `planes + 1` rows, and the extra one repeats the first.** That is what lets
46
+ * the shader do the whole azimuth blend in **one** fetch, with the texture's own linear filter
47
+ * between adjacent rows: without the wrap row the plane after the last would have to blend back to
48
+ * the first, which a fractional row cannot express — it would reach into the *next profile's*
49
+ * first plane instead. The alternative was two explicit fetches and a `mix`, which was written,
50
+ * measured at **+18,315 gzipped bytes on `core-only`** across the sixteen fragment permutations,
51
+ * and replaced by this. One row a profile is 512 bytes.
52
+ *
53
+ * **Normalised to each profile's own peak** because the shader multiplies it into a light's
54
+ * colour, which already carries the intensity a consumer chose. A profile that also carried
55
+ * absolute candela would multiply the two and make every IES light either black or blinding. The
56
+ * peak is the *profile's*, not the plane's: normalising each plane to itself would make every
57
+ * plane reach 1 and throw away the asymmetry this exists to carry.
58
+ */
59
+ export declare function packIesAtlas(profiles: readonly PhotometricProfile[], width?: number): {
60
+ data: Float32Array;
61
+ width: number;
62
+ height: number;
63
+ planes: number;
64
+ };
@@ -0,0 +1,179 @@
1
+ /** Photometric profiles packed into one texture a light can index into. */
2
+ /**
3
+ * Columns across the atlas: one row per profile, sampled by vertical angle.
4
+ *
5
+ * **A power of two, and 128 rather than 64 because the interesting part of a real distribution is
6
+ * narrow.** A spot fixture puts its whole falloff inside a few degrees of the beam edge, and at 64
7
+ * columns that edge is two texels wide and reads as a step. What a larger number costs is four
8
+ * kilobytes a profile, which is nothing against the image it replaces.
9
+ */
10
+ export const IES_ATLAS_WIDTH = 128;
11
+ /**
12
+ * `planes` rows of intensity per profile, normalised to the profile's peak, indexed by angle.
13
+ *
14
+ * **Resampled to a regular grid here rather than in the reader**, because that is a decision about
15
+ * a texture and not about a file: LM-63 is dense where a distribution changes and sparse where it
16
+ * does not, and a shader cannot sample an irregular table without carrying it.
17
+ *
18
+ * **Asymmetric fixtures keep their horizontal planes as of 2026-08-27.** This function flattened
19
+ * to the first plane and said in its own comment what to reach for instead — "a row per horizontal
20
+ * plane with the light carrying a plane count" — and that is what this is. A street light and a
21
+ * wall washer are the fixtures that are not axially symmetric, and they are exactly the fixtures
22
+ * whose whole point is that they throw more one way than another.
23
+ *
24
+ * **One plane count for the atlas rather than one per profile**, and every profile is padded to
25
+ * it. The shader's row is `profile * planes + plane`; a per-profile count would need a second
26
+ * number in a light's record to divide by, and a light's record is where space is expensive.
27
+ * Padding a symmetric profile repeats its single row, which costs `width` floats a plane — half a
28
+ * kilobyte — against the image an IES profile replaces. **A set with nothing asymmetric in it
29
+ * comes out at one plane and is bit-identical to what this produced before planes existed**, which
30
+ * is what keeps the common case free.
31
+ *
32
+ * **The planes are resampled onto a regular 0-to-360 arc**, for the reason the vertical angles are
33
+ * resampled onto a fixed one: the shader maps an azimuth to a plane by arithmetic and carries no
34
+ * per-profile angle list to search. A file measuring 0 and 180 packed into four planes has its
35
+ * measured values at planes 0 and 2 and the interpolation between them at 1 and 3, which is what a
36
+ * fixture symmetric about its own axis actually throws.
37
+ *
38
+ * **A profile occupies `planes + 1` rows, and the extra one repeats the first.** That is what lets
39
+ * the shader do the whole azimuth blend in **one** fetch, with the texture's own linear filter
40
+ * between adjacent rows: without the wrap row the plane after the last would have to blend back to
41
+ * the first, which a fractional row cannot express — it would reach into the *next profile's*
42
+ * first plane instead. The alternative was two explicit fetches and a `mix`, which was written,
43
+ * measured at **+18,315 gzipped bytes on `core-only`** across the sixteen fragment permutations,
44
+ * and replaced by this. One row a profile is 512 bytes.
45
+ *
46
+ * **Normalised to each profile's own peak** because the shader multiplies it into a light's
47
+ * colour, which already carries the intensity a consumer chose. A profile that also carried
48
+ * absolute candela would multiply the two and make every IES light either black or blinding. The
49
+ * peak is the *profile's*, not the plane's: normalising each plane to itself would make every
50
+ * plane reach 1 and throw away the asymmetry this exists to carry.
51
+ */
52
+ export function packIesAtlas(profiles, width = IES_ATLAS_WIDTH) {
53
+ /*
54
+ * **One row of ones when there is nothing to pack, rather than a zero-height texture.**
55
+ *
56
+ * A sampler declared in the shader must have a complete texture bound whether or not any branch
57
+ * reads it — the argument `emptyTexture.ts` makes — and a zero-height allocation is an
58
+ * `INVALID_VALUE` rather than an empty one. Ones rather than zeros because this value multiplies
59
+ * a light's colour: an all-zero fallback would switch off every light that reached it.
60
+ */
61
+ if (profiles.length === 0) {
62
+ return { data: new Float32Array(width).fill(1), width, height: 1, planes: 1 };
63
+ }
64
+ /* The widest fixture decides the grid, so no profile is resampled *down* and loses a lobe. */
65
+ let planes = 1;
66
+ for (const profile of profiles) {
67
+ planes = Math.max(planes, profile?.horizontalAngles.length ?? 1);
68
+ }
69
+ /* The wrap row: `planes + 1` per profile, the last repeating the first. See the note above. */
70
+ const rows = planes + 1;
71
+ const height = profiles.length * rows;
72
+ const data = new Float32Array(width * height);
73
+ for (let index = 0; index < profiles.length; index++) {
74
+ const profile = profiles[index];
75
+ for (let row = 0; row < rows; row++) {
76
+ const at = (index * rows + row) * width;
77
+ if (profile === undefined) {
78
+ data.fill(1, at, at + width);
79
+ continue;
80
+ }
81
+ /* Row `planes` is plane 0 again, which is what makes the blend wrap rather than bleed. */
82
+ packRow(profile, row % planes, planes, data, at, width);
83
+ }
84
+ }
85
+ return { data, width, height, planes };
86
+ }
87
+ /**
88
+ * Where a plane of the regular grid falls among the angles a file measured, as a pair and a mix.
89
+ *
90
+ * **Wrapped rather than clamped at the top**, which is the difference between an azimuth and a
91
+ * vertical angle: a fixture measured at 0 and 180 is symmetric about its own axis and 270 degrees
92
+ * is the same as 90, so the plane past the last measurement interpolates back toward the first.
93
+ * Clamping instead would flatten one whole side of every two-plane fixture.
94
+ *
95
+ * A file that measures a full 360 — the last angle equal to the first — is handled by the same
96
+ * arithmetic, because the wrap lands on that duplicate.
97
+ */
98
+ function planeSpan(horizontal, plane, planes) {
99
+ const count = horizontal.length;
100
+ if (count <= 1)
101
+ return { lower: 0, upper: 0, mix: 0 };
102
+ const azimuth = (plane / planes) * 360;
103
+ let upper = 0;
104
+ while (upper < count && (horizontal[upper] ?? 0) <= azimuth)
105
+ upper += 1;
106
+ if (upper === 0)
107
+ return { lower: 0, upper: 0, mix: 0 };
108
+ if (upper >= count) {
109
+ /* Past the last measured plane: back toward the first, across whatever arc is left. */
110
+ const last = horizontal[count - 1] ?? 0;
111
+ const span = 360 - last + (horizontal[0] ?? 0);
112
+ return {
113
+ lower: count - 1,
114
+ upper: 0,
115
+ mix: span > 0 ? Math.min(1, Math.max(0, (azimuth - last) / span)) : 0,
116
+ };
117
+ }
118
+ const a = horizontal[upper - 1] ?? 0;
119
+ const b = horizontal[upper] ?? a;
120
+ return { lower: upper - 1, upper, mix: b > a ? (azimuth - a) / (b - a) : 0 };
121
+ }
122
+ /**
123
+ * One profile into one row, sampled at `width` even steps across a **fixed 0 to 180 degree arc**.
124
+ *
125
+ * **Fixed rather than the profile's own range, and that is what keeps a light's record to one
126
+ * slot.** A row spanning whatever a file happened to measure would need the light to carry the
127
+ * first angle and the span as well, so the shader could map an angle back into the row — three
128
+ * values where the froxel record has exactly one free. Pinning every row to the same arc makes the
129
+ * lookup `angle / 180`, and the row index is then all a light needs.
130
+ *
131
+ * **Outside the measured range a row holds the nearest measured value**, which is correct rather
132
+ * than merely safe: a downlight measured 0 to 90 emits nothing above the horizontal, and its last
133
+ * sample is already the near-zero that says so. **What would make it wrong** is a file measured
134
+ * over a partial arc that does *not* fall to zero at its end — a fixture with a documented cutoff
135
+ * — where clamping extends its last value across everything beyond. That is a real shape and it is
136
+ * rare, and the tell is a profile whose final candela is a large fraction of its peak.
137
+ */
138
+ function packRow(profile, plane, planes, out, offset, width) {
139
+ const angles = profile.verticalAngles;
140
+ const count = angles.length;
141
+ const peak = profile.maxCandela > 0 ? profile.maxCandela : 1;
142
+ /* The candela grid is horizontal-major: all vertical angles of the first plane, then the next.
143
+ So a plane is a run of `count` values, and blending two planes is a blend of two runs. */
144
+ const span = planeSpan(profile.horizontalAngles, plane, planes);
145
+ const lowerAt = span.lower * count;
146
+ const upperAt = span.upper * count;
147
+ for (let column = 0; column < width; column++) {
148
+ /* Texel centres over the whole arc, so column 0 is 0 degrees and the last is 180. */
149
+ const angle = width === 1 ? 0 : (column / (width - 1)) * 180;
150
+ /*
151
+ * Linear between the two measured angles either side. A nearest-neighbour lookup on a table
152
+ * that is sparse in the flat regions produces visible steps exactly where the distribution is
153
+ * smooth, which reads as banding in the light rather than as a sampling choice.
154
+ */
155
+ let upper = 1;
156
+ while (upper < count && (angles[upper] ?? 0) < angle)
157
+ upper += 1;
158
+ const lower = Math.max(0, Math.min(upper - 1, count - 1));
159
+ const top = Math.min(upper, count - 1);
160
+ const a = angles[lower] ?? 0;
161
+ const b = angles[top] ?? a;
162
+ const mix = b > a ? Math.min(1, Math.max(0, (angle - a) / (b - a))) : 0;
163
+ /*
164
+ * Two interpolations, and the order is not arbitrary: vertical within each of the two planes
165
+ * either side, then horizontal between the two results. Blending the planes first and then
166
+ * sampling would be the same number for a linear grid and is not one for a real fixture,
167
+ * whose vertical lists are the same but whose lobes are not.
168
+ */
169
+ const lowPlane = interpolate(profile.candela, lowerAt, lower, top, mix);
170
+ const highPlane = span.lower === span.upper ? lowPlane : interpolate(profile.candela, upperAt, lower, top, mix);
171
+ out[offset + column] = (lowPlane + (highPlane - lowPlane) * span.mix) / peak;
172
+ }
173
+ }
174
+ /** One plane's value between two vertical samples, at `at` in the horizontal-major grid. */
175
+ function interpolate(candela, at, lower, upper, mix) {
176
+ const low = candela[at + lower] ?? 0;
177
+ const high = candela[at + upper] ?? low;
178
+ return low + (high - low) * mix;
179
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * An image's texels, exactly as they were encoded — which a canvas cannot give you.
3
+ *
4
+ * **Every ordinary way of reading an image back in a browser is lossy where alpha varies, and this
5
+ * was measured rather than assumed.** A 2D canvas stores colour *premultiplied*: `drawImage`
6
+ * multiplies each channel by the alpha and `getImageData` divides it back out, so every value
7
+ * round-trips through `round(round(c * a / 255) * 255 / a)`. WebCodecs is no better — Chrome
8
+ * decodes a WebP with alpha to a premultiplied `BGRA` frame, and `VideoFrame.copyTo` un-premultiplies
9
+ * it, arriving at the same arithmetic. Both were run against a lossless WebP whose values are known:
10
+ * worst channel off by **3 of 255**, and every deviation predicted exactly by that expression.
11
+ *
12
+ * The one route that is exact is a texture upload with the unpack flag off and a read back, and
13
+ * that is what this is: 0 of 255 on the same file.
14
+ *
15
+ * **For a picture none of this matters and for data it is a corruption.** The case it was found on
16
+ * is a `.sog` Gaussian capture, whose `sh0` image carries three *codebook indices* in RGB beside an
17
+ * opacity in alpha — so a premultiplying read lands the index several entries away wherever a
18
+ * Gaussian is transparent, and the capture's colours come back tied to its own transparency. Any
19
+ * image used as a lookup rather than as a picture has the same problem.
20
+ *
21
+ * **Here rather than in the package that needed it**, because `AGENTS.md` allows raw WebGL only
22
+ * under `packages/core/src/render/` and this is raw WebGL. `@driftengine/splats` takes a decoder as
23
+ * a parameter for exactly this reason and a consumer hands it this one.
24
+ *
25
+ * **What it costs, stated because the driver says it out loud**: `readPixels` synchronises the
26
+ * pipeline, and Chrome logs *"GPU stall due to ReadPixels"* once per image. That is the price of
27
+ * exactness and it is paid at load rather than per frame — five stalls for a Gaussian capture,
28
+ * none afterwards. Nothing here belongs in a frame, and `AGENTS.md`'s rule about the hot path is
29
+ * the reason this is a loader and not a per-frame utility.
30
+ */
31
+ /** One decoded image: 8-bit RGBA, row-major from the top left, unpremultiplied. */
32
+ export interface ImageTexels {
33
+ readonly width: number;
34
+ readonly height: number;
35
+ readonly rgba: Uint8Array;
36
+ }
37
+ /** What turns an encoded image's bytes into texels. */
38
+ export type ImageTexelDecoder = (bytes: Uint8Array, type?: string) => Promise<ImageTexels>;
39
+ /**
40
+ * A decoder that reads texels back exactly, over a context of its own.
41
+ *
42
+ * **One context for every image it decodes**, created on the first call and kept: a WebGL context
43
+ * is a scarce resource — browsers cap them somewhere around sixteen — and one per image is a
44
+ * capture that stops decoding partway through with a context-lost warning.
45
+ *
46
+ * `preserveDrawingBuffer` is not set and nothing is ever drawn: the texture is attached to a
47
+ * framebuffer and read, which is the whole pipeline. `antialias: false` and `depth: false` because
48
+ * neither is allocated for a path that rasterises nothing.
49
+ */
50
+ export declare function createImageTexelDecoder(): ImageTexelDecoder;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * An image's texels, exactly as they were encoded — which a canvas cannot give you.
3
+ *
4
+ * **Every ordinary way of reading an image back in a browser is lossy where alpha varies, and this
5
+ * was measured rather than assumed.** A 2D canvas stores colour *premultiplied*: `drawImage`
6
+ * multiplies each channel by the alpha and `getImageData` divides it back out, so every value
7
+ * round-trips through `round(round(c * a / 255) * 255 / a)`. WebCodecs is no better — Chrome
8
+ * decodes a WebP with alpha to a premultiplied `BGRA` frame, and `VideoFrame.copyTo` un-premultiplies
9
+ * it, arriving at the same arithmetic. Both were run against a lossless WebP whose values are known:
10
+ * worst channel off by **3 of 255**, and every deviation predicted exactly by that expression.
11
+ *
12
+ * The one route that is exact is a texture upload with the unpack flag off and a read back, and
13
+ * that is what this is: 0 of 255 on the same file.
14
+ *
15
+ * **For a picture none of this matters and for data it is a corruption.** The case it was found on
16
+ * is a `.sog` Gaussian capture, whose `sh0` image carries three *codebook indices* in RGB beside an
17
+ * opacity in alpha — so a premultiplying read lands the index several entries away wherever a
18
+ * Gaussian is transparent, and the capture's colours come back tied to its own transparency. Any
19
+ * image used as a lookup rather than as a picture has the same problem.
20
+ *
21
+ * **Here rather than in the package that needed it**, because `AGENTS.md` allows raw WebGL only
22
+ * under `packages/core/src/render/` and this is raw WebGL. `@driftengine/splats` takes a decoder as
23
+ * a parameter for exactly this reason and a consumer hands it this one.
24
+ *
25
+ * **What it costs, stated because the driver says it out loud**: `readPixels` synchronises the
26
+ * pipeline, and Chrome logs *"GPU stall due to ReadPixels"* once per image. That is the price of
27
+ * exactness and it is paid at load rather than per frame — five stalls for a Gaussian capture,
28
+ * none afterwards. Nothing here belongs in a frame, and `AGENTS.md`'s rule about the hot path is
29
+ * the reason this is a loader and not a per-frame utility.
30
+ */
31
+ /**
32
+ * A decoder that reads texels back exactly, over a context of its own.
33
+ *
34
+ * **One context for every image it decodes**, created on the first call and kept: a WebGL context
35
+ * is a scarce resource — browsers cap them somewhere around sixteen — and one per image is a
36
+ * capture that stops decoding partway through with a context-lost warning.
37
+ *
38
+ * `preserveDrawingBuffer` is not set and nothing is ever drawn: the texture is attached to a
39
+ * framebuffer and read, which is the whole pipeline. `antialias: false` and `depth: false` because
40
+ * neither is allocated for a path that rasterises nothing.
41
+ */
42
+ export function createImageTexelDecoder() {
43
+ let gl = null;
44
+ let texture = null;
45
+ let framebuffer = null;
46
+ return async (bytes, type = 'image/webp') => {
47
+ const bitmap = await createImageBitmap(new Blob([bytes], { type }), {
48
+ /* Both off, and both matter. Premultiplying here is the loss this module exists to avoid;
49
+ a colour-space conversion would rewrite values that are not colours at all. */
50
+ premultiplyAlpha: 'none',
51
+ colorSpaceConversion: 'none',
52
+ });
53
+ if (gl === null) {
54
+ const canvas = typeof OffscreenCanvas === 'undefined'
55
+ ? document.createElement('canvas')
56
+ : new OffscreenCanvas(1, 1);
57
+ gl = canvas.getContext('webgl2', {
58
+ alpha: true,
59
+ antialias: false,
60
+ depth: false,
61
+ stencil: false,
62
+ });
63
+ if (gl === null) {
64
+ bitmap.close();
65
+ throw new Error('createImageTexelDecoder: no WebGL2 context, and no other browser API reads an ' +
66
+ 'image back without premultiplying it. Supply a decoder of your own.');
67
+ }
68
+ texture = gl.createTexture();
69
+ framebuffer = gl.createFramebuffer();
70
+ }
71
+ const width = bitmap.width;
72
+ const height = bitmap.height;
73
+ gl.bindTexture(gl.TEXTURE_2D, texture);
74
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
75
+ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
76
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
77
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, bitmap);
78
+ bitmap.close();
79
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
80
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
81
+ if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) {
82
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
83
+ throw new Error('createImageTexelDecoder: this driver will not read back an RGBA8 texture.');
84
+ }
85
+ const rgba = new Uint8Array(width * height * 4);
86
+ gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, rgba);
87
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
88
+ gl.bindTexture(gl.TEXTURE_2D, null);
89
+ return { width, height, rgba };
90
+ };
91
+ }
@@ -0,0 +1,48 @@
1
+ import type { MeshData } from './mesh.ts';
2
+ /**
3
+ * One base mesh drawn many times in a single call.
4
+ *
5
+ * A field of grass is tens of thousands of copies of the same few triangles.
6
+ * Submitted individually that is tens of thousands of draw calls, which is the
7
+ * one thing a browser renderer cannot absorb; as instances it is one call and
8
+ * the GPU does the rest. This is what makes "dress the world" affordable at all.
9
+ *
10
+ * Per-instance attributes advance once per instance rather than once per vertex
11
+ * (`vertexAttribDivisor`), so the base mesh is uploaded once and never again.
12
+ */
13
+ export interface InstanceData {
14
+ /** 3 floats each: world position. */
15
+ readonly positions: Float32Array;
16
+ /** 2 floats each: uniform scale, then yaw in radians. */
17
+ readonly scaleAndYaw: Float32Array;
18
+ /** 3 floats each: multiplied into the base mesh's colour. */
19
+ readonly tints: Float32Array;
20
+ /**
21
+ * 3 floats each: how far this instance bends, how much the gust moves it,
22
+ * and a phase offset.
23
+ *
24
+ * Per instance rather than global so a field does not sway in lockstep —
25
+ * uniform motion is the single clearest sign that foliage is a texture with
26
+ * an animation on it rather than many separate plants.
27
+ */
28
+ readonly windResponse: Float32Array;
29
+ readonly capacity: number;
30
+ /** How many instances are live; the rest of the buffer is ignored. */
31
+ count: number;
32
+ }
33
+ export declare function createInstanceData(capacity: number): InstanceData;
34
+ export declare function writeInstance(data: InstanceData, index: number, x: number, y: number, z: number, scale: number, yaw: number, tintR: number, tintG: number, tintB: number, bend: number, flutter: number, phase: number): void;
35
+ export declare class InstancedMesh {
36
+ private readonly vao;
37
+ private readonly buffers;
38
+ private readonly indexCount;
39
+ private readonly positionBuffer;
40
+ private readonly scaleBuffer;
41
+ private readonly tintBuffer;
42
+ private readonly windBuffer;
43
+ constructor(gl: WebGL2RenderingContext, base: MeshData, capacity: number);
44
+ /** Upload placement. Called at load; scatter does not move once placed. */
45
+ upload(gl: WebGL2RenderingContext, data: InstanceData): void;
46
+ draw(gl: WebGL2RenderingContext, count: number): void;
47
+ dispose(gl: WebGL2RenderingContext): void;
48
+ }
@@ -0,0 +1,127 @@
1
+ export function createInstanceData(capacity) {
2
+ return {
3
+ positions: new Float32Array(capacity * 3),
4
+ scaleAndYaw: new Float32Array(capacity * 2),
5
+ tints: new Float32Array(capacity * 3),
6
+ windResponse: new Float32Array(capacity * 3),
7
+ capacity,
8
+ count: 0,
9
+ };
10
+ }
11
+ export function writeInstance(data, index, x, y, z, scale, yaw, tintR, tintG, tintB, bend, flutter, phase) {
12
+ if (index < 0 || index >= data.capacity) {
13
+ throw new Error(`Instance ${index} is outside capacity ${data.capacity}`);
14
+ }
15
+ const p = index * 3;
16
+ data.positions[p] = x;
17
+ data.positions[p + 1] = y;
18
+ data.positions[p + 2] = z;
19
+ const s = index * 2;
20
+ data.scaleAndYaw[s] = scale;
21
+ data.scaleAndYaw[s + 1] = yaw;
22
+ data.tints[p] = tintR;
23
+ data.tints[p + 1] = tintG;
24
+ data.tints[p + 2] = tintB;
25
+ data.windResponse[p] = bend;
26
+ data.windResponse[p + 1] = flutter;
27
+ data.windResponse[p + 2] = phase;
28
+ }
29
+ export class InstancedMesh {
30
+ vao;
31
+ buffers = [];
32
+ indexCount;
33
+ positionBuffer;
34
+ scaleBuffer;
35
+ tintBuffer;
36
+ windBuffer;
37
+ constructor(gl, base, capacity) {
38
+ /*
39
+ * **Refused rather than dropped.** The per-vertex channel sits at location 13, which this path
40
+ * spends on `aInstanceModel2` — eleven base attributes plus five per-instance is exactly the
41
+ * sixteen WebGL2 guarantees, so there is nothing left to put it in. Drawing the mesh anyway
42
+ * would read the absent-attribute constant and produce a plausible picture: leaves that never
43
+ * move, a cave face at full sun, a pane at full opacity, with nothing anywhere saying why.
44
+ * That is the silent no-op `AGENTS.md` forbids, so it throws at construction instead.
45
+ *
46
+ * **The escape hatch is written down and untaken**: the instance tint could ride in the `w`
47
+ * lanes of the four model columns, which an affine matrix leaves unused, freeing location 15
48
+ * — at the cost of narrowing instance transforms to affine and making a projective one
49
+ * silently wrong. Not paid for yet, because the obvious instanced case for sway is a field of
50
+ * vegetation and `ScatterBatch` already draws that with wind of its own. A consumer filing
51
+ * instanced geometry that needs a lane is what reverses it.
52
+ */
53
+ if (base.channel !== undefined) {
54
+ throw new Error('InstancedMesh: this mesh carries a per-vertex channel, which needs attribute location ' +
55
+ '13, and an instanced draw already spends 11 through 15 on its transform and tint. ' +
56
+ 'Draw it as an ordinary mesh, or drop the channel — the sway, sky and alpha lanes ' +
57
+ 'cannot reach an instanced pipeline.');
58
+ }
59
+ const vao = gl.createVertexArray();
60
+ if (vao === null)
61
+ throw new Error('InstancedMesh: createVertexArray failed');
62
+ this.vao = vao;
63
+ gl.bindVertexArray(vao);
64
+ const make = () => {
65
+ const buffer = gl.createBuffer();
66
+ if (buffer === null)
67
+ throw new Error('InstancedMesh: createBuffer failed');
68
+ this.buffers.push(buffer);
69
+ return buffer;
70
+ };
71
+ // Base mesh: divisor 0, so these advance per vertex as usual.
72
+ const attach = (data, location, size) => {
73
+ gl.bindBuffer(gl.ARRAY_BUFFER, make());
74
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
75
+ gl.enableVertexAttribArray(location);
76
+ gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
77
+ };
78
+ attach(base.positions, 0, 3);
79
+ attach(base.normals, 1, 3);
80
+ attach(base.colors, 2, 3);
81
+ const indexBuffer = make();
82
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
83
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, base.indices, gl.STATIC_DRAW);
84
+ this.indexCount = base.indices.length;
85
+ // Per-instance: divisor 1, so each advances once per copy rather than once
86
+ // per vertex. Sized to capacity now and rewritten later, because resizing a
87
+ // buffer mid-frame is a stall.
88
+ const instanced = (location, size) => {
89
+ const buffer = make();
90
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
91
+ gl.bufferData(gl.ARRAY_BUFFER, capacity * size * 4, gl.DYNAMIC_DRAW);
92
+ gl.enableVertexAttribArray(location);
93
+ gl.vertexAttribPointer(location, size, gl.FLOAT, false, 0, 0);
94
+ gl.vertexAttribDivisor(location, 1);
95
+ return buffer;
96
+ };
97
+ this.positionBuffer = instanced(3, 3);
98
+ this.scaleBuffer = instanced(4, 2);
99
+ this.tintBuffer = instanced(5, 3);
100
+ this.windBuffer = instanced(6, 3);
101
+ gl.bindVertexArray(null);
102
+ }
103
+ /** Upload placement. Called at load; scatter does not move once placed. */
104
+ upload(gl, data) {
105
+ const put = (buffer, values, perInstance) => {
106
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
107
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, values.subarray(0, data.count * perInstance));
108
+ };
109
+ put(this.positionBuffer, data.positions, 3);
110
+ put(this.scaleBuffer, data.scaleAndYaw, 2);
111
+ put(this.tintBuffer, data.tints, 3);
112
+ put(this.windBuffer, data.windResponse, 3);
113
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
114
+ }
115
+ draw(gl, count) {
116
+ if (count <= 0)
117
+ return;
118
+ gl.bindVertexArray(this.vao);
119
+ gl.drawElementsInstanced(gl.TRIANGLES, this.indexCount, gl.UNSIGNED_INT, 0, count);
120
+ gl.bindVertexArray(null);
121
+ }
122
+ dispose(gl) {
123
+ for (const buffer of this.buffers)
124
+ gl.deleteBuffer(buffer);
125
+ gl.deleteVertexArray(this.vao);
126
+ }
127
+ }