Skip to content

Commit 09fc9af

Browse files
committed
feat(options): Implement game options for texture filter mode and anisotropy level (#2482)
1 parent 2077773 commit 09fc9af

11 files changed

Lines changed: 121 additions & 7 deletions

File tree

Core/GameEngine/Include/Common/OptionPreferences.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class OptionPreferences : public UserPreferences
5656
Bool loadFromIniFile();
5757

5858
UnsignedInt getAntiAliasing() const;
59+
UnsignedInt getTextureFilterMode() const;
60+
UnsignedInt getTextureAnisotropyLevel() const;
5961
UnsignedInt getLANIPAddress();
6062
UnsignedInt getOnlineIPAddress();
6163
void setLANIPAddress(AsciiString IP);

Core/GameEngine/Source/Common/OptionPreferences.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "PreRTS.h" // This must go first in EVERY cpp file in the GameEngine
3333

3434
#include "ww3d.h"
35+
#include "texturefilter.h"
3536

3637
#include "Common/AudioSettings.h"
3738
#include "Common/GameAudio.h"
@@ -81,6 +82,40 @@ UnsignedInt OptionPreferences::getAntiAliasing() const
8182
return level;
8283
}
8384

85+
UnsignedInt OptionPreferences::getTextureFilterMode() const
86+
{
87+
OptionPreferences::const_iterator it = find("TextureFilter");
88+
if (it == end())
89+
return TextureFilterClass::TEXTURE_FILTER_BILINEAR;
90+
91+
UnsignedInt filter = TextureFilterClass::TEXTURE_FILTER_NONE;
92+
if (stricmp(it->second.str(), TextureFilterClass::TextureFilterModeString[TextureFilterClass::TEXTURE_FILTER_NONE]) == 0)
93+
filter = TextureFilterClass::TEXTURE_FILTER_NONE;
94+
else if(stricmp(it->second.str(), TextureFilterClass::TextureFilterModeString[TextureFilterClass::TEXTURE_FILTER_NONE]) == 0)
95+
filter = TextureFilterClass::TEXTURE_FILTER_POINT;
96+
else if (stricmp(it->second.str(), TextureFilterClass::TextureFilterModeString[TextureFilterClass::TEXTURE_FILTER_BILINEAR]) == 0)
97+
filter = TextureFilterClass::TEXTURE_FILTER_BILINEAR;
98+
else if (stricmp(it->second.str(), TextureFilterClass::TextureFilterModeString[TextureFilterClass::TEXTURE_FILTER_TRILINEAR]) == 0)
99+
filter = TextureFilterClass::TEXTURE_FILTER_TRILINEAR;
100+
else if (stricmp(it->second.str(), TextureFilterClass::TextureFilterModeString[TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC]) == 0)
101+
filter = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC;
102+
103+
return filter;
104+
}
105+
106+
UnsignedInt OptionPreferences::getTextureAnisotropyLevel() const
107+
{
108+
OptionPreferences::const_iterator it = find("AnisotropyLevel");
109+
if (it == end())
110+
return TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X;
111+
112+
UnsignedInt level = atoi(it->second.str());
113+
level = clamp((UnsignedInt)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X, level, (UnsignedInt)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X);
114+
level = highestBit(level);
115+
116+
return level;
117+
}
118+
84119
Int OptionPreferences::getCampaignDifficulty()
85120
{
86121
OptionPreferences::const_iterator it = find("CampaignDifficulty");

Core/Libraries/Source/WWVegas/WW3D2/texturefilter.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040
#include "texturefilter.h"
4141
#include "dx8wrapper.h"
4242

43+
const char* const TextureFilterClass::TextureFilterModeString[5] = {
44+
"None",
45+
"Point",
46+
"Bilinear",
47+
"Trilinear",
48+
"Anisotropic"
49+
};
50+
4351
unsigned _MinTextureFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
4452
unsigned _MagTextureFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
4553
unsigned _MipMapFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
@@ -100,7 +108,7 @@ void TextureFilterClass::Apply(unsigned int stage)
100108
//! Init filters (legacy)
101109
/*!
102110
*/
103-
void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
111+
void TextureFilterClass::_Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level)
104112
{
105113
const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps();
106114

@@ -122,7 +130,7 @@ void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
122130
// TheSuperHackers @feature Mauller 08/03/2026 Add full support for all texture filtering modes;
123131
// None, Point, Bilinear, Trilinear, Anisotropic.
124132
BOOL FilterSupported = false;
125-
switch (filter_type) {
133+
switch (texture_filter) {
126134

127135
default:
128136
// TheSuperHackers @info if we have an invalid filter_type, set the filtering to none
@@ -201,8 +209,8 @@ void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
201209
_MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
202210
_MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
203211

204-
// Set the Anisotropic filtering level for all stages - 2X by default
205-
_Set_Max_Anisotropy(TEXTURE_FILTER_ANISOTROPIC_2X);
212+
// Set the Anisotropic filtering level for all stages
213+
_Set_Max_Anisotropy(anisotropy_level);
206214
}
207215
else {
208216
_MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_POINT;

Core/Libraries/Source/WWVegas/WW3D2/texturefilter.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class TextureFilterClass
9191
TEXTURE_FILTER_ANISOTROPIC
9292
};
9393

94+
static const char* const TextureFilterModeString[5];
95+
9496
enum AnisotropicFilterMode
9597
{
9698
TEXTURE_FILTER_ANISOTROPIC_2X = 2,
@@ -124,7 +126,7 @@ class TextureFilterClass
124126
void Set_V_Addr_Mode(TxtAddrMode mode) { VAddressMode=mode; }
125127

126128
// These need to be called after device has been created
127-
static void _Init_Filters(TextureFilterMode texture_filter);
129+
static void _Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level);
128130
static void _Set_Max_Anisotropy(AnisotropicFilterMode mode);
129131

130132
static void _Set_Default_Min_Filter(FilterType filter);

GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,9 @@ class GlobalData : public SubsystemInterface
397397
smaller area within the rectangle to order the gather. */
398398

399399
UnsignedInt m_antiAliasLevel; ///< value of selected antialias level in the game options
400+
UnsignedInt m_textureFilteringMode; ///< value related to TextureFilterClass::TextureFilterModeEnum
401+
UnsignedInt m_textureAnisotropyLevel; ///< value related to TextureFilterClass::AnisotropicFilterMode
402+
400403
Bool m_languageFilterPref; ///< Bool if user wants to filter language
401404
Bool m_loadScreenDemo; ///< Bool if true, run the loadscreen demo movie
402405
Bool m_disableRender; ///< if true, no rendering!

GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "PreRTS.h" // This must go first in EVERY cpp file in the GameEngine
3434

3535
#include "ww3d.h"
36+
#include "texturefilter.h"
3637

3738
#include "Common/GlobalData.h"
3839

@@ -933,6 +934,8 @@ GlobalData::GlobalData()
933934
m_standardPublicBones.clear();
934935

935936
m_antiAliasLevel = WW3D::MultiSampleModeEnum::MULTISAMPLE_MODE_NONE;
937+
m_textureFilteringMode = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
938+
m_textureAnisotropyLevel = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
936939

937940
// m_languageFilterPref = false;
938941
m_languageFilterPref = true;
@@ -1232,6 +1235,8 @@ void GlobalData::parseGameDataDefinition( INI* ini )
12321235
TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute();
12331236

12341237
TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing();
1238+
TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode();
1239+
TheWritableGlobalData->m_textureAnisotropyLevel = optionPref.getTextureAnisotropyLevel();
12351240

12361241
Int val=optionPref.getGammaValue();
12371242
//generate a value between 0.6 and 2.0.

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
#include "GameClient/MessageBox.h"
7676

7777
#include "ww3d.h"
78+
#include "texturefilter.h"
7879

7980
// This is for non-RC builds only!!!
8081
#define VERBOSE_VERSION L"Release"
@@ -566,6 +567,31 @@ static void saveOptions()
566567
(*pref)["AntiAliasing"] = prefString;
567568
}
568569

570+
//-------------------------------------------------------------------------------------------------
571+
// texture filter mode
572+
val = pref->getTextureFilterMode();
573+
if (val >= 0 && TheGlobalData)
574+
{
575+
clamp((int)TextureFilterClass::TEXTURE_FILTER_NONE, val, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC);
576+
577+
TheWritableGlobalData->m_textureFilteringMode = val;
578+
AsciiString prefString;
579+
prefString = TextureFilterClass::TextureFilterModeString[val];
580+
(*pref)["TextureFilter"] = prefString;
581+
}
582+
583+
//-------------------------------------------------------------------------------------------------
584+
// anisotropy level
585+
val = pref->getTextureAnisotropyLevel();
586+
if (val >= 0 && TheGlobalData)
587+
{
588+
clamp((int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X, val, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X);
589+
590+
TheWritableGlobalData->m_textureAnisotropyLevel = val;
591+
AsciiString prefString;
592+
prefString.format("%d", val);
593+
(*pref)["AnisotropyLevel"] = prefString;
594+
}
569595

570596
//-------------------------------------------------------------------------------------------------
571597
// mouse mode

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,12 @@ void W3DDisplay::init()
773773
true );
774774

775775
// TheSuperHackers @info Update the MSAA mode that was set as some GPU's may not support certain levels
776+
// Texture filtering must be also be updated after render device initialisation
776777
TheWritableGlobalData->m_antiAliasLevel = (UnsignedInt)WW3D::Get_MSAA_Mode();
778+
WW3D::Set_Texture_Filter(TheWritableGlobalData->m_textureFilteringMode);
779+
TheWritableGlobalData->m_textureFilteringMode = WW3D::Get_Texture_Filter();
780+
WW3D::Set_Anisotropy_level(TheWritableGlobalData->m_textureAnisotropyLevel);
781+
TheWritableGlobalData->m_textureAnisotropyLevel = WW3D::Get_Anisotropy_level();
777782

778783
++attempt;
779784
}

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,10 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Inits()
411411
** Initialize any other subsystems inside of WW3D
412412
*/
413413
MissingTexture::_Init();
414-
TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter());
414+
TextureFilterClass::_Init_Filters(
415+
(TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter(),
416+
(TextureFilterClass::AnisotropicFilterMode)WW3D::Get_Anisotropy_level()
417+
);
415418
TheDX8MeshRenderer.Init();
416419
SHD_INIT;
417420
BoxRenderObjClass::Init();

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/ww3d.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ int WW3D::LastFrameMemoryAllocations;
223223
int WW3D::LastFrameMemoryFrees;
224224

225225
int WW3D::TextureFilter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
226+
int WW3D::AnisotropyLevel = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
226227

227228
bool WW3D::Lite = false;
228229

@@ -768,9 +769,29 @@ void WW3D::Set_Texture_Filter(int texture_filter)
768769
if (texture_filter<0) texture_filter=0;
769770
if (texture_filter>TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC) texture_filter=TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC;
770771
TextureFilter=texture_filter;
771-
TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)TextureFilter);
772+
TextureFilterClass::_Init_Filters(
773+
(TextureFilterClass::TextureFilterMode)TextureFilter,
774+
(TextureFilterClass::AnisotropicFilterMode)AnisotropyLevel
775+
);
772776
}
773777

778+
void WW3D::Set_Anisotropy_level(int level)
779+
{
780+
if (level <= TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X)
781+
level = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X;
782+
else if(level <= TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_4X)
783+
level = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_4X;
784+
else if (level <= TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_8X)
785+
level = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_8X;
786+
else if (level <= TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X)
787+
level = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X;
788+
789+
if (level > TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X)
790+
level = TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X;
791+
792+
AnisotropyLevel = level;
793+
TextureFilterClass::_Set_Max_Anisotropy((TextureFilterClass::AnisotropicFilterMode)AnisotropyLevel);
794+
}
774795

775796
/***********************************************************************************************
776797
* WW3D::Begin_Render -- mark the start of rendering for a new frame *

0 commit comments

Comments
 (0)