What Dayside is
Dayside renders invented planets the way a mapping satellite sees Earth. Here is the whole workflow and the ideas it rests on.
Dayside takes a heightmap and a climate layer and renders them as satellite imagery: coastlines, drainage, snow line and biome colour, all at true physical scale. You rough a world in, a diffusion model turns that rough guide into real ground, you art-direct the satellite image, and you export heightmaps, colour plates and masks for Blender, Unreal, a virtual tabletop or a plotter.
Everything runs on your machine. Your worlds sit in a folder on your own disk, nothing is uploaded, and no part of a render needs an internet connection.
The shape of the workflow#
- Start a world. Import a heightmap, start blank, or start a blank globe. This is where you set the physical scale, and the scale is the one choice you cannot change later without rebuilding.
- Author the rough terrain. Paint height in metres, stamp measured landforms, trace coastlines, paint Köppen classes onto the biome layer. All of this is live and cheap.
- Generate. The terrain model re-synthesises the section at true physical scale, conditioned on your coastline, your bathymetry and your rainfall layer. This is the first expensive step.
- Acquire. The colour engine paints the resulting ground: climate, rivers, lakes, snow, sea optics, hillshade. This is the second expensive step, and it previews progressively.
- Export. Pick a destination, pick layers, and a background pass writes them all at one matched resolution.
On a whole-world project, steps 2 to 5 happen per section. Finished sections and tiles fold back onto the sphere with Re-compose globe, and the globe exports on its own with Export globe.
Flat maps and whole worlds#
The first question the setup wizard asks is the only one that changes the workflow.
| Choice | What you supply | What you get |
|---|---|---|
| A flat map | Map width (km), default 200 | One rectangle, no reprojection. You land straight in the section editor. |
| A whole world | Equatorial circumference (km), default 40 000, and Planet radius (km), default 6371 | A globe workspace. You draw regions on the sphere and edit each one as its own section. |
Both ask for Height at white (m), default 4000: the land elevation that pure white in your heightmap means. A blank globe starts as a 4096 x 2048 equirectangular ocean planet with no continents on it.
You paint in kilometres#
Nothing in Dayside is denominated in pixels if it can be denominated in ground.
The height brush reads its diameter as a real distance and its bounds come from the section you are in: the minimum is the larger of 50 m and 0.2 % of the section extent, the maximum is the smaller of 500 km and 50 % of the extent. It loads at roughly 3 % of the section's short edge. A landform stamp carries its own true ground extent, so placing one at 1x puts a real mountain range down at the size that range actually is. A coastline outline stamped at 7.6x is honest about what it has become: the shape still behaves like a coast because coastlines repeat at every scale, but the size is yours.
The render engine works the same way. Every spatial parameter is in kilometres and is converted at the working pixel pitch, floored at one pixel. Two consequences are worth holding on to:
- A kilometre-scale parameter finer than the working pitch simply cannot be drawn.
beach_kmat its 1.0 km default is 0.51 px wide on a 1000 km section at a 512 analysis grid, so the beach ring fades out there. That is expected. - Rivers are denominated in km² of routed catchment with a square-root width law, so the network is identical at every preview step, every analysis resolution and every section extent. Raising resolution makes more tributaries appear rather than making the existing rivers fatter.
A section that records no ground scale sizes its brushes in texels instead and says so on screen.
The heightmap is signed and ocean-relative#
There is one elevation representation and it is signed: land positive, ocean negative, sea level exactly 0 m by definition. Bathymetry is authored terrain, not an afterthought. You can shape the shelf, the slope and the trenches, and the model conditions on them.
Each section carries its own decode contract in provenance, so a 16-bit PNG is never ambiguous:
elev_m = brightness x scale_m - depth_m
Two exports state two different things about water, and they are not interchangeable. sea_mask states the decode contract, z <= 0. water_mask states where water actually stands: ocean, solved lakes, and river channels at their anti-aliased coverage. A dry playa pan is land in water_mask.
Sea level is authored at import through sea_level_norm (default 0.0, so black is sea level) and peak_m (default 4000 m). One caution the editor repeats: changing sea level after a Generate reclassifies land and ocean the model authored, so set it before you generate rather than after.
Sections are low-distortion cuts#
A focus area is a crop carved off the globe in an oblique Hammer projection, centred on what you selected. That is what keeps a 3000 km region free of the stretching an equirectangular crop would give it at latitude, and it is why you edit regions one at a time instead of editing the whole sphere.
Practical limits:
- A section crop caps at 8192 px on an edge and 32 megapixels.
- The region composer's Advanced controls set Output long side, default 2048 px. The field accepts 32 to 16384, but the server refuses anything above 8192.
- A selection whose farthest vertex sits more than 100 degrees from its centre is not representable as one local section.
Every region is stored with a 32 px feather margin, so a section has two extents. extent_km measures the persisted raster including that feather; selection_extent_km measures the great-circle span of what you actually drew. They differ by about 20 % on a focus area at the default feather. The region card and the editor footer quote the selection extent, which is the one you drew.
The two heavy steps#
Two operations cost real time. Both are explicit and both report progress. Where a cancel control exists it is cooperative, so a cancelled job keeps everything it finished: a colour render cancels from the canvas overlay, an export from the Acquisitions drawer, and the whole-world passes from the Job Dock. A section Generate is the exception. It has no cancel button, because the sidecar finishes the in-flight job either way.
Generate#
Generate in the section header runs terrain diffusion on your GPU. It re-synthesises the section's heightmap at true physical scale and leaves your climate layer alone.
| Model | Coarse cell | Roughly | Use it for |
|---|---|---|---|
xandergos/terrain-diffusion-90m | 23.0 km | 90 m/px | Continental sections. The default. |
xandergos/terrain-diffusion-30m | 7.7 km | 30 m/px | Playable ground. Needs more VRAM. |
loresat/base-lite | 23.5904 km | about 1.18 km/px | Continental sweeps, its own fixed recipe. |
The model you pick sets the coarse cell size, which is the scale contract. Pick the wrong one and you get correct-looking terrain at the wrong feature size.
The control most worth knowing is Elevation SNR (snr_elev, default 0.20, range 0.05 to 1.0). It runs the way the underlying model defines it: small values stick closer to the terrain you drew, and only above the model's coarse cell scale; below roughly 1.5 cells the model invents everything at any setting. Do not read it as a strength slider.
Generation itself is opaque to the app: the sidecar reports only elapsed time, so progress creeps asymptotically toward 85 % once it starts rather than tracking real work. A finished Generate does start one colour pass automatically, because the heightmap on the server changed and you need to see it.
Acquire#
Acquire runs the colour render on the CPU. It is a progressive ladder: 512 px, then 1024 px, then 2048 px, writing a frame after each pass, so you see the composition almost immediately and the detail arrives as it lands. Progress is weighted by pixel area, so the 2048 pass owns most of the bar.
The render runs at two resolutions on purpose. Every data map (slope, cavity, wetness), the climate classes, the palettes, snow and lakes are computed on an analysis grid capped at analysis_long_side (default 4096 px). The land and sea mask, the hillshade, the sea optical model, the river channels and the final composite are done at the section's own pixel size. The look is defined by kilometre-scale structure, and coastlines and relief stay pixel-crisp because they are composited at native.
Why neither fires on its own#
Editing a slider marks the preview stale and stops there. The canvas says PREVIEW STALE with a count of what changed, and the primary button becomes Re-render. That is deliberate: a render is a costed job, and a tool that re-renders on every drag of a slider is a tool you cannot use.
The same discipline applies elsewhere. Baking a working-resolution proxy back to native is a button, never automatic. Placing a landform stamp previews without committing. One job of each kind runs per world at a time; a second request returns a conflict rather than queueing behind the first.
GPU and CPU#
Only terrain synthesis and the AI colour pass need a GPU. Everything else is CPU work, which means a machine with no capable card can still import terrain and get the whole colour, art-direction and export loop.
| Step | Runs on |
|---|---|
| Painting height and biome, stamps, coastline lasso | CPU, live |
| Generate (section terrain diffusion) | NVIDIA GPU, CUDA |
| Enhance world terrain (whole-planet sweep) | NVIDIA GPU, CUDA |
| Enhance section colour (learned detail, optional add-on) | NVIDIA GPU, CUDA |
| Acquire and Re-render (colour) | CPU: numba flow routing plus texturing |
| Colour globe and Re-compose globe | CPU |
| Export and Export globe | CPU |
When something is missing#
The render degrades in a stated order rather than failing, and every step lands in the job's warnings:
- No recorded pixel geometry falls back to the hypsometric style.
- No scipy falls back to the hypsometric style.
- No numba flow kernels turns rivers and lakes off; a multi-scale wetness proxy carries the moisture term instead.
- No Köppen crop derives the macro climate classes from temperature alone. That fallback cannot place arid or Mediterranean climates at all, and it reads any ground at or above 18 degC as tropical, which means 2000 mm/yr of precipitation for the snow and lake models. Authoring a climate layer is the intended path.
Where to go next#
- Install and first launch for system requirements, the installer and where your files land.
- Your first world for a walkthrough from an empty list to an exported image.
- Painting terrain for the brushes, stamps, landmasses and the coastline lasso.
- Rendering the satellite image for the colour render and how to steer it.
- Working on a globe for regions, tiles and the whole-world passes.
- Exporting for layer sets, resolutions, sidecars and the Blender handoff.
- Colour and climate reference and Terrain and generation reference for every parameter with its real default and range.