mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
Add r_nearclip and r_particles_nearclip. Also put some limits on r_farclip. And fix id's insane max and min float, and some minor improvements in frustum setup in GL.
This commit is contained in:
parent
26dce371d9
commit
fd1ded5c4a
8 changed files with 99 additions and 59 deletions
|
@ -112,8 +112,8 @@ int BoxOnPlaneSide (const vec3_t emins, const vec3_t emaxs,
|
||||||
struct mplane_s *plane);
|
struct mplane_s *plane);
|
||||||
float anglemod (float a);
|
float anglemod (float a);
|
||||||
|
|
||||||
void RotatePointAroundVector (vec3_t dst, const vec3_t dir, const vec3_t point,
|
void RotatePointAroundVector (vec3_t dst, const vec3_t axis,
|
||||||
float degrees );
|
const vec3_t point, float degrees);
|
||||||
|
|
||||||
#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
|
#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \
|
||||||
(((p)->type < 3)? \
|
(((p)->type < 3)? \
|
||||||
|
|
|
@ -37,17 +37,19 @@
|
||||||
# define NULL ((void *)0)
|
# define NULL ((void *)0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define Q_MAXCHAR ((char)0x7f)
|
#define Q_MAXCHAR ((char)0x7f)
|
||||||
#define Q_MAXSHORT ((short)0x7fff)
|
#define Q_MAXSHORT ((short)0x7fff)
|
||||||
#define Q_MAXINT ((int)0x7fffffff)
|
#define Q_MAXINT ((int)0x7fffffff)
|
||||||
#define Q_MAXLONG ((int)0x7fffffff)
|
#define Q_MAXLONG ((int)0x7fffffff)
|
||||||
#define Q_MAXFLOAT ((int)0x7fffffff)
|
#define Q_MAXFLOAT 3.40282346638528859811704183484516925440e38
|
||||||
|
|
||||||
#define Q_MINCHAR ((char)0x80)
|
#define Q_MINCHAR ((char)0x80)
|
||||||
#define Q_MINSHORT ((short)0x8000)
|
#define Q_MINSHORT ((short)0x8000)
|
||||||
#define Q_MININT ((int)0x80000000)
|
#define Q_MININT ((int)0x80000000)
|
||||||
#define Q_MINLONG ((int)0x80000000)
|
#define Q_MINLONG ((int)0x80000000)
|
||||||
#define Q_MINFLOAT ((int)0x7fffffff)
|
#define Q_MINFLOAT -3.40282346638528859811704183484516925440e38
|
||||||
|
|
||||||
|
#define Q_FLOAT_EPSILON 1.1754943508222875079687365372222456778186655567720875215087517062784172594547271728515625e-38
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef max
|
#ifndef max
|
||||||
# define max(a,b) ((a) > (b) ? (a) : (b))
|
# define max(a,b) ((a) > (b) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,6 +64,7 @@ extern struct cvar_s *r_lightmap_components;
|
||||||
extern struct cvar_s *r_maxedges;
|
extern struct cvar_s *r_maxedges;
|
||||||
extern struct cvar_s *r_maxsurfs;
|
extern struct cvar_s *r_maxsurfs;
|
||||||
extern struct cvar_s *r_mirroralpha;
|
extern struct cvar_s *r_mirroralpha;
|
||||||
|
extern struct cvar_s *r_nearclip;
|
||||||
extern struct cvar_s *r_netgraph;
|
extern struct cvar_s *r_netgraph;
|
||||||
extern struct cvar_s *r_netgraph_alpha;
|
extern struct cvar_s *r_netgraph_alpha;
|
||||||
extern struct cvar_s *r_netgraph_box;
|
extern struct cvar_s *r_netgraph_box;
|
||||||
|
@ -73,6 +74,7 @@ extern struct cvar_s *r_numedges;
|
||||||
extern struct cvar_s *r_numsurfs;
|
extern struct cvar_s *r_numsurfs;
|
||||||
extern struct cvar_s *r_particles;
|
extern struct cvar_s *r_particles;
|
||||||
extern struct cvar_s *r_particles_max;
|
extern struct cvar_s *r_particles_max;
|
||||||
|
extern struct cvar_s *r_particles_nearclip;
|
||||||
extern struct cvar_s *r_particles_style;
|
extern struct cvar_s *r_particles_style;
|
||||||
extern struct cvar_s *r_reportedgeout;
|
extern struct cvar_s *r_reportedgeout;
|
||||||
extern struct cvar_s *r_reportsurfout;
|
extern struct cvar_s *r_reportsurfout;
|
||||||
|
|
|
@ -112,7 +112,7 @@ VectorVectors(const vec3_t forward, vec3_t right, vec3_t up)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RotatePointAroundVector (vec3_t dst, const vec3_t dir, const vec3_t point,
|
RotatePointAroundVector (vec3_t dst, const vec3_t axis, const vec3_t point,
|
||||||
float degrees)
|
float degrees)
|
||||||
{
|
{
|
||||||
float m[3][3];
|
float m[3][3];
|
||||||
|
@ -123,9 +123,9 @@ RotatePointAroundVector (vec3_t dst, const vec3_t dir, const vec3_t point,
|
||||||
int i;
|
int i;
|
||||||
vec3_t vr, vup, vf;
|
vec3_t vr, vup, vf;
|
||||||
|
|
||||||
VectorCopy (dir, vf);
|
VectorCopy (axis, vf);
|
||||||
|
|
||||||
PerpendicularVector (vr, dir);
|
PerpendicularVector (vr, axis);
|
||||||
CrossProduct (vr, vf, vup);
|
CrossProduct (vr, vf, vup);
|
||||||
|
|
||||||
m[0][0] = vr[0];
|
m[0][0] = vr[0];
|
||||||
|
|
|
@ -1298,7 +1298,8 @@ R_DrawParticles (void)
|
||||||
time30 = r_frametime * 30.0;
|
time30 = r_frametime * 30.0;
|
||||||
time50 = r_frametime * 50.0;
|
time50 = r_frametime * 50.0;
|
||||||
|
|
||||||
minparticledist = DotProduct (r_refdef.vieworg, vpn) + 32.0;
|
minparticledist = DotProduct (r_refdef.vieworg, vpn) +
|
||||||
|
r_particles_nearclip->value;
|
||||||
|
|
||||||
activeparticles = 0;
|
activeparticles = 0;
|
||||||
vacount = 0;
|
vacount = 0;
|
||||||
|
|
|
@ -251,27 +251,19 @@ static void
|
||||||
R_SetFrustum (void)
|
R_SetFrustum (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (r_refdef.fov_x == 90) {
|
|
||||||
// front side is visible
|
|
||||||
VectorAdd (vpn, vright, frustum[0].normal);
|
|
||||||
VectorSubtract (vpn, vright, frustum[1].normal);
|
|
||||||
|
|
||||||
VectorAdd (vpn, vup, frustum[2].normal);
|
// rotate VPN right by FOV_X/2 degrees
|
||||||
VectorSubtract (vpn, vup, frustum[3].normal);
|
RotatePointAroundVector (frustum[0].normal, vup, vpn,
|
||||||
} else {
|
-(90 - r_refdef.fov_x / 2));
|
||||||
// rotate VPN right by FOV_X/2 degrees
|
// rotate VPN left by FOV_X/2 degrees
|
||||||
RotatePointAroundVector (frustum[0].normal, vup, vpn,
|
RotatePointAroundVector (frustum[1].normal, vup, vpn,
|
||||||
-(90 - r_refdef.fov_x / 2));
|
90 - r_refdef.fov_x / 2);
|
||||||
// rotate VPN left by FOV_X/2 degrees
|
// rotate VPN up by FOV_Y/2 degrees
|
||||||
RotatePointAroundVector (frustum[1].normal, vup, vpn,
|
RotatePointAroundVector (frustum[2].normal, vright, vpn,
|
||||||
90 - r_refdef.fov_x / 2);
|
90 - r_refdef.fov_y / 2);
|
||||||
// rotate VPN up by FOV_X/2 degrees
|
// rotate VPN down by FOV_Y/2 degrees
|
||||||
RotatePointAroundVector (frustum[2].normal, vright, vpn,
|
RotatePointAroundVector (frustum[3].normal, vright, vpn,
|
||||||
90 - r_refdef.fov_y / 2);
|
-(90 - r_refdef.fov_y / 2));
|
||||||
// rotate VPN down by FOV_X/2 degrees
|
|
||||||
RotatePointAroundVector (frustum[3].normal, vright, vpn,
|
|
||||||
-(90 - r_refdef.fov_y / 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
frustum[i].type = PLANE_ANYZ;
|
frustum[i].type = PLANE_ANYZ;
|
||||||
|
@ -314,7 +306,7 @@ MYgluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
|
||||||
ymin = -ymax;
|
ymin = -ymax;
|
||||||
|
|
||||||
xmin = ymin * aspect;
|
xmin = ymin * aspect;
|
||||||
xmax = ymax * aspect;
|
xmax = -xmin;
|
||||||
|
|
||||||
qfglFrustum (xmin, xmax, ymin, ymax, zNear, zFar);
|
qfglFrustum (xmin, xmax, ymin, ymax, zNear, zFar);
|
||||||
}
|
}
|
||||||
|
@ -325,36 +317,40 @@ R_SetupGL (void)
|
||||||
float screenaspect;
|
float screenaspect;
|
||||||
int x, x2, y2, y, w, h;
|
int x, x2, y2, y, w, h;
|
||||||
|
|
||||||
|
R_SetFrustum ();
|
||||||
|
|
||||||
// set up viewpoint
|
// set up viewpoint
|
||||||
qfglMatrixMode (GL_PROJECTION);
|
qfglMatrixMode (GL_PROJECTION);
|
||||||
qfglLoadIdentity ();
|
qfglLoadIdentity ();
|
||||||
x = r_refdef.vrect.x * glwidth / vid.width;
|
|
||||||
x2 = (r_refdef.vrect.x + r_refdef.vrect.width) * glwidth / vid.width;
|
|
||||||
y = (vid.height - r_refdef.vrect.y) * glheight / vid.height;
|
|
||||||
y2 = (vid.height - (r_refdef.vrect.y + r_refdef.vrect.height)) * glheight
|
|
||||||
/ vid.height;
|
|
||||||
|
|
||||||
// fudge around because of frac screen scale
|
|
||||||
if (x > 0)
|
|
||||||
x--;
|
|
||||||
if (x2 < glwidth)
|
|
||||||
x2++;
|
|
||||||
if (y2 < 0)
|
|
||||||
y2--;
|
|
||||||
if (y < glheight)
|
|
||||||
y++;
|
|
||||||
|
|
||||||
w = x2 - x;
|
|
||||||
h = y - y2;
|
|
||||||
|
|
||||||
if (envmap) {
|
if (envmap) {
|
||||||
x = y2 = 0;
|
x = y2 = 0;
|
||||||
w = h = 256;
|
w = h = 256;
|
||||||
|
} else {
|
||||||
|
x = r_refdef.vrect.x * glwidth / vid.width;
|
||||||
|
x2 = (r_refdef.vrect.x + r_refdef.vrect.width) * glwidth / vid.width;
|
||||||
|
y = (vid.height - r_refdef.vrect.y) * glheight / vid.height;
|
||||||
|
y2 = (vid.height - (r_refdef.vrect.y + r_refdef.vrect.height)) *
|
||||||
|
glheight / vid.height;
|
||||||
|
|
||||||
|
// fudge around because of frac screen scale
|
||||||
|
if (x > 0)
|
||||||
|
x--;
|
||||||
|
if (x2 < glwidth)
|
||||||
|
x2++;
|
||||||
|
if (y2 < 0)
|
||||||
|
y2--;
|
||||||
|
if (y < glheight)
|
||||||
|
y++;
|
||||||
|
|
||||||
|
w = x2 - x;
|
||||||
|
h = y - y2;
|
||||||
}
|
}
|
||||||
|
|
||||||
qfglViewport (glx + x, gly + y2, w, h);
|
qfglViewport (glx + x, gly + y2, w, h);
|
||||||
screenaspect = (float) r_refdef.vrect.width / r_refdef.vrect.height;
|
screenaspect = (float) r_refdef.vrect.width / r_refdef.vrect.height;
|
||||||
MYgluPerspective (r_refdef.fov_y, screenaspect, 4, r_farclip->value);
|
MYgluPerspective (r_refdef.fov_y, screenaspect, r_nearclip->value,
|
||||||
|
r_farclip->value);
|
||||||
|
|
||||||
if (mirror) {
|
if (mirror) {
|
||||||
if (mirror_plane->normal[2])
|
if (mirror_plane->normal[2])
|
||||||
|
@ -405,7 +401,6 @@ R_RenderScene (void)
|
||||||
r_time1 = Sys_DoubleTime ();
|
r_time1 = Sys_DoubleTime ();
|
||||||
|
|
||||||
R_SetupFrame ();
|
R_SetupFrame ();
|
||||||
R_SetFrustum ();
|
|
||||||
R_SetupGL ();
|
R_SetupGL ();
|
||||||
R_MarkLeaves (); // done here so we know if we're in water
|
R_MarkLeaves (); // done here so we know if we're in water
|
||||||
R_PushDlights (vec3_origin);
|
R_PushDlights (vec3_origin);
|
||||||
|
|
|
@ -38,7 +38,9 @@ static const char rcsid[] =
|
||||||
|
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
#include "QF/model.h"
|
#include "QF/model.h"
|
||||||
|
#include "QF/qendian.h"
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "r_cvar.h"
|
#include "r_cvar.h"
|
||||||
#include "r_dynamic.h"
|
#include "r_dynamic.h"
|
||||||
|
|
||||||
|
@ -102,6 +104,7 @@ cvar_t *r_lightmap_components;
|
||||||
cvar_t *r_maxedges;
|
cvar_t *r_maxedges;
|
||||||
cvar_t *r_maxsurfs;
|
cvar_t *r_maxsurfs;
|
||||||
cvar_t *r_mirroralpha;
|
cvar_t *r_mirroralpha;
|
||||||
|
cvar_t *r_nearclip;
|
||||||
cvar_t *r_netgraph;
|
cvar_t *r_netgraph;
|
||||||
cvar_t *r_netgraph_alpha;
|
cvar_t *r_netgraph_alpha;
|
||||||
cvar_t *r_netgraph_box;
|
cvar_t *r_netgraph_box;
|
||||||
|
@ -112,6 +115,7 @@ cvar_t *r_numsurfs;
|
||||||
cvar_t *r_particles;
|
cvar_t *r_particles;
|
||||||
cvar_t *r_particles_style;
|
cvar_t *r_particles_style;
|
||||||
cvar_t *r_particles_max;
|
cvar_t *r_particles_max;
|
||||||
|
cvar_t *r_particles_nearclip;
|
||||||
cvar_t *r_reportedgeout;
|
cvar_t *r_reportedgeout;
|
||||||
cvar_t *r_reportsurfout;
|
cvar_t *r_reportsurfout;
|
||||||
cvar_t *r_shadows;
|
cvar_t *r_shadows;
|
||||||
|
@ -162,6 +166,33 @@ r_lightmap_components_f (cvar_t *var)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
r_farclip_f (cvar_t *var)
|
||||||
|
{
|
||||||
|
Cvar_SetValue (r_farclip, bound (8.0, var->value, Q_MAXFLOAT));
|
||||||
|
if (r_particles_nearclip && r_nearclip)
|
||||||
|
Cvar_SetValue (r_particles_nearclip,
|
||||||
|
bound (r_nearclip->value, var->value,
|
||||||
|
r_farclip->value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
r_nearclip_f (cvar_t *var)
|
||||||
|
{
|
||||||
|
Cvar_SetValue (r_nearclip, bound (0.01, var->value, 4.0));
|
||||||
|
if (r_particles_nearclip && r_farclip)
|
||||||
|
Cvar_SetValue (r_particles_nearclip,
|
||||||
|
bound (r_nearclip->value, var->value,
|
||||||
|
r_farclip->value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
r_particles_nearclip_f (cvar_t *var)
|
||||||
|
{
|
||||||
|
Cvar_SetValue (r_particles_nearclip, bound (r_nearclip->value, var->value,
|
||||||
|
r_farclip->value));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
R_Init_Cvars (void)
|
R_Init_Cvars (void)
|
||||||
{
|
{
|
||||||
|
@ -286,8 +317,9 @@ R_Init_Cvars (void)
|
||||||
"Set to 0 to disable lightmap changes");
|
"Set to 0 to disable lightmap changes");
|
||||||
r_explosionclip = Cvar_Get ("r_explosionclip", "0", CVAR_ARCHIVE, NULL,
|
r_explosionclip = Cvar_Get ("r_explosionclip", "0", CVAR_ARCHIVE, NULL,
|
||||||
"Clip explosions.");
|
"Clip explosions.");
|
||||||
r_farclip = Cvar_Get ("r_farclip", "4096", CVAR_ARCHIVE, NULL, "Distance "
|
r_farclip = Cvar_Get ("r_farclip", "4096", CVAR_ARCHIVE, r_farclip_f,
|
||||||
"of the far clipping plane from the player.");
|
"Distance of the far clipping plane from the "
|
||||||
|
"player.");
|
||||||
r_firecolor = Cvar_Get ("r_firecolor", "0.9 0.7 0.0", CVAR_ARCHIVE, NULL,
|
r_firecolor = Cvar_Get ("r_firecolor", "0.9 0.7 0.0", CVAR_ARCHIVE, NULL,
|
||||||
"color of rocket and lava ball fires");
|
"color of rocket and lava ball fires");
|
||||||
r_graphheight = Cvar_Get ("r_graphheight", "32", CVAR_NONE, NULL,
|
r_graphheight = Cvar_Get ("r_graphheight", "32", CVAR_NONE, NULL,
|
||||||
|
@ -302,6 +334,9 @@ R_Init_Cvars (void)
|
||||||
r_maxsurfs = Cvar_Get ("r_maxsurfs", "0", CVAR_NONE, NULL,
|
r_maxsurfs = Cvar_Get ("r_maxsurfs", "0", CVAR_NONE, NULL,
|
||||||
"Sets the maximum number of surfaces");
|
"Sets the maximum number of surfaces");
|
||||||
r_mirroralpha = Cvar_Get ("r_mirroralpha", "1", CVAR_NONE, NULL, "None");
|
r_mirroralpha = Cvar_Get ("r_mirroralpha", "1", CVAR_NONE, NULL, "None");
|
||||||
|
r_nearclip = Cvar_Get ("r_nearclip", "4", CVAR_ARCHIVE, r_nearclip_f,
|
||||||
|
"Distance of the near clipping plane from the "
|
||||||
|
"player.");
|
||||||
r_netgraph = Cvar_Get ("r_netgraph", "0", CVAR_NONE, NULL,
|
r_netgraph = Cvar_Get ("r_netgraph", "0", CVAR_NONE, NULL,
|
||||||
"Toggle the display of a graph showing network "
|
"Toggle the display of a graph showing network "
|
||||||
"performance");
|
"performance");
|
||||||
|
@ -325,6 +360,10 @@ R_Init_Cvars (void)
|
||||||
r_particles_max_f, "Maximum amount of "
|
r_particles_max_f, "Maximum amount of "
|
||||||
"particles to display. No maximum, minimum "
|
"particles to display. No maximum, minimum "
|
||||||
"is 0.");
|
"is 0.");
|
||||||
|
r_particles_nearclip = Cvar_Get ("r_particles_nearclip", "32",
|
||||||
|
CVAR_ARCHIVE, r_particles_nearclip_f,
|
||||||
|
"Distance of the particle near clipping "
|
||||||
|
"plane from the player.");
|
||||||
r_particles_style = Cvar_Get ("r_particles_style", "1", CVAR_ARCHIVE,
|
r_particles_style = Cvar_Get ("r_particles_style", "1", CVAR_ARCHIVE,
|
||||||
r_particles_style_f, "Sets particle style. "
|
r_particles_style_f, "Sets particle style. "
|
||||||
"0 for Id, 1 for QF.");
|
"0 for Id, 1 for QF.");
|
||||||
|
|
Loading…
Reference in a new issue