- pic = "gfx/hud/default/statusbar_vertical";
- }
-
- if(barflip)
- drawsetcliparea(pos_x, pos_y + mySize_y * (1 - x), mySize_x, mySize_y * x);
- else
- drawsetcliparea(pos_x, pos_y, mySize_x, mySize_y * x);
- } else {
- pic = strcat(hud_skin_path, "/", pic);
- if(precache_pic(pic) == "") {
- pic = "gfx/hud/default/statusbar";
- }
-
- if(barflip)
- drawsetcliparea(pos_x + mySize_x * (1 - x), pos_y, mySize_x * x, mySize_y);
- else
- drawsetcliparea(pos_x, pos_y, mySize_x * x, mySize_y);
- }
-
- drawpic(pos, pic, mySize, color, alpha, drawflag);
- drawresetcliparea();
-}
-
-void HUD_Panel_DrawHighlight(vector pos, vector mySize, vector color, float alpha, float drawflag)
-{
- if(!alpha)
- return;
-
- string pic;
- pic = strcat(hud_skin_path, "/num_leading");
- if(precache_pic(pic) == "") {
- pic = "gfx/hud/default/num_leading";
- }
-
- drawsubpic(pos, eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0 0 0', '0.25 1 0', color, alpha, drawflag);
- if(mySize_x/mySize_y > 2)
- drawsubpic(pos + eX * mySize_y, eX * (mySize_x - 2 * mySize_y) + eY * mySize_y, pic, '0.25 0 0', '0.5 1 0', color, alpha, drawflag);
- drawsubpic(pos + eX * mySize_x - eX * min(mySize_x * 0.5, mySize_y), eX * min(mySize_x * 0.5, mySize_y) + eY * mySize_y, pic, '0.75 0 0', '0.25 1 0', color, alpha, drawflag);
-}
-
-// check if move will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
-vector HUD_Panel_CheckMove(vector myPos, vector mySize)
-{
- float i;
-
- vector myTarget;
- myTarget = myPos;
-
- vector myCenter;
- vector targCenter;
- myCenter = '0 0 0'; // shut up fteqcc, there IS a reference
- targCenter = '0 0 0'; // shut up fteqcc, there IS a reference
-
- for (i = 0; i < HUD_PANEL_NUM; ++i) {
- if(i == highlightedPanel || !panel_enabled)
- continue;
-
- HUD_Panel_UpdatePosSizeForId(i);
-
- panel_pos -= '1 1 0' * panel_bg_border;
- panel_size += '2 2 0' * panel_bg_border;
-
- if(myPos_y + mySize_y < panel_pos_y)
- continue;
- if(myPos_y > panel_pos_y + panel_size_y)
- continue;
-
- if(myPos_x + mySize_x < panel_pos_x)
- continue;
- if(myPos_x > panel_pos_x + panel_size_x)
- continue;
-
- // OK, there IS a collision.
-
- myCenter_x = myPos_x + 0.5 * mySize_x;
- myCenter_y = myPos_y + 0.5 * mySize_y;
-
- targCenter_x = panel_pos_x + 0.5 * panel_size_x;
- targCenter_y = panel_pos_y + 0.5 * panel_size_y;
-
- if(myCenter_x < targCenter_x && myCenter_y < targCenter_y) // top left (of the target panel)
- {
- if(myPos_x + mySize_x - panel_pos_x < myPos_y + mySize_y - panel_pos_y) // push it to the side
- myTarget_x = panel_pos_x - mySize_x;
- else // push it upwards
- myTarget_y = panel_pos_y - mySize_y;
- }
- else if(myCenter_x > targCenter_x && myCenter_y < targCenter_y) // top right
- {
- if(panel_pos_x + panel_size_x - myPos_x < myPos_y + mySize_y - panel_pos_y) // push it to the side
- myTarget_x = panel_pos_x + panel_size_x;
- else // push it upwards
- myTarget_y = panel_pos_y - mySize_y;
- }
- else if(myCenter_x < targCenter_x && myCenter_y > targCenter_y) // bottom left
- {
- if(myPos_x + mySize_x - panel_pos_x < panel_pos_y + panel_size_y - myPos_y) // push it to the side
- myTarget_x = panel_pos_x - mySize_x;
- else // push it downwards
- myTarget_y = panel_pos_y + panel_size_y;
- }
- else if(myCenter_x > targCenter_x && myCenter_y > targCenter_y) // bottom right
- {
- if(panel_pos_x + panel_size_x - myPos_x < panel_pos_y + panel_size_y - myPos_y) // push it to the side
- myTarget_x = panel_pos_x + panel_size_x;
- else // push it downwards
- myTarget_y = panel_pos_y + panel_size_y;
- }
- //if(cvar("hud_configure_checkcollisions_debug"))
- //drawfill(panel_pos, panel_size, '1 1 0', .3, DRAWFLAG_NORMAL);
- }
-
- return myTarget;
-}
-
-void HUD_Panel_SetPos(vector pos)
-{
- HUD_Panel_UpdatePosSizeForId(highlightedPanel);
- vector mySize;
- mySize = panel_size;
-
- //if(cvar("hud_configure_checkcollisions_debug"))
- //drawfill(pos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
-
- if(autocvar_hud_configure_grid)
- {
- pos_x = floor((pos_x/vid_conwidth)/bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_xsize, 0.2) * vid_conwidth;
- pos_y = floor((pos_y/vid_conheight)/bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) + 0.5) * bound(0.005, autocvar_hud_configure_grid_ysize, 0.2) * vid_conheight;
- }
-
- if(hud_configure_checkcollisions)
- pos = HUD_Panel_CheckMove(pos, mySize);
-
- pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
- pos_y = bound(0, pos_y, vid_conheight - mySize_y);
-
- string s;
- s = strcat(ftos(pos_x/vid_conwidth), " ", ftos(pos_y/vid_conheight));
-
- HUD_Panel_GetName(highlightedPanel);
- cvar_set(strcat("hud_panel_", panel_name, "_pos"), s);
-}
-
-// check if resize will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
-vector HUD_Panel_CheckResize(vector mySize, vector resizeorigin) {
- float i;
-
- vector targEndPos;
-
- float dist_x, dist_y;
- float ratio;
- ratio = mySize_x/mySize_y;
-
- for (i = 0; i < HUD_PANEL_NUM; ++i) {
- if(i == highlightedPanel || !panel_enabled)
- continue;
-
- HUD_Panel_UpdatePosSizeForId(i);
-
- panel_pos -= '1 1 0' * panel_bg_border;
- panel_size += '2 2 0' * panel_bg_border;
-
- targEndPos = panel_pos + panel_size;
-
- // resizeorigin is WITHIN target panel, just abort any collision testing against that particular panel to produce expected behaviour!
- if(resizeorigin_x > panel_pos_x && resizeorigin_x < targEndPos_x && resizeorigin_y > panel_pos_y && resizeorigin_y < targEndPos_y)
- continue;
-
- if (resizeCorner == 1)
- {
- // check if this panel is on our way
- if (resizeorigin_x <= panel_pos_x)
- continue;
- if (resizeorigin_y <= panel_pos_y)
- continue;
- if (targEndPos_x <= resizeorigin_x - mySize_x)
- continue;
- if (targEndPos_y <= resizeorigin_y - mySize_y)
- continue;
-
- // there is a collision:
- // detect which side of the panel we are facing is actually limiting the resizing
- // (which side the resize direction finds for first) and reduce the size up to there
- //
- // dist is the distance between resizeorigin and the "analogous" point of the panel
- // 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 || dist_x / dist_y > ratio)
- mySize_x = min(mySize_x, dist_x);
- else
- mySize_y = min(mySize_y, dist_y);