bnb({
w, h,
webgl: true,
numFrames: 100,
fps: 25,
record: true,
shutterAngle: 0.8,
samplesPerFrame: 12,
globals: {
offsets: array(icosahedron.length).map(i => Math.random() * 0.15),
icosahedron: icosahedron.map(face => face.map(vert => PVector.fromArray(vert).mult(250))),
colors: icosahedron.map((face, i) => randInt(1, palette.length))
},
setup: (s, g) => {
s.frameRate(30)
},
draw: (s, t, g) => {
s.background(palette[0])
s.rotateX(-t * s.TAU)
s.rotateY(t * s.TAU)
s.stroke(0)
s.strokeWeight(2)
g.icosahedron.forEach((face, i) => {
const center = face.reduce((acc, v) => acc.add(v), PVector()).div(3)
const tt = ease(linearstepUpDown((t + g.offsets[i]) % 1, 0, 0.15, 0.6, 0.75), 5)
s.fill(palette[g.colors[i]])
s.beginShape()
face.forEach(v => s.vertex(...v.clone().add(center.setMag(tt * 150)).toArray()))
s.endShape(s.CLOSE)
s.fill(palette[0])
face.forEach((v, j) => {
const a = v.clone()
const b = face[(j + 1) % face.length].clone()
s.beginShape()
s.vertex(...a.toArray())
s.vertex(...b.toArray())
s.vertex(...b.setMag(100).toArray())
s.vertex(...a.setMag(100).toArray())
s.endShape(s.CLOSE)
})
})
}
})