Skip to content

Commit dc43b31

Browse files
Maullerxezon
authored andcommitted
feat(options): Implement game options for texture filter mode and anisotropy level (#2482)
1 parent 8619fa8 commit dc43b31

17 files changed

Lines changed: 175 additions & 15 deletions

File tree

Core/GameEngine/Include/Common/OptionPreferences.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#pragma once
3232

3333
#include "ww3d.h"
34+
#include "texturefilter.h"
35+
3436
#include "Common/UserPreferences.h"
3537

3638
typedef UnsignedInt CursorCaptureMode;
@@ -57,6 +59,8 @@ class OptionPreferences : public UserPreferences
5759
Bool loadFromIniFile();
5860

5961
WW3D::MultiSampleModeEnum getAntiAliasing() const;
62+
TextureFilterClass::TextureFilterMode getTextureFilterMode() const;
63+
TextureFilterClass::AnisotropicFilterMode getTextureAnisotropyLevel() const;
6064
UnsignedInt getLANIPAddress();
6165
UnsignedInt getOnlineIPAddress();
6266
void setLANIPAddress(AsciiString IP);

Core/GameEngine/Source/Common/OptionPreferences.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ WW3D::MultiSampleModeEnum OptionPreferences::getAntiAliasing() const
7979
return level;
8080
}
8181

82+
TextureFilterClass::TextureFilterMode OptionPreferences::getTextureFilterMode() const
83+
{
84+
OptionPreferences::const_iterator it = find("TextureFilter");
85+
if (it == end())
86+
return TextureFilterClass::TEXTURE_FILTER_BILINEAR;
87+
88+
return TextureFilterClass::getTextureFilterMode(it->second.str());
89+
}
90+
91+
TextureFilterClass::AnisotropicFilterMode OptionPreferences::getTextureAnisotropyLevel() const
92+
{
93+
OptionPreferences::const_iterator it = find("AnisotropyLevel");
94+
if (it == end())
95+
return TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X;
96+
97+
TextureFilterClass::AnisotropicFilterMode level = (TextureFilterClass::AnisotropicFilterMode)atoi(it->second.str());
98+
level = clamp(TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X, level, TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X);
99+
level = highestBit(level);
100+
101+
return level;
102+
}
103+
82104
Int OptionPreferences::getCampaignDifficulty()
83105
{
84106
OptionPreferences::const_iterator it = find("CampaignDifficulty");

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,10 @@ void DX8Wrapper::Do_Onetime_Device_Dependent_Inits()
377377
** Initialize any other subsystems inside of WW3D
378378
*/
379379
MissingTexture::_Init();
380-
TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter());
380+
TextureFilterClass::_Init_Filters(
381+
(TextureFilterClass::TextureFilterMode)WW3D::Get_Texture_Filter(),
382+
(TextureFilterClass::AnisotropicFilterMode)WW3D::Get_Anisotropy_Level()
383+
);
381384
TheDX8MeshRenderer.Init();
382385
SHD_INIT;
383386
BoxRenderObjClass::Init();

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

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

43+
const char* const TextureFilterClass::TextureFilterModeString[TEXTURE_FILTER_COUNT] = {
44+
"None",
45+
"Point",
46+
"Bilinear",
47+
"Trilinear",
48+
"Anisotropic"
49+
};
50+
51+
TextureFilterClass::TextureFilterMode TextureFilterClass::getTextureFilterMode(const char* str) {
52+
for (int i = 0; i < TextureFilterClass::TEXTURE_FILTER_COUNT; ++i) {
53+
if (stricmp(str, TextureFilterClass::TextureFilterModeString[i]) == 0) {
54+
return (TextureFilterClass::TextureFilterMode)i;
55+
}
56+
}
57+
58+
return TextureFilterClass::TEXTURE_FILTER_NONE;
59+
}
60+
4361
unsigned _MinTextureFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
4462
unsigned _MagTextureFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
4563
unsigned _MipMapFilters[MAX_TEXTURE_STAGES][TextureFilterClass::FILTER_TYPE_COUNT];
@@ -100,7 +118,7 @@ void TextureFilterClass::Apply(unsigned int stage)
100118
//! Init filters (legacy)
101119
/*!
102120
*/
103-
void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
121+
void TextureFilterClass::_Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level)
104122
{
105123
const D3DCAPS8& dx8caps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps();
106124

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

127145
default:
128146
// TheSuperHackers @info if we have an invalid filter_type, set the filtering to none
@@ -201,8 +219,8 @@ void TextureFilterClass::_Init_Filters(TextureFilterMode filter_type)
201219
_MinTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
202220
_MagTextureFilters[0][FILTER_TYPE_BEST]=D3DTEXF_ANISOTROPIC;
203221

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

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,14 @@ class TextureFilterClass
8888
TEXTURE_FILTER_POINT,
8989
TEXTURE_FILTER_BILINEAR,
9090
TEXTURE_FILTER_TRILINEAR,
91-
TEXTURE_FILTER_ANISOTROPIC
91+
TEXTURE_FILTER_ANISOTROPIC,
92+
TEXTURE_FILTER_COUNT
9293
};
9394

