← Back to Gallery

Loading 3D viewer…

Gassho-zukuri farmhouse (guided)

by Jorge Barbero

Dimensions
64×48×64
Blocks
65,628
Compute Time
8.6s
Generation Time
8m 26s
Edits
1
Model
claude-opus-5
Created
September 7, 2026
japanesegassho-zukurifarmhouseautoevalguided
Prompt

User Prompt

a snow-country Japanese gassho-zukuri farmhouse: an enormous steep thatched A-frame roof pitched near 60 degrees reaching almost to the ground, dark timber post-and-beam gable ends with white plaster infill and lattice shoji windows, two habitable floors — an irori hearth room with tatami below and a silkworm loft above reached by a steep timber stair — on a stone-edged plot with a vegetable patch and a stone-lined water channel

Enhanced Prompt

GUIDED condition. Docs read: build-rules/Essential Build Rules, architecture-guide/6. Japanese, shape-techniques/Roof Types, interior-design/Room-by-Room, landscape-environment/Natural Terrain (superpowers), worldedit-api/Position Palettes. Process: DIRECT with position palettes applied inline (stair roof forbids replaceMasked). Terrain via hills+flatten+blob+surface with a known flat pad Y=12. Roof at 2:1 pitch (~63 deg) hand-composed from roofStair columns, solid ridge beam cap. staircase() for the loft stair.

Photos

Exterior
Exteriorexterior
Irori hearth room
Irori hearth roominterior
Stair to the loft
Stair to the loftinterior
Silkworm loft
Silkworm loftinterior
CraftScript Source
// === BUILD PLAN ===
// Style: Japanese gassho-zukuri (snow-country minka), Shirakawa-go type
// Footprint: 19x25 rectangular core (x10..28, z12..36) + 1-wide engawa veranda east
//            + huge roof spilling to x8..30 / z11..37 (eaves nearly to the ground)
// Height: ground floor walls Y13..18 | loft floor Y19 | eaves Y15 | RIDGE Y38 (roof rise 23 over
//         half-span 11 = 2:1 = ~63 deg, the gassho "praying hands" pitch)
//
// CROSS SECTION (X, ridge along Z):
//                      /\   <- Y38 solid ridge beam (no ridge gap)
//                     /  \
//                    / TR \  truss tie-beams + king post
//                   /LOFT  \ <- silkworm loft, floor Y19 walk Y20
//                  /========\
//                 |  IRORI   | <- ground floor, walk Y14, exposed joists Y18
//        eave Y15 /___________\ eave Y15  (roof passes OUTSIDE the walls, 2 blocks proud)
//                 Y12 ground pad
//
// GROUND FLOOR (top-down, z increases downward, 1 char = 1 block):
//   #########G#########   G = gable plane z=11 (huge timber+plaster triangle)
//   #.....S...........#   S = staircase to loft (x13, z20->14, dir north)
//   D..DOMA (earth floor, kitchen, woodwork)....#   D = main door west, x10 z17
//   #.................#
//   #.....IRORI hearth (sunken campfire + pot chain)...#   E = engawa door east
//   #.......tatami....E
//   #..fusuma screen..#
//   #..sleeping / storage: futons, chests, shelfwall..#
//   #########G#########
//
// MATERIALS PLAN:
//   thatch roof : noisePalette hay_block(45)+rooted_dirt(20)+packed_mud(20)+dirt(15)
//                 WHY: only golden/brown fibrous blocks read as thick straw; noise = weathering
//   roof stairs : bamboo_mosaic / bamboo / spruce picked per column (facing preserved via roofStair)
//   roof snow   : snow[layers=2] on the exposed tread of each step -> snow-country reading
//   rafters     : spruce_planks one row under the thatch -> 3-thick roof, solid underside
//   plaster     : white_terracotta(55)+calcite(20)+smooth_quartz(15)+bone_block(10)
//                 WHY: light infill CONTRASTS the near-black timber; that contrast IS the style
//   timber      : dark_oak_log posts every 3 + nuki rails + knee braces proud of the wall (relief)
//   plinth      : gradient mossy_cobblestone -> cobblestone -> andesite, grounds the build
//   tatami      : green/lime carpet ; doma floor = packed_mud/coarse_dirt
// Rooms: DOMA (furnace, smoker, cauldron, barrels, woodpile, crafting) | IRORI (sunken hearth,
//        pot on chain, zabuton, chabudai, tokonoma alcove) | SLEEPING (2 futons, chests, shelfwall)
//        | LOFT (silkworm trays, hay, barrels, lanterns, gable window bands)
// STAIR PLAN: walk 14 -> walk 20, delta 6 -> staircase(13,20,14,20,'north'), 7 cells, auto floor hole
// === END PLAN ===

