@guinetik/gcanvas 1.0.0 → 1.0.1

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 (68) hide show
  1. package/demos/fluid-simple.html +22 -0
  2. package/demos/fluid.html +37 -0
  3. package/demos/index.html +2 -0
  4. package/demos/js/blob.js +18 -5
  5. package/demos/js/fluid-simple.js +253 -0
  6. package/demos/js/fluid.js +527 -0
  7. package/demos/js/tde/accretiondisk.js +64 -11
  8. package/demos/js/tde/blackholescene.js +2 -2
  9. package/demos/js/tde/config.js +2 -2
  10. package/demos/js/tde/index.js +152 -27
  11. package/demos/js/tde/lensedstarfield.js +32 -25
  12. package/demos/js/tde/tdestar.js +78 -98
  13. package/demos/js/tde/tidalstream.js +23 -7
  14. package/docs/README.md +230 -222
  15. package/docs/api/FluidSystem.md +173 -0
  16. package/docs/concepts/architecture-overview.md +204 -204
  17. package/docs/concepts/rendering-pipeline.md +279 -279
  18. package/docs/concepts/two-layer-architecture.md +229 -229
  19. package/docs/fluid-dynamics.md +97 -0
  20. package/docs/getting-started/first-game.md +354 -354
  21. package/docs/getting-started/installation.md +175 -157
  22. package/docs/modules/collision/README.md +2 -2
  23. package/docs/modules/fluent/README.md +6 -6
  24. package/docs/modules/game/README.md +303 -303
  25. package/docs/modules/isometric-camera.md +2 -2
  26. package/docs/modules/isometric.md +1 -1
  27. package/docs/modules/painter/README.md +328 -328
  28. package/docs/modules/particle/README.md +3 -3
  29. package/docs/modules/shapes/README.md +221 -221
  30. package/docs/modules/shapes/base/euclidian.md +123 -123
  31. package/docs/modules/shapes/base/shape.md +262 -262
  32. package/docs/modules/shapes/base/transformable.md +243 -243
  33. package/docs/modules/state/README.md +2 -2
  34. package/docs/modules/util/README.md +1 -1
  35. package/docs/modules/util/camera3d.md +3 -3
  36. package/docs/modules/util/scene3d.md +1 -1
  37. package/package.json +3 -1
  38. package/readme.md +19 -5
  39. package/src/collision/collision.js +75 -0
  40. package/src/game/index.js +2 -1
  41. package/src/game/pipeline.js +3 -3
  42. package/src/game/systems/FluidSystem.js +835 -0
  43. package/src/game/systems/index.js +11 -0
  44. package/src/game/ui/button.js +39 -18
  45. package/src/game/ui/cursor.js +14 -0
  46. package/src/game/ui/fps.js +12 -4
  47. package/src/game/ui/index.js +2 -0
  48. package/src/game/ui/stepper.js +549 -0
  49. package/src/game/ui/theme.js +121 -0
  50. package/src/game/ui/togglebutton.js +9 -3
  51. package/src/game/ui/tooltip.js +11 -4
  52. package/src/math/fluid.js +507 -0
  53. package/src/math/index.js +2 -0
  54. package/src/mixins/anchor.js +17 -7
  55. package/src/motion/tweenetik.js +16 -0
  56. package/src/shapes/index.js +1 -0
  57. package/src/util/camera3d.js +218 -12
  58. package/types/fluent.d.ts +361 -0
  59. package/types/game.d.ts +303 -0
  60. package/types/index.d.ts +144 -5
  61. package/types/math.d.ts +361 -0
  62. package/types/motion.d.ts +271 -0
  63. package/types/particle.d.ts +373 -0
  64. package/types/shapes.d.ts +107 -9
  65. package/types/util.d.ts +353 -0
  66. package/types/webgl.d.ts +109 -0
  67. package/disk_example.png +0 -0
  68. package/tde.png +0 -0
package/types/util.d.ts CHANGED
@@ -251,3 +251,356 @@ export function gridLayout(
251
251
  items: LayoutItem[],
252
252
  options?: GridLayoutOptions
253
253
  ): LayoutResult;
