[Bf-blender-cvs] [82eecc6c002] blender2.8: Multi-Objects: Calc origin w/ all edit-objects

Campbell Barton noreply at git.blender.org
Tue Nov 20 06:28:06 CET 2018


Commit: 82eecc6c0022426f8354ad38e1e42ad03e5004db
Author: Campbell Barton
Date:   Tue Nov 20 15:29:08 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB82eecc6c0022426f8354ad38e1e42ad03e5004db

Multi-Objects: Calc origin w/ all edit-objects

D3924 by @Leon95 w/ code de-duplication.

===================================================================

M	source/blender/editors/transform/transform_gizmo_3d.c

===================================================================

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++

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list