[Bf-blender-cvs] [02a4fc13959] blender2.8: Texture Paint: implement efficient face selection updates.

Alexander Gavrilov noreply at git.blender.org
Sat Dec 1 13:44:12 CET 2018


Commit: 02a4fc139597cae8c7002fd5a6e4b16171314cc5
Author: Alexander Gavrilov
Date:   Sat Dec 1 15:40:48 2018 +0300
Branches: blender2.8
https://developer.blender.org/rB02a4fc139597cae8c7002fd5a6e4b16171314cc5

Texture Paint: implement efficient face selection updates.

Fix the old code that propagates selection changes to the
evaluated mesh directly without rebuilding, and avoid tagging
DEG_TAG_COPY_ON_WRITE if it succeeds.

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

M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/mesh/editface.c
M	source/blender/editors/sculpt_paint/paint_utils.c
M	source/blender/editors/space_view3d/view3d_select.c

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

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 9902f241efd..bc3bb0e322e 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2328,6 +2328,10 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
 			GPU_BATCH_DISCARD_SAFE(cache->facedot_with_select_id);
 			GPU_BATCH_DISCARD_SAFE(cache->edges_with_select_id);
 			GPU_BATCH_DISCARD_SAFE(cache->verts_with_select_id);
+			/* Paint mode selection */
+			GPU_BATCH_DISCARD_SAFE(cache->overlay_paint_edges);
+			GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_faces);
+			GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_verts);
 			/* Because visible UVs depends on edit mode selection, discard everything. */
 			mesh_batch_cache_discard_uvedit(cache);
 			break;
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index d427454cd7b..bf2412d23fe 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -242,16 +242,15 @@ void EDBM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct BMEd
 
 
 /* editface.c */
-void paintface_flush_flags(struct Object *ob, short flag);
-void paintface_tag_select_update(struct bContext *C, struct Object *ob);
+void paintface_flush_flags(struct bContext *C, struct Object *ob, short flag);
 bool paintface_mouse_select(struct bContext *C, struct Object *ob, const int mval[2], bool extend, bool deselect, bool toggle);
 int  do_paintface_box_select(struct ViewContext *vc, struct rcti *rect, int sel_op);
-void paintface_deselect_all_visible(struct Object *ob, int action, bool flush_flags);
+void paintface_deselect_all_visible(struct bContext *C, struct Object *ob, int action, bool flush_flags);
 void paintface_select_linked(struct bContext *C, struct Object *ob, const int mval[2], const bool select);
 bool paintface_minmax(struct Object *ob, float r_min[3], float r_max[3]);
 
-void paintface_hide(struct Object *ob, const bool unselected);
-void paintface_reveal(struct Object *ob, const bool select);
+void paintface_hide(struct bContext *C, struct Object *ob, const bool unselected);
+void paintface_reveal(struct bContext *C, struct Object *ob, const bool select);
 
 void paintvert_deselect_all_visible(struct Object *ob, int action, bool flush_flags);
 void paintvert_select_ungrouped(struct Object *ob, bool extend, bool flush_flags);
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index 2beb9303a2e..8be0105463e 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -55,15 +55,15 @@
 #include "GPU_draw.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 /* own include */
 
 /* copy the face flags, most importantly selection from the mesh to the final derived mesh,
  * use in object mode when selecting faces (while painting) */
-void paintface_flush_flags(Object *ob, short flag)
+void paintface_flush_flags(struct bContext *C, Object *ob, short flag)
 {
 	Mesh *me = BKE_mesh_from_object(ob);
-	Mesh *me_eval = ob->runtime.mesh_eval;
 	MPoly *polys, *mp_orig;
 	const int *index_array = NULL;
 	int totpoly;
@@ -82,36 +82,55 @@ void paintface_flush_flags(Object *ob, short flag)
 		BKE_mesh_flush_select_from_polys(me);
 	}
 
