From: terencehill Date: Thu, 24 Mar 2016 20:57:52 +0000 (+0100) Subject: Dynamic HUD: Rework panel resizing/shifting in a cleaner way and implement proper... X-Git-Tag: xonotic-v0.8.2~882^2~12 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=632c547367cea91f7df73f4af95d79556dbc83d4 Dynamic HUD: Rework panel resizing/shifting in a cleaner way and implement proper font scaling. Now the effect applies to the scoreboard too. It no longer applies to the chat panel since it can't work correctly (chat messages are displayed directly by the engine). --- diff --git a/qcsrc/client/hud/hud.qc b/qcsrc/client/hud/hud.qc index 6b6f4d230a..f27870988a 100644 --- a/qcsrc/client/hud/hud.qc +++ b/qcsrc/client/hud/hud.qc @@ -216,6 +216,9 @@ void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, flo else if(length_ratio < 0) return; + theOrigin = HUD_Shift(theOrigin); + theSize = HUD_Scale(theSize); + vector square; vector width, height; if(vertical) { @@ -311,6 +314,9 @@ void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float theA if(!theAlpha) return; + pos = HUD_Shift(pos); + mySize = HUD_Scale(mySize); + string pic; pic = strcat(hud_skin_path, "/num_leading"); if(precache_pic(pic) == "") { @@ -491,20 +497,29 @@ bool Hud_Shake_Update() void calc_followmodel_ofs(entity view); void Hud_Dynamic_Frame() { - hud_dynamic_ofs = '0 0 0'; + vector ofs = '0 0 0'; + hud_scale = '1 1 0'; + hud_shift = '0 0 0'; if (autocvar_hud_dynamic_follow) { entity view = CSQCModel_server2csqc(player_localentnum - 1); calc_followmodel_ofs(view); - hud_dynamic_ofs -= cl_followmodel_ofs * autocvar_hud_dynamic_follow_scale; + ofs = -cl_followmodel_ofs * autocvar_hud_dynamic_follow_scale; } - if (fabs(hud_dynamic_ofs.x) < 0.001) hud_dynamic_ofs.x = 0; - if (fabs(hud_dynamic_ofs.y) < 0.001) hud_dynamic_ofs.y = 0; - if (fabs(hud_dynamic_ofs.z) < 0.001) hud_dynamic_ofs.z = 0; - hud_dynamic_ofs.x = bound(-0.1, hud_dynamic_ofs.x, 0.1); - hud_dynamic_ofs.y = bound(-0.1, hud_dynamic_ofs.y, 0.1); - hud_dynamic_ofs.z = bound(-0.1, hud_dynamic_ofs.z, 0.1); + if (fabs(ofs.x) < 0.001) ofs.x = 0; + if (fabs(ofs.y) < 0.001) ofs.y = 0; + if (fabs(ofs.z) < 0.001) ofs.z = 0; + ofs.x = bound(-0.1, ofs.x, 0.1); + ofs.y = bound(-0.1, ofs.y, 0.1); + ofs.z = bound(-0.1, ofs.z, 0.1); + + hud_shift.x = ofs.y * vid_conwidth; + hud_shift.y = ofs.z * vid_conheight; + hud_shift.z = ofs.x; + + hud_scale.x = (1 + hud_shift.z); + hud_scale.y = hud_scale.x; float health = STAT(HEALTH); if(autocvar_hud_dynamic_shake > 0 && !autocvar__hud_configure && health > 0) @@ -531,6 +546,18 @@ void Hud_Dynamic_Frame() hud_dynamic_shake_factor = 0; } } + + if(hud_dynamic_shake_factor > 0) + { + hud_shift.x += hud_dynamic_shake_realofs.x; + hud_shift.y += hud_dynamic_shake_realofs.y; + } + + hud_scale_center.x = 0.5 * vid_conwidth; + hud_scale_center.y = 0.5 * vid_conheight; + + hud_scale_current = hud_scale; + hud_shift_current = hud_shift; } void HUD_Main() @@ -547,6 +574,8 @@ void HUD_Main() HUD_Configure_Frame(); + Hud_Dynamic_Frame(); + // panels that we want to be active together with the scoreboard // they must fade only when the menu does if(scoreboard_fade_alpha == 1) @@ -563,8 +592,6 @@ void HUD_Main() return; } - Hud_Dynamic_Frame(); - // Drawing stuff if (hud_skin_prev != autocvar_hud_skin) { diff --git a/qcsrc/client/hud/hud.qh b/qcsrc/client/hud/hud.qh index 3141fa75fa..4b12656895 100644 --- a/qcsrc/client/hud/hud.qh +++ b/qcsrc/client/hud/hud.qh @@ -22,9 +22,16 @@ REGISTER_REGISTRY(hud_panels) #define HUD_PANEL(NAME) HUD_PANEL_##NAME // draw the background/borders -#define HUD_Panel_DrawBg(theAlpha) MACRO_BEGIN { \ - if(panel.current_panel_bg != "0" && panel.current_panel_bg != "") \ - draw_BorderPicture(panel_pos - '1 1 0' * panel_bg_border, panel.current_panel_bg, panel_size + '1 1 0' * 2 * panel_bg_border, panel_bg_color, panel_bg_alpha * theAlpha, '1 1 0' * (panel_bg_border/BORDER_MULTIPLIER));\ +#define HUD_Panel_DrawBg(theAlpha) MACRO_BEGIN { \ + if(panel.current_panel_bg != "0" && panel.current_panel_bg != "") \ + draw_BorderPicture( \ + HUD_Shift(panel_pos - '1 1 0' * panel_bg_border), \ + panel.current_panel_bg, \ + HUD_Scale(panel_size + '1 1 0' * 2 * panel_bg_border), \ + panel_bg_color, \ + panel_bg_alpha * theAlpha, \ + HUD_Scale('1 1 0' * (panel_bg_border/BORDER_MULTIPLIER)) \ + ); \ } MACRO_END int panel_order[hud_panels_MAX]; @@ -166,7 +173,11 @@ float hud_dynamic_shake_time; vector cl_followmodel_ofs; float cl_followmodel_time; -vector hud_dynamic_ofs; +vector hud_scale; +vector hud_scale_current; +vector hud_shift; +vector hud_shift_current; +vector hud_scale_center; float stringwidth_colors(string s, vector theSize); float stringwidth_nocolors(string s, vector theSize); @@ -406,15 +417,6 @@ REGISTER_HUD_PANEL(QUICKMENU, HUD_QuickMenu, quickmenu, PANEL_CO panel_bg_padding = panel.current_panel_bg_padding; \ panel_fg_alpha = panel.current_panel_fg_alpha * hud_fade_alpha; \ } \ - if(hud_dynamic_shake_factor > 0) panel_pos += hud_dynamic_shake_realofs; \ - if(hud_dynamic_ofs.y) panel_pos.x += hud_dynamic_ofs.y * vid_conwidth; \ - if(hud_dynamic_ofs.z) panel_pos.y += hud_dynamic_ofs.z * vid_conheight; \ - if(hud_dynamic_ofs.x) { \ - panel_size.x += hud_dynamic_ofs.x * panel_size.x; \ - panel_size.y += hud_dynamic_ofs.x * panel_size.y; \ - panel_pos.x += hud_dynamic_ofs.x * (panel_pos.x - vid_conwidth * 0.5); \ - panel_pos.y += hud_dynamic_ofs.x * (panel_pos.y - vid_conheight * 0.5); \ - } \ } MACRO_END #define HUD_Panel_UpdatePosSize() MACRO_BEGIN { \ diff --git a/qcsrc/client/hud/panel/ammo.qc b/qcsrc/client/hud/panel/ammo.qc index fda7887b16..e8a702d6b3 100644 --- a/qcsrc/client/hud/panel/ammo.qc +++ b/qcsrc/client/hud/panel/ammo.qc @@ -110,6 +110,7 @@ void HUD_Ammo() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/centerprint.qc b/qcsrc/client/hud/panel/centerprint.qc index 99e8baaa65..23c383e45c 100644 --- a/qcsrc/client/hud/panel/centerprint.qc +++ b/qcsrc/client/hud/panel/centerprint.qc @@ -186,6 +186,7 @@ void HUD_CenterPrint () } } + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if (!centerprint_showing) @@ -263,7 +264,7 @@ void HUD_CenterPrint () // finally set the size based on the new theAlpha from subsequent fading sz = sz * (autocvar_hud_panel_centerprint_fade_subsequent_minfontsize + a * (1 - autocvar_hud_panel_centerprint_fade_subsequent_minfontsize)); - drawfontscale = sz * '1 1 0'; + drawfontscale = hud_scale * sz; if (centerprint_countdown_num[j]) n = tokenizebyseparator(strreplace("^COUNT", count_seconds(centerprint_countdown_num[j]), centerprint_messages[j]), "\n"); @@ -278,7 +279,7 @@ void HUD_CenterPrint () getWrappedLine_remaining = argv(k); while(getWrappedLine_remaining) { - ts = getWrappedLine(panel_size.x * sz, fontsize, stringwidth_colors); + ts = getWrappedLine(panel_size.x * hud_scale.x * sz, fontsize, stringwidth_colors); if (ts != "") pos.y -= fontsize.y; else @@ -294,13 +295,13 @@ void HUD_CenterPrint () getWrappedLine_remaining = argv(k); while(getWrappedLine_remaining) { - ts = getWrappedLine(panel_size.x * sz, fontsize, stringwidth_colors); + ts = getWrappedLine(panel_size.x * hud_scale.x * sz, fontsize, stringwidth_colors); if (ts != "") { if (align) - pos.x = panel_pos.x + (panel_size.x - stringwidth(ts, true, fontsize)) * align; + pos.x = panel_pos.x + (panel_size.x - stringwidth(ts, true, fontsize) * sz) * align; if (a > 0.5/255.0) // Otherwise guaranteed invisible - don't show. This is checked a second time after some multiplications with other factors were done so temporary changes of these cannot cause flicker. - drawcolorcodedstring(pos + eY * 0.5 * (1 - sz) * fontsize.y, ts, fontsize, a, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos + eY * 0.5 * (1 - sz * hud_scale.x) * fontsize.y, ts, fontsize, a, DRAWFLAG_NORMAL); pos.y += fontsize.y; } else @@ -319,7 +320,7 @@ void HUD_CenterPrint () if (pos.y < panel_pos.y) // check if the next message can be shown { - drawfontscale = '1 1 0'; + drawfontscale = hud_scale; return; } } @@ -331,12 +332,12 @@ void HUD_CenterPrint () if(pos.y > panel_pos.y + panel_size.y - fontsize.y) // check if the next message can be shown { - drawfontscale = '1 1 0'; + drawfontscale = hud_scale; return; } } } - drawfontscale = '1 1 0'; + drawfontscale = hud_scale; if (all_messages_expired) { centerprint_showing = false; diff --git a/qcsrc/client/hud/panel/chat.qc b/qcsrc/client/hud/panel/chat.qc index dd89b791ce..d8945991ec 100644 --- a/qcsrc/client/hud/panel/chat.qc +++ b/qcsrc/client/hud/panel/chat.qc @@ -54,6 +54,7 @@ void HUD_Chat() pos = panel_pos; mySize = panel_size; + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) diff --git a/qcsrc/client/hud/panel/engineinfo.qc b/qcsrc/client/hud/panel/engineinfo.qc index ea136a2148..ce425a2def 100644 --- a/qcsrc/client/hud/panel/engineinfo.qc +++ b/qcsrc/client/hud/panel/engineinfo.qc @@ -23,6 +23,7 @@ void HUD_EngineInfo() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/healtharmor.qc b/qcsrc/client/hud/panel/healtharmor.qc index 3b03979177..ffbd231eec 100644 --- a/qcsrc/client/hud/panel/healtharmor.qc +++ b/qcsrc/client/hud/panel/healtharmor.qc @@ -62,6 +62,7 @@ void HUD_HealthArmor() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/infomessages.qc b/qcsrc/client/hud/panel/infomessages.qc index 8199bd8dd6..2f072b2b55 100644 --- a/qcsrc/client/hud/panel/infomessages.qc +++ b/qcsrc/client/hud/panel/infomessages.qc @@ -23,6 +23,7 @@ void HUD_InfoMessages() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/modicons.qc b/qcsrc/client/hud/panel/modicons.qc index fbc98e0a5a..479c594db5 100644 --- a/qcsrc/client/hud/panel/modicons.qc +++ b/qcsrc/client/hud/panel/modicons.qc @@ -766,6 +766,7 @@ void HUD_ModIcons() else mod_alpha = bound(0, 1 - (time - mod_change) * 2, 1); + HUD_Scale_Enable(); if(mod_alpha) HUD_Panel_DrawBg(mod_alpha); diff --git a/qcsrc/client/hud/panel/notify.qc b/qcsrc/client/hud/panel/notify.qc index 1f0e26b9a5..720b7aeda5 100644 --- a/qcsrc/client/hud/panel/notify.qc +++ b/qcsrc/client/hud/panel/notify.qc @@ -48,6 +48,7 @@ void HUD_Notify() return; HUD_Panel_UpdateCvars(); + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if (!autocvar__hud_configure) diff --git a/qcsrc/client/hud/panel/physics.qc b/qcsrc/client/hud/panel/physics.qc index 7a9f664eb2..741c305b41 100644 --- a/qcsrc/client/hud/panel/physics.qc +++ b/qcsrc/client/hud/panel/physics.qc @@ -21,6 +21,7 @@ void HUD_Physics() draw_beginBoldFont(); + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/powerups.qc b/qcsrc/client/hud/panel/powerups.qc index 31a00794e3..8abe1fc5a1 100644 --- a/qcsrc/client/hud/panel/powerups.qc +++ b/qcsrc/client/hud/panel/powerups.qc @@ -109,6 +109,7 @@ void HUD_Powerups() // Draw panel background HUD_Panel_UpdateCvars(); + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); // Set drawing area diff --git a/qcsrc/client/hud/panel/pressedkeys.qc b/qcsrc/client/hud/panel/pressedkeys.qc index 3b512b1c33..9989c4fc84 100644 --- a/qcsrc/client/hud/panel/pressedkeys.qc +++ b/qcsrc/client/hud/panel/pressedkeys.qc @@ -13,6 +13,7 @@ void HUD_PressedKeys() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/racetimer.qc b/qcsrc/client/hud/panel/racetimer.qc index 7a9f90f9af..449b1682ca 100644 --- a/qcsrc/client/hud/panel/racetimer.qc +++ b/qcsrc/client/hud/panel/racetimer.qc @@ -18,6 +18,7 @@ void HUD_RaceTimer () pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/radar.qc b/qcsrc/client/hud/panel/radar.qc index 4a2e7ee2b3..925050df1c 100644 --- a/qcsrc/client/hud/panel/radar.qc +++ b/qcsrc/client/hud/panel/radar.qc @@ -275,6 +275,7 @@ void HUD_Radar() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { @@ -285,7 +286,7 @@ void HUD_Radar() int color2; float scale2d, normalsize, bigsize; - teamradar_origin2d = pos + 0.5 * mySize; + teamradar_origin2d = HUD_Shift(pos + 0.5 * mySize); teamradar_size2d = mySize; if(minimapname == "") @@ -294,7 +295,7 @@ void HUD_Radar() teamradar_loadcvars(); scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin); - teamradar_size2d = mySize; + teamradar_size2d = HUD_Scale(mySize); teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0'; // we always center diff --git a/qcsrc/client/hud/panel/score.qc b/qcsrc/client/hud/panel/score.qc index 12114b4e35..d65b2c2a22 100644 --- a/qcsrc/client/hud/panel/score.qc +++ b/qcsrc/client/hud/panel/score.qc @@ -144,6 +144,7 @@ void HUD_Score() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/timer.qc b/qcsrc/client/hud/panel/timer.qc index b61f3c4c17..59702304f8 100644 --- a/qcsrc/client/hud/panel/timer.qc +++ b/qcsrc/client/hud/panel/timer.qc @@ -14,6 +14,7 @@ void HUD_Timer() pos = panel_pos; mySize = panel_size; + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) { diff --git a/qcsrc/client/hud/panel/vote.qc b/qcsrc/client/hud/panel/vote.qc index 502b237f78..8968a6f349 100644 --- a/qcsrc/client/hud/panel/vote.qc +++ b/qcsrc/client/hud/panel/vote.qc @@ -69,6 +69,7 @@ void HUD_Vote() mySize = panel_size; a = vote_alpha * (vote_highlighted ? autocvar_hud_panel_vote_alreadyvoted_alpha : 1); + HUD_Scale_Enable(); HUD_Panel_DrawBg(a); a = panel_fg_alpha * a; diff --git a/qcsrc/client/hud/panel/weapons.qc b/qcsrc/client/hud/panel/weapons.qc index c465caf4fd..2caa86463f 100644 --- a/qcsrc/client/hud/panel/weapons.qc +++ b/qcsrc/client/hud/panel/weapons.qc @@ -282,6 +282,7 @@ void HUD_Weapons() } // draw the background, then change the virtual size of it to better fit other items inside + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(center.x == -1) diff --git a/qcsrc/client/mapvoting.qc b/qcsrc/client/mapvoting.qc index 3223bf120a..caa3db8f39 100644 --- a/qcsrc/client/mapvoting.qc +++ b/qcsrc/client/mapvoting.qc @@ -442,6 +442,7 @@ void MapVote_Draw() panel_pos.y = pos.y; panel_size.x = xmax - xmin; panel_size.y = ymax - ymin; + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) diff --git a/qcsrc/client/miscfunctions.qc b/qcsrc/client/miscfunctions.qc index 970a681e37..8c0bf14ea4 100644 --- a/qcsrc/client/miscfunctions.qc +++ b/qcsrc/client/miscfunctions.qc @@ -224,6 +224,10 @@ void drawborderlines(float thickness, vector pos, vector dim, vector color, floa void drawpic_tiled(vector pos, string pic, vector sz, vector area, vector color, float theAlpha, float drawflag) { + pos = HUD_Shift(pos); + sz = HUD_Scale(sz); + area = HUD_Scale(area); + vector current_pos = '0 0 0', end_pos, new_size = '0 0 0', ratio = '0 0 0'; end_pos = pos + area; @@ -258,6 +262,43 @@ void drawpic_aspect_skin_expanding_two(vector position, string pic, vector theSc drawpic_skin(position, pic, theScale, rgb, theAlpha * fadelerp, flag); } +void HUD_Scale_Disable() +{ + hud_scale = '1 1 0'; + hud_shift = '0 0 0'; + drawfontscale = hud_scale; +} + +void HUD_Scale_Enable() +{ + hud_scale = hud_scale_current; + hud_shift = hud_shift_current; + drawfontscale = hud_scale; +} + +vector HUD_Scale(vector v) +{ + v.x = HUD_ScaleX(v.x); + v.y = HUD_ScaleY(v.y); + return v; +} + +vector HUD_Shift(vector v) +{ + v.x = HUD_ShiftX(v.x); + v.y = HUD_ShiftY(v.y); + return v; +} + +float stringwidth(string text, float handleColors, vector sz) +{ + vector dfs = drawfontscale; + drawfontscale = '1 1 0'; + float r = stringwidth_builtin(text, handleColors, sz); + drawfontscale = dfs; + return r; +} + // drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box void drawstring_aspect(vector pos, string text, vector sz, vector color, float theAlpha, float drawflag) { SET_POS_AND_SZ_Y_ASPECT(false); @@ -275,12 +316,16 @@ void drawstring_expanding(vector position, string text, vector theScale, vector float sz; sz = expandingbox_sizefactor_from_fadelerp(fadelerp); + drawfontscale = hud_scale * sz; + vector dfs = drawfontscale; drawfontscale = sz * '1 1 0'; - drawstring(position + expandingbox_resize_centered_box_offset(sz, theScale, stringwidth(text, false, theScale * (sz / drawfontscale.x)) / (theScale.x * sz)), text, theScale * (sz / drawfontscale.x), rgb, theAlpha * (1 - fadelerp), flag); + float textaspect = stringwidth_builtin(text, false, theScale * (sz / drawfontscale.x)) / (theScale.x * sz); + drawfontscale = dfs; + drawstring(position + expandingbox_resize_centered_box_offset(sz, theScale, textaspect), text, HUD_Scale(theScale * (sz / drawfontscale.x)), rgb, theAlpha * (1 - fadelerp), flag); // width parameter: - // (scale_x * sz / drawfontscale_x) * drawfontscale_x * SIZE1 / (scale_x * sz) + // (scale_x * sz / drawfontscale.x) * drawfontscale.x * SIZE1 / (scale_x * sz) // SIZE1 - drawfontscale = '1 1 0'; + drawfontscale = hud_scale; } // drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box @@ -294,9 +339,10 @@ void drawcolorcodedstring_expanding(vector position, string text, vector theScal float sz; sz = expandingbox_sizefactor_from_fadelerp(fadelerp); - drawfontscale = sz * '1 1 0'; - drawcolorcodedstring(position + expandingbox_resize_centered_box_offset(sz, theScale, stringwidth(text, true, theScale * (sz / drawfontscale.x)) / (theScale.x * sz)), text, theScale * (sz / drawfontscale.x), theAlpha * (1 - fadelerp), flag); - drawfontscale = '1 1 0'; + drawfontscale = hud_scale * sz; + // eventually replace with drawcolorcodedstring + drawcolorcodedstring(position + expandingbox_resize_centered_box_offset(sz, theScale, stringwidth_builtin(text, true, theScale * (sz / drawfontscale.x)) / (theScale.x * sz)), text, theScale * (sz / drawfontscale.x), theAlpha * (1 - fadelerp), flag); + drawfontscale = hud_scale; } void drawcolorcodedstring_aspect_expanding(vector pos, string text, vector sz, float theAlpha, float drawflag, float fadelerp) { diff --git a/qcsrc/client/miscfunctions.qh b/qcsrc/client/miscfunctions.qh index 32563598b3..f0a259e0ce 100644 --- a/qcsrc/client/miscfunctions.qh +++ b/qcsrc/client/miscfunctions.qh @@ -44,6 +44,7 @@ float cvar_or(string cv, float v); vector project_3d_to_2d(vector vec); +vector drawfontscale; #define draw_beginBoldFont() MACRO_BEGIN { drawfont = FONT_USER + 2; } MACRO_END #define draw_endBoldFont() MACRO_BEGIN { drawfont = FONT_USER + 1; } MACRO_END @@ -55,6 +56,47 @@ void drawborderlines(float thickness, vector pos, vector dim, vector color, floa void drawpic_tiled(vector pos, string pic, vector sz, vector area, vector color, float theAlpha, float drawflag); +void HUD_Scale_Disable(); +void HUD_Scale_Enable(); + +#define HUD_ScaleX(f) (f * hud_scale.x) +#define HUD_ScaleY(f) (f * hud_scale.y) +#define HUD_ShiftX(f) (f + hud_shift.x + hud_shift.z * (f - hud_scale_center.x)) +#define HUD_ShiftY(f) (f + hud_shift.y + hud_shift.z * (f - hud_scale_center.y)) +vector HUD_Scale(vector v); +vector HUD_Shift(vector v); + +// call draw*_builtin (and stringwidth_builtin) functions only when +// pos and size don't have to be scaled by the hud_dynamic code +// (typically outside the real HUD code) + +// NOTE: drawsubpic usually gets called multiple times within an utility function +// so instead of remapping it, scaling pos and size in every call, +// we prefer to scale pos and size once for all in the utility function + +float stringwidth(string text, float handleColors, vector sz); + +#define drawpic(position, pic, size, rgb, alpha, flag) \ + drawpic_builtin(HUD_Shift(position), pic, HUD_Scale(size), rgb, alpha, flag) + +#define drawcharacter(position, character, scale, rgb, alpha, flag) \ + drawcharacter_builtin(HUD_Shift(position), text, scale, rgb, alpha, flag) + +#define drawstring(position, text, scale, rgb, alpha, flag) \ + drawstring_builtin(HUD_Shift(position), text, scale, rgb, alpha, flag) + +#define drawcolorcodedstring(position, text, scale, alpha, flag) \ + drawcolorcodedstring_builtin(HUD_Shift(position), text, scale, alpha, flag) + +#define drawcolorcodedstring2(position, text, scale, rgb, alpha, flag) \ + drawcolorcodedstring2_builtin(HUD_Shift(position), text, scale, rgb, alpha, flag) + +#define drawfill(position, size, rgb, alpha, flag) \ + drawfill_builtin(HUD_Shift(position), HUD_Scale(size), rgb, alpha, flag) + +#define drawsetcliparea(xposition, yposition, w, h) \ + drawsetcliparea_builtin(HUD_ShiftX(xposition), HUD_ShiftY(yposition), HUD_ScaleX(w), HUD_ScaleY(h)) + // drawpic wrapper to draw an image as large as possible with preserved aspect ratio into a box float _drawpic_imgaspect; vector _drawpic_imgsize; @@ -109,7 +151,10 @@ void drawpic_aspect_skin_expanding_two(vector position, string pic, vector theSc #define SET_POS_AND_SZ_Y_ASPECT(allow_colors) MACRO_BEGIN { \ float textaspect, oldsz; \ + vector dfs = drawfontscale; \ + drawfontscale = '1 1 0'; \ textaspect = stringwidth(text, allow_colors, '1 1 1' * sz.y) / sz.y; \ + drawfontscale = dfs; \ if(sz.x/sz.y > textaspect) { \ oldsz = sz.x; \ sz.x = sz.y * textaspect; \ @@ -127,7 +172,6 @@ void drawstring_aspect(vector pos, string text, vector sz, vector color, float t // drawstring wrapper to draw a colorcodedstring as large as possible with preserved aspect ratio into a box void drawcolorcodedstring_aspect(vector pos, string text, vector sz, float theAlpha, float drawflag); -vector drawfontscale; void drawstring_expanding(vector position, string text, vector theScale, vector rgb, float theAlpha, float flag, float fadelerp); // drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box diff --git a/qcsrc/client/quickmenu.qc b/qcsrc/client/quickmenu.qc index 6d281aa6b6..8f44529e38 100644 --- a/qcsrc/client/quickmenu.qc +++ b/qcsrc/client/quickmenu.qc @@ -620,6 +620,7 @@ void HUD_QuickMenu() HUD_Panel_UpdateCvars(); + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) diff --git a/qcsrc/client/teamradar.qc b/qcsrc/client/teamradar.qc index 01388fdd2f..a8708f2460 100644 --- a/qcsrc/client/teamradar.qc +++ b/qcsrc/client/teamradar.qc @@ -128,7 +128,7 @@ void draw_teamradar_player(vector coord3d, vector pangles, vector rgb) void draw_teamradar_icon(vector coord, entity icon, entity pingdata, vector rgb, float a) { coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord)); - drawpic(coord - '4 4 0', strcat("gfx/teamradar_icon_", ftos(icon.m_radaricon)), '8 8 0', rgb, a, 0); + drawpic_builtin(coord - '4 4 0', strcat("gfx/teamradar_icon_", ftos(icon.m_radaricon)), '8 8 0', rgb, a, 0); if(pingdata) { @@ -141,7 +141,7 @@ void draw_teamradar_icon(vector coord, entity icon, entity pingdata, vector rgb, if(dt >= 1 || dt <= 0) continue; vector v = '2 2 0' * teamradar_size * dt; - drawpic(coord - 0.5 * v, "gfx/teamradar_ping", v, '1 1 1', (1 - dt) * a, DRAWFLAG_ADDITIVE); + drawpic_builtin(coord - 0.5 * v, "gfx/teamradar_ping", v, '1 1 1', (1 - dt) * a, DRAWFLAG_ADDITIVE); } } } diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 8aeac19263..b9730407dd 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -1340,6 +1340,7 @@ void HUD_Draw() HUD_Main(); HUD_DrawScoreboard(); + HUD_Scale_Disable(); } // crosshair goes VERY LAST @@ -1382,6 +1383,8 @@ void CSQC_UpdateView(float w, float h) lasthud = hud; + HUD_Scale_Disable(); + if(autocvar__hud_showbinds_reload) // menu can set this one { db_close(binddb); diff --git a/qcsrc/common/debug.qh b/qcsrc/common/debug.qh index 40b2b3547e..9aca8e774c 100644 --- a/qcsrc/common/debug.qh +++ b/qcsrc/common/debug.qh @@ -142,7 +142,7 @@ bool autocvar_debugdraw; if (pos.z < 0) continue; pos.z = 0; pos.y += ofs * sz; - drawcolorcodedstring2(pos, + drawcolorcodedstring2_builtin(pos, sprintf("%d: '%s'@%s", (it.debug ? it.sv_entnum : etof(it)), it.classname, it.sourceLoc), sz * '1 1 0', rgb, 0.5, DRAWFLAG_NORMAL); diff --git a/qcsrc/common/minigames/cl_minigames_hud.qc b/qcsrc/common/minigames/cl_minigames_hud.qc index dfe918feca..a61d8bfbc6 100644 --- a/qcsrc/common/minigames/cl_minigames_hud.qc +++ b/qcsrc/common/minigames/cl_minigames_hud.qc @@ -476,6 +476,7 @@ void HUD_MinigameMenu () HUD_Panel_UpdateCvars(); + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); if(panel_bg_padding) diff --git a/qcsrc/common/minigames/minigame/bd.qc b/qcsrc/common/minigames/minigame/bd.qc index 84120e1b04..4610c306ac 100644 --- a/qcsrc/common/minigames/minigame/bd.qc +++ b/qcsrc/common/minigames/minigame/bd.qc @@ -828,6 +828,7 @@ void bd_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void bd_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/c4.qc b/qcsrc/common/minigames/minigame/c4.qc index 9b9d570855..76770cefe2 100644 --- a/qcsrc/common/minigames/minigame/c4.qc +++ b/qcsrc/common/minigames/minigame/c4.qc @@ -322,6 +322,7 @@ void c4_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void c4_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/nmm.qc b/qcsrc/common/minigames/minigame/nmm.qc index e4e0dc6380..f7da8f8e74 100644 --- a/qcsrc/common/minigames/minigame/nmm.qc +++ b/qcsrc/common/minigames/minigame/nmm.qc @@ -496,6 +496,7 @@ void nmm_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void nmm_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; diff --git a/qcsrc/common/minigames/minigame/pong.qc b/qcsrc/common/minigames/minigame/pong.qc index 87c75f48c5..053cadc4e0 100644 --- a/qcsrc/common/minigames/minigame/pong.qc +++ b/qcsrc/common/minigames/minigame/pong.qc @@ -542,6 +542,7 @@ void pong_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void pong_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/pp.qc b/qcsrc/common/minigames/minigame/pp.qc index a66a839677..24c61c0100 100644 --- a/qcsrc/common/minigames/minigame/pp.qc +++ b/qcsrc/common/minigames/minigame/pp.qc @@ -374,6 +374,7 @@ void pp_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void pp_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/ps.qc b/qcsrc/common/minigames/minigame/ps.qc index 4eb0009b9d..58df41415f 100644 --- a/qcsrc/common/minigames/minigame/ps.qc +++ b/qcsrc/common/minigames/minigame/ps.qc @@ -429,6 +429,7 @@ void ps_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void ps_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/snake.qc b/qcsrc/common/minigames/minigame/snake.qc index d367472d82..dafa14fa31 100644 --- a/qcsrc/common/minigames/minigame/snake.qc +++ b/qcsrc/common/minigames/minigame/snake.qc @@ -674,6 +674,7 @@ void snake_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void snake_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/minigames/minigame/ttt.qc b/qcsrc/common/minigames/minigame/ttt.qc index cd9565abd5..7e2ed7e088 100644 --- a/qcsrc/common/minigames/minigame/ttt.qc +++ b/qcsrc/common/minigames/minigame/ttt.qc @@ -272,6 +272,7 @@ void ttt_hud_board(vector pos, vector mySize) // Required function, draw the game status panel void ttt_hud_status(vector pos, vector mySize) { + HUD_Scale_Disable(); HUD_Panel_DrawBg(1); vector ts; ts = minigame_drawstring_wrapped(mySize_x,pos,active_minigame.descriptor.message, diff --git a/qcsrc/common/mutators/mutator/damagetext/damagetext.qc b/qcsrc/common/mutators/mutator/damagetext/damagetext.qc index 0b44b7346e..8ca049133d 100644 --- a/qcsrc/common/mutators/mutator/damagetext/damagetext.qc +++ b/qcsrc/common/mutators/mutator/damagetext/damagetext.qc @@ -58,7 +58,7 @@ CLASS(DamageText, Object) s = strreplace("{health}", sprintf("%d", this.m_damage), s); s = strreplace("{armor}", sprintf("%d", this.m_armordamage), s); s = strreplace("{total}", sprintf("%d", this.m_damage + this.m_armordamage), s); - drawcolorcodedstring2(pos, s, this.m_size * '1 1 0', rgb, this.alpha, DRAWFLAG_NORMAL); + drawcolorcodedstring2_builtin(pos, s, this.m_size * '1 1 0', rgb, this.alpha, DRAWFLAG_NORMAL); } } ATTRIB(DamageText, draw2d, void(DamageText), DamageText_draw2d) diff --git a/qcsrc/common/mutators/mutator/itemstime.qc b/qcsrc/common/mutators/mutator/itemstime.qc index 6c7eb4d76f..34e6e3275a 100644 --- a/qcsrc/common/mutators/mutator/itemstime.qc +++ b/qcsrc/common/mutators/mutator/itemstime.qc @@ -357,6 +357,7 @@ void HUD_ItemsTime() } } + HUD_Scale_Enable(); HUD_Panel_DrawBg(1); float row = 0, column = 0; diff --git a/qcsrc/dpdefs/upstream/csprogsdefs.qc b/qcsrc/dpdefs/upstream/csprogsdefs.qc index 21b7c5433b..3748b8df79 100644 --- a/qcsrc/dpdefs/upstream/csprogsdefs.qc +++ b/qcsrc/dpdefs/upstream/csprogsdefs.qc @@ -476,14 +476,14 @@ string(string name, ...) precache_pic = #317; string(string name) precache_cubemap = #317; vector(string picname) draw_getimagesize = #318; void(string name) freepic = #319; -float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter = #320; -float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring = #321; -float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic = #322; -float(vector position, vector size, vector rgb, float alpha, float flag) drawfill = #323; -void(float x, float y, float width, float height) drawsetcliparea = #324; +float(vector position, float character, vector scale, vector rgb, float alpha, float flag) drawcharacter_builtin = #320; +float(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawstring_builtin = #321; +float(vector position, string pic, vector size, vector rgb, float alpha, float flag) drawpic_builtin = #322; +float(vector position, vector size, vector rgb, float alpha, float flag) drawfill_builtin = #323; +void(float x, float y, float width, float height) drawsetcliparea_builtin = #324; void(void) drawresetcliparea = #325; -float(vector position, string text, vector scale, float alpha, float flag) drawcolorcodedstring = #326; -vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2 = #326; +float(vector position, string text, vector scale, float alpha, float flag) drawcolorcodedstring_builtin = #326; +vector(vector position, string text, vector scale, vector rgb, float alpha, float flag) drawcolorcodedstring2_builtin = #326; float(float stnum) getstatf = #330; float(float stnum, ...) getstati = #331; // can optionally take first bit and count @@ -846,7 +846,7 @@ float loadfont(string fontname, string fontmaps, string sizes, float slot, float // fix_* parms let you fix badly made fonts by applying some transformations to them // fix_scale : per-character center-oriented scale (doesn't change line height at all) // fix_voffset : vertical offset for each character, it's a multiplier to character height -float stringwidth(string text, float allowColorCodes, vector size) = #327; // get a width of string with given font and char size +float stringwidth_builtin(string text, float allowColorCodes, vector size) = #327; // get a width of string with given font and char size float stringwidth_menu(string text, float allowColorCodes, vector size) = #468; // in menu.dat it has different builtin # //description: engine support for custom fonts in console, hud, qc etc. // limits: diff --git a/qcsrc/lib/draw.qh b/qcsrc/lib/draw.qh index c8d9ae8de9..698c926237 100644 --- a/qcsrc/lib/draw.qh +++ b/qcsrc/lib/draw.qh @@ -46,7 +46,7 @@ { if (theBorderSize.x < 0 && theBorderSize.y < 0) // draw whole image as it is { - drawpic(theOrigin, pic, theSize, theColor, theAlpha, 0); + drawpic_builtin(theOrigin, pic, theSize, theColor, theAlpha, 0); return; } if (theBorderSize.x == 0 && theBorderSize.y == 0) // no border @@ -120,13 +120,13 @@ void drawstringright(vector position, string text, vector theScale, vector rgb, float theAlpha, int flag) { position.x -= 2 / 3 * strlen(text) * theScale.x; - drawstring(position, text, theScale, rgb, theAlpha, flag); + drawstring_builtin(position, text, theScale, rgb, theAlpha, flag); } void drawstringcenter(vector position, string text, vector theScale, vector rgb, float theAlpha, int flag) { position.x = 0.5 * (vid_conwidth - 0.6025 * strlen(text) * theScale.x); - drawstring(position, text, theScale, rgb, theAlpha, flag); + drawstring_builtin(position, text, theScale, rgb, theAlpha, flag); } #endif diff --git a/qcsrc/lib/string.qh b/qcsrc/lib/string.qh index 47a8175cac..3e12af394f 100644 --- a/qcsrc/lib/string.qh +++ b/qcsrc/lib/string.qh @@ -4,7 +4,18 @@ #include "sort.qh" #include "oo.qh" -#ifndef SVQC +#ifdef CSQC + float stringwidth_colors(string s, vector theSize) + { + return stringwidth_builtin(s, true, theSize); + } + + float stringwidth_nocolors(string s, vector theSize) + { + return stringwidth_builtin(s, false, theSize); + } +#endif +#ifdef MENUQC float stringwidth_colors(string s, vector theSize) { return stringwidth(s, true, theSize);