Art: A0 readability pass — murk plane, seabed albedo, and a suit glow

Operator at the A0 gate: "a little too dark to play, not very readable yet."
Measured rather than guessed, and the diagnosis was NOT "add light":

  seabed _BaseColor (0.08,0.12,0.15) — the floor was painted near-black, so it
    reflected ~10% of anything and could never read as a surface
  fog colour (0.02,0.10,0.12) — distance faded to VOID rather than to murk;
    real water scatters, so far things should get lighter and lower-contrast
  ColorAdjustments contrast +10 on top of ACES — the low end was crushed twice
  Vignette 0.28 — ate the periphery, which is where threats arrive from

Murk pass (operator picked "murk + closer camera"):
  BaseFogColor/ExpeditionFogColor -> (0.06,0.20,0.25)   [WorldAtmosphereConfig
    drives RenderSettings every frame, so the CONFIG is the real knob]
  M_Staging_Seabed albedo -> (0.18,0.26,0.30)
  contrast 10 -> 4, vignette 0.28 -> 0.16
  camera Distance 17 -> 14

That fixed the void but INVERTED figure-ground, which the numbers caught:

  player 0.144 | rock 0.269 | flora 0.258 | warm haze 0.368

The protagonist was the second-darkest thing on screen. The shoulder lamp is a
forward-facing spot tilted 26 deg down — it lights the seabed ahead and never
its own wearer — so the diver had no personal light at all. Raising KeyWarm
would have lifted the scenery by the same amount and left the ratio unchanged;
only a light that TRAVELS with the diver changes it. Added ~SuitGlow: a warm,
steady point light at torso height (FeelConfig.SuitGlowIntensity 5 /
SuitGlowRange 4.5, live-tunable, 0 = off). "Light is territory", made literal.

  player 0.144 -> 0.320, now above rock 0.282 and flora 0.250
  figure-to-murk contrast 1.32x -> 2.94x, with scene brightness unchanged

304/304 EditMode green. Awaiting the operator's eyes on the result.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-08 16:58:52 -07:00
parent baa6eb521a
commit 501c52d809
5 changed files with 46 additions and 7 deletions
@@ -101,6 +101,7 @@ namespace ProjectM.Client
ParticleSystem _stepFx; // 07-15: silt puff per footstep
ParticleSystem _bubbleFx; float _bubbleTimer; // 07-16: dome bubble exhaust (+1 per footstep, loose sync)
Light _lampLight; // 07-16e: the shoulder lamp CASTS — a warm spot beam riding the body yaw
Light _suitGlow; // 08-07 A0: a warm pool ON the diver (the lamp above points AWAY)
Vector3 _lastFootPos; float _footDistAccum; float _footStepGap; bool _footInit; // stride-distance footsteps (local player)
Entity _localPlayer = Entity.Null;
@@ -575,6 +576,32 @@ namespace ProjectM.Client
(Vector3)localPos + lampYaw * new Vector3(0.27f, 0.55f, 0.05f), // the kit lamp's shoulder offset
lampYaw * Quaternion.Euler(26f, 0f, 0f)); // down-tilt puts the hotspot ~3m ahead (14° landed ~6m out — too diffuse)
}
// Personal suit glow (08-07, A0 readability gate). The shoulder lamp above is a FORWARD spot, so it
// lights the seabed ahead and never its own wearer — measured at the gate, the diver sat at 0.144
// mean luminance while rocks read 0.269 and flora 0.258, i.e. the protagonist was the second-darkest
// thing on screen. Raising KeyWarm would lift the scenery by the same amount and leave the ratio
// unchanged; only a light that TRAVELS with the diver fixes figure-ground. Warm and STEADY — the
// readability law says warm+steady = ours/true.
if (_localPlayer != Entity.Null && FeelConfig.SuitGlowIntensity > 0f)
{
if (_suitGlow == null)
{
var glowGo = new GameObject("~SuitGlow");
glowGo.transform.SetParent(_fxRoot, false);
_suitGlow = glowGo.AddComponent<Light>();
_suitGlow.type = LightType.Point;
_suitGlow.color = new Color(1f, 0.82f, 0.55f);
_suitGlow.shadows = LightShadows.None;
}
_suitGlow.intensity = FeelConfig.SuitGlowIntensity;
_suitGlow.range = FeelConfig.SuitGlowRange;
_suitGlow.transform.position = (Vector3)localPos + new Vector3(0f, 0.9f, 0f); // torso height
}
else if (_suitGlow != null && _suitGlow.intensity > 0f)
{
_suitGlow.intensity = 0f;
}
else if (_lampLight != null && _lampLight.intensity > 0f)
{
_lampLight.intensity = 0f;