@guinetik/gcanvas 1.0.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 (349) hide show
  1. package/.github/workflows/release.yaml +70 -0
  2. package/.jshintrc +4 -0
  3. package/.vscode/settings.json +22 -0
  4. package/CLAUDE.md +310 -0
  5. package/blackhole.jpg +0 -0
  6. package/demo.png +0 -0
  7. package/demos/CNAME +1 -0
  8. package/demos/animations.html +31 -0
  9. package/demos/basic.html +38 -0
  10. package/demos/baskara.html +31 -0
  11. package/demos/bezier.html +35 -0
  12. package/demos/beziersignature.html +29 -0
  13. package/demos/blackhole.html +28 -0
  14. package/demos/blob.html +35 -0
  15. package/demos/demos.css +289 -0
  16. package/demos/easing.html +28 -0
  17. package/demos/events.html +195 -0
  18. package/demos/fluent.html +647 -0
  19. package/demos/fractals.html +36 -0
  20. package/demos/genart.html +26 -0
  21. package/demos/gendream.html +26 -0
  22. package/demos/group.html +36 -0
  23. package/demos/home.html +587 -0
  24. package/demos/index.html +364 -0
  25. package/demos/isometric.html +34 -0
  26. package/demos/js/animations.js +452 -0
  27. package/demos/js/basic.js +204 -0
  28. package/demos/js/baskara.js +751 -0
  29. package/demos/js/bezier.js +692 -0
  30. package/demos/js/beziersignature.js +241 -0
  31. package/demos/js/blackhole/accretiondisk.obj.js +379 -0
  32. package/demos/js/blackhole/blackhole.obj.js +318 -0
  33. package/demos/js/blackhole/index.js +409 -0
  34. package/demos/js/blackhole/particle.js +56 -0
  35. package/demos/js/blackhole/starfield.obj.js +218 -0
  36. package/demos/js/blob.js +2263 -0
  37. package/demos/js/easing.js +477 -0
  38. package/demos/js/fluent.js +183 -0
  39. package/demos/js/fractals.js +931 -0
  40. package/demos/js/fractalworker.js +93 -0
  41. package/demos/js/genart.js +268 -0
  42. package/demos/js/gendream.js +209 -0
  43. package/demos/js/group.js +140 -0
  44. package/demos/js/info-toggle.js +25 -0
  45. package/demos/js/isometric.js +863 -0
  46. package/demos/js/kerr.js +1556 -0
  47. package/demos/js/lavalamp.js +590 -0
  48. package/demos/js/layout.js +354 -0
  49. package/demos/js/mondrian.js +285 -0
  50. package/demos/js/opacity.js +275 -0
  51. package/demos/js/painter.js +484 -0
  52. package/demos/js/particles-showcase.js +514 -0
  53. package/demos/js/particles.js +299 -0
  54. package/demos/js/patterns.js +397 -0
  55. package/demos/js/penrose/artifact.js +69 -0
  56. package/demos/js/penrose/blackhole.js +121 -0
  57. package/demos/js/penrose/constants.js +73 -0
  58. package/demos/js/penrose/game.js +943 -0
  59. package/demos/js/penrose/lore.js +278 -0
  60. package/demos/js/penrose/penrosescene.js +892 -0
  61. package/demos/js/penrose/ship.js +216 -0
  62. package/demos/js/penrose/sounds.js +211 -0
  63. package/demos/js/penrose/voidparticle.js +55 -0
  64. package/demos/js/penrose/voidscene.js +258 -0
  65. package/demos/js/penrose/voidship.js +144 -0
  66. package/demos/js/penrose/wormhole.js +46 -0
  67. package/demos/js/pipeline.js +555 -0
  68. package/demos/js/scene.js +304 -0
  69. package/demos/js/scenes.js +320 -0
  70. package/demos/js/schrodinger.js +410 -0
  71. package/demos/js/schwarzschild.js +1023 -0
  72. package/demos/js/shapes.js +628 -0
  73. package/demos/js/space/alien.js +171 -0
  74. package/demos/js/space/boom.js +98 -0
  75. package/demos/js/space/boss.js +353 -0
  76. package/demos/js/space/buff.js +73 -0
  77. package/demos/js/space/bullet.js +102 -0
  78. package/demos/js/space/constants.js +85 -0
  79. package/demos/js/space/game.js +1884 -0
  80. package/demos/js/space/hud.js +112 -0
  81. package/demos/js/space/laserbeam.js +179 -0
  82. package/demos/js/space/lightning.js +277 -0
  83. package/demos/js/space/minion.js +192 -0
  84. package/demos/js/space/missile.js +212 -0
  85. package/demos/js/space/player.js +430 -0
  86. package/demos/js/space/powerup.js +90 -0
  87. package/demos/js/space/starfield.js +58 -0
  88. package/demos/js/space/starpower.js +90 -0
  89. package/demos/js/spacetime.js +559 -0
  90. package/demos/js/svgtween.js +204 -0
  91. package/demos/js/tde/accretiondisk.js +418 -0
  92. package/demos/js/tde/blackhole.js +219 -0
  93. package/demos/js/tde/blackholescene.js +209 -0
  94. package/demos/js/tde/config.js +59 -0
  95. package/demos/js/tde/index.js +695 -0
  96. package/demos/js/tde/jets.js +290 -0
  97. package/demos/js/tde/lensedstarfield.js +147 -0
  98. package/demos/js/tde/tdestar.js +317 -0
  99. package/demos/js/tde/tidalstream.js +356 -0
  100. package/demos/js/tde_old/blackhole.obj.js +354 -0
  101. package/demos/js/tde_old/debris.obj.js +791 -0
  102. package/demos/js/tde_old/flare.obj.js +239 -0
  103. package/demos/js/tde_old/index.js +448 -0
  104. package/demos/js/tde_old/star.obj.js +812 -0
  105. package/demos/js/tiles.js +312 -0
  106. package/demos/js/tweendemo.js +79 -0
  107. package/demos/js/visibility.js +102 -0
  108. package/demos/kerr.html +28 -0
  109. package/demos/lavalamp.html +27 -0
  110. package/demos/layouts.html +37 -0
  111. package/demos/logo.svg +4 -0
  112. package/demos/loop.html +84 -0
  113. package/demos/mondrian.html +32 -0
  114. package/demos/og_image.png +0 -0
  115. package/demos/opacity.html +36 -0
  116. package/demos/painter.html +39 -0
  117. package/demos/particles-showcase.html +28 -0
  118. package/demos/particles.html +24 -0
  119. package/demos/patterns.html +33 -0
  120. package/demos/penrose-game.html +31 -0
  121. package/demos/pipeline.html +737 -0
  122. package/demos/scene.html +33 -0
  123. package/demos/scenes.html +96 -0
  124. package/demos/schrodinger.html +27 -0
  125. package/demos/schwarzschild.html +27 -0
  126. package/demos/shapes.html +16 -0
  127. package/demos/space.html +85 -0
  128. package/demos/spacetime.html +27 -0
  129. package/demos/svgtween.html +29 -0
  130. package/demos/tde.html +28 -0
  131. package/demos/tiles.html +28 -0
  132. package/demos/transforms.html +400 -0
  133. package/demos/tween.html +45 -0
  134. package/demos/visibility.html +33 -0
  135. package/disk_example.png +0 -0
  136. package/docs/README.md +222 -0
  137. package/docs/concepts/architecture-overview.md +204 -0
  138. package/docs/concepts/lifecycle.md +255 -0
  139. package/docs/concepts/rendering-pipeline.md +279 -0
  140. package/docs/concepts/tde-zorder.md +106 -0
  141. package/docs/concepts/two-layer-architecture.md +229 -0
  142. package/docs/getting-started/first-game.md +354 -0
  143. package/docs/getting-started/hello-world.md +269 -0
  144. package/docs/getting-started/installation.md +157 -0
  145. package/docs/modules/collision/README.md +453 -0
  146. package/docs/modules/fluent/README.md +1075 -0
  147. package/docs/modules/game/README.md +303 -0
  148. package/docs/modules/isometric-camera.md +210 -0
  149. package/docs/modules/isometric.md +275 -0
  150. package/docs/modules/painter/README.md +328 -0
  151. package/docs/modules/particle/README.md +559 -0
  152. package/docs/modules/shapes/README.md +221 -0
  153. package/docs/modules/shapes/base/euclidian.md +123 -0
  154. package/docs/modules/shapes/base/geometry2d.md +204 -0
  155. package/docs/modules/shapes/base/renderable.md +215 -0
  156. package/docs/modules/shapes/base/shape.md +262 -0
  157. package/docs/modules/shapes/base/transformable.md +243 -0
  158. package/docs/modules/shapes/hierarchy.md +218 -0
  159. package/docs/modules/state/README.md +577 -0
  160. package/docs/modules/util/README.md +99 -0
  161. package/docs/modules/util/camera3d.md +412 -0
  162. package/docs/modules/util/scene3d.md +395 -0
  163. package/index.html +17 -0
  164. package/jsdoc.json +50 -0
  165. package/package.json +55 -0
  166. package/readme.md +599 -0
  167. package/scripts/build-demo.js +69 -0
  168. package/scripts/bundle4llm.js +276 -0
  169. package/scripts/clearconsole.js +48 -0
  170. package/src/collision/collision-system.js +332 -0
  171. package/src/collision/collision.js +303 -0
  172. package/src/collision/index.js +10 -0
  173. package/src/fluent/fluent-game.js +430 -0
  174. package/src/fluent/fluent-go.js +1060 -0
  175. package/src/fluent/fluent-layer.js +152 -0
  176. package/src/fluent/fluent-scene.js +291 -0
  177. package/src/fluent/index.js +98 -0
  178. package/src/fluent/sketch.js +380 -0
  179. package/src/game/game.js +467 -0
  180. package/src/game/index.js +49 -0
  181. package/src/game/objects/go.js +220 -0
  182. package/src/game/objects/imagego.js +30 -0
  183. package/src/game/objects/index.js +54 -0
  184. package/src/game/objects/isometric-scene.js +260 -0
  185. package/src/game/objects/layoutscene.js +549 -0
  186. package/src/game/objects/scene.js +175 -0
  187. package/src/game/objects/scene3d.js +118 -0
  188. package/src/game/objects/text.js +221 -0
  189. package/src/game/objects/wrapper.js +232 -0
  190. package/src/game/pipeline.js +243 -0
  191. package/src/game/ui/button.js +396 -0
  192. package/src/game/ui/cursor.js +93 -0
  193. package/src/game/ui/fps.js +91 -0
  194. package/src/game/ui/index.js +5 -0
  195. package/src/game/ui/togglebutton.js +93 -0
  196. package/src/game/ui/tooltip.js +249 -0
  197. package/src/index.js +25 -0
  198. package/src/io/events.js +20 -0
  199. package/src/io/index.js +86 -0
  200. package/src/io/input.js +70 -0
  201. package/src/io/keys.js +152 -0
  202. package/src/io/mouse.js +61 -0
  203. package/src/io/touch.js +39 -0
  204. package/src/logger/debugtab.js +138 -0
  205. package/src/logger/index.js +3 -0
  206. package/src/logger/loggable.js +47 -0
  207. package/src/logger/logger.js +113 -0
  208. package/src/math/complex.js +37 -0
  209. package/src/math/constants.js +1 -0
  210. package/src/math/fractal.js +1271 -0
  211. package/src/math/gr.js +201 -0
  212. package/src/math/heat.js +202 -0
  213. package/src/math/index.js +12 -0
  214. package/src/math/noise.js +433 -0
  215. package/src/math/orbital.js +191 -0
  216. package/src/math/patterns.js +1339 -0
  217. package/src/math/penrose.js +259 -0
  218. package/src/math/quantum.js +115 -0
  219. package/src/math/random.js +195 -0
  220. package/src/math/tensor.js +1009 -0
  221. package/src/mixins/anchor.js +131 -0
  222. package/src/mixins/draggable.js +72 -0
  223. package/src/mixins/index.js +2 -0
  224. package/src/motion/bezier.js +132 -0
  225. package/src/motion/bounce.js +58 -0
  226. package/src/motion/easing.js +349 -0
  227. package/src/motion/float.js +130 -0
  228. package/src/motion/follow.js +125 -0
  229. package/src/motion/hop.js +52 -0
  230. package/src/motion/index.js +82 -0
  231. package/src/motion/motion.js +1124 -0
  232. package/src/motion/orbit.js +49 -0
  233. package/src/motion/oscillate.js +39 -0
  234. package/src/motion/parabolic.js +141 -0
  235. package/src/motion/patrol.js +147 -0
  236. package/src/motion/pendulum.js +48 -0
  237. package/src/motion/pulse.js +88 -0
  238. package/src/motion/shake.js +83 -0
  239. package/src/motion/spiral.js +144 -0
  240. package/src/motion/spring.js +150 -0
  241. package/src/motion/swing.js +47 -0
  242. package/src/motion/tween.js +92 -0
  243. package/src/motion/tweenetik.js +139 -0
  244. package/src/motion/waypoint.js +210 -0
  245. package/src/painter/index.js +8 -0
  246. package/src/painter/painter.colors.js +331 -0
  247. package/src/painter/painter.effects.js +230 -0
  248. package/src/painter/painter.img.js +229 -0
  249. package/src/painter/painter.js +295 -0
  250. package/src/painter/painter.lines.js +189 -0
  251. package/src/painter/painter.opacity.js +41 -0
  252. package/src/painter/painter.shapes.js +277 -0
  253. package/src/painter/painter.text.js +273 -0
  254. package/src/particle/emitter.js +124 -0
  255. package/src/particle/index.js +11 -0
  256. package/src/particle/particle-system.js +322 -0
  257. package/src/particle/particle.js +71 -0
  258. package/src/particle/updaters.js +170 -0
  259. package/src/shapes/arc.js +43 -0
  260. package/src/shapes/arrow.js +33 -0
  261. package/src/shapes/bezier.js +42 -0
  262. package/src/shapes/circle.js +62 -0
  263. package/src/shapes/clouds.js +56 -0
  264. package/src/shapes/cone.js +219 -0
  265. package/src/shapes/cross.js +70 -0
  266. package/src/shapes/cube.js +244 -0
  267. package/src/shapes/cylinder.js +254 -0
  268. package/src/shapes/diamond.js +48 -0
  269. package/src/shapes/euclidian.js +111 -0
  270. package/src/shapes/figure.js +115 -0
  271. package/src/shapes/geometry.js +220 -0
  272. package/src/shapes/group.js +375 -0
  273. package/src/shapes/heart.js +42 -0
  274. package/src/shapes/hexagon.js +26 -0
  275. package/src/shapes/image.js +192 -0
  276. package/src/shapes/index.js +111 -0
  277. package/src/shapes/line.js +29 -0
  278. package/src/shapes/pattern.js +90 -0
  279. package/src/shapes/pin.js +44 -0
  280. package/src/shapes/poly.js +31 -0
  281. package/src/shapes/prism.js +226 -0
  282. package/src/shapes/rect.js +35 -0
  283. package/src/shapes/renderable.js +333 -0
  284. package/src/shapes/ring.js +26 -0
  285. package/src/shapes/roundrect.js +95 -0
  286. package/src/shapes/shape.js +117 -0
  287. package/src/shapes/slice.js +26 -0
  288. package/src/shapes/sphere.js +314 -0
  289. package/src/shapes/sphere3d.js +537 -0
  290. package/src/shapes/square.js +15 -0
  291. package/src/shapes/star.js +99 -0
  292. package/src/shapes/svg.js +408 -0
  293. package/src/shapes/text.js +553 -0
  294. package/src/shapes/traceable.js +83 -0
  295. package/src/shapes/transform.js +357 -0
  296. package/src/shapes/transformable.js +172 -0
  297. package/src/shapes/triangle.js +26 -0
  298. package/src/sound/index.js +17 -0
  299. package/src/sound/sound.js +473 -0
  300. package/src/sound/synth.analyzer.js +149 -0
  301. package/src/sound/synth.effects.js +207 -0
  302. package/src/sound/synth.envelope.js +59 -0
  303. package/src/sound/synth.js +229 -0
  304. package/src/sound/synth.musical.js +160 -0
  305. package/src/sound/synth.noise.js +85 -0
  306. package/src/sound/synth.oscillators.js +293 -0
  307. package/src/state/index.js +10 -0
  308. package/src/state/state-machine.js +371 -0
  309. package/src/util/camera3d.js +438 -0
  310. package/src/util/index.js +6 -0
  311. package/src/util/isometric-camera.js +235 -0
  312. package/src/util/layout.js +317 -0
  313. package/src/util/position.js +147 -0
  314. package/src/util/tasks.js +47 -0
  315. package/src/util/zindex.js +287 -0
  316. package/src/webgl/index.js +9 -0
  317. package/src/webgl/shaders/sphere-shaders.js +994 -0
  318. package/src/webgl/webgl-renderer.js +388 -0
  319. package/tde.png +0 -0
  320. package/test/math/orbital.test.js +61 -0
  321. package/test/math/tensor.test.js +114 -0
  322. package/test/particle/emitter.test.js +204 -0
  323. package/test/particle/particle-system.test.js +310 -0
  324. package/test/particle/particle.test.js +116 -0
  325. package/test/particle/updaters.test.js +386 -0
  326. package/test/setup.js +120 -0
  327. package/test/shapes/euclidian.test.js +44 -0
  328. package/test/shapes/geometry.test.js +86 -0
  329. package/test/shapes/group.test.js +86 -0
  330. package/test/shapes/rectangle.test.js +64 -0
  331. package/test/shapes/transform.test.js +379 -0
  332. package/test/util/camera3d.test.js +428 -0
  333. package/test/util/scene3d.test.js +352 -0
  334. package/types/collision.d.ts +249 -0
  335. package/types/common.d.ts +155 -0
  336. package/types/game.d.ts +497 -0
  337. package/types/index.d.ts +309 -0
  338. package/types/io.d.ts +188 -0
  339. package/types/logger.d.ts +127 -0
  340. package/types/math.d.ts +268 -0
  341. package/types/mixins.d.ts +92 -0
  342. package/types/motion.d.ts +678 -0
  343. package/types/painter.d.ts +378 -0
  344. package/types/shapes.d.ts +864 -0
  345. package/types/sound.d.ts +672 -0
  346. package/types/state.d.ts +251 -0
  347. package/types/util.d.ts +253 -0
  348. package/vite.config.js +50 -0
  349. package/vitest.config.js +13 -0
