quakec/source/menu/menu_vide.qc
2024-10-15 21:38:47 -07:00

295 lines
No EOL
8.4 KiB
C++

string menu_video_buttons[12] = {"vm_resol", "vm_fulls", "vm_shfps", "vm_maxps", "vm_vsync", "vm_fov", "vm_gamma", "vm_uwide", "vm_parts", "vm_filtr", "vm_apply", "vm_back"};
float menu_video_init;
float menu_video_modes;
float current_selected_vidmode;
float current_fullscreen;
float current_showfps;
float current_vsync;
float current_ultrawide;
float current_particles;
float current_filter;
#define MAX_VIDEO_MODES 128 // FIXME: arbitrary.
var struct
{
vector size;
vector ratio;
} video_modes[MAX_VIDEO_MODES];
float(float a, float b) Menu_Video_GCD =
{
if (b == 0)
return a;
else
return Menu_Video_GCD(b, a % b);
};
vector(vector resolution) Menu_Video_CalculateAspectRatio =
{
vector ratio;
if (resolution_x == resolution_y) {
ratio_x = 1;
ratio_y = 1;
return ratio;
}
float tempf = 0;
float width = resolution_x;
float height = resolution_y;
if (width < height) {
tempf = width;
width = height;
height = tempf;
}
float divisor = Menu_Video_GCD(width, height);
if (!tempf) {
ratio_x = rint(width / divisor);
ratio_y = rint(height / divisor);
} else {
ratio_x = rint(height / divisor);
ratio_y = rint(width / divisor);
}
return ratio;
};
void() Menu_Video_PrepareVideoModes =
{
for (float i = 0; i < MAX_VIDEO_MODES; i++)
{
vector driver_query = getresolution(i);
if (!driver_query_x || !driver_query_y)
break;
video_modes[i].size = driver_query;
video_modes[i].ratio = Menu_Video_CalculateAspectRatio(driver_query);
menu_video_modes = i;
}
};
void() Menu_Video_StoreCurrentSettings =
{
current_fullscreen = cvar("vid_fullscreen");
current_showfps = cvar("show_fps");
current_vsync = cvar("vid_vsync");
current_ultrawide = cvar("vid_ultrawide_limiter");
current_particles = cvar("nzp_particles");
current_filter = (substring(strtoupper(cvar_string("gl_texturemode")), 0, 10) == "GL_NEAREST");
}
void() Menu_Video_Init =
{
Menu_Video_PrepareVideoModes();
Menu_Video_StoreCurrentSettings();
menu_video_init = true;
};
void() Menu_Video_UpdateParticles =
{
Menu_PlaySound(MENU_SND_ENTER);
current_particles = !current_particles;
cvar_set("nzp_particles", ftos(current_particles));
};
void() Menu_Video_UpdateUltrawide =
{
Menu_PlaySound(MENU_SND_ENTER);
current_ultrawide = !current_ultrawide;
cvar_set("vid_ultrawide_limiter", ftos(current_ultrawide));
};
void() Menu_Video_UpdateVideoMode =
{
Menu_PlaySound(MENU_SND_ENTER);
current_selected_vidmode++;
};
void() Menu_Video_ApplySettings =
{
Menu_PlaySound(MENU_SND_ENTER);
localcmd(sprintf("vid_width %d\nvid_height %d\nvid_fullscreen %d\nvid_restart\nsaveconfig user_settings.cfg\n",
video_modes[current_selected_vidmode].size[0], video_modes[current_selected_vidmode].size[1],
current_fullscreen));
music_duration_time = 0;
};
void() Menu_Video_UpdateFullscreen =
{
Menu_PlaySound(MENU_SND_ENTER);
current_fullscreen++;
if (current_fullscreen > 2) current_fullscreen = 0;
};
void() Menu_Video_UpdateShowFPS =
{
Menu_PlaySound(MENU_SND_ENTER);
current_showfps++;
if (current_showfps > 2) current_showfps = 0;
localcmd(sprintf("show_fps %d", current_showfps));
};
void() Menu_Video_UpdateVsync =
{
Menu_PlaySound(MENU_SND_ENTER);
current_vsync = !current_vsync;
cvar_set("vid_vsync", ftos(current_vsync));
};
void() Menu_Video_UpdateFiltering =
{
Menu_PlaySound(MENU_SND_ENTER);
float is_filter = (substring(strtoupper(cvar_string("gl_texturemode")), 0, 10) == "GL_NEAREST");
if (is_filter) {
cvar_set("gl_texturemode", "GL_LINEAR_MIPMAP_LINEAR");
current_filter = 0;
} else {
cvar_set("gl_texturemode", "GL_NEAREST_MIPMAP_LINEAR");
current_filter = 1;
}
};
string(string prev_id) Menu_Video_GetNextButton =
{
if (prev_id == "")
return menu_video_buttons[0];
string ret = menu_video_buttons[0];
for(float i = 0; i < menu_video_buttons.length; i++) {
if (menu_video_buttons[i] == prev_id) {
if (i + 1 >= menu_video_buttons.length)
break;
ret = menu_video_buttons[i + 1];
break;
}
}
if (cvar("vid_vsync") && ret == "vm_maxps")
ret = "vm_vsync";
return ret;
};
string(string next_id) Menu_Video_GetPreviousButton =
{
if (next_id == "")
return menu_video_buttons[menu_video_buttons.length - 1];
string ret = menu_video_buttons[menu_video_buttons.length - 1];
for(float i = menu_video_buttons.length - 1; i > 0; i--) {
if (menu_video_buttons[i] == next_id) {
if (i - 1 < 0)
break;
ret = menu_video_buttons[i - 1];
break;
}
}
if (cvar("vid_vsync") && ret == "vm_maxps")
ret = "vm_shfps";
return ret;
};
void() Menu_Video =
{
if (!menu_video_init)
Menu_Video_Init();
Menu_DrawBackground();
Menu_DrawTitle("VIDEO OPTIONS");
Menu_DrawMapPanel();
// Resolution
Menu_Button(1, "vm_resol", "RESOLUTION", "Window size adjustment.") ? Menu_Video_UpdateVideoMode() : 0;
if (current_selected_vidmode > menu_video_modes) current_selected_vidmode = 0;
string resolution_string = sprintf("%dx%d (%d:%d)", video_modes[current_selected_vidmode].size[0],
video_modes[current_selected_vidmode].size[1], video_modes[current_selected_vidmode].ratio[0],
video_modes[current_selected_vidmode].ratio[1]);
Menu_DrawOptionValue(1, resolution_string);
// Fullscreen
Menu_Button(2, "vm_fulls", "FULLSCREEN", "Change Fullscreen Mode.") ? Menu_Video_UpdateFullscreen() : 0;
string fullscreen_string = "";
switch(current_fullscreen) {
case 0: fullscreen_string = "DISABLED"; break;
case 1: fullscreen_string = "ENABLED"; break;
case 2: fullscreen_string = "BORDERLESS"; break;
default: break;
}
Menu_DrawOptionValue(2, fullscreen_string);
// Show FPS
Menu_Button(3, "vm_shfps", "SHOW FPS", "Toggles display of FPS Values.") ? Menu_Video_UpdateShowFPS() : 0;
string showfps_string = "";
switch(current_showfps) {
case 0: showfps_string = "DISABLED"; break;
case 1: showfps_string = "ENABLED"; break;
case 2: showfps_string = "VERBOSE"; break;
default: break;
}
Menu_DrawOptionValue(3, showfps_string);
// Max FPS
if (cvar("vid_vsync") == 0) {
Menu_Button(4, "vm_maxps", "MAX FPS", "Configure Maximum FPS Value.") ? 0 : 0;
Menu_CvarSlider(4, [10, 500, 490], "cl_maxfps", true, false);
} else {
Menu_GreyButton(4, "[VSYNC ON] MAX FPS");
}
// VSync
Menu_Button(5, "vm_vsync", "VSYNC", "Sync Framerate with Display.") ? Menu_Video_UpdateVsync() : 0;
string vsync_string = "";
if (current_vsync) vsync_string = "ENABLED";
else vsync_string = "DISABLED";
Menu_DrawOptionValue(5, vsync_string);
// Field of View
Menu_Button(6, "vm_fov", "FIELD OF VIEW", "Change Camera Field of View.") ? 0 : 0;
Menu_CvarSlider(6, [10, 200, 190], "fov", true, false);
// Gamma
Menu_Button(7, "vm_gamma", "GAMMA", "Adjust game Black Level.") ? 0 : 0;
Menu_CvarSlider(7, [0.3, 2, 17], "gamma", false, true);
// Ultrawide Mode
Menu_Button(8, "vm_uwide", "ULTRAWIDE MODE", "Condenses HUD closer to center of Display.") ? Menu_Video_UpdateUltrawide() : 0;
string wide_string = "";
if (current_ultrawide) wide_string = "ENABLED";
else wide_string = "DISABLED";
Menu_DrawOptionValue(8, wide_string);
// Particles
Menu_Button(9, "vm_parts", "PARTICLES", "Toggle Particle Effects for Performance.") ? Menu_Video_UpdateParticles() : 0;
string part_string = "";
if (current_particles) part_string = "ENABLED";
else part_string = "DISABLED";
Menu_DrawOptionValue(9, part_string);
// Texture Filtering
Menu_Button(10, "vm_filtr", "TEXTURE FILTERING", "Choose 3D Environment Filtering Mode.") ? Menu_Video_UpdateFiltering() : 0;
string filt_string = "";
if (current_filter) filt_string = "NEAREST";
else filt_string = "LINEAR";
Menu_DrawOptionValue(10, filt_string);
Menu_DrawDivider(12.25);
Menu_Button(-2, "vm_apply", "APPLY", "Save & Apply Settings.") ? Menu_Video_ApplySettings() : 0;
Menu_Button(-1, "vm_back", "BACK", "Return to Configuration Menu.") ? current_menu = MENU_OPTIONS : 0;
sui_pop_frame();
};