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) from presets/ecology.json. Pure Python.

  • Terrain (terrain) — a heightfield and its masks (moisture, exclusion: roads, water) over a rectangle (native EcoTerrain); 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) and Ecosystem.plant() into a forest.

  • Grass (grass) — cells of blades round the camera (native GrassField), three levels of detail, distance thinning into the ground’s colour, wind gusts, seasons (dry, snow), trampling (GrassTrample).

  • shaders — the GLSL (shaders/) assembled through acron.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