@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,482 @@
1
+ import { DEPTH_COMPARE, DEPTH_FORMAT, depthOffsetForLayer } from '../../depthConvention.js';
2
+ import { FLAT_BINDINGS, FLAT_FRAG_WGSL, FLAT_VERT_WGSL, } from '../../shaders/generated/flat.wgsl.js';
3
+ import { vertexBufferLayouts } from './buffers.js';
4
+ import { shaderModule } from './shaderModules.js';
5
+ /**
6
+ * The key for a set of flags.
7
+ *
8
+ * **The rule is `variantKey` in `scripts/wgsl.ts` and this is a second statement of it**, which
9
+ * is exactly the kind of restatement that drifts — except that a drift here cannot be silent:
10
+ * `flatFragmentBindings` throws on a key the generated table does not hold, at construction,
11
+ * naming the key it looked for. `scripts/` is a build tool and nothing under `src/` may import
12
+ * it, so a copy is the only option and a loud one is the acceptable form of it.
13
+ */
14
+ export function flatVariant(flags) {
15
+ const on = Object.keys(flags)
16
+ .filter((flag) => flags[flag])
17
+ .sort();
18
+ return on.length === 0 ? 'none' : on.join('+');
19
+ }
20
+ /*
21
+ * The generated file is `as const`, which makes every variant its own literal type and makes
22
+ * indexing it by a computed key an error. Declaring the shape once here is what lets the
23
+ * renderer choose a variant at runtime, and it is checked against the real object rather than
24
+ * asserted about it: a generator that stopped emitting `uniformSize` would fail here.
25
+ */
26
+ const FRAGMENT_BINDINGS = FLAT_BINDINGS.flatFrag;
27
+ /**
28
+ * The vertex stage's four variants, keyed like the fragment stage's sixteen.
29
+ *
30
+ * **The morphed variants have a larger uniform block — 384 bytes against 240 — and every shared
31
+ * field keeps its offset anyway.** That is not luck: a block is packed in declaration order, and
32
+ * `flat/index.ts` declares morph's uniforms after every other one for exactly this reason. The
33
+ * assertion below is on the *offsets* rather than on the size, because the offsets are what the
34
+ * renderer writes by and a moved one does not fail — it puts the model matrix where the view
35
+ * projection should be and draws a scrambled frame.
36
+ *
37
+ * The first version of this guard compared only the unskinned and skinned sizes, which are equal
38
+ * because skinning added a sampler and no uniform. It would have stayed silent through exactly the
39
+ * change it was written to catch.
40
+ */
41
+ const VERTEX_BINDINGS = FLAT_BINDINGS.flatVert;
42
+ /** The key for a set of vertex flags: the same rule `variantKey` uses, flags on, sorted, joined. */
43
+ export function flatVertexKey(skinned, morphed, instanced = false) {
44
+ const on = [];
45
+ /* Alphabetical, because the generator's own `variantKey` sorts and the two keys must agree. */
46
+ if (instanced)
47
+ on.push('instanced');
48
+ if (morphed)
49
+ on.push('morphed');
50
+ if (skinned)
51
+ on.push('skinned');
52
+ return on.length === 0 ? 'none' : on.join('+');
53
+ }
54
+ /** Everything the generator recorded about one variant of the vertex stage. */
55
+ export function flatVertexBindings(skinned, morphed = false, instanced = false) {
56
+ const key = flatVertexKey(skinned, morphed, instanced);
57
+ const found = VERTEX_BINDINGS[key];
58
+ if (found === undefined)
59
+ throw new Error(`flatPass: no vertex bindings for variant "${key}"`);
60
+ return found;
61
+ }
62
+ const PLAIN_VERTEX = flatVertexBindings(false);
63
+ /*
64
+ * **A variant may drop a field; it may never move one.**
65
+ *
66
+ * The renderer writes this block by offset, so two variants disagreeing about where a shared
67
+ * field lives is a scrambled frame rather than an error. The check was `undefined || moved` until
68
+ * the instanced variant, which legitimately declares neither `uModel` nor `uTint` — its placement
69
+ * and tint arrive as vertex attributes — and an absent field is not a moved one: nothing writes
70
+ * it, so nothing can write it to the wrong place.
71
+ *
72
+ * What still has to hold, and what this asserts, is that every field a variant *does* declare sits
73
+ * where the plain variant has it. That is what `flat/index.ts` declares the optional uniforms last
74
+ * for, and it was worth asserting: with `uModel` declared second, the instanced block put
75
+ * `uHasTangents` at 64 against the plain variant's 128, and a draw writing by the plain table
76
+ * would have put the tangent flag into the model matrix.
77
+ *
78
+ * **What would make this wrong** is a caller writing a field the variant it is drawing does not
79
+ * declare. That is the failure this no longer catches, and it is `drawInstanced`'s to avoid by
80
+ * writing the shared fields only.
81
+ */
82
+ for (const [key, bindings] of Object.entries(VERTEX_BINDINGS)) {
83
+ for (const [field, shared] of Object.entries(PLAIN_VERTEX.fields)) {
84
+ const here = bindings.fields[field];
85
+ if (here !== undefined && here.offset !== shared.offset) {
86
+ throw new Error(`flatPass: vertex variant "${key}" puts ${field} at ${here.offset} where the ` +
87
+ `plain variant has it at ${shared.offset}. A variant may omit a field, but every field ` +
88
+ `it declares must sit where the plain variant has it, because the renderer writes them ` +
89
+ `by offset — declare a new flag's uniforms after the existing ones.`);
90
+ }
91
+ }
92
+ }
93
+ export const FLAT_VERT_FIELDS = FLAT_BINDINGS.flatVert.none.fields;
94
+ /**
95
+ * The **largest** variant's block, because one ring serves every draw.
96
+ *
97
+ * A ring strided for the plain block would leave a morphed draw writing its weights into the next
98
+ * slot, which is a scrambled neighbour rather than an error. The unused tail on a plain draw is
99
+ * 144 bytes a slot and is what a single ring costs.
100
+ */
101
+ export const FLAT_VERT_SIZE = Math.max(...Object.values(VERTEX_BINDINGS).map((bindings) => bindings.uniformSize));
102
+ const FLAT_VERT_BINDING = PLAIN_VERTEX.uniforms;
103
+ /** Everything the generator recorded about one permutation of the fragment stage. */
104
+ export function flatFragmentBindings(variant) {
105
+ const found = FRAGMENT_BINDINGS[variant];
106
+ if (found === undefined)
107
+ throw new Error(`flatPass: no bindings for variant "${variant}"`);
108
+ return found;
109
+ }
110
+ /** The depth format both backends compare with. */
111
+ /* Re-exported so the twenty passes that already import it from here do not each learn a new
112
+ module; `depthConvention.ts` is where the decision lives and why. */
113
+ export { DEPTH_FORMAT } from '../../depthConvention.js';
114
+ const VISIBILITY_VERTEX = 0x1;
115
+ const VISIBILITY_FRAGMENT = 0x2;
116
+ /**
117
+ * The layout this variant binds against.
118
+ *
119
+ * The vertex block is **dynamic**, because every draw supplies its own model matrix and tint
120
+ * from its own slot of one buffer. The fragment block is not: it holds the lights, the fog
121
+ * and the camera, settled once by `bindMeshPass` and unchanged between draws.
122
+ */
123
+ export function createFlatBindGroupLayout(device, variant, skinned = false, morphed = false) {
124
+ const fragment = flatFragmentBindings(variant);
125
+ const entries = [
126
+ {
127
+ binding: FLAT_VERT_BINDING,
128
+ visibility: VISIBILITY_VERTEX,
129
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLAT_VERT_SIZE },
130
+ },
131
+ {
132
+ binding: fragment.uniforms,
133
+ visibility: VISIBILITY_FRAGMENT,
134
+ /*
135
+ * Dynamic, because this block carries the material and a material changes between draws.
136
+ * See `WebGPURenderer.perFrame` for why one buffer cannot hold two answers.
137
+ */
138
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: fragment.uniformSize },
139
+ },
140
+ ];
141
+ /** What each sampler binding was declared as, so a shared one is declared once and agrees. */
142
+ const samplerKind = new Map();
143
+ for (const [name, texture] of Object.entries(fragment.textures)) {
144
+ /*
145
+ * A shadow map is a depth texture, and a depth texture's supported sample types are
146
+ * `UnfilterableFloat | Depth` — never plain `Float`, which is what an empty `texture: {}`
147
+ * asks for. Declaring the wrong one is rejected at bind time:
148
+ *
149
+ * None of the supported sample types (UnfilterableFloat|Depth) of [Texture
150
+ * "shadow.static"] match the expected sample types (Float)
151
+ *
152
+ * Unfilterable rather than a comparison sampler, because the shader does its own PCF
153
+ * loop over explicit taps rather than asking the hardware to compare and blend.
154
+ */
155
+ const cube = texture.type === 'samplerCube';
156
+ /*
157
+ * The point-shadow array is a depth texture too, and is read the same way: `pointShadow`
158
+ * takes one `textureLod(maps, vec3(octEncode(dir), layer), 0.0)` per tap and estimates its
159
+ * own penumbra, so nothing here asks the hardware to filter.
160
+ *
161
+ * **`uEnvironment` is a cube and is *not* a shadow map.** It is a colour cubemap, and its
162
+ * mip chain **is** the roughness: a polished surface reads level 0 and a satin one reads
163
+ * further up, blending between them. That needs a filtering sampler and a filterable float,
164
+ * and declaring it `non-filtering` alongside the depth textures made the pipeline invalid —
165
+ * which, being a pipeline, drew nothing and said nothing beyond a device warning.
166
+ *
167
+ * Named explicitly rather than by a pattern. `uPointShadow0` did not end in `ShadowMap`, so
168
+ * a rule wide enough to catch the twelve cubes also caught the probe; naming the one
169
+ * exception was the answer then and there is one binding to catch now.
170
+ */
171
+ const array = texture.type === 'sampler2DArray';
172
+ /*
173
+ * **An integer texture is its own sample type and cannot be anything else.** The froxel table
174
+ * is `rgba32uint`; declaring it `float` is rejected at bind time exactly as a depth texture
175
+ * declared `float` is, with the same shape of message and the same consequence — a bind group
176
+ * that is invalid, a pass that records nothing, and a frame that presents anyway.
177
+ *
178
+ * It is also the reason the entry below asks for a non-filtering sampler: WebGPU permits no
179
+ * other kind against a `uint` texture, and the shader never samples it — every read is a
180
+ * `texelFetch`, which is why the declaration shares a sampler rather than bringing its own.
181
+ */
182
+ const integer = texture.type === 'usampler2D';
183
+ const isShadow = integer || (name !== 'uEnvironment' && (name.endsWith('ShadowMap') || cube || array));
184
+ entries.push({
185
+ binding: texture.texture,
186
+ visibility: VISIBILITY_FRAGMENT,
187
+ texture: {
188
+ sampleType: integer ? 'uint' : isShadow ? 'unfilterable-float' : 'float',
189
+ ...(cube ? { viewDimension: 'cube' } : {}),
190
+ ...(array ? { viewDimension: '2d-array' } : {}),
191
+ },
192
+ });
193
+ /*
194
+ * **One entry per sampler *binding*, not per texture**, because the fifteen shadow
195
+ * declarations now share one. `// wgsl:share shadow` in `flat.ts` is what collapsed them,
196
+ * and it is what lets the environment probe fit under a sixteen-sampler ceiling at all.
197
+ * Declaring the same binding fifteen times is rejected outright.
198
+ */
199
+ const declared = samplerKind.get(texture.sampler);
200
+ const kind = isShadow ? 'non-filtering' : 'filtering';
201
+ if (declared === undefined) {
202
+ samplerKind.set(texture.sampler, kind);
203
+ entries.push({
204
+ binding: texture.sampler,
205
+ visibility: VISIBILITY_FRAGMENT,
206
+ sampler: { type: kind },
207
+ });
208
+ }
209
+ else if (declared !== kind) {
210
+ /*
211
+ * Loud, at init, because the alternative is silent and wrong. A group whose members
212
+ * disagree about filtering cannot share a sampler — `uEnvironment`'s mip chain *is* its
213
+ * roughness and needs a filtering one, where a depth cube cannot have it — and a marker
214
+ * that put them together would otherwise produce a pipeline that draws nothing and says
215
+ * nothing beyond a device warning.
216
+ */
217
+ throw new Error(`flat: ${name} shares sampler binding ${texture.sampler} but wants ${kind} where the ` +
218
+ `group is ${declared}. Check its wgsl:share marker in flat.ts.`);
219
+ }
220
+ }
221
+ /*
222
+ * The joint palette, on the **vertex** stage.
223
+ *
224
+ * `unfilterable-float`, because `rgba32float` is not filterable without an extension and the
225
+ * shader reads it with an integer fetch that involves no sampler at all. Declaring it filterable
226
+ * is a pipeline-creation failure rather than a wrong picture, which is the loud direction.
227
+ *
228
+ * Added only for the skinned variant, so an unskinned layout declares nothing the unskinned
229
+ * shader module cannot reach — a bind group layout and its module must agree exactly or WebGPU
230
+ * refuses the pipeline.
231
+ */
232
+ if (morphed) {
233
+ const deltas = flatVertexBindings(skinned, true).textures['uMorphDeltas'];
234
+ if (deltas === undefined) {
235
+ throw new Error('flatPass: the morphed vertex shader declares no uMorphDeltas');
236
+ }
237
+ entries.push({
238
+ binding: deltas.texture,
239
+ visibility: VISIBILITY_VERTEX,
240
+ texture: { sampleType: 'unfilterable-float' },
241
+ });
242
+ }
243
+ if (skinned) {
244
+ const palette = flatVertexBindings(skinned, morphed).textures['uJointPalette'];
245
+ if (palette === undefined) {
246
+ throw new Error('flatPass: the skinned vertex shader declares no uJointPalette');
247
+ }
248
+ entries.push({
249
+ binding: palette.texture,
250
+ visibility: VISIBILITY_VERTEX,
251
+ texture: { sampleType: 'unfilterable-float' },
252
+ });
253
+ }
254
+ return device.createBindGroupLayout({
255
+ label: `flat.layout:${variant}|${flatVertexKey(skinned, morphed)}`,
256
+ entries,
257
+ });
258
+ }
259
+ /**
260
+ * Bind the buffers and one view per declared texture.
261
+ *
262
+ * `resolve` is asked for a view by the shader's own name for it, so a caller supplies the
263
+ * shadow maps it has and a stand-in for the rest. **Every declared binding must be filled
264
+ * even when the shader never samples it** — `uAlbedoEnabled` is zero for nearly all geometry
265
+ * and WebGPU still requires something there, which is why `renderer.ts` keeps an
266
+ * `emptyTexture2D` for the same reason on the other side.
267
+ */
268
+ export function createFlatBindGroup(device, layout, variant, perDraw, perFrame, resolve,
269
+ /** The palette view for a skinned bind group, or null for an unskinned one. */
270
+ palette = null,
271
+ /** The delta view for a morphed bind group, or null for an unmorphed one. */
272
+ deltas = null) {
273
+ const fragment = flatFragmentBindings(variant);
274
+ const entries = [
275
+ {
276
+ binding: FLAT_VERT_BINDING,
277
+ resource: { buffer: perDraw, size: FLAT_VERT_SIZE },
278
+ },
279
+ { binding: fragment.uniforms, resource: { buffer: perFrame, size: fragment.uniformSize } },
280
+ ];
281
+ /* The same dedupe the layout does, and for the same reason: the shadow bindings share one
282
+ sampler, and a bind group that filled it fifteen times would be rejected. Every member
283
+ resolves to the one object anyway — that is why sharing the declaration was free. */
284
+ const filled = new Set();
285
+ for (const [name, texture] of Object.entries(fragment.textures)) {
286
+ const supplied = resolve(name);
287
+ entries.push({ binding: texture.texture, resource: supplied.view });
288
+ if (filled.has(texture.sampler))
289
+ continue;
290
+ filled.add(texture.sampler);
291
+ entries.push({ binding: texture.sampler, resource: supplied.sampler });
292
+ }
293
+ if (deltas !== null) {
294
+ const binding = flatVertexBindings(palette !== null, true).textures['uMorphDeltas'];
295
+ if (binding === undefined) {
296
+ throw new Error('flatPass: the morphed vertex shader declares no uMorphDeltas');
297
+ }
298
+ entries.push({ binding: binding.texture, resource: deltas });
299
+ }
300
+ if (palette !== null) {
301
+ const binding = flatVertexBindings(true, deltas !== null).textures['uJointPalette'];
302
+ if (binding === undefined) {
303
+ throw new Error('flatPass: the skinned vertex shader declares no uJointPalette');
304
+ }
305
+ entries.push({ binding: binding.texture, resource: palette });
306
+ }
307
+ return device.createBindGroup({
308
+ label: `flat.bindGroup:${variant}|${flatVertexKey(palette !== null, deltas !== null)}`,
309
+ layout,
310
+ entries,
311
+ });
312
+ }
313
+ /**
314
+ * The pipeline, cached by the state that distinguishes it.
315
+ *
316
+ * The key names the variant and which optional attributes the mesh supplied, because those
317
+ * two decide the fragment module and the vertex layout. Built once per mesh at construction
318
+ * time rather than per frame, which is the rule `PipelineCache` exists to keep.
319
+ */
320
+ export function flatPipeline(cache, device, layout, variant, key, present,
321
+ /**
322
+ * Alpha-blended, for `drawTranslucentMesh`.
323
+ *
324
+ * **A second pipeline rather than a flag on the first**, because blend state is baked into a
325
+ * WebGPU pipeline where WebGL2 toggles it around the draw with `gl.enable(BLEND)`. Keyed
326
+ * separately, so one mesh drawn both ways gets both and neither is rebuilt per frame.
327
+ *
328
+ * Depth still written, matching the other backend: `drawTranslucentMesh` there leaves
329
+ * `depthMask` alone and only turns blending on. A translucent part of a loaded model is a
330
+ * pane of glass in a solid object, not a particle, and it has to occlude what is behind it
331
+ * for the rest of the model to sort correctly.
332
+ */
333
+ translucent = false,
334
+ /** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
335
+ skinned = false,
336
+ /** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
337
+ morphed = false,
338
+ /**
339
+ * Whether this pipeline writes depth, and which coplanar layer it draws on.
340
+ *
341
+ * **Both are pipeline state here and per-draw state on the other backend**, which is why they
342
+ * arrive as arguments and why the caller's key has to carry them: two draws of one mesh that
343
+ * differ only in these would otherwise share a cached pipeline and the second would silently
344
+ * get the first one's depth behaviour.
345
+ */
346
+ depthWrite = true, depthLayer = 0,
347
+ /** Whether placement and tint arrive per instance. See `FlatVertexOptions`. */
348
+ instanced = false,
349
+ /** Which order-independent buffer this pipeline writes, if any. The key must carry it. */
350
+ oit = 'none') {
351
+ return cache.get(key, () => flatDescriptor(cache, device, layout, variant, key, present, translucent, skinned, morphed, depthWrite, depthLayer, instanced, oit));
352
+ }
353
+ /**
354
+ * The same pipeline, compiled off the main thread.
355
+ *
356
+ * **Preferred by everything that builds a mesh**, which is all of them: `createRenderPipeline`
357
+ * defers the shader compile to the first draw, so a scene that builds its meshes and then
358
+ * renders pays for every one of them inside a single frame. On a phone that is seconds of a
359
+ * blocked GPU queue with an idle main thread, which is invisible to every timer that is not
360
+ * this one. The descriptor is identical; only when the driver does the work changes.
361
+ */
362
+ export function flatPipelineAsync(cache, device, layout, variant, key, present, translucent = false,
363
+ /** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
364
+ skinned = false,
365
+ /** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
366
+ morphed = false) {
367
+ return cache.getAsync(key, () => flatDescriptor(cache, device, layout, variant, key, present, translucent, skinned, morphed));
368
+ }
369
+ /**
370
+ * The colour target for an order-independent pass, or null where this is an ordinary draw.
371
+ *
372
+ * **The accumulation sums and the revealage multiplies**, which is the whole mechanism: a sum and
373
+ * a product both commute, so the frame stops depending on the order its fragments arrived in.
374
+ * `orderIndependent.ts` holds the same arithmetic on the CPU, where it is asserted against numbers.
375
+ *
376
+ * The revealage pass draws with the *ordinary* shader — `(zero, one-minus-src-alpha)` multiplies
377
+ * whatever colour it computed by nothing, so only its alpha lands. Both passes therefore decide a
378
+ * fragment's alpha with the same code and cannot disagree about it.
379
+ */
380
+ function oitTarget(oit) {
381
+ if (oit === 'accum') {
382
+ return {
383
+ format: 'rgba16float',
384
+ blend: {
385
+ color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
386
+ alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
387
+ },
388
+ };
389
+ }
390
+ if (oit === 'reveal') {
391
+ return {
392
+ format: 'r8unorm',
393
+ blend: {
394
+ color: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha', operation: 'add' },
395
+ alpha: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha', operation: 'add' },
396
+ },
397
+ };
398
+ }
399
+ return null;
400
+ }
401
+ /** The descriptor both paths build, written once so the two can never diverge. */
402
+ function flatDescriptor(cache, device, layout, variant, key, present, translucent,
403
+ /** Whether this pipeline reads a joint palette. See `FlatVertexOptions`. */
404
+ skinned,
405
+ /** Whether this pipeline reads morph deltas. See `FlatVertexOptions`. */
406
+ morphed = false,
407
+ /** Whether this pipeline writes depth. See `TranslucentMeshOptions.depthWrite`. */
408
+ depthWrite = true,
409
+ /** Which coplanar layer this pipeline draws on. See `TranslucentMeshOptions.depthLayer`. */
410
+ depthLayer = 0,
411
+ /** Whether placement and tint arrive per instance. See `FlatVertexOptions`. */
412
+ instanced = false,
413
+ /**
414
+ * Which order-independent transparency buffer this pipeline writes, if any.
415
+ *
416
+ * **A pipeline variant and not a shader one.** The two buffers are two blend states and two
417
+ * formats, both of which are pipeline state on this backend; the *shader* is the same one the
418
+ * ordinary translucent path uses, weighted by a uniform. That is what keeps this off
419
+ * `flatFrag`'s permutation axis, which `scripts/wgsl.ts` measures at about 247 KB gzipped.
420
+ */
421
+ oit = 'none') {
422
+ const offset = depthOffsetForLayer(depthLayer);
423
+ return {
424
+ label: key,
425
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
426
+ vertex: {
427
+ /*
428
+ * Selected per draw, like the fragment variant beside it — and the layout, the bind group
429
+ * and the cache key all carry the same flag. Building a skinned module against an unskinned
430
+ * layout validates, draws, and is wrong, exactly as this file's header says.
431
+ */
432
+ module: shaderModule(device, {
433
+ label: `flat.vert:${flatVertexKey(skinned, morphed, instanced)}`,
434
+ code: FLAT_VERT_WGSL[flatVertexKey(skinned, morphed, instanced)] ?? '',
435
+ }),
436
+ entryPoint: 'main',
437
+ buffers: vertexBufferLayouts(present, instanced),
438
+ },
439
+ fragment: {
440
+ module: shaderModule(device, {
441
+ label: `flat.frag:${variant}`,
442
+ code: FLAT_FRAG_WGSL[variant] ?? '',
443
+ }),
444
+ entryPoint: 'main',
445
+ targets: [
446
+ oitTarget(oit) ??
447
+ (translucent
448
+ ? {
449
+ format: cache.format,
450
+ blend: {
451
+ color: {
452
+ srcFactor: 'src-alpha',
453
+ dstFactor: 'one-minus-src-alpha',
454
+ operation: 'add',
455
+ },
456
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
457
+ },
458
+ }
459
+ : { format: cache.format }),
460
+ ],
461
+ },
462
+ primitive: { topology: 'triangle-list', cullMode: 'back' },
463
+ multisample: { count: cache.sampleCount },
464
+ /*
465
+ * `less`, matching the WebGL2 path's `LESS` rather than `LEQUAL`, and for the reason
466
+ * `drawMesh` documents there: under `LEQUAL` two coplanar surfaces do not merely tie,
467
+ * they overwrite each other, and a unit of rounding decides which survives per pixel.
468
+ */
469
+ depthStencil: {
470
+ format: DEPTH_FORMAT,
471
+ depthWriteEnabled: depthWrite,
472
+ depthCompare: DEPTH_COMPARE,
473
+ /*
474
+ * Baked in, where the other backend toggles it around the draw. Both read
475
+ * `depthOffsetForLayer`, so a layer is worth the same depth on either one, and a pipeline
476
+ * that asked for no layer carries the zeroes WebGPU's default already is.
477
+ */
478
+ depthBias: offset.units,
479
+ depthBiasSlopeScale: offset.slope,
480
+ },
481
+ };
482
+ }
@@ -0,0 +1,34 @@
1
+ import type { UniformFields } from './scatterPass.ts';
2
+ import type { PipelineCache } from './pipelineCache.ts';
3
+ /**
4
+ * The flock pass: ambient sky life, two triangles a bird, every path in the vertex shader.
5
+ *
6
+ * **The one effect in this backend that is neither blended nor additive.** A bird is opaque and
7
+ * writes depth like any other surface, which is what lets one pass in front of another. Nothing
8
+ * is culled: they are flat cards seen from both sides as they bank.
9
+ */
10
+ export declare const FLOCK_VERT_FIELDS: UniformFields;
11
+ export declare const FLOCK_VERT_SIZE: 112;
12
+ export declare const FLOCK_FRAG_FIELDS: UniformFields;
13
+ export declare const FLOCK_FRAG_SIZE: 16;
14
+ /** A flock on the device, behind the surface's opaque handle. */
15
+ export interface GpuFlock {
16
+ readonly corners: GPUBuffer;
17
+ readonly wings: GPUBuffer;
18
+ readonly indices: GPUBuffer;
19
+ readonly vertexCount: number;
20
+ dispose(): void;
21
+ }
22
+ export declare function createGpuFlock(device: GPUDevice, count: number): GpuFlock;
23
+ /** `aCorner`, `aWing`, `aIndex` — one buffer each, as `FlockRenderer` holds them. */
24
+ export declare function flockVertexLayouts(): GPUVertexBufferLayout[];
25
+ export declare function createFlockBindGroupLayout(device: GPUDevice): GPUBindGroupLayout;
26
+ export declare function createFlockBindGroup(device: GPUDevice, layout: GPUBindGroupLayout, vertices: GPUBuffer, fragments: GPUBuffer): GPUBindGroup;
27
+ /**
28
+ * The pipeline.
29
+ *
30
+ * `less` and depth written, matching the flat pass: a bird is geometry in the world rather than
31
+ * an effect over it, and a flock that did not write depth would show every bird through every
32
+ * other one.
33
+ */
34
+ export declare function flockPipeline(cache: PipelineCache, device: GPUDevice, layout: GPUBindGroupLayout): GPURenderPipeline;
@@ -0,0 +1,129 @@
1
+ import { DEPTH_COMPARE } from '../../depthConvention.js';
2
+ import { FLOCK_BINDINGS, FLOCK_FRAG_WGSL, FLOCK_VERT_WGSL, } from '../../shaders/generated/flock.wgsl.js';
3
+ import { buildFlockGeometry } from '../../flockGeometry.js';
4
+ import { DEPTH_FORMAT } from './flatPass.js';
5
+ import { shaderModule } from './shaderModules.js';
6
+ /**
7
+ * The flock pass: ambient sky life, two triangles a bird, every path in the vertex shader.
8
+ *
9
+ * **The one effect in this backend that is neither blended nor additive.** A bird is opaque and
10
+ * writes depth like any other surface, which is what lets one pass in front of another. Nothing
11
+ * is culled: they are flat cards seen from both sides as they bank.
12
+ */
13
+ export const FLOCK_VERT_FIELDS = FLOCK_BINDINGS.FLOCK_VERT.fields;
14
+ export const FLOCK_VERT_SIZE = FLOCK_BINDINGS.FLOCK_VERT.uniformSize;
15
+ export const FLOCK_FRAG_FIELDS = FLOCK_BINDINGS.FLOCK_FRAG.fields;
16
+ export const FLOCK_FRAG_SIZE = FLOCK_BINDINGS.FLOCK_FRAG.uniformSize;
17
+ const VERT_BINDING = FLOCK_BINDINGS.FLOCK_VERT.uniforms;
18
+ const FRAG_BINDING = FLOCK_BINDINGS.FLOCK_FRAG.uniforms;
19
+ const VISIBILITY_VERTEX = 0x1;
20
+ const VISIBILITY_FRAGMENT = 0x2;
21
+ const USAGE_VERTEX = 0x0020 | 0x0008;
22
+ export function createGpuFlock(device, count) {
23
+ const geometry = buildFlockGeometry(count);
24
+ const upload = (data, label) => {
25
+ const buffer = device.createBuffer({
26
+ label,
27
+ size: Math.max(4, data.byteLength),
28
+ usage: USAGE_VERTEX,
29
+ });
30
+ device.queue.writeBuffer(buffer, 0, data);
31
+ return buffer;
32
+ };
33
+ const corners = upload(geometry.corners, 'flock.corners');
34
+ const wings = upload(geometry.wings, 'flock.wings');
35
+ const indices = upload(geometry.indices, 'flock.indices');
36
+ return {
37
+ corners,
38
+ wings,
39
+ indices,
40
+ vertexCount: geometry.vertexCount,
41
+ dispose() {
42
+ corners.destroy();
43
+ wings.destroy();
44
+ indices.destroy();
45
+ },
46
+ };
47
+ }
48
+ /** `aCorner`, `aWing`, `aIndex` — one buffer each, as `FlockRenderer` holds them. */
49
+ export function flockVertexLayouts() {
50
+ return [
51
+ {
52
+ arrayStride: 8,
53
+ attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }],
54
+ },
55
+ {
56
+ arrayStride: 4,
57
+ attributes: [{ shaderLocation: 1, offset: 0, format: 'float32' }],
58
+ },
59
+ {
60
+ arrayStride: 4,
61
+ attributes: [{ shaderLocation: 2, offset: 0, format: 'float32' }],
62
+ },
63
+ ];
64
+ }
65
+ export function createFlockBindGroupLayout(device) {
66
+ return device.createBindGroupLayout({
67
+ label: 'flock.layout',
68
+ entries: [
69
+ /*
70
+ * **Addressed by a dynamic offset, so a frame can draw more than one batch.**
71
+ *
72
+ * With one buffer rewritten between draws, every batch reads whatever was written last:
73
+ * `queue.write*` calls are ordered on the queue timeline and the encoder is submitted after
74
+ * every one of them. The picture is each batch wearing the last one's colour, width, time
75
+ * and placement. That is the hazard `UniformRing` exists for, recorded in `AGENTS.md` on
76
+ * 2026-08-27, and this pass was one of four still carrying it — invisible for as long as
77
+ * nothing drew two, which is exactly how water kept it for eight releases.
78
+ *
79
+ * WebGL2 needs none of this: it sets uniforms and draws in one stream.
80
+ */
81
+ {
82
+ binding: VERT_BINDING,
83
+ visibility: VISIBILITY_VERTEX,
84
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLOCK_VERT_SIZE },
85
+ },
86
+ {
87
+ binding: FRAG_BINDING,
88
+ visibility: VISIBILITY_FRAGMENT,
89
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: FLOCK_FRAG_SIZE },
90
+ },
91
+ ],
92
+ });
93
+ }
94
+ export function createFlockBindGroup(device, layout, vertices, fragments) {
95
+ return device.createBindGroup({
96
+ label: 'flock.bindGroup',
97
+ layout,
98
+ entries: [
99
+ { binding: VERT_BINDING, resource: { buffer: vertices, size: FLOCK_VERT_SIZE } },
100
+ { binding: FRAG_BINDING, resource: { buffer: fragments, size: FLOCK_FRAG_SIZE } },
101
+ ],
102
+ });
103
+ }
104
+ /**
105
+ * The pipeline.
106
+ *
107
+ * `less` and depth written, matching the flat pass: a bird is geometry in the world rather than
108
+ * an effect over it, and a flock that did not write depth would show every bird through every
109
+ * other one.
110
+ */
111
+ export function flockPipeline(cache, device, layout) {
112
+ return cache.get('flock', () => ({
113
+ label: 'flock',
114
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
115
+ vertex: {
116
+ module: shaderModule(device, { label: 'flock.vert', code: FLOCK_VERT_WGSL }),
117
+ entryPoint: 'main',
118
+ buffers: flockVertexLayouts(),
119
+ },
120
+ fragment: {
121
+ module: shaderModule(device, { label: 'flock.frag', code: FLOCK_FRAG_WGSL }),
122
+ entryPoint: 'main',
123
+ targets: [{ format: cache.format }],
124
+ },
125
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
126
+ multisample: { count: cache.sampleCount },
127
+ depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: true, depthCompare: DEPTH_COMPARE },
128
+ }));
129
+ }