protected internal override void RecalculateTargetTransform()
{
if (LayerScaleType == GlobalLayerScaleType.Dynamic)
{
TargetToScreenTransform = Matrix.Identity;
}
else if (ArtemisEngine.DisplayManager.IsBaseResolution)
{
TargetToScreenTransform = Matrix.Identity;
}
else
{
var baseRes = GameConstants.BaseResolution;
var scale = ArtemisEngine.DisplayManager.ResolutionScale;
Matrix transform;
switch (UniformScaleType)
{
case UniformLayerScaleType.Stretch:
transform = Matrix.CreateScale(scale.X, scale.Y, 1);
break;
case UniformLayerScaleType.Fit:
if (scale.X == scale.Y)
transform = Matrix.CreateScale(scale.X, scale.X, 1);
else if (scale.X > scale.Y)
transform = Matrix.CreateScale(scale.Y, scale.Y, 1) *
Matrix.CreateTranslation(baseRes.Width * (1 - scale.X) / 2f, 0, 0);
transform = Matrix.CreateScale(scale.X, scale.X, 1) *
Matrix.CreateTranslation(0, baseRes.Height * (1 - scale.Y) / 2f, 0);
break;
case UniformLayerScaleType.Fill:
if (scale.X == scale.Y)
transform = Matrix.CreateScale(scale.X, scale.X, 1);
else if (scale.X > scale.Y)
transform = Matrix.CreateScale(scale.X, scale.X, 1) *
Matrix.CreateTranslation(0, baseRes.Height / 2f * (scale.Y - scale.X), 0);
transform = Matrix.CreateScale(scale.Y, scale.Y, 1) *
Matrix.CreateTranslation(baseRes.Width / 2f * (scale.X - scale.Y), 0, 0);
break;
default:
throw new RenderLayerException(
String.Format(
"Invalid UniformLayerScaleType value '{0}' supplied.", UniformScaleType));
}
TargetToScreenTransform = transform;
}
RequiresTargetTransformRecalc = false;
}