From 97b288c1e44902d7bcae575c0c6629296735fdc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?eray=20or=C3=A7unus?= Date: Fri, 1 May 2020 21:08:39 +0300 Subject: [PATCH] Screen mode selector and persistent map target fix --- src/core/Frontend.cpp | 40 +++++++++++++++++++++++++ src/core/Frontend.h | 4 +++ src/core/MenuScreens.h | 3 ++ src/core/Radar.cpp | 7 +++++ src/skel/glfw/glfw.cpp | 55 ++++++++++++++++++---------------- src/skel/win/win.cpp | 68 ++++++++++++++++++++++++------------------ 6 files changed, 122 insertions(+), 55 deletions(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 97cb21fd..e078fe22 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -394,6 +394,9 @@ CMenuManager::ThingsToDoBeforeLeavingPage() #endif } else if (m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { m_nDisplayVideoMode = m_nPrefsVideoMode; +#ifdef IMPROVED_VIDEOMODE + m_nSelectedScreenMode = m_nPrefsWindowed; +#endif } if (m_nCurrScreen == MENUPAGE_SKIN_SELECT) { @@ -1078,6 +1081,18 @@ CMenuManager::Draw() AsciiToUnicode(_psGetVideoModeList()[m_nDisplayVideoMode], unicodeTemp); rightText = unicodeTemp; break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENMODE: + char mode[32]; + if (m_nSelectedScreenMode == 0) + sprintf(mode, "FULLSCREEN"); + else + sprintf(mode, "WINDOWED"); + + AsciiToUnicode(mode, unicodeTemp); + rightText = unicodeTemp; + break; +#endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex == -1) rightText = TheText.Get("FEA_NAH"); @@ -1249,6 +1264,14 @@ CMenuManager::Draw() SetHelperText(3); } } +#ifdef IMPROVED_VIDEOMODE + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "SCRFOR") != 0 + && m_nCurrScreen == MENUPAGE_GRAPHICS_SETTINGS) { + m_nSelectedScreenMode = m_nPrefsWindowed; + } + } +#endif // Sliders int lastActiveBarX; @@ -3060,6 +3083,7 @@ CMenuManager::LoadSettings() m_nPrefsWindowed = 0; m_nPrefsSubsystem = 0; } + m_nSelectedScreenMode = m_nPrefsWindowed; #else CFileMgr::Read(fileHandle, gString, 20); #endif @@ -4489,6 +4513,16 @@ CMenuManager::ProcessButtonPresses(void) SaveSettings(); } break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENMODE: + if (m_nSelectedScreenMode != m_nPrefsWindowed) { + m_nPrefsWindowed = m_nSelectedScreenMode; + _psSelectScreenVM(m_nPrefsVideoMode); // apply same resolution + SetHelperText(0); + SaveSettings(); + } + break; +#endif case MENUACTION_AUDIOHW: { int selectedProvider = m_nPrefsAudio3DProviderIndex; @@ -4762,6 +4796,12 @@ CMenuManager::ProcessButtonPresses(void) } } break; +#ifdef IMPROVED_VIDEOMODE + case MENUACTION_SCREENMODE: + DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_DENIED, 0); + m_nSelectedScreenMode = !m_nSelectedScreenMode; + break; +#endif case MENUACTION_AUDIOHW: if (m_nPrefsAudio3DProviderIndex != -1) { m_nPrefsAudio3DProviderIndex += changeValueBy; diff --git a/src/core/Frontend.h b/src/core/Frontend.h index fc2c5235..3286f275 100644 --- a/src/core/Frontend.h +++ b/src/core/Frontend.h @@ -371,6 +371,9 @@ enum eMenuAction MENUACTION_LANG_RUS, MENUACTION_LANG_JAP, #endif +#ifdef IMPROVED_VIDEOMODE + MENUACTION_SCREENMODE +#endif }; enum eCheckHover @@ -539,6 +542,7 @@ public: int32 m_nPrefsDepth; int32 m_nPrefsWindowed; int32 m_nPrefsSubsystem; + int32 m_nSelectedScreenMode; #endif public: diff --git a/src/core/MenuScreens.h b/src/core/MenuScreens.h index 3c22283d..339479b8 100644 --- a/src/core/MenuScreens.h +++ b/src/core/MenuScreens.h @@ -62,6 +62,9 @@ const CMenuScreen aScreens[] = { MENUACTION_SUBTITLES, "FED_SUB", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, MENUACTION_WIDESCREEN, "FED_WIS", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, MENUACTION_SCREENRES, "FED_RES", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, +#ifdef IMPROVED_VIDEOMODE + MENUACTION_SCREENMODE, "SCRFOR", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, +#endif MENUACTION_RESTOREDEF, "FET_DEF", SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS, MENUACTION_CHANGEMENU, "FEDS_TB", SAVESLOT_NONE, MENUPAGE_NONE, }, diff --git a/src/core/Radar.cpp b/src/core/Radar.cpp index 2b3e6f1e..3d1429bd 100644 --- a/src/core/Radar.cpp +++ b/src/core/Radar.cpp @@ -1064,6 +1064,13 @@ void CRadar::SaveAllRadarBlips(uint8 *buf, uint32 *size) INITSAVEBUF WriteSaveHeader(buf, 'R', 'D', 'R', '\0', *size - SAVE_HEADER_SIZE); +#ifdef MENU_MAP + if (TargetMarkerId != -1) { + ClearBlip(TargetMarkerId); + TargetMarkerId = -1; + } +#endif + for (int i = 0; i < NUMRADARBLIPS; i++) WriteSaveBuf(buf, ms_RadarTrace[i]); diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 2813c823..13b41fcb 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -49,7 +49,13 @@ static RwInt32 GcurSel = 0, GcurSelVM = 0; static RwBool useDefault; +// What is that for anyway? +#ifndef IMPROVED_VIDEOMODE static RwBool defaultFullscreenRes = TRUE; +#else +static RwBool defaultFullscreenRes = FALSE; +static RwInt32 bestWndMode = -1; +#endif static psGlobalType PsGlobal; @@ -421,11 +427,7 @@ RwChar **_psGetVideoModeList() _VMList[i] = nil; } else -#ifdef IMPROVED_VIDEOMODE - _VMList[i] = strdup("WINDOW"); -#else _VMList[i] = nil; -#endif } return _VMList; @@ -440,7 +442,7 @@ void _psSelectScreenVM(RwInt32 videoMode) FrontEndMenuManager.UnloadTextures(); - if ( !_psSetVideoMode(RwEngineGetCurrentSubSystem(), videoMode) ) + if (!_psSetVideoMode(RwEngineGetCurrentSubSystem(), videoMode)) { RsGlobal.quit = TRUE; } @@ -607,18 +609,16 @@ psSelectDevice() } // Find the videomode that best fits what we got from the settings file - RwInt32 bestMode = -1; + RwInt32 bestFsMode = -1; RwInt32 bestWidth = -1; RwInt32 bestHeight = -1; RwInt32 bestDepth = -1; for(GcurSelVM = 0; GcurSelVM < RwEngineGetNumVideoModes(); GcurSelVM++){ RwEngineGetVideoModeInfo(&vm, GcurSelVM); - if(!(vm.flags & rwVIDEOMODEEXCLUSIVE) != FrontEndMenuManager.m_nPrefsWindowed) - continue; - if(FrontEndMenuManager.m_nPrefsWindowed){ - bestMode = GcurSelVM; - }else{ + if (!(vm.flags & rwVIDEOMODEEXCLUSIVE)){ + bestWndMode = GcurSelVM; + } else { // try the largest one that isn't larger than what we wanted if(vm.width >= bestWidth && vm.width <= FrontEndMenuManager.m_nPrefsWidth && vm.height >= bestHeight && vm.height <= FrontEndMenuManager.m_nPrefsHeight && @@ -626,32 +626,34 @@ psSelectDevice() bestWidth = vm.width; bestHeight = vm.height; bestDepth = vm.depth; - bestMode = GcurSelVM; + bestFsMode = GcurSelVM; } } } - if(bestMode < 0){ + if(bestFsMode < 0){ MessageBox(nil, "Cannot find desired video mode", "GTA3", MB_OK); return FALSE; } - GcurSelVM = bestMode; + GcurSelVM = bestFsMode; FrontEndMenuManager.m_nDisplayVideoMode = GcurSelVM; FrontEndMenuManager.m_nPrefsVideoMode = FrontEndMenuManager.m_nDisplayVideoMode; - GcurSelVM = FrontEndMenuManager.m_nDisplayVideoMode; + + FrontEndMenuManager.m_nSelectedScreenMode = FrontEndMenuManager.m_nPrefsWindowed; } #endif - + RwEngineGetVideoModeInfo(&vm, GcurSelVM); #ifdef IMPROVED_VIDEOMODE - if(vm.flags & rwVIDEOMODEEXCLUSIVE){ - FrontEndMenuManager.m_nPrefsWidth = vm.width; - FrontEndMenuManager.m_nPrefsHeight = vm.height; - FrontEndMenuManager.m_nPrefsDepth = vm.depth; - } - FrontEndMenuManager.m_nPrefsWindowed = !(vm.flags & rwVIDEOMODEEXCLUSIVE); + if (FrontEndMenuManager.m_nPrefsWindowed) + GcurSelVM = bestWndMode; + + // Now GcurSelVM is 0 but vm has sizes(and fullscreen flag) of the video mode we want, that's why we changed the rwVIDEOMODEEXCLUSIVE conditions below + FrontEndMenuManager.m_nPrefsWidth = vm.width; + FrontEndMenuManager.m_nPrefsHeight = vm.height; + FrontEndMenuManager.m_nPrefsDepth = vm.depth; #endif FrontEndMenuManager.m_nCurrOption = 0; @@ -677,6 +679,7 @@ psSelectDevice() } } */ +#ifndef IMPROVED_VIDEOMODE if (vm.flags & rwVIDEOMODEEXCLUSIVE) { RsGlobal.maximumWidth = vm.width; @@ -686,15 +689,13 @@ psSelectDevice() PSGLOBAL(fullScreen) = TRUE; } -#ifdef IMPROVED_VIDEOMODE - else{ +#else RsGlobal.maximumWidth = FrontEndMenuManager.m_nPrefsWidth; RsGlobal.maximumHeight = FrontEndMenuManager.m_nPrefsHeight; RsGlobal.width = FrontEndMenuManager.m_nPrefsWidth; RsGlobal.height = FrontEndMenuManager.m_nPrefsHeight; - PSGLOBAL(fullScreen) = FALSE; - } + PSGLOBAL(fullScreen) = !FrontEndMenuManager.m_nPrefsWindowed; #endif return TRUE; @@ -1023,6 +1024,8 @@ void resizeCB(GLFWwindow* window, int width, int height) { if (RwInitialised && height > 0 && width > 0) { RwRect r; + // TODO support resizing with mouse. Now enabling this makes weird things to trails and CameraSize messing with sizes + r.x = 0; r.y = 0; r.w = RsGlobal.maximumWidth; diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index 531b9d31..d20cc0bf 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -59,8 +59,6 @@ static RwBool startupDeactivate; static RwBool useDefault; -static RwBool defaultFullscreenRes = TRUE; - /* Class name for the MS Window's window class. */ static const RwChar *AppClassName = RWSTRING("Grand theft auto 3"); @@ -113,6 +111,14 @@ DWORD _dwOperatingSystemVersion; RwUInt32 gGameState; CJoySticks AllValidWinJoys; +// What is that for anyway? +#ifndef IMPROVED_VIDEOMODE +static RwBool defaultFullscreenRes = TRUE; +#else +static RwBool defaultFullscreenRes = FALSE; +static RwInt32 bestWndMode = -1; +#endif + CJoySticks::CJoySticks() { for (int i = 0; i < MAX_JOYSTICKS; i++) @@ -791,11 +797,7 @@ RwChar **_psGetVideoModeList() _VMList[i] = nil; } else -#ifdef IMPROVED_VIDEOMODE - _VMList[i] = strdup("WINDOW"); -#else _VMList[i] = nil; -#endif } return _VMList; @@ -1378,8 +1380,8 @@ psSelectDevice() if ( !useDefault ) { if(FrontEndMenuManager.m_nPrefsWidth == 0 || - FrontEndMenuManager.m_nPrefsHeight == 0 || - FrontEndMenuManager.m_nPrefsDepth == 0){ + FrontEndMenuManager.m_nPrefsHeight == 0 || + FrontEndMenuManager.m_nPrefsDepth == 0){ // Defaults if nothing specified FrontEndMenuManager.m_nPrefsWidth = GetSystemMetrics(SM_CXSCREEN); FrontEndMenuManager.m_nPrefsHeight = GetSystemMetrics(SM_CYSCREEN); @@ -1388,51 +1390,51 @@ psSelectDevice() } // Find the videomode that best fits what we got from the settings file - RwInt32 bestMode = -1; + RwInt32 bestFsMode = -1; RwInt32 bestWidth = -1; RwInt32 bestHeight = -1; RwInt32 bestDepth = -1; - for(GcurSelVM = 0; GcurSelVM < RwEngineGetNumVideoModes(); GcurSelVM++){ + for (GcurSelVM = 0; GcurSelVM < RwEngineGetNumVideoModes(); GcurSelVM++) { RwEngineGetVideoModeInfo(&vm, GcurSelVM); - if(!(vm.flags & rwVIDEOMODEEXCLUSIVE) != FrontEndMenuManager.m_nPrefsWindowed) - continue; - if(FrontEndMenuManager.m_nPrefsWindowed){ - bestMode = GcurSelVM; - }else{ + if (!(vm.flags & rwVIDEOMODEEXCLUSIVE)) { + bestWndMode = GcurSelVM; + } else { // try the largest one that isn't larger than what we wanted - if(vm.width >= bestWidth && vm.width <= FrontEndMenuManager.m_nPrefsWidth && - vm.height >= bestHeight && vm.height <= FrontEndMenuManager.m_nPrefsHeight && - vm.depth >= bestDepth && vm.depth <= FrontEndMenuManager.m_nPrefsDepth){ + if (vm.width >= bestWidth && vm.width <= FrontEndMenuManager.m_nPrefsWidth && + vm.height >= bestHeight && vm.height <= FrontEndMenuManager.m_nPrefsHeight && + vm.depth >= bestDepth && vm.depth <= FrontEndMenuManager.m_nPrefsDepth){ bestWidth = vm.width; bestHeight = vm.height; bestDepth = vm.depth; - bestMode = GcurSelVM; + bestFsMode = GcurSelVM; } } } - if(bestMode < 0){ + if(bestFsMode < 0){ MessageBox(nil, "Cannot find desired video mode", "GTA3", MB_OK); return FALSE; } - GcurSelVM = bestMode; + GcurSelVM = bestFsMode; FrontEndMenuManager.m_nDisplayVideoMode = GcurSelVM; FrontEndMenuManager.m_nPrefsVideoMode = FrontEndMenuManager.m_nDisplayVideoMode; - GcurSelVM = FrontEndMenuManager.m_nDisplayVideoMode; + + FrontEndMenuManager.m_nSelectedScreenMode = FrontEndMenuManager.m_nPrefsWindowed; } #endif - + RwEngineGetVideoModeInfo(&vm, GcurSelVM); #ifdef IMPROVED_VIDEOMODE - if(vm.flags & rwVIDEOMODEEXCLUSIVE){ - FrontEndMenuManager.m_nPrefsWidth = vm.width; - FrontEndMenuManager.m_nPrefsHeight = vm.height; - FrontEndMenuManager.m_nPrefsDepth = vm.depth; - } - FrontEndMenuManager.m_nPrefsWindowed = !(vm.flags & rwVIDEOMODEEXCLUSIVE); + if (FrontEndMenuManager.m_nPrefsWindowed) + GcurSelVM = bestWndMode; + + // Now GcurSelVM is 0 but vm has sizes(and fullscreen flag) of the video mode we want, that's why we changed the rwVIDEOMODEEXCLUSIVE conditions below + FrontEndMenuManager.m_nPrefsWidth = vm.width; + FrontEndMenuManager.m_nPrefsHeight = vm.height; + FrontEndMenuManager.m_nPrefsDepth = vm.depth; #endif FrontEndMenuManager.m_nCurrOption = 0; @@ -1444,7 +1446,11 @@ psSelectDevice() return FALSE; } +#ifdef IMPROVED_VIDEOMODE + if (!FrontEndMenuManager.m_nPrefsWindowed) +#else if (vm.flags & rwVIDEOMODEEXCLUSIVE) +#endif { debug("%dx%dx%d", vm.width, vm.height, vm.depth); @@ -1457,7 +1463,11 @@ psSelectDevice() } } +#ifdef IMPROVED_VIDEOMODE + if (!FrontEndMenuManager.m_nPrefsWindowed) +#else if (vm.flags & rwVIDEOMODEEXCLUSIVE) +#endif { RsGlobal.maximumWidth = vm.width; RsGlobal.maximumHeight = vm.height;