using System.Collections.Generic; using System.ComponentModel; using Newtonsoft.Json; using BizHawk.Emulation.Common; using System.Reflection; namespace BizHawk.Emulation.Cores.Nintendo.N64 { public partial class N64SyncSettings { public class N64RicePluginSettings : IPluginSettings { public N64RicePluginSettings() { FrameBufferSetting = 0; FrameBufferWriteBackControl = 0; RenderToTexture = 0; ScreenUpdateSetting = 4; Mipmapping = 2; FogMethod = 0; ForceTextureFilter = 0; TextureEnhancement = 0; TextureEnhancementControl = 0; TextureQuality = 0; OpenGLDepthBufferSetting = 16; MultiSampling = 0; ColorQuality = 0; OpenGLRenderSetting = 0; AnisotropicFiltering = 0; NormalAlphaBlender = false; FastTextureLoading = false; AccurateTextureMapping = true; InN64Resolution = false; SaveVRAM = false; DoubleSizeForSmallTxtrBuf = false; DefaultCombinerDisable = false; EnableHacks = true; WinFrameMode = false; FullTMEMEmulation = false; OpenGLVertexClipper = false; EnableSSE = true; EnableVertexShader = false; SkipFrame = false; TexRectOnly = false; SmallTextureOnly = false; LoadHiResCRCOnly = true; LoadHiResTextures = false; DumpTexturesToFiles = false; UseDefaultHacks = true; DisableTextureCRC = false; DisableCulling = false; IncTexRectEdge = false; ZHack = false; TextureScaleHack = false; PrimaryDepthHack = false; Texture1Hack = false; FastLoadTile = false; UseSmallerTexture = false; VIWidth = -1; VIHeight = -1; UseCIWidthAndRatio = 0; FullTMEM = 0; TxtSizeMethod2 = false; EnableTxtLOD = false; FastTextureCRC = 0; EmulateClear = false; ForceScreenClear = false; AccurateTextureMappingHack = 0; NormalBlender = 0; DisableBlender = false; ForceDepthBuffer = false; DisableObjBG = false; FrameBufferOption = 0; RenderToTextureOption = 0; ScreenUpdateSettingHack = 0; EnableHacksForGame = 0; } [JsonIgnore] [Description("Plugin Type")] public PluginType PluginType { get { return PluginType.RICE; } } [DefaultValue(0)] [DisplayName("Frame Buffer Emulation")] // 0=ROM default, 1=disable public int FrameBufferSetting { get; set; } [DefaultValue(0)] [DisplayName("Frame Buffer Wrie Back Control")] // Frequency to write back the frame buffer // 0=every frame, 1=every other frame, etc public int FrameBufferWriteBackControl { get; set; } [DefaultValue(0)] [DisplayName("Render-to-texture emulation")] // 0=none, 1=ignore, 2=normal, 3=write back, 4=write back and reload public int RenderToTexture { get; set; } [DefaultValue(4)] [DisplayName("Screen Update Setting")] // Control when the screen will be updated // 0=ROM default, 1=VI origin update, 2=VI origin change, // 3=CI change, 4=first CI change, 5=first primitive draw, // 6=before screen clear, 7=after screen drawn public int ScreenUpdateSetting { get; set; } [DefaultValue(2)] [DisplayName("Mip Mapping")] // 0=no, 1=nearest, 2=bilinear, 3=trilinear public int Mipmapping { get; set; } [DefaultValue(0)] [DisplayName("Fog Method")] // 0=Disable, 1=Enable n64 choose, 2=Force Fog public int FogMethod { get; set; } [DefaultValue(0)] [DisplayName("Force Texture Filter")] // Force to use texture filtering or not // 0=auto: n64 choose, 1=force no filtering, 2=force filtering public int ForceTextureFilter { get; set; } [DefaultValue(0)] [DisplayName("Primary texture enhancement filter")] // 0=None, 1=2X, 2=2XSAI, 3=HQ2X, 4=LQ2X, 5=HQ4X, 6=Sharpen, 7=Sharpen More, 8=External, 9=Mirrored public int TextureEnhancement { get; set; } [DefaultValue(0)] [DisplayName("Secondary texture enhancement filter")] // 0 = none, 1-4 = filtered public int TextureEnhancementControl { get; set; } [DefaultValue(0)] [DisplayName("Texture Quality")] // Color bit depth to use for textures // 0=default, 1=32 bits, 2=16 bits public int TextureQuality { get; set; } [DefaultValue(16)] [DisplayName("OpenGL Depth Buffer Setting")] // Z-buffer depth (only 16 or 32) public int OpenGLDepthBufferSetting { get; set; } [DefaultValue(0)] [DisplayName("Enable/Disable MultiSampling")] // 0=off, 2,4,8,16=quality public int MultiSampling { get; set; } [DefaultValue(0)] [DisplayName("Color Quality")] // Color bit depth for rendering window // 0=32 bits, 1=16 bits public int ColorQuality { get; set; } [DefaultValue(0)] [DisplayName("OpenGL Render Setting")] // OpenGL level to support // 0=auto, 1=OGL_1.1, 2=OGL_1.2, 3=OGL_1.3, 4=OGL_1.4, // 5=OGL_1.4_V2, 6=OGL_TNT2, 7=NVIDIA_OGL, 8=OGL_FRAGMENT_PROGRAM public int OpenGLRenderSetting { get; set; } [DefaultValue(0)] [DisplayName("Anisotropic Filtering")] // Enable/Disable Anisotropic Filtering for Mipmapping // 0=no filtering, 2-16=quality //This is uneffective if Mipmapping is 0. If the given value is to high to // be supported by your graphic card, the value will be the highest value //your graphic card can support. Better result with Trilinear filtering public int AnisotropicFiltering { get; set; } [DefaultValue(false)] [DisplayName("Normal Alpha Blender")] // Force to use normal alpha blender public bool NormalAlphaBlender { get; set; } [DefaultValue(false)] [DisplayName("Fast Texture Loading")] // Use a faster algorithm to speed up texture loading and CRC computation public bool FastTextureLoading { get; set; } [DefaultValue(true)] [DisplayName("Accurate Texture Mapping")] // Use different texture coordinate clamping code public bool AccurateTextureMapping { get; set; } [DefaultValue(false)] [DisplayName("In N64 Resolution")] // Force emulated frame buffers to be in N64 native resolution public bool InN64Resolution { get; set; } [DefaultValue(false)] [DisplayName("Save VRAM")] // Try to reduce Video RAM usage (should never be used) public bool SaveVRAM { get; set; } [DefaultValue(false)] [DisplayName("Double Size for Small Texture Buffer")] // Enable this option to have better render-to-texture quality public bool DoubleSizeForSmallTxtrBuf { get; set; } [DefaultValue(false)] [DisplayName("Default Combiner Disable")] // Force to use normal color combiner public bool DefaultCombinerDisable { get; set; } [DefaultValue(true)] [DisplayName("Enable Hacks")] // Enable game-specific settings from INI file public bool EnableHacks { get; set; } [DefaultValue(false)] [DisplayName("WinFrame Mode")] // If enabled, graphics will be drawn in WinFrame mode instead of solid and texture mode public bool WinFrameMode { get; set; } [DefaultValue(false)] [DisplayName("Full TMEM Emulation")] // N64 Texture Memory Full Emulation (may fix some games, may break others) public bool FullTMEMEmulation { get; set; } [DefaultValue(false)] [DisplayName("OpenGL Vertex Clipper")] // Enable vertex clipper for fog operations public bool OpenGLVertexClipper { get; set; } [DefaultValue(true)] [DisplayName("Enable SSE")] //Enable/Disable SSE optimizations for capable CPUs public bool EnableSSE { get; set; } [DefaultValue(false)] [DisplayName("Enable Vertex Shader")] // Use GPU vertex shader public bool EnableVertexShader { get; set; } [DefaultValue(false)] [DisplayName("Skip Frame")] // If this option is enabled, the plugin will skip every other frame public bool SkipFrame { get; set; } [DefaultValue(false)] [DisplayName("Text Rect Only")] // If enabled, texture enhancement will be done only for TxtRect ucode public bool TexRectOnly { get; set; } [DefaultValue(false)] [DisplayName("Small Texture Only")] // If enabled, texture enhancement will be done only for textures width+height<=128 public bool SmallTextureOnly { get; set; } [DefaultValue(true)] [DisplayName("Load Hi Res CRC Only")] // Select hi-resolution textures based only on the CRC and ignore format+size information (Glide64 compatibility) public bool LoadHiResCRCOnly { get; set; } [DefaultValue(false)] [DisplayName("Load Hi Res Textures")] // Enable hi-resolution texture file loading public bool LoadHiResTextures { get; set; } [DefaultValue(false)] [DisplayName("Dump Textures to Files")] // Enable texture dumping public bool DumpTexturesToFiles { get; set; } [DefaultValue(true)] [DisplayName("Use Default Hacks")] public bool UseDefaultHacks { get; set; } [DefaultValue(false)] [DisplayName("Disable Texture CRC")] public bool DisableTextureCRC { get; set; } [DefaultValue(false)] [DisplayName("Disable Culling")] public bool DisableCulling { get; set; } [DefaultValue(false)] [DisplayName("Include TexRect Edge")] public bool IncTexRectEdge { get; set; } [DefaultValue(false)] [DisplayName("ZHack")] public bool ZHack { get; set; } [DefaultValue(false)] [DisplayName("Texture Scale Hack")] public bool TextureScaleHack { get; set; } [DefaultValue(false)] [DisplayName("Primary Depth Hack")] public bool PrimaryDepthHack { get; set; } [DefaultValue(false)] [DisplayName("Texture 1 Hack")] public bool Texture1Hack { get; set; } [DefaultValue(false)] [DisplayName("Fast Load Tile")] public bool FastLoadTile { get; set; } [DefaultValue(false)] [DisplayName("Use Smaller Texture")] public bool UseSmallerTexture { get; set; } [DefaultValue(-1)] [DisplayName("VI Width")] public int VIWidth { get; set; } [DefaultValue(-1)] [DisplayName("VI Height")] public int VIHeight { get; set; } [DefaultValue(0)] [DisplayName("Use CI Width and Ratio")] public int UseCIWidthAndRatio { get; set; } [DefaultValue(0)] [DisplayName("Full THEM")] public int FullTMEM { get; set; } [DefaultValue(false)] [DisplayName("Text Size Method 2")] public bool TxtSizeMethod2 { get; set; } [DefaultValue(false)] [DisplayName("Enable Txt LOD")] public bool EnableTxtLOD { get; set; } [DefaultValue(0)] [DisplayName("Fast Texture CRC")] public int FastTextureCRC { get; set; } [DefaultValue(0)] [DisplayName("Emulate Clear")] public bool EmulateClear { get; set; } [DefaultValue(false)] [DisplayName("Force Screen Clear")] public bool ForceScreenClear { get; set; } [DefaultValue(0)] [DisplayName("Accurate Texture Mapping Hack")] public int AccurateTextureMappingHack { get; set; } [DefaultValue(0)] [DisplayName("Normal Blender")] public int NormalBlender { get; set; } [DefaultValue(false)] [DisplayName("Disable Blender")] public bool DisableBlender { get; set; } [DefaultValue(false)] [DisplayName("Force Depth Buffer")] public bool ForceDepthBuffer { get; set; } [DefaultValue(false)] [DisplayName("Disable Obj BG")] public bool DisableObjBG { get; set; } [DefaultValue(0)] [DisplayName("Frame Buffer Option")] public int FrameBufferOption { get; set; } [DefaultValue(0)] [DisplayName("Render to Texture Option")] public int RenderToTextureOption { get; set; } [DefaultValue(0)] [DisplayName("Screen Update Setting Hack")] public int ScreenUpdateSettingHack { get; set; } [DefaultValue(0)] [DisplayName("Enable Hacks for Game")] public int EnableHacksForGame { get; set; } public N64RicePluginSettings Clone() { return (N64RicePluginSettings)MemberwiseClone(); } public void FillPerGameHacks(GameInfo game) { if (UseDefaultHacks) { DisableTextureCRC = game.GetBool("RiceDisableTextureCRC", false); DisableCulling = game.GetBool("RiceDisableCulling", false); IncTexRectEdge = game.GetBool("RiceIncTexRectEdge", false); ZHack = game.GetBool("RiceZHack", false); TextureScaleHack = game.GetBool("RiceTextureScaleHack", false); PrimaryDepthHack = game.GetBool("RicePrimaryDepthHack", false); Texture1Hack = game.GetBool("RiceTexture1Hack", false); FastLoadTile = game.GetBool("RiceFastLoadTile", false); UseSmallerTexture = game.GetBool("RiceUseSmallerTexture", false); VIWidth = game.GetInt("RiceVIWidth", -1); VIHeight = game.GetInt("RiceVIHeight", -1); UseCIWidthAndRatio = game.GetInt("RiceUseCIWidthAndRatio", 0); FullTMEM = game.GetInt("RiceFullTMEM", 0); TxtSizeMethod2 = game.GetBool("RiceTxtSizeMethod2", false); EnableTxtLOD = game.GetBool("RiceEnableTxtLOD", false); FastTextureCRC = game.GetInt("RiceFastTextureCRC", 0); EmulateClear = game.GetBool("RiceEmulateClear", false); ForceScreenClear = game.GetBool("RiceForceScreenClear", false); AccurateTextureMappingHack = game.GetInt("RiceAccurateTextureMappingHack", 0); NormalBlender = game.GetInt("RiceNormalBlender", 0); DisableBlender = game.GetBool("RiceDisableBlender", false); ForceDepthBuffer = game.GetBool("RiceForceDepthBuffer", false); DisableObjBG = game.GetBool("RiceDisableObjBG", false); FrameBufferOption = game.GetInt("RiceFrameBufferOption", 0); RenderToTextureOption = game.GetInt("RiceRenderToTextureOption", 0); ScreenUpdateSettingHack = game.GetInt("RiceScreenUpdateSettingHack", 0); EnableHacksForGame = game.GetInt("RiceEnableHacksForGame", 0); } } public Dictionary GetPluginSettings() { //TODO: deal witn the game depedent settings var dictionary = new Dictionary(); var members = this.GetType().GetMembers(); foreach (var member in members) { if (member.MemberType == MemberTypes.Property) { var field = this.GetType().GetProperty(member.Name).GetValue(this, null); dictionary.Add(member.Name, field); } } return dictionary; } } } }