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
@@ -517,6 +517,8 @@ namespace ProjectM.Client
if (ps == null || count <= 0) return;
var ep = new ParticleSystem.EmitParams { position = pos, startColor = color };
ps.Emit(ep, count);
// Phase 1.5 lighting: every colored burst also throws a short point-light flash (dark-ambient look).
DynamicLightSystem.RequestFlash(pos, color, Mathf.Clamp(count / 18f, 0.4f, 1.4f));
}
void Burst(ParticleSystem fallback, GameObject prefab, Vector3 pos, int count)
@@ -535,6 +537,8 @@ namespace ProjectM.Client
var systems = go.GetComponentsInChildren<ParticleSystem>();
for (int i = 0; i < systems.Length; i++) systems[i].Play();
_activeVfx.Add(new TimedVfx { Go = go, Kill = SystemAPI.Time.ElapsedTime + VfxLifetime(go) });
// Phase 1.5 lighting: authored VFX impacts flash too (a==0 -> config default colour).
DynamicLightSystem.RequestFlash(pos, new Color(0f, 0f, 0f, 0f), 1f);
}
void PruneVfx()