mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-01-20 08:21:08 +00:00
Share R_CullBox and R_SetFrustum
This commit is contained in:
parent
32ab1e1815
commit
0cd2eed28b
12 changed files with 106 additions and 157 deletions
|
@ -116,3 +116,68 @@ R_MarkLights(dlight_t *light, int bit, mnode_t *node, int r_dlightframecount,
|
|||
R_MarkLights(light, bit, node->children[1], r_dlightframecount,
|
||||
mark_surface_lights);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if the box is completely outside the frustom
|
||||
*/
|
||||
qboolean
|
||||
R_CullBox(vec3_t mins, vec3_t maxs, cplane_t *frustum)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (BOX_ON_PLANE_SIDE(mins, maxs, frustum + i) == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int
|
||||
R_SignbitsForPlane(cplane_t *out)
|
||||
{
|
||||
int bits, j;
|
||||
|
||||
/* for fast box on planeside test */
|
||||
bits = 0;
|
||||
|
||||
for (j = 0; j < 3; j++)
|
||||
{
|
||||
if (out->normal[j] < 0)
|
||||
{
|
||||
bits |= 1 << j;
|
||||
}
|
||||
}
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
void
|
||||
R_SetFrustum(vec3_t vup, vec3_t vpn, vec3_t vright, vec3_t r_origin,
|
||||
float fov_x, float fov_y, cplane_t *frustum)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* rotate VPN right by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[0].normal, vup, vpn,
|
||||
-(90 - fov_x / 2));
|
||||
/* rotate VPN left by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[1].normal,
|
||||
vup, vpn, 90 - fov_x / 2);
|
||||
/* rotate VPN up by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[2].normal,
|
||||
vright, vpn, 90 - fov_y / 2);
|
||||
/* rotate VPN down by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[3].normal, vright, vpn,
|
||||
-(90 - fov_y / 2));
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
frustum[i].type = PLANE_ANYZ;
|
||||
frustum[i].dist = DotProduct(r_origin, frustum[i].normal);
|
||||
frustum[i].signbits = R_SignbitsForPlane(&frustum[i]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ cvar_t *gl1_ztrick;
|
|||
cvar_t *gl_zfix;
|
||||
cvar_t *gl_finish;
|
||||
cvar_t *r_clear;
|
||||
cvar_t *gl_cull;
|
||||
cvar_t *r_cull;
|
||||
cvar_t *gl_polyblend;
|
||||
cvar_t *gl1_flashblend;
|
||||
cvar_t *gl1_saturatelighting;
|
||||
|
@ -143,30 +143,6 @@ cvar_t *gl1_stereo_convergence;
|
|||
|
||||
refimport_t ri;
|
||||
|
||||
/*
|
||||
* Returns true if the box is completely outside the frustom
|
||||
*/
|
||||
qboolean
|
||||
R_CullBox(vec3_t mins, vec3_t maxs)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!gl_cull->value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (BOX_ON_PLANE_SIDE(mins, maxs, &frustum[i]) == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
R_RotateForEntity(entity_t *e)
|
||||
{
|
||||
|
@ -642,51 +618,6 @@ R_PolyBlend(void)
|
|||
glColor4f(1, 1, 1, 1);
|
||||
}
|
||||
|
||||
int
|
||||
R_SignbitsForPlane(cplane_t *out)
|
||||
{
|
||||
int bits, j;
|
||||
|
||||
/* for fast box on planeside test */
|
||||
bits = 0;
|
||||
|
||||
for (j = 0; j < 3; j++)
|
||||
{
|
||||
if (out->normal[j] < 0)
|
||||
{
|
||||
bits |= 1 << j;
|
||||
}
|
||||
}
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
void
|
||||
R_SetFrustum(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* rotate VPN right by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[0].normal, vup, vpn,
|
||||
-(90 - r_newrefdef.fov_x / 2));
|
||||
/* rotate VPN left by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[1].normal,
|
||||
vup, vpn, 90 - r_newrefdef.fov_x / 2);
|
||||
/* rotate VPN up by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[2].normal,
|
||||
vright, vpn, 90 - r_newrefdef.fov_y / 2);
|
||||
/* rotate VPN down by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[3].normal, vright, vpn,
|
||||
-(90 - r_newrefdef.fov_y / 2));
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
frustum[i].type = PLANE_ANYZ;
|
||||
frustum[i].dist = DotProduct(r_origin, frustum[i].normal);
|
||||
frustum[i].signbits = R_SignbitsForPlane(&frustum[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
R_SetupFrame(void)
|
||||
{
|
||||
|
@ -849,7 +780,7 @@ R_SetupGL(void)
|
|||
glGetFloatv(GL_MODELVIEW_MATRIX, r_world_matrix);
|
||||
|
||||
/* set drawing parms */
|
||||
if (gl_cull->value)
|
||||
if (r_cull->value)
|
||||
{
|
||||
glEnable(GL_CULL_FACE);
|
||||
}
|
||||
|
@ -1120,7 +1051,8 @@ R_RenderView(refdef_t *fd)
|
|||
|
||||
R_SetupFrame();
|
||||
|
||||
R_SetFrustum();
|
||||
R_SetFrustum(vup, vpn, vright, r_origin, r_newrefdef.fov_x, r_newrefdef.fov_y,
|
||||
frustum);
|
||||
|
||||
R_SetupGL();
|
||||
|
||||
|
@ -1266,7 +1198,7 @@ R_Register(void)
|
|||
gl_zfix = ri.Cvar_Get("gl_zfix", "0", 0);
|
||||
gl_finish = ri.Cvar_Get("gl_finish", "0", CVAR_ARCHIVE);
|
||||
r_clear = ri.Cvar_Get("r_clear", "0", 0);
|
||||
gl_cull = ri.Cvar_Get("gl_cull", "1", 0);
|
||||
r_cull = ri.Cvar_Get("r_cull", "1", 0);
|
||||
gl_polyblend = ri.Cvar_Get("gl_polyblend", "1", 0);
|
||||
gl1_flashblend = ri.Cvar_Get("gl1_flashblend", "0", 0);
|
||||
r_fixsurfsky = ri.Cvar_Get("r_fixsurfsky", "0", CVAR_ARCHIVE);
|
||||
|
|
|
@ -734,7 +734,7 @@ R_DrawBrushModel(entity_t *currententity, const model_t *currentmodel)
|
|||
VectorAdd(currententity->origin, currentmodel->maxs, maxs);
|
||||
}
|
||||
|
||||
if (R_CullBox(mins, maxs))
|
||||
if (r_cull->value && R_CullBox(mins, maxs, frustum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -809,7 +809,7 @@ R_RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
|||
return;
|
||||
}
|
||||
|
||||
if (R_CullBox(node->minmaxs, node->minmaxs + 3))
|
||||
if (r_cull->value && R_CullBox(node->minmaxs, node->minmaxs + 3, frustum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -213,7 +213,7 @@ extern cvar_t *gl_finish;
|
|||
extern cvar_t *gl1_ztrick;
|
||||
extern cvar_t *gl_zfix;
|
||||
extern cvar_t *r_clear;
|
||||
extern cvar_t *gl_cull;
|
||||
extern cvar_t *r_cull;
|
||||
extern cvar_t *gl1_polyblend;
|
||||
extern cvar_t *gl1_flashblend;
|
||||
extern cvar_t *r_modulate;
|
||||
|
@ -267,7 +267,6 @@ void R_DrawAlphaSurfaces(void);
|
|||
void R_InitParticleTexture(void);
|
||||
void Draw_InitLocal(void);
|
||||
void R_SubdivideSurface(model_t *loadmodel, msurface_t *fa);
|
||||
qboolean R_CullBox(vec3_t mins, vec3_t maxs);
|
||||
void R_RotateForEntity(entity_t *e);
|
||||
void R_MarkLeaves(void);
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ cvar_t *r_novis;
|
|||
cvar_t *r_speeds;
|
||||
cvar_t *gl_finish;
|
||||
|
||||
cvar_t *gl_cull;
|
||||
cvar_t *r_cull;
|
||||
cvar_t *gl_zfix;
|
||||
cvar_t *r_fullbright;
|
||||
cvar_t *r_modulate;
|
||||
|
@ -262,7 +262,7 @@ GL3_Register(void)
|
|||
r_modulate = ri.Cvar_Get("r_modulate", "1", CVAR_ARCHIVE);
|
||||
gl_zfix = ri.Cvar_Get("gl_zfix", "0", 0);
|
||||
r_clear = ri.Cvar_Get("r_clear", "0", 0);
|
||||
gl_cull = ri.Cvar_Get("gl_cull", "1", 0);
|
||||
r_cull = ri.Cvar_Get("r_cull", "1", 0);
|
||||
r_lockpvs = ri.Cvar_Get("r_lockpvs", "0", 0);
|
||||
r_novis = ri.Cvar_Get("r_novis", "0", 0);
|
||||
r_speeds = ri.Cvar_Get("r_speeds", "0", 0);
|
||||
|
@ -302,7 +302,6 @@ GL3_Register(void)
|
|||
//gl_zfix = ri.Cvar_Get("gl_zfix", "0", 0);
|
||||
//gl_finish = ri.Cvar_Get("gl_finish", "0", CVAR_ARCHIVE);
|
||||
r_clear = ri.Cvar_Get("r_clear", "0", 0);
|
||||
// gl_cull = ri.Cvar_Get("gl_cull", "1", 0);
|
||||
//gl1_flashblend = ri.Cvar_Get("gl1_flashblend", "0", 0);
|
||||
|
||||
//gl_texturemode = ri.Cvar_Get("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE);
|
||||
|
@ -1023,7 +1022,7 @@ GL3_DrawParticles(void)
|
|||
glDisable(GL_BLEND);
|
||||
glDepthMask(GL_TRUE);
|
||||
#ifdef YQ2_GL3_GLES
|
||||
if(gl_cull->value != 0.0f)
|
||||
if(r_cull->value != 0.0f)
|
||||
glEnable(GL_CULL_FACE);
|
||||
#else
|
||||
glDisable(GL_PROGRAM_POINT_SIZE);
|
||||
|
@ -1139,51 +1138,6 @@ GL3_DrawEntitiesOnList(void)
|
|||
|
||||
}
|
||||
|
||||
static int
|
||||
SignbitsForPlane(cplane_t *out)
|
||||
{
|
||||
int bits, j;
|
||||
|
||||
/* for fast box on planeside test */
|
||||
bits = 0;
|
||||
|
||||
for (j = 0; j < 3; j++)
|
||||
{
|
||||
if (out->normal[j] < 0)
|
||||
{
|
||||
bits |= 1 << j;
|
||||
}
|
||||
}
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
static void
|
||||
SetFrustum(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* rotate VPN right by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[0].normal, vup, vpn,
|
||||
-(90 - gl3_newrefdef.fov_x / 2));
|
||||
/* rotate VPN left by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[1].normal,
|
||||
vup, vpn, 90 - gl3_newrefdef.fov_x / 2);
|
||||
/* rotate VPN up by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[2].normal,
|
||||
vright, vpn, 90 - gl3_newrefdef.fov_y / 2);
|
||||
/* rotate VPN down by FOV_X/2 degrees */
|
||||
RotatePointAroundVector(frustum[3].normal, vright, vpn,
|
||||
-(90 - gl3_newrefdef.fov_y / 2));
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
frustum[i].type = PLANE_ANYZ;
|
||||
frustum[i].dist = DotProduct(gl3_origin, frustum[i].normal);
|
||||
frustum[i].signbits = SignbitsForPlane(&frustum[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SetupFrame(void)
|
||||
{
|
||||
|
@ -1502,7 +1456,7 @@ SetupGL(void)
|
|||
GL3_UpdateUBO3D();
|
||||
|
||||
/* set drawing parms */
|
||||
if (gl_cull->value)
|
||||
if (r_cull->value)
|
||||
{
|
||||
glEnable(GL_CULL_FACE);
|
||||
}
|
||||
|
@ -1659,7 +1613,8 @@ GL3_RenderView(refdef_t *fd)
|
|||
|
||||
SetupFrame();
|
||||
|
||||
SetFrustum();
|
||||
R_SetFrustum(vup, vpn, vright, gl3_origin,
|
||||
gl3_newrefdef.fov_x, gl3_newrefdef.fov_y, frustum);
|
||||
|
||||
SetupGL();
|
||||
|
||||
|
|
|
@ -132,30 +132,6 @@ void GL3_SurfShutdown(void)
|
|||
gl3state.vaoAlias = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if the box is completely outside the frustom
|
||||
*/
|
||||
static qboolean
|
||||
CullBox(vec3_t mins, vec3_t maxs)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!gl_cull->value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (BOX_ON_PLANE_SIDE(mins, maxs, &frustum[i]) == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
SetLightFlags(msurface_t *surf)
|
||||
{
|
||||
|
@ -597,7 +573,7 @@ GL3_DrawBrushModel(entity_t *e, gl3model_t *currentmodel)
|
|||
VectorAdd(e->origin, currentmodel->maxs, maxs);
|
||||
}
|
||||
|
||||
if (CullBox(mins, maxs))
|
||||
if (r_cull->value && R_CullBox(mins, maxs, frustum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -664,7 +640,7 @@ RecursiveWorldNode(entity_t *currententity, mnode_t *node)
|
|||
return;
|
||||
}
|
||||
|
||||
if (CullBox(node->minmaxs, node->minmaxs + 3))
|
||||
if (r_cull->value && R_CullBox(node->minmaxs, node->minmaxs + 3, frustum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -381,7 +381,6 @@ GL3_BindEBO(GLuint ebo)
|
|||
|
||||
extern void GL3_BufferAndDraw3D(const gl3_3D_vtx_t* verts, int numVerts, GLenum drawMode);
|
||||
|
||||
extern qboolean GL3_CullBox(vec3_t mins, vec3_t maxs);
|
||||
extern void GL3_RotateForEntity(entity_t *e);
|
||||
|
||||
// gl3_sdl.c
|
||||
|
@ -523,7 +522,7 @@ extern cvar_t *gl_nobind;
|
|||
extern cvar_t *r_lockpvs;
|
||||
extern cvar_t *r_novis;
|
||||
|
||||
extern cvar_t *gl_cull;
|
||||
extern cvar_t *r_cull;
|
||||
extern cvar_t *gl_zfix;
|
||||
extern cvar_t *r_fullbright;
|
||||
|
||||
|
|
|
@ -219,5 +219,8 @@ extern void R_MarkLights (dlight_t *light, int bit, mnode_t *node, int r_dlightf
|
|||
extern struct image_s *R_TextureAnimation(const entity_t *currententity,
|
||||
const mtexinfo_t *tex);
|
||||
extern qboolean R_AreaVisible(const byte *areabits, mleaf_t *pleaf);
|
||||
extern qboolean R_CullBox(vec3_t mins, vec3_t maxs, cplane_t *frustum);
|
||||
extern void R_SetFrustum(vec3_t vup, vec3_t vpn, vec3_t vright, vec3_t r_origin,
|
||||
float fov_x, float fov_y, cplane_t *frustum);
|
||||
|
||||
#endif /* SRC_CLIENT_REFRESH_REF_SHARED_H_ */
|
||||
|
|
|
@ -441,10 +441,12 @@ extern cvar_t *r_lerpmodels;
|
|||
extern cvar_t *r_lightlevel;
|
||||
extern cvar_t *r_modulate;
|
||||
extern cvar_t *r_fixsurfsky;
|
||||
extern cvar_t *r_cull;
|
||||
|
||||
|
||||
extern clipplane_t view_clipplanes[4];
|
||||
extern int *pfrustum_indexes[4];
|
||||
extern cplane_t frustum[4];
|
||||
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
@ -464,10 +464,19 @@ R_RecursiveWorldNode (entity_t *currententity, const model_t *currentmodel, mnod
|
|||
mleaf_t *pleaf;
|
||||
|
||||
if (node->contents == CONTENTS_SOLID)
|
||||
{
|
||||
return; // solid
|
||||
}
|
||||
|
||||
if (node->visframe != r_visframecount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (r_cull->value && R_CullBox(node->minmaxs, node->minmaxs + 3, frustum))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// cull the clipping planes if not trivial accept
|
||||
// FIXME: the compiler is doing a lousy job of optimizing here; it could be
|
||||
|
|
|
@ -174,6 +174,7 @@ static cvar_t *vid_gamma;
|
|||
|
||||
static cvar_t *r_lockpvs;
|
||||
static cvar_t *r_palettedtexture;
|
||||
cvar_t *r_cull;
|
||||
|
||||
// sw_vars.c
|
||||
|
||||
|
@ -414,6 +415,7 @@ R_RegisterVariables (void)
|
|||
r_customheight = ri.Cvar_Get("r_customheight", "768", CVAR_ARCHIVE);
|
||||
r_fixsurfsky = ri.Cvar_Get("r_fixsurfsky", "0", CVAR_ARCHIVE);
|
||||
r_palettedtexture = ri.Cvar_Get("r_palettedtexture", "0", 0);
|
||||
r_cull = ri.Cvar_Get("r_cull", "1", 0);
|
||||
|
||||
vid_fullscreen = ri.Cvar_Get( "vid_fullscreen", "0", CVAR_ARCHIVE );
|
||||
vid_gamma = ri.Cvar_Get( "vid_gamma", "1.0", CVAR_ARCHIVE );
|
||||
|
@ -1008,7 +1010,7 @@ R_FindTopnode (vec3_t mins, vec3_t maxs)
|
|||
}
|
||||
|
||||
splitplane = node->plane;
|
||||
sides = BOX_ON_PLANE_SIDE(mins, maxs, (cplane_t *)splitplane);
|
||||
sides = BOX_ON_PLANE_SIDE(mins, maxs, splitplane);
|
||||
|
||||
if (sides == 3)
|
||||
return node; // this is the splitter
|
||||
|
@ -1299,6 +1301,9 @@ VectorCompareRound(const vec3_t v1, const vec3_t v2)
|
|||
return 1;
|
||||
}
|
||||
|
||||
cplane_t frustum[4];
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
RE_RenderFrame
|
||||
|
@ -1343,6 +1348,9 @@ RE_RenderFrame (refdef_t *fd)
|
|||
|
||||
R_SetupFrame ();
|
||||
|
||||
R_SetFrustum(vup, vpn, vright, r_origin, r_newrefdef.fov_x, r_newrefdef.fov_y,
|
||||
frustum);
|
||||
|
||||
// Using the current view cluster (r_viewcluster), retrieve and decompress
|
||||
// the PVS (Potentially Visible Set)
|
||||
R_MarkLeaves (); // done here so we know if we're in water
|
||||
|
|
|
@ -90,6 +90,7 @@ replacement_t replacements[] = {
|
|||
{"gl_anisotropic", "r_anisotropic"},
|
||||
{"gl_lightmap", "r_lighmap"},
|
||||
{"gl1_polyblend", "gl_polyblend"},
|
||||
{"gl_cull", "r_cull"},
|
||||
{"intensity", "gl1_intensity"}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue