Feel: Phase 1.5 lighting/atmosphere pass — dark ambient + dynamic lights

Dark-ambient, dynamic-light-first look (RoR2/Death Scourges reference),
built filter-agnostic so the pixel style composes on top:

- New DynamicLightSystem (client-only, PresentationSystemGroup): pooled
  point lights follow projectile ghosts; pulsing portal light during
  RoomExplore (same ExpeditionPortalPos authority as the beacon); soft
  resource-node glow that fades with harvest-shrink; short impact
  FLASHES fed by CombatFeedbackSystem's burst funnel (EmitColored +
  SpawnVfx -> RequestFlash). Knobs in DynamicLightConfig (scene object,
  code defaults when absent).
- Atmosphere darkened: WorldAtmosphereConfig/System palettes moved to
  the dark set (base cool dusk, arid burnt dusk, per-room biome consts
  darkened); scene fog switched Linear -> ExponentialSquared (the
  system's per-region DENSITY writes were dead in Linear mode);
  trilight ambient lowered; directional 1.9 -> 1.05 slightly warm.
- 6 landmark mood lights (warpgate cyan, artefact violet x2, survey
  camp warm x2, cabin warm); URP additional-lights-per-object 4 -> 8
  (was starving the existing Aether lights).
- Art-look gate material: Assets/Screenshots/artlook_{base,room}_
  pixel{ON,OFF}.png over the lit scene.

Verified: lights live in Play (20 static at base incl. new landmarks;
pooled dynamics active in-room: node glows + impact flashes), fog/
ambient values confirmed live, 466/466 EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 20:37:50 -07:00
parent 30ddb6fbd0
commit 414f9ff62a
17 changed files with 1466 additions and 35 deletions
@@ -19,15 +19,15 @@ namespace ProjectM.Client
[Tooltip("Half-width of the smooth transition band around BoundaryX, in world units.")]
public float BlendHalfWidth = 80f;
[Header("Base (meadow) atmosphere")]
public Color BaseFogColor = new Color(0.784f, 0.878f, 0.824f, 1f); // #C8E0D2
public float BaseFogDensity = 0.006f;
public Color BaseAmbientSky = new Color(0.725f, 0.831f, 0.949f, 1f); // #B9D4F2
[Header("Base (meadow) atmosphere — Phase 1.5 dark-ambient set (dynamic-light-first)")]
public Color BaseFogColor = new Color(0.09f, 0.13f, 0.14f, 1f);
public float BaseFogDensity = 0.010f;
public Color BaseAmbientSky = new Color(0.32f, 0.38f, 0.48f, 1f);
[Header("Expedition (arid desert) atmosphere")]
public Color ExpeditionFogColor = new Color(0.851f, 0.549f, 0.227f, 1f); // #D98C3A
public float ExpeditionFogDensity = 0.010f;
public Color ExpeditionAmbientSky = new Color(0.910f, 0.769f, 0.604f, 1f); // #E8C49A
public Color ExpeditionFogColor = new Color(0.24f, 0.13f, 0.06f, 1f);
public float ExpeditionFogDensity = 0.016f;
public Color ExpeditionAmbientSky = new Color(0.45f, 0.31f, 0.20f, 1f);
void OnEnable() { Instance = this; }
void OnDisable() { if (Instance == this) Instance = null; }