-	if (me_eval == NULL)
+	Depsgraph *depsgraph = CTX_data_depsgraph(C);
+	Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
+
+	if (ob_eval == NULL) {
 		return;
+	}
+
+	Mesh *me_eval = ob_eval->runtime.mesh_eval;
+	bool updated = false;
 
-	/* Mesh polys => Final derived polys */
+	if (me_eval != NULL) {
+		/* Mesh polys => Final derived polys */
 
-	if ((index_array = CustomData_get_layer(&me_eval->pdata, CD_ORIGINDEX))) {
-		polys = me_eval->mpoly;
-		totpoly = me_eval->totpoly;
+		if ((index_array = CustomData_get_layer(&me_eval->pdata, CD_ORIGINDEX))) {
+			polys = me_eval->mpoly;
+			totpoly = me_eval->totpoly;
 
-		/* loop over final derived polys */
-		for (i = 0; i < totpoly; i++) {
-			if (index_array[i] != ORIGINDEX_NONE) {
-				/* Copy flags onto the final derived poly from the original mesh poly */
-				mp_orig = me->mpoly + index_array[i];
-				polys[i].flag = mp_orig->flag;
+			/* loop over final derived polys */
+			for (i = 0; i < totpoly; i++) {
+				if (index_array[i] != ORIGINDEX_NONE) {
+					/* Copy flags onto the final derived poly from the original mesh poly */
+					mp_orig = me->mpoly + index_array[i];
+					polys[i].flag = mp_orig->flag;
 
+				}
 			}
+
+			updated = true;
 		}
 	}
 
-	BKE_mesh_batch_cache_dirty_tag(me, BKE_MESH_BATCH_DIRTY_ALL);
-}
+	if (updated) {
+		if (flag & ME_HIDE) {
+			BKE_mesh_batch_cache_dirty_tag(me_eval, BKE_MESH_BATCH_DIRTY_ALL);
+		}
+		else {
+			BKE_mesh_batch_cache_dirty_tag(me_eval, BKE_MESH_BATCH_DIRTY_SELECT);
+		}
+
+		DEG_id_tag_update(ob->data, DEG_TAG_SELECT_UPDATE);
+	}
+	else {
+		DEG_id_tag_update(ob->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
+	}
 
-void paintface_tag_select_update(struct bContext *C, struct Object *ob)
-{
-	DEG_id_tag_update(ob->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE);
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob->data);
 }
 
-void paintface_hide(Object *ob, const bool unselected)
+void paintface_hide(bContext *C, Object *ob, const bool unselected)
 {
 	Mesh *me;
 	MPoly *mpoly;
@@ -138,11 +157,11 @@ void paintface_hide(Object *ob, const bool unselected)
 
 	BKE_mesh_flush_hidden_from_polys(me);
 
-	paintface_flush_flags(ob, SELECT | ME_HIDE);
+	paintface_flush_flags(C, ob, SELECT | ME_HIDE);
 }
 
 
-void paintface_reveal(Object *ob, const bool select)
+void paintface_reveal(bContext *C, Object *ob, const bool select)
 {
 	Mesh *me;
 	MPoly *mpoly;
@@ -163,7 +182,7 @@ void paintface_reveal(Object *ob, const bool select)
 
 	BKE_mesh_flush_hidden_from_polys(me);
 
-	paintface_flush_flags(ob, SELECT | ME_HIDE);
+	paintface_flush_flags(C, ob, SELECT | ME_HIDE);
 }
 
 /* Set tface seams based on edge data, uses hash table to find seam edges. */
@@ -257,11 +276,10 @@ void paintface_select_linked(bContext *C, Object *ob, const int mval[2], const b
 
 	select_linked_tfaces_with_seams(me, index, select);
 
-	paintface_flush_flags(ob, SELECT);
-	paintface_tag_select_update(C, ob);
+	paintface_flush_flags(C, ob, SELECT);
 }
 
-void paintface_deselect_all_visible(Object *ob, int action, bool flush_flags)
+void paintface_deselect_all_visible(bContext *C, Object *ob, int action, bool flush_flags)
 {
 	Mesh *me;
 	MPoly *mpoly;
@@ -304,7 +322,7 @@ void paintface_deselect_all_visible(Object *ob, int action, bool flush_flags)
 	}
 
 	if (flush_flags) {
-		paintface_flush_flags(ob, SELECT);
+		paintface_flush_flags(C, ob, SELECT);
 	}
 }
 
@@ -392,8 +410,7 @@ bool paintface_mouse_select(struct bContext *C, Object *ob, const int mval[2], b
 
 	/* image window redraw */
 
-	paintface_flush_flags(ob, SELECT);
-	paintface_tag_select_update(C, ob);
+	paintface_flush_flags(C, ob, SELECT);
 	ED_region_tag_redraw(CTX_wm_region(C)); // XXX - should redraw all 3D views
 	return true;
 }
@@ -420,7 +437,7 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int sel_op)
 	selar = MEM_callocN(me->totpoly + 1, "selar");
 
 	if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
