// true during envmap command capture
qboolean envmap;
+// maximum visible distance (recalculated from world box each frame)
float r_farclip;
+// brightness of world lightmaps and related lighting
+// (often reduced when world rtlights are enabled)
+float r_lightmapintensity;
+// whether to draw world lights realtime, dlights realtime, and their shadows
+qboolean r_rtworld;
+qboolean r_rtworldshadows;
+qboolean r_rtdlight;
+qboolean r_rtdlightshadows;
+
+
+// forces all rendering to draw triangle outlines
+int r_showtrispass;
// view origin
vec3_t r_vieworigin;
vec3_t r_viewup;
int r_view_x;
int r_view_y;
+int r_view_z;
int r_view_width;
int r_view_height;
+int r_view_depth;
float r_view_fov_x;
float r_view_fov_y;
matrix4x4_t r_view_matrix;
// 8.8 fraction of base light value
unsigned short d_lightstylevalue[256];
+cvar_t r_showtris = {0, "r_showtris", "0"};
cvar_t r_drawentities = {0, "r_drawentities","1"};
cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1"};
cvar_t r_speeds = {0, "r_speeds","0"};
VectorCopy(oldangles, cl.viewangles);
intimerefresh = 0;
- Con_Printf ("%f seconds (%f fps)\n", timedelta, 128/timedelta);
+ Con_Printf("%f seconds (%f fps)\n", timedelta, 128/timedelta);
}
vec3_t fogcolor;
if (l >= 0 && !strcmp(entname + l, ".bsp"))
{
strcpy(entname + l, ".ent");
- if ((entities = FS_LoadFile(entname, true)))
+ if ((entities = FS_LoadFile(entname, tempmempool, true)))
{
CL_ParseEntityLump(entities);
Mem_Free(entities);
// FIXME: move this to client?
FOG_registercvars();
Cmd_AddCommand("timerefresh", R_TimeRefresh_f);
+ Cvar_RegisterVariable(&r_showtris);
Cvar_RegisterVariable(&r_drawentities);
Cvar_RegisterVariable(&r_drawviewmodel);
Cvar_RegisterVariable(&r_speeds);
Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin);
// some of the renderer still relies on scale...
ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
- R_LerpAnimation(ent);
R_UpdateEntLights(ent);
if ((chase_active.integer || !(ent->flags & RENDER_EXTERIORMODEL))
- && !VIS_CullBox(ent->mins, ent->maxs)
+ && (!VIS_CullBox(ent->mins, ent->maxs) || (ent->effects & EF_NODEPTHTEST))
&& (!envmap || !(ent->flags & (RENDER_VIEWMODEL | RENDER_EXTERIORMODEL))))
ent->visframe = r_framecount;
}
return sky;
}
-/*
-=============
-R_DrawViewModel
-=============
-*/
-/*
-void R_DrawViewModel (void)
-{
- entity_render_t *ent;
-
- // FIXME: move these checks to client
- if (!r_drawviewmodel.integer || chase_active.integer || envmap || !r_drawentities.integer || cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0 || !cl.viewent.render.model)
- return;
-
- ent = &cl.viewent.render;
- Mod_CheckLoaded(ent->model);
- R_LerpAnimation(ent);
- Matrix4x4_CreateFromQuakeEntity(&ent->matrix, ent->origin[0], ent->origin[1], ent->origin[2], -ent->angles[0], ent->angles[1], ent->angles[2], ent->scale);
- Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix);
- R_UpdateEntLights(ent);
- ent->model->Draw(ent);
-}
-*/
-
void R_DrawNoModel(entity_render_t *ent);
void R_DrawModels(void)
{
R_Mesh_Matrix(&r_identitymatrix);
memset(&m, 0, sizeof(m));
- R_Mesh_State_Texture(&m);
+ m.pointer_vertex = vertex3f;
+ R_Mesh_State(&m);
GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GL_DepthMask(true);
GL_DepthTest(false); // magic
- GL_VertexPointer(vertex3f);
GL_Color(r_refdef.viewblend[0], r_refdef.viewblend[1], r_refdef.viewblend[2], r_refdef.viewblend[3]);
r = 64;
vertex3f[0] = r_vieworigin[0] + r_viewforward[0] * 1.5 + r_viewleft[0] * r - r_viewup[0] * r;
R_Mesh_Draw(3, 1, polygonelements);
}
-void R_UpdateWorld(void)
-{
- if (!r_refdef.entities/* || !cl.worldmodel*/)
- return; //Host_Error ("R_RenderView: NULL worldmodel");
-
- if (r_shadow_realtime_world.integer && !gl_stencil)
- {
- Con_Printf("Realtime world lighting requires 32bit color; turning off r_shadow_realtime_world, please type vid_bitsperpixel 32;vid_restart and try again\n");
- Cvar_SetValueQuick(&r_shadow_realtime_world, 0);
- }
-
- // don't allow cheats in multiplayer
- if (!cl.islocalgame)
- {
- if (r_fullbright.integer != 0)
- Cvar_Set ("r_fullbright", "0");
- if (r_ambient.value != 0)
- Cvar_Set ("r_ambient", "0");
- }
-
- R_Textures_Frame();
- R_UpdateFog();
- R_UpdateLights();
-}
-
void R_RenderScene(void);
/*
{
if (!r_refdef.entities/* || !cl.worldmodel*/)
return; //Host_Error ("R_RenderView: NULL worldmodel");
-
+
r_view_width = bound(0, r_refdef.width, vid.realwidth);
r_view_height = bound(0, r_refdef.height, vid.realheight);
+ r_view_depth = 1;
r_view_x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width);
r_view_y = bound(0, r_refdef.y, vid.realheight - r_refdef.height);
+ r_view_z = 0;
r_view_fov_x = bound(1, r_refdef.fov_x, 170);
r_view_fov_y = bound(1, r_refdef.fov_y, 170);
r_view_matrix = r_refdef.viewentitymatrix;
+ GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1);
+ r_rtworld = r_shadow_realtime_world.integer;
+ r_rtworldshadows = r_shadow_realtime_world_shadows.integer && gl_stencil;
+ r_rtdlight = r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer;
+ r_rtdlightshadows = r_rtdlight && (r_rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil;
+ r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1;
// GL is weird because it's bottom to top, r_view_y is top to bottom
qglViewport(r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height);
GL_Scissor(r_view_x, r_view_y, r_view_width, r_view_height);
GL_ScissorTest(true);
+ GL_DepthMask(true);
R_ClearScreen();
-
- R_Mesh_Start();
+ R_Textures_Frame();
+ R_UpdateFog();
+ R_UpdateLights();
R_TimeReport("setup");
qglDepthFunc(GL_LEQUAL);
R_BlendView();
R_TimeReport("blendview");
- R_Mesh_Finish();
- R_TimeReport("meshfinish");
-
GL_Scissor(0, 0, vid.realwidth, vid.realheight);
GL_ScissorTest(false);
}
void R_RenderScene(void)
{
entity_render_t *world;
-
+
// don't let sound skip if going slow
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
r_framecount++;
+ R_MeshQueue_BeginScene();
+
+ GL_ShowTrisColor(0.05, 0.05, 0.05, 1);
+
R_SetFrustum();
r_farclip = R_FarClip(r_vieworigin, r_viewforward, 768.0f) + 256.0f;
- if (gl_stencil && ((r_shadow_realtime_world.integer && r_shadow_worldshadows.integer) || ((r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && r_shadow_dlightshadows.integer)))
+ if (r_rtworldshadows || r_rtdlightshadows)
GL_SetupView_Mode_PerspectiveInfiniteFarClip(r_view_fov_x, r_view_fov_y, 1.0f);
else
GL_SetupView_Mode_Perspective(r_view_fov_x, r_view_fov_y, 1.0f, r_farclip);
R_MarkEntities();
R_TimeReport("markentity");
- R_MeshQueue_BeginScene();
-
R_Shadow_UpdateWorldLightSelection();
// don't let sound skip if going slow
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
+ GL_ShowTrisColor(0.025, 0.025, 0, 1);
+ if (world->model && world->model->DrawSky)
+ {
+ world->model->DrawSky(world);
+ R_TimeReport("worldsky");
+ }
+
if (R_DrawBrushModelsSky())
R_TimeReport("bmodelsky");
- // must occur early because it can draw sky
- R_DrawWorld(world);
- R_TimeReport("world");
+ GL_ShowTrisColor(0.05, 0.05, 0.05, 1);
+ if (world->model && world->model->Draw)
+ {
+ world->model->Draw(world);
+ R_TimeReport("world");
+ }
// don't let sound skip if going slow
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
+ GL_ShowTrisColor(0, 0.015, 0, 1);
+
R_DrawModels();
R_TimeReport("models");
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
+ GL_ShowTrisColor(0, 0, 0.033, 1);
R_ShadowVolumeLighting(false);
R_TimeReport("rtlights");
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
+ GL_ShowTrisColor(0.1, 0, 0, 1);
+
R_DrawLightningBeams();
R_TimeReport("lightning");
R_MeshQueue_Render();
R_MeshQueue_EndScene();
- if (r_shadow_visiblevolumes.integer)
+ if (r_shadow_visiblevolumes.integer && !r_showtrispass)
{
R_ShadowVolumeLighting(true);
R_TimeReport("shadowvolume");
}
+ GL_ShowTrisColor(0.05, 0.05, 0.05, 1);
+
// don't let sound skip if going slow
if (!intimerefresh && !r_speeds.integer)
S_ExtraUpdate ();
GL_DepthTest(true);
R_Mesh_Matrix(&r_identitymatrix);
- memset(&m, 0, sizeof(m));
- R_Mesh_State_Texture(&m);
-
- R_Mesh_GetSpace(8);
vertex3f[ 0] = mins[0];vertex3f[ 1] = mins[1];vertex3f[ 2] = mins[2];
vertex3f[ 3] = maxs[0];vertex3f[ 4] = mins[1];vertex3f[ 5] = mins[2];
vertex3f[ 6] = mins[0];vertex3f[ 7] = maxs[1];vertex3f[ 8] = mins[2];
vertex3f[15] = maxs[0];vertex3f[16] = mins[1];vertex3f[17] = maxs[2];
vertex3f[18] = mins[0];vertex3f[19] = maxs[1];vertex3f[20] = maxs[2];
vertex3f[21] = maxs[0];vertex3f[22] = maxs[1];vertex3f[23] = maxs[2];
- GL_ColorPointer(color);
R_FillColors(color, 8, cr, cg, cb, ca);
if (fogenabled)
{
c[2] = c[2] * f1 + fogcolor[2] * f2;
}
}
+ memset(&m, 0, sizeof(m));
+ m.pointer_vertex = vertex3f;
+ m.pointer_color = color;
+ R_Mesh_State(&m);
R_Mesh_Draw(8, 12);
}
*/
R_Mesh_Matrix(&ent->matrix);
memset(&m, 0, sizeof(m));
- R_Mesh_State_Texture(&m);
+ m.pointer_vertex = nomodelvertex3f;
if (ent->flags & EF_ADDITIVE)
{
GL_BlendFunc(GL_ONE, GL_ZERO);
GL_DepthMask(true);
}
- GL_DepthTest(true);
- GL_VertexPointer(nomodelvertex3f);
+ GL_DepthTest(!(ent->effects & EF_NODEPTHTEST));
if (fogenabled)
{
memcpy(color4f, nomodelcolor4f, sizeof(float[6*4]));
- GL_ColorPointer(color4f);
+ m.pointer_color = color4f;
VectorSubtract(ent->origin, r_vieworigin, diff);
f2 = exp(fogdensity/DotProduct(diff, diff));
f1 = 1 - f2;
else if (ent->alpha != 1)
{
memcpy(color4f, nomodelcolor4f, sizeof(float[6*4]));
- GL_ColorPointer(color4f);
+ m.pointer_color = color4f;
for (i = 0, c = color4f;i < 6;i++, c += 4)
c[3] *= ent->alpha;
}
else
- GL_ColorPointer(nomodelcolor4f);
+ m.pointer_color = nomodelcolor4f;
+ R_Mesh_State(&m);
R_Mesh_Draw(6, 8, nomodelelements);
}
void R_DrawNoModel(entity_render_t *ent)
{
//if ((ent->effects & EF_ADDITIVE) || (ent->alpha < 1))
- R_MeshQueue_AddTransparent(ent->origin, R_DrawNoModelCallback, ent, 0);
+ R_MeshQueue_AddTransparent(ent->effects & EF_NODEPTHTEST ? r_vieworigin : ent->origin, R_DrawNoModelCallback, ent, 0);
//else
// R_DrawNoModelCallback(ent, 0);
}
}
R_Mesh_Matrix(&r_identitymatrix);
- GL_Color(cr, cg, cb, ca);
- GL_VertexPointer(varray_vertex3f);
GL_BlendFunc(blendfunc1, blendfunc2);
GL_DepthMask(false);
GL_DepthTest(!depthdisable);
- memset(&m, 0, sizeof(m));
- m.tex[0] = R_GetTexture(texture);
- m.pointer_texcoord[0] = spritetexcoord2f;
- R_Mesh_State_Texture(&m);
-
varray_vertex3f[ 0] = origin[0] + left[0] * scalex2 + up[0] * scaley1;
varray_vertex3f[ 1] = origin[1] + left[1] * scalex2 + up[1] * scaley1;
varray_vertex3f[ 2] = origin[2] + left[2] * scalex2 + up[2] * scaley1;
varray_vertex3f[ 9] = origin[0] + left[0] * scalex1 + up[0] * scaley1;
varray_vertex3f[10] = origin[1] + left[1] * scalex1 + up[1] * scaley1;
varray_vertex3f[11] = origin[2] + left[2] * scalex1 + up[2] * scaley1;
+
+ memset(&m, 0, sizeof(m));
+ m.tex[0] = R_GetTexture(texture);
+ m.pointer_texcoord[0] = spritetexcoord2f;
+ m.pointer_vertex = varray_vertex3f;
+ R_Mesh_State(&m);
+ GL_Color(cr, cg, cb, ca);
R_Mesh_Draw(4, 2, polygonelements);
}