@triforge/particle-core 0.1.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 (153) hide show
  1. package/dist/core/BaseEmitter.d.ts +50 -0
  2. package/dist/core/BaseEmitter.d.ts.map +1 -0
  3. package/dist/core/BaseEmitter.js +53 -0
  4. package/dist/core/BaseEmitter.js.map +1 -0
  5. package/dist/core/BaseForce.d.ts +21 -0
  6. package/dist/core/BaseForce.d.ts.map +1 -0
  7. package/dist/core/BaseForce.js +15 -0
  8. package/dist/core/BaseForce.js.map +1 -0
  9. package/dist/core/BaseRenderer.d.ts +96 -0
  10. package/dist/core/BaseRenderer.d.ts.map +1 -0
  11. package/dist/core/BaseRenderer.js +190 -0
  12. package/dist/core/BaseRenderer.js.map +1 -0
  13. package/dist/core/DeflectorCollider.d.ts +46 -0
  14. package/dist/core/DeflectorCollider.d.ts.map +1 -0
  15. package/dist/core/DeflectorCollider.js +113 -0
  16. package/dist/core/DeflectorCollider.js.map +1 -0
  17. package/dist/core/Particle.d.ts +29 -0
  18. package/dist/core/Particle.d.ts.map +1 -0
  19. package/dist/core/Particle.js +41 -0
  20. package/dist/core/Particle.js.map +1 -0
  21. package/dist/core/ParticleCache.d.ts +73 -0
  22. package/dist/core/ParticleCache.d.ts.map +1 -0
  23. package/dist/core/ParticleCache.js +206 -0
  24. package/dist/core/ParticleCache.js.map +1 -0
  25. package/dist/core/ParticleSystem.d.ts +192 -0
  26. package/dist/core/ParticleSystem.d.ts.map +1 -0
  27. package/dist/core/ParticleSystem.js +484 -0
  28. package/dist/core/ParticleSystem.js.map +1 -0
  29. package/dist/core/SeededRandom.d.ts +17 -0
  30. package/dist/core/SeededRandom.d.ts.map +1 -0
  31. package/dist/core/SeededRandom.js +27 -0
  32. package/dist/core/SeededRandom.js.map +1 -0
  33. package/dist/emitters/EdgeEmitter.d.ts +43 -0
  34. package/dist/emitters/EdgeEmitter.d.ts.map +1 -0
  35. package/dist/emitters/EdgeEmitter.js +78 -0
  36. package/dist/emitters/EdgeEmitter.js.map +1 -0
  37. package/dist/emitters/MeshEmitter.d.ts +83 -0
  38. package/dist/emitters/MeshEmitter.d.ts.map +1 -0
  39. package/dist/emitters/MeshEmitter.js +240 -0
  40. package/dist/emitters/MeshEmitter.js.map +1 -0
  41. package/dist/emitters/PointEmitter.d.ts +22 -0
  42. package/dist/emitters/PointEmitter.d.ts.map +1 -0
  43. package/dist/emitters/PointEmitter.js +26 -0
  44. package/dist/emitters/PointEmitter.js.map +1 -0
  45. package/dist/forces/BoidField.d.ts +58 -0
  46. package/dist/forces/BoidField.d.ts.map +1 -0
  47. package/dist/forces/BoidField.js +82 -0
  48. package/dist/forces/BoidField.js.map +1 -0
  49. package/dist/forces/BoidForce.d.ts +54 -0
  50. package/dist/forces/BoidForce.d.ts.map +1 -0
  51. package/dist/forces/BoidForce.js +233 -0
  52. package/dist/forces/BoidForce.js.map +1 -0
  53. package/dist/forces/ChargeForce.d.ts +22 -0
  54. package/dist/forces/ChargeForce.d.ts.map +1 -0
  55. package/dist/forces/ChargeForce.js +35 -0
  56. package/dist/forces/ChargeForce.js.map +1 -0
  57. package/dist/forces/CurveGuideForce.d.ts +43 -0
  58. package/dist/forces/CurveGuideForce.d.ts.map +1 -0
  59. package/dist/forces/CurveGuideForce.js +118 -0
  60. package/dist/forces/CurveGuideForce.js.map +1 -0
  61. package/dist/forces/DragForce.d.ts +19 -0
  62. package/dist/forces/DragForce.d.ts.map +1 -0
  63. package/dist/forces/DragForce.js +31 -0
  64. package/dist/forces/DragForce.js.map +1 -0
  65. package/dist/forces/FlowFieldForce.d.ts +72 -0
  66. package/dist/forces/FlowFieldForce.d.ts.map +1 -0
  67. package/dist/forces/FlowFieldForce.js +68 -0
  68. package/dist/forces/FlowFieldForce.js.map +1 -0
  69. package/dist/forces/ForceField.d.ts +26 -0
  70. package/dist/forces/ForceField.d.ts.map +1 -0
  71. package/dist/forces/ForceField.js +41 -0
  72. package/dist/forces/ForceField.js.map +1 -0
  73. package/dist/forces/GravityForce.d.ts +9 -0
  74. package/dist/forces/GravityForce.d.ts.map +1 -0
  75. package/dist/forces/GravityForce.js +12 -0
  76. package/dist/forces/GravityForce.js.map +1 -0
  77. package/dist/forces/HarmonicForce.d.ts +22 -0
  78. package/dist/forces/HarmonicForce.d.ts.map +1 -0
  79. package/dist/forces/HarmonicForce.js +31 -0
  80. package/dist/forces/HarmonicForce.js.map +1 -0
  81. package/dist/forces/LennardJonesForce.d.ts +23 -0
  82. package/dist/forces/LennardJonesForce.d.ts.map +1 -0
  83. package/dist/forces/LennardJonesForce.js +38 -0
  84. package/dist/forces/LennardJonesForce.js.map +1 -0
  85. package/dist/forces/MagneticForce.d.ts +21 -0
  86. package/dist/forces/MagneticForce.d.ts.map +1 -0
  87. package/dist/forces/MagneticForce.js +30 -0
  88. package/dist/forces/MagneticForce.js.map +1 -0
  89. package/dist/forces/TextureForce.d.ts +37 -0
  90. package/dist/forces/TextureForce.d.ts.map +1 -0
  91. package/dist/forces/TextureForce.js +56 -0
  92. package/dist/forces/TextureForce.js.map +1 -0
  93. package/dist/forces/TurbulenceForce.d.ts +21 -0
  94. package/dist/forces/TurbulenceForce.d.ts.map +1 -0
  95. package/dist/forces/TurbulenceForce.js +39 -0
  96. package/dist/forces/TurbulenceForce.js.map +1 -0
  97. package/dist/forces/VortexForce.d.ts +21 -0
  98. package/dist/forces/VortexForce.d.ts.map +1 -0
  99. package/dist/forces/VortexForce.js +29 -0
  100. package/dist/forces/VortexForce.js.map +1 -0
  101. package/dist/forces/WindForce.d.ts +21 -0
  102. package/dist/forces/WindForce.d.ts.map +1 -0
  103. package/dist/forces/WindForce.js +29 -0
  104. package/dist/forces/WindForce.js.map +1 -0
  105. package/dist/index.d.ts +56 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +44 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/physics/KeyedPhysics.d.ts +43 -0
  110. package/dist/physics/KeyedPhysics.d.ts.map +1 -0
  111. package/dist/physics/KeyedPhysics.js +73 -0
  112. package/dist/physics/KeyedPhysics.js.map +1 -0
  113. package/dist/physics/SPHPhysics.d.ts +27 -0
  114. package/dist/physics/SPHPhysics.d.ts.map +1 -0
  115. package/dist/physics/SPHPhysics.js +119 -0
  116. package/dist/physics/SPHPhysics.js.map +1 -0
  117. package/dist/renderers/BillboardRenderer.d.ts +75 -0
  118. package/dist/renderers/BillboardRenderer.d.ts.map +1 -0
  119. package/dist/renderers/BillboardRenderer.js +106 -0
  120. package/dist/renderers/BillboardRenderer.js.map +1 -0
  121. package/dist/renderers/CollectionRenderer.d.ts +83 -0
  122. package/dist/renderers/CollectionRenderer.d.ts.map +1 -0
  123. package/dist/renderers/CollectionRenderer.js +161 -0
  124. package/dist/renderers/CollectionRenderer.js.map +1 -0
  125. package/dist/renderers/HaloRenderer.d.ts +3 -0
  126. package/dist/renderers/HaloRenderer.d.ts.map +1 -0
  127. package/dist/renderers/HaloRenderer.js +4 -0
  128. package/dist/renderers/HaloRenderer.js.map +1 -0
  129. package/dist/renderers/InstanceRenderer.d.ts +70 -0
  130. package/dist/renderers/InstanceRenderer.d.ts.map +1 -0
  131. package/dist/renderers/InstanceRenderer.js +86 -0
  132. package/dist/renderers/InstanceRenderer.js.map +1 -0
  133. package/dist/renderers/LineRenderer.d.ts +52 -0
  134. package/dist/renderers/LineRenderer.d.ts.map +1 -0
  135. package/dist/renderers/LineRenderer.js +96 -0
  136. package/dist/renderers/LineRenderer.js.map +1 -0
  137. package/dist/renderers/NoneRenderer.d.ts +19 -0
  138. package/dist/renderers/NoneRenderer.d.ts.map +1 -0
  139. package/dist/renderers/NoneRenderer.js +24 -0
  140. package/dist/renderers/NoneRenderer.js.map +1 -0
  141. package/dist/renderers/ObjectRenderer.d.ts +3 -0
  142. package/dist/renderers/ObjectRenderer.d.ts.map +1 -0
  143. package/dist/renderers/ObjectRenderer.js +4 -0
  144. package/dist/renderers/ObjectRenderer.js.map +1 -0
  145. package/dist/renderers/StrandRenderer.d.ts +169 -0
  146. package/dist/renderers/StrandRenderer.d.ts.map +1 -0
  147. package/dist/renderers/StrandRenderer.js +235 -0
  148. package/dist/renderers/StrandRenderer.js.map +1 -0
  149. package/dist/renderers/TrailRenderer.d.ts +54 -0
  150. package/dist/renderers/TrailRenderer.d.ts.map +1 -0
  151. package/dist/renderers/TrailRenderer.js +114 -0
  152. package/dist/renderers/TrailRenderer.js.map +1 -0
  153. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurbulenceForce.js","sourceRoot":"","sources":["../../src/forces/TurbulenceForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAS,OAAO,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAQ,sBAAsB,CAAA;AAGlD,mEAAmE;AACnE,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAM5C,YAAY,OAGR,EAAE;QACJ,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QACrE,IAAI,CAAC,UAAU,GAAG;YAChB,QAAQ,EAAK,IAAI,CAAC,QAAQ,IAAO,CAAC;YAClC,KAAK,EAAQ,IAAI,CAAC,KAAK,IAAU,CAAC;YAClC,KAAK,EAAQ,IAAI,CAAC,KAAK,IAAU,CAAC;YAClC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAkB,EAAE,EAAU;QAClC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC/D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,WAAW,GAAG,WAAW;gBAAE,OAAM;QACrE,CAAC;QACD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,CAAA;QAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAA;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAA;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAA;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAG,CAAC,GAAG,GAAG,CAAC,CAAA;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAG,CAAC,GAAG,GAAG,CAAC,CAAA;QACjD,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAA;QACzC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAA;QACzC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAA;IAC3C,CAAC;IAEO,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,UAAU,CAAA;QACjE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Vector3 } from 'three';
