diff --git a/Robust.Client/Graphics/ClientEye/EyeManager.cs b/Robust.Client/Graphics/ClientEye/EyeManager.cs
index 8c5ff48a6..58a70e803 100644
--- a/Robust.Client/Graphics/ClientEye/EyeManager.cs
+++ b/Robust.Client/Graphics/ClientEye/EyeManager.cs
@@ -1,3 +1,5 @@
+using System;
+using System.Globalization;
using System.Numerics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.CustomControls;
@@ -15,12 +17,36 @@ namespace Robust.Client.Graphics
///
public sealed partial class EyeManager : IEyeManager
{
- // If you modify this make sure to edit the value in the Robust.Shared.Audio.AudioParams struct default too!
- // No I can't be bothered to make this a shared constant.
///
- /// Default scaling for the projection matrix.
+ /// Default scaling for the projection matrix: how many texture pixels map to one world meter (tile).
///
- public const int PixelsPerMeter = 32;
+ ///
+ /// Defaults to 32. It can be overridden once, at process startup, via the
+ /// ROBUST_PIXELS_PER_METER environment variable. This is fixed for the lifetime of the
+ /// process and is NOT safe to change at runtime.
+ ///
+ public static readonly int PixelsPerMeter = ReadPixelsPerMeter();
+
+ ///
+ /// Environment variable used to override at startup.
+ ///
+ public const string PixelsPerMeterEnvVar = "ROBUST_PIXELS_PER_METER";
+
+ private const int DefaultPixelsPerMeter = 32;
+
+ private static int ReadPixelsPerMeter()
+ {
+ var raw = Environment.GetEnvironmentVariable(PixelsPerMeterEnvVar);
+
+ if (!string.IsNullOrWhiteSpace(raw)
+ && int.TryParse(raw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value)
+ && value > 0)
+ {
+ return value;
+ }
+
+ return DefaultPixelsPerMeter;
+ }
[Dependency] private IClyde _displayManager = default!;
[Dependency] private IEntityManager _entityManager = default!;
diff --git a/Robust.Client/Graphics/Drawing/DrawingHandleWorld.cs b/Robust.Client/Graphics/Drawing/DrawingHandleWorld.cs
index 9fba50a05..d3eb1a08d 100644
--- a/Robust.Client/Graphics/Drawing/DrawingHandleWorld.cs
+++ b/Robust.Client/Graphics/Drawing/DrawingHandleWorld.cs
@@ -10,7 +10,7 @@ protected DrawingHandleWorld(Texture white) : base(white)
{
}
- private const int Ppm = EyeManager.PixelsPerMeter;
+ private static readonly int Ppm = EyeManager.PixelsPerMeter;
///
/// Draws an untextured colored rectangle to the world.The coordinate system is right handed.
diff --git a/Robust.Client/Map/ClydeTileDefinitionManager.cs b/Robust.Client/Map/ClydeTileDefinitionManager.cs
index 2199b867d..bd22a8ed8 100644
--- a/Robust.Client/Map/ClydeTileDefinitionManager.cs
+++ b/Robust.Client/Map/ClydeTileDefinitionManager.cs
@@ -103,7 +103,7 @@ internal void _genTextureAtlas()
if (defList.Count <= 0)
return;
- const int tileSize = EyeManager.PixelsPerMeter;
+ var tileSize = EyeManager.PixelsPerMeter;
var tileCount = defList.Select(x => x.Variants + x.EdgeSprites.Count).Sum() + 1;