From 2179653494e54d58c7980bf93ab16ec7212ae3fc Mon Sep 17 00:00:00 2001 From: annabunches Date: Tue, 25 Feb 2025 11:18:00 -0500 Subject: [PATCH] First stab at a class that abstracts out automatic scaling for sprite-based displays. (I haven't even been able to test compilation or get IntelliSense for this.) --- Mixins/ScaledDisplay/ScaledDisplay.projitems | 11 ++ Mixins/ScaledDisplay/ScaledGridDisplay.cs | 105 ++++++++++++++++++ Mixins/ScaledDisplay/ScaledGridDisplay.shproj | 19 ++++ SpaceEngineers.sln | 2 + 4 files changed, 137 insertions(+) create mode 100644 Mixins/ScaledDisplay/ScaledDisplay.projitems create mode 100644 Mixins/ScaledDisplay/ScaledGridDisplay.cs create mode 100644 Mixins/ScaledDisplay/ScaledGridDisplay.shproj diff --git a/Mixins/ScaledDisplay/ScaledDisplay.projitems b/Mixins/ScaledDisplay/ScaledDisplay.projitems new file mode 100644 index 0000000..f9c06fe --- /dev/null +++ b/Mixins/ScaledDisplay/ScaledDisplay.projitems @@ -0,0 +1,11 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 8a3cdcc5-4b55-4d87-a415-698a0e1ff06f + + + + + \ No newline at end of file diff --git a/Mixins/ScaledDisplay/ScaledGridDisplay.cs b/Mixins/ScaledDisplay/ScaledGridDisplay.cs new file mode 100644 index 0000000..c05f9d6 --- /dev/null +++ b/Mixins/ScaledDisplay/ScaledGridDisplay.cs @@ -0,0 +1,105 @@ +namespace IngameScript +{ + partial class Program + { + public class ScaledGridDisplay + { + private IMyTextSurface _surface; + private List _sprites = new List(); + + private RectangleF _viewport; + private float _scale; + + private float _topPadding; + private int _rows; + private float _rowHeight; + + private const float LeftPadding = 2f; + private int _columns; + private float _columnWidth; + + public ScaledGridDisplay(IMyTextSurface surface, int rows, int columns) + { + // Setup draw surface + _surface = surface; + _surface.ScriptBackgroundColor = new Color(0, 0, 0, 255); + _surface.ContentType = ContentType.SCRIPT; + _surface.Script = ""; + + // configure viewport / scaling + _viewport = new RectangleF( + (_surface.TextureSize - _surface.SurfaceSize) / 2f, + _surface.SurfaceSize + ); + _scale = _viewport.Size.Y / 400; + + // Calculate grid geometry + _rows = rows; + _columns = columns; + _topPadding = (_viewport.Size.Y / rows) * 0.3; + _rowHeight = (_viewport.Size.Y - topPadding) / rows; + _columnWidth = (_viewport.Size.X - LeftPadding) / columns; + } + + public void AddSprite(MySprite sprite, int row, int column, TextAlignment alignment) + { + // TODO: figure out how coordinates should work... + + // Shift the sprite into the viewable portion of the surface + sprite.Position = getPosition(row, column, alignment); + + switch (sprite.Type) + { + case SpriteType.TEXT: + switch (row) + { + case 0: + sprite.Scale = _scale * 1.2f; + break; + case 1: + sprite.Scale = _scale * 1.1f; + break; + default: + sprite.Scale = _scale; + break; + } + break; + case SpriteType.TEXTURE: + sprite.Size *= _scale; + break; + default: + _console.Print("Unknown sprite type. How did you manage that?"); + break; + } + + _sprites.Add(sprite); + } + + public void Draw() + { + MySpriteDrawFrame frame = _surface.DrawFrame(); + foreach (MySprite sprite in _staticSprites.Values) frame.Add(sprite); + frame.Dispose(); + } + + private Vector2 getPosition(int row, int column, TextAlignment alignment) + { + Vector2 offset = new Vector2(); + offset.X = LeftPadding + (column * _columnWidth); + switch (row) + { + case 0: + offset.Y = 0f; + break; + case 1: + offset.Y = _rowHeight * 1.2f; + break; + default: + offset.Y = _topPadding + (row * _rowHeight); + break; + } + return _viewport.Position + offset; + } + } + } +} diff --git a/Mixins/ScaledDisplay/ScaledGridDisplay.shproj b/Mixins/ScaledDisplay/ScaledGridDisplay.shproj new file mode 100644 index 0000000..c1f31a7 --- /dev/null +++ b/Mixins/ScaledDisplay/ScaledGridDisplay.shproj @@ -0,0 +1,19 @@ + + + + 8a3cdcc5-4b55-4d87-a415-698a0e1ff06f + 14.0 + + + + + + + bin\Debug\ + + + bin\Release\ + + + + diff --git a/SpaceEngineers.sln b/SpaceEngineers.sln index f5319b6..a1ba756 100644 --- a/SpaceEngineers.sln +++ b/SpaceEngineers.sln @@ -19,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InfoDisplays", "InfoDisplay EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DockLoader", "DockLoader\DockLoader.csproj", "{A4D9F936-93B2-423A-BD76-A97A084BD605}" EndProject +Project("{8A3CDCC5-4B55-4D87-A415-698A0E1FF06F}") = "ScaledGridDisplay", "Mixins\ScaledDisplay\ScaledGridDisplay.shproj", "{1C1031E3-B1FE-43AE-91F1-BA74D854B69D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU