Files
kronic 906efe9a6f World: redo environment as off-world natural-frontier Synty biomes (DR-025)
Replace the sci-fi-colony dressing with two cosmetic classic-URP biomes in Game.unity: a lush Meadow_Forest base sanctuary (origin) and a hostile Arid_Desert survey expedition (+1000) - ~380 collider-stripped instances, warpgate/outpost landmarks, cyan/orange Aether accent lights. Warm daylight sun + Trilight ambient + a procedural daytime skybox + a cloned daylight post-FX grade (ACES kept). New client-only WorldAtmosphereSystem(+Config) cross-fades per-region fog/ambient by camera X>500 (mirrors HudSystem). Cosmetic-only - colliders stripped, never the subscene - so zero sim/netcode/PhysicsWorld impact (adversarially verified). Shadow-casting disabled on small foliage. EditMode 214/214. See DR-025.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:20:58 -07:00

51 lines
2.7 KiB
C#

using Unity.Entities;
using UnityEngine;
namespace ProjectM.Client
{
/// <summary>
/// Client-only ATMOSPHERE cross-fade for the two-region world. A managed presentation system
/// (SystemBase, main thread, NO Burst) in <see cref="PresentationSystemGroup"/> that OBSERVES the
/// follow-camera's world-space X and lerps <see cref="RenderSettings"/> 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 &gt; 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
/// <see cref="WorldAtmosphereConfig"/> (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.
/// </summary>
[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);
}
}
}