@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,121 @@
1
+ import { glSceneDepthFormat } from './depthConvention.js';
2
+ /**
3
+ * Build one. Called from a pass's `init`, or from its `prepare` when the size has changed.
4
+ *
5
+ * **Restores the default framebuffer on WebGL2**, rather than whatever was bound before. Both
6
+ * points where a pass may call this — `init`, outside a frame, and `prepare`, whose contract is
7
+ * that the default framebuffer is bound on entry and on exit — have the default bound, so
8
+ * restoring to it is restoring what was there. Reading the binding back to restore it exactly
9
+ * would be a synchronous driver query in return for covering a case the contract forbids.
10
+ *
11
+ * Fails fast on a size that cannot work, which is the init-time rule: a zero-sized attachment is a
12
+ * framebuffer that is never complete, and a driver reports that as a black draw rather than an
13
+ * error.
14
+ */
15
+ export function createPassAttachment(device, options) {
16
+ const { width, height } = options;
17
+ if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1) {
18
+ throw new Error(`createPassAttachment: ${width}x${height} is not a size — width and height must be positive integers`);
19
+ }
20
+ const wantDepth = options.depth ?? true;
21
+ const label = options.label ?? 'pass target';
22
+ const format = options.format ?? 'rgba8';
23
+ if (device.backend === 'webgpu') {
24
+ const { device: gpu } = device;
25
+ /*
26
+ * The two usage bits by value, which is what this renderer already does at every other
27
+ * `createTexture`: `GPUTextureUsage` is a global the type definitions declare and Node does
28
+ * not provide, so naming it here would make this module unimportable in a test that never
29
+ * touches a GPU.
30
+ */
31
+ const RENDER_ATTACHMENT = 0x10;
32
+ const TEXTURE_BINDING = 0x04;
33
+ const colour = gpu.createTexture({
34
+ label: `${label} colour`,
35
+ size: { width, height },
36
+ format: format === 'rgba8' ? 'rgba8unorm' : 'rgba16float',
37
+ usage: RENDER_ATTACHMENT | TEXTURE_BINDING,
38
+ });
39
+ /* The frame's own depth format, so a pass may build one pipeline for its target and the
40
+ frame rather than two that differ in a field it did not choose. */
41
+ const depth = wantDepth
42
+ ? gpu.createTexture({
43
+ label: `${label} depth`,
44
+ size: { width, height },
45
+ format: device.depthFormat,
46
+ usage: RENDER_ATTACHMENT,
47
+ })
48
+ : null;
49
+ return {
50
+ backend: 'webgpu',
51
+ width,
52
+ height,
53
+ colour,
54
+ colourView: colour.createView(),
55
+ depth,
56
+ depthView: depth === null ? null : depth.createView(),
57
+ format: colour.format,
58
+ depthFormat: depth === null ? null : device.depthFormat,
59
+ dispose() {
60
+ colour.destroy();
61
+ depth?.destroy();
62
+ },
63
+ };
64
+ }
65
+ const { gl } = device;
66
+ const colour = gl.createTexture();
67
+ if (colour === null)
68
+ throw new Error('createPassAttachment: the context refused a texture');
69
+ gl.bindTexture(gl.TEXTURE_2D, colour);
70
+ gl.texImage2D(gl.TEXTURE_2D, 0, format === 'rgba8' ? gl.RGBA8 : gl.RGBA16F, width, height, 0, gl.RGBA, format === 'rgba8' ? gl.UNSIGNED_BYTE : gl.HALF_FLOAT, null);
71
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
72
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
73
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
74
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
75
+ let depth = null;
76
+ if (wantDepth) {
77
+ const sceneDepth = glSceneDepthFormat(gl);
78
+ depth = gl.createTexture();
79
+ if (depth === null)
80
+ throw new Error('createPassAttachment: the context refused a texture');
81
+ gl.bindTexture(gl.TEXTURE_2D, depth);
82
+ gl.texImage2D(gl.TEXTURE_2D, 0, sceneDepth.internalFormat, width, height, 0, gl.DEPTH_COMPONENT, sceneDepth.type, 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
+ }
88
+ const framebuffer = gl.createFramebuffer();
89
+ if (framebuffer === null) {
90
+ throw new Error('createPassAttachment: the context refused a framebuffer');
91
+ }
92
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
93
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, colour, 0);
94
+ if (depth !== null) {
95
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
96
+ }
97
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
98
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
99
+ gl.bindTexture(gl.TEXTURE_2D, null);
100
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
101
+ gl.deleteFramebuffer(framebuffer);
102
+ gl.deleteTexture(colour);
103
+ if (depth !== null)
104
+ gl.deleteTexture(depth);
105
+ throw new Error(`createPassAttachment: framebuffer incomplete (0x${status.toString(16)})`);
106
+ }
107
+ return {
108
+ backend: 'webgl2',
109
+ width,
110
+ height,
111
+ framebuffer,
112
+ colour,
113
+ depth,
114
+ dispose() {
115
+ gl.deleteFramebuffer(framebuffer);
116
+ gl.deleteTexture(colour);
117
+ if (depth !== null)
118
+ gl.deleteTexture(depth);
119
+ },
120
+ };
121
+ }
@@ -0,0 +1,31 @@
1
+ export interface PickableSource {
2
+ readonly positions: Float32Array;
3
+ readonly indices: Uint32Array;
4
+ }
5
+ export interface PickHit {
6
+ handle: number;
7
+ distance: number;
8
+ /** Where the ray met it, in world space. Reused between queries; copy to keep it. */
9
+ readonly point: Float32Array;
10
+ }
11
+ export declare class PickableSet {
12
+ private readonly entries;
13
+ private nextHandle;
14
+ private readonly localOrigin;
15
+ private readonly localDirection;
16
+ private readonly hit;
17
+ add(source: PickableSource, model: Float32Array): number;
18
+ update(handle: number, model: Float32Array): void;
19
+ remove(handle: number): void;
20
+ clear(): void;
21
+ /** The nearest registered mesh along the ray, or null. */
22
+ pick(origin: ArrayLike<number>, direction: ArrayLike<number>): PickHit | null;
23
+ /**
24
+ * Re-take the model matrix, its inverse and the world-space box.
25
+ *
26
+ * The box is the transformed corners' extent rather than the transformed local box,
27
+ * which for a rotated mesh is looser than tight and tighter than wrong. A loose broad
28
+ * phase costs triangles; a wrong one loses picks.
29
+ */
30
+ private refresh;
31
+ }
@@ -0,0 +1,172 @@
1
+ /**
2
+ * What is under a ray, from a set of registered meshes.
3
+ *
4
+ * Backend-agnostic on purpose: nothing here touches a context, so one implementation
5
+ * answers for WebGL2 and WebGPU alike and the tests need neither. Same argument
6
+ * `textLayout.ts` makes for keeping glyph arithmetic out of the two text renderers.
7
+ *
8
+ * **Broad phase then narrow phase.** A world-space box per entry rejects nearly
9
+ * everything for the cost of six compares, and only survivors pay for their triangles.
10
+ * Without it a scene of forty pickables would walk every triangle of all of them on every
11
+ * pointer move.
12
+ *
13
+ * **The box is recomputed when a model matrix is set, not when a ray is cast.** A scene
14
+ * moves a handful of things per frame and casts one ray per pointer move, so the work
15
+ * belongs on the write.
16
+ */
17
+ import { rayAabb, rayTriangle } from '../math/intersect.js';
18
+ export class PickableSet {
19
+ entries = [];
20
+ nextHandle = 1;
21
+ /* Reused per query: a pick runs on pointermove and must not allocate. */
22
+ localOrigin = new Float32Array(3);
23
+ localDirection = new Float32Array(3);
24
+ hit = { handle: 0, distance: 0, point: new Float32Array(3) };
25
+ add(source, model) {
26
+ const handle = this.nextHandle++;
27
+ const entry = {
28
+ handle,
29
+ source,
30
+ model: new Float32Array(model),
31
+ inverse: new Float32Array(16),
32
+ min: new Float32Array(3),
33
+ max: new Float32Array(3),
34
+ };
35
+ this.entries.push(entry);
36
+ this.refresh(entry, model);
37
+ return handle;
38
+ }
39
+ update(handle, model) {
40
+ const entry = this.entries.find((candidate) => candidate.handle === handle);
41
+ if (entry === undefined)
42
+ return;
43
+ this.refresh(entry, model);
44
+ }
45
+ remove(handle) {
46
+ const at = this.entries.findIndex((candidate) => candidate.handle === handle);
47
+ if (at >= 0)
48
+ this.entries.splice(at, 1);
49
+ }
50
+ clear() {
51
+ this.entries.length = 0;
52
+ }
53
+ /** The nearest registered mesh along the ray, or null. */
54
+ pick(origin, direction) {
55
+ let best = Infinity;
56
+ let bestEntry = null;
57
+ for (const entry of this.entries) {
58
+ const broad = rayAabb(origin, direction, entry.min, entry.max);
59
+ if (broad < 0 || broad > best)
60
+ continue;
61
+ transformPoint(this.localOrigin, entry.inverse, origin);
62
+ transformDirection(this.localDirection, entry.inverse, direction);
63
+ const { positions, indices } = entry.source;
64
+ for (let i = 0; i + 2 < indices.length; i += 3) {
65
+ const distance = rayTriangle(this.localOrigin, this.localDirection, positions, indices[i], indices[i + 1], indices[i + 2]);
66
+ if (distance >= 0 && distance < best) {
67
+ best = distance;
68
+ bestEntry = entry;
69
+ }
70
+ }
71
+ }
72
+ if (bestEntry === null)
73
+ return null;
74
+ this.hit.handle = bestEntry.handle;
75
+ this.hit.distance = best;
76
+ this.hit.point[0] = origin[0] + direction[0] * best;
77
+ this.hit.point[1] = origin[1] + direction[1] * best;
78
+ this.hit.point[2] = origin[2] + direction[2] * best;
79
+ return this.hit;
80
+ }
81
+ /**
82
+ * Re-take the model matrix, its inverse and the world-space box.
83
+ *
84
+ * The box is the transformed corners' extent rather than the transformed local box,
85
+ * which for a rotated mesh is looser than tight and tighter than wrong. A loose broad
86
+ * phase costs triangles; a wrong one loses picks.
87
+ */
88
+ refresh(entry, model) {
89
+ entry.model.set(model);
90
+ invertAffine(entry.inverse, model);
91
+ const { positions } = entry.source;
92
+ entry.min.fill(Infinity);
93
+ entry.max.fill(-Infinity);
94
+ for (let i = 0; i + 2 < positions.length; i += 3) {
95
+ for (let axis = 0; axis < 3; axis++) {
96
+ const value = model[axis] * positions[i] +
97
+ model[axis + 4] * positions[i + 1] +
98
+ model[axis + 8] * positions[i + 2] +
99
+ model[axis + 12];
100
+ if (value < entry.min[axis])
101
+ entry.min[axis] = value;
102
+ if (value > entry.max[axis])
103
+ entry.max[axis] = value;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ /** A point through a 4x4, with the translation. */
109
+ function transformPoint(out, m, p) {
110
+ for (let axis = 0; axis < 3; axis++) {
111
+ out[axis] =
112
+ m[axis] * p[0] +
113
+ m[axis + 4] * p[1] +
114
+ m[axis + 8] * p[2] +
115
+ m[axis + 12];
116
+ }
117
+ }
118
+ /**
119
+ * A direction through a 4x4, without the translation, left unnormalised on purpose.
120
+ *
121
+ * `localOrigin` and this are both built from the same inverse matrix, so the local ray
122
+ * `localOrigin + t * localDirection` is `inverse(model)` applied to the world ray
123
+ * `origin + t * direction` at every `t` — the model's linear part and its inverse cancel.
124
+ * That makes `t` itself invariant under the transform, scale included, uniform or not, so
125
+ * the `t` `rayTriangle` finds in local space is already the caller's world-space distance.
126
+ * Normalising this would break that: it would rescale `t` by this vector's length and
127
+ * `rayTriangle` would start returning a value that needs converting back, for nothing
128
+ * gained.
129
+ */
130
+ function transformDirection(out, m, d) {
131
+ for (let axis = 0; axis < 3; axis++) {
132
+ out[axis] =
133
+ m[axis] * d[0] +
134
+ m[axis + 4] * d[1] +
135
+ m[axis + 8] * d[2];
136
+ }
137
+ }
138
+ /**
139
+ * The inverse of a model matrix, assuming it is affine.
140
+ *
141
+ * Every model matrix this engine produces is translation, rotation and scale, so the
142
+ * general 4x4 inverse would be arithmetic spent on a bottom row that is always
143
+ * `0 0 0 1`. Written out rather than reached for from gl-matrix because this is called
144
+ * whenever anything moves.
145
+ */
146
+ function invertAffine(out, m) {
147
+ const a = m[0], b = m[1], c = m[2];
148
+ const d = m[4], e = m[5], f = m[6];
149
+ const g = m[8], h = m[9], i = m[10];
150
+ const A = e * i - f * h;
151
+ const B = f * g - d * i;
152
+ const C = d * h - e * g;
153
+ const determinant = a * A + b * B + c * C;
154
+ const s = determinant === 0 ? 0 : 1 / determinant;
155
+ out[0] = A * s;
156
+ out[1] = (c * h - b * i) * s;
157
+ out[2] = (b * f - c * e) * s;
158
+ out[3] = 0;
159
+ out[4] = B * s;
160
+ out[5] = (a * i - c * g) * s;
161
+ out[6] = (c * d - a * f) * s;
162
+ out[7] = 0;
163
+ out[8] = C * s;
164
+ out[9] = (b * g - a * h) * s;
165
+ out[10] = (a * e - b * d) * s;
166
+ out[11] = 0;
167
+ const tx = m[12], ty = m[13], tz = m[14];
168
+ out[12] = -(out[0] * tx + out[4] * ty + out[8] * tz);
169
+ out[13] = -(out[1] * tx + out[5] * ty + out[9] * tz);
170
+ out[14] = -(out[2] * tx + out[6] * ty + out[10] * tz);
171
+ out[15] = 1;
172
+ }
@@ -0,0 +1,59 @@
1
+ /** GPU target and mirrored camera for one horizontal planar reflection. */
2
+ import type { ReadonlyMat4 } from 'gl-matrix';
3
+ import type { Vec3 } from '../math/color.ts';
4
+ import { Camera } from './camera.ts';
5
+ export declare class PlanarReflection {
6
+ /** `RenderQuality.discardResolvedAttachments`, and see `end` for what it decides. */
7
+ private readonly discardResolved;
8
+ readonly camera: Camera;
9
+ readonly clipPlane: Float32Array<ArrayBuffer>;
10
+ readonly texture: WebGLTexture;
11
+ private readonly framebuffer;
12
+ private readonly depth;
13
+ private readonly scale;
14
+ private readonly maxTextureSize;
15
+ private width;
16
+ private height;
17
+ /** Refilled per resize rather than allocated; `ensureSize` runs from `Renderer.resize`. */
18
+ private readonly size;
19
+ private planeY;
20
+ private ready;
21
+ /**
22
+ * Set once the target proves it cannot be allocated, and never cleared.
23
+ *
24
+ * A reflection is an optimisation of appearance, not a requirement: a world without
25
+ * one still renders, and `WaterRenderer` already has a complete path for water that
26
+ * has no reflection to sample. So a device that refuses the allocation should lose the
27
+ * reflection and keep the scene, which is what this makes possible.
28
+ */
29
+ private unusable;
30
+ constructor(gl: WebGL2RenderingContext, scale: number, maxTextureSize: number,
31
+ /** `RenderQuality.discardResolvedAttachments`, and see `end` for what it decides. */
32
+ discardResolved?: boolean);
33
+ get viewProjection(): ReadonlyMat4;
34
+ get textureWidth(): number;
35
+ get textureHeight(): number;
36
+ /** True only after this target was rendered for the supplied water plane. */
37
+ isReadyFor(planeY: number): boolean;
38
+ /** Whether this target can be rendered into at all. See `unusable`. */
39
+ get usable(): boolean;
40
+ /** Bind, clear and return the persistent camera mirrored across `planeY`. */
41
+ begin(gl: WebGL2RenderingContext, canvasWidth: number, canvasHeight: number, source: Camera, planeY: number, clearColor: Vec3): Camera;
42
+ end(gl: WebGL2RenderingContext): void;
43
+ dispose(gl: WebGL2RenderingContext): void;
44
+ /**
45
+ * Allocate the target now, rather than on the first frame that shows water.
46
+ *
47
+ * The target is a full drawing-buffer RGBA8 texture and a depth renderbuffer, so on
48
+ * a large display it is tens of megabytes. Allocated lazily, that landed in whichever
49
+ * frame first put water on screen — measured as 28% of a 62 ms frame the first time a
50
+ * character came within sight of it, which is a stall in the middle of play rather than
51
+ * during a load.
52
+ *
53
+ * The renderer calls this from `resize`, so the cost is paid where every other
54
+ * allocation of this size is paid: once, at the size the frame is about to be, while
55
+ * the loading plate is still up.
56
+ */
57
+ prepare(gl: WebGL2RenderingContext, canvasWidth: number, canvasHeight: number): void;
58
+ private ensureSize;
59
+ }
@@ -0,0 +1,194 @@
1
+ /** GPU target and mirrored camera for one horizontal planar reflection. */
2
+ import { Camera } from './camera.js';
3
+ import { mirrorCamera, reflectionClipPlane, reflectionTargetSize, } from './planarReflectionDraw.js';
4
+ export class PlanarReflection {
5
+ discardResolved;
6
+ camera = new Camera();
7
+ clipPlane = new Float32Array(4);
8
+ texture;
9
+ framebuffer;
10
+ depth;
11
+ scale;
12
+ maxTextureSize;
13
+ width = 0;
14
+ height = 0;
15
+ /** Refilled per resize rather than allocated; `ensureSize` runs from `Renderer.resize`. */
16
+ size = { width: 0, height: 0 };
17
+ planeY = 0;
18
+ ready = false;
19
+ /**
20
+ * Set once the target proves it cannot be allocated, and never cleared.
21
+ *
22
+ * A reflection is an optimisation of appearance, not a requirement: a world without
23
+ * one still renders, and `WaterRenderer` already has a complete path for water that
24
+ * has no reflection to sample. So a device that refuses the allocation should lose the
25
+ * reflection and keep the scene, which is what this makes possible.
26
+ */
27
+ unusable = false;
28
+ constructor(gl, scale, maxTextureSize,
29
+ /** `RenderQuality.discardResolvedAttachments`, and see `end` for what it decides. */
30
+ discardResolved = true) {
31
+ this.discardResolved = discardResolved;
32
+ this.scale = scale;
33
+ this.maxTextureSize = maxTextureSize;
34
+ const texture = gl.createTexture();
35
+ if (texture === null)
36
+ throw new Error('PlanarReflection: createTexture failed');
37
+ this.texture = texture;
38
+ gl.bindTexture(gl.TEXTURE_2D, texture);
39
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
40
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
41
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
42
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
43
+ const depth = gl.createRenderbuffer();
44
+ if (depth === null)
45
+ throw new Error('PlanarReflection: createRenderbuffer failed');
46
+ this.depth = depth;
47
+ const framebuffer = gl.createFramebuffer();
48
+ if (framebuffer === null)
49
+ throw new Error('PlanarReflection: createFramebuffer failed');
50
+ this.framebuffer = framebuffer;
51
+ gl.bindTexture(gl.TEXTURE_2D, null);
52
+ }
53
+ get viewProjection() {
54
+ return this.camera.viewProjection;
55
+ }
56
+ get textureWidth() {
57
+ return this.width;
58
+ }
59
+ get textureHeight() {
60
+ return this.height;
61
+ }
62
+ /** True only after this target was rendered for the supplied water plane. */
63
+ isReadyFor(planeY) {
64
+ return this.ready && Math.abs(this.planeY - planeY) < 1e-4;
65
+ }
66
+ /** Whether this target can be rendered into at all. See `unusable`. */
67
+ get usable() {
68
+ return !this.unusable;
69
+ }
70
+ /** Bind, clear and return the persistent camera mirrored across `planeY`. */
71
+ begin(gl, canvasWidth, canvasHeight, source, planeY, clearColor) {
72
+ this.ensureSize(gl, canvasWidth, canvasHeight);
73
+ this.planeY = planeY;
74
+ /* Both chosen in `planarReflectionDraw.ts`, so both backends mirror the same world. */
75
+ const reflected = this.camera;
76
+ mirrorCamera(source, planeY, this.width / this.height, reflected);
77
+ reflectionClipPlane(source.position[1] ?? 0, planeY, this.clipPlane);
78
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
79
+ gl.viewport(0, 0, this.width, this.height);
80
+ gl.clearColor(clearColor[0], clearColor[1], clearColor[2], 1);
81
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
82
+ return reflected;
83
+ }
84
+ end(gl) {
85
+ /*
86
+ * **The mirror's depth is finished with the moment the mirror is.**
87
+ *
88
+ * It is a `DEPTH_COMPONENT24` *renderbuffer*, so no shader can sample it — the same argument
89
+ * `SceneTarget.resolve` makes about the multisampled pair, and the same one the WebGPU
90
+ * backend acts on with `depthStoreOp: 'discard'`. This asymmetry between the two backends
91
+ * was the thing worth finding: one threw the attachment away and the other unbound and left
92
+ * it, so a tile-based GPU wrote a full drawing-buffer depth attachment out to memory every
93
+ * frame that reflected, for a reader that cannot exist. At 824x1830 that is 6.0 MB a frame
94
+ * a mirror, and the consumer draws two.
95
+ *
96
+ * **Before the unbind, deliberately.** `invalidateFramebuffer` acts on whatever is bound to
97
+ * the target it is given, so below the next line it would name the default framebuffer,
98
+ * which is the frame. `SceneTarget.resolve` carries the same warning for the same reason.
99
+ */
100
+ if (this.discardResolved) {
101
+ gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.DEPTH_ATTACHMENT]);
102
+ }
103
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
104
+ this.ready = true;
105
+ }
106
+ dispose(gl) {
107
+ gl.deleteFramebuffer(this.framebuffer);
108
+ gl.deleteRenderbuffer(this.depth);
109
+ gl.deleteTexture(this.texture);
110
+ }
111
+ /**
112
+ * Allocate the target now, rather than on the first frame that shows water.
113
+ *
114
+ * The target is a full drawing-buffer RGBA8 texture and a depth renderbuffer, so on
115
+ * a large display it is tens of megabytes. Allocated lazily, that landed in whichever
116
+ * frame first put water on screen — measured as 28% of a 62 ms frame the first time a
117
+ * character came within sight of it, which is a stall in the middle of play rather than
118
+ * during a load.
119
+ *
120
+ * The renderer calls this from `resize`, so the cost is paid where every other
121
+ * allocation of this size is paid: once, at the size the frame is about to be, while
122
+ * the loading plate is still up.
123
+ */
124
+ prepare(gl, canvasWidth, canvasHeight) {
125
+ this.ensureSize(gl, canvasWidth, canvasHeight);
126
+ }
127
+ ensureSize(gl, canvasWidth, canvasHeight) {
128
+ // One refusal is enough. Retrying every resize would spend the same memory asking
129
+ // the same question and would put the warning back in the frame loop.
130
+ if (this.unusable)
131
+ return;
132
+ /* Clamped by one shared factor rather than per axis; see `reflectionTargetSize`. */
133
+ const { width, height } = reflectionTargetSize(canvasWidth, canvasHeight, this.scale, this.maxTextureSize, this.size);
134
+ if (width === this.width && height === this.height)
135
+ return;
136
+ this.width = width;
137
+ this.height = height;
138
+ this.ready = false;
139
+ gl.bindTexture(gl.TEXTURE_2D, this.texture);
140
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
141
+ gl.bindRenderbuffer(gl.RENDERBUFFER, this.depth);
142
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, width, height);
143
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
144
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);
145
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depth);
146
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
147
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
148
+ /*
149
+ * A lost context reports every attachment as unusable, so this check fires with
150
+ * FRAMEBUFFER_UNSUPPORTED (0x8CDD) for a reason that is not a programming error
151
+ * and cannot be fixed by the caller. Throwing there breaks the engine's own rule
152
+ * that only init fails loudly and the running frame never throws — and it broke it
153
+ * from `Renderer.resize`, a window listener, so the exception escaped into the
154
+ * page rather than into anything that could handle it.
155
+ *
156
+ * It was reported as an uncaught throw immediately after CONTEXT_LOST_WEBGL.
157
+ * A genuine misconfiguration still throws; a dead context is simply nothing to do.
158
+ */
159
+ if (gl.isContextLost())
160
+ return;
161
+ /*
162
+ * A refused allocation disables the reflection. It does not stop the frame.
163
+ *
164
+ * This used to throw, and the throw was reached from `Renderer.resize` — which a
165
+ * consumer calls every frame. On a device that cannot afford this target the
166
+ * result was not a missing reflection, it was an exception escaping the middle of
167
+ * every single frame: nothing after `resize` ran, the canvas kept whatever was
168
+ * last drawn, and the scene appeared to render as a fragment of itself. Reported
169
+ * from an iOS webview as a room with only its fire in it, on the one scene in the
170
+ * project that uses a planar reflection.
171
+ *
172
+ * It also broke the rule the block above already states, and states correctly:
173
+ * only initialisation fails loudly, and a running frame never throws. A driver
174
+ * refusing tens of megabytes on a memory-constrained device is the same category
175
+ * as a lost context — not a programming error, and not something the caller can
176
+ * fix by being more careful.
177
+ *
178
+ * Loud in the console, because a genuine misconfiguration must still be findable,
179
+ * and once rather than sixty times a second.
180
+ */
181
+ this.unusable = true;
182
+ this.ready = false;
183
+ console.warn(`PlanarReflection: framebuffer incomplete (0x${status.toString(16)}) at ` +
184
+ `${width}x${height}; reflections are off for the rest of this session.`);
185
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
186
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
187
+ gl.bindTexture(gl.TEXTURE_2D, null);
188
+ return;
189
+ }
190
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
191
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
192
+ gl.bindTexture(gl.TEXTURE_2D, null);
193
+ }
194
+ }
@@ -0,0 +1,31 @@
1
+ import type { Camera } from './camera.ts';
2
+ /**
3
+ * Stand the camera on the other side of the plane, looking back.
4
+ *
5
+ * A mirror across a horizontal plane negates height about it and negates pitch, and leaves yaw
6
+ * and the lens alone. **The aspect is the target's rather than the canvas's**: a reflection is
7
+ * rendered at a scale, and projecting it at the canvas's aspect stretches the mirror against
8
+ * the surface it is sampled onto.
9
+ */
10
+ export declare function mirrorCamera(source: Camera, planeY: number, aspect: number, out: Camera): void;
11
+ /**
12
+ * The half-space the mirrored pass may draw, as `dot(vec4(worldPos, 1), plane) >= 0`.
13
+ *
14
+ * **A mirror reflects the scene on the viewer's side of the plane**, so which side that is
15
+ * follows the camera: above water it keeps y ≥ plane, below it keeps y ≤ plane. Deciding it
16
+ * from a constant instead is a reflection that inverts the moment a swimmer's head goes under.
17
+ */
18
+ export declare function reflectionClipPlane(sourceY: number, planeY: number, out: Float32Array): void;
19
+ /** How large a reflection target may be, given the drawing buffer and the device's ceiling. */
20
+ export interface ReflectionSize {
21
+ width: number;
22
+ height: number;
23
+ }
24
+ /**
25
+ * Size the target, clamped by **one shared factor** rather than per axis.
26
+ *
27
+ * Clamping each axis independently squashes the reflection on a drawing buffer wider than the
28
+ * GPU's texture limit, because the mirror is then rendered at one aspect and sampled at
29
+ * another. Scaling both by the tighter of the two ratios keeps it square and merely smaller.
30
+ */
31
+ export declare function reflectionTargetSize(canvasWidth: number, canvasHeight: number, scale: number, maxTextureSize: number, out: ReflectionSize): ReflectionSize;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * What a planar reflection *is*, before any of it touches a device.
3
+ *
4
+ * Three decisions, none of which is a binding: where the mirrored camera stands, which half of
5
+ * the world it may draw, and how large the target may be. A second copy of any of them is a
6
+ * mirror that disagrees with itself — a reflection shot from a slightly different place, or one
7
+ * that leaks the near bank of a pool into the water in front of it — and every one of those
8
+ * reads as a shading problem rather than as a camera one. That is the 2026-08-13 rule in
9
+ * `AGENTS.md`, applied to the pass with the most arithmetic in it.
10
+ */
11
+ /**
12
+ * Keeps fragments crossing the resting plane from opening a hairline seam.
13
+ *
14
+ * The clip is a plane test on a *displaced* surface, so geometry that touches the waterline
15
+ * lands on both sides of it by a fraction of a millimetre depending on the wave. Three
16
+ * centimetres of tolerance keeps the shoreline welded; more than that starts showing the
17
+ * underside of things standing in the water.
18
+ */
19
+ const CLIP_TOLERANCE = 0.03;
20
+ /**
21
+ * Stand the camera on the other side of the plane, looking back.
22
+ *
23
+ * A mirror across a horizontal plane negates height about it and negates pitch, and leaves yaw
24
+ * and the lens alone. **The aspect is the target's rather than the canvas's**: a reflection is
25
+ * rendered at a scale, and projecting it at the canvas's aspect stretches the mirror against
26
+ * the surface it is sampled onto.
27
+ */
28
+ export function mirrorCamera(source, planeY, aspect, out) {
29
+ out.position[0] = source.position[0] ?? 0;
30
+ out.position[1] = planeY * 2 - (source.position[1] ?? 0);
31
+ out.position[2] = source.position[2] ?? 0;
32
+ out.yaw = source.yaw;
33
+ out.pitch = -source.pitch;
34
+ out.fovYDeg = source.fovYDeg;
35
+ out.near = source.near;
36
+ out.far = source.far;
37
+ out.updateMatrices(aspect);
38
+ }
39
+ /**
40
+ * The half-space the mirrored pass may draw, as `dot(vec4(worldPos, 1), plane) >= 0`.
41
+ *
42
+ * **A mirror reflects the scene on the viewer's side of the plane**, so which side that is
43
+ * follows the camera: above water it keeps y ≥ plane, below it keeps y ≤ plane. Deciding it
44
+ * from a constant instead is a reflection that inverts the moment a swimmer's head goes under.
45
+ */
46
+ export function reflectionClipPlane(sourceY, planeY, out) {
47
+ const side = sourceY >= planeY ? 1 : -1;
48
+ out[0] = 0;
49
+ out[1] = side;
50
+ out[2] = 0;
51
+ out[3] = -side * planeY + CLIP_TOLERANCE;
52
+ }
53
+ /**
54
+ * Size the target, clamped by **one shared factor** rather than per axis.
55
+ *
56
+ * Clamping each axis independently squashes the reflection on a drawing buffer wider than the
57
+ * GPU's texture limit, because the mirror is then rendered at one aspect and sampled at
58
+ * another. Scaling both by the tighter of the two ratios keeps it square and merely smaller.
59
+ */
60
+ export function reflectionTargetSize(canvasWidth, canvasHeight, scale, maxTextureSize, out) {
61
+ const targetScale = Math.min(scale, maxTextureSize / Math.max(canvasWidth, 1), maxTextureSize / Math.max(canvasHeight, 1));
62
+ out.width = Math.max(Math.round(canvasWidth * targetScale), 1);
63
+ out.height = Math.max(Math.round(canvasHeight * targetScale), 1);
64
+ return out;
65
+ }