#include "quakedef.h"
+#include "cl_video.h"
cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"};
cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 10 - 170
cvar_t scr_showpause = {CVAR_SAVE, "showpause","1"};
cvar_t scr_printspeed = {0, "scr_printspeed","8"};
cvar_t scr_2dresolution = {CVAR_SAVE, "scr_2dresolution", "1"};
+cvar_t cl_avidemo = {0, "cl_avidemo", "0"};
qboolean scr_initialized; // ready to draw
int clearconsole;
int clearnotify;
-//qboolean scr_disabled_for_loading;
qboolean scr_drawloading = false;
-//float scr_disabled_time;
static qbyte menuplyr_pixels[4096];
scr_centertime_off -= host_frametime;
+ // don't draw if this is a normal stats-screen intermission,
+ // only if it is not an intermission, or a finale intermission
+ if (cl.intermission == 1)
+ return;
if (scr_centertime_off <= 0 && !cl.intermission)
return;
if (key_dest != key_game)
SCR_DrawCenterString ();
}
-/*
-==============
-SCR_DrawRam
-==============
-*/
-void SCR_DrawRam (void)
-{
-// if (!scr_showram.integer)
-// return;
-// DrawQ_Pic (32, 0, "ram", 0, 0, 1, 1, 1, 1, 0);
-}
-
/*
==============
SCR_DrawTurtle
{
cachepic_t *pic;
- //if (!scr_drawloading)
- // return;
-
pic = Draw_CachePic ("gfx/loading.lmp");
DrawQ_Pic ((vid.conwidth - pic->width)/2, (vid.conheight - pic->height)/2, "gfx/loading.lmp", 0, 0, 1, 1, 1, 1, 0);
}
{
Con_CheckResize ();
-// decide on the height of the console
- con_forcedup = !cl.worldmodel || cls.signon != SIGNONS;
+ if (key_dest == key_game && cls.signon != SIGNONS)
+ key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
+ else
+ key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
- if (con_forcedup)
- {
- scr_conlines = vid.conheight; // full screen
- scr_con_current = scr_conlines;
- }
- else if (key_dest == key_console)
+// decide on the height of the console
+ if (key_consoleactive & KEY_CONSOLEACTIVE_FORCED)
+ scr_conlines = vid.conheight; // full screen
+ else if (key_consoleactive & KEY_CONSOLEACTIVE_USER)
scr_conlines = vid.conheight/2; // half screen
else
scr_conlines = 0; // none visible
- if (scr_conlines < scr_con_current)
+ if (scr_conspeed.value)
{
- scr_con_current -= scr_conspeed.value*host_realframetime;
- if (scr_conlines > scr_con_current)
- scr_con_current = scr_conlines;
-
- }
- else if (scr_conlines > scr_con_current)
- {
- scr_con_current += scr_conspeed.value*host_realframetime;
if (scr_conlines < scr_con_current)
- scr_con_current = scr_conlines;
+ {
+ scr_con_current -= scr_conspeed.value*host_realframetime;
+ if (scr_conlines > scr_con_current)
+ scr_con_current = scr_conlines;
+
+ }
+ else if (scr_conlines > scr_con_current)
+ {
+ scr_con_current += scr_conspeed.value*host_realframetime;
+ if (scr_conlines < scr_con_current)
+ scr_con_current = scr_conlines;
+ }
}
+ else
+ scr_con_current = scr_conlines;
}
/*
S_StopAllSounds (true);
-// if (cls.state != ca_connected)
-// return;
-// if (cls.signon != SIGNONS)
-// return;
-
-// redraw with no console and the loading plaque
-// Con_ClearNotify ();
-// scr_centertime_off = 0;
-// scr_con_current = 0;
-
scr_drawloading = true;
CL_UpdateScreen ();
scr_drawloading = true;
CL_UpdateScreen ();
- //scr_drawloading = false;
-
-// scr_disabled_for_loading = true;
-// scr_disabled_time = realtime;
-}
-
-/*
-===============
-SCR_EndLoadingPlaque
-
-================
-*/
-void SCR_EndLoadingPlaque (void)
-{
- /*
- if (!scr_drawloading)
- return;
-
-// scr_disabled_for_loading = false;
- scr_drawloading = false;
- Con_ClearNotify ();
- */
}
//=============================================================================
-char *scr_notifystring;
-
-void SCR_DrawNotifyString (void)
-{
- char *start;
- int l;
- int x, y;
-
- start = scr_notifystring;
-
- y = vid.conheight*0.35;
-
- do
- {
- // scan the width of the line
- for (l=0 ; l<40 ; l++)
- if (start[l] == '\n' || !start[l])
- break;
- x = (vid.conwidth - l*8)/2;
- DrawQ_String (x, y, start, l, 8, 8, 1, 1, 1, 1, 0);
-
- y += 8;
-
- while (*start && *start != '\n')
- start++;
-
- if (!*start)
- break;
- start++; // skip the \n
- }
- while (1);
-}
-
char r_speeds_string[1024];
int speedstringcount, r_timereport_active;
double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
}
}
+extern int c_rt_lights, c_rt_clears, c_rt_scissored;
+extern int c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris;
+extern int c_rtcached_shadowmeshes, c_rtcached_shadowtris;
+extern int r_shadow_lightingmode;
void R_TimeReport_Start(void)
{
- r_timereport_active = r_speeds.integer && cl.worldmodel && cls.state == ca_connected;
+ r_timereport_active = r_speeds.integer && cls.signon == SIGNONS && cls.state == ca_connected;
r_speeds_string[0] = 0;
if (r_timereport_active)
{
speedstringcount = 0;
AngleVectors (r_refdef.viewangles, vpn, NULL, NULL);
- //sprintf(r_speeds_string, "org:'%c%6.2f %c%6.2f %c%6.2f' ang:'%c%3.0f %c%3.0f %c%3.0f' dir:'%c%2.3f %c%2.3f %c%2.3f'\n%6i walls %6i dlitwalls %7i modeltris %7i meshtris\nBSP: %6i faces %6i nodes %6i leafs\n%4i models %4i bmodels %4i sprites %5i particles %3i dlights\n",
- // r_refdef.vieworg[0] < 0 ? '-' : ' ', fabs(r_refdef.vieworg[0]), r_refdef.vieworg[1] < 0 ? '-' : ' ', fabs(r_refdef.vieworg[1]), r_refdef.vieworg[2] < 0 ? '-' : ' ', fabs(r_refdef.vieworg[2]),
- // r_refdef.viewangles[0] < 0 ? '-' : ' ', fabs(r_refdef.viewangles[0]), r_refdef.viewangles[1] < 0 ? '-' : ' ', fabs(r_refdef.viewangles[1]), r_refdef.viewangles[2] < 0 ? '-' : ' ', fabs(r_refdef.viewangles[2]),
- // vpn[0] < 0 ? '-' : ' ', fabs(vpn[0]), vpn[1] < 0 ? '-' : ' ', fabs(vpn[1]), vpn[2] < 0 ? '-' : ' ', fabs(vpn[2]),
sprintf(r_speeds_string,
"org:'%+8.2f %+8.2f %+8.2f' ang:'%+4.0f %+4.0f %+4.0f' dir:'%+2.3f %+2.3f %+2.3f'\n"
- "world:%6i faces%6i nodes%6i leafs%6i walls%6i dlitwalls\n"
+ "world:%6i faces%6i nodes%6i leafs%6i dlitwalls\n"
"%5i models%5i bmodels%5i sprites%6i particles%4i dlights\n"
- "%6i modeltris%6i transmeshs%6i transtris%6i meshs%6i meshtris\n",
+ "%6i modeltris%6i meshs%6i meshtris\n",
r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[0], r_refdef.viewangles[1], r_refdef.viewangles[2], vpn[0], vpn[1], vpn[2],
- c_faces, c_nodes, c_leafs, c_brush_polys, c_light_polys,
+ c_faces, c_nodes, c_leafs, c_light_polys,
c_models, c_bmodels, c_sprites, c_particles, c_dlights,
- c_alias_polys, c_transmeshs, c_transtris, c_meshs, c_meshtris);
+ c_alias_polys, c_meshs, c_meshelements / 3);
+ if (r_shadow_lightingmode)
+ {
+ sprintf(r_speeds_string + strlen(r_speeds_string),
+ "realtime lighting:%4i lights%4i clears%4i scissored\n"
+ "dynamic: %6i shadowmeshes%6i shadowtris%6i lightmeshes%6i lighttris\n"
+ "precomputed: %6i shadowmeshes%6i shadowtris\n",
+ c_rt_lights, c_rt_clears, c_rt_scissored,
+ c_rt_shadowmeshes, c_rt_shadowtris, c_rt_lightmeshes, c_rt_lighttris,
+ c_rtcached_shadowmeshes, c_rtcached_shadowtris);
+ }
- c_brush_polys = 0;
c_alias_polys = 0;
c_light_polys = 0;
c_faces = 0;
c_bmodels = 0;
c_sprites = 0;
c_particles = 0;
- // c_dlights = 0;
+ c_meshs = 0;
+ c_meshelements = 0;
r_timereport_start = Sys_DoubleTime();
}
for (i = 0;r_speeds_string[i];i++)
if (r_speeds_string[i] == '\n')
lines++;
- y = vid.conheight - sb_lines - lines * 8/* - 8*/;
+ y = vid.conheight - sb_lines - lines * 8;
i = j = 0;
DrawQ_Fill(0, y, vid.conwidth, lines * 8, 0, 0, 0, 0.5, 0);
while (r_speeds_string[i])
Cvar_RegisterVariable (&scr_showpause);
Cvar_RegisterVariable (&scr_centertime);
Cvar_RegisterVariable (&scr_printspeed);
- Cvar_RegisterVariable(&scr_2dresolution);
+ Cvar_RegisterVariable (&scr_2dresolution);
+ Cvar_RegisterVariable (&cl_avidemo);
Cmd_AddCommand ("sizeup",SCR_SizeUp_f);
Cmd_AddCommand ("sizedown",SCR_SizeDown_f);
{
int size;
drawqueue_t *dq;
- if (alpha < (1.0f / 255.0f))
+ if (alpha < (1.0f / 255.0f) || !picname || !picname[0])
return;
size = sizeof(*dq) + ((strlen(picname) + 1 + 3) & ~3);
- if (r_refdef.drawqueuesize + size > MAX_DRAWQUEUE)
+ if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
return;
red = bound(0, red, 1);
green = bound(0, green, 1);
r_refdef.drawqueuesize += dq->size;
}
-void DrawQ_String(float x, float y, char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
+void DrawQ_String(float x, float y, const char *string, int maxlen, float scalex, float scaley, float red, float green, float blue, float alpha, int flags)
{
int size, len;
drawqueue_t *dq;
if (x >= vid.conwidth || y >= vid.conheight || x < (-scalex * maxlen) || y < (-scaley))
return;
size = sizeof(*dq) + ((len + 1 + 3) & ~3);
- if (r_refdef.drawqueuesize + size > MAX_DRAWQUEUE)
+ if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
return;
red = bound(0, red, 1);
green = bound(0, green, 1);
if (alpha < (1.0f / 255.0f))
return;
size = sizeof(*dq) + 4;
- if (r_refdef.drawqueuesize + size > MAX_DRAWQUEUE)
+ if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
return;
red = bound(0, red, 1);
green = bound(0, green, 1);
r_refdef.drawqueuesize += dq->size;
}
-//only used for the player color selection menu
-void DrawQ_PicTranslate (int x, int y, char *picname, qbyte *translation)
+void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags)
{
- int i, c;
- unsigned int trans[4096];
- cachepic_t *pic;
-
- pic = Draw_CachePic(picname);
- if (pic == NULL)
- return;
-
- c = pic->width * pic->height;
- if (c > 4096)
- {
- Con_Printf("DrawQ_PicTranslate: image larger than 4k buffer\n");
+ int size;
+ void *p;
+ drawqueue_t *dq;
+ drawqueuemesh_t *m;
+ size = sizeof(*dq);
+ size += sizeof(drawqueuemesh_t);
+ size += sizeof(int[3]) * mesh->numtriangles;
+ size += sizeof(float[4]) * mesh->numvertices;
+ size += sizeof(float[2]) * mesh->numvertices;
+ size += sizeof(float[4]) * mesh->numvertices;
+ if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize)
return;
- }
-
- for (i = 0;i < c;i++)
- trans[i] = d_8to24table[translation[menuplyr_pixels[i]]];
-
- // FIXME: this is renderer stuff?
- R_UpdateTexture (pic->tex, (qbyte *)trans);
-
- DrawQ_Pic(x, y, picname, 0, 0, 1, 1, 1, 1, 0);
+ dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize);
+ dq->size = size;
+ dq->command = DRAWQUEUE_MESH;
+ dq->flags = flags;
+ dq->color = 0;
+ dq->x = 0;
+ dq->y = 0;
+ dq->scalex = 0;
+ dq->scaley = 0;
+ p = (void *)(dq + 1);
+ m = p;(qbyte *)p += sizeof(drawqueuemesh_t);
+ m->numtriangles = mesh->numtriangles;
+ m->numvertices = mesh->numvertices;
+ m->texture = mesh->texture;
+ m->indices = p;memcpy(m->indices , mesh->indices , m->numtriangles * sizeof(int[3]));(qbyte *)p += m->numtriangles * sizeof(int[3]);
+ m->vertices = p;memcpy(m->vertices , mesh->vertices , m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * sizeof(float[4]);
+ m->texcoords = p;memcpy(m->texcoords, mesh->texcoords, m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * sizeof(float[4]);
+ m->colors = p;memcpy(m->colors , mesh->colors , m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * sizeof(float[4]);
+ r_refdef.drawqueuesize += dq->size;
}
-
/*
====================
CalcFov
if (cl.worldmodel)
{
Mod_CheckLoaded(cl.worldmodel);
- contents = Mod_PointInLeaf(r_refdef.vieworg, cl.worldmodel)->contents;
+ contents = Mod_PointContents(r_refdef.vieworg, cl.worldmodel);
if (contents != CONTENTS_EMPTY && contents != CONTENTS_SOLID)
{
r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985);
*/
void SCR_ScreenShot_f (void)
{
- int i;
+ static int i = 0;
char filename[16];
char checkname[MAX_OSPATH];
//
// find a file name to save it to
//
- strcpy(filename, "dp0000.tga");
-
- for (i=0 ; i<=9999 ; i++)
+ for (; i<=9999 ; i++)
{
- filename[2] = (i/1000)%10 + '0';
- filename[3] = (i/ 100)%10 + '0';
- filename[4] = (i/ 10)%10 + '0';
- filename[5] = (i/ 1)%10 + '0';
+ sprintf (filename, "dp%04i.tga", i);
sprintf (checkname, "%s/%s", com_gamedir, filename);
if (Sys_FileTime(checkname) == -1)
break; // file doesn't exist
return;
}
- SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight);
- Con_Printf ("Wrote %s\n", filename);
+ if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight))
+ Con_Printf ("Wrote %s\n", filename);
+ else
+ Con_Printf ("unable to write %s\n", filename);
+}
+
+static int cl_avidemo_frame = 0;
+
+void SCR_CaptureAVIDemo(void)
+{
+ char filename[32];
+ sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame);
+ if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight))
+ cl_avidemo_frame++;
+ else
+ {
+ Cvar_SetValueQuick(&cl_avidemo, 0);
+ Con_Printf("avi saving failed on frame %i, out of disk space? stopping avi demo catpure.\n", cl_avidemo_frame);
+ cl_avidemo_frame = 0;
+ }
}
/*
void SHOWLMP_drawall(void)
{
int i;
- if (cl.worldmodel)
- for (i = 0;i < SHOWLMP_MAXLABELS;i++)
- if (showlmp[i].isactive)
- DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
+ for (i = 0;i < SHOWLMP_MAXLABELS;i++)
+ if (showlmp[i].isactive)
+ DrawQ_Pic(showlmp[i].x, showlmp[i].y, showlmp[i].pic, 0, 0, 1, 1, 1, 1, 0);
}
void SHOWLMP_clear(void)
SCR_CalcRefdef();
}
+extern void R_Shadow_EditLights_DrawSelectedLightProperties(void);
void CL_UpdateScreen(void)
{
- if (!scr_initialized || !con_initialized)
+ if (!scr_initialized || !con_initialized || vid_hidden)
return; // not initialized yet
+ if (cl_avidemo.integer)
+ SCR_CaptureAVIDemo();
+ else
+ cl_avidemo_frame = 0;
- R_TimeReport("other");
+ if (cls.signon == SIGNONS)
+ R_TimeReport("other");
CL_SetupScreenSize();
V_UpdateBlends();
V_CalcRefdef ();
- R_TimeReport("setup");
-
- SCR_DrawRam();
- SCR_DrawNet();
- SCR_DrawTurtle();
- SCR_DrawPause();
- SCR_CheckDrawCenterString();
- Sbar_Draw();
- SHOWLMP_drawall();
-
- SCR_DrawConsole();
+ if (cls.signon == SIGNONS)
+ R_TimeReport("setup");
- ui_draw();
+ //FIXME: force menu if nothing else to look at?
+ //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected)
if (scr_drawloading)
{
scr_drawloading = false;
SCR_DrawLoading();
}
-
- R_TimeReport("2d");
-
- // add r_speeds text to queue
- R_TimeReport_End();
-
- // start a new timing run
- R_TimeReport_Start();
-
- // make menu fade everything else on the screen
- M_Draw();
+ else
+ {
+ if (cls.signon == SIGNONS)
+ {
+ SCR_DrawNet ();
+ SCR_DrawTurtle ();
+ SCR_DrawPause ();
+ Sbar_Draw();
+ SHOWLMP_drawall();
+ SCR_CheckDrawCenterString();
+ }
+ ui_draw();
+ CL_DrawVideo();
+ M_Draw();
+ if (cls.signon == SIGNONS)
+ {
+ R_TimeReport("2d");
+ R_TimeReport_End();
+ R_TimeReport_Start();
+ }
+ R_Shadow_EditLights_DrawSelectedLightProperties();
+ }
+ SCR_DrawConsole();
SCR_UpdateScreen();
}
{
SHOWLMP_clear();
}
+