Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

vid_menu.c (11851B)


      1 #include "../client/client.h"
      2 #include "../client/qmenu.h"
      3 
      4 #define REF_SOFT	0
      5 #define REF_OPENGL	1
      6 
      7 extern cvar_t *vid_ref;
      8 extern cvar_t *vid_fullscreen;
      9 extern cvar_t *vid_gamma;
     10 extern cvar_t *scr_viewsize;
     11 
     12 static cvar_t *gl_mode;
     13 static cvar_t *gl_driver;
     14 static cvar_t *gl_picmip;
     15 static cvar_t *gl_ext_palettedtexture;
     16 
     17 static cvar_t *sw_mode;
     18 static cvar_t *sw_stipplealpha;
     19 
     20 static cvar_t *_windowed_mouse;
     21 
     22 extern void M_ForceMenuOff( void );
     23 
     24 /*
     25 ====================================================================
     26 
     27 MENU INTERACTION
     28 
     29 ====================================================================
     30 */
     31 #define SOFTWARE_MENU 0
     32 #define OPENGL_MENU   1
     33 
     34 static menuframework_s  s_software_menu;
     35 static menuframework_s	s_opengl_menu;
     36 static menuframework_s *s_current_menu;
     37 static int				s_current_menu_index;
     38 
     39 static menulist_s		s_mode_list[2];
     40 static menulist_s		s_ref_list[2];
     41 static menuslider_s		s_tq_slider;
     42 static menuslider_s		s_screensize_slider[2];
     43 static menuslider_s		s_brightness_slider[2];
     44 static menulist_s  		s_fs_box[2];
     45 static menulist_s  		s_stipple_box;
     46 static menulist_s  		s_paletted_texture_box;
     47 static menulist_s  		s_windowed_mouse;
     48 static menuaction_s		s_apply_action[2];
     49 static menuaction_s		s_defaults_action[2];
     50 
     51 static void DriverCallback( void *unused )
     52 {
     53 	s_ref_list[!s_current_menu_index].curvalue = s_ref_list[s_current_menu_index].curvalue;
     54 
     55 	if ( s_ref_list[s_current_menu_index].curvalue < 1 )
     56 	{
     57 		s_current_menu = &s_software_menu;
     58 		s_current_menu_index = 0;
     59 	}
     60 	else
     61 	{
     62 		s_current_menu = &s_opengl_menu;
     63 		s_current_menu_index = 1;
     64 	}
     65 
     66 }
     67 
     68 static void ScreenSizeCallback( void *s )
     69 {
     70 	menuslider_s *slider = ( menuslider_s * ) s;
     71 
     72 	Cvar_SetValue( "viewsize", slider->curvalue * 10 );
     73 }
     74 
     75 static void BrightnessCallback( void *s )
     76 {
     77 	menuslider_s *slider = ( menuslider_s * ) s;
     78 
     79 	if ( s_current_menu_index == 0)
     80 		s_brightness_slider[1].curvalue = s_brightness_slider[0].curvalue;
     81 	else
     82 		s_brightness_slider[0].curvalue = s_brightness_slider[1].curvalue;
     83 
     84 	if ( Q_stricmp( vid_ref->string, "soft" ) == 0 )
     85 	{
     86 		float gamma = ( 0.8 - ( slider->curvalue/10.0 - 0.5 ) ) + 0.5;
     87 
     88 		Cvar_SetValue( "vid_gamma", gamma );
     89 	}
     90 }
     91 
     92 static void ResetDefaults( void *unused )
     93 {
     94 	VID_MenuInit();
     95 }
     96 
     97 static void ApplyChanges( void *unused )
     98 {
     99 	float gamma;
    100 
    101 	/*
    102 	** make values consistent
    103 	*/
    104 	s_fs_box[!s_current_menu_index].curvalue = s_fs_box[s_current_menu_index].curvalue;
    105 	s_brightness_slider[!s_current_menu_index].curvalue = s_brightness_slider[s_current_menu_index].curvalue;
    106 	s_ref_list[!s_current_menu_index].curvalue = s_ref_list[s_current_menu_index].curvalue;
    107 
    108 	/*
    109 	** invert sense so greater = brighter, and scale to a range of 0.5 to 1.3
    110 	*/
    111 	gamma = ( 0.8 - ( s_brightness_slider[s_current_menu_index].curvalue/10.0 - 0.5 ) ) + 0.5;
    112 
    113 	Cvar_SetValue( "vid_gamma", gamma );
    114 	Cvar_SetValue( "sw_stipplealpha", s_stipple_box.curvalue );
    115 	Cvar_SetValue( "gl_picmip", 3 - s_tq_slider.curvalue );
    116 	Cvar_SetValue( "vid_fullscreen", s_fs_box[s_current_menu_index].curvalue );
    117 	Cvar_SetValue( "gl_ext_palettedtexture", s_paletted_texture_box.curvalue );
    118 	Cvar_SetValue( "sw_mode", s_mode_list[SOFTWARE_MENU].curvalue );
    119 	Cvar_SetValue( "gl_mode", s_mode_list[OPENGL_MENU].curvalue );
    120 	Cvar_SetValue( "_windowed_mouse", s_windowed_mouse.curvalue);
    121 
    122 	switch ( s_ref_list[s_current_menu_index].curvalue )
    123 	{
    124 	case REF_SOFT:
    125 		Cvar_Set( "vid_ref", "soft" );
    126 		break;
    127 	case REF_OPENGL:
    128 		Cvar_Set( "vid_ref", "gl" );
    129 		Cvar_Set( "gl_driver", "opengl32" );
    130 		break;
    131 	}
    132 
    133 #if 0
    134 	/*
    135 	** update appropriate stuff if we're running OpenGL and gamma
    136 	** has been modified
    137 	*/
    138 	if ( Q_stricmp( vid_ref->string, "gl" ) == 0 )
    139 	{
    140 		if ( vid_gamma->modified )
    141 		{
    142 			vid_ref->modified = true;
    143 			if ( Q_stricmp( gl_driver->string, "3dfxgl" ) == 0 )
    144 			{
    145 				char envbuffer[1024];
    146 				float g;
    147 
    148 				vid_ref->modified = true;
    149 
    150 				g = 2.00 * ( 0.8 - ( vid_gamma->value - 0.5 ) ) + 1.0F;
    151 				Com_sprintf( envbuffer, sizeof(envbuffer), "SST_GAMMA=%f", g );
    152 				putenv( envbuffer );
    153 
    154 				vid_gamma->modified = false;
    155 			}
    156 		}
    157 	}
    158 #endif
    159 
    160 	M_ForceMenuOff();
    161 }
    162 
    163 /*
    164 ** VID_MenuInit
    165 */
    166 void VID_MenuInit( void )
    167 {
    168 	static const char *resolutions[] = 
    169 	{
    170 		"[320 240  ]",
    171 		"[400 300  ]",
    172 		"[512 384  ]",
    173 		"[640 480  ]",
    174 		"[800 600  ]",
    175 		"[960 720  ]",
    176 		"[1024 768 ]",
    177 		"[1152 864 ]",
    178 		"[1280 1024]",
    179 		"[1600 1200]",
    180 		0
    181 	};
    182 	static const char *refs[] =
    183 	{
    184 		"[software      ]",
    185 		"[default OpenGL]",
    186 		0
    187 	};
    188 	static const char *yesno_names[] =
    189 	{
    190 		"no",
    191 		"yes",
    192 		0
    193 	};
    194 	int i;
    195 
    196 	if ( !gl_driver )
    197 		gl_driver = Cvar_Get( "gl_driver", "opengl32", 0 );
    198 	if ( !gl_picmip )
    199 		gl_picmip = Cvar_Get( "gl_picmip", "0", 0 );
    200 	if ( !gl_mode )
    201 		gl_mode = Cvar_Get( "gl_mode", "3", 0 );
    202 	if ( !sw_mode )
    203 		sw_mode = Cvar_Get( "sw_mode", "0", 0 );
    204 	if ( !gl_ext_palettedtexture )
    205 		gl_ext_palettedtexture = Cvar_Get( "gl_ext_palettedtexture", "1", CVAR_ARCHIVE );
    206 
    207 	if ( !sw_stipplealpha )
    208 		sw_stipplealpha = Cvar_Get( "sw_stipplealpha", "0", CVAR_ARCHIVE );
    209 
    210 	if ( !_windowed_mouse)
    211         _windowed_mouse = Cvar_Get( "_windowed_mouse", "0", CVAR_ARCHIVE );
    212 
    213 	s_mode_list[SOFTWARE_MENU].curvalue = sw_mode->value;
    214 	s_mode_list[OPENGL_MENU].curvalue = gl_mode->value;
    215 
    216 	if ( !scr_viewsize )
    217 		scr_viewsize = Cvar_Get ("viewsize", "100", CVAR_ARCHIVE);
    218 
    219 	s_screensize_slider[SOFTWARE_MENU].curvalue = scr_viewsize->value/10;
    220 	s_screensize_slider[OPENGL_MENU].curvalue = scr_viewsize->value/10;
    221 
    222 	if (strcmp( vid_ref->string, "soft" ) == 0 ) 
    223 	{
    224 		s_current_menu_index = SOFTWARE_MENU;
    225 		s_ref_list[0].curvalue = s_ref_list[1].curvalue = REF_SOFT;
    226 	}
    227 	else if ( strcmp( vid_ref->string, "gl" ) == 0 )
    228 	{
    229 		s_current_menu_index = OPENGL_MENU;
    230 		s_ref_list[s_current_menu_index].curvalue = REF_OPENGL;
    231 #if 0
    232 		if ( strcmp( gl_driver->string, "3dfxgl" ) == 0 )
    233 			s_ref_list[s_current_menu_index].curvalue = REF_3DFX;
    234 		else if ( strcmp( gl_driver->string, "pvrgl" ) == 0 )
    235 			s_ref_list[s_current_menu_index].curvalue = REF_POWERVR;
    236 		else if ( strcmp( gl_driver->string, "opengl32" ) == 0 )
    237 			s_ref_list[s_current_menu_index].curvalue = REF_OPENGL;
    238 		else
    239 			s_ref_list[s_current_menu_index].curvalue = REF_VERITE;
    240 #endif
    241 	}
    242 
    243 	s_software_menu.x = viddef.width * 0.50;
    244 	s_software_menu.nitems = 0;
    245 	s_opengl_menu.x = viddef.width * 0.50;
    246 	s_opengl_menu.nitems = 0;
    247 
    248 	for ( i = 0; i < 2; i++ )
    249 	{
    250 		s_ref_list[i].generic.type = MTYPE_SPINCONTROL;
    251 		s_ref_list[i].generic.name = "driver";
    252 		s_ref_list[i].generic.x = 0;
    253 		s_ref_list[i].generic.y = 0;
    254 		s_ref_list[i].generic.callback = DriverCallback;
    255 		s_ref_list[i].itemnames = refs;
    256 
    257 		s_mode_list[i].generic.type = MTYPE_SPINCONTROL;
    258 		s_mode_list[i].generic.name = "video mode";
    259 		s_mode_list[i].generic.x = 0;
    260 		s_mode_list[i].generic.y = 10;
    261 		s_mode_list[i].itemnames = resolutions;
    262 
    263 		s_screensize_slider[i].generic.type	= MTYPE_SLIDER;
    264 		s_screensize_slider[i].generic.x		= 0;
    265 		s_screensize_slider[i].generic.y		= 20;
    266 		s_screensize_slider[i].generic.name	= "screen size";
    267 		s_screensize_slider[i].minvalue = 3;
    268 		s_screensize_slider[i].maxvalue = 12;
    269 		s_screensize_slider[i].generic.callback = ScreenSizeCallback;
    270 
    271 		s_brightness_slider[i].generic.type	= MTYPE_SLIDER;
    272 		s_brightness_slider[i].generic.x	= 0;
    273 		s_brightness_slider[i].generic.y	= 30;
    274 		s_brightness_slider[i].generic.name	= "brightness";
    275 		s_brightness_slider[i].generic.callback = BrightnessCallback;
    276 		s_brightness_slider[i].minvalue = 5;
    277 		s_brightness_slider[i].maxvalue = 13;
    278 		s_brightness_slider[i].curvalue = ( 1.3 - vid_gamma->value + 0.5 ) * 10;
    279 
    280 		s_fs_box[i].generic.type = MTYPE_SPINCONTROL;
    281 		s_fs_box[i].generic.x	= 0;
    282 		s_fs_box[i].generic.y	= 40;
    283 		s_fs_box[i].generic.name	= "fullscreen";
    284 		s_fs_box[i].itemnames = yesno_names;
    285 		s_fs_box[i].curvalue = vid_fullscreen->value;
    286 
    287 		s_defaults_action[i].generic.type = MTYPE_ACTION;
    288 		s_defaults_action[i].generic.name = "reset to default";
    289 		s_defaults_action[i].generic.x    = 0;
    290 		s_defaults_action[i].generic.y    = 90;
    291 		s_defaults_action[i].generic.callback = ResetDefaults;
    292 
    293 		s_apply_action[i].generic.type = MTYPE_ACTION;
    294 		s_apply_action[i].generic.name = "apply";
    295 		s_apply_action[i].generic.x    = 0;
    296 		s_apply_action[i].generic.y    = 100;
    297 		s_apply_action[i].generic.callback = ApplyChanges;
    298 	}
    299 
    300 	s_stipple_box.generic.type = MTYPE_SPINCONTROL;
    301 	s_stipple_box.generic.x	= 0;
    302 	s_stipple_box.generic.y	= 60;
    303 	s_stipple_box.generic.name	= "stipple alpha";
    304 	s_stipple_box.curvalue = sw_stipplealpha->value;
    305 	s_stipple_box.itemnames = yesno_names;
    306 
    307 	s_windowed_mouse.generic.type = MTYPE_SPINCONTROL;
    308 	s_windowed_mouse.generic.x  = 0;
    309 	s_windowed_mouse.generic.y  = 72;
    310 	s_windowed_mouse.generic.name   = "windowed mouse";
    311 	s_windowed_mouse.curvalue = _windowed_mouse->value;
    312 	s_windowed_mouse.itemnames = yesno_names;
    313 
    314 	s_tq_slider.generic.type	= MTYPE_SLIDER;
    315 	s_tq_slider.generic.x		= 0;
    316 	s_tq_slider.generic.y		= 60;
    317 	s_tq_slider.generic.name	= "texture quality";
    318 	s_tq_slider.minvalue = 0;
    319 	s_tq_slider.maxvalue = 3;
    320 	s_tq_slider.curvalue = 3-gl_picmip->value;
    321 
    322 	s_paletted_texture_box.generic.type = MTYPE_SPINCONTROL;
    323 	s_paletted_texture_box.generic.x	= 0;
    324 	s_paletted_texture_box.generic.y	= 70;
    325 	s_paletted_texture_box.generic.name	= "8-bit textures";
    326 	s_paletted_texture_box.itemnames = yesno_names;
    327 	s_paletted_texture_box.curvalue = gl_ext_palettedtexture->value;
    328 
    329 	Menu_AddItem( &s_software_menu, ( void * ) &s_ref_list[SOFTWARE_MENU] );
    330 	Menu_AddItem( &s_software_menu, ( void * ) &s_mode_list[SOFTWARE_MENU] );
    331 	Menu_AddItem( &s_software_menu, ( void * ) &s_screensize_slider[SOFTWARE_MENU] );
    332 	Menu_AddItem( &s_software_menu, ( void * ) &s_brightness_slider[SOFTWARE_MENU] );
    333 	Menu_AddItem( &s_software_menu, ( void * ) &s_fs_box[SOFTWARE_MENU] );
    334 	Menu_AddItem( &s_software_menu, ( void * ) &s_stipple_box );
    335 	Menu_AddItem( &s_software_menu, ( void * ) &s_windowed_mouse );
    336 
    337 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_ref_list[OPENGL_MENU] );
    338 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_mode_list[OPENGL_MENU] );
    339 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_screensize_slider[OPENGL_MENU] );
    340 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_brightness_slider[OPENGL_MENU] );
    341 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_fs_box[OPENGL_MENU] );
    342 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_tq_slider );
    343 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_paletted_texture_box );
    344 
    345 	Menu_AddItem( &s_software_menu, ( void * ) &s_defaults_action[SOFTWARE_MENU] );
    346 	Menu_AddItem( &s_software_menu, ( void * ) &s_apply_action[SOFTWARE_MENU] );
    347 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_defaults_action[OPENGL_MENU] );
    348 	Menu_AddItem( &s_opengl_menu, ( void * ) &s_apply_action[OPENGL_MENU] );
    349 
    350 	Menu_Center( &s_software_menu );
    351 	Menu_Center( &s_opengl_menu );
    352 	s_opengl_menu.x -= 8;
    353 	s_software_menu.x -= 8;
    354 }
    355 
    356 /*
    357 ================
    358 VID_MenuDraw
    359 ================
    360 */
    361 void VID_MenuDraw (void)
    362 {
    363 	int w, h;
    364 
    365 	if ( s_current_menu_index == 0 )
    366 		s_current_menu = &s_software_menu;
    367 	else
    368 		s_current_menu = &s_opengl_menu;
    369 
    370 	/*
    371 	** draw the banner
    372 	*/
    373 	re.DrawGetPicSize( &w, &h, "m_banner_video" );
    374 	re.DrawPic( viddef.width / 2 - w / 2, viddef.height /2 - 110, "m_banner_video" );
    375 
    376 	/*
    377 	** move cursor to a reasonable starting position
    378 	*/
    379 	Menu_AdjustCursor( s_current_menu, 1 );
    380 
    381 	/*
    382 	** draw the menu
    383 	*/
    384 	Menu_Draw( s_current_menu );
    385 }
    386 
    387 /*
    388 ================
    389 VID_MenuKey
    390 ================
    391 */
    392 const char *VID_MenuKey( int key )
    393 {
    394 	extern void M_PopMenu( void );
    395 
    396 	menuframework_s *m = s_current_menu;
    397 	static const char *sound = "misc/menu1.wav";
    398 
    399 	switch ( key )
    400 	{
    401 	case K_ESCAPE:
    402 		M_PopMenu();
    403 		return NULL;
    404 	case K_UPARROW:
    405 		m->cursor--;
    406 		Menu_AdjustCursor( m, -1 );
    407 		break;
    408 	case K_DOWNARROW:
    409 		m->cursor++;
    410 		Menu_AdjustCursor( m, 1 );
    411 		break;
    412 	case K_LEFTARROW:
    413 		Menu_SlideItem( m, -1 );
    414 		break;
    415 	case K_RIGHTARROW:
    416 		Menu_SlideItem( m, 1 );
    417 		break;
    418 	case K_ENTER:
    419 		Menu_SelectItem( m );
    420 		break;
    421 	}
    422 
    423 	return sound;
    424 }
    425 
    426