Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

vid_menu.c (12161B)


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