-		paintface_deselect_all_visible(vc->obact, SEL_DESELECT, false);
+		paintface_deselect_all_visible(vc->C, vc->obact, SEL_DESELECT, false);
 	}
 
 	ED_view3d_backbuf_validate(vc);
@@ -463,8 +480,7 @@ int do_paintface_box_select(ViewContext *vc, rcti *rect, int sel_op)
 	glReadBuffer(GL_BACK);
 #endif
 
-	paintface_flush_flags(vc->obact, SELECT);
-	paintface_tag_select_update(vc->C, vc->obact);
+	paintface_flush_flags(vc->C, vc->obact, SELECT);
 
 	return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 45200924790..923fc097f43 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -655,8 +655,7 @@ void PAINT_OT_face_select_linked_pick(wmOperatorType *ot)
 static int face_select_all_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = CTX_data_active_object(C);
-	paintface_deselect_all_visible(ob, RNA_enum_get(op->ptr, "action"), true);
-	paintface_tag_select_update(C, ob);
+	paintface_deselect_all_visible(C, ob, RNA_enum_get(op->ptr, "action"), true);
 	ED_region_tag_redraw(CTX_wm_region(C));
 	return OPERATOR_FINISHED;
 }
@@ -739,8 +738,7 @@ static int face_select_hide_exec(bContext *C, wmOperator *op)
 {
 	const bool unselected = RNA_boolean_get(op->ptr, "unselected");
 	Object *ob = CTX_data_active_object(C);
-	paintface_hide(ob, unselected);
-	paintface_tag_select_update(C, ob);
+	paintface_hide(C, ob, unselected);
 	ED_region_tag_redraw(CTX_wm_region(C));
 	return OPERATOR_FINISHED;
 }
@@ -763,8 +761,7 @@ static int face_select_reveal_exec(bContext *C, wmOperator *op)
 {
 	const bool select = RNA_boolean_get(op->ptr, "select");
 	Object *ob = CTX_data_active_object(C);
-	paintface_reveal(ob, select);
-	paintface_tag_select_update(C, ob);
+	paintface_reveal(C, ob, select);
 	ED_region_tag_redraw(CTX_wm_region(C));
 	return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 30dbaed1d0f..426f158dcc4 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -925,7 +925,7 @@ static void do_lasso_select_paintface(ViewContext *vc, const int mcords[][2], sh
 		return;
 
 	if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
-		paintface_deselect_all_visible(ob, SEL_DESELECT, false);  /* flush selection at the end */
+		paintface_deselect_all_visible(vc->C, ob, SEL_DESELECT, false);  /* flush selection at the end */
 	}
 
 	bm_vertoffs = me->totpoly + 1; /* max index array */
@@ -937,8 +937,7 @@ static void do_lasso_select_paintface(ViewContext *vc, const int mcords[][2], sh
 
 	EDBM_backbuf_free();
 
-	paintface_flush_flags(ob, SELECT);
-	paintface_tag_select_update(vc->C, ob);
+	paintface_flush_flags(vc->C, ob, SELECT);
 }
 
 #if 0
@@ -2905,8 +2904,7 @@ stat

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list