75 lines
4.1 KiB
C#
75 lines
4.1 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 > 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);
|
|
// Step 14 (expedition redesign): the EXPEDITION-side palette keys on the replicated per-room biome
|
|
// (RunInfo.CurrentBiome) so every room re-themes — the camera-X blend still owns the base↔run fade.
|
|
// Palettes are code consts (cosmetic; per-biome config knobs can layer on later without churn).
|
|
if (SystemAPI.TryGetSingleton<ProjectM.Simulation.RunInfo>(out var runInfo)
|
|
&& runInfo.Lifecycle != ProjectM.Simulation.RunLifecycle.Staging)
|
|
{
|
|
switch (runInfo.CurrentBiome)
|
|
{
|
|
case ProjectM.Simulation.RoomBiomeId.Meadow:
|
|
expFog = new Color(0.62f, 0.82f, 0.62f, 1f); expDen = 0.008f;
|
|
expAmb = new Color(0.68f, 0.88f, 0.70f, 1f);
|
|
break;
|
|
case ProjectM.Simulation.RoomBiomeId.Cavern:
|
|
expFog = new Color(0.42f, 0.48f, 0.60f, 1f); expDen = 0.014f;
|
|
expAmb = new Color(0.50f, 0.56f, 0.72f, 1f);
|
|
break;
|
|
case ProjectM.Simulation.RoomBiomeId.Blight:
|
|
expFog = new Color(0.55f, 0.42f, 0.62f, 1f); expDen = 0.016f;
|
|
expAmb = new Color(0.62f, 0.50f, 0.70f, 1f);
|
|
break;
|
|
// Arid keeps the config/default orange above.
|
|
}
|
|
}
|
|
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|