@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,546 @@
1
+ /**
2
+ * Light in the air: a beam, a shaft through a window, the cone under a lamp.
3
+ *
4
+ * **Its own program because the thing it draws is not a surface.** A surface is lit, fogged
5
+ * and gated by the time of day; light is none of those, and every attempt to express a beam
6
+ * as a material failed in a different place for the same underlying reason. The recorded
7
+ * history, because it is the whole justification for this file existing:
8
+ *
9
+ * - **Alpha blended, it darkened the sky.** Alpha blending moves what is behind a surface
10
+ * *toward* that surface's own colour, so an unlit beam that came out darker than the dusk
11
+ * behind it swept a solid dark wedge across the frame. It was reported five times as a
12
+ * giant malformed bird, which is what a ninety-metre wedge crossing a flock looks like.
13
+ * - **Additive through the flat pass, it vanished.** The fog term is a `mix` toward the
14
+ * medium's colour, applied to something that *is* the medium being lit, and ninety metres
15
+ * of it multiplied to nothing. Twenty times the emissive did not bring it back.
16
+ *
17
+ * So: nothing here is lit, nothing here is fogged, and nothing here is scaled by night. A
18
+ * beam is *more* visible in fog, not less, because the fog is what there is to light. The
19
+ * closest precedent in this renderer is `bolt.ts`, which says the same thing about a
20
+ * discharge and for the same reason.
21
+ *
22
+ * **The volume comes from the grazing term, not from the geometry.** A single surface cannot
23
+ * be a volume, so what is drawn is a few flat panes through the beam's own axis, and each
24
+ * fragment is weighted by how far from face-on the pane is turned. A pane seen face-on
25
+ * contributes almost nothing; a pane seen edge-on contributes fully, which is exactly when a
26
+ * line of sight travels furthest through the slab that pane stands for. Because the panes
27
+ * cross at the axis, the ones that are edge-on are the ones whose bright part *is* the axis,
28
+ * and the result is a soft core down the middle with no hard edge anywhere. A tube would
29
+ * have given the opposite and read as a hollow pipe.
30
+ *
31
+ * **What that leaves out, and what the two optional terms below are for.** The shape above is
32
+ * a monotone falloff along two axes times a constant per pane, so for the pass's whole first
33
+ * life *nothing in it varied per fragment*. A consumer swept strength from 1.5 to 3.2 and
34
+ * spread from 0.038 to 0.13 across six captures and reported the obvious consequence: the beam
35
+ * gets brighter and wider and its shape never changes, which reads as a lit solid rather than
36
+ * as light standing in air. Neither term is on by default, because a torch beam wants neither
37
+ * and every volume drawn before they existed is entitled to the frame it had.
38
+ *
39
+ * - **`uDust`** breaks the body up with a noise field in world space. What is missing from a
40
+ * smooth cone is any variation at all, so the field does not have to be the one the scene's
41
+ * own motes use, and it deliberately does not read a clock: the offset is a position the
42
+ * caller supplies, so a consumer that evaluates arbitrary instants out of order reproduces
43
+ * the same frame every time. That is the same rule the wind field is under.
44
+ * - **`uSunShadow`** cuts the volume where the sun does not reach, sampling the directional
45
+ * map the surfaces below are already shaded by. It is what makes a shaft carry the bars of
46
+ * the window it came through, and without it a barred floor under a smooth shaft is two
47
+ * halves of one frame disagreeing about the same light.
48
+ */
49
+
50
+ import { resolveConditionals } from './conditionals.ts';
51
+
52
+ export const LIGHT_VOLUME_VERT = `#version 300 es
53
+ precision highp float;
54
+
55
+ layout(location = 0) in vec3 aPosition;
56
+ layout(location = 1) in vec3 aNormal;
57
+ layout(location = 2) in vec3 aColor;
58
+ layout(location = 3) in float aEmissive;
59
+
60
+ uniform mat4 uViewProj;
61
+ uniform mat4 uModel;
62
+
63
+ out vec3 vColor;
64
+ out float vEnergy;
65
+ out vec3 vNormal;
66
+ out vec3 vWorldPos;
67
+ /**
68
+ * The position in the volume's own space, which is where its shape is known.
69
+ *
70
+ * The falloffs along the axis and away from it are the two things that make this read as
71
+ * light rather than as a pane, and both are smooth functions of *where in the volume* a
72
+ * fragment is. There is no way to author them into the geometry: MeshBuilder states one
73
+ * emissive per quad, so a gradient built that way is a staircase, and the first version of
74
+ * this beam was eight steps a pane trying to hide that. A local position costs one varying
75
+ * and gives both gradients per pixel.
76
+ */
77
+ out vec3 vLocal;
78
+
79
+ void main() {
80
+ vec4 world = uModel * vec4(aPosition, 1.0);
81
+ vWorldPos = world.xyz;
82
+ vLocal = aPosition;
83
+ /*
84
+ * The normal is rotated by the model matrix without being corrected for scale. A light
85
+ * volume is placed by a rigid transform and a uniform scale, which leaves a normal pointing
86
+ * where it was; the inverse transpose exists for non-uniform scale, and paying for one here
87
+ * would be describing a case this pass does not have.
88
+ */
89
+ vNormal = mat3(uModel) * aNormal;
90
+ vColor = aColor;
91
+ vEnergy = aEmissive;
92
+ gl_Position = uViewProj * world;
93
+ }
94
+ `;
95
+
96
+ /** What the light volume program is built with. See `flatFrag` for why this is a permutation. */
97
+ export interface LightVolumeShaderOptions {
98
+ /**
99
+ * Whether the sun-shadow lookup is compiled in at all.
100
+ *
101
+ * A profile with directional shadows off has no map to read, and three `sampler2D`
102
+ * declarations it can never reach are three the driver is handed anyway. The same
103
+ * reasoning as the flat shader's permutation, at a twentieth of the scale.
104
+ */
105
+ readonly directionalShadows: boolean;
106
+ }
107
+
108
+ export function lightVolumeFrag(options: LightVolumeShaderOptions): string {
109
+ return resolveConditionals(
110
+ `#version 300 es
111
+ precision highp float;
112
+
113
+ in vec3 vColor;
114
+ in float vEnergy;
115
+ in vec3 vNormal;
116
+ in vec3 vWorldPos;
117
+ in vec3 vLocal;
118
+
119
+ uniform vec3 uCameraPos;
120
+ /** How much of the authored light to add, 0 to 1. A caller fades a beam with this. */
121
+ uniform float uStrength;
122
+ /**
123
+ * How far the volume reaches along its own +Z, in the units its geometry was built in.
124
+ *
125
+ * The light dies at this distance rather than at whatever the geometry happens to end at,
126
+ * which is what lets a beam dissolve into the air instead of stopping at a bright square.
127
+ */
128
+ uniform float uLength;
129
+ /**
130
+ * How wide the volume opens, as half-width over distance: the tangent of its half-angle.
131
+ *
132
+ * A cone of this aperture is where the light reaches zero, so the geometry should be built to
133
+ * about the same shape. Larger than the geometry leaves a hard edge at the polygon; smaller
134
+ * fades out before the polygon ends, which is safe and merely narrower than it looks.
135
+ */
136
+ uniform float uSpread;
137
+ /**
138
+ * How much of the beam's body the dust field takes away, 0 to 1. At 0 nothing is computed.
139
+ *
140
+ * An amount rather than a switch, because the useful range is narrow and low: this is the
141
+ * difference between a shaft and a solid, not a texture to be read.
142
+ */
143
+ uniform float uDust;
144
+ /** Metres per cell of the field. Small is fine dust; large is smoke and shafts of weather. */
145
+ uniform float uDustScale;
146
+ /**
147
+ * Where the field has drifted to, in metres.
148
+ *
149
+ * A position and not a rate, so nothing in this pass reads a clock. Air moves, and what moves
150
+ * it is the scene's wind, which the caller already samples once a frame for everything else in
151
+ * the air; handing that same accumulated drift here is what keeps the motes in a shaft going
152
+ * the way the smoke outside it goes. It also lets a caller that renders instants out of order
153
+ * ask for any one of them twice and get the same frame.
154
+ */
155
+ uniform vec3 uDustOffset;
156
+
157
+ #if DIRECTIONAL_SHADOWS
158
+ /** How much of the volume the sun's own shadow map removes, 0 to 1. At 0 nothing is sampled. */
159
+ uniform float uSunShadow;
160
+ uniform mat4 uLightViewProj;
161
+ uniform float uShadowMapSize;
162
+ uniform sampler2D uStaticShadowMap;
163
+ uniform sampler2D uPeeledShadowMap;
164
+ uniform sampler2D uDynamicShadowMap;
165
+ uniform int uPeeledShadowEnabled;
166
+ #endif
167
+
168
+ out vec4 fragColor;
169
+
170
+ /** Where the drawn volume starts along its own +Z, so a shaft can be a slice of a wide cone. */
171
+ uniform float uNear;
172
+ /** Camera position in the volume's own space, so the whole march happens in one frame of reference. */
173
+ uniform vec3 uCameraLocal;
174
+ /** The volume's placement, used only to put a sample back into world space for dust and shadow. */
175
+ uniform mat4 uModelWorld;
176
+ /** How many samples the ray takes. See lightVolumeSamples on the renderer's quality options. */
177
+ uniform int uSamples;
178
+
179
+ /**
180
+ * The frame's own depth, so the march stops where the light actually lands.
181
+ *
182
+ * **Without this a ray is bounded by the hull and by nothing else**, so a beam whose hull
183
+ * continues past a solid surface keeps integrating light through it: the shaft carries on under
184
+ * the floor and terminates on the hull's boundary rather than on the ground. Reported from Drift
185
+ * Cut about \`cathedral-of-light\` — the ray on the ground read as unnatural — and it was never a
186
+ * difference between the backends, because both did it. \`demo/dev/volume.html\` is the page that
187
+ * shows it, and \`?length=\` is what turns a hard edge into an unmistakable slab.
188
+ *
189
+ * A *copy* of the depth rather than the attachment itself. Neither backend may sample the depth
190
+ * it is currently testing against: WebGL2 calls it undefined and WebGPU rejects the pass, so the
191
+ * renderer takes a single-sample copy before the first volume of the frame draws.
192
+ */
193
+ uniform sampler2D uSceneDepth;
194
+ /** Zero where no copy could be taken, and then nothing below runs. See \`uSceneDepth\`. */
195
+ uniform int uSceneDepthEnabled;
196
+ /** One over the drawing buffer, to turn \`gl_FragCoord\` into the copy's own coordinates. */
197
+ uniform vec2 uInvViewport;
198
+ /**
199
+ * Straight from a stored depth to this volume's local space, in one matrix.
200
+ *
201
+ * **Built on the CPU, per draw, because the two backends disagree about clip space and this is
202
+ * the only place that disagreement can live without a second shader.** It is the inverse of
203
+ * (clip correction × view-projection × model), with the depth remap folded in: WebGL2 stores
204
+ * depth in [0,1] and wants NDC z in [-1,1], WebGPU stores and wants [0,1], so one backend's
205
+ * matrix carries a remap the other's does not. The shader is then identical for both and reads
206
+ * \`vec4(ndc.xy, stored, 1)\` without knowing which it is running on.
207
+ *
208
+ * Local rather than world, so the clamp is in the same units as \`enter\` and \`leave\` and costs
209
+ * no second transform inside the march.
210
+ */
211
+ uniform mat4 uDepthToLocal;
212
+
213
+ /** How quickly the light dies toward the far end. Above 1 keeps the near half bright. */
214
+ const float ALONG_POWER = 1.3;
215
+ /**
216
+ * How quickly it dies away from the axis. This is what gives the beam a core.
217
+ *
218
+ * Two rather than the one the pane version used, and the difference is the march. A pane is a
219
+ * thin sheet, so a linear falloff across it already looked tight; integrating the same falloff
220
+ * along a ray sums every value it passes through, and the shoulders that were invisible on one
221
+ * sheet accumulate into a haze with no edge. Squaring puts the beam back inside its own cone.
222
+ */
223
+ const float ACROSS_POWER = 2.0;
224
+ /** The most a march will cover, as a multiple of the volume's own length. A ray running along
225
+ the axis would otherwise have no far bound at all when the slab clip degenerates. */
226
+ const float MAX_SPAN = 2.0;
227
+ /** The enclosing cylinder's radius, as a multiple of the cone's own far radius. See the clip. */
228
+ const float WIDEST = 1.05;
229
+ /**
230
+ * How much light a volume gives up per unit of normalised path. See the end of main.
231
+ *
232
+ * Not derived from anything: it sets where the usable range of strength sits, and it is
233
+ * chosen so a beam authored against the pass this replaced lands at about the brightness it had. Raising it makes every volume saturate sooner rather than making any of them better.
234
+ */
235
+ const float VOLUME_GAIN = 3.0;
236
+ /**
237
+ * Depth tolerance for the shadow lookup, and the width the comparison ramps over.
238
+ *
239
+ * There is no acne to bias away from here, since nothing in the air shadows itself; the offset
240
+ * covers the map's own quantisation, which would otherwise stipple the inside of a shaft where
241
+ * the light and the air agree about it.
242
+ */
243
+ const float BIAS = 0.0015;
244
+ const float SOFTEN = 0.0025;
245
+
246
+ float hash31(vec3 p) {
247
+ return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453123);
248
+ }
249
+
250
+ /**
251
+ * Value noise on a world position, trilinear between eight corners of a cell.
252
+ *
253
+ * Its own rather than the sky's, because the sky's is two-dimensional and a shaft of light is
254
+ * a body seen from any side: a 2D field extruded along an axis is a set of stripes as soon as
255
+ * the camera moves off that axis, which is precisely the view a shaft is looked at from.
256
+ */
257
+ float volumeNoise(vec3 p) {
258
+ vec3 i = floor(p);
259
+ vec3 f = fract(p);
260
+ vec3 u = f * f * (3.0 - 2.0 * f);
261
+ float x00 = mix(hash31(i + vec3(0.0, 0.0, 0.0)), hash31(i + vec3(1.0, 0.0, 0.0)), u.x);
262
+ float x10 = mix(hash31(i + vec3(0.0, 1.0, 0.0)), hash31(i + vec3(1.0, 1.0, 0.0)), u.x);
263
+ float x01 = mix(hash31(i + vec3(0.0, 0.0, 1.0)), hash31(i + vec3(1.0, 0.0, 1.0)), u.x);
264
+ float x11 = mix(hash31(i + vec3(0.0, 1.0, 1.0)), hash31(i + vec3(1.0, 1.0, 1.0)), u.x);
265
+ return mix(mix(x00, x10, u.y), mix(x01, x11, u.y), u.z);
266
+ }
267
+
268
+ /**
269
+ * Two octaves, and the second one is what stops it reading as a lava lamp.
270
+ *
271
+ * One octave is a field of soft blobs whose size the eye immediately measures, which replaces
272
+ * "no structure" with "one structure". Two is where the picture stopped changing.
273
+ */
274
+ float dustField(vec3 p) {
275
+ return volumeNoise(p) * 0.65 + volumeNoise(p * 2.17 + 19.3) * 0.35;
276
+ }
277
+
278
+ #if DIRECTIONAL_SHADOWS
279
+ /**
280
+ * How much sun reaches one point in the air.
281
+ *
282
+ * Deliberately not the flat shader's shadowFactor, and the difference is why this is short.
283
+ * Almost everything expensive there is about a receiving *surface*: a receiver-plane depth
284
+ * gradient from screen derivatives, a terminator fade by the angle between a normal and the
285
+ * light, a slope bias. A point in the air has no normal, no plane and no self-shadowing, so
286
+ * none of it applies and none of it is paid for.
287
+ *
288
+ * One tap, because the march is already averaging tens of samples along the ray and a filter
289
+ * on top of that is paying twice for the same softness.
290
+ *
291
+ * textureLod at level zero rather than plain texture: these maps carry one storage level and
292
+ * NEAREST filtering, so the fetch is identical, and an implicit derivative reached through the
293
+ * early exits above is exactly the shape AGENTS.md 2026-08-07 is about.
294
+ */
295
+ /**
296
+ * A ramp rather than a comparison, which is what keeps the march's own dither invisible.
297
+ *
298
+ * A hard test makes every sample along a ray fully lit or fully dark, so where a shaft crosses
299
+ * the edge of an occluder the only thing separating neighbouring pixels is *how many* of their
300
+ * samples fell on each side — an integer, over a couple of dozen samples, and the dither pattern
301
+ * that decides it becomes legible as a screen door. Softening the comparison over a few
302
+ * centimetres of depth gives each sample a fractional answer near the boundary, and the pattern
303
+ * goes with it. It costs one smoothstep and buys back nothing else: away from an edge this is
304
+ * still exactly 0 or 1.
305
+ */
306
+ float occlusion(float stored, float compare) {
307
+ return smoothstep(-SOFTEN, SOFTEN, compare - stored);
308
+ }
309
+
310
+ float sunReach(vec3 worldPos) {
311
+ vec4 lightPos = uLightViewProj * vec4(worldPos, 1.0);
312
+ if (lightPos.w <= 0.0) return 1.0;
313
+ vec3 p = lightPos.xyz / lightPos.w * 0.5 + 0.5;
314
+ if (p.z > 1.0 || p.x < 0.0 || p.x > 1.0 || p.y < 0.0 || p.y > 1.0) return 1.0;
315
+
316
+ /*
317
+ * Fade toward lit at the border of the map rather than cutting at it, for the reason the
318
+ * flat shader gives: the map covers a radius around the viewer, and a hard edge makes a
319
+ * shaft's bars blink on as the camera walks toward them.
320
+ */
321
+ vec2 fromCentre = abs(p.xy - 0.5) * 2.0;
322
+ float edgeFade = 1.0 - smoothstep(0.72, 0.98, max(fromCentre.x, fromCentre.y));
323
+ edgeFade *= 1.0 - smoothstep(0.90, 1.0, p.z);
324
+ if (edgeFade <= 0.0) return 1.0;
325
+
326
+ float compare = p.z - BIAS;
327
+ float blocked = occlusion(textureLod(uStaticShadowMap, p.xy, 0.0).r, compare);
328
+ if (uPeeledShadowEnabled != 0) {
329
+ blocked = max(blocked, occlusion(textureLod(uPeeledShadowMap, p.xy, 0.0).r, compare));
330
+ }
331
+ blocked = max(blocked, occlusion(textureLod(uDynamicShadowMap, p.xy, 0.0).r, compare));
332
+ return mix(1.0, 1.0 - blocked, uSunShadow * edgeFade);
333
+ }
334
+ #endif
335
+
336
+ /**
337
+ * How much light the air holds at one point of the volume, in its own space.
338
+ *
339
+ * **The two falloffs are measured against different things, and that is deliberate.** Along the
340
+ * axis, the fade runs across the extent actually drawn, from full at uNear to nothing at uLength, so a volume is brightest where it starts whatever a caller chose to draw. Across
341
+ * the axis it is measured from the *apex*, because the aperture is an angle and an angle is
342
+ * only meaningful from the point it opens at.
343
+ *
344
+ * The alternative, running both from the apex, was what shipped first and it punishes exactly
345
+ * the case the near plane exists for. A shaft of daylight is authored as a slice taken far down
346
+ * a very wide cone, so that it barely widens over the room; measured from the apex, that slice
347
+ * begins two thirds of the way down its own fade and arrives at a quarter of the light, and the
348
+ * scene it was measured on read as haze rather than as a shaft. Nothing about being a slice
349
+ * should make a volume dim.
350
+ */
351
+ float densityAt(vec3 local, float near) {
352
+ float drawn = max(uLength - near, 1e-4);
353
+ float along = clamp((local.z - near) / drawn, 0.0, 1.0);
354
+ float openness = length(local.xy) / max(local.z, 1e-3);
355
+ float across = clamp(openness / max(uSpread, 1e-4), 0.0, 1.0);
356
+ return pow(1.0 - along, ALONG_POWER) * pow(1.0 - across, ACROSS_POWER);
357
+ }
358
+
359
+ void main() {
360
+ /*
361
+ * The ray, in the volume's own space.
362
+ *
363
+ * **This pass integrates rather than draws sheets, and that is the whole of the second
364
+ * rewrite.** What it used to do was rasterise a few flat panes through the axis and weight
365
+ * each fragment by how far from face-on its pane was turned, which is a stand-in for the
366
+ * path length a line of sight takes through the slab that pane represents. It works from the
367
+ * side and it cannot work down the barrel: every pane contains the axis, so a view lying near
368
+ * that axis lies nearly *within all of them at once*, each one collapses to a narrow bright
369
+ * wedge on screen, and their union reads as a six-armed asterisk rather than as the disc a
370
+ * cone's cross-section actually is. It was reported twice from outside, once as a beam whose
371
+ * shape never changed however it was tuned and once as raw lines in the opening of a room,
372
+ * and switching the pass off in a single capture is what identified the second one.
373
+ *
374
+ * No stand-in survives that, because the failure is not in the weight — it is that a handful
375
+ * of flat sheets is not a volume. So the geometry is now only a hull that decides which
376
+ * pixels to run on, and every one of them walks the ray itself. The path length falls out of
377
+ * the walk instead of being modelled, which is also why the grazing term is gone rather than
378
+ * corrected: there is nothing left for it to stand in for.
379
+ */
380
+ vec3 origin = uCameraLocal;
381
+ vec3 toFragment = vLocal - origin;
382
+ float span = length(toFragment);
383
+ vec3 dir = span > 1e-5 ? toFragment / span : vec3(0.0, 0.0, 1.0);
384
+
385
+ /*
386
+ * Clipped to the volume twice: the slab it occupies along its axis, and the cylinder that
387
+ * encloses its widest point.
388
+ *
389
+ * The slab alone is what shipped first and it is only tight for a ray running down the barrel.
390
+ * Side-on, which is how a beam is almost always watched, a ray crosses the slab in one step
391
+ * and the clip does nothing at all: the march then spreads its samples over the fallback span
392
+ * while the beam itself is a few metres thick, so a handful of samples land inside it and the
393
+ * rest integrate empty air. It arrives as the beam breaking into a row of separate blobs, and
394
+ * that is what a ninety-metre lighthouse beam did on the first capture of this pass.
395
+ *
396
+ * The enclosing cylinder is the cheap half of the fix and gets the common case: one quadratic
397
+ * in xy, always a bounded interval, and conservative, since the cone is inside the cylinder
398
+ * and no real volume can be clipped away. A ray-cone test would be tighter and brings a second
399
+ * nappe behind the apex and a sign flip in the quadratic with it, for samples that the
400
+ * across-axis falloff already values at zero.
401
+ */
402
+ float near = min(uNear, uLength);
403
+ float enter = 0.0;
404
+ float leave = uLength * MAX_SPAN;
405
+ if (abs(dir.z) > 1e-5) {
406
+ float toNear = (near - origin.z) / dir.z;
407
+ float toFar = (uLength - origin.z) / dir.z;
408
+ enter = min(toNear, toFar);
409
+ leave = max(toNear, toFar);
410
+ } else if (origin.z < near || origin.z > uLength) {
411
+ discard;
412
+ }
413
+
414
+ float reach = uSpread * uLength * WIDEST;
415
+ float ca = dot(dir.xy, dir.xy);
416
+ float cb = 2.0 * dot(origin.xy, dir.xy);
417
+ float cc = dot(origin.xy, origin.xy) - reach * reach;
418
+ if (ca > 1e-8) {
419
+ float disc = cb * cb - 4.0 * ca * cc;
420
+ if (disc <= 0.0) discard;
421
+ float root = sqrt(disc);
422
+ enter = max(enter, (-cb - root) / (2.0 * ca));
423
+ leave = min(leave, (-cb + root) / (2.0 * ca));
424
+ } else if (cc > 0.0) {
425
+ /* Parallel to the axis and outside the cylinder: this ray never enters the volume. */
426
+ discard;
427
+ }
428
+
429
+ enter = max(enter, 0.0);
430
+ leave = min(leave, enter + uLength * MAX_SPAN);
431
+
432
+ /*
433
+ * And clipped a third time, by whatever the frame already drew at this pixel.
434
+ *
435
+ * The two clips above are both about the *hull*, and a hull knows nothing about the room it
436
+ * is in. This is the one that makes the beam end on the floor instead of passing through it:
437
+ * the stored depth is where the eye ray met something opaque, so no air beyond it is lit and
438
+ * none of it may be integrated.
439
+ *
440
+ * \`hit.w\` is the perspective divide and it can be non-positive for a pixel at the far plane
441
+ * on some projections, which would flip the comparison and clamp the march to nothing — a
442
+ * beam that vanishes wherever it crosses the sky. Guarded rather than assumed.
443
+ */
444
+ if (uSceneDepthEnabled != 0) {
445
+ vec2 uv = gl_FragCoord.xy * uInvViewport;
446
+ float stored = textureLod(uSceneDepth, uv, 0.0).r;
447
+ vec4 hit = uDepthToLocal * vec4(uv * 2.0 - 1.0, stored, 1.0);
448
+ if (hit.w > 1e-6) {
449
+ leave = min(leave, dot(hit.xyz / hit.w - origin, dir));
450
+ }
451
+ }
452
+
453
+ if (leave <= enter) discard;
454
+
455
+ int samples = clamp(uSamples, 2, 64);
456
+ float step = (leave - enter) / float(samples);
457
+
458
+ /*
459
+ * The samples sit on an even lattice, and only the shadow lookup is dithered off it.
460
+ *
461
+ * **Which half gets the jitter took three captures to get right.** A march that starts every
462
+ * ray at the same place quantises anything with a hard edge in it into shells, so a shaft
463
+ * crossing an occluder needs its shadow lookup dithered or the boundary arrives as bands.
464
+ * Jittering the *sample positions* to achieve that is the obvious move and it is wrong: the
465
+ * offset shifts every sample on a ray together, so against a smooth integrand it does not
466
+ * average out at all, it slides the whole integral along the integrand's own gradient. Two
467
+ * captures found it twice, once as a rattle over the body of a dusty shaft and once as a
468
+ * screen door down the length of a ninety-metre beam carrying no dust and no shadow, which
469
+ * is what finally named it: the term with nothing sharp in it was the one being spoiled.
470
+ *
471
+ * So the lattice is the plain midpoint rule, which for a smooth density is both quieter and
472
+ * more accurate, and the dither is applied only where something is genuinely discontinuous.
473
+ * The pattern is ordered rather than random — any four-by-four block covers the step at
474
+ * sixteen evenly spaced offsets, so a block averages to the truth however a shadow edge falls
475
+ * across it — and roughened inside its own sixteenth, because a regular figure is what an eye
476
+ * finds once a step is worth about one value of an eight-bit channel.
477
+ */
478
+ const float BAYER[16] = float[16](
479
+ 0.0, 8.0, 2.0, 10.0,
480
+ 12.0, 4.0, 14.0, 6.0,
481
+ 3.0, 11.0, 1.0, 9.0,
482
+ 15.0, 7.0, 13.0, 5.0
483
+ );
484
+ int cell = int(mod(gl_FragCoord.y, 4.0)) * 4 + int(mod(gl_FragCoord.x, 4.0));
485
+ float shadowOffset = ((BAYER[cell] + hash31(vec3(gl_FragCoord.xy, 3.7))) / 16.0 - 0.5) * step;
486
+
487
+ float total = 0.0;
488
+ for (int i = 0; i < 64; i++) {
489
+ if (i >= samples) break;
490
+ float travelled = enter + (float(i) + 0.5) * step;
491
+ vec3 local = origin + dir * travelled;
492
+
493
+ float density = densityAt(local, near);
494
+ if (density <= 0.0) continue;
495
+
496
+ vec3 world = (uModelWorld * vec4(local, 1.0)).xyz;
497
+ if (uDust > 0.0) {
498
+ density *= mix(1.0, dustField((world + uDustOffset) / max(uDustScale, 1e-3)), uDust);
499
+ }
500
+ #if DIRECTIONAL_SHADOWS
501
+ if (uSunShadow > 0.0) {
502
+ vec3 dithered = (uModelWorld * vec4(origin + dir * (travelled + shadowOffset), 1.0)).xyz;
503
+ density *= sunReach(dithered);
504
+ }
505
+ #endif
506
+ total += density;
507
+ }
508
+
509
+ /*
510
+ * The integral, made dimensionless, then saturated.
511
+ *
512
+ * A raw metre-integral is what the physics wants and is unusable as an authored value: the
513
+ * same settings that read as a shaft across a room would arrive white on a ninety-metre beam,
514
+ * because the longer one simply has more air in it. So it is divided by a length belonging to
515
+ * the volume itself.
516
+ *
517
+ * **The aperture, and not the length, which is the mistake this was written with.** Dividing
518
+ * by the axial extent looks like the obvious choice and quietly assumes every ray runs down
519
+ * the axis. Almost none do: a shaft is nearly always watched from the side, where a ray
520
+ * crosses only the cone's width, so the first version of this divided a two-metre crossing by
521
+ * a twelve-metre extent and the volume arrived at a fifth of the light it should have. It was
522
+ * invisible in the frame and it was invisible in the arithmetic, which is why it took a debug
523
+ * capture writing the span and the accumulation into separate channels to see that the march
524
+ * was running correctly the whole time and only the last line was wrong. The far radius is the
525
+ * transverse scale, so a side-on ray now lands near 1 and an axial one, which really does
526
+ * travel further through more air, lands brighter.
527
+ *
528
+ * Saturating rather than clipping, because a volume of light is a medium: doubling the dust in
529
+ * a shaft does not double what comes out of it, and a linear term either reads flat at usable
530
+ * settings or blows to a white slab past them. This cannot exceed 1 whatever it is handed.
531
+ */
532
+ float reference = max(uSpread * uLength, 1e-4);
533
+ float lit = 1.0 - exp(-total * step / reference * VOLUME_GAIN);
534
+
535
+ /*
536
+ * Alpha is 1 and the energy is in the colour, because the blend is SRC_ALPHA, ONE. Putting
537
+ * it in both squares it, which is how an effect authored as bright arrives as faint. Every
538
+ * emissive material in this renderer has to pick one channel and mean it: see bolt.ts.
539
+ */
540
+ fragColor = vec4(vColor * (vEnergy * lit * uStrength), 1.0);
541
+ }
542
+ `,
543
+ { DIRECTIONAL_SHADOWS: options.directionalShadows },
544
+ 'lightVolume',
545
+ );
546
+ }
@@ -0,0 +1,125 @@
1
+ import { FOG_GLSL } from './fog.ts';
2
+ import { OUTPUT_TRANSFORM_GLSL } from './outputTransform.ts';
3
+
4
+ /**
5
+ * A polyline: a flat colour with a clean edge, a real width, and fog.
6
+ *
7
+ * **The plain sibling of `bolt.ts`, and they share a vertex expansion for a reason.** Both
8
+ * turn a segment into a quad that faces the viewer, because a filament has no thickness to
9
+ * see around and a world-fixed cross would make half the segments vanish edge-on. What they
10
+ * do not share is everything after that: an arc is light arriving, so it is additive,
11
+ * unlit, unfogged and allowed past white; a line is a thing in the world, so it is alpha
12
+ * blended, fogged, and its edge is a clean one.
13
+ *
14
+ * **This exists because there is no portable wide line.** WebGL2's `lineWidth` is clamped to
15
+ * one pixel by nearly every driver, and WebGPU has no line width at all. A one-pixel
16
+ * hairline is also the wrong answer on a high-density display, where it reads as a scratch
17
+ * rather than as a stroke. So the only line worth having is a triangle, which is what this
18
+ * draws.
19
+ */
20
+
21
+ export const LINE_VERT = `#version 300 es
22
+ layout(location = 0) in vec3 aFrom;
23
+ layout(location = 1) in vec3 aTo;
24
+ /** Along the segment (0 or 1), and which side of it (-1 or +1). */
25
+ layout(location = 2) in vec2 aCorner;
26
+
27
+ uniform mat4 uViewProj;
28
+ uniform mat4 uModel;
29
+ uniform vec3 uCameraPos;
30
+ /** Half-width in metres, and how much of a pixel a far line must still cover. */
31
+ uniform float uWidth;
32
+ uniform float uMinWidthPerMetre;
33
+
34
+ out float vSide;
35
+ out vec3 vWorldPos;
36
+
37
+ void main() {
38
+ /*
39
+ * Through the model matrix before anything else, unlike an arc, whose endpoints are
40
+ * world-space by nature. A line is usually attached to something that moves, and the
41
+ * alternative is making every caller transform its own points on the CPU each frame.
42
+ *
43
+ * The width is deliberately *not* scaled by the model. A stroke's weight is a property
44
+ * of how it is drawn rather than of the geometry it follows, so a card that shrinks
45
+ * keeps the same line weight, which is what a reader expects and what a designer means.
46
+ */
47
+ vec3 from = (uModel * vec4(aFrom, 1.0)).xyz;
48
+ vec3 to = (uModel * vec4(aTo, 1.0)).xyz;
49
+
50
+ vec3 mid = mix(from, to, aCorner.x);
51
+ vec3 dir = to - from;
52
+ float len = length(dir);
53
+ dir = len > 1e-6 ? dir / len : vec3(0.0, 1.0, 0.0);
54
+
55
+ vec3 view = mid - uCameraPos;
56
+ float dist = length(view);
57
+ view = dist > 1e-6 ? view / dist : vec3(0.0, 0.0, 1.0);
58
+
59
+ /*
60
+ * Across the segment and across the line of sight. Degenerate exactly when the segment
61
+ * points at the viewer, where any perpendicular is as good as another, and where the
62
+ * segment covers almost no screen anyway.
63
+ */
64
+ vec3 across = cross(dir, view);
65
+ float span = length(across);
66
+ across = span > 1e-4 ? across / span : normalize(cross(dir, vec3(0.0, 1.0, 0.0)) + vec3(1e-3));
67
+
68
+ /*
69
+ * A floor on the world-space width that grows with distance, so a stroke never thins
70
+ * below a pixel. Under a pixel a thin line does not get fainter, it *flickers*, because
71
+ * the rasteriser catches it on some frames and not others.
72
+ */
73
+ float halfWidth = max(uWidth, dist * uMinWidthPerMetre);
74
+ vec3 world = mid + across * aCorner.y * halfWidth;
75
+
76
+ vSide = aCorner.y;
77
+ vWorldPos = world;
78
+ gl_Position = uViewProj * vec4(world, 1.0);
79
+ }
80
+ `;
81
+
82
+ export const LINE_FRAG = `#version 300 es
83
+ precision highp float;
84
+
85
+ in float vSide;
86
+ in vec3 vWorldPos;
87
+
88
+ uniform vec3 uColor;
89
+ uniform float uOpacity;
90
+ uniform vec3 uCameraPos;
91
+ /**
92
+ * How far in from the edge the stroke fades, as a fraction of its half-width. Zero is a
93
+ * clean edge, one is a stroke that is soft all the way to its middle.
94
+ */
95
+ uniform float uSoftness;
96
+
97
+ ${FOG_GLSL}
98
+
99
+ out vec4 outColor;
100
+ ${OUTPUT_TRANSFORM_GLSL}
101
+
102
+ void main() {
103
+ /*
104
+ * Coverage across the ribbon: one down the middle, falling to zero at both edges.
105
+ *
106
+ * The band is at least one pixel wide *in screen space*, which is what lets one shader
107
+ * draw a stroke of any width at any distance without either aliasing into a staircase or
108
+ * blurring into a smear. A constant band is tuned for one width and is wrong at the rest,
109
+ * which is the same argument \`SDF_TEXT_FRAG\` makes for the same reason.
110
+ */
111
+ float edge = 1.0 - abs(vSide);
112
+ float band = max(fwidth(vSide), uSoftness);
113
+ float coverage = smoothstep(0.0, band, edge);
114
+
115
+ /*
116
+ * Fogged like geometry, which is where this parts company with \`bolt.ts\`. That shader
117
+ * includes the same helpers and never calls them, because an arc is light arriving
118
+ * rather than a surface losing some of itself to the air on the way over. A drawn line
119
+ * is a thing in the world and recedes like one.
120
+ */
121
+ float fog = mediumFog(distance(vWorldPos, uCameraPos), vWorldPos.y);
122
+ vec3 color = mix(uColor, mediumColor(), fog);
123
+ outColor = vec4(applyOutputTransform(color), coverage * uOpacity);
124
+ }
125
+ `;