@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,875 @@
1
+ /** Version, inputs, uniforms and the defines the rest of the fragment shader is written against. */
2
+ import { COOKIE_TILE } from '../../lightBudget.ts';
3
+ import {
4
+ CLUSTER_TEXELS,
5
+ CLUSTER_X,
6
+ CLUSTER_Y,
7
+ CLUSTER_Z,
8
+ LIGHT_REGION_TEXELS,
9
+ LIGHT_TEXELS,
10
+ MAX_LIGHTS_PER_CLUSTER,
11
+ TABLE_WIDTH,
12
+ } from '../../clusteredLights.ts';
13
+ import { MAX_SHADOW_FILTER_TAPS } from '../../renderQuality.ts';
14
+ import type { LightBudget } from '../../uniformVectorBudget.ts';
15
+ import { FOG_GLSL } from '../fog.ts';
16
+
17
+ /**
18
+ * The preamble, built for one light budget.
19
+ *
20
+ * **A function rather than the constant it was, and the budget is why.** `MAX_LIGHTS` and
21
+ * `MAX_AREA_LIGHTS` size twenty and fourteen uniform arrays between them, and an array costs a
22
+ * whole row of the uniform grid per element whatever its base type — so these two numbers are
23
+ * most of what the lit shader spends against `MAX_FRAGMENT_UNIFORM_VECTORS`, and on a part that
24
+ * offers 256 of them they are the difference between a program that links and a black page. See
25
+ * `uniformVectorBudget.ts` for the counting and for the ladder the renderer walks.
26
+ *
27
+ * Rebuilt per call rather than memoised: it is 0.84 ms for the whole fragment source, measured,
28
+ * and a renderer builds it once at construction.
29
+ */
30
+ export function preambleGlsl({ maxLights, maxAreaLights }: LightBudget): string {
31
+ return `#version 300 es
32
+ precision highp float;
33
+
34
+ in vec3 vNormal;
35
+ in vec3 vColor;
36
+ in vec3 vWorldPos;
37
+ in float vEmissive;
38
+ in float vSpecular;
39
+ in vec4 vLightPos;
40
+ in vec2 vUv;
41
+ in vec3 vEmissiveColor;
42
+ in float vRoughness;
43
+ /*
44
+ * How far a bump may tilt the shading normal, and how much roughness that tilt is worth.
45
+ *
46
+ * A surface whose normal wanders cannot hold a highlight narrower than the wander, so the
47
+ * roughness has to grow with the relief or the picture is sparkle. Stated as a constant pair
48
+ * because the amplitude is known here rather than measured off the screen.
49
+ */
50
+ #define RELIEF_TILT 1.6
51
+ #define RELIEF_ROUGHNESS 0.35
52
+ /**
53
+ * The furthest a texture-derived bump may turn the shading normal, as a tangent.
54
+ *
55
+ * 1.0 is 45°. See the cap's own comment at the sampling site for why a limit has to exist at
56
+ * all: past this the perturbation is the same size as the surface it perturbs, and what comes
57
+ * out is decided by the last bits of a screen-space derivative rather than by the picture.
58
+ */
59
+ #define RELIEF_MAX_TILT 1.0
60
+ in float vGrain;
61
+ in float vRelief;
62
+ in vec4 vTangent;
63
+ /*
64
+ * **Declared after vTangent because the vertex stage declares them there.**
65
+ *
66
+ * GLSL ES links varyings by *name*, so on WebGL2 the order is free and this pair sat above
67
+ * vTangent for a whole build without anything going wrong. The generated path does not: GLSL to
68
+ * SPIR-V assigns varying locations by *declaration order*, so a stage that lists them in a
69
+ * different order hands WebGPU a vec4 where it expects a float.
70
+ *
71
+ * The failure is total and silent in the picture -- "The component count (4) of the vertex output
72
+ * at location 11 is different from the component count (1) of the fragment input at location 11",
73
+ * on a pipeline that is then never created, so the backend draws nothing at all while WebGL2 is
74
+ * pixel-perfect. Found by this row's own check on its first WebGPU run.
75
+ *
76
+ * **The rule this is an instance of: the two stages' varying blocks are one list in two places.**
77
+ * Adding a varying to one and not the other in the same position is a WebGPU-only defect that no
78
+ * WebGL2 capture can show.
79
+ */
80
+ in float vSkyDirect;
81
+ in float vAlpha;
82
+ /*
83
+ * The refraction thickness lane. **Declared here in the position the vertex stage declares it**,
84
+ * which is the rule 3.42.0 paid for: GLSL links varyings by name so WebGL2 does not care, and the
85
+ * generated path assigns locations by declaration order, so a stage that lists them differently
86
+ * hands WebGPU a mismatched component count and no pipeline is created at all.
87
+ */
88
+ in float vThickness;
89
+
90
+ /*
91
+ * Refraction: the colour the frame had already drawn when the first refracting draw arrived.
92
+ *
93
+ * **A uniform and a branch, never a permutation.** One more flatFrag axis is about 247 KB gzipped
94
+ * paid by every consumer whether or not they refract, against 19.8 KB for a branch -- which is the
95
+ * price table Track D's three shipped rows measured.
96
+ *
97
+ * uRefractStrength at 0 is every draw that shipped before this existed, and it is the default, so
98
+ * the sampler is bound to an empty texture and read nowhere on a frame that refracts nothing.
99
+ */
100
+ uniform sampler2D uRefractScene;
101
+ uniform float uRefractStrength;
102
+ uniform vec3 uRefractTint;
103
+ uniform float uRefractThickness;
104
+ flat in int vHasTangents;
105
+
106
+ /**
107
+ * Surface colour from an image the consumer supplied, multiplied into the vertex colour.
108
+ *
109
+ * The engine still ships and fetches no image assets — see surfaceTexture.ts. What this
110
+ * samples is whatever the caller handed over, which for a procedurally generated canvas
111
+ * is zero payload and no pipeline, exactly as vertex colour is.
112
+ *
113
+ * Multiplied rather than replacing, so vertex colour keeps working as the per-surface
114
+ * tint it already is: one greyscale tile image lit by different vertex colours is how a
115
+ * biome recolours a whole world without a second texture, and a mesh whose texture is
116
+ * white shades identically to one with no texture at all.
117
+ */
118
+ uniform sampler2D uAlbedo;
119
+ /** 0 leaves every textured path unevaluated, for the majority of geometry with no image. */
120
+ uniform int uAlbedoEnabled;
121
+ /**
122
+ * Alpha below which a textured fragment is thrown away entirely, 0 to disable.
123
+ *
124
+ * The billboard case: a face, a leaf, a sign is an image with a *shape*, and drawing its
125
+ * transparent corners as opaque black is the difference between a creature floating in
126
+ * the dark and a rectangle with a creature on it. A cutout rather than blending because
127
+ * these are depth-writing world geometry — blending them would need sorting, and a hard
128
+ * edge is what a cutout is for.
129
+ *
130
+ * Zero by default, so a texture with no alpha to speak of costs one compare and nothing
131
+ * else changes.
132
+ */
133
+ uniform float uAlbedoCutout;
134
+
135
+ /**
136
+ * A normal map, in the surface's own space.
137
+ *
138
+ * highp for the reason the depth samplers give: a lowp sampler may hand back eight bits, and eight
139
+ * bits of a direction is a surface quantised into visible facets.
140
+ *
141
+ * Sampled linear and never sRGB. These bytes are a direction, not a colour; decoding them as
142
+ * display values bends every normal toward the surface and reads as a green tint over everything.
143
+ * SurfaceTextureOptions.colorSpace already defaults to linear and says why.
144
+ */
145
+ uniform highp sampler2D uNormalMap;
146
+ /**
147
+ * How hard the map turns the shading normal. 0 is no map at all, and gates the whole block.
148
+ *
149
+ * A uniform rather than a permutation flag, following uAlbedoEnabled: a fifth boolean would take
150
+ * the exhaustive permutation sweep from sixteen shaders to thirty-two, and the generated WGSL that
151
+ * consumers bundle as source from 766 KB to about 1.5 MB. A permutation is the right tool for the
152
+ * shadow samplers, where a profile with shadows off should declare none of them; it is the wrong
153
+ * tool for one image on a shader that already declares one.
154
+ */
155
+ uniform float uNormalStrength;
156
+
157
+ /**
158
+ * Occlusion, roughness and metallic in one image. glTF's packing, because that is what an import
159
+ * carries: R is occlusion, G roughness, B metallic.
160
+ *
161
+ * highp for the reason the normal map gives: a lowp sampler may hand back eight bits, and eight
162
+ * bits of roughness is a highlight that steps between widths as a surface curves.
163
+ *
164
+ * Sampled linear and never sRGB. These three numbers *are* the data, not a picture of it, and
165
+ * decoding them as display values would bend every one of them toward its floor.
166
+ */
167
+ uniform highp sampler2D uOrmMap;
168
+ /**
169
+ * 1 when a map is bound. Gates the whole block, following uAlbedoEnabled.
170
+ *
171
+ * A uniform rather than a fifth permutation flag: FlatShaderOptions has four booleans and
172
+ * flatSource.test.ts sweeps all sixteen exhaustively, so a fifth takes that to thirty-two and
173
+ * roughly doubles the generated WGSL that consumers bundle as source, this engine having no build
174
+ * step. A permutation is the right tool for the shadow samplers, where a profile with shadows off
175
+ * should declare none of them. It is the wrong tool for one more image.
176
+ */
177
+ uniform int uOrmEnabled;
178
+ /**
179
+ * What each channel is scaled by, component-aligned with the map: r occlusion, g roughness,
180
+ * b metallic. The alignment is the documentation.
181
+ *
182
+ * **r is applied as a mix from 1 and not as a multiply**, because that is what glTF's
183
+ * occlusionTexture.strength is: 1 + strength * (texel - 1). A multiply at 0 means fully occluded,
184
+ * which is the opposite of what a caller asking for no occlusion means.
185
+ */
186
+ uniform vec3 uOrmScale;
187
+ /**
188
+ * 1 when \`uEnvironment\` holds the GGX-prefiltered cube, 0 when it holds the capture's box chain.
189
+ *
190
+ * **Two chains whose levels mean different things, so two pieces of arithmetic downstream.** A box
191
+ * level is a smaller picture and wants the texel-footprint floor; a prefiltered level is a lobe and
192
+ * wants a roughness combined in quadrature. Likewise the weight: the split sum is the correct share
193
+ * of a *prefiltered* environment and asserts an integral that was never performed over a box chain.
194
+ *
195
+ * A uniform rather than a permutation flag, following \`uOrmEnabled\`: a fifth boolean doubles the
196
+ * generated WGSL every consumer bundles as source, and this is a few multiply-adds.
197
+ */
198
+ uniform float uEnvironmentPrefiltered;
199
+
200
+ /**
201
+ * Where a surface glows, and in what colour.
202
+ *
203
+ * **sRGB, unlike the two maps above it.** A normal map is a direction and an ORM map is three
204
+ * numbers; this one is a colour somebody chose, so it is decoded the way the albedo is. Getting
205
+ * that backwards is not subtle — an emissive map read as linear comes out visibly dark and muddy
206
+ * where it should be saturated — but it is silent, because a glow that is too dim reads as a
207
+ * material choice rather than as a decode.
208
+ *
209
+ * A uniform gate rather than a permutation flag, for exactly the reasons \`uOrmEnabled\` gives
210
+ * above, and now with a number behind them: a fifth flag was built and measured at 49% of the
211
+ * bundle. See \`ARCHITECTURE.md\` §1.
212
+ */
213
+ uniform highp sampler2D uEmissiveMap;
214
+ /** 1 when a map is bound. Gates the sample, following uOrmEnabled. */
215
+ uniform int uEmissiveMapEnabled;
216
+ /**
217
+ * What the map is scaled by, per channel. 1 is the identity and the default.
218
+ *
219
+ * The counterpart of \`uOrmScale\`: a factor that multiplies a texture is not a value, and this is
220
+ * where the multiplier lives once an image supplies the shape.
221
+ */
222
+ uniform vec3 uEmissiveScale;
223
+
224
+ #if DIRECTIONAL_SHADOWS
225
+ /*
226
+ * The share marker below is what lets the environment probe exist, and it costs nothing.
227
+ *
228
+ * A device's sampler ceiling is per shader stage. This project's adapter offers exactly
229
+ * sixteen and the widest permutation of this shader declared seventeen — one albedo, these
230
+ * three maps, twelve point-shadow cubes and the probe's cube — so the probe was the one that
231
+ * gave way, and reflective surfaces kept a sky-and-ground gradient on hardware that could
232
+ * have mirrored the room.
233
+ *
234
+ * Every one of the fifteen shadow bindings was already one object: the WebGPU renderer hands
235
+ * them all the same shadow sampler, and flatPass declares them all non-filtering. So
236
+ * declaring one instead of fifteen changes nothing about how any of them is read, and takes
237
+ * the count to three. WebGL2 has no such limit and ignores the marker, which is a line
238
+ * comment to it.
239
+ *
240
+ * Marked on each declaration rather than matched on a name in the generator, deliberately.
241
+ * flatPass records what a name rule cost: a point-shadow cube's name does not end the way the
242
+ * three directional maps' names do, and a pattern wide enough to catch it also caught the
243
+ * probe's colour cube — whose mip chain is its roughness, so it needs a filtering sampler and
244
+ * cannot share a non-filtering one.
245
+ *
246
+ * Two things this comment may not contain, both learned here. No backticks: this is inside a
247
+ * template literal and one of them ends the shader. And no uniform names from the probe's
248
+ * half of the file, because a test asserts that a profile without a probe mentions them
249
+ * nowhere — a comment is source too, and it failed that test first.
250
+ */
251
+ uniform highp sampler2D uStaticShadowMap; // wgsl:share shadow
252
+ uniform highp sampler2D uPeeledShadowMap; // wgsl:share shadow
253
+ uniform highp sampler2D uDynamicShadowMap; // wgsl:share shadow
254
+ /** 0 disables directional shadows when their source is not emitting. */
255
+ uniform float uShadowStrength;
256
+ uniform float uShadowMapSize;
257
+ /** Orthographic depth span, used to keep the residual bias in world metres. */
258
+ uniform float uShadowDepthSpan;
259
+ /** Horizontal world-space reach over which directional occlusion dissolves. */
260
+ uniform float uShadowMaxDistance;
261
+ /** 0 for a cheaper single-static-depth quality profile. */
262
+ uniform int uPeeledShadowEnabled;
263
+ /** Maximum horizontal projection per vertical metre for directional shadows. */
264
+ uniform float uShadowMaxSlope;
265
+ #endif
266
+ /** One sampling budget drives both directional and point-light filtering. */
267
+ uniform int uShadowFilterTaps;
268
+ uniform vec3 uDirectionalDir; // surface → dominant source, normalized
269
+ uniform vec3 uDirectionalColor;
270
+ uniform vec3 uAmbient;
271
+ /**
272
+ * Ambient arriving from below, for a hemispheric fill.
273
+ *
274
+ * Ambient from a single colour lights a floor and a ceiling identically, which is the
275
+ * one thing real ambient never does: skylight comes from above and bounce comes off
276
+ * whatever you are standing on. A room whose floor is carpet and whose ceiling is white
277
+ * tile reads as neither if both get the same fill — the whole scene takes one flat tint.
278
+ *
279
+ * Defaults to uAmbient, so a consumer that sets only the one colour gets exactly the
280
+ * uniform fill it always did.
281
+ */
282
+ uniform vec3 uAmbientGround;
283
+ ${FOG_GLSL}
284
+ uniform vec3 uCameraPos;
285
+ /** Optional world plane; reflection passes retain only the viewer's side. */
286
+ uniform vec4 uClipPlane;
287
+ uniform int uClipEnabled;
288
+ uniform float uEmissiveGain;
289
+ uniform float uNightFactor;
290
+ #if NIGHT_EMISSIVE
291
+ /**
292
+ * Emission that only shows where the dominant light does not reach. 0 is off and is the default.
293
+ *
294
+ * The case it exists for is a lamp field on something that turns. Where the lights are is a
295
+ * property of the surface, so it is authored per vertex; whether they are visible is a property
296
+ * of where the sun is, and until this term nothing multiplied the two. Measured on the rotating
297
+ * planet it was reported from, a patch bright enough to read on the night side was sixteen times
298
+ * too bright on the day side, and the ratio is fixed by the lighting rather than by the value.
299
+ *
300
+ * The cut at the terminator is hard on purpose. Softening it is what puts the lights back on the
301
+ * day side, which is the whole of the defect being fixed.
302
+ */
303
+ uniform float uNightEmissive;
304
+ #endif
305
+ /**
306
+ * How solid this draw is, 0 to 1.
307
+ *
308
+ * One uniform rather than a second material, for the same reason uTint is one:
309
+ * everything else about a translucent piece of the world — its lighting, its fog,
310
+ * its emissive — is what the flat shader already does, and duplicating the whole
311
+ * of that to change one channel is how a renderer ends up with two shaders that
312
+ * disagree about the sun. The caller owns the blend state; this owns the number.
313
+ */
314
+ uniform float uOpacity;
315
+
316
+ /**
317
+ * Whether this draw is accumulating into the order-independent transparency buffers, and
318
+ * therefore weights its own output. 0 is every draw that is not, which is every draw on every
319
+ * published scene.
320
+ *
321
+ * **A uniform rather than a permutation, and the cost is why.** Writing the accumulation and the
322
+ * revealage from one pass needs a second fragment output, which is another \`flatFrag\` axis —
323
+ * measured in \`scripts/wgsl.ts\` at about 247 KB gzipped, doubling the sixteen fragment variants,
324
+ * and paid by every consumer whether or not they ever switch this on. A branch on a uniform costs
325
+ * a compare, and the geometry is submitted twice instead. See \`orderIndependent.ts\`.
326
+ *
327
+ * **The revealage pass does not read this.** It draws with this at 0 and a blend of
328
+ * \`(ZERO, ONE_MINUS_SRC_ALPHA)\`, so the colour it computes is multiplied away and only its alpha
329
+ * reaches the target — which is exactly the point: both passes run the same code to decide what
330
+ * alpha this fragment has, so they cannot disagree about it.
331
+ */
332
+ uniform float uOitWeighted;
333
+
334
+ /**
335
+ * Whether the fragment stage runs any lighting: ambient, the sun, point lights, specular,
336
+ * reflectivity, procedural grain, emissive and the arrival highlight. 1 keeps every one of
337
+ * them, which is what every draw did before this existed and what an opaque draw always
338
+ * does. 0 leaves the surface exactly its own vertex colour times its own texture — three.js
339
+ * calls that \`meshBasicMaterial\`, and it is what a flat glow shell or a flat backdrop plate
340
+ * needs: colour and opacity, and nothing else touching it.
341
+ *
342
+ * **A uniform branch rather than a fifth permutation, and that is a cost decision, not a
343
+ * style one.** \`POINT_SHADOWS\`, \`ENVIRONMENT_PROBE\` and the like are \`#if\`'d out because
344
+ * leaving them in adds a sampler or a uniform-block member a profile without the feature
345
+ * would still declare and still pay a bind group layout for — sixteen shader permutations
346
+ * already, doubled again by the translucent pipeline on WebGPU. This adds no binding and no
347
+ * block member the shader does not already carry the size of; it is one \`int\` beside
348
+ * \`uOpacity\`, read once. And the branch it drives is on a value that is the same for every
349
+ * fragment in one draw call, which is exactly the guarantee \`uReflectivity\` and
350
+ * \`uAlbedoEnabled\` already lean on above: a compiler asked to predicate a whole wavefront on
351
+ * one uniform skips the untaken side rather than computing both and discarding one, which is
352
+ * only true because nothing here reads it through a *varying*-dependent branch.
353
+ */
354
+ uniform int uLightingEnabled;
355
+ /**
356
+ * Whether this draw recedes into the medium: the atmospheric haze and the underwater tint
357
+ * both, folded together because both are the *camera's* medium rather than a property of the
358
+ * surface — see \`mediumFog\`/\`mediumColor\` in \`fog.ts\`. 1 keeps both, matching every draw
359
+ * before this existed.
360
+ *
361
+ * **Independent of \`uLightingEnabled\`, and that is the point of it being a second uniform
362
+ * rather than the same one.** "Unlit but still fading into the haze" is a real thing to
363
+ * want — a marker at the edge of view distance should still say it is far away even if
364
+ * nothing about it is shaded — so coupling the two would take away a look this shader can
365
+ * otherwise express for free. The caller chooses the combination; this only offers both.
366
+ *
367
+ * **The trade-off worth stating: with this at 0, the underwater tint is skipped too, which
368
+ * is the one place this draw can now disagree with the rest of a submerged world.** Every
369
+ * other pass applies \`uUnderwaterFactor\` unconditionally so that crossing the surface changes
370
+ * the whole scene together — see the comment on \`waterTransmission\` below. A translucent draw
371
+ * that asked to be unfogged is asking for its colour untouched by the medium full stop, which
372
+ * is what "exactly as its colour says" has to mean for it; the cost is that such a draw will
373
+ * not tint if the camera goes under water, unlike everything else in the frame.
374
+ */
375
+ uniform int uFogEnabled;
376
+
377
+ /**
378
+ * A pass-level scale over the grain the geometry declared, 0 to 1.
379
+ *
380
+ * Which surfaces are mineral is aGrain, per vertex, because it is a property of a
381
+ * material and nothing else in the frame can know it. This is the override on top: an
382
+ * imported model that declares nothing is drawn with the pass's own answer, and a scene
383
+ * can dial a whole draw down without rebuilding its geometry.
384
+ */
385
+ uniform float uGrain;
386
+ /*
387
+ * The material's own relief: how strong, and how many bumps to a metre.
388
+ *
389
+ * Two numbers rather than one because they are what separates the surfaces this exists for.
390
+ * Asphalt is coarse and deep, orange peel on paint is fine and shallow, cast concrete sits
391
+ * between them, and the geometry carrying them is identical in all three cases. See
392
+ * Renderer.setSurfaceRelief.
393
+ */
394
+ uniform float uRelief;
395
+ uniform float uReliefCycles;
396
+ /**
397
+ * How hard the bound surface texture's own luminance turns the shading normal, 0 for not at all.
398
+ *
399
+ * **The other half of relief, and the half a photograph can give.** \`uRelief\` invents structure
400
+ * from noise, which is right for asphalt and concrete because their structure has no particular
401
+ * arrangement. A rock, a bark, a beaten-metal plate does: the bumps are *where the picture says
402
+ * they are*, and noise cannot know. This reads the height off the image already bound as colour,
403
+ * so one photograph lights as the surface it is a photograph of.
404
+ *
405
+ * **The image serves both roles rather than a second sampler being added**, which is a decision
406
+ * and not a shortcut. This shader's widest permutation already declares one sampler more than
407
+ * this project's adapter offers, and is legal only because of the \`wgsl:share\` markers on the
408
+ * shadow cubemaps; a second image sampler here is not the free addition it would be in a smaller
409
+ * shader. It is also what the consumer this was built for actually does — three.js's own
410
+ * \`bumpMap\` is a height field, and a scene handing one image to \`map\` and \`bumpMap\` together
411
+ * is the ordinary case rather than an unusual one.
412
+ *
413
+ * Scaled exactly as three.js's \`bumpScale\` is, so a scene porting one carries the number across
414
+ * rather than refitting it, and negative inverts the relief there and here alike. Not clamped to
415
+ * 0..1 like its neighbours for the same reason: this is an amplitude against a luminance
416
+ * gradient, not a fraction of anything.
417
+ */
418
+ uniform float uTextureRelief;
419
+
420
+ /**
421
+ * How much of the environment this material mirrors, 0 to 1.
422
+ *
423
+ * Specular here is a highlight lobe and nothing else: a surface reflected the four lamps
424
+ * above it and not the room around it. That is why polished paint read as opaque no matter
425
+ * how tight the lobe was made, because what makes a car body look wet is mostly the world
426
+ * in it rather than the lights on it.
427
+ *
428
+ * Off by default, so every scene written before it is unchanged.
429
+ */
430
+ uniform float uReflectivity;
431
+ /**
432
+ * How bright the environment these surfaces reflect is, as a multiplier on it.
433
+ *
434
+ * **This exists because a metal has no other way to be lit.** Its Fresnel base is its own albedo,
435
+ * so \`f0\` is 1 and the environment blend reaches full weight at every angle: what a metal shows
436
+ * is \`environment * albedo\` and nothing else — no ambient, no direct diffuse. When the only
437
+ * environment available is a low-resolution cube of a room, a metal is exactly as bright as that
438
+ * room's own surfaces happen to be, and in an interior lit by a handful of lamps that is dark. A
439
+ * consumer reported it as an imported model reading dark in every world at once, which is the tell
440
+ * that it is not any one world's lighting.
441
+ *
442
+ * It is a **stand-in for image-based lighting** and it says so. A real prefiltered environment
443
+ * carries the sky and the sources a probe of nearby geometry never sees, and it would make this
444
+ * unnecessary; until there is one, the honest thing is one named number rather than thirty worlds
445
+ * each re-lit around the same missing term. See the \`image-based-lighting\` row in
446
+ * docs/CAPABILITIES.md.
447
+ *
448
+ * Applies to whatever the surface reflects, probe or hemispheric approximation alike, and to the
449
+ * probe's own irradiance where a caller asked for that. **1 is the default and the identity**, so
450
+ * every scene written before this is unchanged.
451
+ */
452
+ uniform float uEnvironmentGain;
453
+ /**
454
+ * The room itself, as a cubemap baked from one point, and whether one exists.
455
+ *
456
+ * highp because a lowp sampler may hand back eight bits and this one carries an image the eye
457
+ * looks *at* rather than a term that modulates something else. See the depth samplers.
458
+ *
459
+ * Sampled at a mip level chosen by roughness, which is the cheapest honest gloss blur there
460
+ * is: a polished surface takes level 0 and a satin one takes a blurred level, for the price of
461
+ * a fetch rather than a pass. This is the documented exception to the textureLod rule in
462
+ * AGENTS.md 2026-08-07 — the level is *wanted* here — and it is still an explicit level rather
463
+ * than an implicit derivative, so the rule holds either way.
464
+ *
465
+ * When no probe has been baked this stays at zero and the gradient below is used instead. It is
466
+ * gated on a flag rather than on the texture being bound, because an unbaked cubemap contains
467
+ * whatever the driver left in it, and a car mirroring uninitialised memory is worse than a car
468
+ * mirroring an approximation.
469
+ */
470
+ #if ENVIRONMENT_PROBE
471
+ uniform highp sampler2DArray uEnvironment;
472
+ uniform float uEnvironmentEnabled;
473
+ uniform float uEnvironmentMaxLod;
474
+ /**
475
+ * Texels across one probe's map at level 0, which the footprint arithmetic needs and
476
+ * \`uEnvironmentMaxLod\` no longer carries.
477
+ *
478
+ * They were one number while the environment was a cube: the chain ran to a single texel a face,
479
+ * so the top level *was* the log of the face size. The chain now stops one level below the cosine
480
+ * convolution, so the top level is 4 while the map is 256 across, and a footprint expressed as
481
+ * \`exp2(uEnvironmentMaxLod)\` would say sixteen. That reads as every metal in the scene being
482
+ * under-sampled and forced to a roughness it does not have.
483
+ */
484
+ uniform float uEnvironmentEdge;
485
+ /**
486
+ * The level holding the cosine convolution, which is the scene's diffuse ambient.
487
+ *
488
+ * **One binding carries both integrals**, and this is the line between them. Levels up to
489
+ * \`uEnvironmentMaxLod\` are the reflection at the roughness each stands for; this one is the
490
+ * room's diffuse light, convolved against the cosine at bake time. Folding them into one array is
491
+ * what leaves WebGL2's last guaranteed texture unit free.
492
+ *
493
+ * **It replaces nine spherical-harmonic coefficients**, which were projected on the CPU, read back
494
+ * off the GPU and uploaded again — a synchronous \`readPixels\` on one backend and a \`mapAsync\`
495
+ * answering a frame or two later on the other, with a second gate uniform to cover the gap. A
496
+ * second-order fit also could not carry a sharp source; an eight-texel octahedral image carries
497
+ * strictly more than nine coefficients did, and it costs a fetch rather than a readback.
498
+ */
499
+ uniform float uEnvironmentIrradianceLevel;
500
+ /**
501
+ * Where the probes stand, as a lattice: the first probe, the reciprocal of the step, and the
502
+ * counts.
503
+ *
504
+ * **Four uniforms whatever the probe count, and that is not an economy but a requirement.** This
505
+ * shader already declares 35 array uniforms totalling 385 uniform vectors against WebGL2's
506
+ * guaranteed \`MAX_FRAGMENT_UNIFORM_VECTORS\` of 224, so it is 1.7x over the guarantee before a
507
+ * probe is placed. Sixteen probes of position and extent would add about 48 vectors to a budget
508
+ * nobody can raise. A lattice needs none: the layer index is arithmetic.
509
+ *
510
+ * Counts of \`(1, 1, 1)\` is a single probe, which is what every scene that bakes one environment
511
+ * becomes, and it is not a special case anywhere below.
512
+ */
513
+ uniform vec3 uProbeGridOrigin;
514
+ uniform vec3 uProbeGridInvSpacing;
515
+ uniform vec3 uProbeGridCounts;
516
+ /**
517
+ * Whether the grid supplies the scene's diffuse ambient, or only its reflections.
518
+ *
519
+ * \`ProbeBakeOptions.irradiance\`, at grid scope. A bake used to do two things inseparably: fill
520
+ * a cube that reflective surfaces sample, and replace every diffuse surface's ambient with the
521
+ * room's own light. A consumer who wanted a car to mirror the village also got the whole scene
522
+ * relit at whatever moment the bake landed, and filed it four times over two days as four
523
+ * different bugs.
524
+ *
525
+ * Zero here declines the second half and the hemispheric gradient below is what lights the scene,
526
+ * exactly as it did before any probe existed.
527
+ */
528
+ uniform float uProbeGridAmbient;
529
+ #endif
530
+ /** A world-space box that lights up regardless of time of day (run finished). */
531
+ uniform vec3 uHighlightMin;
532
+ uniform vec3 uHighlightMax;
533
+ uniform float uHighlightGain;
534
+
535
+ /*
536
+ * The froxel table, and the numbers needed to find a fragment's place in it.
537
+ *
538
+ * **Every layout constant is interpolated from \`clusteredLights.ts\` rather than written here.**
539
+ * The binner, this shader and the WGSL kernel are three readers of one layout, and two of them
540
+ * agreeing because both contain the number 8 is the shape of defect the conformance script exists
541
+ * to catch. There is one definition and all three read it.
542
+ *
543
+ * **Declared unconditionally rather than behind a permutation, and that is a measured reversal.**
544
+ * \`ARCHITECTURE.md\` §1 makes a feature inside the lit pass a compile-on-demand permutation, and a
545
+ * fifth flag doubled the generated WGSL from sixteen variants to thirty-two — **914 KB to 1,906 KB
546
+ * raw and 400,728 to 597,638 bytes gzipped, a 49% rise on every consumer including those who never
547
+ * turn this on.** Gzip cannot dedupe near-identical copies across that span; its window is 32 KB
548
+ * and a permutation is larger than that. So this is a runtime branch on a uniform, and what it
549
+ * costs is stated below rather than hidden. \`ARCHITECTURE.md\` carries the finding.
550
+ *
551
+ * **\`texelFetch\` rather than \`texture\`, and it is not only a filtering choice.** An integer
552
+ * texture cannot be filtered at all, so the sampler this declaration would otherwise bring is dead
553
+ * weight against a per-stage ceiling; the \`wgsl:share\` marker gives it the shadow group's one,
554
+ * which it never uses. It also means the 2026-08-07 rule does not apply here: \`texelFetch\` takes
555
+ * no derivative, so reading it inside the light loop needs no explicit level and cannot be the
556
+ * flattened-branch cost that rule is about.
557
+ */
558
+ #define CLUSTER_X ${CLUSTER_X}
559
+ #define CLUSTER_Y ${CLUSTER_Y}
560
+ #define CLUSTER_Z ${CLUSTER_Z}
561
+ #define CLUSTER_TEXELS ${CLUSTER_TEXELS}
562
+ #define MAX_LIGHTS_PER_CLUSTER ${MAX_LIGHTS_PER_CLUSTER}
563
+ #define LIGHT_TEXELS ${LIGHT_TEXELS}
564
+ #define LIGHT_REGION_TEXELS ${LIGHT_REGION_TEXELS}
565
+ #define CLUSTER_TABLE_WIDTH ${TABLE_WIDTH}
566
+ uniform highp usampler2D uClusterTable; // wgsl:share shadow
567
+ /**
568
+ * The view matrix, so a fragment can find its own froxel.
569
+ *
570
+ * **From view space rather than from \`gl_FragCoord\`, and that is deliberate.** A WebGL2
571
+ * framebuffer counts y upward and a WebGPU one counts it downward, so a tile row derived from the
572
+ * fragment's window coordinate would be mirrored on one backend — the same trap the 2026-08-17
573
+ * rule about \`dFdy\` is written for, arriving through a different door. View space has no such
574
+ * disagreement, and it is also the space the binner works in, so the shader and the binner answer
575
+ * the same question with the same arithmetic.
576
+ */
577
+ uniform mat4 uView;
578
+ /** near, far, tan(fovY/2) and aspect: the four numbers the froxel grid is defined by. */
579
+ uniform vec4 uClusterFrustum;
580
+ /**
581
+ * 1 when the light loop reads the froxel table, 0 when it reads the uniform slots.
582
+ *
583
+ * A uniform, so the branch is uniform control flow and every fragment in a draw takes the same
584
+ * arm — which is what keeps it cheap and what keeps the 2026-08-07 rule satisfied. The table is
585
+ * only ever read with \`texelFetch\`, which takes no derivative, so nothing here needs an explicit
586
+ * level either way.
587
+ *
588
+ * **What this costs when it is 0**: one texture unit, one matrix and one vec4 in the block, and a
589
+ * compare per light. What it buys is that a consumer who never enables it does not download a
590
+ * second copy of the whole shader — see the note above the table's declaration.
591
+ */
592
+ uniform int uClustered;
593
+
594
+ /**
595
+ * One texel of the table, addressed by its flat index.
596
+ *
597
+ * The width divides both regions exactly, which is why this is a mask and a shift rather than a
598
+ * divide — see \`TABLE_WIDTH\` for the arithmetic that guarantees it.
599
+ */
600
+ uvec4 clusterTexel(int texel) {
601
+ return texelFetch(
602
+ uClusterTable,
603
+ ivec2(texel % CLUSTER_TABLE_WIDTH, texel / CLUSTER_TABLE_WIDTH),
604
+ 0);
605
+ }
606
+
607
+ #define MAX_LIGHTS ${maxLights}
608
+ /*
609
+ * How many times the light loop may go round.
610
+ *
611
+ * The clustered arm iterates a froxel's own list and the fixed arm iterates the uniform slots, so
612
+ * the bound differs; GLSL needs a constant either way. Defined here rather than at the loop so
613
+ * both numbers sit beside the budgets they come from.
614
+ */
615
+ /*
616
+ * **Both arms have the same bound, and that equality is deliberate.** There is one loop, so a
617
+ * larger clustered cap would raise the bound for the fixed path too, and a scene that never asks
618
+ * for froxels would carry a loop of 28 where it carries 16 today. \`MAX_LIGHTS_PER_CLUSTER\` is
619
+ * pinned equal to \`MAX_LIGHTS\` for that reason; a test in \`textureUnitBudget.test.ts\` asserts it.
620
+ */
621
+ #define LIGHT_LOOP_MAX MAX_LIGHTS
622
+ uniform int uLightCount;
623
+ /** 0 keeps the radius-shaped falloff; 1 is physical inverse-square with a soft cutoff. */
624
+ uniform int uLightFalloff;
625
+ uniform vec3 uLightPos[MAX_LIGHTS];
626
+ uniform vec3 uLightColor[MAX_LIGHTS];
627
+ uniform float uLightRadius[MAX_LIGHTS];
628
+ /*
629
+ * Each light's emitter radius in metres. Zero is a mathematical point, which is what every
630
+ * source was until a highlight narrower than a fragment turned out to be the cause of speckle
631
+ * on glossy paint. See sphereLobe.
632
+ */
633
+ uniform float uLightSourceRadius[MAX_LIGHTS];
634
+ /*
635
+ * How present each light is, 0 to 1: the ramp it crosses the edge of view range on,
636
+ * and the one it trades the last slot on. A world carries more lights than
637
+ * MAX_LIGHTS, so membership changes as the camera moves, and without this it changes
638
+ * by switching. See pointLightSelection.ts.
639
+ */
640
+ uniform float uLightWeight[MAX_LIGHTS];
641
+ /**
642
+ * Where each spot points, normalised, in world space. Unused by a light with no cone.
643
+ *
644
+ * Declared for every light rather than as a separate spot array, because a spot is a point light
645
+ * with a direction and giving it arrays of its own would put a second loop in the largest shader
646
+ * here — see \`ARCHITECTURE.md\` section 1 on what a fifth permutation cost.
647
+ */
648
+ uniform vec3 uLightDir[MAX_LIGHTS];
649
+ /**
650
+ * The cosine of each light's inner cone angle, then of its outer.
651
+ *
652
+ * A light with no cone carries -1 and -2, which makes \`smoothstep(outer, inner, dot)\` exactly 1
653
+ * for every direction on the sphere. See \`POINT_LIGHT_COS_OUTER\`: the pair is chosen so a point
654
+ * light collapses to the arithmetic it had rather than to something very close to it.
655
+ */
656
+ uniform vec2 uLightCone[MAX_LIGHTS];
657
+ /**
658
+ * Which row of the photometric atlas each light uses, or a negative index for none.
659
+ *
660
+ * A float rather than an int because it travels through the froxel record as one, and because the
661
+ * shader turns it into a texture coordinate immediately anyway.
662
+ */
663
+ uniform float uLightIesProfile[MAX_LIGHTS];
664
+ /**
665
+ * Where each light's photometric azimuth zero points, in world space.
666
+ *
667
+ * **Read only by an asymmetric profile**, which is a street light or a wall washer and is almost
668
+ * nothing else — every axially symmetric fixture ignores it, and a zero vector or one parallel to
669
+ * the aim leaves the profile on its first plane. Orthogonalised against the light's direction in
670
+ * the shader, so a caller hands the fixture's own forward and the aim decides the rest.
671
+ *
672
+ * **It cannot be derived from the direction.** There is no continuous field of unit vectors
673
+ * tangent to a sphere, so any reference built from the aim alone flips somewhere — and the obvious
674
+ * constructions put that flip exactly where these fixtures point, \`cross(worldUp, dir)\` being
675
+ * singular for a light aimed straight down.
676
+ */
677
+ uniform vec3 uLightIesAxis[MAX_LIGHTS];
678
+ /**
679
+ * Which tile of the cookie atlas each light projects, or a negative index for none.
680
+ *
681
+ * A cookie is a mask the fixture throws — a window frame, a grille, foliage — and it is oriented
682
+ * by \`uLightIesAxis\`, the same reference a photometric profile's azimuth uses, because both are
683
+ * answering the same question about a fixture: which way is up.
684
+ */
685
+ uniform float uLightCookie[MAX_LIGHTS];
686
+ /**
687
+ * Photometric profiles: one row per fixture, a fixture's intensity by vertical angle across it.
688
+ *
689
+ * **Every row spans the same 0 to 180 degree arc**, whatever the file measured, which is what lets
690
+ * a light carry only a row index — see \`iesProfile.ts\`. With no profile loaded this holds a
691
+ * single row of ones, the multiplicative identity, because a declared sampler needs a complete
692
+ * texture whether or not the branch reads it and a row of zeros would switch off every light.
693
+ */
694
+ uniform sampler2D uIesAtlas;
695
+ /** Rows in the atlas, so a row index becomes a coordinate. At least 1. */
696
+ uniform float uIesAtlasRows;
697
+ /**
698
+ * Horizontal planes each profile occupies, so a row is \`profile * planes + plane\`.
699
+ *
700
+ * **1 for an atlas with nothing asymmetric in it**, which is nearly every atlas, and the whole
701
+ * plane path is branched away on that — see \`photometric\` in \`main.ts\`. One count for the atlas
702
+ * rather than one per profile, because a per-profile count would need a second number in a light's
703
+ * record to divide by, and a light's record is where space is expensive.
704
+ */
705
+ uniform float uIesPlaneCount;
706
+ /**
707
+ * Cookies: one row of square tiles, one tile a fixture's mask.
708
+ *
709
+ * **0 when no consumer has loaded one, and the whole projection is branched away on it** — a
710
+ * \`uniform float\` is provably uniform control flow, so a scene with no cookie performs no
711
+ * arithmetic and no fetch. With none loaded this holds a single white texel, the multiplicative
712
+ * identity, because a declared sampler needs a complete texture whether or not the branch reads it
713
+ * and a black stand-in would switch off every light that reached it.
714
+ */
715
+ uniform sampler2D uCookieAtlas;
716
+ uniform float uCookieTiles;
717
+ /**
718
+ * Half a texel of a tile, so a cookie's edge cannot reach its neighbour in the atlas.
719
+ *
720
+ * A row of tiles filtered bilinearly bleeds across the seam between two of them, and the seam is
721
+ * exactly where a cone's edge lands — so the neighbour's colour would appear as a rim on every
722
+ * cookie. Derived from \`COOKIE_TILE\` rather than written twice.
723
+ */
724
+ #define COOKIE_INSET (0.5 / ${COOKIE_TILE}.0)
725
+ /**
726
+ * Rectangular area lights, and how many of them are live.
727
+ *
728
+ * **Four, and a branch on this count rather than a shader permutation.** \`ARCHITECTURE.md\` section
729
+ * 1 says a lit-pass feature earns a permutation only when carrying it compiled-in costs more than
730
+ * doubling the shader corpus, and this session measured both sides of that: thirty lines of shared
731
+ * code cost 6,215 gzipped bytes across the sixteen permutations, and fifty cost 10,517 — while the
732
+ * fifth flag clustered lighting nearly took cost 196,910. So the whole area-light term compiled in
733
+ * unconditionally is roughly a twentieth of what permuting it would cost, and the count being zero
734
+ * is what makes it free at runtime.
735
+ *
736
+ * Four because a rectangle is a *fixture* — a window, a softbox, a panel — and a scene with more
737
+ * than a handful is a scene that wants them baked. Raising it is a uniform-array size and an
738
+ * iteration of the loop, exactly as \`MAX_LIGHTS\` is.
739
+ */
740
+ #define MAX_AREA_LIGHTS ${maxAreaLights}
741
+ uniform int uAreaLightCount;
742
+ /** Centre of each rectangle, in world space. */
743
+ uniform vec3 uAreaLightPos[MAX_AREA_LIGHTS];
744
+ /** Colour times intensity, as the point lights carry it. */
745
+ uniform vec3 uAreaLightColor[MAX_AREA_LIGHTS];
746
+ /** The rectangle's in-plane axes, unit length, and its half extents along each. */
747
+ uniform vec3 uAreaLightRight[MAX_AREA_LIGHTS];
748
+ uniform vec3 uAreaLightUp[MAX_AREA_LIGHTS];
749
+ uniform vec2 uAreaLightSize[MAX_AREA_LIGHTS];
750
+ /**
751
+ * Whether the rectangle emits from both faces, 1 or 0.
752
+ *
753
+ * A window is one-sided and a hanging panel is two-sided, and the difference is visible: a
754
+ * one-sided light behind a surface must contribute nothing rather than lighting it from behind,
755
+ * which is what an unsigned form factor would do.
756
+ */
757
+ uniform float uAreaLightTwoSided[MAX_AREA_LIGHTS];
758
+ /** Pi, for turning a dot product into the angle a photometric row is indexed by. */
759
+ #define PI_IES 3.14159265359
760
+ /** A whole turn, for mapping an azimuth onto the plane grid. */
761
+ #define TAU_IES 6.28318530718
762
+ /** Index into the light arrays that each shadow cubemap belongs to, -1 if unused. */
763
+ /**
764
+ * Sampled shadow maps — one per shaded light, deliberately.
765
+ *
766
+ * Any number below MAX_LIGHTS means some lights illuminate without occluding,
767
+ * and *which* ones changes as the camera moves. That reads as shadows switching
768
+ * on and off as you walk up to a lamp, which is worse than either extreme: a
769
+ * missing shadow is merely flat, but one that appears and vanishes draws the
770
+ * eye straight to it. Matching the two budgets is what makes the effect
771
+ * impossible rather than rare.
772
+ *
773
+ * **One array texture, a layer per light, where there were twelve cubemaps.** That is
774
+ * where eleven of WebGL2's sixteen guaranteed texture units came back from, and it is
775
+ * also why the arrays below are indexed by the light rather than by a slot: GLSL ES
776
+ * cannot index a sampler array with a non-constant expression, so selecting a cubemap
777
+ * meant ten unrolled comparison arms. A layer is an ordinary integer, so it is a lookup.
778
+ */
779
+ #if POINT_SHADOWS
780
+ /** Which array layer holds this light's shadow, or -1 for none. */
781
+ uniform int uPointShadowLayer[MAX_LIGHTS];
782
+ uniform float uPointShadowFar[MAX_LIGHTS];
783
+ uniform float uPointShadowNear[MAX_LIGHTS];
784
+ /** Emitter radius per light — drives how soft its shadows are. */
785
+ uniform float uPointShadowSize[MAX_LIGHTS];
786
+ // How present each bound map is, 0 to 1. See the ramp at the sampling site.
787
+ uniform float uPointShadowWeight[MAX_LIGHTS];
788
+ /*
789
+ * **highp, and it is load-bearing.** GLSL ES gives a fragment shader's samplers a default
790
+ * precision of lowp, whatever the file declares for its floats: that line is about float,
791
+ * not about a sampler. A lowp sampler is entitled to return eight bits.
792
+ *
793
+ * This holds DEPTH_COMPONENT24 — see pointShadowArray.ts — carrying a radius as a fraction
794
+ * of the light's far plane. Eight bits of that is a shadow quantised to eight steps of the
795
+ * light's range, which reads as concentric rings around every lamp. The conversion is only a
796
+ * multiply now rather than the perspective divide a cubemap needed, so the error is no longer
797
+ * *magnified*; it is still eight bits where twenty-four were stored.
798
+ *
799
+ * The 2D shadow maps a hundred lines up already carry the qualifier, and the composite pass
800
+ * was found reading depth at eight bits in 0.13.0. This is the same fault in the third place
801
+ * it exists.
802
+ */
803
+ uniform highp sampler2DArray uPointShadows; // wgsl:share shadow
804
+
805
+ /**
806
+ * Moving casters are separate from persistent world maps. Two live maps exist
807
+ * only so ownership can crossfade when another light becomes nearer.
808
+ *
809
+ * Layers of the same array, and addressed by the light rather than by the pair, because a
810
+ * light owns at most one of the two at a time.
811
+ */
812
+ uniform int uLivePointShadowLayer[MAX_LIGHTS];
813
+ uniform float uLivePointShadowFar[MAX_LIGHTS];
814
+ uniform float uLivePointShadowNear[MAX_LIGHTS];
815
+ uniform float uLivePointShadowSize[MAX_LIGHTS];
816
+ uniform float uLivePointShadowWeight[MAX_LIGHTS];
817
+
818
+ /**
819
+ * A rectangular area light's occlusion, in the same array a point light's lives in.
820
+ *
821
+ * **The same array because there is no second texture unit to put one in.** WebGL2 guarantees
822
+ * sixteen and the lit pass binds sixteen — \`FlatShaderOptions.environmentProbe\` documents the
823
+ * same wall from the other side, a seventeenth declared sampler silently sharing unit 0 with a
824
+ * \`sampler2D\` shadow map. So an area shadow is a layer above the point pool rather than a
825
+ * texture of its own, which also means **it rides \`POINT_SHADOWS\`**: a consumer whose scene is
826
+ * lit by rectangles alone still needs that flag on, and \`RenderQuality.pointShadows\` is where it
827
+ * is turned on. The renderer says so by name rather than drawing an unoccluded rectangle.
828
+ *
829
+ * Indexed by area-light slot, which is the same index the arrays above it use, because
830
+ * \`selectAreaLights\` fills both from the caller's list in order. \`-1\` in a layer says this
831
+ * rectangle has no image — a slot that does not cast, or one whose first bake has not landed.
832
+ */
833
+ uniform int uAreaShadowLayer[MAX_AREA_LIGHTS];
834
+ uniform float uAreaShadowFar[MAX_AREA_LIGHTS];
835
+ uniform float uAreaShadowNear[MAX_AREA_LIGHTS];
836
+ /** How present the image is, so a first bake arrives rather than appears. */
837
+ uniform float uAreaShadowWeight[MAX_AREA_LIGHTS];
838
+ /**
839
+ * The layer holding movers only, composed with the one above by multiplication.
840
+ *
841
+ * One per casting rectangle rather than a shared pair, which is where this differs from the point
842
+ * lights above: those borrow two live maps and crossfade ownership because fifty lamps compete for
843
+ * them, and at most \`MAX_AREA_LIGHTS\` rectangles exist, so each simply owns one. Nothing changes
844
+ * hands, so nothing has to fade across a handover.
845
+ */
846
+ uniform int uLiveAreaShadowLayer[MAX_AREA_LIGHTS];
847
+ uniform float uLiveAreaShadowFar[MAX_AREA_LIGHTS];
848
+ uniform float uLiveAreaShadowNear[MAX_AREA_LIGHTS];
849
+ uniform float uLiveAreaShadowWeight[MAX_AREA_LIGHTS];
850
+ #endif
851
+
852
+ /**
853
+ * Omnidirectional shadow test against a depth cubemap.
854
+ *
855
+ * The comparison happens in *linear* distance, not in stored depth. Perspective
856
+ * depth is wildly non-linear: near the far plane a bias of a few thousandths
857
+ * spans metres of world space, which silently makes everything unshadowed. So
858
+ * the sampled depth is converted back to a distance and compared in metres,
859
+ * where a bias means what it looks like it means.
860
+ */
861
+ /**
862
+ * Sample offsets forming a rough sphere, for filtering a cubemap shadow.
863
+ * Perturbing the *direction* is how PCF works on a cube — there is no 2D UV
864
+ * neighbourhood to step across the way there is for the sun's cascade.
865
+ */
866
+ #if POINT_SHADOWS
867
+ const vec3 PCF_OFFSETS[${MAX_SHADOW_FILTER_TAPS}] = vec3[${MAX_SHADOW_FILTER_TAPS}](
868
+ vec3( 1.0, 1.0, 1.0), vec3( 1.0, -1.0, -1.0), vec3(-1.0, 1.0, -1.0), vec3(-1.0, -1.0, 1.0),
869
+ vec3( 1.0, -1.0, 1.0), vec3(-1.0, 1.0, 1.0), vec3( 1.0, 1.0, -1.0), vec3(-1.0, -1.0, -1.0),
870
+ vec3( 1.0, 0.0, 0.0), vec3(-1.0, 0.0, 0.0), vec3( 0.0, 1.0, 0.0), vec3( 0.0, -1.0, 0.0)
871
+ );
872
+ #endif
873
+
874
+ /** A finite point-light shadow loses strength with the light that casts it. */`;
875
+ }