SPOLIA

SPOLIA — Growing Supports

A sculpture has to hold itself up twice. Once as an object, standing in a room — and once, briefly and awkwardly, while it is being printed, when it is not yet an object at all but a few hundred half-finished layers of warm plastic. Most software treats the second as a separate, disposable problem: scaffolding, generated in a slicer, snapped off and binned.

This page is about not doing that. Supports in SPOLIA are grown as part of the piece — in the same signed-distance field, smooth-unioned into the same surface, carrying their own block material — so that a strut can be a decision rather than a nuisance. Roman workshops carved struts and tree trunks into marble for exactly the same structural reason, and then made them mean something. So can we.

Live at https://auriea.art/spolia/, in the menu.

Contents

  1. Trees are the wrong primitive
  2. The rule
  3. What slicers actually do — and the mistake I made first
  4. Growing downward
  5. Relaxing the skeleton
  6. A support must not need a support
  7. Standing off
  8. The tie
  9. Reading their source
  10. The Roman argument
    1. The non-figural strut, which we had skipped entirely
  11. The trunk and the vine
    1. In leaf
    2. The pelt
    3. The cut strut, and the turned one
  12. Using it
  13. Five kinds of support, of which we have three
  14. What it does not do yet

Trees are the wrong primitive

Before the rest of it, the finding that reorganised this page — because two disciplines that have never spoken arrived at the same piece of material, and it was the one piece this generator did not have.

Dumas, Hergel and Lefebvre, Bridging the Gap: Automated Steady Scaffoldings for 3D Printing (ACM TOG 33(4), SIGGRAPH 2014), argue against the tree on structural grounds. A branch is a cantilever: held at one end, free at the other, failing by bending about its own root, and getting worse the taller it grows. A scaffolding of vertical pillars tied to one another by horizontal bridges is stiff instead, because every bridge is held at both ends and each pillar braces its neighbour. It remains the standing answer to PrusaSlicer issue #12856 — tall organic branches snapping mid-print — where the reporter's own workaround was to add a cross-member by hand.

And Anguissola, cataloguing Roman marble a whole discipline away, describes the same member: "Very often, a horizontal bar connects the calves of a standing male figure, a device that reflects concerns about supporting the whole statue on a pair of slender ankles." The pseudo-athlete from Delos has one. So does the Silenus from Ariccia.

An engineering paper and an art-historical catalogue reach the identical bar from opposite ends. It is built now — see The tie, below — and everything between here and there is what had to be true first.

The rule

A printer can lay a new layer slightly wider than the one beneath it, but not much. The usual working figure is 45° from vertical: past that lean, a downward-facing surface has too little underneath it and droops. Spolia measures this exactly the way a slicer does, on the surface normal — -n.y against cos 45° = 0.7071 — and tints the lit render toward red as a face passes it.

A tall vessel in Spolia with the overhang heatmap on and no supports: red bands mark the rim lip and the underside of the base ring, the surfaces that lean past 45 degrees from vertical.

A vessel stood upright, heatmap on, no supports yet. Two red bands: the flared lip of the rim, and the underside of the base ring. Everything else on this form is vertical or better, and needs nothing.

Two details worth knowing. The tint is applied to the lit colour, not the albedo — overhangs are by definition the faces turned away from a key light coming from above, so tinting the base colour before shading buried the warning in its own shadow, which is where the first version of this went wrong. And the toggle is view-only: it is not saved into a .spolia file and never reaches an export.

What slicers actually do — and the mistake I made first

The first working version grew a branch upward from a root you tapped on the ground, reaching toward the flagged overhangs. It made a convincing single strut and left most of the piece untouched, and it took a while to see why that was not a tuning problem but a structural one: coverage was contingent on reach. A ring of overhang around a base can never be reached from one point inside it, however good the search — the far side of the ring is always too far sideways for the height available. Clustering the targets and retrying in rounds only papered over it.

