# zielnik

> Procedural potted plants for three.js and React Three Fiber: two components, `<Pot>` and `<Plant>`, grow a plant from parameters, live or exported as a GLB file. No models, no image files: every texture is generated in code. Made by Pokaz Studio (contact@pokaz.studio).

The site is a 3D playground: pick a recipe, shape it with a few simple controls or every parameter, then share a link, copy the parameters as JSON or export a GLB at one of three detail levels (low ≤ 2k triangles, medium ≤ 8k, high ≤ 25k). The GLB is built in the browser. The playground also has a documentation tab; this file holds the same.

zielnik is not yet published as a package; ask Pokaz Studio for access.

Every plant grows to an age: its leaves are born one by one, unroll, mature, darken and fall, by its growth settings. `plant.age` (years) changes every recipe: a young plant is smaller, with fewer and simpler leaves; an old one is fuller, with bare older wood.

## Recipes

Parameter sets for real plants, each with its age as shown. The first link opens it in the editor; "parameters" is its every value as JSON (`plant` and `pot`), to read before changing it.

### Houseplants
- [Monstera](https://zielnik.pokaz.studio/?r=monstera&utm_source=ai-assistant&utm_medium=llms-txt) — id `monstera`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/monstera.json)
- [Rubber plant](https://zielnik.pokaz.studio/?r=rubber-plant&utm_source=ai-assistant&utm_medium=llms-txt) — id `rubber-plant`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/rubber-plant.json)
- [Arrowhead plant](https://zielnik.pokaz.studio/?r=syngonium&utm_source=ai-assistant&utm_medium=llms-txt) — id `syngonium`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/syngonium.json)
- [Bird of paradise](https://zielnik.pokaz.studio/?r=strelitzia&utm_source=ai-assistant&utm_medium=llms-txt) — id `strelitzia`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/strelitzia.json)

### Small trees
- [Weeping fig](https://zielnik.pokaz.studio/?r=weeping-fig&utm_source=ai-assistant&utm_medium=llms-txt) — id `weeping-fig`, age 4 years, [parameters](https://zielnik.pokaz.studio/recipes/weeping-fig.json)
- [Olive tree](https://zielnik.pokaz.studio/?r=olive&utm_source=ai-assistant&utm_medium=llms-txt) — id `olive`, age 4 years, [parameters](https://zielnik.pokaz.studio/recipes/olive.json)
- [Lemon tree](https://zielnik.pokaz.studio/?r=lemon-tree&utm_source=ai-assistant&utm_medium=llms-txt) — id `lemon-tree`, age 4 years, [parameters](https://zielnik.pokaz.studio/recipes/lemon-tree.json)

### Palms and strap-leaved plants
- [Areca palm](https://zielnik.pokaz.studio/?r=areca-palm&utm_source=ai-assistant&utm_medium=llms-txt) — id `areca-palm`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/areca-palm.json)
- [Snake plant](https://zielnik.pokaz.studio/?r=snake-plant&utm_source=ai-assistant&utm_medium=llms-txt) — id `snake-plant`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/snake-plant.json)

### Succulents and cacti
- [Echeveria](https://zielnik.pokaz.studio/?r=echeveria&utm_source=ai-assistant&utm_medium=llms-txt) — id `echeveria`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/echeveria.json)
- [Aloe vera](https://zielnik.pokaz.studio/?r=aloe&utm_source=ai-assistant&utm_medium=llms-txt) — id `aloe`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/aloe.json)
- [Columnar cactus](https://zielnik.pokaz.studio/?r=column-cactus&utm_source=ai-assistant&utm_medium=llms-txt) — id `column-cactus`, age 8 years, [parameters](https://zielnik.pokaz.studio/recipes/column-cactus.json)
- [Golden barrel cactus](https://zielnik.pokaz.studio/?r=golden-barrel&utm_source=ai-assistant&utm_medium=llms-txt) — id `golden-barrel`, age 6 years, [parameters](https://zielnik.pokaz.studio/recipes/golden-barrel.json)

### Grasses and ferns
- [Boston fern](https://zielnik.pokaz.studio/?r=boston-fern&utm_source=ai-assistant&utm_medium=llms-txt) — id `boston-fern`, age 2 years, [parameters](https://zielnik.pokaz.studio/recipes/boston-fern.json)
- [Ornamental grass](https://zielnik.pokaz.studio/?r=ornamental-grass&utm_source=ai-assistant&utm_medium=llms-txt) — id `ornamental-grass`, age 2 years, [parameters](https://zielnik.pokaz.studio/recipes/ornamental-grass.json)
- [Spider plant](https://zielnik.pokaz.studio/?r=spider-plant&utm_source=ai-assistant&utm_medium=llms-txt) — id `spider-plant`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/spider-plant.json)

### Trailing plants
- [Golden pothos](https://zielnik.pokaz.studio/?r=pothos&utm_source=ai-assistant&utm_medium=llms-txt) — id `pothos`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/pothos.json)
- [English ivy](https://zielnik.pokaz.studio/?r=ivy&utm_source=ai-assistant&utm_medium=llms-txt) — id `ivy`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/ivy.json)

### Flowering plants
- [Peace lily](https://zielnik.pokaz.studio/?r=peace-lily&utm_source=ai-assistant&utm_medium=llms-txt) — id `peace-lily`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/peace-lily.json)
- [Phalaenopsis orchid](https://zielnik.pokaz.studio/?r=orchid&utm_source=ai-assistant&utm_medium=llms-txt) — id `orchid`, age 3 years, [parameters](https://zielnik.pokaz.studio/recipes/orchid.json)
- [Marguerite daisy](https://zielnik.pokaz.studio/?r=marguerite&utm_source=ai-assistant&utm_medium=llms-txt) — id `marguerite`, age 2 years, [parameters](https://zielnik.pokaz.studio/recipes/marguerite.json)

## Links to a changed plant

A link is `?r=<recipe id>`, plus `&d=<change>` for a changed plant: the change is JSON, base64url-encoded without `=` padding, holding only what differs from the recipe, as `{ "plant": { … }, "pot": { … } }`, with the same keys as the parameters below.

Example: `https://zielnik.pokaz.studio/?r=monstera&d=eyJwbGFudCI6eyJzY2FsZSI6MS4yfX0` is a monstera at 1.2× its size (`{"plant":{"scale":1.2}}`); the recipe's own values are in its parameters file. `plant.scale` sizes the plant only: for a bigger pot, change `pot.height` and `pot.diameter`.

Lists (`shoots`) are replaced whole: to change one shoot setting, copy the recipe’s `shoots` from its parameters file, change it there and send the whole list.

Values outside a range are clamped to it, unknown keys are ignored, and an unknown recipe id opens the Monstera.

## `<Plant>` parameters

- `seed` (number): Picks one plant of the kind: positions, sizes, bends. 0…999999, default 1.
- `detail` (choice): Geometry and texture resolution: low for background decor, high for close-ups. One of low, medium, high; default medium.
- `scale` (number): Scales the whole plant (not its pot: that is the pot’s height and diameter). 0.3…2.5, default 1.
- `age` (number): Age in years: shoots with a growth rate grow to it, leaf by leaf (others are as set). 0.2…12, default 3.
- `baseRadius` (number): Radius the stems rise within, when the plant stands outside a pot. 0.005…1 m, default 0.08.
- `shoots` (list): Groups of stems; mix several for mixed plantings. A list of 1–6.
- `shoots[].count` (number): Stems rising from the soil. 1…50, default 3.
- `shoots[].spread` (number): How far from the centre the stems rise, as a share of the base. 0…1, default 0.5.
- `shoots[].clumps` (number): Crowns the stems grow from, as when a pot holds several plants. 1…12, default 1.
- `shoots[].jitter` (number): How irregularly the stems are placed and lean: 0 a perfect spiral. 0…1, default 0.5.
- `shoots[].rise` (number): Inner stems taller and more upright, outer ones shorter and leaning out. 0…1, default 0.4.
- `shoots[].growth` (group): How the shoot grows over the plant’s age: its leaves are born one by one, unroll, grow and fall.
- `shoots[].growth.rate` (number): New leaves a year. Where every stem carries one leaf (a monstera), each new leaf is a new stem from the centre, for the whole shoot; where stems carry several, each stem or branch makes this many at its tip. A shoot without leaves (a cactus) takes 1/rate years to reach its full length. 0: no growth by age, the shoot is drawn as set. 0…40, default 0.
- `shoots[].growth.lifespan` (number): Years a leaf lives before it falls. 0.3…10, default 2.5.
- `shoots[].growth.unfurl` (number): Years a new leaf takes to unroll. 0.02…1, default 0.15.
- `shoots[].growth.maturing` (number): Years an unrolled leaf takes to reach its full size and deep colour. 0.05…4, default 0.8.
- `shoots[].growth.adultAge` (number): Plant age at which new leaves take their full size and adult form (splits, holes): earlier ones are smaller and whole. 0…10, default 2.
- `shoots[].growth.irregularity` (number): How unevenly new leaves come and how much their lives differ: 0 like clockwork. 0…1, default 0.5.
- `shoots[].stem` (group): The stems.
- `shoots[].stem.length` (number): Stem length. 0.01…1.5 m, default 0.5.
- `shoots[].stem.lengthVariation` (number): Random difference in length between stems. 0…1, default 0.25.
- `shoots[].stem.thickness` (number): Stem diameter at the base. 0.001…0.25 m, default 0.008.
- `shoots[].stem.taper` (number): Tip thickness as a share of the base. 0.05…1, default 0.4.
- `shoots[].stem.tilt` (number): Lean away from vertical at the base. 0…75°, default 18.
- `shoots[].stem.tiltVariation` (number): Random difference in lean between stems. 0…1, default 0.5.
- `shoots[].stem.curvature` (number): Bend along the stem: outward (positive) or back in (negative). -1…1, default 0.2.
- `shoots[].stem.droop` (number): How much the stem bends down under its weight (1 trails); negative bends it up. -1…1, default 0.
- `shoots[].stem.wobble` (number): Random kinks along the stem. 0…1, default 0.2.
- `shoots[].stem.color` (color): Stem colour. Default #5b7a3a.
- `shoots[].stem.bark` (number): From smooth green stem (0) to woody bark (1). 0…1, default 0.
- `shoots[].stem.ribs` (number): Ribs along the stem, as on a cactus; 0 for a round stem. 0…40, default 0.
- `shoots[].stem.ribDepth` (number): How deep the furrows between ribs are. 0…0.4, default 0.15.
- `shoots[].stem.tip` (choice): A tapering tip, or a rounded one (a cactus). One of pointed, round; default pointed.
- `shoots[].stem.spines` (group): Spines on the ribs.
- `shoots[].stem.spines.density` (number): Spine tufts per metre along each rib. 0…150, default 0.
- `shoots[].stem.spines.length` (number): Spine length. 0.001…0.08 m, default 0.012.
- `shoots[].stem.spines.color` (color): Spine colour. Default #e9e2c8.
- `shoots[].branching` (list): Levels of side branches, each grown along the level before it. A list of 0–3.
- `shoots[].branching[].count` (number): Side branches on each parent. 0…12, default 4.
- `shoots[].branching[].start` (number): Where along the parent the first branch grows. 0…0.95, default 0.35.
- `shoots[].branching[].end` (number): Where along the parent the last branch grows. 0.05…1, default 0.9.
- `shoots[].branching[].angle` (number): Angle between a branch and its parent. 0…120°, default 40.
- `shoots[].branching[].length` (number): Branch length as a share of the parent. 0.05…1.5, default 0.5.
- `shoots[].branching[].taper` (number): Shorter branches toward the parent tip (1 keeps them even). 0.05…1, default 0.6.
- `shoots[].branching[].thickness` (number): Branch thickness as a share of the parent. 0.1…1, default 0.55.
- `shoots[].branching[].droop` (number): How much the branch bends down under its weight; negative bends it up (a cactus arm). -1…1, default 0.15.
- `shoots[].leaves` (group): The leaves.
- `shoots[].leaves.count` (number): Leaves on each stem or branch tip. 0…40, default 6.
- `shoots[].leaves.start` (number): Where along a stem the first leaf grows. 0…1, default 0.4.
- `shoots[].leaves.arrangement` (choice): How leaves sit around the stem: alternate, opposite, in whorls or a spiral. One of alternate, opposite, whorled, spiral; default spiral.
- `shoots[].leaves.shape` (choice): Outline of the leaf blade (cordate: a slender heart with a shallow notch; heart: a broad one with a deep notch). One of elliptic, ovate, obovate, lanceolate, linear, cordate, heart, round, palmate, pinnate; default ovate.
- `shoots[].leaves.size` (number): Blade length. 0.005…0.8 m, default 0.1.
- `shoots[].leaves.sizeVariation` (number): Random difference in size between leaves. 0…1, default 0.25.
- `shoots[].leaves.tipSize` (number): Size of the youngest leaves, at a tip, as a share. 0.1…1.5, default 0.7.
- `shoots[].leaves.aspect` (number): Blade width as a share of its length. 0.01…1.5, default 0.55.
- `shoots[].leaves.petiole` (number): Length of the leaf stalk. 0…0.4 m, default 0.03.
- `shoots[].leaves.angle` (number): Angle between the leaf and the stem. 0…150°, default 50.
- `shoots[].leaves.angleTip` (number): Angle of the leaves at the tip, blending from `angle` (inner rosette leaves stand up); -1 keeps `angle`. -1…150°, default -1.
- `shoots[].leaves.thickness` (number): Fleshy thickness as a share of the blade’s width; 0 for a thin leaf (a succulent is thick). 0…1, default 0.
- `shoots[].leaves.droop` (number): How much the blade bends down toward its tip. 0…1, default 0.25.
- `shoots[].leaves.curl` (number): Edges curled up (positive) or down (negative) across the blade. -1…1, default 0.15.
- `shoots[].leaves.fold` (number): Fold along the midrib, into a V. 0…1, default 0.1.
- `shoots[].leaves.twist` (number): Random turn of each blade around its stalk. 0…1, default 0.15.
- `shoots[].leaves.clustering` (number): How much leaves crowd toward the tip of a stem: 0 evenly spaced. 0…1, default 0.3.
- `shoots[].leaves.spacing` (number): How strongly leaves turn away from each other instead of passing through; 0 for none. 0…1, default 0.7.
- `shoots[].leaves.irregularity` (number): How unevenly each leaf grows: wavy edges, a swaying midrib, uneven halves and veins. 0…1, default 0.4.
- `shoots[].leaves.lobes` (number): Lobes of a palmate leaf. 3…11, default 5.
- `shoots[].leaves.lobeDepth` (number): How deep the palmate lobes are cut. 0…0.95, default 0.5.
- `shoots[].leaves.leaflets` (number): Leaflets on each side of a pinnate leaf (a frond). 3…60, default 18.
- `shoots[].leaves.leafletWidth` (number): Leaflet width as a share of the gap between leaflets; 1 closes the gaps. 0.1…1, default 0.6.
- `shoots[].leaves.leafletAngle` (number): Angle between a leaflet and the frond’s midrib. 15…90°, default 55.
- `shoots[].leaves.holes` (number): Holes between the veins, as on a monstera. 0…1, default 0.
- `shoots[].leaves.splits` (number): Slits cut in from the edge between the veins. 0…1, default 0.
- `shoots[].leaves.serration` (number): Teeth along the edge. 0…1, default 0.
- `shoots[].leaves.veins` (number): How strongly the veins show. 0…1, default 0.5.
- `shoots[].leaves.veinCount` (number): Side veins on each half of the blade. 2…30, default 8.
- `shoots[].leaves.color` (color): Leaf colour. Default #3f6b2a.
- `shoots[].leaves.colorVariation` (number): Random difference in shade between leaves. 0…1, default 0.2.
- `shoots[].leaves.youngColor` (color): Colour of the youngest leaves, at a tip. Default #7fa04a.
- `shoots[].leaves.variegation` (number): How much of the blade is variegated. 0…1, default 0.
- `shoots[].leaves.variegationPattern` (choice): Where the variegation goes: patches, cross bands, stripes along the blade, or the edge. One of patches, bands, stripes, edge; default patches.
- `shoots[].leaves.variegationColor` (color): Colour of the variegation. Default #e8e4c8.
- `shoots[].leaves.gloss` (number): From matte (0) to glossy (1). 0…1, default 0.4.
- `shoots[].flowers` (group): Flowers along the leafy stems.
- `shoots[].flowers.count` (number): Flowers on each stem or branch tip; 0 for none. 0…30, default 0.
- `shoots[].flowers.start` (number): Where along a stem the first flower grows. 0…1, default 1.
- `shoots[].flowers.angle` (number): Angle between a flower stalk and the stem. 0…150°, default 40.
- `shoots[].flowers.stalk` (number): Length of each flower’s own stalk. 0…0.4 m, default 0.02.
- `shoots[].flowers.petals` (number): Petals in each ring. 1…24, default 5.
- `shoots[].flowers.layers` (number): Rings of petals, each smaller and inside the last. 1…4, default 1.
- `shoots[].flowers.petalShape` (choice): Outline of a petal. One of elliptic, ovate, obovate, lanceolate, linear, cordate, round; default obovate.
- `shoots[].flowers.size` (number): Petal length. 0.003…0.3 m, default 0.025.
- `shoots[].flowers.aspect` (number): Petal width as a share of its length. 0.05…1.5, default 0.5.
- `shoots[].flowers.cup` (number): From open and flat (0) to a closed cup (1). 0…1, default 0.2.
- `shoots[].flowers.color` (color): Petal colour. Default #f2efe6.
- `shoots[].flowers.centerColor` (color): Colour of the centre. Default #e2b432.
- `shoots[].flowers.centerShape` (choice): The centre: a flat disc, a dome or a spike. One of disc, dome, spike; default dome.
- `shoots[].flowers.centerSize` (number): Centre size as a share of a petal’s length. 0…2, default 0.3.

## `<Pot>` parameters

- `seed` (number): Varies the surface: speckles, glaze pooling, weave. 0…999999, default 1.
- `detail` (choice): Geometry and texture resolution: low for background decor, high for close-ups. One of low, medium, high; default medium.
- `height` (number): Height from the floor to the top of the rim. 0.04…0.8 m, default 0.22.
- `diameter` (number): Outer width at the top of the body, under the lip. 0.04…0.8 m, default 0.22.
- `bottomRatio` (number): Bottom width as a share of the top: below 1 tapers in, above 1 flares out. 0.3…1.4, default 0.78.
- `bulge` (number): Belly (positive) or waist (negative), as a share of the width. -0.3…0.5, default 0.
- `bulgeAt` (number): Where the belly or waist is widest, from the bottom. 0.1…0.9, default 0.45.
- `squareness` (number): Section from round (0) to square with soft corners (1). 0…1, default 0.
- `wall` (number): Wall thickness, seen at the rim. 0.004…0.05 m, default 0.012.
- `lip` (group): The rim band, as on a classic terracotta pot.
- `lip.height` (number): Height of the band around the rim; 0 for none. 0…0.15 m, default 0.025.
- `lip.overhang` (number): How far the band stands out from the body. 0…0.04 m, default 0.006.
- `foot` (group): An optional pedestal under the body.
- `foot.height` (number): Height of a pedestal foot; 0 for none. 0…0.12 m, default 0.
- `foot.width` (number): Width of the foot where it stands, as a share of the body’s bottom width. 0.2…1.2, default 0.6.
- `color` (color): Base colour of the pot. Default #d9d3c7.
- `finish` (choice): Surface: matte ceramic, glossy glaze, terracotta, concrete or a woven basket. One of matte, glaze, terracotta, concrete, basket; default matte.
- `variation` (number): How uneven the surface is: speckles, mottling, glaze pooling. 0…1, default 0.35.
- `topping` (group): The surface inside the pot, where a plant stands.
- `topping.type` (choice): What fills the top: soil, pebbles, bark, moss or nothing. One of soil, pebbles, bark, moss, none; default soil.
- `topping.color` (color): Colour of the topping. Default #3d2c22.
- `topping.depth` (number): How far below the rim the topping sits. 0…0.2 m, default 0.02.

## Trees

A `<Tree>` is a tree outside, as in a garden or a street seen from a window: grown to its `age` (years) by its species’ settings, and dressed for the time of year by `season`: 0 the start of spring, 1 summer, 2 autumn, 3 winter, 4 spring again (0.5, 1.5, 2.5 and 3.5 are the middle of each). A deciduous tree leafs out across spring (a cherry flowers first), turns its autumn colours and falls through autumn, and is bare in winter; an evergreen keeps its needles. Changing the season only redresses the tree, so it can be animated.

A tree link is `?t=<tree id>`, plus `&d=<change>` as for plants with the change as `{ "tree": { … } }`, and `#trees` to open the tree editor. Example: `https://zielnik.pokaz.studio/?t=wild-cherry&d=eyJ0cmVlIjp7InNlYXNvbiI6MC4zfX0#trees` is a wild cherry in blossom (`{"tree":{"season":0.3}}`).

- [Japanese maple](https://zielnik.pokaz.studio/?t=japanese-maple&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `japanese-maple`, age 20 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/japanese-maple.json)
- [Silver birch](https://zielnik.pokaz.studio/?t=silver-birch&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `silver-birch`, age 25 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/silver-birch.json)
- [London plane](https://zielnik.pokaz.studio/?t=london-plane&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `london-plane`, age 40 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/london-plane.json)
- [Norway spruce](https://zielnik.pokaz.studio/?t=norway-spruce&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `norway-spruce`, age 30 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/norway-spruce.json)
- [Black pine](https://zielnik.pokaz.studio/?t=black-pine&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `black-pine`, age 40 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/black-pine.json)
- [Wild cherry](https://zielnik.pokaz.studio/?t=wild-cherry&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `wild-cherry`, age 25 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/wild-cherry.json)
- [Linden](https://zielnik.pokaz.studio/?t=linden&utm_source=ai-assistant&utm_medium=llms-txt#trees) — id `linden`, age 35 years, [parameters](https://zielnik.pokaz.studio/recipes/trees/linden.json)

## `<Tree>` parameters

- `seed` (number): Picks one tree of the kind: branches, bends, leaf clusters. 0…999999, default 1.
- `detail` (choice): Geometry and texture resolution: low for a far tree line, high for one close by. One of low, medium, high; default medium.
- `scale` (number): Scales the whole tree. 0.3…2.5, default 1.
- `age` (number): Age in years: a sapling at one or two, its full height by its trunk’s maturity, then a fuller crown. 1…150, default 20.
- `season` (number): Time of year: 0 the start of spring, 1 summer, 2 autumn, 3 winter, 4 spring again; a value between blends the two. 0…4, default 1.5.
- `habit` (choice): Broadleaf: the trunk divides into a spreading crown. Conifer: one leader to the top, branches in tiers. One of broadleaf, conifer; default broadleaf.
- `evergreen` (boolean): Keeps its leaves (or needles) through winter. Default false.
- `trunk` (group): The trunk (or trunks).
- `trunk.height` (number): Height when grown. 1…40 m, default 10.
- `trunk.maturity` (number): Years it takes to reach most of its height. 3…150, default 35.
- `trunk.stems` (number): Trunks from the ground, as in a clump of birch. 1…6, default 1.
- `trunk.girth` (number): Trunk diameter at the base when grown. 0.04…2.5 m, default 0.45.
- `trunk.lean` (number): How far the trunk leans from upright. 0…35°, default 4.
- `trunk.wobble` (number): How irregularly the trunk and branches wander. 0…1, default 0.15.
- `trunk.clear` (number): Bare trunk below the crown, as a share of the height (lower branches are shed as it grows). 0…0.85, default 0.3.
- `trunk.color` (color): Bark colour. Default #6b6158.
- `trunk.bark` (number): Bark roughness: 0 smooth (a beech), 1 deeply fissured (an oak). 0…1, default 0.6.
- `crown` (group): The branches and the shape they make.
- `crown.width` (number): Crown width as a share of the tree’s height. 0.15…1.5, default 0.65.
- `crown.branches` (number): Main branches from the trunk (a conifer’s, in whorls of four up the leader). 2…120, default 8.
- `crown.angle` (number): Angle of the main branches from the trunk. 5…110°, default 50.
- `crown.droop` (number): How far branches sag: 1 weeping, as a willow or a birch. 0…1, default 0.15.
- `crown.twigs` (number): Side branches on each branch, at each level. 1…12, default 5.
- `crown.levels` (number): Levels of branching below the twigs that hold the leaves. 1…4, default 3.
- `crown.fill` (number): How densely the twigs are clothed: leaf clusters along them. 0.2…3, default 1.
- `leaves` (group): The foliage.
- `leaves.shape` (choice): Outline of each leaf (palmate for a maple, linear for needles). One of elliptic, ovate, obovate, lanceolate, linear, cordate, heart, round, palmate, pinnate; default ovate.
- `leaves.size` (number): Leaf length (a needle’s, on a conifer). 0.01…0.4 m, default 0.08.
- `leaves.aspect` (number): Leaf width as a share of its length. 0.05…1.5, default 0.6.
- `leaves.cluster` (number): Width of a spray of leaves on a twig: larger reads as a denser, coarser crown. 0.1…3 m, default 1.
- `leaves.spring` (color): Colour of the new leaves in spring. Default #9cc45a.
- `leaves.summer` (color): Colour in summer. Default #4c7a2e.
- `leaves.autumn` (color): Autumn colour. Default #d08a2a.
- `leaves.autumnAlt` (color): A second autumn colour some leaves turn instead. Default #b8452a.
- `leaves.variation` (number): How much the colour differs from spray to spray. 0…1, default 0.25.
- `blossom` (group): Spring blossom, as on a cherry or a magnolia.
- `blossom.amount` (number): Flowers in spring, before and with the new leaves: 0 none. 0…1, default 0.
- `blossom.color` (color): Blossom colour. Default #f4d4dc.
