pixi-particles-engine 0.1.2 → 0.1.4

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 (47) hide show
  1. package/dist/behaviour.js +2 -1
  2. package/dist/behaviour.js.map +1 -1
  3. package/dist/behaviours/alpha-behaviour.js +5 -1
  4. package/dist/behaviours/alpha-behaviour.js.map +1 -1
  5. package/dist/behaviours/alpha-curve-behaviour.js +7 -3
  6. package/dist/behaviours/alpha-curve-behaviour.js.map +1 -1
  7. package/dist/behaviours/curved-behaviour/curve-key-frame.js +2 -1
  8. package/dist/behaviours/curved-behaviour/curve-key-frame.js.map +1 -1
  9. package/dist/behaviours/curved-behaviour/curve-sampler.js +11 -7
  10. package/dist/behaviours/curved-behaviour/curve-sampler.js.map +1 -1
  11. package/dist/behaviours/movement-behaviours/gravity-behaviour.js +7 -3
  12. package/dist/behaviours/movement-behaviours/gravity-behaviour.js.map +1 -1
  13. package/dist/behaviours/movement-behaviours/movement-curve-behaviour.js +8 -4
  14. package/dist/behaviours/movement-behaviours/movement-curve-behaviour.js.map +1 -1
  15. package/dist/behaviours/movement-behaviours/radial-burst-behaviour.js +8 -4
  16. package/dist/behaviours/movement-behaviours/radial-burst-behaviour.js.map +1 -1
  17. package/dist/behaviours/scale-curve-behaviour.js +7 -3
  18. package/dist/behaviours/scale-curve-behaviour.js.map +1 -1
  19. package/dist/behaviours/spawn-behaviours/circle-spawn-behaviour.js +5 -1
  20. package/dist/behaviours/spawn-behaviours/circle-spawn-behaviour.js.map +1 -1
  21. package/dist/behaviours/spawn-behaviours/rectangle-spawn-behaviour.js +5 -1
  22. package/dist/behaviours/spawn-behaviours/rectangle-spawn-behaviour.js.map +1 -1
  23. package/dist/behaviours/static-behaviours/static-rotation-behaviour.js +5 -1
  24. package/dist/behaviours/static-behaviours/static-rotation-behaviour.js.map +1 -1
  25. package/dist/behaviours/static-behaviours/static-scale-behaviour.js +5 -1
  26. package/dist/behaviours/static-behaviours/static-scale-behaviour.js.map +1 -1
  27. package/dist/emitter.js +10 -6
  28. package/dist/emitter.js.map +1 -1
  29. package/dist/index.js +34 -18
  30. package/dist/index.js.map +1 -1
  31. package/dist/px-particle.js +6 -2
  32. package/dist/px-particle.js.map +1 -1
  33. package/dist/texture-provider.js +2 -1
  34. package/dist/texture-provider.js.map +1 -1
  35. package/dist/texture-providers/animated-texture-provider.js +7 -3
  36. package/dist/texture-providers/animated-texture-provider.js.map +1 -1
  37. package/dist/texture-providers/single-texture-provider.js +7 -3
  38. package/dist/texture-providers/single-texture-provider.js.map +1 -1
  39. package/dist/texture-providers/weighted-texture-provider.js +8 -4
  40. package/dist/texture-providers/weighted-texture-provider.js.map +1 -1
  41. package/dist/utils.js +5 -1
  42. package/dist/utils.js.map +1 -1
  43. package/package.json +3 -2
  44. package/dist/behaviours/behaviour-utils.d.ts +0 -1
  45. package/dist/behaviours/behaviour-utils.d.ts.map +0 -1
  46. package/dist/behaviours/behaviour-utils.js +0 -2
  47. package/dist/behaviours/behaviour-utils.js.map +0 -1
package/dist/behaviour.js CHANGED
@@ -1,2 +1,3 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
2
3
  //# sourceMappingURL=behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"behaviour.js","sourceRoot":"","sources":["../src/behaviour.ts"],"names":[],"mappings":"","sourcesContent":["import { ParticleProperties } from \"pixi.js\";\r\nimport { Emitter } from \"./emitter\";\r\nimport { PxParticle } from \"./px-particle\";\r\n\r\n/**\r\n * A Behaviour is a modular unit of particle logic.\r\n *\r\n * Behaviours can:\r\n * - Initialize particle state at spawn (velocity, alpha, scale, etc)\r\n * - Update particle state each frame (curves, gravity, drag, color fade, etc)\r\n * - Clean up any per-particle state when the particle is recycled\r\n *\r\n * Lifecycle:\r\n * - init(emitter) is called once when the behaviour is added to an emitter\r\n * - onSpawn(p, emitter) is called each time a particle is spawned\r\n * - update(p, dt, emitter) is called every frame for each active particle\r\n * - onKill(p, emitter) is called when a particle dies and returns to the pool\r\n */\r\nexport interface Behaviour {\r\n /**\r\n * Execution order relative to other behaviours.\r\n *\r\n * Lower priority runs earlier.\r\n * When priorities are equal, execution order is stable and follows registration order.\r\n *\r\n * Use priority to ensure correct ordering when behaviours depend on each other\r\n * (e.g. apply movement first, then apply alpha/scale curves).\r\n */\r\n readonly priority?: number;\r\n\r\n /**\r\n * Dynamic property requirements for this behaviour.\r\n *\r\n * PixiJS ParticleContainer uses `dynamicProperties` to decide which attributes\r\n * must be re-uploaded to the GPU each frame.\r\n *\r\n * If your behaviour changes a property over time that affects rendering,\r\n * declare it here so the emitter enables the correct dynamicProperties.\r\n *\r\n * Examples:\r\n * - Changing `alpha` over time → requires: { color: true }\r\n * - Changing `scaleX/scaleY` over time → may require: { vertex: true } (depends on Pixi internals)\r\n * - Changing `rotation` over time → requires: { rotation: true }\r\n *\r\n * NOTE:\r\n * If your behaviour only sets values ON SPAWN and never changes them after,\r\n * you usually do NOT need to require dynamic properties.\r\n */\r\n readonly requires?: ParticleProperties;\r\n\r\n /**\r\n * Optional: called once when the behaviour is registered on an emitter.\r\n * Useful for caching references, precomputing curves, or validating options.\r\n */\r\n init?(emitter: Emitter): void;\r\n\r\n /**\r\n * Optional: called when a particle is spawned (taken from pool and activated).\r\n * Use this to initialize per-particle state for this behaviour.\r\n */\r\n onSpawn?(p: PxParticle, emitter: Emitter): void;\r\n\r\n /**\r\n * Optional: called every frame for each active particle.\r\n * `dt` is delta time in seconds (already clamped by the emitter).\r\n */\r\n update?(p: PxParticle, dt: number, emitter: Emitter): void;\r\n\r\n /**\r\n * Optional: called when the particle is killed and returned to the pool.\r\n * Use this to clear any per-particle state allocated by the behaviour.\r\n */\r\n onKill?(p: PxParticle, emitter: Emitter): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"behaviour.js","sourceRoot":"","sources":["../src/behaviour.ts"],"names":[],"mappings":""}
@@ -1,7 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlphaBehaviour = void 0;
1
4
  /**
2
5
  * Linearly fades alpha from startAlpha -> endAlpha over particle lifetime.
3
6
  */