// ---------- Y / X / Z CONTRACT ----------
var padY = 12;                 // top ground block (flat pad, known Y)
var floorY = padY + 1;         // 13 - floor blocks
var walkY = floorY + 1;        // 14 - furniture + doors here
var wallTopY = 18;             // last wall row (5 blocks of interior air 14..18)
var loftFloorY = 19;
var loftWalkY = 20;
var wx1 = 10, wx2 = 28, wz1 = 12, wz2 = 36;
var cx = 19;
var ex1 = 8, ex2 = 30;         // eave X (roof 2 blocks proud of the walls)
var rz1 = wz1 - 1, rz2 = wz2 + 1;
var eaveY = 15;
var ridgeY = eaveY + 23;       // 38

function roofBottom(x) {       // lowest roof block at column x
    var s = Math.min(x - ex1, ex2 - x);
    if (s < 0) return 0;
    return eaveY + 2 * s;
}
function triLeft(y) { return ex1 + (Math.floor((y - eaveY) / 2) + 1); }
function triRight(y) { return ex2 - (Math.floor((y - eaveY) / 2) + 1); }

var plaster = noisePalette([{block:'white_terracotta',weight:55},{block:'calcite',weight:20},{block:'smooth_quartz',weight:15},{block:'bone_block',weight:10}], {seed:31, freq:0.17});
var thatch  = noisePalette([{block:'hay_block',weight:45},{block:'rooted_dirt',weight:20},{block:'packed_mud',weight:20},{block:'dirt',weight:15}], {seed:11, freq:0.15});
var stoneMix = noisePalette([{block:'cobblestone',weight:40},{block:'mossy_cobblestone',weight:25},{block:'andesite',weight:20},{block:'stone',weight:15}], {seed:5, freq:0.2});
var deckMix = noisePalette([{block:'spruce_planks',weight:60},{block:'dark_oak_planks',weight:25},{block:'stripped_spruce_log',weight:15}], {seed:9, freq:0.2});
var tatami  = noisePalette([{block:'green_carpet',weight:70},{block:'lime_carpet',weight:30}], {seed:3, freq:0.25});

function roofStairId(x, z) {
    var n = (x * 13 + z * 29) % 10;
    if (n < 5) return 'bamboo_mosaic_stairs';
    if (n < 8) return 'bamboo_stairs';
    return 'spruce_stairs';
}

var x, y, z, i, s;

// ================= TERRAIN (superpowers, flat pad at a KNOWN Y) =================
var land = blob(28, 26, 32, {irregularity:0.42, seed:9});
var hf = hills({base: padY, amp: 3, scale: 0.045, seed: 21});
var pad = flatten(hf, {x0:2, z0:4, x1:48, z1:48}, padY, 10);
var groundPat = patches([['snow_block',7],['grass_block',3],['podzol',2],['coarse_dirt',1]], 0.07, 5);
surface(land, pad, function (gx, gz) { return groundPat(gx, gz); }, {sub:'dirt', deep:'stone', depth:5});

// stone-lined water channel running north-south, west of the house
fill(4, padY - 1, 6, 5, padY - 1, 44, 'stone');
fill(4, padY, 6, 5, padY, 44, 'water');
fill(3, padY, 6, 3, padY, 44, stoneMix);
fill(6, padY, 6, 6, padY, 44, stoneMix);
for (z = 6; z <= 44; z += 3) { ps(3, padY + 1, z, 'cobblestone_slab[type=bottom]'); ps(6, padY + 1, z + 1, 'mossy_cobblestone_slab[type=bottom]'); }
// little stone bridge on the entrance axis
fill(3, padY + 1, 16, 6, padY + 1, 18, 'stone_brick_slab[type=top]');
// approach path
fill(7, padY, 16, 9, padY, 18, stoneMix);
pb(9, floorY, 17, 'stone_bricks');            // door step (outside walk becomes 14)

