Merge branch 'master' into terencehill/newpanelhud
authorFruitieX <rasse@rasse-lappy.localdomain>
Tue, 29 Jun 2010 07:51:23 +0000 (10:51 +0300)
committerFruitieX <rasse@rasse-lappy.localdomain>
Tue, 29 Jun 2010 07:51:23 +0000 (10:51 +0300)
1  2 
qcsrc/client/hud.qc

diff --combined qcsrc/client/hud.qc
index 9dfae2c903b1ef8d73bae21336bb2ee8c3e906df,1b8b2366e0122f52b1b7d9e814970fff075acba7..74d10d970a38550a8ce1ea81cf9caf0843e76aa4
@@@ -14,13 -14,6 +14,13 @@@ Misc HUD function
  //   1/4 height: bottom part
  void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
  {
 +      if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border
 +      {
 +              // draw only the central part
 +              drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0);
 +              return;
 +      }
 +
        vector dX, dY;
        vector width, height;
        vector bW, bH;
@@@ -868,7 -861,7 +868,7 @@@ void HUD_Panel_DrawBg(float id, vector 
        if(bg != "0")
        {
                float border;
 -              border = max(0.0000001, HUD_Panel_GetBorder(id)); // draw_BorderPicture does not like border = 0
 +              border = HUD_Panel_GetBorder(id);
  
                vector color;
                color = HUD_Panel_GetColor(id);
@@@ -986,7 -979,7 +986,7 @@@ void HUD_Panel_SetPos(float id, vector 
        vector mySize;
        mySize = HUD_Panel_GetSize(id);
  
 -      if(cvar("hud_configure_checkcollisions"))
 +      if(hud_configure_checkcollisions)
                pos = HUD_Panel_CheckMove(id, pos, mySize);
  
        pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
@@@ -1012,10 -1005,7 +1012,10 @@@ vector HUD_Panel_CheckResize(float id, 
        vector targPos;
        vector targSize;
        vector targEndPos;
 +
        vector dist;
 +      float ratio;
 +      ratio = mySize_x/mySize_y;
  
        for (i = 0; i < HUD_PANEL_NUM; ++i) {
                if(i == id || !HUD_Panel_CheckActive(i))
                targEndPos = targPos + targSize;
  
                // resizeorigin is WITHIN target panel, just abort any collision testing against that particular panel to produce expected behaviour!
 -              if(resizeorigin_x > targPos_x && resizeorigin_x < targPos_x + targSize_x && resizeorigin_y > targPos_y && resizeorigin_y < targPos_y + targSize_y)
 +              if(resizeorigin_x > targPos_x && resizeorigin_x < targEndPos_x && resizeorigin_y > targPos_y && resizeorigin_y < targEndPos_y)
                        continue;
  
                if (resizeCorner == 1)
                        // in this case resizeorigin (bottom-right point) and the bottom-right point of the panel
                        dist_x = resizeorigin_x - targEndPos_x;
                        dist_y = resizeorigin_y - targEndPos_y;
 -                      if (dist_y < 0)
 +                      if (dist_y < 0 || dist_x / dist_y > ratio)
                                mySize_x = min(mySize_x, dist_x);
                        else
                                mySize_y = min(mySize_y, dist_y);
  
                        dist_x = targPos_x - resizeorigin_x;
                        dist_y = resizeorigin_y - targEndPos_y;
 -                      if (dist_y < 0)
 +                      if (dist_y < 0 || dist_x / dist_y > ratio)
                                mySize_x = min(mySize_x, dist_x);
                        else
                                mySize_y = min(mySize_y, dist_y);
  
                        dist_x = resizeorigin_x - targEndPos_x;
                        dist_y = targPos_y - resizeorigin_y;
 -                      if (dist_y < 0)
 +                      if (dist_y < 0 || dist_x / dist_y > ratio)
                                mySize_x = min(mySize_x, dist_x);
                        else
                                mySize_y = min(mySize_y, dist_y);
  
                        dist_x = targPos_x - resizeorigin_x;
                        dist_y = targPos_y - resizeorigin_y;
 -                      if (dist_y < 0)
 +                      if (dist_y < 0 || dist_x / dist_y > ratio)
                                mySize_x = min(mySize_x, dist_x);
                        else
                                mySize_y = min(mySize_y, dist_y);
        return mySize;
  }
  
 -void HUD_Panel_SetPosSize(float id)
 +void HUD_Panel_SetPosSize(float id, vector mySize)
  {
        vector resizeorigin;
        resizeorigin = panel_click_resizeorigin;
 -      vector mySize, myPos;
 -
 -      if(resizeCorner == 1) {
 -              mySize_x = resizeorigin_x - (mousepos_x - panel_click_distance_x);
 -              mySize_y = resizeorigin_y - (mousepos_y - panel_click_distance_y);
 -      } else if(resizeCorner == 2) {          
 -              mySize_x = mousepos_x + panel_click_distance_x - resizeorigin_x;
 -              mySize_y = panel_click_distance_y + resizeorigin_y - mousepos_y;
 -      } else if(resizeCorner == 3) {
 -              mySize_x = resizeorigin_x + panel_click_distance_x - mousepos_x;
 -              mySize_y = mousepos_y + panel_click_distance_y - resizeorigin_y;
 -      } else { // resizeCorner == 4
 -              mySize_x = mousepos_x - (resizeorigin_x - panel_click_distance_x);
 -              mySize_y = mousepos_y - (resizeorigin_y - panel_click_distance_y);
 -      }
 +      vector myPos;
  
        // minimum panel size cap
        mySize_x = max(0.025 * vid_conwidth, mySize_x);
                mySize_y = floor((mySize_y/vid_conheight)/bound(0.005, cvar("hud_configure_grid_y"), 0.2) + 0.5) * bound(0.005, cvar("hud_configure_grid_y"), 0.2) * vid_conheight;
        }
  
 -      if(cvar("hud_configure_checkcollisions"))
 -      {
 +      if(hud_configure_checkcollisions)
                mySize = HUD_Panel_CheckResize(id, mySize, resizeorigin);
 -      }
  
        // minimum panel size cap, do this once more so we NEVER EVER EVER have a panel smaller than this, JUST IN CASE above code still makes the panel eg negative (impossible to resize back without changing cvars manually then)
        mySize_x = max(0.025 * vid_conwidth, mySize_x);
        }
  
        if(cvar("hud_configure_checkcollisions_debug"))
 -      if(cvar("hud_configure_checkcollisions"))
                drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL);
  
        string s;
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
  }
  
 +float pressed_key_time;
 +void HUD_Panel_Arrow_Action(float nPrimary)
 +{
 +      if (highlightedPanel_prev == -1)
 +              return;
 +
 +      hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
 +
 +      float step;
 +      if (nPrimary == K_UPARROW || nPrimary == K_DOWNARROW)
 +              step = vid_conheight;
 +      else
 +              step = vid_conwidth;
 +      if (hudShiftState & S_SHIFT)
 +              step = (step / 256); // more precision
 +      else
 +              step = (step / 64) * (1 + 2 * (time - pressed_key_time));
 +
 +      highlightedPanel = highlightedPanel_prev;
 +
 +      if (hudShiftState & S_ALT) // resize
 +      {
 +              highlightedAction = 1;
 +              if(nPrimary == K_UPARROW)
 +                      resizeCorner = 1;
 +              else if(nPrimary == K_RIGHTARROW)
 +                      resizeCorner = 2;
 +              else if(nPrimary == K_LEFTARROW)
 +                      resizeCorner = 3;
 +              else // if(nPrimary == K_DOWNARROW)
 +                      resizeCorner = 4;
 +
 +              // ctrl+arrow reduces the size, instead of increasing it
 +              // Note that ctrl disables collisions check too, but it's fine
 +              // since we don't collide with anything reducing the size
 +              if (hudShiftState & S_CTRL) {
 +                      step = -step;
 +                      resizeCorner = 5 - resizeCorner;
 +              }
 +
 +              vector mySize;
 +              mySize = HUD_Panel_GetSize(highlightedPanel);
 +              panel_click_resizeorigin = HUD_Panel_GetPos(highlightedPanel);
 +              if(resizeCorner == 1) {
 +                      panel_click_resizeorigin += mySize;
 +                      mySize_y += step;
 +              } else if(resizeCorner == 2) {
 +                      panel_click_resizeorigin_y += mySize_y;
 +                      mySize_x += step;
 +              } else if(resizeCorner == 3) {
 +                      panel_click_resizeorigin_x += mySize_x;
 +                      mySize_x += step;
 +              } else { // resizeCorner == 4
 +                      mySize_y += step;
 +              }
 +              HUD_Panel_SetPosSize(highlightedPanel, mySize);
 +      }
 +      else // move
 +      {
 +              highlightedAction = 2;
 +              vector pos;
 +              pos = HUD_Panel_GetPos(highlightedPanel);
 +              if(nPrimary == K_UPARROW)
 +                      pos_y -= step;
 +              else if(nPrimary == K_DOWNARROW)
 +                      pos_y += step;
 +              else if(nPrimary == K_LEFTARROW)
 +                      pos_x -= step;
 +              else // if(nPrimary == K_RIGHTARROW)
 +                      pos_x += step;
 +
 +              HUD_Panel_SetPos(highlightedPanel, pos);
 +      }
 +}
 +
  float mouseClicked;
  float prevMouseClicked; // previous state
  float prevMouseClickedTime; // time during previous mouse click, to check for doubleclicks
@@@ -1305,17 -1237,6 +1305,17 @@@ float HUD_Panel_InputEvent(float bInput
                        hit_con_bind = 1;
        }
  
 +      if(bInputType == 0) {
 +              if(nPrimary == K_ALT) hudShiftState |= S_ALT;
 +              if(nPrimary == K_CTRL) hudShiftState |= S_CTRL;
 +              if(nPrimary == K_SHIFT) hudShiftState |= S_SHIFT;
 +      }
 +      else if(bInputType == 1) {
 +              if(nPrimary == K_ALT) hudShiftState -= (hudShiftState & S_ALT);
 +              if(nPrimary == K_CTRL) hudShiftState -= (hudShiftState & S_CTRL);
 +              if(nPrimary == K_SHIFT) hudShiftState -= (hudShiftState & S_SHIFT);
 +      }
 +
        if(nPrimary == K_MOUSE1)
        {
                if(bInputType == 0) { // key pressed
        }
        else if(nPrimary == K_ESCAPE)
        {
 +              if (bInputType == 1)
 +                      return true;
                disable_menu_alphacheck = 1;
                menu_enabled = 1;
                menu_enabled_time = time;
                localcmd("menu_showhudexit\n");
        }
 +      else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW)
 +      {
 +              if (bInputType == 1)
 +              {
 +                      pressed_key_time = 0;
 +                      return true;
 +              }
 +              else if (pressed_key_time == 0)
 +                      pressed_key_time = time;
  
 +              HUD_Panel_Arrow_Action(nPrimary); //move or resize panel
 +      }
        else if(hit_con_bind)
                return false;
  
        return true; // Suppress ALL other input
  }
  
 +void HUD_Panel_Highlight()
 +{
 +      float i, border;
 +      vector panelPos;
 +      vector panelSize;
 +
 +      for(i = 0; i < HUD_PANEL_NUM; ++i)
 +      {
 +              panelPos = HUD_Panel_GetPos(i);
 +              panelSize = HUD_Panel_GetSize(i);
 +              border = HUD_Panel_GetBorder(i);
 +
 +              // move
 +              if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
 +              {
 +                      highlightedPanel = i;
 +                      highlightedAction = 1;
 +                      panel_click_distance = mousepos - panelPos;
 +                      return;
 +              }
 +              // resize from topleft border
 +              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              {
 +                      highlightedPanel = i;
 +                      highlightedAction = 2;
 +                      resizeCorner = 1;
 +                      panel_click_distance = mousepos - panelPos;
 +                      panel_click_resizeorigin = panelPos + panelSize;
 +                      return;
 +              }
 +              // resize from topright border
 +              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 +              {
 +                      highlightedPanel = i;
 +                      highlightedAction = 2;
 +                      resizeCorner = 2;
 +                      panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x;
 +                      panel_click_distance_y = mousepos_y - panelPos_y;
 +                      panel_click_resizeorigin = panelPos + eY * panelSize_y;
 +                      return;
 +              }
 +              // resize from bottomleft border
 +              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
 +              {
 +                      highlightedPanel = i;
 +                      highlightedAction = 2;
 +                      resizeCorner = 3;
 +                      panel_click_distance_x = mousepos_x - panelPos_x;
 +                      panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y;
 +                      panel_click_resizeorigin = panelPos + eX * panelSize_x;
 +                      return;
 +              }
 +              // resize from bottomright border
 +              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
 +              {
 +                      highlightedPanel = i;
 +                      highlightedAction = 2;
 +                      resizeCorner = 4;
 +                      panel_click_distance = panelSize - mousepos + panelPos;
 +                      panel_click_resizeorigin = panelPos;
 +                      return;
 +              }
 +      }
 +}
 +
  void HUD_Panel_Mouse()
  {
        // TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled
        print("Menu alpha: ", cvar_string("_menu_alpha"), "\n");
        */
  
 -      if(mouseClicked == 0 && disable_menu_alphacheck != 2) { // don't reset these variables in disable_menu_alphacheck mode 2!
 +      if(mouseClicked == 0 && disable_menu_alphacheck != 2 && highlightedPanel >= 0) { // don't reset these variables in disable_menu_alphacheck mode 2!
 +              highlightedPanel_prev = highlightedPanel;
                highlightedPanel = -1;
                highlightedAction = 0;
        }
  
        if(mouseClicked)
        {
 -              float i, border;
 -              vector panelPos;
 -              vector panelSize;
 +              if(prevMouseClicked == 0)
 +                      HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin
  
 -              for(i = 0; i < HUD_PANEL_NUM; ++i)
 -              {
 -                      panelPos = HUD_Panel_GetPos(i);
 -                      panelSize = HUD_Panel_GetSize(i);
 -                      border = HUD_Panel_GetBorder(i);
 -                      if(prevMouseClicked == 0) {
 -                              // move
 -                              if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
 -                              {
 -                                      highlightedPanel = i;
 -                                      highlightedAction = 1;
 -                              }
 -                              // resize from topleft border
 -                              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 -                              {
 -                                      highlightedPanel = i;
 -                                      highlightedAction = 2;
 -                                      resizeCorner = 1;
 -                              }
 -                              // resize from topright border
 -                              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
 -                              {
 -                                      highlightedPanel = i;
 -                                      highlightedAction = 2;
 -                                      resizeCorner = 2;
 -                              }
 -                              // resize from bottomleft border
 -                              else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
 -                              {
 -                                      highlightedPanel = i;
 -                                      highlightedAction = 2;
 -                                      resizeCorner = 3;
 -                              }
 -                              // resize from bottomright border
 -                              else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
 -                              {
 -                                      highlightedPanel = i;
 -                                      highlightedAction = 2;
 -                                      resizeCorner = 4;
 -                              }
 -                      }
 +              hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
  
 -                      if(highlightedPanel == i)
 -                      {
 -                              if(prevMouseClicked == 0)
 -                              {
 -                                      if(highlightedAction == 1)
 -                                              panel_click_distance = mousepos - panelPos;
 -                                      else if(highlightedAction == 2)
 -                                      {
 -                                              if(resizeCorner == 1) {
 -                                                      panel_click_distance = mousepos - panelPos;
 -                                                      panel_click_resizeorigin = panelPos + panelSize;
 -                                              } else if(resizeCorner == 2) {
 -                                                      panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x;
 -                                                      panel_click_distance_y = mousepos_y - panelPos_y;
 -                                                      panel_click_resizeorigin = panelPos + eY * panelSize_y;
 -                                              } else if(resizeCorner == 3) {
 -                                                      panel_click_distance_x = mousepos_x - panelPos_x;
 -                                                      panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y;
 -                                                      panel_click_resizeorigin = panelPos + eX * panelSize_x;
 -                                              } else if(resizeCorner == 4) {
 -                                                      panel_click_distance = panelSize - mousepos + panelPos;
 -                                                      panel_click_resizeorigin = panelPos;
 -                                              }
 -                                      }       
 -                              }
 -
 -                              if(cvar("hud_configure_checkcollisions_debug"))
 -                                      drawfill(panelPos, panelSize, '1 0 0', .3, DRAWFLAG_NORMAL);
 -
 -                              if(highlightedAction == 1)
 -                                      HUD_Panel_SetPos(i, mousepos - panel_click_distance);
 -                              else if(highlightedAction == 2)
 -                                      HUD_Panel_SetPosSize(i);
 +              if(highlightedAction == 1)
 +                      HUD_Panel_SetPos(highlightedPanel, mousepos - panel_click_distance);
 +              else if(highlightedAction == 2)
 +              {
 +                      vector mySize;
 +                      if(resizeCorner == 1) {
 +                              mySize_x = panel_click_resizeorigin_x - (mousepos_x - panel_click_distance_x);
 +                              mySize_y = panel_click_resizeorigin_y - (mousepos_y - panel_click_distance_y);
 +                      } else if(resizeCorner == 2) {
 +                              mySize_x = mousepos_x + panel_click_distance_x - panel_click_resizeorigin_x;
 +                              mySize_y = panel_click_distance_y + panel_click_resizeorigin_y - mousepos_y;
 +                      } else if(resizeCorner == 3) {
 +                              mySize_x = panel_click_resizeorigin_x + panel_click_distance_x - mousepos_x;
 +                              mySize_y = mousepos_y + panel_click_distance_y - panel_click_resizeorigin_y;
 +                      } else { // resizeCorner == 4
 +                              mySize_x = mousepos_x - (panel_click_resizeorigin_x - panel_click_distance_x);
 +                              mySize_y = mousepos_y - (panel_click_resizeorigin_y - panel_click_distance_y);
                        }
 +                      HUD_Panel_SetPosSize(highlightedPanel, mySize);
                }
  
                // doubleclick check
@@@ -1504,7 -1402,6 +1504,6 @@@ void HUD_WeaponIcons_Clear(
  }
  
  entity weaponorder[WEP_MAXCOUNT];
  void weaponorder_swap(float i, float j, entity pass)
  {
        entity h;
        weaponorder[j] = h;
  }
  
+ string weaponorder_cmp_str_save;
  string weaponorder_cmp_str;
  float weaponorder_cmp(float i, float j, entity pass)
  {
@@@ -1533,19 -1431,34 +1533,34 @@@ void HUD_WeaponIcons(void
        mySize = HUD_Panel_GetSize(id);
  
        stat_weapons = getstati(STAT_WEAPONS);
+       weapon_cnt = 0;
        for(i = WEP_FIRST; i <= WEP_LAST; ++i)
        {
                self = get_weaponinfo(i);
                if(self.impulse >= 0)
-               {
-                       weaponorder[weapon_cnt] = self;
                        ++weapon_cnt;
-               }
        }
  
        // TODO make this configurable
        weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
-       heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
+       if(weaponorder_cmp_str != weaponorder_cmp_str_save)
+       {
+               if(weaponorder_cmp_str_save)
+                       strunzone(weaponorder_cmp_str_save);
+               weaponorder_cmp_str_save = strzone(weaponorder_cmp_str);
+               weapon_cnt = 0;
+               for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+               {
+                       self = get_weaponinfo(i);
+                       if(self.impulse >= 0)
+                       {
+                               weaponorder[weapon_cnt] = self;
+                               ++weapon_cnt;
+                       }
+               }
+               heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
+       }
  
        HUD_Panel_DrawBg(id, pos, mySize, 0);
        float padding;