← Back to Gallery

Loading 3D viewer…

Lido Pavilion (indexed)

by Jorge Barbero

Dimensions
104×44×88
Blocks
113,109
Compute Time
9.9s
Generation Time
2m 43s
Model
claude-opus-5
Created
August 31, 2026
art_decoautoevalindexedlido
Prompt

User Prompt

an Art Deco streamline-moderne seaside lido pavilion: a long white rendered two-storey block with rounded corner ends, horizontal jade-green banding lines and ribbon windows, a stepped ziggurat entrance tower with a clock, a flat roof sun terrace with railings, interior cafe with tables and an open staircase up to the terrace, standing on a promenade above a pebble beach

Photos

Exterior
Exteriorexterior
Sea facade + pool
Sea facade + poolexterior
Round cafe hall
Round cafe hallinterior
Open staircase
Open staircaseinterior
East wing restaurant
East wing restaurantinterior
CraftScript Source
// === BUILD PLAN ===
// Style: Streamline Moderne / Art Deco seaside LIDO — CRESCENT plan (drum + two wings)
// Footprint: central round DRUM r11 @ (52,30) + west wing x18..42 z24..38 (round end r7 @18,31)
//            + east wing x62..86 z24..38 (round end r7 @86,31)  -> composite, strictly symmetric (deco rule)
//            + open-air sun deck & bathing pool between the wings, z44..58, facing the sea (+Z)
// Height: floor 13 | ground walk 14 (air 14-18) | mid floor 19 | upper walk 20 (air 20-24)
//         | roof terrace deck 25 | parapet 26 + chrome rail 27 | stepped tower on the drum to y35
//
// GROUND FLOOR (top-down, +Z = sea, downward):
//    (=====WING W=====)      ((( DRUM )))      (=====WING E=====)
//    ( lockers | cafe  )-D-(  round hall  )-D-(  restaurant     )
//                          [ENTRANCE at z41]
//                    ~~~~~~ pool + sun deck ~~~~~~
//                    ---------- sea wall ----------  pebble beach / sea
//
// ELEVATION (streamline banding, LAYERED build):
//   y35 finial | y31-34 tier3 | y26-30 tier2 drum tower + CLOCK | y27 chrome rail
//   y24 === GREEN BAND ===  y22-23 ribbon glass  y20-21 white
//   y18 === GREEN BAND (1 block proud = shadow line) ===  y16-17 ribbon glass  y14-15 white
//   y13 black granite plinth
//
// MATERIALS PLAN (LAYERED: blue_wool placeholder -> masks -> texture last):
//   walls : gradientPalette white_concrete(low)->smooth_quartz(high) noise .2  - WHY: volume on a big white mass
//   bands : green_terracotta+green_concrete, PROJECTING 1 block               - WHY: crisp deco line + real shadow
//   glass : light_blue_stained_glass ribbon with quartz mullions
//   tower : quartz + quartz_pillar fluting + gold_block tier lines + clock
//   floor : polished_blackstone / smooth_quartz checker (deco lobby floor)
//   light : HIDDEN sea_lantern under carpet (interior-design Lighting) + hanging lanterns
// Rooms: drum = round cafe hall (counter arc, tables, rug); W wing = lockers+lounge; E wing = restaurant
//        upper wings = lounges w/ tables; terrace = deck chairs, parasols, planters
// STAIR PLAN: walk14 -> walk20 staircase(46,26,'east') width2 ; walk20 -> walk26 staircase(46,34,'east') width2
// === END PLAN ===

var floorY = 13, walkY = 14, midY = 19, walk2Y = 20, deckY = 25, walk3Y = 26;
var DX = 52, DZ = 30, DR = 11;

