@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,276 @@
1
+ import { mat3 } from 'gl-matrix';
2
+
3
+ import { createEmptyTexture2D } from './emptyTexture.ts';
4
+ import { LIVE_POINT_SHADOW_MAPS, POINT_SHADOW_POOL } from './lightBudget.ts';
5
+ import { pointShadowFaceRotation } from './pointShadowImage.ts';
6
+ import { compileProgram, uniformLocations } from './shader.ts';
7
+ import { OCTAHEDRAL_RESOLVE_FRAG, OCTAHEDRAL_RESOLVE_VERT } from './shaders/octahedralResolve.ts';
8
+
9
+ /**
10
+ * The edge of one light's octahedral map.
11
+ *
12
+ * Matching a 512 cube face's angular density would need `512 * sqrt(6)`, about 1254, because a
13
+ * cube face covers a sixth of the sphere inside its own square. This is 1024, so texels are about
14
+ * 1.2x coarser in the worst direction — chosen because the wider filter this whole change unlocks
15
+ * is blurring the result anyway, and because 1024 costs 4.19 MB a layer against a cube's 6.29 MB.
16
+ */
17
+ export const OCTAHEDRAL_EDGE = 1024;
18
+
19
+ /** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
20
+ const faceRotation = mat3.create();
21
+
22
+ /**
23
+ * What a `PointShadowMap` needs of the array: somewhere to render a face, and somewhere to put it.
24
+ *
25
+ * An interface rather than the class, so a map can be built without a device at all — the pooling
26
+ * rules are worth testing on their own and none of them is about a texture.
27
+ */
28
+ export interface PointShadowTarget {
29
+ beginFace(gl: WebGL2RenderingContext): void;
30
+ resolveFace(
31
+ gl: WebGL2RenderingContext,
32
+ layer: number,
33
+ face: number,
34
+ far: number,
35
+ near: number,
36
+ ): void;
37
+ }
38
+
39
+ /**
40
+ * Every point light's shadow as one array texture, and the scratch that fills it.
41
+ *
42
+ * **One scratch for the whole engine rather than one cube per pool slot**, which is the economy
43
+ * the whole design turns on. Each octahedral texel has exactly one dominant axis, so a cube face's
44
+ * region of the map is disjoint from the other five and is written in full the moment that face is
45
+ * resolved. A face is therefore consumed immediately, and a bake spread across frames — which is
46
+ * how bakes work here, a couple of faces at a time against `pointShadowBudget.ts` — never needs a
47
+ * second face to still be around.
48
+ *
49
+ * **The scratch is a separate texture and that is not tidiness.** WebGL2's rendering-feedback-loop
50
+ * check is per texture object rather than per image: a draw that samples the array while any layer
51
+ * of it is attached is `INVALID_OPERATION`, on a layer it does not even write. Measured on a probe
52
+ * before this file existed. So the resolve reads the scratch and writes the array, and the two are
53
+ * never the same object.
54
+ */
55
+ export class PointShadowArray implements PointShadowTarget {
56
+ readonly texture: WebGLTexture;
57
+ /**
58
+ * How many layers this array holds: the point pool, the two live transition maps, and two more
59
+ * for each rectangle a world said would cast. See the constructor's `extraLayers`.
60
+ */
61
+ readonly layers: number;
62
+
63
+ private readonly framebuffer: WebGLFramebuffer;
64
+ private readonly scratchTexture: WebGLTexture;
65
+ private readonly scratchFramebuffer: WebGLFramebuffer;
66
+ /** Parked on the resolve's unit while the scratch is a render target. See `beginFace`. */
67
+ private readonly parked: WebGLTexture;
68
+ private readonly faceSize: number;
69
+ private readonly program: WebGLProgram;
70
+ private readonly uniforms: Record<string, WebGLUniformLocation>;
71
+ private readonly vao: WebGLVertexArrayObject;
72
+
73
+ constructor(
74
+ gl: WebGL2RenderingContext,
75
+ faceSize: number,
76
+ lightCount: number,
77
+ /**
78
+ * Layers above the point pool, for the rectangles a world says will cast.
79
+ *
80
+ * **Sized from the declaration for the same reason the point half is**, and it is the whole of
81
+ * what an area light costs in storage: `areaShadowLayerCount` counts two per casting rectangle
82
+ * and zero for a world whose rectangles do not cast, so a consumer that has not asked for this
83
+ * allocates exactly what it allocated before. Where they land is `firstAreaShadowLayer`, which
84
+ * is the same expression as the line below — one function, because the array sizing itself and
85
+ * the set handing out indices disagreeing by one would have every rectangle sampling a lamp's
86
+ * map.
87
+ */
88
+ extraLayers = 0,
89
+ ) {
90
+ this.faceSize = faceSize;
91
+ /*
92
+ * Sized from the world rather than from the maximum. `texStorage3D` is immutable, so the
93
+ * alternative is handing a three-light world the storage for twenty-two — which is the mistake
94
+ * `lightBudget.ts` calls the most expensive the renderer has made, wearing a new shape.
95
+ */
96
+ this.layers =
97
+ Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
98
+
99
+ const texture = gl.createTexture();
100
+ if (texture === null) throw new Error('PointShadowArray: createTexture failed');
101
+ this.texture = texture;
102
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
103
+ gl.texStorage3D(
104
+ gl.TEXTURE_2D_ARRAY,
105
+ 1,
106
+ gl.DEPTH_COMPONENT24,
107
+ OCTAHEDRAL_EDGE,
108
+ OCTAHEDRAL_EDGE,
109
+ this.layers,
110
+ );
111
+ /* One storage level and no filtering, so textureLod(..., 0.0) is the only fetch there is. */
112
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
113
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
114
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
115
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
116
+
117
+ const scratchTexture = gl.createTexture();
118
+ if (scratchTexture === null) throw new Error('PointShadowArray: createTexture failed');
119
+ this.scratchTexture = scratchTexture;
120
+ gl.bindTexture(gl.TEXTURE_2D, scratchTexture);
121
+ gl.texStorage2D(gl.TEXTURE_2D, 1, gl.DEPTH_COMPONENT24, faceSize, faceSize);
122
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
123
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
124
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
125
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
126
+
127
+ this.parked = createEmptyTexture2D(gl);
128
+
129
+ const scratchFramebuffer = gl.createFramebuffer();
130
+ if (scratchFramebuffer === null) throw new Error('PointShadowArray: createFramebuffer failed');
131
+ this.scratchFramebuffer = scratchFramebuffer;
132
+ gl.bindFramebuffer(gl.FRAMEBUFFER, scratchFramebuffer);
133
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, scratchTexture, 0);
134
+ /* Depth-only: without this WebGL expects a colour attachment. */
135
+ gl.drawBuffers([gl.NONE]);
136
+ gl.readBuffer(gl.NONE);
137
+
138
+ /*
139
+ * The resolve program, built **before** the completeness check below, because that check may
140
+ * return early on a lost context and every field has to be assigned by then. `PointShadowMap`
141
+ * and `ShadowMap` both hold that shape; here it is load-bearing rather than incidental, since
142
+ * `program`, `uniforms` and `vao` are all `readonly`.
143
+ */
144
+ this.program = compileProgram(
145
+ gl,
146
+ OCTAHEDRAL_RESOLVE_VERT,
147
+ OCTAHEDRAL_RESOLVE_FRAG,
148
+ 'octahedralResolve',
149
+ );
150
+ this.uniforms = uniformLocations(gl, this.program, 'octahedralResolve');
151
+ const vao = gl.createVertexArray();
152
+ if (vao === null) throw new Error('PointShadowArray: createVertexArray failed');
153
+ this.vao = vao;
154
+
155
+ const framebuffer = gl.createFramebuffer();
156
+ if (framebuffer === null) throw new Error('PointShadowArray: createFramebuffer failed');
157
+ this.framebuffer = framebuffer;
158
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
159
+ gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, texture, 0, 0);
160
+ gl.drawBuffers([gl.NONE]);
161
+ gl.readBuffer(gl.NONE);
162
+
163
+ /*
164
+ * Asked once, here, for the reason `pointShadowMap.ts` records at length: it is a synchronous
165
+ * query, so the driver must drain what it has queued before it can answer, and asking it per
166
+ * face put a pipeline flush inside the render loop for the life of the session — 95.6% of a
167
+ * 69 ms frame. Every layer shares one texture, one size and one format, so a configuration
168
+ * complete for layer 0 is complete for all of them, and nothing about that can change later.
169
+ */
170
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
171
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
172
+ /*
173
+ * A lost context reports every attachment unusable, and that is not a misconfiguration the
174
+ * caller can fix — see `planarReflection.ts`. Init still throws, because the context cannot
175
+ * be lost before it exists.
176
+ */
177
+ if (gl.isContextLost()) return;
178
+ throw new Error(`PointShadowArray: framebuffer incomplete (0x${status.toString(16)})`);
179
+ }
180
+
181
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
182
+ gl.bindTexture(gl.TEXTURE_2D, null);
183
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
184
+ }
185
+
186
+ /**
187
+ * Bind the scratch as the render target for one face of one bake, and clear it.
188
+ *
189
+ * **The previous face's resolve left the scratch bound for sampling, and it is about to be the
190
+ * target.** That is a rendering feedback loop, and WebGL2 answers a draw in one with
191
+ * `INVALID_OPERATION` and no pixels — which is not the resolve's own draw but the *casters*,
192
+ * because `depth.ts` declares `uPreviousShadowMap` on that unit and an active sampler is
193
+ * enough whether the shader branch reads it or not. Found by capturing `night-court` and
194
+ * `day-clock`, which bake while the shot is taken; `gilded-chamber` was silent, because it had
195
+ * nothing stale to bake.
196
+ *
197
+ * `beginShadowPass` carries the identical fix for the directional maps, and this is the same
198
+ * rule one level down. A complete 1x1 texture rather than `null`, because an unbound sampler
199
+ * is *incomplete* and a driver may fetch its descriptor before evaluating the branch that
200
+ * would have skipped it — see `emptyTexture.ts` for the card that page-faulted over it.
201
+ */
202
+ beginFace(gl: WebGL2RenderingContext): void {
203
+ gl.activeTexture(gl.TEXTURE0);
204
+ gl.bindTexture(gl.TEXTURE_2D, this.parked);
205
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.scratchFramebuffer);
206
+ gl.viewport(0, 0, this.faceSize, this.faceSize);
207
+ gl.clear(gl.DEPTH_BUFFER_BIT);
208
+ }
209
+
210
+ /**
211
+ * Write the scratch's contents into `layer`'s region for `face`.
212
+ *
213
+ * `depthFunc(ALWAYS)` because this is a copy and not a render. The layer already holds whatever
214
+ * the previous bake of this light left in it, so a fragment that lost a comparison would leave
215
+ * half of one image and half of another — a shadow baked around two different places at once,
216
+ * which is the failure `PointShadowImage.planBake` exists to prevent one level up.
217
+ *
218
+ * Allocates nothing: the rotation is a module-scope scratch, and the pass draws three vertices
219
+ * from an empty vertex array.
220
+ */
221
+ resolveFace(
222
+ gl: WebGL2RenderingContext,
223
+ layer: number,
224
+ face: number,
225
+ far: number,
226
+ near: number,
227
+ ): void {
228
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
229
+ gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, this.texture, 0, layer);
230
+ gl.viewport(0, 0, OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE);
231
+
232
+ gl.useProgram(this.program);
233
+ gl.bindVertexArray(this.vao);
234
+ gl.activeTexture(gl.TEXTURE0);
235
+ gl.bindTexture(gl.TEXTURE_2D, this.scratchTexture);
236
+ gl.uniform1i(this.uniforms['uFace'] ?? null, 0);
237
+ gl.uniform1i(this.uniforms['uFaceIndex'] ?? null, face);
238
+ gl.uniformMatrix3fv(
239
+ this.uniforms['uFaceRotation'] ?? null,
240
+ false,
241
+ pointShadowFaceRotation(face, faceRotation),
242
+ );
243
+ gl.uniform1f(this.uniforms['uFar'] ?? null, far);
244
+ gl.uniform1f(this.uniforms['uNear'] ?? null, near);
245
+ gl.uniform1f(this.uniforms['uEdge'] ?? null, OCTAHEDRAL_EDGE);
246
+
247
+ gl.disable(gl.CULL_FACE);
248
+ gl.enable(gl.DEPTH_TEST);
249
+ gl.depthMask(true);
250
+ /*
251
+ * **Saved and restored rather than put back to a named compare.** This used to end with
252
+ * `depthFunc(LESS)`, which was the frame's compare when it was written and stopped being it
253
+ * the moment the engine could draw reversed: after one point-shadow copy the whole rest of the
254
+ * frame tested the wrong way, and a scene with point shadows lost most of its pixels. Reading
255
+ * the state back costs one `getParameter` on a path that already binds a framebuffer, and it
256
+ * cannot go stale the way a constant can.
257
+ */
258
+ const wasDepthFunc = gl.getParameter(gl.DEPTH_FUNC) as number;
259
+ gl.depthFunc(gl.ALWAYS);
260
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
261
+ gl.depthFunc(wasDepthFunc);
262
+
263
+ gl.bindVertexArray(null);
264
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
265
+ }
266
+
267
+ dispose(gl: WebGL2RenderingContext): void {
268
+ gl.deleteFramebuffer(this.framebuffer);
269
+ gl.deleteFramebuffer(this.scratchFramebuffer);
270
+ gl.deleteTexture(this.texture);
271
+ gl.deleteTexture(this.scratchTexture);
272
+ gl.deleteTexture(this.parked);
273
+ gl.deleteProgram(this.program);
274
+ gl.deleteVertexArray(this.vao);
275
+ }
276
+ }
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Which point-shadow maps get to bake this frame, and in what order.
3
+ *
4
+ * Baking is six full passes over the static world per light, and the renderer used to
5
+ * do every stale one in the frame it noticed. That is fine in the steady state, where
6
+ * nothing is stale, and catastrophic on the frame it stops being true: walking into a
7
+ * courtyard makes eight lights stale at once, which is 48 passes in one frame. Measured on
8
+ * a fast machine at boot, that was two consecutive frames of 89 ms and 99 ms against an
9
+ * 8.3 ms budget — the hitch about a second after a page load, and a smaller one each
10
+ * time a new cluster of lamps comes into range.
11
+ *
12
+ * Spreading the same work over more frames costs nothing anybody can see. Eight lights
13
+ * at two faces a frame is 24 frames, a fifth of a second at 120 Hz, during which
14
+ * shadows resolve progressively instead of the whole game stopping.
15
+ *
16
+ * This module only decides the *order*. The renderer spends a face budget walking it,
17
+ * because lights need different numbers of faces depending on how far through a bake
18
+ * they already are.
19
+ */
20
+
21
+ /**
22
+ * Order the stale maps so the ones with nothing to show go first.
23
+ *
24
+ * A light whose map has never been baked contributes no shadow at all until it has one
25
+ * (see `PointShadowSystem.bind`), so every frame it waits is a frame with a visibly
26
+ * unlit lamp. A light that has merely drifted past the rebake tolerance is still
27
+ * sampling a perfectly reasonable map from a few centimetres away, and can wait.
28
+ * Serving the second kind first would hold a missing shadow hostage to a nearly
29
+ * invisible correction.
30
+ *
31
+ * Within each group the caller's order is preserved, which is the shading pass's own
32
+ * light order and therefore already sorted by how much each light matters.
33
+ *
34
+ * Writes into `out` and returns how many entries it wrote; allocation-free because this
35
+ * runs every frame.
36
+ */
37
+ export function planPointShadowBakes(
38
+ /** 1 where the map at that slot needs baking. */
39
+ stale: Uint8Array,
40
+ /** 1 where the map at that slot already holds a usable image. */
41
+ ready: Uint8Array,
42
+ count: number,
43
+ out: Int32Array,
44
+ /**
45
+ * 1 where this slot's map has gone stale on every recent frame.
46
+ *
47
+ * Optional: a caller that omits it gets the two-group order this had before.
48
+ */
49
+ chronic?: Uint8Array,
50
+ ): number {
51
+ let written = 0;
52
+ // Never baked: nothing to sample until this lands.
53
+ for (let slot = 0; slot < count && written < out.length; slot++) {
54
+ if (stale[slot] === 1 && ready[slot] !== 1) out[written++] = slot;
55
+ }
56
+ // Baked but drifted: correcting an image that is already close to right.
57
+ for (let slot = 0; slot < count && written < out.length; slot++) {
58
+ if (stale[slot] === 1 && ready[slot] === 1 && chronic?.[slot] !== 1) out[written++] = slot;
59
+ }
60
+ /*
61
+ * Last: the maps that will be stale again next frame whatever is done for them.
62
+ *
63
+ * A light that moves, or breathes its radius, invalidates its own map every frame — so
64
+ * a bake buys it one frame and is owed again immediately. Ordered by the caller's
65
+ * importance alone, which is all the drifted group above uses, such a light sits
66
+ * permanently ahead of a static one that drifted once and would then stay correct for
67
+ * an hour; it takes the spread budget forever and the static one never gets its
68
+ * correction. Importance is the right tie-break between two maps that will *keep* what
69
+ * they are given, and the wrong one when only one of them will.
70
+ *
71
+ * They are still served, and served in full when budget is left over, so a light that
72
+ * settles catches up on the next frame. They simply cannot hold a settling light
73
+ * hostage any more.
74
+ *
75
+ * This is the scheduling half of the problem only. Whether a light is *worth* a cubemap
76
+ * at all — a floor-level marker, a lamp riding a camera, a creature standing inside
77
+ * its own glow — is a question about the content, and `castsShadow` is where a consumer
78
+ * answers it. No ordering can.
79
+ */
80
+ if (chronic !== undefined) {
81
+ for (let slot = 0; slot < count && written < out.length; slot++) {
82
+ if (stale[slot] === 1 && ready[slot] === 1 && chronic[slot] === 1) out[written++] = slot;
83
+ }
84
+ }
85
+ return written;
86
+ }
87
+
88
+ /**
89
+ * The shaded lights that also cast, in the order they were shaded.
90
+ *
91
+ * `castsShadow: false` says a light is not worth a cubemap. `selectPointLights` honours
92
+ * that when it builds the *eligible* list, and that was taken for the whole promise — but
93
+ * the shaded set is a different list, a caller hands it to `updatePointShadows` as the set
94
+ * to bind, and a light in it was given a pool slot and baked whatever it had declared. So
95
+ * the flag held for a lamp out of range and quietly failed for the one in front of you,
96
+ * which is the only one whose bake is visible.
97
+ *
98
+ * It showed up as a shadow with nothing to throw it — a lamp that rides the camera
99
+ * declines to cast for exactly that reason, and cast anyway.
100
+ *
101
+ * Writes into `out` and returns how many it wrote; allocation-free, because this runs
102
+ * every frame.
103
+ */
104
+ export function selectCastingLights(
105
+ lights: readonly { castsShadow?: boolean }[],
106
+ activeWorldIndices: Int32Array,
107
+ activeCount: number,
108
+ out: Int32Array,
109
+ ): number {
110
+ let written = 0;
111
+ for (let i = 0; i < activeCount && written < out.length; i++) {
112
+ const worldIndex = activeWorldIndices[i] ?? -1;
113
+ if (worldIndex < 0) continue;
114
+ if (lights[worldIndex]?.castsShadow === false) continue;
115
+ out[written++] = worldIndex;
116
+ }
117
+ return written;
118
+ }
119
+
120
+ /**
121
+ * How many consecutive frames a slot must be stale before it is treated as chronically so.
122
+ *
123
+ * A light that drifts past the rebake tolerance every frame — a wandering flame — would
124
+ * otherwise take a bake every frame and starve everything else. Three frames is long enough
125
+ * that a genuine move still rebakes promptly and short enough that a chronic one is demoted
126
+ * before it has cost much.
127
+ */
128
+ const CHRONIC_STALE_FRAMES = 3;
129
+
130
+ /** The per-slot scratch a bake round needs. Caller-owned; this runs every frame. */
131
+ export interface BakeScratch {
132
+ readonly stale: Uint8Array;
133
+ readonly ready: Uint8Array;
134
+ readonly order: Int32Array;
135
+ readonly chronic: Uint8Array;
136
+ readonly staleRun: Uint8Array;
137
+ readonly staleOwner: Int32Array;
138
+ }
139
+
140
+ export function createBakeScratch(pool: number): BakeScratch {
141
+ return {
142
+ stale: new Uint8Array(pool),
143
+ ready: new Uint8Array(pool),
144
+ order: new Int32Array(pool),
145
+ chronic: new Uint8Array(pool),
146
+ staleRun: new Uint8Array(pool),
147
+ staleOwner: new Int32Array(pool).fill(-1),
148
+ };
149
+ }
150
+
151
+ /** What a pool must expose for a bake round to be planned over it. */
152
+ export interface BakeablePool<M> {
153
+ readonly pooledCount: number;
154
+ readonly sampledCount: number;
155
+ readonly liveMapCount: number;
156
+ pooledLight(slot: number): number;
157
+ mapForLight(lightIndex: number): M | undefined;
158
+ liveOwner(slot: number): number;
159
+ liveMap(slot: number): M | undefined;
160
+ }
161
+
162
+ /** The one thing a bake round cannot do itself: put six faces of a world into a cubemap. */
163
+ export type BakeFaces<M, L> = (map: M, light: L, casters: unknown, maxFaces: number) => number;
164
+
165
+ /** What a map must answer for staleness to be decided. */
166
+ export interface StaleCheck {
167
+ hasBaked: boolean;
168
+ matchesSource(
169
+ x: number,
170
+ y: number,
171
+ z: number,
172
+ range: number,
173
+ near: number,
174
+ sourceRadius: number,
175
+ tolerance: number,
176
+ ): boolean;
177
+ }
178
+
179
+ /** The light fields a bake round reads. */
180
+ export interface BakeableLight {
181
+ x: number;
182
+ y: number;
183
+ z: number;
184
+ radius: number;
185
+ shadowNear: number;
186
+ sourceRadius: number;
187
+ }
188
+
189
+ /**
190
+ * Spend a frame's face budget across the pool, then refresh the live maps.
191
+ *
192
+ * **Every rule in here was bought with a measured frame and none of it is about a device.**
193
+ * Bakes are spread rather than done the instant they are noticed, because walking into a courtyard
194
+ * makes eight lights go stale at once — 48 passes over the static world in one frame, measured
195
+ * at 89 ms and 99 ms in two consecutive frames against an 8.3 ms budget. A slot that has never
196
+ * baked and is being *sampled* jumps the queue with the whole six, because a light with no
197
+ * image contributes nothing and a partial cubemap is worse than none; one such jump a frame, so
198
+ * a cluster coming into range cannot spend the whole budget at once. A slot that is stale every
199
+ * frame is demoted after three, because a wandering flame would otherwise starve the queue.
200
+ *
201
+ * A second implementation of any of that is a backend whose shadows arrive at different moments
202
+ * — which is not something a parity capture would attribute, because both frames look plausible.
203
+ * Hence one function, and `bake` as the only thing either backend supplies.
204
+ */
205
+ export function runPointShadowBakes<M extends StaleCheck, L extends BakeableLight>(
206
+ pool: BakeablePool<M>,
207
+ lights: readonly L[],
208
+ facesPerFrame: number,
209
+ liveFacesPerFrame: number,
210
+ rebakeDistance: number,
211
+ faceCount: number,
212
+ scratch: BakeScratch,
213
+ staticCasters: unknown,
214
+ dynamicCasters: unknown,
215
+ bake: BakeFaces<M, L>,
216
+ ): void {
217
+ /*
218
+ * Across everything holding a slot, not only what is being shaded. A warm light baked now is
219
+ * a light that joins the sampled set without a six-face bill — which is the on/off a lamp
220
+ * used to make as it came into range.
221
+ */
222
+ const count = Math.min(pool.pooledCount, scratch.stale.length);
223
+ for (let slot = 0; slot < count; slot++) {
224
+ const lightIndex = pool.pooledLight(slot);
225
+ const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
226
+ const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
227
+ const stale =
228
+ light !== undefined &&
229
+ map !== undefined &&
230
+ !map.matchesSource(
231
+ light.x,
232
+ light.y,
233
+ light.z,
234
+ light.radius,
235
+ light.shadowNear,
236
+ light.sourceRadius,
237
+ rebakeDistance,
238
+ );
239
+ scratch.stale[slot] = stale ? 1 : 0;
240
+ scratch.ready[slot] = map !== undefined && map.hasBaked ? 1 : 0;
241
+
242
+ /* The run is per borrower: a slot changing hands starts its patience over. */
243
+ if (scratch.staleOwner[slot] !== lightIndex) {
244
+ scratch.staleOwner[slot] = lightIndex;
245
+ scratch.staleRun[slot] = 0;
246
+ }
247
+ const run = stale ? Math.min((scratch.staleRun[slot] ?? 0) + 1, CHRONIC_STALE_FRAMES) : 0;
248
+ scratch.staleRun[slot] = run;
249
+ scratch.chronic[slot] = run >= CHRONIC_STALE_FRAMES ? 1 : 0;
250
+ }
251
+
252
+ const planned = planPointShadowBakes(
253
+ scratch.stale,
254
+ scratch.ready,
255
+ count,
256
+ scratch.order,
257
+ scratch.chronic,
258
+ );
259
+
260
+ let faces = facesPerFrame;
261
+ let urgentSpent = false;
262
+ for (let i = 0; i < planned && faces > 0; i++) {
263
+ const slot = scratch.order[i] ?? -1;
264
+ /*
265
+ * `pooledLight`, matching the loop that filled `stale`: resolving through the sampled list
266
+ * here would bake the wrong light for every warm slot.
267
+ */
268
+ const lightIndex = slot >= 0 ? pool.pooledLight(slot) : -1;
269
+ const light = lightIndex >= 0 ? lights[lightIndex] : undefined;
270
+ const map = lightIndex >= 0 ? pool.mapForLight(lightIndex) : undefined;
271
+ if (light === undefined || map === undefined) continue;
272
+
273
+ const cold = slot < pool.sampledCount && scratch.ready[slot] === 0;
274
+ const budget = cold && !urgentSpent ? faceCount : faces;
275
+ if (cold && !urgentSpent) urgentSpent = true;
276
+ faces -= bake(map, light, staticCasters, budget);
277
+ }
278
+
279
+ /*
280
+ * Live maps contain movers only and are composed with the static maps in the shader. A second
281
+ * map exists only during an ownership crossfade.
282
+ *
283
+ * **Unlike a static map there is no staleness test to make** — the caster moved, that is what
284
+ * makes it live — **but there does have to be a ceiling, and there was not one.** This loop
285
+ * asked for the whole cubemap, per live map, every frame, outside `facesPerFrame` entirely.
286
+ * Measured on the consumer and on three of the engine's seven demos: `pointShadow.face`
287
+ * six times a frame, for ever, in scenes that were otherwise nine to fourteen passes. And
288
+ * `LIVE_POINT_SHADOW_MAPS` is two with the second waking up during an ownership handoff, which
289
+ * is precisely what running past a row of lamps is — so a courtyard paid twelve full passes over
290
+ * the dynamic casters a frame, which is where "it is only slow in the courtyard" came from.
291
+ *
292
+ * The faces round-robin under the budget instead, so a mover's shadow finishes over two or
293
+ * three frames rather than all inside one. What that costs is a shadow a frame or two behind
294
+ * a character. What it bought back was the frame rate to see it at all.
295
+ */
296
+ let liveFaces = Math.max(1, liveFacesPerFrame);
297
+ for (let slot = 0; slot < pool.liveMapCount && liveFaces > 0; slot++) {
298
+ const owner = pool.liveOwner(slot);
299
+ const light = owner >= 0 ? lights[owner] : undefined;
300
+ const map = pool.liveMap(slot);
301
+ if (light === undefined || map === undefined) continue;
302
+ /* Never wider than the cube itself: asking for more is asking for faces that do not exist. */
303
+ liveFaces -= bake(map, light, dynamicCasters, Math.min(liveFaces, faceCount));
304
+ }
305
+ }