OpenGL immediate mode: interface_panel.c

This commit is contained in:
Clément Foucault 2017-02-20 15:17:23 +01:00
parent 86d8dc12c1
commit 5c39aad283
1 changed files with 85 additions and 60 deletions

View File

@ -445,7 +445,7 @@ static void ui_draw_tria_rect(const rctf *rect, char dir)
}
}
static void ui_draw_anti_x(float x1, float y1, float x2, float y2)
static void ui_draw_anti_x(unsigned int pos, float x1, float y1, float x2, float y2)
{
/* set antialias line */
@ -454,8 +454,8 @@ static void ui_draw_anti_x(float x1, float y1, float x2, float y2)
glLineWidth(2.0);
fdrawline(x1, y1, x2, y2);
fdrawline(x1, y2, x2, y1);
imm_draw_line(pos, x1, y1, x2, y2);
imm_draw_line(pos, x1, y2, x2, y1);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
@ -463,16 +463,16 @@ static void ui_draw_anti_x(float x1, float y1, float x2, float y2)
}
/* x 'icon' for panel header */
static void ui_draw_x_icon(float x, float y)
static void ui_draw_x_icon(unsigned int pos, float x, float y)
{
ui_draw_anti_x(x, y, x + 9.375f, y + 9.375f);
ui_draw_anti_x(pos, x, y, x + 9.375f, y + 9.375f);
}
#define PNL_ICON UI_UNIT_X /* could be UI_UNIT_Y too */
static void ui_draw_panel_scalewidget(const rcti *rect)
static void ui_draw_panel_scalewidget(unsigned int pos, const rcti *rect)
{
float xmin, xmax, dx;
float ymin, ymax, dy;
@ -486,16 +486,16 @@ static void ui_draw_panel_scalewidget(const rcti *rect)
dy = 0.5f * (ymax - ymin);
glEnable(GL_BLEND);
glColor4ub(255, 255, 255, 50);
fdrawline(xmin, ymin, xmax, ymax);
fdrawline(xmin + dx, ymin, xmax, ymax - dy);
immUniformColor4ub(255, 255, 255, 50);
imm_draw_line(pos, xmin, ymin, xmax, ymax);
imm_draw_line(pos, xmin + dx, ymin, xmax, ymax - dy);
glColor4ub(0, 0, 0, 50);
fdrawline(xmin, ymin + 1, xmax, ymax + 1);
fdrawline(xmin + dx, ymin + 1, xmax, ymax - dy + 1);
immUniformColor4ub(0, 0, 0, 50);
imm_draw_line(pos, xmin, ymin + 1, xmax, ymax + 1);
imm_draw_line(pos, xmin + dx, ymin + 1, xmax, ymax - dy + 1);
glDisable(GL_BLEND);
}
static void ui_draw_panel_dragwidget(const rctf *rect)
static void ui_draw_panel_dragwidget(unsigned int pos, const rctf *rect)
{
unsigned char col_back[3], col_high[3], col_dark[3];
const int col_tint = 84;
@ -524,10 +524,10 @@ static void ui_draw_panel_dragwidget(const rctf *rect)
const int x_co = (x_min + x_ofs) + (i_x * (box_size + box_margin));
const int y_co = (y_min + y_ofs) + (i_y * (box_size + box_margin));
glColor3ubv(col_dark);
glRectf(x_co - box_size, y_co - px_zoom, x_co, (y_co + box_size) - px_zoom);
glColor3ubv(col_high);
glRectf(x_co - box_size, y_co, x_co, y_co + box_size);
immUniformColor3ubv(col_dark);
immRectf(pos, x_co - box_size, y_co - px_zoom, x_co, (y_co + box_size) - px_zoom);
immUniformColor3ubv(col_high);
immRectf(pos, x_co - box_size, y_co, x_co, y_co + box_size);
}
}
}
@ -585,6 +585,9 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
headrect.ymin = headrect.ymax;
headrect.ymax = headrect.ymin + floor(PNL_HEADER / block->aspect + 0.001f);
unsigned int pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
{
float minx = rect->xmin;
float maxx = is_closed_x ? (minx + PNL_HEADER / block->aspect) : rect->xmax;
@ -594,11 +597,11 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
if (UI_GetThemeValue(TH_PANEL_SHOW_HEADER)) {
/* draw with background color */
UI_ThemeColor4(TH_PANEL_HEADER);
glRectf(minx, headrect.ymin + 1, maxx, y);
immUniformThemeColor(TH_PANEL_HEADER);
immRectf(pos, minx, headrect.ymin + 1, maxx, y);
fdrawline(minx, y, maxx, y);
fdrawline(minx, y, maxx, y);
imm_draw_line(pos, minx, y, maxx, y);
imm_draw_line(pos, minx, y, maxx, y);
}
else if (!(panel->runtime_flag & PNL_FIRST)) {
/* draw embossed separator */
@ -608,15 +611,17 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
maxx -= 5.0f / block->aspect;
}
glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
fdrawline(minx, y, maxx, y);
glColor4f(1.0f, 1.0f, 1.0f, 0.25f);
fdrawline(minx, y - 1, maxx, y - 1);
immUniformColor4f(0.0f, 0.0f, 0.0f, 0.5f);
imm_draw_line(pos, minx, y, maxx, y);
immUniformColor4f(1.0f, 1.0f, 1.0f, 0.25f);
imm_draw_line(pos, minx, y - 1, maxx, y - 1);
}
glDisable(GL_BLEND);
}
immUnbindProgram();
/* draw optional pin icon */
#ifdef USE_PIN_HIDDEN
@ -632,9 +637,11 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
glDisable(GL_BLEND);
}
/* horizontal title */
if (is_closed_x == false) {
ui_draw_aligned_panel_header(style, block, &headrect, 'h');
pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
/* itemrect smaller */
itemrect.xmax = headrect.xmax - 5.0f / block->aspect;
@ -643,7 +650,9 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
itemrect.ymax = headrect.ymax;
BLI_rctf_scale(&itemrect, 0.7f);
ui_draw_panel_dragwidget(&itemrect);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
ui_draw_panel_dragwidget(pos, &itemrect);
immUnbindProgram();
}
/* if the panel is minimized vertically:
@ -655,6 +664,7 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
else if (is_closed_x) {
/* draw vertical title */
ui_draw_aligned_panel_header(style, block, &headrect, 'v');
pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
}
/* an open panel */
else {
@ -667,29 +677,34 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
UI_draw_roundbox_unfilled(0.5f + rect->xmin, 0.5f + rect->ymin, 0.5f + rect->xmax, 0.5f + headrect.ymax + 1, 8, color);
}
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
/* panel backdrop */
if (UI_GetThemeValue(TH_PANEL_SHOW_BACK)) {
/* draw with background color */
glEnable(GL_BLEND);
UI_ThemeColor4(TH_PANEL_BACK);
glRecti(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
immUniformThemeColor(TH_PANEL_BACK);
immRecti(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
}
if (panel->control & UI_PNL_SCALE)
ui_draw_panel_scalewidget(rect);
ui_draw_panel_scalewidget(pos, rect);
immUnbindProgram();
}
/* draw optional close icon */
ofsx = 6;
if (panel->control & UI_PNL_CLOSE) {
UI_ThemeColor(TH_TITLE);
ui_draw_x_icon(rect->xmin + 2 + ofsx, rect->ymax + 2);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformThemeColor(TH_TITLE);
ui_draw_x_icon(pos, rect->xmin + 2 + ofsx, rect->ymax + 2);
ofsx = 22;
immUnbindProgram();
}
/* draw collapse icon */
UI_ThemeColor(TH_TITLE);
/* itemrect smaller */
itemrect.xmin = headrect.xmin + 5.0f / block->aspect;
@ -706,6 +721,7 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, const rcti *rect, con
else
ui_draw_tria_rect(&itemrect, 'v');
(void)ofsx;
}
@ -1543,10 +1559,6 @@ static void ui_panel_category_draw_tab(
mul_v2_fl(vec[a], rad);
}
if (mode == GL_POLYGON) {
mode = GL_TRIANGLE_FAN;
}
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBeginAtMost(mode, 24);
@ -1738,21 +1750,26 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
/* begin drawing */
glEnable(GL_LINE_SMOOTH);
unsigned int pos = add_attrib(immVertexFormat(), "pos", GL_INT, 2, CONVERT_INT_TO_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
/* draw the background */
if (is_alpha) {
glEnable(GL_BLEND);
glColor4ubv(theme_col_tab_bg);
immUniformColor4ubv(theme_col_tab_bg);
}
else {
glColor3ubv(theme_col_tab_bg);
immUniformColor3ubv(theme_col_tab_bg);
}
glRecti(v2d->mask.xmin, v2d->mask.ymin, v2d->mask.xmin + category_tabs_width, v2d->mask.ymax);
immRecti(pos, v2d->mask.xmin, v2d->mask.ymin, v2d->mask.xmin + category_tabs_width, v2d->mask.ymax);
if (is_alpha) {
glDisable(GL_BLEND);
}
immUnbindProgram();
for (pc_dyn = ar->panels_category.first; pc_dyn; pc_dyn = pc_dyn->next) {
const rcti *rct = &pc_dyn->rect;
const char *category_id = pc_dyn->idname;
@ -1775,7 +1792,7 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
if (is_active)
#endif
{
ui_panel_category_draw_tab(GL_POLYGON, rct->xmin, rct->ymin, rct->xmax, rct->ymax,
ui_panel_category_draw_tab(GL_TRIANGLE_FAN, rct->xmin, rct->ymin, rct->xmax, rct->ymax,
tab_curve_radius - px, roundboxtype, true, true, NULL,
is_active ? theme_col_tab_active : theme_col_tab_inactive);
@ -1792,11 +1809,16 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
/* tab blackline */
if (!is_active) {
glColor3ubv(theme_col_tab_divider);
glRecti(v2d->mask.xmin + category_tabs_width - px,
rct->ymin - tab_v_pad,
v2d->mask.xmin + category_tabs_width,
rct->ymax + tab_v_pad);
pos = add_attrib(immVertexFormat(), "pos", GL_INT, 2, CONVERT_INT_TO_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformColor3ubv(theme_col_tab_divider);
immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
rct->ymin - tab_v_pad,
v2d->mask.xmin + category_tabs_width,
rct->ymax + tab_v_pad);
immUnbindProgram();
}
if (do_scaletabs) {
@ -1817,33 +1839,36 @@ void UI_panel_category_draw_all(ARegion *ar, const char *category_id_active)
glDisable(GL_BLEND);
/* tab blackline remaining (last tab) */
pos = add_attrib(immVertexFormat(), "pos", GL_INT, 2, CONVERT_INT_TO_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
if (pc_dyn->prev == NULL) {
glColor3ubv(theme_col_tab_divider);
glRecti(v2d->mask.xmin + category_tabs_width - px,
rct->ymax + px,
v2d->mask.xmin + category_tabs_width,
v2d->mask.ymax);
immUniformColor3ubv(theme_col_tab_divider);
immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
rct->ymax + px,
v2d->mask.xmin + category_tabs_width,
v2d->mask.ymax);
}
if (pc_dyn->next == NULL) {
glColor3ubv(theme_col_tab_divider);
glRecti(v2d->mask.xmin + category_tabs_width - px,
0,
v2d->mask.xmin + category_tabs_width,
rct->ymin);
immUniformColor3ubv(theme_col_tab_divider);
immRecti(pos, v2d->mask.xmin + category_tabs_width - px,
0,
v2d->mask.xmin + category_tabs_width,
rct->ymin);
}
#ifdef USE_FLAT_INACTIVE
/* draw line between inactive tabs */
if (is_active == false && is_active_prev == false && pc_dyn->prev) {
glColor3ubv(theme_col_tab_divider);
glRecti(v2d->mask.xmin + (category_tabs_width / 5),
rct->ymax + px,
(v2d->mask.xmin + category_tabs_width) - (category_tabs_width / 5),
rct->ymax + (px * 3));
immUniformColor3ubv(theme_col_tab_divider);
immRecti(pos, v2d->mask.xmin + (category_tabs_width / 5),
rct->ymax + px,
(v2d->mask.xmin + category_tabs_width) - (category_tabs_width / 5),
rct->ymax + (px * 3));
}
is_active_prev = is_active;
#endif
immUnbindProgram();
/* not essential, but allows events to be handled right up until the region edge [#38171] */
pc_dyn->rect.xmin = v2d->mask.xmin;