@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
@@ -0,0 +1,99 @@
1
+ # Fluid & Gas Dynamics (Math-Only)
2
+
3
+ Pure math helpers for SPH-style liquids and lightweight gas simulation. The math stays in `src/math/fluid.js`; consumers (games/demos) are responsible for applying forces to their particles.
4
+
5
+ ## What’s Included
6
+ - SPH density, pressure, and viscosity kernels (`computeDensities`, `computePressures`, `computeFluidForces`).
7
+ - Simplified gas mixing with diffusion/pressure/turbulence (`computeGasForces`).
8
+ - Thermal buoyancy coupling (`computeThermalBuoyancy`) that pairs with `src/math/heat.js`.
9
+ - Force blending and pure Euler integration (`blendForces`, `integrateEuler`).
10
+ - Config factory with no magic numbers (`getDefaultFluidConfig`).
11
+
12
+ ## Config
13
+ Defined in `src/math/fluid.js` and merged via `mergeConfig` internally.
14
+
15
+ ```js
16
+ const CONFIG = {
17
+ kernel: { smoothingRadius: 28 },
18
+ fluid: {
19
+ restDensity: 1.1,
20
+ particleMass: 1,
21
+ pressureStiffness: 1800,
22
+ viscosity: 0.18,
23
+ surfaceTension: 0,
24
+ maxForce: 6000,
25
+ },
26
+ gas: {
27
+ interactionRadius: 34,
28
+ pressure: 12,
29
+ diffusion: 0.08,
30
+ drag: 0.04,
31
+ buoyancy: 260,
32
+ neutralTemperature: 0.5,
33
+ turbulence: 16,
34
+ },
35
+ external: { gravity: { x: 0, y: 820 } },
36
+ };
37
+ ```
38
+
39
+ Override by passing `{ fluid: { … }, gas: { … }, kernel: { … } }` to any helper.
40
+
41
+ ## Particle Shape
42
+ Any object with `{ x, y, vx, vy, size?, mass?, custom? }`. Mass is resolved from:
43
+ `custom.mass` → `mass` → `size` → `config.fluid.particleMass`.
44
+
45
+ ## Core API (pure)
46
+ - `computeDensities(particles, cfg?)` → `Float32Array densities`.
47
+ - `computePressures(densities, cfg?)` → `Float32Array pressures`.
48
+ - `computeFluidForces(particles, cfg?)` → `{ forces, densities, pressures }`.
49
+ - `computeGasForces(particles, cfg?)` → `{ forces }`.
50
+ - `computeThermalBuoyancy(particles, cfg?)` → `forces[]` using `temperature` or `custom.temperature`.
51
+ - `blendForces(a, b, t)` → lerped forces.
52
+ - `integrateEuler(particles, forces, dt, cfg?)` → new `{ x, y, vx, vy }[]` (no mutation).
53
+
54
+ ## Applying in a Game (pattern)
55
+ 1) Build forces:
56
+
57
+ ```js
58
+ import { computeFluidForces, computeGasForces, blendForces, computeThermalBuoyancy } from "../../src/math/fluid.js";
59
+
60
+ const liquid = computeFluidForces(particles, { kernel: { smoothingRadius: 26 } });
61
+ const gas = computeGasForces(particles, { gas: { interactionRadius: 40 } });
62
+ const buoyancy = computeThermalBuoyancy(particles);
63
+
64
+ // Combine as you see fit (example: mix liquid & gas modes, then add buoyancy)
65
+ const mixed = blendForces(liquid.forces, gas.forces, modeT); // modeT: 0..1
66
+ for (let i = 0; i < particles.length; i++) {
67
+ mixed[i].x += buoyancy[i].x;
68
+ mixed[i].y += buoyancy[i].y;
69
+ }
70
+ ```
71
+
72
+ 2) Apply to your particles (consumer-controlled):
73
+
74
+ ```js
75
+ // Mutate in your game loop; math module stays pure.
76
+ for (let i = 0; i < particles.length; i++) {
77
+ const p = particles[i];
78
+ const f = mixed[i];
79
+ const mass = p.custom.mass ?? 1;
80
+ p.vx += (f.x / mass) * dt;
81
+ p.vy += (f.y / mass) * dt;
82
+ }
83
+ ```
84
+
85
+ 3) Let your normal updaters move/render (e.g., `ParticleSystem` velocity updater).
86
+
87
+ ## Heat Coupling
88
+ Assign `p.temperature` or `p.custom.temperature` each frame (e.g., via `heat.zoneTemperature`). Pass the same particles to `computeThermalBuoyancy` and add the resulting forces.
89
+
90
+ ## Notes & Tips
91
+ - Keep `smoothingRadius` proportional to particle spacing (roughly 2–3× average spacing).
92
+ - Clamp velocities in the consumer if you target 10k–20k particles to keep the frame budget.
93
+ - For gases, favor lower `pressure` and higher `diffusion` to avoid jitter.
94
+ - The math never allocates inside the hot path besides output arrays; reuse them between frames if you need fewer allocations (pass your own particles array).
95
+
96
+
97
+
98
+
99
+