X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=b8038ba79cd22f6b3e7fad775fd17556d7bf5560;hb=de967b2304397b621998f06cb13a9ee7c1e2ac4f;hp=8d3babe257b10435d7a127386fad317434ea6812;hpb=812ff6ba44c87de88a410e493b8093033867b12c;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index 8d3babe2..b8038ba7 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -2,19 +2,26 @@ #include "quakedef.h" #include "cl_video.h" #include "jpeg.h" +#include "cl_collision.h" cvar_t scr_viewsize = {CVAR_SAVE, "viewsize","100"}; cvar_t scr_fov = {CVAR_SAVE, "fov","90"}; // 10 - 170 cvar_t scr_conspeed = {CVAR_SAVE, "scr_conspeed","900"}; // LordHavoc: quake used 300 +cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"}; +cvar_t scr_conbrightness = {CVAR_SAVE, "scr_conbrightness", "0.2"}; cvar_t scr_centertime = {0, "scr_centertime","2"}; cvar_t scr_showram = {CVAR_SAVE, "showram","1"}; cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"}; 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 vid_conwidth = {CVAR_SAVE, "vid_conwidth", "640"}; +cvar_t vid_conheight = {CVAR_SAVE, "vid_conheight", "480"}; cvar_t scr_screenshot_jpeg = {CVAR_SAVE, "scr_screenshot_jpeg","0"}; +cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality","0.9"}; cvar_t cl_avidemo = {0, "cl_avidemo", "0"}; +int jpeg_supported = false; + qboolean scr_initialized; // ready to draw float scr_con_current; @@ -25,10 +32,7 @@ int clearnotify; qboolean scr_drawloading = false; -static qbyte menuplyr_pixels[4096]; - void DrawCrosshair(int num); -void V_CalcRefdef (void); static void SCR_ScreenShot_f (void); static void R_Envmap_f (void); @@ -60,7 +64,7 @@ for a few moments */ void SCR_CenterPrint (char *str) { - strncpy (scr_centerstring, str, sizeof(scr_centerstring)-1); + strlcpy (scr_centerstring, str, sizeof (scr_centerstring)); scr_centertime_off = scr_centertime.value; scr_centertime_start = cl.time; @@ -362,13 +366,12 @@ void R_TimeReport_Start(void) if (r_timereport_active) { speedstringcount = 0; - AngleVectors (r_refdef.viewangles, vpn, NULL, NULL); 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" + "org:'%+8.2f %+8.2f %+8.2f' dir:'%+2.3f %+2.3f %+2.3f'\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 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], + r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], r_viewforward[0], r_viewforward[1], r_viewforward[2], c_faces, c_nodes, c_leafs, c_light_polys, c_models, c_bmodels, c_sprites, c_particles, c_dlights, c_alias_polys, c_meshs, c_meshelements / 3); @@ -453,18 +456,20 @@ void SCR_SizeDown_f (void) void CL_Screen_Init(void) { - qpic_t *dat; - Cvar_RegisterVariable (&scr_fov); Cvar_RegisterVariable (&scr_viewsize); Cvar_RegisterVariable (&scr_conspeed); + Cvar_RegisterVariable (&scr_conalpha); + Cvar_RegisterVariable (&scr_conbrightness); Cvar_RegisterVariable (&scr_showram); Cvar_RegisterVariable (&scr_showturtle); Cvar_RegisterVariable (&scr_showpause); Cvar_RegisterVariable (&scr_centertime); Cvar_RegisterVariable (&scr_printspeed); - Cvar_RegisterVariable (&scr_2dresolution); + Cvar_RegisterVariable (&vid_conwidth); + Cvar_RegisterVariable (&vid_conheight); Cvar_RegisterVariable (&scr_screenshot_jpeg); + Cvar_RegisterVariable (&scr_screenshot_jpeg_quality); Cvar_RegisterVariable (&cl_avidemo); Cmd_AddCommand ("sizeup",SCR_SizeUp_f); @@ -473,19 +478,6 @@ void CL_Screen_Init(void) Cmd_AddCommand ("envmap", R_Envmap_f); scr_initialized = true; - - // HACK HACK HACK - // load the image data for the player image in the config menu - dat = (qpic_t *)FS_LoadFile ("gfx/menuplyr.lmp", false); - if (!dat) - Sys_Error("unable to load gfx/menuplyr.lmp"); - SwapPic (dat); - - if (dat->width*dat->height <= 4096) - memcpy (menuplyr_pixels, dat->data, dat->width * dat->height); - else - Con_Printf("gfx/menuplyr.lmp larger than 4k buffer"); - Mem_Free(dat); } void DrawQ_Clear(void) @@ -558,21 +550,21 @@ void DrawQ_SuperPic(float x, float y, char *picname, float width, float height, height = pic->height; mesh.texture = pic->tex; } - mesh.numtriangles = 2; - mesh.numvertices = 4; - mesh.element3i = picelements; - mesh.vertex3f = floats; - mesh.texcoord2f = floats + 12; - mesh.color4f = floats + 20; + mesh.num_triangles = 2; + mesh.num_vertices = 4; + mesh.data_element3i = picelements; + mesh.data_vertex3f = floats; + mesh.data_texcoord2f = floats + 12; + mesh.data_color4f = floats + 20; memset(floats, 0, sizeof(floats)); - mesh.vertex3f[0] = mesh.vertex3f[9] = x; - mesh.vertex3f[1] = mesh.vertex3f[4] = y; - mesh.vertex3f[3] = mesh.vertex3f[6] = x + width; - mesh.vertex3f[7] = mesh.vertex3f[10] = y + height; - mesh.texcoord2f[0] = s1;mesh.texcoord2f[1] = t1;mesh.color4f[ 0] = r1;mesh.color4f[ 1] = g1;mesh.color4f[ 2] = b1;mesh.color4f[ 3] = a1; - mesh.texcoord2f[2] = s2;mesh.texcoord2f[3] = t2;mesh.color4f[ 4] = r2;mesh.color4f[ 5] = g2;mesh.color4f[ 6] = b2;mesh.color4f[ 7] = a2; - mesh.texcoord2f[4] = s4;mesh.texcoord2f[5] = t4;mesh.color4f[ 8] = r4;mesh.color4f[ 9] = g4;mesh.color4f[10] = b4;mesh.color4f[11] = a4; - mesh.texcoord2f[6] = s3;mesh.texcoord2f[7] = t3;mesh.color4f[12] = r3;mesh.color4f[13] = g3;mesh.color4f[14] = b3;mesh.color4f[15] = a3; + mesh.data_vertex3f[0] = mesh.data_vertex3f[9] = x; + mesh.data_vertex3f[1] = mesh.data_vertex3f[4] = y; + mesh.data_vertex3f[3] = mesh.data_vertex3f[6] = x + width; + mesh.data_vertex3f[7] = mesh.data_vertex3f[10] = y + height; + mesh.data_texcoord2f[0] = s1;mesh.data_texcoord2f[1] = t1;mesh.data_color4f[ 0] = r1;mesh.data_color4f[ 1] = g1;mesh.data_color4f[ 2] = b1;mesh.data_color4f[ 3] = a1; + mesh.data_texcoord2f[2] = s2;mesh.data_texcoord2f[3] = t2;mesh.data_color4f[ 4] = r2;mesh.data_color4f[ 5] = g2;mesh.data_color4f[ 6] = b2;mesh.data_color4f[ 7] = a2; + mesh.data_texcoord2f[4] = s4;mesh.data_texcoord2f[5] = t4;mesh.data_color4f[ 8] = r4;mesh.data_color4f[ 9] = g4;mesh.data_color4f[10] = b4;mesh.data_color4f[11] = a4; + mesh.data_texcoord2f[6] = s3;mesh.data_texcoord2f[7] = t3;mesh.data_color4f[12] = r3;mesh.data_color4f[13] = g3;mesh.data_color4f[14] = b3;mesh.data_color4f[15] = a3; DrawQ_Mesh (&mesh, flags); } @@ -584,10 +576,10 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags) drawqueuemesh_t *m; size = sizeof(*dq); size += sizeof(drawqueuemesh_t); - size += sizeof(int[3]) * mesh->numtriangles; - size += sizeof(float[3]) * mesh->numvertices; - size += sizeof(float[2]) * mesh->numvertices; - size += sizeof(float[4]) * mesh->numvertices; + size += sizeof(int[3]) * mesh->num_triangles; + size += sizeof(float[3]) * mesh->num_vertices; + size += sizeof(float[2]) * mesh->num_vertices; + size += sizeof(float[4]) * mesh->num_vertices; if (r_refdef.drawqueuesize + size > r_refdef.maxdrawqueuesize) return; dq = (void *)(r_refdef.drawqueue + r_refdef.drawqueuesize); @@ -601,13 +593,55 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags) dq->scaley = 0; p = (void *)(dq + 1); m = p;(qbyte *)p += sizeof(drawqueuemesh_t); - m->numtriangles = mesh->numtriangles; - m->numvertices = mesh->numvertices; + m->num_triangles = mesh->num_triangles; + m->num_vertices = mesh->num_vertices; m->texture = mesh->texture; - m->element3i = p;memcpy(m->element3i , mesh->element3i , m->numtriangles * sizeof(int[3]));(qbyte *)p += m->numtriangles * sizeof(int[3]); - m->vertex3f = p;memcpy(m->vertex3f , mesh->vertex3f , m->numvertices * sizeof(float[3]));(qbyte *)p += m->numvertices * sizeof(float[3]); - m->texcoord2f = p;memcpy(m->texcoord2f, mesh->texcoord2f, m->numvertices * sizeof(float[2]));(qbyte *)p += m->numvertices * sizeof(float[2]); - m->color4f = p;memcpy(m->color4f , mesh->color4f , m->numvertices * sizeof(float[4]));(qbyte *)p += m->numvertices * sizeof(float[4]); + m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));(qbyte *)p += m->num_triangles * sizeof(int[3]); + m->data_vertex3f = p;memcpy(m->data_vertex3f , mesh->data_vertex3f , m->num_vertices * sizeof(float[3]));(qbyte *)p += m->num_vertices * sizeof(float[3]); + m->data_texcoord2f = p;memcpy(m->data_texcoord2f, mesh->data_texcoord2f, m->num_vertices * sizeof(float[2]));(qbyte *)p += m->num_vertices * sizeof(float[2]); + m->data_color4f = p;memcpy(m->data_color4f , mesh->data_color4f , m->num_vertices * sizeof(float[4]));(qbyte *)p += m->num_vertices * sizeof(float[4]); + r_refdef.drawqueuesize += dq->size; +} + +void DrawQ_SetClipArea(float x, float y, float width, float height) +{ + drawqueue_t * dq; + if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize) + { + Con_DPrintf("DrawQueue full !\n"); + return; + } + dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize); + dq->size = sizeof(*dq); + dq->command = DRAWQUEUE_SETCLIP; + dq->x = x; + dq->y = y; + dq->scalex = width; + dq->scaley = height; + dq->flags = 0; + dq->color = 0; + + r_refdef.drawqueuesize += dq->size; +} + +void DrawQ_ResetClipArea(void) +{ + drawqueue_t *dq; + if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize) + { + Con_DPrintf("DrawQueue full !\n"); + return; + } + dq = (void*) (r_refdef.drawqueue + r_refdef.drawqueuesize); + dq->size = sizeof(*dq); + dq->command = DRAWQUEUE_RESETCLIP; + dq->x = 0; + dq->y = 0; + dq->scalex = 0; + dq->scaley = 0; + dq->flags = 0; + dq->color = 0; + r_refdef.drawqueuesize += dq->size; } @@ -693,8 +727,8 @@ static void SCR_CalcRefdef (void) if (cl.worldmodel) { Mod_CheckLoaded(cl.worldmodel); - contents = Mod_PointContents(r_refdef.vieworg, cl.worldmodel); - if (contents != CONTENTS_EMPTY && contents != CONTENTS_SOLID) + contents = CL_PointSuperContents(r_vieworigin); + if (contents & SUPERCONTENTS_LIQUIDSMASK) { r_refdef.fov_x *= (sin(cl.time * 4.7) * 0.015 + 0.985); r_refdef.fov_y *= (sin(cl.time * 3.0) * 0.015 + 0.985); @@ -745,8 +779,14 @@ 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, false)) + qboolean jpeg = (scr_screenshot_jpeg.integer != 0); + + if (jpeg) + sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame); + else + sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame); + + if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg)) cl_avidemo_frame++; else { @@ -789,7 +829,7 @@ static void R_Envmap_f (void) return; } - strcpy(basename, Cmd_Argv(1)); + strlcpy (basename, Cmd_Argv(1), sizeof (basename)); size = atoi(Cmd_Argv(2)); if (size != 128 && size != 256 && size != 512 && size != 1024) { @@ -815,10 +855,10 @@ static void R_Envmap_f (void) for (j = 0;j < 6;j++) { sprintf(filename, "env/%s%s.tga", basename, envmapinfo[j].name); - VectorCopy(envmapinfo[j].angles, r_refdef.viewangles); + Matrix4x4_CreateFromQuakeEntity(&r_refdef.viewentitymatrix, r_vieworigin[0], r_vieworigin[1], r_vieworigin[2], envmapinfo[j].angles[0], envmapinfo[j].angles[1], envmapinfo[j].angles[2], 1); R_ClearScreen(); - R_RenderView (); - SCR_ScreenShot(filename, vid.realx, vid.realy, size, size, false); + R_RenderView(); + SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, false); } envmap = false; @@ -858,8 +898,8 @@ void SHOWLMP_decodeshow(void) int i, k; qbyte lmplabel[256], picname[256]; float x, y; - strcpy(lmplabel,MSG_ReadString()); - strcpy(picname, MSG_ReadString()); + strlcpy (lmplabel,MSG_ReadString(), sizeof (lmplabel)); + strlcpy (picname, MSG_ReadString(), sizeof (picname)); if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk { x = MSG_ReadByte(); @@ -886,8 +926,8 @@ void SHOWLMP_decodeshow(void) return; // none found to replace // change existing one showlmp[k].isactive = true; - strcpy(showlmp[k].label, lmplabel); - strcpy(showlmp[k].pic, picname); + strlcpy (showlmp[k].label, lmplabel, sizeof (showlmp[k].label)); + strlcpy (showlmp[k].pic, picname, sizeof (showlmp[k].pic)); showlmp[k].x = x; showlmp[k].y = y; } @@ -909,33 +949,29 @@ void SHOWLMP_clear(void) void CL_SetupScreenSize(void) { - static float old2dresolution = -1; + float conwidth, conheight; VID_GetWindowSize (&vid.realx, &vid.realy, &vid.realwidth, &vid.realheight); VID_UpdateGamma(false); - if (scr_2dresolution.value != old2dresolution) - { - Cvar_SetValue("scr_2dresolution", bound(0.0f, scr_2dresolution.value, 1.0f)); - old2dresolution = scr_2dresolution.value; - } + conwidth = bound(320, vid_conwidth.value, 2048); + conheight = bound(200, vid_conheight.value, 1536); + if (vid_conwidth.value != conwidth) + Cvar_SetValue("vid_conwidth", conwidth); + if (vid_conheight.value != conheight) + Cvar_SetValue("vid_conheight", conheight); - if (vid.realwidth > 320) - { - vid.conwidth = (vid.realwidth - 320) * scr_2dresolution.value + 320; - vid.conwidth = bound(320, vid.conwidth, vid.realwidth); - } - else - vid.conwidth = 320; + vid.conwidth = vid_conwidth.integer; + vid.conheight = vid_conheight.integer; - if (vid.realheight > 240) +/* if (vid.realheight > 240) { vid.conheight = (vid.realheight - 240) * scr_2dresolution.value + 240; vid.conheight = bound(240, vid.conheight, vid.realheight); } else - vid.conheight = 240; + vid.conheight = 240;*/ SCR_SetUpToDrawConsole(); @@ -961,9 +997,6 @@ void CL_UpdateScreen(void) DrawQ_Clear(); - V_UpdateBlends(); - V_CalcRefdef (); - if (cls.signon == SIGNONS) R_TimeReport("setup"); @@ -986,9 +1019,10 @@ void CL_UpdateScreen(void) SHOWLMP_drawall(); SCR_CheckDrawCenterString(); } - ui_draw(); + MR_Draw(); + UI_Callback_Draw(); CL_DrawVideo(); - M_Draw(); + //ui_draw(); if (cls.signon == SIGNONS) { R_TimeReport("2d");