← Gear3D assetfogon/catalejo
Catalejo
Drag to turn it// «Catalejo» · gpt-6-sol (medium)
// A pirate spyglass extended: three telescoping brass tubes getting thinner toward the front (-y), each with a darker brass ring, a leather wrapped middle section and a glass lens at the front. It LIES FLAT horizontally on the ground (z=0), as a chunky toy-like item seen from above: tip/front toward -y, handle/back toward +y, centered on x, using most of the grid along y, at least 4-5 blocks thick so it reads at small size. No hands, no stand, no base plate.
const cx = 24, cz = 7;
function disk(y, r, palette) {
for (let x = cx - r; x <= cx + r; x++) {
for (let z = cz - r; z <= cz + r; z++) {
const d = Math.hypot(x - cx, z - cz);
if (d > r + 0.15) continue;
let color = z >= cz + 2 ? palette[0]
: z <= cz - 2 ? palette[2]
: palette[1];
if (d > r - 0.8) color = palette[2];
else if (rand() < 0.055) color = palette[1];
set(x, y, z, color);
}
}
}
function tube(y0, y1, r, palette) {
for (let y = y0; y <= y1; y++) disk(y, r, palette);
}
const brass = ["#eac469", "#c99a43", "#91632b"];
const darkBrass = ["#af843a", "#876028", "#68451f"];
const brightBrass = ["#ffe18a", "#dcaf50", "#a4742e"];
const leather = ["#a9693a", "#824923", "#593019"];
const darkLeather = ["#87502c", "#64371e", "#452517"];
// Three extended, stepped brass sections. The wide rear tube touches z=0.
tube(31, 41, 7, brass);
tube(17, 32, 5, brass);
tube(5, 18, 4, brass);
// Dark collars at each telescoping joint.
tube(16, 17, 5, darkBrass);
disk(18, 5, brightBrass);
tube(30, 31, 7, darkBrass);
disk(32, 7, brightBrass);
// Raised leather grip around the middle tube.
tube(20, 29, 6, leather);
for (const y of [20, 24, 28]) disk(y, 6, darkLeather);
disk(21, 6, leather);
disk(29, 6, leather);
// Leather seam and large, readable stitches along the upper surface.
for (let y = 21; y <= 28; y++) set(24, y, 13, "#4b291b");
for (const y of [22, 25, 27]) {
set(22, y, 12, "#d39a60");
set(26, y, 12, "#d39a60");
}
disk(19, 6, darkBrass);
disk(30, 7, darkBrass);
// Heavy rear eyepiece rim and its dark recessed opening.
disk(41, 7, darkBrass);
disk(42, 7, brightBrass);
disk(43, 7, darkBrass);
disk(44, 5, darkBrass);
disk(44, 4, ["#362c24", "#30271f", "#241e1b"]);
// Broad front lens housing, with glass facing toward -y.
disk(6, 5, darkBrass);
disk(5, 5, brightBrass);
disk(4, 5, darkBrass);
disk(3, 5, brightBrass);
disk(3, 4, ["#345062", "#213a4d", "#182d3d"]);
disk(2, 3, ["#69c5dc", "#358bad", "#226280"]);
set(23, 2, 9, "#c8f7ee");
set(22, 2, 8, "#a6e9ed");
set(25, 2, 6, "#246080");import { draw } from "./assets/voxel";
import { catalejo } from "./assets/catalejo";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, catalejo, 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 catalejo
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["catalejo"] })
# It lands in client/assets/catalejo.ts
# https://fogon.page/object/catalejo