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
- Trees are the wrong primitive
- The rule
- What slicers actually do — and the mistake I made first
- Growing downward
- Relaxing the skeleton
- A support must not need a support
- Standing off
- The tie
- Reading their source
- The Roman argument
- The trunk and the vine
- Using it
- Five kinds of support, of which we have three
- 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 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, 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 numbers — 565 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:
- Down, always, as the base direction.
- A lean toward the nearest sibling, so branches converge instead of falling as a parallel thicket of separate sticks. This is what produces trunks.
- A push away from the piece when too close to its surface — see below.
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.
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.
- Clearance. One
mapWorldcall and a three-axis gradient — the true 3D clearance and a push direction that can go upward. (Theirs cannot; see below.) - 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.
- 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 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.
getRadius()is a pure taper — no pipe model, no tip count. Merging does not thicken a branch:merge_support_element_states()takesmax(distance_to_top), so two 1 mm branches merge into a 1 mm branch and volume is simply not conserved. Spolia'sleafR × tips^(1/2.5)— da Vinci's rule — is a thing the slicer had and abandoned, not a thing it never thought of.- There is no attraction term anywhere in PrusaSlicer. Growth is isotropic offset; merging happens as a side effect of influence areas expanding until one engulfs another. The sibling-lean that produces our trunks has no counterpart at all.
- Junctions are not modelled. Each child is extruded as its own tube and the per-layer polygons are boolean-unioned. Our
sminfillets are real geometry in a real field; theirs is a union in a stack of slices. - They wrote the SDF version and abandoned it.
#define TREE_SUPPORT_ORGANIC_NUDGE_NEWhides an !OpenVDB level-set implementation, kept in tree with a note that it works but is extremely slow for complex meshes — slow because building a narrow band from a triangle mesh is expensive. That cost is the whole of the difference: in Spolia the field is the model, so it is onemap()call, not a conversion. - Their smoother cannot lift a node over a ledge. The escape direction is
normalize(xy(pos) − xy(hit)), taken from per-layer 2D line-BVHs, and the smoothing runs in 2D with Z pinned to the layer grid — so the push is horizontal by construction. (Also, in shipping master,nudge_vectoris alreadyunit × distand is then multiplied bydistagain; the real step isdist². The abandoned !OpenVDB path applies it once, which is how you can tell which one is the bug.) - The shipping smoother has no printability guard at all. There is a bare
//FIXME limit the collision span by the tree slopeexactly where it belongs, and the intended fix — projecting each node back into its influence-area polygon — sits unfinished and uncalled in the same file. Ourunsafe == 0is therefore a stronger claim than the slicer makes about itself, which was a surprise. - Avoidance is a solve, not a local test. They propagate a backward-reachability shadow bottom-up: the set of centres from which a branch cannot reach the plate at all. That names the real remaining gap here honestly — our growth is local, so a branch can descend into a pocket it can never escape, and no amount of per-step cleverness fixes that. It wants the same shape of solve.
- Provenance, corrected. Cura's original tree support is Ruben Dulek (Ghostkeeper), November 2017 — not BagelOrb / Tim Kuipers, which is the version repeated almost everywhere. Thomas Rahm's rewrite is CuraEngine PR #1282, opened 2020-07-02 and merged 2023-04-25; his design document is at
github.com/ThomasRahm/CuraEngine/blob/tree_support_2_error_detection/README.mdand is better than the papers.
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 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 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 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.
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 eight — smooth, 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 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.

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 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

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.

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

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.

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:
- square — the default, and "the great majority" of the surviving struts. A four-sided rod, straight or oblique.
- hexagonal — rarer and finer. Her example is the finely smoothed hexagonal prism between hip and wrist of the Castel Gandolfo pouring satyr, now in the Getty.
- flat slab — a wide, thin bar rather than a rod, exact 2D rounded-box distance, wide across the facet frame and thin through it. This is the section that "often connect[s] the members of multi-figure groups"; the Cyrene Graces are linked by exactly this. It is also, not coincidentally, the right section for a tie, which is doing the Graces' job.
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:
- overhang on / off — the heatmap. Try it before and after re-orienting a piece; rotating a form is usually cheaper than supporting it, and the two measurements above show how much cheaper.
- grow supports — covers the whole piece automatically. Says how many supports, how many segments, and how many reached the plate versus landed on the piece.
- add a support — then tap. The tap names a point that should be held up, not a root to grow from; the branch descends from it like any found tip. Hand-placed tips survive a regrow, because they are your decisions and not the algorithm's.
- support style · smooth / trunk / vine / vine in leaf / pelt / cloth / strut / spiral strut — the carving, cycled. Style and material both survive a regrow.
- strut section · square / hexagonal / flat slab — only appears in the
strutstyle, since a vine has no facets to choose. Survives a regrow like the style and the material. - support material — the same block picker as any fragment.
- clear supports.
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.
- Leg — descends to the build plate. Built.
- Puntello — descends onto the piece's own body and stops there. Built; the probe is re-tested every step rather than latched, so a branch that merely clips a form goes back to being a leg by itself.
- Tie — the horizontal brace between two legs. Built today.
- Connector — missing, and the most interesting one. The tiny bridges between near-touching features of the piece itself: finger to finger, thumb to forefinger, fold to fold, a lock of hair spanning a drill channel. The Polyphemus at Sperlonga has struts between every toe. This is a wholly different generator — find pairs of surface points closer than d that lie on different parts of the field, and bridge them — and it has no slicer analogue whatsoever, because a slicer has no notion of the model's own parts.
- Wedge — missing. The small triangular prop under a slightly raised heel. Anguissola: one of the commonest devices, and the one that most often escapes notice.
Still open on the skeleton side, in rough order of how much they would change:
- Avoidance as a solve, not a local test — the backward-reachability shadow described above. Growth here is local, so a branch can still descend into a pocket it can never climb out of.
- A per-connected-component tip budget. A single global cap can starve a small overhang entirely if a large one uses up the allowance first.
- Engulfment as the merge test rather than contact, which is what PrusaSlicer's influence areas actually do.
- Radius-aware landing. The puntello probe currently tests a single vertical ray, so a thick trunk can happily land on a rim narrower than itself.
- A minimum age before merge, so two tips born adjacent do not fuse before either has become anything.
What it does not do yet
- The thin red line along a continuous lip between contact points, described above.
- On the upright test piece everything still ran to the plate (
onModel: 0). The puntello case is implemented and fires wherever geometry blocks a descent, but it happens by accident of form rather than by preference. Making the short local strut the preferred solution, the way Anguissola's puntelli are, is still the obvious next move. - Supports are one shared forest, not per-fragment objects, and they cannot yet be dragged with the gizmo or saved into the library as a fragment of their own.
- Figurative supports — the herm, the Ampelus boy, an actual lion's head on the pelt — are beyond what a field carve can say. They would be placed fragments, which the library already knows how to hold.
- The capsule budget is a hard 136. Past that the thinnest twigs are trimmed first — reported when it happens, but a trimmed twig means a lost contact point.
- The struts are cut, and the section can be chosen, but a strut is not yet tapered: Anguissola's catalogue is full of prisms that narrow toward one end, and every rod here keeps one profile from top to bottom. The pipe model varies the radius between capsules, which is not the same thing as a bar deliberately drawn down to a point.
- The section is a property of the whole forest. In the marbles it is frequently not — "often, the same statue includes more than one strut of different size and form" — so a per-member section, a flat slab for the ties and rods for the legs, would be closer to the source than a single global choice.
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.




