feat(render): implement Campaign AR and terrain fidelity

This commit is contained in:
Erik 2026-08-22 13:13:29 +02:00
parent 99cf26e00c
commit 7a5f96ede5
368 changed files with 50611 additions and 950 deletions

View file

@ -63,9 +63,24 @@ public sealed record RuntimeOptions(
bool UiProbeDump,
string? UiProbeScript,
string? AutomationArtifactDirectory,
/// <summary>Diagnostic-only request for an exact automation framebuffer.
/// The graphical host uses the persisted display resolution as the initial
/// size of a borderless window so the OS cannot clamp a decorated window to
/// the desktop work area. False for every ordinary launch.</summary>
bool ExactAutomationFramebuffer,
int? ForcedDayGroupIndex,
float? PinnedWorldDayFraction,
float? SkyAnimationPhaseSeconds,
/// <summary>Diagnostic initial distance for the offline orbit camera, in
/// metres. Null for every ordinary launch; used by deterministic renderer
/// acceptance captures that need receivers inside a finite shadow reach.</summary>
float? InitialOrbitDistanceMeters,
/// <summary>Diagnostic-only initial orbit heading in degrees. Null keeps
/// the normal camera default.</summary>
float? InitialOrbitYawDegrees,
/// <summary>Diagnostic-only initial orbit elevation in degrees. Null keeps
/// the normal camera default.</summary>
float? InitialOrbitPitchDegrees,
float FogStartMultiplier,
float FogEndMultiplier,
ResidencyBudgetOptions ResidencyBudgets,
@ -159,6 +174,8 @@ public sealed record RuntimeOptions(
UiProbeScript: NullIfEmpty(env("ACDREAM_UI_PROBE_SCRIPT")),
AutomationArtifactDirectory:
NullIfEmpty(env("ACDREAM_AUTOMATION_ARTIFACT_DIR")),
ExactAutomationFramebuffer:
IsExactlyOne(env("ACDREAM_AUTOMATION_EXACT_FRAMEBUFFER")),
ForcedDayGroupIndex:
TryParseNonNegativeInt(env("ACDREAM_DAY_GROUP")),
// Campaign V slice V7 instrument determinism: pins the Dereth day
@ -182,6 +199,14 @@ public sealed record RuntimeOptions(
// per axis, so any finite number is a valid phase.
SkyAnimationPhaseSeconds:
TryParseFloat(env("ACDREAM_SKY_PHASE_SECONDS")),
InitialOrbitDistanceMeters:
TryParsePositiveFiniteFloat(
env("ACDREAM_ORBIT_DISTANCE_METERS")),
InitialOrbitYawDegrees:
TryParseFiniteFloat(env("ACDREAM_ORBIT_YAW_DEGREES")),
InitialOrbitPitchDegrees:
TryParseOrbitPitchDegrees(
env("ACDREAM_ORBIT_PITCH_DEGREES")),
FogStartMultiplier: TryParseFloat(env("ACDREAM_FOG_START_MULT")) ?? 0.7f,
FogEndMultiplier: TryParseFloat(env("ACDREAM_FOG_END_MULT")) ?? 0.95f,
ResidencyBudgets: ResidencyBudgetOptions.Parse(env),
@ -348,4 +373,22 @@ public sealed record RuntimeOptions(
=> float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out float value)
? value
: null;
private static float? TryParsePositiveFiniteFloat(string? s)
=> TryParseFloat(s) is { } value
&& float.IsFinite(value)
&& value > 0f
? value
: null;
private static float? TryParseFiniteFloat(string? s)
=> TryParseFloat(s) is { } value && float.IsFinite(value)
? value
: null;
private static float? TryParseOrbitPitchDegrees(string? s)
=> TryParseFiniteFloat(s) is { } value
&& value is >= -89f and <= 89f
? value
: null;
}