PrusaSlicer and Cura both go the other way, and PrusaSlicer's source says so in one line. In src/libslic3r/Support/OrganicSupport.cpp:

using Forest = std::vector<Tree>;

A forest, never one tree. Overhang tips are laid across the entire flagged region at a set spacing — support_tree_branch_distance, generated as a zig-zag infill over the overhang area — and each tip begins its own branch at the surface it has to hold. Branches then descend, and merge with each other on the way down. (PrusaSlicer's organic supports, added in 2.6, are Thomas Rahm's rework of Cura's tree supports; the provenance is set out properly under Reading their source, below, because the version everyone repeats is wrong.)

Turn it around and the coverage problem evaporates, because it was never really a search problem: you cannot miss an overhang you started from.

Growing downward

So: find the overhangs, thin them to evenly spaced tips, and let every tip fall.

The same vessel after growing supports: branching oak-coloured struts descend from the rim and from the base ring, merging into a few thicker legs that meet the build plate.

The same vessel, grown, standing upright: 122 flagged surface crossings → 22 tips → 94 capsules, of which 7 reach the build plate. About 20 ms to compute.

Lay the same vessel on its side and it is a different problem with different numbers565 crossings → 36 tips → 108 capsules — and that is the configuration everything measured later on this page was measured in. Worth stating plainly rather than quietly replacing one set with the other: orientation is the first support decision anybody makes, and it changes the answer more than any parameter here does.

Each tip descends in small steps. Three things shape the step:

When two branches come within a merge radius they become one node carrying both tip counts, and thickness follows the pipe model: a branch's radius is leafR × tips^(1/2.5), so merging two equal branches gives r × 2^(1/2.5) and the trunk thickens toward the plate the way growth rings do, with no manual taper anywhere.

Close view under the base ring showing branches merging into thicker trunks as they descend, each junction sitting below the branches entering it.

Underneath the base ring: thin twigs at the contact points, merging downward into fewer, fatter legs. Every junction sits below the branches entering it — which turns out to matter more than it sounds.

A branch stops when it reaches the plate, or when the piece itself blocks its descent — in which case it lands there. A support springing from the sculpture's own lower body is not a failure case; it is a puntello.

Relaxing the skeleton

The descent above has one structural flaw, and it is not a tuning problem either. The first version emitted capsules as it went, so every node position was final the instant its step was taken: a greedy lean toward a sibling could never be reconsidered, and the result read as assembled rather than grown — elbows, doglegs, a kink at every merge.

So the growth now builds a graph first, relaxes it, and only then cuts capsules. A graph node is created only where a capsule would have ended anyway — at a run break, at a merge, at a termination — so the graph is the capsule skeleton: on this piece roughly 130 nodes rather than one per step, and relaxing it costs a few thousand field samples instead of a few million.

Each pass, each free node gets three terms, and the third is the one PrusaSlicer's shipping code does not have.

  1. Clearance. One mapWorld call and a three-axis gradient — the true 3D clearance and a push direction that can go upward. (Theirs cannot; see below.)
  2. A Laplacian, with their weighting, which is deliberately asymmetric. The node below carries half the target on its own, and every node above shares the other half between them. That bias makes a branch hang plumb over its own foot instead of being dragged sideways by a fan of tips — a fair weighting would let five twigs outvote the leg that has to carry them.
  3. The descent cone, re-imposed after every pass. Smoothing that is allowed to move a node is smoothing that is allowed to tip a capsule out of printability, so the constraint is re-applied rather than assumed. This is the only reason a relaxation pass is safe to run here at all.

Tips are pinned (nothing above them) and feet are pinned (nothing below them), exactly as the slicer pins its rootless nodes. Growth only ever descends, so ordering the free nodes by height is already a valid bottom-up topological order.

Measured on the krater lying on its side: mean joint turn angle 29.24° → 7.15°, worst joint 66.58° → 41.69°, on the same 108 capsules. Growth still takes 11–25 ms, which is the number that actually mattered — this has to stay interactive on an iPad. What you see is the elbows leaving the legs.

A support must not need a support

The obvious trap, and the one Auriea named before I hit it: scaffolding that is itself unprintable.

The guarantee is enforced at the step, not checked at the end. Every descent direction is clamped into a cone of 35° from vertical before it is taken. A cylinder leaning θ from vertical presents a steepest underside normal of sin θ, so 35° gives 0.574 — comfortably inside the 0.707 that flags the model, with margin to spare. And because the cone is convex, a run of steps collapsed into a single capsule is still inside it: the vertical components add exactly while the horizontal ones can only partly cancel, so a merged capsule can never lean further than its own steepest step. That is a proof rather than a hope, which matters, because four separate bugs each broke it in a way that looked fine on screen:

what went wrong why it broke the rule
Merging to a centroid at the mean height of the branches A sideways hop with no drop is a horizontal bar — 11 of 29 capsules failed the cone. Junctions now sit below everyone entering them, by horizontal / tan 35°.
Landing by snapping the last point to y = 0 Kept the step's sideways travel while throwing away the vertical it had earned, tipping the final capsule flatter than the step that made it. Now it interpolates to the true crossing.
A junction computed below the plate The merged node then emitted an upward capsule back to y = 0 — precisely the horizontal bar the cone exists to forbid. Junctions below the plate are refused; those branches were about to touch down anyway.
The relaxation's constraint pass enumerated nodes, not edges It projected only free nodes, and only against the node below them. An edge running from a locked tip down to a free child was therefore never constrained at all: the child drifted sideways and took the edge with it. unsafe went 0 → 3 while every other counter in the pipeline still read clean. The general lesson is worth writing down — a node-centric constraint loop silently skips every edge whose other end is pinned.

That last one is why the relaxation carries a proof and not merely a counter. The constraint h(u−d) ≤ (u.y−d.y)·tan 35° is a second-order cone constraint and is linear in the positions, so the feasible set over the whole graph is an intersection of convex cones — and two things follow, both of which are used. Alternating projection over the edges converges onto that set rather than oscillating between violations, so a single sweep is enough. And any blend between a safe configuration and an unsafe one is safe up to some t, so the un-relaxed skeleton (known safe by construction) gives a provably correct fallback: bisect for the largest usable blend, 14 rounds, reported as relaxT. In practice the sweep converges on its own and relaxT === 1. The fallback has never fired. It exists because a counter that reads zero because nothing checked the right edges is worse than no counter at all, and I had just been shown exactly that.

Every grown forest is re-checked capsule by capsule afterwards — the forest and its trunk stubs — and the count of violations is reported. It should always read zero, and if it ever doesn't, the clamp is wrong, not that particular tree. Ties are excluded from that count deliberately, for a reason set out below, which is the one exemption on this page and the only one I would defend.

The grown supports with the overhang heatmap turned back on: almost no red remains, and the branches themselves show none, meaning the supports do not need supports of their own.

The grown supports with the heatmap switched back on. The branches carry no red at all. What remains is a thin line along the rim and base lips, between the contact points — the same residue a slicer leaves, since it also supports a continuous lip at intervals and bridges the gaps. It is not zero, and it is honest to say so.

Standing off

The first version that covered properly still looked wrong: branches from the rim hugged the neck all the way down and read as wax runs, not struts.

Slicers keep a clearance from the model (xy_min_distance) so branches remain their own object. Spolia now does the same, pushing away along the horizontal gradient of the field only, so the push is sideways off the wall and never argues with the descent. It also walks each new branch clear of its own contact point, since a tip starts life exactly on the surface. The difference is entirely visual and entirely worth it: the struts arch away and read as structure.

The tie

Which brings back the bar between the calves.

makeTies() joins the closest approach of two different legs — Ericson's clamped segment-to-segment solve, the standard one — and keeps a candidate only if it is genuinely a brace. The gap has to fall between 0.045 and 0.22 of the piece's span: below that the two struts are already one mass and a tie is a smear, above it nothing would bridge. The run has to be near-level, |Δy| ≤ 0.5 × length, which also excludes two capsules of the same chain without needing to know anything about chains — within the descent cone their separation is mostly vertical by construction. And it must not pass through the piece on the way across. Candidates are taken widest gap first, since that is where a cantilever is longest and a brace buys the most, then thinned so a single pair of legs does not collect a ladder. The cap is 12; on the krater on its side it makes 7.

Ties ride inside uBranchMain rather than being bolted on afterwards, which means they take the forest's full blend radius and wear whatever profile the current style carves. A tie is a bough in trunk, a stem in vine, a faceted bar in strut. It is a member of the sculpture, not an annotation on it.

Why a tie may break the 35° descent cone when nothing else here may. Every other capsule in this forest has one free end and must hold itself up, which is what the cone is for. A tie has no free end: it lands on solid strut at both ends, so it is a bridge — and a bridge anchored at both ends is exactly the case a slicer declines to support. PrusaSlicer's remove_bridges_from_contacts drops any straight overhang anchored at both ends for precisely this reason. So ties are kept out of the unsafe counter by design, not by oversight, and the hard length cap is what keeps that exemption honest: a tie long enough to sag is not a bridge any more, and a steep tie is just a second branch that would have to obey the cone like everything else.

Ties also broke an assumption that had been quietly load-bearing for two styles. The vine's twist and the strut's facets both use a fixed world-X reference frame (cross(axis, X)), which was safe only because every grown capsule is within 35° of vertical — the printable guarantee doing double duty as a geometry guarantee, which is the sort of thing this page keeps celebrating. A tie is horizontal and may point along world X, where that cross product collapses and normalize returns garbage. It now falls back to world Y for the few members running near X. The struts all keep the frame they had, so facets and strands still line up through every joint; but this was a real bug in the vine as well, latent since the day the vine was written, and only a horizontal member could ever have exposed it.

Reading their source

Five passes through PrusaSlicer's and CuraEngine's actual source, rather than their documentation. Some of it settled arguments; some of it named work still to do.

The Roman argument

Anna Anguissola's Supports in Roman Marble Sculpture: Workshop Practice and Modes of Viewing (Cambridge, 2018) is a whole book against the idea that a strut is merely technical. Her point is that scholarship has dismissed these elements — especially plain non-figural struts — as "mere safeguards for production and transport", and that close attention to them instead reveals what buyers and carvers actually wanted.

The catalogue of solutions is remarkably close to what a support generator produces: tree trunks and stumps beside a leg; plain rectilinear struts bridging a limb back to the body; pillars, herms and vertical slabs behind a figure; and drapery engineered into a falling mass that happens to carry load.

The Aristodikos kouros, ca. 510–500 BC, Athens NAM 3938. The hands are lost; the two struts that braced them to the thighs survive as blunt stubs.
The Aristodikos kouros, ca. 510–500 BC, Athens NAM 3938. The hands are lost; the two struts that braced them to the thighs survive as blunt stubs.

The plainest form, and the oldest. The Aristodikos kouros (ca. 510–500 BC, Athens NAM 3938) had two short struts bracing its free-carved hands back to the thighs. The hands are long gone; the struts are still there, two blunt stubs at hip height. Purely structural, no pretence otherwise — a puntello in its raw state, and unmistakably the same object as a slicer's support.

The Diadoumenos from Delos, ca. 100 BC, Athens NAM 1826. The trunk carries a mantle and a quiver — iconography, not statics.
The Diadoumenos from Delos, ca. 100 BC, Athens NAM 1826. The trunk carries a mantle and a quiver — iconography, not statics.

The Diadoumenos from Delos (ca. 100 BC, Athens NAM 1826). The knotty 80 cm tree trunk at his left leg is almost detached from the figure and of little consequence to its stability. It carries his mantle and a hanging quiver — which is what names him an archer, possibly Apollo, on Apollo's own island. The support is doing iconography, not statics. Anguissola notes that the statue was entirely gilded, support included.

Silenus and the infant Dionysus, Vatican 2292. A vine-wrapped trunk, and at shin height a plain squared strut tying the leg back to it.
Silenus and the infant Dionysus, Vatican 2292. A vine-wrapped trunk, and at shin height a plain squared strut tying the leg back to it.

Silenus cradling the infant Dionysus (Vatican 2292), one of three full-size copies. Two support types in one object: the vine-wrapped trunk that takes the weight of the leaning body, and — at shin height — a plain squared strut tying his lower leg back to it, exactly the kind of bar a modern eye reads as scaffolding someone forgot to remove.

The comparison is the sharp part. The Louvre's version of the same group leaves those extra struts out, which made the carving harder, needed a broader block, and produced a figure whose weight reads across a diagonal rather than sitting in a flat rectangular frame. Same subject, same prototype, different answer to how much support to admit to — and the answer changes the sculpture.

And in the Townley Dionysus at the British Museum, the support is the subject: Ampelus, the boy the god loved, caught mid-metamorphosis into the vine that props up the composition. The strut became the story.

That is the whole design brief for this feature, written down two thousand years early: the support is a compositional choice with a structural floor, not an afterthought.

The same support forest assigned the bronze material instead of oak, so the struts read as cast metal against a marble body.

Which is why a grown forest carries its own block material, chosen independently of the body. Here the same struts are cast bronze against a marble vessel — a metal armature holding stone, the way a museum mount does. Oak, walnut and ebony read as the tree trunk that Roman copyists actually carved; plaster reads as a restorer's fill; and a support in the same marble as the body reads as what it would have been in a Roman workshop — carved from the same block, left in place.

The non-figural strut, which we had skipped entirely

Reading Anguissola properly rather than for confirmation turned up something uncomfortable. Her taxonomy has two halves: the figural support — the tree trunk, the stump, the herm, the thing that pretends to be something — and the non-figural support, the bare strut that pretends to be nothing. Spolia had built the first and skipped the second, which is to say we had built the rarer one.

Because the commonest Roman support is a rod. "The great majority of non-figural supports … take the form of a four-sided rod with a rectangular or square profile, straight or oblique." Then, around that centre: flat rectangular prisms between the figures of a group, tapering prisms, a hexagonal prism (the Getty's pouring satyr), cylinders, the rare elliptical section, curved arched rods. Her conclusion calls these things "abstract supplements to the human figure", and says the faceted form raises the question of nature against artifice — the artificial object set deliberately beside the imitated body, not disguised as a second body.

Three things follow that changed the code rather than the prose.

Surface finish is an axis independent of form. Most struts were "worked solely with the point" — left rough against polished skin. Some were smoothed with the same tools as the flesh; some are smooth on the front facet and coarse on the rear, finished for the viewing side only. And: "In general, all of the struts in a single figure receive the same surface treatment." That sentence is why style in Spolia is a property of the forest and not of the capsule — one decision about how the supports are worked, applied to all of them, exactly as a workshop would.

The spiral groove is an ornamented strut, and is not a vine. Hadrianic and Antonine: cylindrical or slightly tapered bars cut with a single spiral groove — a turned shaft, the lathe answering the chisel. Attested on the discus-thrower's hand from the Baths of Caracalla, on the Amazonomachy sarcophagus in the Capitoline, on the Medea sarcophagus in Berlin. Also attested on struts: incised rows of Vs, and a scallop pattern (the Roma statuette from Corinth, with red paint surviving in it). I had been treating every spiral as organic. It is at least as often a machine mark.

Colour lands on supports too, which the white-marble imagination forgets: red on the Écija Amazon's pillar — on the front only, none on the back — red on a heel strut, trunks painted dark, and the Delos Diadoumenos gilded entire, tree trunk included.

And the statement is often size. The Palermo pouring satyr's strut is 39 cm on a 146 cm figure — over a quarter of the whole height — and where it meets the hand it broadens into a thick cushion of marble, "such that the hand itself is carved in relief on the top". That is not a safeguard for transport that someone forgot to trim.

The trunk and the vine

One framing before the styles, because it decides how they are built. Auriea: "I DO want organic supports. I do not want ONLY organic supports. I want our supports to be decorative AND structural."

Skeleton quality and ornament vocabulary are independent axes, and the code keeps them apart — growSupportForest decides where the material goes, branch.style decides how it is worked. Both get improved; neither is ever traded for the other. That is not a compromise between two wants, it is Anguissola's own argument: the Townley support is Ampelus mid-metamorphosis and the thing holding the composition up, while the Delos trunk is structurally irrelevant and exists to hang a quiver. Meaning and load are not in competition in the marble, so they are not in competition here.

A smooth capsule forest is honest scaffolding, but honesty was never the whole brief. The Roman trunks were carved AS trunks — bark, scars, roots — and the Townley support is a living stem. So a grown forest has a style, switched after the fact like a material, because they are one thing: the same capsules, wearing different carving. There are now eightsmooth, trunk, vine, vine in leaf, pelt, cloth, strut, spiral strut — of which the last two are the first that are cut rather than grown. (cloth, the sheets that span between the upper struts, arrived alongside the pelt and has not been written up on this page yet.)

Trunk style in oak. The same forest as every figure above — the carving is display-time, so switching styles costs nothing and changes everything.
Trunk style in oak. The same forest as every figure above — the carving is display-time, so switching styles costs nothing and changes everything.

Trunk carves ridged bark into every strut, streaked hard along the vertical, with the horizontal fissure cell sized to a limb's girth rather than the trunk's — so even a thin leg carries two or three fissures around its circumference instead of one slow lump along its length. At the plate, each foot flares on a short exponential, the way a bole grips the ground; that flare is one line of shader, no geometry at all. And on the thick limbs: lopped-branch stubs, the scar every Roman marble trunk carries, from the Delos Diadoumenos' knotty stump on down. A tree that was cut to serve, not grown convenient.

Bark fissures wrapping the legs' girth, and a cut branch with its collar. The stubs blend at a smaller radius than the forest, or the fillet swallows them whole.
Bark fissures wrapping the legs' girth, and a cut branch with its collar. The stubs blend at a smaller radius than the forest, or the fillet swallows them whole.

The stubs taught their own lesson: folded into the field at the forest's own blend radius they vanished — a small thing wearing a big fillet is just a bump. They now blend at a fraction of it, still collared the way a carver leaves the scar, but legible as a cut branch. They are placed deterministically (golden-angle azimuths keyed to the segment index), angled 28° from vertical and stored descending, so they pass the same cone check as every grown capsule and the printability guarantee survives the decoration untouched.

Vine style in verde antico: three strands in a slow spiral down the neck struts, swelling gently at the internodes.
Vine style in verde antico: three strands in a slow spiral down the neck struts, swelling gently at the internodes.

Vine twists each strut into three strands with the grooves between them narrowed, so the strands read convex the way a laid rope does, and swells gently at the internodes — the strut as living stem, after Ampelus. The geometry lesson here is the good kind of cheap: the printable cone guarantees every grown branch is within 35° of vertical, which means a fixed world-axis reference frame never degenerates, neighbouring capsules agree about where zero degrees is, and driving the twist phase from world height makes the spiral run unbroken through every joint and merge. The constraint that makes the supports printable is the same one that makes them decorable. (The word grown is doing real work in that sentence now — a tie is not grown, and that is exactly where the trick broke; see The tie.) The twist pitch is chosen so each strand's own helix stays steeper than 45° — the carving obeys the rule the strut does.

In leaf

The vine in leaf. The denser second pass of tips also grips the base ring here — short struts where they are cheapest, dressed as stems.
The vine in leaf. The denser second pass of tips also grips the base ring here — short struts where they are cheapest, dressed as stems.

A fourth style, vine in leaf, lets the vine flower: leaf blades — oriented ellipsoids, base on the stem, tip reaching outward and 38° up toward the light, their width running horizontal so each blade faces the sky — and tendrils, capsule curls that spiral out from the mid-height stems, swelling then dying away, thinning toward the tip the way a real curl narrows. Everything is placed by golden-ratio hashes of the segment index, so a regrown forest keeps its foliage instead of reshuffling — and not sorted by height, which was the first draft's mistake: every leaf clumped onto the topmost twigs and the rim vanished under a drape.

Leafed neck struts, twisted stems with blades between them.
Leafed neck struts, twisted stems with blades between them.

One honesty matters here more than anywhere else on this page: the flourishes are jewellery, not structure. A tendril's curl turns through horizontal by definition, and a leaf blade shades its own underside — so leaves and tendrils sit deliberately outside the printable-cone proof, which remains a guarantee about the grown forest, the stubs and the carving only. At print scale they are small, chunky features and generally survive; but the zero in the safety check has never included them, and never will. (Ties are outside that count too, and are a different case entirely — an argued exemption rather than an admitted one.)

The same session also taught the forest something structural, prompted by looking at this very piece's underside: overhangs near the plate now get a second pass of tips at half the spacing. A strut a few steps tall costs almost nothing, so low coverage can afford density — the puntello preference arriving by economics rather than decree. The underside of the base ring, which used to carry the widest bands of residue, is now held by a ring of short dressed stems.

The pelt

Pelt style in miele — honey onyx, lion-coloured. Hides thrown over the upper struts; bare feet below the hem.
Pelt style in miele — honey onyx, lion-coloured. Hides thrown over the upper struts; bare feet below the hem.

The fifth style is the Farnese gesture: the club draped with the Nemean lion's skin, the whole weight of the figure resting on cloth-over-post. Pelt carves the forest as a heavy hide thrown over it — and unlike the leaves, it needed no new geometry at all. It is carving in the same family as the bark: smooth deep folds (value noise used raw — ridged noise is bark; cloth undulates), the cloth's bulk swelling toward the top of the forest where it was thrown over, and the strongest signal, a scalloped hem with a rolled edge at one world height, below which the bare post continues. One cloth, one waterline: struts that cross the hem show the drape ending; struts above are covered; struts below stay plain posts.

The hem zone: folds above, bare post below, the drape's tongues climbing the vessel's belly.
The hem zone: folds above, bare post below, the drape's tongues climbing the vessel's belly.

Because the pelt is carving on the descending capsules rather than added ornament, it lives mostly inside the printable discipline the way bark and the vine twist do — folds run vertical, the mass widens downward. The one honest exception is the rolled hem itself, a small horizontal ridge that can locally graze past 45° the way any bead moulding does; at print scale it behaves like one. Fold depth is capped against each capsule's own radius, so a thin twig wears the hide thin rather than being carved away.

Two tuning notes that may save someone an afternoon: the fold field looked right only after being sized so its cell is comparable to a strut's girth (same lesson as the bark), and the first hem meandered so widely that no leg ever showed bare post — the waterline's scallop has to be smaller than the strut spacing or the story of the ending cloth is lost. And carving too deep, too sharp, punctures the raymarch: the first pelt showed pinhole specks in its deepest folds until the depth and frequency were eased back inside the march's tolerance.

Cycling the style also dresses the part, as a courtesy: trunk arrives in oak, vine in verde antico — until you pick a material yourself, after which the styles stop suggesting. The pelt arrives in miele, honey onyx, lion-coloured. The Delos trunk was gilded; nothing here is mandatory.

The carving depth everywhere is a fraction of the thinnest twig's radius — small against the 10° margin between the branch cone and the overhang rule — and it rides in the shared field, so STL and GLB exports carry the bark and the twist exactly as rendered.

The cut strut, and the turned one

Every style above imitates something living. The two newest do not, and that is the point of them — the Roman non-figural rod, artifice set beside the body rather than disguised as more body.

Strut is a square-section faceted prism. The distance is exact rather than approximated: the angle around the axis is folded into a single quadrant and projected onto that face's normal, which is the distance to the nearest face plane, so the field stays Lipschitz 1 and the arris stays genuinely sharp instead of being rounded off by an under-estimating field. The apothem sits at the nominal radius, which puts the corners out at 1.41 r and makes the bar read thicker than the limb it holds — which is what the marbles do, and the Palermo satyr is the extreme case of it. The ends are flat and sawn, not domed like a capsule's, and the flats carry a shallow, fine point-worked chatter: the rough tooling Anguissola describes on most struts, against skin that was polished.

Spiral strut is the ornamented version: a cylinder cut with one spiral groove, its phase driven by world height so the groove runs continuous through every joint, and its width narrowed by a power curve so the ridge reads broad and the cut narrow — the way a real groove is chased rather than the way a sine wave looks. It is the Hadrianic turned shaft, not a vine, and keeping those two apart in the style list is most of what reading the book bought.

Both fold into the field at k × 0.45 instead of the forest's full k. That is the same two-tier blend trick the stubs use, and here it is the difference between a carved bar and a melted one: a grown branch wants a generous collar at every junction, but a cut one wants a mitre. At the forest's own blend radius the arrises are wiped off exactly where two capsules meet — the one place a sawn strut should show a clean joint.

The section is a separate choice from the style, because Anguissola's catalogue makes clear it is a separate decision. Three are offered, and they are her three commonest:

The prism also produced the best bug on this page. It dropped the axial component of q. length(q) − r works for a capsule because q retains the past-the-end overshoot, so a point beyond the cap is correctly far away; decomposing into only the two perpendicular directions throws that overshoot away entirely, and the prism ran infinite along its own axis. On screen: square bars shooting out of the piece into the sky and down through the floor, which took a moment to recognise as a distance function that had simply stopped having ends. Fixed with an exact rounded-box combination of the radial and axial terms, which also gives the flat sawn cap for free.

And one bug worth keeping for the diagnostic rule it produced. The spiral strut threw scattered speckles floating in mid-air — not on the surface, in the air around it. Two undefined values in four lines: atan(0,0) is undefined in GLSL and a capsule's axis is exactly that point, and pow(c, 2.2) where c = .5 + .5·cos(…) is zero at the trough in exact arithmetic and a hair negative in floating point, where a fractional power is undefined too. Both are now guarded, and both had been latent in the vine since the day it was written. The rule, which has already paid for itself twice: speckles on the form are a step-size problem; speckles off the form are a not-a-number problem. Diagnose which before touching either.

Using it

In the menu:

The constants, for reference:

overhang threshold 45° from vertical
branch lean limit 35° from vertical
tip spacing 0.06 × the longest axis, up to 22 tips · plus a low pass at 0.032 below 0.35 × height, up to 14 more
descent step 0.035 × longest axis
stand-off from the surface 0.9 × step
merge radius 1.4 × step
thickness exponent 2.5 (pipe model)
relaxation up to 60 passes, λ = 0.5, cone re-imposed after each
tie gap window 0.045 – 0.22 × the piece's span, near-level (`
tie budget 12
capsule budget 136, shared across the whole forest (160 in the shader, covering the forest plus its ties and stubs)

Five kinds of support, of which we have three

Anguissola's material sorts into five members. Naming them properly turned out to be the most useful roadmap available, because each of the missing two is a different generator, not a parameter.

Still open on the skeleton side, in rough order of how much they would change:

What it does not do yet


Photographs of the ancient sculptures are from Wikimedia Commons, not from Anguissola's book, whose plates are separately licensed: Aristodikos kouros by Gary Todd (CC0); Diadoumenos by Francesco Bini (CC BY-SA 4.0); Silenus by sailko (CC BY-SA 3.0). The Spolia renders were made offline from the same baked fragment atlas and the same grown capsule list the app uses, so they are the real field rather than a redrawing of it.

#ai