@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,142 @@
1
+ /**
2
+ * A tangent frame: which way is *along the texture*.
3
+ *
4
+ * **Every map in Phase 1.3 needs one and nothing in this engine had it.** A normal map stores its
5
+ * directions in the surface's own space, and turning those into world directions takes three
6
+ * axes: the normal, a tangent running with u, and a bitangent running with v. Two of the three
7
+ * come from geometry the engine already has; this derives the third.
8
+ *
9
+ * **Four floats a vertex, and `w` is the interesting one.** The bitangent is
10
+ * `cross(normal, tangent) * w`, and the sign is needed because a UV layout can mirror: an artist
11
+ * mapping the left and right of a model onto one patch of texture gives one side a flipped frame,
12
+ * and a bitangent computed without the sign lights that side inside out. Storing it costs a float
13
+ * a vertex, and every format that has been through this — glTF included — settled on the same
14
+ * four rather than storing the bitangent outright, which costs three.
15
+ */
16
+ /** Scratch, so a build that derives many meshes does not allocate per mesh. */
17
+ const accumulated = {
18
+ tangents: new Float32Array(0),
19
+ bitangents: new Float32Array(0),
20
+ };
21
+ function scratchFor(vertices) {
22
+ if (accumulated.tangents.length < vertices * 3) {
23
+ accumulated.tangents = new Float32Array(vertices * 3);
24
+ accumulated.bitangents = new Float32Array(vertices * 3);
25
+ }
26
+ else {
27
+ accumulated.tangents.fill(0, 0, vertices * 3);
28
+ accumulated.bitangents.fill(0, 0, vertices * 3);
29
+ }
30
+ return accumulated;
31
+ }
32
+ function accumulate(tangents, bitangents, v, tx, ty, tz, bx, by, bz) {
33
+ tangents[v * 3] = (tangents[v * 3] ?? 0) + tx;
34
+ tangents[v * 3 + 1] = (tangents[v * 3 + 1] ?? 0) + ty;
35
+ tangents[v * 3 + 2] = (tangents[v * 3 + 2] ?? 0) + tz;
36
+ bitangents[v * 3] = (bitangents[v * 3] ?? 0) + bx;
37
+ bitangents[v * 3 + 1] = (bitangents[v * 3 + 1] ?? 0) + by;
38
+ bitangents[v * 3 + 2] = (bitangents[v * 3 + 2] ?? 0) + bz;
39
+ }
40
+ /**
41
+ * Derive a tangent frame from positions, normals and texture coordinates.
42
+ *
43
+ * **Accumulated per triangle, then orthogonalised per vertex.** A vertex shared by two triangles
44
+ * gets the sum of their tangents, which is what makes a smooth surface's frame smooth; the sum is
45
+ * then no longer square to the interpolated normal, and Gram-Schmidt is what puts it back.
46
+ * Dropping that step is a normal map that shears wherever the geometry curves.
47
+ *
48
+ * Never returns a NaN. A triangle whose three vertices share one texture coordinate has no
49
+ * direction along the texture at all and the arithmetic divides by zero — which is the common
50
+ * case in a bought asset rather than an edge case, and a NaN in a vertex buffer takes the whole
51
+ * triangle off the screen. Those vertices get some unit vector perpendicular to their normal,
52
+ * which is arbitrary and finite, and arbitrary is the honest answer to an unanswerable question.
53
+ */
54
+ export function generateTangents(positions, normals, uvs, indices, out) {
55
+ const vertices = Math.floor(positions.length / 3);
56
+ const result = out ?? new Float32Array(vertices * 4);
57
+ const scratch = scratchFor(vertices);
58
+ const { tangents, bitangents } = scratch;
59
+ for (let i = 0; i + 2 < indices.length; i += 3) {
60
+ const a = indices[i] ?? 0;
61
+ const b = indices[i + 1] ?? 0;
62
+ const c = indices[i + 2] ?? 0;
63
+ const x1 = (positions[b * 3] ?? 0) - (positions[a * 3] ?? 0);
64
+ const y1 = (positions[b * 3 + 1] ?? 0) - (positions[a * 3 + 1] ?? 0);
65
+ const z1 = (positions[b * 3 + 2] ?? 0) - (positions[a * 3 + 2] ?? 0);
66
+ const x2 = (positions[c * 3] ?? 0) - (positions[a * 3] ?? 0);
67
+ const y2 = (positions[c * 3 + 1] ?? 0) - (positions[a * 3 + 1] ?? 0);
68
+ const z2 = (positions[c * 3 + 2] ?? 0) - (positions[a * 3 + 2] ?? 0);
69
+ const s1 = (uvs[b * 2] ?? 0) - (uvs[a * 2] ?? 0);
70
+ const t1 = (uvs[b * 2 + 1] ?? 0) - (uvs[a * 2 + 1] ?? 0);
71
+ const s2 = (uvs[c * 2] ?? 0) - (uvs[a * 2] ?? 0);
72
+ const t2 = (uvs[c * 2 + 1] ?? 0) - (uvs[a * 2 + 1] ?? 0);
73
+ /*
74
+ * The area of the triangle in texture space. Zero means the three vertices share one
75
+ * coordinate, so this triangle says nothing about direction and is skipped — leaving its
76
+ * vertices to whatever their other triangles say, or to the fallback below if they have none.
77
+ */
78
+ const area = s1 * t2 - s2 * t1;
79
+ if (Math.abs(area) < 1e-12)
80
+ continue;
81
+ const r = 1 / area;
82
+ const tx = (t2 * x1 - t1 * x2) * r;
83
+ const ty = (t2 * y1 - t1 * y2) * r;
84
+ const tz = (t2 * z1 - t1 * z2) * r;
85
+ const bx = (s1 * x2 - s2 * x1) * r;
86
+ const by = (s1 * y2 - s2 * y1) * r;
87
+ const bz = (s1 * z2 - s2 * z1) * r;
88
+ /* Written out rather than looped over `[a, b, c]`, which allocates an array per triangle —
89
+ and a large import has hundreds of thousands of them. */
90
+ accumulate(tangents, bitangents, a, tx, ty, tz, bx, by, bz);
91
+ accumulate(tangents, bitangents, b, tx, ty, tz, bx, by, bz);
92
+ accumulate(tangents, bitangents, c, tx, ty, tz, bx, by, bz);
93
+ }
94
+ for (let v = 0; v < vertices; v += 1) {
95
+ const nx = normals[v * 3] ?? 0;
96
+ const ny = normals[v * 3 + 1] ?? 0;
97
+ const nz = normals[v * 3 + 2] ?? 0;
98
+ let tx = tangents[v * 3] ?? 0;
99
+ let ty = tangents[v * 3 + 1] ?? 0;
100
+ let tz = tangents[v * 3 + 2] ?? 0;
101
+ /* Gram-Schmidt: take out whatever part of the tangent points along the normal. */
102
+ const along = tx * nx + ty * ny + tz * nz;
103
+ tx -= nx * along;
104
+ ty -= ny * along;
105
+ tz -= nz * along;
106
+ let length = Math.sqrt(tx * tx + ty * ty + tz * tz);
107
+ if (length < 1e-8) {
108
+ /*
109
+ * No usable direction: a vertex no triangle mentions, or one whose triangles all had no
110
+ * area in texture space. Any unit vector perpendicular to the normal will do, and the
111
+ * cross with whichever axis the normal points least along is the one that is never
112
+ * degenerate.
113
+ */
114
+ const ax = Math.abs(nx);
115
+ const ay = Math.abs(ny);
116
+ const az = Math.abs(nz);
117
+ const px = ax <= ay && ax <= az ? 1 : 0;
118
+ const py = ay < ax && ay <= az ? 1 : 0;
119
+ const pz = px === 0 && py === 0 ? 1 : 0;
120
+ tx = ny * pz - nz * py;
121
+ ty = nz * px - nx * pz;
122
+ tz = nx * py - ny * px;
123
+ length = Math.sqrt(tx * tx + ty * ty + tz * tz) || 1;
124
+ }
125
+ const inv = 1 / length;
126
+ result[v * 4] = tx * inv;
127
+ result[v * 4 + 1] = ty * inv;
128
+ result[v * 4 + 2] = tz * inv;
129
+ /*
130
+ * The handedness. `cross(normal, tangent)` is the bitangent the frame implies; if the one the
131
+ * texture actually asks for points the other way, `w` is -1 and the shader flips it.
132
+ */
133
+ const cx = ny * tz - nz * ty;
134
+ const cy = nz * tx - nx * tz;
135
+ const cz = nx * ty - ny * tx;
136
+ const bx = bitangents[v * 3] ?? 0;
137
+ const by = bitangents[v * 3 + 1] ?? 0;
138
+ const bz = bitangents[v * 3 + 2] ?? 0;
139
+ result[v * 4 + 3] = cx * bx + cy * by + cz * bz < 0 ? -1 : 1;
140
+ }
141
+ return result;
142
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Text as static world geometry: one box per lit glyph cell.
3
+ *
4
+ * The screen-space `TextRenderer` exists because a grid of cells gives you
5
+ * *boxes to light* rather than outlines to rasterise. This is the same idea
6
+ * standing in the world instead of over it — a string that a consumer can merge
7
+ * into its static mesh, place on a surface's own basis, and light with
8
+ * everything else. No draw call of its own, no atlas, no font file.
9
+ *
10
+ * Laid out in a local frame: x to the right, y up from the baseline, z the
11
+ * depth the cells stand out through. The caller supplies the basis that turns
12
+ * that into a place in the world (`MeshBuilder.addOrientedMesh`), which is what
13
+ * lets a line of text bank with a road or face back along a curve.
14
+ */
15
+ import type { MeshData } from '../render/mesh.ts';
16
+ import type { Vec3 } from '../math/color.ts';
17
+ export interface TextMeshStyle {
18
+ /** World size of one glyph cell. A glyph is five of these across, seven tall. */
19
+ cellSizeM: number;
20
+ /**
21
+ * Cell height, where it differs from the width. Defaults to square.
22
+ *
23
+ * For text read at a shallow angle: a word laid flat on the ground is
24
+ * foreshortened along the direction it is read from, and stretching the cells
25
+ * that way is what road markings have always done about it. It is a property
26
+ * of the *viewing* rather than of the font, which is why it belongs to a style
27
+ * and not to the glyph table.
28
+ */
29
+ cellHeightM?: number;
30
+ color: Vec3;
31
+ /**
32
+ * Depth through the plane, world units. Defaults to the cell size, which
33
+ * gives cubes — the shape the flat-shaded look is built out of, and the one
34
+ * that catches a light from the side rather than going flat as the sun moves.
35
+ */
36
+ depthM?: number;
37
+ emissive?: number;
38
+ /**
39
+ * Where the origin sits horizontally. Centred by default: a marker is aimed
40
+ * at a place, and left-aligning it would move the thing being marked whenever
41
+ * the string changed length.
42
+ */
43
+ align?: 'left' | 'center';
44
+ /** Where the origin sits vertically: on the baseline, or at the middle. */
45
+ baseline?: 'bottom' | 'center';
46
+ }
47
+ /** Width of a string in world units, before the basis is applied. */
48
+ export declare function textMeshWidthM(text: string, cellSizeM: number): number;
49
+ /** Height of a line in world units. Every glyph is the same seven cells tall. */
50
+ export declare function textMeshHeightM(cellSizeM: number): number;
51
+ export declare function buildTextMesh(text: string, style: TextMeshStyle): MeshData;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Text as static world geometry: one box per lit glyph cell.
3
+ *
4
+ * The screen-space `TextRenderer` exists because a grid of cells gives you
5
+ * *boxes to light* rather than outlines to rasterise. This is the same idea
6
+ * standing in the world instead of over it — a string that a consumer can merge
7
+ * into its static mesh, place on a surface's own basis, and light with
8
+ * everything else. No draw call of its own, no atlas, no font file.
9
+ *
10
+ * Laid out in a local frame: x to the right, y up from the baseline, z the
11
+ * depth the cells stand out through. The caller supplies the basis that turns
12
+ * that into a place in the world (`MeshBuilder.addOrientedMesh`), which is what
13
+ * lets a line of text bank with a road or face back along a curve.
14
+ */
15
+ import { GLYPH_HEIGHT, forEachRun, measureText } from './pixelFont.js';
16
+ import { MeshBuilder } from './meshBuilder.js';
17
+ /** Width of a string in world units, before the basis is applied. */
18
+ export function textMeshWidthM(text, cellSizeM) {
19
+ return measureText(text) * cellSizeM;
20
+ }
21
+ /** Height of a line in world units. Every glyph is the same seven cells tall. */
22
+ export function textMeshHeightM(cellSizeM) {
23
+ return GLYPH_HEIGHT * cellSizeM;
24
+ }
25
+ export function buildTextMesh(text, style) {
26
+ if (style.cellSizeM <= 0) {
27
+ throw new Error(`buildTextMesh needs a positive cell size, got ${style.cellSizeM}`);
28
+ }
29
+ const cell = style.cellSizeM;
30
+ const cellHigh = style.cellHeightM ?? cell;
31
+ const depth = style.depthM ?? cell;
32
+ const emissive = style.emissive ?? 0;
33
+ const half = [cell * 0.5, cellHigh * 0.5, depth * 0.5];
34
+ const offsetX = style.align === 'left' ? 0 : -textMeshWidthM(text, cell) * 0.5;
35
+ const offsetY = style.baseline === 'center' ? -textMeshHeightM(cellHigh) * 0.5 : 0;
36
+ const builder = new MeshBuilder();
37
+ const centre = [0, 0, 0];
38
+ const extent = [0, half[1], half[2]];
39
+ /*
40
+ * **One box per horizontal run, not per lit cell.** The two produce the same outer surface — a
41
+ * run of three cells and the box that spans them have identical outsides, and what goes is the
42
+ * interior faces between them, which nothing can ever see. Measured against a consumer's own
43
+ * 1,168 strings, it takes 65,271 boxes to 42,631: **1.53x**, for a change that is invisible.
44
+ *
45
+ * `half[0]` grows with the run and the other two do not, which is why the extent is rebuilt here
46
+ * rather than reusing `half`.
47
+ */
48
+ forEachRun(text, (x, y, width) => {
49
+ // Cell coordinates address a cell's corner; a box is placed by its centre.
50
+ extent[0] = width * cell * 0.5;
51
+ centre[0] = offsetX + (x + width * 0.5) * cell;
52
+ centre[1] = offsetY + (y + 0.5) * cellHigh;
53
+ centre[2] = 0;
54
+ builder.addBox(centre, extent, style.color, emissive);
55
+ });
56
+ return builder.build();
57
+ }
@@ -0,0 +1,37 @@
1
+ import type { MeshData } from '../render/mesh.ts';
2
+ import type { Vec3 } from '../math/color.ts';
3
+ /**
4
+ * Procedural trees from parameters and a seeded RNG.
5
+ *
6
+ * Game-agnostic: it takes numbers and a random source and knows nothing about
7
+ * days, palettes or where a tree is going to stand.
8
+ *
9
+ * The geometry comes back in two pieces, and the split is structural rather
10
+ * than a convenience. The trunk is *solid* — merged into static world geometry
11
+ * and paired with a collider, so it must never deform, or it would visibly
12
+ * separate from the thing you collide with. The canopy is *flexible* — drawn as
13
+ * instanced scatter that bends in the wind, which merging into the static world
14
+ * would make impossible. A tree that is one mesh can be collidable or animated,
15
+ * not both.
16
+ */
17
+ export interface TreeParams {
18
+ height: number;
19
+ trunkRadius: number;
20
+ /** How much narrower the trunk is at the top, 0..1. */
21
+ taper: number;
22
+ canopyRadius: number;
23
+ canopyClusters: number;
24
+ trunkColor: Vec3;
25
+ canopyColor: Vec3;
26
+ }
27
+ export interface TreeGeometry {
28
+ /** Trunk and limbs: collidable, never deformed. */
29
+ solid: MeshData;
30
+ /** Canopy: instanced and wind-bent, never collidable. */
31
+ flexible: MeshData;
32
+ /** Trunk radius at the base, so a caller can build a matching collider. */
33
+ colliderRadius: number;
34
+ /** Height of the solid part, likewise. */
35
+ colliderHeight: number;
36
+ }
37
+ export declare function buildTree(params: TreeParams, rand: () => number): TreeGeometry;
@@ -0,0 +1,56 @@
1
+ import { MeshBuilder } from './meshBuilder.js';
2
+ const TRUNK_SEGMENTS = 3;
3
+ export function buildTree(params, rand) {
4
+ if (params.height <= 0 || params.trunkRadius <= 0) {
5
+ throw new Error('Tree height and trunk radius must be positive.');
6
+ }
7
+ const solid = new MeshBuilder();
8
+ const flexible = new MeshBuilder();
9
+ /*
10
+ * Trunk as stacked tapering sections rather than one cylinder: a real trunk
11
+ * narrows, and the taper is what stops a tree reading as a post with leaves
12
+ * balanced on it.
13
+ */
14
+ const sectionHeight = params.height / TRUNK_SEGMENTS;
15
+ for (let i = 0; i < TRUNK_SEGMENTS; i++) {
16
+ const t = i / TRUNK_SEGMENTS;
17
+ const radius = params.trunkRadius * (1 - params.taper * t);
18
+ const lean = (rand() - 0.5) * 0.12 * params.height;
19
+ solid.addCylinder([lean * t, sectionHeight * (i + 0.5), lean * t], Math.max(radius, 0.02), sectionHeight * 0.5, 'y', params.trunkColor, 0, 7);
20
+ }
21
+ /*
22
+ * No separate limbs. `MeshBuilder` only produces axis-aligned boxes and
23
+ * cylinders, so a "branch" here can only be a vertical stub offset sideways —
24
+ * which reads as a post floating beside the trunk, not as a limb. The
25
+ * clustered canopy below carries the silhouette instead. Real branches want
26
+ * oriented primitives, which is a builder change rather than a tree change.
27
+ */
28
+ /*
29
+ * Canopy as overlapping clusters, not one sphere. A single blob reads as a
30
+ * lollipop from any angle; clusters give a silhouette that changes as you run
31
+ * past, which is most of what makes a tree look like a tree at speed.
32
+ */
33
+ const canopyBase = params.height * 0.62;
34
+ for (let i = 0; i < params.canopyClusters; i++) {
35
+ const angle = rand() * Math.PI * 2;
36
+ /*
37
+ * Spread and size are budgeted together so the furthest corner of the
38
+ * furthest cluster stays inside `canopyRadius` with margin. The placer
39
+ * keeps trees off the route using that number, so a canopy that quietly
40
+ * overruns it pokes through geometry it was placed clear of.
41
+ */
42
+ const spread = params.canopyRadius * (0.12 + rand() * 0.4);
43
+ const size = params.canopyRadius * (0.2 + rand() * 0.16);
44
+ flexible.addBox([
45
+ Math.cos(angle) * spread,
46
+ canopyBase + rand() * (params.height - canopyBase) * 0.9,
47
+ Math.sin(angle) * spread,
48
+ ], [size, size * (0.62 + rand() * 0.3), size], params.canopyColor, 0);
49
+ }
50
+ return {
51
+ solid: solid.build(),
52
+ flexible: flexible.build(),
53
+ colliderRadius: params.trunkRadius,
54
+ colliderHeight: params.height * 0.62,
55
+ };
56
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * What the engine may ask about, and ask of, the surface it draws on.
3
+ *
4
+ * This is the seam a video settings screen is built on: which window mode the game is in, what
5
+ * size the drawing surface is, what displays exist, and what the refresh rate is. A browser can
6
+ * answer some of it and a native shell can answer all of it, so **the browser implementation
7
+ * returns the value that is true** where it cannot answer — `null` for a refresh rate rather than
8
+ * 60, and `false` from a call it cannot perform rather than a silent no-op. `AGENTS.md` requires
9
+ * that of a backend for the same reason it is required here: a plausible answer is a picture
10
+ * rather than an error, and something will divide by it or grey out the wrong control.
11
+ *
12
+ * **There are two window modes and not three, and that is a statement about the platform.**
13
+ * Chromium never takes an exclusive fullscreen: it does not change the display's mode, it covers
14
+ * the display. So "borderless fullscreen" and "fullscreen" would be the same setting under two
15
+ * names, and a settings screen offering both would have one that does nothing. What a game
16
+ * changes instead of a display mode is *how much it renders* — that is `RenderQuality`'s
17
+ * `resolutionScale` and the `ResolutionGovernor`, not this interface.
18
+ *
19
+ * **Mobile is deliberately not modelled here.** A phone has no window and no window mode; what it
20
+ * has is an orientation, a set of safe-area insets and a screen that wants to sleep. Those are
21
+ * `ScreenPresentation`, a separate capability, because a desktop shell has no use for them and a
22
+ * phone has no use for most of this.
23
+ *
24
+ * Taken as parameters, never imported: nothing under `src/` may name a shell, exactly as nothing
25
+ * under `src/` names `localStorage` outside `KeyValueStore`.
26
+ *
27
+ * Not a hot path. Nothing here is called per frame.
28
+ */
29
+ /** Windowed, or covering the display. See the class comment for why there is no third. */
30
+ export type WindowMode = 'windowed' | 'fullscreen';
31
+ /** A display the game could be shown on, as the platform reports it. */
32
+ export interface DisplayInfo {
33
+ /** Stable for as long as the display is attached. Opaque: do not parse it. */
34
+ readonly id: string;
35
+ /** What to show in a list. A platform that has no name for it repeats the size. */
36
+ readonly label: string;
37
+ /** Logical pixels, which is what a window is sized in. */
38
+ readonly width: number;
39
+ readonly height: number;
40
+ /** Device pixels per logical pixel on this display. */
41
+ readonly scale: number;
42
+ /** Null where the platform will not say, which includes every browser. */
43
+ readonly refreshHz: number | null;
44
+ readonly primary: boolean;
45
+ }
46
+ export interface DisplayControl {
47
+ /** The refresh rate of the display the game is on, or null where the platform will not say. */
48
+ readonly refreshHz: number | null;
49
+ /** Which mode the game is in right now, read rather than remembered. */
50
+ mode(): WindowMode;
51
+ /** `false` where the platform refused or cannot. Never rejects. */
52
+ setMode(mode: WindowMode): Promise<boolean>;
53
+ isFullscreen(): boolean;
54
+ /** Never rejects. A browser refuses fullscreen outside a gesture, which is ordinary. */
55
+ setFullscreen(on: boolean): Promise<void>;
56
+ /** The drawing surface, in logical pixels. */
57
+ size(): {
58
+ readonly width: number;
59
+ readonly height: number;
60
+ };
61
+ /**
62
+ * Whether `setSize` would work right now, asked without performing one.
63
+ *
64
+ * **A question rather than a mutation, since 2026-08-28.** `false` from `setSize` was the only
65
+ * way to learn this, and `setSize` is the mutator — so a settings screen deciding whether to
66
+ * draw a resolution control at all had to call the thing that changes the window in order to
67
+ * find out whether it may. Reported from outside, where the workaround was a no-op probe at
68
+ * boot, `setSize(...size())`, with a paragraph explaining that it is not what it looks like.
69
+ *
70
+ * **Read on each call and not a constant**, for the reason `mode()` is a call: a shell that can
71
+ * resize a window cannot resize one that is covering a display, so the answer changes with the
72
+ * window mode. A screen that greys its control reads this when it draws.
73
+ *
74
+ * It must agree with `setSize`, and in a shell that agreement is one function rather than two
75
+ * conditions written twice — see `ipc.ts`. Two implementations of one decision drift, and here
76
+ * they would drift into a greyed control that works or a live one that does not.
77
+ *
78
+ * **The engine already had this shape and this surface lacked it**: `pad.canRumble` says whether
79
+ * a browser can drive a pad's motors at all, beside a `rumble` that answers whether the call was
80
+ * taken. A question and a mutation, and the question is the half a settings screen draws with.
81
+ */
82
+ canSetSize(): boolean;
83
+ /**
84
+ * Resize the drawing surface. `false` where the platform will not — a browser never can, and a
85
+ * shell will not while the window is covering a display.
86
+ */
87
+ setSize(width: number, height: number): Promise<boolean>;
88
+ /** Every display the platform will admit to. Never empty where at least one is known. */
89
+ displays(): readonly DisplayInfo[];
90
+ }
91
+ export declare class BrowserDisplay implements DisplayControl {
92
+ private readonly element;
93
+ constructor(element: HTMLElement);
94
+ /**
95
+ * Null always, here: no browser API reports this.
96
+ *
97
+ * Measuring it from frame intervals is possible and is deliberately not done — the answer
98
+ * would be wrong on exactly the machines that care, where the compositor is capping a display
99
+ * that runs faster. A shell asks the operating system and knows.
100
+ */
101
+ readonly refreshHz: number | null;
102
+ isFullscreen(): boolean;
103
+ mode(): WindowMode;
104
+ setMode(mode: WindowMode): Promise<boolean>;
105
+ setFullscreen(on: boolean): Promise<void>;
106
+ size(): {
107
+ readonly width: number;
108
+ readonly height: number;
109
+ };
110
+ /**
111
+ * Always false, and it touches nothing to say so.
112
+ *
113
+ * The same answer `setSize` gives and for the same reason, which is why they are written next to
114
+ * each other: a browser cannot resize a window it did not open, so a settings screen greys the
115
+ * control rather than offering one that quietly does nothing.
116
+ */
117
+ canSetSize(): boolean;
118
+ /**
119
+ * Always false.
120
+ *
121
+ * `window.resizeTo` is refused for anything but a window the script opened itself, so a browser
122
+ * genuinely cannot do this. Saying so lets a settings screen disable the control; returning
123
+ * `true` and doing nothing would leave a resolution list that appears to work.
124
+ */
125
+ setSize(_width: number, _height: number): Promise<boolean>;
126
+ /**
127
+ * The one screen this browser can see.
128
+ *
129
+ * One entry rather than none: the browser does know the screen it is on, and an empty list
130
+ * would make a settings screen report no displays on a machine that plainly has one. What it
131
+ * does not know is the refresh rate or the names and positions of any other display, and it
132
+ * says so by leaving them null and absent respectively.
133
+ */
134
+ displays(): readonly DisplayInfo[];
135
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * What the engine may ask about, and ask of, the surface it draws on.
3
+ *
4
+ * This is the seam a video settings screen is built on: which window mode the game is in, what
5
+ * size the drawing surface is, what displays exist, and what the refresh rate is. A browser can
6
+ * answer some of it and a native shell can answer all of it, so **the browser implementation
7
+ * returns the value that is true** where it cannot answer — `null` for a refresh rate rather than
8
+ * 60, and `false` from a call it cannot perform rather than a silent no-op. `AGENTS.md` requires
9
+ * that of a backend for the same reason it is required here: a plausible answer is a picture
10
+ * rather than an error, and something will divide by it or grey out the wrong control.
11
+ *
12
+ * **There are two window modes and not three, and that is a statement about the platform.**
13
+ * Chromium never takes an exclusive fullscreen: it does not change the display's mode, it covers
14
+ * the display. So "borderless fullscreen" and "fullscreen" would be the same setting under two
15
+ * names, and a settings screen offering both would have one that does nothing. What a game
16
+ * changes instead of a display mode is *how much it renders* — that is `RenderQuality`'s
17
+ * `resolutionScale` and the `ResolutionGovernor`, not this interface.
18
+ *
19
+ * **Mobile is deliberately not modelled here.** A phone has no window and no window mode; what it
20
+ * has is an orientation, a set of safe-area insets and a screen that wants to sleep. Those are
21
+ * `ScreenPresentation`, a separate capability, because a desktop shell has no use for them and a
22
+ * phone has no use for most of this.
23
+ *
24
+ * Taken as parameters, never imported: nothing under `src/` may name a shell, exactly as nothing
25
+ * under `src/` names `localStorage` outside `KeyValueStore`.
26
+ *
27
+ * Not a hot path. Nothing here is called per frame.
28
+ */
29
+ export class BrowserDisplay {
30
+ element;
31
+ constructor(element) {
32
+ this.element = element;
33
+ }
34
+ /**
35
+ * Null always, here: no browser API reports this.
36
+ *
37
+ * Measuring it from frame intervals is possible and is deliberately not done — the answer
38
+ * would be wrong on exactly the machines that care, where the compositor is capping a display
39
+ * that runs faster. A shell asks the operating system and knows.
40
+ */
41
+ refreshHz = null;
42
+ isFullscreen() {
43
+ return document.fullscreenElement !== null;
44
+ }
45
+ mode() {
46
+ return this.isFullscreen() ? 'fullscreen' : 'windowed';
47
+ }
48
+ async setMode(mode) {
49
+ const before = this.mode();
50
+ await this.setFullscreen(mode === 'fullscreen');
51
+ /* Read back rather than assume: a browser refuses fullscreen outside a user gesture and
52
+ says nothing, and a settings screen that believed the request would show the wrong state
53
+ until something else redrew it. */
54
+ const after = this.mode();
55
+ return after === mode || before === mode;
56
+ }
57
+ async setFullscreen(on) {
58
+ try {
59
+ if (on)
60
+ await this.element.requestFullscreen?.();
61
+ else
62
+ await document.exitFullscreen?.();
63
+ }
64
+ catch {
65
+ /* A refusal is normal: fullscreen needs a user gesture and the caller may not be in one.
66
+ Throwing would put a try/catch in every consumer's settings screen. */
67
+ }
68
+ }
69
+ size() {
70
+ return { width: window.innerWidth, height: window.innerHeight };
71
+ }
72
+ /**
73
+ * Always false, and it touches nothing to say so.
74
+ *
75
+ * The same answer `setSize` gives and for the same reason, which is why they are written next to
76
+ * each other: a browser cannot resize a window it did not open, so a settings screen greys the
77
+ * control rather than offering one that quietly does nothing.
78
+ */
79
+ canSetSize() {
80
+ return false;
81
+ }
82
+ /**
83
+ * Always false.
84
+ *
85
+ * `window.resizeTo` is refused for anything but a window the script opened itself, so a browser
86
+ * genuinely cannot do this. Saying so lets a settings screen disable the control; returning
87
+ * `true` and doing nothing would leave a resolution list that appears to work.
88
+ */
89
+ async setSize(_width, _height) {
90
+ return false;
91
+ }
92
+ /**
93
+ * The one screen this browser can see.
94
+ *
95
+ * One entry rather than none: the browser does know the screen it is on, and an empty list
96
+ * would make a settings screen report no displays on a machine that plainly has one. What it
97
+ * does not know is the refresh rate or the names and positions of any other display, and it
98
+ * says so by leaving them null and absent respectively.
99
+ */
100
+ displays() {
101
+ const screen = window.screen;
102
+ return [
103
+ {
104
+ id: 'browser',
105
+ label: `${screen.width}x${screen.height}`,
106
+ width: screen.width,
107
+ height: screen.height,
108
+ scale: window.devicePixelRatio,
109
+ refreshHz: null,
110
+ primary: true,
111
+ },
112
+ ];
113
+ }
114
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Choosing a file, and writing one out.
3
+ *
4
+ * **Nothing in a game needs this**; an editor does, which is why it is a separate capability
5
+ * rather than a member of a larger one — a consumer that never opens a file never has to supply
6
+ * it. `AGENTS.md` calls this the SDF-text shape: opt-in costs a consumer nothing until asked for.
7
+ *
8
+ * **A cancel and an absent API are different answers.** Cancel is `null`, because a person
9
+ * changing their mind is ordinary. No picker at all throws, because that is a boot-time
10
+ * capability failure and the caller should say so rather than show an empty screen.
11
+ */
12
+ export interface OpenedFile {
13
+ readonly name: string;
14
+ readonly bytes: Uint8Array;
15
+ }
16
+ export interface FileDialogs {
17
+ /** `null` when the person cancelled. Throws when the platform has no picker. */
18
+ openFile(accept: readonly string[]): Promise<OpenedFile | null>;
19
+ /** `false` when the person cancelled. Throws when the platform has no picker. */
20
+ saveFile(name: string, bytes: Uint8Array): Promise<boolean>;
21
+ }
22
+ export declare class BrowserFileDialogs implements FileDialogs {
23
+ openFile(accept: readonly string[]): Promise<OpenedFile | null>;
24
+ saveFile(name: string, bytes: Uint8Array): Promise<boolean>;
25
+ }
@@ -0,0 +1,44 @@
1
+ export class BrowserFileDialogs {
2
+ async openFile(accept) {
3
+ const picker = globalThis.showOpenFilePicker;
4
+ if (typeof picker !== 'function') {
5
+ throw new Error('[driftengine] no file picker in this browser; a shell supplies one');
6
+ }
7
+ try {
8
+ const [handle] = await picker({
9
+ /* One entry rather than one per extension: the map's keys are MIME types and the
10
+ engine's own container has none registered, so the extensions carry the filter. */
11
+ types: [{ description: 'files', accept: { '*/*': [...accept] } }],
12
+ });
13
+ if (handle === undefined)
14
+ return null;
15
+ const file = await handle.getFile();
16
+ return { name: file.name, bytes: new Uint8Array(await file.arrayBuffer()) };
17
+ }
18
+ catch {
19
+ /* Every rejection here is a cancel: the picker was present, so a failure to produce a
20
+ file is a person who closed it. A real read error surfaces from `getFile` as a throw
21
+ that this also swallows, which is the one case where null is thin — and a caller that
22
+ got null after a chooser closed has nothing better to do either way. */
23
+ return null;
24
+ }
25
+ }
26
+ async saveFile(name, bytes) {
27
+ const picker = globalThis.showSaveFilePicker;
28
+ if (typeof picker !== 'function') {
29
+ throw new Error('[driftengine] no save picker in this browser; a shell supplies one');
30
+ }
31
+ try {
32
+ const handle = await picker({
33
+ suggestedName: name,
34
+ });
35
+ const writable = await handle.createWritable();
36
+ await writable.write(bytes);
37
+ await writable.close();
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ }