bnb({
w, h,
webgl: true,
numFrames: 120,
fps: 25,
usePre1: true,
record: true,
shutterAngle: 1,
samplesPerFrame: 2,
draw: (s, t, g) => {
s.camera(0, 0, 500, 0, 0, 0, 0, 1, 0)
s.ortho(-w / 2, w / 2, w / 2, -w / 2, 0, 500)
s.background(22)
s.ambientLight(20, 20, 20)
const brightness = 200
s.pointLight(0, 0, brightness, s.cos(s.TAU) * 100, s.sin(s.TAU) * 100, 150)
s.pointLight(0, 0, brightness, s.cos(s.TAU + s.PI) * 100, s.sin(s.TAU + s.PI) * 100, 150)
s.pointLight(brightness, 0, 0, s.cos(s.TAU + s.PI/2) * 100, s.sin(s.TAU + s.PI/2) * 100, 150)
s.pointLight(brightness, 0, 0, s.cos(s.TAU - s.PI/2) * 100, s.sin(s.TAU - s.PI/2) * 100, 150)
const r = .5
s.translate(s.random(-r, r), s.random(-r, r), s.random(-r, r))
s.noStroke()
s.fill(255)
const N = 8
const size = 60.2
for(let y = -N; y <= N; y ++) {
for(let x = -N; x <= N; x ++) {
s.push()
s.translate(x * size / 2, y * size / 2)
const offset = (x + y) * .008
const tt = ease(linearstep((t + offset) % 1, .1, .8), 2)
s.rotateX(tt * s.TAU)
s.rotateY(-tt * s.TAU)
s.box(size)
s.pop()
}
}
}
})