2
+ import { BaseForce } from '../core/BaseForce.js';
3
+ import type { Particle } from '../core/Particle.js';
4
+ /** Spiral force around an axis (Blender: Force Field → Vortex) */
5
+ export declare class VortexForce extends BaseForce {
6
+ parameters: Record<string, number>;
7
+ /** World-space axis origin — axis passes through this point. Not GSAP-animatable. */
8
+ position: Vector3;
9
+ constructor(opts?: {
10
+ strength?: number;
11
+ axisX?: number;
12
+ axisY?: number;
13
+ axisZ?: number;
14
+ maxDistance?: number;
15
+ px?: number;
16
+ py?: number;
17
+ pz?: number;
18
+ });
19
+ apply(particle: Particle, dt: number): void;
20
+ }
21
+ //# sourceMappingURL=VortexForce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VortexForce.d.ts","sourceRoot":"","sources":["../../src/forces/VortexForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAS,OAAO,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAQ,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,kEAAkE;AAClE,qBAAa,WAAY,SAAQ,SAAS;IACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAElC,qFAAqF;IACrF,QAAQ,EAAE,OAAO,CAAA;gBAEL,IAAI,GAAE;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;QACjE,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KACjC;IAYN,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CAW5C"}
@@ -0,0 +1,29 @@
1
+ import { Vector3 } from 'three';
2
+ import { BaseForce } from '../core/BaseForce.js';
3
+ /** Spiral force around an axis (Blender: Force Field → Vortex) */
4
+ export class VortexForce extends BaseForce {
5
+ constructor(opts = {}) {
6
+ super();
7
+ this.position = new Vector3(opts.px ?? 0, opts.py ?? 0, opts.pz ?? 0);
8
+ this.parameters = {
9
+ strength: opts.strength ?? 1,
10
+ axisX: opts.axisX ?? 0,
11
+ axisY: opts.axisY ?? 1,
12
+ axisZ: opts.axisZ ?? 0,
13
+ maxDistance: opts.maxDistance ?? 0,
14
+ };
15
+ }
16
+ apply(particle, dt) {
17
+ const p = this.parameters;
18
+ const dx = particle.position.x - this.position.x;
19
+ const dy = particle.position.y - this.position.y;
20
+ const dz = particle.position.z - this.position.z;
21
+ if (p.maxDistance > 0 && dx * dx + dy * dy + dz * dz > p.maxDistance * p.maxDistance)
22
+ return;
23
+ const axis = new Vector3(p.axisX, p.axisY, p.axisZ).normalize();
24
+ const rel = new Vector3(dx, dy, dz);
25
+ const tangential = new Vector3().crossVectors(axis, rel).normalize();
26
+ particle.velocity.addScaledVector(tangential, p.strength * dt);
27
+ }
28
+ }
29
+ //# sourceMappingURL=VortexForce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VortexForce.js","sourceRoot":"","sources":["../../src/forces/VortexForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAS,OAAO,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAQ,sBAAsB,CAAA;AAGlD,kEAAkE;AAClE,MAAM,OAAO,WAAY,SAAQ,SAAS;IAMxC,YAAY,OAIR,EAAE;QACJ,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QACrE,IAAI,CAAC,UAAU,GAAG;YAChB,QAAQ,EAAK,IAAI,CAAC,QAAQ,IAAO,CAAC;YAClC,KAAK,EAAQ,IAAI,CAAC,KAAK,IAAS,CAAC;YACjC,KAAK,EAAQ,IAAI,CAAC,KAAK,IAAS,CAAC;YACjC,KAAK,EAAQ,IAAI,CAAC,KAAK,IAAS,CAAC;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAkB,EAAE,EAAU;QAClC,MAAM,CAAC,GAAI,IAAI,CAAC,UAAU,CAAA;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChD,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;YAAE,OAAM;QAC5F,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAA;QAC/D,MAAM,GAAG,GAAI,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACpC,MAAM,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;QACpE,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAA;IAChE,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Vector3 } from 'three';
2
+ import { BaseForce } from '../core/BaseForce.js';
3
+ import type { Particle } from '../core/Particle.js';
4
+ /** Constant directional wind (Blender: Force Field → Wind) */
5
+ export declare class WindForce extends BaseForce {
6
+ parameters: Record<string, number>;
7
+ /** World-space field origin used for maxDistance range check. Not GSAP-animatable. */
8
+ position: Vector3;
9
+ constructor(opts?: {
10
+ x?: number;
11
+ y?: number;
12
+ z?: number;
13
+ strength?: number;
14
+ maxDistance?: number;
15
+ px?: number;
16
+ py?: number;
17
+ pz?: number;
18
+ });
19
+ apply(particle: Particle, dt: number): void;
20
+ }
21
+ //# sourceMappingURL=WindForce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindForce.d.ts","sourceRoot":"","sources":["../../src/forces/WindForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAS,OAAO,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAQ,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,8DAA8D;AAC9D,qBAAa,SAAU,SAAQ,SAAS;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAElC,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAA;gBAEL,IAAI,GAAE;QAChB,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;QACrD,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KACjC;IAYN,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CAW5C"}
@@ -0,0 +1,29 @@
1
+ import { Vector3 } from 'three';
2
+ import { BaseForce } from '../core/BaseForce.js';
3
+ /** Constant directional wind (Blender: Force Field → Wind) */
4
+ export class WindForce extends BaseForce {
5
+ constructor(opts = {}) {
6
+ super();
7
+ this.position = new Vector3(opts.px ?? 0, opts.py ?? 0, opts.pz ?? 0);
8
+ this.parameters = {
9
+ x: opts.x ?? 0,
10
+ y: opts.y ?? 0,
11
+ z: opts.z ?? 1,
12
+ strength: opts.strength ?? 1,
13
+ maxDistance: opts.maxDistance ?? 0,
14
+ };
15
+ }
16
+ apply(particle, dt) {
17
+ const p = this.parameters;
18
+ if (p.maxDistance > 0) {
19
+ const dx = particle.position.x - this.position.x;
20
+ const dy = particle.position.y - this.position.y;
21
+ const dz = particle.position.z - this.position.z;
22
+ if (dx * dx + dy * dy + dz * dz > p.maxDistance * p.maxDistance)
23
+ return;
24
+ }
25
+ const dir = new Vector3(p.x, p.y, p.z).normalize();
26
+ particle.velocity.addScaledVector(dir, p.strength * dt);
27
+ }
28
+ }
29
+ //# sourceMappingURL=WindForce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindForce.js","sourceRoot":"","sources":["../../src/forces/WindForce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAS,OAAO,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAQ,sBAAsB,CAAA;AAGlD,8DAA8D;AAC9D,MAAM,OAAO,SAAU,SAAQ,SAAS;IAMtC,YAAY,OAIR,EAAE;QACJ,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QACrE,IAAI,CAAC,UAAU,GAAG;YAChB,CAAC,EAAY,IAAI,CAAC,CAAC,IAAc,CAAC;YAClC,CAAC,EAAY,IAAI,CAAC,CAAC,IAAc,CAAC;YAClC,CAAC,EAAY,IAAI,CAAC,CAAC,IAAc,CAAC;YAClC,QAAQ,EAAK,IAAI,CAAC,QAAQ,IAAO,CAAC;YAClC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;SACnC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAkB,EAAE,EAAU;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAA;QACzB,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChD,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;gBAAE,OAAM;QACzE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;QAClD,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ export { Particle } from './core/Particle.js';
2
+ export { SeededRandom } from './core/SeededRandom.js';
3
+ export { ParticleSystem } from './core/ParticleSystem.js';
4
+ export { ParticleCache } from './core/ParticleCache.js';
5
+ export { DeflectorCollider } from './core/DeflectorCollider.js';
6
+ export { BaseEmitter } from './core/BaseEmitter.js';
7
+ export { BaseForce } from './core/BaseForce.js';
8
+ export { BaseRenderer } from './core/BaseRenderer.js';
9
+ export { PointEmitter } from './emitters/PointEmitter.js';
10
+ export { MeshEmitter } from './emitters/MeshEmitter.js';
11
+ export { EdgeEmitter } from './emitters/EdgeEmitter.js';
12
+ export { GravityForce } from './forces/GravityForce.js';
13
+ export { WindForce } from './forces/WindForce.js';
14
+ export { VortexForce } from './forces/VortexForce.js';
15
+ export { TurbulenceForce } from './forces/TurbulenceForce.js';
16
+ export { DragForce } from './forces/DragForce.js';
17
+ export { MagneticForce } from './forces/MagneticForce.js';
18
+ export { HarmonicForce } from './forces/HarmonicForce.js';
19
+ export { LennardJonesForce } from './forces/LennardJonesForce.js';
20
+ export { ChargeForce } from './forces/ChargeForce.js';
21
+ export { BoidForce } from './forces/BoidForce.js';
22
+ export { ForceField } from './forces/ForceField.js';
23
+ export { TextureForce } from './forces/TextureForce.js';
24
+ export { CurveGuideForce } from './forces/CurveGuideForce.js';
25
+ export { FlowFieldForce } from './forces/FlowFieldForce.js';
26
+ export { BoidField } from './forces/BoidField.js';
27
+ export type { BoidFieldSource, BoidFieldOptions } from './forces/BoidField.js';
28
+ export { KeyedPhysics } from './physics/KeyedPhysics.js';
29
+ export { SPHPhysics } from './physics/SPHPhysics.js';
30
+ export { BillboardRenderer } from './renderers/BillboardRenderer.js';
31
+ export { InstanceRenderer } from './renderers/InstanceRenderer.js';
32
+ export { LineRenderer } from './renderers/LineRenderer.js';
33
+ export { CollectionRenderer } from './renderers/CollectionRenderer.js';
34
+ export { TrailRenderer } from './renderers/TrailRenderer.js';
35
+ export { HaloRenderer } from './renderers/HaloRenderer.js';
36
+ export { ObjectRenderer } from './renderers/ObjectRenderer.js';
37
+ export { StrandRenderer } from './renderers/StrandRenderer.js';
38
+ export type { StrandCurveFn, StrandRenderMode, StrandRendererOptions } from './renderers/StrandRenderer.js';
39
+ export { NoneRenderer } from './renderers/NoneRenderer.js';
40
+ export type { DeflectorColliderOptions } from './core/DeflectorCollider.js';
41
+ export type { EmitFrom, BaseEmitterOptions } from './core/BaseEmitter.js';
42
+ export type { ParticleSystemOptions } from './core/ParticleSystem.js';
43
+ export type { BillboardRendererOptions } from './renderers/BillboardRenderer.js';
44
+ export type { HaloRendererOptions } from './renderers/HaloRenderer.js';
45
+ export type { InstanceRendererOptions } from './renderers/InstanceRenderer.js';
46
+ export type { ObjectRendererOptions } from './renderers/ObjectRenderer.js';
47
+ export type { LineRendererOptions } from './renderers/LineRenderer.js';
48
+ export type { CollectionRendererOptions, CollectionMesh } from './renderers/CollectionRenderer.js';
49
+ export type { TextureForceOptions } from './forces/TextureForce.js';
50
+ export type { TrailRendererOptions } from './renderers/TrailRenderer.js';
51
+ export type { EdgeEmitterOptions } from './emitters/EdgeEmitter.js';
52
+ export type { PointEmitterOptions } from './emitters/PointEmitter.js';
53
+ export type { MeshEmitterOptions } from './emitters/MeshEmitter.js';
54
+ export type { BoidObstacle } from './forces/BoidForce.js';
55
+ export type { FlowVelocityFn, FlowFieldForceOptions } from './forces/FlowFieldForce.js';
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ // Core
2
+ export { Particle } from './core/Particle.js';
3
+ export { SeededRandom } from './core/SeededRandom.js';
4
+ export { ParticleSystem } from './core/ParticleSystem.js';
5
+ export { ParticleCache } from './core/ParticleCache.js';
6
+ export { DeflectorCollider } from './core/DeflectorCollider.js';
7
+ export { BaseEmitter } from './core/BaseEmitter.js';
8
+ export { BaseForce } from './core/BaseForce.js';
9
+ export { BaseRenderer } from './core/BaseRenderer.js';
10
+ // Emitters
11
+ export { PointEmitter } from './emitters/PointEmitter.js';
12
+ export { MeshEmitter } from './emitters/MeshEmitter.js';
13
+ export { EdgeEmitter } from './emitters/EdgeEmitter.js';
14
+ // Forces
15
+ export { GravityForce } from './forces/GravityForce.js';
16
+ export { WindForce } from './forces/WindForce.js';
17
+ export { VortexForce } from './forces/VortexForce.js';
18
+ export { TurbulenceForce } from './forces/TurbulenceForce.js';
19
+ export { DragForce } from './forces/DragForce.js';
20
+ export { MagneticForce } from './forces/MagneticForce.js';
21
+ export { HarmonicForce } from './forces/HarmonicForce.js';
22
+ export { LennardJonesForce } from './forces/LennardJonesForce.js';
23
+ export { ChargeForce } from './forces/ChargeForce.js';
24
+ export { BoidForce } from './forces/BoidForce.js';
25
+ export { ForceField } from './forces/ForceField.js';
26
+ export { TextureForce } from './forces/TextureForce.js';
27
+ export { CurveGuideForce } from './forces/CurveGuideForce.js';
28
+ export { FlowFieldForce } from './forces/FlowFieldForce.js';
29
+ export { BoidField } from './forces/BoidField.js';
30
+ // Physics stubs
31
+ export { KeyedPhysics } from './physics/KeyedPhysics.js';
32
+ export { SPHPhysics } from './physics/SPHPhysics.js';
33
+ // Renderers (implementation names)
34
+ export { BillboardRenderer } from './renderers/BillboardRenderer.js';
35
+ export { InstanceRenderer } from './renderers/InstanceRenderer.js';
36
+ export { LineRenderer } from './renderers/LineRenderer.js';
37
+ export { CollectionRenderer } from './renderers/CollectionRenderer.js';
38
+ export { TrailRenderer } from './renderers/TrailRenderer.js';
39
+ // Renderers (Blender panel names — same classes, alternate exports)
40
+ export { HaloRenderer } from './renderers/HaloRenderer.js';
41
+ export { ObjectRenderer } from './renderers/ObjectRenderer.js';
42
+ export { StrandRenderer } from './renderers/StrandRenderer.js';
43
+ export { NoneRenderer } from './renderers/NoneRenderer.js';
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAe,oBAAoB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAW,wBAAwB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAS,0BAA0B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAU,yBAAyB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAY,uBAAuB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAc,qBAAqB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAW,wBAAwB,CAAA;AAE1D,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAS,4BAA4B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAU,2BAA2B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAU,2BAA2B,CAAA;AAE3D,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAW,0BAA0B,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAc,uBAAuB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAY,yBAAyB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAQ,6BAA6B,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAc,uBAAuB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAU,2BAA2B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAU,2BAA2B,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAY,yBAAyB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAc,uBAAuB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAa,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAW,0BAA0B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAQ,6BAA6B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAS,4BAA4B,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAc,uBAAuB,CAAA;AAGzD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAO,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAS,yBAAyB,CAAA;AAEvD,mCAAmC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAQ,kCAAkC,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAS,iCAAiC,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAa,6BAA6B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAO,mCAAmC,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAY,8BAA8B,CAAA;AAElE,oEAAoE;AACpE,OAAO,EAAE,YAAY,EAAE,MAAa,6BAA6B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAW,+BAA+B,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAA+C,+BAA+B,CAAA;AAEvG,OAAO,EAAE,YAAY,EAAE,MAAa,6BAA6B,CAAA"}
@@ -0,0 +1,43 @@
1
+ import type { Particle } from '../core/Particle.js';
2
+ import type { ParticleSystem } from '../core/ParticleSystem.js';
3
+ /**
4
+ * KeyedPhysics — Blender: Keyed physics type.
5
+ *
6
+ * Blends particle positions (and velocities) between a list of target
7
+ * particle systems. `parameters.blend` drives the blend index:
8
+ * 0 → particles match target[0] exactly
9
+ * 0.5 → halfway between target[0] and target[1]
10
+ * 1 → particles match target[1] exactly
11
+ * N → particles match target[N] exactly
12
+ *
13
+ * The blend value can be driven by GSAP or st-keyframe AnimationMixer
14
+ * via the `parameters` object — no cross-package imports needed.
15
+ *
16
+ * @example
17
+ * const sys = new ParticleSystem({ count: 500 })
18
+ * const key = new KeyedPhysics([targetA, targetB])
19
+ * sys.addPhysics(key)
20
+ *
21
+ * // Drive blend from outside:
22
+ * gsap.to(key.parameters, { blend: 1.0, duration: 2 })
23
+ */
24
+ export declare class KeyedPhysics {
25
+ /** All public scalar inputs — GSAP / st-keyframe compatible. */
26
+ parameters: Record<string, number>;
27
+ /**
28
+ * How strongly position is pulled toward the target [0–1].
29
+ * 1 = snap to target each frame (Blender default).
30
+ * Lower values give spring-like interpolation.
31
+ */
32
+ stiffness: number;
33
+ private readonly _targets;
34
+ constructor(targets: ParticleSystem[], stiffness?: number);
35
+ /** Number of registered target systems. */
36
+ get targetCount(): number;
37
+ /**
38
+ * Apply keyed blending to the live pool.
39
+ * Called by ParticleSystem.step() each tick.
40
+ */
41
+ apply(pool: Particle[], _dt: number): void;
42
+ }
43
+ //# sourceMappingURL=KeyedPhysics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyedPhysics.d.ts","sourceRoot":"","sources":["../../src/physics/KeyedPhysics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAY,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,YAAY;IACvB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAElC;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAE/B,OAAO,EAAE,cAAc,EAAE,EAAE,SAAS,SAAM;IAQtD,2CAA2C;IAC3C,IAAI,WAAW,IAAI,MAAM,CAAgC;IAEzD;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAqC3C"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * KeyedPhysics — Blender: Keyed physics type.
3
+ *
4
+ * Blends particle positions (and velocities) between a list of target
5
+ * particle systems. `parameters.blend` drives the blend index:
6
+ * 0 → particles match target[0] exactly
7
+ * 0.5 → halfway between target[0] and target[1]
8
+ * 1 → particles match target[1] exactly
9
+ * N → particles match target[N] exactly
10
+ *
11
+ * The blend value can be driven by GSAP or st-keyframe AnimationMixer
12
+ * via the `parameters` object — no cross-package imports needed.
13
+ *
14
+ * @example
15
+ * const sys = new ParticleSystem({ count: 500 })
16
+ * const key = new KeyedPhysics([targetA, targetB])
17
+ * sys.addPhysics(key)
18
+ *
19
+ * // Drive blend from outside:
20
+ * gsap.to(key.parameters, { blend: 1.0, duration: 2 })
21
+ */
22
+ export class KeyedPhysics {
23
+ constructor(targets, stiffness = 1.0) {
24
+ this._targets = targets;
25
+ this.stiffness = stiffness;
26
+ this.parameters = {
27
+ blend: 0, // 0 = target[0], 1 = target[1], etc.
28
+ };
29
+ }
30
+ /** Number of registered target systems. */
31
+ get targetCount() { return this._targets.length; }
32
+ /**
33
+ * Apply keyed blending to the live pool.
34
+ * Called by ParticleSystem.step() each tick.
35
+ */
36
+ apply(pool, _dt) {
37
+ if (this._targets.length === 0)
38
+ return;
39
+ const blend = Math.max(0, this.parameters.blend);
40
+ const loIdx = Math.min(Math.floor(blend), this._targets.length - 1);
41
+ const hiIdx = Math.min(loIdx + 1, this._targets.length - 1);
42
+ const t = blend - loIdx; // fractional part [0, 1]
43
+ const loPool = this._targets[loIdx].pool;
44
+ const hiPool = hiIdx !== loIdx ? this._targets[hiIdx].pool : null;
45
+ for (let i = 0; i < pool.length; i++) {
46
+ const p = pool[i];
47
+ if (!p.alive)
48
+ continue;
49
+ const loP = loPool[i % loPool.length];
50
+ if (!loP)
51
+ continue;
52
+ if (hiPool && t > 0) {
53
+ const hiP = hiPool[i % hiPool.length];
54
+ if (hiP) {
55
+ p.position.lerpVectors(loP.position, hiP.position, t);
56
+ p.velocity.lerpVectors(loP.velocity, hiP.velocity, t);
57
+ }
58
+ else {
59
+ p.position.copy(loP.position);
60
+ p.velocity.copy(loP.velocity);
61
+ }
62
+ }
63
+ else {
64
+ p.position.copy(loP.position);
65
+ p.velocity.copy(loP.velocity);
66
+ }
67
+ // Optionally copy size / normalised for visual variation
68
+ p.size = loP ? loP.size * (1 - t) + (hiPool ? (hiPool[i % hiPool.length]?.size ?? loP.size) : loP.size) * t : p.size;
69
+ p.normalised = loP.normalised;
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=KeyedPhysics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyedPhysics.js","sourceRoot":"","sources":["../../src/physics/KeyedPhysics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Particle } from '../core/Particle.js';
2
+ /**
3
+ * SPH fluid particle physics — Müller et al. 2003.
4
+ * Poly6 density · Spiky pressure gradient · Viscosity Laplacian.
5
+ * Self-contained: no dependency on st-fluid-core.
6
+ *
7
+ * Blender parallel: Fluid physics type on a particle system.
8
+ */
9
+ export declare class SPHPhysics {
10
+ /** All public scalar inputs — GSAP / keyframe compatible */
11
+ parameters: Record<string, number>;
12
+ /** Smoothing radius (world units) */
13
+ h: number;
14
+ /** Rest density (particles/volume) */
15
+ restDensity: number;
16
+ constructor(opts?: {
17
+ stiffness?: number;
18
+ viscosity?: number;
19
+ buoyancy?: number;
20
+ surfaceTension?: number;
21
+ repulsion?: number;
22
+ h?: number;
23
+ restDensity?: number;
24
+ });
25
+ apply(pool: Particle[], dt: number): void;
26
+ }
27
+ //# sourceMappingURL=SPHPhysics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SPHPhysics.d.ts","sourceRoot":"","sources":["../../src/physics/SPHPhysics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAElC,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAA;IAET,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAA;gBAEP,IAAI,GAAE;QAChB,SAAS,CAAC,EAAO,MAAM,CAAA;QACvB,SAAS,CAAC,EAAO,MAAM,CAAA;QACvB,QAAQ,CAAC,EAAQ,MAAM,CAAA;QACvB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,SAAS,CAAC,EAAO,MAAM,CAAA;QACvB,CAAC,CAAC,EAAe,MAAM,CAAA;QACvB,WAAW,CAAC,EAAK,MAAM,CAAA;KACnB;IAYN,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CAyG1C"}
@@ -0,0 +1,119 @@
1
+ import { Vector3 } from 'three';
2
+ /**
3
+ * SPH fluid particle physics — Müller et al. 2003.
4
+ * Poly6 density · Spiky pressure gradient · Viscosity Laplacian.
5
+ * Self-contained: no dependency on st-fluid-core.
6
+ *
7
+ * Blender parallel: Fluid physics type on a particle system.
8
+ */
9
+ export class SPHPhysics {
10
+ constructor(opts = {}) {
11
+ this.parameters = {
12
+ stiffness: opts.stiffness ?? 1,
13
+ viscosity: opts.viscosity ?? 0.1,
14
+ buoyancy: opts.buoyancy ?? 0,
15
+ surfaceTension: opts.surfaceTension ?? 0,
16
+ repulsion: opts.repulsion ?? 1,
17
+ };
18
+ this.h = opts.h ?? 1.0;
19
+ this.restDensity = opts.restDensity ?? 1.0;
20
+ }
21
+ apply(pool, dt) {
22
+ const alive = [];
23
+ for (const p of pool)
24
+ if (p.alive)
25
+ alive.push(p);
26
+ if (alive.length < 2)
27
+ return;
28
+ const { stiffness, viscosity } = this.parameters;
29
+ const h = this.h;
30
+ const h2 = h * h;
31
+ const h6 = h2 * h2 * h2;
32
+ const h9 = h6 * h2 * h;
33
+ // Poly6 density kernel coefficient: 315 / (64π h^9)
34
+ const kPoly6 = 315.0 / (64.0 * Math.PI * h9);
35
+ // Spiky gradient coefficient: -45 / (π h^6)
36
+ const kSpiky = 45.0 / (Math.PI * h6);
37
+ // Viscosity Laplacian coefficient: 45 / (π h^6)
38
+ const kVisc = 45.0 / (Math.PI * h6);
39
+ const n = alive.length;
40
+ // ── Build spatial hash grid for O(n) neighbour queries ────────────────────
41
+ const cellSize = h;
42
+ const grid = new Map();
43
+ const hashCell = (ix, iy, iz) => (ix * 73856093 ^ iy * 19349663 ^ iz * 83492791) >>> 0;
44
+ const cellOf = (p) => [
45
+ Math.floor(p.position.x / cellSize),
46
+ Math.floor(p.position.y / cellSize),
47
+ Math.floor(p.position.z / cellSize),
48
+ ];
49
+ for (let i = 0; i < n; i++) {
50
+ const [ix, iy, iz] = cellOf(alive[i]);
51
+ const key = hashCell(ix, iy, iz);
52
+ let bucket = grid.get(key);
53
+ if (!bucket) {
54
+ bucket = [];
55
+ grid.set(key, bucket);
56
+ }
57
+ bucket.push(i);
58
+ }
59
+ const neighbours = (pi) => {
60
+ const [cx, cy, cz] = cellOf(pi);
61
+ const result = [];
62
+ for (let dx = -1; dx <= 1; dx++)
63
+ for (let dy = -1; dy <= 1; dy++)
64
+ for (let dz = -1; dz <= 1; dz++) {
65
+ const bucket = grid.get(hashCell(cx + dx, cy + dy, cz + dz));
66
+ if (bucket)
67
+ for (const j of bucket)
68
+ result.push(j);
69
+ }
70
+ return result;
71
+ };
72
+ // ── Step 1: density ───────────────────────────────────────────────────────
73
+ const density = new Float32Array(n);
74
+ const _d = new Vector3();
75
+ for (let i = 0; i < n; i++) {
76
+ let rho = 0;
77
+ for (const j of neighbours(alive[i])) {
78
+ _d.copy(alive[i].position).sub(alive[j].position);
79
+ const r2 = _d.lengthSq();
80
+ if (r2 < h2) {
81
+ const diff = h2 - r2;
82
+ rho += kPoly6 * diff * diff * diff;
83
+ }
84
+ }
85
+ density[i] = Math.max(rho, 1e-6);
86
+ }
87
+ // ── Step 2: pressure (Tait) ──────────────────────────────────────────────
88
+ const pressure = new Float32Array(n);
89
+ for (let i = 0; i < n; i++) {
90
+ pressure[i] = stiffness * (density[i] - this.restDensity);
91
+ }
92
+ // ── Step 3: forces → velocity ────────────────────────────────────────────
93
+ const _r = new Vector3();
94
+ const _fv = new Vector3();
95
+ for (let i = 0; i < n; i++) {
96
+ const pi = alive[i];
97
+ _fv.set(0, 0, 0);
98
+ for (const j of neighbours(pi)) {
99
+ if (i === j)
100
+ continue;
101
+ const pj = alive[j];
102
+ _r.copy(pi.position).sub(pj.position);
103
+ const r = _r.length();
104
+ if (r < 0.0001 || r >= h)
105
+ continue;
106
+ // Pressure gradient (Spiky kernel)
107
+ const spiky = kSpiky * (h - r) * (h - r) / r;
108
+ const pAvg = (pressure[i] + pressure[j]) * 0.5;
109
+ _fv.addScaledVector(_r, -spiky * pAvg / density[j]);
110
+ // Viscosity Laplacian
111
+ const laplac = kVisc * (h - r);
112
+ _fv.addScaledVector(_r.copy(pj.velocity).sub(pi.velocity), viscosity * laplac / density[j]);
113
+ }
114
+ // f = F / rho_i
115
+ pi.velocity.addScaledVector(_fv, dt / density[i]);
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=SPHPhysics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SPHPhysics.js","sourceRoot":"","sources":["../../src/physics/SPHPhysics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { Points, Texture } from 'three';
2
+ import { BaseRenderer } from '../core/BaseRenderer.js';
3
+ import type { ParticleLike } from '../core/BaseRenderer.js';
4
+ import type { SeededRandom } from '../core/SeededRandom.js';
5
+ export interface BillboardRendererOptions {
6
+ /** Maximum visible particles — must match or exceed ParticleSystem.count */
7
+ maxCount?: number;
8
+ /** Base particle colour */
9
+ color?: string | number;
10
+ /** Sprite texture — if omitted renders as solid circle */
11
+ map?: Texture | null;
12
+ /** Opacity 0–1 */
13
+ opacity?: number;
14
+ /** Use additive blending (good for fire/sparks/foam glow) */
15
+ additive?: boolean;
16
+ /** Fade out over lifetime: multiply opacity by (1 - normalised) */
17
+ fadeOut?: boolean;
18
+ /** Scale size by distance (THREE.Points sizeAttenuation) */
19
+ sizeAttenuation?: boolean;
20
+ /**
21
+ * Show the point-sprite helper geometry on startup.
22
+ * Mirrors Blender's viewport dot display — set false to hide placeholders
23
+ * and show only the assigned render object. Default: true.
24
+ */
25
+ showHelpers?: boolean;
26
+ /** Colour mode: 0=flat, 1=by velocity, 2=by age (Blender: Display Colour) */
27
+ colourMode?: number;
28
+ /** Low-speed / young colour RGB components [0–1] */
29
+ colourLow?: [number, number, number];
30
+ /** High-speed / old colour RGB components [0–1] */
31
+ colourHigh?: [number, number, number];
32
+ /** Velocity magnitude that maps to colourHigh in mode 1 */
33
+ velocityMax?: number;
34
+ }
35
+ /**
36
+ * BillboardRenderer — renders particles as camera-facing point sprites.
37
+ * Uses THREE.Points for GPU-efficient batched rendering.
38
+ * (Blender: Render → Halo / Billboard)
39
+ *
40
+ * No allocations inside update() — all buffers are pre-allocated.
41
+ */
42
+ export declare class BillboardRenderer extends BaseRenderer {
43
+ readonly object3D: Points;
44
+ /**
45
+ * Scalar inputs — safe to animate with GSAP or the keyframe system.
46
+ * fadeOut: 1 = shrink+fade over lifetime, 0 = constant size.
47
+ * opacity: overall alpha [0–1].
48
+ * size: base world-space point size.
49
+ * colourMode: 0=flat, 1=by velocity, 2=by age.
50
+ */
51
+ parameters: {
52
+ fadeOut: number;
53
+ opacity: number;
54
+ size: number;
55
+ colourMode: number;
56
+ colourLowR: number;
57
+ colourLowG: number;
58
+ colourLowB: number;
59
+ colourHighR: number;
60
+ colourHighG: number;
61
+ colourHighB: number;
62
+ velocityMax: number;
63
+ };
64
+ private _positions;
65
+ private _sizes;
66
+ private _colors;
67
+ private _posAttr;
68
+ private _sizeAttr;
69
+ private _colorAttr;
70
+ private _maxCount;
71
+ constructor(opts?: BillboardRendererOptions);
72
+ update(particles: ParticleLike[], aliveCount: number, params?: Record<string, number>, childRng?: SeededRandom): void;
73
+ dispose(): void;
74
+ }
75
+ //# sourceMappingURL=BillboardRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BillboardRenderer.d.ts","sourceRoot":"","sources":["../../src/renderers/BillboardRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAC4C,OAAO,EAC1D,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,YAAY,EAAE,MAAO,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,QAAQ,CAAC,EAAI,MAAM,CAAA;IACnB,2BAA2B;IAC3B,KAAK,CAAC,EAAO,MAAM,GAAG,MAAM,CAAA;IAC5B,0DAA0D;IAC1D,GAAG,CAAC,EAAS,OAAO,GAAG,IAAI,CAAA;IAC3B,kBAAkB;IAClB,OAAO,CAAC,EAAK,MAAM,CAAA;IACnB,6DAA6D;IAC7D,QAAQ,CAAC,EAAI,OAAO,CAAA;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAK,OAAO,CAAA;IACpB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IAEzB;;;;;;OAMG;IACH,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;QAC9C,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;QAC1D,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;QAC7D,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IAED,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,GAAE,wBAA6B;IAmD/C,MAAM,CACJ,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,QAAQ,CAAC,EAAG,YAAY,GACvB,IAAI;IA0DP,OAAO,IAAI,IAAI;CAIhB"}