mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-25 13:51:36 +00:00
more tree recovering. This includes Despair's anisotropy support work.
This commit is contained in:
parent
0029a26f40
commit
23f71485d1
18 changed files with 128 additions and 48 deletions
7
NEWS
7
NEWS
|
@ -51,7 +51,7 @@ Changes from 0.5.4
|
|||
* treat server clients like non-client entities for GIB "frag" event
|
||||
* expand ~ for fs_dirconf
|
||||
* don't write config.cfg until /after/ it's been read :)
|
||||
* ATI's libGL needs to be loaded with global symbols in order to work
|
||||
* ATI's libGL needed to be loaded with global symbols in order to work
|
||||
properly
|
||||
* oss sound doesn't block if the sound device is busy (from Grievre)
|
||||
* add snd_bits/rate/stereo cvars to win and dx sound targets
|
||||
|
@ -62,12 +62,13 @@ Changes from 0.5.4
|
|||
* curses server console scrollback works
|
||||
* qfdefs nuked. no longer needed as "standard" progs get resolved
|
||||
staticly
|
||||
* TruForm support. Controlled by gl_tessellate
|
||||
* Anisotropy support, controlled by gl_anisotropy
|
||||
* TruForm support, controlled by gl_tessellate
|
||||
* Improvements in time accounting. Accurate to +-0.5ms, instead of -1,0
|
||||
like others. Based on Grievre's and zquake's code
|
||||
* mangled sounds on gamedir change fixed thanks to Grievre
|
||||
* mtex support for world rendering.
|
||||
* alias models us GL lighting
|
||||
* alias models use GL lighting
|
||||
* support for 7 mouse buttons
|
||||
* all archived cvars get written to config.cfg prefixed with "seta"
|
||||
(new command that sets the archive bit)
|
||||
|
|
|
@ -73,6 +73,12 @@
|
|||
# define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_texture_filter_anisotropic
|
||||
# define GL_EXT_texture_filter_anisotropic
|
||||
# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84fe
|
||||
# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84ff
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_texture_object
|
||||
# define GL_EXT_texture_object
|
||||
# define GL_TEXTURE_PRIORITY_EXT 0x8066
|
||||
|
@ -82,12 +88,12 @@
|
|||
# define GL_TEXTURE_3D_BINDING_EXT 0x806A
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_point_parameters
|
||||
# define GL_EXT_point_parameters
|
||||
# define GL_POINT_SIZE_MIN_EXT 0x8126
|
||||
# define GL_POINT_SIZE_MAX_EXT 0x8127
|
||||
# define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
|
||||
# define GL_DISTANCE_ATTENUATION_EXT 0x8129
|
||||
#ifndef GL_ARB_point_parameters
|
||||
# define GL_ARB_point_parameters
|
||||
# define GL_POINT_SIZE_MIN_ARB 0x8126
|
||||
# define GL_POINT_SIZE_MAX_ARB 0x8127
|
||||
# define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
|
||||
# define GL_DISTANCE_ATTENUATION_ARB 0x8129
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_shared_texture_palette
|
||||
|
@ -134,6 +140,12 @@
|
|||
# define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
|
||||
#endif
|
||||
|
||||
#ifndef GL_ARB_point_sprite
|
||||
# define GL_ARB_point_sprite
|
||||
# define GL_POINT_SPRITE_ARB 0x8861
|
||||
# define GL_COORD_REPLACE_ARB 0x8862
|
||||
#endif
|
||||
|
||||
#ifndef GL_ARB_texture_cube_map
|
||||
# define GL_ARB_texture_cube_map
|
||||
# define GL_NORMAL_MAP_ARB 0x8511
|
||||
|
@ -265,16 +277,16 @@ typedef void (GLAPIENTRY *QF_glMultiTexCoord2sv) (GLenum target, const GLshort *
|
|||
typedef void (GLAPIENTRY *QF_glMultiTexCoord3sv) (GLenum target, const GLshort *v);
|
||||
typedef void (GLAPIENTRY *QF_glMultiTexCoord4sv) (GLenum target, const GLshort *v);
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
typedef void (GLAPIENTRY *QF_glPointParameterfARB) (GLenum pname, GLfloat param);
|
||||
typedef void (GLAPIENTRY *QF_glPointParameterfvARB) (GLenum pname, const GLfloat *params);
|
||||
|
||||
// GL_EXT_paletted_texture
|
||||
typedef void (GLAPIENTRY *QF_glColorTableEXT) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
|
||||
typedef void (GLAPIENTRY *QF_glGetColorTableEXT) (GLenum target, GLenum format, GLenum type, GLvoid *data);
|
||||
typedef void (GLAPIENTRY *QF_glGetColorTableParameterivEXT) (GLenum target, GLenum pname, GLint *params);
|
||||
typedef void (GLAPIENTRY *QF_glGetColorTableParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params);
|
||||
|
||||
// GL_EXT_point_parameters
|
||||
typedef void (GLAPIENTRY *QF_glPointParameterfEXT) (GLenum pname, GLfloat param);
|
||||
typedef void (GLAPIENTRY *QF_glPointParameterfvEXT) (GLenum pname, const GLfloat *params);
|
||||
|
||||
// GL_EXT_subtexture
|
||||
typedef void (GLAPIENTRY *QF_glTexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
|
||||
typedef void (GLAPIENTRY *QF_glTexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
|
||||
|
|
|
@ -38,7 +38,8 @@ extern int gl_solid_format;
|
|||
extern int gl_lightmap_format;
|
||||
extern int gl_filter_min;
|
||||
extern int gl_filter_max;
|
||||
|
||||
extern qboolean Anisotropy;
|
||||
extern float aniso;
|
||||
extern int part_tex;
|
||||
/*
|
||||
extern int part_tex_dot;
|
||||
|
|
|
@ -218,7 +218,7 @@ void ED_EntityParseFunction (progs_t *pr);
|
|||
#define PR_edicts(p) ((byte *) *(p)->edicts)
|
||||
|
||||
#define NEXT_EDICT(p,e) ((edict_t *) ((byte *) e + (p)->pr_edict_size))
|
||||
#define EDICT_TO_PROG(p,e) ((byte *) (e) - PR_edicts (p))
|
||||
#define EDICT_TO_PROG(p,e) ((long) ((byte *) (e) - PR_edicts (p)))
|
||||
#define PROG_TO_EDICT(p,e) ((edict_t *) (PR_edicts (p) + (e)))
|
||||
#define NUM_FOR_BAD_EDICT(p,e) (EDICT_TO_PROG (p, e) / (p)->pr_edict_size)
|
||||
#ifndef PR_PARANOID_PROGS
|
||||
|
|
|
@ -14,6 +14,7 @@ extern struct cvar_s *d_mipcap;
|
|||
extern struct cvar_s *d_mipscale;
|
||||
|
||||
extern struct cvar_s *gl_affinemodels;
|
||||
extern struct cvar_s *gl_anisotropy;
|
||||
extern struct cvar_s *gl_clear;
|
||||
extern struct cvar_s *gl_conspin;
|
||||
extern struct cvar_s *gl_constretch;
|
||||
|
|
|
@ -79,7 +79,7 @@ void R_Particles_Init_Cvars (void);
|
|||
void R_InitBubble (void);
|
||||
|
||||
void R_InitParticles (void);
|
||||
inline void R_ClearParticles (void);
|
||||
void R_ClearParticles (void);
|
||||
void R_DrawParticles (void);
|
||||
struct cvar_s;
|
||||
void R_MaxParticlesCheck (struct cvar_s *r_particles,
|
||||
|
|
|
@ -255,7 +255,7 @@ qboolean R_AliasCheckBBox (void);
|
|||
|
||||
void R_DrawParticles (void);
|
||||
void R_InitParticles (void);
|
||||
inline void R_ClearParticles (void);
|
||||
void R_ClearParticles (void);
|
||||
void R_ReadPointFile_f (void);
|
||||
void R_InitSprites (void);
|
||||
void R_SurfacePatch (void);
|
||||
|
|
|
@ -473,7 +473,7 @@ value_string (progs_t *pr, etype_t type, pr_type_t *val)
|
|||
break;
|
||||
case ev_entity:
|
||||
edict = PROG_TO_EDICT (pr, val->entity_var);
|
||||
dsprintf (line, "entity %i", NUM_FOR_BAD_EDICT (pr, edict));
|
||||
dsprintf (line, "entity %ld", NUM_FOR_BAD_EDICT (pr, edict));
|
||||
break;
|
||||
case ev_func:
|
||||
if (val->func_var < 0 || val->func_var >= pr->progs->numfunctions)
|
||||
|
@ -640,8 +640,7 @@ PR_PrintStatement (progs_t * pr, dstatement_t *s, int contents)
|
|||
fmt += 2;
|
||||
} else {
|
||||
const char *str;
|
||||
char mode = fmt[1];
|
||||
char opchar = fmt[2];
|
||||
char mode = fmt[1], opchar = fmt[2];
|
||||
long opval;
|
||||
etype_t optype;
|
||||
|
||||
|
@ -782,10 +781,9 @@ PR_Profile (progs_t * pr)
|
|||
void
|
||||
ED_Print (progs_t *pr, edict_t *ed)
|
||||
{
|
||||
int l;
|
||||
int type, l;
|
||||
unsigned int i;
|
||||
const char *name;
|
||||
int type;
|
||||
ddef_t *d;
|
||||
pr_type_t *v;
|
||||
|
||||
|
@ -794,7 +792,7 @@ ED_Print (progs_t *pr, edict_t *ed)
|
|||
return;
|
||||
}
|
||||
|
||||
Sys_Printf ("\nEDICT %i:\n", NUM_FOR_BAD_EDICT (pr, ed));
|
||||
Sys_Printf ("\nEDICT %ld:\n", NUM_FOR_BAD_EDICT (pr, ed));
|
||||
for (i = 0; i < pr->progs->numfielddefs; i++) {
|
||||
d = &pr->pr_fielddefs[i];
|
||||
if (!d->s_name) // null field def (probably 1st)
|
||||
|
|
|
@ -66,8 +66,9 @@ ED_ClearEdict (progs_t *pr, edict_t *e, int val)
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
if (NUM_FOR_EDICT(pr,e)<*pr->reserved_edicts)
|
||||
Sys_Printf("clearing reserved edict %d\n", NUM_FOR_EDICT(pr,e));
|
||||
if (NUM_FOR_EDICT (pr, e) < *pr->reserved_edicts)
|
||||
Sys_Printf ("clearing reserved edict %ld\n",
|
||||
NUM_FOR_EDICT (pr, e));
|
||||
for (i=0; i < pr->progs->entityfields; i++)
|
||||
e->v[i].integer_var = val;
|
||||
e->free = false;
|
||||
|
|
|
@ -66,7 +66,7 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
static char *
|
||||
PR_UglyValueString (progs_t *pr, etype_t type, pr_type_t *val)
|
||||
{
|
||||
static char line[256];
|
||||
static char line[256];
|
||||
ddef_t *def;
|
||||
dfunction_t *f;
|
||||
|
||||
|
@ -78,7 +78,7 @@ PR_UglyValueString (progs_t *pr, etype_t type, pr_type_t *val)
|
|||
PR_GetString (pr, val->string_var));
|
||||
break;
|
||||
case ev_entity:
|
||||
snprintf (line, sizeof (line), "%i",
|
||||
snprintf (line, sizeof (line), "%ld",
|
||||
NUM_FOR_BAD_EDICT (pr, PROG_TO_EDICT (pr, val->entity_var)));
|
||||
break;
|
||||
case ev_func:
|
||||
|
|
|
@ -288,7 +288,7 @@ static const char *
|
|||
selector_get_key (void *s, void *_pr)
|
||||
{
|
||||
progs_t *pr = (progs_t *) _pr;
|
||||
return PR_GetString (pr, pr->selector_names[(int) s]);
|
||||
return PR_GetString (pr, pr->selector_names[(long) s]);
|
||||
}
|
||||
|
||||
static const char *
|
||||
|
@ -404,11 +404,11 @@ static pr_sel_t *
|
|||
sel_register_typed_name (progs_t *pr, const char *name, const char *types,
|
||||
pr_sel_t *sel)
|
||||
{
|
||||
int index;
|
||||
int is_new = 0;
|
||||
long index;
|
||||
int is_new = 0;
|
||||
obj_list *l;
|
||||
|
||||
index = (int) Hash_Find (pr->selector_hash, name);
|
||||
index = (long) Hash_Find (pr->selector_hash, name);
|
||||
if (index) {
|
||||
for (l = ((obj_list **) pr->selector_sels)[index]; l; l = l->next) {
|
||||
pr_sel_t *s = l->data;
|
||||
|
@ -444,7 +444,7 @@ sel_register_typed_name (progs_t *pr, const char *name, const char *types,
|
|||
((obj_list **) pr->selector_sels)[index] = l;
|
||||
|
||||
if (is_new)
|
||||
Hash_Add (pr->selector_hash, (void *)index);
|
||||
Hash_Add (pr->selector_hash, (void *) index);
|
||||
|
||||
return sel;
|
||||
}
|
||||
|
@ -581,8 +581,8 @@ obj_send_message_in_list (progs_t *pr, pr_method_list_t *method_list,
|
|||
pr_method_t *mth = &method_list->method_list[i];
|
||||
if (mth->method_name && sel_eq (&G_STRUCT (pr, pr_sel_t,
|
||||
mth->method_name), op)
|
||||
&& !Hash_FindElement (pr->load_methods, (void *)mth->method_imp)) {
|
||||
Hash_AddElement (pr->load_methods, (void *)mth->method_imp);
|
||||
&& !Hash_FindElement (pr->load_methods, (void *) (long) mth->method_imp)) {
|
||||
Hash_AddElement (pr->load_methods, (void *) (long) mth->method_imp);
|
||||
|
||||
PR_ExecuteProgram (pr, mth->method_imp);
|
||||
break;
|
||||
|
|
|
@ -265,15 +265,15 @@ void
|
|||
Z_Print (memzone_t *zone)
|
||||
{
|
||||
memblock_t *block;
|
||||
|
||||
|
||||
Sys_Printf ("zone size: %i location: %p used: %i\n",
|
||||
zone->size, zone, zone->used);
|
||||
|
||||
for (block = zone->blocklist.next ; ; block = block->next)
|
||||
{
|
||||
|
||||
for (block = zone->blocklist.next ; ; block = block->next) {
|
||||
Sys_Printf ("block:%p size:%7i tag:%3i ofs:%d\n",
|
||||
block, block->size, block->tag, (byte *) block - (byte *) zone);
|
||||
|
||||
block, block->size, block->tag,
|
||||
(int) ((byte *) block - (byte *) zone));
|
||||
|
||||
if (block->next == &zone->blocklist)
|
||||
break; // all blocks have been hit
|
||||
if ( (byte *)block + block->size != (byte *)block->next)
|
||||
|
@ -293,9 +293,8 @@ void
|
|||
Z_CheckHeap (memzone_t *zone)
|
||||
{
|
||||
memblock_t *block;
|
||||
|
||||
for (block = zone->blocklist.next ; ; block = block->next)
|
||||
{
|
||||
|
||||
for (block = zone->blocklist.next ; ; block = block->next) {
|
||||
if (block->next == &zone->blocklist)
|
||||
break; // all blocks have been hit
|
||||
if ( (byte *)block + block->size != (byte *)block->next)
|
||||
|
|
|
@ -145,7 +145,7 @@ particle_new_veryrandom (ptype_t type, int texnum, const vec3_t org,
|
|||
}
|
||||
*/
|
||||
|
||||
inline void
|
||||
void
|
||||
R_ClearParticles (void)
|
||||
{
|
||||
numparticles = 0;
|
||||
|
|
|
@ -793,6 +793,9 @@ GL_BuildLightmaps (model_t **models, int num_models)
|
|||
qfglBindTexture (GL_TEXTURE_2D, lightmap_textures + i);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
qfglTexImage2D (GL_TEXTURE_2D, 0, lightmap_bytes, BLOCK_WIDTH,
|
||||
BLOCK_HEIGHT, 0, gl_lightmap_format,
|
||||
GL_UNSIGNED_BYTE, lightmaps[i]);
|
||||
|
|
|
@ -150,6 +150,9 @@ build_skin_32 (byte * original, int tinwidth, int tinheight,
|
|||
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -147,6 +147,9 @@ R_LoadSkys (const char *skyname)
|
|||
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
|
||||
|
@ -430,6 +433,9 @@ R_InitSky (texture_t *mt)
|
|||
GL_UNSIGNED_BYTE, trans);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
|
||||
for (i = 0; i < 128; i++)
|
||||
for (j = 0; j < 128; j++) {
|
||||
|
@ -447,4 +453,7 @@ R_InitSky (texture_t *mt)
|
|||
GL_UNSIGNED_BYTE, trans);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
}
|
||||
|
|
|
@ -222,9 +222,12 @@ GL_TextureMode_f (void)
|
|||
if (glt->mipmap) {
|
||||
qfglBindTexture (GL_TEXTURE_2D, glt->texnum);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
gl_filter_min);
|
||||
gl_filter_min);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
gl_filter_max);
|
||||
gl_filter_max);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -428,6 +431,9 @@ GL_Upload32 (unsigned int *data, int width, int height, qboolean mipmap,
|
|||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
gl_filter_max);
|
||||
}
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
|
||||
free (scaled);
|
||||
}
|
||||
|
@ -502,6 +508,9 @@ GL_Upload8_EXT (byte *data, int width, int height, qboolean mipmap,
|
|||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
gl_filter_max);
|
||||
}
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
|
||||
free (scaled);
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ int use_bgra;
|
|||
int gl_va_capable;
|
||||
int vaelements;
|
||||
int texture_extension_number = 1;
|
||||
int gl_filter_min = GL_LINEAR_MIPMAP_NEAREST;
|
||||
int gl_filter_min = GL_LINEAR_MIPMAP_LINEAR;
|
||||
int gl_filter_max = GL_LINEAR;
|
||||
float gldepthmin, gldepthmax;
|
||||
|
||||
|
@ -104,7 +104,12 @@ qboolean is8bit = false;
|
|||
|
||||
qboolean gl_feature_mach64 = false;
|
||||
|
||||
// ATI PN_triangles
|
||||
// GL_EXT_texture_filter_anisotropic
|
||||
qboolean Anisotropy;
|
||||
static float aniso_max;
|
||||
float aniso;
|
||||
|
||||
// GL_ATI_pn_triangles
|
||||
static qboolean TruForm;
|
||||
static int tess_max;
|
||||
int tess;
|
||||
|
@ -112,6 +117,7 @@ int tess;
|
|||
// GL_LIGHT
|
||||
int gl_max_lights;
|
||||
|
||||
cvar_t *gl_anisotropy;
|
||||
cvar_t *gl_doublebright;
|
||||
cvar_t *gl_fb_bmodels;
|
||||
cvar_t *gl_finish;
|
||||
|
@ -231,6 +237,22 @@ gl_screenshot_byte_swap_f (cvar_t *var)
|
|||
var->int_val ? GL_TRUE : GL_FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
gl_anisotropy_f (cvar_t * var)
|
||||
{
|
||||
if (Anisotropy) {
|
||||
if (var)
|
||||
aniso = (bound (1.0, var->value, aniso_max));
|
||||
else
|
||||
aniso = 1.0;
|
||||
} else {
|
||||
aniso = 1.0;
|
||||
if (var)
|
||||
Con_Printf ("Anisotropy (GL_EXT_texture_filter_anisotropic) is "
|
||||
"not supported by your hardware and/or drivers.\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gl_tessellate_f (cvar_t * var)
|
||||
{
|
||||
|
@ -271,6 +293,11 @@ GL_Common_Init_Cvars (void)
|
|||
gl_screenshot_byte_swap_f, "Swap the bytes for gl "
|
||||
"screenshots. Needed if you get screenshots with red and "
|
||||
"blue swapped.");
|
||||
gl_anisotropy =
|
||||
Cvar_Get ("gl_anisotropy", "1.0", CVAR_NONE, gl_anisotropy_f,
|
||||
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));
|
||||
gl_tessellate =
|
||||
Cvar_Get ("gl_tessellate", "0", CVAR_NONE, gl_tessellate_f,
|
||||
nva ("Specifies tessellation level from 0 to %i. Higher "
|
||||
|
@ -321,6 +348,18 @@ CheckGLVersionString (void)
|
|||
gl_feature_mach64 = true;
|
||||
}
|
||||
|
||||
static void
|
||||
CheckAnisotropyExtensions (void)
|
||||
{
|
||||
if (QFGL_ExtensionPresent ("GL_EXT_texture_filter_anisotropic")) {
|
||||
Anisotropy = true;
|
||||
qfglGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &aniso_max);
|
||||
} else {
|
||||
Anisotropy = false;
|
||||
aniso_max = 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
CheckBGRAExtensions (void)
|
||||
{
|
||||
|
@ -556,9 +595,13 @@ GL_Init_Common (void)
|
|||
qfglEnable (GL_BLEND);
|
||||
qfglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
CheckAnisotropyExtensions ();
|
||||
qfglTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
|
||||
if (Anisotropy)
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
|
||||
aniso);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
qfglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
|
||||
|
|
Loading…
Reference in a new issue