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