custom-pixi-particles 8.5.1 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +1000 -20
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/behaviour/SubEmitterBehaviour.d.ts +0 -0
  6. package/dist/lib/behaviour/SubEmitterBehaviour.js +1 -0
  7. package/dist/lib/behaviour/SubEmitterBehaviour.js.map +1 -0
  8. package/dist/lib/effects/DissolveEffect.d.ts +28 -0
  9. package/dist/lib/effects/DissolveEffect.js +198 -0
  10. package/dist/lib/effects/DissolveEffect.js.map +1 -0
  11. package/dist/lib/effects/GhostEffect.d.ts +32 -0
  12. package/dist/lib/effects/GhostEffect.js +125 -0
  13. package/dist/lib/effects/GhostEffect.js.map +1 -0
  14. package/dist/lib/effects/GlitchEffect.d.ts +25 -0
  15. package/dist/lib/effects/GlitchEffect.js +137 -0
  16. package/dist/lib/effects/GlitchEffect.js.map +1 -0
  17. package/dist/lib/effects/MagneticAssemblyEffect.d.ts +27 -0
  18. package/dist/lib/effects/MagneticAssemblyEffect.js +188 -0
  19. package/dist/lib/effects/MagneticAssemblyEffect.js.map +1 -0
  20. package/dist/lib/effects/MeltEffect.d.ts +27 -0
  21. package/dist/lib/effects/MeltEffect.js +217 -0
  22. package/dist/lib/effects/MeltEffect.js.map +1 -0
  23. package/dist/lib/effects/ShatterEffect.d.ts +40 -0
  24. package/dist/lib/effects/ShatterEffect.js +227 -0
  25. package/dist/lib/effects/ShatterEffect.js.map +1 -0
  26. package/dist/lib/effects/index.d.ts +12 -0
  27. package/dist/lib/effects/index.js +13 -0
  28. package/dist/lib/effects/index.js.map +1 -0
  29. package/dist/lib/emission/RandomEmission.js +3 -3
  30. package/dist/lib/emission/RandomEmission.js.map +1 -1
  31. package/dist/lib/emission/StandardEmission.js +10 -4
  32. package/dist/lib/emission/StandardEmission.js.map +1 -1
  33. package/dist/lib/emission/UniformEmission.js +10 -1
  34. package/dist/lib/emission/UniformEmission.js.map +1 -1
  35. package/dist/lib/emitter/Emitter.js +7 -1
  36. package/dist/lib/emitter/Emitter.js.map +1 -1
  37. package/dist/lib/index.d.ts +2 -0
  38. package/dist/lib/index.js +2 -0
  39. package/dist/lib/index.js.map +1 -1
  40. package/dist/lib/pixi/Renderer.d.ts +2 -4
  41. package/dist/lib/pixi/Renderer.js +20 -16
  42. package/dist/lib/pixi/Renderer.js.map +1 -1
  43. package/dist/lib/pixi/TestRenderer.d.ts +2 -4
  44. package/dist/lib/pixi/TestRenderer.js +20 -16
  45. package/dist/lib/pixi/TestRenderer.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ import { Container, Sprite } from 'pixi.js';
