@guinetik/gcanvas 1.0.5 → 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 (78) hide show
  1. package/dist/aizawa.html +27 -0
  2. package/dist/clifford.html +25 -0
  3. package/dist/cmb.html +24 -0
  4. package/dist/dadras.html +26 -0
  5. package/dist/dejong.html +25 -0
  6. package/dist/gcanvas.es.js +5130 -372
  7. package/dist/gcanvas.es.min.js +1 -1
  8. package/dist/gcanvas.umd.js +1 -1
  9. package/dist/gcanvas.umd.min.js +1 -1
  10. package/dist/halvorsen.html +27 -0
  11. package/dist/index.html +96 -48
  12. package/dist/js/aizawa.js +425 -0
  13. package/dist/js/bezier.js +5 -5
  14. package/dist/js/clifford.js +236 -0
  15. package/dist/js/cmb.js +594 -0
  16. package/dist/js/dadras.js +405 -0
  17. package/dist/js/dejong.js +257 -0
  18. package/dist/js/halvorsen.js +405 -0
  19. package/dist/js/isometric.js +34 -46
  20. package/dist/js/lorenz.js +425 -0
  21. package/dist/js/painter.js +8 -8
  22. package/dist/js/rossler.js +480 -0
  23. package/dist/js/schrodinger.js +314 -18
  24. package/dist/js/thomas.js +394 -0
  25. package/dist/lorenz.html +27 -0
  26. package/dist/rossler.html +27 -0
  27. package/dist/scene-interactivity-test.html +220 -0
  28. package/dist/thomas.html +27 -0
  29. package/package.json +1 -1
  30. package/readme.md +30 -22
  31. package/src/game/objects/go.js +7 -0
  32. package/src/game/objects/index.js +2 -0
  33. package/src/game/objects/isometric-scene.js +53 -3
  34. package/src/game/objects/layoutscene.js +57 -0
  35. package/src/game/objects/mask.js +241 -0
  36. package/src/game/objects/scene.js +19 -0
  37. package/src/game/objects/wrapper.js +14 -2
  38. package/src/game/pipeline.js +17 -0
  39. package/src/game/ui/button.js +101 -16
  40. package/src/game/ui/theme.js +0 -6
  41. package/src/game/ui/togglebutton.js +25 -14
  42. package/src/game/ui/tooltip.js +12 -4
  43. package/src/index.js +3 -0
  44. package/src/io/gesture.js +409 -0
  45. package/src/io/index.js +4 -1
  46. package/src/io/keys.js +9 -1
  47. package/src/io/screen.js +476 -0
  48. package/src/math/attractors.js +664 -0
  49. package/src/math/heat.js +106 -0
  50. package/src/math/index.js +1 -0
  51. package/src/mixins/draggable.js +15 -19
  52. package/src/painter/painter.shapes.js +11 -5
  53. package/src/particle/particle-system.js +165 -1
  54. package/src/physics/index.js +26 -0
  55. package/src/physics/physics-updaters.js +333 -0
  56. package/src/physics/physics.js +375 -0
  57. package/src/shapes/image.js +5 -5
  58. package/src/shapes/index.js +2 -0
  59. package/src/shapes/parallelogram.js +147 -0
  60. package/src/shapes/righttriangle.js +115 -0
  61. package/src/shapes/svg.js +281 -100
  62. package/src/shapes/text.js +22 -6
  63. package/src/shapes/transformable.js +5 -0
  64. package/src/sound/effects.js +807 -0
  65. package/src/sound/index.js +13 -0
  66. package/src/webgl/index.js +7 -0
  67. package/src/webgl/shaders/clifford-point-shaders.js +131 -0
  68. package/src/webgl/shaders/dejong-point-shaders.js +131 -0
  69. package/src/webgl/shaders/point-sprite-shaders.js +152 -0
  70. package/src/webgl/webgl-clifford-renderer.js +477 -0
  71. package/src/webgl/webgl-dejong-renderer.js +472 -0
  72. package/src/webgl/webgl-line-renderer.js +391 -0
  73. package/src/webgl/webgl-particle-renderer.js +410 -0
  74. package/types/index.d.ts +30 -2
  75. package/types/io.d.ts +217 -0
  76. package/types/physics.d.ts +299 -0
  77. package/types/shapes.d.ts +8 -0
  78. package/types/webgl.d.ts +188 -109
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Physics module type definitions
3
+ */
4
+
5
+ /**
6
+ * Collision result from checkCollision
7
+ */
8
+ export interface CollisionResult {
9
+ /** Distance between particle centers */
10
+ dist: number;
11
+ /** Overlap amount (how much they're intersecting) */
12
+ overlap: number;
13
+ /** X component of distance vector */
14
+ dx: number;
15
+ /** Y component of distance vector */
16
+ dy: number;
17
+ /** Z component of distance vector */
18
+ dz: number;
19
+ }
20
+
21
+ /**
22
+ * Force vector result
23
+ */
24
+ export interface ForceResult {
25
+ /** Force X component */
26
+ fx: number;
27
+ /** Force Y component */
28
+ fy: number;
29
+ /** Force Z component */
30
+ fz: number;
31
+ /** Distance between objects */
32
+ dist: number;
33
+ }
34
+
35
+ /**
36
+ * Velocity result from collision response
37
+ */
38
+ export interface VelocityResult {
39
+ vx: number;
40
+ vy: number;
41
+ vz: number;
42
+ }
43
+
44
+ /**
45
+ * Elastic collision response result
46
+ */
47
+ export interface ElasticCollisionResult {
48
+ /** New velocity for first particle */
49
+ v1: VelocityResult;
50
+ /** New velocity for second particle */
51
+ v2: VelocityResult;
52
+ }
53
+
54
+ /**
55
+ * 3D bounding box
56
+ */
57
+ export interface Bounds3D {
58
+ minX: number;
59
+ maxX: number;
60
+ minY: number;
61
+ maxY: number;
62
+ minZ?: number;
63
+ maxZ?: number;
64
+ }
65
+
66
+ /**
67
+ * Sphere definition
68
+ */
69
+ export interface Sphere {
70
+ x: number;
71
+ y: number;
72
+ z?: number;
73
+ radius: number;
74
+ }
75
+
76
+ /**
77
+ * Position in 3D space
78
+ */
79
+ export interface Position3D {
80
+ x: number;
81
+ y: number;
82
+ z?: number;
83
+ }
84
+
85
+ /**
86
+ * Particle with physics properties
87
+ */
88
+ export interface PhysicsParticle extends Position3D {
89
+ vx: number;
90
+ vy: number;
91
+ vz?: number;
92
+ size?: number;
93
+ radius?: number;
94
+ mass?: number;
95
+ alive?: boolean;
96
+ custom?: {
97
+ mass?: number;
98
+ [key: string]: any;
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Particle updater function signature
104
+ */
105
+ export type ParticleUpdater = (
106
+ particle: PhysicsParticle,
107
+ dt: number,
108
+ system?: any
109
+ ) => void;
110
+
111
+ /**
112
+ * Static physics calculations
113
+ */
114
+ export class Physics {
115
+ /**
116
+ * Calculate attraction/repulsion force using inverse square law
117
+ */
118
+ static attract(
119
+ p1: Position3D,
120
+ p2: Position3D,
121
+ strength?: number,
122
+ minDist?: number
123
+ ): ForceResult;
124
+
125
+ /**
126
+ * Calculate linear attraction force (constant strength)
127
+ */
128
+ static attractLinear(
129
+ p1: Position3D,
130
+ p2: Position3D,
131
+ strength?: number
132
+ ): ForceResult;
133
+
134
+ /**
135
+ * Check if two particles are colliding
136
+ */
137
+ static checkCollision(
138
+ p1: PhysicsParticle,
139
+ p2: PhysicsParticle,
140
+ threshold?: number
141
+ ): CollisionResult | null;
142
+
143
+ /**
144
+ * Calculate elastic collision response
145
+ */
146
+ static elasticCollision(
147
+ p1: PhysicsParticle,
148
+ p2: PhysicsParticle,
149
+ collision: CollisionResult,
150
+ restitution?: number
151
+ ): ElasticCollisionResult | null;
152
+
153
+ /**
154
+ * Separate overlapping particles
155
+ */
156
+ static separate(
157
+ p1: PhysicsParticle,
158
+ p2: PhysicsParticle,
159
+ collision: CollisionResult,
160
+ separationFactor?: number
161
+ ): void;
162
+
163
+ /**
164
+ * Check and respond to 3D boundary collision
165
+ */
166
+ static boundsCollision(
167
+ p: PhysicsParticle,
168
+ bounds: Bounds3D,
169
+ restitution?: number
170
+ ): boolean;
171
+
172
+ /**
173
+ * Check collision with spherical boundary
174
+ */
175
+ static sphereBoundsCollision(
176
+ p: PhysicsParticle,
177
+ sphere: Sphere,
178
+ restitution?: number,
179
+ inside?: boolean
180
+ ): boolean;
181
+
182
+ /**
183
+ * Calculate kinetic energy
184
+ */
185
+ static kineticEnergy(p: PhysicsParticle): number;
186
+
187
+ /**
188
+ * Calculate speed (velocity magnitude)
189
+ */
190
+ static speed(p: PhysicsParticle): number;
191
+
192
+ /**
193
+ * Calculate distance between two positions
194
+ */
195
+ static distance(p1: Position3D, p2: Position3D): number;
196
+
197
+ /**
198
+ * Calculate squared distance (faster)
199
+ */
200
+ static distanceSquared(p1: Position3D, p2: Position3D): number;
201
+
202
+ /**
203
+ * Clamp velocity to maximum speed
204
+ */
205
+ static clampVelocity(p: PhysicsParticle, maxSpeed: number): void;
206
+
207
+ /**
208
+ * Apply force to particle
209
+ */
210
+ static applyForce(
211
+ p: PhysicsParticle,
212
+ fx: number,
213
+ fy: number,
214
+ fz: number,
215
+ dt: number
216
+ ): void;
217
+ }
218
+
219
+ /**
220
+ * Composable physics updaters for ParticleSystem
221
+ */
222
+ export const PhysicsUpdaters: {
223
+ /**
224
+ * Apply mutual attraction/repulsion between particles
225
+ */
226
+ mutualAttraction(
227
+ strength?: number,
228
+ cutoffDistance?: number,
229
+ minDistance?: number
230
+ ): ParticleUpdater;
231
+
232
+ /**
233
+ * Apply linear mutual attraction
234
+ */
235
+ mutualAttractionLinear(
236
+ strength?: number,
237
+ cutoffDistance?: number
238
+ ): ParticleUpdater;
239
+
240
+ /**
241
+ * Handle particle-particle elastic collisions
242
+ */
243
+ particleCollisions(
244
+ restitution?: number,
245
+ threshold?: number
246
+ ): ParticleUpdater;
247
+
248
+ /**
249
+ * Bounce off 3D box boundaries
250
+ */
251
+ bounds3D(bounds: Bounds3D, restitution?: number): ParticleUpdater;
252
+
253
+ /**
254
+ * Bounce inside spherical boundary
255
+ */
256
+ sphereBounds(sphere: Sphere, restitution?: number): ParticleUpdater;
257
+
258
+ /**
259
+ * Attract toward a point
260
+ */
261
+ attractToPoint(
262
+ target: Position3D | (() => Position3D),
263
+ strength?: number,
264
+ minDist?: number
265
+ ): ParticleUpdater;
266
+
267
+ /**
268
+ * Apply uniform gravity
269
+ */
270
+ gravity(gx?: number, gy?: number, gz?: number): ParticleUpdater;
271
+
272
+ /**
273
+ * Limit maximum speed
274
+ */
275
+ maxSpeed(maxSpeed: number): ParticleUpdater;
276
+
277
+ /**
278
+ * Apply velocity drag
279
+ */
280
+ drag(coefficient?: number): ParticleUpdater;
281
+
282
+ /**
283
+ * Apply separation force to prevent overlap
284
+ */
285
+ separation(strength?: number, threshold?: number): ParticleUpdater;
286
+
287
+ /**
288
+ * Apply thermal motion (random jitter)
289
+ */
290
+ thermal(
291
+ temperature: number | (() => number),
292
+ scale?: number
293
+ ): ParticleUpdater;
294
+
295
+ /**
296
+ * Apply orbital motion around center
297
+ */
298
+ orbital(center: Position3D, strength?: number): ParticleUpdater;
299
+ };
package/types/shapes.d.ts CHANGED
@@ -684,6 +684,14 @@ export class BezierShape extends Shape {
684
684
  * SVG path shape.
685
685
  */
686
686
  export class SVGShape extends Shape {
687
+ /**
688
+ * Load an SVG file from a URL and create an SVGShape
689
+ * @param url - URL to the SVG file
690
+ * @param options - Shape options
691
+ * @returns Promise that resolves to the SVGShape instance
692
+ */
693
+ static fromURL(url: string, options?: ShapeOptions): Promise<SVGShape>;
694
+
687
695
  /**
688
696
  * @param svgPath - SVG path string (d attribute)
689
697
  * @param options - Shape options
package/types/webgl.d.ts CHANGED
@@ -1,109 +1,188 @@
1
- /**
2
- * GCanvas WebGL Module
3
- * Optional WebGL rendering capabilities for enhanced visual effects.
4
- * @module webgl
5
- */
6
-
7
- // ==========================================================================
8
- // WebGL Renderer
9
- // ==========================================================================
10
-
11
- /** WebGL renderer options */
12
- export interface WebGLRendererOptions {
13
- /** Canvas element */
14
- canvas: HTMLCanvasElement;
15
- /** Whether to preserve drawing buffer */
16
- preserveDrawingBuffer?: boolean;
17
- /** Enable antialiasing */
18
- antialias?: boolean;
19
- /** Enable alpha blending */
20
- alpha?: boolean;
21
- /** Enable depth testing */
22
- depth?: boolean;
23
- /** Enable stencil buffer */
24
- stencil?: boolean;
25
- /** Premultiplied alpha */
26
- premultipliedAlpha?: boolean;
27
- }
28
-
29
- /**
30
- * WebGL renderer for enhanced visual effects.
31
- * Provides shader-based rendering for complex effects.
32
- */
33
- export class WebGLRenderer {
34
- /** WebGL rendering context */
35
- readonly gl: WebGLRenderingContext | WebGL2RenderingContext;
36
- /** Canvas element */
37
- readonly canvas: HTMLCanvasElement;
38
- /** Whether WebGL is available */
39
- readonly isAvailable: boolean;
40
-
41
- constructor(options: WebGLRendererOptions);
42
-
43
- /**
44
- * Create and compile a shader program.
45
- * @param vertexSource - Vertex shader GLSL source
46
- * @param fragmentSource - Fragment shader GLSL source
47
- * @returns Compiled shader program
48
- */
49
- createProgram(vertexSource: string, fragmentSource: string): WebGLProgram;
50
-
51
- /**
52
- * Set uniform value.
53
- * @param program - Shader program
54
- * @param name - Uniform name
55
- * @param value - Uniform value
56
- */
57
- setUniform(program: WebGLProgram, name: string, value: number | number[] | Float32Array): void;
58
-
59
- /**
60
- * Create a texture from an image or canvas.
61
- * @param source - Image or canvas source
62
- * @returns WebGL texture
63
- */
64
- createTexture(source: HTMLImageElement | HTMLCanvasElement | ImageData): WebGLTexture;
65
-
66
- /**
67
- * Render a full-screen quad with a shader.
68
- * @param program - Shader program to use
69
- */
70
- renderFullscreenQuad(program: WebGLProgram): void;
71
-
72
- /**
73
- * Clear the canvas.
74
- * @param r - Red (0-1)
75
- * @param g - Green (0-1)
76
- * @param b - Blue (0-1)
77
- * @param a - Alpha (0-1)
78
- */
79
- clear(r?: number, g?: number, b?: number, a?: number): void;
80
-
81
- /**
82
- * Resize the renderer to match canvas size.
83
- */
84
- resize(): void;
85
-
86
- /**
87
- * Dispose of WebGL resources.
88
- */
89
- dispose(): void;
90
- }
91
-
92
- // ==========================================================================
93
- // Shader Collections
94
- // ==========================================================================
95
-
96
- /**
97
- * Pre-built shaders for 3D sphere rendering.
98
- */
99
- export namespace SPHERE_SHADERS {
100
- /** Basic sphere vertex shader */
101
- const vertex: string;
102
- /** Basic sphere fragment shader with lighting */
103
- const fragment: string;
104
- /** Glow effect fragment shader */
105
- const glowFragment: string;
106
- /** Atmosphere effect fragment shader */
107
- const atmosphereFragment: string;
108
- }
109
-
1
+ /**
2
+ * GCanvas WebGL Module
3
+ * Optional WebGL rendering capabilities for enhanced visual effects.
4
+ * @module webgl
5
+ */
6
+
7
+ /**
8
+ * WebGL renderer for enhanced visual effects.
9
+ * Provides shader-based rendering for complex effects.
10
+ */
11
+ export class WebGLRenderer {
12
+ constructor(width: number, height: number);
13
+
14
+ isAvailable(): boolean;
15
+ resize(width: number, height: number): void;
16
+ useProgram(name: string, vertexSource: string, fragmentSource: string): WebGLProgram | null;
17
+ setUniforms(uniforms: Record<string, number | number[] | Float32Array>): void;
18
+ setColorUniform(name: string, color: string): void;
19
+ clear(r?: number, g?: number, b?: number, a?: number): void;
20
+ render(): void;
21
+ compositeOnto(ctx: CanvasRenderingContext2D, x: number, y: number, width?: number, height?: number): void;
22
+ getCanvas(): HTMLCanvasElement;
23
+ destroy(): void;
24
+ }
25
+
26
+ export type WebGLBlendMode = "alpha" | "additive";
27
+ export type PointSpriteShape = "circle" | "glow" | "square" | "softSquare";
28
+
29
+ export class WebGLParticleRenderer {
30
+ constructor(
31
+ maxParticles?: number,
32
+ options?: {
33
+ width?: number;
34
+ height?: number;
35
+ shape?: PointSpriteShape;
36
+ blendMode?: WebGLBlendMode;
37
+ }
38
+ );
39
+
40
+ isAvailable(): boolean;
41
+ setBlendMode(mode: WebGLBlendMode): void;
42
+ setShape(shape: PointSpriteShape): void;
43
+ resize(width: number, height: number): void;
44
+ updateParticles(particles: Array<{ x: number; y: number; size: number; color: { r: number; g: number; b: number; a: number } }>): number;
45
+ clear(r?: number, g?: number, b?: number, a?: number): void;
46
+ render(count: number): void;
47
+ compositeOnto(ctx: CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number): void;
48
+ destroy(): void;
49
+ }
50
+
51
+ export class WebGLLineRenderer {
52
+ constructor(
53
+ maxSegments?: number,
54
+ options?: {
55
+ width?: number;
56
+ height?: number;
57
+ blendMode?: WebGLBlendMode;
58
+ }
59
+ );
60
+
61
+ isAvailable(): boolean;
62
+ setBlendMode(mode: WebGLBlendMode): void;
63
+ resize(width: number, height: number): void;
64
+ updateLines(segments: any[]): number;
65
+ clear(r?: number, g?: number, b?: number, a?: number): void;
66
+ render(count: number): void;
67
+ compositeOnto(ctx: CanvasRenderingContext2D, x?: number, y?: number): void;
68
+ destroy(): void;
69
+ }
70
+
71
+ export const DEJONG_MAX_ITERATIONS: number;
72
+ export const DEJONG_POINT_VERTEX: string;
73
+ export const DEJONG_POINT_FRAGMENTS: Record<PointSpriteShape, string>;
74
+
75
+ export const CLIFFORD_MAX_ITERATIONS: number;
76
+ export const CLIFFORD_POINT_VERTEX: string;
77
+ export const CLIFFORD_POINT_FRAGMENTS: Record<PointSpriteShape, string>;
78
+
79
+ export class WebGLDeJongRenderer {
80
+ constructor(
81
+ seedCount?: number,
82
+ options?: {
83
+ width?: number;
84
+ height?: number;
85
+ shape?: PointSpriteShape;
86
+ blendMode?: WebGLBlendMode;
87
+ pointSize?: number;
88
+ pointScale?: number;
89
+ iterations?: number;
90
+ params?: { a: number; b: number; c: number; d: number };
91
+ color?: { r: number; g: number; b: number; a: number };
92
+ colorMode?: 0 | 1;
93
+ hueRange?: { minHue: number; maxHue: number };
94
+ maxSpeed?: number;
95
+ saturation?: number; // 0..1
96
+ lightness?: number; // 0..1
97
+ alpha?: number; // 0..1
98
+ hueShiftSpeed?: number; // degrees/sec
99
+ }
100
+ );
101
+
102
+ static identityMat3(): Float32Array;
103
+ static rotationMat3(angle: number): Float32Array;
104
+
105
+ isAvailable(): boolean;
106
+ resize(width: number, height: number): void;
107
+ setSeedCount(seedCount: number): void;
108
+ regenerateSeeds(): void;
109
+ setShape(shape: PointSpriteShape): void;
110
+ setBlendMode(mode: WebGLBlendMode): void;
111
+ setParams(params: { a?: number; b?: number; c?: number; d?: number }): void;
112
+ setIterations(iterations: number): void;
113
+ setZoom(zoom: number): void;
114
+ setTransform(mat3: Float32Array): void;
115
+ setPointSize(size: number): void;
116
+ setColor(color: { r?: number; g?: number; b?: number; a?: number }): void;
117
+ setColorMode(mode: 0 | 1): void;
118
+ setColorRamp(options: {
119
+ minHue?: number;
120
+ maxHue?: number;
121
+ maxSpeed?: number;
122
+ saturation?: number;
123
+ lightness?: number;
124
+ alpha?: number;
125
+ hueShiftSpeed?: number;
126
+ }): void;
127
+ clear(r?: number, g?: number, b?: number, a?: number): void;
128
+ render(timeSeconds?: number): void;
129
+ compositeOnto(ctx: CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number): void;
130
+ destroy(): void;
131
+ }
132
+
133
+ export class WebGLCliffordRenderer {
134
+ constructor(
135
+ seedCount?: number,
136
+ options?: {
137
+ width?: number;
138
+ height?: number;
139
+ shape?: PointSpriteShape;
140
+ blendMode?: WebGLBlendMode;
141
+ pointSize?: number;
142
+ pointScale?: number;
143
+ iterations?: number;
144
+ params?: { a: number; b: number; c: number; d: number };
145
+ color?: { r: number; g: number; b: number; a: number };
146
+ colorMode?: 0 | 1;
147
+ hueRange?: { minHue: number; maxHue: number };
148
+ maxSpeed?: number;
149
+ saturation?: number; // 0..1
150
+ lightness?: number; // 0..1
151
+ alpha?: number; // 0..1
152
+ hueShiftSpeed?: number; // degrees/sec
153
+ }
154
+ );
155
+
156
+ static identityMat3(): Float32Array;
157
+ static rotationMat3(angle: number): Float32Array;
158
+
159
+ isAvailable(): boolean;
160
+ resize(width: number, height: number): void;
161
+ setSeedCount(seedCount: number): void;
162
+ regenerateSeeds(): void;
163
+ setShape(shape: PointSpriteShape): void;
164
+ setBlendMode(mode: WebGLBlendMode): void;
165
+ setParams(params: { a?: number; b?: number; c?: number; d?: number }): void;
166
+ setIterations(iterations: number): void;
167
+ setZoom(zoom: number): void;
168
+ setTransform(mat3: Float32Array): void;
169
+ setPointSize(size: number): void;
170
+ setColor(color: { r?: number; g?: number; b?: number; a?: number }): void;
171
+ setColorMode(mode: 0 | 1): void;
172
+ setColorRamp(options: {
173
+ minHue?: number;
174
+ maxHue?: number;
175
+ maxSpeed?: number;
176
+ saturation?: number;
177
+ lightness?: number;
178
+ alpha?: number;
179
+ hueShiftSpeed?: number;
180
+ }): void;
181
+ clear(r?: number, g?: number, b?: number, a?: number): void;
182
+ render(timeSeconds?: number): void;
183
+ compositeOnto(ctx: CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number): void;
184
+ destroy(): void;
185
+ }
186
+
187
+ export const SPHERE_SHADERS: any;
188
+