diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-09-13 10:07:15 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-09-13 11:06:26 +0300 |
commit | a5c9f15a0e4a5f5a7ea8370828815d2f37ae036a (patch) | |
tree | 1e21e9513eab8d83dedab044a07e02d79d8312d0 /source | |
parent | 0bf8d16d1cdb2f020c74d62c6f16ac818d092688 (diff) |
Manipulator: use solid regions for select drawing
Needed for 3D view selection
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c | 188 |
1 files changed, 138 insertions, 50 deletions
diff --git a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c index 0ca250b5f91..3d7195e016b 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c @@ -102,7 +102,7 @@ static void manipulator_calc_rect_view_margin( { float handle_size; if (mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) { - handle_size = 0.1f; + handle_size = 0.15f; } else { handle_size = MANIPULATOR_RESIZER_SIZE; @@ -172,7 +172,7 @@ static void rect_transform_draw_corners( static void rect_transform_draw_interaction( const float color[4], const int highlighted, const float size[2], const float margin[2], - const float line_width) + const float line_width, const bool is_solid) { /* 4 verts for translate, otherwise only 3 are used. */ float verts[4][2]; @@ -180,55 +180,133 @@ static void rect_transform_draw_interaction( switch (highlighted) { case ED_MANIPULATOR_CAGE2D_PART_SCALE_MIN_X: - ARRAY_SET_ITEMS(verts[0], -size[0] + margin[0], -size[1]); - ARRAY_SET_ITEMS(verts[1], -size[0], -size[1]); - ARRAY_SET_ITEMS(verts[2], -size[0], size[1]); - verts_len = 3; + { + rctf r = { + .xmin = -size[0], .xmax = -size[0] + margin[0], + .ymin = -size[1] + margin[1], .ymax = size[1] - margin[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmin, r.ymin); + ARRAY_SET_ITEMS(verts[1], r.xmin, r.ymax); + verts_len = 2; + if (is_solid) { + ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymax); + ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymin); + verts_len += 2; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MAX_X: - ARRAY_SET_ITEMS(verts[0], size[0] - margin[0], -size[1]); - ARRAY_SET_ITEMS(verts[1], size[0], -size[1]); - ARRAY_SET_ITEMS(verts[2], size[0], size[1]); - verts_len = 3; + { + rctf r = { + .xmin = size[0] - margin[0], .xmax = size[0], + .ymin = -size[1] + margin[1], .ymax = size[1] - margin[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmax, r.ymin); + ARRAY_SET_ITEMS(verts[1], r.xmax, r.ymax); + verts_len = 2; + if (is_solid) { + ARRAY_SET_ITEMS(verts[2], r.xmin, r.ymax); + ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin); + verts_len += 2; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MIN_Y: - ARRAY_SET_ITEMS(verts[0], -size[0], -size[1] + margin[1]); - ARRAY_SET_ITEMS(verts[1], -size[0], -size[1]); - ARRAY_SET_ITEMS(verts[2], size[0], -size[1]); - verts_len = 3; + { + rctf r = { + .xmin = -size[0] + margin[0], .xmax = size[0] - margin[0], + .ymin = -size[1], .ymax = -size[1] + margin[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmin, r.ymin); + ARRAY_SET_ITEMS(verts[1], r.xmax, r.ymin); + verts_len = 2; + if (is_solid) { + ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymax); + ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymax); + verts_len += 2; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MAX_Y: - ARRAY_SET_ITEMS(verts[0], -size[0], size[1] - margin[1]); - ARRAY_SET_ITEMS(verts[1], -size[0], size[1]); - ARRAY_SET_ITEMS(verts[2], size[0], size[1]); - verts_len = 3; + { + rctf r = { + .xmin = -size[0] + margin[0], .xmax = size[0] - margin[0], + .ymin = size[1] - margin[1], .ymax = size[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmin, r.ymax); + ARRAY_SET_ITEMS(verts[1], r.xmax, r.ymax); + verts_len = 2; + if (is_solid) { + ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymin); + ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin); + verts_len += 2; + } break; - + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MIN_X_MIN_Y: - ARRAY_SET_ITEMS(verts[0], -size[0] + margin[0], -size[1]); - ARRAY_SET_ITEMS(verts[1], -size[0] + margin[0], -size[1] + margin[1]); - ARRAY_SET_ITEMS(verts[2], -size[0], -size[1] + margin[1]); + { + rctf r = { + .xmin = -size[0], .xmax = -size[0] + margin[0], + .ymin = -size[1], .ymax = -size[1] + margin[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmax, r.ymin); + ARRAY_SET_ITEMS(verts[1], r.xmax, r.ymax); + ARRAY_SET_ITEMS(verts[2], r.xmin, r.ymax); verts_len = 3; + if (is_solid) { + ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymin); + verts_len += 1; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MIN_X_MAX_Y: - ARRAY_SET_ITEMS(verts[0], -size[0] + margin[0], size[1]); - ARRAY_SET_ITEMS(verts[1], -size[0] + margin[0], size[1] - margin[1]); - ARRAY_SET_ITEMS(verts[2], -size[0], size[1] - margin[1]); + { + rctf r = { + .xmin = -size[0], .xmax = -size[0] + margin[0], + .ymin = size[1] - margin[1], .ymax = size[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmax, r.ymax); + ARRAY_SET_ITEMS(verts[1], r.xmax, r.ymin); + ARRAY_SET_ITEMS(verts[2], r.xmin, r.ymin); verts_len = 3; + if (is_solid) { + ARRAY_SET_ITEMS(verts[3], r.xmin, r.ymax); + verts_len += 1; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MAX_X_MIN_Y: - ARRAY_SET_ITEMS(verts[0], size[0] - margin[0], -size[1]); - ARRAY_SET_ITEMS(verts[1], size[0] - margin[0], -size[1] + margin[1]); - ARRAY_SET_ITEMS(verts[2], size[0], -size[1] + margin[1]); + { + rctf r = { + .xmin = size[0] - margin[0], .xmax = size[0], + .ymin = -size[1], .ymax = -size[1] + margin[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmin, r.ymin); + ARRAY_SET_ITEMS(verts[1], r.xmin, r.ymax); + ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymax); verts_len = 3; + if (is_solid) { + ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymin); + verts_len += 1; + } break; + } case ED_MANIPULATOR_CAGE2D_PART_SCALE_MAX_X_MAX_Y: - ARRAY_SET_ITEMS(verts[0], size[0] - margin[0], size[1]); - ARRAY_SET_ITEMS(verts[1], size[0] - margin[0], size[1] - margin[1]); - ARRAY_SET_ITEMS(verts[2], size[0], size[1] - margin[1]); + { + rctf r = { + .xmin = size[0] - margin[0], .xmax = size[0], + .ymin = size[1] - margin[1], .ymax = size[1], + }; + ARRAY_SET_ITEMS(verts[0], r.xmin, r.ymax); + ARRAY_SET_ITEMS(verts[1], r.xmin, r.ymin); + ARRAY_SET_ITEMS(verts[2], r.xmax, r.ymin); verts_len = 3; + if (is_solid) { + ARRAY_SET_ITEMS(verts[3], r.xmax, r.ymax); + verts_len += 1; + } break; - + } case ED_MANIPULATOR_CAGE2D_PART_ROTATE: { const float rotate_pt[2] = {0.0f, size[1] + margin[1]}; @@ -277,23 +355,33 @@ static void rect_transform_draw_interaction( immEnd(); } else { - glLineWidth(line_width + 3.0f); - - immBegin(GWN_PRIM_LINE_STRIP, verts_len); - immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f); - for (uint i = 0; i < verts_len; i++) { - immVertex2fv(attr_id.pos, verts[i]); + if (is_solid) { + immBegin(GWN_PRIM_TRI_FAN, verts_len); + immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f); + for (uint i = 0; i < verts_len; i++) { + immVertex2fv(attr_id.pos, verts[i]); + } + immEnd(); } - immEnd(); + else { + glLineWidth(line_width + 3.0f); - glLineWidth(line_width); + immBegin(GWN_PRIM_LINE_STRIP, verts_len); + immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f); + for (uint i = 0; i < verts_len; i++) { + immVertex2fv(attr_id.pos, verts[i]); + } + immEnd(); - immBegin(GWN_PRIM_LINE_STRIP, verts_len); - immAttrib3fv(attr_id.col, color); - for (uint i = 0; i < verts_len; i++) { - immVertex2fv(attr_id.pos, verts[i]); + glLineWidth(line_width); + + immBegin(GWN_PRIM_LINE_STRIP, verts_len); + immAttrib3fv(attr_id.col, color); + for (uint i = 0; i < verts_len; i++) { + immVertex2fv(attr_id.pos, verts[i]); + } + immEnd(); } - immEnd(); } immUnbindProgram(); @@ -367,27 +455,27 @@ static void manipulator_rect_transform_draw_intern( }; for (int i = 0; i < ARRAY_SIZE(scale_parts); i++) { GPU_select_load_id(select_id | scale_parts[i]); - rect_transform_draw_interaction(mpr->color, scale_parts[i], size, margin, mpr->line_width); + rect_transform_draw_interaction(mpr->color, scale_parts[i], size, margin, mpr->line_width, true); } } if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_TRANSLATE) { const int transform_part = ED_MANIPULATOR_CAGE2D_PART_TRANSLATE; GPU_select_load_id(select_id | transform_part); - rect_transform_draw_interaction(mpr->color, transform_part, size, margin, mpr->line_width); + rect_transform_draw_interaction(mpr->color, transform_part, size, margin, mpr->line_width, true); } if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE) { rect_transform_draw_interaction( - mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width); + mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, true); } } else { /* Don't draw translate (only for selection). */ if (mpr->highlight_part != ED_MANIPULATOR_CAGE2D_PART_TRANSLATE) { - rect_transform_draw_interaction(mpr->color, mpr->highlight_part, size, margin, mpr->line_width); + rect_transform_draw_interaction(mpr->color, mpr->highlight_part, size, margin, mpr->line_width, false); } if (transform_flag & ED_MANIPULATOR_CAGE2D_XFORM_FLAG_ROTATE) { rect_transform_draw_interaction( - mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width); + mpr->color, ED_MANIPULATOR_CAGE2D_PART_ROTATE, size, margin, mpr->line_width, false); } } |