AssetPro - PlanetGen — Procedural Spherical Planet | Gravity | Streaming | Foliage | UE5

PlanetGen is a runtime C++ plugin (with full Blueprint support) for Unreal Engine 5 that generates streaming procedural spherical terrain — a full planet you can fly around, land on, and explore. Async chunk streaming, layered 3D noise, biome blending, foliage, water sphere, and radial gravity, all without blocking the game thread.

Includes a ready-to-use jetpack character (BP_JetpackCharacter) with full planetary gravity — walk on the surface, jump off, fly around, and land anywhere on the sphere. Reparent your own character to ACLMPlanetCharacter and gravity works automatically.

Drop ACLMPlanet into your level, assign a material, and click Preview Planet. Hit Randomize for a new world.


Documentation
Playable demo

0.1 Cube-Face Sphere Terrain Explained

0.2 Noise Layering & Biome Blending Explained

0.3 Biome-Aware Vegetation System

──────────────────────────────

CORE FEATURES

──────────────────────────────

  • Spherical Streaming Terrain — Cube-face parameterization divides the sphere into 6 faces, each streamed as a grid of chunks. Actor pool recycles chunks at runtime — no spawn/destroy overhead.

  • 3D Noise Sampling — All noise is sampled in 3D world space, ensuring perfectly uniform terrain on every face with zero equatorial stretching. No distortion at the poles or seams between faces.

  • Async Mesh Generation — Geometry built entirely on a thread pool. Game thread is never blocked.

  • Layered Noise Stack — Stack up to N noise layers. Layer 0 acts as a continental mask controlling where mountains appear vs flat plains. Built-in presets: HighDetail, Smooth, Mountains.

  • Custom Noise Library — CLMNoise is a lightweight, purpose-built noise engine supporting Perlin, Simplex, Cellular, Ridged Multifractal, and Domain Warp. Tuned specifically for planetary terrain — no overhead from unused noise types, no third-party dependencies.

  • Radial Gravity — UCLMPlanetaryMovementComponent replaces the default CharacterMovementComponent and pulls the player toward the planet center every tick. Gravity activates within a configurable GravityRadius and scales with GravityScale (1.0 = Earth, 0.165 = Moon). Auto-finds the nearest planet at BeginPlay, or assign manually.

  • Playable Planet Character — ACLMPlanetCharacter is a ready-to-use Character subclass with planetary gravity wired in. Reparent your own Blueprint to it and gravity works immediately. Includes BP_JetpackCharacter — a demo character with a jetpack for flying around and landing on the planet surface.

  • Blueprint Interface — IPlanetInterface exposes GetPlanetRadius, GetGravityRadius, GetPlanetCenter, and GetSeed to any Blueprint or C++ class without a direct reference to ACLMPlanet.

  • Biome Blending — Vertex color blend weights for Grass / Rock / Snow / Underwater. Plug directly into any landscape material.

  • Beach Layer — Configurable height band above sea level is flattened and assigned a sand blend weight baked into UV1.x. Sample TextureCoordinate(1).R in your material to drive a beach/sand layer.

  • Foliage System — BiomeFoliageAsset data assets drive HISM scatter on the thread pool. Per-mesh density, height, slope, scale, clustering, and collision. Same data assets as WorldGen flat terrain — configure once, use on both.

  • Dense Grass System — WorldGenGrassAsset data assets drive ISM ground cover at high resolution. Slope-aware instance sinking, surface normal alignment, per-chunk random jitter.

  • Procedural Water Sphere — Smooth UV sphere at sea level. Configurable subdivisions (default 64) for silky-smooth appearance at any planet scale.

  • Seed and Randomize — Every planet is seeded and deterministic. One click generates a completely new world. Seed is exposed so you can save and share specific planets.

  • ACLMPlanetSunSky subclass — Optional subclass with full SunSky integration. Requires SunPositionCalculator plugin (bundled with UE5). Assign your SkyAtmosphere and VolumetricCloud components in the Details panel — radius and cloud altitude auto-configure to match your planet on Preview Planet.

  • Editor Preview — CallInEditor buttons (Preview Planet, Clear Planet, Randomize Planet) rebuild terrain without entering Play mode.

──────────────────────────────

TECHNICAL HIGHLIGHTS

──────────────────────────────

  • Full Blueprint Support — All properties are Blueprint-readable and writable. PreviewPlanet(), ClearPlanet(), RandomizePlanet(), and UpdateGravityDirection() are Blueprint-callable at runtime.

  • ProceduralMeshComponent-based geometry

  • Cube-face parameterization — equal-area distribution, no pole distortion

  • 3D noise sampling — zero equatorial stretching on any planet size

  • No third-party code — CLMNoise is original, license-free

  • Fully exposed parameter categories with tooltips and clamped slider ranges

  • Seeded RNG per chunk — deterministic foliage placement

  • Compatible with WorldGen flat terrain foliage and grass data assets

  • ACLMPlanetCharacter — ready-to-use Character subclass with planetary gravity wired in

