MoonTools.ResolutionScaler/ResolutionScaler.cs

69 lines
2.0 KiB
C#

using Microsoft.Xna.Framework;
namespace ResolutionScaler
{
static class ResolutionScaler
{
static private int s_virtual_width;
static private int s_virtual_height;
static private int s_screen_width;
static private int s_screen_height;
static private Matrix s_transform_matrix;
static private bool s_dirtyMatrix = true;
static public void Init(int screenWidth, int screenHeight, int virtualWidth, int virtualHeight)
{
s_screen_width = screenWidth;
s_screen_height = screenHeight;
s_virtual_width = virtualWidth;
s_virtual_height = virtualHeight;
s_dirtyMatrix = true;
}
static public Matrix TransformMatrix
{
get
{
if (s_dirtyMatrix) RecreateScaleMatrix();
return s_transform_matrix;
}
}
static public void SetScreenResolution(int width, int height)
{
s_screen_width = width;
s_screen_height = height;
s_dirtyMatrix = true;
}
static public void SetVirtualResolution(int width, int height)
{
s_virtual_width = width;
s_virtual_height = height;
s_dirtyMatrix = true;
}
static private void RecreateScaleMatrix()
{
var scaleUniform = System.Math.Min(
(float)s_screen_width / s_virtual_width,
(float)s_screen_height / s_virtual_height
);
var scaleMatrix = Matrix.CreateScale(
(float)scaleUniform,
(float)scaleUniform,
1f
);
var offX = (s_screen_width - scaleUniform * s_virtual_width) / 2;
var offY = (s_screen_height - scaleUniform * s_virtual_height) / 2;
var translationMatrix = Matrix.CreateTranslation(offX, offY, 0);
s_transform_matrix = scaleMatrix * translationMatrix;
s_dirtyMatrix = false;
}
}
}