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:
@@ -15,7 +15,7 @@ RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 10
|
||||
m_Fog: 1
|
||||
m_FogColor: {r: 0.02, g: 0.1, b: 0.12, a: 1}
|
||||
m_FogColor: {r: 0.06, g: 0.2, b: 0.25, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.035
|
||||
m_LinearFogStart: 55
|
||||
@@ -511,7 +511,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier: ProjectM.Client::ProjectM.Client.PrototypeCameraRig
|
||||
Pitch: 58
|
||||
Yaw: 0
|
||||
Distance: 17
|
||||
Distance: 14
|
||||
TargetHeight: 1.3
|
||||
Orthographic: 0
|
||||
FieldOfView: 44
|
||||
@@ -838,10 +838,10 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier: ProjectM.Client::ProjectM.Client.WorldAtmosphereConfig
|
||||
BoundaryX: 500
|
||||
BlendHalfWidth: 80
|
||||
BaseFogColor: {r: 0.02, g: 0.1, b: 0.12, a: 1}
|
||||
BaseFogColor: {r: 0.06, g: 0.2, b: 0.25, a: 1}
|
||||
BaseFogDensity: 0.035
|
||||
BaseAmbientSky: {r: 0.03, g: 0.055, b: 0.08, a: 1}
|
||||
ExpeditionFogColor: {r: 0.015, g: 0.075, b: 0.1, a: 1}
|
||||
ExpeditionFogColor: {r: 0.06, g: 0.2, b: 0.25, a: 1}
|
||||
ExpeditionFogDensity: 0.04
|
||||
ExpeditionAmbientSky: {r: 0.02, g: 0.045, b: 0.07, a: 1}
|
||||
--- !u!4 &1709609454
|
||||
|
||||
@@ -129,7 +129,7 @@ Material:
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 0.08, g: 0.12, b: 0.15, a: 1}
|
||||
- _BaseColor: {r: 0.18, g: 0.26, b: 0.3, a: 1}
|
||||
- _Color: {r: 0.079999976, g: 0.11999995, b: 0.14999998, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
|
||||
@@ -111,7 +111,7 @@ MonoBehaviour:
|
||||
m_Value: {x: 0.5, y: 0.5}
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.28
|
||||
m_Value: 0.16
|
||||
smoothness:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.4
|
||||
@@ -153,7 +153,7 @@ MonoBehaviour:
|
||||
m_Value: 0.35
|
||||
contrast:
|
||||
m_OverrideState: 1
|
||||
m_Value: 10
|
||||
m_Value: 4
|
||||
colorFilter:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 0.88, g: 0.97, b: 1, a: 1}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -152,6 +152,16 @@ namespace ProjectM.Client
|
||||
public static float ShoulderLampIntensity;
|
||||
/// <summary>Shoulder-lamp beam range (m).</summary>
|
||||
public static float ShoulderLampRange;
|
||||
/// <summary>Personal suit glow (0 = off) — a warm point light ON the diver, distinct from the shoulder
|
||||
/// lamp, which is a forward spot and therefore never lights its own wearer. Added at the 2026-08-07 A0
|
||||
/// readability gate: with the murk lifted, the player measured 0.144 mean luminance against rocks at
|
||||
/// 0.269 and flora at 0.258 — the protagonist was the second-darkest thing on screen. Lifting the KEY
|
||||
/// would have raised the scenery by the same amount; only a light that travels with the diver changes
|
||||
/// the RATIO. This is "light is territory" made literal.</summary>
|
||||
public static float SuitGlowIntensity;
|
||||
/// <summary>Suit-glow radius (m). Small — it is a pool you carry, not area lighting.</summary>
|
||||
public static float SuitGlowRange;
|
||||
|
||||
|
||||
/// <summary>Seconds the Menacing01 combat idle (CombatIdle state) holds after the last melee swing (0 = off).</summary>
|
||||
public static float CombatIdleHoldSec;
|
||||
@@ -303,6 +313,8 @@ namespace ProjectM.Client
|
||||
RunNaturalSpeed = 2.6f; // measured: A_Run_FwdStrafeF_RootMotion_Masc averageSpeed (run ring)
|
||||
ShoulderLampIntensity = 8f; // 07-16e: the suit lamp actually lights (3 got lost in the murk ambient)
|
||||
ShoulderLampRange = 12f;
|
||||
SuitGlowIntensity = 5f; // 08-07 A0: the diver must outrank the scenery, not the whole scene
|
||||
SuitGlowRange = 4.5f; // a pool you carry — small on purpose
|
||||
CombatIdleHoldSec = 4f; // 07-18: Menacing01 combat-idle hold after the last swing
|
||||
MeleeArcIntensity = 0.8f; // 07-21 HEAVY LOCK: the weapon is the read, the arc recedes further
|
||||
MeleeArcBubbles = 6;
|
||||
|
||||
Reference in New Issue
Block a user