@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,268 @@
1
+ /**
2
+ * GCanvas Math Module
3
+ * Mathematical utilities including random numbers, complex numbers, fractals, patterns, and noise.
4
+ * @module math
5
+ */
6
+
7
+ import { PenroseTilingOptions } from './common';
8
+
9
+ // ==========================================================================
10
+ // Random Utilities
11
+ // ==========================================================================
12
+
13
+ /**
14
+ * Random number generation utilities.
15
+ *
16
+ * @example
17
+ * const x = Random.float(0, 100);
18
+ * const color = Random.color();
19
+ * const item = Random.pick(['a', 'b', 'c']);
20
+ */
21
+ export class Random {
22
+ /**
23
+ * Generate a random float in range [min, max).
24
+ * @param min - Minimum value (inclusive)
25
+ * @param max - Maximum value (exclusive)
26
+ */
27
+ static float(min: number, max: number): number;
28
+
29
+ /**
30
+ * Generate a random integer in range [min, max].
31
+ * @param min - Minimum value (inclusive)
32
+ * @param max - Maximum value (inclusive)
33
+ */
34
+ static int(min: number, max: number): number;
35
+
36
+ /**
37
+ * Generate a random boolean.
38
+ * @param probability - Probability of true (0-1, default: 0.5)
39
+ */
40
+ static bool(probability?: number): boolean;
41
+
42
+ /**
43
+ * Pick a random element from an array.
44
+ * @param array - Array to pick from
45
+ */
46
+ static pick<T>(array: T[]): T;
47
+
48
+ /**
49
+ * Shuffle an array (Fisher-Yates).
50
+ * @param array - Array to shuffle
51
+ * @returns New shuffled array
52
+ */
53
+ static shuffle<T>(array: T[]): T[];
54
+
55
+ /**
56
+ * Generate a random hex color.
57
+ * @returns Color string (e.g., "#a3f2c1")
58
+ */
59
+ static color(): string;
60
+
61
+ /**
62
+ * Generate a random angle in radians.
63
+ * @returns Angle in range [0, 2π)
64
+ */
65
+ static angle(): number;
66
+ }
67
+
68
+ // ==========================================================================
69
+ // Complex Numbers
70
+ // ==========================================================================
71
+
72
+ /**
73
+ * Complex number representation and operations.
74
+ * Used for fractal calculations and advanced math.
75
+ *
76
+ * @example
77
+ * const c1 = new Complex(3, 4);
78
+ * const c2 = Complex.fromPolar(5, Math.PI / 4);
79
+ * const product = c1.multiply(c2);
80
+ */
81
+ export class Complex {
82
+ /** Real part */
83
+ real: number;
84
+ /** Imaginary part */
85
+ imag: number;
86
+
87
+ /**
88
+ * Create a complex number.
89
+ * @param real - Real part
90
+ * @param imag - Imaginary part
91
+ */
92
+ constructor(real: number, imag?: number);
93
+
94
+ /**
95
+ * Create a complex number from polar coordinates.
96
+ * @param r - Magnitude (radius)
97
+ * @param theta - Angle in radians
98
+ */
99
+ static fromPolar(r: number, theta: number): Complex;
100
+
101
+ /**
102
+ * Add another complex number.
103
+ * @param other - Complex number to add
104
+ * @returns New complex number (sum)
105
+ */
106
+ add(other: Complex): Complex;
107
+
108
+ /**
109
+ * Subtract another complex number.
110
+ * @param other - Complex number to subtract
111
+ * @returns New complex number (difference)
112
+ */
113
+ subtract(other: Complex): Complex;
114
+
115
+ /**
116
+ * Multiply by another complex number.
117
+ * @param other - Complex number to multiply by
118
+ * @returns New complex number (product)
119
+ */
120
+ multiply(other: Complex): Complex;
121
+
122
+ /**
123
+ * Scale by a scalar value.
124
+ * @param scalar - Value to scale by
125
+ * @returns New scaled complex number
126
+ */
127
+ scale(scalar: number): Complex;
128
+
129
+ /**
130
+ * Calculate the magnitude (absolute value).
131
+ * @returns Magnitude √(real² + imag²)
132
+ */
133
+ magnitude(): number;
134
+
135
+ /**
136
+ * Get the complex conjugate.
137
+ * @returns New complex number with negated imaginary part
138
+ */
139
+ conjugate(): Complex;
140
+ }
141
+
142
+ // ==========================================================================
143
+ // Fractals
144
+ // ==========================================================================
145
+
146
+ /**
147
+ * Fractal generation utilities.
148
+ *
149
+ * @example
150
+ * const iterations = Fractals.mandelbrot(x, y, 100);
151
+ * const color = iterations === 100 ? 'black' : `hsl(${iterations * 3}, 100%, 50%)`;
152
+ */
153
+ export class Fractals {
154
+ /**
155
+ * Calculate Mandelbrot set membership.
156
+ * @param x - Real coordinate
157
+ * @param y - Imaginary coordinate
158
+ * @param maxIterations - Maximum iterations before assuming membership
159
+ * @returns Number of iterations until escape (or maxIterations if in set)
160
+ */
161
+ static mandelbrot(x: number, y: number, maxIterations: number): number;
162
+
163
+ /**
164
+ * Calculate Julia set value.
165
+ * @param x - Real coordinate
166
+ * @param y - Imaginary coordinate
167
+ * @param cx - Julia constant real part
168
+ * @param cy - Julia constant imaginary part
169
+ * @param maxIterations - Maximum iterations
170
+ * @returns Number of iterations until escape
171
+ */
172
+ static julia(x: number, y: number, cx: number, cy: number, maxIterations: number): number;
173
+ }
174
+
175
+ // ==========================================================================
176
+ // Patterns
177
+ // ==========================================================================
178
+
179
+ /**
180
+ * Pattern generation utilities.
181
+ *
182
+ * @example
183
+ * const isBlack = Patterns.checkerboard(x, y, 32);
184
+ */
185
+ export class Patterns {
186
+ /**
187
+ * Generate a checkerboard pattern.
188
+ * @param x - X coordinate
189
+ * @param y - Y coordinate
190
+ * @param size - Size of each square
191
+ * @returns true for one color, false for the other
192
+ */
193
+ static checkerboard(x: number, y: number, size: number): boolean;
194
+
195
+ /**
196
+ * Generate a stripe pattern.
197
+ * @param x - X coordinate
198
+ * @param y - Y coordinate
199
+ * @param size - Stripe width
200
+ * @param angle - Stripe angle in radians (default: 0 = horizontal)
201
+ * @returns true for stripe, false for gap
202
+ */
203
+ static stripes(x: number, y: number, size: number, angle?: number): boolean;
204
+ }
205
+
206
+ // ==========================================================================
207
+ // Noise
208
+ // ==========================================================================
209
+
210
+ /**
211
+ * Noise generation (Perlin-like).
212
+ *
213
+ * @example
214
+ * const noise = new Noise(12345);
215
+ * const value = noise.noise2D(x * 0.01, y * 0.01);
216
+ */
217
+ export class Noise {
218
+ /**
219
+ * Create a noise generator.
220
+ * @param seed - Random seed for reproducible noise
221
+ */
222
+ constructor(seed?: number);
223
+
224
+ /**
225
+ * Generate 2D noise value.
226
+ * @param x - X coordinate
227
+ * @param y - Y coordinate
228
+ * @returns Noise value in range [-1, 1]
229
+ */
230
+ noise2D(x: number, y: number): number;
231
+
232
+ /**
233
+ * Generate 3D noise value.
234
+ * @param x - X coordinate
235
+ * @param y - Y coordinate
236
+ * @param z - Z coordinate
237
+ * @returns Noise value in range [-1, 1]
238
+ */
239
+ noise3D(x: number, y: number, z: number): number;
240
+ }
241
+
242
+ // ==========================================================================
243
+ // Penrose Tiling
244
+ // ==========================================================================
245
+
246
+ /**
247
+ * Generate Penrose tiling as pixel data.
248
+ * Creates aperiodic (non-repeating) tessellation pattern.
249
+ *
250
+ * @param width - Image width in pixels (default: 800)
251
+ * @param height - Image height in pixels (default: 800)
252
+ * @param options - Tiling options
253
+ * @returns RGBA pixel data as Uint8ClampedArray (4 bytes per pixel)
254
+ *
255
+ * @example
256
+ * const pixels = generatePenroseTilingPixels(400, 400, {
257
+ * divisions: 6,
258
+ * color1: [255, 100, 100, 255],
259
+ * color2: [100, 100, 255, 255]
260
+ * });
261
+ * const imageData = new ImageData(pixels, 400, 400);
262
+ * ctx.putImageData(imageData, 0, 0);
263
+ */
264
+ export function generatePenroseTilingPixels(
265
+ width?: number,
266
+ height?: number,
267
+ options?: PenroseTilingOptions
268
+ ): Uint8ClampedArray;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * GCanvas Mixins Module
3
+ * Behavior modules that can be applied to GameObjects.
4
+ * @module mixins
5
+ */
6
+
7
+ import { Bounds, Point } from './common';
8
+ import { GameObject } from './game';
9
+
10
+ // ==========================================================================
11
+ // Draggable Mixin
12
+ // ==========================================================================
13
+
14
+ /** Options for draggable behavior */
15
+ export interface DraggableOptions {
16
+ /** Bounds to constrain dragging within */
17
+ bounds?: Bounds;
18
+ /** Called when drag starts */
19
+ onDragStart?: () => void;
20
+ /** Called when drag ends */
21
+ onDragEnd?: () => void;
22
+ }
23
+
24
+ /**
25
+ * Apply draggable behavior to a GameObject.
26
+ * Makes the object respond to drag gestures (mouse or touch).
27
+ *
28
+ * @param target - GameObject to make draggable
29
+ * @param options - Draggable options
30
+ * @returns Cleanup function to remove drag behavior
31
+ *
32
+ * @example
33
+ * const cleanup = applyDraggable(myObject, {
34
+ * onDragStart: () => console.log('Started dragging'),
35
+ * onDragEnd: () => console.log('Stopped dragging')
36
+ * });
37
+ *
38
+ * // Later, to remove drag behavior:
39
+ * cleanup();
40
+ */
41
+ export function applyDraggable(
42
+ target: GameObject,
43
+ options?: DraggableOptions
44
+ ): () => void;
45
+
46
+ // ==========================================================================
47
+ // Anchor Mixin
48
+ // ==========================================================================
49
+
50
+ /** Options for anchor positioning */
51
+ export interface AnchorOptions {
52
+ /** Anchor position (use Position constants like "top-left", "center") */
53
+ anchor?: string;
54
+ /** Margin from edge when anchoring (default: 10) */
55
+ anchorMargin?: number;
56
+ /** Additional X offset after anchoring (default: 0) */
57
+ anchorOffsetX?: number;
58
+ /** Additional Y offset after anchoring (default: 0) */
59
+ anchorOffsetY?: number;
60
+ /** Object to anchor relative to, or true to use parent */
61
+ anchorRelative?: GameObject | boolean;
62
+ /** Whether to set text alignment properties (default: true) */
63
+ anchorSetTextAlign?: boolean;
64
+ }
65
+
66
+ /**
67
+ * Apply anchor positioning to a GameObject.
68
+ * Automatically positions the object relative to the canvas or another object.
69
+ *
70
+ * @param target - GameObject to apply anchoring to
71
+ * @param options - Anchor options
72
+ * @returns The original GameObject for chaining
73
+ *
74
+ * @example
75
+ * import { Position } from 'gcanvas';
76
+ *
77
+ * // Anchor to bottom-right corner
78
+ * applyAnchor(myButton, {
79
+ * anchor: Position.BOTTOM_RIGHT,
80
+ * anchorMargin: 20
81
+ * });
82
+ *
83
+ * // Anchor relative to parent
84
+ * applyAnchor(childObject, {
85
+ * anchor: Position.CENTER,
86
+ * anchorRelative: true
87
+ * });
88
+ */
89
+ export function applyAnchor(
90
+ target: GameObject,
91
+ options?: AnchorOptions
92
+ ): GameObject;