-- What hangs in the air of each map.
--
-- One entry per map that has an ATMOSPHERE: a ground fog the scene shader
-- folds every surface into, and volumetric god rays -- light let down
-- through an INVISIBLE canopy hanging above the map's real geometry, as
-- if the trees drawn are only the understorey of something taller. The
-- rays are not placed: a per-pixel march (see ForestAtmos) reads the
-- frame's own depth and the sun's own shadow map, so the beams stand
-- exactly where light really breaks between the tree hulls, trees and
-- characters carve dark columns through them, and a wind-blown leaf
-- field at the canopy plane opens and closes them like foliage moving
-- overhead. The light leans along the mod's fixed noon shear (the one
-- light a canopy map ever gets -- see DayNight.CANOPY); only its COLOUR
-- and STRENGTH follow the clock: gold spears of sun by day, silver moon
-- rays after dark, pollen adrift in the day's beams and fireflies once
-- they cool.
--
-- A map with no entry here has no atmosphere at all: no fog uniform is
-- raised, no march runs, nothing is spent. That is the contract a new
-- map opts into by adding a line, and what a stale entry degrades to if
-- its map id ever stops existing.
--
-- The knobs, in world pixels unless said otherwise (a map cell is 16):
--
--   canopyY   where the invisible canopy hangs. MUST clear the tallest
--             real geometry under it (Viridian's carved tree hulls top
--             at y = 32) -- a beam is alpha ZERO at this height and only
--             fades in below it, so a canopy at or under the tree tops
--             would cut every ray off before it cleared the leaves.
--   fadeTo    the height by which a descending ray reaches full strength.
--   fog       density  how fast distance dissolves into the haze
--                      (1 - exp(-density * distance-past-start))
--             start    how many pixels out the dissolve begins
--             heightK  how quickly the fog thins with ALTITUDE
--                      (exp(-y * heightK): 0.02 halves it by y = 35)
--   rays      strength  overall in-scatter gain on the march
--             reach     how far out the march walks, in world px
--   motes     count of pollen/dust flecks adrift in the daylight beams
--   fireflies count of the night shift
--   seed      the xorshift seed the particle deal runs on
--
-- Two caveats for maps opting in later: the water pass has no fog term,
-- so a lake under heavy haze stays clear-day sharp in its reflections;
-- and the march runs after the water's mirror copy, so beams will not
-- appear IN those reflections either. Neither can bite in a map without
-- water.

return {
  ["VIRIDIAN_FOREST"] = {
    canopyY = 56,
    fadeTo = 28,
    fog = { density = 0.0045, start = 64, heightK = 0.02 },
    -- strength is calibrated against the march's real integral: the
    -- under-canopy stretch of an orbit ray is short and thinly dense, so
    -- the raw accumulation for a fully lit beam core is a few percent --
    -- this gain lands it near +0.3 on screen. Halve it for a whisper,
    -- double it for cathedral light.
    rays = { strength = 16, reach = 380 },
    motes = { count = 96 },
    fireflies = { count = 48 },
    seed = 0x51D,
  },
}
