acron.ecosystem¶
Plant ecosystems and ground cover: woods grown over a terrain by the
engine’s native simulator (acron.vegetation: plants competing for
light and room, seeding, dying, over decades; after Deussen et al. 1998 and
Makowski et al. 2019) and planted into acron.trees.Forest, and
grass drawn blade by blade by hardware instancing (after Ghost of
Tsushima’s grass and Jahrmann & Wimmer 2017), thinned under the canopy and
on the roads, in the sky’s light and wind.
The pieces (each its own module; the package re-exports the API):
Ecology(ecology) — a species’ ecological parameters (size, life span, shade tolerance, moisture, slope and altitude limits, seed spread, density) frompresets/ecology.json. Pure Python.Terrain(terrain) — a heightfield and its masks (moisture, exclusion: roads, water) over a rectangle (nativeEcoTerrain); roads painted in, a water level, a procedural heightfield without numpy, the ground’s colours and a mesh.Ecosystem(simulation) — the simulation tile by tile (byte-identical per seed and tile, seamless, on every core) andEcosystem.plant()into a forest.Grass(grass) — cells of blades round the camera (nativeGrassField), three levels of detail, distance thinning into the ground’s colour, wind gusts, seasons (dry, snow), trampling (GrassTrample).shaders— the GLSL (shaders/) assembled throughacron.shaderlib;assemble_sources()needs no GL.
No numpy. Without acron.vegetation it still imports: the presets and
shader assembly work, and anything native raises a clear ImportError.
from acron.ecosystem import Ecosystem, Grass, Terrain
ground = Terrain.procedural(size=1024, relief=90, seed=4)
eco = Ecosystem(ground, ["birch", "pine", "oak", "fir", "bush"], seed=7)
eco.simulate_area((0, 0), (1024, 1024))
eco.plant(forest) # an acron.trees.Forest
grass = Grass(env, ground, ecosystem=eco) # an acron.sky.Environment