──────────────────────────────

INCLUDED

──────────────────────────────

  • Full C++ source

  • Pre-built planet material (M_Planet) with biome blending wired up

  • Water sphere materials (M_Water, M_WaterSimple, MI_Water)

  • Sample foliage data asset (DA_FoliageTrees — trees, pine)

  • Sample grass data asset (DA_Grass)

  • Sample tree and pine meshes with materials (SM_Tree, SM_Pine)

  • Sample grass mesh with material (SM_GrassClump)

  • Sample jetpack mesh (SM_Jetpack)

  • BP_CLMPlanet — Blueprint subclass of ACLMPlanet for easy editor configuration

  • BP_JetpackCharacter — Demo character with jetpack and planetary gravity

  • PlanetMap demo level — fully configured planet ready to Preview Planet out of the box

──────────────────────────────

PERFECT FOR

──────────────────────────────

Space games, planetary exploration, sci-fi survival, alien world prototypes, and any project needing a fully streaming spherical planet with real terrain, gravity, and biomes — without writing cube-sphere math, noise systems, chunk management, or gravity code from scratch.

──────────────────────────────

ADDITIONAL NOTES

──────────────────────────────

  • Requires the ProceduralMeshComponent plugin (bundled with Unreal Engine 5, enabled by default).

  • ACLMPlanetSunSky works with any actor that has a SkyAtmosphereComponent and VolumetricCloudComponent — assign them in the Details panel. Compatible with the built-in SunSky actor (SunPositionCalculator plugin, bundled with UE5) but does not require it.

  • Foliage and grass data assets are fully compatible with the WorldGen flat terrain plugin — one set of assets works on both flat and spherical terrain.

What’s New in V1.2

Feature Description
Player-following grass & foliage scatter Dense grass now scatters in a disc that follows the player and is fully decoupled from chunk loading — no hitch when crossing chunk borders. It re-scatters only when the player moves (GrassRefreshDistance) and uploads on a per-frame instance budget (GrassUploadBudget) so even a big teleport fades in over a few frames instead of spiking.
Per-instance collision bubble New CollisionRange on the grass asset: one asset can show a wide field of visuals while only instances near the player carry physics (e.g. a 150 m collision bubble inside a 1 km visual radius). The bubble follows the player.
Clustering, jitter & shadow control Grass assets gain bCluster / NumClusters / ClusterRadius / ClusterFalloff, PositionJitter, and bCastShadow (off by default for a large performance gain).
Enable Foliage / Enable Grass toggles Master switches on the planet to turn either system on/off without removing your assets.
Preview Size (Water Only) New editor button that rescales just the water sphere to the current radius and clears any terrain — gauge planet size instantly with zero chunk generation. The water sphere also live-updates when you change the radius in the editor.
Target Sun Sky Actor Assign your whole SunSky actor in one slot; its SkyAtmosphere, VolumetricCloud and DirectionalLight are found automatically and kept matched to the planet — live, in the editor.
Sun shadow distance New SunShadowDistance configures the directional light’s dynamic-shadow / Virtual Shadow Map clipmap range so terrain shadows reach across the planet (default 5 km).
Single Layer Water material New M_PlanetWater uses UE’s Single Layer Water shading model so volumetric clouds render correctly over the ocean when viewed from space (translucent water hides clouds).
Memory guardrail New MaxChunksPerFace caps the chunk pool so a large radius combined with a small tile size can’t spawn tens of thousands of chunks and exhaust memory.
Faster noise Noise layer state is compiled/cached once, speeding up every height sample.
Installs alongside sibling plugins All types and headers are uniquely prefixed (PlanetGen…), so PlanetGen installs cleanly in the same project as other CodeLikeMe plugins (WorldGen, CityGen) with no class/header conflicts.

image

What’s New in V1.3

Real Climate Zones on a Procedural Planet

image

