· Nick  · 5 min read

Luminid Design

Dev Log 3: Sculpting a Procedural Forest

Procedural forests are easy to promise and tricky to deliver. This week I finally cracked it: Luminids now has full scale procedural trees that feel alive, anchored in a voxel world, and powered by our favorite space colonization wizardry.

Procedural Forest Generation

Procedural forests are easy to promise and tricky to deliver. This week I finally cracked it: Luminids now has full scale procedural trees that feel alive, anchored in a voxel world, and powered by our favorite space colonization wizardry.

Space Colonization, Turbocharged

The tree generator still follows the classic space colonization algorithm: place attractor points in the crown, grow branches toward them, prune the leftovers. The difference now is how aggressively the system scales itself. Each species defines real world heights, from soft silver birches to towering poplars. When the overlay terrain runs at quarter scale, the generator multiplies every branch vector, influence radius, and leaf cluster radius by one over that scale. A 12 meter oak becomes a 48 meter internal giant. The colonization pass keeps its proportions, then the scene graph shrinks it back to reality.

How the Space Colonization Algorithm Works

The algorithm starts by scattering attractor points throughout the target crown volume. These points define where the tree should grow: they’re the destinations. Then the system seeds a trunk at the base and begins growing branches toward the nearest attractors. Each branch tip checks its neighborhood, finds the closest attractor within its influence radius, and grows a segment in that direction. As branches approach attractors, they claim them. Once an attractor is claimed, it stops pulling new growth. The branches that never reach an attractor get pruned away. What’s left is a branching structure that naturally fills the crown space, with thicker trunks near the base and finer twigs at the edges. Random seeds ensure every tree feels unique while the algorithm guarantees biological plausibility.

Space Colonization Algorithm Visualization

Dual Terrain Magic

Luminids runs two terrain layers in parallel. The primary terrain uses one meter voxels for performance. The tree overlay runs at quarter meter resolution so leaves can flutter without jagged edges. To make that work I added an empty generator preset that pre-fills every chunk in the overlay with air. The moment a tree buffer arrives, the terrain has a home for it. After pasting we issue a save command which forces the mesher to rebuild only the affected chunks. The result: the world stays light, but every tree gets the detail it deserves.

Procedural Forest Generation - Voxel Trees
Voxel Tree Detail - Dual Terrain System

Atlas Driven Foliage

The trees render with a block-based mesher. That means every branch and leaf references our texture atlas, not a stack of separate materials. The atlas keeps draw calls low and lets us pack bark, lichens, moss, and leaf variants into a single lookup. Because the block mesher does not pass UV2 channels, we built a 256 by 1 lookup map: each block model index fetches the correct layer in the texture array. The generator stores branch radius and leaf density per voxel, the mesher reads the lookup, and the engine turns it into shaded foliage in a single pass.

Fast by Design

My original implementation tried to be clever. It checked every voxel before writing, merged overlapping spheres, and paid dearly for it. The improved version writes first and keeps sampling intervals simple. Branch radii escalate with tree scale using a soft 1.2 multiplier. Leaf clusters get a gentle 1.8 boost for readability. The buffers now average 50 to 200 thousand voxels, fill rates sit around thirty percent, and a grove of seven trees loads in roughly two seconds.

Why it Feels Good

  • Real meter heights: everything aligns with player scale
  • Atlas based shading: consistent art direction with minimal draw calls
  • Space colonization: every tree emerges from the same algorithm, but random seeds keep shapes unique
  • Dual terrain: trunks tap the heavy terrain, crowns dance on the detail grid
  • Lightweight tooling: a batch script fixes attractor influence for every species in one click

What’s Next

The system supports even bigger scales: six times for old growth forests, eight for legendary biomes. We only need to expand buffer sizes and adjust attractor influence accordingly. With the technical pieces locked in, the fun part begins.

Nick

Wishlist Luminids™ on Steam

If this dev log clicked with you, the biggest way to support is a wishlist.

Back to Blog

Related Posts

View All Posts »

Dev Log 4: Building and Animating the Luminids

This week the focus was on the actual creation of the Luminids themselves. Model work, rigging, animation tests, and trying to lock down how these creatures look and move in the game. This is the first time Luminids have started to feel like real characters instead of placeholder blobs.

Dev Log 1: Welcome to Luminids

I'm building Luminids because I want a world that feels alive. Just a place that grows, where tiny beings make choices and the world reacts.