let gGravitySwitchTime = 0;
createCanvas(windowWidth, windowHeight, WEBGL);
for (let i = 0; i < 5; i++) {
let system = new ParticleSystem(createVector(0, 0, 0), (gHue + 25 * i)%360);
gGravity = createVector(1, 1, 0);
function mouseClicked() {}
const curTime = millis();
let dt = (curTime - gLastTime) * 0.1;
if (curTime > gGravitySwitchTime) {
gGravitySwitchTime = curTime + random(50, 1000);
gGravity = createVector(random(-1, 1), random(-1, 1), random(-1, 1));
for (let system of gSystems) {
for (let system of gSystems) {
constructor(position, directionY, mass, gravity) {
this.velocity = createVector(random(-1, 1), directionY, random(-1, 1)).mult(0.2);
this.position = position.copy();
let netForce = p5.Vector.div(this.gravity, this.mass);
let acceleration = p5.Vector.mult(netForce, dt);
this.velocity.add(acceleration);
let dPos = p5.Vector.mult(this.velocity, dt).add(p5.Vector.mult(acceleration, 0.5 * dt * dt));
translate(this.position.x, this.position.y, this.position.z);
sphere(map(this.lifespan, 0, 1, 0, 5));
return this.lifespan < 0;
constructor(position, hue) {
this.origin = position.copy();
this.mass = random(25, 50);
this.directionY = random(-1, 1);
this.gravity = createVector(random(-1, 1), random(-1, 1), random(-1, 1));
this.particles.push(new Particle(this.origin, this.directionY, this.mass, this.gravity));
for (let i = this.particles.length - 1; i >= 0; i--) {
let p = this.particles[i];
this.particles.splice(i, 1);
rotateY(0.0005 * millis());
ambientMaterial(this.hue, 100, 100);
for (let p of this.particles) {
this.gravity = createVector(random(-1, 1), random(-1, 1), random(-1, 1));
for (let p of this.particles) {
p.gravity = this.gravity;