← Asian3D assetfogon/barra-de-sushi
Barra de sushi
Drag to turn it// «Barra de sushi» · gpt-6-sol (medium)
// A sushi bar counter: a long light wooden counter with a glass display case on top showing colorful fish fillets (salmon orange, tuna red, white fish), a few plates of nigiri along the counter, two wooden stools in front, and a small hanging blue cloth sign at the back.
// Sushi bar counter: front faces -y.
const red = "#9e302c", redLight = "#bf4b38", redDark = "#662522";
const gold = "#d9ac52", goldLight = "#f1cd79";
const wood = "#e8bd7b", woodLight = "#f5d497", woodDark = "#b87e4b";
const green = "#355e50", greenLight = "#527e69", greenDark = "#263f3b";
const glass = "#a9d5d3", glassLight = "#d7f0e8";
const ceramic = "#f3eee0";
// Red lacquered counter base and chunky wooden top.
box(5, 16, 1, 42, 30, 11, redDark);
box(4, 14, 11, 43, 31, 13, woodDark);
box(3, 14, 14, 44, 31, 14, wood);
box(4, 15, 15, 43, 30, 15, woodLight);
for (let x = 5; x <= 42; x++) {
for (let y = 15; y <= 30; y++) {
if (rand() < 0.13) set(x, y, 15, rand() < 0.5 ? "#efc88a" : "#dcae70");
}
}
box(3, 14, 12, 44, 14, 13, woodLight);
box(4, 14, 10, 43, 14, 10, gold);
// Front panels, lacquered uprights, and gold latticework.
for (let x = 5; x <= 41; x += 9) {
box(x, 14, 1, x + 2, 16, 11, red);
box(x, 13, 3, x + 2, 14, 3, gold);
box(x, 13, 9, x + 2, 14, 9, gold);
}
for (let x = 8; x <= 40; x += 9) {
box(x, 14, 3, x + 5, 14, 9, woodDark);
box(x + 1, 13, 4, x + 4, 13, 8, "#d6a86b");
box(x + 2, 12, 4, x + 2, 13, 8, gold);
box(x + 1, 12, 6, x + 4, 13, 6, gold);
}
box(5, 14, 1, 42, 14, 2, red);
box(5, 14, 2, 42, 14, 2, gold);
// Glazed display case, with an unobstructed view of the fish.
box(6, 29, 16, 41, 29, 22, greenDark);
box(6, 22, 16, 41, 29, 16, woodDark);
box(7, 23, 17, 40, 28, 17, "#f0e9d9");
box(6, 22, 22, 41, 29, 22, glass);
box(7, 23, 23, 40, 28, 23, glassLight);
for (let x of [6, 18, 30, 41]) {
box(x, 22, 16, x, 22, 22, green);
box(x, 29, 16, x, 29, 22, green);
set(x, 22, 21, gold);
}
box(6, 22, 16, 41, 22, 16, gold);
box(6, 22, 22, 41, 22, 22, greenLight);
box(6, 22, 23, 41, 22, 23, gold);
box(6, 29, 23, 41, 29, 23, green);
for (let x = 9; x <= 38; x += 10) {
line(x, 22, 19, x + 2, 22, 21, 0, glassLight);
}
// Three distinct fish displays, on dark serving trays.
const fish = [
{ x: 9, c: "#ef824f", hi: "#ffae75", shade: "#c95d40" },
{ x: 20, c: "#c84752", hi: "#ed6970", shade: "#92323f" },
{ x: 31, c: "#f2e4ce", hi: "#ffffff", shade: "#c8c9ba" }
];
for (const f of fish) {
box(f.x - 1, 24, 17, f.x + 8, 28, 17, greenDark);
box(f.x, 24, 18, f.x + 7, 27, 18, ceramic);
box(f.x + 1, 24, 19, f.x + 6, 26, 19, f.shade);
box(f.x + 2, 24, 20, f.x + 6, 26, 20, f.c);
box(f.x + 3, 25, 21, f.x + 5, 26, 21, f.hi);
for (let k = 2; k <= 6; k += 2)
box(f.x + k, 24, 20, f.x + k, 26, 20, f.hi);
set(f.x, 23, 18, "#7aab68");
set(f.x + 1, 23, 18, "#9fc481");
}
// Nigiri on four little plates along the customer-facing top.
const nigiri = [
[9, "#f28654", "#ffb17b"],
[19, "#c94a55", "#ee7379"],
[29, "#f1e4d1", "#ffffff"],
[39, "#f28654", "#ffb17b"]
];
for (const [x, fishColor, highlight] of nigiri) {
ellipsoid(x, 18, 16, 4, 2, 0.7, ceramic);
box(x - 2, 17, 17, x + 1, 18, 17, "#fff8e7");
box(x - 2, 17, 18, x + 1, 18, 18, fishColor);
box(x - 1, 17, 19, x + 1, 17, 19, highlight);
set(x + 3, 18, 17, "#72a870");
}
// Two stools in front, with splayed legs and round seats.
for (const cx of [13, 35]) {
for (const dx of [-2, 2]) {
for (const dy of [-2, 2]) {
line(cx + dx * 1.5, 8 + dy * 1.5, 0,
cx + dx, 8 + dy, 8, 0, redDark);
}
}
box(cx - 3, 8, 3, cx + 3, 8, 3, red);
box(cx, 5, 3, cx, 11, 3, red);
cylinder(cx, 8, 8, 4, 2, woodDark);
cylinder(cx, 8, 10, 4, 1, woodLight);
for (let dx = -2; dx <= 2; dx++)
if (rand() < 0.65) set(cx + dx, 7, 10, wood);
box(cx - 1, 5, 9, cx + 1, 5, 9, gold);
}
// Rear posts and a temple-inspired tiled canopy.
for (const x of [5, 40]) {
box(x, 31, 0, x + 2, 33, 30, redDark);
box(x, 31, 4, x + 2, 32, 27, red);
box(x - 1, 30, 26, x + 3, 34, 26, gold);
box(x - 1, 30, 29, x + 3, 34, 29, gold);
}
box(4, 31, 29, 43, 33, 31, red);
box(3, 30, 31, 44, 34, 31, gold);
box(4, 30, 32, 43, 35, 32, redDark);
for (let x = 3; x <= 44; x++) {
for (let y = 28; y <= 38; y++) {
const eaveLift = (x <= 5 || x >= 42 || y === 28 || y === 38) ? 1 : 0;
const z = 37 - Math.abs(y - 33) + eaveLift;
set(x, y, z - 1, greenDark);
set(x, y, z, ((x + y) % 4 === 0) ? greenLight : green);
if (x % 4 === 0 && y > 28 && y < 38) set(x, y, z + 1, "#668b73");
}
}
box(3, 28, 33, 44, 28, 33, gold);
box(3, 38, 33, 44, 38, 33, gold);
box(3, 33, 37, 44, 33, 37, greenDark);
for (let x = 4; x <= 43; x += 4) set(x, 33, 38, gold);
// Small hanging indigo cloth sign, centered beneath the canopy.
box(19, 29, 25, 28, 29, 30, "#244f80");
box(20, 28, 25, 27, 28, 29, "#32699a");
box(19, 28, 30, 28, 29, 30, gold);
for (let x = 20; x <= 27; x += 2)
box(x, 28, 24, x, 28, 25, "#32699a");
// Bold, simplified white emblem, legible at small scale.
box(22, 27, 27, 25, 27, 27, "#f3eee0");
box(23, 27, 26, 24, 27, 29, "#f3eee0");
set(21, 27, 28, goldLight);
set(26, 27, 28, goldLight);import { draw } from "./assets/voxel";
import { barraDeSushi } from "./assets/barra-de-sushi";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, barraDeSushi, 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 barra-de-sushi
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["barra-de-sushi"] })
# It lands in client/assets/barra-de-sushi.ts
# https://fogon.page/object/barra-de-sushi