← Back to Gallery

Loading 3D viewer…

Hanok L-wing (indexed, sonnet-5-5)

by Jorge Barbero

Dimensions
40×20×36
Blocks
3,566
Compute Time
0.6s
Generation Time
1m
Model
claude-sonnet-5-5
Created
October 5, 2026
autoevalindexedhanok
Prompt

User Prompt

a Korean hanok scholar's house (sarangchae) with a curved dark-grey tile roof, raised wooden maru floor with paper-screen doors, stone-wall courtyard with a persimmon tree, interior with ondol room and low desk

Photos

Exterior
Exteriorexterior
Ondol room
Ondol roominterior
Kitchen
Kitcheninterior
CraftScript Source
// === BUILD PLAN ===
// Style: Korean hanok, L-shaped (ㄱ) layout: main sarangchae wing (E-W) + kitchen wing (N-S) hugging a gravel courtyard
// Footprint: main x6..25 z8..16 (20x9), kitchen wing x6..14 z17..27 (9x11), courtyard wall x2..37 z3..33
// Height: floorY=1 walkY=2, walls y2..5, gable roofs base y6 (gable ends filled)
//   z8 ###W##W##|###W##W###     main: hall (west) | ondol room (east)
//   z16 #D #  #D|##P#D#P##     kitchen wing below hall, door to courtyard on its east wall
// Materials: stone-brick plinth (stone_bricks/mossy/cobble); dark_oak pillars + plaster (quartz/calcite/white terracotta); panes = hanji; roof blackstone-brick tiles
// Rooms: ondol room (desk, cushions, shelf), hall (table, chest), kitchen (furnaces, cauldron, barrels)
// === END PLAN ===
function hh(x, y, z) { var s = Math.sin(x * 12.9898 + y * 37.7 + z * 78.233) * 43758.5453; return s - Math.floor(s); }
var stoneP = palette([{block:"stone_bricks",weight:55},{block:"mossy_stone_bricks",weight:25},{block:"cobblestone",weight:20}]);
var plaster = palette([{block:"smooth_quartz",weight:45},{block:"calcite",weight:30},{block:"white_terracotta",weight:25}]);
var floorP = palette([{block:"oak_planks",weight:50},{block:"birch_planks",weight:35},{block:"stripped_birch_log",weight:15}]);
var grass = palette([{block:"grass_block",weight:75},{block:"moss_block",weight:15},{block:"coarse_dirt",weight:10}]);
var gravel = palette([{block:"gravel",weight:60},{block:"andesite",weight:25},{block:"light_gray_concrete",weight:15}]);
var x, y, z, i;
fill(0, 0, 0, 39, 0, 35, grass);
fill(16, 0, 18, 36, 0, 32, gravel);
// plinth
fill(5, 1, 7, 26, 1, 17, stoneP);
fill(5, 1, 17, 15, 1, 28, stoneP);
// floors
fill(7, 1, 9, 24, 1, 15, floorP);
fill(7, 1, 18, 13, 1, 26, "stone_bricks");
// walls (plaster) y2..4, beam y5
function wallBox(x1, z1, x2, z2) {
  for (x = x1; x <= x2; x++) { for (y = 2; y <= 4; y++) { pb(x, y, z1, plaster); pb(x, y, z2, plaster); } pb(x, 5, z1, "dark_oak_planks"); pb(x, 5, z2, "dark_oak_planks"); }
  for (z = z1; z <= z2; z++) { for (y = 2; y <= 4; y++) { pb(x1, y, z, plaster); pb(x2, y, z, plaster); } pb(x1, 5, z, "dark_oak_planks"); pb(x2, 5, z, "dark_oak_planks"); }
}
wallBox(6, 8, 25, 16);
wallBox(6, 17, 14, 27);
// ceilings
fill(7, 5, 9, 24, 5, 15, "dark_oak_planks");
fill(7, 5, 18, 13, 5, 26, "dark_oak_planks");
// pillars
var pxs = [6, 10, 15, 20, 25];
for (i = 0; i < pxs.length; i++) { for (y = 2; y <= 5; y++) { ps(pxs[i], y, 8, "dark_oak_log[axis=y]"); ps(pxs[i], y, 16, "dark_oak_log[axis=y]"); } }
for (z = 18; z <= 26; z += 4) { for (y = 2; y <= 5; y++) { ps(6, y, z, "dark_oak_log[axis=y]"); ps(14, y, z, "dark_oak_log[axis=y]"); } }
// paper panes: back wall, ondol front, side windows
var wx = [8, 9, 12, 13, 17, 18, 22, 23];
for (i = 0; i < wx.length; i++) { pb(wx[i], 3, 8, "white_stained_glass_pane"); pb(wx[i], 4, 8, "white_stained_glass_pane"); }
for (x = 16; x <= 24; x++) { if (x !== 20) { pb(x, 2, 16, "dark_oak_trapdoor[facing=south,half=bottom,open=false]"); pb(x, 3, 16, "white_stained_glass_pane"); pb(x, 4, 16, "white_stained_glass_pane"); } }
// ondol front door gap x=19..20 (2 wide)
for (y = 2; y <= 4; y++) { pb(19, y, 16, "air"); pb(20, y, 16, "air"); }
// hall -> kitchen door gap x=10..11 at z=16
for (y = 2; y <= 3; y++) { pb(10, y, 16, "air"); pb(11, y, 16, "air"); }
// hall <-> ondol doorway x=15, z=11..12
for (y = 2; y <= 3; y++) { pb(15, y, 11, "air"); pb(15, y, 12, "air"); }
// kitchen east door x=14 z=21..22
for (y = 2; y <= 3; y++) { pb(14, y, 21, "air"); pb(14, y, 22, "air"); }
// kitchen window slits
pb(6, 3, 21, "white_stained_glass_pane"); pb(6, 3, 22, "white_stained_glass_pane"); pb(10, 3, 27, "white_stained_glass_pane"); pb(11, 3, 27, "white_stained_glass_pane");
// === ROOFS ===
placeGableRoofNS(6, 25, 8, 16, 6, "polished_blackstone_brick_stairs", "polished_blackstone_brick_slab", "smooth_quartz");
placeGableRoof(6, 14, 17, 27, 6, "deepslate_tile_stairs", "deepslate_tile_slab", "smooth_quartz");
// ridge solid beams
for (x = 5; x <= 26; x++) { pb(x, 10, 12, "polished_blackstone_bricks"); }
for (z = 16; z <= 28; z++) { pb(10, 10, z, "deepslate_tiles"); }
// veranda posts at drip line + brackets (main wing south eave)
for (x = 16; x <= 25; x += 3) { for (y = 2; y <= 5; y++) { ps(x, y, 17, "dark_oak_log[axis=y]"); } ps(x, 5, 16, "dark_oak_stairs[facing=south,half=top]"); }
fill(16, 1, 17, 26, 1, 17, "oak_planks");
// === ONDOL ROOM ===
ps(21, 2, 10, "dark_oak_slab[type=bottom]"); ps(22, 2, 10, "dark_oak_slab[type=bottom]");
pb(21, 3, 10, "potted_bamboo"); pb(23, 2, 10, "lectern[facing=west]");
fill(18, 2, 12, 23, 2, 14, "gray_carpet"); pb(21, 2, 12, "red_carpet"); pb(22, 2, 12, "red_carpet");
for (z = 9; z <= 11; z++) { pb(24, 2, z, "bookshelf"); pb(24, 3, z, "bookshelf"); }
pb(24, 2, 14, "chest[facing=west]"); pb(24, 2, 15, "barrel[facing=up]");
ps(21, 4, 12, "lantern[hanging=true]");
// === HALL ===
ps(10, 2, 10, "spruce_slab[type=bottom]"); ps(11, 2, 10, "spruce_slab[type=bottom]"); pb(9, 2, 10, "brown_carpet"); pb(12, 2, 10, "brown_carpet");
pb(8, 2, 14, "chest[facing=south]"); pb(9, 2, 14, "barrel[facing=up]"); pb(13, 2, 14, "flower_pot");
ps(10, 4, 12, "lantern[hanging=true]");
// === KITCHEN ===
ps(8, 2, 26, "furnace[facing=north,lit=false]"); ps(9, 2, 26, "smoker[facing=north,lit=false]"); pb(10, 2, 26, "cauldron"); ps(11, 2, 26, "blast_furnace[facing=north,lit=false]");
pb(12, 2, 26, "barrel[facing=up]"); pb(12, 2, 25, "barrel[facing=up]"); pb(7, 2, 21, "crafting_table"); pb(7, 2, 22, "chest[facing=east]");
ps(10, 4, 22, "lantern[hanging=true]"); ps(10, 4, 18, "lantern[hanging=true]");
// === COURTYARD WALL ===
for (x = 2; x <= 37; x++) { pb(x, 1, 3, stoneP); pb(x, 2, 3, plaster); pb(x, 3, 3, "polished_blackstone_brick_slab"); pb(x, 1, 33, stoneP); pb(x, 2, 33, plaster); pb(x, 3, 33, "polished_blackstone_brick_slab"); }
for (z = 3; z <= 33; z++) { pb(2, 1, z, stoneP); pb(2, 2, z, plaster); pb(2, 3, z, "polished_blackstone_brick_slab"); pb(37, 1, z, stoneP); pb(37, 2, z, plaster); pb(37, 3, z, "polished_blackstone_brick_slab"); }
for (x = 25; x <= 27; x++) { for (y = 1; y <= 3; y++) { pb(x, y, 33, "air"); } }
// gate
for (y = 1; y <= 4; y++) { ps(24, y, 32, "dark_oak_log[axis=y]"); ps(28, y, 32, "dark_oak_log[axis=y]"); ps(24, y, 34, "dark_oak_log[axis=y]"); ps(28, y, 34, "dark_oak_log[axis=y]"); }
for (z = 32; z <= 34; z++) { for (x = 24; x <= 28; x++) { pb(x, 5, z, "dark_oak_planks"); } roofStair(23, 5, z, "polished_blackstone_brick_stairs", "west"); roofStair(29, 5, z, "polished_blackstone_brick_stairs", "east"); roofStair(24, 6, z, "deepslate_tile_stairs", "west"); roofStair(28, 6, z, "deepslate_tile_stairs", "east"); roofStair(25, 7, z, "polished_blackstone_brick_stairs", "west"); roofStair(27, 7, z, "polished_blackstone_brick_stairs", "east"); pb(26, 7, z, "polished_blackstone_bricks"); pb(25, 6, z, "polished_blackstone_bricks"); pb(26, 6, z, "polished_blackstone_bricks"); pb(27, 6, z, "polished_blackstone_bricks"); }
// path
for (z = 18; z <= 32; z++) { for (x = 25; x <= 27; x++) { pb(x, 0, z, (hh(x, 0, z) < 0.5) ? "stone_bricks" : "smooth_stone"); } }
for (x = 20; x <= 27; x++) { pb(x, 0, 18, "stone_bricks"); }
// persimmon tree
for (y = 1; y <= 6; y++) { ps(31, y, 26, "dark_oak_log[axis=y]"); }
ps(32, 6, 26, "dark_oak_log[axis=x]"); ps(30, 5, 26, "dark_oak_log[axis=x]");
var dx, dy, dz;
for (dx = -4; dx <= 4; dx++) { for (dy = -2; dy <= 3; dy++) { for (dz = -4; dz <= 4; dz++) {
  if (dx * dx + dz * dz + 2 * dy * dy <= 16 && hh(dx + 31, dy, dz + 26) > 0.18) {
    pb(31 + dx, 8 + dy, 26 + dz, "oak_leaves[persistent=true]");
    if (hh(31 + dx, 3 + dy, 26 + dz) > 0.92) { pb(31 + dx, 7 + dy, 26 + dz, "orange_terracotta"); }
  } } } }
