[Bf-blender-cvs] [1f94830d6e4] temp-object-multi-mode: Move to using arrays of objects/bases

Campbell Barton noreply at git.blender.org
Tue Mar 13 13:45:54 CET 2018


Commit: 1f94830d6e4d23b19f5cb981de1e883b0d8a04c0
Author: Campbell Barton
Date:   Tue Mar 13 23:51:57 2018 +1100
Branches: temp-object-multi-mode
https://developer.blender.org/rB1f94830d6e4d23b19f5cb981de1e883b0d8a04c0

Move to using arrays of objects/bases

This avoids stepping over the same obdata multiple times for linked
duplicates.

Also support select-linked for UV editmode.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/editmesh.c
M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/editors/uvedit/uvedit_intern.h
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 2091da79dbb..cdc71963993 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -346,7 +346,6 @@ struct ObjectsRenderableIteratorData {
 	ITER_END;                                                                 \
 } ((void)0)
 
-
 /* Array utilities. */
 
 struct ObjectsInModeParams {
@@ -367,6 +366,10 @@ struct Object **BKE_view_layer_array_from_objects_in_mode_params(
 	        view_layer, r_len, \
 	        &(const struct ObjectsInModeParams){__VA_ARGS__})
 
+#define BKE_view_layer_array_from_bases_in_edit_mode(view_layer, r_len, ...) \
+	BKE_view_layer_array_from_bases_in_mode_params( \
+	        view_layer, r_len, \
+	        &(const struct ObjectsInModeParams){ .object_mode = OB_MODE_EDIT, __VA_ARGS__})
 
 #define BKE_view_layer_array_from_objects_in_edit_mode(view_layer, r_len, ...) \
 	BKE_view_layer_array_from_objects_in_mode_params( \
diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c
index c95da3b2569..ab542d9aab0 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -89,15 +89,16 @@ BMEditMesh *BKE_editmesh_from_object(Object *ob)
 {
 	BLI_assert(ob->type == OB_MESH);
 	/* sanity check */
+#if 0 /* disable in mutlti-object edit. */
 #ifndef NDEBUG
 	if (((Mesh *)ob->data)->edit_btmesh) {
 		BLI_assert(((Mesh *)ob->data)->edit_btmesh->ob == ob);
 	}
+#endif
 #endif
 	return ((Mesh *)ob->data)->edit_btmesh;
 }
 
-
 static void editmesh_tessface_calc_intern(BMEditMesh *em)
 {
 	/* allocating space before calculating the tessellation */
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 7a01b8712dc..1a541a428cd 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -341,8 +341,8 @@ struct MDeformVert *ED_mesh_active_dvert_get_em(struct Object *ob, struct BMVert
 struct MDeformVert *ED_mesh_active_dvert_get_ob(struct Object *ob, int *r_index);
 struct MDeformVert *ED_mesh_active_dvert_get_only(struct Object *ob);
 
-void EDBM_mesh_stats_multi(struct ViewLayer *view_layer, int totelem[3], int totelem_sel[3]);
-void EDBM_mesh_elem_index_ensure_multi(struct ViewLayer *view_layer, const char htype);
+void EDBM_mesh_stats_multi(struct Object **objects, const uint objects_len, int totelem[3], int totelem_sel[3]);
+void EDBM_mesh_elem_index_ensure_multi(struct Object **objects, const uint objects_len, const char htype);
 
 #define ED_MESH_PICK_DEFAULT_VERT_SIZE 50
 #define ED_MESH_PICK_DEFAULT_FACE_SIZE 3
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index c3b9d43a54a..0a6f9345078 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -121,7 +121,8 @@ void ED_uvedit_live_unwrap(struct Scene *scene, struct Object *obedit);
 void ED_uvedit_pack_islands_single(
         struct Scene *scene, struct Object *ob, struct BMesh *bm, bool selected, bool correct_aspect, bool do_rotate);
 void ED_uvedit_pack_islands_multi(
-        struct Scene *scene, ViewLayer *view_layer, bool selected, bool correct_aspect, bool do_rotate);
+        struct Scene *scene, struct Object **objects, const uint objects_len,
+        bool selected, bool correct_aspect, bool do_rotate);
 void ED_uvedit_unwrap_cube_project(
         struct BMesh *bm, float cube_size, bool use_select, const float center[3]);
 
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 08e7d288ed1..a317d59d8cb 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -915,11 +915,14 @@ static int unified_findnearest(
 	float dist = dist_init;
 	BMFace *efa_zbuf = NULL;
 	BMEdge *eed_zbuf = NULL;
-	
+
 	BMVert *eve = NULL;
 	BMEdge *eed = NULL;
 	BMFace *efa = NULL;
 
+	uint bases_len = 0;
+	Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(
+	        eval_ctx->view_layer, &bases_len);
 
 	/* no afterqueue (yet), so we check it now, otherwise the em_xxxofs indices are bad */
 
@@ -927,7 +930,8 @@ static int unified_findnearest(
 		float dist_center = 0.0f;
 		float *dist_center_p = (em->selectmode & (SCE_SELECT_EDGE | SCE_SELECT_VERTEX)) ? &dist_center : NULL;
 
-		FOREACH_BASE_IN_EDIT_MODE_BEGIN (eval_ctx->view_layer, base_iter) {
+		for (uint base_index = 0; base_index < bases_len; base_index++) {
+			Base *base_iter = bases[base_index];
 			Object *obedit = base_iter->object;
 			ED_view3d_viewcontext_init_object(vc, obedit);
 			ED_view3d_backbuf_validate(eval_ctx, vc);
@@ -940,14 +944,15 @@ static int unified_findnearest(
 				*r_base = base_iter;
 				efa = efa_test;
 			}
-		} FOREACH_BASE_IN_EDIT_MODE_END;
+		} /* bases */
 	}
 
 	if ((dist > 0.0f) && (em->selectmode & SCE_SELECT_EDGE)) {
 		float dist_center = 0.0f;
 		float *dist_center_p = (em->selectmode & SCE_SELECT_VERTEX) ? &dist_center : NULL;
 
-		FOREACH_BASE_IN_EDIT_MODE_BEGIN (eval_ctx->view_layer, base_iter) {
+		for (uint base_index = 0; base_index < bases_len; base_index++) {
+			Base *base_iter = bases[base_index];
 			Object *obedit = base_iter->object;
 			ED_view3d_viewcontext_init_object(vc, obedit);
 			ED_view3d_backbuf_validate(eval_ctx, vc);
@@ -959,11 +964,12 @@ static int unified_findnearest(
 				*r_base = base_iter;
 				eed = eed_test;
 			}
-		} FOREACH_BASE_IN_EDIT_MODE_END;
+		} /* bases */
 	}
 
 	if ((dist > 0.0f) && em->selectmode & SCE_SELECT_VERTEX) {
-		FOREACH_BASE_IN_EDIT_MODE_BEGIN (eval_ctx->view_layer, base_iter) {
+		for (uint base_index = 0; base_index < bases_len; base_index++) {
+			Base *base_iter = bases[base_index];
 			Object *obedit = base_iter->object;
 			ED_view3d_viewcontext_init_object(vc, obedit);
 			ED_view3d_backbuf_validate(eval_ctx, vc);
@@ -972,9 +978,11 @@ static int unified_findnearest(
 				*r_base = base_iter;
 				eve = eve_test;
 			}
-		} FOREACH_BASE_IN_EDIT_MODE_END;
+		} /* bases */
 	}
 
+	MEM_SAFE_FREE(bases);
+
 	/* return only one of 3 pointers, for frontbuffer redraws */
 	if (eve) {
 		efa = NULL; eed = NULL;
@@ -1799,19 +1807,25 @@ static int edbm_select_all_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = CTX_data_view_layer(C);
 	int action = RNA_enum_get(op->ptr, "action");
 
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(
+	        view_layer, &objects_len,
+	        .no_dupe_data = true);
+
 	if (action == SEL_TOGGLE) {
 		action = SEL_SELECT;
-		FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, obedit) {
+		for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+			Object *obedit = objects[ob_index];
 			BMEditMesh *em = BKE_editmesh_from_object(obedit);
 			if (em->bm->totvertsel || em->bm->totedgesel || em->bm->totfacesel) {
 				action = SEL_DESELECT;
 				break;
 			}
 		}
-		FOREACH_OBJECT_IN_MODE_END;
 	}
 
-	FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, obedit) {
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *obedit = objects[ob_index];
 		BMEditMesh *em = BKE_editmesh_from_object(obedit);
 		switch (action) {
 			case SEL_SELECT:
@@ -1827,7 +1841,8 @@ static int edbm_select_all_exec(bContext *C, wmOperator *op)
 		}
 		WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
 	}
-	FOREACH_OBJECT_IN_MODE_END;
+
+	MEM_SAFE_FREE(objects);
 
 	return OPERATOR_FINISHED;
 }
@@ -1905,12 +1920,18 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
 
 		/* Deselect everything */
 		if (extend == false && deselect == false && toggle == false) {
-			FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (eval_ctx.view_layer, ob_iter) {
+			uint objects_len = 0;
+			Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(
+			        eval_ctx.view_layer, &objects_len,
+			        .no_dupe_data = true);
+
+			for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+				Object *ob_iter = objects[ob_index];
 				EDBM_flag_disable_all(BKE_editmesh_from_object(ob_iter), BM_ELEM_SELECT);
 				if (basact->object != ob_iter) {
 					WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
 				}
-			} FOREACH_OBJECT_IN_MODE_END;
+			}
 		}
 
 		if (efa) {
@@ -2293,24 +2314,32 @@ bool EDBM_selectmode_toggle(bContext *C, const short selectmode_new,
 			break;
 	}
 
-	FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (eval_ctx.view_layer, ob_iter) {
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_edit_mode(
+	        eval_ctx.view_layer, &objects_len,
+	        .no_dupe_data = true);
+
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *ob_iter = objects[ob_index];
 		BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
 		if (em_iter != em) {
 			em_iter->selectmode = em->selectmode;
 		}
-	} FOREACH_OBJECT_IN_MODE_END;
+	}
 
 	if (only_update) {
+		MEM_SAFE_FREE(objects);
 		return false;
 	}
 
 	if (use_extend == 0 || em->selectmode == 0) {
 		if (use_expand) {
 			const short selmode_max = highest_order_bit_s(ts->selectmode);
-			FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (eval_ctx.view_layer, ob_iter) {
+			for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+				Object *ob_iter = objects[ob_index];
 				BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
 				EDBM_selectmode_convert(em_iter, selmode_max, selectmode_new);
-			} FOREACH_OBJECT_IN_MODE_END;
+			}
 		}
 	}
 
@@ -2341,14 +2370,16 @@ bool EDBM_selectmode_toggle(bContext *C, const short selectmode_new,
 	if (ret == true) {
 		ts->selectmode = em->selectmode;
 		em = NULL;
-		FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (eval_ctx.view_layer, ob_iter) {
+		for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+			Object *ob_iter = objects[ob_index];
 			BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
 			EDBM_selectmode_set(em_iter);
 			WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
-		} FOREACH_OBJECT_IN_MODE_END;
+		}
 		WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, NULL);
 	}
 
+	MEM_SAFE_FREE(objects);
 	return ret;
 }
 
@@ -2919,13 +2950

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list