Skip to content

Commit

Permalink
feat: added max speed value to collisions options
Browse files Browse the repository at this point in the history
  • Loading branch information
matteobruni committed Feb 21, 2023
1 parent 8b26a2f commit 6708716
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
8 changes: 8 additions & 0 deletions engine/src/Options/Classes/Particles/Collisions/Collisions.ts
Expand Up @@ -4,7 +4,9 @@ import { CollisionsOverlap } from "./CollisionsOverlap";
import type { ICollisions } from "../../../Interfaces/Particles/Collisions/ICollisions";
import type { IOptionLoader } from "../../../Interfaces/IOptionLoader";
import { ParticlesBounce } from "../Bounce/ParticlesBounce";
import type { RangeValue } from "../../../../Types/RangeValue";
import type { RecursivePartial } from "../../../../Types/RecursivePartial";
import { setRangeValue } from "../../../../Utils/NumberUtils";

/**
* @category Options
Expand All @@ -14,13 +16,15 @@ export class Collisions implements ICollisions, IOptionLoader<ICollisions> {
absorb;
bounce;
enable;
maxSpeed: RangeValue;
mode: CollisionMode | keyof typeof CollisionMode;
overlap;

constructor() {
this.absorb = new CollisionsAbsorb();
this.bounce = new ParticlesBounce();
this.enable = false;
this.maxSpeed = 50;
this.mode = CollisionMode.bounce;
this.overlap = new CollisionsOverlap();
}
Expand All @@ -37,6 +41,10 @@ export class Collisions implements ICollisions, IOptionLoader<ICollisions> {
this.enable = data.enable;
}

if (data.maxSpeed !== undefined) {
this.maxSpeed = setRangeValue(data.maxSpeed);
}

if (data.mode !== undefined) {
this.mode = data.mode;
}
Expand Down
Expand Up @@ -2,6 +2,7 @@ import type { CollisionMode } from "../../../../Enums/Modes/CollisionMode";
import type { ICollisionsAbsorb } from "./ICollisionsAbsorb";
import type { ICollisionsOverlap } from "./ICollisionsOverlap";
import type { IParticlesBounce } from "../Bounce/IParticlesBounce";
import type { RangeValue } from "../../../../Types/RangeValue";

/**
* @category Options
Expand All @@ -11,6 +12,7 @@ export interface ICollisions {
absorb: ICollisionsAbsorb;
bounce: IParticlesBounce;
enable: boolean;
maxSpeed: RangeValue;
mode: CollisionMode | keyof typeof CollisionMode;
overlap: ICollisionsOverlap;
}
21 changes: 19 additions & 2 deletions interactions/particles/collisions/src/Bounce.ts
@@ -1,6 +1,23 @@
import { circleBounce, circleBounceDataFromParticle } from "tsparticles-engine";
import { circleBounce, circleBounceDataFromParticle, getRangeValue } from "tsparticles-engine";
import type { Particle } from "tsparticles-engine";

export function bounce(p1: Particle, p2: Particle): void {
type BounceParticle = Particle & {
collisionMaxSpeed?: number;
};

const fixBounceSpeed = (p: BounceParticle): void => {
if (p.collisionMaxSpeed === undefined) {
p.collisionMaxSpeed = getRangeValue(p.options.collisions.maxSpeed);
}

if (p.velocity.length > p.collisionMaxSpeed) {
p.velocity.length = p.collisionMaxSpeed;
}
};

export function bounce(p1: BounceParticle, p2: BounceParticle): void {
circleBounce(circleBounceDataFromParticle(p1), circleBounceDataFromParticle(p2));

fixBounceSpeed(p1);
fixBounceSpeed(p2);
}

0 comments on commit 6708716

Please sign in to comment.