@guinetik/gcanvas 1.0.0 → 1.0.2

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 (102) hide show
  1. package/demos/coordinates.html +698 -0
  2. package/demos/cube3d.html +23 -0
  3. package/demos/demos.css +17 -3
  4. package/demos/dino.html +42 -0
  5. package/demos/fluid-simple.html +22 -0
  6. package/demos/fluid.html +37 -0
  7. package/demos/gameobjects.html +626 -0
  8. package/demos/index.html +19 -7
  9. package/demos/js/blob.js +18 -5
  10. package/demos/js/coordinates.js +840 -0
  11. package/demos/js/cube3d.js +789 -0
  12. package/demos/js/dino.js +1420 -0
  13. package/demos/js/fluid-simple.js +253 -0
  14. package/demos/js/fluid.js +527 -0
  15. package/demos/js/gameobjects.js +176 -0
  16. package/demos/js/plane3d.js +256 -0
  17. package/demos/js/platformer.js +1579 -0
  18. package/demos/js/sphere3d.js +229 -0
  19. package/demos/js/sprite.js +473 -0
  20. package/demos/js/tde/accretiondisk.js +65 -12
  21. package/demos/js/tde/blackholescene.js +2 -2
  22. package/demos/js/tde/config.js +2 -2
  23. package/demos/js/tde/index.js +152 -27
  24. package/demos/js/tde/lensedstarfield.js +32 -25
  25. package/demos/js/tde/tdestar.js +78 -98
  26. package/demos/js/tde/tidalstream.js +24 -8
  27. package/demos/plane3d.html +24 -0
  28. package/demos/platformer.html +43 -0
  29. package/demos/sphere3d.html +24 -0
  30. package/demos/sprite.html +18 -0
  31. package/docs/README.md +230 -222
  32. package/docs/api/FluidSystem.md +173 -0
  33. package/docs/concepts/architecture-overview.md +204 -204
  34. package/docs/concepts/coordinate-system.md +384 -0
  35. package/docs/concepts/rendering-pipeline.md +279 -279
  36. package/docs/concepts/shapes-vs-gameobjects.md +187 -0
  37. package/docs/concepts/two-layer-architecture.md +229 -229
  38. package/docs/fluid-dynamics.md +99 -0
  39. package/docs/getting-started/first-game.md +354 -354
  40. package/docs/getting-started/installation.md +175 -157
  41. package/docs/modules/collision/README.md +2 -2
  42. package/docs/modules/fluent/README.md +6 -6
  43. package/docs/modules/game/README.md +303 -303
  44. package/docs/modules/isometric-camera.md +2 -2
  45. package/docs/modules/isometric.md +1 -1
  46. package/docs/modules/painter/README.md +328 -328
  47. package/docs/modules/particle/README.md +3 -3
  48. package/docs/modules/shapes/README.md +221 -221
  49. package/docs/modules/shapes/base/euclidian.md +123 -123
  50. package/docs/modules/shapes/base/shape.md +262 -262
  51. package/docs/modules/shapes/base/transformable.md +243 -243
  52. package/docs/modules/state/README.md +2 -2
  53. package/docs/modules/util/README.md +1 -1
  54. package/docs/modules/util/camera3d.md +3 -3
  55. package/docs/modules/util/scene3d.md +1 -1
  56. package/package.json +3 -1
  57. package/readme.md +19 -5
  58. package/src/collision/collision.js +75 -0
  59. package/src/game/game.js +11 -5
  60. package/src/game/index.js +2 -1
  61. package/src/game/objects/index.js +3 -0
  62. package/src/game/objects/platformer-scene.js +411 -0
  63. package/src/game/objects/scene.js +14 -0
  64. package/src/game/objects/sprite.js +529 -0
  65. package/src/game/pipeline.js +20 -16
  66. package/src/game/systems/FluidSystem.js +835 -0
  67. package/src/game/systems/index.js +11 -0
  68. package/src/game/ui/button.js +39 -18
  69. package/src/game/ui/cursor.js +14 -0
  70. package/src/game/ui/fps.js +12 -4
  71. package/src/game/ui/index.js +2 -0
  72. package/src/game/ui/stepper.js +549 -0
  73. package/src/game/ui/theme.js +123 -0
  74. package/src/game/ui/togglebutton.js +9 -3
  75. package/src/game/ui/tooltip.js +11 -4
  76. package/src/io/input.js +75 -45
  77. package/src/io/mouse.js +44 -19
  78. package/src/io/touch.js +35 -12
  79. package/src/math/fluid.js +507 -0
  80. package/src/math/index.js +2 -0
  81. package/src/mixins/anchor.js +17 -7
  82. package/src/motion/tweenetik.js +16 -0
  83. package/src/shapes/cube3d.js +599 -0
  84. package/src/shapes/index.js +3 -0
  85. package/src/shapes/plane3d.js +687 -0
  86. package/src/shapes/sphere3d.js +75 -6
  87. package/src/util/camera2d.js +315 -0
  88. package/src/util/camera3d.js +218 -12
  89. package/src/util/index.js +1 -0
  90. package/src/webgl/shaders/plane-shaders.js +332 -0
  91. package/src/webgl/shaders/sphere-shaders.js +4 -2
  92. package/types/fluent.d.ts +361 -0
  93. package/types/game.d.ts +303 -0
  94. package/types/index.d.ts +144 -5
  95. package/types/math.d.ts +361 -0
  96. package/types/motion.d.ts +271 -0
  97. package/types/particle.d.ts +373 -0
  98. package/types/shapes.d.ts +107 -9
  99. package/types/util.d.ts +353 -0
  100. package/types/webgl.d.ts +109 -0
  101. package/disk_example.png +0 -0
  102. package/tde.png +0 -0
