-
-
Notifications
You must be signed in to change notification settings - Fork 799
/
DestroyOutMode.ts
70 lines (60 loc) · 1.94 KB
/
DestroyOutMode.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import {
type Container,
type IDelta,
OutMode,
type OutModeDirection,
type Particle,
ParticleOutType,
Vector,
getDistances,
isPointInside,
} from "@tsparticles/engine";
import type { IOutModeManager } from "./IOutModeManager.js";
const minVelocity = 0;
export class DestroyOutMode implements IOutModeManager {
modes: (OutMode | keyof typeof OutMode)[];
constructor(private readonly container: Container) {
this.modes = [OutMode.destroy];
}
update(
particle: Particle,
direction: OutModeDirection,
_delta: IDelta,
outMode: OutMode | keyof typeof OutMode,
): void {
if (!this.modes.includes(outMode)) {
return;
}
const container = this.container;
switch (particle.outType) {
case ParticleOutType.normal:
case ParticleOutType.outside:
if (
isPointInside(
particle.position,
container.canvas.size,
Vector.origin,
particle.getRadius(),
direction,
)
) {
return;
}
break;
case ParticleOutType.inside: {
const { dx, dy } = getDistances(particle.position, particle.moveCenter),
{ x: vx, y: vy } = particle.velocity;
if (
(vx < minVelocity && dx > particle.moveCenter.radius) ||
(vy < minVelocity && dy > particle.moveCenter.radius) ||
(vx >= minVelocity && dx < -particle.moveCenter.radius) ||
(vy >= minVelocity && dy < -particle.moveCenter.radius)
) {
return;
}
break;
}
}
container.particles.remove(particle, undefined, true);
}
}