From cf7893007863b9dab8a4fb2c1d1829ac56b759e6 Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 19 May 2016 19:01:36 +0200 Subject: [PATCH] Smooth selection change in the weapons panel, optionally with a nice lens effect --- _hud_descriptions.cfg | 2 ++ hud_luma.cfg | 2 ++ hud_luminos.cfg | 2 ++ hud_luminos_minimal.cfg | 2 ++ hud_luminos_minimal_xhair.cfg | 2 ++ hud_luminos_old.cfg | 2 ++ hud_nexuiz.cfg | 2 ++ qcsrc/client/autocvars.qh | 2 ++ qcsrc/client/hud/panel/weapons.qc | 52 +++++++++++++++++++++++++------ 9 files changed, 58 insertions(+), 10 deletions(-) diff --git a/_hud_descriptions.cfg b/_hud_descriptions.cfg index de4631711..ee4689890 100644 --- a/_hud_descriptions.cfg +++ b/_hud_descriptions.cfg @@ -65,6 +65,8 @@ seta hud_panel_weapons_ammo "" "show ammo as a status bar" seta hud_panel_weapons_onlyowned "" "show only owned weapons" seta hud_panel_weapons_noncurrent_alpha "" "alpha of noncurrent weapons" seta hud_panel_weapons_noncurrent_scale "" "scale of noncurrent weapons, relative to the current weapon" +seta hud_panel_weapons_selection_radius "" "number of weapons that get partially highlighted on each side of the currently selected weapon" +seta hud_panel_weapons_selection_speed "" "weapon selection speed (0 for an instant selection)" seta hud_panel_ammo_pos "" "position of this panel" seta hud_panel_ammo_size "" "size of this panel" diff --git a/hud_luma.cfg b/hud_luma.cfg index 2ec91efca..2f4f31e92 100644 --- a/hud_luma.cfg +++ b/hud_luma.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" seta hud_panel_weapons_noncurrent_alpha "0.8" seta hud_panel_weapons_noncurrent_scale "0.9" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "10" seta hud_panel_ammo_pos "0.315000 0.865000" seta hud_panel_ammo_size "0.370000 0.060000" diff --git a/hud_luminos.cfg b/hud_luminos.cfg index 7badb2505..3d259ebf3 100644 --- a/hud_luminos.cfg +++ b/hud_luminos.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" seta hud_panel_weapons_noncurrent_alpha "1" seta hud_panel_weapons_noncurrent_scale "1" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "0" seta hud_panel_ammo_pos "0.330000 0.960000" seta hud_panel_ammo_size "0.350000 0.040000" diff --git a/hud_luminos_minimal.cfg b/hud_luminos_minimal.cfg index 76edc7bc0..c1ac51b7a 100644 --- a/hud_luminos_minimal.cfg +++ b/hud_luminos_minimal.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" seta hud_panel_weapons_noncurrent_alpha "1" seta hud_panel_weapons_noncurrent_scale "1" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "0" seta hud_panel_ammo_pos "0.650000 0.890000" seta hud_panel_ammo_size "0.055000 0.110000" diff --git a/hud_luminos_minimal_xhair.cfg b/hud_luminos_minimal_xhair.cfg index f2670d8e2..d6125985b 100644 --- a/hud_luminos_minimal_xhair.cfg +++ b/hud_luminos_minimal_xhair.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" seta hud_panel_weapons_noncurrent_alpha "1" seta hud_panel_weapons_noncurrent_scale "1" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "0" seta hud_panel_ammo_pos "0.450000 0.630000" seta hud_panel_ammo_size "0.080000 0.040000" diff --git a/hud_luminos_old.cfg b/hud_luminos_old.cfg index fc8d05ffb..4ee800521 100644 --- a/hud_luminos_old.cfg +++ b/hud_luminos_old.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "1" seta hud_panel_weapons_noncurrent_alpha "1" seta hud_panel_weapons_noncurrent_scale "1" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "0" seta hud_panel_ammo_pos "0.190000 0.920000" seta hud_panel_ammo_size "0.120000 0.070000" diff --git a/hud_nexuiz.cfg b/hud_nexuiz.cfg index bc1dc9bdd..df565ef68 100644 --- a/hud_nexuiz.cfg +++ b/hud_nexuiz.cfg @@ -66,6 +66,8 @@ seta hud_panel_weapons_timeout_speed_out "0.75" seta hud_panel_weapons_onlyowned "0" seta hud_panel_weapons_noncurrent_alpha "1" seta hud_panel_weapons_noncurrent_scale "1" +seta hud_panel_weapons_selection_radius "0" +seta hud_panel_weapons_selection_speed "0" seta hud_panel_ammo_pos "0.160000 0.910000" seta hud_panel_ammo_size "0.190000 0.090000" diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index d797cee33..26834613c 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -327,6 +327,8 @@ float autocvar_hud_panel_weapons_label_scale = 0.5; bool autocvar_hud_panel_weapons_onlyowned; float autocvar_hud_panel_weapons_noncurrent_alpha = 1; float autocvar_hud_panel_weapons_noncurrent_scale = 1; +float autocvar_hud_panel_weapons_selection_radius = 0; +float autocvar_hud_panel_weapons_selection_speed = 10; float autocvar_hud_panel_weapons_timeout; int autocvar_hud_panel_weapons_timeout_effect; float autocvar_hud_panel_weapons_timeout_fadebgmin; diff --git a/qcsrc/client/hud/panel/weapons.qc b/qcsrc/client/hud/panel/weapons.qc index cfacd59b6..712eb26c5 100644 --- a/qcsrc/client/hud/panel/weapons.qc +++ b/qcsrc/client/hud/panel/weapons.qc @@ -346,10 +346,23 @@ void HUD_Weapons() // draw items row = column = 0; vector label_size = '1 1 0' * min(weapon_size.x, weapon_size.y) * bound(0, autocvar_hud_panel_weapons_label_scale, 1); - vector noncurrent_pos = '0 0 0'; vector noncurrent_size = weapon_size * bound(0, autocvar_hud_panel_weapons_noncurrent_scale, 1); float noncurrent_alpha = panel_fg_alpha * bound(0, autocvar_hud_panel_weapons_noncurrent_alpha, 1); bool isCurrent; + static vector weapon_pos_current = '-1 0 0'; + if(weapon_pos_current.x == -1) + weapon_pos_current = panel_pos; + + float switch_speed; + if(autocvar_hud_panel_weapons_selection_speed <= 0 || autocvar__hud_configure) + switch_speed = 999; + else + switch_speed = frametime * autocvar_hud_panel_weapons_selection_speed; + vector radius_size = weapon_size * (autocvar_hud_panel_weapons_selection_radius + 1); + + // draw background behind currently selected weapon + // do it earlier to make sure bg is drawn behind every weapon icons while it's moving + drawpic_aspect_skin(weapon_pos_current, "weapon_current_bg", weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); for(i = 0; i <= WEP_LAST-WEP_FIRST; ++i) { @@ -374,13 +387,20 @@ void HUD_Weapons() // figure out the drawing position of weapon weapon_pos = (panel_pos + eX * column * weapon_size.x + eY * row * weapon_size.y); - noncurrent_pos.x = weapon_pos.x + (weapon_size.x - noncurrent_size.x) / 2; - noncurrent_pos.y = weapon_pos.y + (weapon_size.y - noncurrent_size.y) / 2; - // draw background behind currently selected weapon + // update position of the currently selected weapon isCurrent = (it == switchweapon); if(isCurrent) - drawpic_aspect_skin(weapon_pos, "weapon_current_bg", weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + { + if(weapon_pos_current.y > weapon_pos.y) + weapon_pos_current.y = max(weapon_pos.y, weapon_pos_current.y - switch_speed * (weapon_pos_current.y - weapon_pos.y)); + else if(weapon_pos_current.y < weapon_pos.y) + weapon_pos_current.y = min(weapon_pos.y, weapon_pos_current.y + switch_speed * (weapon_pos.y - weapon_pos_current.y)); + if(weapon_pos_current.x > weapon_pos.x) + weapon_pos_current.x = max(weapon_pos.x, weapon_pos_current.x - switch_speed * (weapon_pos_current.x - weapon_pos.x)); + else if(weapon_pos_current.x < weapon_pos.x) + weapon_pos_current.x = min(weapon_pos.x, weapon_pos_current.x + switch_speed * (weapon_pos.x - weapon_pos_current.x)); + } // draw the weapon accuracy if(autocvar_hud_panel_weapons_accuracy) @@ -393,14 +413,26 @@ void HUD_Weapons() } } + vector weapon_size_real = noncurrent_size; + float weapon_alpha_real = noncurrent_alpha; + float radius_factor_x = 1 - bound(0, fabs(weapon_pos.x - weapon_pos_current.x) / radius_size.x, 1); + float radius_factor_y = 1 - bound(0, fabs(weapon_pos.y - weapon_pos_current.y) / radius_size.y, 1); + if(radius_factor_x || radius_factor_y) + { + weapon_size_real.x += (weapon_size.x - noncurrent_size.x) * radius_factor_x; + weapon_size_real.y += (weapon_size.y - noncurrent_size.y) * radius_factor_y; + weapon_alpha_real += (panel_fg_alpha - noncurrent_alpha) * min(radius_factor_x, radius_factor_y); + } + + vector weapon_pos_real = weapon_pos; + weapon_pos_real.x = weapon_pos.x + (weapon_size.x - weapon_size_real.x) / 2; + weapon_pos_real.y = weapon_pos.y + (weapon_size.y - weapon_size_real.y) / 2; + // drawing all the weapon items if(weapons_stat & WepSet_FromWeapon(it)) { // draw the weapon image - if(isCurrent) - drawpic_aspect_skin(weapon_pos, it.model2, weapon_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - else - drawpic_aspect_skin(noncurrent_pos, it.model2, noncurrent_size, '1 1 1', noncurrent_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(weapon_pos_real, it.model2, weapon_size_real, '1 1 1', weapon_alpha_real, DRAWFLAG_NORMAL); // draw weapon label string switch(autocvar_hud_panel_weapons_label) @@ -462,7 +494,7 @@ void HUD_Weapons() } else // draw a "ghost weapon icon" if you don't have the weapon { - drawpic_aspect_skin(noncurrent_pos, it.model2, noncurrent_size, '0.2 0.2 0.2', panel_fg_alpha * 0.5, DRAWFLAG_NORMAL); + drawpic_aspect_skin(weapon_pos_real, it.model2, weapon_size_real, '0.2 0.2 0.2', weapon_alpha_real * 0.5, DRAWFLAG_NORMAL); } // draw the complain message -- 2.39.2