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