function inShell(x, z) {
    var dx = x - DX, dz = z - DZ;
    if (dx * dx + dz * dz <= DR * DR) return true;
    if (x >= 18 && x <= 42 && z >= 24 && z <= 38) return true;
    if (x >= 62 && x <= 86 && z >= 24 && z <= 38) return true;
    dx = x - 18; dz = z - 31; if (dx * dx + dz * dz <= 49) return true;
    dx = x - 86; if (dx * dx + dz * dz <= 49) return true;
    return false;
}
function inRoom(x, z) {
    var dx = x - DX, dz = z - DZ;
    if (dx * dx + dz * dz <= 100) return true;
    if (x >= 19 && x <= 41 && z >= 25 && z <= 37) return true;
    if (x >= 63 && x <= 85 && z >= 25 && z <= 37) return true;
    dx = x - 18; dz = z - 31; if (dx * dx + dz * dz <= 36) return true;
    dx = x - 86; if (dx * dx + dz * dz <= 36) return true;
    return false;
}

// === TERRAIN: coastal shelf + flat promenade pad (superpowers, no hand-rolled loop) ===
var hb = hills({ base: 0, amp: 2, scale: 0.045, seed: 12 });
var coast = function (x, z) {
    var b0 = 12;
    if (z > 60) { b0 = 12 - (z - 60) * 0.5; if (b0 < 2) b0 = 2; }
    return b0 + hb(x, z);
};
var pad = flatten(coast, { x0: 8, z0: 6, x1: 96, z1: 60 }, 12, 7);
var land = zoneRect(0, 0, 103, 87);
var shore = patches([{ block: 'gravel', w: 42 }, { block: 'sand', w: 30 }, { block: 'cobblestone', w: 14 }, { block: 'stone', w: 14 }], 0.08, 21);
var lawn = patches([{ block: 'grass_block', w: 55 }, { block: 'gravel', w: 18 }, { block: 'coarse_dirt', w: 12 }, { block: 'stone', w: 15 }], 0.06, 3);
surface(land, pad, function (x, z) { return (pad(x, z) <= 8.5) ? shore(x, z) : lawn(x, z); }, { sub: 'dirt', deep: 'stone', depth: 4 });
fillMasked(0, 2, 60, 103, 6, 87, 'water', onlyAir());

var terraceP = patches([{ block: 'smooth_quartz', w: 34 }, { block: 'light_gray_concrete', w: 30 }, { block: 'polished_diorite', w: 22 }, { block: 'smooth_stone', w: 14 }], 0.09, 7);
fill(16, 12, 18, 88, 12, 60, terraceP);
fill(14, 10, 61, 90, 12, 61, 'polished_blackstone');
var q;
for (q = 46; q <= 58; q++) { pb(q, 12, 62, 'smooth_stone'); pb(q, 11, 63, 'smooth_stone'); pb(q, 10, 64, 'smooth_stone'); pb(q, 9, 65, 'smooth_stone'); }

// === LAYER 1: FORM in placeholder ===
var x, y, z;
for (x = 6; x <= 96; x++) {
    for (z = 20; z <= 42; z++) {
        if (inShell(x, z)) fill(x, floorY, z, x, deckY, z, 'blue_wool');
    }
}
// === LAYER 2: carve rooms by MASK (never touches anything but the placeholder) ===
for (x = 6; x <= 96; x++) {
    for (z = 20; z <= 42; z++) {
        if (inRoom(x, z)) {
            clearMasked(x, walkY, z, x, midY - 1, z, onlyMaterial('blue_wool'));
            clearMasked(x, walk2Y, z, x, deckY - 1, z, onlyMaterial('blue_wool'));
        }
    }
}
// doorways drum <-> wings (both levels + terrace level later)
fill(42, walkY, 28, 42, 17, 32, 'air');
fill(62, walkY, 28, 62, 17, 32, 'air');
fill(42, walk2Y, 28, 42, 23, 32, 'air');
fill(62, walk2Y, 28, 62, 23, 32, 'air');

// floors
var checker = function (px, py, pz) { return ((px + pz) % 2 === 0) ? 'polished_blackstone' : 'smooth_quartz'; };
var deckPat = noisePalette([{ block: 'smooth_quartz', weight: 58 }, { block: 'quartz_block', weight: 26 }, { block: 'light_gray_concrete', weight: 16 }], { seed: 3 });
for (x = 6; x <= 96; x++) {
    for (z = 20; z <= 42; z++) {
        if (inRoom(x, z)) {
            pb(x, floorY, z, checker(x, floorY, z));
            pb(x, midY, z, checker(x, midY, z));
            pb(x, deckY, z, deckPat(x, deckY, z));
        }
    }
}

