Generator node
L-System
Generative Lindenmayer-system line art: an editable grammar (axiom + rewrite rules) is expanded into up to a quarter-million line segments, then drawn as GPU-instanced animated strokes with growth, wind, pulse, flow, mandala symmetry, gradients and glow. It ships with 27 artistic presets — from Fractal Plant and Dragon Curve to Lightning and 3D Tree — and exposes its skeleton as live point outputs for Plexus, particles and other consumers. Reach for it for organic growth animations, fractal geometry, and anything that should look grown rather than drawn.
Inputs
| Port | Type | Default |
|---|---|---|
| EnableOff clears the output to transparent without losing any settings. | bool | true |
| AxiomThe starting symbol string the rules are applied to, usually one or two letters such as X or F. | string | X |
| RulesThe grammar, one rule per line as X -> F+[[X]-X]. Weighted alternatives like (0.6) F | (0.4) FF give stochastic growth; lines starting with # are notes. | string | X -> F+[[X]-X]-F[-FX]+X
F -> FF |
| IterationsHow many times the rules are re-applied — each pass multiplies the detail. Clamped to 0…12, and the figure is truncated if it blows past the segment cap. | int | 5 |
| AngleHow far each turn symbol bends the path, in degrees. Any value works; 22.5 is the classic plant, 60 and 90 give geometric fractals. | float | 22.5 |
| SeedFixes the random choices in stochastic rules and in the 3D jitter. Any whole number; the same seed always redraws the same figure. | int | 0 |
| Length FalloffHow much shorter each generation of segments gets. Not clamped; 0.6…1 is the natural range, above 1 branches grow instead of tapering off. | float | 1.0 |
| Branch RollRolls every new branch around its parent, in degrees, turning a flat drawing into a spatial one. 137.5 gives the sunflower spiral; any value works. | float | 0 |
| TwistExtra roll added per segment, in degrees, so long branches corkscrew. Any value works; a few degrees is already visible. | float | 0 |
| Jitter 3DRandom pitch and roll per branch, in degrees, so no two limbs match. Not clamped; about 0…30 stays organic, more scatters the figure. | float | 0 |
| XHorizontal placement on the canvas, in Grafit units where 0 is centre. Any value works. | float | 0 |
| YVertical placement on the canvas, in Grafit units where 0 is centre and positive is up. Any value works. | float | 0 |
| ScaleOverall size of the figure. At least 0.001; 1 fits it to the viewport. | float | 1.0 |
| RotationTurns the whole figure, in degrees clockwise. Any value works; it just keeps spinning. | float | 0 |
| Depth 3DMorphs between the flattened version of the figure and its full 3D form. Clamped to 0…1. | float | 1.0 |
| Rotate YSpins the figure around its vertical axis, in degrees. Any value works, and it only shows once Depth 3D is above 0. | float | 0 |
| TiltTips the figure toward or away from the viewer, in degrees. Any value works, and it only shows once Depth 3D is above 0. | float | 0 |
| Camera DistanceHow strong the perspective is: 0 is flat orthographic, 3 is the natural default, 10 and up almost flat again. At least 0. | float | 3.0 |
| CameraSee this system through a Camera node — the same lens a 3D Scene or Particle System fed the same camera uses, which is what keeps their pictures aligned. Unplugged, Camera Distance and the classic view work exactly as before. | structure | — |
| Depth FadeDarkens the parts of the figure furthest from the camera, for depth. Clamped to 0…1, where 1 sinks the far end to black. | float | 0 |
| Fade RangeHow deep the near-to-far darkening ramp reaches, in Grafit units. At least 0.1; small values make the fade abrupt. | float | 2.0 |
| WidthStroke thickness at the trunk, in Grafit units. At least 0.0002; about 0.002…0.03 covers hairline to bold. | float | 0.006 |
| TaperHow much thinner each generation of branches gets. Clamped to 0…1, where 0 is a uniform stroke and 1 makes twigs almost vanish. | float | 0.5 |
| CapsRound or square line ends. Round reads softer and organic, square is crisper on geometric fractals. | int | 0 |
| CopiesRepeats the figure around a circle for mandala symmetry. Clamped to 1…24. | int | 1 |
| Copy AxisWhich axis the copies rotate around: Screen for a flat mandala, Carousel for a ring you look into, Wheel for a spinning wheel. Out-of-range values snap to the nearest. | int | 0 |
| MirrorAdds a mirrored twin of every copy, doubling the symmetry into a kaleidoscope. | bool | false |
| Copy RotateExtra rotation applied to each copy on top of its share of the circle, in degrees. Any value works. | float | 0 |
| GrowthHow much of the figure is drawn, from root to tips. Clamped to 0…1; animate it for a plant that grows on screen. | float | 1.0 |
| Growth ModeHow the growth advances: Path follows drawing order, By Depth reveals generation after generation, Per Branch lets branches race each other. Out-of-range values snap to the nearest. | int | 0 |
| Growth SoftnessHow long the advancing tip stays half-drawn — the softness of the growth front. Clamped to 0.001…1. | float | 0.15 |
| Grow VariabilityHow unevenly branches grow: 0 is one clean wave, 1 lets each branch set off at its own pace. Clamped to 0…1. | float | 0 |
| WindHow far the branches sway, with the outer twigs moving most. Not clamped; 0 is still, and about 0…1 stays believable. | float | 0 |
| Wind SpeedHow fast the sway cycles. Not clamped; 0 freezes the branches mid-bend and negative values reverse the sway. | float | 1.0 |
| PulseA breathing wave running through the stroke thickness. Not clamped; 0 is off and around 0…1 is the useful range. | float | 0 |
| Pulse SpeedHow fast the thickness wave breathes. Not clamped; negative values run it backwards. | float | 1.0 |
| FlowSpeed the dash pattern travels along the branches, and the metallic highlight sweep. Not clamped; negative flows the other way. | float | 0 |
| ShimmerRandom brightness flicker per segment, like leaves catching light. Not clamped; 0…1 is the useful range. | float | 0 |
| TimeOptional external clock in seconds for wind, pulse, flow and shimmer. Leave it negative to use the node's own clock; cable a Timer to scrub or sync the motion. | float | -1 |
| ColorThe stroke colour in Solid mode, and the tint the metallic shading is built on. | color | — |
| Color ModeSolid paints one colour, Gradient reads the connected gradient, Metallic adds a brushed specular sheen. Out-of-range values snap to the nearest. | int | 0 |
| GradientCable a Gradient node here to colour the strokes. Up to 16 stops are used; with nothing connected the plain Color is used instead. | structure | — |
| Gradient ByWhat the gradient is read along: Depth, Path order, Branch, Angle, Length or Height. Out-of-range values snap to the nearest. | int | 0 |
| ShineStrength of the metallic highlight, used only in Metallic mode. At least 0; around 0.3…1.5 reads as brushed metal. | float | 0.5 |
| Opacity FalloffFades the deeper generations of branches out. Clamped to 0…1, where 1 leaves only the trunk solid. | float | 0 |
| DashDash period along the stroke, in path units. At least 0, and 0 draws solid lines; small values give fine ticks. | float | 0 |
| Dash RatioHow much of each dash period is ink rather than gap. Clamped to 0.05…0.95. | float | 0.5 |
| Glow PowerStrength of the bloom halo around the strokes. At least 0; 0 is off and 1…3 is a strong neon glow. | float | 0 |
| Glow CutoffHow bright a pixel must be before it glows. At least 0; low values make everything bloom, high values only the brightest strokes. | float | 0.3 |
| Glow SpreadHow far the bloom reaches. Clamped to 1…5, where 5 is the widest, softest halo. | int | 3 |
Outputs
| Port | Type |
|---|---|
| Image | image |
| WidthStroke thickness at the trunk, in Grafit units. At least 0.0002; about 0.002…0.03 covers hairline to bold. | float |
| Height | float |
| Points | structure |
| Tips | structure |
| Live Tips | structure |
| Structure | structure |
| Count | int |
| Truncated | bool |
Live Preview
How It Works
The pipeline has a CPU half and a GPU half. On the CPU, the Axiom string is rewritten by the Rules for Iterations passes (clamped 0–12, bounded at 1 000 000 symbols — overflow sets the Truncated output instead of failing silently). Rule syntax is one rule per line with # comments; both -> and = are accepted, and stochastic rules use weight-tagged alternatives: X -> (0.6) F[+X] | (0.4) F[-X]. Stochastic choices use a seeded RNG, so the same Seed always replays the same figure.
The expanded symbol string is walked by a 3D turtle (ABOP-standard alphabet):
| Symbols | Action | |
|---|---|---|
F G A B | Draw forward | |
f g | Move forward without drawing | |
+ - | Yaw ± Angle | |
| `\ | ` | Yaw 180° |
& ^ | Pitch ± Angle (3D) | |
\ / | Roll ± Angle (3D) | |
[ ] | Push / pop turtle state (start / end a branch) | |
! | Stroke width × 0.75 | |
' | Color index + 1 (shifts the gradient coordinate) | |
> < | Segment length × 1.25 / × 0.8 | |
| anything else | Structural no-op (X, Y placeholders) |
Three turtle-level parameters add 3D character to any grammar without editing its rules: Branch Roll rolls the frame at every [ (137.5° gives golden-angle phyllotaxis — planar plants become 3D bushes), Twist rolls after every drawn segment (flat curves become spatial ribbons), and Jitter 3D applies seeded random pitch/roll per branch. The figure is normalized root-anchored: the start point sits at the origin and the longest bounding-box side is scaled to 1.6 Grafit units. Segment count is capped at 250 000.
Geometry is rebuilt only when a grammar/turtle input changes (hash-cached); everything else — growth reveal, wind, pulse, dash flow, symmetry copies, perspective — is computed per frame in a single instanced GPU draw call from baked per-segment attributes, at zero CPU cost. A planarized twin of the figure is baked alongside the 3D form, and Depth 3D morphs between them entirely on the GPU (0 = flat, 1 = full 3D).
Growth (0–1) reveals the figure. Three modes:
| Growth Mode | Value | Behavior |
|---|---|---|
| Path | 0 | A distance wave from the root: a segment starts growing exactly when its parent's tip finishes, so the figure is a connected tree at every growth value — no floating pieces |
| By Depth | 1 | Reveal front keyed on bracket-nesting depth, softened by Growth Softness |
| Per Branch | 2 | Branches appear in a stable pseudo-random order, each sweeping along its own length |
Grow Variability (Path mode) gives each branch a seeded random growth speed that compounds down the hierarchy, so branches race organically while staying connected.
Color Mode — Solid (the Color port), Gradient (a connected Gradient node sampled by Gradient By: Depth, Path, Branch, Angle, Length, or Height, offset by ' color indices), or Metallic (cylindrical shading with anisotropic specular controlled by Shine). Dash cuts strokes into a dash pattern (Dash Ratio = filled fraction) and Flow animates it along the path; Flow without Dash becomes a traveling brightness wave. Wind is a position-only displacement field (so parent and child segments can never tear apart at joints), Pulse breathes the stroke width, Shimmer adds per-segment brightness sparkle. All animation defaults to 0 — nothing moves by itself; the Time port (< 0 = internal clock) lets you drive or scrub the clock externally.
Copies (1–24) plus Copy Axis build symmetry: Screen (mandala in the screen plane), Carousel (copies fanned around the vertical axis), Wheel (around the horizontal axis). Mirror doubles everything with an X-flip, and Copy Rotate adds per-copy rotation. Camera Distance applies per-endpoint perspective (0 = orthographic), and Depth Fade darkens far elements toward black over Fade Range.
Beyond Image / Width / Height (figure bounding box × Scale), the node emits its skeleton as structures: Points (all segment endpoints), Tips (terminal endpoints), Live Tips (the tips of the currently grown tree — in Path mode slot-stable, one point per final tip, so index-paired consumers never flicker), Structure (an ordered bundle { root, tips, forks, liveTips } — open it with Get by Name), Count (segment count), and Truncated. All point outputs pass through the exact same transform chain as the rendered figure (including wind and perspective), capped at 10 000 points per category. Output is premultiplied alpha, and Enable = false clears the texture.
Parameters in Depth
Grammar
| Port | Default | Meaning | |
|---|---|---|---|
| Enable | true | Off clears the output texture | |
| Axiom | X | Starting symbol string | |
| Rules | X -> F+[[X]-X]-F[-FX]+X / F -> FF | Rewrite rules, one per line; `\ | alternatives with (weight) prefixes; #` comments |
| Iterations | 5 | Rewrite passes, clamped 0–12 | |
| Angle | 22.5 | Turn angle in degrees for + - & ^ \ / | |
| Seed | 0 | Drives stochastic rules and Jitter 3D — fully deterministic per seed | |
| Length Falloff | 1.0 | Segment length multiplier per branch depth (< 1 = branches shrink) | |
| Branch Roll | 0 | Degrees of roll per [ — 137.5 = phyllotaxis, makes planar grammars 3D | |
| Twist | 0 | Degrees of roll per drawn segment — flat curves become spatial ribbons | |
| Jitter 3D | 0 | Seeded random pitch/roll per branch, degrees |
Transform & 3D
| Port | Default | Meaning |
|---|---|---|
| X / Y | 0 / 0 | Root position in Grafit units (the figure is root-anchored) |
| Scale | 1.0 | Uniform scale (figure is pre-normalized to 1.6 units on its longest side) |
| Rotation | 0 | Degrees, clockwise |
| Depth 3D | 1.0 | GPU morph between flat twin (0) and full 3D form (1) |
| Rotate Y | 0 | Spin around the vertical axis, degrees |
| Tilt | 0 | Tilt around the horizontal axis, degrees |
| Camera Distance | 3.0 | Perspective strength; 0 = orthographic, higher = weaker perspective |
| Depth Fade | 0 | 0 = off … 1 = far elements go black |
| Fade Range | 2.0 | Z span of the near-to-far darkening ramp, Grafit units |
Stroke, Symmetry & Growth
| Port | Default | Meaning |
|---|---|---|
| Width | 0.006 | Base stroke width, Grafit units |
| Taper | 0.5 | 0–1: deeper branches thin down to 12 % of base width |
| Caps | 0 | 0 Round · 1 Square stroke caps |
| Copies | 1 | Symmetry copies, 1–24, evenly spaced |
| Copy Axis | 0 | 0 Screen · 1 Carousel · 2 Wheel |
| Mirror | false | X-mirrored duplicate of every copy |
| Copy Rotate | 0 | Extra per-copy rotation, degrees |
| Growth | 1.0 | 0–1 reveal; 1 = fully drawn |
| Growth Mode | 0 | 0 Path · 1 By Depth · 2 Per Branch |
| Growth Softness | 0.15 | Soft-front width for Depth/Branch modes |
| Grow Variability | 0 | 0 = uniform wave · 1 = branches race at random seeded speeds |
Animation, Color & Glow
| Port | Default | Meaning |
|---|---|---|
| Wind | 0 | Sway amplitude; grows with distance from the root |
| Wind Speed | 1.0 | Wind time scale |
| Pulse | 0 | Stroke-width breathing wave along the path |
| Pulse Speed | 1.0 | Pulse time scale |
| Flow | 0 | Dash travel speed (or a brightness wave when Dash = 0) |
| Shimmer | 0 | Per-segment random brightness sparkle |
| Time | -1 | External clock in seconds; < 0 = internal clock |
| Color | (0.65, 0.95, 0.55, 1.0) | Solid stroke color |
| Color Mode | 0 | 0 Solid · 1 Gradient · 2 Metallic |
| Gradient | — | Gradient-node stops (max 16), used by Gradient mode |
| Gradient By | 0 | 0 Depth · 1 Path · 2 Branch · 3 Angle · 4 Length · 5 Height |
| Shine | 0.5 | Metallic specular sharpness/strength |
| Opacity Falloff | 0 | Deeper branches fade toward 12 % opacity |
| Dash | 0 | Dash period in Grafit units (0 = solid strokes) |
| Dash Ratio | 0.5 | Filled fraction of each dash period (clamped 0.05–0.95) |
| Glow Power | 0 | Post-process bloom intensity |
| Glow Cutoff | 0.3 | Brightness threshold for bloom |
| Glow Spread | 3 | Bloom radius, 1–5 |
Presets
The inspector's preset dropdown writes into the ports (Axiom, Rules, Angle, Iterations, Length Falloff, Taper, Rotation, Branch Roll, Twist) — an editable starting point, not a mode. The 27 presets:
Botanical: Fractal Plant, Fern, Bushy Tree, Weeping Willow, Wild Grass, Grass Clump, Vine, Root System, Seaweed, Conifer.
Geometric / fractal: Dragon Curve, Koch Snowflake, Koch Island, Sierpinski, Hilbert Curve, Gosper Curve, Levy C Curve, Pentaflake, Crystal, Cross Fractal.
Artistic / organic: Lightning, Coral, Mandala, Snow Crystal, Circuit Board, Feather, 3D Tree.
Use Cases
- Growing plant: Fractal Plant preset, Time → LFO (sawtooth) → Growth in Path mode with Grow Variability 0.5 — a tree that grows connected from the root, branches racing organically
- Audio-reactive fractal: Audio FFT → Remap → Wind and Pulse on a Fern, with Glow Power for a concert visual
- Mandala engine: any preset + Copies 8–12 on Copy Axis Screen, Rotation driven by Time — instant kaleidoscopic symmetry; switch to Carousel and add Rotate Y for a 3D crown
- Plexus hybrid: L-System
Live Tips→ Plexus Points — a constellation web that rides the advancing growth front (slot-stable in Path mode, so it never flickers) - Particle emitter skeleton:
Structure→ Get by Name (forksortips) → a particle system's emitter points, so sparks pour from branch junctions - Neon signage: Dragon Curve preset, Color Mode Metallic with high Shine, Dash 0.05 + Flow 2 for marching neon dashes, plus Glow
Tips
- The Image output needs a Canvas node to be visible; Width/Height report the figure's bounding box (× Scale), so a Canvas can wrap it exactly
- Iterations is exponential — going from 5 to 7 can multiply segments by 16×. Watch the Truncated output (and the inspector warning) and back off rather than pushing the 250 000-segment cap
- Path growth mode guarantees a connected tree at every Growth value; By Depth and Per Branch are stylistic fronts that may reveal detached pieces mid-animation
- Wind is deliberately visual-only for point outputs on static patches; cable the Time port if downstream point consumers must sync exactly with the swaying image
- Branch Roll 137.5 is the single most effective knob: it turns any flat preset into a believable 3D bush — then spin it with Rotate Y
- A preset is a starting point: edit the Rules text afterwards and the dropdown flips to Custom without losing your changes
- Glow, like all generator bloom, is a post-process; AA is global (the app-wide AA multiplier), with no per-node quality settings
Open L-System in the interactive catalog →
L-System is one of 381 nodes in Grafit Pro.
Free download. Every feature for 7 days, no card. Then €99.99 once — or keep playing your projects as a Player.