@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.
- package/dist/core/BaseEmitter.d.ts +50 -0
- package/dist/core/BaseEmitter.d.ts.map +1 -0
- package/dist/core/BaseEmitter.js +53 -0
- package/dist/core/BaseEmitter.js.map +1 -0
- package/dist/core/BaseForce.d.ts +21 -0
- package/dist/core/BaseForce.d.ts.map +1 -0
- package/dist/core/BaseForce.js +15 -0
- package/dist/core/BaseForce.js.map +1 -0
- package/dist/core/BaseRenderer.d.ts +96 -0
- package/dist/core/BaseRenderer.d.ts.map +1 -0
- package/dist/core/BaseRenderer.js +190 -0
- package/dist/core/BaseRenderer.js.map +1 -0
- package/dist/core/DeflectorCollider.d.ts +46 -0
- package/dist/core/DeflectorCollider.d.ts.map +1 -0
- package/dist/core/DeflectorCollider.js +113 -0
- package/dist/core/DeflectorCollider.js.map +1 -0
- package/dist/core/Particle.d.ts +29 -0
- package/dist/core/Particle.d.ts.map +1 -0
- package/dist/core/Particle.js +41 -0
- package/dist/core/Particle.js.map +1 -0
- package/dist/core/ParticleCache.d.ts +73 -0
- package/dist/core/ParticleCache.d.ts.map +1 -0
- package/dist/core/ParticleCache.js +206 -0
- package/dist/core/ParticleCache.js.map +1 -0
- package/dist/core/ParticleSystem.d.ts +192 -0
- package/dist/core/ParticleSystem.d.ts.map +1 -0
- package/dist/core/ParticleSystem.js +484 -0
- package/dist/core/ParticleSystem.js.map +1 -0
- package/dist/core/SeededRandom.d.ts +17 -0
- package/dist/core/SeededRandom.d.ts.map +1 -0
- package/dist/core/SeededRandom.js +27 -0
- package/dist/core/SeededRandom.js.map +1 -0
- package/dist/emitters/EdgeEmitter.d.ts +43 -0
- package/dist/emitters/EdgeEmitter.d.ts.map +1 -0
- package/dist/emitters/EdgeEmitter.js +78 -0
- package/dist/emitters/EdgeEmitter.js.map +1 -0
- package/dist/emitters/MeshEmitter.d.ts +83 -0
- package/dist/emitters/MeshEmitter.d.ts.map +1 -0
- package/dist/emitters/MeshEmitter.js +240 -0
- package/dist/emitters/MeshEmitter.js.map +1 -0
- package/dist/emitters/PointEmitter.d.ts +22 -0
- package/dist/emitters/PointEmitter.d.ts.map +1 -0
- package/dist/emitters/PointEmitter.js +26 -0
- package/dist/emitters/PointEmitter.js.map +1 -0
- package/dist/forces/BoidField.d.ts +58 -0
- package/dist/forces/BoidField.d.ts.map +1 -0
- package/dist/forces/BoidField.js +82 -0
- package/dist/forces/BoidField.js.map +1 -0
- package/dist/forces/BoidForce.d.ts +54 -0
- package/dist/forces/BoidForce.d.ts.map +1 -0
- package/dist/forces/BoidForce.js +233 -0
- package/dist/forces/BoidForce.js.map +1 -0
- package/dist/forces/ChargeForce.d.ts +22 -0
- package/dist/forces/ChargeForce.d.ts.map +1 -0
- package/dist/forces/ChargeForce.js +35 -0
- package/dist/forces/ChargeForce.js.map +1 -0
- package/dist/forces/CurveGuideForce.d.ts +43 -0
- package/dist/forces/CurveGuideForce.d.ts.map +1 -0
- package/dist/forces/CurveGuideForce.js +118 -0
- package/dist/forces/CurveGuideForce.js.map +1 -0
- package/dist/forces/DragForce.d.ts +19 -0
- package/dist/forces/DragForce.d.ts.map +1 -0
- package/dist/forces/DragForce.js +31 -0
- package/dist/forces/DragForce.js.map +1 -0
- package/dist/forces/FlowFieldForce.d.ts +72 -0
- package/dist/forces/FlowFieldForce.d.ts.map +1 -0
- package/dist/forces/FlowFieldForce.js +68 -0
- package/dist/forces/FlowFieldForce.js.map +1 -0
- package/dist/forces/ForceField.d.ts +26 -0
- package/dist/forces/ForceField.d.ts.map +1 -0
- package/dist/forces/ForceField.js +41 -0
- package/dist/forces/ForceField.js.map +1 -0
- package/dist/forces/GravityForce.d.ts +9 -0
- package/dist/forces/GravityForce.d.ts.map +1 -0
- package/dist/forces/GravityForce.js +12 -0
- package/dist/forces/GravityForce.js.map +1 -0
- package/dist/forces/HarmonicForce.d.ts +22 -0
- package/dist/forces/HarmonicForce.d.ts.map +1 -0
- package/dist/forces/HarmonicForce.js +31 -0
- package/dist/forces/HarmonicForce.js.map +1 -0
- package/dist/forces/LennardJonesForce.d.ts +23 -0
- package/dist/forces/LennardJonesForce.d.ts.map +1 -0
- package/dist/forces/LennardJonesForce.js +38 -0
- package/dist/forces/LennardJonesForce.js.map +1 -0
- package/dist/forces/MagneticForce.d.ts +21 -0
- package/dist/forces/MagneticForce.d.ts.map +1 -0
- package/dist/forces/MagneticForce.js +30 -0
- package/dist/forces/MagneticForce.js.map +1 -0
- package/dist/forces/TextureForce.d.ts +37 -0
- package/dist/forces/TextureForce.d.ts.map +1 -0
- package/dist/forces/TextureForce.js +56 -0
- package/dist/forces/TextureForce.js.map +1 -0
- package/dist/forces/TurbulenceForce.d.ts +21 -0
- package/dist/forces/TurbulenceForce.d.ts.map +1 -0
- package/dist/forces/TurbulenceForce.js +39 -0
- package/dist/forces/TurbulenceForce.js.map +1 -0
- package/dist/forces/VortexForce.d.ts +21 -0
- package/dist/forces/VortexForce.d.ts.map +1 -0
- package/dist/forces/VortexForce.js +29 -0
- package/dist/forces/VortexForce.js.map +1 -0
- package/dist/forces/WindForce.d.ts +21 -0
- package/dist/forces/WindForce.d.ts.map +1 -0
- package/dist/forces/WindForce.js +29 -0
- package/dist/forces/WindForce.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/physics/KeyedPhysics.d.ts +43 -0
- package/dist/physics/KeyedPhysics.d.ts.map +1 -0
- package/dist/physics/KeyedPhysics.js +73 -0
- package/dist/physics/KeyedPhysics.js.map +1 -0
- package/dist/physics/SPHPhysics.d.ts +27 -0
- package/dist/physics/SPHPhysics.d.ts.map +1 -0
- package/dist/physics/SPHPhysics.js +119 -0
- package/dist/physics/SPHPhysics.js.map +1 -0
- package/dist/renderers/BillboardRenderer.d.ts +75 -0
- package/dist/renderers/BillboardRenderer.d.ts.map +1 -0
- package/dist/renderers/BillboardRenderer.js +106 -0
- package/dist/renderers/BillboardRenderer.js.map +1 -0
- package/dist/renderers/CollectionRenderer.d.ts +83 -0
- package/dist/renderers/CollectionRenderer.d.ts.map +1 -0
- package/dist/renderers/CollectionRenderer.js +161 -0
- package/dist/renderers/CollectionRenderer.js.map +1 -0
- package/dist/renderers/HaloRenderer.d.ts +3 -0
- package/dist/renderers/HaloRenderer.d.ts.map +1 -0
- package/dist/renderers/HaloRenderer.js +4 -0
- package/dist/renderers/HaloRenderer.js.map +1 -0
- package/dist/renderers/InstanceRenderer.d.ts +70 -0
- package/dist/renderers/InstanceRenderer.d.ts.map +1 -0
- package/dist/renderers/InstanceRenderer.js +86 -0
- package/dist/renderers/InstanceRenderer.js.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +52 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.js +96 -0
- package/dist/renderers/LineRenderer.js.map +1 -0
- package/dist/renderers/NoneRenderer.d.ts +19 -0
- package/dist/renderers/NoneRenderer.d.ts.map +1 -0
- package/dist/renderers/NoneRenderer.js +24 -0
- package/dist/renderers/NoneRenderer.js.map +1 -0
- package/dist/renderers/ObjectRenderer.d.ts +3 -0
- package/dist/renderers/ObjectRenderer.d.ts.map +1 -0
- package/dist/renderers/ObjectRenderer.js +4 -0
- package/dist/renderers/ObjectRenderer.js.map +1 -0
- package/dist/renderers/StrandRenderer.d.ts +169 -0
- package/dist/renderers/StrandRenderer.d.ts.map +1 -0
- package/dist/renderers/StrandRenderer.js +235 -0
- package/dist/renderers/StrandRenderer.js.map +1 -0
- package/dist/renderers/TrailRenderer.d.ts +54 -0
- package/dist/renderers/TrailRenderer.d.ts.map +1 -0
- package/dist/renderers/TrailRenderer.js +114 -0
- package/dist/renderers/TrailRenderer.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,YAAY;IAavB,YAAY,OAAyB,EAAE,SAAS,GAAG,GAAG;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,UAAU,GAAG;YAChB,KAAK,EAAE,CAAC,EAAI,qCAAqC;SAClD,CAAA;IACH,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW,KAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAC,CAAC;IAEzD;;;OAGG;IACH,KAAK,CAAC,IAAgB,EAAE,GAAW;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAO,KAAK,GAAG,KAAK,CAAA,CAAE,yBAAyB;QAEtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAA;QACxC,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,IAAI,CAAC,CAAC,CAAC,KAAK;gBAAE,SAAQ;YAEtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,CAAC,GAAG;gBAAE,SAAQ;YAElB,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,GAAG,EAAE,CAAC;oBACR,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;oBACrD,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;gBACvD,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;oBAC7B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC7B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC/B,CAAC;YAED,yDAAyD;YACzD,CAAC,CAAC,IAAI,GAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC1H,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAA;QAC/B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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"}
|