254
+
255
+ // ==========================================================================
256
+ // Camera3D
257
+ // ==========================================================================
258
+
259
+ /** Options for Camera3D */
260
+ export interface Camera3DOptions {
261
+ /** Initial X rotation (tilt up/down) in radians */
262
+ rotationX?: number;
263
+ /** Initial Y rotation (spin left/right) in radians */
264
+ rotationY?: number;
265
+ /** Initial Z rotation (roll) in radians */
266
+ rotationZ?: number;
267
+ /** Initial X position in world space */
268
+ x?: number;
269
+ /** Initial Y position in world space */
270
+ y?: number;
271
+ /** Initial Z position in world space */
272
+ z?: number;
273
+ /** Perspective distance (higher = less distortion, default: 800) */
274
+ perspective?: number;
275
+ /** Mouse drag sensitivity (default: 0.005) */
276
+ sensitivity?: number;
277
+ /** Minimum X rotation limit (default: -1.5) */
278
+ minRotationX?: number;
279
+ /** Maximum X rotation limit (default: 1.5) */
280
+ maxRotationX?: number;
281
+ /** Whether to clamp X rotation (default: true) */
282
+ clampX?: boolean;
283
+ /** Enable auto-rotation (default: false) */
284
+ autoRotate?: boolean;
285
+ /** Auto-rotation speed in radians per second (default: 0.5) */
286
+ autoRotateSpeed?: number;
287
+ /** Auto-rotation axis: 'x', 'y', or 'z' */
288
+ autoRotateAxis?: 'x' | 'y' | 'z';
289
+ /** Enable inertia/momentum (default: false) */
290
+ inertia?: boolean;
291
+ /** Velocity decay per frame (default: 0.92) */
292
+ friction?: number;
293
+ /** Multiplier for initial throw velocity (default: 1.0) */
294
+ velocityScale?: number;
295
+ }
296
+
297
+ /** Projected point result */
298
+ export interface ProjectedPoint {
299
+ /** Screen X coordinate */
300
+ x: number;
301
+ /** Screen Y coordinate */
302
+ y: number;
303
+ /** Depth (for sorting) */
304
+ z: number;
305
+ /** Scale factor (for size adjustment) */
306
+ scale: number;
307
+ }
308
+
309
+ /** Mouse control options */
310
+ export interface MouseControlOptions {
311
+ /** Invert horizontal rotation */
312
+ invertX?: boolean;
313
+ /** Invert vertical rotation */
314
+ invertY?: boolean;
315
+ }
316
+
317
+ /** Follow options */
318
+ export interface FollowOptions {
319
+ /** X offset from target */
320
+ offsetX?: number;
321
+ /** Y offset from target */
322
+ offsetY?: number;
323
+ /** Z offset from target */
324
+ offsetZ?: number;
325
+ /** Auto-orient to look at lookAtTarget */
326
+ lookAt?: boolean;
327
+ /** Point to look at (default: origin) */
328
+ lookAtTarget?: { x: number; y: number; z: number } | null;
329
+ /** Interpolation speed (0-1, higher = snappier, default: 0.1) */
330
+ lerp?: number;
331
+ }
332
+
333
+ /** MoveTo animation options */
334
+ export interface MoveToOptions {
335
+ /** Target X rotation */
336
+ rotationX?: number;
337
+ /** Target Y rotation */
338
+ rotationY?: number;
339
+ /** Interpolation speed (0-1, default: 0.05) */
340
+ lerp?: number;
341
+ }
342
+
343
+ /**
344
+ * Camera3D - Pseudo-3D projection and mouse-controlled rotation.
345
+ * Provides 3D to 2D projection with perspective, rotation controls,
346
+ * and interactive mouse/touch rotation for 2D canvas applications.
347
+ *
348
+ * @example
349
+ * const camera = new Camera3D({
350
+ * rotationX: 0.3,
351
+ * rotationY: -0.4,
352
+ * perspective: 800,
353
+ * inertia: true,
354
+ * friction: 0.92
355
+ * });
356
+ * camera.enableMouseControl(canvas);
357
+ *
358
+ * // In render loop
359
+ * const { x, y, scale, z } = camera.project(x3d, y3d, z3d);
360
+ */
361
+ export class Camera3D {
362
+ /** X rotation in radians */
363
+ rotationX: number;
364
+ /** Y rotation in radians */
365
+ rotationY: number;
366
+ /** Z rotation in radians */
367
+ rotationZ: number;
368
+ /** X position in world space */
369
+ x: number;
370
+ /** Y position in world space */
371
+ y: number;
372
+ /** Z position in world space */
373
+ z: number;
374
+ /** Perspective distance */
375
+ perspective: number;
376
+ /** Mouse drag sensitivity */
377
+ sensitivity: number;
378
+ /** Minimum X rotation */
379
+ minRotationX: number;
380
+ /** Maximum X rotation */
381
+ maxRotationX: number;
382
+ /** Whether X rotation is clamped */
383
+ clampX: boolean;
384
+ /** Auto-rotation enabled */
385
+ autoRotate: boolean;
386
+ /** Auto-rotation speed */
387
+ autoRotateSpeed: number;
388
+ /** Auto-rotation axis */
389
+ autoRotateAxis: 'x' | 'y' | 'z';
390
+ /** Inertia enabled */
391
+ inertia: boolean;
392
+ /** Friction for inertia */
393
+ friction: number;
394
+ /** Velocity scale for throws */
395
+ velocityScale: number;
396
+
397
+ constructor(options?: Camera3DOptions);
398
+
399
+ /**
400
+ * Project a 3D point to 2D screen coordinates.
401
+ * @param x - X coordinate in 3D space
402
+ * @param y - Y coordinate in 3D space
403
+ * @param z - Z coordinate in 3D space
404
+ */
405
+ project(x: number, y: number, z: number): ProjectedPoint;
406
+
407
+ /**
408
+ * Project multiple points at once.
409
+ * @param points - Array of 3D points
410
+ */
411
+ projectAll(points: Array<{ x: number; y: number; z: number }>): ProjectedPoint[];
412
+
413
+ /**
414
+ * Update camera for auto-rotation, inertia, and follow mode.
415
+ * @param dt - Delta time in seconds
416
+ */
417
+ update(dt: number): void;
418
+
419
+ /**
420
+ * Enable mouse/touch drag rotation on a canvas.
421
+ * @param canvas - Canvas element to attach controls to
422
+ * @param options - Control options
423
+ */
424
+ enableMouseControl(canvas: HTMLCanvasElement, options?: MouseControlOptions): Camera3D;
425
+
426
+ /**
427
+ * Disable mouse/touch controls.
428
+ */
429
+ disableMouseControl(): Camera3D;
430
+
431
+ /**
432
+ * Reset rotation and position to initial values.
433
+ */
434
+ reset(): Camera3D;
435
+
436
+ /**
437
+ * Stop any inertia motion immediately.
438
+ */
439
+ stopInertia(): Camera3D;
440
+
441
+ /**
442
+ * Set camera position in world space.
443
+ * @param x - X position
444
+ * @param y - Y position
445
+ * @param z - Z position
446
+ */
447
+ setPosition(x: number, y: number, z: number): Camera3D;
448
+
449
+ /**
450
+ * Animate camera to a new position.
451
+ * @param x - Target X position
452
+ * @param y - Target Y position
453
+ * @param z - Target Z position
454
+ * @param options - Animation options
455
+ */
456
+ moveTo(x: number, y: number, z: number, options?: MoveToOptions): Camera3D;
457
+
458
+ /**
459
+ * Follow a target object.
460
+ * @param target - Object with x, y, z properties
461
+ * @param options - Follow options
462
+ */
463
+ follow(target: { x?: number; y?: number; z?: number }, options?: FollowOptions): Camera3D;
464
+
465
+ /**
466
+ * Stop following target.
467
+ * @param resetPosition - Animate back to initial position
468
+ */
469
+ unfollow(resetPosition?: boolean): Camera3D;
470
+
471
+ /**
472
+ * Check if camera is following a target.
473
+ */
474
+ isFollowing(): boolean;
475
+
476
+ /**
477
+ * Set rotation angles.
478
+ * @param x - X rotation in radians
479
+ * @param y - Y rotation in radians
480
+ * @param z - Z rotation in radians (optional)
481
+ */
482
+ setRotation(x: number, y: number, z?: number): Camera3D;
483
+
484
+ /**
485
+ * Add to current rotation.
486
+ * @param dx - Delta X rotation
487
+ * @param dy - Delta Y rotation
488
+ * @param dz - Delta Z rotation (optional)
489
+ */
490
+ rotate(dx: number, dy: number, dz?: number): Camera3D;
491
+
492
+ /**
493
+ * Check if currently being dragged by user.
494
+ */
495
+ isDragging(): boolean;
496
+
497
+ /**
498
+ * Look at a specific point.
499
+ * @param x - Target X in world space
500
+ * @param y - Target Y in world space
501
+ * @param z - Target Z in world space
502
+ */
503
+ lookAt(x: number, y: number, z: number): Camera3D;
504
+ }
505
+
506
+ // ==========================================================================
507
+ // IsometricCamera
508
+ // ==========================================================================
509
+
510
+ /** Options for IsometricCamera */
511
+ export interface IsometricCameraOptions {
512
+ /** Tile width in pixels (default: 64) */
513
+ tileWidth?: number;
514
+ /** Tile height in pixels (default: 32) */
515
+ tileHeight?: number;
516
+ /** Camera X offset */
517
+ offsetX?: number;
518
+ /** Camera Y offset */
519
+ offsetY?: number;
520
+ /** Camera zoom level (default: 1) */
521
+ zoom?: number;
522
+ /** Rotation angle (0, 90, 180, 270 degrees) */
523
+ rotation?: 0 | 90 | 180 | 270;
524
+ }
525
+
526
+ /**
527
+ * Isometric camera for 2.5D grid-based projections.
528
+ * Converts between grid coordinates and screen positions.
529
+ *
530
+ * @example
531
+ * const camera = new IsometricCamera({
532
+ * tileWidth: 64,
533
+ * tileHeight: 32,
534
+ * offsetX: 400,
535
+ * offsetY: 100
536
+ * });
537
+ *
538
+ * const screen = camera.gridToScreen(5, 3);
539
+ * const grid = camera.screenToGrid(mouseX, mouseY);
540
+ */
541
+ export class IsometricCamera {
542
+ /** Tile width in pixels */
543
+ tileWidth: number;
544
+ /** Tile height in pixels */
545
+ tileHeight: number;
546
+ /** Camera X offset */
547
+ offsetX: number;
548
+ /** Camera Y offset */
549
+ offsetY: number;
550
+ /** Camera zoom level */
551
+ zoom: number;
552
+ /** Camera rotation (0, 90, 180, 270) */
553
+ rotation: 0 | 90 | 180 | 270;
554
+
555
+ constructor(options?: IsometricCameraOptions);
556
+
557
+ /**
558
+ * Convert grid coordinates to screen position.
559
+ * @param gridX - Grid X coordinate
560
+ * @param gridY - Grid Y coordinate
561
+ * @param height - Optional height offset
562
+ */
563
+ gridToScreen(gridX: number, gridY: number, height?: number): { x: number; y: number };
564
+
565
+ /**
566
+ * Convert screen position to grid coordinates.
567
+ * @param screenX - Screen X coordinate
568
+ * @param screenY - Screen Y coordinate
569
+ */
570
+ screenToGrid(screenX: number, screenY: number): { x: number; y: number };
571
+
572
+ /**
573
+ * Rotate camera by 90 degrees.
574
+ * @param clockwise - Rotate clockwise (default: true)
575
+ */
576
+ rotate90(clockwise?: boolean): void;
577
+
578
+ /**
579
+ * Set camera offset.
580
+ * @param x - X offset
581
+ * @param y - Y offset
582
+ */
583
+ setOffset(x: number, y: number): void;
584
+
585
+ /**
586
+ * Set zoom level.
587
+ * @param zoom - Zoom multiplier
588
+ */
589
+ setZoom(zoom: number): void;
590
+
591
+ /**
592
+ * Pan camera by delta.
593
+ * @param dx - X delta
594
+ * @param dy - Y delta
595
+ */
596
+ pan(dx: number, dy: number): void;
597
+
598
+ /**
599
+ * Center camera on grid position.
600
+ * @param gridX - Grid X coordinate
601
+ * @param gridY - Grid Y coordinate
602
+ * @param screenWidth - Screen width
603
+ * @param screenHeight - Screen height
604
+ */
605
+ centerOn(gridX: number, gridY: number, screenWidth: number, screenHeight: number): void;
606
+ }
@@ -0,0 +1,109 @@
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
+
package/disk_example.png DELETED
Binary file
package/tde.png DELETED
Binary file