@@ -0,0 +1,678 @@
1
+ /**
2
+ * GCanvas Motion Module
3
+ * Animation systems including easing functions, tweening, and stateless motion primitives.
4
+ * @module motion
5
+ */
6
+
7
+ import {
8
+ EasingFunction,
9
+ MotionCallbacks,
10
+ MotionState,
11
+ MotionResult,
12
+ MotionPositionResult,
13
+ MotionValueResult,
14
+ SpringResult,
15
+ WaypointResult,
16
+ Point
17
+ } from './common';
18
+
19
+ // ==========================================================================
20
+ // Easing Functions
21
+ // ==========================================================================
22
+
23
+ /**
24
+ * Collection of easing functions for smooth animations.
25
+ * Each function takes a normalized time value (0-1) and returns an eased value.
26
+ *
27
+ * @example
28
+ * const easedT = Easing.easeOutBounce(0.5);
29
+ */
30
+ export class Easing {
31
+ // Quadratic
32
+ static easeInQuad(t: number): number;
33
+ static easeOutQuad(t: number): number;
34
+ static easeInOutQuad(t: number): number;
35
+
36
+ // Cubic
37
+ static easeInCubic(t: number): number;
38
+ static easeOutCubic(t: number): number;
39
+ static easeInOutCubic(t: number): number;
40
+
41
+ // Quartic
42
+ static easeInQuart(t: number): number;
43
+ static easeOutQuart(t: number): number;
44
+ static easeInOutQuart(t: number): number;
45
+
46
+ // Quintic
47
+ static easeInQuint(t: number): number;
48
+ static easeOutQuint(t: number): number;
49
+ static easeInOutQuint(t: number): number;
50
+
51
+ // Sine
52
+ static easeInSine(t: number): number;
53
+ static easeOutSine(t: number): number;
54
+ static easeInOutSine(t: number): number;
55
+
56
+ // Exponential
57
+ static easeInExpo(t: number): number;
58
+ static easeOutExpo(t: number): number;
59
+ static easeInOutExpo(t: number): number;
60
+
61
+ // Circular
62
+ static easeInCirc(t: number): number;
63
+ static easeOutCirc(t: number): number;
64
+ static easeInOutCirc(t: number): number;
65
+
66
+ // Elastic
67
+ static easeInElastic(t: number, amplitude?: number, period?: number): number;
68
+ static easeOutElastic(t: number, amplitude?: number, period?: number): number;
69
+ static easeInOutElastic(t: number, amplitude?: number, period?: number): number;
70
+
71
+ // Back (overshoot)
72
+ static easeInBack(t: number, overshoot?: number): number;
73
+ static easeOutBack(t: number, overshoot?: number): number;
74
+ static easeInOutBack(t: number, overshoot?: number): number;
75
+
76
+ // Bounce
77
+ static easeInBounce(t: number): number;
78
+ static easeOutBounce(t: number): number;
79
+ static easeInOutBounce(t: number): number;
80
+ }
81
+
82
+ // ==========================================================================
83
+ // Tween Utilities
84
+ // ==========================================================================
85
+
86
+ /**
87
+ * Stateless interpolation utilities.
88
+ */
89
+ export class Tween {
90
+ /**
91
+ * Linear interpolation between two values.
92
+ * @param start - Start value
93
+ * @param end - End value
94
+ * @param t - Normalized time (0-1)
95
+ */
96
+ static lerp(start: number, end: number, t: number): number;
97
+
98
+ /**
99
+ * Interpolate between two angles (handles wraparound).
100
+ * @param start - Start angle in radians
101
+ * @param end - End angle in radians
102
+ * @param t - Normalized time (0-1)
103
+ */
104
+ static lerpAngle(start: number, end: number, t: number): number;
105
+
106
+ /**
107
+ * Interpolate between two colors.
108
+ * @param startColor - Start color (hex string)
109
+ * @param endColor - End color (hex string)
110
+ * @param t - Normalized time (0-1)
111
+ * @returns Interpolated color as hex string
112
+ */
113
+ static lerpColor(startColor: string, endColor: string, t: number): string;
114
+ }
115
+
116
+ // ==========================================================================
117
+ // Tweenetik - Property Animation System
118
+ // ==========================================================================
119
+
120
+ /** Options for Tweenetik animations */
121
+ export interface TweenetikOptions {
122
+ /** Delay before animation starts (seconds) */
123
+ delay?: number;
124
+ /** Called when animation starts */
125
+ onStart?: () => void;
126
+ /** Called when animation completes */
127
+ onComplete?: () => void;
128
+ /** Called each frame after properties are updated */
129
+ onUpdate?: () => void;
130
+ }
131
+
132
+ /**
133
+ * Self-managed property animation system.
134
+ * Mutates target object properties directly over time.
135
+ *
136
+ * @example
137
+ * // Animate button scale with bounce
138
+ * Tweenetik.to(button, { scaleX: 1.2, scaleY: 1.2 }, 0.5, Easing.easeOutBack);
139
+ *
140
+ * // Must call updateAll in your game loop
141
+ * Tweenetik.updateAll(dt);
142
+ */
143
+ export class Tweenetik {
144
+ /** The object being animated */
145
+ target: object;
146
+ /** Animation duration in seconds */
147
+ duration: number;
148
+
149
+ /**
150
+ * Create a new Tweenetik animation.
151
+ * @param target - Object to animate
152
+ * @param toProps - Target property values
153
+ * @param duration - Duration in seconds
154
+ * @param easingFn - Easing function (default: easeOutQuad)
155
+ * @param options - Additional options
156
+ */
157
+ constructor(
158
+ target: object,
159
+ toProps: Record<string, number>,
160
+ duration: number,
161
+ easingFn?: EasingFunction,
162
+ options?: TweenetikOptions
163
+ );
164
+
165
+ /**
166
+ * Update this tween by delta time.
167
+ * @param dt - Delta time in seconds
168
+ */
169
+ update(dt: number): void;
170
+
171
+ /**
172
+ * Create and register a new tween.
173
+ * @param target - Object to animate
174
+ * @param toProps - Target property values
175
+ * @param duration - Duration in seconds
176
+ * @param easingFn - Easing function
177
+ * @param options - Additional options
178
+ * @returns The created Tweenetik instance
179
+ */
180
+ static to(
181
+ target: object,
182
+ toProps: Record<string, number>,
183
+ duration: number,
184
+ easingFn?: EasingFunction,
185
+ options?: TweenetikOptions
186
+ ): Tweenetik;
187
+
188
+ /**
189
+ * Update all active tweens.
190
+ * Call this in your game loop.
191
+ * @param dt - Delta time in seconds
192
+ */
193
+ static updateAll(dt: number): void;
194
+ }
195
+
196
+ // ==========================================================================
197
+ // Motion - Stateless Animation Primitives
198
+ // ==========================================================================
199
+
200
+ /** Spring physics parameters */
201
+ export interface SpringParams {
202
+ /** Spring stiffness (0-1, default: 0.3) */
203
+ stiffness?: number;
204
+ /** Damping factor (0-1, default: 0.6) */
205
+ damping?: number;
206
+ }
207
+
208
+ /** Target object with position */
209
+ export interface PositionTarget {
210
+ x: number;
211
+ y: number;
212
+ }
213
+
214
+ /**
215
+ * Stateless animation primitive functions.
216
+ * Each method returns interpolated values without storing state.
217
+ *
218
+ * @example
219
+ * function update(dt) {
220
+ * character.animTime += dt;
221
+ * const result = Motion.orbit(200, 200, 50, 50, 0, character.animTime, 2);
222
+ * character.x = result.x;
223
+ * character.y = result.y;
224
+ * }
225
+ */
226
+ export class Motion {
227
+ /**
228
+ * Oscillate between min and max values.
229
+ * @param min - Minimum value
230
+ * @param max - Maximum value
231
+ * @param elapsedTime - Total elapsed time (seconds)
232
+ * @param duration - Duration of one oscillation (seconds)
233
+ * @param loop - Whether to loop (default: true)
234
+ * @param easingFn - Optional easing function
235
+ * @param callbacks - Optional callbacks
236
+ * @param state - Internal state
237
+ */
238
+ static oscillate(
239
+ min: number,
240
+ max: number,
241
+ elapsedTime: number,
242
+ duration: number,
243
+ loop?: boolean,
244
+ easingFn?: EasingFunction | null,
245
+ callbacks?: MotionCallbacks,
246
+ state?: MotionState | null
247
+ ): MotionValueResult;
248
+
249
+ /**
250
+ * Parabolic arc interpolation.
251
+ * @param start - Start value
252
+ * @param peak - Peak value
253
+ * @param end - End value
254
+ * @param elapsedTime - Total elapsed time (seconds)
255
+ * @param duration - Duration (seconds)
256
+ * @param loop - Whether to loop
257
+ * @param yoyo - Whether to reverse at end
258
+ * @param easingFn - Optional easing function
259
+ * @param callbacks - Optional callbacks
260
+ * @param state - Internal state
261
+ */
262
+ static parabolic(
263
+ start: number,
264
+ peak: number,
265
+ end: number,
266
+ elapsedTime: number,
267
+ duration: number,
268
+ loop?: boolean,
269
+ yoyo?: boolean,
270
+ easingFn?: EasingFunction | null,
271
+ callbacks?: MotionCallbacks,
272
+ state?: MotionState | null
273
+ ): MotionValueResult;
274
+
275
+ /**
276
+ * Floating/drifting movement within an area.
277
+ * @param target - Object with x,y center point
278
+ * @param elapsedTime - Total elapsed time (seconds)
279
+ * @param duration - Duration of one cycle (seconds)
280
+ * @param speed - Movement speed (0.1-2.0 recommended)
281
+ * @param randomness - Path randomness (0-1)
282
+ * @param radius - Float area radius
283
+ * @param loop - Whether to loop
284
+ * @param easingFn - Optional easing function
285
+ * @param callbacks - Optional callbacks
286
+ * @param state - Internal state
287
+ */
288
+ static float(
289
+ target: PositionTarget,
290
+ elapsedTime: number,
291
+ duration: number,
292
+ speed: number,
293
+ randomness: number,
294
+ radius: number,
295
+ loop?: boolean,
296
+ easingFn?: EasingFunction | null,
297
+ callbacks?: MotionCallbacks,
298
+ state?: MotionState | null
299
+ ): MotionPositionResult;
300
+
301
+ /**
302
+ * Spring animation with elastic bounce.
303
+ * @param initial - Initial value
304
+ * @param target - Target value
305
+ * @param elapsedTime - Total elapsed time (seconds)
306
+ * @param duration - Duration (seconds)
307
+ * @param loop - Whether to loop
308
+ * @param yoyo - Whether to return to initial
309
+ * @param springParams - Spring physics parameters
310
+ * @param callbacks - Optional callbacks
311
+ */
312
+ static spring(
313
+ initial: number,
314
+ target: number,
315
+ elapsedTime: number,
316
+ duration: number,
317
+ loop?: boolean,
318
+ yoyo?: boolean,
319
+ springParams?: SpringParams,
320
+ callbacks?: MotionCallbacks
321
+ ): SpringResult;
322
+
323
+ /**
324
+ * Swinging motion around a center point.
325
+ * @param centerX - Center X
326
+ * @param centerY - Center Y
327
+ * @param maxAngle - Maximum swing angle (radians)
328
+ * @param elapsedTime - Total elapsed time (seconds)
329
+ * @param duration - Duration (seconds)
330
+ * @param loop - Whether to loop
331
+ * @param yoyo - Whether to reverse
332
+ * @param easingFn - Optional easing function
333
+ * @param callbacks - Optional callbacks
334
+ * @param state - Internal state
335
+ */
336
+ static swing(
337
+ centerX: number,
338
+ centerY: number,
339
+ maxAngle: number,
340
+ elapsedTime: number,
341
+ duration: number,
342
+ loop?: boolean,
343
+ yoyo?: boolean,
344
+ easingFn?: EasingFunction | null,
345
+ callbacks?: MotionCallbacks,
346
+ state?: MotionState | null
347
+ ): MotionPositionResult;
348
+
349
+ /**
350
+ * Pendulum motion.
351
+ * @param originAngle - Starting angle (radians)
352
+ * @param amplitude - Swing amplitude
353
+ * @param elapsedTime - Total elapsed time (seconds)
354
+ * @param duration - Duration (seconds)
355
+ * @param loop - Whether to loop
356
+ * @param damped - Whether to apply damping
357
+ * @param easingFn - Optional easing function
358
+ * @param callbacks - Optional callbacks
359
+ * @param state - Internal state
360
+ */
361
+ static pendulum(
362
+ originAngle: number,
363
+ amplitude: number,
364
+ elapsedTime: number,
365
+ duration: number,
366
+ loop?: boolean,
367
+ damped?: boolean,
368
+ easingFn?: EasingFunction | null,
369
+ callbacks?: MotionCallbacks,
370
+ state?: MotionState | null
371
+ ): MotionValueResult;
372
+
373
+ /**
374
+ * Pulse between min and max values.
375
+ * @param min - Minimum value
376
+ * @param max - Maximum value
377
+ * @param elapsedTime - Total elapsed time (seconds)
378
+ * @param duration - Duration of one pulse (seconds)
379
+ * @param loop - Whether to loop
380
+ * @param yoyo - Use separate easing for return
381
+ * @param easingFn - Optional easing function
382
+ * @param callbacks - Optional callbacks
383
+ */
384
+ static pulse(
385
+ min: number,
386
+ max: number,
387
+ elapsedTime: number,
388
+ duration: number,
389
+ loop?: boolean,
390
+ yoyo?: boolean,
391
+ easingFn?: EasingFunction | null,
392
+ callbacks?: MotionCallbacks
393
+ ): MotionValueResult;
394
+
395
+ /**
396
+ * Spiral motion animation.
397
+ * @param centerX - Spiral center X
398
+ * @param centerY - Spiral center Y
399
+ * @param startRadius - Starting radius
400
+ * @param endRadius - Ending radius
401
+ * @param startAngle - Starting angle (radians)
402
+ * @param revolutions - Number of revolutions
403
+ * @param elapsedTime - Total elapsed time (seconds)
404
+ * @param duration - Duration (seconds)
405
+ * @param loop - Whether to loop
406
+ * @param yoyo - Whether to reverse
407
+ * @param easingFn - Optional easing function
408
+ * @param callbacks - Optional callbacks
409
+ * @param state - Internal state
410
+ */
411
+ static spiral(
412
+ centerX: number,
413
+ centerY: number,
414
+ startRadius: number,
415
+ endRadius: number,
416
+ startAngle: number,
417
+ revolutions: number,
418
+ elapsedTime: number,
419
+ duration: number,
420
+ loop?: boolean,
421
+ yoyo?: boolean,
422
+ easingFn?: EasingFunction | null,
423
+ callbacks?: MotionCallbacks,
424
+ state?: MotionState | null
425
+ ): MotionPositionResult;
426
+
427
+ /**
428
+ * Orbital motion (circular or elliptical).
429
+ * @param centerX - Orbit center X
430
+ * @param centerY - Orbit center Y
431
+ * @param radiusX - Horizontal radius
432
+ * @param radiusY - Vertical radius
433
+ * @param startAngle - Starting angle (radians)
434
+ * @param elapsedTime - Total elapsed time (seconds)
435
+ * @param duration - Duration of one orbit (seconds)
436
+ * @param loop - Whether to loop (default: true)
437
+ * @param clockwise - Direction (default: true)
438
+ * @param easingFn - Optional easing function
439
+ * @param callbacks - Optional callbacks
440
+ * @param state - Internal state
441
+ */
442
+ static orbit(
443
+ centerX: number,
444
+ centerY: number,
445
+ radiusX: number,
446
+ radiusY: number,
447
+ startAngle: number,
448
+ elapsedTime: number,
449
+ duration: number,
450
+ loop?: boolean,
451
+ clockwise?: boolean,
452
+ easingFn?: EasingFunction | null,
453
+ callbacks?: MotionCallbacks,
454
+ state?: MotionState | null
455
+ ): MotionPositionResult;
456
+
457
+ /**
458
+ * Bezier curve motion.
459
+ * @param p0 - Start point [x, y]
460
+ * @param p1 - Control point 1 [x, y]
461
+ * @param p2 - Control point 2 [x, y]
462
+ * @param p3 - End point [x, y]
463
+ * @param elapsedTime - Total elapsed time (seconds)
464
+ * @param duration - Duration (seconds)
465
+ * @param loop - Whether to loop
466
+ * @param yoyo - Whether to reverse
467
+ * @param easingFn - Optional easing function
468
+ * @param callbacks - Optional callbacks
469
+ * @param state - Internal state
470
+ */
471
+ static bezier(
472
+ p0: [number, number],
473
+ p1: [number, number],
474
+ p2: [number, number],
475
+ p3: [number, number],
476
+ elapsedTime: number,
477
+ duration: number,
478
+ loop?: boolean,
479
+ yoyo?: boolean,
480
+ easingFn?: EasingFunction | null,
481
+ callbacks?: MotionCallbacks,
482
+ state?: MotionState | null
483
+ ): MotionPositionResult;
484
+
485
+ /**
486
+ * Bounce animation with diminishing height.
487
+ * @param maxHeight - Maximum height (negative y)
488
+ * @param groundY - Ground position
489
+ * @param bounceCount - Number of bounces
490
+ * @param elapsedTime - Total elapsed time (seconds)
491
+ * @param duration - Duration (seconds)
492
+ * @param loop - Whether to loop
493
+ * @param easingFn - Optional easing function
494
+ * @param callbacks - Optional callbacks
495
+ * @param state - Internal state
496
+ */
497
+ static bounce(
498
+ maxHeight: number,
499
+ groundY: number,
500
+ bounceCount: number,
501
+ elapsedTime: number,
502
+ duration: number,
503
+ loop?: boolean,
504
+ easingFn?: EasingFunction | null,
505
+ callbacks?: MotionCallbacks,
506
+ state?: MotionState | null
507
+ ): MotionValueResult;
508
+
509
+ /**
510
+ * Shake animation with decay.
511
+ * @param centerX - Center X
512
+ * @param centerY - Center Y
513
+ * @param maxOffsetX - Maximum X offset
514
+ * @param maxOffsetY - Maximum Y offset
515
+ * @param frequency - Shake frequency
516
+ * @param decay - Decay rate (0-1)
517
+ * @param elapsedTime - Total elapsed time (seconds)
518
+ * @param duration - Duration (seconds)
519
+ * @param loop - Whether to loop
520
+ * @param easingFn - Optional easing function
521
+ * @param callbacks - Optional callbacks
522
+ * @param state - Internal state
523
+ */
524
+ static shake(
525
+ centerX: number,
526
+ centerY: number,
527
+ maxOffsetX: number,
528
+ maxOffsetY: number,
529
+ frequency: number,
530
+ decay: number,
531
+ elapsedTime: number,
532
+ duration: number,
533
+ loop?: boolean,
534
+ easingFn?: EasingFunction | null,
535
+ callbacks?: MotionCallbacks,
536
+ state?: MotionState | null
537
+ ): MotionPositionResult;
538
+
539
+ /**
540
+ * Follow a path of points.
541
+ * @param points - Array of points [[x,y], ...]
542
+ * @param closed - Whether path is closed
543
+ * @param elapsedTime - Total elapsed time (seconds)
544
+ * @param duration - Duration (seconds)
545
+ * @param loop - Whether to loop
546
+ * @param easingFn - Optional easing function
547
+ * @param callbacks - Optional callbacks
548
+ * @param state - Internal state
549
+ */
550
+ static follow(
551
+ points: [number, number][],
552
+ closed: boolean,
553
+ elapsedTime: number,
554
+ duration: number,
555
+ loop?: boolean,
556
+ easingFn?: EasingFunction | null,
557
+ callbacks?: MotionCallbacks,
558
+ state?: MotionState | null
559
+ ): MotionPositionResult;
560
+
561
+ /**
562
+ * Waypoint patrol with waiting periods.
563
+ * @param target - Object with x,y (for reference)
564
+ * @param elapsedTime - Total elapsed time (seconds)
565
+ * @param waypoints - Array of waypoints [[x,y], ...]
566
+ * @param speed - Movement speed (units/second)
567
+ * @param waitTime - Wait time at each waypoint (seconds)
568
+ * @param loop - Whether to loop
569
+ * @param callbacks - Optional callbacks
570
+ * @param state - Internal state
571
+ */
572
+ static waypoint(
573
+ target: PositionTarget,
574
+ elapsedTime: number,
575
+ waypoints: [number, number][],
576
+ speed: number,
577
+ waitTime: number,
578
+ loop?: boolean,
579
+ callbacks?: MotionCallbacks,
580
+ state?: MotionState | null
581
+ ): WaypointResult;
582
+
583
+ /**
584
+ * Random patrol within a radius.
585
+ * @param initialX - Center X
586
+ * @param initialY - Center Y
587
+ * @param elapsedTime - Total elapsed time (seconds)
588
+ * @param moveTime - Time between points
589
+ * @param waitTime - Wait time at each point
590
+ * @param radius - Patrol radius
591
+ * @param loop - Whether to loop
592
+ * @param state - Internal state
593
+ */
594
+ static patrol(
595
+ initialX: number,
596
+ initialY: number,
597
+ elapsedTime: number,
598
+ moveTime: number,
599
+ waitTime: number,
600
+ radius: number,
601
+ loop?: boolean,
602
+ state?: MotionState | null
603
+ ): MotionPositionResult;
604
+
605
+ /**
606
+ * Hop/jump animation.
607
+ * @param startX - Start X
608
+ * @param startY - Start Y
609
+ * @param endX - End X
610
+ * @param endY - End Y
611
+ * @param height - Jump height
612
+ * @param elapsedTime - Total elapsed time (seconds)
613
+ * @param duration - Duration (seconds)
614
+ * @param loop - Whether to loop
615
+ * @param easingFn - Optional easing function
616
+ * @param callbacks - Optional callbacks
617
+ * @param state - Internal state
618
+ */
619
+ static hop(
620
+ startX: number,
621
+ startY: number,
622
+ endX: number,
623
+ endY: number,
624
+ height: number,
625
+ elapsedTime: number,
626
+ duration: number,
627
+ loop?: boolean,
628
+ easingFn?: EasingFunction | null,
629
+ callbacks?: MotionCallbacks,
630
+ state?: MotionState | null
631
+ ): MotionPositionResult;
632
+
633
+ /**
634
+ * Group multiple animations together (run in parallel).
635
+ * @param animations - Array of Motion method references
636
+ * @param animationArgs - Array of argument arrays for each animation
637
+ * @param elapsedTime - Total elapsed time (seconds)
638
+ * @param duration - Duration (seconds)
639
+ * @param loop - Whether to loop
640
+ * @param easingFn - Optional easing function for all
641
+ * @param callbacks - Optional callbacks
642
+ * @param state - Internal state
643
+ */
644
+ static group(
645
+ animations: Function[],
646
+ animationArgs: any[][],
647
+ elapsedTime: number,
648
+ duration: number,
649
+ loop?: boolean,
650
+ easingFn?: EasingFunction | null,
651
+ callbacks?: MotionCallbacks,
652
+ state?: MotionState | null
653
+ ): MotionResult & { [key: string]: MotionResult };
654
+
655
+ /**
656
+ * Sequence multiple animations (run one after another).
657
+ * @param animations - Array of Motion method references
658
+ * @param animationArgs - Array of argument arrays for each animation
659
+ * @param durations - Array of durations for each animation
660
+ * @param elapsedTime - Total elapsed time (seconds)
661
+ * @param loop - Whether to loop the sequence
662
+ * @param easingFns - Optional array of easing functions
663
+ * @param callbacks - Optional callbacks for entire sequence
664
+ * @param animCallbacks - Optional callbacks for individual animations
665
+ * @param state - Internal state
666
+ */
667
+ static sequence(
668
+ animations: Function[],
669
+ animationArgs: any[][],
670
+ durations: number[],
671
+ elapsedTime: number,
672
+ loop?: boolean,
673
+ easingFns?: (EasingFunction | null)[] | null,
674
+ callbacks?: MotionCallbacks,
675
+ animCallbacks?: MotionCallbacks[] | null,
676
+ state?: MotionState | null
677
+ ): MotionResult;
678
+ }