q3rally/engine/code/q3_ui/ui_video.c
zturtleman 96a9e2a9aa ioquake3 resync to revision 3511 from 3444.
This updates from SDL 2.0.4 to SDL 2.0.8.

Fix nullptr dereference in front of nullptr check in FS_CheckPak0
Fix undefined behaviour due to shifting signed in snd_mem.c
Fix shifting bits out of byte in tr_font.c
Fix shift into sign in cl_cin.c
Fix signed bit operations in MSG_ReadBits
Add missing address operator in cm_polylib.c
OpenGL1: Decay float[8] to float * in tr_marks.c
Avoid srcList[-1] in snd_openal.c
Fix the behaviour of CVAR_LATCH|CVAR_CHEAT cvars
Maximize cURL buffer size
Fix mouse grab after toggling fullscreen
Fix q3history buffer not cleared between mods and OOB-access
Revert "Removed "Color Depth" from q3_ui system settings, it didn't control anything."
Fix displayed color/depth/stencil bits values
Restore setting r_colorbits in q3_ui
Make setting r_stencilbits more consistent in Team Arena UI
Fix map list in Team Arena start server menu after entering SP menu
Support SDL audio devices that require float32 samples.
sdl_snd.c should just initialize SDL audio without checking SDL_WasInit().
There's no need to SDL_PauseAudio(1) before calling SDL_CloseAudio().
Added audio capture support to SDL backend.
Use the SDL2 audio device interface instead of the legacy 1.2 API.
Disable SDL audio capture until prebuilt SDL libraries are updated to 2.0.8.
Update SDL2 to 2.0.8
Add SDL 2.0.1 headers for macOS PPC
Make macOS Universal Bundle target 10.6 for x86 and x86_64
Fix possible bot goal state NULL pointer dereference
Fix uninitialized bot_goal_t fields
Remove unnecessary NULL pointer check in Cmd_RemoveCommand
Make UI_DrawProportionalString handle NULL string
Fix compiling against macOS system OpenAL and SDL2 frameworks
Fix array index in CanDamage() function - discovered by MARTY
Fix compiling Makefile (broke in macOS frameworks commit)
Fix clearing keys for control in Team Arena UI
Make s_useOpenAL be CVAR_LATCH
Improvements for dedicated camera followers (team follow1/2)
Fix not closing description.txt and fix path seperator
Fix duplicate bots displayed in Team Arena ingame add bot menu
OpenGL2: Fix parsing specularScale in shaders
Don't allow SDL audio capture using pulseaudio
Isolate the Altivec code so non-Altivec PPC targets can use the same binary.
Limit -maltivec to specific source files on OpenBSD too (untested)
Use SDL 2.0.1 headers for macOS ppc64
Fix console offset while Team Arena voiceMenu is open
OpenGL2: Readd r_deluxeSpecular.
Fix client kicked as unpure when missing the latest cgame/ui pk3s
Don't create multiple windows when GL context creation fails
Require OpenGL 1.2 for GL_CLAMP_TO_EDGE
Fix Linux uninstaller requiring Bash
Fix Linux uninstaller redirecting stderr to stdout in preuninstall.sh
Reported by @illwieckz.
Fix in_restart causing fatal error while video is shutdown
Allow pkg-config binary to be overridden with PKG_CONFIG
Make testgun command without argument disable test gun model
Remove unused renderer_buffer variable
Don't upload 8 bit grayscale images as 16 bit luminance
OpenGL1: Use RE_UploadCinematic() instead of duplicate code
Don't load non-core GL functions for OpenGL 3.2 core context
Load OpenGL ES 2.0 function procs
Don't check fixed function GL extensions when using shader pipeline
OpenGL2: Fix world VAO cache drawing when glIndex_t is unsigned short
OpenGL2: Misc fixes and cleanup
Fix IQM root joint backlerp when joint number is more than 0
Improve IQM loading
Improve IQM CPU vertex skinning performance
OpenGL2: Add GPU vertex skinning for IQM models
2018-07-30 11:35:12 +00:00

