render3d: ground layers placed from painted densities - the density tiles (LGD1), their reader and the fill

ground_density_bake(path, key, version, hash, pngs) cuts each layer's PNG (R the chance a cell keeps one,
G an optional scale) into the terrain's 64 m tiles, one layer decoded and let go at a time, as a bake's
file; ground_density_open(...) reads it - or, when it is missing or stale, a dev build's own copy cut from
the PNGs - a tile at a time into a 256-tile clock, never a layer whole. ground_fill(s, cx, cz, band, g)
places a GroundFill row's instances in a stream chunk: a candidate per cell of the band's step, jittered,
kept when a hash of (layer, chunk, band, cell) falls under the density (times the game's trample,
r3d_on_ground_trample, where the row asks); scale, yaw, seed and wind from the same hash. Nothing calls
it yet: behaviour unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-29 20:33:51 +03:00
parent f79390838a
commit c672be101e
5 changed files with 282 additions and 0 deletions

View file

@ -52,6 +52,9 @@ import "actor.ludic"
import "stream.ludic"
import "place_rec.ludic"
import "stream_baked.ludic"
import "ground_density_write.ludic"
import "ground_density.ludic"
import "ground_fill.ludic"
import "fog_streams.ludic"
import "grass.ludic"
import "grass_gpu.ludic"