AshForge Atlas · the whole tool, one course
A lattice, four shares of one budget,
and a falloff that runs backwards.
Atlas builds terrain: a height lattice, painted material shares, and props on top. Three of its controls do the opposite of what their names suggest, and one does nothing at all — this course front-loads those rather than saving them for an advanced tier.
What it is
A terrain editor. Heights on a grid, four material weights per point, and props placed over them.
Modules 1–4 are the lattice, 5–8 are painting, 9–12 are chunks and export.
Three surprises
Falloff is backwards, one slider does nothing, and props do not follow the terrain you move under them.
All three are measured, not inferred. Modules 3, 4 and 8.
Atlas is a focused tool. Its content is 12 things worth knowing, not three escalating tiers — the old split implied the later material needed the earlier, and it does not. Read straight through, or jump to the module that matches your problem.
Resolution against size
The lattice under the level
A level carries two numbers that sound similar and are not. Size is how much ground it covers. Resolution is how many height values are stored across that ground. The terrain you see is those values with straight lines drawn between them.
SizeX 256 units of ground Resolution 16 height values across that ground spacing = SizeX / (Resolution − 1) = 256 / 15 = 17.07 units
The subtraction matters. Sixteen points have fifteen gaps between them, not sixteen, so the spacing is 256 divided by 15. Everything else on this page is a consequence of that single figure.
What it means in practice: between any two stored heights there are seventeen metres of ground with no data at all. The surface there is interpolation. You cannot sculpt a feature smaller than the spacing, because there is nowhere to put it.
The first stroke
Why you get a spike
Take a fresh level, leave every brush setting alone, and click once. Then count how many height values changed.
| Brush radius | Against 17.07 spacing | Points moved | What you see |
|---|---|---|---|
| 10 (default) | smaller than one gap | 1 | A single point pulled up. A spike. |
| 20 | clears one gap | more than 1 | Neighbours come with it. A slope. |
The centre of the brush always lands exactly on a grid point — the tool rounds your click to the nearest one — so that point is always at distance zero and always gets the full strength. With a strength of 2 it moves by exactly 2. Its neighbours sit 17.07 away, outside a radius of 10, so they are not considered at all.
That is the whole of the effect. One value moved by two metres, fifteen metres of interpolation running away from it in every direction.
Figure 01 — the gap the default brush cannot cross The click is rounded to the nearest grid point, so the centre always takes the full strength.
Drill01
Make the spike deliberately
- New level, default brush, one click.
- Look from a low angle, not from above.
- Raise the radius past
17and click again nearby.
Done when you can produce a spike and a slope on purpose, and say which radius gives which.
Drill02
Work out a level's spacing before you touch it
- Read Size and Resolution.
- Divide size by resolution minus one.
- Set your radius to at least twice that.
Done when this is the first thing you do on any new level.
Modes
The slider that does nothing
The brush has four sculpting modes, and the Strength slider only reaches two of them.
| Mode | What it does | Reads Strength? |
|---|---|---|
| Raise | Adds strength × factor to each point in range. | Yes |
| Lower | The same with the sign flipped. | Yes |
| Smooth | Moves each point halfway toward the local average. | No |
| Flatten | Moves each point to the local average. | No |
Smooth and flatten work from the gap between a point and the average of everything under the brush. The strength number never enters that calculation, so dragging the slider from 1 to 999 produces identical terrain — verified by running both and comparing every value.
The two modes are otherwise the same expression. Flatten moves exactly twice as far as smooth, because smooth carries a one-half and flatten does not. Two presses of smooth are not quite one press of flatten, but they are close, and if you want finer control than smooth gives you the answer is fewer strokes rather than a lower strength.
The last setting
Falloff is backwards
Every point in range is scaled by how far it sits from the centre, and Falloff bends that curve. The word suggests that turning it up makes the edge softer. It does the opposite.
factor = (1 − dist / radius) ^ (1 − falloff × 0.9)
falloff 0 → exponent 1.0 a straight cone, fading evenly to nothing
falloff 1 → exponent 0.1 near full strength almost to the rim, then a cliff
Raising falloff lowers the exponent, and a lower exponent keeps the factor closer to 1 for
longer. Measured at a point near the rim of a 60-unit brush, falloff 1 left
more height there than falloff 0 did — a broader, flatter dome with
a harder edge, not a softer one.
Splat weights
Four shares of one budget
A level can carry four terrain textures, no more. Every grid point stores
four numbers saying how much of each shows there, so a 16×16 level holds
16 × 16 × 4 = 1024 weights alongside its 256 heights.
The important part is what happens after each dab: the four weights are divided by their total, so they always add up to exactly 1. They are not four independent sliders. They are four shares of one budget.
Which means painting is always subtraction as well as addition. Adding grass to a point necessarily removes rock, sand and snow from it in proportion. There is no way to have two textures both at full strength anywhere, and no setting that would allow it.
Figure 01 — one grid point, four competing weights Asking for a fifth texture is not a setting you have missed; the array is four deep.
Strength
The gentler brush
Set the strength to 1 and click once with each brush at the same radius, on the
same point. The height brush moves the ground by 1.00. The texture brush moves the
weight by 0.15.
height brush delta = strength × factor texture brush weight = strength × factor × 0.15
The texture brush carries a hidden multiplier of 0.15, so at the same slider position it is roughly one seventh as strong as the sculpting brush. This is deliberate — texture wants to build up over several passes rather than land in one — but nothing says so, and the usual first reaction is that the texture brush is not working.
It is working. It is applying fifteen percent of what you asked for, and it will get there in about seven strokes.
(1 − dist/radius) curve, the same backwards falloff from tier one. Only
the strength means something different. A radius below the grid spacing paints exactly one
point's weights, for the same reason it moved exactly one height.History
What undo leaves out
Watch the history list while you work. Paint a texture and an entry appears. Raise the terrain and nothing appears at all.
| Action | Snapshot taken? | Appears in history? | Undoable |
|---|---|---|---|
| Texture paint | Yes | Yes | Yes |
| Layer paint (biome, vegetation…) | Yes | Yes | Yes |
| Raise / Lower | No | No | No |
| Smooth / Flatten | No | No | No |
Measured directly: a sculpting stroke left the history count exactly where it was, and the very next texture stroke raised it by one. The two texture operations snapshot the level before they touch it; the terrain brush writes straight into the height array and returns.
The consequence is worse than "sculpting has no undo", because the history list is not empty — it is full of your texture work. Stepping back through it restores heights from whenever the last texture snapshot happened to be taken, which is not a state you chose and may be many sculpting strokes ago.
Order of operations
Props do not follow
When you place a prop, Atlas reads the terrain height under it and sets the prop's height to match. That happens once, at placement. Nothing re-reads it afterwards.
| Step | Ground | Prop | Result |
|---|---|---|---|
| Place a prop on flat ground | 0.00 | 0.00 | Sitting on the surface. |
| Raise the terrain under it | 25.00 | 0.00 | Buried 25 units deep. |
Lower the ground instead and you get the same problem upside down: the prop hangs in the air with a hole beneath it. Either way the prop keeps the height it was given and the ground moves without it.
There is no re-seat command, so the working order matters more here than anywhere else in the tool: shape the ground first, scatter props second. If you must sculpt afterwards, the props over that area have to be deleted and placed again.
| Symptom | What it means | Fix |
|---|---|---|
| Props half-sunk into a hill | The ground was raised after they were placed. | Delete and re-place them; there is no re-seat. |
| Props floating over a valley | The ground was lowered after placement. | Same fix, same cause. |
| Texture brush "does nothing" | It applies 0.15 of the strength per stroke. | Keep painting, or raise strength. |
| A texture you painted earlier is fading | Weights renormalise; the neighbours took its share. | Expected. Repaint it, or plan the four channels first. |
| Undo restored the wrong terrain | It restored the last texture snapshot. | Save around sculpting passes instead. |
Load and unload
Streaming is a boolean
A level is divided into a grid of chunks — a new one arrives as 2×2 — and each carries a Loaded flag you can toggle. Unload one and watch what happens to the props inside it.
Nothing happens to them. Unloading a chunk sets its flag to false and writes a log line. The props stay in the chunk, the level still holds every one of them, and no memory is released because nothing was ever separately held.
That is not a criticism — the flag is meaningful. It is a declaration, carried into the exported data, telling whatever loads your world which chunks should start resident. It is a value you are authoring, not an operation you are performing.
Level of detail
LODs are records
Generating LODs writes three rows and changes nothing else. Your props are all still there, at full count, exactly as they were.
props on the level: 12 LOD 1 factor 1/2 6 LOD 2 factor 1/3 4 LOD 3 factor 1/4 3
Each row is base props ÷ (level + 1), rounded down. The tool's own summary
is candid about it — it does not mutate props — and the numbers exist so an
exporter or the game can act on them later. No mesh is simplified and no prop is removed
at any point inside Atlas.
Which makes the records a snapshot of a count, and snapshots go stale. Add twelve more props after generating and the rows still describe the twelve you had: verified, the LOD 1 row stayed at 6 while the level grew to 24.
The failure that costs work
The export walks chunks
A prop lives in two places at once. It is in the level's own list, which is what the viewport draws and what the save file records. It is also filed into whichever chunk contains its position, at the moment you place it.
The game export reads the second list. It walks every chunk and writes out that chunk's props, because that is the shape the game wants. As long as the two lists agree, nobody needs to know there are two.
Re-dividing the level is where they stop agreeing. Rebuilding the chunk grid clears the old chunks entirely, taking their filed props with them, and builds fresh empty ones. Nothing walks the level's prop list to re-file them.
Figure 01 — two lists, one exported Everything you can see keeps working, which is what makes this expensive to find late.
Every visible signal stays healthy. The viewport draws six props, the save file holds six props, reopening the project shows six props, and the export returns a success with a real file in it. The only place the loss is observable is inside that file.
The artefact
The order that works
Everything on this page and the two below it reduces to a working order. Each step invalidates something produced by an earlier one, so doing them in this sequence means never having to redo any of it.
Level to game data
- Set Size and Resolution, and work out the spacing. it decides the smallest feature you can sculpt, and changing it later rescales everything
- Divide into chunks now, at the granularity you want. re-chunking later orphans every prop already placed
- Sculpt the terrain, saving around each pass. sculpting records no undo, so a save is the only checkpoint it has
- Paint your four texture channels. painting does snapshot, so this is the part undo genuinely covers
- Place props last of the authoring steps. their height is snapped once and never re-read, so the ground must be final
- Generate LODs, then export. the records are a snapshot of the prop count, so any later prop work makes them wrong
| Symptom | What it means | Fix |
|---|---|---|
| Exported world has no props | Chunks were rebuilt after the props were placed. | Re-place them, or chunk before placing. Check the file, not the viewport. |
| LOD counts do not match the level | Records are a snapshot from when you generated them. | Regenerate after any prop change. |
| Unloading a chunk changed nothing | Working as designed — it sets a flag. | Nothing to fix. Read it as authoring, not performance. |
| Stream All made things worse | It toggles rather than loads. | Press again, or set the flags individually. |
| A prop exports under the wrong chunk | It sits outside every chunk and fell back to chunk 0. | Move it inside the grid, or accept the labelling. |
The exported file is real, and it is not yet a route into the game.
Heightmaps, chunks and LOD records have no counterpart among the game's definition types
— maps are generated from a biome and a topography rather than authored. What Atlas's
model does match is a parcel: the game ships twelve hand-authored map pieces
whose tiles and entities line up almost one for one with TerrainData and
PropPlacement, and it already scans active mods for a Parcels/
folder and places what it finds.
The obstacle is that it scans its own native mods folder, while AshForge mods live
in the loader's root — so the route needs a loader patch that has not been made.
Until then, treat this export as a record of your level rather than a delivery of it.
⚠ It also lands in the tool's own output folder, which nothing scans. See
ashforge_shared/docs/TOOL_ROUTES_TRIAGE.md.
Course complete
What you now know
Check yourself
- Terrain is a Resolution × Resolution lattice of heights stretched over Size units of ground.
- Spacing is
Size / (Resolution − 1)— 17.07 on a fresh level, because 16 points have 15 gaps. - The default brush radius of 10 is smaller than that, so a first click moves exactly one point and makes a spike.
- The click is rounded to the nearest grid point, so the centre always gets the full strength.
- You cannot sculpt a feature smaller than the spacing; raise Resolution, or accept it.
- Smooth and flatten ignore the Strength slider entirely. Only raise and lower read it.
- Flatten moves exactly twice as far as smooth.
- Higher falloff means a harder edge, not a softer one.
- Spacing comes from SizeX for both axes, so non-square levels distort the brush into an ellipse.
- Every grid point carries four texture weights as well as a height — 1024 weights on a 16×16 level.
- The weights renormalise to sum to 1, so painting one channel always takes from the other three.
- Four is the hard limit, and a channel cannot be swapped out cleanly once blended.
- The texture brush multiplies strength by 0.15 — about one seventh of the height brush at the same setting.
- Radius and falloff are shared and behave identically, including the backwards falloff.
- Sculpting records no undo history. Texture and layer painting do.
- The history list is a paint history, so undo restores heights from the last texture snapshot — not from the stroke you meant.
- Props are snapped to the ground once, at placement, and never re-seated. Sculpt first, place second.
- A level divides into a grid of chunks; a new one arrives as 2×2.
- Load and Unload set a boolean. Nothing is freed, nothing is fetched, no prop moves.
- The flag is authoring: it declares which chunks should start resident in the exported world.
- Generating LODs writes records, one per level, at
base ÷ (level + 1). Nothing is decimated. - Those records are a snapshot of a count and go stale the moment you add a prop.
- A prop is held in the level's list and filed into a chunk when placed.
- Re-chunking clears the filed copies and never re-files them, and the export walks the chunks — so it ships no props while reporting success.
- Chunk before you place; sculpt before you place; LOD last; then open the file and count.
That is Atlas. ⛔ Its heightmaps have no counterpart in the game — the route for its content is parcels, and that needs a loader change that has not been made.