// === LAYER 3: TEXTURE LAST by mask (bands / ribbon glass / gradient wall) ===
replaceMasked(6, 13, 20, 96, 13, 42, 'polished_blackstone', onlyMaterial('blue_wool'));
replaceMasked(6, 16, 20, 96, 17, 42, 'light_blue_stained_glass', onlyMaterial('blue_wool'));
replaceMasked(6, 18, 20, 96, 18, 42, 'green_terracotta', onlyMaterial('blue_wool'));
replaceMasked(6, 22, 20, 96, 23, 42, 'light_blue_stained_glass', onlyMaterial('blue_wool'));
replaceMasked(6, 24, 20, 96, 24, 42, 'green_terracotta', onlyMaterial('blue_wool'));
replaceMasked(6, 13, 20, 96, deckY, 42,
    gradientPalette(14, 25, [{ block: 'white_concrete', from: 0 }, { block: 'smooth_quartz', from: 0.5 }], { noise: 0.2 }),
    onlyMaterial('blue_wool'));

// mullions every 4 blocks along the wing ribbons + radial ones on the drum
for (x = 20; x <= 40; x += 4) {
    fill(x, 16, 24, x, 17, 24, 'quartz_pillar[axis=y]'); fill(x, 22, 24, x, 23, 24, 'quartz_pillar[axis=y]');
    fill(x, 16, 38, x, 17, 38, 'quartz_pillar[axis=y]'); fill(x, 22, 38, x, 23, 38, 'quartz_pillar[axis=y]');
}
for (x = 64; x <= 84; x += 4) {
    fill(x, 16, 24, x, 17, 24, 'quartz_pillar[axis=y]'); fill(x, 22, 24, x, 23, 24, 'quartz_pillar[axis=y]');
    fill(x, 16, 38, x, 17, 38, 'quartz_pillar[axis=y]'); fill(x, 22, 38, x, 23, 38, 'quartz_pillar[axis=y]');
}
var a, rr, mx, mz;
for (a = 0; a < 360; a += 30) {
    rr = a * Math.PI / 180;
    mx = Math.round(DX + Math.cos(rr) * DR); mz = Math.round(DZ + Math.sin(rr) * DR);
    if (inShell(mx, mz)) { fill(mx, 16, mz, mx, 17, mz, 'quartz_pillar[axis=y]'); fill(mx, 22, mz, mx, 23, mz, 'quartz_pillar[axis=y]'); }
}

// === PROJECTING CORNICE (1 block proud -> shadow line, real facade depth) ===
function proud(by, blk) {
    var px, pz;
    for (px = 6; px <= 96; px++) {
        for (pz = 19; pz <= 43; pz++) {
            if (inShell(px, pz)) continue;
            if (inShell(px + 1, pz) || inShell(px - 1, pz) || inShell(px, pz + 1) || inShell(px, pz - 1)) pb(px, by, pz, blk);
        }
    }
}
proud(18, 'green_concrete');
proud(24, 'green_concrete');
proud(25, 'smooth_quartz_slab[type=bottom]');

// === TERRACE PARAPET + CHROME RAIL (wings + drum ring) ===
for (x = 6; x <= 96; x++) {
    for (z = 20; z <= 42; z++) {
        if (inShell(x, z) && !inRoom(x, z)) { pb(x, 26, z, 'smooth_quartz'); pb(x, 27, z, 'iron_bars'); }
    }
}
fill(42, 26, 28, 42, 27, 32, 'air');   // walk-through between drum ring and wing decks
fill(62, 26, 28, 62, 27, 32, 'air');

