function setup() {
let canvas = createCanvas(600, 600, WEBGL);
canvas.parent('animation-holder');
}
function draw() {
background(0, 0, 50);
directionalLight(255, 255, 255, 0, 0, -1);
drawFractal(0, 0, 200, 6);
drawFractal(150, -150, 120, 5);
drawFractal(-200, 100, 80, 4);
push();
translate(-100, 200);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.02);
fill(200, 200, 0);
cylinder(30, 80);
pop();
push();
translate(100, -250);
rotateX(frameCount * 0.015);
rotateY(frameCount * 0.025);
fill(200, 200, 0);
cylinder(25, 60);
pop();
// Add ocean waves in the back
push();
translate(0, 200, -300);
drawOcean(0, 0, 800);
pop();
}
function drawFractal(x, y, size, level) {
if(level > 0) {
push();
translate(x, y);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.02);
if (level % 2 == 0) {
fill(255, 200, 0);
} else {
fill(200, 200, 0);
}
box(size);
level--;
drawFractal(0, size/2, size/2, level);
drawFractal(0, -size/2, size/2, level);
drawFractal(size/2, 0, size/2, level);
drawFractal(-size/2, 0, size/2, level);
pop();
}
}
function drawOcean(x, y, size) {
push();
translate(x, y);
// Wavy ocean surface
fill(0, 100, 200);
beginShape();
let waveStep = size / 20;
for (let i = -size/2; i <= size/2; i += waveStep) {
let waveHeight = 50 * sin(i * 0.01 + frameCount * 0.05);
vertex(i, waveHeight);
}
vertex(size/2, size/2);
vertex(-size/2, size/2);
endShape(CLOSE);
// Floating fractal debris
for (let i = 0; i < 10; i++) {
push();
let debrisX = random(-size/2, size/2);
let debrisY = 50 * sin(debrisX * 0.01 + frameCount * 0.05);
translate(debrisX, debrisY, 50);
rotateX(frameCount * 0.01);
rotateY(frameCount * 0.02);
fill(255, 200, 0);
box(20);
pop();
}
pop();
}