2
+ export type AssemblyMode = 'random-scatter' | 'from-center' | 'off-screen' | 'vortex';
3
+ export interface IMagneticAssemblyOptions {
4
+ gridCols?: number;
5
+ gridRows?: number;
6
+ duration?: number;
7
+ easing?: string;
8
+ scatterRange?: number;
9
+ stagger?: number;
10
+ mode?: AssemblyMode;
11
+ startAlpha?: number;
12
+ }
13
+ export default class MagneticAssemblyEffect extends Container {
14
+ private sourceSprite;
15
+ private fragments;
16
+ private isProcessing;
17
+ private options;
18
+ private currentTime;
19
+ private assemblyResolve?;
20
+ constructor(sourceSprite: Sprite, options?: IMagneticAssemblyOptions);
21
+ private prepare;
22
+ assemble(): Promise<void>;
23
+ private update;
24
+ private applyEasing;
25
+ private finish;
26
+ static assemble(sprite: Sprite, options?: IMagneticAssemblyOptions): Promise<void>;
27
+ }
@@ -0,0 +1,188 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Container, Rectangle, Sprite, Texture, Ticker } from 'pixi.js';
11
+ import ParticlePool from '../ParticlePool';
12
+ import Random from '../util/Random';
13
+ export default class MagneticAssemblyEffect extends Container {
14
+ constructor(sourceSprite, options = {}) {
15
+ var _a, _b, _c, _d, _e, _f, _g, _h;
16
+ super();
17
+ this.sourceSprite = sourceSprite;
18
+ this.fragments = [];
19
+ this.isProcessing = false;
20
+ this.currentTime = 0;
21
+ const cols = (_a = options.gridCols) !== null && _a !== void 0 ? _a : 10;
22
+ const rows = (_b = options.gridRows) !== null && _b !== void 0 ? _b : 10;
23
+ this.options = {
24
+ gridCols: cols,
25
+ gridRows: rows,
26
+ duration: (_c = options.duration) !== null && _c !== void 0 ? _c : 2.0,
27
+ easing: (_d = options.easing) !== null && _d !== void 0 ? _d : 'back.out',
28
+ scatterRange: (_e = options.scatterRange) !== null && _e !== void 0 ? _e : 500,
29
+ stagger: (_f = options.stagger) !== null && _f !== void 0 ? _f : 0.5,
30
+ mode: (_g = options.mode) !== null && _g !== void 0 ? _g : 'random-scatter',
31
+ startAlpha: (_h = options.startAlpha) !== null && _h !== void 0 ? _h : 0,
32
+ };
33
+ // Match source sprite transform
34
+ this.x = sourceSprite.x;
35
+ this.y = sourceSprite.y;
36
+ this.rotation = sourceSprite.rotation;
37
+ }
38
+ prepare() {
39
+ const texture = this.sourceSprite.texture;
40
+ if (!texture || !texture.source)
41
+ return;
42
+ const { gridCols, gridRows, scatterRange, mode, stagger } = this.options;
43
+ const texFrame = texture.frame;
44
+ const stepW = texFrame.width / gridCols;
45
+ const stepH = texFrame.height / gridRows;
46
+ const scale = this.sourceSprite.scale.x;
47
+ const anchorX = this.sourceSprite.anchor.x;
48
+ const anchorY = this.sourceSprite.anchor.y;
49
+ for (let row = 0; row < gridRows; row++) {
50
+ for (let col = 0; col < gridCols; col++) {
51
+ const x1 = Math.floor(col * stepW);
52
+ const y1 = Math.floor(row * stepH);
53
+ // Create sub-texture
54
+ const fragRect = new Rectangle(texFrame.x + x1, texFrame.y + y1, stepW, stepH);
55
+ const fragTex = new Texture({ source: texture.source, frame: fragRect });
56
+ const sprite = new Sprite(fragTex);
57
+ sprite.anchor.set(0.5);
58
+ sprite.scale.set(scale);
59
+ sprite.alpha = this.options.startAlpha;
60
+ // Destination: The original spot in the sprite
61
+ const dx = (x1 - texFrame.width * anchorX + stepW / 2) * scale;
62
+ const dy = (y1 - texFrame.height * anchorY + stepH / 2) * scale;
63
+ // Starting point logic
64
+ // tslint:disable-next-line:one-variable-per-declaration
65
+ let sx = 0, sy = 0;
66
+ switch (mode) {
67
+ case 'from-center':
68
+ sx = 0;
69
+ sy = 0;
70
+ break;
71
+ case 'off-screen':
72
+ sx = Math.random() > 0.5 ? scatterRange : -scatterRange;
73
+ sy = Random.uniform(-scatterRange, scatterRange);
74
+ break;
75
+ case 'vortex':
76
+ const angle = Math.random() * Math.PI * 2;
77
+ sx = Math.cos(angle) * scatterRange;
78
+ sy = Math.sin(angle) * scatterRange;
79
+ break;
80
+ case 'random-scatter':
81
+ default:
82
+ sx = dx + Random.uniform(-scatterRange, scatterRange);
83
+ sy = dy + Random.uniform(-scatterRange, scatterRange);
84
+ break;
85
+ }
86
+ const p = ParticlePool.global.pop();
87
+ p.reset();
88
+ // Stagger logic: pieces start at different times based on position or random
89
+ const delay = ((row * gridCols + col) / (gridCols * gridRows)) * stagger;
90
+ this.fragments.push({
91
+ sprite,
92
+ particle: p,
93
+ startX: sx,
94
+ startY: sy,
95
+ destX: dx,
96
+ destY: dy,
97
+ delay,
98
+ });
99
+ this.addChild(sprite);
100
+ }
101
+ }
102
+ this.sourceSprite.visible = false;
103
+ }
104
+ assemble() {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ this.prepare();
107
+ this.isProcessing = true;
108
+ return new Promise((resolve) => {
109
+ this.assemblyResolve = resolve;
110
+ Ticker.shared.add(this.update, this);
111
+ });
112
+ });
113
+ }
114
+ update() {
115
+ if (!this.isProcessing)
116
+ return;
117
+ const dt = Ticker.shared.deltaMS / 1000;
118
+ this.currentTime += dt;
119
+ let finished = 0;
120
+ for (let i = 0; i < this.fragments.length; i++) {
121
+ const f = this.fragments[i];
122
+ // Calculate individual progress based on delay
123
+ let p = (this.currentTime - f.delay) / (this.options.duration - f.delay);
124
+ p = Math.max(0, Math.min(1, p));
125
+ if (p > 0) {
126
+ const easedP = this.applyEasing(p, this.options.easing);
127
+ f.sprite.x = f.startX + (f.destX - f.startX) * easedP;
128
+ f.sprite.y = f.startY + (f.destY - f.startY) * easedP;
129
+ f.sprite.alpha = Math.max(this.options.startAlpha, p);
130
+ // Slight rotation adjustment to make it look "magnetic"
131
+ if (this.options.easing.includes('back')) {
132
+ f.sprite.rotation = (1 - easedP) * 0.5;
133
+ }
134
+ }
135
+ else {
136
+ f.sprite.x = f.startX;
137
+ f.sprite.y = f.startY;
138
+ }
139
+ if (p >= 1)
140
+ finished++;
141
+ }
142
+ if (finished === this.fragments.length) {
143
+ this.finish();
144
+ }
145
+ }
146
+ applyEasing(t, type) {
147
+ switch (type) {
148
+ case 'power1.inOut':
149
+ return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
150
+ case 'bounce.out':
151
+ // tslint:disable-next-line:one-variable-per-declaration
152
+ const n1 = 7.5625, d1 = 2.75;
153
+ if (t < 1 / d1)
154
+ return n1 * t * t;
155
+ else if (t < 2 / d1)
156
+ return n1 * (t -= 1.5 / d1) * t + 0.75;
157
+ else if (t < 2.5 / d1)
158
+ return n1 * (t -= 2.25 / d1) * t + 0.9375;
159
+ else
160
+ return n1 * (t -= 2.625 / d1) * t + 0.984375;
161
+ case 'back.out':
162
+ // tslint:disable-next-line:one-variable-per-declaration
163
+ const c1 = 1.70158, c3 = c1 + 1;
164
+ return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);
165
+ default:
166
+ return t; // linear
167
+ }
168
+ }
169
+ finish() {
170
+ var _a;
171
+ this.isProcessing = false;
172
+ Ticker.shared.remove(this.update, this);
173
+ this.sourceSprite.visible = true; // Restore original
174
+ (_a = this.assemblyResolve) === null || _a === void 0 ? void 0 : _a.call(this);
175
+ }
176
+ static assemble(sprite_1) {
177
+ return __awaiter(this, arguments, void 0, function* (sprite, options = {}) {
178
+ if (!sprite.parent)
179
+ return;
180
+ const effect = new MagneticAssemblyEffect(sprite, options);
181
+ const index = sprite.parent.getChildIndex(sprite);
182
+ sprite.parent.addChildAt(effect, index);
183
+ yield effect.assemble();
184
+ effect.destroy({ children: true });
185
+ });
186
+ }
187
+ }
188
+ //# sourceMappingURL=MagneticAssemblyEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MagneticAssemblyEffect.js","sourceRoot":"","sources":["../../../src/lib/effects/MagneticAssemblyEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Container, Sprite } from 'pixi.js';
2
+ export interface IMeltEffectOptions {
3
+ gridCols?: number;
4
+ gridRows?: number;
5
+ gravity?: number;
6
+ viscosity?: number;
7
+ horizontalSpread?: number;
8
+ duration?: number;
9
+ blurAmount?: number;
10
+ threshold?: number;
11
+ }
12
+ export default class MeltEffect extends Container {
13
+ private sourceSprite;
14
+ private fragments;
15
+ private isProcessing;
16
+ private options;
17
+ private meltResolve?;
18
+ private pContainer;
19
+ private currentTime;
20
+ constructor(sourceSprite: Sprite, options?: IMeltEffectOptions);
21
+ private prepare;
22
+ start(): Promise<void>;
23
+ private update;
24
+ private removeFragment;
25
+ private finish;
26
+ static melt(sprite: Sprite, options?: IMeltEffectOptions): Promise<void>;
27
+ }
@@ -0,0 +1,217 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Container, Filter, GlProgram, Rectangle, Sprite, Texture, Ticker } from 'pixi.js';
11
+ import ParticlePool from '../ParticlePool';
12
+ import Random from '../util/Random';
13
+ // Default vertex shader for PixiJS v8 filters
14
+ const defaultVertex = `
15
+ in vec2 aPosition;
16
+ out vec2 vTextureCoord;
17
+ uniform vec4 uInputSize;
18
+ uniform vec4 uOutputFrame;
19
+ uniform vec4 uOutputTexture;
20
+
21
+ vec4 filterVertexPosition(void) {
22
+ vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;
23
+ position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;
24
+ position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;
25
+ return vec4(position, 0.0, 1.0);
26
+ }
27
+
28
+ vec2 filterTextureCoord(void) {
29
+ return aPosition * (uOutputFrame.zw * uInputSize.zw);
30
+ }
31
+
32
+ void main(void) {
33
+ gl_Position = filterVertexPosition();
34
+ vTextureCoord = filterTextureCoord();
35
+ }
36
+ `;
37
+ // Simple blur shader (box blur)
38
+ const blurFrag = `
39
+ in vec2 vTextureCoord;
40
+ uniform sampler2D uSampler;
41
+ uniform float uBlur;
42
+
43
+ void main(void) {
44
+ vec4 sum = vec4(0.0);
45
+ float blurAmount = uBlur * 0.01; // Scale blur amount
46
+
47
+ // Sample 9 pixels in a 3x3 grid
48
+ for(int i = -1; i <= 1; i++) {
49
+ for(int j = -1; j <= 1; j++) {
50
+ vec2 offset = vec2(float(i), float(j)) * blurAmount;
51
+ sum += texture(uSampler, vTextureCoord + offset);
52
+ }
53
+ }
54
+
55
+ gl_FragColor = sum / 9.0;
56
+ }
57
+ `;
58
+ // Simple threshold shader to create the "Metaball" effect
59
+ const thresholdFrag = `
60
+ in vec2 vTextureCoord;
61
+ uniform sampler2D uSampler;
62
+ uniform float threshold;
63
+ void main(void) {
64
+ vec4 color = texture(uSampler, vTextureCoord);
65
+ if (color.a > threshold) {
66
+ color.a = 1.0;
67
+ } else {
68
+ color.a = 0.0;
69
+ }
70
+ gl_FragColor = color;
71
+ }
72
+ `;
73
+ export default class MeltEffect extends Container {
74
+ constructor(sourceSprite, options = {}) {
75
+ var _a, _b, _c, _d, _e, _f, _g, _h;
76
+ super();
77
+ this.sourceSprite = sourceSprite;
78
+ this.fragments = [];
79
+ this.isProcessing = false;
80
+ this.currentTime = 0;
81
+ const cols = (_a = options.gridCols) !== null && _a !== void 0 ? _a : 15;
82
+ const rows = (_b = options.gridRows) !== null && _b !== void 0 ? _b : 15;
83
+ this.options = {
84
+ gridCols: cols,
85
+ gridRows: rows,
86
+ gravity: (_c = options.gravity) !== null && _c !== void 0 ? _c : 1200,
87
+ viscosity: (_d = options.viscosity) !== null && _d !== void 0 ? _d : 0.98,
88
+ horizontalSpread: (_e = options.horizontalSpread) !== null && _e !== void 0 ? _e : 50,
89
+ duration: (_f = options.duration) !== null && _f !== void 0 ? _f : 2.5,
90
+ blurAmount: (_g = options.blurAmount) !== null && _g !== void 0 ? _g : 6,
91
+ threshold: (_h = options.threshold) !== null && _h !== void 0 ? _h : 0.5,
92
+ };
93
+ // We use a internal Container so we can apply filters to it
94
+ this.pContainer = new Container();
95
+ this.addChild(this.pContainer);
96
+ this.x = sourceSprite.x;
97
+ this.y = sourceSprite.y;
98
+ this.rotation = sourceSprite.rotation;
99
+ // Apply the Metaball Hook: Blur + Threshold
100
+ const blurFilter = new Filter({
101
+ glProgram: new GlProgram({
102
+ fragment: blurFrag,
103
+ vertex: defaultVertex,
104
+ }),
105
+ resources: {
106
+ uBlur: { value: this.options.blurAmount },
107
+ },
108
+ });
109
+ const thresholdFilter = new Filter({
110
+ glProgram: new GlProgram({
111
+ fragment: thresholdFrag,
112
+ vertex: defaultVertex,
113
+ }),
114
+ resources: {
115
+ threshold: { value: this.options.threshold },
116
+ },
117
+ });
118
+ this.pContainer.filters = [blurFilter, thresholdFilter];
119
+ }
120
+ prepare() {
121
+ const texture = this.sourceSprite.texture;
122
+ if (!texture || !texture.source)
123
+ return;
124
+ const { gridCols, gridRows, horizontalSpread } = this.options;
125
+ const texFrame = texture.frame;
126
+ const stepW = texFrame.width / gridCols;
127
+ const stepH = texFrame.height / gridRows;
128
+ const scale = this.sourceSprite.scale.x;
129
+ const anchorX = this.sourceSprite.anchor.x;
130
+ const anchorY = this.sourceSprite.anchor.y;
131
+ for (let row = 0; row < gridRows; row++) {
132
+ for (let col = 0; col < gridCols; col++) {
133
+ const x1 = Math.floor(col * stepW);
134
+ const y1 = Math.floor(row * stepH);
135
+ const fragRect = new Rectangle(texFrame.x + x1, texFrame.y + y1, stepW, stepH);
136
+ const fragTex = new Texture({ source: texture.source, frame: fragRect });
137
+ const sprite = new Sprite(fragTex);
138
+ sprite.anchor.set(0.5);
139
+ sprite.scale.set(scale);
140
+ const lx = (x1 - texFrame.width * anchorX + stepW / 2) * scale;
141
+ const ly = (y1 - texFrame.height * anchorY + stepH / 2) * scale;
142
+ const p = ParticlePool.global.pop();
143
+ p.reset();
144
+ p.x = lx;
145
+ p.y = ly;
146
+ // High gravity, low horizontal velocity
147
+ p.velocity.set(Random.uniform(-horizontalSpread, horizontalSpread), Random.uniform(0, 50));
148
+ this.fragments.push({ sprite, particle: p });
149
+ this.pContainer.addChild(sprite);
150
+ }
151
+ }
152
+ this.sourceSprite.visible = false;
153
+ }
154
+ start() {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ this.prepare();
157
+ this.isProcessing = true;
158
+ return new Promise((resolve) => {
159
+ this.meltResolve = resolve;
160
+ Ticker.shared.add(this.update, this);
161
+ });
162
+ });
163
+ }
164
+ update() {
165
+ if (!this.isProcessing)
166
+ return;
167
+ const dt = Ticker.shared.deltaMS / 1000;
168
+ this.currentTime += dt;
169
+ for (let i = this.fragments.length - 1; i >= 0; i--) {
170
+ const f = this.fragments[i];
171
+ const p = f.particle;
172
+ // Gravity and Viscosity
173
+ p.velocity.y += this.options.gravity * dt;
174
+ p.velocity.x *= this.options.viscosity;
175
+ p.velocity.y *= this.options.viscosity;
176
+ p.x += p.velocity.x * dt;
177
+ p.y += p.velocity.y * dt;
178
+ f.sprite.x = p.x;
179
+ f.sprite.y = p.y;
180
+ // Gradually shrink fragments so the liquid "dries up"
181
+ const lifeRatio = 1 - this.currentTime / this.options.duration;
182
+ f.sprite.scale.set(this.sourceSprite.scale.x * lifeRatio);
183
+ if (lifeRatio <= 0) {
184
+ this.removeFragment(i);
185
+ }
186
+ }
187
+ if (this.fragments.length === 0) {
188
+ this.finish();
189
+ }
190
+ }
191
+ removeFragment(index) {
192
+ const f = this.fragments[index];
193
+ if (f.particle)
194
+ ParticlePool.global.push(f.particle);
195
+ this.pContainer.removeChild(f.sprite);
196
+ f.sprite.destroy();
197
+ this.fragments.splice(index, 1);
198
+ }
199
+ finish() {
200
+ var _a;
201
+ this.isProcessing = false;
202
+ Ticker.shared.remove(this.update, this);
203
+ (_a = this.meltResolve) === null || _a === void 0 ? void 0 : _a.call(this);
204
+ }
205
+ static melt(sprite_1) {
206
+ return __awaiter(this, arguments, void 0, function* (sprite, options = {}) {
207
+ if (!sprite.parent)
208
+ return;
209
+ const effect = new MeltEffect(sprite, options);
210
+ const index = sprite.parent.getChildIndex(sprite);
211
+ sprite.parent.addChildAt(effect, index);
212
+ yield effect.start();
213
+ effect.destroy({ children: true });
214
+ });
215
+ }
216
+ }
217
+ //# sourceMappingURL=MeltEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeltEffect.js","sourceRoot":"","sources":["../../../src/lib/effects/MeltEffect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Container, Sprite } from 'pixi.js';
2
+ export type ShatterMode = 'radial' | 'directional' | 'swirl';
3
+ export interface IShatterEffectOptions {
4
+ gridCols?: number;
5
+ gridRows?: number;
6
+ explosionPower?: number;
7
+ friction?: number;
8
+ gravity?: number;
9
+ turbulence?: number;
10
+ lifetime?: number;
11
+ fadeOutDuration?: number;
12
+ mode?: ShatterMode;
13
+ explosionOrigin?: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ blastDirection?: number;
18
+ swirlStrength?: number;
19
+ randomizeScale?: boolean;
20
+ endTint?: number;
21
+ enableRotation?: boolean;
22
+ rotationStrength?: number;
23
+ }
24
+ export default class ShatterEffect extends Container {
25
+ private sourceSprite;
26
+ private fragments;
27
+ private isExploded;
28
+ private options;
29
+ private isCleanedUp;
30
+ private explodeResolve?;
31
+ constructor(sourceSprite: Sprite, options?: IShatterEffectOptions);
32
+ private createFragments;
33
+ Explode(): Promise<void>;
34
+ private update;
35
+ private lerpColor;
36
+ private removeFragment;
37
+ private finish;
38
+ destroy(options?: any): void;
39
+ static shatter(sprite: Sprite, options?: IShatterEffectOptions): Promise<void>;
40
+ }