mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
262 lines
8.3 KiB
C#
262 lines
8.3 KiB
C#
using Mesen.Interop;
|
|
using Mesen.Utilities;
|
|
using ReactiveUI;
|
|
using ReactiveUI.Fody.Helpers;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Mesen.Config
|
|
{
|
|
public class VideoConfig : BaseConfig<VideoConfig>
|
|
{
|
|
[Reactive] [MinMax(0.1, 5.0)] public double CustomAspectRatio { get; set; } = 1.0;
|
|
[Reactive] public VideoFilterType VideoFilter { get; set; } = VideoFilterType.None;
|
|
[Reactive] public VideoAspectRatio AspectRatio { get; set; } = VideoAspectRatio.NoStretching;
|
|
|
|
[Reactive] public bool UseBilinearInterpolation { get; set; } = false;
|
|
[Reactive] public bool UseSoftwareRenderer { get; set; } = false;
|
|
[Reactive] public bool UseSrgbTextureFormat { get; set; } = false;
|
|
[Reactive] public bool VerticalSync { get; set; } = false;
|
|
[Reactive] public bool IntegerFpsMode { get; set; } = false;
|
|
|
|
[Reactive] [MinMax(-100, 100)] public int Brightness { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int Contrast { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int Hue { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int Saturation { get; set; } = 0;
|
|
[Reactive] [MinMax(0, 100)] public int ScanlineIntensity { get; set; } = 0;
|
|
|
|
[Reactive][MinMax(0, 100)] public int LcdGridTopLeftBrightness { get; set; } = 100;
|
|
[Reactive][MinMax(0, 100)] public int LcdGridTopRightBrightness { get; set; } = 85;
|
|
[Reactive][MinMax(0, 100)] public int LcdGridBottomLeftBrightness { get; set; } = 85;
|
|
[Reactive][MinMax(0, 100)] public int LcdGridBottomRightBrightness { get; set; } = 85;
|
|
|
|
[Reactive] [MinMax(-100, 100)] public int NtscArtifacts { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int NtscBleed { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int NtscFringing { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int NtscGamma { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int NtscResolution { get; set; } = 0;
|
|
[Reactive] [MinMax(-100, 100)] public int NtscSharpness { get; set; } = 0;
|
|
[Reactive] public bool NtscMergeFields { get; set; } = false;
|
|
|
|
[Reactive] public NtscBisqwitFilterScale NtscScale { get; set; } = NtscBisqwitFilterScale._2x;
|
|
[Reactive] [MinMax(-50, 400)] public Int32 NtscYFilterLength { get; set; } = 0;
|
|
[Reactive] [MinMax(0, 400)] public Int32 NtscIFilterLength { get; set; } = 50;
|
|
[Reactive] [MinMax(0, 400)] public Int32 NtscQFilterLength { get; set; } = 50;
|
|
|
|
[Reactive] public bool FullscreenForceIntegerScale { get; set; } = false;
|
|
[Reactive] public bool UseExclusiveFullscreen { get; set; } = false;
|
|
[Reactive] public UInt32 ExclusiveFullscreenRefreshRateNtsc { get; set; } = 60;
|
|
[Reactive] public UInt32 ExclusiveFullscreenRefreshRatePal { get; set; } = 50;
|
|
[Reactive] public FullscreenResolution ExclusiveFullscreenResolution { get; set; } = 0;
|
|
|
|
[Reactive] public ScreenRotation ScreenRotation { get; set; } = ScreenRotation.None;
|
|
|
|
public VideoConfig()
|
|
{
|
|
}
|
|
|
|
public void ApplyConfig()
|
|
{
|
|
double customAspectRatio = CustomAspectRatio;
|
|
VideoAspectRatio aspectRatio = AspectRatio;
|
|
VideoFilterType videoFilter = VideoFilter;
|
|
|
|
ConsoleOverrideConfig? overrides = ConsoleOverrideConfig.GetActiveOverride();
|
|
if(overrides?.OverrideVideoFilter == true) {
|
|
videoFilter = overrides.VideoFilter;
|
|
}
|
|
|
|
if(overrides?.OverrideAspectRatio == true) {
|
|
aspectRatio = overrides.AspectRatio;
|
|
customAspectRatio = overrides.CustomAspectRatio;
|
|
}
|
|
|
|
ConfigApi.SetVideoConfig(new InteropVideoConfig() {
|
|
CustomAspectRatio = customAspectRatio,
|
|
VideoFilter = videoFilter,
|
|
AspectRatio = aspectRatio,
|
|
|
|
UseBilinearInterpolation = this.UseBilinearInterpolation,
|
|
UseSrgbTextureFormat = this.UseSrgbTextureFormat,
|
|
VerticalSync = this.VerticalSync,
|
|
IntegerFpsMode = this.IntegerFpsMode,
|
|
|
|
Brightness = this.Brightness / 100.0,
|
|
Contrast = this.Contrast / 100.0,
|
|
Hue = this.Hue / 100.0,
|
|
Saturation = this.Saturation / 100.0,
|
|
ScanlineIntensity = this.ScanlineIntensity / 100.0,
|
|
|
|
LcdGridTopLeftBrightness = this.LcdGridTopLeftBrightness / 100.0,
|
|
LcdGridTopRightBrightness = this.LcdGridTopRightBrightness / 100.0,
|
|
LcdGridBottomLeftBrightness = this.LcdGridBottomLeftBrightness / 100.0,
|
|
LcdGridBottomRightBrightness = this.LcdGridBottomRightBrightness / 100.0,
|
|
|
|
NtscArtifacts = this.NtscArtifacts / 100.0,
|
|
NtscBleed = this.NtscBleed / 100.0,
|
|
NtscFringing = this.NtscFringing / 100.0,
|
|
NtscGamma = this.NtscGamma / 100.0,
|
|
NtscResolution = this.NtscResolution / 100.0,
|
|
NtscSharpness = this.NtscSharpness / 100.0,
|
|
NtscMergeFields = this.NtscMergeFields,
|
|
|
|
NtscScale = this.NtscScale,
|
|
NtscYFilterLength = this.NtscYFilterLength / 100.0,
|
|
NtscIFilterLength = this.NtscIFilterLength / 100.0,
|
|
NtscQFilterLength = this.NtscQFilterLength / 100.0,
|
|
|
|
FullscreenForceIntegerScale = this.FullscreenForceIntegerScale,
|
|
UseExclusiveFullscreen = this.UseExclusiveFullscreen,
|
|
ExclusiveFullscreenRefreshRateNtsc = this.ExclusiveFullscreenRefreshRateNtsc,
|
|
ExclusiveFullscreenRefreshRatePal = this.ExclusiveFullscreenRefreshRatePal,
|
|
FullscreenResWidth = (uint)(ExclusiveFullscreenResolution == FullscreenResolution.Default ? (ApplicationHelper.GetMainWindow()?.Screens.Primary?.Bounds.Width ?? 1920) : ExclusiveFullscreenResolution.GetWidth()),
|
|
FullscreenResHeight = (uint)(ExclusiveFullscreenResolution == FullscreenResolution.Default ? (ApplicationHelper.GetMainWindow()?.Screens.Primary?.Bounds.Height ?? 1080) : ExclusiveFullscreenResolution.GetHeight()),
|
|
|
|
ScreenRotation = (uint)ScreenRotation
|
|
});
|
|
}
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct InteropVideoConfig
|
|
{
|
|
public double CustomAspectRatio;
|
|
public VideoFilterType VideoFilter;
|
|
public VideoAspectRatio AspectRatio;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool UseBilinearInterpolation;
|
|
[MarshalAs(UnmanagedType.I1)] public bool UseSrgbTextureFormat;
|
|
[MarshalAs(UnmanagedType.I1)] public bool VerticalSync;
|
|
[MarshalAs(UnmanagedType.I1)] public bool IntegerFpsMode;
|
|
|
|
public double Brightness;
|
|
public double Contrast;
|
|
public double Hue;
|
|
public double Saturation;
|
|
public double ScanlineIntensity;
|
|
|
|
public double LcdGridTopLeftBrightness;
|
|
public double LcdGridTopRightBrightness;
|
|
public double LcdGridBottomLeftBrightness;
|
|
public double LcdGridBottomRightBrightness;
|
|
|
|
public double NtscArtifacts;
|
|
public double NtscBleed;
|
|
public double NtscFringing;
|
|
public double NtscGamma;
|
|
public double NtscResolution;
|
|
public double NtscSharpness;
|
|
[MarshalAs(UnmanagedType.I1)] public bool NtscMergeFields;
|
|
|
|
public NtscBisqwitFilterScale NtscScale;
|
|
public double NtscYFilterLength;
|
|
public double NtscIFilterLength;
|
|
public double NtscQFilterLength;
|
|
|
|
[MarshalAs(UnmanagedType.I1)] public bool FullscreenForceIntegerScale;
|
|
[MarshalAs(UnmanagedType.I1)] public bool UseExclusiveFullscreen;
|
|
public UInt32 ExclusiveFullscreenRefreshRateNtsc;
|
|
public UInt32 ExclusiveFullscreenRefreshRatePal;
|
|
public UInt32 FullscreenResWidth;
|
|
public UInt32 FullscreenResHeight;
|
|
|
|
public UInt32 ScreenRotation;
|
|
}
|
|
|
|
public enum VideoFilterType
|
|
{
|
|
None = 0,
|
|
NtscBlargg,
|
|
NtscBisqwit,
|
|
LcdGrid,
|
|
xBRZ2x,
|
|
xBRZ3x,
|
|
xBRZ4x,
|
|
xBRZ5x,
|
|
xBRZ6x,
|
|
HQ2x,
|
|
HQ3x,
|
|
HQ4x,
|
|
Scale2x,
|
|
Scale3x,
|
|
Scale4x,
|
|
_2xSai,
|
|
Super2xSai,
|
|
SuperEagle,
|
|
Prescale2x,
|
|
Prescale3x,
|
|
Prescale4x,
|
|
Prescale6x,
|
|
Prescale8x,
|
|
Prescale10x
|
|
}
|
|
|
|
public enum VideoAspectRatio
|
|
{
|
|
NoStretching = 0,
|
|
Auto = 1,
|
|
NTSC = 2,
|
|
PAL = 3,
|
|
Standard = 4,
|
|
Widescreen = 5,
|
|
Custom = 6
|
|
}
|
|
|
|
public enum ScreenRotation
|
|
{
|
|
None = 0,
|
|
_90Degrees = 90,
|
|
_180Degrees = 180,
|
|
_270Degrees = 270
|
|
}
|
|
|
|
public enum NtscBisqwitFilterScale
|
|
{
|
|
_2x,
|
|
_4x,
|
|
_8x
|
|
}
|
|
|
|
public enum FullscreenResolution
|
|
{
|
|
Default,
|
|
_3840x2160,
|
|
_2560x1440,
|
|
_2160x1200,
|
|
_1920x1440,
|
|
_1920x1200,
|
|
_1920x1080,
|
|
_1680x1050,
|
|
_1600x1200,
|
|
_1600x1024,
|
|
_1600x900,
|
|
_1366x768,
|
|
_1360x768,
|
|
_1280x1024,
|
|
_1280x960,
|
|
_1280x800,
|
|
_1280x768,
|
|
_1280x720,
|
|
_1152x864,
|
|
_1024x768,
|
|
_800x600,
|
|
_640x480
|
|
}
|
|
|
|
public static class FullscreenResolutionExtensions
|
|
{
|
|
public static int GetWidth(this FullscreenResolution res)
|
|
{
|
|
return Int32.Parse(res.ToString().Substring(1, res.ToString().IndexOf("x") - 1));
|
|
}
|
|
|
|
public static int GetHeight(this FullscreenResolution res)
|
|
{
|
|
return Int32.Parse(res.ToString().Substring(res.ToString().IndexOf("x") + 1));
|
|
}
|
|
}
|
|
}
|