font= loadFont('FamiljenGrotesk-VariableFont_wght.ttf')
simplex= new openSimplexNoise(Date.now())
for(let a=PI+PI/4; a<=TAU-PI*0.4; a+=PI/36){
let baseSize= map(a, PI+PI/4, PI+HALF_PI, 30, 60)
loovers.push(new loover(200, 325, a+ random(-PI/26, -PI/26), 3, baseSize+random(-5, 5), delayer))
for(let i=loovers.length-1; i>=0; i--){
reflection=get(0, 0, 200, 400)
constructor(x, y, initAngle, initSize, finalSize, delay){
this.pos= createVector(x, y)
this.vel= p5.Vector.fromAngle(initAngle+random(-0.1, 0.1), 3.5)
this.initAngle= initAngle
this.finalSize= finalSize
this.totalGrowth= finalSize-initSize
this.spreadTime= frameCount+this.delay+int(finalSize*0.33)
if(frameCount>this.delay){
let turnMax= map(this.initAngle, PI+PI/12, PI+HALF_PI, 0.075, 0)
let amount= map(this.size, this.initSize, this.finalSize, 0, turnMax)
let turn= noise(this.pos.x/100, this.pos.y/100, this.vel.heading())*-amount
if(frameCount==this.spreadTime && this.finalSize>30){
let currentAngle= this.vel.heading()
loovers.push(new loover(this.pos.x, this.pos.y, currentAngle- QUARTER_PI, 1, this.finalSize*0.5, 3))
if(frameCount>this.delay){
let framesMap= map(this.size, this.initSize, this.finalSize, 0, 1)
let adjSize= lerp(this.initSize, this.finalSize, easeInSine(framesMap))
translate(this.pos.x, this.pos.y)
rotate(this.vel.heading()+HALF_PI)
ellipse(0,0, adjSize*1.05, adjSize)
line(0, -(adjSize*0.1), 0, (adjSize*0.5))
line(0, -(adjSize*0.1), 0, (adjSize*0.5))
if(frameCount>this.delay){
if(this.size>=this.finalSize){
let index= loovers.indexOf(this)
return 1 - Math.cos((x * Math.PI) / 2);