// === STEPPED TOWER ON THE DRUM (deco setbacks + gold lines + clock) ===
var qpal = noisePalette([{ block: 'smooth_quartz', weight: 55 }, { block: 'white_concrete', weight: 30 }, { block: 'quartz_block', weight: 15 }], { seed: 8 });
function disc(cx, cz, r, y0, y1, pat) {
    var px, pz, dx, dz;
    for (px = cx - r; px <= cx + r; px++) {
        for (pz = cz - r; pz <= cz + r; pz++) {
            dx = px - cx; dz = pz - cz;
            if (dx * dx + dz * dz <= r * r) fill(px, y0, pz, px, y1, pz, pat);
        }
    }
}
disc(DX, DZ, 8, 26, 30, qpal);
disc(DX, DZ, 8, 31, 31, 'gold_block');
disc(DX, DZ, 5, 32, 34, qpal);
disc(DX, DZ, 5, 35, 35, 'gold_block');
pb(DX, 36, DZ, 'gold_block'); pb(DX, 37, DZ, 'lightning_rod');
for (a = 0; a < 360; a += 45) {
    rr = a * Math.PI / 180;
    mx = Math.round(DX + Math.cos(rr) * 8); mz = Math.round(DZ + Math.sin(rr) * 8);
    fill(mx, 26, mz, mx, 30, mz, 'quartz_pillar[axis=y]');
}
// CLOCK on the sea-facing (+Z) face of tier 2
fill(50, 27, 38, 54, 30, 38, 'white_concrete');
fill(49, 26, 38, 55, 26, 38, 'gold_block');
fill(49, 31, 38, 55, 31, 38, 'gold_block');
pb(50, 27, 38, 'black_concrete'); pb(54, 27, 38, 'black_concrete');
pb(50, 30, 38, 'black_concrete'); pb(54, 30, 38, 'black_concrete');
pb(52, 27, 38, 'black_concrete'); pb(52, 30, 38, 'black_concrete');
pb(52, 28, 38, 'gold_block'); pb(53, 28, 38, 'black_concrete'); pb(52, 29, 38, 'black_concrete');

// === ENTRANCE (drum, sea side +Z) ===
fill(50, walkY, 41, 54, 16, 41, 'air');
fill(49, walkY, 41, 49, 16, 41, 'gold_block');
fill(55, walkY, 41, 55, 16, 41, 'gold_block');
fill(50, 17, 41, 54, 17, 41, 'gold_block');
var kk;
for (kk = 0; kk <= 3; kk++) { pb(52, 18 + kk, 41, 'gold_block'); pb(52 - kk, 18 + kk, 41, 'gold_block'); pb(52 + kk, 18 + kk, 41, 'gold_block'); }
fill(47, 18, 42, 57, 18, 44, 'smooth_quartz_slab[type=top]');
fill(47, walkY, 44, 47, 17, 44, 'quartz_pillar[axis=y]');
fill(57, walkY, 44, 57, 17, 44, 'quartz_pillar[axis=y]');
fill(48, 12, 42, 56, 12, 44, 'polished_blackstone');

// === STAIRS ===
staircase(46, 26, walkY, walk2Y, 'east', { width: 2, material: 'quartz_stairs', support: 'smooth_quartz' });
staircase(46, 34, walk2Y, walk3Y, 'east', { width: 2, material: 'quartz_stairs', support: 'smooth_quartz' });