Feature Description
Spatial Climate Biomes An optional temperature × humidity climate model places every point in a Tundra / Boreal / Desert / Tropical matrix. Each biome drives its own snow line, rock line, grass density and desert-sand amount, bilinearly blended (with a BiomeBlend control for sharp, flat interiors). Temperature follows latitude (cold poles, hot equator) blended with regional noise via LatitudeWeight; the climate noise auto-scales to the planet radius (bAutoScaleClimate / ClimateBandMultiplier). Deterministic and seam-free across chunk borders.
Polar Ice Caps New PolarLatitude / PolarBlend — a hard, latitude-based polar cap forces snow down to the shoreline (and slightly below sea level) and removes beach/sand poleward of the set latitude, independent of the climate noise, for clean white caps every time.
Desert Sand layer Arid biomes get a separate sand weight baked into UV1.y, distinct from the shoreline beach on UV1.x, so deserts and beaches can use different textures. Controlled by DesertSandTopNorm and the per-biome SandMult.
Climate Filter Matrix Every foliage entry and grass asset gains a multi-select ClimateBiomes mask (Tundra/Boreal/Desert/Tropical). Combined with the surface biome it selects a cell of the full biome matrix — e.g. a cactus only in deserts, pines only in boreal zones. Only filters when spatial biomes are enabled.
Planet slope mask The terrain material reads a PlanetCenter vector parameter (set automatically via a dynamic material instance) so a radial slope mask works for planets placed anywhere in the world. Cross-chunk vertex normals are now seamless.
Beach flattening The shoreline beach band is flattened into the terrain (BeachFlattenStrength) for proper sandy shelves at the waterline.
Sample desert flora New cactus mesh + materials and a DA_GrassCactus grass asset demonstrate the desert biome and climate filter.

What’s New in V1.4

Unreal Engine 5 Multiplayer Walkable Planets — PlanetGen V1.4

image

Feature Description
Multiplayer gravity framework Placeable gravity volumes (sphere / cylinder / box) + a gravity subsystem let characters walk any surface — planets, ring worlds, cuboids — with correct “down” everywhere. Overlapping sources resolve by priority; each ACLMPlanet auto-registers a spherical field sized to its GravityRadius (toggle bProvidePlanetGravity).
Prediction-correct movement UPlanetGenGravityMovementComponent is a custom UCharacterMovementComponent with full client prediction (saved moves + simulated-proxy rotation/mode smoothing). Gravity direction is recomputed per tick from position — deterministic, so it’s never replicated (bandwidth-free, seam-free).
Per-source strength + zero-g Each volume has a GravityStrength multiplier (1 = Earth, 0.165 = Moon, 2 = heavy). A PlanetGenGravityDefaults actor sets the level default direction + DefaultGravityStrength and can flag zero-gravity regions (character floats, stays upright).
Gravity character APlanetGenGravityCharacter — EnhancedInput, gravity-aligned orbit camera, jetpack hover + vertical thrust, zero-g flight. Ships as BP_GravityCharacter / BP_GravityJetpackCharacter. Uses UE5’s native variable-gravity CMC.
Legacy gravity deprecated The single-player ACLMPlanetCharacter / UCLMPlanetaryMovementComponent remain functional but are superseded by the framework above.

What’s New in V1.5

Unreal Engine 5 Ring World — Walkable O’Neill Habitat

image

Feature Description
Ring worlds (ACLMRingWorld) Cylindrical O’Neill habitats on the same terrain / noise / biome / grass / foliage pipeline as spherical planets. Terrain sits on the inner surface (a habitat — centrifugal gravity presses you onto the floor, the world curves up overhead) or the outer surface (bRingInnerSurface). Ring distances (Ring Length, radius, tile size) are authored in km, heights in m.
Windowed ring streaming Chunks stream in a window around the player and wrap around the circumference, so very large rings cost only what is near you. View Distance now goes up to 30 (rings stream a window — keep spheres low).
Centrifugal ring gravity The gravity framework’s cylinder volume auto-matches the ring (radius + length, half-height = ring half-length); gravity points outward on an inner-surface habitat, inward on an outer-surface ring.
Structural shell A procedural hull cylinder on the non-walkable side + solid, collidable end walls that cover the terrain edges up to the highest peak (Shell Thickness, Wall Thickness, Wall Height Override, Shell Material). Poly count scales with ring size.
Stacked cloud / atmosphere layers A Shell Layers array of concentric, translucent, collision-free cylinders — a cloud deck + atmosphere haze, each with its own Altitude / Enclose At Wall Top, Material and look params. Add layers to fly up through a cloud wall.
Ring atmosphere + post-process fog Starter horizon-haze material M_RingAtmosphere (fed the ring’s radial/axis frame), and a ring-masked post-process distance fog (M_RingPostProcess + MPC_Ring, driven by UpdateRingPostProcessMPC) that confines effects to the ring interior.
Shape-aware grass + foliage Dense grass and tree/rock foliage now derive surface up / height / slope from the ring axis, so they place correctly on cylinders. Spheres are byte-identical.
Absolute Beach Height Beach Height (m) replaces the old fraction-of-range beach width — an absolute band above sea level, independent of the Min/Max height range. Inner-surface ring water tessellation fixed (no drowned near-shore terrain).

Ring

What’s New in V1.6

