diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-11-20 07:29:08 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-11-20 08:26:46 +0300 |
commit | 82eecc6c0022426f8354ad38e1e42ad03e5004db (patch) | |
tree | 75e956a6463a490a9a785003948df0bbd76ac89a /source/blender/editors/transform | |
parent | 15db2acd9fe1d64eb91d470813070df27cfc5698 (diff) |
Multi-Objects: Calc origin w/ all edit-objects
D3924 by @Leon95 w/ code de-duplication.
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r-- | source/blender/editors/transform/transform_gizmo_3d.c | 257 |
1 files changed, 147 insertions, 110 deletions
diff --git a/source/blender/editors/transform/transform_gizmo_3d.c b/source/blender/editors/transform/transform_gizmo_3d.c index bf5500903a2..97f4018731b 100644 --- a/source/blender/editors/transform/transform_gizmo_3d.c +++ b/source/blender/editors/transform/transform_gizmo_3d.c @@ -461,6 +461,18 @@ static void calc_tw_center(struct TransformBounds *tbounds, const float co[3]) } } +static void calc_tw_center_with_matrix( + struct TransformBounds *tbounds, const float co[3], + const bool use_matrix, const float matrix[4][4]) +{ + float co_world[3]; + if (use_matrix) { + mul_v3_m4v3(co_world, matrix, co); + co = co_world; + } + calc_tw_center(tbounds, co); +} + static void protectflag_to_drawflags(short protectflag, short *drawflags) { if (protectflag & OB_LOCK_LOCX) @@ -761,10 +773,9 @@ int ED_transform_calc_gizmo_stats( if (is_gp_edit) { float diff_mat[4][4]; - float fpt[3]; - for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { /* only editable and visible layers are considered */ + const bool use_mat_local = gpl->parent != NULL; if (gpencil_layer_is_editable(gpl) && (gpl->actframe != NULL)) { /* calculate difference matrix */ @@ -784,15 +795,8 @@ int ED_transform_calc_gizmo_stats( /* Change selection status of all points, then make the stroke match */ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { if (pt->flag & GP_SPOINT_SELECT) { - if (gpl->parent == NULL) { - calc_tw_center(tbounds, &pt->x); - totsel++; - } - else { - mul_v3_m4v3(fpt, diff_mat, &pt->x); - calc_tw_center(tbounds, fpt); - totsel++; - } + calc_tw_center_with_matrix(tbounds, &pt->x, use_mat_local, diff_mat); + totsel++; } } } @@ -807,6 +811,21 @@ int ED_transform_calc_gizmo_stats( } } else if (obedit) { + +#define FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) \ + { \ + invert_m4_m4(obedit->imat, obedit->obmat); \ + uint objects_len = 0; \ + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(view_layer, &objects_len); \ + for (uint ob_index = 0; ob_index < objects_len; ob_index++) { \ + Object *ob_iter = objects[ob_index]; \ + const bool use_mat_local = (ob_iter != obedit); + +#define FOREACH_EDIT_OBJECT_END() \ + } \ + MEM_freeN(objects); \ + } ((void)0) + ob = obedit; if (obedit->type == OB_MESH) { BMEditMesh *em = BKE_editmesh_from_object(obedit); @@ -820,14 +839,7 @@ int ED_transform_calc_gizmo_stats( totsel = 1; } else { - uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(view_layer, &objects_len); - - float mat_local[4][4]; - invert_m4_m4(obedit->imat, obedit->obmat); - - for (uint ob_index = 0; ob_index < objects_len; ob_index++) { - Object *ob_iter = objects[ob_index]; + FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) { BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter); BMesh *bm = em_iter->bm; @@ -838,7 +850,7 @@ int ED_transform_calc_gizmo_stats( BMVert *eve; BMIter iter; - const bool use_mat_local = (ob_iter != obedit); + float mat_local[4][4]; if (use_mat_local) { mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat); } @@ -846,20 +858,12 @@ int ED_transform_calc_gizmo_stats( BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { - float co[3]; - if (use_mat_local) { - mul_v3_m4v3(co, mat_local, eve->co); - } - else { - copy_v3_v3(co, eve->co); - } - calc_tw_center(tbounds, co); + calc_tw_center_with_matrix(tbounds, eve->co, use_mat_local, mat_local); totsel++; } } } - } - MEM_freeN(objects); + } FOREACH_EDIT_OBJECT_END(); } } /* end editmesh */ else if (obedit->type == OB_ARMATURE) { @@ -881,28 +885,35 @@ int ED_transform_calc_gizmo_stats( protectflag_to_drawflags_ebone(rv3d, ebo); } else { - /* TODO: multi-object support. */ - for (ebo = arm->edbo->first; ebo; ebo = ebo->next) { - if (EBONE_VISIBLE(arm, ebo)) { - if (ebo->flag & BONE_TIPSEL) { - calc_tw_center(tbounds, ebo->tail); - totsel++; - } - if ((ebo->flag & BONE_ROOTSEL) && - /* don't include same point multiple times */ - ((ebo->flag & BONE_CONNECTED) && - (ebo->parent != NULL) && - (ebo->parent->flag & BONE_TIPSEL) && - EBONE_VISIBLE(arm, ebo->parent)) == 0) - { - calc_tw_center(tbounds, ebo->head); - totsel++; - } - if (ebo->flag & BONE_SELECTED) { - protectflag_to_drawflags_ebone(rv3d, ebo); + FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) { + arm = ob_iter->data; + + float mat_local[4][4]; + if (use_mat_local) { + mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat); + } + for (ebo = arm->edbo->first; ebo; ebo = ebo->next) { + if (EBONE_VISIBLE(arm, ebo)) { + if (ebo->flag & BONE_TIPSEL) { + calc_tw_center_with_matrix(tbounds, ebo->tail, use_mat_local, mat_local); + totsel++; + } + if ((ebo->flag & BONE_ROOTSEL) && + /* don't include same point multiple times */ + ((ebo->flag & BONE_CONNECTED) && + (ebo->parent != NULL) && + (ebo->parent->flag & BONE_TIPSEL) && + EBONE_VISIBLE(arm, ebo->parent)) == 0) + { + calc_tw_center_with_matrix(tbounds, ebo->head, use_mat_local, mat_local); + totsel++; + } + if (ebo->flag & BONE_SELECTED) { + protectflag_to_drawflags_ebone(rv3d, ebo); + } } } - } + } FOREACH_EDIT_OBJECT_END(); } } else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) { @@ -914,60 +925,67 @@ int ED_transform_calc_gizmo_stats( totsel++; } else { - /* TODO: multi-object support. */ - Nurb *nu; - BezTriple *bezt; - BPoint *bp; - ListBase *nurbs = BKE_curve_editNurbs_get(cu); - - nu = nurbs->first; - while (nu) { - if (nu->type == CU_BEZIER) { - bezt = nu->bezt; - a = nu->pntsu; - while (a--) { - /* exceptions - * if handles are hidden then only check the center points. - * If the center knot is selected then only use this as the center point. - */ - if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) { - if (bezt->f2 & SELECT) { - calc_tw_center(tbounds, bezt->vec[1]); - totsel++; + FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) { + cu = ob_iter->data; + Nurb *nu; + BezTriple *bezt; + BPoint *bp; + ListBase *nurbs = BKE_curve_editNurbs_get(cu); + + float mat_local[4][4]; + if (use_mat_local) { + mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat); + } + + nu = nurbs->first; + while (nu) { + if (nu->type == CU_BEZIER) { + bezt = nu->bezt; + a = nu->pntsu; + while (a--) { + /* exceptions + * if handles are hidden then only check the center points. + * If the center knot is selected then only use this as the center point. + */ + if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) { + if (bezt->f2 & SELECT) { + calc_tw_center_with_matrix(tbounds, bezt->vec[1], use_mat_local, mat_local); + totsel++; + } } - } - else if (bezt->f2 & SELECT) { - calc_tw_center(tbounds, bezt->vec[1]); - totsel++; - } - else { - if (bezt->f1 & SELECT) { - calc_tw_center( - tbounds, bezt->vec[(pivot_point == V3D_AROUND_LOCAL_ORIGINS) ? 1 : 0]); + else if (bezt->f2 & SELECT) { + calc_tw_center_with_matrix(tbounds, bezt->vec[1], use_mat_local, mat_local); totsel++; } - if (bezt->f3 & SELECT) { - calc_tw_center( - tbounds, bezt->vec[(pivot_point == V3D_AROUND_LOCAL_ORIGINS) ? 1 : 2]); - totsel++; + else { + if (bezt->f1 & SELECT) { + const float *co = bezt->vec[(pivot_point == V3D_AROUND_LOCAL_ORIGINS) ? 1 : 0]; + calc_tw_center_with_matrix(tbounds, co, use_mat_local, mat_local); + totsel++; + } + if (bezt->f3 & SELECT) { + const float *co = bezt->vec[(pivot_point == V3D_AROUND_LOCAL_ORIGINS) ? 1 : 2]; + calc_tw_center_with_matrix(tbounds, co, use_mat_local, mat_local); + totsel++; + } } + bezt++; } - bezt++; } - } - else { - bp = nu->bp; - a = nu->pntsu * nu->pntsv; - while (a--) { - if (bp->f1 & SELECT) { - calc_tw_center(tbounds, bp->vec); - totsel++; + else { + bp = nu->bp; + a = nu->pntsu * nu->pntsv; + while (a--) { + if (bp->f1 & SELECT) { + calc_tw_center_with_matrix(tbounds, bp->vec, use_mat_local, mat_local); + totsel++; + } + bp++; } - bp++; } + nu = nu->next; } - nu = nu->next; - } + } FOREACH_EDIT_OBJECT_END(); } } else if (obedit->type == OB_MBALL) { @@ -979,13 +997,21 @@ int ED_transform_calc_gizmo_stats( totsel++; } else { - /* TODO: multi-object support. */ - for (ml = mb->editelems->first; ml; ml = ml->next) { - if (ml->flag & SELECT) { - calc_tw_center(tbounds, &ml->x); - totsel++; + FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) { + mb = (MetaBall *)ob_iter->data; + + float mat_local[4][4]; + if (use_mat_local) { + mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat); } - } + + for (ml = mb->editelems->first; ml; ml = ml->next) { + if (ml->flag & SELECT) { + calc_tw_center_with_matrix(tbounds, &ml->x, use_mat_local, mat_local); + totsel++; + } + } + } FOREACH_EDIT_OBJECT_END(); } } else if (obedit->type == OB_LATTICE) { @@ -997,19 +1023,30 @@ int ED_transform_calc_gizmo_stats( totsel++; } else { - /* TODO: multi-object support. */ - bp = lt->def; - a = lt->pntsu * lt->pntsv * lt->pntsw; - while (a--) { - if (bp->f1 & SELECT) { - calc_tw_center(tbounds, bp->vec); - totsel++; + FOREACH_EDIT_OBJECT_BEGIN(ob_iter, use_mat_local) { + lt = ((Lattice *)ob_iter->data)->editlatt->latt; + bp = lt->def; + a = lt->pntsu * lt->pntsv * lt->pntsw; + + float mat_local[4][4]; + if (use_mat_local) { + mul_m4_m4m4(mat_local, obedit->imat, ob_iter->obmat); } - bp++; - } + + while (a--) { + if (bp->f1 & SELECT) { + calc_tw_center_with_matrix(tbounds, bp->vec, use_mat_local, mat_local); + totsel++; + } + bp++; + } + } FOREACH_EDIT_OBJECT_END(); } } +#undef FOREACH_EDIT_OBJECT_BEGIN +#undef FOREACH_EDIT_OBJECT_END + /* selection center */ if (totsel) { mul_v3_fl(tbounds->center, 1.0f / (float)totsel); // centroid! |