@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,378 @@
1
+ /**
2
+ * Occlusion culling: a small depth buffer of declared occluders, a max pyramid over it, and a
3
+ * rectangle test per object.
4
+ *
5
+ * **On the CPU, and that is the decision the whole design turns on.** The two obvious answers are
6
+ * hardware occlusion queries and a GPU depth pyramid, and each of them fails a rule this engine
7
+ * already holds. A query answers a frame late and needs a bounding-box draw per candidate, so a
8
+ * newly-visible object pops in — and the two backends spell it differently, which is the parity
9
+ * risk `AGENTS.md` names. A GPU pyramid over the frame's own depth has to be *read back* to cull on
10
+ * the CPU, which stalls, or tested in a compute shader, which WebGL2 does not have at all. Neither
11
+ * of them can be tested without a GPU, and this repository's whole culling story — `sphereInFrustum`,
12
+ * `boundsVisible`, `lodForBounds` — is assertions over arithmetic.
13
+ *
14
+ * So: **the consumer declares its occluders** — a wall, a building, a terrain slab, the few large
15
+ * things a scene is actually hidden by — and this rasterises them into a buffer a few hundred
16
+ * texels wide. *What that gives up* is that a small object never occludes anything: a crowd does
17
+ * not hide the crowd behind it. *What would reverse it* is a scene whose occlusion is genuinely
18
+ * made of small things, where the answer is a query-based scheme and its one-frame latency.
19
+ *
20
+ * **Everything here errs toward drawing.** A cull that is wrong in the other direction is a hole in
21
+ * the world, and there is no threshold that makes it acceptable. Three constructions keep it that
22
+ * way and each is worth naming:
23
+ *
24
+ * - **Back faces, not front.** A box hides whatever is behind its *far* surface, so the buffer
25
+ * holds the depth of the occluder's back and an object is culled only when it is deeper than
26
+ * that. Rasterising the near face would cull everything inside the box as well.
27
+ * - **Eroded by one texel.** A triangle sampled at texel centres covers up to half a texel more
28
+ * than it should at every silhouette. One dilation of the *unwritten* texels takes that back, at
29
+ * the cost of a one-texel border of occluder nobody misses.
30
+ * - **A max pyramid, tested against the object's nearest point.** The object is culled only if
31
+ * every texel its rectangle touches is already covered by something nearer, which is what taking
32
+ * the maximum bound over the rectangle and comparing the object's minimum depth says.
33
+ */
34
+ /** What an unwritten texel holds: the far plane, which occludes nothing. */
35
+ const FAR = 1;
36
+ export class OcclusionBuffer {
37
+ /**
38
+ * The pyramid, level 0 first, each level a quarter of the one before.
39
+ *
40
+ * One allocation per level rather than one buffer with offsets, because the test indexes a level
41
+ * by its own width and an offset table would be a second thing to keep in step.
42
+ */
43
+ levels = [];
44
+ widths = [];
45
+ heights = [];
46
+ built = false;
47
+ occluders = 0;
48
+ /** The view-projection this frame's occluders were rasterised through. */
49
+ viewProj = new Float32Array(16);
50
+ constructor(options) {
51
+ this.resize(options);
52
+ }
53
+ get width() {
54
+ return this.widths[0] ?? 0;
55
+ }
56
+ get height() {
57
+ return this.heights[0] ?? 0;
58
+ }
59
+ /** How many occluders were declared this frame. Zero means every test answers "draw it". */
60
+ get declared() {
61
+ return this.occluders;
62
+ }
63
+ /**
64
+ * Rebuild the pyramid for a new size. Called when the drawing buffer's aspect changes.
65
+ *
66
+ * Levels stop at 1x1: the coarsest level is one texel covering the whole frame, which is what a
67
+ * rectangle spanning the screen is tested against.
68
+ */
69
+ resize(options) {
70
+ const width = Math.max(1, Math.round(options.width));
71
+ const height = Math.max(1, Math.round(options.height));
72
+ if (width === this.widths[0] && height === this.heights[0])
73
+ return;
74
+ this.levels = [];
75
+ this.widths = [];
76
+ this.heights = [];
77
+ let w = width;
78
+ let h = height;
79
+ for (;;) {
80
+ this.levels.push(new Float32Array(w * h));
81
+ this.widths.push(w);
82
+ this.heights.push(h);
83
+ if (w === 1 && h === 1)
84
+ break;
85
+ w = Math.max(1, w >> 1);
86
+ h = Math.max(1, h >> 1);
87
+ }
88
+ this.built = false;
89
+ }
90
+ /** Start a frame: clear to the far plane and take the matrix everything will be projected by. */
91
+ begin(viewProj) {
92
+ const base = this.levels[0];
93
+ if (base !== undefined)
94
+ base.fill(FAR);
95
+ for (let i = 0; i < 16; i++)
96
+ this.viewProj[i] = viewProj[i] ?? 0;
97
+ this.built = false;
98
+ this.occluders = 0;
99
+ }
100
+ /**
101
+ * Declare one occluder: a box in local space, placed by a model matrix.
102
+ *
103
+ * **A box rather than the mesh**, which is the same bargain a bounding sphere makes for the
104
+ * frustum: an occluder that is smaller than the thing it stands for is conservative, and a
105
+ * consumer knows the box that fits inside its wall. *What would make it wrong* is a consumer
106
+ * handing the mesh's own bounds for a shape with a hole in it, which would occlude through the
107
+ * hole — so the parameter is the box you may safely be hidden by, not the box you occupy.
108
+ */
109
+ addOccluder(min, max, model) {
110
+ for (let corner = 0; corner < 8; corner++) {
111
+ const x = corner & 1 ? (max[0] ?? 0) : (min[0] ?? 0);
112
+ const y = corner & 2 ? (max[1] ?? 0) : (min[1] ?? 0);
113
+ const z = corner & 4 ? (max[2] ?? 0) : (min[2] ?? 0);
114
+ const wx = (model[0] ?? 0) * x + (model[4] ?? 0) * y + (model[8] ?? 0) * z + (model[12] ?? 0);
115
+ const wy = (model[1] ?? 0) * x + (model[5] ?? 0) * y + (model[9] ?? 0) * z + (model[13] ?? 0);
116
+ const wz = (model[2] ?? 0) * x + (model[6] ?? 0) * y + (model[10] ?? 0) * z + (model[14] ?? 0);
117
+ if (!this.project(wx, wy, wz, corner))
118
+ return;
119
+ }
120
+ this.occluders++;
121
+ /*
122
+ * The six faces, wound so that each is counter-clockwise seen from outside. Only the ones
123
+ * facing *away* from the camera are rasterised: a box hides what is behind its far surface,
124
+ * and the near one would cull the box's own interior.
125
+ */
126
+ for (let face = 0; face < 6; face++) {
127
+ const a = FACES[face * 4] ?? 0;
128
+ const b = FACES[face * 4 + 1] ?? 0;
129
+ const c = FACES[face * 4 + 2] ?? 0;
130
+ const d = FACES[face * 4 + 3] ?? 0;
131
+ /* Screen-space winding: a back face comes out clockwise once projected. */
132
+ if (signedArea(CORNERS, a, b, c) >= 0)
133
+ continue;
134
+ this.triangle(a, b, c);
135
+ this.triangle(a, c, d);
136
+ }
137
+ this.built = false;
138
+ }
139
+ /**
140
+ * Whether a bounding sphere is entirely behind the declared occluders.
141
+ *
142
+ * **False whenever anything is uncertain**, which is every case the arithmetic cannot settle: no
143
+ * occluders, a sphere crossing the near plane, a rectangle off the side of the frame. Drawing
144
+ * something hidden costs a draw call; culling something visible is a hole.
145
+ */
146
+ occluded(bounds, model) {
147
+ if (this.occluders === 0)
148
+ return false;
149
+ if (!this.built)
150
+ this.buildPyramid();
151
+ const cx = bounds.centre[0] ?? 0;
152
+ const cy = bounds.centre[1] ?? 0;
153
+ const cz = bounds.centre[2] ?? 0;
154
+ const m0 = model[0] ?? 0;
155
+ const m1 = model[1] ?? 0;
156
+ const m2 = model[2] ?? 0;
157
+ const m4 = model[4] ?? 0;
158
+ const m5 = model[5] ?? 0;
159
+ const m6 = model[6] ?? 0;
160
+ const m8 = model[8] ?? 0;
161
+ const m9 = model[9] ?? 0;
162
+ const m10 = model[10] ?? 0;
163
+ const x = m0 * cx + m4 * cy + m8 * cz + (model[12] ?? 0);
164
+ const y = m1 * cx + m5 * cy + m9 * cz + (model[13] ?? 0);
165
+ const z = m2 * cx + m6 * cy + m10 * cz + (model[14] ?? 0);
166
+ /* The same largest-axis rule `boundsVisible` uses, and for the same reason. */
167
+ const sx = Math.sqrt(m0 * m0 + m1 * m1 + m2 * m2);
168
+ const sy = Math.sqrt(m4 * m4 + m5 * m5 + m6 * m6);
169
+ const sz = Math.sqrt(m8 * m8 + m9 * m9 + m10 * m10);
170
+ const radius = bounds.radius * Math.max(sx, sy, sz);
171
+ /* The cube that contains the sphere, which contains the object. Conservative twice over. */
172
+ let minX = Infinity;
173
+ let minY = Infinity;
174
+ let minZ = Infinity;
175
+ let maxX = -Infinity;
176
+ let maxY = -Infinity;
177
+ for (let corner = 0; corner < 8; corner++) {
178
+ const px = corner & 1 ? x + radius : x - radius;
179
+ const py = corner & 2 ? y + radius : y - radius;
180
+ const pz = corner & 4 ? z + radius : z - radius;
181
+ if (!this.project(px, py, pz, 0))
182
+ return false;
183
+ minX = Math.min(minX, CORNERS[0] ?? 0);
184
+ maxX = Math.max(maxX, CORNERS[0] ?? 0);
185
+ minY = Math.min(minY, CORNERS[1] ?? 0);
186
+ maxY = Math.max(maxY, CORNERS[1] ?? 0);
187
+ minZ = Math.min(minZ, CORNERS[2] ?? 0);
188
+ }
189
+ const width = this.widths[0] ?? 1;
190
+ const height = this.heights[0] ?? 1;
191
+ /* Off the side of the frame: the frustum test owns that answer, and this one abstains. */
192
+ if (minX < 0 || minY < 0 || maxX > width || maxY > height)
193
+ return false;
194
+ /*
195
+ * The coarsest level whose texel is at least as wide as the rectangle, so the test reads at
196
+ * most two texels each way. `Math.log2` would say the same thing and is one of the calls this
197
+ * repository's determinism gate refuses elsewhere; a shift loop says it in integers.
198
+ */
199
+ let level = 0;
200
+ let span = Math.max(maxX - minX, maxY - minY);
201
+ while (span > 1 && level + 1 < this.levels.length) {
202
+ span *= 0.5;
203
+ level++;
204
+ }
205
+ const buffer = this.levels[level];
206
+ const lw = this.widths[level] ?? 1;
207
+ const lh = this.heights[level] ?? 1;
208
+ if (buffer === undefined)
209
+ return false;
210
+ const scale = 1 / (1 << level);
211
+ const x0 = Math.max(0, Math.floor(minX * scale));
212
+ const y0 = Math.max(0, Math.floor(minY * scale));
213
+ const x1 = Math.min(lw - 1, Math.floor(maxX * scale));
214
+ const y1 = Math.min(lh - 1, Math.floor(maxY * scale));
215
+ let bound = -Infinity;
216
+ for (let ty = y0; ty <= y1; ty++) {
217
+ for (let tx = x0; tx <= x1; tx++) {
218
+ const value = buffer[ty * lw + tx] ?? FAR;
219
+ if (value > bound)
220
+ bound = value;
221
+ }
222
+ }
223
+ /* Culled only when the object's nearest point is behind everything covering its rectangle. */
224
+ return minZ > bound;
225
+ }
226
+ /**
227
+ * A world point into buffer coordinates and depth, written into `CORNERS` at `slot`.
228
+ *
229
+ * Returns false for a point at or behind the eye, where the perspective divide has no meaning —
230
+ * and a false anywhere abandons the whole shape, occluder or occludee, because a partial
231
+ * projection is exactly the kind of half-answer that produces a hole.
232
+ */
233
+ project(x, y, z, slot) {
234
+ const m = this.viewProj;
235
+ const cx = (m[0] ?? 0) * x + (m[4] ?? 0) * y + (m[8] ?? 0) * z + (m[12] ?? 0);
236
+ const cy = (m[1] ?? 0) * x + (m[5] ?? 0) * y + (m[9] ?? 0) * z + (m[13] ?? 0);
237
+ const cz = (m[2] ?? 0) * x + (m[6] ?? 0) * y + (m[10] ?? 0) * z + (m[14] ?? 0);
238
+ const cw = (m[3] ?? 0) * x + (m[7] ?? 0) * y + (m[11] ?? 0) * z + (m[15] ?? 0);
239
+ if (cw <= 1e-6)
240
+ return false;
241
+ const inverse = 1 / cw;
242
+ CORNERS[slot * 3] = (cx * inverse * 0.5 + 0.5) * (this.widths[0] ?? 1);
243
+ CORNERS[slot * 3 + 1] = (cy * inverse * 0.5 + 0.5) * (this.heights[0] ?? 1);
244
+ CORNERS[slot * 3 + 2] = cz * inverse;
245
+ return true;
246
+ }
247
+ /**
248
+ * One triangle of an occluder's back face into level 0, keeping the nearest depth per texel.
249
+ *
250
+ * A half-space rasteriser over the triangle's own bounding box, sampling at texel centres. Depth
251
+ * is interpolated in screen space rather than perspective-correct — which for a *bound* is the
252
+ * safe direction only if it never under-estimates, so the depth written is the plane's value at
253
+ * the texel centre plus half a texel of gradient each way. A bound that is too far occludes less.
254
+ */
255
+ triangle(a, b, c) {
256
+ const buffer = this.levels[0];
257
+ if (buffer === undefined)
258
+ return;
259
+ const width = this.widths[0] ?? 1;
260
+ const height = this.heights[0] ?? 1;
261
+ const ax = CORNERS[a * 3] ?? 0;
262
+ const ay = CORNERS[a * 3 + 1] ?? 0;
263
+ const az = CORNERS[a * 3 + 2] ?? 0;
264
+ const bx = CORNERS[b * 3] ?? 0;
265
+ const by = CORNERS[b * 3 + 1] ?? 0;
266
+ const bz = CORNERS[b * 3 + 2] ?? 0;
267
+ const cx = CORNERS[c * 3] ?? 0;
268
+ const cy = CORNERS[c * 3 + 1] ?? 0;
269
+ const cz = CORNERS[c * 3 + 2] ?? 0;
270
+ const area = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);
271
+ if (area === 0)
272
+ return;
273
+ const inverseArea = 1 / area;
274
+ const x0 = Math.max(0, Math.floor(Math.min(ax, bx, cx)));
275
+ const x1 = Math.min(width - 1, Math.ceil(Math.max(ax, bx, cx)));
276
+ const y0 = Math.max(0, Math.floor(Math.min(ay, by, cy)));
277
+ const y1 = Math.min(height - 1, Math.ceil(Math.max(ay, by, cy)));
278
+ for (let ty = y0; ty <= y1; ty++) {
279
+ const py = ty + 0.5;
280
+ for (let tx = x0; tx <= x1; tx++) {
281
+ const px = tx + 0.5;
282
+ const w0 = ((bx - ax) * (py - ay) - (by - ay) * (px - ax)) * inverseArea;
283
+ const w1 = ((cx - bx) * (py - by) - (cy - by) * (px - bx)) * inverseArea;
284
+ const w2 = ((ax - cx) * (py - cy) - (ay - cy) * (px - cx)) * inverseArea;
285
+ if (w0 < 0 || w1 < 0 || w2 < 0)
286
+ continue;
287
+ /* Barycentrics: w1 belongs to a, w2 to b, w0 to c. */
288
+ const depth = w1 * az + w2 * bz + w0 * cz;
289
+ const at = ty * width + tx;
290
+ if (depth < (buffer[at] ?? FAR))
291
+ buffer[at] = depth;
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Erode by one texel, then reduce by maximum into every coarser level.
297
+ *
298
+ * **The erosion is what makes the whole thing conservative** and it costs one pass: a triangle
299
+ * sampled at texel centres covers up to half a texel too much at every silhouette, so any texel
300
+ * next to an unwritten one gives its bound back. The reduction is a maximum because the test asks
301
+ * "is every texel under this rectangle already covered by something nearer", and a maximum over
302
+ * children answers that for the parent.
303
+ */
304
+ buildPyramid() {
305
+ const base = this.levels[0];
306
+ const width = this.widths[0] ?? 1;
307
+ const height = this.heights[0] ?? 1;
308
+ if (base !== undefined) {
309
+ if (ERODED.length < base.length)
310
+ ERODED = new Float32Array(base.length);
311
+ for (let y = 0; y < height; y++) {
312
+ for (let x = 0; x < width; x++) {
313
+ let value = base[y * width + x] ?? FAR;
314
+ for (let dy = -1; dy <= 1 && value < FAR; dy++) {
315
+ const ny = y + dy;
316
+ if (ny < 0 || ny >= height) {
317
+ value = FAR;
318
+ break;
319
+ }
320
+ for (let dx = -1; dx <= 1; dx++) {
321
+ const nx = x + dx;
322
+ if (nx < 0 || nx >= width) {
323
+ value = FAR;
324
+ break;
325
+ }
326
+ const neighbour = base[ny * width + nx] ?? FAR;
327
+ if (neighbour > value)
328
+ value = neighbour;
329
+ }
330
+ }
331
+ ERODED[y * width + x] = value;
332
+ }
333
+ }
334
+ base.set(ERODED.subarray(0, base.length));
335
+ }
336
+ for (let level = 1; level < this.levels.length; level++) {
337
+ const source = this.levels[level - 1];
338
+ const target = this.levels[level];
339
+ const sw = this.widths[level - 1] ?? 1;
340
+ const sh = this.heights[level - 1] ?? 1;
341
+ const tw = this.widths[level] ?? 1;
342
+ const th = this.heights[level] ?? 1;
343
+ if (source === undefined || target === undefined)
344
+ continue;
345
+ for (let y = 0; y < th; y++) {
346
+ for (let x = 0; x < tw; x++) {
347
+ const sx = Math.min(x * 2, sw - 1);
348
+ const sy = Math.min(y * 2, sh - 1);
349
+ const sx1 = Math.min(sx + 1, sw - 1);
350
+ const sy1 = Math.min(sy + 1, sh - 1);
351
+ target[y * tw + x] = Math.max(source[sy * sw + sx] ?? FAR, source[sy * sw + sx1] ?? FAR, source[sy1 * sw + sx] ?? FAR, source[sy1 * sw + sx1] ?? FAR);
352
+ }
353
+ }
354
+ }
355
+ this.built = true;
356
+ }
357
+ }
358
+ /** Eight projected corners, xy in buffer texels and z in normalised device coordinates. */
359
+ const CORNERS = new Float64Array(24);
360
+ /** Scratch for the erosion, grown to whatever the largest buffer has needed. */
361
+ let ERODED = new Float32Array(0);
362
+ /**
363
+ * The six faces of a corner-indexed box, each wound counter-clockwise seen from outside.
364
+ *
365
+ * Corner `i` takes `max` on axis `k` where bit `k` of `i` is set, which is the same numbering
366
+ * `boxShape` uses in the physics package — written out rather than derived, because the loop that
367
+ * derives it is longer than the table.
368
+ */
369
+ const FACES = new Uint8Array([
370
+ 1, 3, 7, 5, 4, 6, 2, 0, 2, 6, 7, 3, 0, 1, 5, 4, 4, 5, 7, 6, 0, 2, 3, 1,
371
+ ]);
372
+ /** Twice the signed area of a projected triangle: positive is counter-clockwise on screen. */
373
+ function signedArea(corners, a, b, c) {
374
+ const ax = corners[a * 3] ?? 0;
375
+ const ay = corners[a * 3 + 1] ?? 0;
376
+ return (((corners[b * 3] ?? 0) - ax) * ((corners[c * 3 + 1] ?? 0) - ay) -
377
+ ((corners[b * 3 + 1] ?? 0) - ay) * ((corners[c * 3] ?? 0) - ax));
378
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Order-independent transparency on WebGL2: two targets, two passes over the same geometry, and a
3
+ * resolve.
4
+ *
5
+ * **The accumulation and the revealage are two blend states**, and a single pass cannot hold two.
6
+ * Writing both from one pass needs a second fragment output, which is another `flatFrag`
7
+ * permutation — measured at about 247 KB gzipped and paid by every consumer whether or not they
8
+ * enable this. Submitting the geometry twice costs the frames that asked for the effect and
9
+ * nothing else, which is why `TranslucentQueue` exists.
10
+ *
11
+ * **Both passes depth-test against the opaque scene and neither writes depth.** They borrow the
12
+ * scene target's own depth texture rather than allocating one, so a pane behind a wall is rejected
13
+ * exactly where the wall is — and because both passes share it, they cover precisely the same
14
+ * fragments.
15
+ *
16
+ * **The revealage pass draws with the ordinary shader.** Its blend is `(ZERO,
17
+ * ONE_MINUS_SRC_ALPHA)`, so whatever colour the fragment computed is multiplied away and only its
18
+ * alpha reaches the target. That is deliberate rather than thrifty: both passes run the same code
19
+ * to decide what alpha a fragment has, so they cannot disagree about it. The cost is that the
20
+ * lighting is computed twice for translucent surfaces, which is stated here rather than hidden.
21
+ */
22
+ export declare class OitPass {
23
+ private readonly gl;
24
+ private readonly program;
25
+ private readonly uniforms;
26
+ private readonly vao;
27
+ private accum;
28
+ private reveal;
29
+ private accumFbo;
30
+ private revealFbo;
31
+ private width;
32
+ private height;
33
+ private depth;
34
+ /**
35
+ * Whether the context will render to a half-float colour target.
36
+ *
37
+ * **Asked here rather than taken from the scene target**, which is a different question: the
38
+ * scene is float only where a consumer asked for `hdrScene`, and this needs one either way. The
39
+ * accumulation is a *sum* of colour times weight and the weight reaches three thousand, so a
40
+ * single bright layer overflows eight bits immediately and every pane comes out white — an
41
+ * eight-bit fallback is not a quieter version of this effect, so where the extension is absent
42
+ * it refuses and says so once.
43
+ */
44
+ private readonly floatColor;
45
+ constructor(gl: WebGL2RenderingContext);
46
+ /** Whether this context can run the effect at all. See `floatColor`. */
47
+ get available(): boolean;
48
+ private ensureSize;
49
+ /**
50
+ * Run the translucent set into the two buffers.
51
+ *
52
+ * `submit` is called twice with the weighting flag it should set: once accumulating, once
53
+ * multiplying revealage. Depth writes are off for both and restored after, because a translucent
54
+ * surface that wrote depth would hide the ones behind it and there would be nothing to blend.
55
+ */
56
+ accumulateOit(width: number, height: number, depth: WebGLTexture, submit: (weighted: boolean) => void): void;
57
+ /**
58
+ * Composite the two buffers over whatever framebuffer is bound.
59
+ *
60
+ * **The blend does the compositing, not a texture read.** `(ONE_MINUS_SRC_ALPHA, SRC_ALPHA)`
61
+ * against a fragment carrying the average colour and the revealage computes
62
+ * `average * (1 - reveal) + scene * reveal`, which is the resolve — so this pass never samples
63
+ * the target it is writing, and cannot be caught in the feedback loop that would be.
64
+ */
65
+ resolveOit(): void;
66
+ dispose(): void;
67
+ }
@@ -0,0 +1,213 @@
1
+ import { compileProgram, uniformLocations } from './shader.js';
2
+ import { FULLSCREEN_VERT } from './shaders/fullscreen.js';
3
+ import { OIT_RESOLVE_FRAG } from './shaders/oitResolve.js';
4
+ /**
5
+ * Order-independent transparency on WebGL2: two targets, two passes over the same geometry, and a
6
+ * resolve.
7
+ *
8
+ * **The accumulation and the revealage are two blend states**, and a single pass cannot hold two.
9
+ * Writing both from one pass needs a second fragment output, which is another `flatFrag`
10
+ * permutation — measured at about 247 KB gzipped and paid by every consumer whether or not they
11
+ * enable this. Submitting the geometry twice costs the frames that asked for the effect and
12
+ * nothing else, which is why `TranslucentQueue` exists.
13
+ *
14
+ * **Both passes depth-test against the opaque scene and neither writes depth.** They borrow the
15
+ * scene target's own depth texture rather than allocating one, so a pane behind a wall is rejected
16
+ * exactly where the wall is — and because both passes share it, they cover precisely the same
17
+ * fragments.
18
+ *
19
+ * **The revealage pass draws with the ordinary shader.** Its blend is `(ZERO,
20
+ * ONE_MINUS_SRC_ALPHA)`, so whatever colour the fragment computed is multiplied away and only its
21
+ * alpha reaches the target. That is deliberate rather than thrifty: both passes run the same code
22
+ * to decide what alpha a fragment has, so they cannot disagree about it. The cost is that the
23
+ * lighting is computed twice for translucent surfaces, which is stated here rather than hidden.
24
+ */
25
+ export class OitPass {
26
+ gl;
27
+ program;
28
+ uniforms;
29
+ vao;
30
+ accum = null;
31
+ reveal = null;
32
+ accumFbo = null;
33
+ revealFbo = null;
34
+ width = 0;
35
+ height = 0;
36
+ depth = null;
37
+ /**
38
+ * Whether the context will render to a half-float colour target.
39
+ *
40
+ * **Asked here rather than taken from the scene target**, which is a different question: the
41
+ * scene is float only where a consumer asked for `hdrScene`, and this needs one either way. The
42
+ * accumulation is a *sum* of colour times weight and the weight reaches three thousand, so a
43
+ * single bright layer overflows eight bits immediately and every pane comes out white — an
44
+ * eight-bit fallback is not a quieter version of this effect, so where the extension is absent
45
+ * it refuses and says so once.
46
+ */
47
+ floatColor;
48
+ constructor(gl) {
49
+ this.gl = gl;
50
+ this.floatColor = gl.getExtension('EXT_color_buffer_float') !== null;
51
+ this.program = compileProgram(gl, FULLSCREEN_VERT, OIT_RESOLVE_FRAG, 'oitResolve');
52
+ this.uniforms = uniformLocations(gl, this.program, 'oitPass');
53
+ const vao = gl.createVertexArray();
54
+ if (vao === null)
55
+ throw new Error('OitPass: createVertexArray failed');
56
+ this.vao = vao;
57
+ }
58
+ /** Whether this context can run the effect at all. See `floatColor`. */
59
+ get available() {
60
+ return this.floatColor;
61
+ }
62
+ ensureSize(width, height, depth) {
63
+ const { gl } = this;
64
+ if (this.width === width && this.height === height && this.depth === depth)
65
+ return;
66
+ this.width = width;
67
+ this.height = height;
68
+ this.depth = depth;
69
+ /*
70
+ * **Unit 0, chosen rather than inherited.** `bindTexture` binds to whatever unit is active,
71
+ * and the renderer leaves that wherever its last pass finished — unit 7 in practice. Allocating
72
+ * here without setting it left the revealage texture bound to unit 7 for the life of the
73
+ * context, and the pass below then attached that same texture as its render target: a feedback
74
+ * loop, reported once per draw as `GL_INVALID_OPERATION` and rasterising something undefined.
75
+ * It cost 120 pixels of a frame that had to be identical, and it was found by asking which
76
+ * texture was on which unit rather than by reasoning about it.
77
+ */
78
+ gl.activeTexture(gl.TEXTURE0);
79
+ if (this.accum === null)
80
+ this.accum = gl.createTexture();
81
+ gl.bindTexture(gl.TEXTURE_2D, this.accum);
82
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA16F, width, height, 0, gl.RGBA, gl.HALF_FLOAT, null);
83
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
84
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
85
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
86
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
87
+ /* One channel, because revealage is one number. `r8` rather than `r16f`: it holds a product of
88
+ values in 0..1 and never leaves that range, and eight bits of it is a step of 1/255 in how
89
+ much scene shows through — below what a viewer can see against a blended layer. */
90
+ if (this.reveal === null)
91
+ this.reveal = gl.createTexture();
92
+ gl.bindTexture(gl.TEXTURE_2D, this.reveal);
93
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, null);
94
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
95
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
96
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
97
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
98
+ /*
99
+ * **The scene's own depth on both, and that is what makes the two passes agree.** They test
100
+ * against the opaque world and never write, so a pane behind a wall is rejected at the wall on
101
+ * both — and a fragment that reached the accumulation reached the revealage too, which the
102
+ * resolve assumes and could not otherwise rely on.
103
+ */
104
+ if (this.accumFbo === null)
105
+ this.accumFbo = gl.createFramebuffer();
106
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.accumFbo);
107
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.accum, 0);
108
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
109
+ if (this.revealFbo === null)
110
+ this.revealFbo = gl.createFramebuffer();
111
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.revealFbo);
112
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.reveal, 0);
113
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
114
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
115
+ /* And released, so nothing carries a target of this pass into a sampler of another. */
116
+ gl.bindTexture(gl.TEXTURE_2D, null);
117
+ }
118
+ /**
119
+ * Run the translucent set into the two buffers.
120
+ *
121
+ * `submit` is called twice with the weighting flag it should set: once accumulating, once
122
+ * multiplying revealage. Depth writes are off for both and restored after, because a translucent
123
+ * surface that wrote depth would hide the ones behind it and there would be nothing to blend.
124
+ */
125
+ accumulateOit(width, height, depth, submit) {
126
+ const { gl } = this;
127
+ this.ensureSize(width, height, depth);
128
+ gl.viewport(0, 0, width, height);
129
+ gl.enable(gl.DEPTH_TEST);
130
+ gl.depthMask(false);
131
+ gl.enable(gl.BLEND);
132
+ /* Weighted colour, summed. Cleared to zero: nothing accumulated is a sum of nothing. */
133
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.accumFbo);
134
+ gl.clearBufferfv(gl.COLOR, 0, [0, 0, 0, 0]);
135
+ gl.blendFunc(gl.ONE, gl.ONE);
136
+ submit(true);
137
+ /*
138
+ * Revealage, multiplied. **Cleared to one**, which is "nothing has covered this pixel yet" —
139
+ * cleared to zero the resolve would show no scene anywhere the effect ran, which is a black
140
+ * frame that looks like the blend rather than like the clear.
141
+ */
142
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.revealFbo);
143
+ gl.clearBufferfv(gl.COLOR, 0, [1, 1, 1, 1]);
144
+ gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_ALPHA);
145
+ submit(false);
146
+ gl.depthMask(true);
147
+ gl.disable(gl.BLEND);
148
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
149
+ }
150
+ /**
151
+ * Composite the two buffers over whatever framebuffer is bound.
152
+ *
153
+ * **The blend does the compositing, not a texture read.** `(ONE_MINUS_SRC_ALPHA, SRC_ALPHA)`
154
+ * against a fragment carrying the average colour and the revealage computes
155
+ * `average * (1 - reveal) + scene * reveal`, which is the resolve — so this pass never samples
156
+ * the target it is writing, and cannot be caught in the feedback loop that would be.
157
+ */
158
+ resolveOit() {
159
+ const { gl } = this;
160
+ if (this.accum === null || this.reveal === null)
161
+ return;
162
+ gl.disable(gl.DEPTH_TEST);
163
+ gl.depthMask(false);
164
+ gl.disable(gl.CULL_FACE);
165
+ gl.enable(gl.BLEND);
166
+ gl.blendFunc(gl.ONE_MINUS_SRC_ALPHA, gl.SRC_ALPHA);
167
+ gl.useProgram(this.program);
168
+ gl.activeTexture(gl.TEXTURE0);
169
+ gl.bindTexture(gl.TEXTURE_2D, this.accum);
170
+ gl.uniform1i(this.uniforms['uOitAccum'] ?? null, 0);
171
+ gl.activeTexture(gl.TEXTURE1);
172
+ gl.bindTexture(gl.TEXTURE_2D, this.reveal);
173
+ gl.uniform1i(this.uniforms['uOitReveal'] ?? null, 1);
174
+ gl.bindVertexArray(this.vao);
175
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
176
+ gl.bindVertexArray(null);
177
+ /*
178
+ * **Released, and this is the bug that made it necessary.** A binding outlives the frame it
179
+ * was made in, so unit 0 kept the accumulation texture — which the *next* frame then attaches
180
+ * as its own colour target while the flat program still declares a sampler on that unit. That
181
+ * is a feedback loop: WebGL2 reports `GL_INVALID_OPERATION: Feedback loop formed between
182
+ * Framebuffer and active Texture` once per draw and then rasterises something undefined. It
183
+ * cost 120 pixels of a frame that had to be identical, which is what found it.
184
+ */
185
+ gl.activeTexture(gl.TEXTURE1);
186
+ gl.bindTexture(gl.TEXTURE_2D, null);
187
+ gl.activeTexture(gl.TEXTURE0);
188
+ gl.bindTexture(gl.TEXTURE_2D, null);
189
+ gl.disable(gl.BLEND);
190
+ gl.depthMask(true);
191
+ gl.enable(gl.DEPTH_TEST);
192
+ }
193
+ dispose() {
194
+ const { gl } = this;
195
+ if (this.accum !== null)
196
+ gl.deleteTexture(this.accum);
197
+ if (this.reveal !== null)
198
+ gl.deleteTexture(this.reveal);
199
+ if (this.accumFbo !== null)
200
+ gl.deleteFramebuffer(this.accumFbo);
201
+ if (this.revealFbo !== null)
202
+ gl.deleteFramebuffer(this.revealFbo);
203
+ gl.deleteProgram(this.program);
204
+ gl.deleteVertexArray(this.vao);
205
+ this.accum = null;
206
+ this.reveal = null;
207
+ this.accumFbo = null;
208
+ this.revealFbo = null;
209
+ this.width = 0;
210
+ this.height = 0;
211
+ this.depth = null;
212
+ }
213
+ }