// ================= PLINTH + FLOOR =================
fill(wx1 - 1, floorY - 1, wz1 - 1, wx2 + 1, floorY - 1, wz2 + 1, stoneMix);
fill(wx1 - 1, floorY, wz1 - 1, wx2 + 1, floorY, wz2 + 1, gradientPalette(floorY - 1, floorY, [{block:'mossy_cobblestone',from:0},{block:'cobblestone',from:0.4},{block:'andesite',from:0.8}], {noise:0.3, seed:4}));
// doma = beaten earth, rest = plank sub-floor
fill(wx1 + 1, floorY, wz1 + 1, wx2 - 1, floorY, 19, noisePalette([{block:'packed_mud',weight:55},{block:'coarse_dirt',weight:30},{block:'dirt_path',weight:15}], {seed:7, freq:0.2}));
fill(wx1 + 1, floorY, 20, wx2 - 1, floorY, wz2 - 1, deckMix);

// ================= WALLS: plaster infill =================
fill(wx1, walkY, wz1, wx2, wallTopY, wz1, plaster);
fill(wx1, walkY, wz2, wx2, wallTopY, wz2, plaster);
fill(wx1, walkY, wz1, wx1, wallTopY, wz2, plaster);
fill(wx1 + 18, walkY, wz1, wx2, wallTopY, wz2, plaster);

// timber post-and-beam frame + knee braces PROUD of the wall (facade relief)
function postCol(px, pz, topY, outX, outZ) {
    for (y = floorY; y <= topY; y++) ps(px, y, pz, 'dark_oak_log[axis=y]');
    // knee brace sticking out 1 block -> wall depth
    if (outX !== 0) ps(px + outX, topY - 1, pz, 'dark_oak_fence');
    if (outZ !== 0) ps(px, topY - 1, pz + outZ, 'dark_oak_fence');
}
for (z = wz1; z <= wz2; z += 3) { postCol(wx1, z, wallTopY, -1, 0); postCol(wx2, z, wallTopY, 1, 0); }
for (x = wx1; x <= wx2; x += 3) { postCol(x, wz1, wallTopY, 0, -1); postCol(x, wz2, wallTopY, 0, 1); }
// nuki rails (horizontal) + top plate
for (x = wx1; x <= wx2; x++) { ps(x, wallTopY, wz1, 'dark_oak_log[axis=x]'); ps(x, wallTopY, wz2, 'dark_oak_log[axis=x]'); ps(x, 15, wz1, 'dark_oak_log[axis=x]'); ps(x, 15, wz2, 'dark_oak_log[axis=x]'); }
for (z = wz1; z <= wz2; z++) { ps(wx1, wallTopY, z, 'dark_oak_log[axis=z]'); ps(wx2, wallTopY, z, 'dark_oak_log[axis=z]'); ps(wx1, 15, z, 'dark_oak_log[axis=z]'); ps(wx2, 15, z, 'dark_oak_log[axis=z]'); }
// stone splash course at the wall foot
for (x = wx1; x <= wx2; x++) { pb(x, walkY, wz1, stoneMix); pb(x, walkY, wz2, stoneMix); }
for (z = wz1; z <= wz2; z++) { pb(wx1, walkY, z, stoneMix); pb(wx2, walkY, z, stoneMix); }

// shoji windows on the long walls (recessed pane between the posts)
function shoji(px, pz, dirAxis) {
    for (y = 16; y <= 17; y++) {
        ps(px, y, pz, 'white_stained_glass_pane');
        if (dirAxis === 'z') ps(px, y, pz + 1, 'white_stained_glass_pane'); else ps(px + 1, y, pz, 'white_stained_glass_pane');
    }
    // sill
    if (dirAxis === 'z') { ps(px, 15, pz, 'spruce_slab[type=top]'); ps(px, 15, pz + 1, 'spruce_slab[type=top]'); }
}
var wzList = [16, 22, 25, 31, 34];
for (i = 0; i < wzList.length; i++) { shoji(wx1, wzList[i], 'z'); shoji(wx2, wzList[i], 'z'); }
shoji(wx1, 13, 'z');

// doors: main entrance west (doma), garden door east (engawa)
fill(wx1, walkY, 17, wx1, walkY + 1, 17, 'air');
ps(wx1, walkY, 17, 'dark_oak_door[facing=east,half=lower,hinge=left]');
ps(wx1, walkY + 1, 17, 'dark_oak_door[facing=east,half=upper,hinge=left]');
fill(wx2, walkY, 24, wx2, walkY + 1, 24, 'air');
ps(wx2, walkY, 24, 'dark_oak_door[facing=west,half=lower,hinge=right]');
ps(wx2, walkY + 1, 24, 'dark_oak_door[facing=west,half=upper,hinge=right]');

