@thunderclap-engine/engine 0.0.0-stage → 1.1.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 (566) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -2
  4. package/dist/analytics/analytics.d.ts +80 -0
  5. package/dist/analytics/analytics.js +129 -0
  6. package/dist/analytics/index.d.ts +1 -0
  7. package/dist/analytics/index.js +1 -0
  8. package/dist/anim/aim.d.ts +43 -0
  9. package/dist/anim/aim.js +157 -0
  10. package/dist/anim/clip.d.ts +98 -0
  11. package/dist/anim/clip.js +282 -0
  12. package/dist/anim/compress.d.ts +65 -0
  13. package/dist/anim/compress.js +339 -0
  14. package/dist/anim/foot-ik.d.ts +74 -0
  15. package/dist/anim/foot-ik.js +241 -0
  16. package/dist/anim/graph.d.ts +153 -0
  17. package/dist/anim/graph.js +532 -0
  18. package/dist/anim/ik.d.ts +105 -0
  19. package/dist/anim/ik.js +435 -0
  20. package/dist/anim/index.d.ts +36 -0
  21. package/dist/anim/index.js +21 -0
  22. package/dist/anim/match.d.ts +66 -0
  23. package/dist/anim/match.js +153 -0
  24. package/dist/anim/mixer.d.ts +113 -0
  25. package/dist/anim/mixer.js +314 -0
  26. package/dist/anim/morph.d.ts +41 -0
  27. package/dist/anim/morph.js +94 -0
  28. package/dist/anim/pose.d.ts +74 -0
  29. package/dist/anim/pose.js +254 -0
  30. package/dist/anim/quat.d.ts +44 -0
  31. package/dist/anim/quat.js +187 -0
  32. package/dist/anim/retarget.d.ts +97 -0
  33. package/dist/anim/retarget.js +366 -0
  34. package/dist/anim/root-motion.d.ts +44 -0
  35. package/dist/anim/root-motion.js +224 -0
  36. package/dist/anim/skin-pose.d.ts +39 -0
  37. package/dist/anim/skin-pose.js +53 -0
  38. package/dist/anim/socket.d.ts +47 -0
  39. package/dist/anim/socket.js +84 -0
  40. package/dist/anim/spring-chain.d.ts +73 -0
  41. package/dist/anim/spring-chain.js +294 -0
  42. package/dist/assets/atlas.d.ts +90 -0
  43. package/dist/assets/atlas.js +212 -0
  44. package/dist/assets/baked.d.ts +33 -0
  45. package/dist/assets/baked.js +38 -0
  46. package/dist/assets/bundle.d.ts +88 -0
  47. package/dist/assets/bundle.js +464 -0
  48. package/dist/assets/cache.d.ts +56 -0
  49. package/dist/assets/cache.js +123 -0
  50. package/dist/assets/gltf-load.d.ts +252 -0
  51. package/dist/assets/gltf-load.js +661 -0
  52. package/dist/assets/gltf-skin.d.ts +36 -0
  53. package/dist/assets/gltf-skin.js +109 -0
  54. package/dist/assets/gltf.d.ts +706 -0
  55. package/dist/assets/gltf.js +1376 -0
  56. package/dist/assets/index.d.ts +20 -0
  57. package/dist/assets/index.js +10 -0
  58. package/dist/assets/ktx2.d.ts +71 -0
  59. package/dist/assets/ktx2.js +213 -0
  60. package/dist/assets/manifest.d.ts +79 -0
  61. package/dist/assets/manifest.js +7 -0
  62. package/dist/assets/meshopt.d.ts +23 -0
  63. package/dist/assets/meshopt.js +403 -0
  64. package/dist/audio/audio.d.ts +733 -0
  65. package/dist/audio/audio.js +2013 -0
  66. package/dist/audio/dsp.d.ts +61 -0
  67. package/dist/audio/dsp.js +159 -0
  68. package/dist/audio/duck.d.ts +44 -0
  69. package/dist/audio/duck.js +101 -0
  70. package/dist/audio/envelope.d.ts +53 -0
  71. package/dist/audio/envelope.js +106 -0
  72. package/dist/audio/index.d.ts +13 -0
  73. package/dist/audio/index.js +14 -0
  74. package/dist/audio/music.d.ts +113 -0
  75. package/dist/audio/music.js +548 -0
  76. package/dist/audio/occlusion.d.ts +55 -0
  77. package/dist/audio/occlusion.js +61 -0
  78. package/dist/audio/persist.d.ts +23 -0
  79. package/dist/audio/persist.js +27 -0
  80. package/dist/audio/recipes.d.ts +55 -0
  81. package/dist/audio/recipes.js +227 -0
  82. package/dist/audio/send.d.ts +41 -0
  83. package/dist/audio/send.js +118 -0
  84. package/dist/audio/sprites.d.ts +59 -0
  85. package/dist/audio/sprites.js +43 -0
  86. package/dist/audio/synth.d.ts +103 -0
  87. package/dist/audio/synth.js +197 -0
  88. package/dist/audio/variations.d.ts +25 -0
  89. package/dist/audio/variations.js +55 -0
  90. package/dist/audio/zones.d.ts +100 -0
  91. package/dist/audio/zones.js +167 -0
  92. package/dist/core/detached-surface.d.ts +44 -0
  93. package/dist/core/detached-surface.js +104 -0
  94. package/dist/core/events.d.ts +24 -0
  95. package/dist/core/events.js +43 -0
  96. package/dist/core/game.d.ts +409 -0
  97. package/dist/core/game.js +530 -0
  98. package/dist/core/hash.d.ts +24 -0
  99. package/dist/core/hash.js +49 -0
  100. package/dist/core/index.d.ts +17 -0
  101. package/dist/core/index.js +9 -0
  102. package/dist/core/loop.d.ts +113 -0
  103. package/dist/core/loop.js +185 -0
  104. package/dist/core/math.d.ts +58 -0
  105. package/dist/core/math.js +210 -0
  106. package/dist/core/noise.d.ts +40 -0
  107. package/dist/core/noise.js +247 -0
  108. package/dist/core/pool.d.ts +42 -0
  109. package/dist/core/pool.js +85 -0
  110. package/dist/core/random.d.ts +61 -0
  111. package/dist/core/random.js +199 -0
  112. package/dist/core/scene.d.ts +79 -0
  113. package/dist/core/scene.js +195 -0
  114. package/dist/core/timer.d.ts +66 -0
  115. package/dist/core/timer.js +286 -0
  116. package/dist/fx/billboard-wgsl.d.ts +29 -0
  117. package/dist/fx/billboard-wgsl.js +158 -0
  118. package/dist/fx/billboard.d.ts +249 -0
  119. package/dist/fx/billboard.js +702 -0
  120. package/dist/fx/debug-draw.d.ts +127 -0
  121. package/dist/fx/debug-draw.js +523 -0
  122. package/dist/fx/debug-wgsl.d.ts +7 -0
  123. package/dist/fx/debug-wgsl.js +32 -0
  124. package/dist/fx/decals-wgsl.d.ts +15 -0
  125. package/dist/fx/decals-wgsl.js +173 -0
  126. package/dist/fx/decals.d.ts +216 -0
  127. package/dist/fx/decals.js +607 -0
  128. package/dist/fx/effect.d.ts +129 -0
  129. package/dist/fx/effect.js +349 -0
  130. package/dist/fx/effects/hit-spark.json +48 -0
  131. package/dist/fx/effects/index.d.ts +8 -0
  132. package/dist/fx/effects/index.js +9 -0
  133. package/dist/fx/effects/magic-aura.json +47 -0
  134. package/dist/fx/effects/smoke-puff.json +34 -0
  135. package/dist/fx/emit-surface.d.ts +40 -0
  136. package/dist/fx/emit-surface.js +124 -0
  137. package/dist/fx/flicker.d.ts +30 -0
  138. package/dist/fx/flicker.js +42 -0
  139. package/dist/fx/index.d.ts +31 -0
  140. package/dist/fx/index.js +20 -0
  141. package/dist/fx/particles-wgsl.d.ts +57 -0
  142. package/dist/fx/particles-wgsl.js +828 -0
  143. package/dist/fx/particles.d.ts +566 -0
  144. package/dist/fx/particles.js +1533 -0
  145. package/dist/fx/random.d.ts +15 -0
  146. package/dist/fx/random.js +20 -0
  147. package/dist/fx/sky-wgsl.d.ts +23 -0
  148. package/dist/fx/sky-wgsl.js +127 -0
  149. package/dist/fx/sky.d.ts +96 -0
  150. package/dist/fx/sky.js +175 -0
  151. package/dist/fx/text-atlas.d.ts +143 -0
  152. package/dist/fx/text-atlas.js +327 -0
  153. package/dist/fx/trail-wgsl.d.ts +11 -0
  154. package/dist/fx/trail-wgsl.js +42 -0
  155. package/dist/fx/trail.d.ts +194 -0
  156. package/dist/fx/trail.js +555 -0
  157. package/dist/fx/water-wgsl.d.ts +34 -0
  158. package/dist/fx/water-wgsl.js +197 -0
  159. package/dist/fx/water.d.ts +176 -0
  160. package/dist/fx/water.js +371 -0
  161. package/dist/geom/collide/bvh.d.ts +151 -0
  162. package/dist/geom/collide/bvh.js +493 -0
  163. package/dist/geom/collide/debug.d.ts +14 -0
  164. package/dist/geom/collide/debug.js +74 -0
  165. package/dist/geom/collide/grid.d.ts +26 -0
  166. package/dist/geom/collide/grid.js +91 -0
  167. package/dist/geom/collide/index.d.ts +8 -0
  168. package/dist/geom/collide/index.js +8 -0
  169. package/dist/geom/collide/queries.d.ts +70 -0
  170. package/dist/geom/collide/queries.js +583 -0
  171. package/dist/geom/collide/serialize.d.ts +14 -0
  172. package/dist/geom/collide/serialize.js +145 -0
  173. package/dist/geom/collide/shapes.d.ts +161 -0
  174. package/dist/geom/collide/shapes.js +686 -0
  175. package/dist/geom/collide/slide.d.ts +66 -0
  176. package/dist/geom/collide/slide.js +375 -0
  177. package/dist/geom/collide/tile-slide.d.ts +88 -0
  178. package/dist/geom/collide/tile-slide.js +255 -0
  179. package/dist/geom/geometry.d.ts +95 -0
  180. package/dist/geom/geometry.js +322 -0
  181. package/dist/geom/heightfield.d.ts +72 -0
  182. package/dist/geom/heightfield.js +295 -0
  183. package/dist/geom/hull.d.ts +27 -0
  184. package/dist/geom/hull.js +279 -0
  185. package/dist/geom/index.d.ts +35 -0
  186. package/dist/geom/index.js +23 -0
  187. package/dist/geom/iso.d.ts +74 -0
  188. package/dist/geom/iso.js +89 -0
  189. package/dist/geom/lod.d.ts +29 -0
  190. package/dist/geom/lod.js +27 -0
  191. package/dist/geom/ops.d.ts +47 -0
  192. package/dist/geom/ops.js +285 -0
  193. package/dist/geom/primitives.d.ts +97 -0
  194. package/dist/geom/primitives.js +359 -0
  195. package/dist/geom/shapes.d.ts +43 -0
  196. package/dist/geom/shapes.js +88 -0
  197. package/dist/geom/simplify.d.ts +38 -0
  198. package/dist/geom/simplify.js +519 -0
  199. package/dist/geom/split.d.ts +37 -0
  200. package/dist/geom/split.js +413 -0
  201. package/dist/geom/sweep.d.ts +83 -0
  202. package/dist/geom/sweep.js +534 -0
  203. package/dist/geom/tangents.d.ts +16 -0
  204. package/dist/geom/tangents.js +124 -0
  205. package/dist/geom/triangulate.d.ts +19 -0
  206. package/dist/geom/triangulate.js +147 -0
  207. package/dist/host/default.d.ts +10 -0
  208. package/dist/host/default.js +10 -0
  209. package/dist/host/index.d.ts +4 -0
  210. package/dist/host/index.js +3 -0
  211. package/dist/host/types.d.ts +144 -0
  212. package/dist/host/types.js +1 -0
  213. package/dist/host/web-links.d.ts +38 -0
  214. package/dist/host/web-links.js +110 -0
  215. package/dist/host/web.d.ts +30 -0
  216. package/dist/host/web.js +216 -0
  217. package/dist/host/xr.d.ts +24 -0
  218. package/dist/host/xr.js +59 -0
  219. package/dist/i18n/i18n.d.ts +59 -0
  220. package/dist/i18n/i18n.js +241 -0
  221. package/dist/i18n/index.d.ts +3 -0
  222. package/dist/i18n/index.js +3 -0
  223. package/dist/i18n/message.d.ts +72 -0
  224. package/dist/i18n/message.js +369 -0
  225. package/dist/i18n/negotiate.d.ts +17 -0
  226. package/dist/i18n/negotiate.js +58 -0
  227. package/dist/index.d.ts +7 -0
  228. package/dist/index.js +1 -0
  229. package/dist/input/bindings.d.ts +31 -0
  230. package/dist/input/bindings.js +141 -0
  231. package/dist/input/clock.d.ts +44 -0
  232. package/dist/input/clock.js +49 -0
  233. package/dist/input/follow.d.ts +133 -0
  234. package/dist/input/follow.js +218 -0
  235. package/dist/input/gestures.d.ts +281 -0
  236. package/dist/input/gestures.js +662 -0
  237. package/dist/input/glyphs.d.ts +35 -0
  238. package/dist/input/glyphs.js +216 -0
  239. package/dist/input/gyro.d.ts +85 -0
  240. package/dist/input/gyro.js +140 -0
  241. package/dist/input/index.d.ts +19 -0
  242. package/dist/input/index.js +16 -0
  243. package/dist/input/input.d.ts +543 -0
  244. package/dist/input/input.js +1492 -0
  245. package/dist/input/look.d.ts +327 -0
  246. package/dist/input/look.js +681 -0
  247. package/dist/input/magnify.d.ts +177 -0
  248. package/dist/input/magnify.js +131 -0
  249. package/dist/input/pointer-dispatch.d.ts +138 -0
  250. package/dist/input/pointer-dispatch.js +180 -0
  251. package/dist/input/pointer-router.d.ts +204 -0
  252. package/dist/input/pointer-router.js +533 -0
  253. package/dist/input/pointer-sources.d.ts +164 -0
  254. package/dist/input/pointer-sources.js +306 -0
  255. package/dist/input/rays.d.ts +138 -0
  256. package/dist/input/rays.js +615 -0
  257. package/dist/input/record.d.ts +209 -0
  258. package/dist/input/record.js +601 -0
  259. package/dist/input/touch-zones.d.ts +147 -0
  260. package/dist/input/touch-zones.js +300 -0
  261. package/dist/input/types.d.ts +158 -0
  262. package/dist/input/types.js +1 -0
  263. package/dist/input/xr-source.d.ts +53 -0
  264. package/dist/input/xr-source.js +164 -0
  265. package/dist/nav/astar.d.ts +45 -0
  266. package/dist/nav/astar.js +182 -0
  267. package/dist/nav/corridor.d.ts +40 -0
  268. package/dist/nav/corridor.js +95 -0
  269. package/dist/nav/crowd.d.ts +94 -0
  270. package/dist/nav/crowd.js +624 -0
  271. package/dist/nav/flow.d.ts +61 -0
  272. package/dist/nav/flow.js +193 -0
  273. package/dist/nav/grid.d.ts +108 -0
  274. package/dist/nav/grid.js +210 -0
  275. package/dist/nav/heap.d.ts +22 -0
  276. package/dist/nav/heap.js +92 -0
  277. package/dist/nav/index.d.ts +37 -0
  278. package/dist/nav/index.js +19 -0
  279. package/dist/nav/mesh/areas.d.ts +44 -0
  280. package/dist/nav/mesh/areas.js +98 -0
  281. package/dist/nav/mesh/bake-options.d.ts +33 -0
  282. package/dist/nav/mesh/bake-options.js +76 -0
  283. package/dist/nav/mesh/contour.d.ts +22 -0
  284. package/dist/nav/mesh/contour.js +323 -0
  285. package/dist/nav/mesh/flow3.d.ts +35 -0
  286. package/dist/nav/mesh/flow3.js +229 -0
  287. package/dist/nav/mesh/links.d.ts +38 -0
  288. package/dist/nav/mesh/links.js +72 -0
  289. package/dist/nav/mesh/mesh-path.d.ts +152 -0
  290. package/dist/nav/mesh/mesh-path.js +643 -0
  291. package/dist/nav/mesh/mesh-reach.d.ts +78 -0
  292. package/dist/nav/mesh/mesh-reach.js +450 -0
  293. package/dist/nav/mesh/navmesh.d.ts +117 -0
  294. package/dist/nav/mesh/navmesh.js +647 -0
  295. package/dist/nav/mesh/polymesh.d.ts +24 -0
  296. package/dist/nav/mesh/polymesh.js +384 -0
  297. package/dist/nav/mesh/regions.d.ts +12 -0
  298. package/dist/nav/mesh/regions.js +367 -0
  299. package/dist/nav/mesh/serialize.d.ts +13 -0
  300. package/dist/nav/mesh/serialize.js +197 -0
  301. package/dist/nav/mesh/voxelize.d.ts +111 -0
  302. package/dist/nav/mesh/voxelize.js +552 -0
  303. package/dist/nav/obstacles.d.ts +75 -0
  304. package/dist/nav/obstacles.js +294 -0
  305. package/dist/nav/path.d.ts +59 -0
  306. package/dist/nav/path.js +177 -0
  307. package/dist/nav/query-queue.d.ts +46 -0
  308. package/dist/nav/query-queue.js +308 -0
  309. package/dist/nav/reach.d.ts +53 -0
  310. package/dist/nav/reach.js +148 -0
  311. package/dist/nav/steer.d.ts +36 -0
  312. package/dist/nav/steer.js +78 -0
  313. package/dist/platform/boot.d.ts +28 -0
  314. package/dist/platform/boot.js +43 -0
  315. package/dist/platform/device-mode.d.ts +40 -0
  316. package/dist/platform/device-mode.js +104 -0
  317. package/dist/platform/device.d.ts +31 -0
  318. package/dist/platform/device.js +91 -0
  319. package/dist/platform/environment.d.ts +42 -0
  320. package/dist/platform/environment.js +82 -0
  321. package/dist/platform/gpu.d.ts +40 -0
  322. package/dist/platform/gpu.js +57 -0
  323. package/dist/platform/index.d.ts +18 -0
  324. package/dist/platform/index.js +10 -0
  325. package/dist/platform/letterbox.d.ts +43 -0
  326. package/dist/platform/letterbox.js +57 -0
  327. package/dist/platform/links.d.ts +20 -0
  328. package/dist/platform/links.js +43 -0
  329. package/dist/platform/screens.d.ts +36 -0
  330. package/dist/platform/screens.js +138 -0
  331. package/dist/platform/surface.d.ts +72 -0
  332. package/dist/platform/surface.js +157 -0
  333. package/dist/platform/xr-fake.d.ts +168 -0
  334. package/dist/platform/xr-fake.js +434 -0
  335. package/dist/platform/xr-surface.d.ts +120 -0
  336. package/dist/platform/xr-surface.js +214 -0
  337. package/dist/platform/xr-types.d.ts +262 -0
  338. package/dist/post/ao.d.ts +12 -0
  339. package/dist/post/ao.js +136 -0
  340. package/dist/post/blend.d.ts +27 -0
  341. package/dist/post/blend.js +129 -0
  342. package/dist/post/depth-pass.d.ts +43 -0
  343. package/dist/post/depth-pass.js +118 -0
  344. package/dist/post/dof.d.ts +1 -0
  345. package/dist/post/dof.js +66 -0
  346. package/dist/post/exposure.d.ts +80 -0
  347. package/dist/post/exposure.js +322 -0
  348. package/dist/post/index.d.ts +12 -0
  349. package/dist/post/index.js +11 -0
  350. package/dist/post/lens-dirt.d.ts +13 -0
  351. package/dist/post/lens-dirt.js +91 -0
  352. package/dist/post/lut.d.ts +19 -0
  353. package/dist/post/lut.js +50 -0
  354. package/dist/post/motion-blur.d.ts +9 -0
  355. package/dist/post/motion-blur.js +78 -0
  356. package/dist/post/post-stack.d.ts +302 -0
  357. package/dist/post/post-stack.js +1137 -0
  358. package/dist/post/settings.d.ts +485 -0
  359. package/dist/post/settings.js +416 -0
  360. package/dist/post/shaders.d.ts +25 -0
  361. package/dist/post/shaders.js +410 -0
  362. package/dist/post/ssr.d.ts +16 -0
  363. package/dist/post/ssr.js +155 -0
  364. package/dist/post/taa.d.ts +74 -0
  365. package/dist/post/taa.js +235 -0
  366. package/dist/post/white-balance.d.ts +25 -0
  367. package/dist/post/white-balance.js +98 -0
  368. package/dist/render/bindings.d.ts +98 -0
  369. package/dist/render/bindings.js +281 -0
  370. package/dist/render/blend.d.ts +13 -0
  371. package/dist/render/blend.js +26 -0
  372. package/dist/render/camera-2d.d.ts +72 -0
  373. package/dist/render/camera-2d.js +92 -0
  374. package/dist/render/camera.d.ts +302 -0
  375. package/dist/render/camera.js +671 -0
  376. package/dist/render/color.d.ts +16 -0
  377. package/dist/render/color.js +41 -0
  378. package/dist/render/compressed.d.ts +104 -0
  379. package/dist/render/compressed.js +248 -0
  380. package/dist/render/diagnostics.d.ts +15 -0
  381. package/dist/render/diagnostics.js +43 -0
  382. package/dist/render/dynamic-resolution.d.ts +70 -0
  383. package/dist/render/dynamic-resolution.js +126 -0
  384. package/dist/render/fake-gpu.d.ts +204 -0
  385. package/dist/render/fake-gpu.js +426 -0
  386. package/dist/render/flipbook.d.ts +56 -0
  387. package/dist/render/flipbook.js +87 -0
  388. package/dist/render/frame.d.ts +278 -0
  389. package/dist/render/frame.js +174 -0
  390. package/dist/render/fullscreen.d.ts +54 -0
  391. package/dist/render/fullscreen.js +91 -0
  392. package/dist/render/gpu-timer.d.ts +73 -0
  393. package/dist/render/gpu-timer.js +186 -0
  394. package/dist/render/index.d.ts +53 -0
  395. package/dist/render/index.js +29 -0
  396. package/dist/render/instance-list.d.ts +185 -0
  397. package/dist/render/instance-list.js +547 -0
  398. package/dist/render/lights.d.ts +181 -0
  399. package/dist/render/lights.js +233 -0
  400. package/dist/render/lod.d.ts +54 -0
  401. package/dist/render/lod.js +52 -0
  402. package/dist/render/material.d.ts +165 -0
  403. package/dist/render/material.js +292 -0
  404. package/dist/render/mesh.d.ts +284 -0
  405. package/dist/render/mesh.js +472 -0
  406. package/dist/render/mipmap.d.ts +16 -0
  407. package/dist/render/mipmap.js +121 -0
  408. package/dist/render/parallax.d.ts +50 -0
  409. package/dist/render/parallax.js +47 -0
  410. package/dist/render/pbr-wgsl.d.ts +31 -0
  411. package/dist/render/pbr-wgsl.js +119 -0
  412. package/dist/render/ping-pong.d.ts +42 -0
  413. package/dist/render/ping-pong.js +74 -0
  414. package/dist/render/renderer.d.ts +741 -0
  415. package/dist/render/renderer.js +2486 -0
  416. package/dist/render/scene-pipelines.d.ts +44 -0
  417. package/dist/render/scene-pipelines.js +92 -0
  418. package/dist/render/scene-target.d.ts +170 -0
  419. package/dist/render/scene-target.js +450 -0
  420. package/dist/render/shadow.d.ts +74 -0
  421. package/dist/render/shadow.js +208 -0
  422. package/dist/render/skin.d.ts +112 -0
  423. package/dist/render/skin.js +240 -0
  424. package/dist/render/snapshot.d.ts +36 -0
  425. package/dist/render/snapshot.js +34 -0
  426. package/dist/render/standard.d.ts +162 -0
  427. package/dist/render/standard.js +263 -0
  428. package/dist/render/texture.d.ts +142 -0
  429. package/dist/render/texture.js +228 -0
  430. package/dist/render/tile-layer.d.ts +110 -0
  431. package/dist/render/tile-layer.js +304 -0
  432. package/dist/render/transform.d.ts +115 -0
  433. package/dist/render/transform.js +318 -0
  434. package/dist/render/wgsl.d.ts +131 -0
  435. package/dist/render/wgsl.js +528 -0
  436. package/dist/save/codec.d.ts +49 -0
  437. package/dist/save/codec.js +169 -0
  438. package/dist/save/index.d.ts +8 -0
  439. package/dist/save/index.js +8 -0
  440. package/dist/save/journal.d.ts +24 -0
  441. package/dist/save/journal.js +102 -0
  442. package/dist/save/migrate.d.ts +15 -0
  443. package/dist/save/migrate.js +37 -0
  444. package/dist/save/schema.d.ts +72 -0
  445. package/dist/save/schema.js +154 -0
  446. package/dist/save/settings.d.ts +28 -0
  447. package/dist/save/settings.js +59 -0
  448. package/dist/save/slots.d.ts +56 -0
  449. package/dist/save/slots.js +200 -0
  450. package/dist/save/storage.d.ts +35 -0
  451. package/dist/save/storage.js +62 -0
  452. package/dist/save/store.d.ts +114 -0
  453. package/dist/save/store.js +269 -0
  454. package/dist/testing/fake-host.d.ts +103 -0
  455. package/dist/testing/fake-host.js +163 -0
  456. package/dist/testing/fixed-clock.d.ts +25 -0
  457. package/dist/testing/fixed-clock.js +30 -0
  458. package/dist/testing/index.d.ts +4 -0
  459. package/dist/testing/index.js +5 -0
  460. package/dist/testing/test-game.d.ts +76 -0
  461. package/dist/testing/test-game.js +92 -0
  462. package/dist/tween/ease.d.ts +77 -0
  463. package/dist/tween/ease.js +192 -0
  464. package/dist/tween/index.d.ts +8 -0
  465. package/dist/tween/index.js +7 -0
  466. package/dist/tween/timeline.d.ts +78 -0
  467. package/dist/tween/timeline.js +269 -0
  468. package/dist/tween/tween.d.ts +168 -0
  469. package/dist/tween/tween.js +320 -0
  470. package/dist/ui/anchor.d.ts +206 -0
  471. package/dist/ui/anchor.js +307 -0
  472. package/dist/ui/caption.d.ts +122 -0
  473. package/dist/ui/caption.js +286 -0
  474. package/dist/ui/cursor.d.ts +105 -0
  475. package/dist/ui/cursor.js +261 -0
  476. package/dist/ui/dom.d.ts +30 -0
  477. package/dist/ui/dom.js +92 -0
  478. package/dist/ui/floats.d.ts +86 -0
  479. package/dist/ui/floats.js +260 -0
  480. package/dist/ui/hud.d.ts +198 -0
  481. package/dist/ui/hud.js +431 -0
  482. package/dist/ui/index.d.ts +37 -0
  483. package/dist/ui/index.js +34 -0
  484. package/dist/ui/inventory-card.d.ts +52 -0
  485. package/dist/ui/inventory-card.js +173 -0
  486. package/dist/ui/inventory-context.d.ts +29 -0
  487. package/dist/ui/inventory-context.js +125 -0
  488. package/dist/ui/inventory-drag.d.ts +63 -0
  489. package/dist/ui/inventory-drag.js +394 -0
  490. package/dist/ui/inventory-grid.d.ts +66 -0
  491. package/dist/ui/inventory-grid.js +625 -0
  492. package/dist/ui/inventory-radial.d.ts +39 -0
  493. package/dist/ui/inventory-radial.js +168 -0
  494. package/dist/ui/inventory.d.ts +128 -0
  495. package/dist/ui/inventory.js +154 -0
  496. package/dist/ui/layout.d.ts +356 -0
  497. package/dist/ui/layout.js +856 -0
  498. package/dist/ui/link.d.ts +64 -0
  499. package/dist/ui/link.js +155 -0
  500. package/dist/ui/loading.d.ts +40 -0
  501. package/dist/ui/loading.js +157 -0
  502. package/dist/ui/loupe.d.ts +74 -0
  503. package/dist/ui/loupe.js +164 -0
  504. package/dist/ui/menu-nav.d.ts +33 -0
  505. package/dist/ui/menu-nav.js +28 -0
  506. package/dist/ui/minimap-canvas.d.ts +145 -0
  507. package/dist/ui/minimap-canvas.js +460 -0
  508. package/dist/ui/notify.d.ts +40 -0
  509. package/dist/ui/notify.js +141 -0
  510. package/dist/ui/orb.d.ts +53 -0
  511. package/dist/ui/orb.js +304 -0
  512. package/dist/ui/overlay.d.ts +213 -0
  513. package/dist/ui/overlay.js +394 -0
  514. package/dist/ui/padnav.d.ts +53 -0
  515. package/dist/ui/padnav.js +146 -0
  516. package/dist/ui/perf.d.ts +130 -0
  517. package/dist/ui/perf.js +329 -0
  518. package/dist/ui/rotate-card.d.ts +54 -0
  519. package/dist/ui/rotate-card.js +97 -0
  520. package/dist/ui/stack.d.ts +128 -0
  521. package/dist/ui/stack.js +312 -0
  522. package/dist/ui/styles.d.ts +13 -0
  523. package/dist/ui/styles.js +200 -0
  524. package/dist/ui/text-scale.d.ts +67 -0
  525. package/dist/ui/text-scale.js +102 -0
  526. package/dist/ui/theme.d.ts +70 -0
  527. package/dist/ui/theme.js +98 -0
  528. package/dist/ui/toast.d.ts +23 -0
  529. package/dist/ui/toast.js +46 -0
  530. package/dist/ui/tooltip.d.ts +89 -0
  531. package/dist/ui/tooltip.js +333 -0
  532. package/dist/ui/widgets-2.d.ts +134 -0
  533. package/dist/ui/widgets-2.js +399 -0
  534. package/dist/ui/widgets-3.d.ts +91 -0
  535. package/dist/ui/widgets-3.js +212 -0
  536. package/dist/ui/widgets.d.ts +34 -0
  537. package/dist/ui/widgets.js +50 -0
  538. package/dist/ui/world-panel/index.d.ts +5 -0
  539. package/dist/ui/world-panel/index.js +5 -0
  540. package/dist/ui/world-panel/layout.d.ts +38 -0
  541. package/dist/ui/world-panel/layout.js +68 -0
  542. package/dist/ui/world-panel/paint.d.ts +96 -0
  543. package/dist/ui/world-panel/paint.js +136 -0
  544. package/dist/ui/world-panel/panel.d.ts +235 -0
  545. package/dist/ui/world-panel/panel.js +762 -0
  546. package/dist/ui/world-panel/wgsl.d.ts +10 -0
  547. package/dist/ui/world-panel/wgsl.js +52 -0
  548. package/dist/ui/world-panel/widgets.d.ts +207 -0
  549. package/dist/ui/world-panel/widgets.js +569 -0
  550. package/dist/voxel/chunks.d.ts +77 -0
  551. package/dist/voxel/chunks.js +149 -0
  552. package/dist/voxel/grid.d.ts +84 -0
  553. package/dist/voxel/grid.js +223 -0
  554. package/dist/voxel/index.d.ts +22 -0
  555. package/dist/voxel/index.js +7 -0
  556. package/dist/voxel/mesher-worker.d.ts +14 -0
  557. package/dist/voxel/mesher-worker.js +47 -0
  558. package/dist/voxel/mesher.d.ts +73 -0
  559. package/dist/voxel/mesher.js +306 -0
  560. package/dist/voxel/ray.d.ts +32 -0
  561. package/dist/voxel/ray.js +73 -0
  562. package/dist/voxel/wgsl.d.ts +16 -0
  563. package/dist/voxel/wgsl.js +28 -0
  564. package/dist/voxel/worker-client.d.ts +79 -0
  565. package/dist/voxel/worker-client.js +122 -0
  566. package/package.json +177 -3
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `createTestGame` (ws/core-8): `createGame` itself, headless, on the fake GPU, the fake host
3
+ * and the fixed clock. `step(n)` runs the game's own loop for `n` frames of one fixed step
4
+ * each, so a test presses an action, steps and asserts state with the engine's real frame
5
+ * order. Needs a DOM for the overlay (`// @vitest-environment happy-dom`), unless
6
+ * `overlay: false`, which is `createGame`'s no-DOM mode (ws/core-9) and runs in plain Node.
7
+ */
8
+ import { DetachedSurface } from '../core/detached-surface.js';
9
+ import { createGame } from '../core/game.js';
10
+ import { createFakeDevice, fakeRendererGpu, installGpuGlobals, } from '../render/fake-gpu.js';
11
+ import { createFakeHost } from './fake-host.js';
12
+ import { createFixedClock } from './fixed-clock.js';
13
+ /**
14
+ * `createGame` with the testing kit's fakes: a `FakeDevice` as the GPU, a `FakeHost` as the
15
+ * host (save storage in memory) and a `FixedClock` as `ctx.clock`, on the step of `opts.sim`
16
+ * (default 1/60 s). The loop is not started; `step(n)` drives it.
17
+ */
18
+ export async function createTestGame(opts) {
19
+ const design = { width: opts.design?.width ?? 1920, height: opts.design?.height ?? 1080 };
20
+ const view = opts.viewport ?? design;
21
+ const headless = opts.overlay === false;
22
+ const doc = globalThis.document;
23
+ if (!headless && !doc) {
24
+ throw new Error('createTestGame needs a DOM: add `// @vitest-environment happy-dom`, or pass `overlay: false`');
25
+ }
26
+ installGpuGlobals();
27
+ const device = opts.device ?? createFakeDevice();
28
+ const host = opts.host ?? createFakeHost();
29
+ const step = opts.sim ? (opts.sim.step ?? 1 / 60) : 1 / 60;
30
+ // `step × 1000` is what the loop advances the clock by, so each fixed update is one tick.
31
+ const clock = createFixedClock(step * 1000);
32
+ const gpu = {
33
+ ...fakeRendererGpu(device),
34
+ adapter: {},
35
+ timestamps: false,
36
+ };
37
+ let root;
38
+ if (!headless) {
39
+ root = opts.root ?? doc.body.appendChild(doc.createElement('div'));
40
+ sizeElement(root, () => ({ left: 0, top: 0, width: view.width, height: view.height }));
41
+ }
42
+ const ctx = await createGame({ ...opts, root, gpu, host, clock });
43
+ if (!ctx)
44
+ throw new Error('createTestGame: createGame returned null');
45
+ const surface = ctx.surface;
46
+ if (surface instanceof DetachedSurface) {
47
+ // The virtual container is the viewport, so pointers letterbox as on a page of that size.
48
+ surface.resizeContainer(view.width, view.height);
49
+ }
50
+ else {
51
+ // The canvas reports the box the surface gave it, so a touch zone measures as on a page.
52
+ sizeElement(surface.canvas, () => {
53
+ const r = surface.rect;
54
+ return { left: r.x, top: r.y, width: r.width, height: r.height };
55
+ });
56
+ }
57
+ return {
58
+ ctx,
59
+ input: ctx.input,
60
+ host,
61
+ clock,
62
+ device,
63
+ step(n = 1) {
64
+ for (let i = 0; i < n; i++)
65
+ ctx.loop.tickOnce(step);
66
+ },
67
+ loseDevice(reason, message) {
68
+ device.loseDevice(reason, message);
69
+ // The engine's `lost` handler was attached at boot, so it has run once this one resolves.
70
+ return device.lost.then(() => undefined);
71
+ },
72
+ };
73
+ }
74
+ /** Make `el` report `box()` as its layout box (happy-dom computes none). */
75
+ function sizeElement(el, box) {
76
+ Object.defineProperty(el, 'clientWidth', { configurable: true, get: () => box().width });
77
+ Object.defineProperty(el, 'clientHeight', { configurable: true, get: () => box().height });
78
+ el.getBoundingClientRect = () => {
79
+ const b = box();
80
+ return {
81
+ x: b.left,
82
+ y: b.top,
83
+ left: b.left,
84
+ top: b.top,
85
+ width: b.width,
86
+ height: b.height,
87
+ right: b.left + b.width,
88
+ bottom: b.top + b.height,
89
+ toJSON: () => b,
90
+ };
91
+ };
92
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Easing functions: map linear progress `t` on 0..1 to eased progress. Every entry of `ease`
3
+ * is 0 at 0 and 1 at 1; `back`, `elastic` and `cubicBezier` may leave 0..1 in between.
4
+ *
5
+ * `ease.spring(stiffness, damping)` is not a function of `t`: a spring has no duration, so it
6
+ * describes a `SpringEase` the tween engine simulates until it settles (see `tween.ts`).
7
+ */
8
+ /** Maps linear progress 0..1 to eased progress. */
9
+ export type Ease = (t: number) => number;
10
+ /**
11
+ * A duration-free spring toward the target (unit mass): `a = stiffness · (1 − x) − damping · v`.
12
+ * A tween given one ignores its `seconds`, `loops` and `yoyo` and ends when it has settled.
13
+ */
14
+ export interface SpringEase {
15
+ readonly kind: 'spring';
16
+ readonly stiffness: number;
17
+ readonly damping: number;
18
+ }
19
+ export declare function isSpring(e: Ease | SpringEase | undefined): e is SpringEase;
20
+ /** `n` equal steps: 0 until the first step, 1 at `t = 1`. */
21
+ declare function steps(n: number): Ease;
22
+ /**
23
+ * The CSS `cubic-bezier(x1, y1, x2, y2)` timing function: the curve from (0,0) through the two
24
+ * control points to (1,1); `x` is solved for `t` by Newton iteration with a bisection fallback.
25
+ */
26
+ declare function cubicBezier(x1: number, y1: number, x2: number, y2: number): Ease;
27
+ /**
28
+ * A duration-free spring (unit mass). Critical damping is `2 · √stiffness`; less overshoots.
29
+ * Default `170, 22`, which settles in about half a second with a slight overshoot.
30
+ */
31
+ declare function spring(stiffness?: number, damping?: number): SpringEase;
32
+ /** The easing table. */
33
+ export declare const ease: {
34
+ readonly linear: Ease;
35
+ readonly smoothstep: Ease;
36
+ readonly quadIn: Ease;
37
+ readonly quadOut: Ease;
38
+ readonly quadInOut: Ease;
39
+ readonly cubicIn: Ease;
40
+ readonly cubicOut: Ease;
41
+ readonly cubicInOut: Ease;
42
+ readonly quartIn: Ease;
43
+ readonly quartOut: Ease;
44
+ readonly quartInOut: Ease;
45
+ readonly quintIn: Ease;
46
+ readonly quintOut: Ease;
47
+ readonly quintInOut: Ease;
48
+ readonly sineIn: Ease;
49
+ readonly sineOut: Ease;
50
+ readonly sineInOut: Ease;
51
+ readonly expoIn: Ease;
52
+ readonly expoOut: Ease;
53
+ readonly expoInOut: Ease;
54
+ readonly circIn: Ease;
55
+ readonly circOut: Ease;
56
+ readonly circInOut: Ease;
57
+ readonly backIn: Ease;
58
+ readonly backOut: Ease;
59
+ readonly backInOut: Ease;
60
+ readonly elasticIn: Ease;
61
+ readonly elasticOut: Ease;
62
+ readonly elasticInOut: Ease;
63
+ readonly bounceIn: Ease;
64
+ readonly bounceOut: Ease;
65
+ readonly bounceInOut: Ease;
66
+ readonly steps: typeof steps;
67
+ readonly cubicBezier: typeof cubicBezier;
68
+ readonly spring: typeof spring;
69
+ };
70
+ /**
71
+ * Advance a spring state by `dt` seconds: `s[0]` is the position (0 at the start, 1 at the
72
+ * target), `s[1]` the velocity. Semi-implicit Euler in substeps of at most `SPRING_STEP` so a
73
+ * stiff spring stays stable on a slow frame. Returns true once the spring has settled, with
74
+ * the position snapped to 1 and the velocity to 0.
75
+ */
76
+ export declare function stepSpring(s: Float64Array, e: SpringEase, dt: number): boolean;
77
+ export {};
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Easing functions: map linear progress `t` on 0..1 to eased progress. Every entry of `ease`
3
+ * is 0 at 0 and 1 at 1; `back`, `elastic` and `cubicBezier` may leave 0..1 in between.
4
+ *
5
+ * `ease.spring(stiffness, damping)` is not a function of `t`: a spring has no duration, so it
6
+ * describes a `SpringEase` the tween engine simulates until it settles (see `tween.ts`).
7
+ */
8
+ export function isSpring(e) {
9
+ return typeof e === 'object' && e !== null && e.kind === 'spring';
10
+ }
11
+ const PI = Math.PI;
12
+ const HALF_PI = PI / 2;
13
+ const C1 = 1.70158;
14
+ const C2 = C1 * 1.525;
15
+ const C3 = C1 + 1;
16
+ const C4 = (2 * PI) / 3;
17
+ const C5 = (2 * PI) / 4.5;
18
+ const N1 = 7.5625;
19
+ const D1 = 2.75;
20
+ const linear = (t) => t;
21
+ /** `t² (3 − 2t)`: the smoothstep polynomial, the default of `PostStack.blendTo`. */
22
+ const smoothstep = (t) => t * t * (3 - 2 * t);
23
+ const quadIn = (t) => t * t;
24
+ const quadOut = (t) => 1 - (1 - t) * (1 - t);
25
+ const quadInOut = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);
26
+ const cubicIn = (t) => t * t * t;
27
+ const cubicOut = (t) => 1 - (1 - t) ** 3;
28
+ const cubicInOut = (t) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2);
29
+ const quartIn = (t) => t * t * t * t;
30
+ const quartOut = (t) => 1 - (1 - t) ** 4;
31
+ const quartInOut = (t) => (t < 0.5 ? 8 * t * t * t * t : 1 - (-2 * t + 2) ** 4 / 2);
32
+ const quintIn = (t) => t * t * t * t * t;
33
+ const quintOut = (t) => 1 - (1 - t) ** 5;
34
+ const quintInOut = (t) => (t < 0.5 ? 16 * t ** 5 : 1 - (-2 * t + 2) ** 5 / 2);
35
+ const sineIn = (t) => 1 - Math.cos(t * HALF_PI);
36
+ const sineOut = (t) => Math.sin(t * HALF_PI);
37
+ const sineInOut = (t) => -(Math.cos(PI * t) - 1) / 2;
38
+ const expoIn = (t) => (t <= 0 ? 0 : 2 ** (10 * t - 10));
39
+ const expoOut = (t) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t));
40
+ const expoInOut = (t) => t <= 0 ? 0 : t >= 1 ? 1 : t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2;
41
+ const circIn = (t) => 1 - Math.sqrt(1 - t * t);
42
+ const circOut = (t) => Math.sqrt(1 - (t - 1) * (t - 1));
43
+ const circInOut = (t) => t < 0.5 ? (1 - Math.sqrt(1 - (2 * t) ** 2)) / 2 : (Math.sqrt(1 - (-2 * t + 2) ** 2) + 1) / 2;
44
+ const backIn = (t) => C3 * t * t * t - C1 * t * t;
45
+ const backOut = (t) => 1 + C3 * (t - 1) ** 3 + C1 * (t - 1) ** 2;
46
+ const backInOut = (t) => t < 0.5
47
+ ? ((2 * t) ** 2 * ((C2 + 1) * 2 * t - C2)) / 2
48
+ : ((2 * t - 2) ** 2 * ((C2 + 1) * (t * 2 - 2) + C2) + 2) / 2;
49
+ const elasticIn = (t) => t <= 0 ? 0 : t >= 1 ? 1 : -(2 ** (10 * t - 10)) * Math.sin((t * 10 - 10.75) * C4);
50
+ const elasticOut = (t) => t <= 0 ? 0 : t >= 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * C4) + 1;
51
+ const elasticInOut = (t) => t <= 0
52
+ ? 0
53
+ : t >= 1
54
+ ? 1
55
+ : t < 0.5
56
+ ? -(2 ** (20 * t - 10) * Math.sin((20 * t - 11.125) * C5)) / 2
57
+ : (2 ** (-20 * t + 10) * Math.sin((20 * t - 11.125) * C5)) / 2 + 1;
58
+ const bounceOut = (t) => {
59
+ if (t < 1 / D1)
60
+ return N1 * t * t;
61
+ if (t < 2 / D1) {
62
+ const u = t - 1.5 / D1;
63
+ return N1 * u * u + 0.75;
64
+ }
65
+ if (t < 2.5 / D1) {
66
+ const u = t - 2.25 / D1;
67
+ return N1 * u * u + 0.9375;
68
+ }
69
+ const u = t - 2.625 / D1;
70
+ return N1 * u * u + 0.984375;
71
+ };
72
+ const bounceIn = (t) => 1 - bounceOut(1 - t);
73
+ const bounceInOut = (t) => t < 0.5 ? (1 - bounceOut(1 - 2 * t)) / 2 : (1 + bounceOut(2 * t - 1)) / 2;
74
+ /** `n` equal steps: 0 until the first step, 1 at `t = 1`. */
75
+ function steps(n) {
76
+ const k = Math.max(1, Math.floor(n));
77
+ return (t) => (t >= 1 ? 1 : Math.floor(t * k) / k);
78
+ }
79
+ /**
80
+ * The CSS `cubic-bezier(x1, y1, x2, y2)` timing function: the curve from (0,0) through the two
81
+ * control points to (1,1); `x` is solved for `t` by Newton iteration with a bisection fallback.
82
+ */
83
+ function cubicBezier(x1, y1, x2, y2) {
84
+ const ax = 1 - 3 * x2 + 3 * x1;
85
+ const bx = 3 * x2 - 6 * x1;
86
+ const cx = 3 * x1;
87
+ const ay = 1 - 3 * y2 + 3 * y1;
88
+ const by = 3 * y2 - 6 * y1;
89
+ const cy = 3 * y1;
90
+ const sampleX = (u) => ((ax * u + bx) * u + cx) * u;
91
+ const sampleY = (u) => ((ay * u + by) * u + cy) * u;
92
+ const slopeX = (u) => (3 * ax * u + 2 * bx) * u + cx;
93
+ return (t) => {
94
+ if (t <= 0)
95
+ return 0;
96
+ if (t >= 1)
97
+ return 1;
98
+ let u = t;
99
+ for (let i = 0; i < 8; i++) {
100
+ const x = sampleX(u) - t;
101
+ if (Math.abs(x) < 1e-6)
102
+ return sampleY(u);
103
+ const d = slopeX(u);
104
+ if (Math.abs(d) < 1e-6)
105
+ break;
106
+ u -= x / d;
107
+ }
108
+ let lo = 0;
109
+ let hi = 1;
110
+ u = t;
111
+ for (let i = 0; i < 32 && hi - lo > 1e-7; i++) {
112
+ if (sampleX(u) < t)
113
+ lo = u;
114
+ else
115
+ hi = u;
116
+ u = (lo + hi) / 2;
117
+ }
118
+ return sampleY(u);
119
+ };
120
+ }
121
+ /**
122
+ * A duration-free spring (unit mass). Critical damping is `2 · √stiffness`; less overshoots.
123
+ * Default `170, 22`, which settles in about half a second with a slight overshoot.
124
+ */
125
+ function spring(stiffness = 170, damping = 22) {
126
+ return { kind: 'spring', stiffness, damping };
127
+ }
128
+ /** The easing table. */
129
+ export const ease = {
130
+ linear,
131
+ smoothstep,
132
+ quadIn,
133
+ quadOut,
134
+ quadInOut,
135
+ cubicIn,
136
+ cubicOut,
137
+ cubicInOut,
138
+ quartIn,
139
+ quartOut,
140
+ quartInOut,
141
+ quintIn,
142
+ quintOut,
143
+ quintInOut,
144
+ sineIn,
145
+ sineOut,
146
+ sineInOut,
147
+ expoIn,
148
+ expoOut,
149
+ expoInOut,
150
+ circIn,
151
+ circOut,
152
+ circInOut,
153
+ backIn,
154
+ backOut,
155
+ backInOut,
156
+ elasticIn,
157
+ elasticOut,
158
+ elasticInOut,
159
+ bounceIn,
160
+ bounceOut,
161
+ bounceInOut,
162
+ steps,
163
+ cubicBezier,
164
+ spring,
165
+ };
166
+ /**
167
+ * Advance a spring state by `dt` seconds: `s[0]` is the position (0 at the start, 1 at the
168
+ * target), `s[1]` the velocity. Semi-implicit Euler in substeps of at most `SPRING_STEP` so a
169
+ * stiff spring stays stable on a slow frame. Returns true once the spring has settled, with
170
+ * the position snapped to 1 and the velocity to 0.
171
+ */
172
+ export function stepSpring(s, e, dt) {
173
+ let x = s[0];
174
+ let v = s[1];
175
+ let left = dt;
176
+ while (left > 0) {
177
+ const h = Math.min(left, SPRING_STEP);
178
+ left -= h;
179
+ v += (e.stiffness * (1 - x) - e.damping * v) * h;
180
+ x += v * h;
181
+ }
182
+ if (Math.abs(1 - x) < SPRING_EPSILON && Math.abs(v) < SPRING_EPSILON) {
183
+ s[0] = 1;
184
+ s[1] = 0;
185
+ return true;
186
+ }
187
+ s[0] = x;
188
+ s[1] = v;
189
+ return false;
190
+ }
191
+ const SPRING_STEP = 1 / 240;
192
+ const SPRING_EPSILON = 1e-3;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `@thunderclap-engine/engine/tween`: numbers over time. An easing table, property and value tweens,
3
+ * sequences and parallel groups, loops, yoyo, delays and springs, ticked by `Tweens.update(dt)`
4
+ * with no allocation after setup. See README.md.
5
+ */
6
+ export { type Ease, ease, type SpringEase } from './ease.js';
7
+ export { createTweens, Tweens } from './timeline.js';
8
+ export type { Tween, TweenOptions, TweenProps } from './tween.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@thunderclap-engine/engine/tween`: numbers over time. An easing table, property and value tweens,
3
+ * sequences and parallel groups, loops, yoyo, delays and springs, ticked by `Tweens.update(dt)`
4
+ * with no allocation after setup. See README.md.
5
+ */
6
+ export { ease } from './ease.js';
7
+ export { createTweens, Tweens } from './timeline.js';
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Groups and the manager. `SequenceTween` runs its children one after another, carrying the
3
+ * leftover of a child's last step into the next; `ParallelTween` advances all of them and ends
4
+ * with the last. Both are tweens themselves (delay, loops, yoyo, callbacks), so they nest.
5
+ *
6
+ * `Tweens` holds the root tweens and ticks them with `update(dt)`. A tween that completes or is
7
+ * killed, even inside the update that is running, is compacted out at the end of that update;
8
+ * tweens created during an update start on the next one.
9
+ */
10
+ import { type Tween, TweenBase, type TweenOptions, type TweenOwner, type TweenProps } from './tween.js';
11
+ /** Base of the two groups: takes the children out of the manager and drives them itself. */
12
+ declare abstract class GroupTween extends TweenBase {
13
+ protected readonly children: TweenBase[];
14
+ constructor(children: Tween[], opts: TweenOptions);
15
+ /** @internal Kill the children whose target is `target`. */
16
+ killTarget(target: object): void;
17
+ /** The length of one iteration, from the children's totals. */
18
+ protected abstract childDuration(): number;
19
+ /** Seconds of this iteration consumed, from the children. */
20
+ protected abstract childConsumed(): number;
21
+ protected resetChildren(): void;
22
+ protected onIteration(): void;
23
+ protected capture(): void;
24
+ protected applyAt(): void;
25
+ /** Bookkeeping after the children moved: progress, callbacks, loops, completion. */
26
+ protected settle(leftover: number, allDone: boolean): number;
27
+ }
28
+ /** @internal */
29
+ export declare function killTargetIn(t: TweenBase, target: object): void;
30
+ export declare class SequenceTween extends GroupTween {
31
+ protected childDuration(): number;
32
+ protected childConsumed(): number;
33
+ protected run(local: number): number;
34
+ }
35
+ export declare class ParallelTween extends GroupTween {
36
+ protected childDuration(): number;
37
+ protected childConsumed(): number;
38
+ protected run(local: number): number;
39
+ }
40
+ /** Creates and ticks tweens. One per game is plenty; call `update(dt)` from your frame hook. */
41
+ export declare class Tweens implements TweenOwner {
42
+ private readonly list;
43
+ private updating;
44
+ /** Tweens that have neither completed nor been killed (a group counts once). */
45
+ get active(): number;
46
+ /** Advance every root tween by `dt` seconds. Negative or NaN counts as 0. */
47
+ update(dt: number): void;
48
+ /**
49
+ * Animate number fields of `target` to the values in `props` (`'x'`, `'position.0'`,
50
+ * `'style.opacity'`; typed-array indices work) over `seconds`. Start values are read when
51
+ * the tween starts (after its delay).
52
+ */
53
+ to(target: object, props: TweenProps, seconds: number, opts?: TweenOptions): Tween;
54
+ /** Animate one number, calling `onUpdate(value, tween)` every step. */
55
+ value(from: number, to: number, seconds: number, onUpdate: (value: number, tween: Tween) => void, opts?: TweenOptions): Tween;
56
+ /** Nothing for `seconds`: a gap in a sequence, or a timer with `then`. */
57
+ delay(seconds: number, opts?: TweenOptions): Tween;
58
+ /**
59
+ * Run tweens one after another, carrying leftover time from one into the next. A
60
+ * `TweenOptions` object as the last argument applies to the whole (delay, loops, yoyo, …).
61
+ */
62
+ sequence(...tweens: (Tween | TweenOptions)[]): Tween;
63
+ /** Run tweens together; ends when the last one has. Options as for `sequence`. */
64
+ parallel(...tweens: (Tween | TweenOptions)[]): Tween;
65
+ /** Kill every property tween on `target`, inside groups too. */
66
+ kill(target: object): void;
67
+ /** Kill every tween. */
68
+ killAll(): void;
69
+ /** @internal */
70
+ readd(t: TweenBase): void;
71
+ private add;
72
+ /** A group took its children out of the root list. */
73
+ private addGroup;
74
+ private compact;
75
+ }
76
+ /** A new tween manager. */
77
+ export declare function createTweens(): Tweens;
78
+ export {};