@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,385 @@
1
+ /**
2
+ * Allocation-free wall-clock sampling for a procedural sun, moon and clouds.
3
+ *
4
+ * **Two models, and a caller chooses by whether it names a place.** Without a `CelestialSite` this
5
+ * is what it has always been: a sun swung through a fixed arc, peaking at the same altitude every
6
+ * day of every year wherever the world is meant to be. With one, it is the standard solar-position
7
+ * arithmetic — a declination from the day of the year, an hour angle from the clock, and an
8
+ * altitude and azimuth from those and the latitude.
9
+ *
10
+ * **The simplified model is kept rather than replaced**, and that is the engine's ordinary rule
11
+ * rather than a soft touch: every world authored against this engine has its lighting tuned against
12
+ * that arc, and a model that silently moved the sun would move every shadow, every exposure and
13
+ * every night in every consumer at once. A caller that passes no site gets the same numbers it got
14
+ * before, bit for bit, which `celestialClock.test.ts` asserts against literals rather than against
15
+ * a second implementation.
16
+ *
17
+ * **What the simplified model gives up, said plainly, because a consumer worked it out for
18
+ * themselves first:** no latitude, so the sun reaches 66° at noon on the equator and at the pole
19
+ * alike; no season, so the arc is the same in December as in June; an azimuth that sweeps a whole
20
+ * turn in a day where a real one swings through rather less; and a moon pinned exactly opposite the
21
+ * sun, which contradicts the phase reported beside it — a crescent that rises at midnight. All four
22
+ * are fixed by naming a site.
23
+ *
24
+ * **A site can also name its clock, and until 2026-09-03 nothing could.** The hour was read off the
25
+ * timestamp through the *host machine's* time zone, so one argument put the sun in four places on
26
+ * four machines — solar noon at 12:00 under `TZ=UTC`, 10:00 in Rome, 16:00 in New York, 03:00 in
27
+ * Tokyo — and the only way to say an hour was to build a timestamp whose host offset cancelled the
28
+ * one being added. `longitudeDeg` and `utcOffsetHours` are the way to say it instead: either one
29
+ * makes the timestamp a UTC instant and the engine derives the site's own hour, so the sky is a
30
+ * function of the arguments alone. It was found by a player in Italy watching the sun set before
31
+ * six, which is what the workaround cost when the host disagreed with the world.
32
+ */
33
+
34
+ import { TAU, smoothstep } from '../math/scalar.ts';
35
+ import type { Vec3 } from '../math/color.ts';
36
+
37
+ /**
38
+ * Where in the world, and when in the year, the sky is being sampled.
39
+ *
40
+ * **A site rather than a latitude alone**, because latitude and season are one question: the sun's
41
+ * altitude is a function of the declination *and* the latitude, and a model with one and not the
42
+ * other is wrong in a way that only shows up six months later.
43
+ */
44
+ export interface CelestialSite {
45
+ /**
46
+ * Degrees north of the equator, −90 to 90. Clamped rather than refused, because a value past a
47
+ * pole is a caller's arithmetic overshooting rather than a request for something impossible.
48
+ */
49
+ readonly latitudeDeg: number;
50
+ /**
51
+ * Degrees east of Greenwich, −180 to 180, or absent.
52
+ *
53
+ * **Naming this or `utcOffsetHours` changes what the timestamp means**: it stops being read
54
+ * through the host machine's time zone and becomes a plain UTC instant, from which this site's
55
+ * own hour is derived. See `celestialStateAt`. Not clamped, because a longitude is an angle and
56
+ * a value past the antimeridian means the place a turn around says it does.
57
+ *
58
+ * Alone, it also stands in for the zone: a place is assumed to keep the time of its own
59
+ * meridian, which is exact solar time and differs from a real zone by up to half an hour.
60
+ */
61
+ readonly longitudeDeg?: number;
62
+ /**
63
+ * Hours this site's wall clock runs ahead of UTC — `2` for Italy in summer — or absent.
64
+ *
65
+ * The other half of the pair above, and the same switch: naming it makes the timestamp a UTC
66
+ * instant. It is what turns that instant into the site's *calendar day*, which is the one thing
67
+ * a longitude cannot do; with `longitudeDeg` beside it the sun also stops sitting at the zone's
68
+ * centre and moves to the place's real meridian, up to half an hour either way.
69
+ *
70
+ * **Daylight saving is the caller's**, because a zone's offset is a function of the date and of
71
+ * legislation, and an engine that shipped a table of it would ship a table that expires.
72
+ */
73
+ readonly utcOffsetHours?: number;
74
+ /**
75
+ * Day of the year, 1 to 365, or absent to take it from the timestamp.
76
+ *
77
+ * Present because a world may run on a calendar of its own — a game whose year is forty days
78
+ * still wants a season — and taking it from the timestamp would tie that to the wall clock.
79
+ */
80
+ readonly dayOfYear?: number;
81
+ /**
82
+ * The planet's axial tilt in degrees. Earth's 23.44 by default.
83
+ *
84
+ * Zero is a world with no seasons at all, where the sun's arc is the same every day and depends
85
+ * on latitude alone; larger values are a world with sharper ones. It is here because it costs one
86
+ * multiply and because a stylised world is exactly the consumer this engine has.
87
+ */
88
+ readonly obliquityDeg?: number;
89
+ }
90
+
91
+ export interface CelestialState {
92
+ sunDir: Vec3;
93
+ moonDir: Vec3;
94
+ /** 0 at night, 1 in full day. Smoothstepped across the twilight band. */
95
+ dayFactor: number;
96
+ nightFactor: number;
97
+ /** Wrapped scroll distance suitable for a highp shader uniform. */
98
+ /** 0..1 across the lunar cycle. */
99
+ moonPhase: number;
100
+ }
101
+
102
+ const MS_PER_DAY = 86_400_000;
103
+ /** One hour, for shifting an instant into a site's own zone. */
104
+ const MS_PER_HOUR = 3_600_000;
105
+ /**
106
+ * How high the sun climbs at noon in the model that knows no latitude: 1.15 radians, 66 degrees.
107
+ *
108
+ * Unused by the sited model, which derives the altitude instead, and kept because every world
109
+ * authored before 2026-08-27 is tuned against it.
110
+ */
111
+ const MAX_ELEVATION = 1.15;
112
+ /** Earth's axial tilt, and the default a site takes when it names none. */
113
+ const OBLIQUITY_DEG = 23.44;
114
+ /** Days in the year the declination is derived against. */
115
+ const YEAR_DAYS = 365;
116
+ const DEG = Math.PI / 180;
117
+ const LUNAR_CYCLE_DAYS = 29.530_588_67;
118
+ const NEW_MOON_EPOCH_MS = Date.UTC(2000, 0, 6, 18, 14);
119
+ const TWILIGHT = 0.12;
120
+ /**
121
+ * Reused because `celestialStateAt` runs every frame; `new Date` would allocate.
122
+ *
123
+ * It holds the caller's timestamp verbatim when the site names no zone, and the same instant
124
+ * shifted into the site's zone when it does — so the UTC getters read that site's wall clock.
125
+ */
126
+ const scratchDate = new Date(0);
127
+
128
+ export function createCelestialState(): CelestialState {
129
+ return {
130
+ sunDir: [0, 1, 0],
131
+ moonDir: [0, -1, 0],
132
+ dayFactor: 1,
133
+ nightFactor: 0,
134
+ moonPhase: 0,
135
+ };
136
+ }
137
+
138
+ /** Visible fraction: new at 0/1, quarters at 0.25/0.75, full at 0.5. */
139
+ export function moonIllumination(phase: number): number {
140
+ return 0.5 - Math.cos(phase * TAU) * 0.5;
141
+ }
142
+
143
+ /**
144
+ * Convert a timestamp and an authored azimuth into sky state.
145
+ *
146
+ * The caller decides where the timestamp comes from and must keep it out of a deterministic
147
+ * simulation if wall time should not affect gameplay.
148
+ *
149
+ * `sunAzimuth` is **where the world's north points**, as an angle in the xz plane from +x toward
150
+ * +z. It was an arbitrary offset in the model that knows no latitude and it means the same thing
151
+ * there; with a site it becomes load-bearing, because the sun's own azimuth is then derived and
152
+ * this is what relates it to the world's axes.
153
+ *
154
+ * **`site` is what turns the simplified model into the sited one**, and omitting it is not a
155
+ * degraded mode — it is the model every world here was authored against. See the header.
156
+ *
157
+ * **Which hour the timestamp names depends on whether the site states a zone**, and that is the
158
+ * one thing to get right before anything else here matters:
159
+ *
160
+ * - **A site naming `longitudeDeg` or `utcOffsetHours`** makes `whenMs` a plain **UTC instant** —
161
+ * `Date.now()`, or `Date.UTC(…)` for an hour chosen outright — and the engine derives that
162
+ * site's own hour from it. The answer is then a function of the arguments and of nothing else,
163
+ * which is the only form that gives every machine the same sky.
164
+ * - **A site naming neither, or no site at all**, reads the hour off the timestamp through the
165
+ * **host machine's** time zone, which is what this function has always done. Every world
166
+ * authored against it is tuned that way, so it is kept exactly: the same argument gives the same
167
+ * numbers, bit for bit. But the same argument on another machine gives another hour, so a caller
168
+ * in this form must build the timestamp from local parts — `new Date(y, m, d, h)` — for the
169
+ * host's offset to cancel rather than be added.
170
+ *
171
+ * **`moonPhase` is the reason the first form is worth taking even where the sun already looks
172
+ * right.** It comes from the timestamp's absolute value rather than from the hour, so the
173
+ * build-it-from-local-parts trick that steadies the sun leaves the moon drifting by the host's
174
+ * offset — a fiftieth of a lunar cycle across the world, invisible and still not a fact about the
175
+ * world.
176
+ *
177
+ * **The equation of time stays the caller's**, and it is the last correction left: a real sun runs
178
+ * up to about a quarter of an hour ahead of or behind mean time across the year, from the Earth's
179
+ * eccentricity and its tilt. The zone and the meridian are the engine's as soon as a site states
180
+ * them; this one is not, because it is a property of the planet's orbit rather than of the place,
181
+ * and a world with an obliquity of its own has an equation of time of its own. A caller measuring
182
+ * a shadow against an almanac applies it to the timestamp; a caller lighting a world does not care.
183
+ */
184
+ export function celestialStateAt(
185
+ whenMs: number,
186
+ sunAzimuth: number,
187
+ out: CelestialState,
188
+ site?: CelestialSite,
189
+ ): void {
190
+ const cycles = (whenMs - NEW_MOON_EPOCH_MS) / MS_PER_DAY / LUNAR_CYCLE_DAYS;
191
+ const phase = cycles - Math.floor(cycles);
192
+ out.moonPhase = phase;
193
+
194
+ if (site === undefined) {
195
+ scratchDate.setTime(whenMs);
196
+ simplified(hostHours(scratchDate), sunAzimuth, out);
197
+ } else {
198
+ /*
199
+ * The zone, or nothing.
200
+ *
201
+ * A longitude alone implies its own offset, so a site that gives one and not the other still
202
+ * describes a consistent clock: `undefined` here means the site named neither, which is the
203
+ * one case that falls back to the host's.
204
+ */
205
+ const meridianDeg = site.longitudeDeg;
206
+ const offsetHours =
207
+ site.utcOffsetHours ?? (meridianDeg === undefined ? undefined : meridianDeg / 15);
208
+
209
+ if (offsetHours === undefined) {
210
+ scratchDate.setTime(whenMs);
211
+ sited(
212
+ hostHours(scratchDate),
213
+ site.dayOfYear ?? hostDayOfYear(scratchDate),
214
+ sunAzimuth,
215
+ phase,
216
+ site,
217
+ out,
218
+ );
219
+ } else {
220
+ /*
221
+ * Shifted into the site's zone, so the UTC getters read its wall clock; the meridian then
222
+ * carries that clock the rest of the way to solar time, which is where the hour angle is
223
+ * measured from. That correction is zero for a place at the centre of its zone and up to
224
+ * half an hour at its edges. It can push the hour past midnight either way and nothing needs
225
+ * it wrapped: an hour angle is an angle, and the calendar day is the site's rather than the
226
+ * sun's.
227
+ */
228
+ scratchDate.setTime(whenMs + offsetHours * MS_PER_HOUR);
229
+ const solar = utcHours(scratchDate) + (meridianDeg ?? offsetHours * 15) / 15 - offsetHours;
230
+ sited(solar, site.dayOfYear ?? utcDayOfYear(scratchDate), sunAzimuth, phase, site, out);
231
+ }
232
+ }
233
+
234
+ out.dayFactor = smoothstep(-TWILIGHT, TWILIGHT, out.sunDir[1]);
235
+ out.nightFactor = 1 - out.dayFactor;
236
+ }
237
+
238
+ /**
239
+ * The model that knows no latitude, unchanged since it was written.
240
+ *
241
+ * A sine of the day's fraction scaled to a fixed peak, an azimuth sweeping a whole turn, and a moon
242
+ * pinned exactly opposite. Every number a world authored before 2026-08-27 was tuned against.
243
+ */
244
+ function simplified(hours: number, sunAzimuth: number, out: CelestialState): void {
245
+ const fraction = hours / 24;
246
+ const elevation = Math.sin((fraction - 0.25) * TAU) * MAX_ELEVATION;
247
+ const azimuth = sunAzimuth + (fraction - 0.25) * TAU;
248
+ const cosElevation = Math.cos(elevation);
249
+ const sx = cosElevation * Math.cos(azimuth);
250
+ const sy = Math.sin(elevation);
251
+ const sz = cosElevation * Math.sin(azimuth);
252
+
253
+ out.sunDir[0] = sx;
254
+ out.sunDir[1] = sy;
255
+ out.sunDir[2] = sz;
256
+ out.moonDir[0] = -sx;
257
+ out.moonDir[1] = -sy;
258
+ out.moonDir[2] = -sz;
259
+ }
260
+
261
+ /**
262
+ * The sited model: a declination, an hour angle, and the two spherical formulas over them.
263
+ *
264
+ * **Standard solar-position arithmetic and deliberately the plain form of it.** The declination is
265
+ * Cooper's equation, `ε · sin(2π (284 + N) / 365)`, which is within about half a degree of the
266
+ * truth all year; the altitude and azimuth are the spherical law of cosines and its companion. A
267
+ * more accurate model exists — the equation of centre, nutation, refraction — and buys a fraction
268
+ * of a degree for a sky nobody is navigating by.
269
+ *
270
+ * **The moon follows its phase rather than the sun's opposite**, which is what makes the position
271
+ * and the phase agree at last. The phase *is* the elongation: at new moon the moon shares the sun's
272
+ * ecliptic longitude and its hour angle, so it is up in the daytime and invisible; at full it is
273
+ * half a turn away in both, so it rises as the sun sets. Its own five-degree orbital inclination is
274
+ * ignored, which is what makes this a line rather than a page and costs the moon up to five degrees
275
+ * of altitude.
276
+ *
277
+ * **It takes an hour and a day rather than a `Date`**, because which clock those came off is the
278
+ * caller's question and settled before this is reached — see `celestialStateAt`. The model itself
279
+ * has no time zone in it at all.
280
+ */
281
+ function sited(
282
+ hours: number,
283
+ day: number,
284
+ northAzimuth: number,
285
+ phase: number,
286
+ site: CelestialSite,
287
+ out: CelestialState,
288
+ ): void {
289
+ const latitude = Math.max(-90, Math.min(90, site.latitudeDeg)) * DEG;
290
+ const obliquity = (site.obliquityDeg ?? OBLIQUITY_DEG) * DEG;
291
+
292
+ /* Ecliptic longitude measured from the point that puts the solstices where they belong. */
293
+ const sunLongitude = (TAU * (284 + day)) / YEAR_DAYS;
294
+ const sunHourAngle = (hours - 12) * (Math.PI / 12);
295
+ place(
296
+ latitude,
297
+ Math.asin(Math.sin(obliquity) * Math.sin(sunLongitude)),
298
+ sunHourAngle,
299
+ northAzimuth,
300
+ out.sunDir,
301
+ );
302
+
303
+ /*
304
+ * The moon, a phase's worth of longitude ahead of the sun and the same amount behind in hour
305
+ * angle — because an hour angle is the sky turning westward and a longitude is the moon crawling
306
+ * eastward through it.
307
+ */
308
+ const moonLongitude = sunLongitude + phase * TAU;
309
+ place(
310
+ latitude,
311
+ Math.asin(Math.sin(obliquity) * Math.sin(moonLongitude)),
312
+ sunHourAngle - phase * TAU,
313
+ northAzimuth,
314
+ out.moonDir,
315
+ );
316
+ }
317
+
318
+ /**
319
+ * A declination and an hour angle at a latitude, into a world-space direction.
320
+ *
321
+ * `sin(alt) = sin φ sin δ + cos φ cos δ cos H` is the altitude; the azimuth is the `atan2` form,
322
+ * which needs no quadrant test and is stable at the poles where the cosine form divides by nearly
323
+ * nothing. It comes out measured from **south**, so half a turn puts it on north, and the world's
324
+ * own north then rotates the whole sky into place.
325
+ */
326
+ function place(
327
+ latitude: number,
328
+ declination: number,
329
+ hourAngle: number,
330
+ northAzimuth: number,
331
+ out: Vec3,
332
+ ): void {
333
+ const sinLat = Math.sin(latitude);
334
+ const cosLat = Math.cos(latitude);
335
+ const sinDec = Math.sin(declination);
336
+ const cosDec = Math.cos(declination);
337
+ const sinAlt = sinLat * sinDec + cosLat * cosDec * Math.cos(hourAngle);
338
+ const altitude = Math.asin(Math.max(-1, Math.min(1, sinAlt)));
339
+ const fromSouth = Math.atan2(
340
+ Math.sin(hourAngle) * cosDec,
341
+ Math.cos(hourAngle) * cosDec * sinLat - sinDec * cosLat,
342
+ );
343
+ const azimuth = northAzimuth + fromSouth + Math.PI;
344
+ const cosAltitude = Math.cos(altitude);
345
+ out[0] = cosAltitude * Math.cos(azimuth);
346
+ out[1] = Math.sin(altitude);
347
+ out[2] = cosAltitude * Math.sin(azimuth);
348
+ }
349
+
350
+ /** The hour, with its minutes and seconds, off the host machine's own clock. */
351
+ function hostHours(date: Date): number {
352
+ return date.getHours() + date.getMinutes() / 60 + date.getSeconds() / 3600;
353
+ }
354
+
355
+ /** The same, off an instant already shifted into the site's zone. See `scratchDate`. */
356
+ function utcHours(date: Date): number {
357
+ return date.getUTCHours() + date.getUTCMinutes() / 60 + date.getUTCSeconds() / 3600;
358
+ }
359
+
360
+ /**
361
+ * Which day of the year a host-local date falls on, 1 to 366.
362
+ *
363
+ * From the date's own month and day rather than a difference of timestamps, because a difference
364
+ * across a daylight-saving boundary is an hour short and lands on the previous day for an hour of
365
+ * every spring.
366
+ */
367
+ function hostDayOfYear(date: Date): number {
368
+ const start = Date.UTC(date.getFullYear(), 0, 1);
369
+ const here = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());
370
+ return Math.round((here - start) / MS_PER_DAY) + 1;
371
+ }
372
+
373
+ /**
374
+ * The same for an instant already shifted into the site's zone, read through the UTC getters.
375
+ *
376
+ * A separate four lines rather than a flag, because the pair is the whole difference between the
377
+ * two clocks this function can be asked about and folding them together hides it. No daylight
378
+ * saving to step around here: the shift was a constant, so the difference of timestamps would
379
+ * have done — it is written this way to read beside its neighbour.
380
+ */
381
+ function utcDayOfYear(date: Date): number {
382
+ const start = Date.UTC(date.getUTCFullYear(), 0, 1);
383
+ const here = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
384
+ return Math.round((here - start) / MS_PER_DAY) + 1;
385
+ }
@@ -0,0 +1,260 @@
1
+ import type { MeshData } from '../render/mesh.ts';
2
+ import type { Vec3 } from '../math/color.ts';
3
+
4
+ /**
5
+ * A decal, as the receiving surface's own geometry clipped to a box and lifted off it.
6
+ *
7
+ * **A forward renderer cannot write a decal cheaply into a G-buffer, because there is no G-buffer**,
8
+ * and that is the fact every decal design here has to start from. What a forward renderer *can* do
9
+ * is the older technique, and it is the better-looking one: take the triangles the projector box
10
+ * covers, clip them to it, and draw that. The decal is then made of the surface, so it follows
11
+ * every curve and every bump exactly, which a projector re-drawing a quad cannot.
12
+ *
13
+ * **What it replaces, in a consumer's own words.** Their road patches are strips of geometry lifted
14
+ * two millimetres above the carriageway: it works, it is a draw call per patch for something that
15
+ * exists only to sit on top of something else, and it does not follow a curved surface. Puddles
16
+ * after a storm, oil stains and skid marks were all waiting on the same row. This is one mesh for
17
+ * as many marks as you project into it, and it is the road's own shape.
18
+ *
19
+ * **Built once, not per frame.** A decal is authored or placed by an event — a tyre locks, a barrel
20
+ * leaks — and then it is scenery. That is what makes clipping on the CPU the right cost: it happens
21
+ * at the moment the mark is made, and every frame afterwards it is one more mesh in the batch.
22
+ *
23
+ * **Its limits, stated rather than discovered.** It is a *static* decal: the receiving mesh is
24
+ * sampled as it is, so a decal on something that later deforms rides the old shape. It reads
25
+ * positions and normals and nothing else, so the mark takes its own colour rather than tinting what
26
+ * is underneath. And a projector box covering a hundred thousand triangles clips a hundred thousand
27
+ * triangles, so a caller marking a large world hands in the piece of it they mean.
28
+ */
29
+ export interface DecalOptions {
30
+ /** Middle of the projector box, world space. */
31
+ readonly center: Vec3;
32
+ /** Half-size across, up, and along the projection. The third is how deep the box reaches. */
33
+ readonly halfExtents: Vec3;
34
+ /**
35
+ * The direction the decal is projected *along* — for a mark on the ground, straight down.
36
+ *
37
+ * A surface is marked when it faces back along this. Need not be normalised.
38
+ */
39
+ readonly forward: Vec3;
40
+ /** Which way is up in the decal's own image, so a mark can be turned. Need not be normalised. */
41
+ readonly up: Vec3;
42
+ readonly color?: Vec3;
43
+ /**
44
+ * How far the decal is lifted off the surface, metres. Two millimetres by default.
45
+ *
46
+ * **Not a depth-bias setting in disguise.** The lift is along each vertex's own normal, so it
47
+ * survives a surface that curves away under it where a constant depth offset would not, and it is
48
+ * small enough to be invisible at a metre and large enough to beat a 24-bit depth buffer at fifty.
49
+ */
50
+ readonly offsetM?: number;
51
+ /**
52
+ * How far from facing the projector a surface may be turned and still be marked, as a cosine.
53
+ *
54
+ * The reason this is not zero: a triangle exactly edge-on to the projector clips to a sliver of
55
+ * zero area that still costs six vertices, and one a hair past edge-on produces a mark stretched
56
+ * along a wall it was never aimed at. 0.1 keeps everything within about 84° of facing.
57
+ */
58
+ readonly facingCos?: number;
59
+ readonly emissive?: number;
60
+ readonly specular?: number;
61
+ }
62
+
63
+ /** Room for one clipped polygon: six planes can each add a vertex to a triangle. */
64
+ const MAX_POLYGON = 12;
65
+ /** Position in box space and normal in world space, per vertex, in both ping-pong buffers. */
66
+ const A = new Float64Array(MAX_POLYGON * 6);
67
+ const B = new Float64Array(MAX_POLYGON * 6);
68
+
69
+ export function projectDecal(target: MeshData, options: DecalOptions): MeshData {
70
+ const half = options.halfExtents;
71
+ const hx = half[0];
72
+ const hy = half[1];
73
+ const hz = half[2];
74
+ if (!(hx > 0 && hy > 0 && hz > 0)) {
75
+ throw new Error(`projectDecal: halfExtents must be positive, got ${hx}, ${hy}, ${hz}`);
76
+ }
77
+
78
+ /* The box's own basis. `forward` is the projection axis and `right` closes the frame. */
79
+ const f = unit(options.forward);
80
+ let u = unit(options.up);
81
+ const r = cross(u, f);
82
+ const rLength = Math.hypot(r[0], r[1], r[2]);
83
+ if (rLength === 0) {
84
+ throw new Error('projectDecal: up is parallel to forward, so the box has no orientation');
85
+ }
86
+ r[0] /= rLength;
87
+ r[1] /= rLength;
88
+ r[2] /= rLength;
89
+ /* Re-derived so the frame is orthonormal even where the caller's up was not perpendicular. */
90
+ u = cross(f, r);
91
+
92
+ const facingCos = options.facingCos ?? 0.1;
93
+ const offsetM = options.offsetM ?? 0.002;
94
+ const colour = options.color ?? [1, 1, 1];
95
+ const emissive = options.emissive ?? 0;
96
+ const specular = options.specular ?? 0;
97
+ const centre = options.center;
98
+
99
+ const positions: number[] = [];
100
+ const normals: number[] = [];
101
+ const colors: number[] = [];
102
+ const emissives: number[] = [];
103
+ const speculars: number[] = [];
104
+ const uvs: number[] = [];
105
+ const indices: number[] = [];
106
+
107
+ const triangles = target.indices.length / 3;
108
+ for (let t = 0; t < triangles; t++) {
109
+ const i0 = target.indices[t * 3] ?? 0;
110
+ const i1 = target.indices[t * 3 + 1] ?? 0;
111
+ const i2 = target.indices[t * 3 + 2] ?? 0;
112
+
113
+ /*
114
+ * The *geometric* normal decides whether the triangle is marked, not the shaded one. A smooth
115
+ * sphere's vertex normals fan out around a triangle, so a facing test on any one of them turns
116
+ * a decal on and off along an edge nobody can see; the plane the triangle actually lies in is
117
+ * the thing the projector either sees or does not.
118
+ */
119
+ const nx = geoNormal(target, i0, i1, i2, 0);
120
+ const ny = geoNormal(target, i0, i1, i2, 1);
121
+ const nz = geoNormal(target, i0, i1, i2, 2);
122
+ const facing = -(nx * f[0] + ny * f[1] + nz * f[2]);
123
+ if (facing < facingCos) continue;
124
+
125
+ let count = 3;
126
+ for (let corner = 0; corner < 3; corner++) {
127
+ const v = corner === 0 ? i0 : corner === 1 ? i1 : i2;
128
+ const px = (target.positions[v * 3] ?? 0) - centre[0];
129
+ const py = (target.positions[v * 3 + 1] ?? 0) - centre[1];
130
+ const pz = (target.positions[v * 3 + 2] ?? 0) - centre[2];
131
+ A[corner * 6] = px * r[0] + py * r[1] + pz * r[2];
132
+ A[corner * 6 + 1] = px * u[0] + py * u[1] + pz * u[2];
133
+ A[corner * 6 + 2] = px * f[0] + py * f[1] + pz * f[2];
134
+ A[corner * 6 + 3] = target.normals[v * 3] ?? 0;
135
+ A[corner * 6 + 4] = target.normals[v * 3 + 1] ?? 0;
136
+ A[corner * 6 + 5] = target.normals[v * 3 + 2] ?? 0;
137
+ }
138
+
139
+ /* Sutherland–Hodgman against the six faces of the box, in the box's own space where each is a
140
+ comparison against a constant. */
141
+ let source = A;
142
+ let sink = B;
143
+ for (let axis = 0; axis < 3 && count > 0; axis++) {
144
+ const limit = axis === 0 ? hx : axis === 1 ? hy : hz;
145
+ for (const sign of [1, -1]) {
146
+ count = clip(source, count, sink, axis, sign, limit);
147
+ const swap = source;
148
+ source = sink;
149
+ sink = swap;
150
+ if (count === 0) break;
151
+ }
152
+ }
153
+ if (count < 3) continue;
154
+
155
+ const base = positions.length / 3;
156
+ for (let v = 0; v < count; v++) {
157
+ const bx = source[v * 6] ?? 0;
158
+ const by = source[v * 6 + 1] ?? 0;
159
+ const bz = source[v * 6 + 2] ?? 0;
160
+ let vnx = source[v * 6 + 3] ?? 0;
161
+ let vny = source[v * 6 + 4] ?? 0;
162
+ let vnz = source[v * 6 + 5] ?? 0;
163
+ /* An interpolated normal is shorter than unit between two that differ. */
164
+ const length = Math.hypot(vnx, vny, vnz) || 1;
165
+ vnx /= length;
166
+ vny /= length;
167
+ vnz /= length;
168
+ positions.push(
169
+ centre[0] + r[0] * bx + u[0] * by + f[0] * bz + vnx * offsetM,
170
+ centre[1] + r[1] * bx + u[1] * by + f[1] * bz + vny * offsetM,
171
+ centre[2] + r[2] * bx + u[2] * by + f[2] * bz + vnz * offsetM,
172
+ );
173
+ normals.push(vnx, vny, vnz);
174
+ colors.push(colour[0], colour[1], colour[2]);
175
+ emissives.push(emissive);
176
+ speculars.push(specular);
177
+ /* The projection is the mapping: across the box is u, up the box is v. */
178
+ uvs.push(bx / (hx * 2) + 0.5, by / (hy * 2) + 0.5);
179
+ }
180
+ for (let v = 2; v < count; v++) indices.push(base, base + v - 1, base + v);
181
+ }
182
+
183
+ return {
184
+ positions: Float32Array.from(positions),
185
+ normals: Float32Array.from(normals),
186
+ colors: Float32Array.from(colors),
187
+ emissive: Float32Array.from(emissives),
188
+ specular: Float32Array.from(speculars),
189
+ uvs: Float32Array.from(uvs),
190
+ indices: Uint32Array.from(indices),
191
+ };
192
+ }
193
+
194
+ /**
195
+ * Keep the part of the polygon on the inside of one box face, interpolating across the crossings.
196
+ *
197
+ * Every attribute is carried through the same `t`, which is what makes a clipped normal the normal
198
+ * the surface had at that point rather than one of the corners'.
199
+ */
200
+ function clip(
201
+ source: Float64Array,
202
+ count: number,
203
+ sink: Float64Array,
204
+ axis: number,
205
+ sign: number,
206
+ limit: number,
207
+ ): number {
208
+ let out = 0;
209
+ for (let i = 0; i < count; i++) {
210
+ const j = (i + 1) % count;
211
+ const di = sign * (source[i * 6 + axis] ?? 0) - limit;
212
+ const dj = sign * (source[j * 6 + axis] ?? 0) - limit;
213
+ if (di <= 0) {
214
+ if (out < MAX_POLYGON) copy(source, i, sink, out++);
215
+ }
216
+ if (di > 0 !== dj > 0) {
217
+ const t = di / (di - dj);
218
+ if (out < MAX_POLYGON) {
219
+ for (let k = 0; k < 6; k++) {
220
+ const a = source[i * 6 + k] ?? 0;
221
+ const b = source[j * 6 + k] ?? 0;
222
+ sink[out * 6 + k] = a + (b - a) * t;
223
+ }
224
+ out++;
225
+ }
226
+ }
227
+ }
228
+ return out;
229
+ }
230
+
231
+ function copy(source: Float64Array, from: number, sink: Float64Array, to: number): void {
232
+ for (let k = 0; k < 6; k++) sink[to * 6 + k] = source[from * 6 + k] ?? 0;
233
+ }
234
+
235
+ /** One component of the triangle's own plane normal, unit length. */
236
+ function geoNormal(mesh: MeshData, i0: number, i1: number, i2: number, component: number): number {
237
+ const ax = mesh.positions[i0 * 3] ?? 0;
238
+ const ay = mesh.positions[i0 * 3 + 1] ?? 0;
239
+ const az = mesh.positions[i0 * 3 + 2] ?? 0;
240
+ const ux = (mesh.positions[i1 * 3] ?? 0) - ax;
241
+ const uy = (mesh.positions[i1 * 3 + 1] ?? 0) - ay;
242
+ const uz = (mesh.positions[i1 * 3 + 2] ?? 0) - az;
243
+ const vx = (mesh.positions[i2 * 3] ?? 0) - ax;
244
+ const vy = (mesh.positions[i2 * 3 + 1] ?? 0) - ay;
245
+ const vz = (mesh.positions[i2 * 3 + 2] ?? 0) - az;
246
+ const nx = uy * vz - uz * vy;
247
+ const ny = uz * vx - ux * vz;
248
+ const nz = ux * vy - uy * vx;
249
+ const length = Math.hypot(nx, ny, nz) || 1;
250
+ return (component === 0 ? nx : component === 1 ? ny : nz) / length;
251
+ }
252
+
253
+ function unit(v: Vec3): Vec3 {
254
+ const length = Math.hypot(v[0], v[1], v[2]) || 1;
255
+ return [v[0] / length, v[1] / length, v[2] / length];
256
+ }
257
+
258
+ function cross(a: Vec3, b: Vec3): Vec3 {
259
+ return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
260
+ }