@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,292 @@
1
+ import { DEPTH_COMPARE } from '../../depthConvention.ts';
2
+ import type { Vec3 } from '../../../math/color.ts';
3
+ import { PLUME_VERTS } from '../../plumeGeometry.ts';
4
+ import { plumeShaders, type PlumeMaterial } from '../../plumeMaterial.ts';
5
+ import { ARCANE_BINDINGS } from '../../shaders/generated/arcane.wgsl.ts';
6
+ import { FIRE_BINDINGS } from '../../shaders/generated/fire.wgsl.ts';
7
+ import { SMOKE_BINDINGS } from '../../shaders/generated/smoke.wgsl.ts';
8
+ import { DEPTH_FORMAT } from './flatPass.ts';
9
+ import type { PipelineCache } from './pipelineCache.ts';
10
+ import type { UniformFields } from './scatterPass.ts';
11
+ import { shaderModule } from './shaderModules.ts';
12
+
13
+ /**
14
+ * The plume pass: crossed quads per plume, displaced and faded in the shaders.
15
+ *
16
+ * **Two blend modes and one geometry.** A flame adds light and smoke occludes it, which is the
17
+ * `PlumeBlend` the options carry; everything else about the two is the fragment stage. Neither
18
+ * writes depth — a soft quad that did would punch a hole in whatever came after it.
19
+ */
20
+
21
+ /** The vertex stage is shared by every plume material; only the fragment differs. */
22
+ export const PLUME_VERT_FIELDS: UniformFields = FIRE_BINDINGS.PLUME_VERT.fields;
23
+ export const PLUME_VERT_SIZE = FIRE_BINDINGS.PLUME_VERT.uniformSize;
24
+
25
+ /*
26
+ * **The blocks are not all the same shape, and the widest one sizes the binding.**
27
+ *
28
+ * Fire and smoke are 128 bytes over the same fourteen fields. Arcane is 144 over the same
29
+ * fourteen plus `uTint`, at the same offsets for the shared ones — which is asserted below
30
+ * rather than assumed, because a generator that moved one would put a field where this writer
31
+ * does not look.
32
+ *
33
+ * **Sizing this to fire's block is a pipeline that does not build.** Measured on an RX 9070 XT
34
+ * through radv, against the device rather than the specification: *"The shader uses more bytes
35
+ * of the buffer (144) than the layout's minBindingSize (128)"*, raised while validating
36
+ * `@group(0) @binding(1)`. That lands on `createRenderPipeline`, so by the 2026-08-14 rule the
37
+ * cost is not a wrong picture, it is no picture — the arcane plumes simply never draw and the
38
+ * command buffer they were recorded into dies with them. A binding wider than a shader needs is
39
+ * valid in the other direction, so one size serves all three.
40
+ */
41
+ export const PLUME_FRAG_FIELDS: UniformFields = ARCANE_BINDINGS.ARCANE_FRAG.fields;
42
+ export const PLUME_FRAG_SIZE = Math.max(
43
+ FIRE_BINDINGS.FIRE_FRAG.uniformSize,
44
+ SMOKE_BINDINGS.SMOKE_FRAG.uniformSize,
45
+ ARCANE_BINDINGS.ARCANE_FRAG.uniformSize,
46
+ );
47
+
48
+ const VERT_BINDING = FIRE_BINDINGS.PLUME_VERT.uniforms;
49
+ const FRAG_BINDING = FIRE_BINDINGS.FIRE_FRAG.uniforms;
50
+
51
+ /** Each material's own block, so a change to one and not the others is caught rather than assumed. */
52
+ export const FIRE_FRAG_SIZE = FIRE_BINDINGS.FIRE_FRAG.uniformSize;
53
+ export const SMOKE_FRAG_SIZE = SMOKE_BINDINGS.SMOKE_FRAG.uniformSize;
54
+ export const ARCANE_FRAG_SIZE = ARCANE_BINDINGS.ARCANE_FRAG.uniformSize;
55
+
56
+ const VISIBILITY_VERTEX = 0x1;
57
+ const VISIBILITY_FRAGMENT = 0x2;
58
+ const USAGE_VERTEX = 0x0020 | 0x0008;
59
+ const USAGE_INDEX = 0x0010 | 0x0008;
60
+
61
+ /** `aCenter`, `aCorner`, `aSize`, `aSeed`, `aBlade` — one buffer each, as the GL path holds them. */
62
+ const ATTRIBUTES: readonly { location: number; floats: number }[] = [
63
+ { location: 0, floats: 3 },
64
+ { location: 1, floats: 2 },
65
+ { location: 2, floats: 2 },
66
+ { location: 3, floats: 1 },
67
+ { location: 4, floats: 1 },
68
+ ];
69
+
70
+ const FORMATS: Readonly<Record<number, GPUVertexFormat>> = {
71
+ 1: 'float32',
72
+ 2: 'float32x2',
73
+ 3: 'float32x3',
74
+ };
75
+
76
+ export function plumeVertexLayouts(): GPUVertexBufferLayout[] {
77
+ return ATTRIBUTES.map((a) => ({
78
+ arrayStride: a.floats * 4,
79
+ stepMode: 'vertex' as const,
80
+ attributes: [
81
+ { shaderLocation: a.location, offset: 0, format: FORMATS[a.floats] as GPUVertexFormat },
82
+ ],
83
+ }));
84
+ }
85
+
86
+ /** Plume geometry on the device, behind the surface's opaque handle. */
87
+ export interface GpuPlumes {
88
+ readonly vertexBuffers: readonly GPUBuffer[];
89
+ readonly indexBuffer: GPUBuffer;
90
+ readonly indexCount: number;
91
+ readonly material: PlumeMaterial;
92
+ readonly blend: 'additive' | 'alpha';
93
+ readonly sizePulse: number;
94
+ readonly windResponse: number;
95
+ /**
96
+ * Colour handed to the fragment stage as `uTint`, white when the caller named none.
97
+ *
98
+ * **Held per batch because it is a batch's property, and written on every draw because the
99
+ * block comes out of a ring.** `PlumeRenderer` has carried this since before the second
100
+ * backend and this path dropped it on the floor: `createPlumes` never read `options.tint`,
101
+ * so the one material that reads the uniform would have drawn with a tint of zero — which,
102
+ * being additive, is not a wrong colour but an invisible one.
103
+ */
104
+ readonly tint: Vec3;
105
+ /**
106
+ * Scale one plume, 0 to hide it. See `PlumeRenderer.setScale`, which this mirrors.
107
+ *
108
+ * Writes only that plume's own vertices, so turning a slick's fire on costs a handful of
109
+ * floats rather than a re-upload of the batch.
110
+ */
111
+ setScale(index: number, scale: number): void;
112
+ dispose(): void;
113
+ }
114
+
115
+ /** The five attribute streams a plume batch is built from, already laid out by the caller. */
116
+ export interface PlumeGeometry {
117
+ readonly centers: Float32Array;
118
+ readonly corners: Float32Array;
119
+ readonly sizes: Float32Array;
120
+ readonly seeds: Float32Array;
121
+ readonly blades: Float32Array;
122
+ readonly indices: Uint32Array;
123
+ }
124
+
125
+ export function createGpuPlumes(
126
+ device: GPUDevice,
127
+ geometry: PlumeGeometry,
128
+ material: PlumeMaterial,
129
+ blend: 'additive' | 'alpha',
130
+ sizePulse: number,
131
+ windResponse: number,
132
+ tint: Vec3,
133
+ ): GpuPlumes {
134
+ const buffers: GPUBuffer[] = [];
135
+ const streams: readonly Float32Array[] = [
136
+ geometry.centers,
137
+ geometry.corners,
138
+ geometry.sizes,
139
+ geometry.seeds,
140
+ geometry.blades,
141
+ ];
142
+ for (let i = 0; i < streams.length; i++) {
143
+ const data = streams[i] as Float32Array;
144
+ const buffer = device.createBuffer({
145
+ label: `plume.attr${i}`,
146
+ size: Math.max(4, data.byteLength),
147
+ usage: USAGE_VERTEX,
148
+ });
149
+ device.queue.writeBuffer(buffer, 0, data);
150
+ buffers.push(buffer);
151
+ }
152
+ const indexBuffer = device.createBuffer({
153
+ label: 'plume.indices',
154
+ size: Math.max(4, geometry.indices.byteLength),
155
+ usage: USAGE_INDEX,
156
+ });
157
+ device.queue.writeBuffer(indexBuffer, 0, geometry.indices);
158
+
159
+ /*
160
+ * The sizes are kept on the CPU as well as uploaded, and the originals beside them, because
161
+ * `setScale` multiplies the *base* size rather than the current one — scaling a scaled plume
162
+ * would compound, and a slick cycling on and off would shrink to nothing.
163
+ */
164
+ const sizes = Float32Array.from(geometry.sizes);
165
+ const baseSizes = Float32Array.from(geometry.sizes);
166
+ const sizeBuffer = buffers[2] as GPUBuffer;
167
+
168
+ return {
169
+ vertexBuffers: buffers,
170
+ indexBuffer,
171
+ indexCount: geometry.indices.length,
172
+ material,
173
+ blend,
174
+ sizePulse,
175
+ windResponse,
176
+ tint,
177
+ setScale(index: number, scale: number): void {
178
+ const span = PLUME_VERTS * 2;
179
+ const base = index * span;
180
+ if (base < 0 || base + span > sizes.length) return;
181
+ const width = baseSizes[index * 2] ?? 0;
182
+ const height = baseSizes[index * 2 + 1] ?? 0;
183
+ for (let c = 0; c < PLUME_VERTS; c++) {
184
+ sizes[base + c * 2] = width * scale;
185
+ sizes[base + c * 2 + 1] = height * scale;
186
+ }
187
+ device.queue.writeBuffer(sizeBuffer, base * 4, sizes, base, span);
188
+ },
189
+ dispose(): void {
190
+ for (const b of buffers) b.destroy();
191
+ indexBuffer.destroy();
192
+ },
193
+ };
194
+ }
195
+
196
+ export function createPlumeBindGroupLayout(device: GPUDevice): GPUBindGroupLayout {
197
+ return device.createBindGroupLayout({
198
+ label: 'plume.layout',
199
+ entries: [
200
+ /*
201
+ * **Both blocks are per draw, and that is a bug fix rather than a precaution.**
202
+ * `sizePulse` and `windResponse` belong to the batch, not the frame — a flame is
203
+ * `0.12` and the smoke above it `1.35` — and a scene draws both in one pass. With one
204
+ * buffer per block the second `writeBuffer` won for both draws, so the flame was bent
205
+ * by the smoke's wind response: a fire leaning forty degrees in still air, on a scene
206
+ * whose every other surface matched to the byte. See `UniformRing`.
207
+ */
208
+ {
209
+ binding: VERT_BINDING,
210
+ visibility: VISIBILITY_VERTEX,
211
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: PLUME_VERT_SIZE },
212
+ },
213
+ {
214
+ binding: FRAG_BINDING,
215
+ visibility: VISIBILITY_FRAGMENT,
216
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: PLUME_FRAG_SIZE },
217
+ },
218
+ ],
219
+ });
220
+ }
221
+
222
+ /** Both buffers are rings; the slot each draw takes arrives as a dynamic offset. */
223
+ export function createPlumeBindGroup(
224
+ device: GPUDevice,
225
+ layout: GPUBindGroupLayout,
226
+ vertices: GPUBuffer,
227
+ fragments: GPUBuffer,
228
+ ): GPUBindGroup {
229
+ return device.createBindGroup({
230
+ label: 'plume.bindGroup',
231
+ layout,
232
+ entries: [
233
+ { binding: VERT_BINDING, resource: { buffer: vertices, size: PLUME_VERT_SIZE } },
234
+ { binding: FRAG_BINDING, resource: { buffer: fragments, size: PLUME_FRAG_SIZE } },
235
+ ],
236
+ });
237
+ }
238
+
239
+ /**
240
+ * The blend each material wants.
241
+ *
242
+ * **Additive keeps the source alpha out of the destination factor** — a flame is light added
243
+ * to what is behind it, and multiplying that by one-minus-alpha would make a bright flame
244
+ * darken the wall behind it. Alpha is the ordinary over-operator smoke wants.
245
+ */
246
+ function blendState(blend: 'additive' | 'alpha'): GPUBlendState {
247
+ return blend === 'additive'
248
+ ? {
249
+ color: { srcFactor: 'src-alpha', dstFactor: 'one', operation: 'add' },
250
+ alpha: { srcFactor: 'zero', dstFactor: 'one', operation: 'add' },
251
+ }
252
+ : {
253
+ color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },
254
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
255
+ };
256
+ }
257
+
258
+ /**
259
+ * The pipeline for one material and blend.
260
+ *
261
+ * **Depth tested, never written.** These are soft quads drawn after the opaque scene; writing
262
+ * depth would let a puff occlude something behind it that should have shown through.
263
+ */
264
+ export function plumePipeline(
265
+ cache: PipelineCache,
266
+ device: GPUDevice,
267
+ layout: GPUBindGroupLayout,
268
+ material: PlumeMaterial,
269
+ blend: 'additive' | 'alpha',
270
+ ): GPURenderPipeline {
271
+ const shaders = plumeShaders(material);
272
+ return cache.get(`plume:${material}:${blend}`, () => ({
273
+ label: `plume:${material}`,
274
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
275
+ vertex: {
276
+ module: shaderModule(device, { label: 'plume.vert', code: shaders.vertexWgsl }),
277
+ entryPoint: 'main',
278
+ buffers: plumeVertexLayouts(),
279
+ },
280
+ fragment: {
281
+ module: shaderModule(device, {
282
+ label: `plume.frag:${material}`,
283
+ code: shaders.fragmentWgsl,
284
+ }),
285
+ entryPoint: 'main',
286
+ targets: [{ format: cache.format, blend: blendState(blend) }],
287
+ },
288
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
289
+ multisample: { count: cache.sampleCount },
290
+ depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: false, depthCompare: DEPTH_COMPARE },
291
+ }));
292
+ }
@@ -0,0 +1,368 @@
1
+ import { mat3, type mat4 } from 'gl-matrix';
2
+
3
+ import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from '../../lightBudget.ts';
4
+ import { OCTAHEDRAL_EDGE } from '../../pointShadowArray.ts';
5
+ import {
6
+ createFaceRange,
7
+ DEFAULT_SOURCE_RADIUS,
8
+ FACE_COUNT,
9
+ POINT_SHADOW_NEAR,
10
+ PointShadowImage,
11
+ pointShadowFaceRotation,
12
+ pointShadowFaceViewProj,
13
+ type FaceRange,
14
+ type PointShadowSource,
15
+ } from '../../pointShadowImage.ts';
16
+ import {
17
+ OCTAHEDRAL_RESOLVE_FRAG_WGSL,
18
+ OCTAHEDRAL_RESOLVE_VERT_WGSL,
19
+ } from '../../shaders/generated/octahedralResolve.wgsl.ts';
20
+ import { SHADOW_FORMAT } from './depthPass.ts';
21
+ import { UniformRing } from './uniformRing.ts';
22
+
23
+ /**
24
+ * A point light's shadow on this device: one octahedral layer, filled a face at a time.
25
+ *
26
+ * **The state is `PointShadowImage`'s and so is every decision in it**, which is what makes
27
+ * this file short: a cube texture, six single-layer views to attach, one cube view to sample,
28
+ * and a loop that opens a pass per face. Six shipped bug fixes come with the image rather than
29
+ * being re-earned here — see that module.
30
+ *
31
+ * **Six passes, not six draws into one.** WebGPU attaches exactly one texture subresource to a
32
+ * depth attachment, so a face is a render pass of its own; the clear that the GL path gets from
33
+ * `gl.clear` is the pass's own `depthClearValue`. The cost is the same either way — the caster
34
+ * set is walked once per face — which is why `pointShadowBudget.ts` exists on both backends.
35
+ */
36
+
37
+ const USAGE_RENDER_ATTACHMENT = 0x10;
38
+ const USAGE_TEXTURE_BINDING = 0x4;
39
+ const USAGE_UNIFORM_DST = 0x40 | 0x8; // UNIFORM | COPY_DST
40
+ const VISIBILITY_FRAGMENT = 0x2;
41
+
42
+ /**
43
+ * Slots for one frame's resolves: every pool layer's six faces, which no budget ever reaches.
44
+ *
45
+ * At 256 bytes a slot that is 24 KB of staging for a ceiling nothing approaches — the face
46
+ * budget is a handful a frame — and the alternative is `allocate` returning null and a face
47
+ * silently not landing in its layer.
48
+ */
49
+ const RESOLVE_SLOTS = (POINT_SHADOW_POOL + LIVE_POINT_SHADOW_MAPS) * FACE_COUNT;
50
+
51
+ /** `mat3x3<f32>` then four scalars, at std140's sixteen-byte columns: see the generated struct. */
52
+ const RESOLVE_UNIFORM_SIZE = 64;
53
+
54
+ /** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
55
+ const faceRotation = mat3.create();
56
+ /** One mat3x3 column, staged so `writeFloats` takes an array without allocating one. */
57
+ const rotationColumn = new Float32Array(3);
58
+
59
+ /**
60
+ * Every point light's shadow as one array texture, and the scratch that fills it.
61
+ *
62
+ * The WebGPU half of `pointShadowArray.ts`; the reasoning lives there, and this is one texture,
63
+ * one scratch and a pipeline. **The scratch is a separate texture on this backend too**, and not
64
+ * for WebGL2's reason: WebGPU rejects a pass outright for holding a texture it is also sampling,
65
+ * where WebGL2 raises `INVALID_OPERATION` at the draw. Two ways of saying the same thing, and
66
+ * both say the resolve reads the scratch.
67
+ */
68
+ export class GpuPointShadowArray {
69
+ /** The array, as the shader samples it. */
70
+ readonly view: GPUTextureView;
71
+ readonly layers: number;
72
+ /** Where a face is rendered before it is resolved. One, shared by every light. */
73
+ readonly scratchView: GPUTextureView;
74
+
75
+ private readonly texture: GPUTexture;
76
+ private readonly scratch: GPUTexture;
77
+ private readonly layerViews: GPUTextureView[] = [];
78
+ private readonly pipeline: GPURenderPipeline;
79
+ private readonly bindGroup: GPUBindGroup;
80
+ /**
81
+ * A slot per resolved face, not one buffer written six times.
82
+ *
83
+ * **`queue.writeBuffer` does not interleave with encoded commands.** Writes are ordered on
84
+ * the queue timeline and the encoder is submitted afterwards, so six writes between six
85
+ * passes give all six passes the *last* face's rotation and index — and five of them then
86
+ * discard every fragment, because `uFaceIndex` does not match. The layer stays empty and the
87
+ * light stops casting, which reads as a lighting change rather than as a missing upload.
88
+ *
89
+ * That is the failure `UniformRing` exists for, described in its own header, and this file
90
+ * reproduced it exactly. Found by capturing: WebGPU diverged from WebGL2 by seven times and
91
+ * came out *brighter*, and flipping a coordinate in the resolve changed the frame by not one
92
+ * pixel — which is what an empty map looks like.
93
+ */
94
+ private readonly ring: UniformRing;
95
+
96
+ constructor(
97
+ device: GPUDevice,
98
+ faceSize: number,
99
+ lightCount: number,
100
+ /** Layers above the point pool, for a world's casting rectangles. See `pointShadowArray.ts`. */
101
+ extraLayers = 0,
102
+ ) {
103
+ this.layers =
104
+ Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
105
+
106
+ this.texture = device.createTexture({
107
+ label: 'pointShadow.array',
108
+ size: [OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, this.layers],
109
+ format: SHADOW_FORMAT,
110
+ usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
111
+ });
112
+ this.view = this.texture.createView({ dimension: '2d-array' });
113
+ for (let layer = 0; layer < this.layers; layer++) {
114
+ this.layerViews.push(
115
+ this.texture.createView({
116
+ label: `pointShadow.layer${layer}`,
117
+ dimension: '2d',
118
+ baseArrayLayer: layer,
119
+ arrayLayerCount: 1,
120
+ }),
121
+ );
122
+ }
123
+
124
+ this.scratch = device.createTexture({
125
+ label: 'pointShadow.scratch',
126
+ size: [faceSize, faceSize],
127
+ format: SHADOW_FORMAT,
128
+ usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
129
+ });
130
+ this.scratchView = this.scratch.createView();
131
+
132
+ this.ring = new UniformRing(
133
+ device,
134
+ RESOLVE_UNIFORM_SIZE,
135
+ RESOLVE_SLOTS,
136
+ USAGE_UNIFORM_DST,
137
+ 'pointShadow.resolve.uniforms',
138
+ );
139
+ /*
140
+ * `non-filtering` and `unfilterable-float`, matching `flatPass.ts`: the scratch is a depth
141
+ * format, whose supported sample types are UnfilterableFloat and Depth and never plain
142
+ * Float, and nothing here asks the hardware to filter.
143
+ */
144
+ const layout = device.createBindGroupLayout({
145
+ label: 'pointShadow.resolve.layout',
146
+ entries: [
147
+ {
148
+ binding: 1,
149
+ visibility: VISIBILITY_FRAGMENT,
150
+ buffer: {
151
+ type: 'uniform',
152
+ hasDynamicOffset: true,
153
+ minBindingSize: RESOLVE_UNIFORM_SIZE,
154
+ },
155
+ },
156
+ {
157
+ binding: 32,
158
+ visibility: VISIBILITY_FRAGMENT,
159
+ texture: { sampleType: 'unfilterable-float' },
160
+ },
161
+ { binding: 33, visibility: VISIBILITY_FRAGMENT, sampler: { type: 'non-filtering' } },
162
+ ],
163
+ });
164
+ this.bindGroup = device.createBindGroup({
165
+ label: 'pointShadow.resolve',
166
+ layout,
167
+ entries: [
168
+ { binding: 1, resource: { buffer: this.ring.buffer, size: RESOLVE_UNIFORM_SIZE } },
169
+ { binding: 32, resource: this.scratchView },
170
+ { binding: 33, resource: device.createSampler({ label: 'pointShadow.resolve.sampler' }) },
171
+ ],
172
+ });
173
+ this.pipeline = device.createRenderPipeline({
174
+ label: 'pointShadow.resolve',
175
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
176
+ vertex: {
177
+ module: device.createShaderModule({ code: OCTAHEDRAL_RESOLVE_VERT_WGSL }),
178
+ entryPoint: 'main',
179
+ },
180
+ fragment: {
181
+ module: device.createShaderModule({ code: OCTAHEDRAL_RESOLVE_FRAG_WGSL }),
182
+ entryPoint: 'main',
183
+ targets: [],
184
+ },
185
+ primitive: { topology: 'triangle-list' },
186
+ /*
187
+ * `always`, because this is a copy and not a render: the layer holds whatever the previous
188
+ * bake of this light left, and a fragment that lost a comparison would leave half of one
189
+ * image and half of another.
190
+ */
191
+ depthStencil: { format: SHADOW_FORMAT, depthWriteEnabled: true, depthCompare: 'always' },
192
+ });
193
+ }
194
+
195
+ /**
196
+ * Write the scratch's contents into `layer`'s region for `face`.
197
+ *
198
+ * A pass of its own on the caller's encoder, with `load` rather than `clear`: the other five
199
+ * faces of this layer are already there and must survive. `discard` in the shader is what
200
+ * keeps this face to its own region.
201
+ */
202
+ resolve(
203
+ encoder: GPUCommandEncoder,
204
+ layer: number,
205
+ face: number,
206
+ far: number,
207
+ near: number,
208
+ ): void {
209
+ const view = this.layerViews[layer];
210
+ if (view === undefined) return;
211
+ const slot = this.ring.allocate();
212
+ if (slot === null) return;
213
+
214
+ pointShadowFaceRotation(face, faceRotation);
215
+ /* WGSL pads a mat3x3 to three four-float columns; the generated struct expects that. */
216
+ for (let column = 0; column < 3; column++) {
217
+ rotationColumn[0] = faceRotation[column * 3] as number;
218
+ rotationColumn[1] = faceRotation[column * 3 + 1] as number;
219
+ rotationColumn[2] = faceRotation[column * 3 + 2] as number;
220
+ this.ring.writeFloats(slot, column * 16, rotationColumn);
221
+ }
222
+ this.ring.writeInt(slot, 48, face);
223
+ this.ring.writeFloat(slot, 52, far);
224
+ this.ring.writeFloat(slot, 56, near);
225
+ this.ring.writeFloat(slot, 60, OCTAHEDRAL_EDGE);
226
+
227
+ const pass = encoder.beginRenderPass({
228
+ label: 'pointShadow.resolve',
229
+ colorAttachments: [],
230
+ depthStencilAttachment: {
231
+ view,
232
+ depthLoadOp: 'load',
233
+ depthStoreOp: 'store',
234
+ },
235
+ });
236
+ pass.setPipeline(this.pipeline);
237
+ pass.setBindGroup(0, this.bindGroup, [slot]);
238
+ pass.draw(3);
239
+ pass.end();
240
+ }
241
+
242
+ /** Start a frame's bakes. See the ring: slots are reused and nothing is freed. */
243
+ beginFrame(): void {
244
+ this.ring.reset();
245
+ }
246
+
247
+ /** Upload every slot this frame's resolves took, in one write, before the encoder is submitted. */
248
+ flush(): void {
249
+ this.ring.flush();
250
+ }
251
+
252
+ dispose(): void {
253
+ this.texture.destroy();
254
+ this.scratch.destroy();
255
+ this.ring.dispose();
256
+ }
257
+ }
258
+
259
+ /** What a face's pass needs from the caller: somewhere to record, and the casters to record. */
260
+ export type PointShadowFacePass = (view: GPUTextureView, viewProj: mat4) => void;
261
+
262
+ /** And what turns that face into its region of the light's octahedral layer. */
263
+ export type PointShadowResolve = (layer: number, face: number, far: number, near: number) => void;
264
+
265
+ export class GpuPointShadowMap implements PointShadowSource {
266
+ readonly size: number;
267
+ /** Which layer of the shared array this map's image lives in. See `pointShadowMap.ts`. */
268
+ readonly layer: number;
269
+
270
+ private readonly array: () => GpuPointShadowArray | null;
271
+ private readonly image = new PointShadowImage();
272
+ private readonly range: FaceRange = createFaceRange();
273
+
274
+ constructor(array: () => GpuPointShadowArray | null, layer: number, size: number) {
275
+ this.array = array;
276
+ this.layer = layer;
277
+ this.size = size;
278
+ }
279
+
280
+ get far(): number {
281
+ return this.image.far;
282
+ }
283
+
284
+ get near(): number {
285
+ return this.image.near;
286
+ }
287
+
288
+ get sourceRadius(): number {
289
+ return this.image.sourceRadius;
290
+ }
291
+
292
+ get hasBaked(): boolean {
293
+ return this.image.hasBaked;
294
+ }
295
+
296
+ get presence(): number {
297
+ return this.image.presence;
298
+ }
299
+
300
+ matchesSource(
301
+ x: number,
302
+ y: number,
303
+ z: number,
304
+ range: number,
305
+ near: number,
306
+ sourceRadius = DEFAULT_SOURCE_RADIUS,
307
+ tolerance = 0,
308
+ ): boolean {
309
+ return this.image.matchesSource(x, y, z, range, near, sourceRadius, tolerance);
310
+ }
311
+
312
+ advance(dt: number): void {
313
+ this.image.advance(dt);
314
+ }
315
+
316
+ forget(): void {
317
+ this.image.forget();
318
+ }
319
+
320
+ /**
321
+ * Render up to `maxFaces` of the six, resuming a bake already under way.
322
+ *
323
+ * Returns how many faces were rendered. `renderFace` is handed the attachment and the face's
324
+ * view-projection and is expected to open a pass and draw the casters into it — the renderer
325
+ * owns the encoder and the pipelines, so it owns the pass.
326
+ *
327
+ * The scratch matrix is the caller's for the same reason `pointShadowFaceViewProj` takes one:
328
+ * this runs once per face of every bake and `AGENTS.md` allows no allocation there.
329
+ */
330
+ bake(
331
+ x: number,
332
+ y: number,
333
+ z: number,
334
+ range: number,
335
+ renderFace: PointShadowFacePass,
336
+ resolveFace: PointShadowResolve,
337
+ scratch: mat4,
338
+ near = POINT_SHADOW_NEAR,
339
+ sourceRadius = DEFAULT_SOURCE_RADIUS,
340
+ maxFaces = FACE_COUNT,
341
+ ): number {
342
+ /*
343
+ * What to render now, **and what to render it for**. A bake in flight owns the parameters
344
+ * it started with; the arguments here only propose one that is not already under way. See
345
+ * `planBake` for the permanent artefact reading them unconditionally left in a moving
346
+ * light's map, and `pointShadowMap.ts` for the other backend making the identical call.
347
+ */
348
+ const plan = this.image.planBake(x, y, z, range, near, sourceRadius, maxFaces, this.range);
349
+ const { first, last } = plan;
350
+ if (last <= first) return 0;
351
+ const array = this.array();
352
+ if (array === null) return 0;
353
+
354
+ for (let face = first; face < last; face++) {
355
+ renderFace(
356
+ array.scratchView,
357
+ pointShadowFaceViewProj(face, plan.x, plan.y, plan.z, plan.near, plan.range, scratch),
358
+ );
359
+ resolveFace(this.layer, face, plan.range, plan.near);
360
+ }
361
+
362
+ this.image.completeBake(last, plan.x, plan.y, plan.z, plan.range, plan.near, plan.sourceRadius);
363
+ return last - first;
364
+ }
365
+
366
+ /** Nothing to free: every GPU object belongs to `GpuPointShadowArray` now. */
367
+ dispose(): void {}
368
+ }