package/types/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * GCanvas - TypeScript Definitions
3
3
  * A minimalist 2D canvas rendering library with shapes, game engine, and animations.
4
4
  *
5
- * @version 0.0.3-alpha
5
+ * @version 1.0.1
6
6
  * @see https://github.com/guinetik/gcanvas
7
7
  * @license ISC
8
8
  */
@@ -100,6 +100,7 @@ export {
100
100
  PatternRectangleOptions,
101
101
  ImageShape,
102
102
  ImageShapeOptions,
103
+ BitmapSource,
103
104
 
104
105
  // 2.5D shapes
105
106
  Cube,
@@ -108,6 +109,8 @@ export {
108
109
  Cone,
109
110
  Prism,
110
111
  Sphere,
112
+ Sphere3D,
113
+ Sphere3DOptions,
111
114
 
112
115
  // Text shapes
113
116
  TextShape,
@@ -174,7 +177,22 @@ export {
174
177
  ToggleButton,
175
178
  Cursor,
176
179
  CursorOptions,
177
- FPSCounter
180
+ FPSCounter,
181
+ Tooltip,
182
+ TooltipOptions,
183
+ Stepper,
184
+ StepperOptions,
185
+ UI_THEME,
186
+
187
+ // 3D and Isometric scenes
188
+ Scene3D,
189
+ Scene3DOptions,
190
+ IsometricScene,
191
+ IsometricSceneOptions,
192
+
193
+ // Fluid simulation
194
+ FluidSystem,
195
+ FluidSystemOptions
178
196
  } from './game';
179
197
 
180
198
  // ==========================================================================
@@ -188,7 +206,25 @@ export {
188
206
  TweenetikOptions,
189
207
  Motion,
190
208
  SpringParams,
191
- PositionTarget
209
+ PositionTarget,
210
+
211
+ // Standalone motion functions (V1 API)
212
+ bezierV1,
213
+ bounceV1,
214
+ floatV1,
215
+ followPath,
216
+ orbitV1,
217
+ oscillateV1,
218
+ parabolicV1,
219
+ patrolV1,
220
+ pendulumV1,
221
+ pulseV1,
222
+ hopV1,
223
+ shakeV1,
224
+ spiralV1,
225
+ springV1,
226
+ swingV1,
227
+ waypointV1
192
228
  } from './motion';
193
229
 
194
230
  // ==========================================================================
@@ -201,7 +237,41 @@ export {
201
237
  Fractals,
202
238
  Patterns,
203
239
  Noise,
204
- generatePenroseTilingPixels
240
+ generatePenroseTilingPixels,
241
+
242
+ // Tensor for GR calculations
243
+ Tensor,
244
+ TensorOptions,
245
+
246
+ // Physics modules (General Relativity)
247
+ gravitationalLensingAngle,
248
+ timeDilationFactor,
249
+ gravitationalRedshift,
250
+
251
+ // Orbital Mechanics
252
+ OrbitalState,
253
+ OrbitalElements,
254
+ orbitalVelocity,
255
+ orbitalPeriod,
256
+ elementsToState,
257
+ propagateOrbit,
258
+
259
+ // Quantum Mechanics
260
+ gaussianWavePacket,
261
+ probabilityDensity,
262
+ particleInBox,
263
+ harmonicOscillator,
264
+
265
+ // Heat Transfer
266
+ heatTransfer,
267
+ buoyancyForce,
268
+ temperatureDecay,
269
+
270
+ // Fluid Dynamics
271
+ viscosityDrag,
272
+ surfaceTension,
273
+ reynoldsNumber,
274
+ pressureGradient
205
275
  } from './math';
206
276
 
207
277
  // ==========================================================================
@@ -226,7 +296,19 @@ export {
226
296
  horizontalLayout,
227
297
  verticalLayout,
228
298
  tileLayout,
229
- gridLayout
299
+ gridLayout,
300
+
301
+ // Camera3D
302
+ Camera3D,
303
+ Camera3DOptions,
304
+ ProjectedPoint,
305
+ MouseControlOptions,
306
+ FollowOptions,
307
+ MoveToOptions,
308
+
309
+ // IsometricCamera
310
+ IsometricCamera,
311
+ IsometricCameraOptions
230
312
  } from './util';
231
313
 
232
314
  // ==========================================================================
@@ -307,3 +389,60 @@ export {
307
389
  PhaseConfig,
308
390
  SequenceOptions
309
391
  } from './state';
392
+
393
+ // ==========================================================================
394
+ // Fluent API Module
395
+ // ==========================================================================
396
+
397
+ export {
398
+ // Entry points
399
+ gcanvas,
400
+ sketch,
401
+
402
+ // Builder classes
403
+ FluentGame,
404
+ FluentGameOptions,
405
+ FluentScene,
406
+ FluentSceneOptions,
407
+ FluentGO,
408
+ FluentLayer,
409
+
410
+ // Sketch API
411
+ SketchAPI,
412
+ SketchContext,
413
+
414
+ // Context
415
+ FluentContext,
416
+ TransitionOptions
417
+ } from './fluent';
418
+
419
+ // ==========================================================================
420
+ // Particle System Module
421
+ // ==========================================================================
422
+
423
+ export {
424
+ // Core classes
425
+ Particle,
426
+ ParticleEmitter,
427
+ ParticleSystem,
428
+
429
+ // Types
430
+ ParticleColor,
431
+ ParticleShape,
432
+ ParticleEmitterOptions,
433
+ ParticleSystemOptions,
434
+ ParticleUpdater,
435
+
436
+ // Updaters namespace
437
+ Updaters
438
+ } from './particle';
439
+
440
+ // ==========================================================================
441
+ // WebGL Module (Optional)
442
+ // ==========================================================================
443
+
444
+ export {
445
+ WebGLRenderer,
446
+ WebGLRendererOptions,
447
+ SPHERE_SHADERS
448
+ } from './webgl';
package/types/math.d.ts CHANGED
@@ -266,3 +266,364 @@ export function generatePenroseTilingPixels(
266
266
  height?: number,
267
267
  options?: PenroseTilingOptions
268
268
  ): Uint8ClampedArray;
269
+
270
+ // ==========================================================================
271
+ // Tensor (Rank-2 Tensor for General Relativity)
272
+ // ==========================================================================
273
+
274
+ /** Tensor creation options */
275
+ export interface TensorOptions {
276
+ /** Name of the tensor (e.g., 'Schwarzschild') */
277
+ name?: string;
278
+ /** Metric signature (e.g., [-1, 1, 1, 1]) */
279
+ signature?: number[];
280
+ /** Coordinate names (e.g., ['t', 'r', 'θ', 'φ']) */
281
+ coordinates?: string[];
282
+ }
283
+
284
+ /**
285
+ * Rank-2 Tensor class for general relativity calculations.
286
+ * Provides immutable tensor operations following the Complex class pattern.
287
+ *
288
+ * @example
289
+ * const g = Tensor.schwarzschild(10, 2);
290
+ * console.log(g.get(0, 0)); // g_tt component
291
+ */
292
+ export class Tensor {
293
+ /** Tensor dimension (n for n×n tensor) */
294
+ readonly dimension: number;
295
+ /** Tensor name */
296
+ readonly name: string;
297
+ /** Metric signature */
298
+ readonly signature: number[] | null;
299
+ /** Coordinate names */
300
+ readonly coordinates: string[] | null;
301
+
302
+ /**
303
+ * Create a new rank-2 tensor from a 2D array of components.
304
+ * @param components - 2D array of tensor components
305
+ * @param options - Optional metadata
306
+ */
307
+ constructor(components: number[][], options?: TensorOptions);
308
+
309
+ // Static Factory Methods
310
+ /** Create a Minkowski (flat spacetime) metric tensor */
311
+ static minkowski(): Tensor;
312
+
313
+ /**
314
+ * Create a Schwarzschild metric tensor at a given radial position.
315
+ * @param r - Radial coordinate (must be > rs)
316
+ * @param rs - Schwarzschild radius (2GM/c²)
317
+ * @param theta - Polar angle (default: equatorial plane)
318
+ */
319
+ static schwarzschild(r: number, rs: number, theta?: number): Tensor;
320
+
321
+ /** Create contravariant Schwarzschild metric */
322
+ static schwarzschildContravariant(r: number, rs: number, theta?: number): Tensor;
323
+
324
+ /**
325
+ * Create a Kerr metric tensor (rotating black hole).
326
+ * @param r - Radial coordinate
327
+ * @param theta - Polar angle
328
+ * @param M - Mass parameter
329
+ * @param a - Spin parameter (0 ≤ a ≤ M)
330
+ */
331
+ static kerr(r: number, theta: number, M: number, a: number): Tensor;
332
+
333
+ /** Create contravariant Kerr metric */
334
+ static kerrContravariant(r: number, theta: number, M: number, a: number): Tensor;
335
+
336
+ /** Calculate Kerr horizon radius */
337
+ static kerrHorizonRadius(M: number, a: number, inner?: boolean): number;
338
+
339
+ /** Calculate ergosphere radius */
340
+ static kerrErgosphereRadius(M: number, a: number, theta: number): number;
341
+
342
+ /** Calculate ISCO radius for Kerr metric */
343
+ static kerrISCO(M: number, a: number, prograde?: boolean): number;
344
+
345
+ /** Calculate frame-dragging angular velocity */
346
+ static kerrFrameDraggingOmega(r: number, theta: number, M: number, a: number): number;
347
+
348
+ /** Calculate Kerr effective potential */
349
+ static kerrEffectivePotential(M: number, a: number, E: number, L: number, r: number): number;
350
+
351
+ /** Create a diagonal tensor */
352
+ static diagonal(values: number[], options?: TensorOptions): Tensor;
353
+
354
+ /** Create an identity tensor */
355
+ static identity(n?: number): Tensor;
356
+
357
+ /** Create a zero tensor */
358
+ static zero(n?: number): Tensor;
359
+
360
+ // Component Access
361
+ /** Get a component at indices */
362
+ get(i: number, j: number): number;
363
+
364
+ /** Return new tensor with component changed */
365
+ set(i: number, j: number, value: number): Tensor;
366
+
367
+ /** Get diagonal components */
368
+ getDiagonal(): number[];
369
+
370
+ // Tensor Operations
371
+ /** Add another tensor */
372
+ add(other: Tensor): Tensor;
373
+
374
+ /** Subtract another tensor */
375
+ subtract(other: Tensor): Tensor;
376
+
377
+ /** Multiply by scalar */
378
+ scale(scalar: number): Tensor;
379
+
380
+ /** Matrix multiply with another tensor */
381
+ multiply(other: Tensor): Tensor;
382
+
383
+ /** Transpose tensor */
384
+ transpose(): Tensor;
385
+
386
+ /** Compute inverse */
387
+ inverse(): Tensor;
388
+
389
+ // Derived Quantities
390
+ /** Compute determinant */
391
+ determinant(): number;
392
+
393
+ /** Compute trace */
394
+ trace(): number;
395
+
396
+ /** Check if diagonal */
397
+ isDiagonal(tolerance?: number): boolean;
398
+
399
+ /** Check if symmetric */
400
+ isSymmetric(tolerance?: number): boolean;
401
+
402
+ // GR Utilities
403
+ /**
404
+ * Compute Christoffel symbols for a metric.
405
+ * @param metricFn - Function returning metric at position
406
+ * @param position - Position [t, r, θ, φ]
407
+ * @param delta - Step size for numerical differentiation
408
+ */
409
+ static christoffel(
410
+ metricFn: (position: number[]) => Tensor,
411
+ position: number[],
412
+ delta?: number
413
+ ): number[][][];
414
+
415
+ /** Analytical Christoffel symbols for Schwarzschild */
416
+ static schwarzschildChristoffel(r: number, rs: number, theta: number): number[][][];
417
+
418
+ /** Compute effective potential for Schwarzschild geodesics */
419
+ static effectivePotential(M: number, L: number, r: number): number;
420
+
421
+ /** ISCO radius for Schwarzschild */
422
+ static iscoRadius(rs: number): number;
423
+
424
+ /** Photon sphere radius */
425
+ static photonSphereRadius(rs: number): number;
426
+
427
+ // Display
428
+ /** Get flat array of components */
429
+ toArray(): number[];
430
+
431
+ /** Get 2D array copy */
432
+ toMatrix(): number[][];
433
+
434
+ /** String representation */
435
+ toString(precision?: number): string;
436
+
437
+ /** LaTeX representation */
438
+ toLatex(precision?: number): string;
439
+ }
440
+
441
+ // ==========================================================================
442
+ // General Relativity (gr.js)
443
+ // ==========================================================================
444
+
445
+ /**
446
+ * Calculate gravitational lensing deflection.
447
+ * @param b - Impact parameter
448
+ * @param M - Mass
449
+ * @returns Deflection angle in radians
450
+ */
451
+ export function gravitationalLensingAngle(b: number, M: number): number;
452
+
453
+ /**
454
+ * Calculate time dilation factor.
455
+ * @param r - Radial coordinate
456
+ * @param rs - Schwarzschild radius
457
+ * @returns Time dilation factor (0-1)
458
+ */
459
+ export function timeDilationFactor(r: number, rs: number): number;
460
+
461
+ /**
462
+ * Calculate gravitational redshift.
463
+ * @param r - Radial coordinate
464
+ * @param rs - Schwarzschild radius
465
+ * @returns Redshift z
466
+ */
467
+ export function gravitationalRedshift(r: number, rs: number): number;
468
+
469
+ // ==========================================================================
470
+ // Orbital Mechanics (orbital.js)
471
+ // ==========================================================================
472
+
473
+ /** Orbital state vector */
474
+ export interface OrbitalState {
475
+ x: number;
476
+ y: number;
477
+ z: number;
478
+ vx: number;
479
+ vy: number;
480
+ vz: number;
481
+ }
482
+
483
+ /** Keplerian orbital elements */
484
+ export interface OrbitalElements {
485
+ a: number; // Semi-major axis
486
+ e: number; // Eccentricity
487
+ i: number; // Inclination
488
+ Omega: number; // Right ascension of ascending node
489
+ omega: number; // Argument of periapsis
490
+ nu: number; // True anomaly
491
+ }
492
+
493
+ /**
494
+ * Calculate orbital velocity at radius.
495
+ * @param r - Orbital radius
496
+ * @param M - Central mass
497
+ * @returns Orbital velocity
498
+ */
499
+ export function orbitalVelocity(r: number, M: number): number;
500
+
501
+ /**
502
+ * Calculate orbital period.
503
+ * @param a - Semi-major axis
504
+ * @param M - Central mass
505
+ * @returns Orbital period
506
+ */
507
+ export function orbitalPeriod(a: number, M: number): number;
508
+
509
+ /**
510
+ * Convert Keplerian elements to state vector.
511
+ * @param elements - Orbital elements
512
+ * @param mu - Gravitational parameter
513
+ */
514
+ export function elementsToState(elements: OrbitalElements, mu: number): OrbitalState;
515
+
516
+ /**
517
+ * Propagate orbit using Runge-Kutta.
518
+ * @param state - Current state
519
+ * @param dt - Time step
520
+ * @param mu - Gravitational parameter
521
+ */
522
+ export function propagateOrbit(state: OrbitalState, dt: number, mu: number): OrbitalState;
523
+
524
+ // ==========================================================================
525
+ // Quantum Mechanics (quantum.js)
526
+ // ==========================================================================
527
+
528
+ /**
529
+ * Gaussian wave packet.
530
+ * @param x - Position
531
+ * @param x0 - Center position
532
+ * @param k0 - Central wavenumber
533
+ * @param sigma - Width parameter
534
+ * @param t - Time
535
+ * @returns Complex amplitude {re, im}
536
+ */
537
+ export function gaussianWavePacket(
538
+ x: number,
539
+ x0: number,
540
+ k0: number,
541
+ sigma: number,
542
+ t: number
543
+ ): { re: number; im: number };
544
+
545
+ /**
546
+ * Probability density |Ψ|².
547
+ * @param psi - Wave function value {re, im}
548
+ */
549
+ export function probabilityDensity(psi: { re: number; im: number }): number;
550
+
551
+ /**
552
+ * Particle in a box wave function.
553
+ * @param x - Position (0 to L)
554
+ * @param L - Box length
555
+ * @param n - Quantum number
556
+ */
557
+ export function particleInBox(x: number, L: number, n: number): number;
558
+
559
+ /**
560
+ * Harmonic oscillator wave function.
561
+ * @param x - Position
562
+ * @param n - Energy level
563
+ * @param omega - Angular frequency
564
+ * @param m - Mass
565
+ */
566
+ export function harmonicOscillator(x: number, n: number, omega: number, m: number): number;
567
+
568
+ // ==========================================================================
569
+ // Heat Transfer (heat.js)
570
+ // ==========================================================================
571
+
572
+ /**
573
+ * Calculate heat transfer between two objects.
574
+ * @param T1 - Temperature of object 1
575
+ * @param T2 - Temperature of object 2
576
+ * @param k - Thermal conductivity
577
+ * @param dt - Time step
578
+ */
579
+ export function heatTransfer(T1: number, T2: number, k: number, dt: number): number;
580
+
581
+ /**
582
+ * Calculate buoyancy force.
583
+ * @param temperature - Object temperature
584
+ * @param ambientTemp - Ambient temperature
585
+ * @param coefficient - Buoyancy coefficient
586
+ */
587
+ export function buoyancyForce(temperature: number, ambientTemp: number, coefficient: number): number;
588
+
589
+ /**
590
+ * Temperature decay toward ambient.
591
+ * @param temp - Current temperature
592
+ * @param ambientTemp - Ambient temperature
593
+ * @param rate - Decay rate
594
+ * @param dt - Time step
595
+ */
596
+ export function temperatureDecay(temp: number, ambientTemp: number, rate: number, dt: number): number;
597
+
598
+ // ==========================================================================
599
+ // Fluid Dynamics (fluid.js)
600
+ // ==========================================================================
601
+
602
+ /**
603
+ * Calculate viscosity drag force.
604
+ * @param velocity - Velocity vector
605
+ * @param viscosity - Fluid viscosity
606
+ */
607
+ export function viscosityDrag(velocity: { x: number; y: number }, viscosity: number): { x: number; y: number };
608
+
609
+ /**
610
+ * Calculate surface tension force.
611
+ * @param curvature - Surface curvature
612
+ * @param tension - Surface tension coefficient
613
+ */
614
+ export function surfaceTension(curvature: number, tension: number): number;
615
+
616
+ /**
617
+ * Calculate Reynolds number.
618
+ * @param velocity - Flow velocity
619
+ * @param length - Characteristic length
620
+ * @param viscosity - Kinematic viscosity
621
+ */
622
+ export function reynoldsNumber(velocity: number, length: number, viscosity: number): number;
623
+
624
+ /**
625
+ * Navier-Stokes pressure term.
626
+ * @param density - Fluid density
627
+ * @param pressure - Pressure
628
+ */
629
+ export function pressureGradient(density: number, pressure: number): number;