// garden bits
for (i = 0; i < 4; i++) { pb(35, 1, 6 + i * 2, "brown_terracotta"); pb(35, 2, 6 + i * 2, "brown_terracotta"); pb(35, 3, 6 + i * 2, "smooth_stone_slab"); }
for (x = 29; x <= 35; x++) { pb(x, 1, 30, (hh(x, 1, 30) < 0.5) ? "azalea" : "flowering_azalea"); }
pb(22, 1, 20, "stone_bricks"); pb(22, 2, 20, "stone_brick_wall"); pb(22, 3, 20, "stone_brick_slab"); pb(22, 4, 20, "lantern");
// chimney
for (y = 1; y <= 9; y++) { fill(27, y, 9, 28, y, 10, stoneP); }
pb(27, 10, 9, "stone_brick_slab"); pb(28, 10, 9, "stone_brick_slab"); pb(27, 10, 10, "stone_brick_slab"); pb(28, 10, 10, "stone_brick_slab");

Static Renders

Hanok L-wing (indexed, sonnet-5-5) isometric viewisometric
Hanok L-wing (indexed, sonnet-5-5) front viewfront
Hanok L-wing (indexed, sonnet-5-5) side viewside
Hanok L-wing (indexed, sonnet-5-5) back viewback
Hanok L-wing (indexed, sonnet-5-5) top viewtop