@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,225 @@
1
+ import { glSceneDepthFormat } from './depthConvention.ts';
2
+ import type { PassDevice } from './pass.ts';
3
+
4
+ /**
5
+ * A render target a contributed pass owns: it renders into this and samples it later.
6
+ *
7
+ * **The asymmetry with `PassDefinition.reads` is the whole design and is worth reading first.**
8
+ * What a pass *writes into the frame* is not negotiable and is refused: every built-in verb writes
9
+ * the current target, the executor replays a flush's nodes into one open pass, and a node
10
+ * declaring some other write-set would schedule as a pass nothing opens — so letting a package
11
+ * name its writes hands it the one declaration nothing can enforce. A target the pass *owns* is
12
+ * outside that set by construction, which is exactly what makes it declarable when a write to the
13
+ * frame is not.
14
+ *
15
+ * What it is for: a package's own shadow map, blur pyramid, picking buffer or intermediate. A
16
+ * `@driftengine/splats` pass wanting a depth prepass of its own, a UI package wanting a cached
17
+ * layer, an XR package wanting a per-eye scratch.
18
+ *
19
+ * **Two implementations behind one call**, the same split `PassDevice` itself takes, and for the
20
+ * same reason: a neutral device abstraction would be a second renderer API and would buy nothing,
21
+ * because a package's shader, buffer layout and pipeline differ per backend anyway. The union
22
+ * makes the branch explicit and typed.
23
+ *
24
+ * **Single-sampled, and that is a decision rather than an omission.** A multisampled pass-owned
25
+ * target needs a resolve target beside it and a decision about who allocates it, and no
26
+ * contributed pass has asked. *What that costs* is that a pass wanting antialiased geometry of its
27
+ * own supersamples instead. *What would reverse it* is a contributed pass that needs it, at which
28
+ * point `samples` joins the options and the resolve target is created with the colour one.
29
+ *
30
+ * **`dispose` is the pass's to call**, from its own `dispose`, and nothing calls it for you: the
31
+ * renderer knows what it created and this is not that. A target left undisposed is a texture the
32
+ * driver holds until the context goes.
33
+ */
34
+ export interface PassAttachmentOptions {
35
+ /** For the label a backend gives the texture, and for diagnostics. */
36
+ readonly label?: string;
37
+ readonly width: number;
38
+ readonly height: number;
39
+ /**
40
+ * Eight bits a channel, or half floats.
41
+ *
42
+ * Two rather than the format zoo either API offers, because these are the two a pass drawing
43
+ * into its own target wants: a picking buffer or a cached layer is `rgba8`, and anything
44
+ * carrying light before a tone curve is `rgba16float`. A third would need a reason.
45
+ */
46
+ readonly format?: 'rgba8' | 'rgba16float';
47
+ /** Whether to attach a depth buffer. Default true, because a pass with geometry wants one. */
48
+ readonly depth?: boolean;
49
+ }
50
+
51
+ export type PassTarget = {
52
+ readonly width: number;
53
+ readonly height: number;
54
+ /**
55
+ * Free the GPU objects. Call it from the pass's own `dispose`, and call it before creating a
56
+ * replacement — **resizing is dispose-and-recreate** rather than a method, because a resize is
57
+ * not a per-frame path and a mutable target would be one more thing to keep consistent.
58
+ */
59
+ dispose(): void;
60
+ } & (
61
+ | {
62
+ readonly backend: 'webgl2';
63
+ /** Bind this, draw, and bind `null` again. See `PassDefinition.prepare`. */
64
+ readonly framebuffer: WebGLFramebuffer;
65
+ readonly colour: WebGLTexture;
66
+ readonly depth: WebGLTexture | null;
67
+ }
68
+ | {
69
+ readonly backend: 'webgpu';
70
+ readonly colour: GPUTexture;
71
+ readonly colourView: GPUTextureView;
72
+ readonly depth: GPUTexture | null;
73
+ readonly depthView: GPUTextureView | null;
74
+ /** What a pipeline drawing into this must declare. */
75
+ readonly format: GPUTextureFormat;
76
+ readonly depthFormat: GPUTextureFormat | null;
77
+ }
78
+ );
79
+
80
+ /**
81
+ * Build one. Called from a pass's `init`, or from its `prepare` when the size has changed.
82
+ *
83
+ * **Restores the default framebuffer on WebGL2**, rather than whatever was bound before. Both
84
+ * points where a pass may call this — `init`, outside a frame, and `prepare`, whose contract is
85
+ * that the default framebuffer is bound on entry and on exit — have the default bound, so
86
+ * restoring to it is restoring what was there. Reading the binding back to restore it exactly
87
+ * would be a synchronous driver query in return for covering a case the contract forbids.
88
+ *
89
+ * Fails fast on a size that cannot work, which is the init-time rule: a zero-sized attachment is a
90
+ * framebuffer that is never complete, and a driver reports that as a black draw rather than an
91
+ * error.
92
+ */
93
+ export function createPassAttachment(
94
+ device: PassDevice,
95
+ options: PassAttachmentOptions,
96
+ ): PassTarget {
97
+ const { width, height } = options;
98
+ if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1) {
99
+ throw new Error(
100
+ `createPassAttachment: ${width}x${height} is not a size — width and height must be positive integers`,
101
+ );
102
+ }
103
+ const wantDepth = options.depth ?? true;
104
+ const label = options.label ?? 'pass target';
105
+ const format = options.format ?? 'rgba8';
106
+
107
+ if (device.backend === 'webgpu') {
108
+ const { device: gpu } = device;
109
+ /*
110
+ * The two usage bits by value, which is what this renderer already does at every other
111
+ * `createTexture`: `GPUTextureUsage` is a global the type definitions declare and Node does
112
+ * not provide, so naming it here would make this module unimportable in a test that never
113
+ * touches a GPU.
114
+ */
115
+ const RENDER_ATTACHMENT = 0x10;
116
+ const TEXTURE_BINDING = 0x04;
117
+ const colour = gpu.createTexture({
118
+ label: `${label} colour`,
119
+ size: { width, height },
120
+ format: format === 'rgba8' ? 'rgba8unorm' : 'rgba16float',
121
+ usage: RENDER_ATTACHMENT | TEXTURE_BINDING,
122
+ });
123
+ /* The frame's own depth format, so a pass may build one pipeline for its target and the
124
+ frame rather than two that differ in a field it did not choose. */
125
+ const depth = wantDepth
126
+ ? gpu.createTexture({
127
+ label: `${label} depth`,
128
+ size: { width, height },
129
+ format: device.depthFormat,
130
+ usage: RENDER_ATTACHMENT,
131
+ })
132
+ : null;
133
+ return {
134
+ backend: 'webgpu',
135
+ width,
136
+ height,
137
+ colour,
138
+ colourView: colour.createView(),
139
+ depth,
140
+ depthView: depth === null ? null : depth.createView(),
141
+ format: colour.format,
142
+ depthFormat: depth === null ? null : device.depthFormat,
143
+ dispose(): void {
144
+ colour.destroy();
145
+ depth?.destroy();
146
+ },
147
+ };
148
+ }
149
+
150
+ const { gl } = device;
151
+ const colour = gl.createTexture();
152
+ if (colour === null) throw new Error('createPassAttachment: the context refused a texture');
153
+ gl.bindTexture(gl.TEXTURE_2D, colour);
154
+ gl.texImage2D(
155
+ gl.TEXTURE_2D,
156
+ 0,
157
+ format === 'rgba8' ? gl.RGBA8 : gl.RGBA16F,
158
+ width,
159
+ height,
160
+ 0,
161
+ gl.RGBA,
162
+ format === 'rgba8' ? gl.UNSIGNED_BYTE : gl.HALF_FLOAT,
163
+ null,
164
+ );
165
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
166
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
167
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
168
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
169
+
170
+ let depth: WebGLTexture | null = null;
171
+ if (wantDepth) {
172
+ const sceneDepth = glSceneDepthFormat(gl);
173
+ depth = gl.createTexture();
174
+ if (depth === null) throw new Error('createPassAttachment: the context refused a texture');
175
+ gl.bindTexture(gl.TEXTURE_2D, depth);
176
+ gl.texImage2D(
177
+ gl.TEXTURE_2D,
178
+ 0,
179
+ sceneDepth.internalFormat,
180
+ width,
181
+ height,
182
+ 0,
183
+ gl.DEPTH_COMPONENT,
184
+ sceneDepth.type,
185
+ null,
186
+ );
187
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
188
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
189
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
190
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
191
+ }
192
+
193
+ const framebuffer = gl.createFramebuffer();
194
+ if (framebuffer === null) {
195
+ throw new Error('createPassAttachment: the context refused a framebuffer');
196
+ }
197
+ gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
198
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, colour, 0);
199
+ if (depth !== null) {
200
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depth, 0);
201
+ }
202
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
203
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
204
+ gl.bindTexture(gl.TEXTURE_2D, null);
205
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
206
+ gl.deleteFramebuffer(framebuffer);
207
+ gl.deleteTexture(colour);
208
+ if (depth !== null) gl.deleteTexture(depth);
209
+ throw new Error(`createPassAttachment: framebuffer incomplete (0x${status.toString(16)})`);
210
+ }
211
+
212
+ return {
213
+ backend: 'webgl2',
214
+ width,
215
+ height,
216
+ framebuffer,
217
+ colour,
218
+ depth,
219
+ dispose(): void {
220
+ gl.deleteFramebuffer(framebuffer);
221
+ gl.deleteTexture(colour);
222
+ if (depth !== null) gl.deleteTexture(depth);
223
+ },
224
+ };
225
+ }
@@ -0,0 +1,222 @@
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.ts';
18
+
19
+ export interface PickableSource {
20
+ readonly positions: Float32Array;
21
+ readonly indices: Uint32Array;
22
+ }
23
+
24
+ export interface PickHit {
25
+ handle: number;
26
+ distance: number;
27
+ /** Where the ray met it, in world space. Reused between queries; copy to keep it. */
28
+ readonly point: Float32Array;
29
+ }
30
+
31
+ interface Entry {
32
+ handle: number;
33
+ source: PickableSource;
34
+ model: Float32Array;
35
+ inverse: Float32Array;
36
+ min: Float32Array;
37
+ max: Float32Array;
38
+ }
39
+
40
+ export class PickableSet {
41
+ private readonly entries: Entry[] = [];
42
+ private nextHandle = 1;
43
+
44
+ /* Reused per query: a pick runs on pointermove and must not allocate. */
45
+ private readonly localOrigin = new Float32Array(3);
46
+ private readonly localDirection = new Float32Array(3);
47
+ private readonly hit: PickHit = { handle: 0, distance: 0, point: new Float32Array(3) };
48
+
49
+ add(source: PickableSource, model: Float32Array): number {
50
+ const handle = this.nextHandle++;
51
+ const entry: Entry = {
52
+ handle,
53
+ source,
54
+ model: new Float32Array(model),
55
+ inverse: new Float32Array(16),
56
+ min: new Float32Array(3),
57
+ max: new Float32Array(3),
58
+ };
59
+ this.entries.push(entry);
60
+ this.refresh(entry, model);
61
+ return handle;
62
+ }
63
+
64
+ update(handle: number, model: Float32Array): void {
65
+ const entry = this.entries.find((candidate) => candidate.handle === handle);
66
+ if (entry === undefined) return;
67
+ this.refresh(entry, model);
68
+ }
69
+
70
+ remove(handle: number): void {
71
+ const at = this.entries.findIndex((candidate) => candidate.handle === handle);
72
+ if (at >= 0) this.entries.splice(at, 1);
73
+ }
74
+
75
+ clear(): void {
76
+ this.entries.length = 0;
77
+ }
78
+
79
+ /** The nearest registered mesh along the ray, or null. */
80
+ pick(origin: ArrayLike<number>, direction: ArrayLike<number>): PickHit | null {
81
+ let best = Infinity;
82
+ let bestEntry: Entry | null = null;
83
+
84
+ for (const entry of this.entries) {
85
+ const broad = rayAabb(origin, direction, entry.min, entry.max);
86
+ if (broad < 0 || broad > best) continue;
87
+
88
+ transformPoint(this.localOrigin, entry.inverse, origin);
89
+ transformDirection(this.localDirection, entry.inverse, direction);
90
+
91
+ const { positions, indices } = entry.source;
92
+ for (let i = 0; i + 2 < indices.length; i += 3) {
93
+ const distance = rayTriangle(
94
+ this.localOrigin,
95
+ this.localDirection,
96
+ positions,
97
+ indices[i] as number,
98
+ indices[i + 1] as number,
99
+ indices[i + 2] as number,
100
+ );
101
+ if (distance >= 0 && distance < best) {
102
+ best = distance;
103
+ bestEntry = entry;
104
+ }
105
+ }
106
+ }
107
+
108
+ if (bestEntry === null) return null;
109
+ this.hit.handle = bestEntry.handle;
110
+ this.hit.distance = best;
111
+ this.hit.point[0] = (origin[0] as number) + (direction[0] as number) * best;
112
+ this.hit.point[1] = (origin[1] as number) + (direction[1] as number) * best;
113
+ this.hit.point[2] = (origin[2] as number) + (direction[2] as number) * best;
114
+ return this.hit;
115
+ }
116
+
117
+ /**
118
+ * Re-take the model matrix, its inverse and the world-space box.
119
+ *
120
+ * The box is the transformed corners' extent rather than the transformed local box,
121
+ * which for a rotated mesh is looser than tight and tighter than wrong. A loose broad
122
+ * phase costs triangles; a wrong one loses picks.
123
+ */
124
+ private refresh(entry: Entry, model: Float32Array): void {
125
+ entry.model.set(model);
126
+ invertAffine(entry.inverse, model);
127
+
128
+ const { positions } = entry.source;
129
+ entry.min.fill(Infinity);
130
+ entry.max.fill(-Infinity);
131
+ for (let i = 0; i + 2 < positions.length; i += 3) {
132
+ for (let axis = 0; axis < 3; axis++) {
133
+ const value =
134
+ (model[axis] as number) * (positions[i] as number) +
135
+ (model[axis + 4] as number) * (positions[i + 1] as number) +
136
+ (model[axis + 8] as number) * (positions[i + 2] as number) +
137
+ (model[axis + 12] as number);
138
+ if (value < (entry.min[axis] as number)) entry.min[axis] = value;
139
+ if (value > (entry.max[axis] as number)) entry.max[axis] = value;
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ /** A point through a 4x4, with the translation. */
146
+ function transformPoint(out: Float32Array, m: Float32Array, p: ArrayLike<number>): void {
147
+ for (let axis = 0; axis < 3; axis++) {
148
+ out[axis] =
149
+ (m[axis] as number) * (p[0] as number) +
150
+ (m[axis + 4] as number) * (p[1] as number) +
151
+ (m[axis + 8] as number) * (p[2] as number) +
152
+ (m[axis + 12] as number);
153
+ }
154
+ }
155
+
156
+ /**
157
+ * A direction through a 4x4, without the translation, left unnormalised on purpose.
158
+ *
159
+ * `localOrigin` and this are both built from the same inverse matrix, so the local ray
160
+ * `localOrigin + t * localDirection` is `inverse(model)` applied to the world ray
161
+ * `origin + t * direction` at every `t` — the model's linear part and its inverse cancel.
162
+ * That makes `t` itself invariant under the transform, scale included, uniform or not, so
163
+ * the `t` `rayTriangle` finds in local space is already the caller's world-space distance.
164
+ * Normalising this would break that: it would rescale `t` by this vector's length and
165
+ * `rayTriangle` would start returning a value that needs converting back, for nothing
166
+ * gained.
167
+ */
168
+ function transformDirection(out: Float32Array, m: Float32Array, d: ArrayLike<number>): void {
169
+ for (let axis = 0; axis < 3; axis++) {
170
+ out[axis] =
171
+ (m[axis] as number) * (d[0] as number) +
172
+ (m[axis + 4] as number) * (d[1] as number) +
173
+ (m[axis + 8] as number) * (d[2] as number);
174
+ }
175
+ }
176
+
177
+ /**
178
+ * The inverse of a model matrix, assuming it is affine.
179
+ *
180
+ * Every model matrix this engine produces is translation, rotation and scale, so the
181
+ * general 4x4 inverse would be arithmetic spent on a bottom row that is always
182
+ * `0 0 0 1`. Written out rather than reached for from gl-matrix because this is called
183
+ * whenever anything moves.
184
+ */
185
+ function invertAffine(out: Float32Array, m: Float32Array): void {
186
+ const a = m[0] as number,
187
+ b = m[1] as number,
188
+ c = m[2] as number;
189
+ const d = m[4] as number,
190
+ e = m[5] as number,
191
+ f = m[6] as number;
192
+ const g = m[8] as number,
193
+ h = m[9] as number,
194
+ i = m[10] as number;
195
+
196
+ const A = e * i - f * h;
197
+ const B = f * g - d * i;
198
+ const C = d * h - e * g;
199
+ const determinant = a * A + b * B + c * C;
200
+ const s = determinant === 0 ? 0 : 1 / determinant;
201
+
202
+ out[0] = A * s;
203
+ out[1] = (c * h - b * i) * s;
204
+ out[2] = (b * f - c * e) * s;
205
+ out[3] = 0;
206
+ out[4] = B * s;
207
+ out[5] = (a * i - c * g) * s;
208
+ out[6] = (c * d - a * f) * s;
209
+ out[7] = 0;
210
+ out[8] = C * s;
211
+ out[9] = (b * g - a * h) * s;
212
+ out[10] = (a * e - b * d) * s;
213
+ out[11] = 0;
214
+
215
+ const tx = m[12] as number,
216
+ ty = m[13] as number,
217
+ tz = m[14] as number;
218
+ out[12] = -((out[0] as number) * tx + (out[4] as number) * ty + (out[8] as number) * tz);
219
+ out[13] = -((out[1] as number) * tx + (out[5] as number) * ty + (out[9] as number) * tz);
220
+ out[14] = -((out[2] as number) * tx + (out[6] as number) * ty + (out[10] as number) * tz);
221
+ out[15] = 1;
222
+ }
@@ -0,0 +1,233 @@
1
+ /** GPU target and mirrored camera for one horizontal planar reflection. */
2
+
3
+ import type { ReadonlyMat4 } from 'gl-matrix';
4
+ import type { Vec3 } from '../math/color.ts';
5
+ import { Camera } from './camera.ts';
6
+ import {
7
+ mirrorCamera,
8
+ reflectionClipPlane,
9
+ reflectionTargetSize,
10
+ type ReflectionSize,
11
+ } from './planarReflectionDraw.ts';
12
+
13
+ export class PlanarReflection {
14
+ readonly camera = new Camera();
15
+ readonly clipPlane = new Float32Array(4);
16
+ readonly texture: WebGLTexture;
17
+
18
+ private readonly framebuffer: WebGLFramebuffer;
19
+ private readonly depth: WebGLRenderbuffer;
20
+ private readonly scale: number;
21
+ private readonly maxTextureSize: number;
22
+ private width = 0;
23
+ private height = 0;
24
+ /** Refilled per resize rather than allocated; `ensureSize` runs from `Renderer.resize`. */
25
+ private readonly size: ReflectionSize = { width: 0, height: 0 };
26
+ private planeY = 0;
27
+ private ready = false;
28
+ /**
29
+ * Set once the target proves it cannot be allocated, and never cleared.
30
+ *
31
+ * A reflection is an optimisation of appearance, not a requirement: a world without
32
+ * one still renders, and `WaterRenderer` already has a complete path for water that
33
+ * has no reflection to sample. So a device that refuses the allocation should lose the
34
+ * reflection and keep the scene, which is what this makes possible.
35
+ */
36
+ private unusable = false;
37
+
38
+ constructor(
39
+ gl: WebGL2RenderingContext,
40
+ scale: number,
41
+ maxTextureSize: number,
42
+ /** `RenderQuality.discardResolvedAttachments`, and see `end` for what it decides. */
43
+ private readonly discardResolved = true,
44
+ ) {
45
+ this.scale = scale;
46
+ this.maxTextureSize = maxTextureSize;
47
+
48
+ const texture = gl.createTexture();
49
+ if (texture === null) throw new Error('PlanarReflection: createTexture failed');
50
+ this.texture = texture;
51
+ gl.bindTexture(gl.TEXTURE_2D, texture);
52
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
53
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
54
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
55
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
56
+
57
+ const depth = gl.createRenderbuffer();
58
+ if (depth === null) throw new Error('PlanarReflection: createRenderbuffer failed');
59
+ this.depth = depth;
60
+
61
+ const framebuffer = gl.createFramebuffer();
62
+ if (framebuffer === null) throw new Error('PlanarReflection: createFramebuffer failed');
63
+ this.framebuffer = framebuffer;
64
+ gl.bindTexture(gl.TEXTURE_2D, null);
65
+ }
66
+
67
+ get viewProjection(): ReadonlyMat4 {
68
+ return this.camera.viewProjection;
69
+ }
70
+
71
+ get textureWidth(): number {
72
+ return this.width;
73
+ }
74
+
75
+ get textureHeight(): number {
76
+ return this.height;
77
+ }
78
+
79
+ /** True only after this target was rendered for the supplied water plane. */
80
+ isReadyFor(planeY: number): boolean {
81
+ return this.ready && Math.abs(this.planeY - planeY) < 1e-4;
82
+ }
83
+
84
+ /** Whether this target can be rendered into at all. See `unusable`. */
85
+ get usable(): boolean {
86
+ return !this.unusable;
87
+ }
88
+
89
+ /** Bind, clear and return the persistent camera mirrored across `planeY`. */
90
+ begin(
91
+ gl: WebGL2RenderingContext,
92
+ canvasWidth: number,
93
+ canvasHeight: number,
94
+ source: Camera,
95
+ planeY: number,
96
+ clearColor: Vec3,
97
+ ): Camera {
98
+ this.ensureSize(gl, canvasWidth, canvasHeight);
99
+ this.planeY = planeY;
100
+
101
+ /* Both chosen in `planarReflectionDraw.ts`, so both backends mirror the same world. */
102
+ const reflected = this.camera;
103
+ mirrorCamera(source, planeY, this.width / this.height, reflected);
104
+ reflectionClipPlane(source.position[1] ?? 0, planeY, this.clipPlane);
105
+
106
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
107
+ gl.viewport(0, 0, this.width, this.height);
108
+ gl.clearColor(clearColor[0], clearColor[1], clearColor[2], 1);
109
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
110
+ return reflected;
111
+ }
112
+
113
+ end(gl: WebGL2RenderingContext): void {
114
+ /*
115
+ * **The mirror's depth is finished with the moment the mirror is.**
116
+ *
117
+ * It is a `DEPTH_COMPONENT24` *renderbuffer*, so no shader can sample it — the same argument
118
+ * `SceneTarget.resolve` makes about the multisampled pair, and the same one the WebGPU
119
+ * backend acts on with `depthStoreOp: 'discard'`. This asymmetry between the two backends
120
+ * was the thing worth finding: one threw the attachment away and the other unbound and left
121
+ * it, so a tile-based GPU wrote a full drawing-buffer depth attachment out to memory every
122
+ * frame that reflected, for a reader that cannot exist. At 824x1830 that is 6.0 MB a frame
123
+ * a mirror, and the consumer draws two.
124
+ *
125
+ * **Before the unbind, deliberately.** `invalidateFramebuffer` acts on whatever is bound to
126
+ * the target it is given, so below the next line it would name the default framebuffer,
127
+ * which is the frame. `SceneTarget.resolve` carries the same warning for the same reason.
128
+ */
129
+ if (this.discardResolved) {
130
+ gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.DEPTH_ATTACHMENT]);
131
+ }
132
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
133
+ this.ready = true;
134
+ }
135
+
136
+ dispose(gl: WebGL2RenderingContext): void {
137
+ gl.deleteFramebuffer(this.framebuffer);
138
+ gl.deleteRenderbuffer(this.depth);
139
+ gl.deleteTexture(this.texture);
140
+ }
141
+
142
+ /**
143
+ * Allocate the target now, rather than on the first frame that shows water.
144
+ *
145
+ * The target is a full drawing-buffer RGBA8 texture and a depth renderbuffer, so on
146
+ * a large display it is tens of megabytes. Allocated lazily, that landed in whichever
147
+ * frame first put water on screen — measured as 28% of a 62 ms frame the first time a
148
+ * character came within sight of it, which is a stall in the middle of play rather than
149
+ * during a load.
150
+ *
151
+ * The renderer calls this from `resize`, so the cost is paid where every other
152
+ * allocation of this size is paid: once, at the size the frame is about to be, while
153
+ * the loading plate is still up.
154
+ */
155
+ prepare(gl: WebGL2RenderingContext, canvasWidth: number, canvasHeight: number): void {
156
+ this.ensureSize(gl, canvasWidth, canvasHeight);
157
+ }
158
+
159
+ private ensureSize(gl: WebGL2RenderingContext, canvasWidth: number, canvasHeight: number): void {
160
+ // One refusal is enough. Retrying every resize would spend the same memory asking
161
+ // the same question and would put the warning back in the frame loop.
162
+ if (this.unusable) return;
163
+ /* Clamped by one shared factor rather than per axis; see `reflectionTargetSize`. */
164
+ const { width, height } = reflectionTargetSize(
165
+ canvasWidth,
166
+ canvasHeight,
167
+ this.scale,
168
+ this.maxTextureSize,
169
+ this.size,
170
+ );
171
+ if (width === this.width && height === this.height) return;
172
+
173
+ this.width = width;
174
+ this.height = height;
175
+ this.ready = false;
176
+ gl.bindTexture(gl.TEXTURE_2D, this.texture);
177
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
178
+ gl.bindRenderbuffer(gl.RENDERBUFFER, this.depth);
179
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT24, width, height);
180
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);
181
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);
182
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depth);
183
+ const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
184
+ if (status !== gl.FRAMEBUFFER_COMPLETE) {
185
+ /*
186
+ * A lost context reports every attachment as unusable, so this check fires with
187
+ * FRAMEBUFFER_UNSUPPORTED (0x8CDD) for a reason that is not a programming error
188
+ * and cannot be fixed by the caller. Throwing there breaks the engine's own rule
189
+ * that only init fails loudly and the running frame never throws — and it broke it
190
+ * from `Renderer.resize`, a window listener, so the exception escaped into the
191
+ * page rather than into anything that could handle it.
192
+ *
193
+ * It was reported as an uncaught throw immediately after CONTEXT_LOST_WEBGL.
194
+ * A genuine misconfiguration still throws; a dead context is simply nothing to do.
195
+ */
196
+ if (gl.isContextLost()) return;
197
+
198
+ /*
199
+ * A refused allocation disables the reflection. It does not stop the frame.
200
+ *
201
+ * This used to throw, and the throw was reached from `Renderer.resize` — which a
202
+ * consumer calls every frame. On a device that cannot afford this target the
203
+ * result was not a missing reflection, it was an exception escaping the middle of
204
+ * every single frame: nothing after `resize` ran, the canvas kept whatever was
205
+ * last drawn, and the scene appeared to render as a fragment of itself. Reported
206
+ * from an iOS webview as a room with only its fire in it, on the one scene in the
207
+ * project that uses a planar reflection.
208
+ *
209
+ * It also broke the rule the block above already states, and states correctly:
210
+ * only initialisation fails loudly, and a running frame never throws. A driver
211
+ * refusing tens of megabytes on a memory-constrained device is the same category
212
+ * as a lost context — not a programming error, and not something the caller can
213
+ * fix by being more careful.
214
+ *
215
+ * Loud in the console, because a genuine misconfiguration must still be findable,
216
+ * and once rather than sixty times a second.
217
+ */
218
+ this.unusable = true;
219
+ this.ready = false;
220
+ console.warn(
221
+ `PlanarReflection: framebuffer incomplete (0x${status.toString(16)}) at ` +
222
+ `${width}x${height}; reflections are off for the rest of this session.`,
223
+ );
224
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
225
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
226
+ gl.bindTexture(gl.TEXTURE_2D, null);
227
+ return;
228
+ }
229
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
230
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
231
+ gl.bindTexture(gl.TEXTURE_2D, null);
232
+ }
233
+ }