diff --git a/Core/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp b/Core/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp index 7fb9b85a24e..806f51bedc9 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp @@ -104,86 +104,148 @@ void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type) { const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps(); -#ifndef _XBOX - _MinTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_POINT; - _MagTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_POINT; - _MipMapFilters[0][FILTER_TYPE_NONE]=D3DTEXF_NONE; - - _MinTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_LINEAR; - _MagTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_LINEAR; - _MipMapFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; - - _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; - _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; - _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; -#else - _MinTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_ANISOTROPIC; - _MagTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_ANISOTROPIC; - _MipMapFilters[0][FILTER_TYPE_NONE]=D3DTEXF_LINEAR; - - _MinTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_ANISOTROPIC; - _MagTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_ANISOTROPIC; - _MipMapFilters[0][FILTER_TYPE_FAST]=D3DTEXF_LINEAR; + // TheSuperHackers @info Init zero stage filter defaults, point filtering is the lowest type for non mip filtering + _MinTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_NONE]=D3DTEXF_POINT; + _MipMapFilters[0][FILTER_TYPE_NONE]=D3DTEXF_NONE; - _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; + // Bilinear + _MinTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_LINEAR; + _MagTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_LINEAR; + _MipMapFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + + // Anisotropic - MipMap interlayer filtering only goes up to linear _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; -#endif -#ifndef _XBOX - if (dx8caps.TextureFilterCaps&D3DPTFILTERCAPS_MAGFLINEAR) _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; - if (dx8caps.TextureFilterCaps&D3DPTFILTERCAPS_MINFLINEAR) _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + // TheSuperHackers @feature Mauller 08/03/2026 Add full support for all texture filtering modes; + // None, Point, Bilinear, Trilinear, Anisotropic. + BOOL FilterSupported = false; + switch (filter_type) { - // Set anisotropic filtering only if requested and available - if (filter_type==TEXTURE_FILTER_ANISOTROPIC) { - if (dx8caps.TextureFilterCaps&D3DPTFILTERCAPS_MAGFANISOTROPIC) _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; - if (dx8caps.TextureFilterCaps&D3DPTFILTERCAPS_MINFANISOTROPIC) _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; - } + default: + // TheSuperHackers @info if we have an invalid filter_type, set the filtering to none + DEBUG_CRASH(("Invalid filter type passed into TextureFilterClass::_Init_Filters()")); + FALLTHROUGH; + + case TEXTURE_FILTER_NONE: + + _MinTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + _MipMapFilters[0][FILTER_TYPE_FAST]=D3DTEXF_NONE; + + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_NONE; + break; + + case TEXTURE_FILTER_POINT: + + _MinTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + _MipMapFilters[0][FILTER_TYPE_FAST]=D3DTEXF_POINT; + + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + break; + + case TEXTURE_FILTER_BILINEAR: + + FilterSupported = (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) && + (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR); + + if (FilterSupported) { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + } + else { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + } + + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + break; + + case TEXTURE_FILTER_TRILINEAR: + + FilterSupported = (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) && + (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR); + + if (FilterSupported) { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + } + else { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + } + + if (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MIPFLINEAR) { + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + } + else { + // TheSuperHackers @info if only linear mipmap filtering is unsupported, + // Trilinear filtering becomes Bilinear filtering by default + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + } + break; + + case TEXTURE_FILTER_ANISOTROPIC: + + FilterSupported = (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && + (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC); + + if (FilterSupported) { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC; + + // Set the Anisotropic filtering level for all stages - 2X by default + _Set_Max_Anisotropy(TEXTURE_FILTER_ANISOTROPIC_2X); + } + else { + _MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + _MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + } + + if (dx8caps.TextureFilterCaps & D3DPTFILTERCAPS_MIPFLINEAR) { + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; + } + else { + _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT; + } + break; - // Set linear mip filter only if requested trilinear or anisotropic, and linear available - if (filter_type==TEXTURE_FILTER_ANISOTROPIC || filter_type==TEXTURE_FILTER_TRILINEAR) { - if (dx8caps.TextureFilterCaps&D3DPTFILTERCAPS_MIPFLINEAR) _MipMapFilters[0][FILTER_TYPE_BEST]=D3DTEXF_LINEAR; } -#endif - // For stages above zero, set best filter to the same as the stage zero, except if anisotropic + + // For stages above zero, set best filter to the same as the stage zero int i=1; for (;i