diff --git a/VCS PC/Frontend.cpp b/VCS PC/Frontend.cpp index a936e5e..0364bed 100644 --- a/VCS PC/Frontend.cpp +++ b/VCS PC/Frontend.cpp @@ -239,7 +239,7 @@ MenuItem CMenuManager::ms_pMenus[] = { 26, "FED_WIS", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 42, "FED_FXQ", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, MENUACTION_TEXTURE_FILTERMODE, "FED_TXF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, - 43, "FED_MIP", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, + MENUACTION_EFFECTS_QUALITY, "FED_EFF", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 44, "FED_AAS", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 56, "FED_RES", ACTION_CLICKORARROWS, 27, 0, 0, 2, 0, 0, 5, "FET_DEF", ACTION_STANDARD, 50, 0, 141, 3, 0, 0, @@ -460,12 +460,14 @@ void CMenuManager::SaveSettings() // Graphics Setup const FxQuality_e nFxQuality = g_fx.GetFxQuality(); + const FxQuality_e nEffectsQuality = Fx_c::GetEffectsQuality(); const unsigned char nFilterQuality = Fx_c::GetTextureFilteringQuality(); const RwInt32 nSubSystem = RwEngineGetCurrentSubSystem(); - CFileMgr::Write(hFile, &m_bMipMapping, sizeof(m_bMipMapping)); + //CFileMgr::Write(hFile, &m_bMipMapping, sizeof(m_bMipMapping)); CFileMgr::Write(hFile, &m_dwAppliedAntiAliasingLevel, sizeof(m_dwAppliedAntiAliasingLevel)); CFileMgr::Write(hFile, &nFxQuality, sizeof(nFxQuality)); + CFileMgr::Write(hFile, &nEffectsQuality, sizeof(nEffectsQuality)); CFileMgr::Write(hFile, &nFilterQuality, sizeof(nFilterQuality)); CFileMgr::Write(hFile, &m_fDrawDistance, sizeof(m_fDrawDistance)); CFileMgr::Write(hFile, &m_bAspectRatioMode, sizeof(m_bAspectRatioMode)); @@ -529,12 +531,13 @@ void CMenuManager::LoadSettings() CFileMgr::Read(hFile, LangAcronym, 2); // Graphics Setup - FxQuality_e nFxQuality; + FxQuality_e nFxQuality, nEffectsQuality; unsigned char nFilterQuality; - CFileMgr::Read(hFile, &m_bMipMapping, sizeof(m_bMipMapping)); + //CFileMgr::Read(hFile, &m_bMipMapping, sizeof(m_bMipMapping)); CFileMgr::Read(hFile, &m_dwAntiAliasingLevel, sizeof(m_dwAppliedAntiAliasingLevel)); CFileMgr::Read(hFile, &nFxQuality, sizeof(nFxQuality)); + CFileMgr::Read(hFile, &nEffectsQuality, sizeof(nEffectsQuality)); CFileMgr::Read(hFile, &nFilterQuality, sizeof(nFilterQuality)); CFileMgr::Read(hFile, &m_fDrawDistance, sizeof(m_fDrawDistance)); CFileMgr::Read(hFile, &m_bAspectRatioMode, sizeof(m_bAspectRatioMode)); @@ -552,6 +555,7 @@ void CMenuManager::LoadSettings() m_nLanguage = CText::GetLanguageIndexByAcronym(LangAcronym); g_fx.SetFxQuality(nFxQuality); + Fx_c::SetEffectsQuality(nEffectsQuality); Fx_c::SetTextureFilteringQuality(nFilterQuality); AudioEngine.SetMusicMasterVolume(m_nRadioVolume); @@ -1465,11 +1469,12 @@ void CMenuManager::SetDefaultPreferences(signed char bScreen) // Graphics Setup m_bFrameLimiterMode = 2; m_bAspectRatioMode = 0; - m_bMipMapping = true; + //m_bMipMapping = true; m_dwAppliedAntiAliasingLevel = m_dwAntiAliasingLevel = 1; m_dwResolution = m_dwAppliedResolution; ms_lodDistScale = m_fDrawDistance = 1.2f; g_fx.SetFxQuality(FXQUALITY_HIGH); + Fx_c::SetEffectsQuality(FXQUALITY_HIGH); Fx_c::SetTextureFilteringQuality(1); // Trilinear // Reinit widescreen and framelimit stuff @@ -1745,6 +1750,71 @@ void __declspec(naked) TextureFiltering_RightColumn() } } +void __declspec(naked) EffectsQuality_RightColumn() +{ + static const char aFed_Fxl[] = "FED_FXL"; + static const char aFed_Fxm[] = "FED_FXM"; + static const char aFed_Fxh[] = "FED_FXH"; + _asm + { + mov ecx, [TheText] + mov eax, [Fx_c::m_bEffectsQuality] + test eax, eax + jz EffectsQuality_RightColumn_Low + dec eax + jz EffectsQuality_RightColumn_Medium + push offset aFed_Fxh + jmp EffectsQuality_RightColumn_Return + +EffectsQuality_RightColumn_Low: + push offset aFed_Fxl + jmp EffectsQuality_RightColumn_Return + +EffectsQuality_RightColumn_Medium: + push offset aFed_Fxm + +EffectsQuality_RightColumn_Return: + push 57A161h + retn + } +} + +void __declspec(naked) AntiAliasing_RightColumn() +{ + static const char aFed_Aa1[] = "FED_AA1"; + static const char aFed_Aa2[] = "FED_AA2"; + static const char aFed_Aa3[] = "FED_AA3"; + _asm + { + mov ecx, [TheText] + mov eax, [ebp].m_dwAntiAliasingLevel + cmp eax, 1 + jle AntiAliasing_RightColumn_Off + sub eax, 2 + jz AntiAliasing_RightColumn_2x + dec eax + jz AntiAliasing_RightColumn_4x + push offset aFed_Aa3 + jmp AntiAliasing_RightColumn_Return + +AntiAliasing_RightColumn_2x: + push offset aFed_Aa1 + jmp AntiAliasing_RightColumn_Return + +AntiAliasing_RightColumn_4x: + push offset aFed_Aa2 + jmp AntiAliasing_RightColumn_Return + +AntiAliasing_RightColumn_Return: + push 57A161h + retn + +AntiAliasing_RightColumn_Off: + push 579F65h + retn + } +} + static void __declspec(naked) UserInputArrowSoundMenus() { _asm @@ -1771,19 +1841,20 @@ static StaticPatcher Patcher([](){ 0x00, 0x01, 0x02, 0x1B, 0x1B, 0x1B, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x0A, 0x0B, 0x0C, 0x1B, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x1B, 0x1B, 0x1B, 0x14, 0x1B, 0x15, 0x16, 0x17, 0x1B, 0x1B, - 0x18, 0x19, 0x1A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1C, 0x1D, 0x1E }; + 0x18, 0x19, 0x1A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }; static const void* const StandardMenusRightColumn_Addresses[] = { (void*)0x579EF0, (void*)0x579DDE, (void*)0x579DE6, (void*)0x579DB9, (void*)0x579DB1, (void*)0x579DC1, (void*)0x579DD6, (void*)0x579E37, (void*)0x579E67, (void*)0x579DEE, (void*)0x579EAE, (void*)0x579EF8, - (void*)0x57A0D3, (void*)0x579F57, (void*)0x579F6F, + AntiAliasing_RightColumn, (void*)0x579F57, (void*)0x579F6F, (void*)0x579F77, (void*)0x579F7F, (void*)0x579F87, (void*)0x579F8F, (void*)0x579F97, (void*)0x57A05A, (void*)0x57A141, (void*)0x579FB0, (void*)0x57A005, (void*)0x579E7A, (void*)0x579F4F, (void*)0x579E6F, - (void*)0x57A168, AutoInstallUpdates_RightColumm, CheckEvery_RightColumn, TextureFiltering_RightColumn }; + (void*)0x57A168, AutoInstallUpdates_RightColumm, CheckEvery_RightColumn, + TextureFiltering_RightColumn, EffectsQuality_RightColumn }; Memory::Patch(0x579D9C, sizeof(StandardMenusRightColumn_Table)-1); Memory::Patch(0x579DA6, StandardMenusRightColumn_Table); diff --git a/VCS PC/Frontend.h b/VCS PC/Frontend.h index 935badc..7c644f2 100644 --- a/VCS PC/Frontend.h +++ b/VCS PC/Frontend.h @@ -79,6 +79,7 @@ enum eMenuActions MENUACTION_AUTOINSTALL_UPDATES, MENUACTION_CHECKING_PERIOD, MENUACTION_TEXTURE_FILTERMODE, + MENUACTION_EFFECTS_QUALITY, NUM_MENU_ACTIONS }; diff --git a/VCS PC/FxSystem.cpp b/VCS PC/FxSystem.cpp index 3b78f65..768232f 100644 --- a/VCS PC/FxSystem.cpp +++ b/VCS PC/FxSystem.cpp @@ -5,7 +5,8 @@ Fx_c& g_fx = *(Fx_c*)0xA9AE00; -unsigned char Fx_c::m_bTextureFiltering; +unsigned char Fx_c::m_bTextureFiltering; +FxQuality_e Fx_c::m_bEffectsQuality; WRAPPER void Fx_c::SetFxQuality(FxQuality_e eQuality) { WRAPARG(eQuality); EAXJMP(0x49EA40); } WRAPPER FxQuality_e Fx_c::GetFxQuality() { EAXJMP(0x49EA50); } @@ -44,4 +45,21 @@ unsigned char Fx_c::GetMaxTextureFilteringQuality() } } return bCachedMaxQuality; -} \ No newline at end of file +} + + +static StaticPatcher Patcher([](){ + Memory::InjectHook(0x4A964D, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4A9662, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4A9678, Fx_c::GetEffectsQuality); + + Memory::InjectHook(0x4A97A7, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4A97BC, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4A97D2, Fx_c::GetEffectsQuality); + + Memory::InjectHook(0x4AA475, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4AA48C, Fx_c::GetEffectsQuality); + + Memory::InjectHook(0x4AA56F, Fx_c::GetEffectsQuality); + Memory::InjectHook(0x4AA586, Fx_c::GetEffectsQuality); + }); \ No newline at end of file diff --git a/VCS PC/FxSystem.h b/VCS PC/FxSystem.h index b89b788..73c2474 100644 --- a/VCS PC/FxSystem.h +++ b/VCS PC/FxSystem.h @@ -14,6 +14,7 @@ class Fx_c private: // VCS PC class extension static unsigned char m_bTextureFiltering; + static FxQuality_e m_bEffectsQuality; public: void SetFxQuality(FxQuality_e eQuality); @@ -26,6 +27,12 @@ class Fx_c static unsigned char GetTextureFilteringQuality() { return m_bTextureFiltering; } + static void SetEffectsQuality(FxQuality_e nQuality) + { m_bEffectsQuality = nQuality; } + + static FxQuality_e GetEffectsQuality() + { return m_bEffectsQuality; } + static unsigned char GetMaxTextureFilteringQuality(); }; diff --git a/VCS PC/VCSPC.cpp b/VCS PC/VCSPC.cpp index aac53ac..4cea5ef 100644 --- a/VCS PC/VCSPC.cpp +++ b/VCS PC/VCSPC.cpp @@ -222,6 +222,7 @@ void ActivateSerialAction(); void AutoInstallUpdatesAction(); void CheckEveryAction(); void TextureFilteringAction(); +void EffectsQualityAction(); void VehAudioHook(); //void RotorsHook(); void Language6Action(); @@ -484,7 +485,7 @@ const BYTE PCMenuActionsTable[] = { 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 33, 33, - 30, 31, 32, 34, 35, 36, 37, 38, 39, 40 }; + 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41 }; const void* const PCMenuActionsAddresses[] = { (void*)0x57D397, (void*)0x57D2FA, (void*)0x57D322, @@ -500,7 +501,7 @@ const void* const PCMenuActionsAddresses[] = { (void*)0x57D21F, (void*)0x57CF1B, (void*)0x57CF3B, (void*)0x57D447, Language6Action, UpdaterMenuAction, DLCMenuAction, ActivateSerialAction, AutoInstallUpdatesAction, - CheckEveryAction, TextureFilteringAction }; + CheckEveryAction, TextureFilteringAction, EffectsQualityAction }; const int iRadioTracks[NUM_RADIOSTATIONS][31] = { { AA_OFFSET+1, AA_OFFSET+4, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922 }, @@ -7365,6 +7366,41 @@ void __declspec(naked) TextureFilteringAction() } } +void __declspec(naked) EffectsQualityAction() +{ + _asm + { + mov eax, [Fx_c::m_bEffectsQuality] + mov dl, [esp+0Ch+4] + cmp dl, 0 + jl EffectsQualityAction_Previous + inc eax + cmp eax, 2 + jna EffectsQualityAction_Return + xor eax, eax + jmp EffectsQualityAction_Return + +EffectsQualityAction_Previous: + test eax, eax + jz EffectsQualityAction_ToMax + dec eax + jmp EffectsQualityAction_Return + +EffectsQualityAction_ToMax: + mov eax, 2 + +EffectsQualityAction_Return: + mov [Fx_c::m_bEffectsQuality], eax + mov ecx, esi + call CMenuManager::SaveSettings + pop edi + pop esi + mov al, bl + pop ebx + retn 8 + } +} + void __declspec(naked) VehAudioHook() { _asm