← Whole house3D assetfogon/rack-de-tele
Rack de tele
Drag to turn it// «Rack de tele» · gpt-6-sol (medium)
// A low wide TV cabinet in light oak: long and low, with two sliding doors with round holes as handles on the sides and an open middle niche holding a black game console and a small plant. Thin black metal legs.
const oak = "#d9a965";
const oakLight = "#edc382";
const oakMid = "#c99656";
const oakShade = "#ad7945";
const walnut = "#795338";
const recess = "#594b3c";
const metal = "#292d30";
// Four slim, slightly splayed black metal legs.
for (const x of [7, 39]) {
for (const y of [18, 29]) {
box(x, y, 0, x + 1, y + 1, 6, metal);
box(x, y, 0, x + 1, y + 1, 1, "#414447");
set(x, y, 5, "#55585a");
}
}
// Solid cabinet carcass, with a recessed open middle compartment.
box(3, 15, 7, 44, 32, 20, oak);
box(18, 15, 10, 29, 29, 18, null);
box(18, 29, 10, 29, 29, 18, recess);
box(18, 16, 9, 29, 29, 9, oakLight);
box(18, 16, 19, 29, 29, 19, oakShade);
for (let y = 16; y <= 29; y++) {
for (let z = 10; z <= 18; z++) {
set(18, y, z, oakShade);
set(29, y, z, oakShade);
}
}
box(19, 29, 11, 28, 29, 17, "#78644c");
// Two chunky sliding door panels.
for (const [x0, x1] of [[4, 17], [30, 43]]) {
box(x0, 14, 9, x1, 15, 19, oakMid);
box(x0 + 1, 13, 10, x1 - 1, 14, 18, oakLight);
box(x0 + 1, 13, 10, x1 - 1, 10, oak);
box(x0 + 1, 13, 18, x1 - 1, 18, "#f2ce91");
for (let x = x0 + 2; x < x1; x++) {
if (rand() < 0.38) {
const z = 11 + Math.floor(rand() * 7);
box(x, 12, z, Math.min(x + 1, x1 - 1), 12, z, "#dfb474");
}
}
}
// Round finger holes: dark wooden rims and genuinely open centers.
for (const cx of [14, 33]) {
const cz = 14;
for (let dx = -3; dx <= 3; dx++) {
for (let dz = -3; dz <= 3; dz++) {
const d = Math.sqrt(dx * dx + dz * dz);
if (d <= 2.7 && d > 1.65) set(cx + dx, 12, cz + dz, oakShade);
if (d <= 1.65) {
for (let y = 12; y <= 18; y++) set(cx + dx, y, cz + dz, null);
set(cx + dx, 19, cz + dz, "#504735");
}
}
}
}
// Small grooves mark the sliding tracks and frame the central opening.
box(3, 13, 8, 44, 15, 8, oakShade);
box(3, 13, 20, 44, 16, 20, oakLight);
box(17, 13, 10, 17, 13, 18, oakShade);
box(30, 13, 10, 30, 13, 18, oakShade);
box(18, 14, 9, 29, 15, 9, "#e8bc7a");
// Broad, lightly grained top with a softly contrasting front lip.
box(2, 13, 21, 45, 33, 22, oakLight);
box(2, 13, 21, 45, 13, 21, oakMid);
for (let i = 0; i < 34; i++) {
const x = 4 + Math.floor(rand() * 39);
const y = 15 + Math.floor(rand() * 17);
const length = 1 + Math.floor(rand() * 4);
for (let j = 0; j < length; j++) {
set(Math.min(x + j, 44), y, 22, rand() < 0.65 ? "#e8b979" : "#f2cc90");
}
}
// Compact black game console in the left half of the niche.
box(19, 19, 10, 25, 26, 12, "#25292b");
box(19, 19, 12, 25, 26, 12, "#41464a");
box(19, 18, 10, 25, 18, 11, "#303437");
box(20, 18, 11, 23, 18, 11, "#17191b");
set(24, 17, 11, "#80c6b4");
box(20, 21, 13, 24, 25, 13, "#34383b");
// Tiny potted plant on the right.
box(27, 21, 10, 29, 23, 11, "#cc8265");
box(27, 21, 12, 29, 23, 13, "#e9a381");
box(27, 20, 13, 29, 23, 13, "#f1b394");
set(28, 21, 14, "#554435");
line(28, 21, 14, 28, 21, 17, 0, "#597d4e");
for (const [x, y, z, c] of [
[27, 21, 16, "#84aa69"], [26, 21, 17, "#a5c981"],
[27, 20, 18, "#78a663"], [28, 20, 17, "#b4d38b"],
[29, 21, 16, "#72975c"], [30, 21, 17, "#9cc47c"],
[29, 22, 18, "#7ca963"], [28, 22, 18, "#a7cb80"],
[27, 22, 15, "#658e58"]
]) set(x, y, z, c);import { draw } from "./assets/voxel";
import { rackDeTele } from "./assets/rack-de-tele";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, rackDeTele, 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 rack-de-tele
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["rack-de-tele"] })
# It lands in client/assets/rack-de-tele.ts
# https://fogon.page/object/rack-de-tele