// engawa (veranda) under the east eave
fill(29, floorY, 16, 29, floorY, 32, deckMix);
for (z = 16; z <= 32; z += 4) ps(29, floorY + 1, z, 'spruce_fence');

// ================= LOFT FLOOR =================
fill(wx1 + 1, loftFloorY, wz1, wx2 - 1, loftFloorY, wz2, deckMix);

// ================= ROOF: 2:1 gassho pitch, solid ridge =================
for (z = rz1; z <= rz2; z++) {
    for (s = 0; s <= 10; s++) {
        var xw = ex1 + s, xe = ex2 - s, y0 = eaveY + 2 * s;
        pb(xw, y0, z, thatch); roofStair(xw, y0 + 1, z, roofStairId(xw, z), 'west');
        pb(xe, y0, z, thatch); roofStair(xe, y0 + 1, z, roofStairId(xe, z), 'east');
        if (s >= 1) { pb(xw, y0 - 1, z, 'spruce_planks'); pb(xe, y0 - 1, z, 'spruce_planks'); }
        if (((xw * 7 + z * 5) % 10) < 4) ps(xw, y0 + 2, z, 'snow[layers=2]');
        if (((xe * 7 + z * 5) % 10) < 4) ps(xe, y0 + 2, z, 'snow[layers=2]');
    }
    pb(cx, ridgeY - 2, z, 'spruce_planks');
    pb(cx, ridgeY - 1, z, thatch);
    ps(cx, ridgeY, z, 'stripped_spruce_log[axis=z]');   // SOLID ridge beam - no ridge gap
}
// barge boards on the two gable edges
for (s = 0; s <= 10; s++) {
    ps(ex1 + s, eaveY + 2 * s + 2, rz1, 'dark_oak_slab[type=bottom]');
    ps(ex2 - s, eaveY + 2 * s + 2, rz1, 'dark_oak_slab[type=bottom]');
    ps(ex1 + s, eaveY + 2 * s + 2, rz2, 'dark_oak_slab[type=bottom]');
    ps(ex2 - s, eaveY + 2 * s + 2, rz2, 'dark_oak_slab[type=bottom]');
}

// ================= GABLE ENDS (the iconic timber+plaster triangles) =================
var gz = [rz1, rz2];
for (i = 0; i < 2; i++) {
    var gzz = gz[i];
    for (x = ex1; x <= ex2; x++) {
        var yTop = roofBottom(x) - 1;
        if (yTop >= floorY) fill(x, floorY, gzz, x, yTop, gzz, plaster);
    }
    // vertical timber posts
    var pxs = [10, 13, 16, 19, 22, 25, 28];
    for (var pi = 0; pi < pxs.length; pi++) {
        for (y = floorY; y <= roofBottom(pxs[pi]) - 1; y++) ps(pxs[pi], y, gzz, 'dark_oak_log[axis=y]');
    }
    // horizontal beams + window bands
    var beamYs = [19, 24, 29, 33];
    for (var bi = 0; bi < beamYs.length; bi++) {
        var by = beamYs[bi];
        for (x = triLeft(by); x <= triRight(by); x++) ps(x, by, gzz, 'dark_oak_log[axis=x]');
    }
    var winYs = [20, 21, 25, 26, 30, 31];
    for (var wi = 0; wi < winYs.length; wi++) {
        var wy = winYs[wi];
        for (x = triLeft(wy); x <= triRight(wy); x++) {
            if (x === 10 || x === 13 || x === 16 || x === 19 || x === 22 || x === 25 || x === 28) continue;
            ps(x, wy, gzz, 'white_stained_glass_pane');
        }
    }
}

// ================= CLEAR INTERIOR (roof/terrain must never intrude) =================
fill(wx1 + 1, walkY, wz1 + 1, wx2 - 1, wallTopY, wz2 - 1, 'air');
for (x = wx1 + 1; x <= wx2 - 1; x++) {
    var topFree = roofBottom(x) - 2;
    if (topFree >= loftWalkY) fill(x, loftWalkY, wz1, x, topFree, wz2, 'air');
}

// exposed ceiling joists over the ground floor
for (z = 16; z <= 34; z += 4) for (x = wx1 + 1; x <= wx2 - 1; x++) ps(x, wallTopY, z, 'dark_oak_log[axis=x]');
// roof trusses in the upper void
for (z = 15; z <= 34; z += 5) {
    for (x = 15; x <= 23; x++) ps(x, 27, z, 'dark_oak_log[axis=x]');
    for (y = 28; y <= 34; y++) ps(cx, y, z, 'dark_oak_log[axis=y]');
    for (x = 16; x <= 22; x++) ps(x, 31, z, 'dark_oak_log[axis=x]');
}

// ================= STAIR TO THE LOFT =================
staircase(13, 20, walkY, loftWalkY, 'north', {material: 'dark_oak_stairs', width: 1});
// railing around the loft opening
for (z = 14; z <= 20; z++) { ps(12, loftWalkY, z, 'dark_oak_fence'); ps(14, loftWalkY, z, 'dark_oak_fence'); }
ps(13, loftWalkY, 21, 'dark_oak_fence');

// ================= GROUND FLOOR INTERIOR =================
// -- tatami in the living half
fill(wx1 + 1, walkY, 21, wx2 - 1, walkY, wz2 - 1, tatami);

// -- DOMA: kitchen run along the east wall
ps(26, walkY, 14, 'furnace[facing=west,lit=true]');
ps(26, walkY, 15, 'smoker[facing=west,lit=true]');
pb(26, walkY, 16, 'stripped_spruce_log');
ps(26, walkY + 1, 16, 'spruce_stairs[facing=west,half=top]');
ps(26, walkY, 17, 'water_cauldron[level=3]');
pb(26, walkY, 18, 'barrel');
pb(25, walkY, 14, 'crafting_table');
pb(25, walkY, 18, 'chest');
ps(24, walkY, 16, 'cartography_table');
// woodpile + tools in the doma
fill(11, walkY, 14, 12, walkY + 1, 16, 'stripped_spruce_log[axis=z]');
ps(11, walkY, 18, 'composter');
ps(16, walkY, 15, 'cauldron[level=0]');
ps(24, walkY, 19, 'lectern[facing=west]');
// hanging lanterns in the doma
pb(20, wallTopY - 1, 16, 'chain[axis=y]'); ps(20, wallTopY - 2, 16, 'lantern[hanging=true]');
pb(17, wallTopY - 1, 19, 'chain[axis=y]'); ps(17, wallTopY - 2, 19, 'lantern[hanging=true]');

// -- IRORI hearth room (z 22..28)
fill(18, floorY, 24, 20, floorY, 26, 'polished_andesite');
fill(18, walkY, 24, 20, walkY, 26, 'air');
ps(19, floorY, 25, 'campfire[lit=true]');
for (y = 15; y <= 17; y++) ps(19, y, 25, 'chain[axis=y]');
ps(19, walkY, 25, 'air');
ps(19, 15, 25, 'chain[axis=y]');
ps(19, 14, 25, 'air');
ps(18, walkY, 25, 'brown_carpet'); ps(20, walkY, 25, 'brown_carpet');
ps(19, walkY, 24, 'brown_carpet'); ps(19, walkY, 26, 'brown_carpet');
// chabudai low table + cushions
ps(23, walkY, 25, 'spruce_slab[type=bottom]'); ps(23, walkY, 26, 'spruce_slab[type=bottom]');
ps(24, walkY, 25, 'red_carpet'); ps(22, walkY, 26, 'red_carpet');
// tokonoma alcove on the west wall
ps(12, walkY, 24, 'spruce_slab[type=top]');
ps(12, walkY + 1, 24, 'flower_pot');
ps(11, walkY + 2, 25, 'white_wall_banner[facing=east]');
ps(12, walkY, 26, 'potted_bamboo');
// hearth room lighting
pb(22, wallTopY - 1, 23, 'chain[axis=y]'); ps(22, wallTopY - 2, 23, 'lantern[hanging=true]');
pb(16, wallTopY - 1, 27, 'chain[axis=y]'); ps(16, wallTopY - 2, 27, 'lantern[hanging=true]');

// -- fusuma screen (partial, never blocks the walking route)
for (x = 21; x <= 27; x++) for (y = walkY; y <= walkY + 2; y++) ps(x, y, 29, 'white_stained_glass_pane');
for (y = walkY; y <= walkY + 2; y++) ps(20, y, 29, 'dark_oak_log[axis=y]');

// -- SLEEPING / STORAGE (z 30..35)
placeBed(13, walkY, 33, 'white', 'north');
placeBed(16, walkY, 33, 'white', 'north');
pb(12, walkY, 31, 'chest'); pb(12, walkY, 32, 'chest');
shelfWall(22, walkY, 35, 26, walkY + 2, 35, 'bookshelf');
ps(24, walkY, 33, 'lectern[facing=north]');
ps(21, walkY, 31, 'barrel[facing=up]');
pb(19, wallTopY - 1, 33, 'chain[axis=y]'); ps(19, wallTopY - 2, 33, 'lantern[hanging=true]');
ps(18, walkY, 30, 'potted_fern');
rug(14, walkY, 30, 17, walkY, 31, 'red_carpet');

// ================= LOFT (silkworm floor) =================
// silkworm rearing trays: stacked trapdoor shelves along both slopes
for (z = 15; z <= 34; z += 2) {
    ps(15, loftWalkY, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
    ps(23, loftWalkY, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
    ps(15, loftWalkY + 1, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
    ps(23, loftWalkY + 1, z, 'spruce_trapdoor[facing=north,half=bottom,open=false]');
}
for (z = 16; z <= 33; z += 3) { pb(16, loftWalkY, z, 'hay_block[axis=y]'); pb(22, loftWalkY, z, 'hay_block[axis=y]'); }
pb(19, loftWalkY, 17, 'barrel'); pb(20, loftWalkY, 17, 'barrel'); pb(19, loftWalkY, 18, 'chest');
pb(18, loftWalkY, 31, 'barrel'); pb(20, loftWalkY, 32, 'chest');
ps(19, loftWalkY, 28, 'loom[facing=south]');
ps(20, loftWalkY, 28, 'crafting_table');
rug(17, loftWalkY, 23, 21, loftWalkY, 26, 'brown_carpet');
for (z = 18; z <= 33; z += 5) { pb(19, 26, z, 'chain[axis=y]'); ps(19, 25, z, 'lantern[hanging=true]'); }

// ================= EXTERIOR: garden, crops, lanterns, boundary =================
// vegetable patch east of the house
fill(34, padY, 16, 44, padY, 30, 'farmland[moisture=7]');
fill(39, padY, 16, 39, padY, 30, 'water');
for (x = 34; x <= 44; x++) {
    if (x === 39) continue;
    for (z = 16; z <= 30; z++) {
        var cm = (x + z) % 4;
        if (cm === 0) ps(x, padY + 1, z, 'wheat[age=7]');
        else if (cm === 1) ps(x, padY + 1, z, 'carrots[age=7]');
        else if (cm === 2) ps(x, padY + 1, z, 'potatoes[age=7]');
        else ps(x, padY + 1, z, 'beetroots[age=3]');
    }
}
// stone-edged plot boundary
for (x = 2; x <= 46; x++) { ps(x, padY + 1, 6, 'mossy_cobblestone_wall'); ps(x, padY + 1, 44, 'mossy_cobblestone_wall'); }
for (z = 6; z <= 44; z++) { ps(46, padY + 1, z, 'mossy_cobblestone_wall'); }
fill(20, padY + 1, 6, 22, padY + 1, 6, 'air');   // gate gap
ps(19, padY + 1, 6, 'dark_oak_fence'); ps(23, padY + 1, 6, 'dark_oak_fence');
// stone lanterns (toro) - solid support under every light, never floating
function toro(tx, tz) {
    pb(tx, padY + 1, tz, 'stone_bricks');
    ps(tx, padY + 2, tz, 'cobblestone_wall');
    ps(tx, padY + 3, tz, 'stone_brick_slab[type=bottom]');
    ps(tx, padY + 4, tz, 'lantern');
    ps(tx, padY + 5, tz, 'stone_brick_slab[type=top]');
}
toro(33, 20); toro(33, 34); toro(7, 22);
// trees + shrubs
makeSphere(35, padY + 7, 38, noisePalette([{block:'spruce_leaves[persistent=true]',weight:80},{block:'snow_block',weight:20}], {seed:2, freq:0.3}), 4, true);
fill(35, padY + 1, 38, 35, padY + 6, 38, 'spruce_log[axis=y]');
makeSphere(14, padY + 6, 41, noisePalette([{block:'oak_leaves[persistent=true]',weight:70},{block:'snow_block',weight:30}], {seed:6, freq:0.3}), 3, true);
fill(14, padY + 1, 41, 14, padY + 5, 41, 'oak_log[axis=y]');
for (z = 10; z <= 42; z += 6) { ps(32, padY + 1, z, 'bamboo[age=1,leaves=large]'); ps(32, padY + 2, z, 'bamboo[age=1,leaves=large]'); }
// drying racks + snow drifts against the north gable
fill(12, padY + 1, 40, 24, padY + 1, 40, 'spruce_fence');
for (x = 12; x <= 24; x += 2) ps(x, padY + 2, 40, 'hay_block[axis=x]');
for (x = 6; x <= 33; x++) { if ((x * 3 + 7) % 5 < 2) { ps(x, padY + 1, 9, 'snow[layers=3]'); ps(x, padY + 1, 40, 'snow[layers=2]'); } }


// ===== FIX PASS: snow-country dressing + a yard that is actually used =====
var fx, fz;
for (fz = 6; fz <= 45; fz++) { ps(2, padY + 1, fz, 'snow[layers=3]'); ps(45, padY + 1, fz, 'snow[layers=3]'); }
for (fx = 2; fx <= 45; fx++) { ps(fx, padY + 1, 5, 'snow[layers=3]'); ps(fx, padY + 1, 45, 'snow[layers=3]'); }
// drifts banked against the eaves and the two gable ends
for (fx = 7; fx <= 31; fx++) { ps(fx, padY + 1, 9, 'snow[layers=4]'); ps(fx, padY + 1, 39, 'snow[layers=4]'); }
for (fz = 10; fz <= 38; fz++) { ps(7, padY + 1, fz, 'snow[layers=4]'); ps(32, padY + 1, fz, 'snow[layers=3]'); }
// swept stone forecourt in front of the door
fill(7, padY, 15, 9, padY, 19, 'stone_bricks');
for (fz = 15; fz <= 19; fz += 2) ps(7, padY + 1, fz, 'stone_brick_slab[type=bottom]');
// woodshed lean-to against the north gable
fill(12, floorY, 42, 20, floorY, 44, 'spruce_planks');
for (fx = 12; fx <= 20; fx += 4) fill(fx, floorY + 1, 42, fx, floorY + 3, 44, 'spruce_fence');
for (fx = 12; fx <= 20; fx++) { ps(fx, floorY + 4, 42, 'spruce_stairs[facing=north,half=top]'); ps(fx, floorY + 4, 43, 'spruce_slab[type=top]'); ps(fx, floorY + 4, 44, 'spruce_stairs[facing=south,half=top]'); }
fill(13, floorY + 1, 43, 19, floorY + 2, 44, 'stripped_spruce_log[axis=x]');
for (fx = 13; fx <= 19; fx += 3) ps(fx, floorY + 3, 43, 'snow[layers=2]');
// straw stacks, a cart load and a couple more trees in the yard
fill(37, padY + 1, 10, 39, padY + 3, 12, 'hay_block[axis=y]');
for (fx = 37; fx <= 39; fx++) ps(fx, padY + 4, 11, 'snow[layers=3]');
ps(36, padY + 1, 13, 'hay_block[axis=x]'); ps(40, padY + 1, 13, 'hay_block[axis=z]');
fill(24, padY + 1, 42, 27, padY + 1, 42, 'spruce_fence');
ps(25, padY + 2, 42, 'hay_block[axis=x]'); ps(26, padY + 2, 42, 'hay_block[axis=x]');
fill(41, padY + 1, 36, 41, padY + 6, 36, 'spruce_log[axis=y]');
makeSphere(41, padY + 8, 36, noisePalette([{block:'spruce_leaves[persistent=true]',weight:60},{block:'snow_block',weight:40}], {seed:12, freq:0.3}), 4, true);
fill(10, padY + 1, 12, 10, padY + 5, 12, 'oak_log[axis=y]');
makeSphere(10, padY + 7, 12, noisePalette([{block:'oak_leaves[persistent=true]',weight:55},{block:'snow_block',weight:45}], {seed:15, freq:0.3}), 3, true);
toro(35, 26); toro(11, 41);

Static Renders

Gassho-zukuri farmhouse (guided) isometric viewisometric
Gassho-zukuri farmhouse (guided) front viewfront
Gassho-zukuri farmhouse (guided) side viewside
Gassho-zukuri farmhouse (guided) back viewback
Gassho-zukuri farmhouse (guided) top viewtop