fogón

← Whole house3D assetfogon/bidet

Bidet

by fogonCC010154 blocks
BidetDrag to turn it
// «Bidet» · gpt-6-sol (medium)
// A white bidet: a low glossy white oval ceramic bowl standing on a pedestal, with a chrome faucet with two little knobs at the back and a small soap dish next to it.

// Pedestal: broad at the floor, tucked in beneath the bowl.
for (let z = 0; z <= 12; z++) {
  const rx = z < 3 ? 10 : z < 8 ? 8 : 11;
  const ry = z < 3 ? 11 : z < 8 ? 9 : 12;
  for (let x = 13; x <= 35; x++) {
    for (let y = 11; y <= 35; y++) {
      const d = ((x - 24) / rx) ** 2 + ((y - 23) / ry) ** 2;
      if (d <= 1) {
        let color = z < 2 ? "#cbd2d4" : z < 8 ? "#e5e9e9" : "#f1f3f2";
        if (rand() < 0.045) color = "#ffffff";
        set(x, y, z, color);
      }
    }
  }
}
for (let z = 0; z <= 2; z++) {
  for (let x = 14; x <= 34; x++) {
    for (let y = 12; y <= 34; y++) {
      const d = ((x - 24) / 10) ** 2 + ((y - 23) / 11) ** 2;
      if (d > 0.77 && d <= 1) set(x, y, z, "#bfc8ca");
    }
  }
}

// Rounded ceramic body.
ellipsoid(24, 22, 14, 17, 19, 7, "#ebeff0");
forEach((x, y, z, color) => {
  if (z >= 9 && z <= 20 && ((x - 24) / 17) ** 2 + ((y - 22) / 19) ** 2 < 1.05) {
    if (z >= 17 && rand() < 0.18) set(x, y, z, "#f8faf9");
    else if (z <= 12 && rand() < 0.12) set(x, y, z, "#dbe1e2");
  }
});

// Broad, level oval rim and its gently raised lip.
for (let x = 7; x <= 41; x++) {
  for (let y = 3; y <= 41; y++) {
    const outer = ((x - 24) / 17) ** 2 + ((y - 22) / 19) ** 2;
    if (outer <= 1) {
      set(x, y, 19, "#f5f7f6");
      set(x, y, 20, "#ffffff");
      if (((x - 24) / 16.5) ** 2 + ((y - 22) / 18.5) ** 2 <= 1) {
        set(x, y, 21, y < 22 ? "#ffffff" : "#f1f4f4");
      }
    }
  }
}

// Scoop out the basin. Its bottom rises gradually toward the sides.
for (let x = 10; x <= 38; x++) {
  for (let y = 6; y <= 38; y++) {
    const d = ((x - 24) / 13) ** 2 + ((y - 22) / 15) ** 2;
    if (d > 1) continue;

    const bottom = 11 + Math.floor(6 * d);
    for (let z = bottom + 1; z <= 22; z++) set(x, y, z, null);
    set(x, y, bottom, d < 0.55 ? "#e8f2f3" : "#eaf0f0");

    if (d > 0.88) {
      for (let z = bottom + 1; z <= 19; z++) {
        set(x, y, z, z >= 18 ? "#ffffff" : "#e2e9ea");
      }
    }
  }
}

// Bright edging around the opening.
for (let x = 7; x <= 41; x++) {
  for (let y = 3; y <= 41; y++) {
    const outer = ((x - 24) / 17) ** 2 + ((y - 22) / 19) ** 2;
    const inner = ((x - 24) / 13) ** 2 + ((y - 22) / 15) ** 2;
    if (outer <= 1 && inner > 1) {
      if (inner < 1.24) set(x, y, 21, "#dfe7e8");
      else if (y < 22 || x < 24) set(x, y, 21, "#ffffff");
    }
  }
}

// Little chrome drain at the bottom.
for (let x = 21; x <= 27; x++) {
  for (let y = 19; y <= 25; y++) {
    const d = (x - 24) ** 2 + (y - 22) ** 2;
    if (d <= 9) set(x, y, 12, d <= 2 ? "#778b90" : "#b9c8ca");
  }
}
set(23, 21, 12, "#e9f3f3");
set(25, 21, 12, "#e9f3f3");

// Chunky chrome mixer at the back, with a spout reaching over the bowl.
box(21, 38, 21, 27, 42, 23, "#aebdc1");
box(22, 38, 23, 26, 41, 24, "#e3ebeb");
cylinder(24, 40, 24, 2, 5, "#9bafb4");
box(23, 39, 25, 24, 40, 28, "#e2eeee");
box(23, 34, 27, 25, 40, 29, "#a9bdc0");
box(23, 34, 29, 25, 38, 29, "#f3faf9");
box(23, 33, 25, 25, 35, 27, "#a9babc");
set(24, 33, 24, "#71878b");
set(23, 34, 27, "#ffffff");

// Two easy-to-read hot and cold knobs.
for (const [x, cap] of [[16, "#efa08d"], [32, "#92cddd"]]) {
  cylinder(x, 39, 21, 2, 3, "#b0bec1");
  cylinder(x, 39, 24, 3, 2, "#e1ebeb");
  cylinder(x, 39, 26, 2, 1, "#f9ffff");
  set(x, 38, 27, cap);
  set(x, 39, 27, cap);
}

// A small ceramic soap dish beside the faucet.
for (let x = 31; x <= 41; x++) {
  for (let y = 37; y <= 44; y++) {
    const d = ((x - 36) / 5) ** 2 + ((y - 40.5) / 3.5) ** 2;
    if (d <= 1) {
      set(x, y, 22, "#cbd6d7");
      set(x, y, 23, "#f2f6f5");
      if (d > 0.43) set(x, y, 24, "#ffffff");
      else set(x, y, 24, "#dce7e6");
    }
  }
}
// Rounded peach soap.
ellipsoid(36, 40, 25, 3, 2, 1, "#f2bdaa");
box(35, 39, 26, 37, 40, 26, "#ffdaca");