using System;
namespace AcDream.Core.Rendering;
///
/// 2026-05-19 — runtime-toggleable diagnostic flags for the indoor cell
/// rendering pipeline. Initialized from env vars at process start;
/// flippable at runtime via the DebugPanel mirror. Log call sites read
/// these statics so a checkbox toggle takes effect on the next frame
/// without relaunching.
///
///
/// Mirrors the L.2a
/// pattern. The master toggle is the user's
/// common case — flipping it cascades to all five probe flags.
///
///
///
/// Spec: docs/superpowers/specs/2026-05-19-indoor-cell-rendering-fix-design.md.
///
///
public static class RenderingDiagnostics
{
///
/// When true, WbDrawDispatcher.WalkVisibleEntities emits one
/// [indoor-walk] line per visible cell entity per second:
/// entity id, world position, parent cell id, landblock visible flag,
/// AABB-visible flag, "in visible cells" flag, drew flag.
/// Initial state from ACDREAM_PROBE_INDOOR_WALK=1.
///
public static bool ProbeIndoorWalkEnabled { get; set; } =
Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_WALK") == "1"
|| Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_ALL") == "1";
///
/// When true, WbDrawDispatcher emits one [indoor-lookup]
/// line per visible cell entity per second: render-data hit/miss,
/// IsSetup flag, SetupParts count, parts-hit / parts-miss tallies.
/// Initial state from ACDREAM_PROBE_INDOOR_LOOKUP=1.
///
public static bool ProbeIndoorLookupEnabled { get; set; } =
Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_LOOKUP") == "1"
|| Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_ALL") == "1";
///
/// When true, WbMeshAdapter emits two lines per EnvCell id:
/// [indoor-upload] requested on first IncrementRefCount and
/// [indoor-upload] completed when WB's staged drain produces
/// its ObjectMeshData. Missing "completed" lines indicate WB
/// silently returned null (hypothesis H1).
/// Initial state from ACDREAM_PROBE_INDOOR_UPLOAD=1.
///
public static bool ProbeIndoorUploadEnabled { get; set; } =
Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_UPLOAD") == "1"
|| Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_ALL") == "1";
///
/// When true, WbDrawDispatcher emits one [indoor-xform]
/// line per visible cell entity per second: cell-geometry SetupPart's
/// composed world matrix translation. Disambiguates transform
/// double-apply (hypothesis H5).
/// Initial state from ACDREAM_PROBE_INDOOR_XFORM=1.
///
public static bool ProbeIndoorXformEnabled { get; set; } =
Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_XFORM") == "1"
|| Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_ALL") == "1";
///
/// When true, WbDrawDispatcher.WalkVisibleEntities emits one
/// [indoor-cull] line per cell entity that gets culled, with
/// the reason (visibleCellIds-miss, frustum, landblock). Disambiguates
/// cull bugs (hypothesis H3).
/// Initial state from ACDREAM_PROBE_INDOOR_CULL=1.
///
public static bool ProbeIndoorCullEnabled { get; set; } =
Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_CULL") == "1"
|| Environment.GetEnvironmentVariable("ACDREAM_PROBE_INDOOR_ALL") == "1";
///
/// Master toggle. Reading reflects the AND of all five flags
/// (true only when every probe is on). Writing cascades — setting
/// to turns ALL five flags on; setting to
/// turns ALL five off.
///
public static bool IndoorAll
{
get => ProbeIndoorWalkEnabled
&& ProbeIndoorLookupEnabled
&& ProbeIndoorUploadEnabled
&& ProbeIndoorXformEnabled
&& ProbeIndoorCullEnabled;
set
{
ProbeIndoorWalkEnabled = value;
ProbeIndoorLookupEnabled = value;
ProbeIndoorUploadEnabled = value;
ProbeIndoorXformEnabled = value;
ProbeIndoorCullEnabled = value;
}
}
///
/// Helper for probe call sites. Returns when
/// the low 16 bits of are ≥ 0x0100 — the AC
/// convention for EnvCell (indoor) cells, as opposed to outdoor cells
/// in the 8×8 landblock grid (0x0001–0x0040).
///
public static bool IsEnvCellId(ulong id) => (id & 0xFFFFu) >= 0x0100u;
}