2001-04-15 04:18:22 +00:00
|
|
|
/*
|
|
|
|
vid_common_gl.c
|
|
|
|
|
|
|
|
Common OpenGL video driver functions
|
|
|
|
|
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
|
|
|
Copyright (C) 2000 Marcus Sundberg [mackan@stacken.kth.se]
|
|
|
|
|
|
|
|
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
|
2012-05-21 23:23:22 +00:00
|
|
|
|
2001-04-15 04:18:22 +00:00
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
2003-01-15 15:31:36 +00:00
|
|
|
|
2001-06-24 09:25:55 +00:00
|
|
|
#ifdef HAVE_MATH_H
|
|
|
|
# include <math.h>
|
|
|
|
#endif
|
2001-04-15 04:18:22 +00:00
|
|
|
#ifdef HAVE_STRING_H
|
|
|
|
# include <string.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_STRINGS_H
|
|
|
|
# include <strings.h>
|
|
|
|
#endif
|
|
|
|
|
2001-05-31 03:41:35 +00:00
|
|
|
#include "QF/cvar.h"
|
2001-04-15 04:18:22 +00:00
|
|
|
#include "QF/qargs.h"
|
2002-08-27 07:16:28 +00:00
|
|
|
#include "QF/quakefs.h"
|
2001-09-09 19:37:07 +00:00
|
|
|
#include "QF/sys.h"
|
2004-01-26 00:13:47 +00:00
|
|
|
#include "QF/va.h"
|
2001-04-15 08:04:15 +00:00
|
|
|
#include "QF/vid.h"
|
2001-09-09 19:37:07 +00:00
|
|
|
#include "QF/GL/defines.h"
|
2001-06-25 06:17:07 +00:00
|
|
|
#include "QF/GL/extensions.h"
|
2001-06-24 09:25:55 +00:00
|
|
|
#include "QF/GL/funcs.h"
|
2022-03-06 23:38:38 +00:00
|
|
|
#include "QF/GL/qf_rmain.h"
|
2022-05-10 15:27:55 +00:00
|
|
|
#include "QF/GL/qf_textures.h"
|
2003-01-06 18:28:13 +00:00
|
|
|
#include "QF/GL/qf_vid.h"
|
2001-05-31 03:41:35 +00:00
|
|
|
|
2001-09-09 19:37:07 +00:00
|
|
|
#include "compat.h"
|
2003-01-06 18:28:13 +00:00
|
|
|
#include "d_iface.h"
|
2012-02-17 07:13:56 +00:00
|
|
|
#include "r_internal.h"
|
2001-04-15 04:18:22 +00:00
|
|
|
|
|
|
|
#define WARP_WIDTH 320
|
|
|
|
#define WARP_HEIGHT 200
|
|
|
|
|
2012-02-22 07:32:34 +00:00
|
|
|
unsigned char gl_15to8table[65536];
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2012-02-18 13:28:42 +00:00
|
|
|
QF_glActiveTexture qglActiveTexture = NULL;
|
|
|
|
QF_glMultiTexCoord2f qglMultiTexCoord2f = NULL;
|
|
|
|
QF_glMultiTexCoord2fv qglMultiTexCoord2fv = NULL;
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2012-02-18 13:28:42 +00:00
|
|
|
const char *gl_extensions;
|
|
|
|
const char *gl_renderer;
|
|
|
|
const char *gl_vendor;
|
|
|
|
const char *gl_version;
|
2001-04-15 21:11:41 +00:00
|
|
|
|
2012-02-18 13:28:42 +00:00
|
|
|
int gl_major;
|
|
|
|
int gl_minor;
|
|
|
|
int gl_release_number;
|
2003-03-20 19:58:18 +00:00
|
|
|
|
2004-02-27 20:40:26 +00:00
|
|
|
static int gl_bgra_capable;
|
2012-02-22 02:09:09 +00:00
|
|
|
int gl_use_bgra;
|
2012-02-18 13:28:42 +00:00
|
|
|
int gl_va_capable;
|
2011-12-15 00:29:57 +00:00
|
|
|
static int driver_vaelements;
|
2012-02-18 13:28:42 +00:00
|
|
|
int vaelements;
|
|
|
|
int gl_filter_min = GL_LINEAR_MIPMAP_LINEAR;
|
|
|
|
int gl_filter_max = GL_LINEAR;
|
|
|
|
float gldepthmin, gldepthmax;
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2004-02-24 20:50:55 +00:00
|
|
|
// Multitexture
|
2023-06-13 09:06:11 +00:00
|
|
|
bool gl_mtex_capable = false;
|
2004-02-27 20:40:26 +00:00
|
|
|
static int gl_mtex_tmus = 0;
|
2012-02-18 13:28:42 +00:00
|
|
|
GLenum gl_mtex_enum;
|
|
|
|
int gl_mtex_active_tmus = 0;
|
2023-06-13 09:06:11 +00:00
|
|
|
bool gl_mtex_fullbright = false;
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2004-02-24 20:50:55 +00:00
|
|
|
// Combine
|
2023-06-13 09:06:11 +00:00
|
|
|
bool gl_combine_capable = false;
|
2012-02-18 13:28:42 +00:00
|
|
|
int lm_src_blend, lm_dest_blend;
|
2012-02-22 02:09:09 +00:00
|
|
|
float gl_rgb_scale = 1.0;
|
2004-02-15 00:02:04 +00:00
|
|
|
|
2012-02-18 13:28:42 +00:00
|
|
|
QF_glColorTableEXT qglColorTableEXT = NULL;
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2023-06-13 09:06:11 +00:00
|
|
|
bool gl_feature_mach64 = false;
|
2003-02-06 21:47:33 +00:00
|
|
|
|
2005-01-02 14:23:20 +00:00
|
|
|
// GL_EXT_texture_filter_anisotropic
|
2023-06-13 09:06:11 +00:00
|
|
|
bool gl_Anisotropy;
|
2005-01-02 14:23:20 +00:00
|
|
|
static float aniso_max;
|
2012-02-18 13:28:42 +00:00
|
|
|
float gl_aniso;
|
2005-01-02 14:23:20 +00:00
|
|
|
|
|
|
|
// GL_ATI_pn_triangles
|
2023-06-13 09:06:11 +00:00
|
|
|
static bool TruForm;
|
2004-03-10 08:14:38 +00:00
|
|
|
static int tess_max;
|
2012-02-22 02:09:09 +00:00
|
|
|
int gl_tess;
|
2004-03-10 08:14:38 +00:00
|
|
|
|
|
|
|
// GL_LIGHT
|
2012-02-18 13:28:42 +00:00
|
|
|
int gl_max_lights;
|
|
|
|
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
float gl_anisotropy;
|
|
|
|
static cvar_t gl_anisotropy_cvar = {
|
|
|
|
.name = "gl_anisotropy",
|
|
|
|
.description = 0,
|
|
|
|
.default_value = "1.0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_float, .value = &gl_anisotropy },
|
|
|
|
};
|
|
|
|
int gl_fb_bmodels;
|
|
|
|
static cvar_t gl_fb_bmodels_cvar = {
|
|
|
|
.name = "gl_fb_bmodels",
|
|
|
|
.description =
|
|
|
|
"Toggles fullbright color support for bmodels",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_fb_bmodels },
|
|
|
|
};
|
|
|
|
int gl_finish;
|
|
|
|
static cvar_t gl_finish_cvar = {
|
|
|
|
.name = "gl_finish",
|
|
|
|
.description =
|
|
|
|
"wait for rendering to finish",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_finish },
|
|
|
|
};
|
|
|
|
int gl_max_size;
|
|
|
|
static cvar_t gl_max_size_cvar = {
|
|
|
|
.name = "gl_max_size",
|
|
|
|
.description =
|
|
|
|
"Texture dimension",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_max_size },
|
|
|
|
};
|
|
|
|
int gl_multitexture;
|
|
|
|
static cvar_t gl_multitexture_cvar = {
|
|
|
|
.name = "gl_multitexture",
|
|
|
|
.description =
|
|
|
|
"Use multitexture when available.",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_multitexture },
|
|
|
|
};
|
|
|
|
int gl_tessellate;
|
|
|
|
static cvar_t gl_tessellate_cvar = {
|
|
|
|
.name = "gl_tessellate",
|
|
|
|
.description = 0,
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_tessellate },
|
|
|
|
};
|
|
|
|
int gl_textures_bgra;
|
|
|
|
static cvar_t gl_textures_bgra_cvar = {
|
|
|
|
.name = "gl_textures_bgra",
|
|
|
|
.description =
|
|
|
|
"If set to 1, try to use BGR & BGRA textures instead of RGB & RGBA.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ROM,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_textures_bgra },
|
|
|
|
};
|
|
|
|
int gl_vaelements_max;
|
|
|
|
static cvar_t gl_vaelements_max_cvar = {
|
|
|
|
.name = "gl_vaelements_max",
|
|
|
|
.description =
|
|
|
|
"Limit the vertex array size for buggy drivers. 0 (default) uses "
|
|
|
|
"driver provided limit, -1 disables use of vertex arrays.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ROM,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_vaelements_max },
|
|
|
|
};
|
|
|
|
int gl_vector_light;
|
|
|
|
static cvar_t gl_vector_light_cvar = {
|
|
|
|
.name = "gl_vector_light",
|
|
|
|
.description =
|
|
|
|
"Enable use of GL vector lighting. 0 = flat lighting.",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_vector_light },
|
|
|
|
};
|
|
|
|
int gl_screenshot_byte_swap;
|
|
|
|
static cvar_t gl_screenshot_byte_swap_cvar = {
|
|
|
|
.name = "gl_screenshot_byte_swap",
|
|
|
|
.description =
|
|
|
|
"Swap the bytes for gl screenshots. Needed if you get screenshots with"
|
|
|
|
" red and blue swapped.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_screenshot_byte_swap },
|
|
|
|
};
|
|
|
|
|
|
|
|
int gl_affinemodels;
|
|
|
|
static cvar_t gl_affinemodels_cvar = {
|
|
|
|
.name = "gl_affinemodels",
|
|
|
|
.description =
|
|
|
|
"Makes texture rendering quality better if set to 1",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_affinemodels },
|
|
|
|
};
|
|
|
|
int gl_clear;
|
|
|
|
static cvar_t gl_clear_cvar = {
|
|
|
|
.name = "gl_clear",
|
|
|
|
.description =
|
|
|
|
"Set to 1 to make background black. Useful for removing HOM effect",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_clear },
|
|
|
|
};
|
|
|
|
float gl_conspin;
|
|
|
|
static cvar_t gl_conspin_cvar = {
|
|
|
|
.name = "gl_conspin",
|
|
|
|
.description =
|
|
|
|
"speed at which the console spins",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_float, .value = &gl_conspin },
|
|
|
|
};
|
|
|
|
int gl_constretch;
|
|
|
|
static cvar_t gl_constretch_cvar = {
|
|
|
|
.name = "gl_constretch",
|
|
|
|
.description =
|
|
|
|
"toggle console between slide and stretch",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_constretch },
|
|
|
|
};
|
|
|
|
int gl_dlight_polyblend;
|
|
|
|
static cvar_t gl_dlight_polyblend_cvar = {
|
|
|
|
.name = "gl_dlight_polyblend",
|
|
|
|
.description =
|
|
|
|
"Set to 1 to use a dynamic light effect faster on GL",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_dlight_polyblend },
|
|
|
|
};
|
|
|
|
int gl_dlight_smooth;
|
|
|
|
static cvar_t gl_dlight_smooth_cvar = {
|
|
|
|
.name = "gl_dlight_smooth",
|
|
|
|
.description =
|
|
|
|
"Smooth dynamic vertex lighting",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_dlight_smooth },
|
|
|
|
};
|
|
|
|
int gl_fb_models;
|
|
|
|
static cvar_t gl_fb_models_cvar = {
|
|
|
|
.name = "gl_fb_models",
|
|
|
|
.description =
|
|
|
|
"Toggles fullbright color support for models",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_fb_models },
|
|
|
|
};
|
|
|
|
int gl_keeptjunctions;
|
|
|
|
static cvar_t gl_keeptjunctions_cvar = {
|
|
|
|
.name = "gl_keeptjunctions",
|
|
|
|
.description =
|
|
|
|
"Set to 0 to turn off colinear vertexes upon level load.",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_keeptjunctions },
|
|
|
|
};
|
|
|
|
int gl_lerp_anim;
|
|
|
|
static cvar_t gl_lerp_anim_cvar = {
|
|
|
|
.name = "gl_lerp_anim",
|
|
|
|
.description =
|
|
|
|
"Toggles model animation interpolation",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_lerp_anim },
|
|
|
|
};
|
|
|
|
int gl_lightmap_align;
|
|
|
|
static cvar_t gl_lightmap_align_cvar = {
|
|
|
|
.name = "gl_lightmap_align",
|
|
|
|
.description =
|
|
|
|
"Workaround for nvidia slow path. Set to 4 or 16 if you have an nvidia"
|
|
|
|
" 3d accelerator, set to 1 otherwise.",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_lightmap_align },
|
|
|
|
};
|
|
|
|
int gl_lightmap_subimage;
|
|
|
|
static cvar_t gl_lightmap_subimage_cvar = {
|
|
|
|
.name = "gl_lightmap_subimage",
|
|
|
|
.description =
|
|
|
|
"Lightmap Update method. Default 2 updates a minimum 'dirty rectangle'"
|
|
|
|
" around the area changed. 1 updates every line that changed. 0 "
|
|
|
|
"updates the entire lightmap.",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_lightmap_subimage },
|
|
|
|
};
|
|
|
|
int gl_nocolors;
|
|
|
|
static cvar_t gl_nocolors_cvar = {
|
|
|
|
.name = "gl_nocolors",
|
|
|
|
.description =
|
|
|
|
"Set to 1, turns off all player colors",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_nocolors },
|
|
|
|
};
|
|
|
|
int gl_overbright;
|
|
|
|
static cvar_t gl_overbright_cvar = {
|
|
|
|
.name = "gl_overbright",
|
|
|
|
.description =
|
|
|
|
"Darken lightmaps so that dynamic lights can be overbright. 1 = 0.75 "
|
|
|
|
"brightness, 2 = 0.5 brightness.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_overbright },
|
|
|
|
};
|
|
|
|
int gl_particle_mip;
|
|
|
|
static cvar_t gl_particle_mip_cvar = {
|
|
|
|
.name = "gl_particle_mip",
|
|
|
|
.description =
|
|
|
|
"Toggles particle texture mipmapping.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_particle_mip },
|
|
|
|
};
|
|
|
|
int gl_particle_size;
|
|
|
|
static cvar_t gl_particle_size_cvar = {
|
|
|
|
.name = "gl_particle_size",
|
|
|
|
.description =
|
|
|
|
"Vertical and horizontal size of particle textures as a power of 2. "
|
|
|
|
"Default is 5 (32 texel square).",
|
|
|
|
.default_value = "5",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_particle_size },
|
|
|
|
};
|
|
|
|
int gl_picmip;
|
|
|
|
static cvar_t gl_picmip_cvar = {
|
|
|
|
.name = "gl_picmip",
|
|
|
|
.description =
|
|
|
|
"Dimensions of textures. 0 is normal, 1 is half, 2 is 1/4",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_picmip },
|
|
|
|
};
|
|
|
|
int gl_playermip;
|
|
|
|
static cvar_t gl_playermip_cvar = {
|
|
|
|
.name = "gl_playermip",
|
|
|
|
.description =
|
|
|
|
"Detail of player skins. 0 best, 4 worst.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_playermip },
|
|
|
|
};
|
|
|
|
int gl_reporttjunctions;
|
|
|
|
static cvar_t gl_reporttjunctions_cvar = {
|
|
|
|
.name = "gl_reporttjunctions",
|
|
|
|
.description =
|
|
|
|
"None",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_reporttjunctions },
|
|
|
|
};
|
|
|
|
int gl_sky_clip;
|
|
|
|
static cvar_t gl_sky_clip_cvar = {
|
|
|
|
.name = "gl_sky_clip",
|
|
|
|
.description =
|
|
|
|
"controls amount of sky overdraw",
|
|
|
|
.default_value = "2",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_sky_clip },
|
|
|
|
};
|
|
|
|
int gl_sky_debug;
|
|
|
|
static cvar_t gl_sky_debug_cvar = {
|
|
|
|
.name = "gl_sky_debug",
|
|
|
|
.description =
|
|
|
|
"debugging `info' for sky clipping",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_sky_debug },
|
|
|
|
};
|
|
|
|
int gl_sky_divide;
|
|
|
|
static cvar_t gl_sky_divide_cvar = {
|
|
|
|
.name = "gl_sky_divide",
|
|
|
|
.description =
|
|
|
|
"subdivide sky polys",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_sky_divide },
|
|
|
|
};
|
|
|
|
int gl_sky_multipass;
|
|
|
|
static cvar_t gl_sky_multipass_cvar = {
|
|
|
|
.name = "gl_sky_multipass",
|
|
|
|
.description =
|
|
|
|
"controls whether the skydome is single or double pass",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_sky_multipass },
|
|
|
|
};
|
|
|
|
int gl_texsort;
|
|
|
|
static cvar_t gl_texsort_cvar = {
|
|
|
|
.name = "gl_texsort",
|
|
|
|
.description =
|
|
|
|
"None",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_NONE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_texsort },
|
|
|
|
};
|
|
|
|
int gl_triplebuffer;
|
|
|
|
static cvar_t gl_triplebuffer_cvar = {
|
|
|
|
.name = "gl_triplebuffer",
|
|
|
|
.description =
|
|
|
|
"Set to 1 by default. Fixes status bar flicker on some hardware",
|
|
|
|
.default_value = "1",
|
|
|
|
.flags = CVAR_ARCHIVE,
|
|
|
|
.value = { .type = &cexpr_int, .value = &gl_triplebuffer },
|
|
|
|
};
|
|
|
|
static int vid_use8bit;
|
|
|
|
static cvar_t vid_use8bit_cvar = {
|
|
|
|
.name = "vid_use8bit",
|
|
|
|
.description =
|
|
|
|
"Use 8-bit shared palettes.",
|
|
|
|
.default_value = "0",
|
|
|
|
.flags = CVAR_ROM,
|
|
|
|
.value = { .type = &cexpr_int, .value = &vid_use8bit },
|
|
|
|
};
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2022-03-06 23:38:38 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_triplebuffer_f (void *data, const cvar_t *cvar)
|
2022-03-06 23:38:38 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
vid.numpages = gl_triplebuffer ? 3 : 2;
|
2022-03-06 23:38:38 +00:00
|
|
|
}
|
2004-02-15 00:02:04 +00:00
|
|
|
|
2003-03-24 20:21:24 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_max_size_f (void *data, const cvar_t *cvar)
|
2003-03-24 20:21:24 +00:00
|
|
|
{
|
|
|
|
GLint texSize;
|
|
|
|
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (!cvar)
|
2004-02-27 20:40:26 +00:00
|
|
|
return;
|
|
|
|
|
2003-03-24 20:21:24 +00:00
|
|
|
// Check driver's max texture size
|
|
|
|
qfglGetIntegerv (GL_MAX_TEXTURE_SIZE, &texSize);
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_max_size < 1) {
|
|
|
|
gl_max_size = texSize;
|
2004-02-27 20:40:26 +00:00
|
|
|
} else {
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_max_size = bound (1, gl_max_size, texSize);
|
2004-02-27 20:40:26 +00:00
|
|
|
}
|
2003-03-24 20:21:24 +00:00
|
|
|
}
|
|
|
|
|
2004-02-24 20:50:55 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_textures_bgra_f (void *data, const cvar_t *cvar)
|
2004-02-24 20:50:55 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (!cvar)
|
2004-02-24 20:50:55 +00:00
|
|
|
return;
|
|
|
|
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_textures_bgra && gl_bgra_capable) {
|
2012-02-22 02:09:09 +00:00
|
|
|
gl_use_bgra = 1;
|
2004-02-24 20:50:55 +00:00
|
|
|
} else {
|
2012-02-22 02:09:09 +00:00
|
|
|
gl_use_bgra = 0;
|
2004-02-24 20:50:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_fb_bmodels_f (void *data, const cvar_t *cvar)
|
2004-02-24 20:50:55 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (!cvar)
|
2004-02-24 20:50:55 +00:00
|
|
|
return;
|
2004-02-27 20:40:26 +00:00
|
|
|
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_fb_bmodels && gl_mtex_tmus >= 3) {
|
2004-02-24 20:50:55 +00:00
|
|
|
gl_mtex_fullbright = true;
|
|
|
|
} else {
|
|
|
|
gl_mtex_fullbright = false;
|
|
|
|
}
|
2004-02-22 06:00:15 +00:00
|
|
|
}
|
|
|
|
|
2012-02-18 13:28:42 +00:00
|
|
|
void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_multitexture_f (void *data, const cvar_t *cvar)
|
2001-09-23 03:24:23 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_multitexture && gl_mtex_capable) {
|
2004-02-24 20:50:55 +00:00
|
|
|
gl_mtex_active_tmus = gl_mtex_tmus;
|
|
|
|
|
|
|
|
if (gl_fb_bmodels) {
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_fb_bmodels) {
|
2004-02-24 20:50:55 +00:00
|
|
|
if (gl_mtex_tmus >= 3) {
|
|
|
|
gl_mtex_fullbright = true;
|
2004-03-07 23:51:29 +00:00
|
|
|
|
|
|
|
qglActiveTexture (gl_mtex_enum + 2);
|
|
|
|
qfglEnable (GL_TEXTURE_2D);
|
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
|
|
|
|
GL_DECAL);
|
|
|
|
qfglDisable (GL_TEXTURE_2D);
|
2004-02-24 20:50:55 +00:00
|
|
|
} else {
|
|
|
|
gl_mtex_fullbright = false;
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2012-05-21 23:23:22 +00:00
|
|
|
"Not enough TMUs for BSP fullbrights.\n");
|
2004-02-24 20:50:55 +00:00
|
|
|
}
|
|
|
|
}
|
2004-02-14 05:10:29 +00:00
|
|
|
} else {
|
|
|
|
gl_mtex_fullbright = false;
|
|
|
|
}
|
2004-03-07 23:51:29 +00:00
|
|
|
|
|
|
|
// Lightmaps
|
|
|
|
qglActiveTexture (gl_mtex_enum + 1);
|
|
|
|
qfglEnable (GL_TEXTURE_2D);
|
|
|
|
if (gl_overbright) {
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_combine_capable && gl_overbright) {
|
2004-03-07 23:51:29 +00:00
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
|
2012-02-22 02:09:09 +00:00
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_RGB_SCALE, gl_rgb_scale);
|
2004-03-07 23:51:29 +00:00
|
|
|
} else {
|
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
|
|
}
|
|
|
|
qfglDisable (GL_TEXTURE_2D);
|
|
|
|
|
|
|
|
// Base Texture
|
|
|
|
qglActiveTexture (gl_mtex_enum + 0);
|
2004-02-14 05:10:29 +00:00
|
|
|
} else {
|
2004-02-24 20:50:55 +00:00
|
|
|
gl_mtex_active_tmus = 0;
|
2004-02-14 05:10:29 +00:00
|
|
|
gl_mtex_fullbright = false;
|
|
|
|
}
|
2001-09-23 03:24:23 +00:00
|
|
|
}
|
|
|
|
|
2001-10-22 19:46:34 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_screenshot_byte_swap_f (void *data, const cvar_t *cvar)
|
2001-10-22 19:46:34 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (cvar)
|
2003-03-20 19:58:18 +00:00
|
|
|
qfglPixelStorei (GL_PACK_SWAP_BYTES,
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_screenshot_byte_swap ? GL_TRUE : GL_FALSE);
|
2001-10-22 19:46:34 +00:00
|
|
|
}
|
|
|
|
|
2005-01-02 14:23:20 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_anisotropy_f (void *data, const cvar_t *var)
|
2005-01-02 14:23:20 +00:00
|
|
|
{
|
2012-02-17 09:33:07 +00:00
|
|
|
if (gl_Anisotropy) {
|
2005-01-02 14:23:20 +00:00
|
|
|
if (var)
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_aniso = (bound (1.0, gl_anisotropy, aniso_max));
|
2005-01-02 14:23:20 +00:00
|
|
|
else
|
2012-02-17 09:33:07 +00:00
|
|
|
gl_aniso = 1.0;
|
2005-01-02 14:23:20 +00:00
|
|
|
} else {
|
2012-02-17 09:33:07 +00:00
|
|
|
gl_aniso = 1.0;
|
2005-01-02 14:23:20 +00:00
|
|
|
if (var)
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2010-11-23 05:09:30 +00:00
|
|
|
"Anisotropy (GL_EXT_texture_filter_anisotropic) "
|
|
|
|
"is not supported by your hardware and/or "
|
|
|
|
"drivers.\n");
|
2005-01-02 14:23:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-01-26 00:13:47 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_tessellate_f (void *data, const cvar_t *var)
|
2004-01-26 00:13:47 +00:00
|
|
|
{
|
|
|
|
if (TruForm) {
|
|
|
|
if (var)
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_tess = (bound (0, gl_tessellate, tess_max));
|
2004-02-24 20:50:55 +00:00
|
|
|
else
|
2012-02-22 02:09:09 +00:00
|
|
|
gl_tess = 0;
|
|
|
|
qfglPNTrianglesiATI (GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI, gl_tess);
|
2004-01-26 00:13:47 +00:00
|
|
|
} else {
|
2012-02-22 02:09:09 +00:00
|
|
|
gl_tess = 0;
|
2004-01-26 03:58:19 +00:00
|
|
|
if (var)
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2010-11-23 05:09:30 +00:00
|
|
|
"TruForm (GL_ATI_pn_triangles) is not supported "
|
|
|
|
"by your hardware and/or drivers.\n");
|
2004-01-26 00:13:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-15 00:29:57 +00:00
|
|
|
static void
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
gl_vaelements_max_f (void *data, const cvar_t *cvar)
|
2011-12-15 00:29:57 +00:00
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (gl_vaelements_max)
|
|
|
|
vaelements = min (gl_vaelements_max, driver_vaelements);
|
2011-12-15 00:29:57 +00:00
|
|
|
else
|
|
|
|
vaelements = driver_vaelements;
|
|
|
|
}
|
|
|
|
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
static void
|
|
|
|
gl_sky_divide_f (void *data, const cvar_t *cvar)
|
|
|
|
{
|
|
|
|
mod_sky_divide = gl_sky_divide;
|
|
|
|
}
|
|
|
|
|
2003-01-06 18:28:13 +00:00
|
|
|
static void
|
2001-04-15 04:18:22 +00:00
|
|
|
GL_Common_Init_Cvars (void)
|
|
|
|
{
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
Cvar_Register (&vid_use8bit_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_textures_bgra_cvar, gl_textures_bgra_f, 0);
|
|
|
|
Cvar_Register (&gl_fb_bmodels_cvar, gl_fb_bmodels_f, 0);
|
|
|
|
Cvar_Register (&gl_finish_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_max_size_cvar, gl_max_size_f, 0);
|
|
|
|
Cvar_Register (&gl_multitexture_cvar, gl_multitexture_f, 0);
|
|
|
|
Cvar_Register (&gl_screenshot_byte_swap_cvar, gl_screenshot_byte_swap_f, 0);
|
|
|
|
Cvar_Register (&gl_anisotropy_cvar, gl_anisotropy_f, 0);
|
|
|
|
gl_anisotropy_cvar.description = nva (
|
|
|
|
"Specifies degree of anisotropy, from 1.0 to %f. Higher anisotropy "
|
|
|
|
"means less distortion of textures at shallow angles to the viewer.",
|
|
|
|
aniso_max);
|
|
|
|
Cvar_Register (&gl_tessellate_cvar, gl_tessellate_f, 0);
|
|
|
|
gl_tessellate_cvar.description = nva (
|
|
|
|
"Specifies tessellation level from 0 to %i. Higher tessellation level "
|
|
|
|
"means more triangles.",
|
|
|
|
tess_max);
|
|
|
|
Cvar_Register (&gl_vaelements_max_cvar, gl_vaelements_max_f, 0);
|
|
|
|
Cvar_Register (&gl_vector_light_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_affinemodels_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_clear_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_conspin_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_constretch_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_dlight_polyblend_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_dlight_smooth_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_fb_models_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_keeptjunctions_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_lerp_anim_cvar, 0, 0);
|
|
|
|
|
|
|
|
Cvar_Register (&gl_lightmap_align_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_lightmap_subimage_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_nocolors_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_overbright_cvar, gl_overbright_f, 0);
|
|
|
|
Cvar_Register (&gl_particle_mip_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_particle_size_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_picmip_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_playermip_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_reporttjunctions_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_sky_clip_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_sky_debug_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_sky_divide_cvar, gl_sky_divide_f, 0);
|
|
|
|
Cvar_Register (&gl_sky_multipass_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_texsort_cvar, 0, 0);
|
|
|
|
Cvar_Register (&gl_triplebuffer_cvar, gl_triplebuffer_f, 0);
|
|
|
|
|
|
|
|
Cvar_AddListener (&gl_overbright_cvar, gl_multitexture_f, 0);
|
2001-04-15 04:18:22 +00:00
|
|
|
}
|
|
|
|
|
2004-02-22 06:00:15 +00:00
|
|
|
static void
|
|
|
|
CheckGLVersionString (void)
|
|
|
|
{
|
2005-06-08 06:35:48 +00:00
|
|
|
gl_version = (char *) qfglGetString (GL_VERSION);
|
2004-02-22 06:00:15 +00:00
|
|
|
if (sscanf (gl_version, "%d.%d", &gl_major, &gl_minor) == 2) {
|
|
|
|
gl_release_number = 0;
|
|
|
|
if (gl_major >= 1) {
|
|
|
|
if (gl_minor >= 1) {
|
|
|
|
gl_va_capable = true;
|
2004-02-24 20:50:55 +00:00
|
|
|
} else {
|
2004-02-22 06:00:15 +00:00
|
|
|
gl_va_capable = false;
|
2004-02-24 20:50:55 +00:00
|
|
|
}
|
2004-02-22 06:00:15 +00:00
|
|
|
}
|
|
|
|
} else if (sscanf (gl_version, "%d.%d.%d", &gl_major, &gl_minor,
|
|
|
|
&gl_release_number) == 3) {
|
|
|
|
if (gl_major >= 1) {
|
|
|
|
if (gl_minor >= 1) {
|
|
|
|
gl_va_capable = true;
|
2004-02-24 20:50:55 +00:00
|
|
|
} else {
|
2004-02-22 06:00:15 +00:00
|
|
|
gl_va_capable = false;
|
2004-02-24 20:50:55 +00:00
|
|
|
}
|
2004-02-22 06:00:15 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Sys_Error ("Malformed OpenGL version string!");
|
|
|
|
}
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "GL_VERSION: %s\n", gl_version);
|
2004-02-22 06:00:15 +00:00
|
|
|
|
2005-06-08 06:35:48 +00:00
|
|
|
gl_vendor = (char *) qfglGetString (GL_VENDOR);
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "GL_VENDOR: %s\n", gl_vendor);
|
2005-06-08 06:35:48 +00:00
|
|
|
gl_renderer = (char *) qfglGetString (GL_RENDERER);
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "GL_RENDERER: %s\n", gl_renderer);
|
2005-06-08 06:35:48 +00:00
|
|
|
gl_extensions = (char *) qfglGetString (GL_EXTENSIONS);
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "GL_EXTENSIONS: %s\n", gl_extensions);
|
2004-02-22 06:00:15 +00:00
|
|
|
|
|
|
|
if (strstr (gl_renderer, "Mesa DRI Mach64"))
|
|
|
|
gl_feature_mach64 = true;
|
|
|
|
}
|
|
|
|
|
2005-01-02 14:23:20 +00:00
|
|
|
static void
|
|
|
|
CheckAnisotropyExtensions (void)
|
|
|
|
{
|
|
|
|
if (QFGL_ExtensionPresent ("GL_EXT_texture_filter_anisotropic")) {
|
2012-02-17 09:33:07 +00:00
|
|
|
gl_Anisotropy = true;
|
2005-01-02 14:23:20 +00:00
|
|
|
qfglGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &aniso_max);
|
|
|
|
} else {
|
2012-02-17 09:33:07 +00:00
|
|
|
gl_Anisotropy = false;
|
2005-01-02 14:23:20 +00:00
|
|
|
aniso_max = 1.0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-02-24 20:50:55 +00:00
|
|
|
static void
|
|
|
|
CheckBGRAExtensions (void)
|
|
|
|
{
|
2012-02-01 04:01:24 +00:00
|
|
|
if (gl_major > 1 || (gl_major == 1 && gl_minor >= 3)) {
|
2004-02-24 20:50:55 +00:00
|
|
|
gl_bgra_capable = true;
|
|
|
|
} else if (QFGL_ExtensionPresent ("GL_EXT_bgra")) {
|
|
|
|
gl_bgra_capable = true;
|
|
|
|
} else {
|
|
|
|
gl_bgra_capable = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-02-15 00:02:04 +00:00
|
|
|
static void
|
|
|
|
CheckCombineExtensions (void)
|
|
|
|
{
|
2004-02-24 20:50:55 +00:00
|
|
|
if (gl_major >= 1 && gl_minor >= 3) {
|
|
|
|
gl_combine_capable = true;
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "COMBINE active, multitextured doublebright "
|
2010-11-23 05:09:30 +00:00
|
|
|
"enabled.\n");
|
2004-02-24 20:50:55 +00:00
|
|
|
} else if (QFGL_ExtensionPresent ("GL_ARB_texture_env_combine")) {
|
2004-02-15 00:02:04 +00:00
|
|
|
gl_combine_capable = true;
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "COMBINE_ARB active, multitextured "
|
2010-11-23 05:09:30 +00:00
|
|
|
"doublebright enabled.\n");
|
2004-02-15 00:02:04 +00:00
|
|
|
} else {
|
2004-02-24 20:50:55 +00:00
|
|
|
gl_combine_capable = false;
|
2004-02-15 00:02:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-04-15 04:18:22 +00:00
|
|
|
/*
|
|
|
|
CheckMultiTextureExtensions
|
|
|
|
|
|
|
|
Check for ARB multitexture support
|
|
|
|
*/
|
2003-01-06 18:28:13 +00:00
|
|
|
static void
|
2001-04-15 04:18:22 +00:00
|
|
|
CheckMultiTextureExtensions (void)
|
|
|
|
{
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Checking for multitexture: ");
|
2001-04-15 04:18:22 +00:00
|
|
|
if (COM_CheckParm ("-nomtex")) {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "disabled.\n");
|
2001-04-15 04:18:22 +00:00
|
|
|
return;
|
|
|
|
}
|
2004-02-24 20:50:55 +00:00
|
|
|
if (gl_major >= 1 && gl_minor >= 3) {
|
|
|
|
qfglGetIntegerv (GL_MAX_TEXTURE_UNITS, &gl_mtex_tmus);
|
|
|
|
if (gl_mtex_tmus >= 2) {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "enabled, %d TMUs.\n", gl_mtex_tmus);
|
2004-02-24 20:50:55 +00:00
|
|
|
qglMultiTexCoord2f =
|
|
|
|
QFGL_ExtensionAddress ("glMultiTexCoord2f");
|
|
|
|
qglMultiTexCoord2fv =
|
|
|
|
QFGL_ExtensionAddress ("glMultiTexCoord2fv");
|
|
|
|
qglActiveTexture = QFGL_ExtensionAddress ("glActiveTexture");
|
|
|
|
gl_mtex_enum = GL_TEXTURE0;
|
|
|
|
if (qglMultiTexCoord2f && gl_mtex_enum)
|
|
|
|
gl_mtex_capable = true;
|
|
|
|
else
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Multitexture disabled, could not "
|
2010-11-23 05:09:30 +00:00
|
|
|
"find required functions\n");
|
2004-02-24 20:50:55 +00:00
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2010-11-23 05:09:30 +00:00
|
|
|
"Multitexture disabled, not enough TMUs.\n");
|
2004-02-24 20:50:55 +00:00
|
|
|
}
|
|
|
|
} else if (QFGL_ExtensionPresent ("GL_ARB_multitexture")) {
|
2004-02-14 05:10:29 +00:00
|
|
|
qfglGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &gl_mtex_tmus);
|
|
|
|
if (gl_mtex_tmus >= 2) {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "enabled, %d TMUs.\n", gl_mtex_tmus);
|
2004-01-26 00:13:47 +00:00
|
|
|
qglMultiTexCoord2f =
|
|
|
|
QFGL_ExtensionAddress ("glMultiTexCoord2fARB");
|
|
|
|
qglMultiTexCoord2fv =
|
|
|
|
QFGL_ExtensionAddress ("glMultiTexCoord2fvARB");
|
2001-04-15 04:18:22 +00:00
|
|
|
qglActiveTexture = QFGL_ExtensionAddress ("glActiveTextureARB");
|
|
|
|
gl_mtex_enum = GL_TEXTURE0_ARB;
|
2001-09-23 03:18:58 +00:00
|
|
|
if (qglMultiTexCoord2f && gl_mtex_enum)
|
|
|
|
gl_mtex_capable = true;
|
|
|
|
else
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Multitexture disabled, could not "
|
2010-11-23 05:09:30 +00:00
|
|
|
"find required functions\n");
|
2001-04-15 04:18:22 +00:00
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2010-11-23 05:09:30 +00:00
|
|
|
"Multitexture disabled, not enough TMUs.\n");
|
2001-04-15 04:18:22 +00:00
|
|
|
}
|
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "not found.\n");
|
2001-04-15 04:18:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-01-26 00:13:47 +00:00
|
|
|
static void
|
|
|
|
CheckTruFormExtensions (void)
|
|
|
|
{
|
|
|
|
if (QFGL_ExtensionPresent ("GL_ATI_pn_triangles")) {
|
|
|
|
TruForm = true;
|
|
|
|
qfglGetIntegerv (GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI,
|
|
|
|
&tess_max);
|
|
|
|
qfglPNTrianglesiATI (GL_PN_TRIANGLES_NORMAL_MODE_ATI,
|
2004-01-26 03:58:19 +00:00
|
|
|
GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI);
|
2004-01-26 00:13:47 +00:00
|
|
|
qfglPNTrianglesiATI (GL_PN_TRIANGLES_POINT_MODE_ATI,
|
|
|
|
GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI);
|
|
|
|
} else {
|
|
|
|
TruForm = false;
|
2012-02-22 02:09:09 +00:00
|
|
|
gl_tess = 0;
|
2004-01-26 00:13:47 +00:00
|
|
|
tess_max = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-01-06 18:28:13 +00:00
|
|
|
static void
|
2001-12-19 04:03:57 +00:00
|
|
|
CheckVertexArraySize (void)
|
|
|
|
{
|
2011-12-15 00:29:57 +00:00
|
|
|
qfglGetIntegerv (GL_MAX_ELEMENTS_VERTICES, &driver_vaelements);
|
|
|
|
if (driver_vaelements > 65536)
|
|
|
|
driver_vaelements = 65536;
|
|
|
|
vaelements = driver_vaelements;
|
2001-12-19 04:03:57 +00:00
|
|
|
// qfglGetIntegerv (MAX_ELEMENTS_INDICES, *vaindices);
|
|
|
|
}
|
|
|
|
|
2004-03-10 08:14:38 +00:00
|
|
|
static void
|
|
|
|
CheckLights (void)
|
|
|
|
{
|
2004-03-11 01:03:51 +00:00
|
|
|
int i;
|
2004-03-10 08:14:38 +00:00
|
|
|
float dark[4] = {0.0, 0.0, 0.0, 1.0},
|
2004-03-15 21:32:19 +00:00
|
|
|
ambient[4] = {0.2, 0.2, 0.2, 1.0},
|
|
|
|
diffuse[4] = {0.7, 0.7, 0.7, 1.0},
|
|
|
|
specular[4] = {0.1, 0.1, 0.1, 1.0};
|
2004-03-10 08:14:38 +00:00
|
|
|
|
|
|
|
qfglGetIntegerv (GL_MAX_LIGHTS, &gl_max_lights);
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Max GL Lights %d.\n", gl_max_lights);
|
2004-03-10 08:14:38 +00:00
|
|
|
|
|
|
|
qfglEnable (GL_LIGHTING);
|
|
|
|
qfglLightModelfv (GL_LIGHT_MODEL_AMBIENT, dark);
|
|
|
|
qfglLightModelf (GL_LIGHT_MODEL_TWO_SIDE, 0.0);
|
2004-03-11 01:03:51 +00:00
|
|
|
|
|
|
|
for (i = 0; i < gl_max_lights; i++) {
|
|
|
|
qfglEnable (GL_LIGHT0 + i);
|
2004-05-02 21:21:00 +00:00
|
|
|
qfglLightf (GL_LIGHT0 + i, GL_CONSTANT_ATTENUATION, 0.5);
|
2004-03-11 01:03:51 +00:00
|
|
|
qfglDisable (GL_LIGHT0 + i);
|
|
|
|
}
|
|
|
|
|
2004-03-15 21:32:19 +00:00
|
|
|
// Set up material defaults
|
|
|
|
qfglMaterialfv (GL_FRONT, GL_AMBIENT, ambient);
|
|
|
|
qfglMaterialfv (GL_FRONT, GL_DIFFUSE, diffuse);
|
|
|
|
qfglMaterialfv (GL_FRONT, GL_SPECULAR, specular);
|
|
|
|
qfglMaterialf (GL_FRONT, GL_SHININESS, 1.0);
|
|
|
|
|
2004-03-10 08:14:38 +00:00
|
|
|
qfglDisable (GL_LIGHTING);
|
|
|
|
}
|
|
|
|
|
2012-02-17 07:13:56 +00:00
|
|
|
static void
|
|
|
|
Tdfx_Init8bitPalette (void)
|
|
|
|
{
|
|
|
|
// Check for 8bit Extensions and initialize them.
|
|
|
|
int i;
|
|
|
|
|
2012-02-26 05:00:15 +00:00
|
|
|
if (vr_data.vid->is8bit)
|
2012-02-17 07:13:56 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (QFGL_ExtensionPresent ("3DFX_set_global_palette")) {
|
|
|
|
char *oldpal;
|
|
|
|
GLubyte table[256][4];
|
|
|
|
QF_gl3DfxSetPaletteEXT qgl3DfxSetPaletteEXT = NULL;
|
|
|
|
|
|
|
|
if (!(qgl3DfxSetPaletteEXT =
|
|
|
|
QFGL_ExtensionAddress ("gl3DfxSetPaletteEXT"))) {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "3DFX_set_global_palette not found.\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "3DFX_set_global_palette.\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
|
|
|
|
oldpal = (char *) d_8to24table; // d_8to24table3dfx;
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
|
|
table[i][2] = *oldpal++;
|
|
|
|
table[i][1] = *oldpal++;
|
|
|
|
table[i][0] = *oldpal++;
|
|
|
|
table[i][3] = 255;
|
|
|
|
oldpal++;
|
|
|
|
}
|
|
|
|
qfglEnable (GL_SHARED_TEXTURE_PALETTE_EXT);
|
|
|
|
qgl3DfxSetPaletteEXT ((GLuint *) table);
|
2012-02-26 05:00:15 +00:00
|
|
|
vr_data.vid->is8bit = true;
|
2012-02-17 07:13:56 +00:00
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "\n 3DFX_set_global_palette not found.");
|
2012-02-17 07:13:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2012-05-21 23:23:22 +00:00
|
|
|
The GL_EXT_shared_texture_palette seems like an idea which is
|
2012-02-17 07:13:56 +00:00
|
|
|
/almost/ a good idea, but seems to be severely broken with many
|
|
|
|
drivers, as such it is disabled.
|
2012-05-21 23:23:22 +00:00
|
|
|
|
2012-02-17 07:13:56 +00:00
|
|
|
It should be noted, that a palette object extension as suggested by
|
|
|
|
the GL_EXT_shared_texture_palette spec might be a very good idea in
|
|
|
|
general.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
Shared_Init8bitPalette (void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
GLubyte thePalette[256 * 3];
|
|
|
|
GLubyte *oldPalette, *newPalette;
|
|
|
|
|
2012-02-26 05:00:15 +00:00
|
|
|
if (vr_data.vid->is8bit)
|
2012-02-17 07:13:56 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (QFGL_ExtensionPresent ("GL_EXT_shared_texture_palette")) {
|
|
|
|
if (!(qglColorTableEXT = QFGL_ExtensionAddress ("glColorTableEXT"))) {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "glColorTableEXT not found.\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "GL_EXT_shared_texture_palette\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
|
|
|
|
qfglEnable (GL_SHARED_TEXTURE_PALETTE_EXT);
|
|
|
|
oldPalette = (GLubyte *) d_8to24table; // d_8to24table3dfx;
|
|
|
|
newPalette = thePalette;
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
|
|
*newPalette++ = *oldPalette++;
|
|
|
|
*newPalette++ = *oldPalette++;
|
|
|
|
*newPalette++ = *oldPalette++;
|
|
|
|
oldPalette++;
|
|
|
|
}
|
|
|
|
qglColorTableEXT (GL_SHARED_TEXTURE_PALETTE_EXT, GL_RGB, 256, GL_RGB,
|
|
|
|
GL_UNSIGNED_BYTE, (GLvoid *) thePalette);
|
2012-02-26 05:00:15 +00:00
|
|
|
vr_data.vid->is8bit = true;
|
2012-02-17 07:13:56 +00:00
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid,
|
2012-02-17 07:13:56 +00:00
|
|
|
"\n GL_EXT_shared_texture_palette not found.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
VID_Init8bitPalette (void)
|
|
|
|
{
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Checking for 8-bit extension: ");
|
[cvar] Make cvars properly typed
This is an extremely extensive patch as it hits every cvar, and every
usage of the cvars. Cvars no longer store the value they control,
instead, they use a cexpr value object to reference the value and
specify the value's type (currently, a null type is used for strings).
Non-string cvars are passed through cexpr, allowing expressions in the
cvars' settings. Also, cvars have returned to an enhanced version of the
original (id quake) registration scheme.
As a minor benefit, relevant code having direct access to the
cvar-controlled variables is probably a slight optimization as it
removed a pointer dereference, and the variables can be located for data
locality.
The static cvar descriptors are made private as an additional safety
layer, though there's nothing stopping external modification via
Cvar_FindVar (which is needed for adding listeners).
While not used yet (partly due to working out the design), cvars can
have a validation function.
Registering a cvar allows a primary listener (and its data) to be
specified: it will always be called first when the cvar is modified. The
combination of proper listeners and direct access to the controlled
variable greatly simplifies the more complex cvar interactions as much
less null checking is required, and there's no need for one cvar's
callback to call another's.
nq-x11 is known to work at least well enough for the demos. More testing
will come.
2022-04-23 03:22:45 +00:00
|
|
|
if (vid_use8bit) {
|
2012-02-17 07:13:56 +00:00
|
|
|
Tdfx_Init8bitPalette ();
|
|
|
|
Shared_Init8bitPalette ();
|
2012-02-26 05:00:15 +00:00
|
|
|
if (!vr_data.vid->is8bit)
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "\n 8-bit extension not found.\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
} else {
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "disabled.\n");
|
2012-02-17 07:13:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-12 04:57:05 +00:00
|
|
|
void
|
2021-07-10 15:09:41 +00:00
|
|
|
GL_SetPalette (void *data, const byte *palette)
|
2001-04-15 04:18:22 +00:00
|
|
|
{
|
2012-04-12 04:57:05 +00:00
|
|
|
const byte *pal;
|
2001-04-15 04:18:22 +00:00
|
|
|
char s[255];
|
|
|
|
float dist, bestdist;
|
2004-01-26 00:13:47 +00:00
|
|
|
int r1, g1, b1, k;
|
2001-09-09 19:37:07 +00:00
|
|
|
unsigned int r, g, b, v;
|
|
|
|
unsigned short i;
|
|
|
|
unsigned int *table;
|
2023-06-13 09:06:11 +00:00
|
|
|
static bool palflag = false;
|
2002-08-27 07:16:28 +00:00
|
|
|
QFile *f;
|
2012-02-18 12:33:54 +00:00
|
|
|
static int inited_8 = 0;
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2012-02-18 12:33:54 +00:00
|
|
|
if (!inited_8) {
|
|
|
|
inited_8 = 1;
|
|
|
|
// Check for 8-bit extension and initialize if present
|
|
|
|
VID_Init8bitPalette ();
|
|
|
|
}
|
2001-09-09 19:37:07 +00:00
|
|
|
// 8 8 8 encoding
|
2021-03-29 10:58:00 +00:00
|
|
|
Sys_MaskPrintf (SYS_vid, "Converting 8to24\n");
|
2001-04-15 04:18:22 +00:00
|
|
|
|
|
|
|
pal = palette;
|
|
|
|
table = d_8to24table;
|
|
|
|
for (i = 0; i < 255; i++) { // used to be i<256, see d_8to24table below
|
2001-05-25 16:42:49 +00:00
|
|
|
r = pal[0];
|
|
|
|
g = pal[1];
|
|
|
|
b = pal[2];
|
2001-04-15 04:18:22 +00:00
|
|
|
pal += 3;
|
|
|
|
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
v = (255 << 0) + (r << 24) + (g << 16) + (b << 8);
|
|
|
|
#else
|
|
|
|
v = (255 << 24) + (r << 0) + (g << 8) + (b << 16);
|
|
|
|
#endif
|
|
|
|
*table++ = v;
|
|
|
|
}
|
|
|
|
d_8to24table[255] = 0; // 255 is transparent
|
|
|
|
|
|
|
|
// JACK: 3D distance calcs - k is last closest, l is the distance.
|
|
|
|
if (palflag)
|
|
|
|
return;
|
|
|
|
palflag = true;
|
|
|
|
|
2014-01-23 02:57:57 +00:00
|
|
|
f = QFS_FOpenFile ("glquake/15to8.pal");
|
2001-04-15 04:18:22 +00:00
|
|
|
if (f) {
|
2012-02-22 07:32:34 +00:00
|
|
|
Qread (f, gl_15to8table, 1 << 15);
|
2001-04-15 04:18:22 +00:00
|
|
|
Qclose (f);
|
|
|
|
} else {
|
|
|
|
for (i = 0; i < (1 << 15); i++) {
|
|
|
|
/* Maps
|
2001-09-09 19:37:07 +00:00
|
|
|
000000000000000
|
2004-01-26 00:13:47 +00:00
|
|
|
000000000011111 = Red = 0x001F
|
2012-05-21 23:23:22 +00:00
|
|
|
000001111100000 = Blue = 0x03E0
|
2001-09-09 19:37:07 +00:00
|
|
|
111110000000000 = Grn = 0x7C00
|
2001-04-15 04:18:22 +00:00
|
|
|
*/
|
|
|
|
r = ((i & 0x1F) << 3) + 4;
|
|
|
|
g = ((i & 0x03E0) >> 2) + 4;
|
|
|
|
b = ((i & 0x7C00) >> 7) + 4;
|
|
|
|
|
|
|
|
pal = (unsigned char *) d_8to24table;
|
|
|
|
|
|
|
|
for (v = 0, k = 0, bestdist = 10000.0; v < 256; v++, pal += 4) {
|
|
|
|
r1 = (int) r - (int) pal[0];
|
|
|
|
g1 = (int) g - (int) pal[1];
|
|
|
|
b1 = (int) b - (int) pal[2];
|
|
|
|
dist = sqrt (((r1 * r1) + (g1 * g1) + (b1 * b1)));
|
|
|
|
if (dist < bestdist) {
|
|
|
|
k = v;
|
|
|
|
bestdist = dist;
|
|
|
|
}
|
|
|
|
}
|
2012-02-22 07:32:34 +00:00
|
|
|
gl_15to8table[i] = k;
|
2001-04-15 04:18:22 +00:00
|
|
|
}
|
2003-02-14 22:36:10 +00:00
|
|
|
snprintf (s, sizeof (s), "%s/glquake/15to8.pal", qfs_gamedir->dir.def);
|
|
|
|
if ((f = QFS_WOpen (s, 0)) != NULL) {
|
2012-02-22 07:32:34 +00:00
|
|
|
Qwrite (f, gl_15to8table, 1 << 15);
|
2001-04-15 04:18:22 +00:00
|
|
|
Qclose (f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-10-15 19:06:22 +00:00
|
|
|
void
|
|
|
|
GL_Init_Common (void)
|
|
|
|
{
|
2004-02-06 00:58:35 +00:00
|
|
|
GLF_FindFunctions ();
|
2004-02-22 06:00:15 +00:00
|
|
|
CheckGLVersionString ();
|
2003-03-20 19:58:18 +00:00
|
|
|
|
2011-12-15 00:17:57 +00:00
|
|
|
CheckAnisotropyExtensions ();
|
|
|
|
CheckMultiTextureExtensions ();
|
|
|
|
CheckCombineExtensions ();
|
|
|
|
CheckBGRAExtensions ();
|
|
|
|
CheckTruFormExtensions ();
|
|
|
|
CheckVertexArraySize ();
|
|
|
|
CheckLights ();
|
|
|
|
|
2011-12-15 00:29:57 +00:00
|
|
|
GL_Common_Init_Cvars ();
|
|
|
|
|
2022-05-10 15:27:55 +00:00
|
|
|
GL_TextureInit ();
|
|
|
|
|
2001-06-26 02:26:46 +00:00
|
|
|
qfglClearColor (0, 0, 0, 0);
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2004-02-22 06:00:15 +00:00
|
|
|
qfglEnable (GL_TEXTURE_2D);
|
2012-01-03 09:06:26 +00:00
|
|
|
qfglFrontFace (GL_CW);
|
|
|
|
qfglCullFace (GL_BACK);
|
2001-06-26 02:26:46 +00:00
|
|
|
qfglPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
qfglShadeModel (GL_FLAT);
|
2001-04-15 04:18:22 +00:00
|
|
|
|
2004-02-22 06:00:15 +00:00
|
|
|
qfglEnable (GL_BLEND);
|
|
|
|
qfglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
|
|
|
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
2001-06-26 02:26:46 +00:00
|
|
|
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
|
|
|
|
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
|
2012-02-17 09:33:07 +00:00
|
|
|
if (gl_Anisotropy)
|
2005-01-02 14:23:20 +00:00
|
|
|
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
2012-02-17 09:33:07 +00:00
|
|
|
gl_aniso);
|
2001-06-26 02:26:46 +00:00
|
|
|
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
|
|
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
2001-04-15 04:18:22 +00:00
|
|
|
}
|