custom-pixi-particles 8.6.0 → 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.
- package/README.md +1000 -20
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/behaviour/SubEmitterBehaviour.d.ts +0 -0
- package/dist/lib/behaviour/SubEmitterBehaviour.js +1 -0
- package/dist/lib/behaviour/SubEmitterBehaviour.js.map +1 -0
- package/dist/lib/effects/DissolveEffect.d.ts +28 -0
- package/dist/lib/effects/DissolveEffect.js +198 -0
- package/dist/lib/effects/DissolveEffect.js.map +1 -0
- package/dist/lib/effects/GhostEffect.d.ts +32 -0
- package/dist/lib/effects/GhostEffect.js +125 -0
- package/dist/lib/effects/GhostEffect.js.map +1 -0
- package/dist/lib/effects/GlitchEffect.d.ts +25 -0
- package/dist/lib/effects/GlitchEffect.js +137 -0
- package/dist/lib/effects/GlitchEffect.js.map +1 -0
- package/dist/lib/effects/MagneticAssemblyEffect.d.ts +27 -0
- package/dist/lib/effects/MagneticAssemblyEffect.js +188 -0
- package/dist/lib/effects/MagneticAssemblyEffect.js.map +1 -0
- package/dist/lib/effects/MeltEffect.d.ts +27 -0
- package/dist/lib/effects/MeltEffect.js +217 -0
- package/dist/lib/effects/MeltEffect.js.map +1 -0
- package/dist/lib/effects/ShatterEffect.d.ts +40 -0
- package/dist/lib/effects/ShatterEffect.js +227 -0
- package/dist/lib/effects/ShatterEffect.js.map +1 -0
- package/dist/lib/effects/index.d.ts +12 -0
- package/dist/lib/effects/index.js +13 -0
- package/dist/lib/effects/index.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/pixi/Renderer.d.ts +2 -4
- package/dist/lib/pixi/Renderer.js +6 -6
- package/dist/lib/pixi/Renderer.js.map +1 -1
- package/dist/lib/pixi/TestRenderer.d.ts +2 -4
- package/dist/lib/pixi/TestRenderer.js +6 -6
- package/dist/lib/pixi/TestRenderer.js.map +1 -1
- 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":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC1F,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAE1C,OAAO,MAAM,MAAM,gBAAgB,CAAA;AAanC,8CAA8C;AAC9C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAA;AAED,gCAAgC;AAChC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;CAmBhB,CAAA;AAED,0DAA0D;AAC1D,MAAM,aAAa,GAAG;;;;;;;;;;;;;CAarB,CAAA;AAOD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAQ/C,YACU,YAAoB,EAC5B,UAA8B,EAAE;;QAEhC,KAAK,EAAE,CAAA;QAHC,iBAAY,GAAZ,YAAY,CAAQ;QARtB,cAAS,GAAmB,EAAE,CAAA;QAC9B,iBAAY,GAAY,KAAK,CAAA;QAI7B,gBAAW,GAAW,CAAC,CAAA;QAO7B,MAAM,IAAI,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,EAAE,CAAA;QACnC,MAAM,IAAI,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,EAAE,CAAA;QAEnC,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,MAAA,OAAO,CAAC,OAAO,mCAAI,IAAI;YAChC,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI;YACpC,gBAAgB,EAAE,MAAA,OAAO,CAAC,gBAAgB,mCAAI,EAAE;YAChD,QAAQ,EAAE,MAAA,OAAO,CAAC,QAAQ,mCAAI,GAAG;YACjC,UAAU,EAAE,MAAA,OAAO,CAAC,UAAU,mCAAI,CAAC;YACnC,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,GAAG;SACpC,CAAA;QAED,4DAA4D;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,EAAE,CAAA;QAEjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC9B,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAA;QACvB,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAA;QAErC,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC;YAC5B,SAAS,EAAE,IAAI,SAAS,CAAC;gBACvB,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,aAAa;aACtB,CAAC;YACF,SAAS,EAAE;gBACT,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;aAC1C;SACF,CAAC,CAAA;QAEF,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC;YACjC,SAAS,EAAE,IAAI,SAAS,CAAC;gBACvB,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,aAAa;aACtB,CAAC;YACF,SAAS,EAAE;gBACT,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;aAC7C;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;IACzD,CAAC;IAEO,OAAO;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAA;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QAEvC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAA;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QAE1C,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;YACxC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;gBAClC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;gBAElC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;gBAC9E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;gBACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;gBAClC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACtB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAEvB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;gBAC9D,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;gBAE/D,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;gBACnC,CAAC,CAAC,KAAK,EAAE,CAAA;gBACT,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;gBACR,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;gBACR,wCAAwC;gBACxC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAE1F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAA;IACnC,CAAC;IAEY,KAAK;;YAChB,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;gBAC1B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEO,MAAM;QACZ,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAM;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;QACvC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAA;QAEtB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;YAEpB,wBAAwB;YACxB,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAA;YACzC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;YACtC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;YAEtC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAA;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAA;YAExB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAEhB,sDAAsD;YACtD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;YAC9D,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;YAEzD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,CAAC,CAAC,QAAQ;YAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;QAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACjC,CAAC;IAEO,MAAM;;QACZ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACvC,MAAA,IAAI,CAAC,WAAW,oDAAI,CAAA;IACtB,CAAC;IAEM,MAAM,CAAO,IAAI;6DAAC,MAAc,EAAE,UAA8B,EAAE;YACvE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAM;YAC1B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACvC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,CAAC;KAAA;CACF"}
|
|
@@ -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
|
+
}
|