@guinetik/gcanvas 1.0.4 → 2.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 (261) hide show
  1. package/dist/CNAME +1 -0
  2. package/dist/aizawa.html +27 -0
  3. package/dist/animations.html +31 -0
  4. package/dist/basic.html +38 -0
  5. package/dist/baskara.html +31 -0
  6. package/dist/bezier.html +35 -0
  7. package/dist/beziersignature.html +29 -0
  8. package/dist/blackhole.html +28 -0
  9. package/dist/blob.html +35 -0
  10. package/dist/clifford.html +25 -0
  11. package/dist/cmb.html +24 -0
  12. package/dist/coordinates.html +698 -0
  13. package/dist/cube3d.html +23 -0
  14. package/dist/dadras.html +26 -0
  15. package/dist/dejong.html +25 -0
  16. package/dist/demos.css +303 -0
  17. package/dist/dino.html +42 -0
  18. package/dist/easing.html +28 -0
  19. package/dist/events.html +195 -0
  20. package/dist/fluent.html +647 -0
  21. package/dist/fluid-simple.html +22 -0
  22. package/dist/fluid.html +37 -0
  23. package/dist/fractals.html +36 -0
  24. package/dist/gameobjects.html +626 -0
  25. package/dist/gcanvas.es.js +14368 -9093
  26. package/dist/gcanvas.es.min.js +1 -1
  27. package/dist/gcanvas.umd.js +1 -1
  28. package/dist/gcanvas.umd.min.js +1 -1
  29. package/dist/genart.html +26 -0
  30. package/dist/gendream.html +26 -0
  31. package/dist/group.html +36 -0
  32. package/dist/halvorsen.html +27 -0
  33. package/dist/home.html +587 -0
  34. package/dist/hyperbolic001.html +23 -0
  35. package/dist/hyperbolic002.html +23 -0
  36. package/dist/hyperbolic003.html +23 -0
  37. package/dist/hyperbolic004.html +23 -0
  38. package/dist/hyperbolic005.html +22 -0
  39. package/dist/index.html +446 -0
  40. package/dist/isometric.html +34 -0
  41. package/dist/js/aizawa.js +425 -0
  42. package/dist/js/animations.js +452 -0
  43. package/dist/js/basic.js +204 -0
  44. package/dist/js/baskara.js +751 -0
  45. package/dist/js/bezier.js +692 -0
  46. package/dist/js/beziersignature.js +241 -0
  47. package/dist/js/blackhole/accretiondisk.obj.js +379 -0
  48. package/dist/js/blackhole/blackhole.obj.js +318 -0
  49. package/dist/js/blackhole/index.js +409 -0
  50. package/dist/js/blackhole/particle.js +56 -0
  51. package/dist/js/blackhole/starfield.obj.js +218 -0
  52. package/dist/js/blob.js +2276 -0
  53. package/dist/js/clifford.js +236 -0
  54. package/dist/js/cmb.js +594 -0
  55. package/dist/js/coordinates.js +840 -0
  56. package/dist/js/cube3d.js +789 -0
  57. package/dist/js/dadras.js +405 -0
  58. package/dist/js/dejong.js +257 -0
  59. package/dist/js/dino.js +1420 -0
  60. package/dist/js/easing.js +477 -0
  61. package/dist/js/fluent.js +183 -0
  62. package/dist/js/fluid-simple.js +253 -0
  63. package/dist/js/fluid.js +527 -0
  64. package/dist/js/fractals.js +932 -0
  65. package/dist/js/fractalworker.js +93 -0
  66. package/dist/js/gameobjects.js +176 -0
  67. package/dist/js/genart.js +268 -0
  68. package/dist/js/gendream.js +209 -0
  69. package/dist/js/group.js +140 -0
  70. package/dist/js/halvorsen.js +405 -0
  71. package/dist/js/hyperbolic001.js +310 -0
  72. package/dist/js/hyperbolic002.js +388 -0
  73. package/dist/js/hyperbolic003.js +319 -0
  74. package/dist/js/hyperbolic004.js +345 -0
  75. package/dist/js/hyperbolic005.js +340 -0
  76. package/dist/js/info-toggle.js +25 -0
  77. package/dist/js/isometric.js +851 -0
  78. package/dist/js/kerr.js +1547 -0
  79. package/dist/js/lavalamp.js +590 -0
  80. package/dist/js/layout.js +354 -0
  81. package/dist/js/lorenz.js +425 -0
  82. package/dist/js/mondrian.js +285 -0
  83. package/dist/js/opacity.js +275 -0
  84. package/dist/js/painter.js +484 -0
  85. package/dist/js/particles-showcase.js +514 -0
  86. package/dist/js/particles.js +299 -0
  87. package/dist/js/patterns.js +397 -0
  88. package/dist/js/penrose/artifact.js +69 -0
  89. package/dist/js/penrose/blackhole.js +121 -0
  90. package/dist/js/penrose/constants.js +73 -0
  91. package/dist/js/penrose/game.js +943 -0
  92. package/dist/js/penrose/lore.js +278 -0
  93. package/dist/js/penrose/penrosescene.js +892 -0
  94. package/dist/js/penrose/ship.js +216 -0
  95. package/dist/js/penrose/sounds.js +211 -0
  96. package/dist/js/penrose/voidparticle.js +55 -0
  97. package/dist/js/penrose/voidscene.js +258 -0
  98. package/dist/js/penrose/voidship.js +144 -0
  99. package/dist/js/penrose/wormhole.js +46 -0
  100. package/dist/js/pipeline.js +555 -0
  101. package/dist/js/plane3d.js +256 -0
  102. package/dist/js/platformer.js +1579 -0
  103. package/dist/js/rossler.js +480 -0
  104. package/dist/js/scene.js +304 -0
  105. package/dist/js/scenes.js +320 -0
  106. package/dist/js/schrodinger.js +706 -0
  107. package/dist/js/schwarzschild.js +1015 -0
  108. package/dist/js/shapes.js +628 -0
  109. package/dist/js/space/alien.js +171 -0
  110. package/dist/js/space/boom.js +98 -0
  111. package/dist/js/space/boss.js +353 -0
  112. package/dist/js/space/buff.js +73 -0
  113. package/dist/js/space/bullet.js +102 -0
  114. package/dist/js/space/constants.js +85 -0
  115. package/dist/js/space/game.js +1884 -0
  116. package/dist/js/space/hud.js +112 -0
  117. package/dist/js/space/laserbeam.js +179 -0
  118. package/dist/js/space/lightning.js +277 -0
  119. package/dist/js/space/minion.js +192 -0
  120. package/dist/js/space/missile.js +212 -0
  121. package/dist/js/space/player.js +430 -0
  122. package/dist/js/space/powerup.js +90 -0
  123. package/dist/js/space/starfield.js +58 -0
  124. package/dist/js/space/starpower.js +90 -0
  125. package/dist/js/spacetime.js +559 -0
  126. package/dist/js/sphere3d.js +229 -0
  127. package/dist/js/sprite.js +473 -0
  128. package/dist/js/starfaux/config.js +118 -0
  129. package/dist/js/starfaux/enemy.js +353 -0
  130. package/dist/js/starfaux/hud.js +78 -0
  131. package/dist/js/starfaux/index.js +482 -0
  132. package/dist/js/starfaux/laser.js +182 -0
  133. package/dist/js/starfaux/player.js +468 -0
  134. package/dist/js/starfaux/terrain.js +560 -0
  135. package/dist/js/study001.js +275 -0
  136. package/dist/js/study002.js +366 -0
  137. package/dist/js/study003.js +331 -0
  138. package/dist/js/study004.js +389 -0
  139. package/dist/js/study005.js +209 -0
  140. package/dist/js/study006.js +194 -0
  141. package/dist/js/study007.js +192 -0
  142. package/dist/js/study008.js +413 -0
  143. package/dist/js/svgtween.js +204 -0
  144. package/dist/js/tde/accretiondisk.js +471 -0
  145. package/dist/js/tde/blackhole.js +219 -0
  146. package/dist/js/tde/blackholescene.js +209 -0
  147. package/dist/js/tde/config.js +59 -0
  148. package/dist/js/tde/index.js +820 -0
  149. package/dist/js/tde/jets.js +290 -0
  150. package/dist/js/tde/lensedstarfield.js +154 -0
  151. package/dist/js/tde/tdestar.js +297 -0
  152. package/dist/js/tde/tidalstream.js +372 -0
  153. package/dist/js/tde_old/blackhole.obj.js +354 -0
  154. package/dist/js/tde_old/debris.obj.js +791 -0
  155. package/dist/js/tde_old/flare.obj.js +239 -0
  156. package/dist/js/tde_old/index.js +448 -0
  157. package/dist/js/tde_old/star.obj.js +812 -0
  158. package/dist/js/tetris/config.js +157 -0
  159. package/dist/js/tetris/grid.js +286 -0
  160. package/dist/js/tetris/index.js +1195 -0
  161. package/dist/js/tetris/renderer.js +634 -0
  162. package/dist/js/tetris/tetrominos.js +280 -0
  163. package/dist/js/thomas.js +394 -0
  164. package/dist/js/tiles.js +312 -0
  165. package/dist/js/tweendemo.js +79 -0
  166. package/dist/js/visibility.js +102 -0
  167. package/dist/kerr.html +28 -0
  168. package/dist/lavalamp.html +27 -0
  169. package/dist/layouts.html +37 -0
  170. package/dist/logo.svg +4 -0
  171. package/dist/loop.html +84 -0
  172. package/dist/lorenz.html +27 -0
  173. package/dist/mondrian.html +32 -0
  174. package/dist/og_image.png +0 -0
  175. package/dist/opacity.html +36 -0
  176. package/dist/painter.html +39 -0
  177. package/dist/particles-showcase.html +28 -0
  178. package/dist/particles.html +24 -0
  179. package/dist/patterns.html +33 -0
  180. package/dist/penrose-game.html +31 -0
  181. package/dist/pipeline.html +737 -0
  182. package/dist/plane3d.html +24 -0
  183. package/dist/platformer.html +43 -0
  184. package/dist/rossler.html +27 -0
  185. package/dist/scene-interactivity-test.html +220 -0
  186. package/dist/scene.html +33 -0
  187. package/dist/scenes.html +96 -0
  188. package/dist/schrodinger.html +27 -0
  189. package/dist/schwarzschild.html +27 -0
  190. package/dist/shapes.html +16 -0
  191. package/dist/space.html +85 -0
  192. package/dist/spacetime.html +27 -0
  193. package/dist/sphere3d.html +24 -0
  194. package/dist/sprite.html +18 -0
  195. package/dist/starfaux.html +22 -0
  196. package/dist/study001.html +23 -0
  197. package/dist/study002.html +23 -0
  198. package/dist/study003.html +23 -0
  199. package/dist/study004.html +23 -0
  200. package/dist/study005.html +22 -0
  201. package/dist/study006.html +24 -0
  202. package/dist/study007.html +24 -0
  203. package/dist/study008.html +22 -0
  204. package/dist/svgtween.html +29 -0
  205. package/dist/tde.html +28 -0
  206. package/dist/tetris3d.html +25 -0
  207. package/dist/thomas.html +27 -0
  208. package/dist/tiles.html +28 -0
  209. package/dist/transforms.html +400 -0
  210. package/dist/tween.html +45 -0
  211. package/dist/visibility.html +33 -0
  212. package/package.json +1 -1
  213. package/readme.md +30 -22
  214. package/src/game/objects/go.js +7 -0
  215. package/src/game/objects/index.js +2 -0
  216. package/src/game/objects/isometric-scene.js +53 -3
  217. package/src/game/objects/layoutscene.js +57 -0
  218. package/src/game/objects/mask.js +241 -0
  219. package/src/game/objects/scene.js +19 -0
  220. package/src/game/objects/wrapper.js +14 -2
  221. package/src/game/pipeline.js +17 -0
  222. package/src/game/ui/button.js +101 -16
  223. package/src/game/ui/theme.js +0 -6
  224. package/src/game/ui/togglebutton.js +25 -14
  225. package/src/game/ui/tooltip.js +12 -4
  226. package/src/index.js +3 -0
  227. package/src/io/gesture.js +409 -0
  228. package/src/io/index.js +4 -1
  229. package/src/io/keys.js +9 -1
  230. package/src/io/screen.js +476 -0
  231. package/src/math/attractors.js +664 -0
  232. package/src/math/heat.js +106 -0
  233. package/src/math/index.js +1 -0
  234. package/src/mixins/draggable.js +15 -19
  235. package/src/painter/painter.shapes.js +11 -5
  236. package/src/particle/particle-system.js +165 -1
  237. package/src/physics/index.js +26 -0
  238. package/src/physics/physics-updaters.js +333 -0
  239. package/src/physics/physics.js +375 -0
  240. package/src/shapes/image.js +5 -5
  241. package/src/shapes/index.js +2 -0
  242. package/src/shapes/parallelogram.js +147 -0
  243. package/src/shapes/righttriangle.js +115 -0
  244. package/src/shapes/svg.js +281 -100
  245. package/src/shapes/text.js +22 -6
  246. package/src/shapes/transformable.js +5 -0
  247. package/src/sound/effects.js +807 -0
  248. package/src/sound/index.js +13 -0
  249. package/src/webgl/index.js +7 -0
  250. package/src/webgl/shaders/clifford-point-shaders.js +131 -0
  251. package/src/webgl/shaders/dejong-point-shaders.js +131 -0
  252. package/src/webgl/shaders/point-sprite-shaders.js +152 -0
  253. package/src/webgl/webgl-clifford-renderer.js +477 -0
  254. package/src/webgl/webgl-dejong-renderer.js +472 -0
  255. package/src/webgl/webgl-line-renderer.js +391 -0
  256. package/src/webgl/webgl-particle-renderer.js +410 -0
  257. package/types/index.d.ts +30 -2
  258. package/types/io.d.ts +217 -0
  259. package/types/physics.d.ts +299 -0
  260. package/types/shapes.d.ts +8 -0
  261. package/types/webgl.d.ts +188 -109