// === INTERIOR — DRUM: round cafe hall ===
// hidden floor lighting under carpet (interior-design Lighting)
var cx2, cz2, d2;
for (cx2 = 45; cx2 <= 59; cx2++) {
    for (cz2 = 23; cz2 <= 37; cz2++) {
        d2 = (cx2 - DX) * (cx2 - DX) + (cz2 - DZ) * (cz2 - DZ);
        if (d2 <= 36 && (cx2 % 4 === 0) && (cz2 % 4 === 0)) { pb(cx2, floorY, cz2, 'sea_lantern'); pb(cx2, walkY, cz2, 'light_gray_carpet'); }
    }
}
// counter arc against the back (low z) of the drum
for (a = 200; a <= 340; a += 20) {
    rr = a * Math.PI / 180;
    mx = Math.round(DX + Math.cos(rr) * 8); mz = Math.round(DZ + Math.sin(rr) * 8);
    pb(mx, walkY, mz, 'smooth_quartz'); ps(mx, walkY + 1, mz, 'quartz_stairs[facing=south,half=top]');
}
pb(46, walkY, 24, 'barrel'); pb(58, walkY, 24, 'barrel');
function tbl(tx, tz, ty, seatA, seatB) {
    pb(tx, ty, tz, 'dark_oak_fence'); pb(tx, ty + 1, tz, 'white_carpet');
    chairStair(tx, ty, tz - 1, 'dark_oak_stairs', seatA);
    chairStair(tx, ty, tz + 1, 'dark_oak_stairs', seatB);
}
tbl(48, 31, walkY, 'south', 'north');
tbl(56, 31, walkY, 'south', 'north');
tbl(52, 35, walkY, 'south', 'north');
rug(49, walkY, 33, 7, 5, 'green', 'lime');
ps(48, 18, 28, 'lantern[hanging=true]'); ps(56, 18, 28, 'lantern[hanging=true]'); ps(52, 18, 34, 'lantern[hanging=true]');
ps(45, walkY, 34, 'potted_bamboo'); ps(59, walkY, 34, 'potted_fern');

// === INTERIOR — WEST WING: changing lockers + lounge ===
for (x = 21; x <= 33; x += 2) {
    fill(x, walkY, 25, x, walkY + 1, 25, 'white_concrete');
    ps(x, walkY, 26, 'spruce_door[facing=south,half=lower,hinge=left]');
    ps(x, walkY + 1, 26, 'spruce_door[facing=south,half=upper,hinge=left]');
}
for (z = 31; z <= 35; z++) chairStair(20, walkY, z, 'spruce_stairs', 'west');
pb(23, walkY, 33, 'dark_oak_fence'); pb(23, walkY + 1, 33, 'green_carpet');
chairStair(25, walkY, 33, 'spruce_stairs', 'east');
rug(20, walkY, 30, 8, 6, 'light_gray', 'green');
tbl(30, 33, walkY, 'south', 'north'); tbl(36, 33, walkY, 'south', 'north');
ps(28, 18, 31, 'lantern[hanging=true]'); ps(36, 18, 35, 'lantern[hanging=true]');
ps(19, walkY, 28, 'potted_fern'); ps(38, walkY, 27, 'potted_bamboo');
pb(39, walkY, 26, 'barrel'); pb(40, walkY, 26, 'chest');

// === INTERIOR — EAST WING: restaurant ===
for (x = 66; x <= 82; x += 5) { tbl(x, 29, walkY, 'south', 'north'); tbl(x, 34, walkY, 'south', 'north'); }
for (x = 64; x <= 72; x++) { pb(x, walkY, 25, 'smooth_quartz'); ps(x, walkY + 1, 25, 'quartz_stairs[facing=south,half=top]'); }
pb(73, walkY, 25, 'barrel'); pb(74, walkY, 25, 'smoker[facing=south,lit=false]'); pb(75, walkY, 25, 'blast_furnace[facing=south,lit=false]');
rug(66, walkY, 31, 16, 4, 'white', 'green');
ps(68, 18, 31, 'lantern[hanging=true]'); ps(78, 18, 31, 'lantern[hanging=true]');
ps(85, walkY, 31, 'potted_fern'); ps(64, walkY, 36, 'potted_bamboo');

// === UPPER FLOORS: lounges ===
for (x = 24; x <= 36; x += 6) tbl(x, 31, walk2Y, 'south', 'north');
for (x = 66; x <= 82; x += 6) tbl(x, 31, walk2Y, 'south', 'north');
rug(24, walk2Y, 34, 14, 3, 'light_gray', 'green');
rug(66, walk2Y, 34, 18, 3, 'light_gray', 'green');
for (z = 29; z <= 33; z++) chairStair(20, walk2Y, z, 'spruce_stairs', 'west');
for (z = 29; z <= 33; z++) chairStair(84, walk2Y, z, 'spruce_stairs', 'east');
for (x = 46; x <= 58; x += 6) { tbl(x, 33, walk2Y, 'south', 'north'); }
for (x = 47; x <= 57; x += 5) { pb(x, walk2Y, 25, 'smooth_quartz'); ps(x, walk2Y + 1, 25, 'quartz_stairs[facing=south,half=top]'); }
ps(28, 24, 31, 'lantern[hanging=true]'); ps(74, 24, 31, 'lantern[hanging=true]'); ps(52, 24, 33, 'lantern[hanging=true]');
ps(22, walk2Y, 27, 'potted_fern'); ps(84, walk2Y, 27, 'potted_bamboo');

