diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs index 91dc3913..9fd7c512 100644 --- a/Source/Core/Config/ProgramConfiguration.cs +++ b/Source/Core/Config/ProgramConfiguration.cs @@ -92,6 +92,7 @@ namespace CodeImp.DoomBuilder.Config private bool toolbargeometry; private bool toolbartesting; private bool toolbarfile; + private float filteranisotropy; // These are not stored in the configuration, only used at runtime private string defaulttexture; @@ -153,6 +154,7 @@ namespace CodeImp.DoomBuilder.Config public bool ToolbarGeometry { get { return toolbargeometry; } internal set { toolbargeometry = value; } } public bool ToolbarTesting { get { return toolbartesting; } internal set { toolbartesting = value; } } public bool ToolbarFile { get { return toolbarfile; } internal set { toolbarfile = value; } } + public float FilterAnisotropy { get { return filteranisotropy; } internal set { filteranisotropy = value; } } public string DefaultTexture { get { return defaulttexture; } set { defaulttexture = value; } } public string DefaultFloorTexture { get { return defaultfloortexture; } set { defaultfloortexture = value; } } @@ -231,6 +233,7 @@ namespace CodeImp.DoomBuilder.Config toolbargeometry = cfg.ReadSetting("toolbargeometry", true); toolbartesting = cfg.ReadSetting("toolbartesting", true); toolbarfile = cfg.ReadSetting("toolbarfile", true); + filteranisotropy = cfg.ReadSetting("filteranisotropy", 8.0f); // Success return true; @@ -291,6 +294,7 @@ namespace CodeImp.DoomBuilder.Config cfg.WriteSetting("toolbargeometry", toolbargeometry); cfg.WriteSetting("toolbartesting", toolbartesting); cfg.WriteSetting("toolbarfile", toolbarfile); + cfg.WriteSetting("filteranisotropy", filteranisotropy); // Save settings configuration General.WriteLogLine("Saving program configuration..."); diff --git a/Source/Core/Rendering/D3DDevice.cs b/Source/Core/Rendering/D3DDevice.cs index 5e70c10e..82e8ffc0 100644 --- a/Source/Core/Rendering/D3DDevice.cs +++ b/Source/Core/Rendering/D3DDevice.cs @@ -229,7 +229,7 @@ namespace CodeImp.DoomBuilder.Rendering device.Material = material; // Shader settings - shaders.World3D.SetConstants(General.Settings.VisualBilinear, true); + shaders.World3D.SetConstants(General.Settings.VisualBilinear, true, General.Settings.FilterAnisotropy); // Texture filters postfilter = Filter.Point; @@ -317,7 +317,7 @@ namespace CodeImp.DoomBuilder.Rendering shaders = new ShaderManager(this); // Font - postfilter = Filter.Box; + postfilter = Filter.Box; // Only for the font. This will be reset in SetupSettings (see below) font = new TextFont(); fonttexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Font.png"); fonttexture.LoadImage(); diff --git a/Source/Core/Rendering/World3DShader.cs b/Source/Core/Rendering/World3DShader.cs index 117e39bc..58d84369 100644 --- a/Source/Core/Rendering/World3DShader.cs +++ b/Source/Core/Rendering/World3DShader.cs @@ -45,6 +45,8 @@ namespace CodeImp.DoomBuilder.Rendering private EffectHandle worldviewproj; private EffectHandle minfiltersettings; private EffectHandle magfiltersettings; + private EffectHandle mipfiltersettings; + private EffectHandle maxanisotropysetting; private EffectHandle modulatecolor; private EffectHandle highlightcolor; @@ -72,8 +74,10 @@ namespace CodeImp.DoomBuilder.Rendering texture1 = effect.GetParameter(null, "texture1"); minfiltersettings = effect.GetParameter(null, "minfiltersettings"); magfiltersettings = effect.GetParameter(null, "magfiltersettings"); + mipfiltersettings = effect.GetParameter(null, "mipfiltersettings"); modulatecolor = effect.GetParameter(null, "modulatecolor"); highlightcolor = effect.GetParameter(null, "highlightcolor"); + maxanisotropysetting = effect.GetParameter(null, "maxanisotropysetting"); } // Initialize world vertex declaration @@ -101,8 +105,10 @@ namespace CodeImp.DoomBuilder.Rendering if(worldviewproj != null) worldviewproj.Dispose(); if(minfiltersettings != null) minfiltersettings.Dispose(); if(magfiltersettings != null) magfiltersettings.Dispose(); + if(mipfiltersettings != null) mipfiltersettings.Dispose(); if(modulatecolor != null) modulatecolor.Dispose(); if(highlightcolor != null) highlightcolor.Dispose(); + if(maxanisotropysetting != null) maxanisotropysetting.Dispose(); // Done base.Dispose(); @@ -114,19 +120,33 @@ namespace CodeImp.DoomBuilder.Rendering #region ================== Methods // This sets the constant settings - public void SetConstants(bool bilinear, bool useanisotropic) + public void SetConstants(bool bilinear, bool useanisotropic, float maxanisotropy) { if(manager.Enabled) { if(bilinear) { - effect.SetValue(magfiltersettings, (int)TextureFilter.Linear); - if(useanisotropic) effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic); + if(useanisotropic) + { + effect.SetValue(magfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(minfiltersettings, (int)TextureFilter.Anisotropic); + effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(maxanisotropysetting, maxanisotropy); + } + else + { + effect.SetValue(magfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(minfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(maxanisotropysetting, 1.0f); + } } else { effect.SetValue(magfiltersettings, (int)TextureFilter.Point); effect.SetValue(minfiltersettings, (int)TextureFilter.Point); + effect.SetValue(mipfiltersettings, (int)TextureFilter.Linear); + effect.SetValue(maxanisotropysetting, 1.0f); } } } @@ -168,7 +188,7 @@ namespace CodeImp.DoomBuilder.Rendering { device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point); device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Point); - device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Point); + device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear); device.SetSamplerState(0, SamplerState.MipMapLodBias, 0f); } diff --git a/Source/Core/Resources/world3d.fx b/Source/Core/Resources/world3d.fx index d01ad2a0..fd3dbd00 100644 --- a/Source/Core/Resources/world3d.fx +++ b/Source/Core/Resources/world3d.fx @@ -32,6 +32,8 @@ texture texture1; // Filter settings dword minfiltersettings; dword magfiltersettings; +dword mipfiltersettings; +float maxanisotropysetting; // Texture sampler settings sampler2D texturesamp = sampler_state @@ -39,8 +41,9 @@ sampler2D texturesamp = sampler_state Texture = ; MagFilter = magfiltersettings; MinFilter = minfiltersettings; - MipFilter = magfiltersettings; + MipFilter = mipfiltersettings; MipMapLodBias = 0.0f; + MaxAnisotropy = maxanisotropysetting; }; // Vertex shader