@@ -147,23 +147,23 @@ export class ImageShape extends Shape {
147
147
  // Skip drawing if not visible or no bitmap available
148
148
  if (!this.visible) return;
149
149
  if (!this._bitmap && !this._buffer) return;
150
-
150
+
151
151
  super.draw();
152
-
152
+
153
153
  // For ImageData, we must use the buffer
154
154
  let source = (this._bitmap instanceof ImageData) ? this._buffer : this._bitmap;
155
-
155
+
156
156
  if (!source || (this._bitmap instanceof ImageData && !this._buffer)) {
157
157
  // If we need a buffer but don't have one yet, try to create it
158
158
  if (this._bitmap instanceof ImageData) {
159
159
  this.buffer(this._bitmap);
160
160
  source = this._buffer;
161
161
  }
162
-
162
+
163
163
  // If we still don't have a valid source, skip drawing
164
164
  if (!source) return;
165
165
  }
166
-
166
+
167
167
  // Delegates all transform/alpha/smoothing handling to Painter.img.draw
168
168
  Painter.img.draw(source, 0, 0, {
169
169
  width: this.width,
@@ -95,6 +95,8 @@ export { Cylinder } from "./cylinder.js";
95
95
  export { Diamond } from "./diamond.js";
96
96
  export { Line } from "./line.js";
97
97
  export { Triangle } from "./triangle.js";
98
+ export { RightTriangle } from "./righttriangle.js";
99
+ export { Parallelogram } from "./parallelogram.js";
98
100
  export { Star } from "./star.js";
99
101
  export { Sphere } from "./sphere.js";
100
102
  export { Sphere3D } from "./sphere3d.js";
@@ -0,0 +1,147 @@
1
+ import { Shape } from "./shape.js";
2
+ import { Painter } from "../painter/painter.js";
3
+
4
+ /**
5
+ * Parallelogram
6
+ * -------------
7
+ *
8
+ * A four-sided shape with opposite sides parallel. The shape is defined by
9
+ * its width, height, and slant offset.
10
+ *
11
+ * ### Geometry
12
+ *
13
+ * ```
14
+ * slant
15
+ * ├───┤
16
+ * ●───────────● ─┬─
17
+ * / / │ height
18
+ * ●───────────● ─┴─
19
+ * ├───────────┤
20
+ * width
21
+ * ```
22
+ *
23
+ * - `width`: Length of the top and bottom edges
24
+ * - `height`: Perpendicular distance between top and bottom
25
+ * - `slant`: Horizontal offset of top edge relative to bottom (positive = right, negative = left)
26
+ *
27
+ * ### Positioning
28
+ *
29
+ * The shape is centered at its geometric center (centroid).
30
+ *
31
+ * @extends Shape
32
+ */
33
+ export class Parallelogram extends Shape {
34
+ /**
35
+ * @param {Object} [options={}] - Shape options
36
+ * @param {number} [options.width=100] - Width of the parallel edges
37
+ * @param {number} [options.height=50] - Height (perpendicular distance)
38
+ * @param {number} [options.slant] - Horizontal offset of top edge (defaults to height for 45° slant)
39
+ * @param {boolean} [options.flipX=false] - Mirror horizontally (slant in opposite direction)
40
+ */
41
+ constructor(options = {}) {
42
+ super(options);
43
+ this._pgWidth = options.width ?? 100;
44
+ this._pgHeight = options.height ?? 50;
45
+ this._slant = options.slant ?? this._pgHeight; // Default 45° slant
46
+ this._flipX = options.flipX ?? false;
47
+ this._updateDimensions();
48
+ }
49
+
50
+ /** @type {number} Width of the parallel edges */
51
+ get pgWidth() {
52
+ return this._pgWidth;
53
+ }
54
+
55
+ set pgWidth(v) {
56
+ this._pgWidth = v;
57
+ this._updateDimensions();
58
+ this.invalidateCache();
59
+ }
60
+
61
+ /** @type {number} Height (perpendicular distance between edges) */
62
+ get pgHeight() {
63
+ return this._pgHeight;
64
+ }
65
+
66
+ set pgHeight(v) {
67
+ this._pgHeight = v;
68
+ this._updateDimensions();
69
+ this.invalidateCache();
70
+ }
71
+
72
+ /** @type {number} Horizontal offset of top edge */
73
+ get slant() {
74
+ return this._slant;
75
+ }
76
+
77
+ set slant(v) {
78
+ this._slant = v;
79
+ this._updateDimensions();
80
+ this.invalidateCache();
81
+ }
82
+
83
+ /** @type {boolean} Whether to mirror horizontally */
84
+ get flipX() {
85
+ return this._flipX;
86
+ }
87
+
88
+ set flipX(v) {
89
+ this._flipX = v;
90
+ this.invalidateCache();
91
+ }
92
+
93
+ _updateDimensions() {
94
+ // Bounding box includes the slant
95
+ this._width = this._pgWidth + Math.abs(this._slant);
96
+ this._height = this._pgHeight;
97
+ }
98
+
99
+ /**
100
+ * Get the vertices of the parallelogram, centered at origin.
101
+ * @returns {Array<{x: number, y: number}>}
102
+ */
103
+ getVertices() {
104
+ const w = this._pgWidth;
105
+ const h = this._pgHeight;
106
+ let slant = this._slant;
107
+
108
+ if (this._flipX) {
109
+ slant = -slant;
110
+ }
111
+
112
+ // Calculate total width for centering
113
+ const totalWidth = w + Math.abs(slant);
114
+ const offsetX = -totalWidth / 2 + (slant < 0 ? -slant : 0);
115
+
116
+ // Vertices: bottom-left, bottom-right, top-right, top-left
117
+ // Bottom edge at y = h/2, top edge at y = -h/2
118
+ return [
119
+ { x: offsetX, y: h / 2 }, // Bottom-left
120
+ { x: offsetX + w, y: h / 2 }, // Bottom-right
121
+ { x: offsetX + w + slant, y: -h / 2 }, // Top-right
122
+ { x: offsetX + slant, y: -h / 2 }, // Top-left
123
+ ];
124
+ }
125
+
126
+ draw() {
127
+ super.draw();
128
+ const vertices = this.getVertices();
129
+
130
+ Painter.shapes.polygon(
131
+ vertices,
132
+ this.color,
133
+ this.stroke,
134
+ this.lineWidth,
135
+ this.lineJoin
136
+ );
137
+ }
138
+
139
+ calculateBounds() {
140
+ return {
141
+ x: this.x,
142
+ y: this.y,
143
+ width: this._width,
144
+ height: this._height,
145
+ };
146
+ }
147
+ }
@@ -0,0 +1,115 @@
1
+ import { Shape } from "./shape.js";
2
+ import { Painter } from "../painter/painter.js";
3
+
4
+ /**
5
+ * RightTriangle
6
+ * -------------
7
+ *
8
+ * A right isoceles triangle shape, commonly used in tangram puzzles.
9
+ *
10
+ * The triangle has:
11
+ * - Two equal legs of length `leg`
12
+ * - A right angle (90°) at one corner
13
+ * - Hypotenuse = leg × √2
14
+ *
15
+ * ### Positioning
16
+ *
17
+ * The triangle is centered at its centroid (center of mass).
18
+ * Before rotation, the right angle points toward the bottom-left (-135° from center).
19
+ *
20
+ * ```
21
+ * ●────────● (leg, 0)
22
+ * /|
23
+ * / |
24
+ * / | centroid at (leg/3, leg/3)
25
+ * / |
26
+ * ●────┘ right angle at origin
27
+ * (0, leg)
28
+ * ```
29
+ *
30
+ * ### Rotation Reference
31
+ *
32
+ * To orient the right angle toward a specific direction:
33
+ * - Right angle pointing RIGHT: rotation = 0°
34
+ * - Right angle pointing DOWN: rotation = 90°
35
+ * - Right angle pointing LEFT: rotation = 180°
36
+ * - Right angle pointing UP: rotation = 270°
37
+ *
38
+ * Add 135° to these values since the default right angle is at -135° from centroid.
39
+ *
40
+ * @extends Shape
41
+ */
42
+ export class RightTriangle extends Shape {
43
+ /**
44
+ * @param {number} leg - Length of the two equal legs
45
+ * @param {Object} [options={}] - Shape options (x, y, rotation, color, stroke, etc.)
46
+ */
47
+ constructor(leg = 50, options = {}) {
48
+ super(options);
49
+ this._leg = leg;
50
+ this._updateDimensions();
51
+ }
52
+
53
+ /** @type {number} Length of the equal legs */
54
+ get leg() {
55
+ return this._leg;
56
+ }
57
+
58
+ set leg(v) {
59
+ this._leg = v;
60
+ this._updateDimensions();
61
+ this.invalidateCache();
62
+ }
63
+
64
+ /** @type {number} Length of the hypotenuse (leg × √2) */
65
+ get hypotenuse() {
66
+ return this._leg * Math.SQRT2;
67
+ }
68
+
69
+ _updateDimensions() {
70
+ // Bounding box of the centered triangle
71
+ this._width = this._leg;
72
+ this._height = this._leg;
73
+ }
74
+
75
+ /**
76
+ * Get the vertices of the triangle, centered at origin.
77
+ * Right angle is at the adjusted (0,0) before centering.
78
+ * @returns {Array<{x: number, y: number}>}
79
+ */
80
+ getVertices() {
81
+ const leg = this._leg;
82
+ // Original vertices: right angle at (0,0), legs along +x and +y
83
+ // Centroid at (leg/3, leg/3)
84
+ const cx = leg / 3;
85
+ const cy = leg / 3;
86
+
87
+ return [
88
+ { x: -cx, y: -cy }, // Right angle corner
89
+ { x: leg - cx, y: -cy }, // End of horizontal leg
90
+ { x: -cx, y: leg - cy }, // End of vertical leg
91
+ ];
92
+ }
93
+
94
+ draw() {
95
+ super.draw();
96
+ const vertices = this.getVertices();
97
+
98
+ Painter.shapes.polygon(
99
+ vertices,
100
+ this.color,
101
+ this.stroke,
102
+ this.lineWidth,
103
+ this.lineJoin
104
+ );
105
+ }
106
+
107
+ calculateBounds() {
108
+ return {
109
+ x: this.x,
110
+ y: this.y,
111
+ width: this._width,
112
+ height: this._height,
113
+ };
114
+ }
115
+ }