// === ROOF TERRACES ===
function deckChair(dx, dz) { chairStair(dx, walk3Y, dz, 'quartz_stairs', 'north'); pb(dx, walk3Y, dz + 1, 'smooth_quartz_slab[type=bottom]'); }
for (x = 22; x <= 38; x += 4) deckChair(x, 35);
for (x = 66; x <= 82; x += 4) deckChair(x, 35);
function parasol(px, pz, col) {
    fill(px, walk3Y, pz, px, walk3Y + 2, pz, 'oak_fence');
    fill(px - 1, walk3Y + 3, pz - 1, px + 1, walk3Y + 3, pz + 1, col);
    pb(px, walk3Y + 4, pz, col);
}
parasol(26, 29, 'green_concrete'); parasol(36, 29, 'white_concrete');
parasol(68, 29, 'white_concrete'); parasol(78, 29, 'green_concrete');
var pl;
for (pl = 20; pl <= 86; pl += 6) { if (inShell(pl, 27) && !inRoom(pl, 27)) continue; pb(pl, walk3Y, 27, 'smooth_quartz'); pb(pl, walk3Y + 1, 27, 'flowering_azalea_leaves'); }

// === OUTDOOR: bathing pool + sun deck between the wings ===
fill(40, 9, 44, 64, 12, 58, 'polished_blackstone');
fill(41, 10, 45, 63, 12, 57, 'light_blue_concrete');
fill(41, 11, 45, 63, 12, 57, 'water');
fill(40, 12, 44, 64, 12, 44, 'smooth_quartz'); fill(40, 12, 58, 64, 12, 58, 'smooth_quartz');
fill(40, 12, 44, 40, 12, 58, 'smooth_quartz'); fill(64, 12, 44, 64, 12, 58, 'smooth_quartz');
var ladX;
for (ladX = 44; ladX <= 60; ladX += 8) { pb(ladX, 12, 44, 'quartz_stairs[facing=south,half=top]'); }
for (x = 34; x <= 38; x += 2) { chairStair(x, 13, 50, 'quartz_stairs', 'west'); pb(x, 13, 51, 'smooth_quartz_slab[type=bottom]'); }
for (x = 66; x <= 70; x += 2) { chairStair(x, 13, 50, 'quartz_stairs', 'east'); pb(x, 13, 51, 'smooth_quartz_slab[type=bottom]'); }
parasol(36, 46, 'green_concrete'); parasol(68, 46, 'white_concrete');
fill(30, 13, 60, 74, 13, 60, 'iron_bars');
var lp;
for (lp = 24; lp <= 84; lp += 12) { lampPost(lp, 12, 59, 4, 'iron_bars'); }
for (lp = 22; lp <= 86; lp += 8) { pb(lp, 13, 21, 'white_concrete'); pb(lp, 14, 21, 'azalea_leaves'); }
placeTree(12, 13, 24, 'oak'); placeTree(94, 13, 26, 'oak'); placeTree(14, 13, 46, 'oak'); placeTree(92, 13, 48, 'oak');
fill(20, 13, 60, 20, 19, 60, 'iron_bars'); ps(20, 19, 61, 'green_wall_banner[facing=south]');
fill(84, 13, 60, 84, 19, 60, 'iron_bars'); ps(84, 19, 61, 'white_wall_banner[facing=south]');
noisyScatter(8, 68, 96, 86, 'cobblestone', 0.05, pad);

Static Renders

Lido Pavilion (indexed) isometric viewisometric
Lido Pavilion (indexed) front viewfront
Lido Pavilion (indexed) side viewside
Lido Pavilion (indexed) back viewback
Lido Pavilion (indexed) top viewtop