fix #427: sky drawn without fog like retail; world fog range is the keyframe's authored MinWorldFog/MaxWorldFog
Two April stand-ins, neither registered, met at the horizon from altitude as a hard line between the dome's rim and the fog-coloured clear: 1. sky.frag fogged every non-additive sky layer with a 0.2 floor. Retail's GameSky::Draw @0x00506FF0 disables fixed-function fog around the whole sky draw unless an AdminEnvirons fog override is active (SetFFFogEnable( LScape::m_override_enabled ? 1 : 0)); additive layers stay unfogged via SetFFFogAlphaDisabled(1) at D3DPolyRender::SetSurface 0x59c882. The sky pass now sets ApplyFog only for (override active && !additive), with no floor. 2. WorldRenderFrameBuilder overwrote the authored fog range with one derived from the streaming window (538..2189 m always). Retail sets FOGSTART/ FOGEND straight from the keyframe's MinWorldFog/MaxWorldFog (SkyDesc::GetWorldFog @0x00500CE0 -> SetFFFogProperties @0x005A2F70) with no draw-distance scaling; zfar is a constant 4000 m. The builder now leaves SceneLightingUbo.Build's values alone; ACDREAM_FOG_START_MULT / _END_MULT are deleted from RuntimeOptions. Guards: SkyFogRuleTests (source-level, the sky renderer has no hermetic harness); sky.frag.spv re-pinned in VulkanShaderManifestTests with the reason. Research note 2026-04-23-sky-fog.md carries a correction banner. App hermetic 6,070/0, Core 4,707/0 (Release). Owner look gate owed: night and rain fog are now retail's shorter authored ranges. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
517d17b4b3
commit
cc42edc8e3
11 changed files with 180 additions and 62 deletions
|
|
@ -167,8 +167,6 @@ public sealed class RuntimeOptionsTests
|
|||
Assert.Null(opts.UiProbeScript);
|
||||
Assert.Null(opts.AutomationArtifactDirectory);
|
||||
Assert.False(opts.ExactAutomationFramebuffer);
|
||||
Assert.Equal(0.7f, opts.FogStartMultiplier);
|
||||
Assert.Equal(0.95f, opts.FogEndMultiplier);
|
||||
Assert.False(opts.UiProbeEnabled);
|
||||
Assert.False(opts.HasLiveCredentials);
|
||||
}
|
||||
|
|
@ -339,26 +337,6 @@ public sealed class RuntimeOptionsTests
|
|||
Assert.Equal(12, RuntimeOptions.Parse(AnyDatDir, Env(new() { ["ACDREAM_STREAM_RADIUS"] = "12" })).LegacyStreamRadius);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FogMultipliers_ParseInvariantFloats_AndFallBackIndependently()
|
||||
{
|
||||
var parsed = RuntimeOptions.Parse(AnyDatDir, Env(new()
|
||||
{
|
||||
["ACDREAM_FOG_START_MULT"] = "0.625",
|
||||
["ACDREAM_FOG_END_MULT"] = "1.125",
|
||||
}));
|
||||
Assert.Equal(0.625f, parsed.FogStartMultiplier);
|
||||
Assert.Equal(1.125f, parsed.FogEndMultiplier);
|
||||
|
||||
var invalid = RuntimeOptions.Parse(AnyDatDir, Env(new()
|
||||
{
|
||||
["ACDREAM_FOG_START_MULT"] = "not-a-number",
|
||||
["ACDREAM_FOG_END_MULT"] = "",
|
||||
}));
|
||||
Assert.Equal(0.7f, invalid.FogStartMultiplier);
|
||||
Assert.Equal(0.95f, invalid.FogEndMultiplier);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DayGroupOverride_IsReadOnceIntoTypedOptions()
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue