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