@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,383 @@
1
+ /**
2
+ * Which way depth runs, in one place, because it is a decision every pass has to agree with.
3
+ *
4
+ * **Reversed-Z with a float depth attachment.** Clip space depth is mapped so the near plane is
5
+ * 1 and the far plane is 0, the compare is `greater` rather than `less`, and the buffer is cleared
6
+ * to 0 instead of 1. It is not a preference: a conventional buffer spends its precision
7
+ * hyperbolically, resolving about `z² / (near · 2^bits)` at distance `z`, so the near plane is the
8
+ * only control there is and every consumer ends up pushing it out and then pushing decals off
9
+ * surfaces to compensate.
10
+ *
11
+ * **What it buys, in the arithmetic that motivated it.** A float's exponent gives its resolution
12
+ * where the values are small, and reversed-Z puts *far* at zero — so the hyperbolic loss and the
13
+ * floating-point gain very nearly cancel and precision becomes roughly uniform with distance.
14
+ * A consumer measured what its absence costs: a street plate's letters held 7.5 mm proud of a 6 mm
15
+ * plate and a sign 15 mm proud of its board, neither a thickness anybody chose, and a near plane
16
+ * settled at 0.25 for a first-person camera that wanted 0.05 — 1.6x of precision surrendered
17
+ * permanently, because dropping it to 0.15 made every decal in the world blink.
18
+ *
19
+ * **This is the cure for a near-coincident seam and deliberately not for a coincident one.**
20
+ * `webgl2/renderer.ts` records taking a reversed-Z conversion off the table once, and that
21
+ * reasoning stands where it was written: two *exactly* coplanar surfaces have equal depth in exact
22
+ * arithmetic and no format separates equal numbers, which is what `POLYGON_OFFSET_FILL` is for.
23
+ * What reversed-Z fixes is the other case — surfaces a fraction of a millimetre apart, which a
24
+ * conventional buffer cannot tell apart past about forty metres and this one can.
25
+ *
26
+ * **Shadows are not reversed and that is deliberate.** The directional cascades are orthographic,
27
+ * where depth is already linear and a float buffer gains nothing, and the point shadows write with
28
+ * `always`. Converting them would mean flipping every comparison in the shadow shaders for no
29
+ * precision at all, so `SHADOW_FORMAT` and its passes keep the conventional sense and this module
30
+ * says nothing about them.
31
+ */
32
+
33
+ /**
34
+ * True while the engine renders its scene depth reversed.
35
+ *
36
+ * **It is `true`, on both backends, and this is what it took.** Nine attempts. The eight that
37
+ * failed were not wrong about the conversion — the compares, clears, clip corrections and formats
38
+ * were right early — they were wrong about *where to look*, and the note below on the instrument
39
+ * is the most reusable thing on this page.
40
+ *
41
+ * **What it is gated at.** Each backend against its own conventional output, at zero tolerance,
42
+ * across every published scene on a real GPU: **WebGL2's worst frame 7,348 pixels of 921,600** and
43
+ * **WebGPU's 11,832**, most a few hundred or none, and all of it seams resolving the other way,
44
+ * which is the improvement. The two backends against *each other* come to 443,035 pixels on their
45
+ * worst scene reversed against 443,039 conventional, so the conversion costs four pixels of the
46
+ * ordinary disagreement between two independent implementations of an animated scene, in the
47
+ * direction of agreeing slightly better.
48
+ *
49
+ * **`npm run wgsl` is part of changing anything here.** WebGPU draws from generated WGSL, so a
50
+ * GLSL change left unregenerated keeps the old expression compiled in and the gate measures the
51
+ * previous shader.
52
+ *
53
+ * ## The instrument
54
+ *
55
+ * **Compare the two backends against each other, not each against its own conventional baseline.**
56
+ * Five attempts read an ambiguous number because a diff against a baseline can say *that*
57
+ * something changed and never *which side is wrong*. Two independent implementations that agree
58
+ * conventionally and stop agreeing reversed localise the fault to one of them. Always take the
59
+ * conventional pair as the control in the same run: it is not zero, and reading a reversed number
60
+ * without it is what made several earlier measurements unreadable.
61
+ *
62
+ * **Then bisect the shader with a constant-output probe**, and neutralise terms one at a time. The
63
+ * last three defects were each found by forcing one factor to a constant and watching the two
64
+ * backends fall into agreement. `flat/main.ts` has exactly one `outColor` assignment and it is the
65
+ * last line of the shader, so a probe inserted earlier is overwritten and reads as "this feature
66
+ * is not active" — verify any probe by forcing magenta first and confirming the gate moves.
67
+ *
68
+ * ## The four defects, all of them WebGL2's, none of them in the depth conversion
69
+ *
70
+ * 1. **The lit shader was handed a range-corrected light matrix.** `shadowFactor` projects with
71
+ * `uLightViewProj` and then does `p = p * 0.5 + 0.5` on all three axes, and `GL_SHADOW_REMAP`
72
+ * performs that same range change in the matrix. Both applied put every receiver depth in
73
+ * `[0.5, 1]` against a map holding `[0, 1]`. `webgpu/renderer.ts` had this right and says so.
74
+ * 2. **Point-shadow face matrices were never range-corrected at all.** `EXT_clip_control` is
75
+ * context state, so a face matrix still emitting OpenGL's `[-1, 1]` loses everything below zero
76
+ * and half of every face is clipped away.
77
+ * 3. **`bakeOne` had no depth bracket.** `bakeAreaOne` put the conventional compare and clear back
78
+ * for the length of an area light's bake; the ordinary lamp path, which is nearly every point
79
+ * shadow a scene has, ran under the frame's own `GEQUAL` against a scratch cleared to 0 while
80
+ * writing depths from a matrix that is deliberately not reversed. Both paths go through
81
+ * `bakePointShadow` now, unconditionally, so there is no branch left to forget.
82
+ * 4. **Three shadow matrices shared one scratch buffer**, so whichever ran last rewrote the
83
+ * others, and `beginShadowPass` uploaded the raw matrix while holding the corrected one.
84
+ *
85
+ * Every one of them was invisible conventionally, and none of them looks like a depth bug: a wrong
86
+ * shadow map does not draw broken, it draws *dark*. That is why the scene read as a lighting
87
+ * regression for eight attempts and why bisecting the lit expression is what finally named them.
88
+ *
89
+ * **The trap, recorded because it cost a whole attempt.** Reversed depth measured *more
90
+ * view-stable* than conventional on both scenes across two nearby frames, which reads as evidence
91
+ * that the difference is the improvement. It is not: both scenes animate, so most of that is
92
+ * motion. Do not stop at the stability number.
93
+ *
94
+ * **Candidates eliminated by measurement along the way**, so nobody pays for them twice: ambient
95
+ * occlusion and its far-plane guards, `drawScatter` and `drawSdfText`, `POLYGON_OFFSET_FILL` and
96
+ * the offset sign, environment irradiance, depth of field, and the directional cascade's bracket
97
+ * and range, which were correct before any of this started.
98
+ *
99
+ * Everything else in this module is live and correct in both senses, and every consumer reads it
100
+ * instead of a constant of its own.
101
+ */
102
+ export const REVERSED_DEPTH = true;
103
+
104
+ /** What a scene depth attachment is cleared to: the far plane. */
105
+ export const DEPTH_CLEAR = REVERSED_DEPTH ? 0 : 1;
106
+
107
+ /** The WebGPU compare for "nearer than what is there". */
108
+ export const DEPTH_COMPARE: GPUCompareFunction = REVERSED_DEPTH ? 'greater' : 'less';
109
+
110
+ /**
111
+ * The same, admitting equality.
112
+ *
113
+ * The sky draws with this so it fills exactly the pixels nothing else claimed, and text with it so
114
+ * a glyph coplanar with its quad is not dropped.
115
+ */
116
+ export const DEPTH_COMPARE_EQUAL: GPUCompareFunction = REVERSED_DEPTH
117
+ ? 'greater-equal'
118
+ : 'less-equal';
119
+
120
+ /**
121
+ * The scene depth format.
122
+ *
123
+ * **Float is half of reversed-Z and the half that is easy to forget.** Reversing a 24-bit unorm
124
+ * buffer moves the precision around and does not create any; the gain comes from a float's
125
+ * exponent having room near zero, which is where reversing puts the far plane.
126
+ */
127
+ export const DEPTH_FORMAT: GPUTextureFormat = REVERSED_DEPTH ? 'depth32float' : 'depth24plus';
128
+
129
+ /**
130
+ * Turn a depth read out of the buffer back into the `[0, 1]` a conventional one would have held.
131
+ *
132
+ * For anything that reconstructs a position or a distance from stored depth and was written
133
+ * against the conventional sense. One place, so a pass that forgets it is a pass that looks wrong
134
+ * rather than one that quietly disagrees with its neighbour.
135
+ */
136
+ export function conventionalDepth(stored: number): number {
137
+ return REVERSED_DEPTH ? 1 - stored : stored;
138
+ }
139
+
140
+ /**
141
+ * The GLSL that turns a sampled scene depth back into OpenGL's `[-1, 1]` clip z.
142
+ *
143
+ * **One expression, interpolated, because four shaders had written it out by hand.** Ambient
144
+ * occlusion twice, the camera blur's reprojection and depth of field each carried
145
+ * `depth * 2.0 - 1.0`, which is the inverse of the conventional mapping and the wrong inverse of
146
+ * the reversed one. A reversed buffer stores `0.5 - 0.5z`, so recovering z is `1 - 2 * stored`,
147
+ * and a pass that keeps the old form does not fail loudly — it reprojects to slightly the wrong
148
+ * place, which is what the renderer's own reprojection test caught when this landed.
149
+ *
150
+ * `%s` is the name of the depth variable at the call site.
151
+ */
152
+ export function glslSceneDepthToNdc(depth: string): string {
153
+ return REVERSED_DEPTH ? `(1.0 - ${depth} * 2.0)` : `(${depth} * 2.0 - 1.0)`;
154
+ }
155
+
156
+ /**
157
+ * The clip-space z of the far plane, as GLSL, for geometry that writes a fixed depth.
158
+ *
159
+ * **The sky is the whole reason this exists.** It is a full-screen triangle written straight into
160
+ * clip space with `z = w`, which is the far plane conventionally and the *near* plane once depth
161
+ * is reversed — so a reversed engine whose sky still says 1.0 paints the sky over the entire
162
+ * world. That is what the pixel gate caught the first time this landed: every scene changed, most
163
+ * of the frame, and the largest was 743,669 pixels of 921,600.
164
+ */
165
+ export function glslFarDepth(): string {
166
+ return REVERSED_DEPTH ? '0.0' : '1.0';
167
+ }
168
+
169
+ /**
170
+ * The WebGL2 depth compare for "nearer than what is there", and the one that admits equality.
171
+ *
172
+ * Taken as functions of the context because these are GL enums and this module must not import a
173
+ * backend. The pair mirrors `DEPTH_COMPARE` and `DEPTH_COMPARE_EQUAL` exactly, so the two backends
174
+ * cannot end up testing depth in opposite directions.
175
+ */
176
+ export function glDepthFunc(gl: WebGL2RenderingContext): number {
177
+ return REVERSED_DEPTH ? gl.GREATER : gl.LESS;
178
+ }
179
+
180
+ export function glDepthFuncEqual(gl: WebGL2RenderingContext): number {
181
+ return REVERSED_DEPTH ? gl.GEQUAL : gl.LEQUAL;
182
+ }
183
+
184
+ /** The conventional pair, for the shadow passes, which are deliberately not reversed. */
185
+ export function glShadowDepthFunc(gl: WebGL2RenderingContext): number {
186
+ return gl.LEQUAL;
187
+ }
188
+
189
+ /**
190
+ * What a shadow pass clears its depth to, and it travels with the compare above.
191
+ *
192
+ * Separate from `DEPTH_CLEAR` because a shadow pass does not follow the frame: it renders from a
193
+ * light matrix this module deliberately leaves conventional, so far is 1 there whatever the scene
194
+ * is doing. Stated as its own constant so the pair cannot be half-applied — which is exactly how a
195
+ * point-light bake ended up clearing to the scene's far plane and comparing with the scene's sense
196
+ * against depths written the other way.
197
+ */
198
+ export const SHADOW_DEPTH_CLEAR = 1;
199
+
200
+ /**
201
+ * Which way a polygon offset has to push to bring a coplanar overlay forward.
202
+ *
203
+ * **The sign flips with the compare and forgetting it is silent.** `POLYGON_OFFSET_FILL` adds to
204
+ * depth; under `LESS` nearer is smaller, so an overlay is pulled forward with a negative offset,
205
+ * and under `GREATER` nearer is larger and the same nudge pushes it *behind* the surface it is
206
+ * meant to sit on. The symptom is a marking that disappears into the road rather than a marking
207
+ * that fights, which reads as a missing draw call.
208
+ */
209
+ export const DEPTH_OFFSET_SIGN = REVERSED_DEPTH ? -1 : 1;
210
+
211
+ /**
212
+ * How much depth one overlay layer is worth, and how much of it follows the slope.
213
+ *
214
+ * Two numbers so that the two backends offset a coplanar surface by the *same* amount: WebGL2
215
+ * hands them to `gl.polygonOffset` around a draw and WebGPU bakes them into a pipeline as
216
+ * `depthBias` and `depthBiasSlopeScale`, and a layer that means one thing on one backend and
217
+ * something else on the other is a difference no test compares and a photograph shows.
218
+ *
219
+ * **The slope term is not zero, and it was zero here until a measurement said otherwise.** The
220
+ * argument for zero is good and it is wrong: a declared overlay is coplanar with what it decorates
221
+ * from every angle, so a constant nudge ought to be the whole of what it needs, and a slope term
222
+ * ought to mean a kerb stands further off its slab as the camera turns. What that reasoning misses
223
+ * is that the offset is applied in *depth*, and how much depth one pixel spans grows without bound
224
+ * as a surface turns edge-on — so a constant that clears the fight head-on clears none of it at a
225
+ * grazing angle.
226
+ *
227
+ * Measured, on a blended quad coplanar with the panel it decorates, counting the pixels of the
228
+ * decal that survive: **WebGL2 clears it at layer 1 either way, and WebGPU with a slope of 0 keeps
229
+ * 1,178 pixels of 1,237 at layer 1 and needs layer 2 to reach 1,237.** With the slope, both
230
+ * backends read 1,237 at layer 1. Two backends given the same number and drawing two pictures is
231
+ * the defect; the slope is what makes a declared layer mean one thing.
232
+ *
233
+ * **The sign is the units' sign and not the opposite of it**, which cost a capture to find: set to
234
+ * `+1` the slope fights the constant and pushes the overlay *away*, and the decal disappeared
235
+ * entirely on both backends — the same symptom the sign note above describes, arriving through the
236
+ * other term.
237
+ *
238
+ * The cost is bounded and was gated rather than argued: **every published scene is 0 of 921,600
239
+ * pixels on both backends** against the release before it.
240
+ */
241
+ export const OVERLAY_DEPTH_SLOPE = -1;
242
+ export const OVERLAY_DEPTH_UNITS = -2;
243
+
244
+ /**
245
+ * Highest depth layer a caller may ask for.
246
+ *
247
+ * A ceiling rather than an open number, because the offset has to stay small enough that a layer
248
+ * cannot be dragged out through geometry it genuinely stands behind. Four is more than any scene
249
+ * has needed: a base surface, the decks that cross it, the trim fused into those, and the
250
+ * markings painted on top.
251
+ */
252
+ export const MAX_DEPTH_LAYER = 4;
253
+
254
+ /**
255
+ * The depth offset a layer is worth, clamped and signed, for whichever backend is asking.
256
+ *
257
+ * One function because it is one decision. It used to be three lines inlined in `drawMesh` on
258
+ * WebGL2 and nothing at all on WebGPU, where `depthLayer` was accepted and silently ignored —
259
+ * so a consumer that declared which of two fused surfaces should win got the answer on one
260
+ * backend and a per-pixel coin toss on the other, with nothing anywhere saying so.
261
+ *
262
+ * Layer 0 is the base world and takes no offset at all, which is why the units come back as zero
263
+ * for it: a pipeline or a draw that asked for nothing must be identical to one built before this
264
+ * existed.
265
+ */
266
+ export function depthOffsetForLayer(
267
+ layer: number,
268
+ /**
269
+ * Which way depth actually runs for the caller asking.
270
+ *
271
+ * Defaulted to the convention this module declares, and passed explicitly by WebGL2, where it
272
+ * is **not** a compile-time fact: reversed depth there needs `EXT_clip_control`, and a context
273
+ * that was not granted it runs conventional depth whatever this file says. Taking the default
274
+ * on that backend would offset every overlay the wrong way on exactly the machines that fell
275
+ * back — and the symptom, a marking sinking into its road, reads as a missing draw call.
276
+ */
277
+ reversed: boolean = REVERSED_DEPTH,
278
+ ): { readonly slope: number; readonly units: number } {
279
+ const clamped = Math.min(Math.max(Math.round(layer), 0), MAX_DEPTH_LAYER);
280
+ if (clamped === 0) return { slope: 0, units: 0 };
281
+ const sign = reversed ? -1 : 1;
282
+ return {
283
+ /* `|| 0` because `0 * -1` is `-0`, which equals zero in every arithmetic use and not under
284
+ `Object.is` — so two descriptors alike in every way a GPU can see would compare unequal. */
285
+ slope: OVERLAY_DEPTH_SLOPE * sign || 0,
286
+ units: OVERLAY_DEPTH_UNITS * clamped * sign,
287
+ };
288
+ }
289
+
290
+ /**
291
+ * The remap from the OpenGL clip space every camera matrix is built in to what the depth buffer
292
+ * expects, as a column-major 4x4.
293
+ *
294
+ * **WebGL2 needs this only because `EXT_clip_control` puts its clip z in `[0, 1]`**, which is
295
+ * where reversed-Z wants it and is not where `mat4.perspective` leaves it. It is the same
296
+ * transform WebGPU's `CLIP_CORRECTION` carries, without the Y flip that backend also needs, and
297
+ * it is the identity when depth is conventional and clip control is off — in which case the
298
+ * renderer skips the multiply entirely.
299
+ */
300
+ export const GL_DEPTH_REMAP = new Float32Array([
301
+ 1,
302
+ 0,
303
+ 0,
304
+ 0,
305
+ 0,
306
+ 1,
307
+ 0,
308
+ 0,
309
+ 0,
310
+ 0,
311
+ REVERSED_DEPTH ? -0.5 : 0.5,
312
+ 0,
313
+ 0,
314
+ 0,
315
+ 0.5,
316
+ 1,
317
+ ]);
318
+
319
+ /**
320
+ * `EXT_clip_control`, which TypeScript's DOM library does not declare yet.
321
+ *
322
+ * Only the two enums and the one entry point this engine uses. Declared here beside the constant
323
+ * that needs it rather than in a types file, so the reason it exists is next to the reason it is
324
+ * called.
325
+ */
326
+ export interface ClipControlExtension {
327
+ readonly LOWER_LEFT_EXT: number;
328
+ readonly ZERO_TO_ONE_EXT: number;
329
+ clipControlEXT(origin: number, depth: number): void;
330
+ }
331
+
332
+ /**
333
+ * The WebGL2 internal format and type for a scene depth attachment.
334
+ *
335
+ * **Float is the half of reversed-Z that is easy to forget.** Reversing a 24-bit unorm buffer moves
336
+ * its precision around and creates none; the gain comes from a float's exponent having room near
337
+ * zero, which is where reversing puts the far plane. `DEPTH_COMPONENT32F` is core in WebGL2, so
338
+ * this needs no extension — only the matching `FLOAT` type, since a 32-bit float attachment
339
+ * described as `UNSIGNED_INT` is refused.
340
+ *
341
+ * Shadow maps do not go through here: they are their own format for their own reason, and they are
342
+ * not reversed.
343
+ */
344
+ export function glSceneDepthFormat(gl: WebGL2RenderingContext): {
345
+ readonly internalFormat: number;
346
+ readonly type: number;
347
+ } {
348
+ return REVERSED_DEPTH
349
+ ? { internalFormat: gl.DEPTH_COMPONENT32F, type: gl.FLOAT }
350
+ : { internalFormat: gl.DEPTH_COMPONENT24, type: gl.UNSIGNED_INT };
351
+ }
352
+
353
+ /**
354
+ * The GLSL that asks "is this the far plane", for a pass that skips the background.
355
+ *
356
+ * **The guard that inverts, and the one that darkens a scene when it does not.** Ambient occlusion
357
+ * skips a pixel showing nothing — `depth >= 1.0` conventionally — and under reversed depth the far
358
+ * plane is 0.0, so that test never fires and occlusion is computed over the sky. The symptom is a
359
+ * frame that comes out *darker rather than broken*: measured at 320,706 changed pixels of 921,600
360
+ * with the mean luminance falling 18.5 to 15.3 and two thirds of mid-tones moved, which reads as a
361
+ * shading difference and hides among the seams reversed depth is meant to fix.
362
+ *
363
+ * Written as a comparison rather than a constant so the sense and the bound move together: a
364
+ * consumer of this cannot flip one and forget the other.
365
+ */
366
+ export function glslIsFarDepth(depth: string): string {
367
+ return REVERSED_DEPTH ? `(${depth} <= 0.0)` : `(${depth} >= 1.0)`;
368
+ }
369
+
370
+ /**
371
+ * The `[-1, 1]` to `[0, 1]` remap **without** the reversal, for a pass that is not reversed.
372
+ *
373
+ * **Because `EXT_clip_control` is context-wide and a shadow pass is not.** Turning it on puts every
374
+ * clip z in `[0, 1]`, including the shadow passes', whose light matrices are deliberately left
375
+ * conventional — so a light matrix built by `mat4.perspective` or `mat4.ortho` emits `[-1, 1]` and
376
+ * the context throws away everything below zero. Half of every shadow map's range disappears, which
377
+ * does not look like clipping: it looks like the scene is *darker*.
378
+ *
379
+ * So a shadow pass gets this instead of `GL_DEPTH_REMAP`: the same range change, the same sense.
380
+ */
381
+ export const GL_SHADOW_REMAP = new Float32Array([
382
+ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1,
383
+ ]);
@@ -0,0 +1,89 @@
1
+ /**
2
+ * A ceiling on how many pixels one frame may be, independent of how big the window is.
3
+ *
4
+ * `maxDevicePixelRatio` caps *density* — pixels per CSS pixel — which is the right lever
5
+ * for "is this panel high-DPI" and the wrong one for "how much frame is this". Density
6
+ * held constant, the cost of a frame is still whatever area the player last dragged their
7
+ * window to, and the frame is roughly 90% fragment-bound, so window size is an
8
+ * uncontrolled multiplier on the whole renderer.
9
+ *
10
+ * That is fine right up until it isn't, because vsync quantises the consequence. A frame
11
+ * that fits a 120 Hz slot with 5% to spare and then grows 10% does not run 10% slower; it
12
+ * misses the slot and is shown at 60. Going fullscreen is exactly such a growth — the
13
+ * browser's toolbar was the margin — so the symptom arrives as "fullscreen halves the
14
+ * frame rate", which sounds like a bug in fullscreen and is arithmetic about area.
15
+ *
16
+ * A budget makes that cost bounded and, more usefully, *legible*: a player can move it
17
+ * and watch the frame rate move, which is the same argument that put the resolution lever
18
+ * on the settings screen. Zero means uncapped, for a machine that would rather have the
19
+ * pixels.
20
+ */
21
+
22
+ /** Mutable so the caller can own one and keep `resize` allocation-free. */
23
+ export interface BufferSize {
24
+ width: number;
25
+ height: number;
26
+ }
27
+
28
+ /** Smallest drawing buffer worth asking a driver for; zero is a GL error, not a picture. */
29
+ const MIN_SIDE = 2;
30
+
31
+ /**
32
+ * Fit `width` x `height` under `maxPixels`, preserving aspect, into `out`.
33
+ *
34
+ * Writes rather than returns, because `Renderer.resize` runs every frame and per-frame
35
+ * allocation is forbidden (AGENTS.md). Non-positive and non-finite budgets mean uncapped:
36
+ * this runs in the frame loop, where a corrupt stored setting has to degrade to the old
37
+ * behaviour rather than throw.
38
+ *
39
+ * Scaled by the square root of the ratio, so both axes shrink together and
40
+ * `Renderer.aspect` still describes the shot the camera composed for. Rounded *down*, so
41
+ * the budget is a promise rather than an approximation — the whole point is that a number
42
+ * a player chose is the number they get.
43
+ */
44
+ export function fitToPixelBudget(
45
+ width: number,
46
+ height: number,
47
+ maxPixels: number,
48
+ out: BufferSize,
49
+ ): void {
50
+ out.width = width;
51
+ out.height = height;
52
+ if (!Number.isFinite(maxPixels) || maxPixels <= 0) return;
53
+
54
+ const pixels = width * height;
55
+ if (pixels <= maxPixels) return;
56
+
57
+ const scale = Math.sqrt(maxPixels / pixels);
58
+ out.width = Math.max(MIN_SIDE, Math.floor(width * scale));
59
+ out.height = Math.max(MIN_SIDE, Math.floor(height * scale));
60
+ }
61
+
62
+ /**
63
+ * The size the next frame is drawn at, into `out`.
64
+ *
65
+ * **A locked buffer is handed back exactly, and no cap of any kind touches it.** That is
66
+ * the one rule in here that is not about performance: a lock is a caller naming a size for
67
+ * a reason no quality setting can see — a clip is 1080x1920 whatever anybody's frame rate
68
+ * is, and `Renderer.aspect` follows the lock so the replay's shots are composed for the
69
+ * *file* rather than for the window it is being written from. A budget applied over the
70
+ * top would silently write a file that is not the size it claims and re-frame every shot
71
+ * in it. Pass `dpr` already clamped; unlocked, the CSS box is scaled by it and then fitted
72
+ * under `maxPixels`.
73
+ */
74
+ export function drawingBufferSize(
75
+ cssWidth: number,
76
+ cssHeight: number,
77
+ dpr: number,
78
+ lockedWidth: number,
79
+ lockedHeight: number,
80
+ maxPixels: number,
81
+ out: BufferSize,
82
+ ): void {
83
+ if (lockedWidth > 0 && lockedHeight > 0) {
84
+ out.width = lockedWidth;
85
+ out.height = lockedHeight;
86
+ return;
87
+ }
88
+ fitToPixelBudget(Math.round(cssWidth * dpr), Math.round(cssHeight * dpr), maxPixels, out);
89
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * 1x1 placeholders for sampler slots a pass declares but does not use.
3
+ *
4
+ * A shader's sampler uniforms exist whether or not the feature behind them is switched
5
+ * on: the flat pass declares three directional shadow maps and twelve cubemaps, and a
6
+ * quality profile with shadows off still compiles every one of them. The obvious way to
7
+ * say "there is nothing here" is to bind `null` to the unit, and it is wrong.
8
+ *
9
+ * A sampler bound to no texture is *incomplete*. The GL spec says sampling one yields
10
+ * zero, which sounds like a safe default and is only safe if the sample never executes.
11
+ * The guards in this engine are runtime values — `uShadowStrength <= 0.0`, an index
12
+ * compared against -1 — so a driver is free to fetch the descriptor before it evaluates
13
+ * the branch that would have skipped it. Descriptor fetches are scalar loads, and a
14
+ * descriptor for a texture that does not exist is not guaranteed to point anywhere.
15
+ *
16
+ * On a Radeon RX 9070 XT (RDNA4, Mesa 25.2.8) that read lands outside the process's GPU
17
+ * address space and faults:
18
+ *
19
+ * amdgpu: [gfxhub] page fault ... Faulty UTCL2 client ID: SQC (data)
20
+ * amdgpu: ring gfx_0.0.0 timeout -> Ring gfx_0.0.0 reset -> device wedged
21
+ *
22
+ * The context dies, the compositor stalls for a second or two while the driver resets the
23
+ * card, and nothing in the API reports an error — the page simply loses its context a few
24
+ * seconds in. Binding a real texture costs one 1x1 upload per renderer and removes the
25
+ * question: every declared sampler has something complete behind it, whether the pass
26
+ * reads it or not. three.js keeps an empty texture per target for the same reason.
27
+ *
28
+ * Not a workaround for one card. An incomplete sampler is undefined territory that
29
+ * happens to be survivable on most drivers, and this makes the engine stop relying on
30
+ * that.
31
+ */
32
+
33
+ /** Opaque black, which is what a shadow lookup should read where nothing occludes. */
34
+ const ONE_BLACK_TEXEL = new Uint8Array([0, 0, 0, 255]);
35
+
36
+ /** Full depth, which is the far plane: an occluder as far away as the light reaches. */
37
+ const ONE_WHITE_TEXEL = new Uint8Array([255]);
38
+
39
+ function allocate(gl: WebGL2RenderingContext, label: string): WebGLTexture {
40
+ const texture = gl.createTexture();
41
+ if (texture === null) throw new Error(`${label}: createTexture failed`);
42
+ return texture;
43
+ }
44
+
45
+ /**
46
+ * A complete 1x1 texture for any unused `sampler2D` slot.
47
+ *
48
+ * `NEAREST` and `CLAMP_TO_EDGE` because a single texel has no mip chain: leaving the
49
+ * default `LINEAR_MIPMAP_LINEAR` minification filter on a texture with only level 0 makes
50
+ * it incomplete again, which is the exact state this exists to avoid.
51
+ */
52
+ export function createEmptyTexture2D(gl: WebGL2RenderingContext): WebGLTexture {
53
+ const texture = allocate(gl, 'emptyTexture2D');
54
+ gl.bindTexture(gl.TEXTURE_2D, texture);
55
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, ONE_BLACK_TEXEL);
56
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
57
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
58
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
59
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
60
+ gl.bindTexture(gl.TEXTURE_2D, null);
61
+ return texture;
62
+ }
63
+
64
+ /**
65
+ * The same for an unused `sampler2DArray` slot: one layer, one texel.
66
+ *
67
+ * The point-shadow array exists only once a world has said how many lights it has, and a scene is
68
+ * free to draw before it does. One layer rather than the full pool's worth, because nothing reads
69
+ * it: `uPointShadowLayer` is −1 for every light while this is bound, and the layer index never
70
+ * reaches a fetch. It is here to be *complete*, which is the whole subject of this file.
71
+ *
72
+ * White rather than black, matching the one-texel cube the WebGPU side keeps and for its reason:
73
+ * a full-depth texel reads as an occluder at the far plane, so the worst a lookup that should not
74
+ * have happened can do is find nothing in the way. Zeroes would mean an occluder pressed against
75
+ * every lamp, and every surface in the scene in shadow.
76
+ */
77
+ export function createEmptyTexture2DArray(gl: WebGL2RenderingContext): WebGLTexture {
78
+ const texture = allocate(gl, 'emptyTexture2DArray');
79
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
80
+ gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.R8, 1, 1, 1);
81
+ gl.texSubImage3D(
82
+ gl.TEXTURE_2D_ARRAY,
83
+ 0,
84
+ 0,
85
+ 0,
86
+ 0,
87
+ 1,
88
+ 1,
89
+ 1,
90
+ gl.RED,
91
+ gl.UNSIGNED_BYTE,
92
+ ONE_WHITE_TEXEL,
93
+ );
94
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
95
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
96
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
97
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
98
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
99
+ return texture;
100
+ }
101
+
102
+ /**
103
+ * The same for an unused `samplerCube` slot.
104
+ *
105
+ * All six faces are supplied: a cubemap missing any one of them is incomplete however
106
+ * complete the other five are.
107
+ */
108
+ export function createEmptyTextureCube(gl: WebGL2RenderingContext): WebGLTexture {
109
+ const texture = allocate(gl, 'emptyTextureCube');
110
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);
111
+ for (let face = 0; face < 6; face++) {
112
+ gl.texImage2D(
113
+ gl.TEXTURE_CUBE_MAP_POSITIVE_X + face,
114
+ 0,
115
+ gl.RGBA,
116
+ 1,
117
+ 1,
118
+ 0,
119
+ gl.RGBA,
120
+ gl.UNSIGNED_BYTE,
121
+ ONE_BLACK_TEXEL,
122
+ );
123
+ }
124
+ gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
125
+ gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
126
+ gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
127
+ gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
128
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);
129
+ return texture;
130
+ }