var gB, fullRes, windowRes;
var requiredFrames = 120;
windowRes = min(windowWidth, windowHeight);
createCanvas(windowRes, windowRes);
gB = createGraphics(fullRes = 1024, fullRes);
gB.blendMode(DIFFERENCE);
gB.translate(fullRes * 0.5, fullRes * 0.5);
var animationProgress = (frameCount / requiredFrames) % 1;
gB.ellipse(0, fullRes * -0.25, map(cos(animationProgress * TAU), -1, 1, fullRes * 0.25, fullRes * 0.95));
gB.ellipse(0, fullRes * 0.25, map(cos(animationProgress * TAU + PI / 2), -1, 1, fullRes * 0.25, fullRes * 0.95));
gB.ellipse(fullRes * -0.25, 0, map(cos(animationProgress * TAU + PI / 3), -1, 1, fullRes * 0.25, fullRes * 0.95));
gB.ellipse(fullRes * 0.25, 0, map(cos(animationProgress * TAU + PI), -1, 1, fullRes * 0.25, fullRes * 0.95));
saveGif('export', requiredFrames, {delay: 0, units: "frames"});
function displayBuffer(buffer) {
image(buffer, windowRes/2, windowRes/2, windowRes, windowRes);
function windowResized() {
windowRes = min(windowWidth, windowHeight);
resizeCanvas(windowRes, windowRes);