vid_menu.c 12 KB

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