4
- export class AlphaBehaviour {
7
+ class AlphaBehaviour {
5
8
  constructor(startAlpha = 1, endAlpha = 0) {
6
9
  this.requires = { color: true };
7
10
  this.priority = 50;
@@ -18,4 +21,5 @@ export class AlphaBehaviour {
18
21
  p.alpha = this.startAlpha + (this.endAlpha - this.startAlpha) * t;
19
22
  }
20
23
  }
24
+ exports.AlphaBehaviour = AlphaBehaviour;
21
25
  //# sourceMappingURL=alpha-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/alpha-behaviour.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,cAAc;IAQvB,YAAY,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC;QAPxB,aAAQ,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE3B,aAAQ,GAAG,EAAE,CAAC;QAEvB,eAAU,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,CAAC,CAAC;QAGhB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAEM,OAAO,CAAC,CAAa,EAAE,QAAiB;QAC3C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAW,EAAE,QAAiB;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../px-particle\";\r\nimport { Behaviour } from \"../behaviour\";\r\nimport { Emitter } from \"../emitter\";\r\n\r\n/**\r\n * Linearly fades alpha from startAlpha -> endAlpha over particle lifetime.\r\n */\r\nexport class AlphaBehaviour implements Behaviour {\r\n public readonly requires = { color: true };\r\n\r\n public readonly priority = 50;\r\n\r\n public startAlpha = 1;\r\n public endAlpha = 0;\r\n\r\n constructor(startAlpha = 1, endAlpha = 0) {\r\n this.startAlpha = startAlpha;\r\n this.endAlpha = endAlpha;\r\n }\r\n\r\n public onSpawn(p: PxParticle, _emitter: Emitter): void {\r\n p.alpha = this.startAlpha;\r\n }\r\n\r\n public update(p: PxParticle, _dt: number, _emitter: Emitter): void {\r\n const t = p.life > 0 ? Math.min(1, Math.max(0, p.age / p.life)) : 1;\r\n p.alpha = this.startAlpha + (this.endAlpha - this.startAlpha) * t;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"alpha-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/alpha-behaviour.ts"],"names":[],"mappings":";;;AAIA;;GAEG;AACH,MAAa,cAAc;IAQvB,YAAY,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC;QAPxB,aAAQ,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE3B,aAAQ,GAAG,EAAE,CAAC;QAEvB,eAAU,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,CAAC,CAAC;QAGhB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAEM,OAAO,CAAC,CAAa,EAAE,QAAiB;QAC3C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAW,EAAE,QAAiB;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;CACJ;AArBD,wCAqBC"}
@@ -1,17 +1,20 @@
1
- import { Curve } from "./curved-behaviour/curve-sampler";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlphaCurveBehaviour = void 0;
4
+ const curve_sampler_1 = require("./curved-behaviour/curve-sampler");
2
5
  /**
3
6
  * Alpha over lifetime driven by a curve.
4
7
  *
5
8
  * Keyframes are sampled using normalized lifetime t in [0..1].
6
9
  * Output is clamped to [0..1].
7
10
  */
8
- export class AlphaCurveBehaviour {
11
+ class AlphaCurveBehaviour {
9
12
  constructor(keyframes, opts) {
10
13
  /** Alpha changes over time, so ParticleContainer must treat color as dynamic. */
11
14
  this.requires = { color: true };
12
15
  this.priority = 50;
13
16
  // Always clamp alpha to [0..1]
14
- this.curve = new Curve(keyframes, { ...opts, clamp: { min: 0, max: 1 } });
17
+ this.curve = new curve_sampler_1.Curve(keyframes, { ...opts, clamp: { min: 0, max: 1 } });
15
18
  }
16
19
  onSpawn(p) {
17
20
  p.alpha = this.curve.sample(0);
@@ -21,4 +24,5 @@ export class AlphaCurveBehaviour {
21
24
  p.alpha = this.curve.sample(t);
22
25
  }
23
26
  }
27
+ exports.AlphaCurveBehaviour = AlphaCurveBehaviour;
24
28
  //# sourceMappingURL=alpha-curve-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-curve-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/alpha-curve-behaviour.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAGzD;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IAQ5B,YAAY,SAA0B,EAAE,IAAmB;QAP3D,iFAAiF;QACjE,aAAQ,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE3B,aAAQ,GAAG,EAAE,CAAC;QAK1B,+BAA+B;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAY,EAAE,QAAkB;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;CACJ","sourcesContent":["import { Behaviour } from \"../behaviour\";\r\nimport { PxParticle } from \"../px-particle\";\r\nimport { CurveKeyframe, CurveOptions } from \"./curved-behaviour/curve-key-frame\";\r\nimport { Curve } from \"./curved-behaviour/curve-sampler\";\r\nimport { Emitter } from \"../emitter\";\r\n\r\n/**\r\n * Alpha over lifetime driven by a curve.\r\n *\r\n * Keyframes are sampled using normalized lifetime t in [0..1].\r\n * Output is clamped to [0..1].\r\n */\r\nexport class AlphaCurveBehaviour implements Behaviour {\r\n /** Alpha changes over time, so ParticleContainer must treat color as dynamic. */\r\n public readonly requires = { color: true };\r\n\r\n public readonly priority = 50;\r\n\r\n private curve: Curve;\r\n\r\n constructor(keyframes: CurveKeyframe[], opts?: CurveOptions) {\r\n // Always clamp alpha to [0..1]\r\n this.curve = new Curve(keyframes, { ...opts, clamp: { min: 0, max: 1 } });\r\n }\r\n\r\n public onSpawn(p: PxParticle) {\r\n p.alpha = this.curve.sample(0);\r\n }\r\n\r\n public update(p: PxParticle, _dt?: number, _emitter?: Emitter) {\r\n const t = p.life > 0 ? p.age / p.life : 1;\r\n p.alpha = this.curve.sample(t);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"alpha-curve-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/alpha-curve-behaviour.ts"],"names":[],"mappings":";;;AAGA,oEAAyD;AAGzD;;;;;GAKG;AACH,MAAa,mBAAmB;IAQ5B,YAAY,SAA0B,EAAE,IAAmB;QAP3D,iFAAiF;QACjE,aAAQ,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE3B,aAAQ,GAAG,EAAE,CAAC;QAK1B,+BAA+B;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAK,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAY,EAAE,QAAkB;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;CACJ;AArBD,kDAqBC"}
@@ -1,2 +1,3 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
2
3
  //# sourceMappingURL=curve-key-frame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"curve-key-frame.js","sourceRoot":"","sources":["../../../src/behaviours/curved-behaviour/curve-key-frame.ts"],"names":[],"mappings":"","sourcesContent":["export type EaseFn = (x: number) => number;\r\n\r\nexport type CurveKeyframe = {\r\n /** Normalized lifetime [0..1]. */\r\n time: number;\r\n\r\n /** Value at this time. */\r\n value: number;\r\n\r\n /**\r\n * Optional easing applied to the segment starting at this keyframe,\r\n * i.e. easing used for interpolation from this keyframe -> next keyframe.\r\n */\r\n ease?: EaseFn;\r\n};\r\n\r\nexport type CurveOptions = {\r\n /** Default easing used when a segment has no per-keyframe ease. */\r\n defaultEase?: EaseFn;\r\n\r\n /** Optional clamp on sampled output. */\r\n clamp?: { min: number; max: number };\r\n};\r\n"]}
1
+ {"version":3,"file":"curve-key-frame.js","sourceRoot":"","sources":["../../../src/behaviours/curved-behaviour/curve-key-frame.ts"],"names":[],"mappings":""}
@@ -1,4 +1,7 @@
1
- import { Utils } from "../../utils";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Curve = void 0;
4
+ const utils_1 = require("../../utils");
2
5
  /**
3
6
  * Lightweight curve sampler for keyframed 1D values over normalized time [0..1].
4
7
  *
@@ -6,14 +9,14 @@ import { Utils } from "../../utils";
6
9
  * - Endpoints at t=0 and t=1 are ensured (added if missing).
7
10
  * - Each segment can have its own easing function.
8
11
  */
9
- export class Curve {
12
+ class Curve {
10
13
  constructor(keyframes, opts) {
11
14
  this.defaultEase = opts?.defaultEase;
12
15
  this.clamp = opts?.clamp;
13
16
  // Normalize and sort keyframes.
14
17
  const cleaned = (keyframes ?? [])
15
18
  .map((k) => ({
16
- time: Utils.clamp01(k.time),
19
+ time: utils_1.Utils.clamp01(k.time),
17
20
  value: k.value,
18
21
  ease: k.ease,
19
22
  }))
@@ -36,7 +39,7 @@ export class Curve {
36
39
  * Input is clamped to [0..1].
37
40
  */
38
41
  sample(t01) {
39
- const t = Utils.clamp01(t01);
42
+ const t = utils_1.Utils.clamp01(t01);
40
43
  // Find which segment [k0..k1] contains t.
41
44
  const i = this.findSegmentIndex(t);
42
45
  const k0 = this.keys[i];
@@ -46,13 +49,13 @@ export class Curve {
46
49
  return this.clampValue(k1.value);
47
50
  // Normalize t into segment space [0..1].
48
51
  let u = (t - k0.time) / span;
49
- u = Utils.clamp01(u);
52
+ u = utils_1.Utils.clamp01(u);
50
53
  // Apply easing for this segment (if any).
51
54
  const ease = k0.ease ?? this.defaultEase;
52
55
  if (ease)
53
- u = Utils.clamp01(ease(u));
56
+ u = utils_1.Utils.clamp01(ease(u));
54
57
  // Linear interpolation between segment endpoints.
55
- const v = Utils.lerp(k0.value, k1.value, u);
58
+ const v = utils_1.Utils.lerp(k0.value, k1.value, u);
56
59
  return this.clampValue(v);
57
60
  }
58
61
  /**
@@ -72,4 +75,5 @@ export class Curve {
72
75
  return Math.min(this.clamp.max, Math.max(this.clamp.min, v));
73
76
  }
74
77
  }
78
+ exports.Curve = Curve;
75
79
  //# sourceMappingURL=curve-sampler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"curve-sampler.js","sourceRoot":"","sources":["../../../src/behaviours/curved-behaviour/curve-sampler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Utils } from \"../../utils\";\r\nimport { CurveKeyframe, EaseFn, CurveOptions } from \"./curve-key-frame\";\r\n\r\n/**\r\n * Lightweight curve sampler for keyframed 1D values over normalized time [0..1].\r\n *\r\n * - Keyframes are clamped to [0..1] and sorted by time.\r\n * - Endpoints at t=0 and t=1 are ensured (added if missing).\r\n * - Each segment can have its own easing function.\r\n */\r\nexport class Curve {\r\n /** Cleaned + sorted keyframes (always includes endpoints at 0 and 1). */\r\n private keys: CurveKeyframe[];\r\n\r\n /** Default easing used when the keyframe has no `ease`. */\r\n private defaultEase?: EaseFn;\r\n\r\n /** Optional output clamp. */\r\n private clamp?: { min: number; max: number };\r\n\r\n constructor(keyframes: CurveKeyframe[], opts?: CurveOptions) {\r\n this.defaultEase = opts?.defaultEase;\r\n this.clamp = opts?.clamp;\r\n\r\n // Normalize and sort keyframes.\r\n const cleaned: CurveKeyframe[] = (keyframes ?? [])\r\n .map((k) => ({\r\n time: Utils.clamp01(k.time),\r\n value: k.value,\r\n ease: k.ease,\r\n }))\r\n .sort((a, b) => a.time - b.time);\r\n\r\n // Fallback: flat zero curve.\r\n if (cleaned.length === 0) cleaned.push({ time: 0, value: 0 }, { time: 1, value: 0 });\r\n\r\n // Ensure endpoints exist at t=0 and t=1.\r\n if (cleaned[0].time !== 0) cleaned.unshift({ time: 0, value: cleaned[0].value });\r\n\r\n if (cleaned[cleaned.length - 1].time !== 1)\r\n cleaned.push({\r\n time: 1,\r\n value: cleaned[cleaned.length - 1].value,\r\n });\r\n\r\n this.keys = cleaned;\r\n }\r\n\r\n /**\r\n * Samples the curve at normalized time t01.\r\n * Input is clamped to [0..1].\r\n */\r\n public sample(t01: number): number {\r\n const t = Utils.clamp01(t01);\r\n\r\n // Find which segment [k0..k1] contains t.\r\n const i = this.findSegmentIndex(t);\r\n const k0 = this.keys[i];\r\n const k1 = this.keys[i + 1];\r\n\r\n const span = k1.time - k0.time;\r\n if (span <= 0) return this.clampValue(k1.value);\r\n\r\n // Normalize t into segment space [0..1].\r\n let u = (t - k0.time) / span;\r\n u = Utils.clamp01(u);\r\n\r\n // Apply easing for this segment (if any).\r\n const ease = k0.ease ?? this.defaultEase;\r\n if (ease) u = Utils.clamp01(ease(u));\r\n\r\n // Linear interpolation between segment endpoints.\r\n const v = Utils.lerp(k0.value, k1.value, u);\r\n return this.clampValue(v);\r\n }\r\n\r\n /**\r\n * Finds the segment index i such that t is between keys[i] and keys[i+1].\r\n */\r\n private findSegmentIndex(t: number): number {\r\n for (let i = 0; i < this.keys.length - 2; i++) {\r\n if (t <= this.keys[i + 1].time) return i;\r\n }\r\n return this.keys.length - 2;\r\n }\r\n\r\n /** Applies optional output clamp. */\r\n private clampValue(v: number): number {\r\n if (!this.clamp) return v;\r\n return Math.min(this.clamp.max, Math.max(this.clamp.min, v));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"curve-sampler.js","sourceRoot":"","sources":["../../../src/behaviours/curved-behaviour/curve-sampler.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
- import { Curve } from "../curved-behaviour/curve-sampler";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GravityCurveBehaviour = void 0;
4
+ const curve_sampler_1 = require("../curved-behaviour/curve-sampler");
2
5
  /**
3
6
  * Applies an acceleration (gx, gy) scaled by a curve over lifetime.
4
7
  *
@@ -13,13 +16,13 @@ import { Curve } from "../curved-behaviour/curve-sampler";
13
16
  * - Custom "pull" forces controlled by a curve
14
17
  *
15
18
  */
16
- export class GravityCurveBehaviour {
19
+ class GravityCurveBehaviour {
17
20
  constructor(gx, gy, strengthKeyframes, opts) {
18
21
  this.requires = { position: true };
19
22
  this.priority = 0;
20
23
  this.gx = gx;
21
24
  this.gy = gy;
22
- this.strength = new Curve(strengthKeyframes, opts);
25
+ this.strength = new curve_sampler_1.Curve(strengthKeyframes, opts);
23
26
  }
24
27
  /**
25
28
  * Called every frame for each particle.
@@ -32,4 +35,5 @@ export class GravityCurveBehaviour {
32
35
  p.vy += this.gy * s * dt;
33
36
  }
34
37
  }
38
+ exports.GravityCurveBehaviour = GravityCurveBehaviour;
35
39
  //# sourceMappingURL=gravity-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gravity-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/gravity-behaviour.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,qBAAqB;IAW9B,YAAY,EAAU,EAAE,EAAU,EAAE,iBAAkC,EAAE,IAAmB;QAV3E,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9B,aAAQ,GAAG,CAAC,CAAC;QAUzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../../px-particle\";\r\nimport { Behaviour } from \"../../behaviour\";\r\nimport { CurveKeyframe, CurveOptions } from \"../curved-behaviour/curve-key-frame\";\r\nimport { Curve } from \"../curved-behaviour/curve-sampler\";\r\n\r\n/**\r\n * Applies an acceleration (gx, gy) scaled by a curve over lifetime.\r\n *\r\n * This modifies velocity every frame:\r\n * v += g * strength(t) * dt\r\n *\r\n * where t is normalized particle age in [0..1].\r\n *\r\n * Typical uses:\r\n * - Gravity that ramps up/down over lifetime\r\n * - Wind that fades in/out\r\n * - Custom \"pull\" forces controlled by a curve\r\n *\r\n */\r\nexport class GravityCurveBehaviour implements Behaviour {\r\n public readonly requires = { position: true };\r\n public readonly priority = 0;\r\n\r\n /** Acceleration vector (units: px/s² when strength is 1). */\r\n public gx: number;\r\n public gy: number;\r\n\r\n /** Strength curve sampled by normalized lifetime. */\r\n private strength: Curve;\r\n\r\n constructor(gx: number, gy: number, strengthKeyframes: CurveKeyframe[], opts?: CurveOptions) {\r\n this.gx = gx;\r\n this.gy = gy;\r\n this.strength = new Curve(strengthKeyframes, opts);\r\n }\r\n\r\n /**\r\n * Called every frame for each particle.\r\n * dt is in seconds.\r\n */\r\n public update(p: PxParticle, dt: number) {\r\n const t = p.life > 0 ? p.age / p.life : 1;\r\n const s = this.strength.sample(t);\r\n\r\n p.vx += this.gx * s * dt;\r\n p.vy += this.gy * s * dt;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gravity-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/gravity-behaviour.ts"],"names":[],"mappings":";;;AAGA,qEAA0D;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAa,qBAAqB;IAW9B,YAAY,EAAU,EAAE,EAAU,EAAE,iBAAkC,EAAE,IAAmB;QAV3E,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9B,aAAQ,GAAG,CAAC,CAAC;QAUzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;CACJ;AA5BD,sDA4BC"}
@@ -1,4 +1,7 @@
1
- import { Curve } from "../curved-behaviour/curve-sampler";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MovementCurveBehaviour = void 0;
4
+ const curve_sampler_1 = require("../curved-behaviour/curve-sampler");
2
5
  /**
3
6
  * Drives particle velocity directly using curves over lifetime.
4
7
  *
@@ -14,12 +17,12 @@ import { Curve } from "../curved-behaviour/curve-sampler";
14
17
  * if you want gravity to modify the curve-driven motion.
15
18
  *
16
19
  */
17
- export class MovementCurveBehaviour {
20
+ class MovementCurveBehaviour {
18
21
  constructor(vxKeyframes, vyKeyframes, opts) {
19
22
  this.requires = { position: true };
20
23
  this.priority = -10;
21
- this.vxCurve = new Curve(vxKeyframes, opts);
22
- this.vyCurve = new Curve(vyKeyframes, opts);
24
+ this.vxCurve = new curve_sampler_1.Curve(vxKeyframes, opts);
25
+ this.vyCurve = new curve_sampler_1.Curve(vyKeyframes, opts);
23
26
  }
24
27
  update(p, dt) {
25
28
  const t = p.life > 0 ? p.age / p.life : 1;
@@ -27,4 +30,5 @@ export class MovementCurveBehaviour {
27
30
  p.vy = this.vyCurve.sample(t);
28
31
  }
29
32
  }
33
+ exports.MovementCurveBehaviour = MovementCurveBehaviour;
30
34
  //# sourceMappingURL=movement-curve-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"movement-curve-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/movement-curve-behaviour.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,sBAAsB;IAO/B,YAAY,WAA4B,EAAE,WAA4B,EAAE,IAAmB;QAN3E,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9B,aAAQ,GAAG,CAAC,EAAE,CAAC;QAM3B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../../px-particle\";\r\nimport { Behaviour } from \"../../behaviour\";\r\nimport { CurveKeyframe, CurveOptions } from \"../curved-behaviour/curve-key-frame\";\r\nimport { Curve } from \"../curved-behaviour/curve-sampler\";\r\n\r\n/**\r\n * Drives particle velocity directly using curves over lifetime.\r\n *\r\n * Each frame:\r\n * vx = vxCurve(t)\r\n * vy = vyCurve(t)\r\n *\r\n * where t is normalized lifetime in [0..1].\r\n *\r\n * IMPORTANT:\r\n * - This behaviour overwrites velocity every frame.\r\n * - Forces like GravityCurveBehaviour should run AFTER this behaviour\r\n * if you want gravity to modify the curve-driven motion.\r\n *\r\n */\r\nexport class MovementCurveBehaviour implements Behaviour {\r\n public readonly requires = { position: true };\r\n public readonly priority = -10;\r\n\r\n private vxCurve: Curve;\r\n private vyCurve: Curve;\r\n\r\n constructor(vxKeyframes: CurveKeyframe[], vyKeyframes: CurveKeyframe[], opts?: CurveOptions) {\r\n this.vxCurve = new Curve(vxKeyframes, opts);\r\n this.vyCurve = new Curve(vyKeyframes, opts);\r\n }\r\n\r\n public update(p: PxParticle, dt: number) {\r\n const t = p.life > 0 ? p.age / p.life : 1;\r\n\r\n p.vx = this.vxCurve.sample(t);\r\n p.vy = this.vyCurve.sample(t);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"movement-curve-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/movement-curve-behaviour.ts"],"names":[],"mappings":";;;AAGA,qEAA0D;AAE1D;;;;;;;;;;;;;;GAcG;AACH,MAAa,sBAAsB;IAO/B,YAAY,WAA4B,EAAE,WAA4B,EAAE,IAAmB;QAN3E,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC9B,aAAQ,GAAG,CAAC,EAAE,CAAC;QAM3B,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1C,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACJ;AAlBD,wDAkBC"}
@@ -1,4 +1,7 @@
1
- import { Utils } from "../../utils";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RadialBurstBehaviour = void 0;
4
+ const utils_1 = require("../../utils");
2
5
  /**
3
6
  * Initializes particle velocity on spawn in a radial/cone burst.
4
7
  *
@@ -9,7 +12,7 @@ import { Utils } from "../../utils";
9
12
  * Notes:
10
13
  * - This behaviour does NOT move particles directly; the emitter integrates vx/vy each tick.
11
14
  */
12
- export class RadialBurstBehaviour {
15
+ class RadialBurstBehaviour {
13
16
  constructor(minSpeed, maxSpeed, direction = 0, spread = Math.PI * 2) {
14
17
  this.priority = -80;
15
18
  this.requires = { position: true };
@@ -33,10 +36,11 @@ export class RadialBurstBehaviour {
33
36
  }
34
37
  onSpawn(p) {
35
38
  const half = this.spread * 0.5;
36
- const angle = this.direction + Utils.rand(-half, half);
37
- const speed = Utils.rand(this.minSpeed, this.maxSpeed);
39
+ const angle = this.direction + utils_1.Utils.rand(-half, half);
40
+ const speed = utils_1.Utils.rand(this.minSpeed, this.maxSpeed);
38
41
  p.vx = Math.cos(angle) * speed;
39
42
  p.vy = Math.sin(angle) * speed;
40
43
  }
41
44
  }
45
+ exports.RadialBurstBehaviour = RadialBurstBehaviour;
42
46
  //# sourceMappingURL=radial-burst-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radial-burst-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/radial-burst-behaviour.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC;;;;;;;;;GASG;AACH,MAAM,OAAO,oBAAoB;IA0B7B,YAAY,QAAgB,EAAE,QAAgB,EAAE,YAAoB,CAAC,EAAE,SAAiB,IAAI,CAAC,EAAE,GAAG,CAAC;QAzBnF,aAAQ,GAAG,CAAC,EAAE,CAAC;QAExB,aAAQ,GAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAQzD;;;;;WAKG;QACI,cAAS,GAAW,CAAC,CAAC;QAE7B;;;;WAIG;QACI,WAAM,GAAW,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAGhC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvD,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../../px-particle\";\r\nimport { Behaviour } from \"../../behaviour\";\r\nimport { Utils } from \"../../utils\";\r\nimport { ParticleProperties } from \"pixi.js\";\r\n\r\n/**\r\n * Initializes particle velocity on spawn in a radial/cone burst.\r\n *\r\n * - Picks a random angle within [direction - spread/2, direction + spread/2]\r\n * - Picks a random speed within [minSpeed, maxSpeed]\r\n * - Sets particle velocity (vx, vy) in pixels/sec\r\n *\r\n * Notes:\r\n * - This behaviour does NOT move particles directly; the emitter integrates vx/vy each tick.\r\n */\r\nexport class RadialBurstBehaviour implements Behaviour {\r\n public readonly priority = -80;\r\n\r\n public requires: ParticleProperties = { position: true };\r\n\r\n /** Minimum initial speed (px/sec). */\r\n public minSpeed: number;\r\n\r\n /** Maximum initial speed (px/sec). */\r\n public maxSpeed: number;\r\n\r\n /**\r\n * Center direction in radians.\r\n * Pixi coordinate system:\r\n * - 0 = right\r\n * - PI/2 = down\r\n */\r\n public direction: number = 0;\r\n\r\n /**\r\n * Cone spread in radians.\r\n * - 2π = full circle\r\n * - PI/3 ≈ 60° cone\r\n */\r\n public spread: number = Math.PI * 2;\r\n\r\n constructor(minSpeed: number, maxSpeed: number, direction: number = 0, spread: number = Math.PI * 2) {\r\n this.minSpeed = minSpeed;\r\n this.maxSpeed = maxSpeed;\r\n this.direction = direction;\r\n this.spread = spread;\r\n }\r\n\r\n public onSpawn(p: PxParticle) {\r\n const half = this.spread * 0.5;\r\n const angle = this.direction + Utils.rand(-half, half);\r\n const speed = Utils.rand(this.minSpeed, this.maxSpeed);\r\n\r\n p.vx = Math.cos(angle) * speed;\r\n p.vy = Math.sin(angle) * speed;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"radial-burst-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/movement-behaviours/radial-burst-behaviour.ts"],"names":[],"mappings":";;;AAEA,uCAAoC;AAGpC;;;;;;;;;GASG;AACH,MAAa,oBAAoB;IA0B7B,YAAY,QAAgB,EAAE,QAAgB,EAAE,YAAoB,CAAC,EAAE,SAAiB,IAAI,CAAC,EAAE,GAAG,CAAC;QAzBnF,aAAQ,GAAG,CAAC,EAAE,CAAC;QAExB,aAAQ,GAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAQzD;;;;;WAKG;QACI,cAAS,GAAW,CAAC,CAAC;QAE7B;;;;WAIG;QACI,WAAM,GAAW,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAGhC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,aAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,aAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvD,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;CACJ;AAzCD,oDAyCC"}
@@ -1,15 +1,18 @@
1
- import { Curve } from "./curved-behaviour/curve-sampler";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScaleCurveBehaviour = void 0;
4
+ const curve_sampler_1 = require("./curved-behaviour/curve-sampler");
2
5
  /**
3
6
  * Uniform scale over lifetime driven by a curve.
4
7
  *
5
8
  * Samples a curve using normalized lifetime t in [0..1] and applies:
6
9
  * scaleX = scaleY = curve(t)
7
10
  */
8
- export class ScaleCurveBehaviour {
11
+ class ScaleCurveBehaviour {
9
12
  constructor(keyframes, opts) {
10
13
  this.requires = { vertex: true };
11
14
  this.priority = 50;
12
- this.curve = new Curve(keyframes, { ...opts });
15
+ this.curve = new curve_sampler_1.Curve(keyframes, { ...opts });
13
16
  }
14
17
  onSpawn(p) {
15
18
  const s = this.curve.sample(0);
@@ -23,4 +26,5 @@ export class ScaleCurveBehaviour {
23
26
  p.scaleY = s;
24
27
  }
25
28
  }
29
+ exports.ScaleCurveBehaviour = ScaleCurveBehaviour;
26
30
  //# sourceMappingURL=scale-curve-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scale-curve-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/scale-curve-behaviour.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAGzD;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IAO5B,YAAY,SAA0B,EAAE,IAAmB;QAN3C,aAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAE5B,aAAQ,GAAG,EAAE,CAAC;QAK1B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAY,EAAE,QAAkB;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../px-particle\";\r\nimport { Behaviour } from \"../behaviour\";\r\nimport { CurveKeyframe, CurveOptions } from \"./curved-behaviour/curve-key-frame\";\r\nimport { Curve } from \"./curved-behaviour/curve-sampler\";\r\nimport { Emitter } from \"../emitter\";\r\n\r\n/**\r\n * Uniform scale over lifetime driven by a curve.\r\n *\r\n * Samples a curve using normalized lifetime t in [0..1] and applies:\r\n * scaleX = scaleY = curve(t)\r\n */\r\nexport class ScaleCurveBehaviour implements Behaviour {\r\n public readonly requires = { vertex: true };\r\n\r\n public readonly priority = 50;\r\n\r\n private curve: Curve;\r\n\r\n constructor(keyframes: CurveKeyframe[], opts?: CurveOptions) {\r\n this.curve = new Curve(keyframes, { ...opts });\r\n }\r\n\r\n public onSpawn(p: PxParticle) {\r\n const s = this.curve.sample(0);\r\n p.scaleX = s;\r\n p.scaleY = s;\r\n }\r\n\r\n public update(p: PxParticle, _dt?: number, _emitter?: Emitter) {\r\n const t = p.life > 0 ? p.age / p.life : 1;\r\n const s = this.curve.sample(t);\r\n p.scaleX = s;\r\n p.scaleY = s;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"scale-curve-behaviour.js","sourceRoot":"","sources":["../../src/behaviours/scale-curve-behaviour.ts"],"names":[],"mappings":";;;AAGA,oEAAyD;AAGzD;;;;;GAKG;AACH,MAAa,mBAAmB;IAO5B,YAAY,SAA0B,EAAE,IAAmB;QAN3C,aAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAE5B,aAAQ,GAAG,EAAE,CAAC;QAK1B,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAK,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,CAAa,EAAE,GAAY,EAAE,QAAkB;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;CACJ;AAvBD,kDAuBC"}
@@ -1,3 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircleSpawnBehaviour = void 0;
1
4
  /**
2
5
  * Spawns particles uniformly within a circle centered at (0, 0).
3
6
  *
@@ -5,7 +8,7 @@
5
8
  * (without sqrt you'd get clustering toward the center).
6
9
  *
7
10
  */
8
- export class CircleSpawnBehaviour {
11
+ class CircleSpawnBehaviour {
9
12
  constructor(radius) {
10
13
  this.radius = radius;
11
14
  this.priority = -100;
@@ -17,4 +20,5 @@ export class CircleSpawnBehaviour {
17
20
  p.y = Math.sin(angle) * r;
18
21
  }
19
22
  }
23
+ exports.CircleSpawnBehaviour = CircleSpawnBehaviour;
20
24
  //# sourceMappingURL=circle-spawn-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circle-spawn-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/spawn-behaviours/circle-spawn-behaviour.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAG7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAF3B,aAAQ,GAAG,CAAC,GAAG,CAAC;IAEc,CAAC;IAExC,OAAO,CAAC,CAAa;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAE1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAEjD,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../../px-particle\";\r\nimport { Behaviour } from \"../../behaviour\";\r\n\r\n/**\r\n * Spawns particles uniformly within a circle centered at (0, 0).\r\n *\r\n * Uses sqrt(random) to achieve uniform distribution by area\r\n * (without sqrt you'd get clustering toward the center).\r\n *\r\n */\r\nexport class CircleSpawnBehaviour implements Behaviour {\r\n public readonly priority = -100;\r\n\r\n constructor(private readonly radius: number) {}\r\n\r\n public onSpawn(p: PxParticle) {\r\n const angle = Math.random() * Math.PI * 2;\r\n\r\n const r = Math.sqrt(Math.random()) * this.radius;\r\n\r\n p.x = Math.cos(angle) * r;\r\n p.y = Math.sin(angle) * r;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"circle-spawn-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/spawn-behaviours/circle-spawn-behaviour.ts"],"names":[],"mappings":";;;AAGA;;;;;;GAMG;AACH,MAAa,oBAAoB;IAG7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAF3B,aAAQ,GAAG,CAAC,GAAG,CAAC;IAEc,CAAC;IAExC,OAAO,CAAC,CAAa;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAE1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAEjD,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;CACJ;AAbD,oDAaC"}
@@ -1,7 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RectangleSpawnBehaviour = void 0;
1
4
  /**
2
5
  * Spawns particles uniformly inside a rectangle centered at (0, 0).
3
6
  * */
4
- export class RectangleSpawnBehaviour {
7
+ class RectangleSpawnBehaviour {
5
8
  constructor(width, height) {
6
9
  this.width = width;
7
10
  this.height = height;
@@ -18,4 +21,5 @@ export class RectangleSpawnBehaviour {
18
21
  return min + Math.random() * (max - min);
19
22
  }
20
23
  }
24
+ exports.RectangleSpawnBehaviour = RectangleSpawnBehaviour;
21
25
  //# sourceMappingURL=rectangle-spawn-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rectangle-spawn-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/spawn-behaviours/rectangle-spawn-behaviour.ts"],"names":[],"mappings":"AAGA;;KAEK;AACL,MAAM,OAAO,uBAAuB;IAGhC,YACqB,KAAa,EACb,MAAc;QADd,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QAJnB,aAAQ,GAAG,CAAC,GAAG,CAAC;IAK7B,CAAC;IAEG,OAAO,CAAC,CAAa;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAE7B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,0CAA0C;IAClC,IAAI,CAAC,GAAW,EAAE,GAAW;QACjC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ","sourcesContent":["import { PxParticle } from \"../../px-particle\";\r\nimport { Behaviour } from \"../../behaviour\";\r\n\r\n/**\r\n * Spawns particles uniformly inside a rectangle centered at (0, 0).\r\n * */\r\nexport class RectangleSpawnBehaviour implements Behaviour {\r\n public readonly priority = -100;\r\n\r\n constructor(\r\n private readonly width: number,\r\n private readonly height: number,\r\n ) {}\r\n\r\n public onSpawn(p: PxParticle) {\r\n const hw = this.width * 0.5;\r\n const hh = this.height * 0.5;\r\n\r\n p.x = this.rand(-hw, hw);\r\n p.y = this.rand(-hh, hh);\r\n }\r\n\r\n /** Inclusive-exclusive uniform random. */\r\n private rand(min: number, max: number) {\r\n return min + Math.random() * (max - min);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"rectangle-spawn-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/spawn-behaviours/rectangle-spawn-behaviour.ts"],"names":[],"mappings":";;;AAGA;;KAEK;AACL,MAAa,uBAAuB;IAGhC,YACqB,KAAa,EACb,MAAc;QADd,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QAJnB,aAAQ,GAAG,CAAC,GAAG,CAAC;IAK7B,CAAC;IAEG,OAAO,CAAC,CAAa;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAE7B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,0CAA0C;IAClC,IAAI,CAAC,GAAW,EAAE,GAAW;QACjC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ;AApBD,0DAoBC"}
@@ -1,3 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StaticRotationBehaviour = void 0;
1
4
  /**
2
5
  * Sets a particle's angular velocity at spawn time.
3
6
  *
@@ -5,7 +8,7 @@
5
8
  * Instead, it initializes `angleV`, which the emitter integrates each tick.
6
9
  *
7
10
  */
8
- export class StaticRotationBehaviour {
11
+ class StaticRotationBehaviour {
9
12
  /**
10
13
  * @param speed
11
14
  * - number → fixed angular velocity (radians/sec)
@@ -21,4 +24,5 @@ export class StaticRotationBehaviour {
21
24
  p.angleV = s;
22
25
  }
23
26
  }
27
+ exports.StaticRotationBehaviour = StaticRotationBehaviour;
24
28
  //# sourceMappingURL=static-rotation-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static-rotation-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/static-behaviours/static-rotation-behaviour.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IAKhC;;;;OAIG;IACH,YAAmB,KAA4C;QAA5C,UAAK,GAAL,KAAK,CAAuC;QAT/C,aAAQ,GAAG,CAAC,EAAE,CAAC;QAEf,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAOoB,CAAC;IAE5D,OAAO,CAAC,CAAa;QACxB,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE3H,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import { Behaviour } from \"../../behaviour\";\r\nimport { PxParticle } from \"../../px-particle\";\r\n\r\n/**\r\n * Sets a particle's angular velocity at spawn time.\r\n *\r\n * Does NOT modify rotation per frame directly.\r\n * Instead, it initializes `angleV`, which the emitter integrates each tick.\r\n *\r\n */\r\nexport class StaticRotationBehaviour implements Behaviour {\r\n public readonly priority = -60;\r\n\r\n public readonly requires = { rotation: true };\r\n\r\n /**\r\n * @param speed\r\n * - number → fixed angular velocity (radians/sec)\r\n * - {min,max} → randomized angular velocity per particle\r\n */\r\n constructor(public speed: number | { min: number; max: number }) {}\r\n\r\n public onSpawn(p: PxParticle) {\r\n const s = typeof this.speed === \"number\" ? this.speed : this.speed.min + Math.random() * (this.speed.max - this.speed.min);\r\n\r\n p.angleV = s;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"static-rotation-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/static-behaviours/static-rotation-behaviour.ts"],"names":[],"mappings":";;;AAGA;;;;;;GAMG;AACH,MAAa,uBAAuB;IAKhC;;;;OAIG;IACH,YAAmB,KAA4C;QAA5C,UAAK,GAAL,KAAK,CAAuC;QAT/C,aAAQ,GAAG,CAAC,EAAE,CAAC;QAEf,aAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAOoB,CAAC;IAE5D,OAAO,CAAC,CAAa;QACxB,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE3H,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;CACJ;AAjBD,0DAiBC"}
@@ -1,8 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StaticScaleBehaviour = void 0;
1
4
  /**
2
5
  * Sets particle scale at spawn time.
3
6
  *
4
7
  */
5
- export class StaticScaleBehaviour {
8
+ class StaticScaleBehaviour {
6
9
  constructor(spawnScale) {
7
10
  this.priority = -60;
8
11
  this.spawnScale = spawnScale;
@@ -12,4 +15,5 @@ export class StaticScaleBehaviour {
12
15
  p.scaleY = this.spawnScale;
13
16
  }
14
17
  }
18
+ exports.StaticScaleBehaviour = StaticScaleBehaviour;
15
19
  //# sourceMappingURL=static-scale-behaviour.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static-scale-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/static-behaviours/static-scale-behaviour.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAK7B,YAAY,UAAkB;QAJd,aAAQ,GAAG,CAAC,EAAE,CAAC;QAK3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC/B,CAAC;CACJ","sourcesContent":["import { Behaviour } from \"../../behaviour\";\r\nimport { PxParticle } from \"../../px-particle\";\r\n\r\n/**\r\n * Sets particle scale at spawn time.\r\n *\r\n */\r\nexport class StaticScaleBehaviour implements Behaviour {\r\n public readonly priority = -60;\r\n\r\n public spawnScale: number;\r\n\r\n constructor(spawnScale: number) {\r\n this.spawnScale = spawnScale;\r\n }\r\n\r\n public onSpawn(p: PxParticle) {\r\n p.scaleX = this.spawnScale;\r\n p.scaleY = this.spawnScale;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"static-scale-behaviour.js","sourceRoot":"","sources":["../../../src/behaviours/static-behaviours/static-scale-behaviour.ts"],"names":[],"mappings":";;;AAGA;;;GAGG;AACH,MAAa,oBAAoB;IAK7B,YAAY,UAAkB;QAJd,aAAQ,GAAG,CAAC,EAAE,CAAC;QAK3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAEM,OAAO,CAAC,CAAa;QACxB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC/B,CAAC;CACJ;AAbD,oDAaC"}
package/dist/emitter.js CHANGED
@@ -1,5 +1,8 @@
1
- import { ParticleContainer, Ticker } from "pixi.js";
2
- import { PxParticle } from "./px-particle";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Emitter = void 0;
4
+ const pixi_js_1 = require("pixi.js");
5
+ const px_particle_1 = require("./px-particle");
3
6
  /**
4
7
  * Emitter is a ParticleContainer that owns a pool of {@link PxParticle} instances.
5
8
  *
@@ -9,7 +12,7 @@ import { PxParticle } from "./px-particle";
9
12
  * - Update active particles each tick (movement, behaviours, textures).
10
13
  * - Recycle dead particles back into the pool.
11
14
  */
12
- export class Emitter extends ParticleContainer {
15
+ class Emitter extends pixi_js_1.ParticleContainer {
13
16
  constructor(options, textureProvider) {
14
17
  super({
15
18
  label: "Emitter",
@@ -61,7 +64,7 @@ export class Emitter extends ParticleContainer {
61
64
  * The actual texture may be replaced on spawn by the provider.
62
65
  */
63
66
  for (let i = 0; i < this.maxParticles; i++) {
64
- const p = new PxParticle({ texture: this.textureProvider.initialTexture() });
67
+ const p = new px_particle_1.PxParticle({ texture: this.textureProvider.initialTexture() });
65
68
  this.pool.push(p);
66
69
  }
67
70
  /**
@@ -71,7 +74,7 @@ export class Emitter extends ParticleContainer {
71
74
  *
72
75
  * NOTE: currently updateEmitter is still public and can be called manually.
73
76
  */
74
- this.ticker = options.ticker ?? Ticker.shared;
77
+ this.ticker = options.ticker ?? pixi_js_1.Ticker.shared;
75
78
  if (this.mode !== "manual") {
76
79
  this.attachTicker();
77
80
  }
@@ -296,7 +299,7 @@ export class Emitter extends ParticleContainer {
296
299
  this.updateEmitterBound = this.updateEmitter.bind(this);
297
300
  }
298
301
  if (!this.ticker) {
299
- this.ticker = Ticker.shared;
302
+ this.ticker = pixi_js_1.Ticker.shared;
300
303
  }
301
304
  this.ticker.add(this.updateEmitterBound);
302
305
  this.tickerAttached = true;
@@ -337,4 +340,5 @@ export class Emitter extends ParticleContainer {
337
340
  super.destroy(options);
338
341
  }
339
342
  }
343
+ exports.Emitter = Emitter;
340
344
  //# sourceMappingURL=emitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ParticleContainer, ParticleContainerOptions, ParticleProperties, Ticker } from \"pixi.js\";\r\nimport { Behaviour } from \"./behaviour\";\r\nimport { TextureProvider } from \"./texture-provider\";\r\nimport { PxParticle } from \"./px-particle\";\r\n\r\n/**\r\n * How this emitter produces particles over time:\r\n * - \"rate\": continuously emits at a fixed particles-per-second\r\n * - \"wave\": emits discrete bursts (\"waves\") every interval\r\n * - \"manual\": user code calls emitBurst/emitWave; no ticker hookup\r\n */\r\nexport type EmissionMode = \"rate\" | \"wave\" | \"manual\";\r\n\r\n/**\r\n * Configuration passed to {@link Emitter}.\r\n *\r\n * Notes:\r\n * - In \"rate\" mode, you must provide `ratePerSecond`\r\n * - In \"wave\" mode, you should provide `waveInterval` and `particlesPerWave`\r\n * - In \"manual\" mode, the emitter will NOT auto-update; you trigger emission yourself\r\n */\r\nexport interface EmitterOptions {\r\n /**\r\n * Options forwarded to PixiJS ParticleContainer.\r\n * You can set blendMode, position, etc.\r\n *\r\n * NOTE: dynamicProperties are computed automatically based on behaviours + texture provider.\r\n */\r\n containerOptions?: ParticleContainerOptions;\r\n\r\n /** Maximum number of particles alive at the same time. Also defines the pool size. */\r\n maxParticles: number;\r\n\r\n /** Emission strategy (rate / wave / manual). */\r\n mode: EmissionMode;\r\n\r\n /**\r\n * Particles per second when mode === \"rate\".\r\n */\r\n ratePerSecond?: number;\r\n\r\n /**\r\n * Seconds between waves when mode === \"wave\".\r\n * If omitted, a default is used.\r\n */\r\n waveInterval?: number;\r\n\r\n /**\r\n * How many particles are spawned each wave when mode === \"wave\".\r\n * If omitted, defaults to 1.\r\n */\r\n particlesPerWave?: number;\r\n\r\n /** Particle lifetime in seconds. Each particle chooses a random value in [min, max]. */\r\n lifetime: { min: number; max: number };\r\n\r\n /**\r\n * If true, the emitter automatically emits according to its mode.\r\n * If false, particles can still be spawned using manual methods.\r\n */\r\n emitting?: boolean;\r\n\r\n /**\r\n * Clamp delta-time to avoid huge simulation jumps (tab pause, breakpoint, slow frame, etc).\r\n * This prevents spawning a massive burst and \"teleporting\" particles.\r\n */\r\n maxDeltaSeconds?: number;\r\n\r\n /**\r\n * Behaviours are modular systems applied to particles.\r\n * Typical responsibilities:\r\n * - initialize properties at spawn (velocity, scale, alpha, etc)\r\n * - update properties each frame (curves, gravity, drag, etc)\r\n *\r\n * Behaviours can also declare \"requires\" to enable ParticleContainer dynamicProperties.\r\n */\r\n behaviours?: Behaviour[];\r\n\r\n /**\r\n * If true, particles are added at index 0 (behind existing children).\r\n * Useful for layering (e.g. smoke behind sparks).\r\n */\r\n addAtBack?: boolean;\r\n\r\n /**\r\n * Optional custom ticker (e.g. your app ticker).\r\n * If omitted, uses Ticker.shared.\r\n */\r\n ticker?: Ticker;\r\n}\r\n\r\n/**\r\n * Internally we keep behaviours in a stable sorted array:\r\n * - prio: behaviour priority (lower runs earlier)\r\n * - order: insertion order to break ties (stable ordering)\r\n */\r\ntype SortedBehaviour = { b: Behaviour; order: number; prio: number };\r\n\r\n/**\r\n * ParticleContainer dynamicProperties config.\r\n * Pixi uses this to know which particle attributes must be re-uploaded to GPU each frame.\r\n */\r\ntype DynamicProps = ParticleProperties & Record<string, boolean>;\r\n\r\n/**\r\n * Emitter is a ParticleContainer that owns a pool of {@link PxParticle} instances.\r\n *\r\n * Core responsibilities:\r\n * - Keep a pool of particles to avoid allocations during gameplay.\r\n * - Emit particles according to the selected EmissionMode.\r\n * - Update active particles each tick (movement, behaviours, textures).\r\n * - Recycle dead particles back into the pool.\r\n */\r\nexport class Emitter extends ParticleContainer {\r\n /** Pool capacity / maximum concurrent particles. */\r\n private maxParticles: number;\r\n\r\n /** Current emission mode. */\r\n private mode: EmissionMode;\r\n\r\n /** Particles per second for mode=\"rate\". */\r\n public ratePerSecond?: number;\r\n\r\n /** Wave interval (seconds) for mode=\"wave\". */\r\n public waveInterval?: number;\r\n\r\n /** Particles per wave for mode=\"wave\". */\r\n public particlesPerWave?: number;\r\n\r\n /** Lifetime range (seconds) used for each spawned particle. */\r\n private lifetime: { min: number; max: number };\r\n\r\n /**\r\n * If true, emission is automatic (rate/wave).\r\n * If false, update still runs but no new particles are spawned.\r\n */\r\n public emitting?: boolean;\r\n\r\n /** Delta clamp to keep simulation stable on long frames. */\r\n private maxDeltaSeconds: number;\r\n\r\n /** Whether new particles should be added behind existing particles. */\r\n public addAtBack?: boolean;\r\n\r\n /** Ticker driving updates when not in manual mode. */\r\n private ticker: Ticker;\r\n\r\n /** Responsible for choosing textures and (optionally) updating animated textures. */\r\n private textureProvider: TextureProvider;\r\n\r\n /** Inactive particle pool (reused). */\r\n private readonly pool: PxParticle[] = [];\r\n\r\n /** Active particles currently simulated and rendered. */\r\n private readonly active: PxParticle[] = [];\r\n\r\n /**\r\n * Sorted behaviours (priority + stable insertion order).\r\n * Behaviours are applied in order every frame.\r\n */\r\n private behaviours: SortedBehaviour[] = [];\r\n private nextBehaviourOrder = 0;\r\n\r\n /** Accumulator used to compute spawn counts in rate mode. */\r\n private emitAcc = 0;\r\n\r\n /** Accumulator used to track time between waves in wave mode. */\r\n private waveAcc = 0;\r\n\r\n private updateEmitterBound?: (ticker: Ticker) => void;\r\n private tickerAttached = false;\r\n\r\n constructor(options: EmitterOptions, textureProvider: TextureProvider) {\r\n super({\r\n label: \"Emitter\",\r\n ...options.containerOptions,\r\n\r\n /**\r\n * Important optimization:\r\n * We enable only the dynamic properties that are actually needed\r\n * (based on behaviours + texture provider requirements).\r\n */\r\n dynamicProperties: Emitter.computeDynamicProperties(options.behaviours ?? [], textureProvider),\r\n });\r\n\r\n this.maxParticles = options.maxParticles;\r\n this.mode = options.mode;\r\n this.ratePerSecond = options.ratePerSecond;\r\n this.waveInterval = options.waveInterval;\r\n this.particlesPerWave = options.particlesPerWave;\r\n this.lifetime = options.lifetime;\r\n this.emitting = options.emitting;\r\n this.maxDeltaSeconds = options.maxDeltaSeconds ?? 0.1;\r\n this.addAtBack = options.addAtBack;\r\n\r\n this.textureProvider = textureProvider;\r\n\r\n // Register behaviours (sorted by priority + stable order).\r\n if (options.behaviours) {\r\n for (const behaviour of options.behaviours) {\r\n this.addBehaviour(behaviour);\r\n }\r\n }\r\n\r\n /**\r\n * Pre-allocate particles upfront:\r\n * - avoids runtime allocations / GC spikes\r\n * - allows \"maxParticles\" to be a hard cap\r\n *\r\n * Each pooled particle gets an initial texture (required by Pixi Particle).\r\n * The actual texture may be replaced on spawn by the provider.\r\n */\r\n for (let i = 0; i < this.maxParticles; i++) {\r\n const p = new PxParticle({ texture: this.textureProvider.initialTexture() });\r\n this.pool.push(p);\r\n }\r\n\r\n /**\r\n * In manual mode we do NOT attach to a ticker.\r\n * User code calls emitBurst/emitWave and also needs to call updateEmitter manually\r\n * (or you can provide a separate public update method if you prefer).\r\n *\r\n * NOTE: currently updateEmitter is still public and can be called manually.\r\n */\r\n this.ticker = options.ticker ?? Ticker.shared;\r\n if (this.mode !== \"manual\") {\r\n this.attachTicker();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a behaviour and inserts it into the sorted execution order.\r\n * Priority controls order; ties are resolved by insertion order.\r\n */\r\n private addBehaviour(b: Behaviour): this {\r\n this.behaviours.push({\r\n b,\r\n order: this.nextBehaviourOrder++,\r\n prio: b.priority ?? 0,\r\n });\r\n\r\n // lower priority runs earlier\r\n this.behaviours.sort((a, c) => a.prio - c.prio || a.order - c.order);\r\n\r\n // Optional init hook for behaviour to cache references or precompute curves.\r\n b.init?.(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Ticker callback: advances simulation and handles emission.\r\n *\r\n * The emitter uses ticker.deltaMS (milliseconds between frames) converted to seconds.\r\n * We clamp dt to maxDeltaSeconds to avoid large jumps and excessive spawning.\r\n */\r\n public updateEmitter(ticker: Ticker): void {\r\n const maxDt = this.maxDeltaSeconds;\r\n let dt = ticker.deltaMS / 1000;\r\n\r\n // Clamp dt for stability (e.g. tab in background).\r\n if (dt > maxDt) dt = maxDt;\r\n if (dt <= 0) return;\r\n\r\n // Spawn new particles if enabled.\r\n if (this.emitting) this.emitParticles(dt);\r\n\r\n /**\r\n * Update particles & kill dead ones.\r\n * Iterate backwards so we can remove by index safely.\r\n */\r\n for (let i = this.active.length - 1; i >= 0; i--) {\r\n const p = this.active[i];\r\n\r\n // Texture provider may animate / swap textures per frame.\r\n this.textureProvider.update?.(p, dt);\r\n\r\n // Base integrator: apply velocity and angular velocity.\r\n // Behaviours can also modify velocity, position, rotation, etc.\r\n p.age += dt;\r\n p.x += p.vx * dt;\r\n p.y += p.vy * dt;\r\n p.rotation += p.angleV * dt;\r\n\r\n // Apply behaviours in sorted order.\r\n for (const entry of this.behaviours) entry.b.update?.(p, dt, this);\r\n\r\n // Kill particle if it exceeded its lifetime.\r\n if (p.age >= p.life) {\r\n this.killAtIndex(i);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emits particles according to the emitter's mode.\r\n * This method is called automatically each tick when emitting=true.\r\n */\r\n private emitParticles(dt: number): void {\r\n if (this.mode === \"rate\") {\r\n const rate = this.ratePerSecond ?? 0;\r\n if (rate <= 0) return;\r\n\r\n /**\r\n * Accumulate fractional time and convert into \"how many particles should we emit\".\r\n * This produces stable emission even with variable frame rates.\r\n */\r\n this.emitAcc += dt;\r\n const want = Math.floor(this.emitAcc * rate);\r\n if (want <= 0) return;\r\n\r\n // Keep the remainder time after spawning `want` particles.\r\n this.emitAcc -= want / rate;\r\n\r\n for (let i = 0; i < want; i++) this.spawnOne();\r\n return;\r\n }\r\n\r\n if (this.mode === \"wave\") {\r\n const interval = this.waveInterval ?? 0.25;\r\n const perWave = this.particlesPerWave ?? 1;\r\n if (interval <= 0 || perWave <= 0) return;\r\n\r\n // Emit full waves when the accumulated time crosses the interval.\r\n this.waveAcc += dt;\r\n while (this.waveAcc >= interval) {\r\n this.waveAcc -= interval;\r\n for (let i = 0; i < perWave; i++) this.spawnOne();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Spawns a single particle from the pool.\r\n *\r\n * IMPORTANT:\r\n * - If the pool is empty, spawning is skipped (hard cap).\r\n * - Texture is selected by TextureProvider at spawn time.\r\n * - Behaviours' onSpawn hooks initialize per-particle state.\r\n */\r\n private spawnOne(): void {\r\n const p = this.pool.pop();\r\n if (!p) return;\r\n\r\n if (this.textureProvider.textureForSpawn) p.texture = this.textureProvider.textureForSpawn(p);\r\n\r\n p.onSpawn();\r\n\r\n // Allow behaviours to initialize the particle for this spawn.\r\n for (const behaviour of this.behaviours) behaviour.b.onSpawn?.(p, this);\r\n\r\n // Add particle to the container (front or back).\r\n if (this.addAtBack) {\r\n this.addParticleAt(p, 0);\r\n } else {\r\n this.addParticle(p);\r\n }\r\n\r\n // Randomize lifetime in [min, max].\r\n const { min, max } = this.lifetime;\r\n p.life = min + Math.random() * Math.max(0, max - min);\r\n\r\n this.active.push(p);\r\n }\r\n\r\n /**\r\n * Kills and recycles a particle at a given index in the active list.\r\n *\r\n * Order of operations:\r\n * 1) behaviour kill hooks (reverse order, mirroring teardown)\r\n * 2) provider kill hook\r\n * 3) reset particle instance\r\n * 4) remove from container + active list\r\n * 5) return to pool\r\n */\r\n private killAtIndex(activeIndex: number): void {\r\n const p = this.active[activeIndex];\r\n\r\n // Call behaviours' teardown in reverse to match common init/apply ordering expectations.\r\n for (let i = this.behaviours.length - 1; i >= 0; i--) {\r\n this.behaviours[i].b.onKill?.(p, this);\r\n }\r\n\r\n this.textureProvider.onKill?.(p);\r\n\r\n p.onKill();\r\n\r\n this.removeParticle(p);\r\n\r\n /**\r\n * Remove from active list using \"swap remove\":\r\n * - O(1)\r\n * - does not preserve ordering (fine for particle sims)\r\n */\r\n const last = this.active.length - 1;\r\n if (activeIndex !== last) this.active[activeIndex] = this.active[last];\r\n this.active.pop();\r\n\r\n this.pool.push(p);\r\n }\r\n\r\n /**\r\n * Immediately kills all active particles and resets emission accumulators.\r\n * Useful when restarting an effect or changing scenes.\r\n */\r\n public clearParticles(): void {\r\n this.emitAcc = 0;\r\n this.waveAcc = 0;\r\n\r\n while (this.active.length > 0) {\r\n this.killAtIndex(this.active.length - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Manual emission helpers.\r\n * Only relevant if mode === \"manual\" or emitting === false.\r\n */\r\n public emitBurst(count: number): void {\r\n for (let i = 0; i < count; i++) this.spawnOne();\r\n }\r\n\r\n public emitWave(): void {\r\n const n = this.particlesPerWave ?? 0;\r\n for (let i = 0; i < n; i++) this.spawnOne();\r\n }\r\n\r\n /**\r\n * Computes ParticleContainer dynamicProperties from:\r\n * - TextureProvider.requires\r\n * - each Behaviour.requires\r\n *\r\n * Keeping these minimal is important for performance:\r\n * enabling extra dynamic properties can increase per-frame GPU uploads.\r\n */\r\n private static computeDynamicProperties(behaviours: Behaviour[], provider: TextureProvider): DynamicProps {\r\n const props: DynamicProps = {\r\n position: false,\r\n rotation: false,\r\n vertex: false,\r\n uvs: false,\r\n color: false,\r\n };\r\n\r\n // Texture provider may require updates like uvs (animated textures) or vertex.\r\n if (provider.requires) {\r\n for (const key in provider.requires) {\r\n props[key] = true;\r\n }\r\n }\r\n\r\n // Behaviours declare which GPU-updated properties they touch over time.\r\n for (const b of behaviours) {\r\n if (!b.requires) continue;\r\n\r\n for (const key in b.requires) {\r\n props[key] = true;\r\n }\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /**\r\n * Attaches the emitter update loop to the configured ticker.\r\n */\r\n private attachTicker(): void {\r\n if (this.tickerAttached) return;\r\n if (!this.updateEmitterBound) {\r\n this.updateEmitterBound = this.updateEmitter.bind(this);\r\n }\r\n\r\n if (!this.ticker) {\r\n this.ticker = Ticker.shared;\r\n }\r\n\r\n this.ticker.add(this.updateEmitterBound);\r\n this.tickerAttached = true;\r\n }\r\n\r\n /**\r\n * Detaches the emitter update loop from the ticker.\r\n */\r\n private detachTicker(): void {\r\n if (!this.tickerAttached) return;\r\n if (!this.ticker || !this.updateEmitterBound) return;\r\n this.ticker.remove(this.updateEmitterBound);\r\n this.tickerAttached = false;\r\n }\r\n\r\n /**\r\n * Changes the emission mode at runtime.\r\n *\r\n * - Switching to \"manual\" detaches the ticker.\r\n * - Switching to \"rate\" or \"wave\" attaches the ticker.\r\n *\r\n */\r\n public setMode(mode: EmissionMode): void {\r\n if (this.mode === mode) return;\r\n\r\n const wasManual = this.mode === \"manual\";\r\n const willBeManual = mode === \"manual\";\r\n\r\n this.mode = mode;\r\n\r\n if (!wasManual && willBeManual) {\r\n this.detachTicker();\r\n } else if (wasManual && !willBeManual) {\r\n this.attachTicker();\r\n }\r\n }\r\n\r\n public override destroy(options?: any): void {\r\n this.detachTicker();\r\n super.destroy(options);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,19 +1,35 @@
1
- export * from "./behaviour";
2
- export * from "./emitter";
3
- export * from "./texture-provider";
4
- export * from "./behaviours/alpha-behaviour";
5
- export * from "./behaviours/alpha-curve-behaviour";
6
- export * from "./behaviours/scale-curve-behaviour";
7
- export * from "./behaviours/curved-behaviour/curve-key-frame";
8
- export * from "./behaviours/curved-behaviour/curve-sampler";
9
- export * from "./behaviours/movement-behaviours/gravity-behaviour";
10
- export * from "./behaviours/movement-behaviours/movement-curve-behaviour";
11
- export * from "./behaviours/movement-behaviours/radial-burst-behaviour";
12
- export * from "./behaviours/spawn-behaviours/circle-spawn-behaviour";
13
- export * from "./behaviours/spawn-behaviours/rectangle-spawn-behaviour";
14
- export * from "./behaviours/static-behaviours/static-rotation-behaviour";
15
- export * from "./behaviours/static-behaviours/static-scale-behaviour";
16
- export * from "./texture-providers/animated-texture-provider";
17
- export * from "./texture-providers/single-texture-provider";
18
- export * from "./texture-providers/weighted-texture-provider";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./behaviour"), exports);
18
+ __exportStar(require("./emitter"), exports);
19
+ __exportStar(require("./texture-provider"), exports);
20
+ __exportStar(require("./behaviours/alpha-behaviour"), exports);
21
+ __exportStar(require("./behaviours/alpha-curve-behaviour"), exports);
22
+ __exportStar(require("./behaviours/scale-curve-behaviour"), exports);
23
+ __exportStar(require("./behaviours/curved-behaviour/curve-key-frame"), exports);
24
+ __exportStar(require("./behaviours/curved-behaviour/curve-sampler"), exports);
25
+ __exportStar(require("./behaviours/movement-behaviours/gravity-behaviour"), exports);
26
+ __exportStar(require("./behaviours/movement-behaviours/movement-curve-behaviour"), exports);
27
+ __exportStar(require("./behaviours/movement-behaviours/radial-burst-behaviour"), exports);
28
+ __exportStar(require("./behaviours/spawn-behaviours/circle-spawn-behaviour"), exports);
29
+ __exportStar(require("./behaviours/spawn-behaviours/rectangle-spawn-behaviour"), exports);
30
+ __exportStar(require("./behaviours/static-behaviours/static-rotation-behaviour"), exports);
31
+ __exportStar(require("./behaviours/static-behaviours/static-scale-behaviour"), exports);
32
+ __exportStar(require("./texture-providers/animated-texture-provider"), exports);
33
+ __exportStar(require("./texture-providers/single-texture-provider"), exports);
34
+ __exportStar(require("./texture-providers/weighted-texture-provider"), exports);
19
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,yDAAyD,CAAC;AACxE,cAAc,sDAAsD,CAAC;AACrE,cAAc,yDAAyD,CAAC;AACxE,cAAc,0DAA0D,CAAC;AACzE,cAAc,uDAAuD,CAAC;AACtE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC","sourcesContent":["export * from \"./behaviour\";\r\nexport * from \"./emitter\";\r\nexport * from \"./texture-provider\";\r\nexport * from \"./behaviours/alpha-behaviour\";\r\nexport * from \"./behaviours/alpha-curve-behaviour\";\r\nexport * from \"./behaviours/scale-curve-behaviour\";\r\nexport * from \"./behaviours/curved-behaviour/curve-key-frame\";\r\nexport * from \"./behaviours/curved-behaviour/curve-sampler\";\r\nexport * from \"./behaviours/movement-behaviours/gravity-behaviour\";\r\nexport * from \"./behaviours/movement-behaviours/movement-curve-behaviour\";\r\nexport * from \"./behaviours/movement-behaviours/radial-burst-behaviour\";\r\nexport * from \"./behaviours/spawn-behaviours/circle-spawn-behaviour\";\r\nexport * from \"./behaviours/spawn-behaviours/rectangle-spawn-behaviour\";\r\nexport * from \"./behaviours/static-behaviours/static-rotation-behaviour\";\r\nexport * from \"./behaviours/static-behaviours/static-scale-behaviour\";\r\nexport * from \"./texture-providers/animated-texture-provider\";\r\nexport * from \"./texture-providers/single-texture-provider\";\r\nexport * from \"./texture-providers/weighted-texture-provider\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,4CAA0B;AAC1B,qDAAmC;AACnC,+DAA6C;AAC7C,qEAAmD;AACnD,qEAAmD;AACnD,gFAA8D;AAC9D,8EAA4D;AAC5D,qFAAmE;AACnE,4FAA0E;AAC1E,0FAAwE;AACxE,uFAAqE;AACrE,0FAAwE;AACxE,2FAAyE;AACzE,wFAAsE;AACtE,gFAA8D;AAC9D,8EAA4D;AAC5D,gFAA8D"}
@@ -1,4 +1,7 @@
1
- import { Particle } from "pixi.js";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PxParticle = void 0;
4
+ const pixi_js_1 = require("pixi.js");
2
5
  /**
3
6
  * PxParticle extends PixiJS {@link Particle} with simulation state.
4
7
  *
@@ -11,7 +14,7 @@ import { Particle } from "pixi.js";
11
14
  * Particles are never destroyed during runtime.
12
15
  * They are recycled via onKill() and reused via onSpawn().
13
16
  */
14
- export class PxParticle extends Particle {
17
+ class PxParticle extends pixi_js_1.Particle {
15
18
  constructor(options) {
16
19
  // Center anchor by default
17
20
  options.anchorX = 0.5;
@@ -73,4 +76,5 @@ export class PxParticle extends Particle {
73
76
  this.y = 0;
74
77
  }
75
78
  }
79
+ exports.PxParticle = PxParticle;
76
80
  //# sourceMappingURL=px-particle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"px-particle.js","sourceRoot":"","sources":["../src/px-particle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,SAAS,CAAC;AAYpD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,UAAW,SAAQ,QAAQ;IAsBpC,YAAY,OAAwB;QAChC,2BAA2B;QAC3B,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;QACtB,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QA1BnB,2BAA2B;QACpB,QAAG,GAAG,CAAC,CAAC;QAEf,uEAAuE;QAChE,SAAI,GAAG,CAAC,CAAC;QAEhB,8CAA8C;QACvC,OAAE,GAAG,CAAC,CAAC;QAEd,8CAA8C;QACvC,OAAE,GAAG,CAAC,CAAC;QAEd,8CAA8C;QACvC,WAAM,GAAG,CAAC,CAAC;QAed,kCAAkC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM;QACT,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAC3C,CAAC;IAED;;;;;;;;OAQG;IACI,OAAO;QACV,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,qBAAqB;QACrB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QAErB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;CACJ","sourcesContent":["import { Particle, ParticleOptions } from \"pixi.js\";\r\n\r\n/**\r\n * Internal state used by AnimatedTextureProvider.\r\n *\r\n * `t` tracks elapsed time (seconds) inside the animation.\r\n * This allows providers to compute frame index based on lifetime progression.\r\n */\r\nexport type AnimatedParticleState = {\r\n t: number; // seconds progressed in animated texture (sprite sheet)\r\n};\r\n\r\n/**\r\n * PxParticle extends PixiJS {@link Particle} with simulation state.\r\n *\r\n * Why this exists:\r\n * - Pixi's Particle handles rendering efficiently.\r\n * - We extend it to attach simulation data (velocity, lifetime, etc).\r\n * - Instances are pooled and reused by the Emitter.\r\n *\r\n * IMPORTANT:\r\n * Particles are never destroyed during runtime.\r\n * They are recycled via onKill() and reused via onSpawn().\r\n */\r\nexport class PxParticle extends Particle {\r\n /** Seconds since spawn. */\r\n public age = 0;\r\n\r\n /** Total lifetime in seconds (randomized per spawn by the emitter). */\r\n public life = 1;\r\n\r\n /** Velocity in pixels per second (X axis). */\r\n public vx = 0;\r\n\r\n /** Velocity in pixels per second (Y axis). */\r\n public vy = 0;\r\n\r\n /** Angular velocity in radians per second. */\r\n public angleV = 0;\r\n\r\n /**\r\n * Optional provider-specific animation state.\r\n * Used by AnimatedTextureProvider (if present).\r\n */\r\n public animatedParticleState?: AnimatedParticleState;\r\n\r\n constructor(options: ParticleOptions) {\r\n // Center anchor by default\r\n options.anchorX = 0.5;\r\n options.anchorY = 0.5;\r\n\r\n super(options);\r\n\r\n // Start in pooled/inactive state.\r\n this.onKill();\r\n }\r\n\r\n /**\r\n * Resets the particle into pooled (inactive) state.\r\n *\r\n * Called when:\r\n * - The particle exceeds its lifetime\r\n * - The emitter clears particles\r\n *\r\n * This must leave the particle in a clean state so it can safely be reused.\r\n */\r\n public onKill(): void {\r\n this.age = 0;\r\n this.life = 1;\r\n\r\n this.vx = 0;\r\n this.vy = 0;\r\n this.angleV = 0;\r\n\r\n this.animatedParticleState = undefined;\r\n }\r\n\r\n /**\r\n * Prepares the particle for active simulation.\r\n *\r\n * Called when:\r\n * - The emitter spawns this particle from the pool\r\n *\r\n * Resets all visual and simulation state to defaults.\r\n * Behaviours will then modify properties as needed.\r\n */\r\n public onSpawn(): void {\r\n this.age = 0;\r\n this.life = 1;\r\n\r\n this.vx = 0;\r\n this.vy = 0;\r\n this.angleV = 0;\r\n\r\n this.animatedParticleState = undefined;\r\n\r\n // Reset visual state\r\n this.alpha = 1;\r\n this.tint = 0xffffff;\r\n\r\n this.rotation = 0;\r\n this.scaleX = 1;\r\n this.scaleY = 1;\r\n\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"px-particle.js","sourceRoot":"","sources":["../src/px-particle.ts"],"names":[],"mappings":";;;AAAA,qCAAoD;AAYpD;;;;;;;;;;;GAWG;AACH,MAAa,UAAW,SAAQ,kBAAQ;IAsBpC,YAAY,OAAwB;QAChC,2BAA2B;QAC3B,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;QACtB,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QA1BnB,2BAA2B;QACpB,QAAG,GAAG,CAAC,CAAC;QAEf,uEAAuE;QAChE,SAAI,GAAG,CAAC,CAAC;QAEhB,8CAA8C;QACvC,OAAE,GAAG,CAAC,CAAC;QAEd,8CAA8C;QACvC,OAAE,GAAG,CAAC,CAAC;QAEd,8CAA8C;QACvC,WAAM,GAAG,CAAC,CAAC;QAed,kCAAkC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM;QACT,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAC3C,CAAC;IAED;;;;;;;;OAQG;IACI,OAAO;QACV,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,qBAAqB;QACrB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QAErB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;CACJ;AAnFD,gCAmFC"}
@@ -1,2 +1,3 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
2
3
  //# sourceMappingURL=texture-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"texture-provider.js","sourceRoot":"","sources":["../src/texture-provider.ts"],"names":[],"mappings":"","sourcesContent":["import { ParticleProperties, Texture } from \"pixi.js\";\r\nimport { PxParticle } from \"./px-particle\";\r\n\r\n/**\r\n * TextureProvider decides which {@link Texture} a particle uses.\r\n *\r\n * It is called in two different phases:\r\n * 1) Pool creation: `initialTexture()` (required by Pixi to construct the particle)\r\n * 2) Spawn / simulation: `textureForSpawn()` and optional `update()`\r\n *\r\n * Providers may be stateless (single texture) or stateful (animated textures, weighted random, etc).\r\n * Keep provider methods lightweight: they can be called very frequently.\r\n */\r\nexport interface TextureProvider {\r\n /**\r\n * Dynamic property requirements for this provider.\r\n *\r\n * PixiJS ParticleContainer can skip updating GPU buffers unless you mark certain fields as dynamic.\r\n * If your provider changes something over time that affects rendering (e.g. UVs for animation),\r\n * declare it here so the emitter enables the correct `dynamicProperties`.\r\n *\r\n * Example:\r\n * requires: { uvs: true }\r\n */\r\n readonly requires?: ParticleProperties;\r\n\r\n /**\r\n * Called once per pooled particle, at pool initialization time.\r\n *\r\n * Pixi requires a texture to construct each Particle, so this must always return a valid Texture.\r\n * The texture returned here is just an initial placeholder; it can be replaced on spawn.\r\n */\r\n initialTexture(): Texture;\r\n\r\n /**\r\n * Called every time a particle is spawned.\r\n *\r\n * Must return a valid texture. May depend on:\r\n * - random selection (weighted sets)\r\n * - emitter state\r\n * - particle state (reused pooled particle)\r\n *\r\n */\r\n textureForSpawn?(p: PxParticle): Texture;\r\n\r\n /**\r\n * Optional per-frame hook.\r\n *\r\n * Use this when the texture can change during the particle's life:\r\n * - animated textures (flipbook)\r\n * - texture swapping\r\n *\r\n * If you mutate anything that affects rendering (like UVs), ensure `requires`\r\n * contains the correct dynamicProperties.\r\n */\r\n update?(p: PxParticle, dt: number): void;\r\n\r\n /**\r\n * Optional recycle hook.\r\n *\r\n * Called when a particle is killed and returned to the pool.\r\n * Use this to clear any provider-specific state stored on the particle\r\n * (e.g. animation frame index, timers, cached references).\r\n */\r\n onKill?(p: PxParticle): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"texture-provider.js","sourceRoot":"","sources":["../src/texture-provider.ts"],"names":[],"mappings":""}
@@ -1,4 +1,7 @@
1
- import { Texture } from "pixi.js";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnimatedTextureProvider = void 0;
4
+ const pixi_js_1 = require("pixi.js");
2
5
  /**
3
6
  * Flipbook-style animated texture provider.
4
7
  *
@@ -13,7 +16,7 @@ import { Texture } from "pixi.js";
13
16
  *
14
17
  * so the Emitter enables the correct ParticleContainer dynamicProperties.
15
18
  */
16
- export class AnimatedTextureProvider {
19
+ class AnimatedTextureProvider {
17
20
  constructor(options) {
18
21
  /** UV updates are required because textures change during lifetime. */
19
22
  this.requires = { uvs: true };
@@ -22,7 +25,7 @@ export class AnimatedTextureProvider {
22
25
  this.frames = [];
23
26
  for (let i = start; i < options.numberOfFrames + start; i++) {
24
27
  const alias = `${options.texturePrefix}${i.toString().padStart(padLength, "0")}`;
25
- this.frames.push(Texture.from(alias));
28
+ this.frames.push(pixi_js_1.Texture.from(alias));
26
29
  }
27
30
  if (this.frames.length === 0) {
28
31
  throw new Error("AnimatedTextureProvider: no frames generated");
@@ -69,4 +72,5 @@ export class AnimatedTextureProvider {
69
72
  p.animatedParticleState = undefined;
70
73
  }
71
74
  }
75
+ exports.AnimatedTextureProvider = AnimatedTextureProvider;
72
76
  //# sourceMappingURL=animated-texture-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"animated-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/animated-texture-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAsDlC;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,uBAAuB;IAahC,YAAY,OAAuC;QAZnD,uEAAuE;QACvD,aAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAYrC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAEhF,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,CAAa;QAChC,CAAC,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO;QAEhE,CAAC,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEnG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,CAAa;QACvB,CAAC,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,CAAC;CACJ","sourcesContent":["import { Texture } from \"pixi.js\";\r\nimport { TextureProvider } from \"../texture-provider\";\r\nimport { PxParticle } from \"../px-particle\";\r\n\r\n/**\r\n * Configuration for AnimatedTextureProvider.\r\n *\r\n * Frames are generated using:\r\n * `${texturePrefix}${frameNumber}`\r\n *\r\n * Example:\r\n * texturePrefix: \"Explosion_\"\r\n * numberOfFrames: 16\r\n * padLength: 3\r\n *\r\n * Generates:\r\n * Explosion_000\r\n * Explosion_001\r\n * ...\r\n * Explosion_015\r\n */\r\nexport interface AnimatedTextureProviderOptions {\r\n /**\r\n * Prefix used to construct frame aliases.\r\n */\r\n texturePrefix: string;\r\n\r\n /** Total number of frames in the animation sequence. */\r\n numberOfFrames: number;\r\n\r\n /** Optional starting frame index (default: 0). */\r\n firstFrame?: number;\r\n\r\n /**\r\n * Optional zero-padding length.\r\n * If omitted, defaults to numberOfFrames digit length.\r\n *\r\n * Example:\r\n * numberOfFrames = 16 → default padLength = 2\r\n * frame 3 → \"03\"\r\n */\r\n padLength?: number;\r\n\r\n /** Frames per second (default: 60). */\r\n fps?: number;\r\n\r\n /**\r\n * If true, animation loops.\r\n * If false, animation stops at the last frame.\r\n * Default: true.\r\n */\r\n loop?: boolean;\r\n}\r\n\r\n/**\r\n * Flipbook-style animated texture provider.\r\n *\r\n * Each particle cycles through a pre-generated array of textures\r\n * based on elapsed time and configured FPS.\r\n *\r\n * This is NOT a Pixi AnimatedSprite.\r\n * Instead, it swaps particle.texture manually each frame.\r\n *\r\n * Because UVs change when textures change, this provider declares:\r\n * requires = { uvs: true }\r\n *\r\n * so the Emitter enables the correct ParticleContainer dynamicProperties.\r\n */\r\nexport class AnimatedTextureProvider implements TextureProvider {\r\n /** UV updates are required because textures change during lifetime. */\r\n public readonly requires = { uvs: true };\r\n\r\n /** Preloaded frame textures. */\r\n private readonly frames: Texture[];\r\n\r\n /** Frames per second for animation playback. */\r\n private readonly fps: number;\r\n\r\n /** Whether animation loops. */\r\n private readonly loop: boolean;\r\n\r\n constructor(options: AnimatedTextureProviderOptions) {\r\n const start = options.firstFrame ?? 0;\r\n\r\n const padLength = options.padLength ?? options.numberOfFrames.toString().length;\r\n\r\n this.frames = [];\r\n\r\n for (let i = start; i < options.numberOfFrames + start; i++) {\r\n const alias = `${options.texturePrefix}${i.toString().padStart(padLength, \"0\")}`;\r\n this.frames.push(Texture.from(alias));\r\n }\r\n\r\n if (this.frames.length === 0) {\r\n throw new Error(\"AnimatedTextureProvider: no frames generated\");\r\n }\r\n\r\n this.fps = options.fps ?? 60;\r\n this.loop = options.loop ?? true;\r\n }\r\n\r\n /**\r\n * Used when constructing pooled particles.\r\n * Returns the first frame as a placeholder texture.\r\n */\r\n public initialTexture(): Texture {\r\n return this.frames[0];\r\n }\r\n\r\n /**\r\n * Called each time a particle is spawned.\r\n *\r\n * Initializes per-particle animation state\r\n * and resets animation to first frame.\r\n */\r\n public textureForSpawn(p: PxParticle): Texture {\r\n p.animatedParticleState = { t: 0 };\r\n return this.frames[0];\r\n }\r\n\r\n /**\r\n * Per-frame update hook.\r\n *\r\n * Advances animation time and selects the appropriate frame.\r\n */\r\n public update(p: PxParticle, dt: number): void {\r\n if (!p.animatedParticleState || this.frames.length <= 1) return;\r\n\r\n p.animatedParticleState.t += dt;\r\n\r\n const time = p.animatedParticleState.t;\r\n const rawFrame = Math.floor(time * this.fps);\r\n\r\n const idx = this.loop ? rawFrame % this.frames.length : Math.min(rawFrame, this.frames.length - 1);\r\n\r\n p.texture = this.frames[idx];\r\n }\r\n\r\n /**\r\n * Called when particle is recycled.\r\n * Clears animation state to avoid stale data in pooled particles.\r\n */\r\n public onKill(p: PxParticle): void {\r\n p.animatedParticleState = undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"animated-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/animated-texture-provider.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAsDlC;;;;;;;;;;;;;GAaG;AACH,MAAa,uBAAuB;IAahC,YAAY,OAAuC;QAZnD,uEAAuE;QACvD,aAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAYrC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAEhF,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IACrC,CAAC;IAED;;;OAGG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,CAAa;QAChC,CAAC,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,CAAa,EAAE,EAAU;QACnC,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO;QAEhE,CAAC,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEnG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,CAAa;QACvB,CAAC,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,CAAC;CACJ;AA7ED,0DA6EC"}
@@ -1,15 +1,19 @@
1
- import { Texture } from "pixi.js";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingleTextureProvider = void 0;
4
+ const pixi_js_1 = require("pixi.js");
2
5
  /**
3
6
  * Always returns the same texture for every particle.
4
7
  * Useful for simple effects (sparks, smoke puffs, etc).
5
8
  */
6
- export class SingleTextureProvider {
9
+ class SingleTextureProvider {
7
10
  constructor(textureId) {
8
11
  this.textureId = textureId;
9
- this.texture = Texture.from(textureId);
12
+ this.texture = pixi_js_1.Texture.from(textureId);
10
13
  }
11
14
  initialTexture() {
12
15
  return this.texture;
13
16
  }
14
17
  }
18
+ exports.SingleTextureProvider = SingleTextureProvider;
15
19
  //# sourceMappingURL=single-texture-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"single-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/single-texture-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IAM9B,YAAY,SAAiB;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ","sourcesContent":["import { Texture } from \"pixi.js\";\r\nimport { TextureProvider } from \"../texture-provider\";\r\n\r\n/**\r\n * Always returns the same texture for every particle.\r\n * Useful for simple effects (sparks, smoke puffs, etc).\r\n */\r\nexport class SingleTextureProvider implements TextureProvider {\r\n /** Key/URL/alias passed to PixiJS Texture.from(). */\r\n private readonly textureId: string;\r\n\r\n private readonly texture: Texture;\r\n\r\n constructor(textureId: string) {\r\n this.textureId = textureId;\r\n this.texture = Texture.from(textureId);\r\n }\r\n\r\n public initialTexture(): Texture {\r\n return this.texture;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"single-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/single-texture-provider.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAGlC;;;GAGG;AACH,MAAa,qBAAqB;IAM9B,YAAY,SAAiB;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,iBAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAdD,sDAcC"}
@@ -1,17 +1,20 @@
1
- import { Texture } from "pixi.js";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WeightedTextureProvider = void 0;
4
+ const pixi_js_1 = require("pixi.js");
2
5
  /**
3
6
  * Chooses a random texture at spawn time using weighted probabilities.
4
7
  *
5
8
  * - Good for variety (different spark shapes, debris pieces, etc.)
6
9
  * - Selection happens only on spawn (not per frame)
7
10
  */
8
- export class WeightedTextureProvider {
11
+ class WeightedTextureProvider {
9
12
  constructor(items, fallbackTextureId) {
10
13
  this.totalWeight = 0;
11
- this.fallback = Texture.from(fallbackTextureId);
14
+ this.fallback = pixi_js_1.Texture.from(fallbackTextureId);
12
15
  // Pre-cache textures and compute total weight (ignoring negatives)
13
16
  this.items = items.map((it) => ({
14
- texture: Texture.from(it.textureId),
17
+ texture: pixi_js_1.Texture.from(it.textureId),
15
18
  weight: Math.max(0, it.weight),
16
19
  }));
17
20
  for (const it of this.items)
@@ -33,4 +36,5 @@ export class WeightedTextureProvider {
33
36
  return this.items[this.items.length - 1].texture;
34
37
  }
35
38
  }
39
+ exports.WeightedTextureProvider = WeightedTextureProvider;
36
40
  //# sourceMappingURL=weighted-texture-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"weighted-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/weighted-texture-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IAMhC,YAAY,KAAwB,EAAE,iBAAyB;QAFvD,gBAAW,GAAG,CAAC,CAAC;QAGpB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhD,mEAAmE;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YACnC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;SACjC,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,MAAM,CAAC;IAC/D,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,eAAe,CAAC,EAAc;QACjC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAE3E,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;YACf,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC,OAAO,CAAC;QAClC,CAAC;QAED,oCAAoC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC;IACtD,CAAC;CACJ","sourcesContent":["import { Texture } from \"pixi.js\";\r\nimport { TextureProvider } from \"../texture-provider\";\r\nimport { PxParticle } from \"../px-particle\";\r\n\r\ntype WeightedTexture = {\r\n /** Key/URL/alias passed to PixiJS Texture.from(). */\r\n textureId: string;\r\n weight: number;\r\n};\r\n\r\n/**\r\n * Chooses a random texture at spawn time using weighted probabilities.\r\n *\r\n * - Good for variety (different spark shapes, debris pieces, etc.)\r\n * - Selection happens only on spawn (not per frame)\r\n */\r\nexport class WeightedTextureProvider implements TextureProvider {\r\n private readonly fallback: Texture;\r\n private readonly items: { texture: Texture; weight: number }[];\r\n\r\n private totalWeight = 0;\r\n\r\n constructor(items: WeightedTexture[], fallbackTextureId: string) {\r\n this.fallback = Texture.from(fallbackTextureId);\r\n\r\n // Pre-cache textures and compute total weight (ignoring negatives)\r\n this.items = items.map((it) => ({\r\n texture: Texture.from(it.textureId),\r\n weight: Math.max(0, it.weight),\r\n }));\r\n\r\n for (const it of this.items) this.totalWeight += it.weight;\r\n }\r\n\r\n public initialTexture(): Texture {\r\n return this.fallback;\r\n }\r\n\r\n public textureForSpawn(_p: PxParticle): Texture {\r\n if (this.totalWeight <= 0 || this.items.length === 0) return this.fallback;\r\n\r\n let r = Math.random() * this.totalWeight;\r\n\r\n for (const it of this.items) {\r\n r -= it.weight;\r\n if (r <= 0) return it.texture;\r\n }\r\n\r\n // Floating point edge-case fallback\r\n return this.items[this.items.length - 1]!.texture;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"weighted-texture-provider.js","sourceRoot":"","sources":["../../src/texture-providers/weighted-texture-provider.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAUlC;;;;;GAKG;AACH,MAAa,uBAAuB;IAMhC,YAAY,KAAwB,EAAE,iBAAyB;QAFvD,gBAAW,GAAG,CAAC,CAAC;QAGpB,IAAI,CAAC,QAAQ,GAAG,iBAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhD,mEAAmE;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,iBAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YACnC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;SACjC,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,MAAM,CAAC;IAC/D,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,eAAe,CAAC,EAAc;QACjC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAE3E,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QAEzC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;YACf,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC,OAAO,CAAC;QAClC,CAAC;QAED,oCAAoC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,CAAC;IACtD,CAAC;CACJ;AAnCD,0DAmCC"}
package/dist/utils.js CHANGED
@@ -1,4 +1,7 @@
1
- export class Utils {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Utils = void 0;
4
+ class Utils {
2
5
  static lerp(a, b, t) {
3
6
  return a + (b - a) * t;
4
7
  }
@@ -9,4 +12,5 @@ export class Utils {
9
12
  return min + Math.random() * (max - min);
10
13
  }
11
14
  }
15
+ exports.Utils = Utils;
12
16
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IACP,MAAM,CAAC,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,CAAS;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAEM,MAAM,CAAC,IAAI,CAAC,GAAW,EAAE,GAAW;QACvC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ","sourcesContent":["export class Utils {\r\n public static lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n }\r\n\r\n public static clamp01(v: number) {\r\n return v < 0 ? 0 : v > 1 ? 1 : v;\r\n }\r\n\r\n public static rand(min: number, max: number) {\r\n return min + Math.random() * (max - min);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IACP,MAAM,CAAC,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,CAAS;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAEM,MAAM,CAAC,IAAI,CAAC,GAAW,EAAE,GAAW;QACvC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ;AAZD,sBAYC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixi-particles-engine",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "High-performance PixiJS v8 particle engine with behaviours and pooling",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -19,7 +19,7 @@
19
19
  "particle-system",
20
20
  "webgl"
21
21
  ],
22
- "type": "module",
22
+ "type": "commonjs",
23
23
  "main": "./dist/index.js",
24
24
  "types": "./dist/index.d.ts",
25
25
  "exports": {
@@ -36,6 +36,7 @@
36
36
  ],
37
37
  "scripts": {
38
38
  "build": "tsc -p tsconfig.json",
39
+ "prepare": "npm run build",
39
40
  "prepublishOnly": "npm run build",
40
41
  "watch": "tsc -w -p tsconfig.json"
41
42
  },
@@ -1 +0,0 @@
1
- //# sourceMappingURL=behaviour-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"behaviour-utils.d.ts","sourceRoot":"","sources":["../../src/behaviours/behaviour-utils.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=behaviour-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"behaviour-utils.js","sourceRoot":"","sources":["../../src/behaviours/behaviour-utils.ts"],"names":[],"mappings":"","sourcesContent":[""]}