Luka Grčar
Luka Grčar
Windy Tree v1.4 · webgpu · open source
v1.4 35 species · crown attractor · length curves · gravity sag

A foliage studio. In your browser.

Procedural trees built on WebGPU and TSL — with real-time wind, MTree-style gravity sag, attractor-driven crown silhouettes, drag-to-bend branches, and pipeline-ready glTF export. No install. No build step. Native render path.

35Species
60FPS
0.84msGPU
2MVerts
4LODs

Procedural foliage, native to the browser.

Drawn from Weber-Penn, sagged like MTree, shaped like eztree, exported like SpeedTree.

A canonical tree-grow kernel with refCurve trunks, segment splits, and botanically-correct phyllotaxis — paired with attractor-driven crown seeding, post-pass gravity, three live ramp curves per level, and a Houdini-SOP-style typed-array pipeline that scales to 2M-vert trees.

What's inside

Built for the whole pipeline.

From parametric growth to pipeline-ready export — every stage tuned for real-time foliage work in the browser.

New in v1.4

Crown attractor seeder.

Sketch the silhouette you want — a sphere, a teardrop, an upside-down umbrella — and the grow kernel biases branch direction, length, and phyllotactic placement to fill it. The crown emerges from the shape you draw, not from a fixed Weber-Penn envelope.

Biastropism + length + density
Falloffsmoothstep · per-level
Workermirrored

Gravity sag.

An MTree-style post-pass cascades rotations leaf-to-root, weighting each branch by length × radius². Heavy limbs droop, twigs settle, whorls stay level. Two sliders replace pages of hand-tuning.

Branch grab.

Right-click any node and pull. Ancestors bend along the chain with soft-mass weights; release settles back with springy wind.

Per-level ramp curves.

Three live Catmull-Rom ramps per level — length, randomness, startAngle — plus density and split-points. Five knots each. Drag a knot, the tree reshapes the moment you release.

PBD wind.

Position-based dynamics on every skeleton node. Direction, gust, swirl, turbulence — bark sway driven from a typed-array SoA solver.

Side-by-side LODs + billboard impostor.

Compare LOD0–LOD3 in the same scene. Meshoptimizer where it pays, SimplifyModifier where it doesn't. Final LOD is an 8-tri crossed-quad billboard captured orthographically — drop-in for scattering tools past 100 m.

LOD 0126k
LOD 142k
LOD 212k
LOD 33k
Billboard8

Pipeline-ready glTF.

Wind vertex colors, pivot-painter UVs, named material slots, bounds metadata in extras. Drop-in for Unreal or Unity.

Live scrub.

Radius, profile, knots, buttress, react-wood — drag and the trunk re-extrudes in 50 ms. Tubes-only fast path; foliage skipped while you sculpt.

Worker pool.

Tree, chains, and tubes fan across hardwareConcurrency − 1 workers. Greedy bin-packing keeps each thread fed.

3D-app pivot.

Switch between target, cursor, and bounding-center pivot modes — like Maya, Houdini, or Blender. Capture-phase orbit, no camera reset.

Spotlight palette.

⌘K opens a fuzzy command bar across every slider, species, and toggle. Type two letters and you're there.

PBR + seasons.

MeshPhysical with leaf translucency, tiling bark with normals, and a season palette that fades spring → summer → autumn → winter.

Welcome library.

First load opens a tabbed species library — broadleaf, conifer, bush — with hand-shot thumbnails. Click a card, the tree applies. Dismissed for good after one click.

Species library

35 trees, one click away.

Every preset is a botanically-tuned bundle of phyllotaxis, branching, leaf shape, and seasonal palette. Pick one and start sculpting — or stay on Custom.

Broadleaf 19
Oak Maple Cherry Willow Birch Acacia Olive Baobab Palm Aspen Tupelo Sassafras Lime Beech Plane Tree Ginkgo Lombardy Poplar Japanese Maple Eucalyptus
Conifer 11
Pine Spruce Cedar Cypress Fir Larch Scots Pine Hemlock Juniper Redwood Araucaria
Bush 5
Boxwood Lavender Hydrangea Rosemary Holly
How it works

CPU to GPU, worker to glTF.

A Houdini-SOP-style flat-attribute pipeline. Five O(V) passes collapsed into one pool-fill loop. Tubes-only fast path for live scrubbing.

Build Generate the tree in parallel
Tree graphworker #0
Gravity sagpost-pass
Tube extrudepool · parallel
Pool-fill barkmain thread
Foliage phaseinstanced
PBD + renderwebgpu
Export Bake pipeline data into glTF
Wind colorsvertex rgba
Pivot UVsuv1 + uv2
Material slotsbark · leaf-a · leaf-b
LOD bundle0 → 3
Billboard atlascrossed quad
.glb / .gltf+ extras
Numbers

Engineered for big trees.

Five O(V) passes collapsed into one pool-fill loop. Pooled leaf slots. SoA skeleton with typed-array hot paths. The kernel that builds your tree is the kernel that scales it.

2M Vertex tree, scrubbed live. Tubes-only fast path: ~300 ms per drag tick on a Macbook Pro. Foliage skipped while you sculpt, regenerated on release.
200K Leaves, zero allocations. Pooled leaf slots — steady-state foliage scrub never hits the GC. Per-frame anchor offsets written direct into the instance matrix.
35 Species presets. Oak, Maple, Cherry, Birch, Aspen, Pine, Spruce, Cedar, Redwood, Ginkgo, Plane Tree, Boxwood, Palm — and 22 more.
Stack

No build step. Zero bundler.

Vanilla ES modules, pinned Three.js from a CDN, a worker file, and a handful of textures. That's the whole app.

// rendering
  • WebGPURenderernative path
  • Three.js r184node materials · TSL
  • RenderPipelinebloom · GTAO · DOF
  • PMREMHDRI environment
  • CanvasTexturegrid · procedural needles
  • Device-loss handlergraceful reload
// data
  • Web Workerstree · chains · tubes
  • SoA skeletontyped arrays per channel
  • PBD simedge · bend constraints
  • Pool-fill barkgrow-only typed pools
  • meshoptimizertopology-preserving LOD
  • GLTFExporter+ pipeline metadata
Open source · MIT

Go plant something.

No install. Runs entirely in Chrome or Edge. Export straight to glTF — or fork the source and bend the kernel to your will.