← Whole house3D assetfogon/bidet
Bidet
Drag 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");import { draw } from "./assets/voxel";
import { bidet } from "./assets/bidet";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, bidet, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add bidet
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["bidet"] })
# It lands in client/assets/bidet.ts
# https://fogon.page/object/bidet