@guinetik/gcanvas 1.0.4 → 1.0.5

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 (193) hide show
  1. package/dist/CNAME +1 -0
  2. package/dist/animations.html +31 -0
  3. package/dist/basic.html +38 -0
  4. package/dist/baskara.html +31 -0
  5. package/dist/bezier.html +35 -0
  6. package/dist/beziersignature.html +29 -0
  7. package/dist/blackhole.html +28 -0
  8. package/dist/blob.html +35 -0
  9. package/dist/coordinates.html +698 -0
  10. package/dist/cube3d.html +23 -0
  11. package/dist/demos.css +303 -0
  12. package/dist/dino.html +42 -0
  13. package/dist/easing.html +28 -0
  14. package/dist/events.html +195 -0
  15. package/dist/fluent.html +647 -0
  16. package/dist/fluid-simple.html +22 -0
  17. package/dist/fluid.html +37 -0
  18. package/dist/fractals.html +36 -0
  19. package/dist/gameobjects.html +626 -0
  20. package/dist/gcanvas.es.js +517 -0
  21. package/dist/gcanvas.es.min.js +1 -1
  22. package/dist/gcanvas.umd.js +1 -1
  23. package/dist/gcanvas.umd.min.js +1 -1
  24. package/dist/genart.html +26 -0
  25. package/dist/gendream.html +26 -0
  26. package/dist/group.html +36 -0
  27. package/dist/home.html +587 -0
  28. package/dist/hyperbolic001.html +23 -0
  29. package/dist/hyperbolic002.html +23 -0
  30. package/dist/hyperbolic003.html +23 -0
  31. package/dist/hyperbolic004.html +23 -0
  32. package/dist/hyperbolic005.html +22 -0
  33. package/dist/index.html +398 -0
  34. package/dist/isometric.html +34 -0
  35. package/dist/js/animations.js +452 -0
  36. package/dist/js/basic.js +204 -0
  37. package/dist/js/baskara.js +751 -0
  38. package/dist/js/bezier.js +692 -0
  39. package/dist/js/beziersignature.js +241 -0
  40. package/dist/js/blackhole/accretiondisk.obj.js +379 -0
  41. package/dist/js/blackhole/blackhole.obj.js +318 -0
  42. package/dist/js/blackhole/index.js +409 -0
  43. package/dist/js/blackhole/particle.js +56 -0
  44. package/dist/js/blackhole/starfield.obj.js +218 -0
  45. package/dist/js/blob.js +2276 -0
  46. package/dist/js/coordinates.js +840 -0
  47. package/dist/js/cube3d.js +789 -0
  48. package/dist/js/dino.js +1420 -0
  49. package/dist/js/easing.js +477 -0
  50. package/dist/js/fluent.js +183 -0
  51. package/dist/js/fluid-simple.js +253 -0
  52. package/dist/js/fluid.js +527 -0
  53. package/dist/js/fractals.js +932 -0
  54. package/dist/js/fractalworker.js +93 -0
  55. package/dist/js/gameobjects.js +176 -0
  56. package/dist/js/genart.js +268 -0
  57. package/dist/js/gendream.js +209 -0
  58. package/dist/js/group.js +140 -0
  59. package/dist/js/hyperbolic001.js +310 -0
  60. package/dist/js/hyperbolic002.js +388 -0
  61. package/dist/js/hyperbolic003.js +319 -0
  62. package/dist/js/hyperbolic004.js +345 -0
  63. package/dist/js/hyperbolic005.js +340 -0
  64. package/dist/js/info-toggle.js +25 -0
  65. package/dist/js/isometric.js +863 -0
  66. package/dist/js/kerr.js +1547 -0
  67. package/dist/js/lavalamp.js +590 -0
  68. package/dist/js/layout.js +354 -0
  69. package/dist/js/mondrian.js +285 -0
  70. package/dist/js/opacity.js +275 -0
  71. package/dist/js/painter.js +484 -0
  72. package/dist/js/particles-showcase.js +514 -0
  73. package/dist/js/particles.js +299 -0
  74. package/dist/js/patterns.js +397 -0
  75. package/dist/js/penrose/artifact.js +69 -0
  76. package/dist/js/penrose/blackhole.js +121 -0
  77. package/dist/js/penrose/constants.js +73 -0
  78. package/dist/js/penrose/game.js +943 -0
  79. package/dist/js/penrose/lore.js +278 -0
  80. package/dist/js/penrose/penrosescene.js +892 -0
  81. package/dist/js/penrose/ship.js +216 -0
  82. package/dist/js/penrose/sounds.js +211 -0
  83. package/dist/js/penrose/voidparticle.js +55 -0
  84. package/dist/js/penrose/voidscene.js +258 -0
  85. package/dist/js/penrose/voidship.js +144 -0
  86. package/dist/js/penrose/wormhole.js +46 -0
  87. package/dist/js/pipeline.js +555 -0
  88. package/dist/js/plane3d.js +256 -0
  89. package/dist/js/platformer.js +1579 -0
  90. package/dist/js/scene.js +304 -0
  91. package/dist/js/scenes.js +320 -0
  92. package/dist/js/schrodinger.js +410 -0
  93. package/dist/js/schwarzschild.js +1015 -0
  94. package/dist/js/shapes.js +628 -0
  95. package/dist/js/space/alien.js +171 -0
  96. package/dist/js/space/boom.js +98 -0
  97. package/dist/js/space/boss.js +353 -0
  98. package/dist/js/space/buff.js +73 -0
  99. package/dist/js/space/bullet.js +102 -0
  100. package/dist/js/space/constants.js +85 -0
  101. package/dist/js/space/game.js +1884 -0
  102. package/dist/js/space/hud.js +112 -0
  103. package/dist/js/space/laserbeam.js +179 -0
  104. package/dist/js/space/lightning.js +277 -0
  105. package/dist/js/space/minion.js +192 -0
  106. package/dist/js/space/missile.js +212 -0
  107. package/dist/js/space/player.js +430 -0
  108. package/dist/js/space/powerup.js +90 -0
  109. package/dist/js/space/starfield.js +58 -0
  110. package/dist/js/space/starpower.js +90 -0
  111. package/dist/js/spacetime.js +559 -0
  112. package/dist/js/sphere3d.js +229 -0
  113. package/dist/js/sprite.js +473 -0
  114. package/dist/js/starfaux/config.js +118 -0
  115. package/dist/js/starfaux/enemy.js +353 -0
  116. package/dist/js/starfaux/hud.js +78 -0
  117. package/dist/js/starfaux/index.js +482 -0
  118. package/dist/js/starfaux/laser.js +182 -0
  119. package/dist/js/starfaux/player.js +468 -0
  120. package/dist/js/starfaux/terrain.js +560 -0
  121. package/dist/js/study001.js +275 -0
  122. package/dist/js/study002.js +366 -0
  123. package/dist/js/study003.js +331 -0
  124. package/dist/js/study004.js +389 -0
  125. package/dist/js/study005.js +209 -0
  126. package/dist/js/study006.js +194 -0
  127. package/dist/js/study007.js +192 -0
  128. package/dist/js/study008.js +413 -0
  129. package/dist/js/svgtween.js +204 -0
  130. package/dist/js/tde/accretiondisk.js +471 -0
  131. package/dist/js/tde/blackhole.js +219 -0
  132. package/dist/js/tde/blackholescene.js +209 -0
  133. package/dist/js/tde/config.js +59 -0
  134. package/dist/js/tde/index.js +820 -0
  135. package/dist/js/tde/jets.js +290 -0
  136. package/dist/js/tde/lensedstarfield.js +154 -0
  137. package/dist/js/tde/tdestar.js +297 -0
  138. package/dist/js/tde/tidalstream.js +372 -0
  139. package/dist/js/tde_old/blackhole.obj.js +354 -0
  140. package/dist/js/tde_old/debris.obj.js +791 -0
  141. package/dist/js/tde_old/flare.obj.js +239 -0
  142. package/dist/js/tde_old/index.js +448 -0
  143. package/dist/js/tde_old/star.obj.js +812 -0
  144. package/dist/js/tetris/config.js +157 -0
  145. package/dist/js/tetris/grid.js +286 -0
  146. package/dist/js/tetris/index.js +1195 -0
  147. package/dist/js/tetris/renderer.js +634 -0
  148. package/dist/js/tetris/tetrominos.js +280 -0
  149. package/dist/js/tiles.js +312 -0
  150. package/dist/js/tweendemo.js +79 -0
  151. package/dist/js/visibility.js +102 -0
  152. package/dist/kerr.html +28 -0
  153. package/dist/lavalamp.html +27 -0
  154. package/dist/layouts.html +37 -0
  155. package/dist/logo.svg +4 -0
  156. package/dist/loop.html +84 -0
  157. package/dist/mondrian.html +32 -0
  158. package/dist/og_image.png +0 -0
  159. package/dist/opacity.html +36 -0
  160. package/dist/painter.html +39 -0
  161. package/dist/particles-showcase.html +28 -0
  162. package/dist/particles.html +24 -0
  163. package/dist/patterns.html +33 -0
  164. package/dist/penrose-game.html +31 -0
  165. package/dist/pipeline.html +737 -0
  166. package/dist/plane3d.html +24 -0
  167. package/dist/platformer.html +43 -0
  168. package/dist/scene.html +33 -0
  169. package/dist/scenes.html +96 -0
  170. package/dist/schrodinger.html +27 -0
  171. package/dist/schwarzschild.html +27 -0
  172. package/dist/shapes.html +16 -0
  173. package/dist/space.html +85 -0
  174. package/dist/spacetime.html +27 -0
  175. package/dist/sphere3d.html +24 -0
  176. package/dist/sprite.html +18 -0
  177. package/dist/starfaux.html +22 -0
  178. package/dist/study001.html +23 -0
  179. package/dist/study002.html +23 -0
  180. package/dist/study003.html +23 -0
  181. package/dist/study004.html +23 -0
  182. package/dist/study005.html +22 -0
  183. package/dist/study006.html +24 -0
  184. package/dist/study007.html +24 -0
  185. package/dist/study008.html +22 -0
  186. package/dist/svgtween.html +29 -0
  187. package/dist/tde.html +28 -0
  188. package/dist/tetris3d.html +25 -0
  189. package/dist/tiles.html +28 -0
  190. package/dist/transforms.html +400 -0
  191. package/dist/tween.html +45 -0
  192. package/dist/visibility.html +33 -0
  193. package/package.json +1 -1
