}
#endif
-float r_farclip, r_newfarclip;
+float r_mesh_farclip;
int polyindexarray[768];
static float viewdist;
+// sign bits (true if negative) for vpn[] entries, so quick integer compares can be used instead of float compares
+static int vpnbit0, vpnbit1, vpnbit2;
int c_meshs, c_meshtris, c_transmeshs, c_transtris;
-int lightscalebit;
-float lightscale;
-float overbrightscale;
+int lightscalebit;
+float lightscale;
+float overbrightscale;
void SCR_ScreenShot_f (void);
}
buf_texcoord_t;
-static float meshfarclip;
static int currentmesh, currenttriangle, currentvertex, backendunits, backendactive, transranout;
static buf_mesh_t *buf_mesh;
static buf_tri_t *buf_tri;
static void gl_backend_newmap(void)
{
- r_farclip = r_newfarclip = 2048.0f;
}
void gl_backend_init(void)
double xmax, ymax;
double fovx, fovy, zNear, zFar, aspect;
- // update farclip based on previous frame
- r_farclip = r_newfarclip;
-
if (!r_render.integer)
return;
// depth range
zNear = 1.0;
- zFar = r_farclip;
+ zFar = r_mesh_farclip;
// fov angles
fovx = r_refdef.fov_x;
// called at beginning of frame
int usedarrays;
-void R_Mesh_Start(void)
+void R_Mesh_Start(float farclip)
{
int i;
if (!backendactive)
currenttransmesh = 0;
currenttranstriangle = 0;
currenttransvertex = 0;
- meshfarclip = 0;
transranout = false;
+ r_mesh_farclip = farclip;
viewdist = DotProduct(r_origin, vpn);
+ vpnbit0 = vpn[0] < 0;
+ vpnbit1 = vpn[1] < 0;
+ vpnbit2 = vpn[2] < 0;
c_meshs = 0;
c_meshtris = 0;
int gl_backend_rebindtextures;
-void GL_UpdateFarclip(void)
-{
- int i;
- float farclip;
-
- // push out farclip based on vertices
- // FIXME: wouldn't this be slow when using matrix transforms?
- for (i = 0;i < currentvertex;i++)
- {
- farclip = DotProduct(buf_vertex[i].v, vpn);
- if (meshfarclip < farclip)
- meshfarclip = farclip;
- }
-
- farclip = meshfarclip + 256.0f - viewdist; // + 256 just to be safe
-
- // push out farclip for next frame
- if (farclip > r_newfarclip)
- r_newfarclip = ceil((farclip + 255) / 256) * 256 + 256;
-}
-
void GL_ConvertColorsFloatToByte(void)
{
int i, k, total;
CHECKGLERROR
- GL_UpdateFarclip();
-
// drawmode 0 always uses byte colors
if (!gl_mesh_floatcolors.integer || gl_mesh_drawmode.integer <= 0)
GL_ConvertColorsFloatToByte();
void R_Mesh_ClearDepth(void)
{
- R_Mesh_AddTransparent();
+ if (currenttransmesh)
+ R_Mesh_AddTransparent();
+ if (currentmesh)
+ R_Mesh_Render();
R_Mesh_Finish();
qglClear(GL_DEPTH_BUFFER_BIT);
- R_Mesh_Start();
+ R_Mesh_Start(r_mesh_farclip);
}
void R_Mesh_AddTransparent(void)
}
// map farclip to 0-4095 list range
- centerscaler = (TRANSDEPTHRES / r_farclip) * (1.0f / 3.0f);
+ centerscaler = (TRANSDEPTHRES / r_mesh_farclip) * (1.0f / 3.0f);
viewdistcompare = viewdist + 4.0f;
memset(buf_sorttranstri_list, 0, TRANSDEPTHRES * sizeof(buf_transtri_t *));
#include "quakedef.h"
-entity_render_t *currentrenderentity;
+entity_render_t *currentrenderentity;
-int r_framecount; // used for dlight push checking
+// used for dlight push checking and other things
+int r_framecount;
-mplane_t frustum[4];
+mplane_t frustum[4];
-int c_brush_polys, c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels, c_sprites, c_particles, c_dlights;
+int c_brush_polys, c_alias_polys, c_light_polys, c_faces, c_nodes, c_leafs, c_models, c_bmodels, c_sprites, c_particles, c_dlights;
-qboolean envmap; // true during envmap command capture
+// true during envmap command capture
+qboolean envmap;
+
+float r_farclip;
-//
// view origin
-//
-vec3_t vup;
-vec3_t vpn;
-vec3_t vright;
-vec3_t r_origin;
+vec3_t r_origin;
+vec3_t vpn;
+vec3_t vright;
+vec3_t vup;
//
// screen size info
//
-refdef_t r_refdef;
-
-mleaf_t *r_viewleaf, *r_oldviewleaf;
-
-unsigned short d_lightstylevalue[256]; // 8.8 fraction of base light value
-
-cvar_t r_drawentities = {0, "r_drawentities","1"};
-cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1"};
-cvar_t r_speeds = {0, "r_speeds","0"};
-cvar_t r_fullbright = {0, "r_fullbright","0"};
-cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"};
-cvar_t r_dynamic = {CVAR_SAVE, "r_dynamic","1"};
-cvar_t r_waterripple = {CVAR_SAVE, "r_waterripple","0"};
-cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1"};
-
-cvar_t gl_fogenable = {0, "gl_fogenable", "0"};
-cvar_t gl_fogdensity = {0, "gl_fogdensity", "0.25"};
-cvar_t gl_fogred = {0, "gl_fogred","0.3"};
-cvar_t gl_foggreen = {0, "gl_foggreen","0.3"};
-cvar_t gl_fogblue = {0, "gl_fogblue","0.3"};
-cvar_t gl_fogstart = {0, "gl_fogstart", "0"};
-cvar_t gl_fogend = {0, "gl_fogend","0"};
+refdef_t r_refdef;
+
+mleaf_t *r_viewleaf, *r_oldviewleaf;
+
+// 8.8 fraction of base light value
+unsigned short d_lightstylevalue[256];
+
+cvar_t r_drawentities = {0, "r_drawentities","1"};
+cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1"};
+cvar_t r_speeds = {0, "r_speeds","0"};
+cvar_t r_fullbright = {0, "r_fullbright","0"};
+cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"};
+cvar_t r_dynamic = {CVAR_SAVE, "r_dynamic","1"};
+cvar_t r_waterripple = {CVAR_SAVE, "r_waterripple","0"};
+cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1"};
+
+cvar_t gl_fogenable = {0, "gl_fogenable", "0"};
+cvar_t gl_fogdensity = {0, "gl_fogdensity", "0.25"};
+cvar_t gl_fogred = {0, "gl_fogred","0.3"};
+cvar_t gl_foggreen = {0, "gl_foggreen","0.3"};
+cvar_t gl_fogblue = {0, "gl_fogblue","0.3"};
+cvar_t gl_fogstart = {0, "gl_fogstart", "0"};
+cvar_t gl_fogend = {0, "gl_fogend","0"};
cvar_t r_multitexture = {0, "r_multitexture", "1"};
qboolean intimerefresh = 0;
static void R_TimeRefresh_f (void)
{
- int i;
- float start, stop, time;
+ int i;
+ float start, stop, time;
intimerefresh = 1;
start = Sys_DoubleTime ();
R_RegisterModule("GL_Main", gl_main_start, gl_main_shutdown, gl_main_newmap);
}
+vec3_t r_farclip_origin;
+vec3_t r_farclip_direction;
+vec_t r_farclip_directiondist;
+vec_t r_farclip_meshfarclip;
+int r_farclip_directionbit0;
+int r_farclip_directionbit1;
+int r_farclip_directionbit2;
+
+// start a farclip measuring session
+void R_FarClip_Start(vec3_t origin, vec3_t direction, vec_t startfarclip)
+{
+ VectorCopy(origin, r_farclip_origin);
+ VectorCopy(direction, r_farclip_direction);
+ r_farclip_directiondist = DotProduct(r_farclip_origin, r_farclip_direction);
+ r_farclip_directionbit0 = r_farclip_direction[0] < 0;
+ r_farclip_directionbit1 = r_farclip_direction[1] < 0;
+ r_farclip_directionbit2 = r_farclip_direction[2] < 0;
+ r_farclip_meshfarclip = r_farclip_directiondist + startfarclip;
+}
+
+// enlarge farclip to accomodate box
+void R_FarClip_Box(vec3_t mins, vec3_t maxs)
+{
+ float d;
+ d = (r_farclip_directionbit0 ? mins[0] : maxs[0]) * r_farclip_direction[0]
+ + (r_farclip_directionbit1 ? mins[1] : maxs[1]) * r_farclip_direction[1]
+ + (r_farclip_directionbit2 ? mins[2] : maxs[2]) * r_farclip_direction[2];
+ if (r_farclip_meshfarclip < d)
+ r_farclip_meshfarclip = d;
+}
+
+// return farclip value
+float R_FarClip_Finish(void)
+{
+ return r_farclip_meshfarclip - r_farclip_directiondist;
+}
+
/*
===============
R_NewMap
void CL_ParseEntityLump(char *entitystring);
void R_NewMap (void)
{
- int i;
+ int i;
- for (i=0 ; i<256 ; i++)
+ for (i = 0;i < 256;i++)
d_lightstylevalue[i] = 264; // normal light value
r_viewleaf = NULL;
if (cl.worldmodel->entities)
CL_ParseEntityLump(cl.worldmodel->entities);
R_Modules_NewMap();
+
+ r_farclip = 64.0f;
}
extern void R_Textures_Init(void);
//==================================================================================
-void R_Entity_Callback(void *data, void *junk)
-{
- ((entity_render_t *)data)->visframe = r_framecount;
-}
-
static void R_MarkEntities (void)
{
- int i;
- vec3_t v;
+ int i;
+ vec3_t v;
if (!r_drawentities.integer)
return;
+ R_FarClip_Box(cl.worldmodel->normalmins, cl.worldmodel->normalmaxs);
+
for (i = 0;i < r_refdef.numentities;i++)
{
currentrenderentity = r_refdef.entities[i];
R_LerpAnimation(currentrenderentity);
currentrenderentity->visframe = r_framecount;
+
+ R_FarClip_Box(currentrenderentity->mins, currentrenderentity->maxs);
}
}
// only used if skyrendermasked, and normally returns false
int R_DrawBModelSky (void)
{
- int i, sky = false;
+ int i, sky;
if (!r_drawentities.integer)
return false;
+ sky = false;
for (i = 0;i < r_refdef.numentities;i++)
{
currentrenderentity = r_refdef.entities[i];
void R_DrawModels (void)
{
- int i;
+ int i;
if (!r_drawentities.integer)
return;
static void R_SetFrustum (void)
{
- int i;
+ int i;
// LordHavoc: note to all quake engine coders, the special case for 90
// degrees assumed a square view (wrong), so I removed it, Quake2 has it
// 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].dist = DotProduct (r_origin, frustum[i].normal);
R_SkyStartFrame();
R_BuildLightList();
- R_Mesh_Start();
+ R_FarClip_Start(r_origin, vpn, 768.0f);
R_TimeReport("setup");
R_MarkWorldLights();
R_TimeReport("marklights");
+ r_farclip = R_FarClip_Finish() + 256.0f;
+
+ R_Mesh_Start(r_farclip);
+
if (skyrendermasked)
{
if (R_DrawBModelSky())
}
}
-#define R_SkyBoxPolyVec(i,s,t,x,y,z) \
- vert[i][0] = (x) * 1024.0f + r_origin[0];\
- vert[i][1] = (y) * 1024.0f + r_origin[1];\
- vert[i][2] = (z) * 1024.0f + r_origin[2];\
- st[i][0] = (s) * (254.0f/256.0f) + (1.0f/256.0f);\
- st[i][1] = (t) * (254.0f/256.0f) + (1.0f/256.0f);
-
int skyboxindex[6] = {0, 1, 2, 0, 2, 3};
static void R_SkyBox(void)
{
+ float r;
float vert[4][4], st[4][2];
rmeshinfo_t m;
+
+#define R_SkyBoxPolyVec(i,s,t,x,y,z) \
+ vert[i][0] = (x) * r + r_origin[0];\
+ vert[i][1] = (y) * r + r_origin[1];\
+ vert[i][2] = (z) * r + r_origin[2];\
+ st[i][0] = (s) * (254.0f/256.0f) + (1.0f/256.0f);\
+ st[i][1] = (t) * (254.0f/256.0f) + (1.0f/256.0f);
+
+ r = 16.0f;
+
memset(&m, 0, sizeof(m));
m.transparent = false;
m.blendfunc1 = GL_ONE;
if (!skysphereinitialized)
{
skysphereinitialized = true;
- skyspherecalc(skysphere, 1024, 1024, 1024 / 3);
+ skyspherecalc(skysphere, 16, 16, 16 / 3);
}
memset(&m, 0, sizeof(m));
m.transparent = false;