38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
import { ParticlesInteractorBase, getDistance } from "tsparticles-engine";
|
|
import { resolveCollision } from "./ResolveCollision";
|
|
export class Collider extends ParticlesInteractorBase {
|
|
constructor(container) {
|
|
super(container);
|
|
}
|
|
clear() {
|
|
}
|
|
init() {
|
|
}
|
|
async interact(p1, delta) {
|
|
const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.quadTree.queryCircle(pos1, radius1 * 2);
|
|
for (const p2 of query) {
|
|
if (p1 === p2 ||
|
|
!p2.options.collisions.enable ||
|
|
p1.options.collisions.mode !== p2.options.collisions.mode ||
|
|
p2.destroyed ||
|
|
p2.spawning) {
|
|
continue;
|
|
}
|
|
const pos2 = p2.getPosition(), radius2 = p2.getRadius();
|
|
if (Math.abs(Math.round(pos1.z) - Math.round(pos2.z)) > radius1 + radius2) {
|
|
continue;
|
|
}
|
|
const dist = getDistance(pos1, pos2), distP = radius1 + radius2;
|
|
if (dist > distP) {
|
|
continue;
|
|
}
|
|
resolveCollision(p1, p2, delta, container.retina.pixelRatio);
|
|
}
|
|
}
|
|
isEnabled(particle) {
|
|
return particle.options.collisions.enable;
|
|
}
|
|
reset() {
|
|
}
|
|
}
|