@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,140 @@
1
+ import type { ReadonlyMat4, ReadonlyVec3 } from 'gl-matrix';
2
+ /**
3
+ * A decal evaluated at render time: a box, the depth buffer, and whatever surface is inside it.
4
+ *
5
+ * **`projectDecal` is the other half of this and neither replaces the other.** That one clips the
6
+ * receiving surface's own triangles to a projector box and lifts them off along their normals, so
7
+ * the mark *is* the surface: it follows every curve and bump exactly, it is lit as the surface is
8
+ * lit, and it costs nothing per frame. What it cannot do is change afterwards. The clip happens
9
+ * once, against the mesh as it stood, so a mark on something that later deforms rides the old
10
+ * shape, and a mark on something that streams in later cannot be made at all because there was
11
+ * nothing to clip.
12
+ *
13
+ * **This is the projector kept alive instead.** Nothing is clipped and no mesh is built: the pass
14
+ * reads the depth the frame has already drawn, turns each pixel back into the world point it
15
+ * stands for, and asks whether that point is inside the box. A surface that deforms, streams in,
16
+ * or is drawn by something with no CPU-side geometry at all — a heightfield, a skinned mesh, an
17
+ * instanced crowd — is marked on the frame it is drawn, because the mark is decided from the
18
+ * picture rather than from the mesh.
19
+ *
20
+ * **What it costs, and it is the honest half of the trade.** The mark is applied to the finished
21
+ * pixel rather than to the surface's albedo, so it multiplies what is already there: it can
22
+ * darken, stain and tint, and it cannot brighten or add a highlight. It has no geometry of its
23
+ * own, so it takes the receiver's lighting exactly — which is the *reason* to multiply rather
24
+ * than an accident of it — and a purely diffuse receiver is shaded as though the albedo had been
25
+ * marked before the light was applied. And it knows only what the depth buffer knows: anything
26
+ * that drew without writing depth, a beam or a particle, is in front of the mark and is darkened
27
+ * with it.
28
+ *
29
+ * The shape is procedural — an ellipse across the box's face with a soft edge, faded where the
30
+ * surface turns away from the projector. A textured mark is what it does not do yet, and
31
+ * `docs/CAPABILITIES.md` says so where it says the rest.
32
+ */
33
+ /** The box a projector occupies. Every field is world space. */
34
+ export interface DecalBox {
35
+ /** Middle of the projector box. */
36
+ readonly center: ReadonlyVec3;
37
+ /** Half-size across, up, and along the projection. The third is how deep the box reaches. */
38
+ readonly halfExtents: ReadonlyVec3;
39
+ /**
40
+ * The direction the decal is projected *along* — for a mark on the ground, straight down.
41
+ *
42
+ * A surface is marked when it faces back along this. Need not be normalised.
43
+ */
44
+ readonly forward: ReadonlyVec3;
45
+ /** Which way is up in the decal's own image, so a mark can be turned. Need not be normalised. */
46
+ readonly up: ReadonlyVec3;
47
+ }
48
+ export interface DecalProjectorOptions extends DecalBox {
49
+ /** What the mark multiplies the surface by. White marks nothing; black is a hole. */
50
+ readonly color?: ReadonlyVec3;
51
+ /** How much of that colour lands, 0 to 1. */
52
+ readonly opacity?: number;
53
+ /**
54
+ * How far from facing the projector a surface may be turned and still be marked, as a cosine.
55
+ *
56
+ * **The stretch this prevents is the classic failure of a projected decal.** A wall standing
57
+ * edge-on to the projector occupies one pixel of depth per metre of wall, so a mark aimed at the
58
+ * floor smears the full depth of the box up it in a long streak. `projectDecal` has the same
59
+ * number for the same reason, and this one is read from the depth buffer's own derivatives
60
+ * rather than from a vertex normal.
61
+ */
62
+ readonly facingCos?: number;
63
+ /** How much of the mark's radius is edge, 0 for a hard ellipse and 1 for all falloff. */
64
+ readonly softness?: number;
65
+ }
66
+ /**
67
+ * World space into the projector's unit box, column major.
68
+ *
69
+ * The box is `[-1, 1]` on every axis: x across the mark, y up it, z along the projection. A
70
+ * fragment is inside the projector exactly when all three come back within one, which is the whole
71
+ * of the test the shader runs.
72
+ */
73
+ export declare function worldToDecalMatrix(out: Float32Array, box: DecalBox): Float32Array;
74
+ /**
75
+ * The unit box back out into the world, column major.
76
+ *
77
+ * Only the scissor needs this — it projects the eight corners to find what part of the screen the
78
+ * box can possibly cover — but it is written here beside its inverse so the two cannot drift, and
79
+ * a test asserts they round-trip.
80
+ */
81
+ export declare function decalToWorldMatrix(out: Float32Array, box: DecalBox): Float32Array;
82
+ /**
83
+ * The part of the screen a projector can possibly mark, as a scissor rectangle.
84
+ *
85
+ * **This is what stands in for drawing the box as geometry**, and the trade is deliberate. A box
86
+ * submitted as a mesh covers its own silhouette exactly, and costs a vertex buffer, an index
87
+ * buffer, a choice between front and back faces depending on whether the camera is inside it, and
88
+ * a near-plane case where the front faces are clipped away. A rectangle around the same eight
89
+ * corners costs none of those and over-covers by the difference between a silhouette and its
90
+ * bounding box — at worst about twice the fragments, each of them one depth fetch and one matrix
91
+ * multiply before it decides it is outside the box. For a pass that is otherwise two textures and
92
+ * a blend state, that is the cheaper half.
93
+ *
94
+ * **A corner behind the camera is the trap, and it does not look like one.** Dividing clip space
95
+ * by a negative `w` mirrors the point through the origin, so a box the camera stands inside
96
+ * produces eight perfectly ordinary screen positions describing a rectangle that is nowhere near
97
+ * the truth — the mark then appears in a patch of the frame it has nothing to do with, and the
98
+ * rest of it silently does not draw. So a box with any corner at or behind the eye is scissored to
99
+ * the whole viewport, which is always correct and merely costs more, and one with *every* corner
100
+ * behind is skipped entirely.
101
+ *
102
+ * `yDown` is which way the caller's framebuffer counts rows: false for WebGL2's `gl.scissor`,
103
+ * whose origin is the bottom left, and true for WebGPU's `setScissorRect`, whose origin is the top
104
+ * left. Both describe the same pixels, and the pair is here rather than in either backend for the
105
+ * reason `DEPTH_01_TO_CLIP_Y_DOWN` gives at length: a convention held in two places is a pass that
106
+ * marks the mirror image of what it should on one backend and nothing raises.
107
+ *
108
+ * Returns false when there is nothing to draw, and fills `out` with `[x, y, width, height]` when
109
+ * there is.
110
+ */
111
+ export declare function decalScissor(viewProjection: ReadonlyMat4, decalToWorld: ReadonlyMat4, width: number, height: number, yDown: boolean, out: Int32Array): boolean;
112
+ /**
113
+ * A projector a consumer holds and moves.
114
+ *
115
+ * **Held rather than passed per call**, because that is what the row is for: a mark that follows
116
+ * something is a pose written every frame, and rebuilding two matrices from four vectors is the
117
+ * whole of that. Both matrices live in the object and are rewritten in place, so a scene with a
118
+ * hundred marks allocates on the frame it creates them and never again.
119
+ */
120
+ export declare class DecalProjector {
121
+ /** World space into the unit box. Rewritten in place by `setPose` and `setSize`. */
122
+ readonly worldToDecal: Float32Array<ArrayBuffer>;
123
+ /** The unit box back into the world, for the scissor bound. */
124
+ readonly decalToWorld: Float32Array<ArrayBuffer>;
125
+ /** The projection axis, normalised, which the facing test compares a surface normal against. */
126
+ readonly axis: Float32Array<ArrayBuffer>;
127
+ /** What the mark multiplies the surface by. */
128
+ readonly color: Float32Array<ArrayBuffer>;
129
+ opacity: number;
130
+ facingCos: number;
131
+ softness: number;
132
+ private readonly box;
133
+ constructor(options: DecalProjectorOptions);
134
+ /** Move the projector. Allocation-free, so a mark may follow something every frame. */
135
+ setPose(center: ReadonlyVec3, forward: ReadonlyVec3, up: ReadonlyVec3): void;
136
+ /** Resize the box, on the same terms. */
137
+ setSize(halfExtents: ReadonlyVec3): void;
138
+ setColor(color: ReadonlyVec3): void;
139
+ private rebuild;
140
+ }
@@ -0,0 +1,282 @@
1
+ /** Scratch for the orthonormal frame, so building a matrix allocates nothing. */
2
+ const RIGHT = new Float64Array(3);
3
+ const UP = new Float64Array(3);
4
+ const FORWARD = new Float64Array(3);
5
+ /** The eight corners of the box, projected, for the scissor bound. */
6
+ const CORNER = new Float64Array(4);
7
+ function frame(box) {
8
+ const f = box.forward;
9
+ const length = Math.hypot(f[0] ?? 0, f[1] ?? 0, f[2] ?? 0);
10
+ if (length === 0)
11
+ throw new Error('DecalProjector: forward has no direction');
12
+ FORWARD[0] = (f[0] ?? 0) / length;
13
+ FORWARD[1] = (f[1] ?? 0) / length;
14
+ FORWARD[2] = (f[2] ?? 0) / length;
15
+ const u = box.up;
16
+ /* right = up x forward, which is the frame `projectDecal` builds and the one a caller's `up`
17
+ therefore already means. */
18
+ RIGHT[0] = (u[1] ?? 0) * FORWARD[2] - (u[2] ?? 0) * FORWARD[1];
19
+ RIGHT[1] = (u[2] ?? 0) * FORWARD[0] - (u[0] ?? 0) * FORWARD[2];
20
+ RIGHT[2] = (u[0] ?? 0) * FORWARD[1] - (u[1] ?? 0) * FORWARD[0];
21
+ const across = Math.hypot(RIGHT[0], RIGHT[1], RIGHT[2]);
22
+ if (across === 0) {
23
+ throw new Error('DecalProjector: up is parallel to forward, so the box has no orientation');
24
+ }
25
+ RIGHT[0] /= across;
26
+ RIGHT[1] /= across;
27
+ RIGHT[2] /= across;
28
+ /* Re-derived so the frame is orthonormal even where the caller's up was not perpendicular —
29
+ which is what a caller aiming a projector by hand hands in, and what shears the mark if it is
30
+ taken as given. */
31
+ UP[0] = FORWARD[1] * RIGHT[2] - FORWARD[2] * RIGHT[1];
32
+ UP[1] = FORWARD[2] * RIGHT[0] - FORWARD[0] * RIGHT[2];
33
+ UP[2] = FORWARD[0] * RIGHT[1] - FORWARD[1] * RIGHT[0];
34
+ }
35
+ /** `-0` back to `0`, and anything else through untouched — including a NaN, which `|| 0` would eat. */
36
+ function zeroed(value) {
37
+ return value === 0 ? 0 : value;
38
+ }
39
+ function extents(box) {
40
+ const hx = box.halfExtents[0] ?? 0;
41
+ const hy = box.halfExtents[1] ?? 0;
42
+ const hz = box.halfExtents[2] ?? 0;
43
+ if (!(hx > 0 && hy > 0 && hz > 0)) {
44
+ throw new Error(`DecalProjector: halfExtents must be positive, got ${hx}, ${hy}, ${hz}`);
45
+ }
46
+ return [hx, hy, hz];
47
+ }
48
+ /**
49
+ * World space into the projector's unit box, column major.
50
+ *
51
+ * The box is `[-1, 1]` on every axis: x across the mark, y up it, z along the projection. A
52
+ * fragment is inside the projector exactly when all three come back within one, which is the whole
53
+ * of the test the shader runs.
54
+ */
55
+ export function worldToDecalMatrix(out, box) {
56
+ frame(box);
57
+ const [hx, hy, hz] = extents(box);
58
+ const c = box.center;
59
+ const cx = c[0] ?? 0;
60
+ const cy = c[1] ?? 0;
61
+ const cz = c[2] ?? 0;
62
+ /* The rows are the axes divided by their half-extent, and the translation is the centre run
63
+ through them and negated: an orthonormal frame's inverse is its transpose, so this is the
64
+ inverse of `decalToWorldMatrix` written out rather than computed.
65
+
66
+ The translations go through `zeroed` because negating a centre on an axis produces `-0`, which
67
+ is equal to zero in every arithmetic use and not under `Object.is` — so two projectors alike in
68
+ every way a GPU can see would compare unequal. `depthOffsetForLayer` records the same trap. */
69
+ out[0] = RIGHT[0] / hx;
70
+ out[4] = RIGHT[1] / hx;
71
+ out[8] = RIGHT[2] / hx;
72
+ out[12] = zeroed(-(RIGHT[0] * cx + RIGHT[1] * cy + RIGHT[2] * cz) / hx);
73
+ out[1] = UP[0] / hy;
74
+ out[5] = UP[1] / hy;
75
+ out[9] = UP[2] / hy;
76
+ out[13] = zeroed(-(UP[0] * cx + UP[1] * cy + UP[2] * cz) / hy);
77
+ out[2] = FORWARD[0] / hz;
78
+ out[6] = FORWARD[1] / hz;
79
+ out[10] = FORWARD[2] / hz;
80
+ out[14] = zeroed(-(FORWARD[0] * cx + FORWARD[1] * cy + FORWARD[2] * cz) / hz);
81
+ out[3] = 0;
82
+ out[7] = 0;
83
+ out[11] = 0;
84
+ out[15] = 1;
85
+ return out;
86
+ }
87
+ /**
88
+ * The unit box back out into the world, column major.
89
+ *
90
+ * Only the scissor needs this — it projects the eight corners to find what part of the screen the
91
+ * box can possibly cover — but it is written here beside its inverse so the two cannot drift, and
92
+ * a test asserts they round-trip.
93
+ */
94
+ export function decalToWorldMatrix(out, box) {
95
+ frame(box);
96
+ const [hx, hy, hz] = extents(box);
97
+ const c = box.center;
98
+ out[0] = RIGHT[0] * hx;
99
+ out[1] = RIGHT[1] * hx;
100
+ out[2] = RIGHT[2] * hx;
101
+ out[3] = 0;
102
+ out[4] = UP[0] * hy;
103
+ out[5] = UP[1] * hy;
104
+ out[6] = UP[2] * hy;
105
+ out[7] = 0;
106
+ out[8] = FORWARD[0] * hz;
107
+ out[9] = FORWARD[1] * hz;
108
+ out[10] = FORWARD[2] * hz;
109
+ out[11] = 0;
110
+ out[12] = c[0] ?? 0;
111
+ out[13] = c[1] ?? 0;
112
+ out[14] = c[2] ?? 0;
113
+ out[15] = 1;
114
+ return out;
115
+ }
116
+ /** One pixel of slack, because the frame may be jittered and a bound is rounded. */
117
+ const SCISSOR_PAD = 1;
118
+ /**
119
+ * The part of the screen a projector can possibly mark, as a scissor rectangle.
120
+ *
121
+ * **This is what stands in for drawing the box as geometry**, and the trade is deliberate. A box
122
+ * submitted as a mesh covers its own silhouette exactly, and costs a vertex buffer, an index
123
+ * buffer, a choice between front and back faces depending on whether the camera is inside it, and
124
+ * a near-plane case where the front faces are clipped away. A rectangle around the same eight
125
+ * corners costs none of those and over-covers by the difference between a silhouette and its
126
+ * bounding box — at worst about twice the fragments, each of them one depth fetch and one matrix
127
+ * multiply before it decides it is outside the box. For a pass that is otherwise two textures and
128
+ * a blend state, that is the cheaper half.
129
+ *
130
+ * **A corner behind the camera is the trap, and it does not look like one.** Dividing clip space
131
+ * by a negative `w` mirrors the point through the origin, so a box the camera stands inside
132
+ * produces eight perfectly ordinary screen positions describing a rectangle that is nowhere near
133
+ * the truth — the mark then appears in a patch of the frame it has nothing to do with, and the
134
+ * rest of it silently does not draw. So a box with any corner at or behind the eye is scissored to
135
+ * the whole viewport, which is always correct and merely costs more, and one with *every* corner
136
+ * behind is skipped entirely.
137
+ *
138
+ * `yDown` is which way the caller's framebuffer counts rows: false for WebGL2's `gl.scissor`,
139
+ * whose origin is the bottom left, and true for WebGPU's `setScissorRect`, whose origin is the top
140
+ * left. Both describe the same pixels, and the pair is here rather than in either backend for the
141
+ * reason `DEPTH_01_TO_CLIP_Y_DOWN` gives at length: a convention held in two places is a pass that
142
+ * marks the mirror image of what it should on one backend and nothing raises.
143
+ *
144
+ * Returns false when there is nothing to draw, and fills `out` with `[x, y, width, height]` when
145
+ * there is.
146
+ */
147
+ export function decalScissor(viewProjection, decalToWorld, width, height, yDown, out) {
148
+ let minX = Infinity;
149
+ let maxX = -Infinity;
150
+ let minY = Infinity;
151
+ let maxY = -Infinity;
152
+ let behind = 0;
153
+ for (let corner = 0; corner < 8; corner++) {
154
+ const bx = (corner & 1) === 0 ? -1 : 1;
155
+ const by = (corner & 2) === 0 ? -1 : 1;
156
+ const bz = (corner & 4) === 0 ? -1 : 1;
157
+ /* Box space to world, then world to clip, without a scratch matrix: two transforms of one
158
+ point is less work than the 4x4 multiply that would fuse them, and this runs per decal. */
159
+ for (let row = 0; row < 4; row++) {
160
+ CORNER[row] =
161
+ (decalToWorld[row] ?? 0) * bx +
162
+ (decalToWorld[4 + row] ?? 0) * by +
163
+ (decalToWorld[8 + row] ?? 0) * bz +
164
+ (decalToWorld[12 + row] ?? 0);
165
+ }
166
+ const wx = CORNER[0] ?? 0;
167
+ const wy = CORNER[1] ?? 0;
168
+ const wz = CORNER[2] ?? 0;
169
+ const clipX = (viewProjection[0] ?? 0) * wx +
170
+ (viewProjection[4] ?? 0) * wy +
171
+ (viewProjection[8] ?? 0) * wz +
172
+ (viewProjection[12] ?? 0);
173
+ const clipY = (viewProjection[1] ?? 0) * wx +
174
+ (viewProjection[5] ?? 0) * wy +
175
+ (viewProjection[9] ?? 0) * wz +
176
+ (viewProjection[13] ?? 0);
177
+ const clipW = (viewProjection[3] ?? 0) * wx +
178
+ (viewProjection[7] ?? 0) * wy +
179
+ (viewProjection[11] ?? 0) * wz +
180
+ (viewProjection[15] ?? 0);
181
+ if (clipW <= 1e-6) {
182
+ behind++;
183
+ continue;
184
+ }
185
+ const ndcX = clipX / clipW;
186
+ const ndcY = clipY / clipW;
187
+ if (ndcX < minX)
188
+ minX = ndcX;
189
+ if (ndcX > maxX)
190
+ maxX = ndcX;
191
+ if (ndcY < minY)
192
+ minY = ndcY;
193
+ if (ndcY > maxY)
194
+ maxY = ndcY;
195
+ }
196
+ if (behind === 8)
197
+ return false;
198
+ if (behind > 0) {
199
+ out[0] = 0;
200
+ out[1] = 0;
201
+ out[2] = width;
202
+ out[3] = height;
203
+ return true;
204
+ }
205
+ const left = Math.max(0, Math.floor(((minX + 1) / 2) * width) - SCISSOR_PAD);
206
+ const right = Math.min(width, Math.ceil(((maxX + 1) / 2) * width) + SCISSOR_PAD);
207
+ const bottom = Math.max(0, Math.floor(((minY + 1) / 2) * height) - SCISSOR_PAD);
208
+ const top = Math.min(height, Math.ceil(((maxY + 1) / 2) * height) + SCISSOR_PAD);
209
+ if (right <= left || top <= bottom)
210
+ return false;
211
+ out[0] = left;
212
+ out[1] = yDown ? height - top : bottom;
213
+ out[2] = right - left;
214
+ out[3] = top - bottom;
215
+ return true;
216
+ }
217
+ /**
218
+ * A projector a consumer holds and moves.
219
+ *
220
+ * **Held rather than passed per call**, because that is what the row is for: a mark that follows
221
+ * something is a pose written every frame, and rebuilding two matrices from four vectors is the
222
+ * whole of that. Both matrices live in the object and are rewritten in place, so a scene with a
223
+ * hundred marks allocates on the frame it creates them and never again.
224
+ */
225
+ export class DecalProjector {
226
+ /** World space into the unit box. Rewritten in place by `setPose` and `setSize`. */
227
+ worldToDecal = new Float32Array(16);
228
+ /** The unit box back into the world, for the scissor bound. */
229
+ decalToWorld = new Float32Array(16);
230
+ /** The projection axis, normalised, which the facing test compares a surface normal against. */
231
+ axis = new Float32Array(3);
232
+ /** What the mark multiplies the surface by. */
233
+ color = new Float32Array(3);
234
+ opacity;
235
+ facingCos;
236
+ softness;
237
+ box;
238
+ constructor(options) {
239
+ this.box = {
240
+ center: Float32Array.from(options.center),
241
+ halfExtents: Float32Array.from(options.halfExtents),
242
+ forward: Float32Array.from(options.forward),
243
+ up: Float32Array.from(options.up),
244
+ };
245
+ this.color.set(options.color === undefined ? [1, 1, 1] : options.color);
246
+ this.opacity = options.opacity ?? 1;
247
+ /* The same 0.1 `projectDecal` defaults to, which keeps everything within about 84 degrees of
248
+ facing — and for the same reason, stated there. */
249
+ this.facingCos = options.facingCos ?? 0.1;
250
+ /* A quarter of the radius as edge. A hard ellipse reads as a decal that was cut out with
251
+ scissors, and a mark with no texture has nothing else to soften it. */
252
+ this.softness = options.softness ?? 0.25;
253
+ this.rebuild();
254
+ }
255
+ /** Move the projector. Allocation-free, so a mark may follow something every frame. */
256
+ setPose(center, forward, up) {
257
+ this.box.center.set(center);
258
+ this.box.forward.set(forward);
259
+ this.box.up.set(up);
260
+ this.rebuild();
261
+ }
262
+ /** Resize the box, on the same terms. */
263
+ setSize(halfExtents) {
264
+ this.box.halfExtents.set(halfExtents);
265
+ this.rebuild();
266
+ }
267
+ setColor(color) {
268
+ this.color.set(color);
269
+ }
270
+ rebuild() {
271
+ worldToDecalMatrix(this.worldToDecal, this.box);
272
+ decalToWorldMatrix(this.decalToWorld, this.box);
273
+ /* `frame` left the normalised axis in its scratch, and reading it back here would couple this
274
+ to the order those two ran in. Normalised again instead: it is three multiplies once per
275
+ pose, against a coupling that would break silently. */
276
+ const f = this.box.forward;
277
+ const length = Math.hypot(f[0] ?? 0, f[1] ?? 0, f[2] ?? 0);
278
+ this.axis[0] = (f[0] ?? 0) / length;
279
+ this.axis[1] = (f[1] ?? 0) / length;
280
+ this.axis[2] = (f[2] ?? 0) / length;
281
+ }
282
+ }
@@ -0,0 +1,53 @@
1
+ import type { DecalProjector } from './decalProjector.ts';
2
+ /**
3
+ * The frame's drawn decals, held until the pass that reads the depth buffer can run.
4
+ *
5
+ * **The pass cannot run where the call is made.** A projected decal is decided from the depth the
6
+ * frame has drawn, so it has to happen once the opaque world is finished — and a consumer submits
7
+ * a mark wherever in its own frame the thing that made the mark lives. So `drawDecal` records and
8
+ * the renderer replays, exactly as `TranslucentQueue` does for the order-independent passes.
9
+ *
10
+ * **Everything is copied, and that is the whole correctness of this file.** A projector is an
11
+ * object a consumer keeps and moves: it is submitted, then moved to follow whatever it is stuck
12
+ * to, and submitted again next frame. A queue holding the reference would replay every mark
13
+ * wearing the last pose written — one wheel's skid under every wheel — which is a plausible
14
+ * picture rather than an obviously broken one, and that is the kind that gets blamed on the pass.
15
+ *
16
+ * **Records are pooled and never released**, for the reason `AGENTS.md` gives: `reset` returns the
17
+ * count to zero and keeps the storage, so a steady scene allocates on its first frame and never
18
+ * again.
19
+ */
20
+ /**
21
+ * How many marks one frame may draw.
22
+ *
23
+ * **A cap rather than an open number**, because each is a scissored pass of its own with a uniform
24
+ * slot behind it, and the slots are one buffer written before the passes are recorded. Thirty-two
25
+ * is more than a scene has needed: a mark is a projector kept alive per frame, and a world with
26
+ * more than thirty-two of them in view at once wants `projectDecal`, which costs nothing per frame
27
+ * and is what the static half of this row is for.
28
+ */
29
+ export declare const MAX_DRAWN_DECALS = 32;
30
+ /** One recorded mark. Every field is a copy of what the projector held when it was submitted. */
31
+ export interface DrawnDecal {
32
+ readonly worldToDecal: Float32Array;
33
+ readonly decalToWorld: Float32Array;
34
+ readonly axis: Float32Array;
35
+ readonly color: Float32Array;
36
+ opacity: number;
37
+ facingCos: number;
38
+ softness: number;
39
+ }
40
+ export declare class DecalQueue {
41
+ private readonly pool;
42
+ private count;
43
+ /** Set once when the cap is first reached, so a scene over it says so and then draws. */
44
+ private warned;
45
+ /** How many marks this frame has recorded. */
46
+ get length(): number;
47
+ /** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
48
+ get capacity(): number;
49
+ record(projector: DecalProjector): void;
50
+ replay(each: (decal: DrawnDecal) => void): void;
51
+ /** Empty it for the next frame, keeping the storage. */
52
+ reset(): void;
53
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The frame's drawn decals, held until the pass that reads the depth buffer can run.
3
+ *
4
+ * **The pass cannot run where the call is made.** A projected decal is decided from the depth the
5
+ * frame has drawn, so it has to happen once the opaque world is finished — and a consumer submits
6
+ * a mark wherever in its own frame the thing that made the mark lives. So `drawDecal` records and
7
+ * the renderer replays, exactly as `TranslucentQueue` does for the order-independent passes.
8
+ *
9
+ * **Everything is copied, and that is the whole correctness of this file.** A projector is an
10
+ * object a consumer keeps and moves: it is submitted, then moved to follow whatever it is stuck
11
+ * to, and submitted again next frame. A queue holding the reference would replay every mark
12
+ * wearing the last pose written — one wheel's skid under every wheel — which is a plausible
13
+ * picture rather than an obviously broken one, and that is the kind that gets blamed on the pass.
14
+ *
15
+ * **Records are pooled and never released**, for the reason `AGENTS.md` gives: `reset` returns the
16
+ * count to zero and keeps the storage, so a steady scene allocates on its first frame and never
17
+ * again.
18
+ */
19
+ /**
20
+ * How many marks one frame may draw.
21
+ *
22
+ * **A cap rather than an open number**, because each is a scissored pass of its own with a uniform
23
+ * slot behind it, and the slots are one buffer written before the passes are recorded. Thirty-two
24
+ * is more than a scene has needed: a mark is a projector kept alive per frame, and a world with
25
+ * more than thirty-two of them in view at once wants `projectDecal`, which costs nothing per frame
26
+ * and is what the static half of this row is for.
27
+ */
28
+ export const MAX_DRAWN_DECALS = 32;
29
+ function newRecord() {
30
+ return {
31
+ worldToDecal: new Float32Array(16),
32
+ decalToWorld: new Float32Array(16),
33
+ axis: new Float32Array(3),
34
+ color: new Float32Array(3),
35
+ opacity: 1,
36
+ facingCos: 0.1,
37
+ softness: 0.25,
38
+ };
39
+ }
40
+ export class DecalQueue {
41
+ pool = [];
42
+ count = 0;
43
+ /** Set once when the cap is first reached, so a scene over it says so and then draws. */
44
+ warned = false;
45
+ /** How many marks this frame has recorded. */
46
+ get length() {
47
+ return this.count;
48
+ }
49
+ /** How many records are pooled, which a test uses to assert a steady scene stops allocating. */
50
+ get capacity() {
51
+ return this.pool.length;
52
+ }
53
+ record(projector) {
54
+ if (this.count >= MAX_DRAWN_DECALS) {
55
+ if (!this.warned) {
56
+ this.warned = true;
57
+ console.warn(`driftengine: more than ${MAX_DRAWN_DECALS} drawn decals in one frame, so the rest are ` +
58
+ 'dropped. A mark that never moves is cheaper as projectDecal, which builds it once.');
59
+ }
60
+ return;
61
+ }
62
+ let record = this.pool[this.count];
63
+ if (record === undefined) {
64
+ record = newRecord();
65
+ this.pool.push(record);
66
+ }
67
+ record.worldToDecal.set(projector.worldToDecal);
68
+ record.decalToWorld.set(projector.decalToWorld);
69
+ record.axis.set(projector.axis);
70
+ record.color.set(projector.color);
71
+ record.opacity = Math.min(1, Math.max(0, projector.opacity));
72
+ record.facingCos = projector.facingCos;
73
+ record.softness = Math.min(1, Math.max(0, projector.softness));
74
+ this.count++;
75
+ }
76
+ replay(each) {
77
+ for (let i = 0; i < this.count; i++) {
78
+ const record = this.pool[i];
79
+ if (record !== undefined)
80
+ each(record);
81
+ }
82
+ }
83
+ /** Empty it for the next frame, keeping the storage. */
84
+ reset() {
85
+ this.count = 0;
86
+ }
87
+ }