diff --git a/DDrawCompat/Config/Config.cpp b/DDrawCompat/Config/Config.cpp index c373aa0..8385d8e 100644 --- a/DDrawCompat/Config/Config.cpp +++ b/DDrawCompat/Config/Config.cpp @@ -8,5 +8,6 @@ namespace Config Settings::DisplayFilter displayFilter; Settings::DisplayResolution displayResolution; Settings::SupportedResolutions supportedResolutions; + Settings::TextureFilter textureFilter; Settings::ThreadPriorityBoost threadPriorityBoost; } diff --git a/DDrawCompat/Config/Config.h b/DDrawCompat/Config/Config.h index 5729ca5..38b8cf9 100644 --- a/DDrawCompat/Config/Config.h +++ b/DDrawCompat/Config/Config.h @@ -6,6 +6,7 @@ #include #include #include +#include #include namespace Config @@ -20,5 +21,6 @@ namespace Config extern Settings::DisplayFilter displayFilter; extern Settings::DisplayResolution displayResolution; extern Settings::SupportedResolutions supportedResolutions; + extern Settings::TextureFilter textureFilter; extern Settings::ThreadPriorityBoost threadPriorityBoost; } diff --git a/DDrawCompat/Config/Settings/TextureFilter.cpp b/DDrawCompat/Config/Settings/TextureFilter.cpp new file mode 100644 index 0000000..135b229 --- /dev/null +++ b/DDrawCompat/Config/Settings/TextureFilter.cpp @@ -0,0 +1,22 @@ +#include +#include + +namespace Config +{ + namespace Settings + { + TextureFilter::TextureFilter() + : MappedSetting("TextureFilter", "app", { + {"app", {D3DTEXF_NONE, D3DTEXF_NONE, 1}}, + {"point", {D3DTEXF_POINT, D3DTEXF_POINT, 1}}, + {"bilinear", {D3DTEXF_LINEAR, D3DTEXF_POINT, 1}}, + {"trilinear", {D3DTEXF_LINEAR, D3DTEXF_LINEAR, 1}}, + {"af2x", {D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, 2}}, + {"af4x", {D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, 4}}, + {"af8x", {D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, 8}}, + {"af16x", {D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, 16}} + }) + { + } + } +} diff --git a/DDrawCompat/Config/Settings/TextureFilter.h b/DDrawCompat/Config/Settings/TextureFilter.h new file mode 100644 index 0000000..7556a2d --- /dev/null +++ b/DDrawCompat/Config/Settings/TextureFilter.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include + +namespace Config +{ + namespace Settings + { + class TextureFilter : public MappedSetting> + { + public: + TextureFilter(); + + UINT getFilter() const { return std::get<0>(m_value); } + UINT getMipFilter() const { return std::get<1>(m_value); } + UINT getMaxAnisotropy() const { return std::get<2>(m_value); } + }; + } +} diff --git a/DDrawCompat/D3dDdi/DeviceState.cpp b/DDrawCompat/D3dDdi/DeviceState.cpp index 4e37936..4c26775 100644 --- a/DDrawCompat/D3dDdi/DeviceState.cpp +++ b/DDrawCompat/D3dDdi/DeviceState.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -116,12 +117,21 @@ namespace D3dDdi m_textureStageState[i][D3DDDITSS_ADDRESSU] = D3DTADDRESS_WRAP; m_textureStageState[i][D3DDDITSS_ADDRESSV] = D3DTADDRESS_WRAP; m_textureStageState[i][D3DDDITSS_BORDERCOLOR] = 0; - m_textureStageState[i][D3DDDITSS_MAGFILTER] = D3DTEXF_POINT; - m_textureStageState[i][D3DDDITSS_MINFILTER] = D3DTEXF_POINT; - m_textureStageState[i][D3DDDITSS_MIPFILTER] = D3DTEXF_NONE; + if (D3DTEXF_NONE == Config::textureFilter.getFilter()) + { + m_textureStageState[i][D3DDDITSS_MAGFILTER] = D3DTEXF_POINT; + m_textureStageState[i][D3DDDITSS_MINFILTER] = D3DTEXF_POINT; + m_textureStageState[i][D3DDDITSS_MIPFILTER] = D3DTEXF_NONE; + } + else + { + m_textureStageState[i][D3DDDITSS_MAGFILTER] = Config::textureFilter.getFilter(); + m_textureStageState[i][D3DDDITSS_MINFILTER] = Config::textureFilter.getFilter(); + m_textureStageState[i][D3DDDITSS_MIPFILTER] = Config::textureFilter.getMipFilter(); + } m_textureStageState[i][D3DDDITSS_MIPMAPLODBIAS] = 0; m_textureStageState[i][D3DDDITSS_MAXMIPLEVEL] = 0; - m_textureStageState[i][D3DDDITSS_MAXANISOTROPY] = 1; + m_textureStageState[i][D3DDDITSS_MAXANISOTROPY] = Config::textureFilter.getMaxAnisotropy(); m_textureStageState[i][D3DDDITSS_TEXTURETRANSFORMFLAGS] = D3DTTFF_DISABLE; m_textureStageState[i][D3DDDITSS_SRGBTEXTURE] = FALSE; m_textureStageState[i][D3DDDITSS_ADDRESSW] = D3DTADDRESS_WRAP; @@ -280,9 +290,20 @@ namespace D3dDdi HRESULT DeviceState::pfnSetTextureStageState(const D3DDDIARG_TEXTURESTAGESTATE* data) { - if (D3DDDITSS_TEXTURECOLORKEYVAL == data->State) + switch (data->State) { + case D3DDDITSS_MINFILTER: + case D3DDDITSS_MAGFILTER: + case D3DDDITSS_MIPFILTER: + case D3DDDITSS_MAXANISOTROPY: + if (D3DTEXF_NONE != Config::textureFilter.getFilter()) + { + return S_OK; + } + break; + case D3DDDITSS_TEXTURECOLORKEYVAL: m_textureStageState[data->Stage][D3DDDITSS_DISABLETEXTURECOLORKEY] = FALSE; + break; } return setStateArray(data, m_textureStageState[data->Stage], m_device.getOrigVtable().pfnSetTextureStageState); } @@ -460,4 +481,59 @@ namespace D3dDdi } return result; } + + DeviceState::ScopedTexture::ScopedTexture(DeviceState& deviceState, UINT stage, HANDLE texture, UINT filter) + : m_deviceState(deviceState) + , m_stage(stage) + , m_prevTexture(deviceState.m_textures[stage]) + , m_scopedAddressU(deviceState, { stage, D3DDDITSS_ADDRESSU, D3DTADDRESS_CLAMP }) + , m_scopedAddressV(deviceState, { stage, D3DDDITSS_ADDRESSV, D3DTADDRESS_CLAMP }) + , m_scopedMagFilter(deviceState, { stage, D3DDDITSS_MAGFILTER, filter }) + , m_scopedMinFilter(deviceState, { stage, D3DDDITSS_MINFILTER, filter }) + , m_scopedMipFilter(deviceState, { stage, D3DDDITSS_MIPFILTER, D3DTEXF_NONE }) + , m_scopedSrgbTexture(deviceState, { stage, D3DDDITSS_SRGBTEXTURE, D3DTEXF_LINEAR == filter }) + , m_scopedWrap(deviceState, { static_cast(D3DDDIRS_WRAP0 + stage), 0 }) + , m_prevTextureColorKeyVal(deviceState.m_textureStageState[stage][D3DDDITSS_TEXTURECOLORKEYVAL]) + , m_prevDisableTextureColorKey(deviceState.m_textureStageState[stage][D3DDDITSS_DISABLETEXTURECOLORKEY]) + { + m_deviceState.pfnSetTexture(stage, texture); + + D3DDDIARG_TEXTURESTAGESTATE data = {}; + data.Stage = stage; + data.State = D3DDDITSS_DISABLETEXTURECOLORKEY; + data.Value = TRUE; + m_deviceState.m_device.getOrigVtable().pfnSetTextureStageState(m_deviceState.m_device, &data); + } + + DeviceState::ScopedTexture::~ScopedTexture() + { + m_deviceState.pfnSetTexture(m_stage, m_prevTexture); + + D3DDDIARG_TEXTURESTAGESTATE data = {}; + data.Stage = m_stage; + if (m_prevDisableTextureColorKey) + { + data.State = D3DDDITSS_DISABLETEXTURECOLORKEY; + data.Value = TRUE; + } + else + { + data.State = D3DDDITSS_TEXTURECOLORKEYVAL; + data.Value = m_prevTextureColorKeyVal; + } + m_deviceState.m_device.getOrigVtable().pfnSetTextureStageState(m_deviceState.m_device, &data); + } + + DeviceState::ScopedTextureStageState::ScopedTextureStageState( + DeviceState& deviceState, const D3DDDIARG_TEXTURESTAGESTATE& data) + : m_deviceState(deviceState) + , m_prevData{ data.Stage, data.State, deviceState.m_textureStageState[data.Stage][data.State] } + { + m_deviceState.m_device.getOrigVtable().pfnSetTextureStageState(m_deviceState.m_device, &data); + } + + DeviceState::ScopedTextureStageState::~ScopedTextureStageState() + { + m_deviceState.m_device.getOrigVtable().pfnSetTextureStageState(m_deviceState.m_device, &m_prevData); + } } diff --git a/DDrawCompat/D3dDdi/DeviceState.h b/DDrawCompat/D3dDdi/DeviceState.h index 47f77a4..a326c1d 100644 --- a/DDrawCompat/D3dDdi/DeviceState.h +++ b/DDrawCompat/D3dDdi/DeviceState.h @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include #include #include @@ -7,6 +10,7 @@ const UINT D3DTEXF_NONE = 0; const UINT D3DTEXF_POINT = 1; const UINT D3DTEXF_LINEAR = 2; +const UINT D3DTEXF_ANISOTROPIC = 3; namespace D3dDdi { @@ -247,17 +251,8 @@ namespace D3dDdi class ScopedTextureStageState { public: - ScopedTextureStageState(DeviceState& deviceState, const D3DDDIARG_TEXTURESTAGESTATE& data) - : m_deviceState(deviceState) - , m_prevData{ data.Stage, data.State, deviceState.m_textureStageState[data.Stage][data.State] } - { - m_deviceState.pfnSetTextureStageState(&data); - } - - ~ScopedTextureStageState() - { - m_deviceState.pfnSetTextureStageState(&m_prevData); - } + ScopedTextureStageState(DeviceState& deviceState, const D3DDDIARG_TEXTURESTAGESTATE& data); + ~ScopedTextureStageState(); private: DeviceState& m_deviceState; @@ -267,47 +262,8 @@ namespace D3dDdi class ScopedTexture { public: - ScopedTexture(DeviceState& deviceState, UINT stage, HANDLE texture, UINT filter) - : m_deviceState(deviceState) - , m_stage(stage) - , m_prevTexture(deviceState.m_textures[stage]) - , m_scopedAddressU(deviceState, { stage, D3DDDITSS_ADDRESSU, D3DTADDRESS_CLAMP }) - , m_scopedAddressV(deviceState, { stage, D3DDDITSS_ADDRESSV, D3DTADDRESS_CLAMP }) - , m_scopedMagFilter(deviceState, { stage, D3DDDITSS_MAGFILTER, filter }) - , m_scopedMinFilter(deviceState, { stage, D3DDDITSS_MINFILTER, filter }) - , m_scopedMipFilter(deviceState, { stage, D3DDDITSS_MIPFILTER, D3DTEXF_NONE }) - , m_scopedSrgbTexture(deviceState, { stage, D3DDDITSS_SRGBTEXTURE, D3DTEXF_LINEAR == filter }) - , m_scopedWrap(deviceState, { static_cast(D3DDDIRS_WRAP0 + stage), 0 }) - , m_prevTextureColorKeyVal(deviceState.m_textureStageState[stage][D3DDDITSS_TEXTURECOLORKEYVAL]) - , m_prevDisableTextureColorKey(deviceState.m_textureStageState[stage][D3DDDITSS_DISABLETEXTURECOLORKEY]) - { - m_deviceState.pfnSetTexture(stage, texture); - - D3DDDIARG_TEXTURESTAGESTATE data = {}; - data.Stage = stage; - data.State = D3DDDITSS_DISABLETEXTURECOLORKEY; - data.Value = TRUE; - m_deviceState.pfnSetTextureStageState(&data); - } - - ~ScopedTexture() - { - m_deviceState.pfnSetTexture(m_stage, m_prevTexture); - - D3DDDIARG_TEXTURESTAGESTATE data = {}; - data.Stage = m_stage; - if (m_prevDisableTextureColorKey) - { - data.State = D3DDDITSS_DISABLETEXTURECOLORKEY; - data.Value = TRUE; - } - else - { - data.State = D3DDDITSS_TEXTURECOLORKEYVAL; - data.Value = m_prevTextureColorKeyVal; - } - m_deviceState.pfnSetTextureStageState(&data); - } + ScopedTexture(DeviceState& deviceState, UINT stage, HANDLE texture, UINT filter); + ~ScopedTexture(); private: DeviceState& m_deviceState; diff --git a/DDrawCompat/DDrawCompat.vcxproj b/DDrawCompat/DDrawCompat.vcxproj index 750489e..fac6c29 100644 --- a/DDrawCompat/DDrawCompat.vcxproj +++ b/DDrawCompat/DDrawCompat.vcxproj @@ -219,6 +219,7 @@ + @@ -325,6 +326,7 @@ + diff --git a/DDrawCompat/DDrawCompat.vcxproj.filters b/DDrawCompat/DDrawCompat.vcxproj.filters index 9ddb155..071b84d 100644 --- a/DDrawCompat/DDrawCompat.vcxproj.filters +++ b/DDrawCompat/DDrawCompat.vcxproj.filters @@ -450,6 +450,9 @@ Header Files\Config\Settings + + Header Files\Config\Settings + @@ -707,6 +710,9 @@ Source Files\Config\Settings + + Source Files\Config\Settings +