X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=e528ddddf212fe369cd110a01c9e36b9e713b13f;hb=14bec1a4c2a0623c08d1e746a023971e311fda36;hp=ed4d49ce55b25e1a4548d906ae8dc78b57e95d5b;hpb=a7fcd6bcc441e5a6c2575327d78d97c108f569af;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index ed4d49ce..e528dddd 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -43,6 +43,7 @@ cvar_t scr_zoomwindow = {CVAR_SAVE, "scr_zoomwindow", "0", "displays a zoomed in cvar_t scr_zoomwindow_viewsizex = {CVAR_SAVE, "scr_zoomwindow_viewsizex", "20", "horizontal viewsize of zoom window"}; cvar_t scr_zoomwindow_viewsizey = {CVAR_SAVE, "scr_zoomwindow_viewsizey", "20", "vertical viewsize of zoom window"}; cvar_t scr_zoomwindow_fov = {CVAR_SAVE, "scr_zoomwindow_fov", "20", "fov of zoom window"}; +cvar_t scr_stipple = {0, "scr_stipple", "0", "interlacing-like stippling of the display"}; int jpeg_supported = false; @@ -315,8 +316,22 @@ static int SCR_DrawQWDownload(int offset) float size = 8; char temp[256]; if (!cls.qw_downloadname[0]) + { + cls.qw_downloadspeedrate = 0; + cls.qw_downloadspeedtime = realtime; + cls.qw_downloadspeedcount = 0; return 0; - dpsnprintf(temp, sizeof(temp), "Downloading %s ... %3i%%\n", cls.qw_downloadname, cls.qw_downloadpercent); + } + if (realtime >= cls.qw_downloadspeedtime + 1) + { + cls.qw_downloadspeedrate = cls.qw_downloadspeedcount; + cls.qw_downloadspeedtime = realtime; + cls.qw_downloadspeedcount = 0; + } + if (cls.protocol == PROTOCOL_QUAKEWORLD) + dpsnprintf(temp, sizeof(temp), "Downloading %s %3i%% (%i) at %i bytes/s\n", cls.qw_downloadname, cls.qw_downloadpercent, cls.qw_downloadmemorycursize, cls.qw_downloadspeedrate); + else + dpsnprintf(temp, sizeof(temp), "Downloading %s %3i%% (%i/%i) at %i bytes/s\n", cls.qw_downloadname, cls.qw_downloadpercent, cls.qw_downloadmemorycursize, cls.qw_downloadmemorymaxsize, cls.qw_downloadspeedrate); len = (int)strlen(temp); x = (vid_conwidth.integer - len*size) / 2; y = vid_conheight.integer - size - offset; @@ -460,7 +475,7 @@ void SCR_BeginLoadingPlaque (void) Host_StartVideo(); S_StopAllSounds(); - SCR_UpdateLoadingScreen(); + SCR_UpdateLoadingScreen(false); } //============================================================================= @@ -612,6 +627,7 @@ void CL_Screen_Init(void) Cvar_RegisterVariable(&scr_zoomwindow_viewsizex); Cvar_RegisterVariable(&scr_zoomwindow_viewsizey); Cvar_RegisterVariable(&scr_zoomwindow_fov); + Cvar_RegisterVariable(&scr_stipple); Cmd_AddCommand ("sizeup",SCR_SizeUp_f, "increase view size (increases viewsize cvar)"); Cmd_AddCommand ("sizedown",SCR_SizeDown_f, "decrease view size (decreases viewsize cvar)"); @@ -810,11 +826,9 @@ static void SCR_CaptureVideo_RIFF_OverflowCheck(int framesize) cursize = SCR_CaptureVideo_RIFF_GetPosition() - cls.capturevideo.riffstackstartoffset[0]; // if this would overflow the windows limit of 1GB per RIFF chunk, we need // to close the current RIFF chunk and open another for future frames - if (8 + cursize + framesize > 1<<30) + if (8 + cursize + framesize + cls.capturevideo.riffindexbuffer.cursize + 8 > 1<<30) { SCR_CaptureVideo_RIFF_Finish(); - while (cls.capturevideo.riffstacklevel > 0) - SCR_CaptureVideo_RIFF_Pop(); // begin a new 1GB extended section of the AVI SCR_CaptureVideo_RIFF_Push("RIFF", "AVIX"); SCR_CaptureVideo_RIFF_Push("LIST", "movi"); @@ -826,7 +840,6 @@ void SCR_CaptureVideo_BeginVideo(void) double gamma, g; int width = vid.width, height = vid.height, x; unsigned int i; - unsigned char out[44]; if (cls.capturevideo.active) return; memset(&cls.capturevideo, 0, sizeof(cls.capturevideo)); @@ -995,6 +1008,8 @@ Cr = R * .500 + G * -.419 + B * -.0813 + 128.; SCR_CaptureVideo_RIFF_Push("ISFT", NULL); SCR_CaptureVideo_RIFF_WriteTerminatedString(engineversion); SCR_CaptureVideo_RIFF_Pop(); + // enable this junk filler if you like the LIST movi to always begin at 4KB in the file (why?) +#if 0 SCR_CaptureVideo_RIFF_Push("JUNK", NULL); x = 4096 - SCR_CaptureVideo_RIFF_GetPosition(); while (x > 0) @@ -1005,6 +1020,7 @@ Cr = R * .500 + G * -.419 + B * -.0813 + 128.; x -= i; } SCR_CaptureVideo_RIFF_Pop(); +#endif SCR_CaptureVideo_RIFF_Pop(); // begin the actual video section now SCR_CaptureVideo_RIFF_Push("LIST", "movi"); @@ -1025,8 +1041,6 @@ Cr = R * .500 + G * -.419 + B * -.0813 + 128.; void SCR_CaptureVideo_EndVideo(void) { - int i, n; - unsigned char out[44]; if (!cls.capturevideo.active) return; cls.capturevideo.active = false; @@ -1120,7 +1134,6 @@ qboolean SCR_CaptureVideo_VideoFrame(int newframenum) { int x = 0, y = 0, width = vid.width, height = vid.height; unsigned char *in, *out; - char filename[32]; CHECKGLERROR //return SCR_ScreenShot(filename, cls.capturevideo.buffer, cls.capturevideo.buffer + vid.width * vid.height * 3, cls.capturevideo.buffer + vid.width * vid.height * 6, 0, 0, vid.width, vid.height, false, false, false, jpeg, true); // speed is critical here, so do saving as directly as possible @@ -1522,8 +1535,6 @@ void SCR_DrawScreen (void) if(!CL_VM_UpdateView()) R_RenderView(); - else - SCR_DrawConsole(); if (scr_zoomwindow.integer) { @@ -1559,9 +1570,6 @@ void SCR_DrawScreen (void) // draw 2D stuff - //FIXME: force menu if nothing else to look at? - //if (key_dest == key_game && cls.signon != SIGNONS && cls.state == ca_disconnected) - if (cls.signon == SIGNONS) { SCR_DrawNet (); @@ -1576,8 +1584,7 @@ void SCR_DrawScreen (void) CL_DrawVideo(); R_Shadow_EditLights_DrawSelectedLightProperties(); - if(!csqc_loaded) - SCR_DrawConsole(); + SCR_DrawConsole(); SCR_DrawBrand(); @@ -1599,7 +1606,7 @@ void SCR_DrawScreen (void) R_TimeReport("meshfinish"); } -void SCR_UpdateLoadingScreen (void) +void SCR_UpdateLoadingScreen (qboolean clear) { float x, y; cachepic_t *pic; @@ -1613,9 +1620,12 @@ void SCR_UpdateLoadingScreen (void) //qglDisable(GL_SCISSOR_TEST);CHECKGLERROR //qglDepthMask(1);CHECKGLERROR qglColorMask(1,1,1,1);CHECKGLERROR - //qglClearColor(0,0,0,0);CHECKGLERROR - //qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR - //qglCullFace(GL_FRONT);CHECKGLERROR + qglClearColor(0,0,0,0);CHECKGLERROR + // when starting up a new video mode, make sure the screen is cleared to black + if (clear) + { + qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR + } //qglDisable(GL_CULL_FACE);CHECKGLERROR //R_ClearScreen(); R_Textures_Frame(); @@ -1643,10 +1653,22 @@ void SCR_UpdateLoadingScreen (void) texcoord2f[2] = 1;texcoord2f[3] = 0; texcoord2f[4] = 1;texcoord2f[5] = 1; texcoord2f[6] = 0;texcoord2f[7] = 1; - R_Mesh_Draw(0, 4, 2, polygonelements); + if (vid.stereobuffer) + { + qglDrawBuffer(GL_FRONT_LEFT); + R_Mesh_Draw(0, 4, 2, polygonelements); + qglDrawBuffer(GL_FRONT_RIGHT); + R_Mesh_Draw(0, 4, 2, polygonelements); + } + else + { + qglDrawBuffer(GL_FRONT); + R_Mesh_Draw(0, 4, 2, polygonelements); + } R_Mesh_Finish(); // refresh - VID_Finish(false); + // not necessary when rendering to GL_FRONT buffers + //VID_Finish(false); } void CL_UpdateScreen(void) @@ -1730,15 +1752,37 @@ void CL_UpdateScreen(void) qglClearColor(0,0,0,0);CHECKGLERROR qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR + if(scr_stipple.integer) + { + GLubyte stipple[128]; + int i, s, width, parts; + static int frame = 0; + ++frame; + + s = scr_stipple.integer; + parts = (s & 007); + width = (s & 070) >> 3; + + qglEnable(GL_POLYGON_STIPPLE); // 0x0B42 + for(i = 0; i < 128; ++i) + { + int line = i/4; + stipple[i] = (((line >> width) + frame) & ((1 << parts) - 1)) ? 0x00 : 0xFF; + } + qglPolygonStipple(stipple); + } + else + qglDisable(GL_POLYGON_STIPPLE); + if (r_timereport_active) R_TimeReport("clear"); - if (r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer || r_stereo_sidebyside.integer) + if (vid.stereobuffer || r_stereo_redblue.integer || r_stereo_redgreen.integer || r_stereo_redcyan.integer || r_stereo_sidebyside.integer) { matrix4x4_t originalmatrix = r_view.matrix; - r_view.matrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * -0.5f * r_view.matrix.m[0][1]; - r_view.matrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * -0.5f * r_view.matrix.m[1][1]; - r_view.matrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * -0.5f * r_view.matrix.m[2][1]; + matrix4x4_t offsetmatrix; + Matrix4x4_CreateTranslate(&offsetmatrix, 0, r_stereo_separation.value * -0.5f, 0); + Matrix4x4_Concat(&r_view.matrix, &originalmatrix, &offsetmatrix); if (r_stereo_sidebyside.integer) r_stereo_side = 0; @@ -1750,11 +1794,13 @@ void CL_UpdateScreen(void) r_view.colormask[2] = 0; } + if (vid.stereobuffer) + qglDrawBuffer(GL_BACK_RIGHT); + SCR_DrawScreen(); - r_view.matrix.m[0][3] = originalmatrix.m[0][3] + r_stereo_separation.value * 0.5f * r_view.matrix.m[0][1]; - r_view.matrix.m[1][3] = originalmatrix.m[1][3] + r_stereo_separation.value * 0.5f * r_view.matrix.m[1][1]; - r_view.matrix.m[2][3] = originalmatrix.m[2][3] + r_stereo_separation.value * 0.5f * r_view.matrix.m[2][1]; + Matrix4x4_CreateTranslate(&offsetmatrix, 0, r_stereo_separation.value * 0.5f, 0); + Matrix4x4_Concat(&r_view.matrix, &originalmatrix, &offsetmatrix); if (r_stereo_sidebyside.integer) r_stereo_side = 1; @@ -1766,12 +1812,18 @@ void CL_UpdateScreen(void) r_view.colormask[2] = r_stereo_redcyan.integer || r_stereo_redblue.integer; } + if (vid.stereobuffer) + qglDrawBuffer(GL_BACK_LEFT); + SCR_DrawScreen(); r_view.matrix = originalmatrix; } else + { + qglDrawBuffer(GL_BACK); SCR_DrawScreen(); + } SCR_CaptureVideo();