mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 14:20:59 +00:00
495dd759f0
Viewport and FOV updates are now separate so updating one doesn't cause recalculations of the other. Also, perspective setup is now done directly from the tangents of the half angles for fov_x and fov_y making the renderers independent of fov/aspect mode. I imagine things are a bit of a mess with view size changes, and especially screen size changes (not supported yet anyway), and vulkan winds up updating its projection matrices every frame, but everything that's expected to work does (vulkan errors out for fisheye or warp due to frame buffer creation not being supported yet).
336 lines
11 KiB
C
336 lines
11 KiB
C
/*
|
|
r_cvar.c
|
|
|
|
renderer cvar definitions
|
|
|
|
Copyright (C) 2000 Bill Currie
|
|
Ragnvald Maartmann-Moe IV
|
|
|
|
Author: Bill Currie
|
|
Ragnvald Maartmann-Moe IV
|
|
Date: 2001/5/17
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to:
|
|
|
|
Free Software Foundation, Inc.
|
|
59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include "QF/cvar.h"
|
|
#include "QF/model.h"
|
|
#include "QF/qendian.h"
|
|
#include "QF/render.h"
|
|
|
|
#include "compat.h"
|
|
#include "r_internal.h"
|
|
|
|
cvar_t *cl_crossx;
|
|
cvar_t *cl_crossy;
|
|
cvar_t *cl_verstring;
|
|
cvar_t *crosshair;
|
|
cvar_t *crosshaircolor;
|
|
|
|
cvar_t *d_mipcap;
|
|
cvar_t *d_mipscale;
|
|
|
|
cvar_t *r_aliasstats;
|
|
cvar_t *r_aliastransadj;
|
|
cvar_t *r_aliastransbase;
|
|
cvar_t *r_clearcolor;
|
|
cvar_t *r_dlight_lightmap;
|
|
cvar_t *r_dlight_max;
|
|
cvar_t *r_drawentities;
|
|
cvar_t *r_drawexplosions;
|
|
cvar_t *r_drawviewmodel;
|
|
cvar_t *r_dspeeds;
|
|
cvar_t *r_dynamic;
|
|
cvar_t *r_explosionclip;
|
|
cvar_t *r_farclip;
|
|
cvar_t *r_firecolor;
|
|
cvar_t *r_flatlightstyles;
|
|
cvar_t *r_graphheight;
|
|
cvar_t *r_lightmap_components;
|
|
cvar_t *r_maxedges;
|
|
cvar_t *r_maxsurfs;
|
|
cvar_t *r_mirroralpha;
|
|
cvar_t *r_nearclip;
|
|
cvar_t *r_norefresh;
|
|
cvar_t *r_novis;
|
|
cvar_t *r_numedges;
|
|
cvar_t *r_numsurfs;
|
|
cvar_t *r_particles;
|
|
cvar_t *r_particles_max;
|
|
cvar_t *r_particles_nearclip;
|
|
cvar_t *r_reportedgeout;
|
|
cvar_t *r_reportsurfout;
|
|
cvar_t *r_shadows;
|
|
cvar_t *r_skyname;
|
|
cvar_t *r_speeds;
|
|
cvar_t *r_timegraph;
|
|
cvar_t *r_wateralpha;
|
|
cvar_t *r_waterripple;
|
|
cvar_t *r_waterwarp;
|
|
cvar_t *r_zgraph;
|
|
|
|
cvar_t *scr_fov;
|
|
cvar_t *scr_fisheye;
|
|
cvar_t *scr_fviews;
|
|
cvar_t *scr_ffov;
|
|
cvar_t *scr_showpause;
|
|
cvar_t *scr_showram;
|
|
cvar_t *scr_showturtle;
|
|
cvar_t *scr_viewsize;
|
|
|
|
int r_viewsize;
|
|
|
|
quat_t crosshair_color;
|
|
|
|
static void
|
|
crosshaircolor_update (void *_var, const viddef_t *vid)
|
|
{
|
|
cvar_t *var = _var;
|
|
byte *color;
|
|
color = &vid->palette32[bound (0, var->int_val, 255) * 4];
|
|
QuatScale (color, 1.0 / 255, crosshair_color);
|
|
}
|
|
|
|
static void
|
|
crosshaircolor_f (cvar_t *var)
|
|
{
|
|
if (!r_data->vid->palette32) {
|
|
// palette not initialized yet
|
|
return;
|
|
}
|
|
crosshaircolor_update (var, r_data->vid);
|
|
}
|
|
|
|
static void
|
|
r_lightmap_components_f (cvar_t *var)
|
|
{
|
|
switch (var->int_val) {
|
|
case 1:
|
|
mod_lightmap_bytes = 1;
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
default:
|
|
mod_lightmap_bytes = 3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
r_farclip_f (cvar_t *var)
|
|
{
|
|
Cvar_SetValue (r_farclip, bound (8.0, var->value, Q_MAXFLOAT));
|
|
if (r_particles_nearclip && r_nearclip)
|
|
Cvar_SetValue (r_particles_nearclip,
|
|
bound (r_nearclip->value, r_particles_nearclip->value,
|
|
r_farclip->value));
|
|
r_data->vid->recalc_refdef = true;
|
|
}
|
|
|
|
static void
|
|
r_nearclip_f (cvar_t *var)
|
|
{
|
|
Cvar_SetValue (r_nearclip, bound (0.01, var->value, 4.0));
|
|
if (r_particles_nearclip && r_farclip)
|
|
Cvar_SetValue (r_particles_nearclip,
|
|
bound (r_nearclip->value, r_particles_nearclip->value,
|
|
r_farclip->value));
|
|
r_data->vid->recalc_refdef = true;
|
|
}
|
|
|
|
static void
|
|
scr_fov_f (cvar_t *var)
|
|
{
|
|
// bound field of view
|
|
float fov = bound (0, var->value, 170);
|
|
|
|
if (fov != var->value) {
|
|
Cvar_SetValue (var, fov);
|
|
} else {
|
|
SCR_SetFOV (var->value);
|
|
}
|
|
}
|
|
|
|
static void
|
|
scr_fisheye_f (cvar_t *var)
|
|
{
|
|
if (var->int_val)
|
|
Cvar_Set (scr_fov, "90");
|
|
}
|
|
|
|
static void
|
|
scr_ffov_f (cvar_t *var)
|
|
{
|
|
if (var->value < 130)
|
|
Cvar_Set (scr_fviews, "3");
|
|
else if (var->value < 220)
|
|
Cvar_Set (scr_fviews, "5");
|
|
else
|
|
Cvar_Set (scr_fviews, "6");
|
|
}
|
|
|
|
static void
|
|
viewsize_f (cvar_t *var)
|
|
{
|
|
if (var->int_val < 30 || var->int_val > 120) {
|
|
Cvar_SetValue (var, bound (30, var->int_val, 120));
|
|
} else {
|
|
r_data->vid->recalc_refdef = true;
|
|
r_viewsize = bound (0, var->int_val, 100);
|
|
if (r_data->viewsize_callback)
|
|
r_data->viewsize_callback (var);
|
|
}
|
|
}
|
|
|
|
static void
|
|
r_dlight_max_f (cvar_t *var)
|
|
{
|
|
R_MaxDlightsCheck (var);
|
|
}
|
|
|
|
void
|
|
R_Init_Cvars (void)
|
|
{
|
|
cl_crossx = Cvar_Get ("cl_crossx", "0", CVAR_ARCHIVE, NULL,
|
|
"Sets the position of the crosshair on the X-axis.");
|
|
cl_crossy = Cvar_Get ("cl_crossy", "0", CVAR_ARCHIVE, NULL,
|
|
"Sets the position of the crosshair on the Y-axis.");
|
|
cl_verstring = Cvar_Get ("cl_verstring", PACKAGE_VERSION, CVAR_NONE,
|
|
NULL, "Client version string");
|
|
crosshair = Cvar_Get ("crosshair", "0", CVAR_ARCHIVE, NULL, "Crosshair "
|
|
"type. 0 off, 1 old white, 2 new with colors");
|
|
crosshaircolor = Cvar_Get ("crosshaircolor", "79", CVAR_ARCHIVE,
|
|
crosshaircolor_f, "Color of the new crosshair");
|
|
VID_OnPaletteChange_AddListener (crosshaircolor_update, crosshaircolor);
|
|
d_mipcap = Cvar_Get ("d_mipcap", "0", CVAR_NONE, NULL,
|
|
"Detail level. 0 is highest, 3 is lowest.");
|
|
d_mipscale = Cvar_Get ("d_mipscale", "1", CVAR_NONE, NULL, "Detail level "
|
|
"of objects. 0 is highest, 3 is lowest.");
|
|
r_aliasstats = Cvar_Get ("r_polymodelstats", "0", CVAR_NONE, NULL,
|
|
"Toggles the displays of number of polygon "
|
|
"models current being viewed");
|
|
r_aliastransadj = Cvar_Get ("r_aliastransadj", "100", CVAR_NONE, NULL,
|
|
"Determines how much of an alias model is "
|
|
"clipped away and how much is viewable.");
|
|
r_aliastransbase = Cvar_Get ("r_aliastransbase", "200", CVAR_NONE, NULL,
|
|
"Determines how much of an alias model is "
|
|
"clipped away and how much is viewable");
|
|
r_clearcolor = Cvar_Get ("r_clearcolor", "2", CVAR_NONE, NULL,
|
|
"This sets the color for areas outside of the "
|
|
"current map");
|
|
r_dlight_lightmap = Cvar_Get ("r_dlight_lightmap", "1", CVAR_ARCHIVE,
|
|
NULL, "Set to 1 for high quality dynamic "
|
|
"lighting.");
|
|
r_dlight_max = Cvar_Get ("r_dlight_max", "32", CVAR_ARCHIVE,
|
|
r_dlight_max_f, "Number of dynamic lights.");
|
|
r_drawentities = Cvar_Get ("r_drawentities", "1", CVAR_NONE, NULL,
|
|
"Toggles drawing of entities (almost "
|
|
"everything but the world)");
|
|
r_drawexplosions = Cvar_Get ("r_drawexplosions", "1", CVAR_ARCHIVE, NULL,
|
|
"Draw explosions.");
|
|
r_drawviewmodel = Cvar_Get ("r_drawviewmodel", "1", CVAR_ARCHIVE, NULL,
|
|
"Toggles view model drawing (your weapons)");
|
|
r_dspeeds = Cvar_Get ("r_dspeeds", "0", CVAR_NONE, NULL,
|
|
"Toggles the display of drawing speed information");
|
|
r_dynamic = Cvar_Get ("r_dynamic", "1", CVAR_NONE, NULL,
|
|
"Set to 0 to disable lightmap changes");
|
|
r_explosionclip = Cvar_Get ("r_explosionclip", "0", CVAR_ARCHIVE, NULL,
|
|
"Clip explosions.");
|
|
r_farclip = Cvar_Get ("r_farclip", "4096", CVAR_ARCHIVE, r_farclip_f,
|
|
"Distance of the far clipping plane from the "
|
|
"player.");
|
|
r_firecolor = Cvar_Get ("r_firecolor", "0.9 0.7 0.0", CVAR_ARCHIVE, NULL,
|
|
"color of rocket and lava ball fires");
|
|
r_flatlightstyles = Cvar_Get ("r_flatlightstyles", "0", CVAR_NONE, NULL,
|
|
"Disable animated lightmaps. 2 = use peak, "
|
|
"1 = use average, anything else = normal");
|
|
r_graphheight = Cvar_Get ("r_graphheight", "32", CVAR_NONE, NULL,
|
|
"Set the number of lines displayed in the "
|
|
"various graphs");
|
|
r_lightmap_components = Cvar_Get ("r_lightmap_components", "3", CVAR_ROM,
|
|
r_lightmap_components_f,
|
|
"Lightmap texture components. 1 "
|
|
"is greyscale, 3 is RGB, 4 is RGBA.");
|
|
r_maxedges = Cvar_Get ("r_maxedges", "0", CVAR_NONE, NULL,
|
|
"Sets the maximum number of edges");
|
|
r_maxsurfs = Cvar_Get ("r_maxsurfs", "0", CVAR_NONE, NULL,
|
|
"Sets the maximum number of surfaces");
|
|
r_mirroralpha = Cvar_Get ("r_mirroralpha", "1", CVAR_NONE, NULL, "None");
|
|
r_nearclip = Cvar_Get ("r_nearclip", "4", CVAR_ARCHIVE, r_nearclip_f,
|
|
"Distance of the near clipping plane from the "
|
|
"player.");
|
|
r_norefresh = Cvar_Get ("r_norefresh_", "0", CVAR_NONE, NULL,
|
|
"Set to 1 to disable display refresh");
|
|
r_novis = Cvar_Get ("r_novis", "0", CVAR_NONE, NULL, "Set to 1 to enable "
|
|
"runtime visibility checking (SLOW)");
|
|
r_numedges = Cvar_Get ("r_numedges", "0", CVAR_NONE, NULL,
|
|
"Toggles the displaying of number of edges "
|
|
"currently being viewed");
|
|
r_numsurfs = Cvar_Get ("r_numsurfs", "0", CVAR_NONE, NULL,
|
|
"Toggles the displaying of number of surfaces "
|
|
"currently being viewed");
|
|
r_reportedgeout = Cvar_Get ("r_reportedgeout", "0", CVAR_NONE, NULL,
|
|
"Toggle the display of how many edges were "
|
|
"not displayed");
|
|
r_reportsurfout = Cvar_Get ("r_reportsurfout", "0", CVAR_NONE, NULL,
|
|
"Toggle the display of how many surfaces "
|
|
"were not displayed");
|
|
r_shadows = Cvar_Get ("r_shadows", "0", CVAR_ARCHIVE, NULL,
|
|
"Set to 1 to enable shadows for entities");
|
|
r_skyname = Cvar_Get ("r_skyname", "none", CVAR_NONE, NULL,
|
|
"name of the current skybox");
|
|
r_speeds = Cvar_Get ("r_speeds", "0", CVAR_NONE, NULL, "Display drawing "
|
|
"time and statistics of what is being viewed");
|
|
r_timegraph = Cvar_Get ("r_timegraph", "0", CVAR_NONE, NULL,
|
|
"Toggle the display of a performance graph");
|
|
r_wateralpha = Cvar_Get ("r_wateralpha", "1", CVAR_ARCHIVE, NULL,
|
|
"Determine the opacity of liquids. 1 = opaque, "
|
|
"0 = transparent, otherwise translucent.");
|
|
r_waterripple = Cvar_Get ("r_waterripple", "0", CVAR_NONE, NULL,
|
|
"Set to make liquids ripple, try setting to 5");
|
|
r_waterwarp = Cvar_Get ("r_waterwarp", "1", CVAR_NONE, NULL,
|
|
"Toggles whether surfaces are warped in liquid.");
|
|
r_zgraph = Cvar_Get ("r_zgraph", "0", CVAR_NONE, NULL,
|
|
"Toggle the graph that reports the changes of "
|
|
"z-axis position");
|
|
scr_fov = Cvar_Get ("fov", "90", CVAR_NONE, scr_fov_f,
|
|
"Your field of view in degrees. Smaller than 90 zooms "
|
|
"in. Don't touch in fisheye mode, use ffov instead.");
|
|
scr_fisheye = Cvar_Get ("fisheye", "0", CVAR_NONE, scr_fisheye_f,
|
|
"Toggles fisheye mode.");
|
|
scr_fviews = Cvar_Get ("fviews", "6", CVAR_NONE, NULL, "The number of "
|
|
"fisheye views.");
|
|
scr_ffov = Cvar_Get ("ffov", "180", CVAR_NONE, scr_ffov_f, "Your field of "
|
|
"view in degrees in fisheye mode.");
|
|
scr_showpause = Cvar_Get ("showpause", "1", CVAR_NONE, NULL,
|
|
"Toggles display of pause graphic");
|
|
scr_showram = Cvar_Get ("showram", "1", CVAR_NONE, NULL,
|
|
"Show RAM icon if game is running low on memory");
|
|
scr_showturtle = Cvar_Get ("showturtle", "0", CVAR_NONE, NULL,
|
|
"Show a turtle icon if your fps is below 10");
|
|
scr_viewsize = Cvar_Get ("viewsize", "100", CVAR_ARCHIVE, viewsize_f,
|
|
"Set the screen size 30 minimum, 120 maximum");
|
|
|
|
r_data->graphheight = r_graphheight;
|
|
r_data->scr_viewsize = scr_viewsize;
|
|
}
|