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