diff options
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_draw.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 168 |
1 files changed, 66 insertions, 102 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 62d8f771b8c..08b15957dbb 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -417,7 +417,7 @@ void ED_view3d_calc_camera_border( view3d_camera_border(scene, ar, v3d, rv3d, r_viewborder, no_shift, false); } -static void drawviewborder_grid3(uint pos, uint line_origin, float x1, float x2, float y1, float y2, float fac) +static void drawviewborder_grid3(uint shdr_pos, float x1, float x2, float y1, float y2, float fac) { float x3, y3, x4, y4; @@ -428,28 +428,24 @@ static void drawviewborder_grid3(uint pos, uint line_origin, float x1, float x2, immBegin(PRIM_LINES, 8); - immAttrib2f(line_origin, x1, y3); - immVertex2f(pos, x1, y3); - immVertex2f(pos, x2, y3); + immVertex2f(shdr_pos, x1, y3); + immVertex2f(shdr_pos, x2, y3); - immAttrib2f(line_origin, x1, y4); - immVertex2f(pos, x1, y4); - immVertex2f(pos, x2, y4); + immVertex2f(shdr_pos, x1, y4); + immVertex2f(shdr_pos, x2, y4); - immAttrib2f(line_origin, x3, y1); - immVertex2f(pos, x3, y1); - immVertex2f(pos, x3, y2); + immVertex2f(shdr_pos, x3, y1); + immVertex2f(shdr_pos, x3, y2); - immAttrib2f(line_origin, x4, y1); - immVertex2f(pos, x4, y1); - immVertex2f(pos, x4, y2); + immVertex2f(shdr_pos, x4, y1); + immVertex2f(shdr_pos, x4, y2); immEnd(); } /* harmonious triangle */ static void drawviewborder_triangle( - uint pos, uint line_origin, float x1, float x2, float y1, float y2, const char golden, const char dir) + uint shdr_pos, float x1, float x2, float y1, float y2, const char golden, const char dir) { float ofs; float w = x2 - x1; @@ -466,17 +462,14 @@ static void drawviewborder_triangle( } if (dir == 'B') SWAP(float, y1, y2); - immAttrib2f(line_origin, x1, y1); - immVertex2f(pos, x1, y1); - immVertex2f(pos, x2, y2); + immVertex2f(shdr_pos, x1, y1); + immVertex2f(shdr_pos, x2, y2); - immAttrib2f(line_origin, x2, y1); - immVertex2f(pos, x2, y1); - immVertex2f(pos, x1 + (w - ofs), y2); + immVertex2f(shdr_pos, x2, y1); + immVertex2f(shdr_pos, x1 + (w - ofs), y2); - immAttrib2f(line_origin, x1, y2); - immVertex2f(pos, x1, y2); - immVertex2f(pos, x1 + ofs, y1); + immVertex2f(shdr_pos, x1, y2); + immVertex2f(shdr_pos, x1 + ofs, y1); } else { if (golden) { @@ -487,17 +480,14 @@ static void drawviewborder_triangle( } if (dir == 'B') SWAP(float, x1, x2); - immAttrib2f(line_origin, x1, y1); - immVertex2f(pos, x1, y1); - immVertex2f(pos, x2, y2); + immVertex2f(shdr_pos, x1, y1); + immVertex2f(shdr_pos, x2, y2); - immAttrib2f(line_origin, x2, y1); - immVertex2f(pos, x2, y1); - immVertex2f(pos, x1, y1 + ofs); + immVertex2f(shdr_pos, x2, y1); + immVertex2f(shdr_pos, x1, y1 + ofs); - immAttrib2f(line_origin, x1, y2); - immVertex2f(pos, x1, y2); - immVertex2f(pos, x2, y1 + (h - ofs)); + immVertex2f(shdr_pos, x1, y2); + immVertex2f(shdr_pos, x2, y1 + (h - ofs)); } immEnd(); @@ -538,9 +528,10 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) x2i = (int)(x2 + (1.0f - 0.0001f)); y2i = (int)(y2 + (1.0f - 0.0001f)); + uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); + /* First, solid lines. */ { - unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); /* passepartout, specified in camera edit buttons */ @@ -559,24 +550,24 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) immUniformColor4f(0.0f, 0.0f, 0.0f, alpha); if (x1i > 0.0f) - immRectf(pos, 0.0f, winy, x1i, 0.0f); + immRectf(shdr_pos, 0.0f, winy, x1i, 0.0f); if (x2i < winx) - immRectf(pos, x2i, winy, winx, 0.0f); + immRectf(shdr_pos, x2i, winy, winx, 0.0f); if (y2i < winy) - immRectf(pos, x1i, winy, x2i, y2i); + immRectf(shdr_pos, x1i, winy, x2i, y2i); if (y2i > 0.0f) - immRectf(pos, x1i, y1i, x2i, 0.0f); + immRectf(shdr_pos, x1i, y1i, x2i, 0.0f); glDisable(GL_BLEND); } immUniformThemeColor(TH_BACK); - imm_draw_line_box(pos, x1i, y1i, x2i, y2i); + imm_draw_line_box(shdr_pos, x1i, y1i, x2i, y2i); #ifdef VIEW3D_CAMERA_BORDER_HACK if (view3d_camera_border_hack_test == true) { immUniformColor3ubv(view3d_camera_border_hack_col); - imm_draw_line_box(pos, x1i + 1, y1i + 1, x2i - 1, y2i - 1); + imm_draw_line_box(shdr_pos, x1i + 1, y1i + 1, x2i - 1, y2i - 1); view3d_camera_border_hack_test = false; } #endif @@ -586,34 +577,24 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) /* And now, the dashed lines! */ { - VertexFormat *format = immVertexFormat(); - unsigned int pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT); - unsigned int line_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT); - float color1[4] = {1.0f, 1.0f, 1.0f, 1.0f}; - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR); float viewport_size[4]; glGetFloatv(GL_VIEWPORT, viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f); + immUniform1i("num_colors", 0); /* "simple" mode */ immUniform1f("dash_width", 6.0f); - immUniform1f("dash_width_on", 3.0f); + immUniform1f("dash_factor", 0.5f); /* outer line not to confuse with object selection */ if (v3d->flag2 & V3D_LOCK_CAMERA) { - UI_GetThemeColor4fv(TH_REDALERT, color1); - immUniform4fv("color1", color1); - imm_draw_line_box_dashed(pos, line_origin, x1i - 1, y1i - 1, x2i + 1, y2i + 1); + immUniformThemeColor(TH_REDALERT); + imm_draw_line_box(shdr_pos, x1i - 1, y1i - 1, x2i + 1, y2i + 1); } - UI_GetThemeColor4fv(TH_VIEW_OVERLAY, color1); - immUniform4fv("color1", color1); - imm_draw_line_box_dashed(pos, line_origin, x1i, y1i, x2i, y2i); + immUniformThemeColor(TH_VIEW_OVERLAY); + imm_draw_line_box(shdr_pos, x1i, y1i, x2i, y2i); /* border */ if (scene->r.mode & R_BORDER) { @@ -624,15 +605,13 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) x4 = floorf(x1 + (scene->r.border.xmax * (x2 - x1))) + (U.pixelsize - 1); y4 = floorf(y1 + (scene->r.border.ymax * (y2 - y1))) + (U.pixelsize - 1); - immUniform4f("color1", 1.0f, 0.25f, 0.25f, 1.0f); - imm_draw_line_box_dashed(pos, line_origin, x3, y3, x4, y4); + immUniformColor3f(1.0f, 0.25f, 0.25f); + imm_draw_line_box(shdr_pos, x3, y3, x4, y4); } /* safety border */ if (ca) { - UI_GetThemeColorBlend3f(TH_VIEW_OVERLAY, TH_BACK, 0.25f, color1); - color1[3] = 1.0f; - immUniform4fv("color1", color1); + immUniformThemeColorBlend(TH_VIEW_OVERLAY, TH_BACK, 0.25f); if (ca->dtx & CAM_DTX_CENTER) { float x3, y3; @@ -642,13 +621,11 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) immBegin(PRIM_LINES, 4); - immAttrib2f(line_origin, x1, y3); - immVertex2f(pos, x1, y3); - immVertex2f(pos, x2, y3); + immVertex2f(shdr_pos, x1, y3); + immVertex2f(shdr_pos, x2, y3); - immAttrib2f(line_origin, x3, y1); - immVertex2f(pos, x3, y1); - immVertex2f(pos, x3, y2); + immVertex2f(shdr_pos, x3, y1); + immVertex2f(shdr_pos, x3, y2); immEnd(); } @@ -656,52 +633,46 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) if (ca->dtx & CAM_DTX_CENTER_DIAG) { immBegin(PRIM_LINES, 4); - immAttrib2f(line_origin, x1, y1); - immVertex2f(pos, x1, y1); - immVertex2f(pos, x2, y2); + immVertex2f(shdr_pos, x1, y1); + immVertex2f(shdr_pos, x2, y2); - immAttrib2f(line_origin, x1, y2); - immVertex2f(pos, x1, y2); - immVertex2f(pos, x2, y1); + immVertex2f(shdr_pos, x1, y2); + immVertex2f(shdr_pos, x2, y1); immEnd(); } if (ca->dtx & CAM_DTX_THIRDS) { - drawviewborder_grid3(pos, line_origin, x1, x2, y1, y2, 1.0f / 3.0f); + drawviewborder_grid3(shdr_pos, x1, x2, y1, y2, 1.0f / 3.0f); } if (ca->dtx & CAM_DTX_GOLDEN) { - drawviewborder_grid3(pos, line_origin, x1, x2, y1, y2, 1.0f - (1.0f / 1.61803399f)); + drawviewborder_grid3(shdr_pos, x1, x2, y1, y2, 1.0f - (1.0f / 1.61803399f)); } if (ca->dtx & CAM_DTX_GOLDEN_TRI_A) { - drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 0, 'A'); + drawviewborder_triangle(shdr_pos, x1, x2, y1, y2, 0, 'A'); } if (ca->dtx & CAM_DTX_GOLDEN_TRI_B) { - drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 0, 'B'); + drawviewborder_triangle(shdr_pos, x1, x2, y1, y2, 0, 'B'); } if (ca->dtx & CAM_DTX_HARMONY_TRI_A) { - drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 1, 'A'); + drawviewborder_triangle(shdr_pos, x1, x2, y1, y2, 1, 'A'); } if (ca->dtx & CAM_DTX_HARMONY_TRI_B) { - drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 1, 'B'); + drawviewborder_triangle(shdr_pos, x1, x2, y1, y2, 1, 'B'); } if (ca->flag & CAM_SHOW_SAFE_MARGINS) { - UI_draw_safe_areas( - pos, line_origin, x1, x2, y1, y2, - scene->safe_areas.title, - scene->safe_areas.action); + UI_draw_safe_areas(shdr_pos, x1, x2, y1, y2, + scene->safe_areas.title, scene->safe_areas.action); if (ca->flag & CAM_SHOW_SAFE_CENTER) { - UI_draw_safe_areas( - pos, line_origin, x1, x2, y1, y2, - scene->safe_areas.title_center, - scene->safe_areas.action_center); + UI_draw_safe_areas(shdr_pos, x1, x2, y1, y2, + scene->safe_areas.title_center, scene->safe_areas.action_center); } } } @@ -738,18 +709,15 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) } /* draw */ - UI_GetThemeColorShade4fv(TH_VIEW_OVERLAY, 100, color1); - immUniform4fv("color1", color1); + immUniformThemeColorShade(TH_VIEW_OVERLAY, 100); /* TODO Was using UI_draw_roundbox_4fv(false, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 2.0f, color). * We'll probably need a new imm_draw_line_roundbox_dashed dor that - though in practice the * 2.0f round corner effect was nearly not visible anyway... */ - imm_draw_line_box_dashed(pos, line_origin, rect.xmin, rect.ymin, rect.xmax, rect.ymax); + imm_draw_line_box(shdr_pos, rect.xmin, rect.ymin, rect.xmax, rect.ymax); } immUnbindProgram(); - - glDisable(GL_BLEND); } /* camera name - draw in highlighted text color */ @@ -763,13 +731,9 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) static void drawrenderborder(ARegion *ar, View3D *v3d) { /* use the same program for everything */ - VertexFormat *format = immVertexFormat(); - unsigned int pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 2, KEEP_FLOAT); - unsigned int line_origin = VertexFormat_add_attrib(format, "line_origin", COMP_F32, 2, KEEP_FLOAT); + uint shdr_pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); glLineWidth(1.0f); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR); @@ -777,14 +741,14 @@ static void drawrenderborder(ARegion *ar, View3D *v3d) glGetFloatv(GL_VIEWPORT, viewport_size); immUniform2f("viewport_size", viewport_size[2], viewport_size[3]); - immUniform4f("color1", 1.0f, 0.25f, 0.25f, 1.0f); - immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f); + immUniform1i("num_colors", 0); /* "simple" mode */ + immUniform4f("color", 1.0f, 0.25f, 0.25f, 1.0f); immUniform1f("dash_width", 6.0f); - immUniform1f("dash_width_on", 3.0f); + immUniform1f("dash_factor", 0.5f); - imm_draw_line_box_dashed(pos, line_origin, - v3d->render_border.xmin * ar->winx, v3d->render_border.ymin * ar->winy, - v3d->render_border.xmax * ar->winx, v3d->render_border.ymax * ar->winy); + imm_draw_line_box(shdr_pos, + v3d->render_border.xmin * ar->winx, v3d->render_border.ymin * ar->winy, + v3d->render_border.xmax * ar->winx, v3d->render_border.ymax * ar->winy); immUnbindProgram(); } |