X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_screen.c;h=0fa9a6d8e78dea02983c47a423988db41ce92f9b;hb=3d53561d5fd953672bde1581251d050900ef2772;hp=c916aafcb1b2da92e56de614e267dde766055ad1;hpb=af0b7a1fa11c2ceedeb9f66ca950f6c0bff8ad8f;p=xonotic%2Fdarkplaces.git diff --git a/cl_screen.c b/cl_screen.c index c916aafc..0fa9a6d8 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -5,10 +5,11 @@ #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_fov = {CVAR_SAVE, "fov","90"}; // 1 - 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_conforcewhiledisconnected = {CVAR_SAVE, "scr_conforcewhiledisconnected", "1"}; cvar_t scr_centertime = {0, "scr_centertime","2"}; cvar_t scr_showram = {CVAR_SAVE, "showram","1"}; cvar_t scr_showturtle = {CVAR_SAVE, "showturtle","0"}; @@ -17,8 +18,12 @@ cvar_t scr_printspeed = {0, "scr_printspeed","8"}; 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 scr_screenshot_name = {0, "scr_screenshot_name","dp"}; cvar_t cl_avidemo = {0, "cl_avidemo", "0"}; +int jpeg_supported = false; + qboolean scr_initialized; // ready to draw float scr_con_current; @@ -29,10 +34,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); @@ -62,7 +64,7 @@ Called for important messages that should stay in the center of the screen for a few moments ============== */ -void SCR_CenterPrint (char *str) +void SCR_CenterPrint(char *str) { strlcpy (scr_centerstring, str, sizeof (scr_centerstring)); scr_centertime_off = scr_centertime.value; @@ -243,7 +245,7 @@ void SCR_SetUpToDrawConsole (void) { Con_CheckResize (); - if (key_dest == key_game && cls.signon != SIGNONS) + if (key_dest == key_game && cls.signon != SIGNONS && scr_conforcewhiledisconnected.integer) key_consoleactive |= KEY_CONSOLEACTIVE_FORCED; else key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED; @@ -366,13 +368,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); @@ -457,13 +458,12 @@ 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_conforcewhiledisconnected); Cvar_RegisterVariable (&scr_showram); Cvar_RegisterVariable (&scr_showturtle); Cvar_RegisterVariable (&scr_showpause); @@ -472,6 +472,7 @@ void CL_Screen_Init(void) 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); @@ -480,19 +481,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) @@ -607,106 +595,57 @@ void DrawQ_Mesh (drawqueuemesh_t *mesh, int flags) dq->scalex = 0; dq->scaley = 0; p = (void *)(dq + 1); - m = p;(qbyte *)p += sizeof(drawqueuemesh_t); + m = p;p = (qbyte*)p + sizeof(drawqueuemesh_t); m->num_triangles = mesh->num_triangles; m->num_vertices = mesh->num_vertices; m->texture = mesh->texture; - 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]); + m->data_element3i = p;memcpy(m->data_element3i , mesh->data_element3i , m->num_triangles * sizeof(int[3]));p = (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]));p = (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]));p = (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]));p = (qbyte*)p + m->num_vertices * sizeof(float[4]); r_refdef.drawqueuesize += dq->size; } -/* -==================== -CalcFov -==================== -*/ -float CalcFov (float fov_x, float width, float height) -{ - // calculate vision size and alter by aspect, then convert back to angle - return atan (height / (width / tan(fov_x/360*M_PI))) * 360 / M_PI; -} - -/* -================= -SCR_CalcRefdef - -Must be called whenever vid changes -Internal use only -================= -*/ -static void SCR_CalcRefdef (void) +void DrawQ_SetClipArea(float x, float y, float width, float height) { - float size; - int contents; - -//======================================== - -// bound viewsize - if (scr_viewsize.value < 30) - Cvar_Set ("viewsize","30"); - if (scr_viewsize.value > 120) - Cvar_Set ("viewsize","120"); - -// bound field of view - if (scr_fov.value < 10) - Cvar_Set ("fov","10"); - if (scr_fov.value > 170) - Cvar_Set ("fov","170"); - -// intermission is always full screen - if (cl.intermission) - { - size = 1; - sb_lines = 0; - } - else + drawqueue_t * dq; + if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize) { - if (scr_viewsize.value >= 120) - sb_lines = 0; // no status bar at all - else if (scr_viewsize.value >= 110) - sb_lines = 24; // no inventory - else - sb_lines = 24+16+8; - size = scr_viewsize.value * (1.0 / 100.0); - } - - if (size >= 1) - { - r_refdef.width = vid.realwidth; - r_refdef.height = vid.realheight; - r_refdef.x = 0; - r_refdef.y = 0; - } - else - { - r_refdef.width = vid.realwidth * size; - r_refdef.height = vid.realheight * size; - r_refdef.x = (vid.realwidth - r_refdef.width)/2; - r_refdef.y = (vid.realheight - r_refdef.height)/2; + Con_DPrint("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.width = bound(0, r_refdef.width, vid.realwidth); - r_refdef.height = bound(0, r_refdef.height, vid.realheight); - r_refdef.x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width) + vid.realx; - r_refdef.y = bound(0, r_refdef.y, vid.realheight - r_refdef.height) + vid.realy; - - // LordHavoc: viewzoom (zoom in for sniper rifles, etc) - r_refdef.fov_x = scr_fov.value * cl.viewzoom; - r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.width, r_refdef.height); + r_refdef.drawqueuesize += dq->size; +} - if (cl.worldmodel) +void DrawQ_ResetClipArea(void) +{ + drawqueue_t *dq; + if(r_refdef.drawqueuesize + (int)sizeof(*dq) > r_refdef.maxdrawqueuesize) { - Mod_CheckLoaded(cl.worldmodel); - contents = CL_PointSuperContents(r_refdef.vieworg); - 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); - } + Con_DPrint("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; } /* @@ -716,35 +655,33 @@ SCR_ScreenShot_f */ void SCR_ScreenShot_f (void) { - static int i = 0; - char filename[16]; - char checkname[MAX_OSPATH]; - const char* extens; + int shotnumber; + char base[MAX_QPATH]; + char filename[MAX_QPATH]; qboolean jpeg = (scr_screenshot_jpeg.integer != 0); - if (jpeg) - extens = "jpg"; - else - extens = "tga"; - + sprintf (base, "screenshots/%s", scr_screenshot_name.string); + // find a file name to save it to - for (; i<=9999 ; i++) - { - sprintf (filename, "dp%04i.%s", i, extens); - sprintf (checkname, "%s/%s", fs_gamedir, filename); - if (!FS_SysFileExists(checkname)) + for (shotnumber=0;shotnumber < 1000000;shotnumber++) + if (!FS_SysFileExists(va("%s/%s%06d.tga", fs_gamedir, base, shotnumber)) && !FS_SysFileExists(va("%s/%s%06d.jpg", fs_gamedir, base, shotnumber))) break; - } - if (i==10000) + if (shotnumber >= 1000000) { - Con_Printf ("SCR_ScreenShot_f: Couldn't create the image file\n"); + Con_Print("SCR_ScreenShot_f: Couldn't create the image file\n"); return; } - if (SCR_ScreenShot (filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg)) - Con_Printf ("Wrote %s\n", filename); + if (jpeg) + sprintf(filename, "%s%06d.jpg", base, shotnumber); else - Con_Printf ("unable to write %s\n", filename); + sprintf(filename, "%s%06d.tga", base, shotnumber); + + if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) + Con_Printf("Wrote %s\n", filename); + else + Con_Printf("unable to write %s\n", filename); + shotnumber++; } static int cl_avidemo_frame = 0; @@ -755,11 +692,11 @@ void SCR_CaptureAVIDemo(void) qboolean jpeg = (scr_screenshot_jpeg.integer != 0); if (jpeg) - sprintf(filename, "dpavi%06d.jpg", cl_avidemo_frame); + sprintf(filename, "video/dp%06d.jpg", cl_avidemo_frame); else - sprintf(filename, "dpavi%06d.tga", cl_avidemo_frame); + sprintf(filename, "video/dp%06d.tga", cl_avidemo_frame); - if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, jpeg)) + if (SCR_ScreenShot(filename, vid.realx, vid.realy, vid.realwidth, vid.realheight, false, false, false, jpeg)) cl_avidemo_frame++; else { @@ -780,15 +717,16 @@ struct { float angles[3]; char *name; + qboolean flipx, flipy; } envmapinfo[6] = { - {{ 0, 0, 0}, "ft"}, - {{ 0, 90, 0}, "rt"}, - {{ 0, 180, 0}, "bk"}, - {{ 0, 270, 0}, "lf"}, - {{-90, 90, 0}, "up"}, - {{ 90, 90, 0}, "dn"} + {{ 0, 0, 0}, "rt", true, false}, + {{ 0, 90, 0}, "ft", true, false}, + {{ 0, 180, 0}, "lf", true, false}, + {{ 0, 270, 0}, "bk", true, false}, + {{-90, 180, 0}, "up", false, true}, + {{ 90, 180, 0}, "dn", false, true} }; static void R_Envmap_f (void) @@ -798,7 +736,7 @@ static void R_Envmap_f (void) if (Cmd_Argc() != 3) { - Con_Printf ("envmap : save out 6 cubic environment map images, usable with loadsky, note that size must one of 128, 256, 512, or 1024 and can't be bigger than your current resolution\n"); + Con_Print("envmap : save out 6 cubic environment map images, usable with loadsky, note that size must one of 128, 256, 512, or 1024 and can't be bigger than your current resolution\n"); return; } @@ -806,12 +744,12 @@ static void R_Envmap_f (void) size = atoi(Cmd_Argv(2)); if (size != 128 && size != 256 && size != 512 && size != 1024) { - Con_Printf("envmap: size must be one of 128, 256, 512, or 1024\n"); + Con_Print("envmap: size must be one of 128, 256, 512, or 1024\n"); return; } if (size > vid.realwidth || size > vid.realheight) { - Con_Printf("envmap: your resolution is not big enough to render that size\n"); + Con_Print("envmap: your resolution is not big enough to render that size\n"); return; } @@ -828,10 +766,12 @@ 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_Mesh_Start(); + R_RenderView(); + R_Mesh_Finish(); + SCR_ScreenShot(filename, vid.realx, vid.realy + vid.realheight - (r_refdef.y + r_refdef.height), size, size, envmapinfo[j].flipx, envmapinfo[j].flipy, false, false); } envmap = false; @@ -938,10 +878,15 @@ void CL_SetupScreenSize(void) vid.conwidth = vid_conwidth.integer; vid.conheight = vid_conheight.integer; - SCR_SetUpToDrawConsole(); +/* 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;*/ - // determine size of refresh window - SCR_CalcRefdef(); + SCR_SetUpToDrawConsole(); } extern void R_Shadow_EditLights_DrawSelectedLightProperties(void); @@ -984,9 +929,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"); @@ -1004,4 +950,3 @@ void CL_Screen_NewMap(void) { SHOWLMP_clear(); } -