X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fview.qc;h=7835908cb88ec1e88b0ba8aed8a1bc12c8346c89;hp=c9ad52ef93bf66cdd64ee0a04c2065bd244af937;hb=82d7ab427e32e5825ab91a08afef8e8be1457521;hpb=c9347b663acd739a4b44c420910f371fa1d0ed5c diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index c9ad52ef9..7835908cb 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -1,51 +1,42 @@ #include "view.qh" -#include "autocvars.qh" -#include "miscfunctions.qh" -#include "announcer.qh" -#include "hud/_mod.qh" -#include "mapvoting.qh" -#include "shownames.qh" -#include "hud/panel/scoreboard.qh" -#include "hud/panel/quickmenu.qh" - +#include +#include +#include +#include +#include +#include +#include #include - +#include +#include #include +#include #include +#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include #include #include -#include #include -#include - -#include - #include -#include -#include #include -#include -#include -#include - -#include +#include +#include +#include #include -#include "csqcmodel_hooks.qh" - +#include #include #include -#define EFMASK_CHEAP (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NODRAW | EF_NOSHADOW | EF_SELECTABLE | EF_TELEPORT_BIT) - float autocvar_cl_viewmodel_scale; float autocvar_cl_viewmodel_alpha = 1; @@ -364,7 +355,33 @@ STATIC_INIT(viewmodel) { viewmodels[slot] = new(viewmodel); } -float showfps_prevfps; +vector project_3d_to_2d(vector vec) +{ + vec = cs_project(vec); + if(cs_project_is_b0rked > 0) + { + vec.x *= vid_conwidth / vid_width; + vec.y *= vid_conheight / vid_height; + } + return vec; +} + +bool projected_on_screen(vector screen_pos) +{ + return screen_pos.z >= 0 + && screen_pos.x >= 0 + && screen_pos.y >= 0 + && screen_pos.x < vid_conwidth + && screen_pos.y < vid_conheight; +} + +void update_mousepos() +{ + mousepos += getmousepos() * autocvar_menu_mouse_speed; + mousepos.x = bound(0, mousepos.x, vid_conwidth); + mousepos.y = bound(0, mousepos.y, vid_conheight); +} + float showfps_prevfps_time; int showfps_framecounter; @@ -373,23 +390,24 @@ void fpscounter_update() if(!STAT(SHOWFPS)) return; - float currentTime = gettime(GETTIME_REALTIME); + float currentTime = gettime(GETTIME_FRAMESTART); + showfps_framecounter += 1; if(currentTime - showfps_prevfps_time > STAT(SHOWFPS)) { - showfps_prevfps = showfps_framecounter/(currentTime - showfps_prevfps_time); + float fps = showfps_framecounter / (currentTime - showfps_prevfps_time); showfps_framecounter = 0; showfps_prevfps_time = currentTime; int channel = MSG_C2S; WriteHeader(channel, fpsreport); - WriteShort(channel, bound(0, rint(showfps_prevfps), 65535)); // prevent insane fps values + WriteShort(channel, bound(0, rint(fps), 32767)); // prevent insane fps values } } STATIC_INIT(fpscounter_init) { - float currentTime = gettime(GETTIME_REALTIME); + float currentTime = gettime(GETTIME_FRAMESTART); showfps_prevfps_time = currentTime; // we must initialize it to avoid an instant low frame sending } @@ -791,22 +809,22 @@ void HitSound() { if (autocvar_cl_hitsound && unaccounted_damage) { - // customizable gradient function that crosses (0,a), (c,1) and asymptotically approaches b - float a = autocvar_cl_hitsound_max_pitch; - float b = autocvar_cl_hitsound_min_pitch; - float c = autocvar_cl_hitsound_nom_damage; - float d = unaccounted_damage; - float pitch_shift = (b*d*(a-1) + a*c*(1-b)) / (d*(a-1) + c*(1-b)); - - // if sound variation is disabled, set pitch_shift to 1 - if (autocvar_cl_hitsound == 1) - pitch_shift = 1; - - // if pitch shift is reversed, mirror in (max-min)/2 + min - if (autocvar_cl_hitsound == 3) + float pitch_shift = 1; + if (autocvar_cl_hitsound == 2 || autocvar_cl_hitsound == 3) { - float mirror_value = (a-b)/2 + b; - pitch_shift = mirror_value + (mirror_value - pitch_shift); + // customizable gradient function that crosses (0,a), (c,1) and asymptotically approaches b + float a = autocvar_cl_hitsound_max_pitch; + float b = autocvar_cl_hitsound_min_pitch; + float c = autocvar_cl_hitsound_nom_damage; + float d = unaccounted_damage; + pitch_shift = (b*d*(a-1) + a*c*(1-b)) / (d*(a-1) + c*(1-b)); + + // if pitch shift is reversed, mirror in (max-min)/2 + min + if (autocvar_cl_hitsound == 3) + { + float mirror_value = (a-b)/2 + b; + pitch_shift = mirror_value + (mirror_value - pitch_shift); + } } //LOG_TRACE("dmg total (dmg): ", ftos(unaccounted_damage), " , pitch shift: ", ftos(pitch_shift)); @@ -925,9 +943,11 @@ void HUD_Draw(entity this) else if(STAT(FROZEN)) { vector col = '0.25 0.90 1'; - if(STAT(REVIVE_PROGRESS)) - col += vec3(STAT(REVIVE_PROGRESS), -STAT(REVIVE_PROGRESS), -STAT(REVIVE_PROGRESS)); - drawfill('0 0 0', vec2(vid_conwidth, vid_conheight), col, autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); + float col_fade = max(0, STAT(REVIVE_PROGRESS) * 2 - 1); + float alpha_fade = 0.3 + 0.7 * (1 - max(0, STAT(REVIVE_PROGRESS) * 4 - 3)); + if(col_fade) + col += vec3(col_fade, -col_fade, -col_fade); + drawfill('0 0 0', vec2(vid_conwidth, vid_conheight), col, autocvar_hud_colorflash_alpha * alpha_fade, DRAWFLAG_ADDITIVE); } HUD_Scale_Enable(); @@ -935,17 +955,17 @@ void HUD_Draw(entity this) if(STAT(NADE_TIMER) && autocvar_cl_nade_timer) // give nade top priority, as it's a matter of life and death { vector col = '0.25 0.90 1' + vec3(STAT(NADE_TIMER), -STAT(NADE_TIMER), -STAT(NADE_TIMER)); - DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring.tga", STAT(NADE_TIMER), col, autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); + DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring", STAT(NADE_TIMER), col, autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); drawstring_aspect(eY * 0.64 * vid_conheight, ((autocvar_cl_nade_timer == 2) ? _("Nade timer") : ""), vec2(vid_conwidth, 0.025 * vid_conheight), '1 1 1', 1, DRAWFLAG_NORMAL); } else if(STAT(CAPTURE_PROGRESS)) { - DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring.tga", STAT(CAPTURE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); + DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring", STAT(CAPTURE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); drawstring_aspect(eY * 0.64 * vid_conheight, _("Capture progress"), vec2(vid_conwidth, 0.025 * vid_conheight), '1 1 1', 1, DRAWFLAG_NORMAL); } else if(STAT(REVIVE_PROGRESS)) { - DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring.tga", STAT(REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); + DrawCircleClippedPic(vec2(0.5 * vid_conwidth, 0.6 * vid_conheight), 0.1 * vid_conheight, "gfx/crosshair_ring", STAT(REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), vec2(vid_conwidth, 0.025 * vid_conheight), '1 1 1', 1, DRAWFLAG_NORMAL); } HUD_Scale_Disable(); @@ -1066,7 +1086,7 @@ void View_NightVision() tc_10 = '1.5 0 0' - '0.2 0 0' * sin(time * 0.5) + '0 0.5 0' * cos(time * 1.7); //tc_11 = '1 1 0' + '0.6 0 0' * sin(time * 0.6) + '0 0.3 0' * cos(time * 0.1); tc_11 = tc_01 + tc_10 - tc_00; - R_BeginPolygon("gfx/nightvision-bg.tga", DRAWFLAG_ADDITIVE, true); + R_BeginPolygon("gfx/nightvision-bg", DRAWFLAG_ADDITIVE, true); R_PolygonVertex('0 0 0', tc_00, rgb, a); R_PolygonVertex(autocvar_vid_conwidth * '1 0 0', tc_10, rgb, a); R_PolygonVertex(autocvar_vid_conwidth * '1 0 0' + autocvar_vid_conheight * '0 1 0', tc_11, rgb, a); @@ -1080,7 +1100,7 @@ void View_NightVision() tc_01 = tc_00 + '0 3 0' * (1 + Noise_White(nightvision_noise2, frametime) * 0.2); tc_10 = tc_00 + '2 0 0' * (1 + Noise_White(nightvision_noise2, frametime) * 0.3); tc_11 = tc_01 + tc_10 - tc_00; - R_BeginPolygon("gfx/nightvision-fg.tga", DRAWFLAG_ADDITIVE, true); + R_BeginPolygon("gfx/nightvision-fg", DRAWFLAG_ADDITIVE, true); R_PolygonVertex('0 0 0', tc_00, rgb, a); R_PolygonVertex(autocvar_vid_conwidth * '1 0 0', tc_10, rgb, a); R_PolygonVertex(autocvar_vid_conwidth * '1 0 0' + autocvar_vid_conheight * '0 1 0', tc_11, rgb, a); @@ -1308,9 +1328,17 @@ void View_PostProcessing() void View_Lock() { - int lock_type = (!autocvar_hud_cursormode && ((autocvar__hud_configure && spectatee_status <= 0) || intermission > 1 || QuickMenu_IsOpened())); - if (lock_type == 0) - lock_type = autocvar_cl_lockview; + int lock_type = autocvar_cl_lockview; + + if (!autocvar_hud_cursormode + && ((autocvar__hud_configure && spectatee_status <= 0) + || intermission > 1 + || HUD_Radar_Clickable() + || HUD_MinigameMenu_IsOpened() + || QuickMenu_IsOpened() + ) + ) + lock_type = 1; // lock_type 1: lock origin and angles // lock_type 2: lock only origin @@ -1605,6 +1633,21 @@ void CSQC_UpdateView(entity this, float w, float h) ticrate = STAT(MOVEVARS_TICRATE) * STAT(MOVEVARS_TIMESCALE); + if (autocvar_chase_active) + { + // in first person view if r_drawviewmodel is off weapon isn't visible + // and server doesn't throw any casing + // switching to 3rd person view r_drawviewmodel is set to -1 to let know the server casings + // can be thrown for self since own weapon model is visible + if (autocvar_r_drawviewmodel == 0 && STAT(HEALTH) > 0) + cvar_set("r_drawviewmodel", "-1"); + } + else + { + if (autocvar_r_drawviewmodel < 0) + cvar_set("r_drawviewmodel", "0"); + } + WaypointSprite_Load(); CSQCPlayer_SetCamera();