Skip to content

Commit 120d3db

Browse files
committed
feat(options): Implement game options for texture filter mode and anisotropy level (#)
1 parent 394459d commit 120d3db

11 files changed

Lines changed: 132 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
@@ -47,6 +47,8 @@ class OptionPreferences : public UserPreferences
4747
Bool loadFromIniFile();
4848

4949
UnsignedInt getAntiAliasing();
50+
UnsignedInt getTextureFilterMode();
51+
UnsignedInt getTextureAnisotropyLevel();
5052
UnsignedInt getLANIPAddress();
5153
UnsignedInt getOnlineIPAddress();
5254
void setLANIPAddress(AsciiString IP);

Core/GameEngine/Source/Common/OptionPreferences.cpp

Lines changed: 44 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"
@@ -90,6 +91,49 @@ UnsignedInt OptionPreferences::getAntiAliasing()
9091
return level;
9192
}
9293

94+
UnsignedInt OptionPreferences::getTextureFilterMode()
95+
{
96+
OptionPreferences::const_iterator it = find("TextureFilter");
97+
if (it == end())
98+
return TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
99+
100+
UnsignedInt filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_NONE;
101+
if(stricmp(it->second.str(), "None") == 0)
102+
filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_NONE;
103+
else if(stricmp(it->second.str(), "Point") == 0)
104+
filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_POINT;
105+
else if (stricmp(it->second.str(), "Bilinear") == 0)
106+
filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
107+
else if (stricmp(it->second.str(), "Trilinear") == 0)
108+
filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_TRILINEAR;
109+
else if (stricmp(it->second.str(), "Anisotropic") == 0)
110+
filter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_ANISOTROPIC;
111+
112+
return filter;
113+
}
114+
115+
UnsignedInt OptionPreferences::getTextureAnisotropyLevel()
116+
{
117+
OptionPreferences::const_iterator it = find("AnisotropyLevel");
118+
if (it == end())
119+
return TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
120+
121+
UnsignedInt level = atoi(it->second.str());
122+
if (level <= TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X)
123+
level = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
124+
else if (level <= TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_4X)
125+
level = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_4X;
126+
else if (level <= TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_8X)
127+
level = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_8X;
128+
else if (level <= TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_16X)
129+
level = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_16X;
130+
131+
if (level > TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_16X)
132+
level = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_16X;
133+
134+
return level;
135+
}
136+
93137
Int OptionPreferences::getCampaignDifficulty()
94138
{
95139
OptionPreferences::const_iterator it = find("CampaignDifficulty");

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void TextureFilterClass::Apply(unsigned int stage)
100100
//! Init filters (legacy)
101101
/*!
102102
*/
103-
void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
103+
void TextureFilterClass::_Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level)
104104
{
105105
const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps();
106106

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

127127
default:
128128
// TheSuperHackers @info if we have an invalid filter_type, set the filtering to none
@@ -201,8 +201,8 @@ void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
201201
_MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
202202
_MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
203203

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class TextureFilterClass
124124
void Set_V_Addr_Mode(TxtAddrMode mode) { VAddressMode=mode; }
125125

126126
// These need to be called after device has been created
127-
static void _Init_Filters(TextureFilterMode texture_filter);
127+
static void _Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level);
128128
static void _Set_Max_Anisotropy(AnisotropicFilterMode mode);
129129

130130
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: 41 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"
@@ -588,6 +589,46 @@ static void saveOptions()
588589
(*pref)["AntiAliasing"] = prefString;
589590
}
590591

592+
//-------------------------------------------------------------------------------------------------
593+
// texture filter mode
594+
val = pref->getTextureFilterMode();
595+
; if (val >= 0 && TheGlobalData)
596+
{
597+
TheWritableGlobalData->m_textureFilteringMode = val;
598+
599+
AsciiString prefString;
600+
601+
switch (val) {
602+
case TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_NONE:
603+
prefString = "None";
604+
break;
605+
case TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_POINT:
606+
prefString = "Point";
607+
break;
608+
case TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR:
609+
prefString = "Bilinear";
610+
break;
611+
case TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_TRILINEAR:
612+
prefString = "Trilinear";
613+
break;
614+
case TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_ANISOTROPIC:
615+
prefString = "Anisotropic";
616+
break;
617+
}
618+
619+
(*pref)["TextureFilter"] = prefString;
620+
}
621+
622+
//-------------------------------------------------------------------------------------------------
623+
// anisotropy level
624+
val = pref->getTextureAnisotropyLevel();
625+
if (val >= 0 && TheGlobalData)
626+
{
627+
TheWritableGlobalData->m_textureAnisotropyLevel = val;
628+
AsciiString prefString;
629+
prefString.format("%d", val);
630+
(*pref)["AnisotropyLevel"] = prefString;
631+
}
591632

592633
//-------------------------------------------------------------------------------------------------
593634
// 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: 19 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,26 @@ 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+
AnisotropyLevel = level;
790+
TextureFilterClass::_Set_Max_Anisotropy((TextureFilterClass::AnisotropicFilterMode)AnisotropyLevel);
791+
}
774792

775793
/***********************************************************************************************
776794
* WW3D::Begin_Render -- mark the start of rendering for a new frame *

0 commit comments

Comments
 (0)