@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,146 @@
1
+ /**
2
+ * What a GGX prefilter has to decide before any device is involved: which roughness a mip level
3
+ * stands for, and which source level one importance sample is allowed to read.
4
+ *
5
+ * **Backend-neutral, and that is the 2026-08-13 rule rather than tidiness.** A helper taking a
6
+ * `WebGL2RenderingContext` is a decision the other backend cannot reach, so it gets reimplemented
7
+ * there and the two drift. Both backends convolve the same cube by the same lobe; only the binding
8
+ * differs. It is also what makes the arithmetic testable without a GPU, which is where the
9
+ * hand-derived numbers in the test beside this file come from.
10
+ *
11
+ * **What a prefilter is, against what shipped before it.** A box filter averages a square of
12
+ * texels. A GGX lobe is not square, is not symmetric about the reflection direction at grazing
13
+ * angles, and widens with roughness in a way that has an analytic form. Sampling a box-filtered
14
+ * chain by roughness is an approximation whose error is largest exactly where a surface looks most
15
+ * interesting, and `uEnvironmentGain` is the control that has been correcting it by brute force.
16
+ *
17
+ * **What it costs:** a bake goes from six passes plus a mip chain to six passes plus a convolution
18
+ * per level. That is affordable only because a bake is once per scene rather than once per frame,
19
+ * and the sample count is a quality option for the same reason a phone and a workstation should
20
+ * not agree on it. **What would make it wrong** is a caller baking per frame; at that point the
21
+ * convolution is the frame's cost and the box chain it replaced was the right trade.
22
+ */
23
+ /**
24
+ * Samples per texel, per quality tier.
25
+ *
26
+ * **Powers of two, because the Hammersley sequence's radical inverse is a bit reversal.** A count
27
+ * that is not a power of two leaves the sequence unevenly stratified, which does not error — it
28
+ * shows as a faint directional bias in the rough levels that reads as the environment being
29
+ * slightly wrong rather than as a sampling fault.
30
+ *
31
+ * 32 is where a rough level stops showing individual bright sources as separate blobs on the
32
+ * scenes in this repository; 128 is where doubling it again stopped being visible. **What would
33
+ * make these wrong** is a much brighter environment than any tested here — a small sun in an
34
+ * otherwise dark sky is the worst case for variance, and it wants the high tier or a source level
35
+ * chosen more conservatively than `sourceLevelForSample` does.
36
+ */
37
+ export const PREFILTER_SAMPLE_COUNTS = {
38
+ low: 16,
39
+ medium: 32,
40
+ high: 128,
41
+ };
42
+ /**
43
+ * The octahedral edge a probe of a given cube face size gets.
44
+ *
45
+ * **Twice the face, which is the ratio `OCTAHEDRAL_EDGE` already chose** for the point-shadow
46
+ * array and for the reason written down there: matching a cube face's angular density needs
47
+ * `face * sqrt(6)`, so twice the face is about **1.22x coarser in the worst direction**, taken
48
+ * because the filtering this unlocks is blurring the result anyway. 1024 for a 512 face there,
49
+ * 256 for the default 128 face here — one rule, so the two octahedral resources in this engine
50
+ * are calibrated against each other rather than each to taste.
51
+ */
52
+ export function octahedralEdgeFor(faceSize) {
53
+ return Math.max(32, Math.trunc(faceSize) * 2);
54
+ }
55
+ /**
56
+ * The irradiance image's edge, and why the diffuse term is a level of the same chain.
57
+ *
58
+ * **Eight, which is what a probe's diffuse light actually needs.** A cosine convolution removes
59
+ * everything above the second band, so the image it produces has no detail an eighth of a sphere
60
+ * across to lose — the size irradiance probes are conventionally stored at, arrived at from the
61
+ * same place. It replaces nine spherical-harmonic coefficients, and 64 octahedral texels carry at
62
+ * least what nine coefficients did.
63
+ *
64
+ * **What this buys is the last texture unit.** A second array would be a second sampler, and
65
+ * WebGL2 guarantees sixteen units of which fifteen are spent. Folding the diffuse term into a
66
+ * level of the radiance chain is what `REFRACT_SCENE_TEXTURE_UNIT`'s comment asks the next
67
+ * sampler to do, and it leaves unit 15 free.
68
+ */
69
+ export const IRRADIANCE_EDGE = 8;
70
+ /**
71
+ * Which level of a chain holds the cosine convolution.
72
+ *
73
+ * The level whose image is `IRRADIANCE_EDGE` across. For the default 256 edge that is level 5, and
74
+ * **the chain stops there rather than carrying unread levels above it** — `texStorage3D` takes a
75
+ * level count, so the three that would hold sixteen, four and one texel are never created. Six
76
+ * levels, 87,360 texels, 683 KB a layer at half float.
77
+ */
78
+ export function irradianceLevelFor(edge) {
79
+ return Math.max(1, Math.round(Math.log2(Math.max(IRRADIANCE_EDGE * 2, edge) / IRRADIANCE_EDGE)));
80
+ }
81
+ /**
82
+ * The coarsest level the GGX chain reaches, which is one below the irradiance level.
83
+ *
84
+ * This is `uEnvironmentMaxLod`, and it is what `roughnessForLevel` maps roughness 1 onto. For the
85
+ * default edge it is 4, so the roughest level is 16 texels across.
86
+ *
87
+ * **That is better at high roughness than the cube it replaces, not worse.** A 128 cube's chain
88
+ * ends at one texel a face, which the lit pass's own comment complains about — "one texel a face
89
+ * and therefore one colour for every direction". What is given up is roughness granularity, five
90
+ * stops against eight, and the level blend interpolates between them exactly as the cube's mip
91
+ * filter did.
92
+ */
93
+ export function ggxMaxLevelFor(edge) {
94
+ return Math.max(1, irradianceLevelFor(edge) - 1);
95
+ }
96
+ /**
97
+ * The roughness mip level `level` is convolved for.
98
+ *
99
+ * **Linear in the level index, and it has to be**, because the lit pass already picks its level
100
+ * with `surfaceRoughness * uEnvironmentMaxLod`. This is that relation read backwards. A different
101
+ * curve here would not be an improvement in isolation — it would be the two halves disagreeing
102
+ * about what level three means, which reads as roughness being subtly miscalibrated everywhere and
103
+ * points at nothing.
104
+ *
105
+ * **What would make it wrong** is the lit pass changing how it selects a level; the two move
106
+ * together or neither moves.
107
+ */
108
+ export function roughnessForLevel(level, maxLevel) {
109
+ /*
110
+ * A single-level chain has nowhere to go, and dividing by its zero top level is NaN — a
111
+ * roughness the convolution would carry into every sample, producing a picture nobody could
112
+ * attribute to a divide. A mirror is what one level honestly is.
113
+ */
114
+ if (maxLevel <= 0)
115
+ return 0;
116
+ return Math.min(1, Math.max(0, level / maxLevel));
117
+ }
118
+ /**
119
+ * Which level of the source cube one importance sample may read.
120
+ *
121
+ * **Filtered importance sampling, and the whole point of it is variance rather than speed.** A
122
+ * sample drawn from the GGX distribution covers a solid angle of `1 / (count * pdf)`; one texel of
123
+ * a cube with `faceTexels`-wide faces covers `4*pi / (6 * faceTexels^2)`. When a sample is much
124
+ * wider than a texel, reading the base level lets a few very bright texels land in some samples and
125
+ * not others, and that variance survives the average as fireflies. Reading a level where the sample
126
+ * covers roughly one texel is what removes them without raising the count.
127
+ *
128
+ * The half in front of the logarithm is not a fudge: a level step doubles a texel's width and so
129
+ * quadruples its solid angle, and the level is a length ratio rather than an area one.
130
+ *
131
+ * **What it costs** is that the source has to be a box-filtered chain, which is why the capture
132
+ * keeps its `generateMipmap` and the convolution writes a second cube. **What would make it wrong**
133
+ * is convolving from a source that is itself already convolved: the lobe would be applied twice and
134
+ * the error compounds up the chain, which is precisely the reason the two cubes are separate
135
+ * objects rather than one written in place.
136
+ */
137
+ export function sourceLevelForSample(pdf, faceTexels, count, maxLevel) {
138
+ /* Guard the logarithm's arguments rather than its result; a zero here is a caller's bug. */
139
+ const texels = Math.max(1, faceTexels);
140
+ const samples = Math.max(1, count);
141
+ const density = Math.max(1e-12, pdf);
142
+ const texelSolidAngle = (4 * Math.PI) / (6 * texels * texels);
143
+ const sampleSolidAngle = 1 / (samples * density);
144
+ const level = 0.5 * Math.log2(sampleSolidAngle / texelSolidAngle);
145
+ return Math.min(maxLevel, Math.max(0, level));
146
+ }
@@ -0,0 +1,44 @@
1
+ /** WebGL2's half of the environment prefilter: the program, and the draw for one level of a layer. */
2
+ import type { EnvProbeArray } from './envProbeArray.ts';
3
+ import type { ReflectionProbe } from './reflectionProbe.ts';
4
+ /**
5
+ * Convolves a captured probe's box chain into one layer of the grid's array, once per bake.
6
+ *
7
+ * **Its own module rather than more of the renderer**, following `ambientOcclusionPass.ts` and
8
+ * `bloomPass.ts`: a program, its uniforms, a vertex array and one draw. The renderer owns when
9
+ * this happens; this owns what it is.
10
+ *
11
+ * **What it costs** is one program compile at construction and **one draw per level per bake**,
12
+ * where the cube it replaced needed six — an octahedral map has no faces, so the six-way loop is
13
+ * gone rather than moved. A bake is once per scene per probe, which is the whole reason a
14
+ * convolution is affordable where a per-frame version of it would not be. **What would make it
15
+ * wrong** is a caller baking every frame; at that point this is the frame's cost and the box chain
16
+ * it replaced was the right trade.
17
+ *
18
+ * **A grid multiplies a bake by its probe count**, which is the real budget question rather than
19
+ * the texture units. The caller drives one probe at a time for exactly that reason.
20
+ */
21
+ export declare class EnvironmentPrefilterPass {
22
+ private readonly program;
23
+ private readonly uniforms;
24
+ private readonly vao;
25
+ constructor(gl: WebGL2RenderingContext);
26
+ /**
27
+ * Fill every level of the probe's prefiltered cube from its captured one.
28
+ *
29
+ * The source is bound on the unit the environment normally occupies, which is deliberate rather
30
+ * than convenient: that unit is rebound by the lit pass every frame, so borrowing it here cannot
31
+ * outlive the bake, and it keeps the pass out of the unit accounting `textureUnitBudget.test.ts`
32
+ * holds.
33
+ */
34
+ run(gl: WebGL2RenderingContext, source: ReflectionProbe, array: EnvProbeArray, layer: number, sourceUnit: number, samples: number,
35
+ /**
36
+ * Whether the reflection chain is the GGX convolution rather than a box filter.
37
+ *
38
+ * `RenderQuality.environmentPrefilter`, and it is consulted here rather than at bind time
39
+ * because there is one chain now instead of two textures. A profile that has not asked for the
40
+ * lobe chain bakes the box one into the same layers and gets the picture it already had.
41
+ */
42
+ prefiltered: boolean): void;
43
+ dispose(gl: WebGL2RenderingContext): void;
44
+ }
@@ -0,0 +1,98 @@
1
+ /** WebGL2's half of the environment prefilter: the program, and the draw for one level of a layer. */
2
+ import { compileProgram, uniformLocations } from './shader.js';
3
+ import { PREFILTER_FRAG } from './shaders/prefilter.js';
4
+ import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
5
+ /**
6
+ * Convolves a captured probe's box chain into one layer of the grid's array, once per bake.
7
+ *
8
+ * **Its own module rather than more of the renderer**, following `ambientOcclusionPass.ts` and
9
+ * `bloomPass.ts`: a program, its uniforms, a vertex array and one draw. The renderer owns when
10
+ * this happens; this owns what it is.
11
+ *
12
+ * **What it costs** is one program compile at construction and **one draw per level per bake**,
13
+ * where the cube it replaced needed six — an octahedral map has no faces, so the six-way loop is
14
+ * gone rather than moved. A bake is once per scene per probe, which is the whole reason a
15
+ * convolution is affordable where a per-frame version of it would not be. **What would make it
16
+ * wrong** is a caller baking every frame; at that point this is the frame's cost and the box chain
17
+ * it replaced was the right trade.
18
+ *
19
+ * **A grid multiplies a bake by its probe count**, which is the real budget question rather than
20
+ * the texture units. The caller drives one probe at a time for exactly that reason.
21
+ */
22
+ export class EnvironmentPrefilterPass {
23
+ program;
24
+ uniforms;
25
+ vao;
26
+ constructor(gl) {
27
+ this.program = compileProgram(gl, FULLSCREEN_VERT, PREFILTER_FRAG, 'envPrefilter');
28
+ this.uniforms = uniformLocations(gl, this.program, 'envPrefilter');
29
+ const vao = gl.createVertexArray();
30
+ if (vao === null)
31
+ throw new Error('EnvironmentPrefilterPass: createVertexArray failed');
32
+ this.vao = vao;
33
+ }
34
+ /**
35
+ * Fill every level of the probe's prefiltered cube from its captured one.
36
+ *
37
+ * The source is bound on the unit the environment normally occupies, which is deliberate rather
38
+ * than convenient: that unit is rebound by the lit pass every frame, so borrowing it here cannot
39
+ * outlive the bake, and it keeps the pass out of the unit accounting `textureUnitBudget.test.ts`
40
+ * holds.
41
+ */
42
+ run(gl, source, array, layer, sourceUnit, samples,
43
+ /**
44
+ * Whether the reflection chain is the GGX convolution rather than a box filter.
45
+ *
46
+ * `RenderQuality.environmentPrefilter`, and it is consulted here rather than at bind time
47
+ * because there is one chain now instead of two textures. A profile that has not asked for the
48
+ * lobe chain bakes the box one into the same layers and gets the picture it already had.
49
+ */
50
+ prefiltered) {
51
+ const previousProgram = gl.getParameter(gl.CURRENT_PROGRAM);
52
+ gl.useProgram(this.program);
53
+ gl.bindVertexArray(this.vao);
54
+ /*
55
+ * A convolution writes over a target it has no depth relationship with, so both the test and
56
+ * the write are off — and culling with it, because the fullscreen triangle's winding is
57
+ * whatever the vertex shader's corner arithmetic produced rather than something anybody chose.
58
+ */
59
+ gl.disable(gl.DEPTH_TEST);
60
+ gl.depthMask(false);
61
+ gl.disable(gl.CULL_FACE);
62
+ gl.disable(gl.BLEND);
63
+ gl.activeTexture(gl.TEXTURE0 + sourceUnit);
64
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, source.texture);
65
+ gl.uniform1i(this.uniforms['uPrefilterSource'] ?? null, sourceUnit);
66
+ gl.uniform1f(this.uniforms['uPrefilterSamples'] ?? null, samples);
67
+ gl.uniform1f(this.uniforms['uPrefilterSourceTexels'] ?? null, source.size);
68
+ gl.uniform1f(this.uniforms['uPrefilterSourceMaxLod'] ?? null, source.maxLod);
69
+ array.convolve(gl, layer, (level, roughness, kind) => {
70
+ /*
71
+ * **The level's own edge, not the array's.** A gutter is one texel at every level, so its
72
+ * share of the map doubles as the chain coarsens; insetting a coarse level by the base
73
+ * edge's fraction reads as the reflection sliding as roughness rises.
74
+ */
75
+ gl.uniform1f(this.uniforms['uPrefilterEdge'] ?? null, Math.max(1, array.edge >> level));
76
+ gl.uniform1f(this.uniforms['uPrefilterIrradiance'] ?? null, kind === 'irradiance' ? 1 : 0);
77
+ gl.uniform1f(this.uniforms['uPrefilterBox'] ?? null, prefiltered ? 0 : 1);
78
+ gl.uniform1f(this.uniforms['uPrefilterLevel'] ?? null, level);
79
+ gl.uniform1f(this.uniforms['uPrefilterRoughness'] ?? null, roughness);
80
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
81
+ });
82
+ gl.bindVertexArray(null);
83
+ gl.depthMask(true);
84
+ gl.enable(gl.DEPTH_TEST);
85
+ gl.enable(gl.CULL_FACE);
86
+ /*
87
+ * Put the caller's program back rather than leaving ours current. The bake around this reads
88
+ * and restores flat-shader uniforms on either side of itself, and it would be doing that to
89
+ * whichever program happened to be bound.
90
+ */
91
+ if (previousProgram !== null)
92
+ gl.useProgram(previousProgram);
93
+ }
94
+ dispose(gl) {
95
+ gl.deleteProgram(this.program);
96
+ gl.deleteVertexArray(this.vao);
97
+ }
98
+ }
@@ -0,0 +1,122 @@
1
+ /** Where environment probes stand, and which of them light a point. */
2
+ import type { Vec3 } from '../math/color.ts';
3
+ /**
4
+ * A lattice, and the reason it is one.
5
+ *
6
+ * **A list of probes is what the shader cannot afford.** Free placement wants a position and an
7
+ * extent per probe, and `flatFrag` already declares 35 array uniforms totalling 385 uniform
8
+ * vectors against WebGL2's guaranteed `MAX_FRAGMENT_UNIFORM_VECTORS` of 224 — the widest
9
+ * permutation is 1.7x over the guarantee already and runs because real parts offer more. Sixteen
10
+ * probes of position and extent would add about 48 vectors to that, on a budget nobody can raise.
11
+ *
12
+ * A lattice needs four uniforms whatever the probe count: an origin, the reciprocal of the
13
+ * spacing, the counts, and whether the grid supplies ambient. The layer index is arithmetic and
14
+ * the blend is three lerps, so nothing here scales with how many probes a world has.
15
+ *
16
+ * **What it costs** is that probes cannot be placed where a room is. A world whose interesting
17
+ * volume is not a box spends layers on probes standing in walls, and the answer to that is a
18
+ * coarser grid rather than a list. **What would make it wrong** is the flat shader's uniform
19
+ * pressure falling far enough for per-probe data to fit, or probe data moving into a texture —
20
+ * which needs the last texture unit, and `lightBudget.ts` records why that one is being kept.
21
+ */
22
+ export interface ProbeGridOptions {
23
+ /** Where probe (0, 0, 0) stands. Every other probe is offset from it by whole steps. */
24
+ readonly origin: Vec3;
25
+ /** Metres between neighbouring probes on each axis. Every component must be positive. */
26
+ readonly spacing: Vec3;
27
+ /**
28
+ * How many probes on each axis.
29
+ *
30
+ * **`[1, 1, 1]` is a single probe, and that is not a special case anywhere below.** A world that
31
+ * bakes one environment is a grid of one, so there is one code path through the array, the
32
+ * convolution and the shader instead of a grid path and a legacy path that drift.
33
+ */
34
+ readonly counts: Vec3;
35
+ }
36
+ /**
37
+ * The eight probes surrounding a point, and how much of each it takes.
38
+ *
39
+ * Filled rather than returned, because the renderer asks this per draw when it decides what to
40
+ * bake next, and the rule against allocating in a per-frame path is cheaper to keep than to
41
+ * reason about. Eight always, duplicates included: a point at the edge of the grid, or in a grid
42
+ * one probe wide, resolves several corners to the same layer and their weights add. That keeps
43
+ * the sum exactly one with no branch, which is what the shader wants too.
44
+ */
45
+ export interface ProbeBlend {
46
+ readonly layers: Int32Array;
47
+ readonly weights: Float32Array;
48
+ }
49
+ /** A blend a caller owns and reuses. */
50
+ export declare function createProbeBlend(): ProbeBlend;
51
+ /**
52
+ * How many layers a grid may hold, and it is a memory limit rather than a binding one.
53
+ *
54
+ * Every probe is one layer of one array, so probes cost no texture units at all — the same thing
55
+ * the octahedral change bought the point lights, arrived at the same way. What they do cost is
56
+ * storage: a layer at the default size is 683 KB with its chain, so 64 layers is **43.7 MB**,
57
+ * comfortably under the 92.3 MB `pointShadowArray.ts` already spends.
58
+ *
59
+ * WebGL2 guarantees `MAX_ARRAY_TEXTURE_LAYERS` of 256, which would be 175 MB and is the number
60
+ * this is *not* set to. Raising it is an arithmetic decision about memory and the arithmetic is
61
+ * written here so nobody has to re-derive it.
62
+ */
63
+ export declare const MAX_ENV_PROBES = 64;
64
+ /**
65
+ * The lattice a single baked probe is, and the origin a loaded environment sits at.
66
+ *
67
+ * **Here rather than in either backend**, per the rule `prefilterEnvMap.ts` states at length: a
68
+ * value one backend defines is a decision the other cannot reach, so it gets restated there and the
69
+ * two drift. Both renderers turn `bakeReflectionProbe` into a grid of one, and they have to turn it
70
+ * into the *same* grid or a scene renders differently on each.
71
+ *
72
+ * A step is required even here, because `ProbeGrid` refuses a zero one — the blend divides by it —
73
+ * and one metre is the honest arbitrary choice for a grid with no extent.
74
+ */
75
+ export declare const SINGLE_PROBE: Vec3;
76
+ export declare const UNIT_STEP: Vec3;
77
+ export declare const WORLD_ORIGIN: Vec3;
78
+ /**
79
+ * Whether a declared grid is the one already allocated.
80
+ *
81
+ * `texStorage3D` and `createTexture` are both immutable in the size they take, so a grid that has
82
+ * not changed must not reallocate: `bakeReflectionProbe` declares its grid of one on every call,
83
+ * and a scene rebaking each frame would otherwise throw away its layers every frame.
84
+ */
85
+ export declare function sameGrid(a: ProbeGrid, b: ProbeGrid): boolean;
86
+ export declare class ProbeGrid {
87
+ readonly origin: Vec3;
88
+ readonly spacing: Vec3;
89
+ readonly counts: Vec3;
90
+ /** Probes in total, which is also the array's layer count. */
91
+ readonly layers: number;
92
+ /** The reciprocal of the spacing, because the shader multiplies and so does everything here. */
93
+ readonly invSpacing: Vec3;
94
+ constructor(options: ProbeGridOptions);
95
+ /**
96
+ * The layer a probe at whole lattice coordinates occupies.
97
+ *
98
+ * **x fastest, then y, then z**, and the order is written down because the shader computes the
99
+ * same expression and the two disagreeing would put every fragment's reflection in a different
100
+ * room. Out-of-range coordinates clamp; see `nearestProbes` for why clamping rather than
101
+ * wrapping is the behaviour at a grid's edge.
102
+ */
103
+ layerAt(ix: number, iy: number, iz: number): number;
104
+ /** Where a layer's probe stands, filling a vector the caller owns. */
105
+ positionOf(layer: number, out: Vec3): Vec3;
106
+ }
107
+ /**
108
+ * The eight probes around a world position, with trilinear weights that sum to one.
109
+ *
110
+ * **Clamped at the grid's edge rather than wrapped or faded.** A point outside the grid takes the
111
+ * nearest probes at full weight, which is the same environment it would have had one step inside —
112
+ * the honest degradation, and the one a consumer can see coming. Fading to the hemispheric
113
+ * gradient at the boundary was the alternative and it reads worse: an object walking out of a
114
+ * grid would change what lights it while nothing about it changed.
115
+ *
116
+ * **Weights sum to one everywhere, including outside**, which is what lets the shader multiply
117
+ * rather than normalise. In a grid one probe wide on an axis, that axis contributes a factor of
118
+ * one and the eight corners collapse onto fewer layers whose weights add — no branch, and a
119
+ * `[1, 1, 1]` grid returns the single probe at weight one with the other seven entries pointing
120
+ * at it too.
121
+ */
122
+ export declare function nearestProbes(grid: ProbeGrid, x: number, y: number, z: number, out: ProbeBlend): ProbeBlend;
@@ -0,0 +1,174 @@
1
+ /** Where environment probes stand, and which of them light a point. */
2
+ /** A blend a caller owns and reuses. */
3
+ export function createProbeBlend() {
4
+ return { layers: new Int32Array(8), weights: new Float32Array(8) };
5
+ }
6
+ /**
7
+ * How many layers a grid may hold, and it is a memory limit rather than a binding one.
8
+ *
9
+ * Every probe is one layer of one array, so probes cost no texture units at all — the same thing
10
+ * the octahedral change bought the point lights, arrived at the same way. What they do cost is
11
+ * storage: a layer at the default size is 683 KB with its chain, so 64 layers is **43.7 MB**,
12
+ * comfortably under the 92.3 MB `pointShadowArray.ts` already spends.
13
+ *
14
+ * WebGL2 guarantees `MAX_ARRAY_TEXTURE_LAYERS` of 256, which would be 175 MB and is the number
15
+ * this is *not* set to. Raising it is an arithmetic decision about memory and the arithmetic is
16
+ * written here so nobody has to re-derive it.
17
+ */
18
+ export const MAX_ENV_PROBES = 64;
19
+ /**
20
+ * The lattice a single baked probe is, and the origin a loaded environment sits at.
21
+ *
22
+ * **Here rather than in either backend**, per the rule `prefilterEnvMap.ts` states at length: a
23
+ * value one backend defines is a decision the other cannot reach, so it gets restated there and the
24
+ * two drift. Both renderers turn `bakeReflectionProbe` into a grid of one, and they have to turn it
25
+ * into the *same* grid or a scene renders differently on each.
26
+ *
27
+ * A step is required even here, because `ProbeGrid` refuses a zero one — the blend divides by it —
28
+ * and one metre is the honest arbitrary choice for a grid with no extent.
29
+ */
30
+ export const SINGLE_PROBE = [1, 1, 1];
31
+ export const UNIT_STEP = [1, 1, 1];
32
+ export const WORLD_ORIGIN = [0, 0, 0];
33
+ /**
34
+ * Whether a declared grid is the one already allocated.
35
+ *
36
+ * `texStorage3D` and `createTexture` are both immutable in the size they take, so a grid that has
37
+ * not changed must not reallocate: `bakeReflectionProbe` declares its grid of one on every call,
38
+ * and a scene rebaking each frame would otherwise throw away its layers every frame.
39
+ */
40
+ export function sameGrid(a, b) {
41
+ for (let axis = 0; axis < 3; axis++) {
42
+ if (a.counts[axis] !== b.counts[axis])
43
+ return false;
44
+ if (a.origin[axis] !== b.origin[axis])
45
+ return false;
46
+ if (a.spacing[axis] !== b.spacing[axis])
47
+ return false;
48
+ }
49
+ return true;
50
+ }
51
+ export class ProbeGrid {
52
+ origin;
53
+ spacing;
54
+ counts;
55
+ /** Probes in total, which is also the array's layer count. */
56
+ layers;
57
+ /** The reciprocal of the spacing, because the shader multiplies and so does everything here. */
58
+ invSpacing;
59
+ constructor(options) {
60
+ const counts = [
61
+ Math.max(1, Math.trunc(options.counts[0])),
62
+ Math.max(1, Math.trunc(options.counts[1])),
63
+ Math.max(1, Math.trunc(options.counts[2])),
64
+ ];
65
+ const layers = counts[0] * counts[1] * counts[2];
66
+ /*
67
+ * **Fail fast at init**, per `AGENTS.md`, and say the arithmetic rather than the rule. A grid
68
+ * too large to allocate is a consumer's typo far more often than an intention, and the cost of
69
+ * finding out at `texStorage3D` is a device-lost message with nothing in it about probes.
70
+ */
71
+ if (layers > MAX_ENV_PROBES) {
72
+ throw new Error(`ProbeGrid: ${counts[0]}x${counts[1]}x${counts[2]} is ${layers} probes and the limit is ` +
73
+ `${MAX_ENV_PROBES}. Each is one layer of one array texture; see MAX_ENV_PROBES for what ` +
74
+ `raising it costs in memory.`);
75
+ }
76
+ for (let axis = 0; axis < 3; axis++) {
77
+ const step = options.spacing[axis] ?? 0;
78
+ /*
79
+ * A zero step is a division by zero one line into `nearestProbes`, and the NaN it produces
80
+ * reaches the shader as a probe weight — which reads as the environment being wrong
81
+ * everywhere rather than as a grid being declared wrong once.
82
+ */
83
+ if (!(step > 0)) {
84
+ throw new Error(`ProbeGrid: spacing on axis ${axis} is ${String(step)}; every component must be ` +
85
+ `positive. A grid one probe wide on an axis still needs a step, since the step is ` +
86
+ `what the blend divides by.`);
87
+ }
88
+ }
89
+ this.origin = [options.origin[0], options.origin[1], options.origin[2]];
90
+ this.spacing = [options.spacing[0], options.spacing[1], options.spacing[2]];
91
+ this.invSpacing = [1 / this.spacing[0], 1 / this.spacing[1], 1 / this.spacing[2]];
92
+ this.counts = counts;
93
+ this.layers = layers;
94
+ }
95
+ /**
96
+ * The layer a probe at whole lattice coordinates occupies.
97
+ *
98
+ * **x fastest, then y, then z**, and the order is written down because the shader computes the
99
+ * same expression and the two disagreeing would put every fragment's reflection in a different
100
+ * room. Out-of-range coordinates clamp; see `nearestProbes` for why clamping rather than
101
+ * wrapping is the behaviour at a grid's edge.
102
+ */
103
+ layerAt(ix, iy, iz) {
104
+ const x = clampIndex(ix, this.counts[0]);
105
+ const y = clampIndex(iy, this.counts[1]);
106
+ const z = clampIndex(iz, this.counts[2]);
107
+ return x + this.counts[0] * (y + this.counts[1] * z);
108
+ }
109
+ /** Where a layer's probe stands, filling a vector the caller owns. */
110
+ positionOf(layer, out) {
111
+ const index = clampIndex(layer, this.layers);
112
+ const x = index % this.counts[0];
113
+ const y = Math.floor(index / this.counts[0]) % this.counts[1];
114
+ const z = Math.floor(index / (this.counts[0] * this.counts[1]));
115
+ out[0] = this.origin[0] + x * this.spacing[0];
116
+ out[1] = this.origin[1] + y * this.spacing[1];
117
+ out[2] = this.origin[2] + z * this.spacing[2];
118
+ return out;
119
+ }
120
+ }
121
+ /**
122
+ * The eight probes around a world position, with trilinear weights that sum to one.
123
+ *
124
+ * **Clamped at the grid's edge rather than wrapped or faded.** A point outside the grid takes the
125
+ * nearest probes at full weight, which is the same environment it would have had one step inside —
126
+ * the honest degradation, and the one a consumer can see coming. Fading to the hemispheric
127
+ * gradient at the boundary was the alternative and it reads worse: an object walking out of a
128
+ * grid would change what lights it while nothing about it changed.
129
+ *
130
+ * **Weights sum to one everywhere, including outside**, which is what lets the shader multiply
131
+ * rather than normalise. In a grid one probe wide on an axis, that axis contributes a factor of
132
+ * one and the eight corners collapse onto fewer layers whose weights add — no branch, and a
133
+ * `[1, 1, 1]` grid returns the single probe at weight one with the other seven entries pointing
134
+ * at it too.
135
+ */
136
+ export function nearestProbes(grid, x, y, z, out) {
137
+ const lx = cellCoordinate(x, grid.origin[0], grid.invSpacing[0], grid.counts[0]);
138
+ const ly = cellCoordinate(y, grid.origin[1], grid.invSpacing[1], grid.counts[1]);
139
+ const lz = cellCoordinate(z, grid.origin[2], grid.invSpacing[2], grid.counts[2]);
140
+ let slot = 0;
141
+ for (let cz = 0; cz < 2; cz++) {
142
+ const wz = cz === 0 ? 1 - lz.fraction : lz.fraction;
143
+ for (let cy = 0; cy < 2; cy++) {
144
+ const wy = cy === 0 ? 1 - ly.fraction : ly.fraction;
145
+ for (let cx = 0; cx < 2; cx++) {
146
+ const wx = cx === 0 ? 1 - lx.fraction : lx.fraction;
147
+ out.layers[slot] = grid.layerAt(lx.index + cx, ly.index + cy, lz.index + cz);
148
+ out.weights[slot] = wx * wy * wz;
149
+ slot++;
150
+ }
151
+ }
152
+ }
153
+ return out;
154
+ }
155
+ /**
156
+ * One axis of the lookup: which probe is below the point, and how far past it the point is.
157
+ *
158
+ * The lower index stops one short of the last probe so the pair `index` and `index + 1` is always
159
+ * inside the grid, and a single-probe axis has no pair at all — both corners are probe zero and
160
+ * the fraction is zero, so that axis multiplies every weight by one.
161
+ */
162
+ function cellCoordinate(value, origin, invSpacing, count) {
163
+ if (count <= 1)
164
+ return { index: 0, fraction: 0 };
165
+ const local = (value - origin) * invSpacing;
166
+ const clamped = local <= 0 ? 0 : local >= count - 1 ? count - 1 : local;
167
+ const index = Math.min(Math.floor(clamped), count - 2);
168
+ return { index, fraction: clamped - index };
169
+ }
170
+ /** A whole index forced into a range, for the two lookups that accept anything. */
171
+ function clampIndex(value, count) {
172
+ const index = Math.trunc(value);
173
+ return index <= 0 ? 0 : index >= count - 1 ? count - 1 : index;
174
+ }