[Bf-blender-cvs] [562cf573d3f] blender2.8: Multi-Object-Mode: EditMesh UV snap to cursor

Campbell Barton noreply at git.blender.org
Fri May 25 17:29:50 CEST 2018


Commit: 562cf573d3f695bd92c8441b06df20ecf4b89358
Author: Campbell Barton
Date:   Fri May 25 17:28:37 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB562cf573d3f695bd92c8441b06df20ecf4b89358

Multi-Object-Mode: EditMesh UV snap to cursor

D3422 by @Al

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

M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/uvedit/uvedit_ops.c

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

diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index d6e8b6e9504..4d5e4585221 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -54,6 +54,11 @@ bool ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obe
 bool ED_uvedit_center(Scene *scene, Image *ima, struct Object *obedit, float cent[2], char mode);
 void ED_uvedit_select_all(struct BMesh *bm);
 
+bool ED_uvedit_minmax_multi(
+        struct Scene *scene, struct Image *ima, struct Object **objects_edit, uint objects_len, float r_min[2], float r_max[2]);
+bool ED_uvedit_center_multi(
+        Scene *scene, Image *ima, struct Object **objects_edit, uint objects_len, float r_cent[2], char mode);
+
 bool ED_object_get_active_image(
         struct Object *ob, int mat_nr,
         struct Image **r_ima, struct ImageUser **r_iuser, struct bNode **r_node, struct bNodeTree **r_ntree);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index f07c32370fd..fceb1532077 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -567,35 +567,45 @@ void uv_poly_copy_aspect(float uv_orig[][2], float uv[][2], float aspx, float as
 	}
 }
 
-bool ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float r_min[2], float r_max[2])
+bool ED_uvedit_minmax_multi(
+        Scene *scene, Image *ima, Object **objects_edit, uint objects_len,
+        float r_min[2], float r_max[2])
 {
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
-	BMFace *efa;
-	BMLoop *l;
-	BMIter iter, liter;
-	MLoopUV *luv;
 	bool changed = false;
+	INIT_MINMAX2(r_min, r_max);
 
-	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *obedit = objects_edit[ob_index];
 
-	INIT_MINMAX2(r_min, r_max);
+		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+		BMFace *efa;
+		BMLoop *l;
+		BMIter iter, liter;
+		MLoopUV *luv;
 
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		if (!uvedit_face_visible_test(scene, obedit, ima, efa))
-			continue;
-		
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
-				luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-				minmax_v2v2_v2(r_min, r_max, luv->uv);
-				changed = true;
+		const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+				continue;
+
+			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+				if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+					luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+					minmax_v2v2_v2(r_min, r_max, luv->uv);
+					changed = true;
+				}
 			}
 		}
 	}
-
 	return changed;
 }
 
+bool ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float r_min[2], float r_max[2])
+{
+	return ED_uvedit_minmax_multi(scene, ima, &obedit, 1, r_min, r_max);
+}
+
 /* Be careful when using this, it bypasses all synchronization options */
 void ED_uvedit_select_all(BMesh *bm)
 {
@@ -614,27 +624,32 @@ void ED_uvedit_select_all(BMesh *bm)
 	}
 }
 
-static bool ED_uvedit_median(Scene *scene, Image *ima, Object *obedit, float co[2])
+static bool ED_uvedit_median_multi(Scene *scene, Image *ima, Object **objects_edit, uint objects_len, float co[2])
 {
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
-	BMFace *efa;
-	BMLoop *l;
-	BMIter iter, liter;
-	MLoopUV *luv;
 	unsigned int sel = 0;
+	zero_v2(co);
 
-	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *obedit = objects_edit[ob_index];
 
-	zero_v2(co);
-	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
-		if (!uvedit_face_visible_test(scene, obedit, ima, efa))
-			continue;
-		
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-			if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
-				add_v2_v2(co, luv->uv);
-				sel++;
+		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+		BMFace *efa;
+		BMLoop *l;
+		BMIter iter, liter;
+		MLoopUV *luv;
+
+		const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
+		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+			if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+				continue;
+
+			BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+				luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+				if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+					add_v2_v2(co, luv->uv);
+					sel++;
+				}
 			}
 		}
 	}
@@ -644,19 +659,24 @@ static bool ED_uvedit_median(Scene *scene, Image *ima, Object *obedit, float co[
 	return (sel != 0);
 }
 
-bool ED_uvedit_center(Scene *scene, Image *ima, Object *obedit, float cent[2], char mode)
+static bool UNUSED_FUNCTION(ED_uvedit_median)(Scene *scene, Image *ima, Object *obedit, float co[2])
+{
+	return ED_uvedit_median_multi(scene, ima, &obedit, 1, co);
+}
+
+bool ED_uvedit_center_multi(Scene *scene, Image *ima, Object **objects_edit, uint objects_len, float cent[2], char mode)
 {
 	bool changed = false;
 	
 	if (mode == V3D_AROUND_CENTER_BOUNDS) {  /* bounding box */
 		float min[2], max[2];
-		if (ED_uvedit_minmax(scene, ima, obedit, min, max)) {
+		if (ED_uvedit_minmax_multi(scene, ima, objects_edit, objects_len, min, max)) {
 			mid_v2_v2v2(cent, min, max);
 			changed = true;
 		}
 	}
 	else {
-		if (ED_uvedit_median(scene, ima, obedit, cent)) {
+		if (ED_uvedit_median_multi(scene, ima, objects_edit, objects_len, cent)) {
 			changed = true;
 		}
 	}
@@ -664,6 +684,11 @@ bool ED_uvedit_center(Scene *scene, Image *ima, Object *obedit, float cent[2], c
 	return changed;
 }
 
+bool ED_uvedit_center(Scene *scene, Image *ima, Object *obedit, float cent[2], char mode)
+{
+	return ED_uvedit_center_multi(scene, ima, &obedit, 1, cent, mode);
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -3357,17 +3382,16 @@ static void uv_snap_cursor_to_pixels(SpaceImage *sima)
 	uv_snap_to_pixel(sima->cursor, width, height);
 }
 
-static bool uv_snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, SpaceImage *sima)
+static bool uv_snap_cursor_to_selection(
+        Scene *scene, Image *ima, Object **objects_edit, uint objects_len, SpaceImage *sima)
 {
-	return ED_uvedit_center(scene, ima, obedit, sima->cursor, sima->around);
+	return ED_uvedit_center_multi(scene, ima, objects_edit, objects_len, sima->cursor, sima->around);
 }
 
 static int uv_snap_cursor_exec(bContext *C, wmOperator *op)
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
-	Scene *scene = CTX_data_scene(C);
-	Object *obedit = CTX_data_edit_object(C);
-	Image *ima = CTX_data_edit_image(C);
+
 	bool changed = false;
 
 	switch (RNA_enum_get(op->ptr, "target")) {
@@ -3376,8 +3400,18 @@ static int uv_snap_cursor_exec(bContext *C, wmOperator *op)
 			changed = true;
 			break;
 		case 1:
-			changed = uv_snap_cursor_to_selection(scene, ima, obedit, sima);
+		{
+			Scene *scene = CTX_data_scene(C);
+			Image *ima = CTX_data_edit_image(C);
+			ViewLayer *view_layer = CTX_data_view_layer(C);
+
+			uint objects_len = 0;
+			Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(
+			        view_layer, &objects_len);
+			changed = uv_snap_cursor_to_selection(scene, ima, objects, objects_len, sima);
+			MEM_freeN(objects);
 			break;
+		}
 	}
 
 	if (!changed)



More information about the Bf-blender-cvs mailing list