Feature Description
Multi-planet LOD Place as many planets in a level as you like. UPlanetGenLODSubsystem picks the planet whose surface you are nearest, streams full terrain for that one (LOD0), and renders every other planet as a single low-poly sphere (LOD1). Only one chunk pool is ever alive — that is what makes many-planet levels affordable. Hysteresis (LOD Hysteresis) plus a “must be clearly closer” margin stops it flip-flopping mid-field.
Envelope LOD transition The far sphere is scaled slightly above the terrain peaks for the distant view, then eased below the streamed chunks so it is hidden by occlusion rather than a dither pop. The envelope is sized from the measured generated terrain (peak + under-sampling gap), not the authored Min/Max height — those are outer bounds the noise rarely reaches. Pool spawn and chunk builds are time-sliced (Chunk Pool Spawn Per Tick, Chunk Builds Per Tick) so the handoff stays hitch-free on a 50 km world.
Per-planet atmosphere UPlanetGenAtmosphereAsset holds Rayleigh / Mie scattering, ground albedo, multi-scattering, aerial perspective, cloud altitude/height and sun shadow distance. UE renders only one Sky Atmosphere, so the subsystem repositions the level’s atmosphere onto whichever planet is nearest and applies that planet’s asset — one atmosphere serving many worlds.
Correct night side Volumetric clouds now evaluate the sun’s atmospheric transmittance per sample (bUsePerSampleAtmosphericLightTransmittance); without it the whole cloud layer shares one value taken from the lit side and glows white at night. Terrain and foliage use a shader-space day/night terminator — a directional sun is not occluded by the planet’s own body, and cascaded shadow maps cannot span a planet.
Distant-planet atmosphere LOD1 planets get a cheap fresnel far-halo shell and a cloud shell (Far Halo Material, Far Cloud Material), sized from the atmosphere asset and auto-lifted to clear each planet’s own terrain peaks. Both have a soft outer edge, a per-pixel camera-distance fade and a grazing-angle fade so the thin shell never reads as a flat plane. The real Sky Atmosphere cross-fades in (scattering scaled by LOD progress) as the halo fades out.
Editor LOD / atmosphere buttons Preview LOD0 Terrain, Preview LOD1, Toggle LOD0 Atmosphere, Toggle LOD1 Clouds, Toggle LOD1 Atmosphere — plus the Blueprint-callable Force LOD0 / Force LOD1 / Force Both / Release LOD Override. The toggles stack, so you can compare the near and far atmosphere side by side without entering Play.
Noise scale guard Each noise layer now shows a read-only Scale Check stating whether its Frequency is coarse enough for your Tile Size / Resolution to represent. Detail finer than the vertex spacing cannot become terrain — it aliases into per-vertex jitter and makes foliage float above the ground. Offending layers are named in the log with the frequency ceiling for your settings.

PlanetGen V1.7 — Hyperdrive & Large Planets is live

PlanetToPlanet_rg

V1.7 is out on Fab. This one is about scale: building genuinely large planets without the cost climbing with the radius, plus a fast-travel ability to get across them.

Fast-fly Hyperdrive
A Blueprint-callable ability on the gravity character. It faces a target, pitches the mesh prone into a flight pose, streaks to the destination over a duration you set with ease-in/ease-out, then stands upright on arrival. Fires BP events on start and stop so you can drive FX and camera off it.

Horizon-based chunk culling
The streamer now loads only the terrain visible over the planet’s curved horizon from your current altitude (plus mountain height and a buffer), rather than the whole facing hemisphere. On a large planet at ground level that is a big reduction in loaded chunks, collision cooks and foliage. It relaxes back to the full view as you climb to orbit.

Large-planet support
Double-precision noise sampling keeps terrain detail from quantising as the planet grows, so detail holds well past 50 km. Planet Radius, Gravity Radius, Tile Size, chunk-grid and resolution ranges are all opened up for big worlds. Output is byte-identical at normal sizes, so existing setups are unchanged.

Adaptive water tessellation
The ocean tessellates to a sag tolerance instead of a fixed subdivision count, so it stays smooth with no dips between vertices whether the planet is 5 km or 500 km. An editor toggle keeps size edits instant on huge planets.

Tiered per-chunk LOD (experimental)
Each streamed chunk can build at a resolution chosen by its distance from the player (2^n+1 tiers), keeping detail high underfoot without inflating the vertex count toward the horizon. Position cracks at tier boundaries are stitched away. It is off by default while cross-tier lighting seams are being polished.

All the V1.6 multi-planet LOD and per-planet atmosphere work is unchanged. Supports UE 5.4 through 5.8, full C++ source with Blueprint API.

Fab: PlanetGen - Walkable Procedural Planet | Multiplayer | Gravity | Streaming | UE5 | Fab

Happy to answer questions about the horizon culling or the large-planet noise here.