style-engraving · git:20260926.a93cf72 · 2026-09-26 · sha256 4bdfac0fc2d8b405
style-engraving git:20260926.a93cf72A
Immutable. This exact content never changes and is served at /api/v1/blob/4bdfac0fc2d8b405.
---
name: style-engraving
description: Engraving style (in testing): 3D scenes drawn as a plate of the «Description de l'Égypte» — charcoal tone on toothed paper, masonry drawn stone by stone, temple walls in low relief (registers of offering scenes, Hathor capitals, starred ceilings), an aged print measured on the originals, one live blue and a gold wash as second inks. Instanced WebGL, so thousands of pieces are cheap. Use it for architecture, archaeology, temples, machines, exploded views, scientific plates, or when working with styles/engraving/.
---
# Style · Engraving
Reference in testing: `sandbox/2026-09-26-pyramid-engraving/` («The pyramid that makes skies»,
63.6 s, ten shots from the desert to a sky inside a seed). References the user chose: the
plates of the «Description de l'Égypte»: Vol. V (Giza, Pl. 9, 11, 13, 14) for the outside,
Vol. IV (Dendera, Pl. 17, 25, 30) for walls, friezes and interiors (Wikimedia Commons, NYPL).
## Code
`styles/engraving/engrave.js` → global `Engrave`.
- `Engrave.renderer(env, { scale })` → `R.mesh(name, geom)`, `R.render(g, key, frame)`.
Built-in meshes: `box`, `pyramid`, `cylinder`, `sphere`; `Engrave.torus(r)` for rings.
- Instances: `Engrave.inst(arr, centre, material, half, seed, quat, glow, bias)` (16 floats).
Materials: 0 limestone, 1 worn limestone, 2 obsidian, 3 gold, 4 live blue (emissive),
5 sand (a flat `box` instance with `N.y` up is the desert: dunes bend its lines), 6 bronze.
- A draw: `{ mesh, inst: Float32Array, box: true }` (box = cut edges, pores, chips) or
`tan: 'y'` for a round mesh hatched along its axis (cylinders; rings default to round it).
`cast: false` for things that must not shadow (glow lines, dust).
- Frame: `cam, target, fov, sun, sunK, fill, lights: [[x,y,z,0,strength]]` (second-ink
lights), `shadow: { center, radius }` (make the radius follow the subject: small in a
close-up, or the shadows go blocky), `sky: { zenith, horizon }`, `fog`, `spacing` (px at
1920), `frame` (the plate's image area; outside it, bare paper).
- The plate (margins, neat line, running heads, caption) is 2D on top, in IM Fell DW Pica SC
(`fonts/IMFellDWPicaSC-Regular.ttf`, OFL). See the scene's `film.js`.
## The approved look (charcoal + aged print)
The user approved («¡Lo has clavado!») the **charcoal** mode with the **aged print** filter,
not the ruled burin lines: `charcoal: true` in the frame and `Engrave.ager(env).apply(g,
R.layer(key, f), { ink, paper, charcoal: true })` to paint. What makes it:
- stone faces drawn as a **mosaic of small hand-cut stones** in courses (`course`, world
size of a course): joints as broken pencil marks on the lit side, dark stones with lighter
joints in shade; the mosaic stays on up close (a big stone is still a drawn wall);
- tone laid as **graphite in short diagonal strokes** that catch on the paper's tooth only in
the half-tones (lights stay clean, darks fill in); drawn marks stay crisp;
- the **aged print**: tone curve and gradient map measured on the plates (a greyish warm
paper, a warm black), second inks carried over, softer lines, grain, toning patches, a
darker rim; the sheet does not boil;
- light as in plate 11: sun from the front left (`sun: [-0.35, 0.5, 0.8]`, `sunK: 0.8`,
`fill: 0.2`), a light rubbed sky (`zenith 0.22, horizon 0.15`).
Calibrate against the plate with `sandbox/2026-09-26-pyramid-engraving/plate-test.js`
(one smooth pyramid from afar) before touching a scene.
## Interiors (the temple)
Draw flag and frame field for a room inside: `interior: true` in the frame. Then:
- **Walls are one dressed surface, not stones.** A tall box (`vH.y > 0.6`) or a column
(`cylinder` with `tan: 'y'`) inside is decorated by `templeWall()` in the shader, after
Dendera: a plain dado; three registers of offering scenes in low relief (a standing
figure offering to a seated one, two standing face to face, a kneeling one with a bowl,
a seated one with an attendant, or an inscription panel), panels of varying width,
mirrored at random, sign columns between them and short sign columns above the figures;
a frieze of uprights, a torus bound with a spiral band, a fluted cavetto cornice. The
raised field is dressed lighter, its edge a clear line; worn in patches.
- **Signs are invented** (`glyphSign`, 16 of them: ring, notched triangle, staff, water, eye,
comb, stepped mound, serpent, lotus, bird, rayed disc, crescent, seated figure, zigzag,
shrine, beetle), combined in pairs per cell so they do not repeat. Never real hieroglyphs.
The little creature (`sdCritter`) appears rarely, and once in a worn cartouche.
- **Hathor capitals:** a box draw with `hathor: true` carries her face on four sides (wig
lappets, cow's ears, the shrine above). Columns: shaft, plinth, flared `capital`, the
Hathor block, abacus, beams.
- **Ceilings** carry five-pointed stars in relief between beams.
- **Floors**: flagstones with dust drifted against walls, stains, grit, chips; loose stones
(`rock`) and furniture from the scene's `props.js` (offering tables with loaves and a jar,
jars on stands, seated statues on bases, rubble).
- The paper's tooth is finer indoors (`grain: 0.45` in the ager), or the carving drowns.
- Light comes in as the story needs (slits with dust motes in the beams: bias −1 prints a
mote as bare paper; a shaft lit from above); `fill ≈ 0.4` so shade stays drawn.
A night sky (inside the seed): `sky` above 1 (a dark rubbed ground), stars as `sphere`
instances with bias −1 (bare paper), sizes small and many (thousands), an engraved star as
four long and four short thin rays.
## Style rules
- **Tone is graphite on toothed paper,** never a flat grey: laid in short diagonal strokes,
catching on the tooth only in the half-tones. Drawn marks (joints, relief edges, signs)
stay crisp lines.
- **Outside, stone is a mosaic of small hand-cut stones** in courses; up close each block
is still drawn (grain, pits). Inside, walls are dressed and decorated (above).
- **Textures belong to the piece** (`vQ`, the piece's own space): they never swim when the
piece or the camera moves. Round pieces measure arc length, not a dot product.
- **Colour is a second ink:** live blue on what is alive (channels, marks, the seed), gold as
a wash on metal; three quarters of the frame stay ink on paper.
- **The ground is drawn:** dunes everywhere with lee slopes in shade, patchy wind ripples
(dark lee strokes), mottling, pebbles; no flat patch next to a busy one.
- Dust, pores, pebbles and stars are stipple; motes in light are bare paper.
- Nothing crosses stone: rings are sized to the room they turn in, slabs keep their gaps.
## Style checklist
- [ ] Side by side with the plate at the same size: tones measured, not guessed.
- [ ] No flat grey at full size (walls in light, shaded faces, metal, sand).
- [ ] Walls inside: registers readable but not shouting; no two neighbouring panels alike.
- [ ] Every room furnished and dirty (tables, jars, statues, rubble, dust at the walls).
- [ ] Nothing in the foreground covering half the frame by accident (rings, mounds, blocks).
- [ ] Blue only on what is alive; gold only on metal.
## Lessons
- 2026-09-26 · pyramid-engraving · A line thinner than a pixel must print lighter (scale its
coverage by width/AA), or every faded line becomes a half-tone smear and level changes
show as diagonal bands of moiré.
- 2026-09-26 · pyramid-engraving · An exploded building reads when each face moves out along
its own normal (the corners open into V gaps that show the inside); scaling the shells
about the axis only makes a lattice that hides the heart.
- 2026-09-26 · pyramid-engraving · «It still doesn't look like it» three times: parallel burin
hatching read as 3D with a filter. What the plates actually do was only seen by cropping
the plate next to our render at the same size and measuring tones: faces are mosaics of
tiny drawn stones and soft, grainy tone. Put the reference beside the render first.
- 2026-09-26 · pyramid-engraving · A ruling measured as dot(position, direction) races on a
curved piece when the direction turns (rings, cylinders): measure arc length instead, and
never add a per-piece offset to the position (it multiplies the error).
- 2026-09-26 · pyramid-engraving · The colour of «old» is measured, not guessed: a gradient
map from the plates' own pixels (their paper is greyish, not cream) did more than any
sepia tint.
- 2026-09-26 · pyramid-engraving · «The walls don't look Egyptian»: the fix came from the
plates themselves (Dendera): smooth dressed walls filled edge to edge with registers, not
stones with a few signs. Download the references first and copy their structure.
- 2026-09-26 · pyramid-engraving · «The glyphs repeat»: one sign per cell from a fixed grid
repeats visibly; vary the panel widths, the composition per panel, pair signs per cell and
offset each wall.
- 2026-09-26 · pyramid-engraving · A low camera on a lit foreground mound flattens the whole
frame; look over the dunes so their lit and shaded sides read.