File: win32\vid_menu.c

    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 */
   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;
   38 static cvar_t *gl_finish;
   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;
   68 static menulist_s               s_finish_box;
   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 );
  139         Cvar_SetValue( "gl_finish", s_finish_box.curvalue );
  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]",
  223                 "[2048 1536]",
  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 );
  253         if ( !gl_finish )
  254                 gl_finish = Cvar_Get( "gl_finish", "0", CVAR_ARCHIVE );
  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 
  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 
  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 );
  387         Menu_AddItem( &s_opengl_menu, ( void * ) &s_finish_box );
  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 
  475