diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-04-26 13:17:46 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-04-26 13:17:46 +0300 |
commit | 8de3778d11bf60dcee7bd38de0f5f648f2be7333 (patch) | |
tree | cf3bc02250904237afcca0e4044184bca16dc24f /source/blender/editors/space_view3d/view3d_draw.c | |
parent | 88a7d3438dc61674e4fd95698a7feffd3c9c05bb (diff) |
Getting rid of setlinestyle: 3DView camera view.
Use new 2D dashed line shader in 3DView camera view.
Note that this also involved converting UI_draw_safe_areas() to this
dashed shader, which means it cannot be used anymore with other shaders.
Part of D2647.
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_draw.c')
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 277 |
1 files changed, 156 insertions, 121 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 5ef4909e857..6d8243ca4b3 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(unsigned pos, float x1, float x2, float y1, float y2, float fac) +static void drawviewborder_grid3(uint pos, uint line_origin, float x1, float x2, float y1, float y2, float fac) { float x3, y3, x4, y4; @@ -427,28 +427,36 @@ static void drawviewborder_grid3(unsigned pos, float x1, float x2, float y1, flo y4 = y1 + (1.0f - fac) * (y2 - y1); immBegin(PRIM_LINES, 8); + + immAttrib2f(line_origin, x1, y3); immVertex2f(pos, x1, y3); immVertex2f(pos, x2, y3); + immAttrib2f(line_origin, x1, y4); immVertex2f(pos, x1, y4); immVertex2f(pos, x2, y4); + immAttrib2f(line_origin, x3, y1); immVertex2f(pos, x3, y1); immVertex2f(pos, x3, y2); + immAttrib2f(line_origin, x4, y1); immVertex2f(pos, x4, y1); immVertex2f(pos, x4, y2); + immEnd(); } /* harmonious triangle */ -static void drawviewborder_triangle(unsigned pos, float x1, float x2, float y1, float y2, const char golden, const char dir) +static void drawviewborder_triangle( + uint pos, uint line_origin, float x1, float x2, float y1, float y2, const char golden, const char dir) { float ofs; float w = x2 - x1; float h = y2 - y1; immBegin(PRIM_LINES, 6); + if (w > h) { if (golden) { ofs = w * (1.0f - (1.0f / 1.61803399f)); @@ -458,12 +466,15 @@ static void drawviewborder_triangle(unsigned pos, float x1, float x2, float y1, } if (dir == 'B') SWAP(float, y1, y2); + immAttrib2f(line_origin, x1, y1); immVertex2f(pos, x1, y1); immVertex2f(pos, x2, y2); + immAttrib2f(line_origin, x2, y1); immVertex2f(pos, x2, y1); immVertex2f(pos, x1 + (w - ofs), y2); + immAttrib2f(line_origin, x1, y2); immVertex2f(pos, x1, y2); immVertex2f(pos, x1 + ofs, y1); } @@ -476,15 +487,19 @@ static void drawviewborder_triangle(unsigned pos, float x1, float x2, float y1, } if (dir == 'B') SWAP(float, x1, x2); + immAttrib2f(line_origin, x1, y1); immVertex2f(pos, x1, y1); immVertex2f(pos, x2, y2); + immAttrib2f(line_origin, x2, y1); immVertex2f(pos, x2, y1); immVertex2f(pos, x1, y1 + ofs); + immAttrib2f(line_origin, x1, y2); immVertex2f(pos, x1, y2); immVertex2f(pos, x2, y1 + (h - ofs)); } + immEnd(); } @@ -523,154 +538,170 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) x2i = (int)(x2 + (1.0f - 0.0001f)); y2i = (int)(y2 + (1.0f - 0.0001f)); - /* use the same program for everything */ - 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 */ - if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f) { - const float winx = (ar->winx + 1); - const float winy = (ar->winy + 1); + /* First, solid lines. */ + { + unsigned int pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 2, KEEP_FLOAT); + immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); - float alpha = 1.0f; + /* passepartout, specified in camera edit buttons */ + if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f) { + const float winx = (ar->winx + 1); + const float winy = (ar->winy + 1); - if (ca->passepartalpha != 1.0f) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - alpha = ca->passepartalpha; - } + float alpha = 1.0f; - immUniformColor4f(0.0f, 0.0f, 0.0f, alpha); + if (ca->passepartalpha != 1.0f) { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + alpha = ca->passepartalpha; + } - if (x1i > 0.0f) - immRectf(pos, 0.0f, winy, x1i, 0.0f); - if (x2i < winx) - immRectf(pos, x2i, winy, winx, 0.0f); - if (y2i < winy) - immRectf(pos, x1i, winy, x2i, y2i); - if (y2i > 0.0f) - immRectf(pos, x1i, y1i, x2i, 0.0f); + immUniformColor4f(0.0f, 0.0f, 0.0f, alpha); - glDisable(GL_BLEND); - } + if (x1i > 0.0f) + immRectf(pos, 0.0f, winy, x1i, 0.0f); + if (x2i < winx) + immRectf(pos, x2i, winy, winx, 0.0f); + if (y2i < winy) + immRectf(pos, x1i, winy, x2i, y2i); + if (y2i > 0.0f) + immRectf(pos, x1i, y1i, x2i, 0.0f); - setlinestyle(0); + glDisable(GL_BLEND); + } - immUniformThemeColor(TH_BACK); - imm_draw_line_box(pos, x1i, y1i, x2i, y2i); + immUniformThemeColor(TH_BACK); + imm_draw_line_box(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); - view3d_camera_border_hack_test = false; - } + 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); + view3d_camera_border_hack_test = false; + } #endif - setlinestyle(3); - - /* outer line not to confuse with object selecton */ - if (v3d->flag2 & V3D_LOCK_CAMERA) { - immUniformThemeColor(TH_REDALERT); - imm_draw_line_box(pos, x1i - 1, y1i - 1, x2i + 1, y2i + 1); + immUnbindProgram(); } - immUniformThemeColor(TH_VIEW_OVERLAY); - imm_draw_line_box(pos, x1i, y1i, x2i, y2i); - - /* border */ - if (scene->r.mode & R_BORDER) { - float x3, y3, x4, y4; + /* 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}; - x3 = floorf(x1 + (scene->r.border.xmin * (x2 - x1))) - 1; - y3 = floorf(y1 + (scene->r.border.ymin * (y2 - y1))) - 1; - x4 = floorf(x1 + (scene->r.border.xmax * (x2 - x1))) + (U.pixelsize - 1); - y4 = floorf(y1 + (scene->r.border.ymax * (y2 - y1))) + (U.pixelsize - 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); - imm_cpack(0x4040FF); - imm_draw_line_box(pos, x3, y3, x4, y4); - } - immUnbindProgram(); + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_COLOR); - /* safety border */ - if (ca) { - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); - if (ca->dtx & CAM_DTX_CENTER) { - float x3, y3; + immUniform1f("view_scale", 1.0f); + immUniform4f("color2", 0.0f, 0.0f, 0.0f, 0.0f); + immUniform1f("dash_width", 6.0f); + immUniform1f("dash_width_on", 3.0f); - x3 = x1 + 0.5f * (x2 - x1); - y3 = y1 + 0.5f * (y2 - y1); + /* 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); + } - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - immBegin(PRIM_LINES, 4); + UI_GetThemeColor4fv(TH_VIEW_OVERLAY, color1); + immUniform4fv("color1", color1); + imm_draw_line_box_dashed(pos, line_origin, x1i, y1i, x2i, y2i); - immVertex2f(pos, x1, y3); - immVertex2f(pos, x2, y3); + /* border */ + if (scene->r.mode & R_BORDER) { + float x3, y3, x4, y4; - immVertex2f(pos, x3, y1); - immVertex2f(pos, x3, y2); + x3 = floorf(x1 + (scene->r.border.xmin * (x2 - x1))) - 1; + y3 = floorf(y1 + (scene->r.border.ymin * (y2 - y1))) - 1; + x4 = floorf(x1 + (scene->r.border.xmax * (x2 - x1))) + (U.pixelsize - 1); + y4 = floorf(y1 + (scene->r.border.ymax * (y2 - y1))) + (U.pixelsize - 1); - immEnd(); + immUniform4f("color1", 0.25f, 0.25f, 1.0f, 1.0f); + imm_draw_line_box_dashed(pos, line_origin, x3, y3, x4, y4); } - if (ca->dtx & CAM_DTX_CENTER_DIAG) { + /* safety border */ + if (ca) { + UI_GetThemeColorBlend3f(TH_VIEW_OVERLAY, TH_BACK, 0.25f, color1); + color1[3] = 1.0f; + immUniform4fv("color1", color1); - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - immBegin(PRIM_LINES, 4); + if (ca->dtx & CAM_DTX_CENTER) { + float x3, y3; - immVertex2f(pos, x1, y1); - immVertex2f(pos, x2, y2); + x3 = x1 + 0.5f * (x2 - x1); + y3 = y1 + 0.5f * (y2 - y1); - immVertex2f(pos, x1, y2); - immVertex2f(pos, x2, y1); + immBegin(PRIM_LINES, 4); - immEnd(); - } + immAttrib2f(line_origin, x1, y3); + immVertex2f(pos, x1, y3); + immVertex2f(pos, x2, y3); - if (ca->dtx & CAM_DTX_THIRDS) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_grid3(pos, x1, x2, y1, y2, 1.0f / 3.0f); - } + immAttrib2f(line_origin, x3, y1); + immVertex2f(pos, x3, y1); + immVertex2f(pos, x3, y2); - if (ca->dtx & CAM_DTX_GOLDEN) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_grid3(pos, x1, x2, y1, y2, 1.0f - (1.0f / 1.61803399f)); - } + immEnd(); + } - if (ca->dtx & CAM_DTX_GOLDEN_TRI_A) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_triangle(pos, x1, x2, y1, y2, 0, 'A'); - } + if (ca->dtx & CAM_DTX_CENTER_DIAG) { + immBegin(PRIM_LINES, 4); - if (ca->dtx & CAM_DTX_GOLDEN_TRI_B) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_triangle(pos, x1, x2, y1, y2, 0, 'B'); - } + immAttrib2f(line_origin, x1, y1); + immVertex2f(pos, x1, y1); + immVertex2f(pos, x2, y2); - if (ca->dtx & CAM_DTX_HARMONY_TRI_A) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_triangle(pos, x1, x2, y1, y2, 1, 'A'); - } + immAttrib2f(line_origin, x1, y2); + immVertex2f(pos, x1, y2); + immVertex2f(pos, x2, y1); - if (ca->dtx & CAM_DTX_HARMONY_TRI_B) { - immUniformThemeColorBlendShade(TH_VIEW_OVERLAY, TH_BACK, 0.25f, 0); - drawviewborder_triangle(pos, x1, x2, y1, y2, 1, 'B'); - } + immEnd(); + } + + if (ca->dtx & CAM_DTX_THIRDS) { + drawviewborder_grid3(pos, line_origin, 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)); + } + + if (ca->dtx & CAM_DTX_GOLDEN_TRI_A) { + drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 0, 'A'); + } - if (ca->flag & CAM_SHOW_SAFE_MARGINS) { - UI_draw_safe_areas( - pos, x1, x2, y1, y2, - scene->safe_areas.title, - scene->safe_areas.action); + if (ca->dtx & CAM_DTX_GOLDEN_TRI_B) { + drawviewborder_triangle(pos, line_origin, 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'); + } + + if (ca->dtx & CAM_DTX_HARMONY_TRI_B) { + drawviewborder_triangle(pos, line_origin, x1, x2, y1, y2, 1, 'B'); + } - if (ca->flag & CAM_SHOW_SAFE_CENTER) { + if (ca->flag & CAM_SHOW_SAFE_MARGINS) { UI_draw_safe_areas( - pos, x1, x2, y1, y2, - scene->safe_areas.title_center, - scene->safe_areas.action_center); + pos, line_origin, 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); + } } } - immUnbindProgram(); if (ca->flag & CAM_SHOWSENSOR) { /* determine sensor fit, and get sensor x/y, for auto fit we @@ -704,22 +735,26 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d) } /* draw */ - float color[4]; - UI_GetThemeColorShade4fv(TH_VIEW_OVERLAY, 100, color); - UI_draw_roundbox_4fv(false, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 2.0f, color); + UI_GetThemeColorShade4fv(TH_VIEW_OVERLAY, 100, color1); + immUniform4fv("color1", color1); + + /* 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); } - } - setlinestyle(0); + immUnbindProgram(); + + glDisable(GL_BLEND); + } /* camera name - draw in highlighted text color */ if (ca && (ca->flag & CAM_SHOWNAME)) { UI_FontThemeColor(BLF_default(), TH_TEXT_HI); - BLF_draw_default( - x1i, y1i - (0.7f * U.widget_unit), 0.0f, - v3d->camera->id.name + 2, sizeof(v3d->camera->id.name) - 2); + BLF_draw_default(x1i, y1i - (0.7f * U.widget_unit), 0.0f, + v3d->camera->id.name + 2, sizeof(v3d->camera->id.name) - 2); } - } static void drawrenderborder(ARegion *ar, View3D *v3d) |