From 31cd53ce25ab0b93bd9129c10f97bef9124e0269 Mon Sep 17 00:00:00 2001 From: terencehill Date: Mon, 25 Jan 2021 17:49:20 +0100 Subject: [PATCH] Improve detection of overlapping player tags by checking if the boxes they are contained in overlap rather than if distance of box origins is smaller than a certain value --- _hud_common.cfg | 3 +-- qcsrc/client/shownames.qc | 19 +++++++++++++++---- qcsrc/client/shownames.qh | 1 - 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/_hud_common.cfg b/_hud_common.cfg index 4973ef0bc..4bcb35e74 100644 --- a/_hud_common.cfg +++ b/_hud_common.cfg @@ -251,6 +251,5 @@ seta hud_shownames_alpha 0.7 "alpha" seta hud_shownames_resize 1 "enable resizing of the names, then the size cvars will correspond to the maximum size" seta hud_shownames_mindistance 1000 "start fading alpha/size at this distance" seta hud_shownames_maxdistance 5000 "alpha/size is 0 at this distance" -seta hud_shownames_antioverlap 1 "if two tags get too close to each other, fade out the one further away from you" -seta hud_shownames_antioverlap_distance 50 "2d distance to other tag after which to fade out" +seta hud_shownames_antioverlap 1 "if two tags overlap, fade out the one further away from you" seta hud_shownames_offset 52 "offset (along z-axis) tag from player origin by this many units" diff --git a/qcsrc/client/shownames.qc b/qcsrc/client/shownames.qc index ccf3176e7..0bde46a15 100644 --- a/qcsrc/client/shownames.qc +++ b/qcsrc/client/shownames.qc @@ -31,6 +31,10 @@ STATIC_INIT(shownames_ent) } } +// used by the antioverlap code +.vector box_ofs; +.vector box_org; + const float SHOWNAMES_FADESPEED = 4; const float SHOWNAMES_FADEDELAY = 0.4; void Draw_ShowNames(entity this) @@ -86,7 +90,7 @@ void Draw_ShowNames(entity this) vector eo = project_3d_to_2d(it.origin + eZ * autocvar_hud_shownames_offset); if (OFF_SCREEN(eo)) continue; eo.z = 0; - if (vdist((vec2(o) - eo), <, autocvar_hud_shownames_antioverlap_distance) + if (boxesoverlap(this.box_org - this.box_ofs, this.box_org + this.box_ofs, it.box_org - it.box_ofs, it.box_org + it.box_ofs) && vlen2(it.origin - view_origin) < vlen2(this.origin - view_origin)) { overlap = 1; @@ -154,23 +158,30 @@ void Draw_ShowNames(entity this) resize = 0.5 + 0.5 * (f - max(0, dist - autocvar_hud_shownames_mindistance)) / f; } } - // draw the sprite image + if (o.z >= 0) { o.z = 0; vector mySize = (vec2(autocvar_hud_shownames_aspect, 1)) * autocvar_hud_shownames_fontsize; vector myPos = o - vec2(0.5 * mySize.x, mySize.y); - // size scaling mySize.x *= resize; mySize.y *= resize; myPos.x += 0.5 * (mySize.x / resize - mySize.x); myPos.y += (mySize.y / resize - mySize.y); - // this is where the origin of the string + + this.box_org = myPos + mySize / 2; + this.box_ofs = mySize / 2; + float namewidth = mySize.x; if (autocvar_hud_shownames_status && this.sameteam && !this.csqcmodel_isdead) { vector pos = myPos + eY * autocvar_hud_shownames_fontsize * resize; vector sz = vec2(0.5 * mySize.x, resize * autocvar_hud_shownames_statusbar_height); + + this.box_ofs.x = max(mySize.x / 2, sz.x); // sz.x is already half as wide + this.box_ofs.y += sz.y / 2; + this.box_org.y = myPos.y + (mySize.y + sz.y) / 2; + if (autocvar_hud_shownames_statusbar_highlight) drawfill(pos + eX * 0.25 * mySize.x, sz, '0.7 0.7 0.7', a / 2, DRAWFLAG_NORMAL); if (this.healthvalue > 0) diff --git a/qcsrc/client/shownames.qh b/qcsrc/client/shownames.qh index b5bf6bacc..38d68fa7c 100644 --- a/qcsrc/client/shownames.qh +++ b/qcsrc/client/shownames.qh @@ -17,7 +17,6 @@ bool autocvar_hud_shownames_resize; float autocvar_hud_shownames_mindistance; float autocvar_hud_shownames_maxdistance; bool autocvar_hud_shownames_antioverlap; -float autocvar_hud_shownames_antioverlap_distance; float autocvar_hud_shownames_offset; entityclass(ShowNames); -- 2.39.2