OpenGl immediate mode: drawnode.c

Part of T49043
This commit is contained in:
Luca Rood 2017-02-21 22:17:47 -03:00
parent 4c6190d08f
commit 9dd86e2758
1 changed files with 79 additions and 43 deletions

View File

@ -353,6 +353,7 @@ static void node_draw_frame_label(bNodeTree *ntree, bNode *node, const float asp
const int font_size = data->label_size / aspect;
const float margin = (float)(NODE_DY / 4);
int label_height;
unsigned char color[3];
nodeLabel(ntree, node, label, sizeof(label));
@ -361,7 +362,8 @@ static void node_draw_frame_label(bNodeTree *ntree, bNode *node, const float asp
BLF_size(fontid, MIN2(24, font_size), U.dpi); /* clamp otherwise it can suck up a LOT of memory */
/* title color */
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
UI_GetThemeColorBlendShade3ubv(TH_TEXT, color_id, 0.4f, 10, color);
BLF_color3ubv(fontid, color);
width = BLF_width(fontid, label, sizeof(label));
ascender = BLF_ascender(fontid);
@ -3267,13 +3269,19 @@ void draw_nodespace_back_pix(const bContext *C, ARegion *ar, SpaceNode *snode, b
viewer_border->ymin < viewer_border->ymax)
{
rcti pixel_border;
UI_ThemeColor(TH_ACTIVE);
BLI_rcti_init(&pixel_border,
x + snode->zoom * viewer_border->xmin * ibuf->x,
x + snode->zoom * viewer_border->xmax * ibuf->x,
y + snode->zoom * viewer_border->ymin * ibuf->y,
y + snode->zoom * viewer_border->ymax * ibuf->y);
glaDrawBorderCorners(&pixel_border, 1.0f, 1.0f);
unsigned int pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformThemeColor(TH_ACTIVE);
immDrawBorderCorners(pos, &pixel_border, 1.0f, 1.0f);
immUnbindProgram();
}
}
@ -3393,6 +3401,7 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link,
float arrow[2], arrow1[2], arrow2[2];
const float px_fac = UI_DPI_WINDOW_FAC;
glGetFloatv(GL_LINE_WIDTH, &linew);
unsigned int pos;
/* we can reuse the dist variable here to increment the GL curve eval amount*/
dist = 1.0f / (float)LINK_RESOL;
@ -3416,57 +3425,84 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link,
arrow[0] = coord_array[LINK_ARROW][0];
arrow[1] = coord_array[LINK_ARROW][1];
}
if (do_triple || drawarrow || (!do_shaded)) {
pos = add_attrib(immVertexFormat(), "pos", GL_FLOAT, 2, KEEP_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
}
if (do_triple) {
UI_ThemeColorShadeAlpha(th_col3, -80, -120);
immUniformThemeColorShadeAlpha(th_col3, -80, -120);
glLineWidth(4.0f * px_fac);
glBegin(GL_LINE_STRIP);
immBegin(GL_LINE_STRIP, (LINK_RESOL + 1));
for (i = 0; i <= LINK_RESOL; i++) {
glVertex2fv(coord_array[i]);
immVertex2fv(pos, coord_array[i]);
}
glEnd();
immEnd();
if (drawarrow) {
glBegin(GL_LINE_STRIP);
glVertex2fv(arrow1);
glVertex2fv(arrow);
glVertex2fv(arrow2);
glEnd();
immBegin(GL_LINE_STRIP, 3);
immVertex2fv(pos, arrow1);
immVertex2fv(pos, arrow);
immVertex2fv(pos, arrow2);
immEnd();
}
}
/* XXX using GL_LINES for shaded node lines is a workaround
* for Intel hardware, this breaks with GL_LINE_STRIP and
* changing color in begin/end blocks.
*/
glLineWidth(1.5f * px_fac);
if (drawarrow) {
immUniformThemeColorBlend(th_col1, th_col2, 0.5f);
immBegin(GL_LINE_STRIP, 3);
immVertex2fv(pos, arrow1);
immVertex2fv(pos, arrow);
immVertex2fv(pos, arrow2);
immEnd();
}
if (!do_shaded) {
immUniformThemeColor(th_col1);
immBegin(GL_LINE_STRIP, (LINK_RESOL + 1));
for (i = 0; i <= LINK_RESOL; i++) {
immVertex2fv(pos, coord_array[i]);
}
immEnd();
}
if (do_triple || drawarrow || (!do_shaded)) {
immUnbindProgram();
}
if (do_shaded) {
glBegin(GL_LINES);
for (i = 0; i < LINK_RESOL; i++) {
UI_ThemeColorBlend(th_col1, th_col2, spline_step);
glVertex2fv(coord_array[i]);
UI_ThemeColorBlend(th_col1, th_col2, spline_step + dist);
glVertex2fv(coord_array[i + 1]);
unsigned char col[3];
VertexFormat *format = immVertexFormat();
pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
unsigned int color = add_attrib(format, "color", GL_UNSIGNED_BYTE, 3, NORMALIZE_INT_TO_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBegin(GL_LINE_STRIP, (LINK_RESOL + 1));
for (i = 0; i <= LINK_RESOL; i++) {
UI_GetThemeColorBlend3ubv(th_col1, th_col2, spline_step, col);
immAttrib3ubv(color, col);
immVertex2fv(pos, coord_array[i]);
spline_step += dist;
}
glEnd();
}
else {
UI_ThemeColor(th_col1);
glBegin(GL_LINE_STRIP);
for (i = 0; i <= LINK_RESOL; i++) {
glVertex2fv(coord_array[i]);
}
glEnd();
}
if (drawarrow) {
glBegin(GL_LINE_STRIP);
glVertex2fv(arrow1);
glVertex2fv(arrow);
glVertex2fv(arrow2);
glEnd();
immEnd();
immUnbindProgram();
}
glDisable(GL_LINE_SMOOTH);