1426 lines
40 KiB
C

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
Copyright (C) 2002-2015 Q3Rally Team (Per Thormann - q3rally@gmail.com)
This file is part of q3rally source code.
q3rally source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
q3rally source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with q3rally; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
//
#include "ui_local.h"
void GraphicsOptions_MenuInit( void );
/*
=======================================================================
DRIVER INFORMATION MENU
=======================================================================
*/
// STONELANCE
/*
#define DRIVERINFO_FRAMEL "menu/art/frame2_l"
#define DRIVERINFO_FRAMER "menu/art/frame1_r"
#define DRIVERINFO_BACK0 "menu/art/back_0"
#define DRIVERINFO_BACK1 "menu/art/back_1"
static char* driverinfo_artlist[] =
{
DRIVERINFO_FRAMEL,
DRIVERINFO_FRAMER,
DRIVERINFO_BACK0,
DRIVERINFO_BACK1,
NULL,
};
*/
// END
#define ID_DRIVERINFOBACK 100
typedef struct
{
menuframework_s menu;
menutext_s banner;
// STONELANCE
/*
menubitmap_s back;
menubitmap_s framel;
menubitmap_s framer;
*/
menutext_s back;
menulist_s extensionList;
// char strings[64][128];
// char* stringitems[64];
// END
char stringbuff[1024];
char* strings[64];
int numstrings;
} driverinfo_t;
static driverinfo_t s_driverinfo;
/*
=================
DriverInfo_Event
=================
*/
static void DriverInfo_Event( void* ptr, int event )
{
if (event != QM_ACTIVATED)
return;
switch (((menucommon_s*)ptr)->id)
{
case ID_DRIVERINFOBACK:
UI_PopMenu();
break;
}
}
/*
=================
DriverInfo_MenuDraw
=================
*/
static void DriverInfo_MenuDraw( void )
{
// STONELANCE
// int i;
// int y;
// END
Menu_Draw( &s_driverinfo.menu );
UI_DrawString( 320, 80, "VENDOR", UI_CENTER|UI_SMALLFONT, color_red );
UI_DrawString( 320, 152, "PIXELFORMAT", UI_CENTER|UI_SMALLFONT, color_red );
UI_DrawString( 320, 192, "EXTENSIONS", UI_CENTER|UI_SMALLFONT, color_red );
UI_DrawString( 320, 80+16, uis.glconfig.vendor_string, UI_CENTER|UI_SMALLFONT, text_color_normal );
UI_DrawString( 320, 96+16, uis.glconfig.version_string, UI_CENTER|UI_SMALLFONT, text_color_normal );
UI_DrawString( 320, 112+16, uis.glconfig.renderer_string, UI_CENTER|UI_SMALLFONT, text_color_normal );
UI_DrawString( 320, 152+16, va ("color(%d-bits) Z(%d-bits) stencil(%d-bits)", uis.glconfig.colorBits, uis.glconfig.depthBits, uis.glconfig.stencilBits), UI_CENTER|UI_SMALLFONT, text_color_normal );
// double column
// STONELANCE
/*
y = 192+16;
for (i=0; i<s_driverinfo.numstrings/2; i++) {
UI_DrawString( 320-4, y, s_driverinfo.strings[i*2], UI_RIGHT|UI_SMALLFONT, text_color_normal );
UI_DrawString( 320+4, y, s_driverinfo.strings[i*2+1], UI_LEFT|UI_SMALLFONT, text_color_normal );
y += SMALLCHAR_HEIGHT;
}
if (s_driverinfo.numstrings & 1)
UI_DrawString( 320, y, s_driverinfo.strings[s_driverinfo.numstrings-1], UI_CENTER|UI_SMALLFONT, text_color_normal );
*/
// END
}
/*
=================
DriverInfo_Cache
=================
*/
void DriverInfo_Cache( void )
{
// STONELANCE
/*
int i;
// touch all our pics
for (i=0; ;i++)
{
if (!driverinfo_artlist[i])
break;
trap_R_RegisterShaderNoMip(driverinfo_artlist[i]);
}
*/
// END
}
/*
=================
UI_DriverInfo_Menu
=================
*/
static void UI_DriverInfo_Menu( void )
{
char* eptr;
int i;
int len;
// zero set all our globals
memset( &s_driverinfo, 0 ,sizeof(driverinfo_t) );
DriverInfo_Cache();
s_driverinfo.menu.fullscreen = qtrue;
s_driverinfo.menu.draw = DriverInfo_MenuDraw;
s_driverinfo.banner.generic.type = MTYPE_BTEXT;
s_driverinfo.banner.generic.x = 320;
s_driverinfo.banner.generic.y = 16;
s_driverinfo.banner.string = "DRIVER INFO";
s_driverinfo.banner.color = color_white;
s_driverinfo.banner.style = UI_CENTER;
// STONELANCE
/*
s_driverinfo.framel.generic.type = MTYPE_BITMAP;
s_driverinfo.framel.generic.name = DRIVERINFO_FRAMEL;
s_driverinfo.framel.generic.flags = QMF_INACTIVE;
s_driverinfo.framel.generic.x = 0;
s_driverinfo.framel.generic.y = 78;
s_driverinfo.framel.width = 256;
s_driverinfo.framel.height = 329;
s_driverinfo.framer.generic.type = MTYPE_BITMAP;
s_driverinfo.framer.generic.name = DRIVERINFO_FRAMER;
s_driverinfo.framer.generic.flags = QMF_INACTIVE;
s_driverinfo.framer.generic.x = 376;
s_driverinfo.framer.generic.y = 76;
s_driverinfo.framer.width = 256;
s_driverinfo.framer.height = 334;
s_driverinfo.back.generic.type = MTYPE_BITMAP;
s_driverinfo.back.generic.name = DRIVERINFO_BACK0;
s_driverinfo.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_driverinfo.back.generic.callback = DriverInfo_Event;
s_driverinfo.back.generic.id = ID_DRIVERINFOBACK;
s_driverinfo.back.generic.x = 0;
s_driverinfo.back.generic.y = 480-64;
s_driverinfo.back.width = 128;
s_driverinfo.back.height = 64;
s_driverinfo.back.focuspic = DRIVERINFO_BACK1;
*/
s_driverinfo.back.generic.type = MTYPE_PTEXT;
s_driverinfo.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_driverinfo.back.generic.x = 20;
s_driverinfo.back.generic.y = 480 - 50;
s_driverinfo.back.generic.id = ID_DRIVERINFOBACK;
s_driverinfo.back.generic.callback = DriverInfo_Event;
s_driverinfo.back.string = "< BACK";
s_driverinfo.back.color = text_color_normal;
s_driverinfo.back.style = UI_LEFT | UI_SMALLFONT;
// END
// TTimo: overflow with particularly long GL extensions (such as the gf3)
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=399
// NOTE: could have pushed the size of stringbuff, but the list is already out of the screen
// (no matter what your resolution)
Q_strncpyz(s_driverinfo.stringbuff, uis.glconfig.extensions_string, 1024);
// build null terminated extension strings
eptr = s_driverinfo.stringbuff;
// STONELANCE
// while ( s_driverinfo.numstrings<40 && *eptr )
while ( s_driverinfo.numstrings < 64 && *eptr )
// END
{
while ( *eptr && *eptr == ' ' )
*eptr++ = '\0';
// track start of valid string
if (*eptr && *eptr != ' ')
s_driverinfo.strings[s_driverinfo.numstrings++] = eptr;
while ( *eptr && *eptr != ' ' )
eptr++;
}
// safety length strings for display
for (i=0; i<s_driverinfo.numstrings; i++) {
len = strlen(s_driverinfo.strings[i]);
// STONELANCE
// if (len > 32) {
if (len > 40) {
// END
s_driverinfo.strings[i][len-1] = '>';
s_driverinfo.strings[i][len] = '\0';
}
}
// STONELANCE
s_driverinfo.extensionList.generic.type = MTYPE_LISTBOX;
s_driverinfo.extensionList.generic.flags = QMF_CENTER_JUSTIFY | QMF_HIGHLIGHT_IF_FOCUS | QMF_SCROLL_ONLY;
s_driverinfo.extensionList.scrollbarAlignment = SB_RIGHT | SB_HIDE;
s_driverinfo.extensionList.generic.x = 320;
s_driverinfo.extensionList.generic.y = 208;
s_driverinfo.extensionList.width = 44;
s_driverinfo.extensionList.height = 13;
s_driverinfo.extensionList.itemnames = (const char **)s_driverinfo.strings;
s_driverinfo.extensionList.numitems = s_driverinfo.numstrings;
// END
Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.banner );
// STONELANCE
/*
Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.framel );
Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.framer );
*/
Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.extensionList );
// END
Menu_AddItem( &s_driverinfo.menu, &s_driverinfo.back );
UI_PushMenu( &s_driverinfo.menu );
}
/*
=======================================================================
GRAPHICS OPTIONS MENU
=======================================================================
*/
// STONELANCE
/*
#define GRAPHICSOPTIONS_FRAMEL "menu/art/frame2_l"
#define GRAPHICSOPTIONS_FRAMER "menu/art/frame1_r"
#define GRAPHICSOPTIONS_BACK0 "menu/art/back_0"
#define GRAPHICSOPTIONS_BACK1 "menu/art/back_1"
#define GRAPHICSOPTIONS_ACCEPT0 "menu/art/accept_0"
#define GRAPHICSOPTIONS_ACCEPT1 "menu/art/accept_1"
*/
// END
#define ID_BACK2 101
#define ID_FULLSCREEN 102
#define ID_LIST 103
#define ID_MODE 104
#define ID_DRIVERINFO 105
#define ID_GRAPHICS 106
#define ID_DISPLAY 107
#define ID_SOUND 108
#define ID_NETWORK 109
#define ID_RATIO 110
typedef struct {
menuframework_s menu;
menutext_s banner;
// STONELANCE
/*
menubitmap_s framel;
menubitmap_s framer;
*/
// END
menutext_s graphics;
menutext_s display;
menutext_s sound;
menutext_s network;
menulist_s list;
menulist_s ratio;
menulist_s mode;
menulist_s driver;
menuslider_s tq;
menulist_s fs;
menulist_s lighting;
menulist_s allow_extensions;
menulist_s texturebits;
menulist_s colordepth;
menulist_s geometry;
menulist_s filter;
menutext_s driverinfo;
// STONELANCE
// menubitmap_s apply;
// menubitmap_s back;
menutext_s apply;
menutext_s back;
// END
} graphicsoptions_t;
typedef struct
{
int mode;
qboolean fullscreen;
int tq;
int lighting;
int colordepth;
int texturebits;
int geometry;
int filter;
int driver;
qboolean extensions;
} InitialVideoOptions_s;
static InitialVideoOptions_s s_ivo;
static graphicsoptions_t s_graphicsoptions;
static InitialVideoOptions_s s_ivo_templates[] =
{
{
6, qtrue, 3, 0, 2, 2, 2, 1, 0, qtrue
},
{
4, qtrue, 2, 0, 2, 2, 1, 1, 0, qtrue // JDC: this was tq 3
},
{
3, qtrue, 2, 0, 0, 0, 1, 0, 0, qtrue
},
{
2, qtrue, 1, 0, 1, 0, 0, 0, 0, qtrue
},
{
2, qtrue, 1, 1, 1, 0, 0, 0, 0, qtrue
},
{
3, qtrue, 1, 0, 0, 0, 1, 0, 0, qtrue
}
};
#define NUM_IVO_TEMPLATES ( ARRAY_LEN( s_ivo_templates ) )
static const char *builtinResolutions[ ] =
{
"320x240",
"400x300",
"512x384",
"640x480",
"800x600",
"960x720",
"1024x768",
"1152x864",
"1280x1024",
"1600x1200",
"2048x1536",
"856x480",
NULL
};
static const char *knownRatios[ ][2] =
{
{ "1.25:1", "5:4" },
{ "1.33:1", "4:3" },
{ "1.50:1", "3:2" },
{ "1.56:1", "14:9" },
{ "1.60:1", "16:10" },
{ "1.67:1", "5:3" },
{ "1.78:1", "16:9" },
{ NULL , NULL }
};
#define MAX_RESOLUTIONS 32
static const char* ratios[ MAX_RESOLUTIONS ];
static char ratioBuf[ MAX_RESOLUTIONS ][ 8 ];
static int ratioToRes[ MAX_RESOLUTIONS ];
static int resToRatio[ MAX_RESOLUTIONS ];
static char resbuf[ MAX_STRING_CHARS ];
static const char* detectedResolutions[ MAX_RESOLUTIONS ];
static const char** resolutions = builtinResolutions;
static qboolean resolutionsDetected = qfalse;
/*
=================
GraphicsOptions_FindBuiltinResolution
=================
*/
static int GraphicsOptions_FindBuiltinResolution( int mode )
{
int i;
if( !resolutionsDetected )
return mode;
if( mode < 0 )
return -1;
for( i = 0; builtinResolutions[ i ]; i++ )
{
if( !Q_stricmp( builtinResolutions[ i ], detectedResolutions[ mode ] ) )
return i;
}
return -1;
}
/*
=================
GraphicsOptions_FindDetectedResolution
=================
*/
static int GraphicsOptions_FindDetectedResolution( int mode )
{
int i;
if( !resolutionsDetected )
return mode;
if( mode < 0 )
return -1;
for( i = 0; detectedResolutions[ i ]; i++ )
{
if( !Q_stricmp( builtinResolutions[ mode ], detectedResolutions[ i ] ) )
return i;
}
return -1;
}
/*
=================
GraphicsOptions_GetAspectRatios
=================
*/
static void GraphicsOptions_GetAspectRatios( void )
{
int i, r;
// build ratio list from resolutions
for( r = 0; resolutions[r]; r++ )
{
int w, h;
char *x;
char str[ sizeof(ratioBuf[0]) ];
// calculate resolution's aspect ratio
x = strchr( resolutions[r], 'x' ) + 1;
Q_strncpyz( str, resolutions[r], x-resolutions[r] );
w = atoi( str );
h = atoi( x );
Com_sprintf( str, sizeof(str), "%.2f:1", (float)w / (float)h );
// rename common ratios ("1.33:1" -> "4:3")
for( i = 0; knownRatios[i][0]; i++ ) {
if( !Q_stricmp( str, knownRatios[i][0] ) ) {
Q_strncpyz( str, knownRatios[i][1], sizeof( str ) );
break;
}
}
// add ratio to list if it is new
// establish res/ratio relationship
for( i = 0; ratioBuf[i][0]; i++ )
{
if( !Q_stricmp( str, ratioBuf[i] ) )
break;
}
if( !ratioBuf[i][0] )
{
Q_strncpyz( ratioBuf[i], str, sizeof(ratioBuf[i]) );
ratioToRes[i] = r;
}
ratios[r] = ratioBuf[r];
resToRatio[r] = i;
}
ratios[r] = NULL;
}
/*
=================
GraphicsOptions_GetInitialVideo
=================
*/
static void GraphicsOptions_GetInitialVideo( void )
{
s_ivo.colordepth = s_graphicsoptions.colordepth.curvalue;
s_ivo.driver = s_graphicsoptions.driver.curvalue;
s_ivo.mode = s_graphicsoptions.mode.curvalue;
s_ivo.fullscreen = s_graphicsoptions.fs.curvalue;
s_ivo.extensions = s_graphicsoptions.allow_extensions.curvalue;
s_ivo.tq = s_graphicsoptions.tq.curvalue;
s_ivo.lighting = s_graphicsoptions.lighting.curvalue;
s_ivo.geometry = s_graphicsoptions.geometry.curvalue;
s_ivo.filter = s_graphicsoptions.filter.curvalue;
s_ivo.texturebits = s_graphicsoptions.texturebits.curvalue;
}
/*
=================
GraphicsOptions_GetResolutions
=================
*/
static void GraphicsOptions_GetResolutions( void )
{
Q_strncpyz(resbuf, UI_Cvar_VariableString("r_availableModes"), sizeof(resbuf));
if(*resbuf)
{
char* s = resbuf;
unsigned int i = 0;
while( s && i < ARRAY_LEN(detectedResolutions)-1 )
{
detectedResolutions[i++] = s;
s = strchr(s, ' ');
if( s )
*s++ = '\0';
}
detectedResolutions[ i ] = NULL;
if( i > 0 )
{
resolutions = detectedResolutions;
resolutionsDetected = qtrue;
}
}
}
/*
=================
GraphicsOptions_CheckConfig
=================
*/
static void GraphicsOptions_CheckConfig( void )
{
int i;
for ( i = 0; i < NUM_IVO_TEMPLATES-1; i++ )
{
if ( s_ivo_templates[i].colordepth != s_graphicsoptions.colordepth.curvalue )
continue;
if ( s_ivo_templates[i].driver != s_graphicsoptions.driver.curvalue )
continue;
if ( GraphicsOptions_FindDetectedResolution(s_ivo_templates[i].mode) != s_graphicsoptions.mode.curvalue )
continue;
if ( s_ivo_templates[i].fullscreen != s_graphicsoptions.fs.curvalue )
continue;
if ( s_ivo_templates[i].tq != s_graphicsoptions.tq.curvalue )
continue;
if ( s_ivo_templates[i].lighting != s_graphicsoptions.lighting.curvalue )
continue;
if ( s_ivo_templates[i].geometry != s_graphicsoptions.geometry.curvalue )
continue;
if ( s_ivo_templates[i].filter != s_graphicsoptions.filter.curvalue )
continue;
// if ( s_ivo_templates[i].texturebits != s_graphicsoptions.texturebits.curvalue )
// continue;
s_graphicsoptions.list.curvalue = i;
return;
}
// return 'Custom' ivo template
s_graphicsoptions.list.curvalue = NUM_IVO_TEMPLATES - 1;
}
/*
=================
GraphicsOptions_UpdateMenuItems
=================
*/
static void GraphicsOptions_UpdateMenuItems( void )
{
if ( s_graphicsoptions.driver.curvalue == 1 )
{
s_graphicsoptions.fs.curvalue = 1;
s_graphicsoptions.fs.generic.flags |= QMF_GRAYED;
s_graphicsoptions.colordepth.curvalue = 1;
}
else
{
s_graphicsoptions.fs.generic.flags &= ~QMF_GRAYED;
}
if ( s_graphicsoptions.fs.curvalue == 0 || s_graphicsoptions.driver.curvalue == 1 )
{
s_graphicsoptions.colordepth.curvalue = 0;
s_graphicsoptions.colordepth.generic.flags |= QMF_GRAYED;
}
else
{
s_graphicsoptions.colordepth.generic.flags &= ~QMF_GRAYED;
}
if ( s_graphicsoptions.allow_extensions.curvalue == 0 )
{
if ( s_graphicsoptions.texturebits.curvalue == 0 )
{
s_graphicsoptions.texturebits.curvalue = 1;
}
}
s_graphicsoptions.apply.generic.flags |= QMF_HIDDEN|QMF_INACTIVE;
if ( s_ivo.mode != s_graphicsoptions.mode.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.fullscreen != s_graphicsoptions.fs.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.extensions != s_graphicsoptions.allow_extensions.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.tq != s_graphicsoptions.tq.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.lighting != s_graphicsoptions.lighting.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.colordepth != s_graphicsoptions.colordepth.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.driver != s_graphicsoptions.driver.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.texturebits != s_graphicsoptions.texturebits.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.geometry != s_graphicsoptions.geometry.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
if ( s_ivo.filter != s_graphicsoptions.filter.curvalue )
{
s_graphicsoptions.apply.generic.flags &= ~(QMF_HIDDEN|QMF_INACTIVE);
}
GraphicsOptions_CheckConfig();
}
/*
=================
GraphicsOptions_ApplyChanges
=================
*/
static void GraphicsOptions_ApplyChanges( void *unused, int notification )
{
if (notification != QM_ACTIVATED)
return;
switch ( s_graphicsoptions.texturebits.curvalue )
{
case 0:
trap_Cvar_SetValue( "r_texturebits", 0 );
break;
case 1:
trap_Cvar_SetValue( "r_texturebits", 16 );
break;
case 2:
trap_Cvar_SetValue( "r_texturebits", 32 );
break;
}
trap_Cvar_SetValue( "r_picmip", 3 - s_graphicsoptions.tq.curvalue );
trap_Cvar_SetValue( "r_allowExtensions", s_graphicsoptions.allow_extensions.curvalue );
if( resolutionsDetected )
{
// search for builtin mode that matches the detected mode
int mode;
if ( s_graphicsoptions.mode.curvalue == -1
|| s_graphicsoptions.mode.curvalue >= ARRAY_LEN( detectedResolutions ) )
s_graphicsoptions.mode.curvalue = 0;
mode = GraphicsOptions_FindBuiltinResolution( s_graphicsoptions.mode.curvalue );
if( mode == -1 )
{
char w[ 16 ], h[ 16 ];
Q_strncpyz( w, detectedResolutions[ s_graphicsoptions.mode.curvalue ], sizeof( w ) );
*strchr( w, 'x' ) = 0;
Q_strncpyz( h,
strchr( detectedResolutions[ s_graphicsoptions.mode.curvalue ], 'x' ) + 1, sizeof( h ) );
trap_Cvar_Set( "r_customwidth", w );
trap_Cvar_Set( "r_customheight", h );
}
trap_Cvar_SetValue( "r_mode", mode );
}
else
trap_Cvar_SetValue( "r_mode", s_graphicsoptions.mode.curvalue );
trap_Cvar_SetValue( "r_fullscreen", s_graphicsoptions.fs.curvalue );
switch ( s_graphicsoptions.colordepth.curvalue )
{
case 0:
trap_Cvar_SetValue( "r_colorbits", 0 );
trap_Cvar_SetValue( "r_depthbits", 0 );
trap_Cvar_Reset( "r_stencilbits" );
break;
case 1:
trap_Cvar_SetValue( "r_colorbits", 16 );
trap_Cvar_SetValue( "r_depthbits", 16 );
trap_Cvar_SetValue( "r_stencilbits", 0 );
break;
case 2:
trap_Cvar_SetValue( "r_colorbits", 32 );
trap_Cvar_SetValue( "r_depthbits", 24 );
trap_Cvar_SetValue( "r_stencilbits", 8 );
break;
}
trap_Cvar_SetValue( "r_vertexLight", s_graphicsoptions.lighting.curvalue );
if ( s_graphicsoptions.geometry.curvalue == 2 )
{
trap_Cvar_SetValue( "r_lodBias", 0 );
trap_Cvar_SetValue( "r_subdivisions", 4 );
}
else if ( s_graphicsoptions.geometry.curvalue == 1 )
{
trap_Cvar_SetValue( "r_lodBias", 1 );
trap_Cvar_SetValue( "r_subdivisions", 12 );
}
else
{
trap_Cvar_SetValue( "r_lodBias", 1 );
trap_Cvar_SetValue( "r_subdivisions", 20 );
}
if ( s_graphicsoptions.filter.curvalue )
{
trap_Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR" );
}
else
{
trap_Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" );
}
trap_Cmd_ExecuteText( EXEC_APPEND, "vid_restart\n" );
}
/*
=================
GraphicsOptions_Event
=================
*/
static void GraphicsOptions_Event( void* ptr, int event ) {
InitialVideoOptions_s *ivo;
if( event != QM_ACTIVATED ) {
return;
}
switch( ((menucommon_s*)ptr)->id ) {
case ID_RATIO:
s_graphicsoptions.mode.curvalue =
ratioToRes[ s_graphicsoptions.ratio.curvalue ];
// fall through to apply mode constraints
case ID_MODE:
// clamp 3dfx video modes
if ( s_graphicsoptions.driver.curvalue == 1 )
{
if ( s_graphicsoptions.mode.curvalue < 2 )
s_graphicsoptions.mode.curvalue = 2;
else if ( s_graphicsoptions.mode.curvalue > 6 )
s_graphicsoptions.mode.curvalue = 6;
}
s_graphicsoptions.ratio.curvalue =
resToRatio[ s_graphicsoptions.mode.curvalue ];
break;
case ID_LIST:
ivo = &s_ivo_templates[s_graphicsoptions.list.curvalue];
s_graphicsoptions.mode.curvalue = GraphicsOptions_FindDetectedResolution(ivo->mode);
s_graphicsoptions.ratio.curvalue =
resToRatio[ s_graphicsoptions.mode.curvalue ];
s_graphicsoptions.tq.curvalue = ivo->tq;
s_graphicsoptions.lighting.curvalue = ivo->lighting;
s_graphicsoptions.colordepth.curvalue = ivo->colordepth;
s_graphicsoptions.texturebits.curvalue = ivo->texturebits;
s_graphicsoptions.geometry.curvalue = ivo->geometry;
s_graphicsoptions.filter.curvalue = ivo->filter;
s_graphicsoptions.fs.curvalue = ivo->fullscreen;
break;
case ID_DRIVERINFO:
UI_DriverInfo_Menu();
break;
case ID_BACK2:
UI_PopMenu();
break;
case ID_GRAPHICS:
break;
case ID_DISPLAY:
UI_PopMenu();
UI_DisplayOptionsMenu();
break;
case ID_SOUND:
UI_PopMenu();
UI_SoundOptionsMenu();
break;
case ID_NETWORK:
UI_PopMenu();
UI_NetworkOptionsMenu();
break;
}
}
/*
================
GraphicsOptions_TQEvent
================
*/
static void GraphicsOptions_TQEvent( void *ptr, int event ) {
if( event != QM_ACTIVATED ) {
return;
}
s_graphicsoptions.tq.curvalue = (int)(s_graphicsoptions.tq.curvalue + 0.5);
}
/*
================
GraphicsOptions_MenuDraw
================
*/
void GraphicsOptions_MenuDraw (void)
{
//APSFIX - rework this
GraphicsOptions_UpdateMenuItems();
Menu_Draw( &s_graphicsoptions.menu );
}
/*
=================
GraphicsOptions_SetMenuItems
=================
*/
static void GraphicsOptions_SetMenuItems( void )
{
s_graphicsoptions.mode.curvalue =
GraphicsOptions_FindDetectedResolution( trap_Cvar_VariableValue( "r_mode" ) );
if ( s_graphicsoptions.mode.curvalue < 0 )
{
if( resolutionsDetected )
{
int i;
char buf[MAX_STRING_CHARS];
trap_Cvar_VariableStringBuffer("r_customwidth", buf, sizeof(buf)-2);
buf[strlen(buf)+1] = 0;
buf[strlen(buf)] = 'x';
trap_Cvar_VariableStringBuffer("r_customheight", buf+strlen(buf), sizeof(buf)-strlen(buf));
for(i = 0; detectedResolutions[i]; ++i)
{
if(!Q_stricmp(buf, detectedResolutions[i]))
{
s_graphicsoptions.mode.curvalue = i;
break;
}
}
if ( s_graphicsoptions.mode.curvalue < 0 )
s_graphicsoptions.mode.curvalue = 0;
}
else
{
s_graphicsoptions.mode.curvalue = 3;
}
}
s_graphicsoptions.ratio.curvalue =
resToRatio[ s_graphicsoptions.mode.curvalue ];
s_graphicsoptions.fs.curvalue = trap_Cvar_VariableValue("r_fullscreen");
s_graphicsoptions.allow_extensions.curvalue = trap_Cvar_VariableValue("r_allowExtensions");
s_graphicsoptions.tq.curvalue = 3-trap_Cvar_VariableValue( "r_picmip");
if ( s_graphicsoptions.tq.curvalue < 0 )
{
s_graphicsoptions.tq.curvalue = 0;
}
else if ( s_graphicsoptions.tq.curvalue > 3 )
{
s_graphicsoptions.tq.curvalue = 3;
}
s_graphicsoptions.lighting.curvalue = trap_Cvar_VariableValue( "r_vertexLight" ) != 0;
switch ( ( int ) trap_Cvar_VariableValue( "r_texturebits" ) )
{
default:
case 0:
s_graphicsoptions.texturebits.curvalue = 0;
break;
case 16:
s_graphicsoptions.texturebits.curvalue = 1;
break;
case 32:
s_graphicsoptions.texturebits.curvalue = 2;
break;
}
if ( !Q_stricmp( UI_Cvar_VariableString( "r_textureMode" ), "GL_LINEAR_MIPMAP_NEAREST" ) )
{
s_graphicsoptions.filter.curvalue = 0;
}
else
{
s_graphicsoptions.filter.curvalue = 1;
}
if ( trap_Cvar_VariableValue( "r_lodBias" ) > 0 )
{
if ( trap_Cvar_VariableValue( "r_subdivisions" ) >= 20 )
{
s_graphicsoptions.geometry.curvalue = 0;
}
else
{
s_graphicsoptions.geometry.curvalue = 1;
}
}
else
{
s_graphicsoptions.geometry.curvalue = 2;
}
switch ( ( int ) trap_Cvar_VariableValue( "r_colorbits" ) )
{
default:
case 0:
s_graphicsoptions.colordepth.curvalue = 0;
break;
case 16:
s_graphicsoptions.colordepth.curvalue = 1;
break;
case 32:
s_graphicsoptions.colordepth.curvalue = 2;
break;
}
if ( s_graphicsoptions.fs.curvalue == 0 )
{
s_graphicsoptions.colordepth.curvalue = 0;
}
if ( s_graphicsoptions.driver.curvalue == 1 )
{
s_graphicsoptions.colordepth.curvalue = 1;
}
}
/*
================
GraphicsOptions_MenuInit
================
*/
void GraphicsOptions_MenuInit( void )
{
static const char *s_driver_names[] =
{
"Default",
"Voodoo",
NULL
};
static const char *tq_names[] =
{
"Default",
"16 bit",
"32 bit",
NULL
};
static const char *s_graphics_options_names[] =
{
"Very High Quality",
"High Quality",
"Normal",
"Fast",
"Fastest",
"Custom",
NULL
};
static const char *lighting_names[] =
{
"Lightmap",
"Vertex",
NULL
};
static const char *colordepth_names[] =
{
"Default",
"16 bit",
"32 bit",
NULL
};
static const char *filter_names[] =
{
"Bilinear",
"Trilinear",
NULL
};
static const char *quality_names[] =
{
"Low",
"Medium",
"High",
NULL
};
static const char *enabled_names[] =
{
"Off",
"On",
NULL
};
int y;
// zero set all our globals
memset( &s_graphicsoptions, 0 ,sizeof(graphicsoptions_t) );
GraphicsOptions_GetResolutions();
GraphicsOptions_GetAspectRatios();
GraphicsOptions_Cache();
s_graphicsoptions.menu.wrapAround = qtrue;
s_graphicsoptions.menu.fullscreen = qtrue;
s_graphicsoptions.menu.draw = GraphicsOptions_MenuDraw;
s_graphicsoptions.banner.generic.type = MTYPE_BTEXT;
s_graphicsoptions.banner.generic.x = 320;
s_graphicsoptions.banner.generic.y = 16;
s_graphicsoptions.banner.string = "SYSTEM SETUP";
s_graphicsoptions.banner.color = color_white;
s_graphicsoptions.banner.style = UI_CENTER;
// STONELANCE
/*
s_graphicsoptions.framel.generic.type = MTYPE_BITMAP;
s_graphicsoptions.framel.generic.name = GRAPHICSOPTIONS_FRAMEL;
s_graphicsoptions.framel.generic.flags = QMF_INACTIVE;
s_graphicsoptions.framel.generic.x = 0;
s_graphicsoptions.framel.generic.y = 78;
s_graphicsoptions.framel.width = 256;
s_graphicsoptions.framel.height = 329;
s_graphicsoptions.framer.generic.type = MTYPE_BITMAP;
s_graphicsoptions.framer.generic.name = GRAPHICSOPTIONS_FRAMER;
s_graphicsoptions.framer.generic.flags = QMF_INACTIVE;
s_graphicsoptions.framer.generic.x = 376;
s_graphicsoptions.framer.generic.y = 76;
s_graphicsoptions.framer.width = 256;
s_graphicsoptions.framer.height = 334;
*/
// END
s_graphicsoptions.graphics.generic.type = MTYPE_PTEXT;
s_graphicsoptions.graphics.generic.flags = QMF_RIGHT_JUSTIFY;
s_graphicsoptions.graphics.generic.id = ID_GRAPHICS;
s_graphicsoptions.graphics.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.graphics.generic.x = 216;
s_graphicsoptions.graphics.generic.y = 240 - 2 * PROP_HEIGHT;
s_graphicsoptions.graphics.string = "GRAPHICS";
s_graphicsoptions.graphics.style = UI_RIGHT;
// BAGPUSS
// s_graphicsoptions.graphics.color = color_red;
s_graphicsoptions.graphics.color = text_color_normal;
// END
s_graphicsoptions.display.generic.type = MTYPE_PTEXT;
s_graphicsoptions.display.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.display.generic.id = ID_DISPLAY;
s_graphicsoptions.display.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.display.generic.x = 216;
s_graphicsoptions.display.generic.y = 240 - PROP_HEIGHT;
s_graphicsoptions.display.string = "DISPLAY";
s_graphicsoptions.display.style = UI_RIGHT;
// BAGPUSS
// s_graphicsoptions.display.color = color_red;
s_graphicsoptions.display.color = text_color_normal;
// END
s_graphicsoptions.sound.generic.type = MTYPE_PTEXT;
s_graphicsoptions.sound.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.sound.generic.id = ID_SOUND;
s_graphicsoptions.sound.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.sound.generic.x = 216;
s_graphicsoptions.sound.generic.y = 240;
s_graphicsoptions.sound.string = "SOUND";
s_graphicsoptions.sound.style = UI_RIGHT;
// BAGPUSS
// s_graphicsoptions.sound.color = color_red;
s_graphicsoptions.sound.color = text_color_normal;
// END
s_graphicsoptions.network.generic.type = MTYPE_PTEXT;
s_graphicsoptions.network.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.network.generic.id = ID_NETWORK;
s_graphicsoptions.network.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.network.generic.x = 216;
s_graphicsoptions.network.generic.y = 240 + PROP_HEIGHT;
s_graphicsoptions.network.string = "NETWORK";
s_graphicsoptions.network.style = UI_RIGHT;
// BAGPUSS
// s_graphicsoptions.network.color = color_red;
s_graphicsoptions.network.color = text_color_normal;
// END
y = 240 - 7 * (BIGCHAR_HEIGHT + 2);
s_graphicsoptions.list.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.list.generic.name = "Graphics Settings:";
s_graphicsoptions.list.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.list.generic.x = 400;
s_graphicsoptions.list.generic.y = y;
s_graphicsoptions.list.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.list.generic.id = ID_LIST;
s_graphicsoptions.list.itemnames = s_graphics_options_names;
y += 2 * ( BIGCHAR_HEIGHT + 2 );
s_graphicsoptions.driver.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.driver.generic.name = "GL Driver:";
s_graphicsoptions.driver.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.driver.generic.x = 400;
s_graphicsoptions.driver.generic.y = y;
s_graphicsoptions.driver.itemnames = s_driver_names;
s_graphicsoptions.driver.curvalue = (uis.glconfig.driverType == GLDRV_VOODOO);
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_allowExtensions"
s_graphicsoptions.allow_extensions.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.allow_extensions.generic.name = "GL Extensions:";
s_graphicsoptions.allow_extensions.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.allow_extensions.generic.x = 400;
s_graphicsoptions.allow_extensions.generic.y = y;
s_graphicsoptions.allow_extensions.itemnames = enabled_names;
y += BIGCHAR_HEIGHT+2;
s_graphicsoptions.ratio.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.ratio.generic.name = "Aspect Ratio:";
s_graphicsoptions.ratio.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.ratio.generic.x = 400;
s_graphicsoptions.ratio.generic.y = y;
s_graphicsoptions.ratio.itemnames = ratios;
s_graphicsoptions.ratio.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.ratio.generic.id = ID_RATIO;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_mode"
s_graphicsoptions.mode.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.mode.generic.name = "Resolution:";
s_graphicsoptions.mode.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.mode.generic.x = 400;
s_graphicsoptions.mode.generic.y = y;
s_graphicsoptions.mode.itemnames = resolutions;
s_graphicsoptions.mode.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.mode.generic.id = ID_MODE;
y += BIGCHAR_HEIGHT+2;
// references "r_colorbits"
s_graphicsoptions.colordepth.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.colordepth.generic.name = "Color Depth:";
s_graphicsoptions.colordepth.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.colordepth.generic.x = 400;
s_graphicsoptions.colordepth.generic.y = y;
s_graphicsoptions.colordepth.itemnames = colordepth_names;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_fullscreen"
s_graphicsoptions.fs.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.fs.generic.name = "Fullscreen:";
s_graphicsoptions.fs.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.fs.generic.x = 400;
s_graphicsoptions.fs.generic.y = y;
s_graphicsoptions.fs.itemnames = enabled_names;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_vertexLight"
s_graphicsoptions.lighting.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.lighting.generic.name = "Lighting:";
s_graphicsoptions.lighting.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.lighting.generic.x = 400;
s_graphicsoptions.lighting.generic.y = y;
s_graphicsoptions.lighting.itemnames = lighting_names;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_lodBias" & "subdivisions"
s_graphicsoptions.geometry.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.geometry.generic.name = "Geometric Detail:";
s_graphicsoptions.geometry.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.geometry.generic.x = 400;
s_graphicsoptions.geometry.generic.y = y;
s_graphicsoptions.geometry.itemnames = quality_names;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_picmip"
s_graphicsoptions.tq.generic.type = MTYPE_SLIDER;
s_graphicsoptions.tq.generic.name = "Texture Detail:";
s_graphicsoptions.tq.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.tq.generic.x = 400;
s_graphicsoptions.tq.generic.y = y;
s_graphicsoptions.tq.minvalue = 0;
s_graphicsoptions.tq.maxvalue = 3;
s_graphicsoptions.tq.generic.callback = GraphicsOptions_TQEvent;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_textureBits"
s_graphicsoptions.texturebits.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.texturebits.generic.name = "Texture Quality:";
s_graphicsoptions.texturebits.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.texturebits.generic.x = 400;
s_graphicsoptions.texturebits.generic.y = y;
s_graphicsoptions.texturebits.itemnames = tq_names;
y += BIGCHAR_HEIGHT+2;
// references/modifies "r_textureMode"
s_graphicsoptions.filter.generic.type = MTYPE_SPINCONTROL;
s_graphicsoptions.filter.generic.name = "Texture Filter:";
s_graphicsoptions.filter.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
s_graphicsoptions.filter.generic.x = 400;
s_graphicsoptions.filter.generic.y = y;
s_graphicsoptions.filter.itemnames = filter_names;
y += 2*BIGCHAR_HEIGHT;
s_graphicsoptions.driverinfo.generic.type = MTYPE_PTEXT;
s_graphicsoptions.driverinfo.generic.flags = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.driverinfo.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.driverinfo.generic.id = ID_DRIVERINFO;
s_graphicsoptions.driverinfo.generic.x = 320;
s_graphicsoptions.driverinfo.generic.y = y;
s_graphicsoptions.driverinfo.string = "Driver Info";
s_graphicsoptions.driverinfo.style = UI_CENTER|UI_SMALLFONT;
// BAGPUSS
// s_graphicsoptions.driverinfo.color = color_red;
s_graphicsoptions.driverinfo.color = text_color_normal;
// END
y += BIGCHAR_HEIGHT+2;
// STONELANCE
/*
s_graphicsoptions.back.generic.type = MTYPE_BITMAP;
s_graphicsoptions.back.generic.name = GRAPHICSOPTIONS_BACK0;
s_graphicsoptions.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.back.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.back.generic.id = ID_BACK2;
s_graphicsoptions.back.generic.x = 0;
s_graphicsoptions.back.generic.y = 480-64;
s_graphicsoptions.back.width = 128;
s_graphicsoptions.back.height = 64;
s_graphicsoptions.back.focuspic = GRAPHICSOPTIONS_BACK1;
s_graphicsoptions.apply.generic.type = MTYPE_BITMAP;
s_graphicsoptions.apply.generic.name = GRAPHICSOPTIONS_ACCEPT0;
s_graphicsoptions.apply.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_HIDDEN|QMF_INACTIVE;
s_graphicsoptions.apply.generic.callback = GraphicsOptions_ApplyChanges;
s_graphicsoptions.apply.generic.x = 640;
s_graphicsoptions.apply.generic.y = 480-64;
s_graphicsoptions.apply.width = 128;
s_graphicsoptions.apply.height = 64;
s_graphicsoptions.apply.focuspic = GRAPHICSOPTIONS_ACCEPT1;
*/
s_graphicsoptions.back.generic.type = MTYPE_PTEXT;
s_graphicsoptions.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.back.generic.x = 20;
s_graphicsoptions.back.generic.y = 480 - 50;
s_graphicsoptions.back.generic.id = ID_BACK2;
s_graphicsoptions.back.generic.callback = GraphicsOptions_Event;
s_graphicsoptions.back.string = "< BACK";
s_graphicsoptions.back.color = text_color_normal;
s_graphicsoptions.back.style = UI_LEFT | UI_SMALLFONT;
s_graphicsoptions.apply.generic.type = MTYPE_PTEXT;
s_graphicsoptions.apply.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
s_graphicsoptions.apply.generic.x = 640 - 20;
s_graphicsoptions.apply.generic.y = 480 - 50;
s_graphicsoptions.apply.generic.callback = GraphicsOptions_ApplyChanges;
s_graphicsoptions.apply.string = "APPLY";
s_graphicsoptions.apply.color = text_color_normal;
s_graphicsoptions.apply.style = UI_RIGHT | UI_SMALLFONT;
// END
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.banner );
// STONELANCE
/*
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.framel );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.framer );
*/
// END
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.graphics );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.display );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.sound );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.network );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.list );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.driver );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.allow_extensions );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.ratio );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.mode );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.colordepth );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.fs );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.lighting );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.geometry );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.tq );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.texturebits );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.filter );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.driverinfo );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.back );
Menu_AddItem( &s_graphicsoptions.menu, ( void * ) &s_graphicsoptions.apply );
GraphicsOptions_SetMenuItems();
GraphicsOptions_GetInitialVideo();
if ( uis.glconfig.driverType == GLDRV_ICD &&
uis.glconfig.hardwareType == GLHW_3DFX_2D3D )
{
s_graphicsoptions.driver.generic.flags |= QMF_HIDDEN|QMF_INACTIVE;
}
}
/*
=================
GraphicsOptions_Cache
=================
*/
void GraphicsOptions_Cache( void ) {
// STONELANCE
/*
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_FRAMEL );
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_FRAMER );
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_BACK0 );
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_BACK1 );
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_ACCEPT0 );
trap_R_RegisterShaderNoMip( GRAPHICSOPTIONS_ACCEPT1 );
*/
// END
}
/*
=================
UI_GraphicsOptionsMenu
=================
*/
void UI_GraphicsOptionsMenu( void ) {
// STONELANCE FIXME: get rid of this after proper tansitions are added
uis.transitionIn = 0;
// END
GraphicsOptions_MenuInit();
UI_PushMenu( &s_graphicsoptions.menu );
Menu_SetCursorToItem( &s_graphicsoptions.menu, &s_graphicsoptions.graphics );
}