using Unity.Entities; using UnityEngine; namespace ProjectM.Client { /// /// Client-only ATMOSPHERE cross-fade for the two-region world. A managed presentation system /// (SystemBase, main thread, NO Burst) in that OBSERVES the /// follow-camera's world-space X and lerps fog + Trilight sky-ambient between /// the lush cyan meadow base (origin) and the hostile orange arid expedition (+1000 X) — mirroring /// HudSystem's region split at camera X > 500. The directional light + skybox + post-FX volume stay /// GLOBAL; only fog colour/density + ambient sky colour shift per region. Pure presentation: never mutates /// the simulation, no ECS query (camera + RenderSettings only). Knobs live in /// (falls back to baked defaults when absent). Guarded to the gameplay /// "Game" scene so it never restyles the menu. Fog enable/mode + equator/ground ambient are baked into the /// scene; this only drives the per-region deltas. /// [WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation)] [UpdateInGroup(typeof(PresentationSystemGroup))] public partial class WorldAtmosphereSystem : SystemBase { Camera _cam; protected override void OnUpdate() { if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name != "Game") return; if (_cam == null) _cam = Camera.main; if (_cam == null) return; var cfg = WorldAtmosphereConfig.Instance; float boundary = cfg != null ? cfg.BoundaryX : 500f; float half = cfg != null ? Mathf.Max(1f, cfg.BlendHalfWidth) : 80f; Color baseFog = cfg != null ? cfg.BaseFogColor : new Color(0.784f, 0.878f, 0.824f, 1f); float baseDen = cfg != null ? cfg.BaseFogDensity : 0.006f; Color baseAmb = cfg != null ? cfg.BaseAmbientSky : new Color(0.725f, 0.831f, 0.949f, 1f); Color expFog = cfg != null ? cfg.ExpeditionFogColor : new Color(0.851f, 0.549f, 0.227f, 1f); float expDen = cfg != null ? cfg.ExpeditionFogDensity : 0.010f; Color expAmb = cfg != null ? cfg.ExpeditionAmbientSky : new Color(0.910f, 0.769f, 0.604f, 1f); float x = _cam.transform.position.x; float t = Mathf.Clamp01((x - (boundary - half)) / (2f * half)); t = t * t * (3f - 2f * t); // smoothstep RenderSettings.fogColor = Color.Lerp(baseFog, expFog, t); RenderSettings.fogDensity = Mathf.Lerp(baseDen, expDen, t); RenderSettings.ambientSkyColor = Color.Lerp(baseAmb, expAmb, t); } } }