@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.
- package/.github/workflows/release.yaml +70 -0
- package/.jshintrc +4 -0
- package/.vscode/settings.json +22 -0
- package/CLAUDE.md +310 -0
- package/blackhole.jpg +0 -0
- package/demo.png +0 -0
- package/demos/CNAME +1 -0
- package/demos/animations.html +31 -0
- package/demos/basic.html +38 -0
- package/demos/baskara.html +31 -0
- package/demos/bezier.html +35 -0
- package/demos/beziersignature.html +29 -0
- package/demos/blackhole.html +28 -0
- package/demos/blob.html +35 -0
- package/demos/demos.css +289 -0
- package/demos/easing.html +28 -0
- package/demos/events.html +195 -0
- package/demos/fluent.html +647 -0
- package/demos/fractals.html +36 -0
- package/demos/genart.html +26 -0
- package/demos/gendream.html +26 -0
- package/demos/group.html +36 -0
- package/demos/home.html +587 -0
- package/demos/index.html +364 -0
- package/demos/isometric.html +34 -0
- package/demos/js/animations.js +452 -0
- package/demos/js/basic.js +204 -0
- package/demos/js/baskara.js +751 -0
- package/demos/js/bezier.js +692 -0
- package/demos/js/beziersignature.js +241 -0
- package/demos/js/blackhole/accretiondisk.obj.js +379 -0
- package/demos/js/blackhole/blackhole.obj.js +318 -0
- package/demos/js/blackhole/index.js +409 -0
- package/demos/js/blackhole/particle.js +56 -0
- package/demos/js/blackhole/starfield.obj.js +218 -0
- package/demos/js/blob.js +2263 -0
- package/demos/js/easing.js +477 -0
- package/demos/js/fluent.js +183 -0
- package/demos/js/fractals.js +931 -0
- package/demos/js/fractalworker.js +93 -0
- package/demos/js/genart.js +268 -0
- package/demos/js/gendream.js +209 -0
- package/demos/js/group.js +140 -0
- package/demos/js/info-toggle.js +25 -0
- package/demos/js/isometric.js +863 -0
- package/demos/js/kerr.js +1556 -0
- package/demos/js/lavalamp.js +590 -0
- package/demos/js/layout.js +354 -0
- package/demos/js/mondrian.js +285 -0
- package/demos/js/opacity.js +275 -0
- package/demos/js/painter.js +484 -0
- package/demos/js/particles-showcase.js +514 -0
- package/demos/js/particles.js +299 -0
- package/demos/js/patterns.js +397 -0
- package/demos/js/penrose/artifact.js +69 -0
- package/demos/js/penrose/blackhole.js +121 -0
- package/demos/js/penrose/constants.js +73 -0
- package/demos/js/penrose/game.js +943 -0
- package/demos/js/penrose/lore.js +278 -0
- package/demos/js/penrose/penrosescene.js +892 -0
- package/demos/js/penrose/ship.js +216 -0
- package/demos/js/penrose/sounds.js +211 -0
- package/demos/js/penrose/voidparticle.js +55 -0
- package/demos/js/penrose/voidscene.js +258 -0
- package/demos/js/penrose/voidship.js +144 -0
- package/demos/js/penrose/wormhole.js +46 -0
- package/demos/js/pipeline.js +555 -0
- package/demos/js/scene.js +304 -0
- package/demos/js/scenes.js +320 -0
- package/demos/js/schrodinger.js +410 -0
- package/demos/js/schwarzschild.js +1023 -0
- package/demos/js/shapes.js +628 -0
- package/demos/js/space/alien.js +171 -0
- package/demos/js/space/boom.js +98 -0
- package/demos/js/space/boss.js +353 -0
- package/demos/js/space/buff.js +73 -0
- package/demos/js/space/bullet.js +102 -0
- package/demos/js/space/constants.js +85 -0
- package/demos/js/space/game.js +1884 -0
- package/demos/js/space/hud.js +112 -0
- package/demos/js/space/laserbeam.js +179 -0
- package/demos/js/space/lightning.js +277 -0
- package/demos/js/space/minion.js +192 -0
- package/demos/js/space/missile.js +212 -0
- package/demos/js/space/player.js +430 -0
- package/demos/js/space/powerup.js +90 -0
- package/demos/js/space/starfield.js +58 -0
- package/demos/js/space/starpower.js +90 -0
- package/demos/js/spacetime.js +559 -0
- package/demos/js/svgtween.js +204 -0
- package/demos/js/tde/accretiondisk.js +418 -0
- package/demos/js/tde/blackhole.js +219 -0
- package/demos/js/tde/blackholescene.js +209 -0
- package/demos/js/tde/config.js +59 -0
- package/demos/js/tde/index.js +695 -0
- package/demos/js/tde/jets.js +290 -0
- package/demos/js/tde/lensedstarfield.js +147 -0
- package/demos/js/tde/tdestar.js +317 -0
- package/demos/js/tde/tidalstream.js +356 -0
- package/demos/js/tde_old/blackhole.obj.js +354 -0
- package/demos/js/tde_old/debris.obj.js +791 -0
- package/demos/js/tde_old/flare.obj.js +239 -0
- package/demos/js/tde_old/index.js +448 -0
- package/demos/js/tde_old/star.obj.js +812 -0
- package/demos/js/tiles.js +312 -0
- package/demos/js/tweendemo.js +79 -0
- package/demos/js/visibility.js +102 -0
- package/demos/kerr.html +28 -0
- package/demos/lavalamp.html +27 -0
- package/demos/layouts.html +37 -0
- package/demos/logo.svg +4 -0
- package/demos/loop.html +84 -0
- package/demos/mondrian.html +32 -0
- package/demos/og_image.png +0 -0
- package/demos/opacity.html +36 -0
- package/demos/painter.html +39 -0
- package/demos/particles-showcase.html +28 -0
- package/demos/particles.html +24 -0
- package/demos/patterns.html +33 -0
- package/demos/penrose-game.html +31 -0
- package/demos/pipeline.html +737 -0
- package/demos/scene.html +33 -0
- package/demos/scenes.html +96 -0
- package/demos/schrodinger.html +27 -0
- package/demos/schwarzschild.html +27 -0
- package/demos/shapes.html +16 -0
- package/demos/space.html +85 -0
- package/demos/spacetime.html +27 -0
- package/demos/svgtween.html +29 -0
- package/demos/tde.html +28 -0
- package/demos/tiles.html +28 -0
- package/demos/transforms.html +400 -0
- package/demos/tween.html +45 -0
- package/demos/visibility.html +33 -0
- package/disk_example.png +0 -0
- package/docs/README.md +222 -0
- package/docs/concepts/architecture-overview.md +204 -0
- package/docs/concepts/lifecycle.md +255 -0
- package/docs/concepts/rendering-pipeline.md +279 -0
- package/docs/concepts/tde-zorder.md +106 -0
- package/docs/concepts/two-layer-architecture.md +229 -0
- package/docs/getting-started/first-game.md +354 -0
- package/docs/getting-started/hello-world.md +269 -0
- package/docs/getting-started/installation.md +157 -0
- package/docs/modules/collision/README.md +453 -0
- package/docs/modules/fluent/README.md +1075 -0
- package/docs/modules/game/README.md +303 -0
- package/docs/modules/isometric-camera.md +210 -0
- package/docs/modules/isometric.md +275 -0
- package/docs/modules/painter/README.md +328 -0
- package/docs/modules/particle/README.md +559 -0
- package/docs/modules/shapes/README.md +221 -0
- package/docs/modules/shapes/base/euclidian.md +123 -0
- package/docs/modules/shapes/base/geometry2d.md +204 -0
- package/docs/modules/shapes/base/renderable.md +215 -0
- package/docs/modules/shapes/base/shape.md +262 -0
- package/docs/modules/shapes/base/transformable.md +243 -0
- package/docs/modules/shapes/hierarchy.md +218 -0
- package/docs/modules/state/README.md +577 -0
- package/docs/modules/util/README.md +99 -0
- package/docs/modules/util/camera3d.md +412 -0
- package/docs/modules/util/scene3d.md +395 -0
- package/index.html +17 -0
- package/jsdoc.json +50 -0
- package/package.json +55 -0
- package/readme.md +599 -0
- package/scripts/build-demo.js +69 -0
- package/scripts/bundle4llm.js +276 -0
- package/scripts/clearconsole.js +48 -0
- package/src/collision/collision-system.js +332 -0
- package/src/collision/collision.js +303 -0
- package/src/collision/index.js +10 -0
- package/src/fluent/fluent-game.js +430 -0
- package/src/fluent/fluent-go.js +1060 -0
- package/src/fluent/fluent-layer.js +152 -0
- package/src/fluent/fluent-scene.js +291 -0
- package/src/fluent/index.js +98 -0
- package/src/fluent/sketch.js +380 -0
- package/src/game/game.js +467 -0
- package/src/game/index.js +49 -0
- package/src/game/objects/go.js +220 -0
- package/src/game/objects/imagego.js +30 -0
- package/src/game/objects/index.js +54 -0
- package/src/game/objects/isometric-scene.js +260 -0
- package/src/game/objects/layoutscene.js +549 -0
- package/src/game/objects/scene.js +175 -0
- package/src/game/objects/scene3d.js +118 -0
- package/src/game/objects/text.js +221 -0
- package/src/game/objects/wrapper.js +232 -0
- package/src/game/pipeline.js +243 -0
- package/src/game/ui/button.js +396 -0
- package/src/game/ui/cursor.js +93 -0
- package/src/game/ui/fps.js +91 -0
- package/src/game/ui/index.js +5 -0
- package/src/game/ui/togglebutton.js +93 -0
- package/src/game/ui/tooltip.js +249 -0
- package/src/index.js +25 -0
- package/src/io/events.js +20 -0
- package/src/io/index.js +86 -0
- package/src/io/input.js +70 -0
- package/src/io/keys.js +152 -0
- package/src/io/mouse.js +61 -0
- package/src/io/touch.js +39 -0
- package/src/logger/debugtab.js +138 -0
- package/src/logger/index.js +3 -0
- package/src/logger/loggable.js +47 -0
- package/src/logger/logger.js +113 -0
- package/src/math/complex.js +37 -0
- package/src/math/constants.js +1 -0
- package/src/math/fractal.js +1271 -0
- package/src/math/gr.js +201 -0
- package/src/math/heat.js +202 -0
- package/src/math/index.js +12 -0
- package/src/math/noise.js +433 -0
- package/src/math/orbital.js +191 -0
- package/src/math/patterns.js +1339 -0
- package/src/math/penrose.js +259 -0
- package/src/math/quantum.js +115 -0
- package/src/math/random.js +195 -0
- package/src/math/tensor.js +1009 -0
- package/src/mixins/anchor.js +131 -0
- package/src/mixins/draggable.js +72 -0
- package/src/mixins/index.js +2 -0
- package/src/motion/bezier.js +132 -0
- package/src/motion/bounce.js +58 -0
- package/src/motion/easing.js +349 -0
- package/src/motion/float.js +130 -0
- package/src/motion/follow.js +125 -0
- package/src/motion/hop.js +52 -0
- package/src/motion/index.js +82 -0
- package/src/motion/motion.js +1124 -0
- package/src/motion/orbit.js +49 -0
- package/src/motion/oscillate.js +39 -0
- package/src/motion/parabolic.js +141 -0
- package/src/motion/patrol.js +147 -0
- package/src/motion/pendulum.js +48 -0
- package/src/motion/pulse.js +88 -0
- package/src/motion/shake.js +83 -0
- package/src/motion/spiral.js +144 -0
- package/src/motion/spring.js +150 -0
- package/src/motion/swing.js +47 -0
- package/src/motion/tween.js +92 -0
- package/src/motion/tweenetik.js +139 -0
- package/src/motion/waypoint.js +210 -0
- package/src/painter/index.js +8 -0
- package/src/painter/painter.colors.js +331 -0
- package/src/painter/painter.effects.js +230 -0
- package/src/painter/painter.img.js +229 -0
- package/src/painter/painter.js +295 -0
- package/src/painter/painter.lines.js +189 -0
- package/src/painter/painter.opacity.js +41 -0
- package/src/painter/painter.shapes.js +277 -0
- package/src/painter/painter.text.js +273 -0
- package/src/particle/emitter.js +124 -0
- package/src/particle/index.js +11 -0
- package/src/particle/particle-system.js +322 -0
- package/src/particle/particle.js +71 -0
- package/src/particle/updaters.js +170 -0
- package/src/shapes/arc.js +43 -0
- package/src/shapes/arrow.js +33 -0
- package/src/shapes/bezier.js +42 -0
- package/src/shapes/circle.js +62 -0
- package/src/shapes/clouds.js +56 -0
- package/src/shapes/cone.js +219 -0
- package/src/shapes/cross.js +70 -0
- package/src/shapes/cube.js +244 -0
- package/src/shapes/cylinder.js +254 -0
- package/src/shapes/diamond.js +48 -0
- package/src/shapes/euclidian.js +111 -0
- package/src/shapes/figure.js +115 -0
- package/src/shapes/geometry.js +220 -0
- package/src/shapes/group.js +375 -0
- package/src/shapes/heart.js +42 -0
- package/src/shapes/hexagon.js +26 -0
- package/src/shapes/image.js +192 -0
- package/src/shapes/index.js +111 -0
- package/src/shapes/line.js +29 -0
- package/src/shapes/pattern.js +90 -0
- package/src/shapes/pin.js +44 -0
- package/src/shapes/poly.js +31 -0
- package/src/shapes/prism.js +226 -0
- package/src/shapes/rect.js +35 -0
- package/src/shapes/renderable.js +333 -0
- package/src/shapes/ring.js +26 -0
- package/src/shapes/roundrect.js +95 -0
- package/src/shapes/shape.js +117 -0
- package/src/shapes/slice.js +26 -0
- package/src/shapes/sphere.js +314 -0
- package/src/shapes/sphere3d.js +537 -0
- package/src/shapes/square.js +15 -0
- package/src/shapes/star.js +99 -0
- package/src/shapes/svg.js +408 -0
- package/src/shapes/text.js +553 -0
- package/src/shapes/traceable.js +83 -0
- package/src/shapes/transform.js +357 -0
- package/src/shapes/transformable.js +172 -0
- package/src/shapes/triangle.js +26 -0
- package/src/sound/index.js +17 -0
- package/src/sound/sound.js +473 -0
- package/src/sound/synth.analyzer.js +149 -0
- package/src/sound/synth.effects.js +207 -0
- package/src/sound/synth.envelope.js +59 -0
- package/src/sound/synth.js +229 -0
- package/src/sound/synth.musical.js +160 -0
- package/src/sound/synth.noise.js +85 -0
- package/src/sound/synth.oscillators.js +293 -0
- package/src/state/index.js +10 -0
- package/src/state/state-machine.js +371 -0
- package/src/util/camera3d.js +438 -0
- package/src/util/index.js +6 -0
- package/src/util/isometric-camera.js +235 -0
- package/src/util/layout.js +317 -0
- package/src/util/position.js +147 -0
- package/src/util/tasks.js +47 -0
- package/src/util/zindex.js +287 -0
- package/src/webgl/index.js +9 -0
- package/src/webgl/shaders/sphere-shaders.js +994 -0
- package/src/webgl/webgl-renderer.js +388 -0
- package/tde.png +0 -0
- package/test/math/orbital.test.js +61 -0
- package/test/math/tensor.test.js +114 -0
- package/test/particle/emitter.test.js +204 -0
- package/test/particle/particle-system.test.js +310 -0
- package/test/particle/particle.test.js +116 -0
- package/test/particle/updaters.test.js +386 -0
- package/test/setup.js +120 -0
- package/test/shapes/euclidian.test.js +44 -0
- package/test/shapes/geometry.test.js +86 -0
- package/test/shapes/group.test.js +86 -0
- package/test/shapes/rectangle.test.js +64 -0
- package/test/shapes/transform.test.js +379 -0
- package/test/util/camera3d.test.js +428 -0
- package/test/util/scene3d.test.js +352 -0
- package/types/collision.d.ts +249 -0
- package/types/common.d.ts +155 -0
- package/types/game.d.ts +497 -0
- package/types/index.d.ts +309 -0
- package/types/io.d.ts +188 -0
- package/types/logger.d.ts +127 -0
- package/types/math.d.ts +268 -0
- package/types/mixins.d.ts +92 -0
- package/types/motion.d.ts +678 -0
- package/types/painter.d.ts +378 -0
- package/types/shapes.d.ts +864 -0
- package/types/sound.d.ts +672 -0
- package/types/state.d.ts +251 -0
- package/types/util.d.ts +253 -0
- package/vite.config.js +50 -0
- package/vitest.config.js +13 -0
package/types/math.d.ts
ADDED
|
@@ -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;
|