@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,431 @@
1
+ import { FOG_GLSL } from './fog.js';
2
+ import { OUTPUT_TRANSFORM_GLSL } from './outputTransform.js';
3
+ import { MAX_POINT_LIGHTS } from '../lightBudget.js';
4
+ /**
5
+ * Particle materials: soft smoke, hot sparks, and unlit motes.
6
+ *
7
+ * One vertex program, three fragment programs, and the split is the same one the
8
+ * plumes already make — `PLUME_VERT` places a volume and the fragment decides
9
+ * whether it is fire or smoke. Here the vertex program places a particle as a
10
+ * **camera-facing quad**, or as a world-fixed cross of two when a caller asks, and
11
+ * the fragment decides whether it is a puff of grit, an ember, or an unlit point.
12
+ *
13
+ * **The cross was the only option and then the default, and is now neither.** The
14
+ * argument for it is the one `plumeRenderer` records at length, and it is a real
15
+ * one: a billboard has no parallax, so orbiting a plume shows the identical
16
+ * silhouette from every angle and the whole effect swivels as a sheet, where two
17
+ * fixed blades genuinely bring one broadside as the other goes edge-on. What that
18
+ * argument leaves out is what the going-edge-on blade *draws*. It does not fade as
19
+ * it turns; it compresses, and a sprite compressed into a one-pixel column spends
20
+ * its entire brightness in that column. On smoke it hides inside the noise. On an
21
+ * additive spark it is a bright straight line through the middle of every particle,
22
+ * which is how it was finally caught. `uCameraFacing` carries the full account and
23
+ * the terms of the trade for anyone who wants the blades back.
24
+ *
25
+ * **These replace drawing particles through the foliage shader**, which is what
26
+ * every effect built on `ParticlePool` used to do. Grass is opaque, lit
27
+ * two-sided, and has no opacity channel — so a grain of smoke was a solid cube
28
+ * lit like a leaf, and its "fade" was its colour being driven to black — which reads
29
+ * as squared-off smoke that never had a shader of its own, against fire that did.
30
+ * This is that missing quality: a soft body eroded by
31
+ * the same value noise, an honest alpha, and real lighting.
32
+ */
33
+ /**
34
+ * Blades in the cross, and the vertices and indices that costs.
35
+ *
36
+ * Still two under `facing: 'camera'`, where the second is collapsed to zero area in the
37
+ * vertex stage rather than dropped here — so one pair of buffers serves both facings and a
38
+ * batch chooses per pool. See `uCameraFacing`.
39
+ */
40
+ export const PARTICLE_BLADES = 2;
41
+ export const PARTICLE_VERTS = PARTICLE_BLADES * 4;
42
+ export const PARTICLE_INDICES = PARTICLE_BLADES * 6;
43
+ /**
44
+ * Shared noise. Value noise, two octaves, exactly the construction `SMOKE_FRAG`
45
+ * uses — a particle and a plume standing in the same scene must not be eroded by
46
+ * different mathematics, or the small effect reads as a different material from
47
+ * the large one it is supposed to be a wisp of.
48
+ */
49
+ const PARTICLE_NOISE = `
50
+ float hash21(vec2 p) {
51
+ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
52
+ }
53
+
54
+ float valueNoise(vec2 p) {
55
+ vec2 i = floor(p);
56
+ vec2 f = fract(p);
57
+ vec2 u = f * f * (3.0 - 2.0 * f);
58
+ return mix(
59
+ mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x),
60
+ mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), u.x),
61
+ u.y
62
+ );
63
+ }
64
+
65
+ float billow(vec2 p, float t, int octaves) {
66
+ float v = valueNoise(p * 2.4 + vec2(0.0, -t * 0.5)) * 0.62;
67
+ if (octaves == 1) return v / 0.62;
68
+ v += valueNoise(p * 5.1 + vec2(t * 0.15, -t * 0.8)) * 0.38;
69
+ return v / 1.0;
70
+ }
71
+ `;
72
+ export const PARTICLE_VERT = `#version 300 es
73
+ /** Per-vertex: the quad corner, and which blade of the cross it belongs to. */
74
+ layout(location = 0) in vec2 aCorner;
75
+ layout(location = 1) in float aBlade;
76
+ /** Per-instance. */
77
+ layout(location = 2) in vec3 aPos;
78
+ layout(location = 3) in float aSize;
79
+ layout(location = 4) in float aSpin;
80
+ layout(location = 5) in vec3 aColor;
81
+ /** Opacity, age as a share of life, and this particle's own seed. */
82
+ layout(location = 6) in float aAlpha;
83
+ layout(location = 7) in float aAge;
84
+ layout(location = 8) in float aSeed;
85
+ layout(location = 9) in vec3 aVelocity;
86
+
87
+ uniform mat4 uViewProj;
88
+ uniform vec3 uCameraPos;
89
+ /**
90
+ * How far a particle is stretched along its own motion, in seconds of travel.
91
+ *
92
+ * Zero for smoke, which has no direction worth seeing. A spark is the opposite
93
+ * case: an ember crossing a metre in a frame drawn as a round dot reads as a
94
+ * floating pixel, and the same ember drawn as a short streak along its velocity
95
+ * reads as a thrown spark. The eye gets its motion cue from the shape.
96
+ */
97
+ uniform float uStretchSec;
98
+ /**
99
+ * 1 to turn a single quad to face the camera, 0 to draw the world-fixed cross.
100
+ *
101
+ * **Camera-facing is the default, and the cross is the option.** It was the other way
102
+ * round until a caller drew an additive glow with a camera looking down -Z and got a
103
+ * bright straight line through the middle of every sprite. The cross is two blades at
104
+ * right angles in *world* space: blade 0 spans X, blade 1 spans Z. Look down either
105
+ * axis and that blade is edge-on, and a disc squeezed into a one-pixel column does not
106
+ * lose the energy it was drawn with — it puts all of it in that column. Alpha-blended
107
+ * smoke half hides it behind its own noise. Additive has nothing to hide it with.
108
+ *
109
+ * Fading a blade out as it turns edge-on fixes that one case and not the matching one:
110
+ * both blades contain world Y, so a camera looking straight down sees *both* edge-on
111
+ * and the puff is a plus sign of two lines, or nothing at all once they are faded. A
112
+ * camera-facing quad has no angle at which it thins, which is why it is what particle
113
+ * systems generally draw.
114
+ *
115
+ * The cross is still worth keeping. Two blades give real parallax when a camera moves
116
+ * through a puff, and that is a volume cue a single quad cannot fake — worth having in
117
+ * a ground-level world whose camera never looks far off the horizontal, where the
118
+ * edge-on blade stays a thin sliver inside soft smoke rather than a line across a
119
+ * spark. It also costs a brightness that swings with the view: a cross covers one
120
+ * sprite of area seen down an axis and about 1.4 seen from the diagonal, so a puff
121
+ * quietly pulses as the camera orbits it. A camera-facing quad covers the same area
122
+ * from everywhere.
123
+ */
124
+ uniform float uCameraFacing;
125
+
126
+ out vec2 vUv;
127
+ out vec3 vColor;
128
+ out float vAlpha;
129
+ out float vAge;
130
+ out float vSeed;
131
+ out vec3 vWorldPos;
132
+ out vec3 vNormal;
133
+
134
+ void main() {
135
+ float s = sin(aSpin);
136
+ float c = cos(aSpin);
137
+ // Roll within the blade's own plane, so the two blades never look like one
138
+ // rigid object turning.
139
+ vec2 rolled = vec2(aCorner.x * c - aCorner.y * s, aCorner.x * s + aCorner.y * c);
140
+
141
+ /*
142
+ * The plane the corners are laid out in, built from the particle's centre rather than
143
+ * from the corner being transformed, so all four corners of a quad share one basis and
144
+ * the quad stays planar and rectangular.
145
+ */
146
+ vec3 across;
147
+ vec3 up;
148
+ float bladeGain;
149
+ if (uCameraFacing > 0.5) {
150
+ vec3 toCamera = normalize(uCameraPos - aPos);
151
+ /* Any reference not parallel to the view. World up serves everywhere except looking
152
+ straight up or down it, where the two are the same line and the cross product
153
+ vanishes; +Z takes over there. */
154
+ vec3 reference = abs(toCamera.y) > 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);
155
+ across = normalize(cross(reference, toCamera));
156
+ up = cross(toCamera, across);
157
+ /*
158
+ * One quad, not two. Both blades face the camera here, so they would land on exactly
159
+ * the same pixels and the second would be nothing but the first drawn again: double
160
+ * the fill for double the brightness no caller asked for. Collapsing it to zero area
161
+ * costs nothing — the rasteriser drops a degenerate triangle before it shades — and
162
+ * leaves the vertex and index buffers the shape both backends already build, so a
163
+ * batch picks its facing without either one rebuilding its geometry.
164
+ */
165
+ bladeGain = aBlade < 0.5 ? 1.0 : 0.0;
166
+ } else {
167
+ across = aBlade < 0.5 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 0.0, 1.0);
168
+ up = vec3(0.0, 1.0, 0.0);
169
+ bladeGain = 1.0;
170
+ }
171
+ vec3 offset = (across * rolled.x + up * rolled.y) * aSize;
172
+
173
+ /*
174
+ * Stretched along travel. Applied as an extra displacement on the component of
175
+ * the corner that already points along the motion, so a stationary particle is
176
+ * untouched and a fast one lengthens without also getting fatter.
177
+ */
178
+ if (uStretchSec > 0.0) {
179
+ vec3 travel = aVelocity * uStretchSec;
180
+ float along = dot(normalize(offset + vec3(1e-6)), normalize(travel + vec3(1e-6)));
181
+ offset += travel * along * 0.5;
182
+ }
183
+
184
+ /* bladeGain applied here, after the stretch rather than before it, so a dropped blade
185
+ is degenerate whatever the stretch added: all four of its corners land on aPos. */
186
+ vec3 world = aPos + offset * bladeGain;
187
+ vUv = aCorner;
188
+ vColor = aColor;
189
+ vAlpha = aAlpha;
190
+ vAge = aAge;
191
+ vSeed = aSeed;
192
+ vWorldPos = world;
193
+ /*
194
+ * The blade's own facing, flipped toward the viewer. A cross has no meaningful
195
+ * outward normal, and a puff of smoke is not a surface — but it does have to be
196
+ * *lit*, and a normal facing the camera is the standard, honest cheat for a
197
+ * volume approximated by cards: it makes the puff read as a lump catching light
198
+ * from wherever the light is, rather than as a flat panel that goes black at
199
+ * some angles.
200
+ */
201
+ vec3 face = cross(across, up);
202
+ vec3 toEye = normalize(uCameraPos - world);
203
+ vNormal = dot(face, toEye) < 0.0 ? -face : face;
204
+
205
+ gl_Position = uViewProj * vec4(world, 1.0);
206
+ }
207
+ `;
208
+ /**
209
+ * Smoke, grit and dust: a soft body eroded by noise, alpha blended, and lit.
210
+ *
211
+ * Lit by the sun, the ambient *and* the nearby point lights, which is the half
212
+ * the foliage path could never do. A drift at night beside a brazier threw grey
213
+ * grit whatever the brazier was doing, because grass has no point-light term —
214
+ * and unlit smoke in a world lit by fires is the tell that gives an effect away
215
+ * fastest. A puff catching a flame's colour is most of what makes it belong.
216
+ */
217
+ export const PARTICLE_SMOKE_FRAG = `#version 300 es
218
+ precision highp float;
219
+
220
+ in vec2 vUv;
221
+ in vec3 vColor;
222
+ in float vAlpha;
223
+ in float vAge;
224
+ in float vSeed;
225
+ in vec3 vWorldPos;
226
+ in vec3 vNormal;
227
+
228
+ uniform float uTime;
229
+ uniform vec3 uDirectionalDir;
230
+ uniform vec3 uDirectionalColor;
231
+ uniform vec3 uAmbient;
232
+ uniform vec3 uCameraPos;
233
+ uniform int uNoiseOctaves;
234
+ /** How strongly the noise eats into the puff. 0 is a plain soft ball. */
235
+ uniform float uErosion;
236
+
237
+ #define MAX_LIGHTS ${MAX_POINT_LIGHTS}
238
+ uniform int uLightCount;
239
+ uniform vec3 uLightPos[MAX_LIGHTS];
240
+ uniform vec3 uLightColor[MAX_LIGHTS];
241
+ uniform float uLightRadius[MAX_LIGHTS];
242
+ // How present each light is, 0 to 1. See pointLightSelection.ts.
243
+ uniform float uLightWeight[MAX_LIGHTS];
244
+
245
+ ${FOG_GLSL}
246
+ ${PARTICLE_NOISE}
247
+
248
+ out vec4 outColor;
249
+ ${OUTPUT_TRANSFORM_GLSL}
250
+
251
+ void main() {
252
+ /*
253
+ * A round, soft body first. 'smoothstep' rather than a hard disc: the edge is
254
+ * the entire difference between a puff and a sprite, and a cut-off circle reads
255
+ * as a decal however good the noise inside it is.
256
+ */
257
+ float r = length(vUv);
258
+ float body = 1.0 - smoothstep(0.35, 1.0, r);
259
+ if (body <= 0.0) discard;
260
+
261
+ /*
262
+ * Then eaten into by noise that drifts and coarsens as the puff ages, so it
263
+ * dissipates by *breaking up* rather than by uniformly thinning. Uniform
264
+ * thinning is what a fading sprite does, and it is what the old cube did.
265
+ */
266
+ float t = uTime * 0.55 + vSeed * 7.31;
267
+ float n = billow(vUv * (0.9 + vAge * 1.4) + vec2(vSeed * 3.7, 0.0), t, uNoiseOctaves);
268
+ float erode = mix(1.0, n, uErosion * (0.35 + vAge * 0.65));
269
+ float mask = clamp(body * erode, 0.0, 1.0);
270
+ // Feather the last of it out rather than letting a noise threshold flicker.
271
+ mask *= smoothstep(0.0, 0.25, mask);
272
+ if (mask <= 0.002) discard;
273
+
274
+ vec3 n3 = normalize(vNormal);
275
+ /*
276
+ * Wrapped diffuse. Smoke transmits as well as reflects, so the terminator on a
277
+ * puff sits well past 90° — a hard 'max(dot, 0)' gives a lump with a black side,
278
+ * which is exactly the "coloured box" failure the fidelity rules name.
279
+ */
280
+ float ndl = dot(n3, uDirectionalDir) * 0.5 + 0.5;
281
+ vec3 lit = uAmbient + uDirectionalColor * ndl;
282
+
283
+ for (int i = 0; i < MAX_LIGHTS; i++) {
284
+ if (i >= uLightCount) break;
285
+ vec3 toLight = uLightPos[i] - vWorldPos;
286
+ float dist = length(toLight);
287
+ float radius = uLightRadius[i];
288
+ if (radius <= 0.0 || dist >= radius) continue;
289
+ float falloff = 1.0 - dist / radius;
290
+ float wrapped = dot(n3, toLight / max(dist, 1e-4)) * 0.5 + 0.5;
291
+ lit += uLightColor[i] * falloff * falloff * wrapped * uLightWeight[i];
292
+ }
293
+
294
+ vec3 shaded = vColor * lit;
295
+ float fog = mediumFog(distance(vWorldPos, uCameraPos), vWorldPos.y);
296
+ outColor = vec4(applyOutputTransform(mix(shaded, mediumColor(), fog)), mask * vAlpha);
297
+ }
298
+ `;
299
+ /**
300
+ * Sparks and embers: additive, hot in the middle, and stretched along travel.
301
+ *
302
+ * No lighting at all, deliberately — a spark *is* a light source, and shading it
303
+ * is what turned the first version into a grey cube at night. The core is allowed
304
+ * past white so it reads as incandescent rather than as a pale dot.
305
+ */
306
+ export const PARTICLE_SPARK_FRAG = `#version 300 es
307
+ precision highp float;
308
+
309
+ in vec2 vUv;
310
+ in vec3 vColor;
311
+ in float vAlpha;
312
+ in float vAge;
313
+ in float vSeed;
314
+ in vec3 vWorldPos;
315
+ in vec3 vNormal;
316
+
317
+ uniform float uTime;
318
+ uniform vec3 uCameraPos;
319
+ /** How far past white the centre may go. */
320
+ uniform float uCoreGain;
321
+ ${FOG_GLSL}
322
+ ${PARTICLE_NOISE}
323
+
324
+ out vec4 outColor;
325
+ ${OUTPUT_TRANSFORM_GLSL}
326
+
327
+ void main() {
328
+ float r = length(vUv);
329
+ if (r > 1.0) discard;
330
+
331
+ /*
332
+ * Two falloffs again — a tight core and a broad halo — because one gives either
333
+ * a hard dot or a soft smudge. The halo is what makes a shower of embers read
334
+ * as glowing air rather than as a scatter of points.
335
+ */
336
+ float core = pow(1.0 - clamp(r, 0.0, 1.0), 6.0);
337
+ float halo = pow(1.0 - clamp(r, 0.0, 1.0), 1.6);
338
+
339
+ /*
340
+ * Embers flicker as they tumble and cool. Per-particle phase from the seed, so
341
+ * a shower crackles instead of pulsing as one body.
342
+ */
343
+ float flick = 0.7 + 0.3 * valueNoise(vec2(uTime * 9.0 + vSeed * 13.0, vSeed));
344
+
345
+ // Cooling: the last of a spark's life is dimmer as well as smaller.
346
+ float cool = 1.0 - vAge * vAge;
347
+ float energy = (halo * 0.55 + core * uCoreGain) * flick * cool * vAlpha;
348
+
349
+ float fog = mediumFog(distance(vWorldPos, uCameraPos), vWorldPos.y);
350
+ energy *= 1.0 - fog;
351
+ /*
352
+ * Alpha 1, energy in the colour — see the note in 'bolt.ts'. Additive blending is
353
+ * 'rgb * a', so carrying the energy in both channels squares it and quietly halves
354
+ * every emissive effect in the game.
355
+ */
356
+ outColor = vec4(applyOutputTransform(vColor * energy), 1.0);
357
+ }
358
+ `;
359
+ /**
360
+ * Dust motes and drifting glints: unlit, alpha blended, and fogged only when the caller asks.
361
+ *
362
+ * **What neither existing material could draw.** `'spark'` is unlit but additive — its
363
+ * fragment stage folds its whole brightness into colour and always writes alpha 1, because
364
+ * additive blending is `rgb * a` and a real alpha there would double the energy (the note at
365
+ * the end of `PARTICLE_SPARK_FRAG` explains why). `'smoke'` has a real, varying alpha, but pays
366
+ * for it with lighting it can never turn off. A point that is unlit *and* genuinely
367
+ * translucent — what three.js's `PointsMaterial` draws, and what drei's `Sparkles` is built on
368
+ * — was not expressible by either.
369
+ *
370
+ * No noise, no core-and-halo split: a mote is not a body being eroded and it is not
371
+ * incandescent, so borrowing either shape would draw the wrong material behind the right blend
372
+ * state. This is the plainest fragment stage in the file on purpose — a soft round point whose
373
+ * colour is nothing but its own vColor and whose opacity is nothing but its own vAlpha.
374
+ *
375
+ * **Fog is the one thing this material still asks the caller about.** A mote is the one
376
+ * particle a scene legitimately wants both ways: dust caught in a shaft of light recedes into
377
+ * haze exactly like anything else out there, but a field of them meant to read as flat, close
378
+ * atmosphere — the look this exists for — must not. `'spark'` and `'smoke'` take no such
379
+ * option and stay unconditionally fogged, matching every particle drawn before this material
380
+ * existed; see `ParticleBatchOptions.fog`.
381
+ */
382
+ export const PARTICLE_MOTE_FRAG = `#version 300 es
383
+ precision highp float;
384
+
385
+ in vec2 vUv;
386
+ in vec3 vColor;
387
+ in float vAlpha;
388
+ in float vAge;
389
+ in float vSeed;
390
+ in vec3 vWorldPos;
391
+ in vec3 vNormal;
392
+
393
+ uniform vec3 uCameraPos;
394
+ /**
395
+ * Whether the fragment stage mixes toward the medium's own colour at all. 0 — what a batch
396
+ * gets by leaving ParticleBatchOptions.fog unset — leaves vColor untouched by distance, which
397
+ * is what a caller reaching for this material over 'spark'/'smoke' is usually asking for: an
398
+ * unlit point drawn exactly as its own colour says. 1 mixes toward mediumColor() by
399
+ * mediumFog(), the same medium every other pass in the frame recedes into.
400
+ */
401
+ uniform int uFogEnabled;
402
+ ${FOG_GLSL}
403
+
404
+ out vec4 outColor;
405
+ ${OUTPUT_TRANSFORM_GLSL}
406
+
407
+ void main() {
408
+ /*
409
+ * One soft, round falloff — no erosion, no core past white, because this material draws
410
+ * neither a body being eaten by noise nor a light source. Squared rather than linear so the
411
+ * edge feathers instead of ramping, which is what keeps a field of these reading as dust
412
+ * rather than as a scatter of hard-edged discs.
413
+ */
414
+ float r = length(vUv);
415
+ float body = 1.0 - smoothstep(0.4, 1.0, r);
416
+ if (body <= 0.0) discard;
417
+ float alpha = body * body * vAlpha;
418
+ if (alpha <= 0.002) discard;
419
+
420
+ vec3 color = vColor;
421
+ if (uFogEnabled != 0) {
422
+ float fog = mediumFog(distance(vWorldPos, uCameraPos), vWorldPos.y);
423
+ color = mix(color, mediumColor(), fog);
424
+ }
425
+ /*
426
+ * A real alpha blend (SRC_ALPHA, ONE_MINUS_SRC_ALPHA) rather than spark's energy-in-colour
427
+ * trick: this point genuinely occludes what little is behind it instead of adding light to it.
428
+ */
429
+ outColor = vec4(applyOutputTransform(color), alpha);
430
+ }
431
+ `;
@@ -0,0 +1,37 @@
1
+ /** The convolutions that fill one level of one probe layer, reflection and ambient alike. */
2
+ /**
3
+ * One level of one probe layer, convolved with the lobe that level stands for.
4
+ *
5
+ * **Directions, not texture coordinates**, for the same reason the mip blit it replaces used
6
+ * them: the neighbouring texels across a cube edge belong to a different face, and taking them
7
+ * from the same face is exactly how a seam appears along every edge. The fragment rebuilds the
8
+ * direction its texel stands for and samples the cube, which crosses edges the way the hardware
9
+ * does when the shader reads it back later.
10
+ *
11
+ * **The target is one octahedral layer rather than six cube faces**, so a level is one draw
12
+ * instead of six and there is no face basis at all — `octInsetDir` turns a texel into the
13
+ * direction it holds, and in the level's one-texel gutter that direction is the folded one. The
14
+ * source stays a cube, which is what `sourceLevelForSample`'s six-face solid angle assumes.
15
+ *
16
+ * **Two kernels, one pass.** Levels up to the GGX chain's top convolve against the lobe; the level
17
+ * above it convolves against the cosine and is the scene's diffuse ambient. They differ in the
18
+ * weight and in nothing else, so `uPrefilterIrradiance` chooses between them and the whole rest of
19
+ * the shader is shared. That fold is what lets one binding carry both terms and keeps the last
20
+ * texture unit free.
21
+ *
22
+ * **It samples a cube and writes an array, which are different objects by construction.**
23
+ * `uPrefilterSource` is the captured probe with its box-filtered chain, and it is one scratch cube
24
+ * reused by every probe in the grid rather than one per layer. That buys two things: WebGL2's
25
+ * feedback-loop check is per texture object, so a draw sampling the source while a layer of the
26
+ * target is attached never arises; and a level is never convolved from a level that was already
27
+ * convolved, which applies the lobe twice and compounds up the chain.
28
+ *
29
+ * **The approximation, stated because it is the one people are surprised by.** This is the split
30
+ * of the specular integral everybody uses: the view direction is assumed equal to the normal and
31
+ * to the reflection direction, so a level cannot know about stretched grazing highlights and a
32
+ * rough metal seen edge-on reflects a slightly rounder lobe than it should. That is what buys a
33
+ * bake that depends on roughness alone rather than on roughness and view angle, which is the
34
+ * difference between one cube and a cube per camera. **What would make it wrong** is a scene
35
+ * where grazing metal is the subject rather than incidental.
36
+ */
37
+ export declare const PREFILTER_FRAG = "#version 300 es\nprecision highp float;\n\nvec2 octEncode(vec3 d) {\n vec3 n = d / (abs(d.x) + abs(d.y) + abs(d.z));\n vec2 p = n.z >= 0.0\n ? n.xy\n : (1.0 - abs(vec2(n.y, n.x))) * vec2(n.x >= 0.0 ? 1.0 : -1.0, n.y >= 0.0 ? 1.0 : -1.0);\n return p * 0.5 + 0.5;\n}\n\nvec3 octDecode(vec2 uv) {\n vec2 f = uv * 2.0 - 1.0;\n vec3 n = vec3(f.x, f.y, 1.0 - abs(f.x) - abs(f.y));\n float t = max(-n.z, 0.0);\n n.x += n.x >= 0.0 ? -t : t;\n n.y += n.y >= 0.0 ? -t : t;\n return normalize(n);\n}\n\nvec2 octWrapUv(vec2 uv) {\n vec2 f = uv * 2.0 - 1.0;\n if (f.x < -1.0 || f.x > 1.0) {\n f.x = (f.x > 0.0 ? 2.0 : -2.0) - f.x;\n f.y = -f.y;\n }\n if (f.y < -1.0 || f.y > 1.0) {\n f.y = (f.y > 0.0 ? 2.0 : -2.0) - f.y;\n f.x = -f.x;\n }\n return f * 0.5 + 0.5;\n}\n\nvec2 octInsetUv(vec3 d, float edge) {\n return (octEncode(d) * (edge - 2.0) + 1.0) / edge;\n}\n\nvec3 octInsetDir(vec2 uv, float edge) {\n return octDecode(octWrapUv((uv * edge - 1.0) / (edge - 2.0)));\n}\n\nin vec2 vUv;\n\n/** The captured probe, box-filtered, which this convolves. Never the cube being written. */\nuniform highp samplerCube uPrefilterSource;\n\n/**\n * The edge of the level being written, in texels, which is what the inset is derived from.\n *\n * The level's own size rather than the array's, because a gutter is one texel at every level and\n * its share of the map therefore doubles as the chain coarsens. A base edge passed here instead\n * would inset every level by the base's fraction, which is a fifth of a texel at the top of the\n * chain and reads as the reflection sliding as roughness rises.\n */\nuniform float uPrefilterEdge;\n\n/** 1 on the level holding the cosine convolution, 0 on every level of the reflection chain. */\nuniform float uPrefilterIrradiance;\n\n/**\n * 1 when the reflection chain is a box filter rather than a GGX convolution.\n *\n * RenderQuality.environmentPrefilter is off by default, and that default is a correction rather\n * than a preference: the prefilter shipped wired straight into the lit pass and changed the\n * picture of every consumer that had a probe, which was reported as metals reading opaque. A\n * profile that has not asked for the lobe chain must get the same reflection it had before probes\n * moved into an array, so the box arm exists and is what that profile bakes.\n *\n * The array edge is twice the source cube's face, so one array level matches one cube level in\n * angular density and the box arm is a single fetch at the same index. There is no second\n * texture: the flag decides what is convolved into the layer rather than which of two chains is\n * bound, so it is read at bake time and a profile that changes it has to bake again.\n */\nuniform float uPrefilterBox;\n\n/** The level being written, for the box arm, which reads the source chain at the same index. */\nuniform float uPrefilterLevel;\n\n/** The roughness this level stands for, from roughnessForLevel. 0 is a mirror. */\nuniform float uPrefilterRoughness;\n/** Samples per texel, from PREFILTER_SAMPLE_COUNTS. A power of two; see the count's own note. */\nuniform float uPrefilterSamples;\n/** The source cube's face width in texels, for the solid-angle comparison below. */\nuniform float uPrefilterSourceTexels;\n/** The source chain's top level, so a wide sample cannot ask for a level that is not there. */\nuniform float uPrefilterSourceMaxLod;\n\nout vec4 fragColor;\n\nconst float PI = 3.14159265359;\n\n/**\n * The radical inverse of a 32-bit integer, base two: the second dimension of a Hammersley set.\n *\n * A bit reversal, written as the standard five-shift sequence rather than a loop, because a loop\n * over 32 bits per sample per texel is the one place in a bake where the arithmetic is the cost.\n * **This is why every sample count is a power of two** \u2014 the sequence's stratification is only\n * even when the count is, and an uneven one shows as a faint directional bias in a rough level\n * rather than as an error anybody would notice.\n */\nfloat radicalInverse(uint bits) {\n bits = (bits << 16u) | (bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n return float(bits) * 2.3283064365386963e-10;\n}\n\n/**\n * A half vector drawn from the GGX distribution about the normal, for one Hammersley pair.\n *\n * Importance sampling rather than a uniform hemisphere: at low roughness the lobe occupies a\n * vanishing fraction of the hemisphere, so uniform samples would put almost every one of them\n * where the weight is zero and the few that land in the lobe would carry all the variance.\n */\nvec3 importanceSampleGgx(vec2 xi, vec3 n, float roughness) {\n float a = roughness * roughness;\n\n float phi = 2.0 * PI * xi.x;\n float cosTheta = sqrt((1.0 - xi.y) / (1.0 + (a * a - 1.0) * xi.y));\n float sinTheta = sqrt(1.0 - cosTheta * cosTheta);\n\n vec3 h = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n\n /*\n * Any tangent will do as long as it is not parallel to the normal, and the choice of which\n * axis to cross against has to depend on the normal or it degenerates at the poles \u2014 which is\n * one face of six coming out as noise, on the two faces the axis points at.\n */\n vec3 up = abs(n.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n vec3 tangentX = normalize(cross(up, n));\n vec3 tangentY = cross(n, tangentX);\n\n return normalize(tangentX * h.x + tangentY * h.y + n * h.z);\n}\n\n/**\n * A direction drawn from the cosine lobe about the normal, for the diffuse level.\n *\n * **Cosine-weighted, which is what makes the estimator a plain mean.** Irradiance is\n * integral of L cos(theta), the cosine pdf is cos(theta) / pi, so the estimate is\n * pi / N * sum(L) \u2014 and what the lit pass wants is radiance rather than irradiance, so the pi\n * divides straight back out. irradianceSh.ts folds the same division into its band factors and\n * says so, which is what makes a grid of one reproduce what the projection produced.\n */\nvec3 importanceSampleCosine(vec2 xi, vec3 n) {\n float phi = 2.0 * PI * xi.x;\n float cosTheta = sqrt(max(1.0 - xi.y, 0.0));\n float sinTheta = sqrt(xi.y);\n\n vec3 h = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);\n\n vec3 up = abs(n.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n vec3 tangentX = normalize(cross(up, n));\n vec3 tangentY = cross(n, tangentX);\n\n return normalize(tangentX * h.x + tangentY * h.y + n * h.z);\n}\n\n/** Trowbridge-Reitz, in its own normalisation, because this is a probability rather than a look. */\nfloat ggxDistribution(float ndh, float roughness) {\n float a = roughness * roughness;\n float a2 = a * a;\n float d = ndh * ndh * (a2 - 1.0) + 1.0;\n return a2 / max(PI * d * d, 1e-8);\n}\n\nvoid main() {\n vec3 n = octInsetDir(vUv, uPrefilterEdge);\n\n float texelSolidAngle = 4.0 * PI / (6.0 * uPrefilterSourceTexels * uPrefilterSourceTexels);\n\n /*\n * The box chain, which is one fetch: the source's own level at the same index, resampled through\n * the octahedral mapping. It is what a profile that has not asked for the lobe chain gets, and\n * it is the picture every consumer with a probe already had.\n */\n if (uPrefilterBox > 0.5 && uPrefilterIrradiance <= 0.5) {\n fragColor = vec4(\n textureLod(uPrefilterSource, n, min(uPrefilterLevel, uPrefilterSourceMaxLod)).rgb,\n 1.0\n );\n return;\n }\n\n /*\n * **The diffuse level, and it is a mean rather than a weighted sum.** Every cosine sample is\n * drawn with the weight already in its density, so there is nothing to accumulate a weight for\n * and nothing to divide by but the count. A sample below the horizon cannot occur, which is the\n * other half of why this arm has no continue in it.\n */\n if (uPrefilterIrradiance > 0.5) {\n vec3 diffuse = vec3(0.0);\n int cosineSamples = int(uPrefilterSamples);\n for (int i = 0; i < cosineSamples; i++) {\n vec2 xi = vec2(float(i) / uPrefilterSamples, radicalInverse(uint(i)));\n vec3 l = importanceSampleCosine(xi, n);\n /*\n * The same filtered importance sampling the reflection uses, against the cosine density.\n * A diffuse sample is wide \u2014 a sixth of the sphere at the median \u2014 so reading the base level\n * would carry a bright window through as a handful of fireflies in the ambient, which is the\n * one place they cannot be blurred out later.\n */\n float pdf = max(dot(n, l) / PI, 1e-4);\n float sampleSolidAngle = 1.0 / (uPrefilterSamples * pdf);\n float lod = clamp(\n 0.5 * log2(sampleSolidAngle / texelSolidAngle),\n 0.0,\n uPrefilterSourceMaxLod\n );\n diffuse += textureLod(uPrefilterSource, l, lod).rgb;\n }\n fragColor = vec4(diffuse / max(uPrefilterSamples, 1.0), 1.0);\n return;\n }\n\n /*\n * A mirror is a fetch rather than an integral, and it is a separate arm on purpose: at\n * roughness 0 the distribution is a delta, every importance sample collapses onto the same\n * direction, and the sum is one sample's worth of noise where the answer is exactly the texel.\n */\n if (uPrefilterRoughness <= 0.0) {\n fragColor = vec4(textureLod(uPrefilterSource, n, 0.0).rgb, 1.0);\n return;\n }\n\n vec3 sum = vec3(0.0);\n float weight = 0.0;\n\n int samples = int(uPrefilterSamples);\n for (int i = 0; i < samples; i++) {\n vec2 xi = vec2(float(i) / uPrefilterSamples, radicalInverse(uint(i)));\n vec3 h = importanceSampleGgx(xi, n, uPrefilterRoughness);\n vec3 l = normalize(2.0 * dot(n, h) * h - n);\n\n float ndl = dot(n, l);\n if (ndl <= 0.0) continue;\n\n /*\n * Filtered importance sampling. A sample covers 1 / (count * pdf) of the sphere; when that\n * is much wider than a texel, reading the base level lets a few very bright texels land in\n * some samples and not others, and the variance survives the average as fireflies. The half\n * in front of the logarithm is a length ratio against an area one \u2014 a level step doubles a\n * texel's width and quadruples its solid angle. sourceLevelForSample holds the same\n * arithmetic on the CPU and its test carries the hand-derived numbers.\n */\n float ndh = max(dot(n, h), 0.0);\n float pdf = max(ggxDistribution(ndh, uPrefilterRoughness) * 0.25, 1e-8);\n float sampleSolidAngle = 1.0 / (uPrefilterSamples * pdf);\n float lod = clamp(\n 0.5 * log2(sampleSolidAngle / texelSolidAngle),\n 0.0,\n uPrefilterSourceMaxLod\n );\n\n /*\n * textureLod rather than texture, and the 2026-08-07 rule is why: this fetch sits inside a\n * loop with a continue in it, which no compiler can prove uniform, and an implicit derivative\n * in non-uniform control flow is what lets a driver flatten the loop and cost every arm.\n * The level is wanted here anyway, so the rule costs nothing at all.\n */\n sum += textureLod(uPrefilterSource, l, lod).rgb * ndl;\n weight += ndl;\n }\n\n /*\n * Normalised by the accumulated weight rather than by the sample count, because samples with\n * a light below the horizon were skipped and dividing by the count would darken every rough\n * level by the fraction that missed \u2014 which reads as roughness losing energy and is exactly\n * the artefact uEnvironmentGain has been compensating for.\n */\n fragColor = vec4(sum / max(weight, 1e-4), 1.0);\n}\n";