95+
static const char* const TextureFilterModeString[TEXTURE_FILTER_COUNT];
96+
97+
static TextureFilterMode getTextureFilterMode(const char* str);
98+
9499
enum AnisotropicFilterMode
95100
{
96101
TEXTURE_FILTER_ANISOTROPIC_2X = 2,
@@ -124,7 +129,7 @@ class TextureFilterClass
124129
void Set_V_Addr_Mode(TxtAddrMode mode) { VAddressMode=mode; }
125130

126131
// These need to be called after device has been created
127-
static void _Init_Filters(TextureFilterMode texture_filter);
132+
static void _Init_Filters(TextureFilterMode texture_filter, AnisotropicFilterMode anisotropy_level);
128133
static void _Set_Max_Anisotropy(AnisotropicFilterMode mode);
129134

130135
static void _Set_Default_Min_Filter(FilterType filter);

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

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

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

Generals/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

@@ -930,6 +931,8 @@ GlobalData::GlobalData()
930931
m_standardPublicBones.clear();
931932

932933
m_antiAliasLevel = WW3D::MultiSampleModeEnum::MULTISAMPLE_MODE_NONE;
934+
m_textureFilteringMode = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
935+
m_textureAnisotropyLevel = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
933936

934937
// m_languageFilterPref = false;
935938
m_languageFilterPref = true;
@@ -1207,6 +1210,8 @@ void GlobalData::parseGameDataDefinition( INI* ini )
12071210
TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute();
12081211

12091212
TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing();
1213+
TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode();
1214+
TheWritableGlobalData->m_textureAnisotropyLevel = optionPref.getTextureAnisotropyLevel();
12101215

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

Generals/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"
@@ -547,6 +548,31 @@ static void saveOptions()
547548
(*pref)["AntiAliasing"] = prefString;
548549
}
549550

551+
//-------------------------------------------------------------------------------------------------
552+
// texture filter mode
553+
val = pref->getTextureFilterMode();
554+
if (val >= 0)
555+
{
556+
val = clamp((int)TextureFilterClass::TEXTURE_FILTER_NONE, val, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC);
557+
558+
TheWritableGlobalData->m_textureFilteringMode = val;
559+
AsciiString prefString;
560+
prefString = TextureFilterClass::TextureFilterModeString[val];
561+
(*pref)["TextureFilter"] = prefString;
562+
}
563+
564+
//-------------------------------------------------------------------------------------------------
565+
// anisotropy level
566+
val = pref->getTextureAnisotropyLevel();
567+
if (val >= 0)
568+
{
569+
val = clamp((int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X, val, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X);
570+
571+
TheWritableGlobalData->m_textureAnisotropyLevel = val;
572+
AsciiString prefString;
573+
prefString.format("%d", val);
574+
(*pref)["AnisotropyLevel"] = prefString;
575+
}
550576

551577
//-------------------------------------------------------------------------------------------------
552578
// mouse mode

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,8 +832,13 @@ void W3DDisplay::init()
832832
true );
833833

834834
// TheSuperHackers @info Update the MSAA mode that was set as some GPU's may not support certain levels
835+
// Texture filtering must also be updated after render device initialization
835836
if (renderDeviceError == WW3D_ERROR_OK) {
836837
TheWritableGlobalData->m_antiAliasLevel = (UnsignedInt)WW3D::Get_MSAA_Mode();
838+
WW3D::Set_Texture_Filter(TheWritableGlobalData->m_textureFilteringMode);
839+
TheWritableGlobalData->m_textureFilteringMode = WW3D::Get_Texture_Filter();
840+
WW3D::Set_Anisotropy_Level(TheWritableGlobalData->m_textureAnisotropyLevel);
841+
TheWritableGlobalData->m_textureAnisotropyLevel = WW3D::Get_Anisotropy_Level();
837842
}
838843

839844
++attempt;

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
#include "animatedsoundmgr.h"
119119
#include "static_sort_list.h"
120120
#include "framgrab.h"
121+
#include "Lib/BaseType.h"
121122

122123

123124
const char* DAZZLE_INI_FILENAME="DAZZLE.INI";
@@ -222,6 +223,7 @@ int WW3D::LastFrameMemoryAllocations;
222223
int WW3D::LastFrameMemoryFrees;
223224

224225
int WW3D::TextureFilter = TextureFilterClass::TextureFilterMode::TEXTURE_FILTER_BILINEAR;
226+
int WW3D::AnisotropyLevel = TextureFilterClass::AnisotropicFilterMode::TEXTURE_FILTER_ANISOTROPIC_2X;
225227

226228
bool WW3D::Lite = false;
227229

@@ -766,12 +768,21 @@ void WW3D::_Invalidate_Textures()
766768

767769
void WW3D::Set_Texture_Filter(int texture_filter)
768770
{
769-
if (texture_filter<0) texture_filter=0;
770-
if (texture_filter>TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC) texture_filter=TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC;
771-
TextureFilter=texture_filter;
772-
TextureFilterClass::_Init_Filters((TextureFilterClass::TextureFilterMode)TextureFilter);
771+
TextureFilter = clamp((int)TextureFilterClass::TEXTURE_FILTER_NONE, texture_filter, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC);
772+
TextureFilterClass::_Init_Filters(
773+
(TextureFilterClass::TextureFilterMode)TextureFilter,
774+
(TextureFilterClass::AnisotropicFilterMode)AnisotropyLevel
775+
);
773776
}
774777

778+
void WW3D::Set_Anisotropy_Level(int level)
779+
{
780+
level = clamp((int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_2X, level, (int)TextureFilterClass::TEXTURE_FILTER_ANISOTROPIC_16X);
781+
level = highestBit(level);
782+
783+
AnisotropyLevel = level;
784+
TextureFilterClass::_Set_Max_Anisotropy((TextureFilterClass::AnisotropicFilterMode)AnisotropyLevel);
785+
}
775786

776787
/***********************************************************************************************
777788
* WW3D::Begin_Render -- mark the start of rendering for a new frame *

0 commit comments

Comments
 (0)