@@ -0,0 +1,256 @@
1
+ import {
2
+ Game,
3
+ Plane3D,
4
+ FPSCounter,
5
+ } from "/gcanvas.es.min.js";
6
+ import { Camera3D } from "/gcanvas.es.min.js";
7
+
8
+ /**
9
+ * Configuration for the Plane3D showcase demo
10
+ * Sizes are calculated dynamically based on screen size
11
+ */
12
+ const CONFIG = {
13
+ // Base sizes (will be scaled)
14
+ basePlaneWidth: 0.12, // fraction of min(width, height)
15
+ basePlaneHeight: 0.09, // fraction of min(width, height)
16
+ baseSpacing: 0.18, // fraction of width
17
+
18
+ camera: {
19
+ perspective: 800,
20
+ rotationX: 0.3,
21
+ rotationY: -0.4,
22
+ inertia: true,
23
+ friction: 0.95,
24
+ },
25
+
26
+ selfRotation: {
27
+ speed: 0.8, // radians per second
28
+ },
29
+
30
+ solidPlane: {
31
+ color: "#4A90D9",
32
+ },
33
+
34
+ gradientPlane: {
35
+ color1: [1.0, 0.2, 0.4],
36
+ color2: [0.2, 0.4, 1.0],
37
+ angle: Math.PI / 4,
38
+ },
39
+
40
+ gridPlane: {
41
+ lineColor: [0.2, 0.9, 0.4],
42
+ backgroundColor: [0.1, 0.1, 0.15],
43
+ gridSize: 8.0,
44
+ lineWidth: 0.06,
45
+ },
46
+ };
47
+
48
+ /**
49
+ * PlaneData - Holds plane and its world position
50
+ */
51
+ class PlaneData {
52
+ constructor(plane, worldX, worldY, worldZ, label) {
53
+ this.plane = plane;
54
+ this.worldX = worldX;
55
+ this.worldY = worldY;
56
+ this.worldZ = worldZ;
57
+ this.label = label;
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Plane3DDemo - Showcases different Plane3D rendering modes
63
+ */
64
+ class Plane3DDemo extends Game {
65
+ constructor(canvas) {
66
+ super(canvas);
67
+ this.backgroundColor = "#000000";
68
+ this.enableFluidSize();
69
+ }
70
+
71
+ init() {
72
+ super.init();
73
+
74
+ // Create camera with mouse controls
75
+ this.camera = new Camera3D({
76
+ perspective: CONFIG.camera.perspective,
77
+ rotationX: CONFIG.camera.rotationX,
78
+ rotationY: CONFIG.camera.rotationY,
79
+ inertia: CONFIG.camera.inertia,
80
+ friction: CONFIG.camera.friction,
81
+ });
82
+ this.camera.enableMouseControl(this.canvas);
83
+
84
+ // Calculate initial sizes based on screen
85
+ this._updateSizes();
86
+
87
+ // Plane 1: Solid Color (Canvas 2D rendering)
88
+ const solidPlane = new Plane3D(
89
+ this.planeWidth,
90
+ this.planeHeight,
91
+ {
92
+ color: CONFIG.solidPlane.color,
93
+ camera: this.camera,
94
+ }
95
+ );
96
+ this.solidData = new PlaneData(
97
+ solidPlane,
98
+ -this.spacing,
99
+ 0,
100
+ 0,
101
+ "Solid Color"
102
+ );
103
+
104
+ // Plane 2: Gradient (WebGL shader)
105
+ const gradientPlane = new Plane3D(
106
+ this.planeWidth,
107
+ this.planeHeight,
108
+ {
109
+ camera: this.camera,
110
+ useShader: true,
111
+ shaderType: "gradient",
112
+ shaderUniforms: {
113
+ uColor1: CONFIG.gradientPlane.color1,
114
+ uColor2: CONFIG.gradientPlane.color2,
115
+ uAngle: CONFIG.gradientPlane.angle,
116
+ },
117
+ }
118
+ );
119
+ this.gradientData = new PlaneData(gradientPlane, 0, 0, 0, "Gradient");
120
+
121
+ // Plane 3: Grid (WebGL shader)
122
+ const gridPlane = new Plane3D(
123
+ this.planeWidth,
124
+ this.planeHeight,
125
+ {
126
+ camera: this.camera,
127
+ useShader: true,
128
+ shaderType: "grid",
129
+ shaderUniforms: {
130
+ uLineColor: CONFIG.gridPlane.lineColor,
131
+ uBackgroundColor: CONFIG.gridPlane.backgroundColor,
132
+ uGridSize: CONFIG.gridPlane.gridSize,
133
+ uLineWidth: CONFIG.gridPlane.lineWidth,
134
+ },
135
+ }
136
+ );
137
+ this.gridData = new PlaneData(gridPlane, this.spacing, 0, 0, "Grid");
138
+
139
+ // Store all plane data for rendering
140
+ this.planeDataList = [this.solidData, this.gradientData, this.gridData];
141
+
142
+ // Add FPS counter
143
+ this.pipeline.add(
144
+ new FPSCounter(this, {
145
+ anchor: "bottom-right",
146
+ })
147
+ );
148
+ }
149
+
150
+ /**
151
+ * Calculate sizes based on current screen dimensions
152
+ */
153
+ _updateSizes() {
154
+ const minDim = Math.min(this.width, this.height);
155
+ this.planeWidth = minDim * CONFIG.basePlaneWidth;
156
+ this.planeHeight = minDim * CONFIG.basePlaneHeight;
157
+ this.spacing = this.width * CONFIG.baseSpacing;
158
+ }
159
+
160
+ /**
161
+ * Handle window resize
162
+ */
163
+ onResize() {
164
+ this._updateSizes();
165
+
166
+ // Update plane dimensions
167
+ if (this.planeDataList) {
168
+ for (const data of this.planeDataList) {
169
+ data.plane.planeWidth = this.planeWidth;
170
+ data.plane.planeHeight = this.planeHeight;
171
+ data.plane._generateGeometry();
172
+ }
173
+
174
+ // Update world positions
175
+ this.solidData.worldX = -this.spacing;
176
+ this.gradientData.worldX = 0;
177
+ this.gridData.worldX = this.spacing;
178
+ }
179
+ }
180
+
181
+ update(dt) {
182
+ super.update(dt);
183
+
184
+ // Update camera (for inertia)
185
+ this.camera.update(dt);
186
+
187
+ // Update self-rotation for all planes
188
+ for (const data of this.planeDataList) {
189
+ data.plane.selfRotationY += CONFIG.selfRotation.speed * dt;
190
+ }
191
+ }
192
+
193
+ render() {
194
+ super.render();
195
+
196
+ const ctx = this.ctx;
197
+ const centerX = this.width / 2;
198
+ const centerY = this.height / 2;
199
+
200
+ // Project and sort by depth (back to front)
201
+ const projected = this.planeDataList.map((data) => {
202
+ const proj = this.camera.project(
203
+ data.worldX,
204
+ data.worldY,
205
+ data.worldZ
206
+ );
207
+ return { data, proj };
208
+ });
209
+ projected.sort((a, b) => b.proj.z - a.proj.z);
210
+
211
+ // Render each plane at its projected position
212
+ for (const { data, proj } of projected) {
213
+ ctx.save();
214
+ // Translate to screen center + projected position
215
+ ctx.translate(centerX + proj.x, centerY + proj.y);
216
+ // Scale by perspective
217
+ ctx.scale(proj.scale, proj.scale);
218
+ // Render plane at origin
219
+ data.plane.draw();
220
+ ctx.restore();
221
+ }
222
+
223
+ // Render labels (always on top)
224
+ this.renderLabels(projected, centerX, centerY);
225
+ }
226
+
227
+ /**
228
+ * Render plane labels at projected positions
229
+ */
230
+ renderLabels(projected, centerX, centerY) {
231
+ const ctx = this.ctx;
232
+
233
+ for (const { data, proj } of projected) {
234
+ // Calculate label position below the plane
235
+ const screenX = centerX + proj.x;
236
+ const screenY =
237
+ centerY +
238
+ proj.y +
239
+ (this.planeHeight / 2) * proj.scale +
240
+ 25;
241
+
242
+ ctx.font = "14px monospace";
243
+ ctx.fillStyle = "#ffffff";
244
+ ctx.textAlign = "center";
245
+ ctx.textBaseline = "top";
246
+ ctx.fillText(data.label, screenX, screenY);
247
+ }
248
+ }
249
+ }
250
+
251
+ // Start the demo
252
+ window.addEventListener("load", () => {
253
+ const canvas = document.getElementById("game");
254
+ const demo = new Plane3DDemo(canvas);
255
+ demo.start();
256
+ });