← Animals3D assetfogon/hornero
Hornero
Drag to turn it// «Hornero» · gpt-6-sol (medium)
// A small cartoon rufous hornero bird standing next to its round clay mud oven nest: the bird is cinnamon brown with a lighter cream throat, a thin pointed beak and black eyes; the nest is a dome of reddish-brown clay on top of a short wooden post, with an arched entrance hole facing front (-y).
// Wooden post and platform
box(32, 22, 0, 36, 26, 16, "#82512e");
box(32, 22, 0, 33, 26, 16, "#a66a3a");
box(35, 22, 0, 36, 26, 16, "#684026");
for (let z = 2; z <= 14; z += 4) {
line(34, 22, z, 34, 22, z + 2, 0, "#b77a43");
}
cylinder(34, 24, 15, 9, 3, "#744529");
cylinder(34, 24, 17, 9, 2, "#a66a3f");
// Round clay oven: a broad base with a domed roof.
cylinder(34, 24, 19, 10, 3, "#9e5134");
for (let x = 24; x <= 44; x++) {
for (let y = 14; y <= 34; y++) {
const d = ((x - 34) / 10) ** 2 + ((y - 24) / 10) ** 2;
if (d > 1) continue;
const top = Math.floor(21 + 14 * Math.sqrt(1 - d));
for (let z = 22; z <= top; z++) {
let color = z >= 29 ? "#b96945" : z >= 23 ? "#aa5939" : "#93482f";
if (rand() < 0.09) color = z >= 27 ? "#c57851" : "#b86945";
if (rand() < 0.045) color = "#88442f";
set(x, y, z, color);
}
}
}
// Recess the arched entrance into the front of the oven.
for (let x = 29; x <= 39; x++) {
const dx = Math.abs(x - 34);
if (dx > 4) continue;
const archTop = Math.floor(22 + 5 * Math.sqrt(1 - (dx / 4.2) ** 2));
for (let z = 19; z <= archTop; z++) {
for (let y = 12; y <= 18; y++) set(x, y, z, null);
for (let y = 19; y <= 20; y++) {
if (get(x, y, z)) set(x, y, z, z < 22 ? "#44271e" : "#35221c");
}
}
}
// Thick, irregular clay lip around the opening.
for (let x = 30; x <= 38; x++) {
const dx = Math.abs(x - 34);
const z = Math.round(23 + 5 * Math.sqrt(Math.max(0, 1 - (dx / 4.5) ** 2)));
for (let y = 14; y <= 16; y++) {
set(x, y, z, "#cc8058");
if (dx < 4) set(x, y, z + 1, "#ad5d3d");
}
}
for (let z = 19; z <= 23; z++) {
box(29, 15, z, 30, 16, z, "#bd7049");
box(38, 15, z, 39, 16, z, "#a75739");
}
line(30, 14, 19, 38, 14, 19, 0, "#cd8157");
// Bird: everything pivots together at its feet for a gentle peck.
part("bird", [15, 23, 0]);
// Short legs and splayed toes.
for (const x of [12, 18]) {
box(x - 1, 22, 2, x + 1, 24, 7, "#a55730");
box(x - 1, 20, 0, x + 1, 25, 2, "#a75d35");
for (const tx of [x - 2, x, x + 2]) {
line(x, 21, 1, tx, 18, 0, 0, "#86502e");
}
}
// Tail pointing behind the round body.
ellipsoid(15, 31, 12, 4, 7, 3, "#8e422d");
line(13, 31, 12, 11, 37, 11, 1, "#a35434");
line(16, 31, 12, 16, 37, 11, 1, "#aa5936");
line(18, 30, 12, 20, 36, 11, 1, "#783b2b");
// Plump cinnamon body, with a brighter back and rounded wings.
ellipsoid(15, 24, 14, 7, 8, 9, "#a95032");
ellipsoid(15, 23, 17, 6, 7, 6, "#bd6741");
ellipsoid(9, 24, 16, 2, 5, 5, "#985032");
ellipsoid(21, 24, 16, 2, 5, 5, "#91452f");
ellipsoid(22, 24, 17, 1, 3, 3, "#b7653e");
line(21, 22, 14, 22, 27, 13, 0, "#783e2d");
// Oversized head and bold cream throat.
ellipsoid(15, 17, 24, 6, 6, 6, "#a95434");
ellipsoid(15, 15, 26, 5, 4, 4, "#c5764b");
ellipsoid(15, 12, 19, 4, 3, 5, "#f0d3a2");
ellipsoid(15, 11, 22, 3, 1, 2, "#f5ddb1");
// Tiny black eyes, each with a white glint.
sphere(11, 12, 26, 1, "#211d1b");
sphere(19, 12, 26, 1, "#211d1b");
set(11, 11, 27, "#ffffff");
set(19, 11, 27, "#ffffff");
// Slim pointed beak, aimed toward the viewer.
line(15, 11, 23, 15, 7, 22, 1, "#d29a49");
line(15, 7, 22, 15, 5, 21, 0, "#e1aa58");
set(15, 10, 21, "#8b5331");
animate("bird", { type: "swing", axis: "x", speed: 4, amplitude: 0.3 });import { draw } from "./assets/voxel";
import { hornero } from "./assets/hornero";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, hornero, 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 hornero
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["hornero"] })
# It lands in client/assets/hornero.ts
# https://fogon.page/object/hornero