summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/Frontend.cpp40
-rw-r--r--src/core/Frontend.h4
-rw-r--r--src/core/MenuScreens.h3
-rw-r--r--src/core/Radar.cpp7
-rw-r--r--src/extras/debugmenu.cpp23
-rw-r--r--src/extras/debugmenu.h1
-rw-r--r--src/skel/glfw/glfw.cpp55
-rw-r--r--src/skel/win/win.cpp68
8 files changed, 145 insertions, 56 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/extras/debugmenu.cpp b/src/extras/debugmenu.cpp
index 1c5e26ee..bb0ed55e 100644
--- a/src/extras/debugmenu.cpp
+++ b/src/extras/debugmenu.cpp
@@ -6,6 +6,7 @@
#include "rtcharse.h"
#include "inttypes.h"
#include "debugmenu.h"
+#include <new>
#define snprintf _snprintf
@@ -152,6 +153,7 @@ struct Menu
void update(void);
void draw(void);
Menu(void){ memset(this, 0, sizeof(Menu)); }
+ ~Menu(void);
};
extern Menu toplevel;
@@ -160,6 +162,7 @@ struct MenuEntry_Sub : MenuEntry
Menu *submenu;
MenuEntry_Sub(const char *name, Menu *menu);
+ ~MenuEntry_Sub(void) { delete submenu; }
};
struct MenuEntry_Var : MenuEntry
@@ -705,6 +708,16 @@ Menu::draw(void)
((MenuEntry_Sub*)this->selectedEntry)->submenu->draw();
}
+Menu::~Menu(void)
+{
+ MenuEntry *e, *next;
+ for(e = entries; e; e = next){
+ next = e->next;
+ delete e;
+ }
+ memset(this, 0, sizeof(Menu));
+}
+
Menu*
findMenu(const char *name)
{
@@ -792,6 +805,7 @@ DebugMenuInit(void)
assert(arrow);
RwImageDestroy(img);
+
menuInitialized = true;
}
@@ -804,7 +818,14 @@ DebugMenuShutdown(void)
cursor = nil;
RwRasterDestroy(arrow);
arrow = nil;
- // TODO: the menus ...
+
+ toplevel.~Menu();
+ new (&toplevel) Menu();
+
+ activeMenu = &toplevel;
+ deepestMenu = &toplevel;
+ mouseOverMenu = nil;
+ mouseOverEntry = nil;
}
menuInitialized = false;
}
diff --git a/src/extras/debugmenu.h b/src/extras/debugmenu.h
index 462b59c4..ae595c1f 100644
--- a/src/extras/debugmenu.h
+++ b/src/extras/debugmenu.h
@@ -13,6 +13,7 @@ struct MenuEntry
Menu *menu;
MenuEntry(const char *name);
+ virtual ~MenuEntry(void) {}
};
typedef MenuEntry DebugMenuEntry;
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;