[Bf-blender-cvs] [5e1021f78f8] blender2.8: 3D View: remove temporary edge-select hack

Campbell Barton noreply at git.blender.org
Thu May 24 20:38:45 CEST 2018


Commit: 5e1021f78f89449c1ff0d9eaeb7291dd660a9d98
Author: Campbell Barton
Date:   Thu May 24 20:35:51 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5e1021f78f89449c1ff0d9eaeb7291dd660a9d98

3D View: remove temporary edge-select hack

This caused a glitch with COW, where forcing edge selection
caused the evaluated scene to enable this afterwards.

Now pass the selection mode as an argument to the draw function.

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

M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw_legacy.c
M	source/blender/editors/space_view3d/view3d_intern.h

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

diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 28e2c5e0d71..9ddc826244e 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -310,6 +310,7 @@ float ED_view3d_radius_to_dist(
 void imm_drawcircball(const float cent[3], float rad, const float tmat[4][4], unsigned pos);
 
 /* backbuffer select and draw support */
+void          ED_view3d_backbuf_validate_with_select_mode(struct ViewContext *vc, short select_mode);
 void          ED_view3d_backbuf_validate(struct ViewContext *vc);
 struct ImBuf *ED_view3d_backbuf_read(
         struct ViewContext *vc, int xmin, int ymin, int xmax, int ymax);
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 3eafb48d02c..fd8efcd84e3 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -397,6 +397,18 @@ bool EDBM_backbuf_circle_init(
  * to avoid the bias interfering with distance comparisons when mixing types.
  * \{ */
 
+#define FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, select_mode_required) \
+	short select_mode = select_mode_required; \
+	bool fake_select_mode = (select_mode & (vc)->scene->toolsettings->selectmode) == 0; \
+	if (fake_select_mode) { \
+		(vc)->v3d->flag |= V3D_INVALID_BACKBUF; \
+	} ((void)0)
+
+#define FAKE_SELECT_MODE_END(vc, fake_select_mode) \
+	if (fake_select_mode) { \
+		(vc)->v3d->flag |= V3D_INVALID_BACKBUF; \
+	} ((void)0)
+
 #define FIND_NEAR_SELECT_BIAS 5
 #define FIND_NEAR_CYCLE_THRESHOLD_MIN 3
 
@@ -470,11 +482,16 @@ BMVert *EDBM_vert_find_nearest_ex(
 		BMVert *eve;
 
 		/* No afterqueue (yet), so we check it now, otherwise the bm_xxxofs indices are bad. */
-		ED_view3d_backbuf_validate(vc);
+		{
+			FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_VERTEX);
+			ED_view3d_backbuf_validate_with_select_mode(vc, select_mode);
 
-		index = ED_view3d_backbuf_sample_rect(
-		        vc, vc->mval, dist_px, bm_wireoffs, 0xFFFFFF, &dist_test);
-		eve = index ? BM_vert_at_index_find_or_table(bm, index - 1) : NULL;
+			index = ED_view3d_backbuf_sample_rect(
+			            vc, vc->mval, dist_px, bm_wireoffs, 0xFFFFFF, &dist_test);
+			eve = index ? BM_vert_at_index_find_or_table(bm, index - 1) : NULL;
+
+			FAKE_SELECT_MODE_END(vc, fake_select_mode);
+		}
 
 		if (eve) {
 			if (dist_test < *r_dist) {
@@ -657,23 +674,16 @@ BMEdge *EDBM_edge_find_nearest_ex(
 		unsigned int index;
 		BMEdge *eed;
 
-		/* Make sure that the edges also are considered to find nearest.
-		 * TODO: cleanup: add `selectmode` as a parameter
-		 * XXX: Without selectmode as parameter we need to resort to this super ugly hack,
-		 *      because we should never write to evaluate data. */
-		const short ts_selectmode = vc->scene->toolsettings->selectmode;
-
-		Scene *scene_eval = (Scene *)DEG_get_evaluated_id(vc->depsgraph, &vc->scene->id);
-		scene_eval->toolsettings->selectmode |= SCE_SELECT_EDGE;
-
 		/* No afterqueue (yet), so we check it now, otherwise the bm_xxxofs indices are bad. */
-		ED_view3d_backbuf_validate(vc);
-
-		/* restore `selectmode` */
-		scene_eval->toolsettings->selectmode = ts_selectmode;
-
-		index = ED_view3d_backbuf_sample_rect(vc, vc->mval, dist_px, bm_solidoffs, bm_wireoffs, &dist_test);
-		eed = index ? BM_edge_at_index_find_or_table(bm, index - 1) : NULL;
+		{
+			FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_EDGE);
+			ED_view3d_backbuf_validate_with_select_mode(vc, select_mode);
+			
+			index = ED_view3d_backbuf_sample_rect(vc, vc->mval, dist_px, bm_solidoffs, bm_wireoffs, &dist_test);
+			eed = index ? BM_edge_at_index_find_or_table(bm, index - 1) : NULL;
+			
+			FAKE_SELECT_MODE_END(vc, fake_select_mode);
+		}
 
 		if (r_eed_zbuf) {
 			*r_eed_zbuf = eed;
@@ -834,10 +844,15 @@ BMFace *EDBM_face_find_nearest_ex(
 		unsigned int index;
 		BMFace *efa;
 
-		ED_view3d_backbuf_validate(vc);
+		{
+			FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_FACE);
+			ED_view3d_backbuf_validate_with_select_mode(vc, select_mode);
+
+			index = ED_view3d_backbuf_sample(vc, vc->mval[0], vc->mval[1]);
+			efa = index ? BM_face_at_index_find_or_table(bm, index - 1) : NULL;
 
-		index = ED_view3d_backbuf_sample(vc, vc->mval[0], vc->mval[1]);
-		efa = index ? BM_face_at_index_find_or_table(bm, index - 1) : NULL;
+			FAKE_SELECT_MODE_END(vc, fake_select_mode);
+		}
 
 		if (r_efa_zbuf) {
 			*r_efa_zbuf = efa;
@@ -1067,6 +1082,9 @@ static bool unified_findnearest(
 	return (hit.v.ele || hit.e.ele || hit.f.ele);
 }
 
+#undef FAKE_SELECT_MODE_BEGIN
+#undef FAKE_SELECT_MODE_END
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -1703,26 +1721,7 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
 	mvalf[1] = (float)(vc.mval[1] = mval[1]);
 	em = vc.em;
 
-	/* Make sure that the edges are also considered for selection.
-	 * TODO: cleanup: add `selectmode` as a parameter */
-	const short ts_selectmode = vc.scene->toolsettings->selectmode;
-	bool use_fake_edge_mode = false;
-	if ((ts_selectmode & SCE_SELECT_EDGE) == 0) {
-		vc.v3d->flag |= V3D_INVALID_BACKBUF;
-		vc.scene->toolsettings->selectmode = SCE_SELECT_EDGE;
-		em->selectmode = vc.scene->toolsettings->selectmode;
-		use_fake_edge_mode = true;
-	}
-
 	eed = EDBM_edge_find_nearest_ex(&vc, &dist, NULL, true, true, NULL);
-	
-	/* restore `selectmode` */
-	if (use_fake_edge_mode) {
-		vc.v3d->flag |= V3D_INVALID_BACKBUF;
-		vc.scene->toolsettings->selectmode = ts_selectmode;
-		em->selectmode = ts_selectmode;
-	}
-	
 	if (eed == NULL) {
 		return false;
 	}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 8e04a2e17b8..b87d6c0b85e 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -610,9 +610,13 @@ static void bbs_mesh_solid_faces(Scene *UNUSED(scene), Object *ob)
 }
 
 void draw_object_backbufsel(
-        Depsgraph *depsgraph, Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
+        Depsgraph *depsgraph, Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob,
+        short select_mode)
 {
 	ToolSettings *ts = scene->toolsettings;
+	if (select_mode == -1) {
+		select_mode = ts->selectmode;
+	}
 
 	gpuMultMatrix(ob->obmat);
 
@@ -631,8 +635,8 @@ void draw_object_backbufsel(
 
 				DM_update_materials(dm, ob);
 
-				bbs_mesh_solid_EM(em, scene, v3d, ob, dm, (ts->selectmode & SCE_SELECT_FACE) != 0);
-				if (ts->selectmode & SCE_SELECT_FACE)
+				bbs_mesh_solid_EM(em, scene, v3d, ob, dm, (select_mode & SCE_SELECT_FACE) != 0);
+				if (select_mode & SCE_SELECT_FACE)
 					bm_solidoffs = 1 + em->bm->totface;
 				else {
 					bm_solidoffs = 1;
@@ -641,7 +645,7 @@ void draw_object_backbufsel(
 				ED_view3d_polygon_offset(rv3d, 1.0);
 
 				/* we draw edges if edge select mode */
-				if (ts->selectmode & SCE_SELECT_EDGE) {
+				if (select_mode & SCE_SELECT_EDGE) {
 					bbs_mesh_wire(em, dm, bm_solidoffs);
 					bm_wireoffs = bm_solidoffs + em->bm->totedge;
 				}
@@ -651,7 +655,7 @@ void draw_object_backbufsel(
 				}
 
 				/* we draw verts if vert select mode. */
-				if (ts->selectmode & SCE_SELECT_VERTEX) {
+				if (select_mode & SCE_SELECT_VERTEX) {
 					bbs_mesh_verts(em, dm, bm_wireoffs);
 					bm_vertoffs = bm_wireoffs + em->bm->totvert;
 				}
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index 5b0f50b7a68..8505de4c7e0 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -163,7 +163,8 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const
 static void backdrawview3d(
         struct Depsgraph *depsgraph, Scene *scene,
         ARegion *ar, View3D *v3d,
-        Object *obact, Object *obedit)
+        Object *obact, Object *obedit,
+        short select_mode)
 {
 	RegionView3D *rv3d = ar->regiondata;
 	Scene *scene_eval = (Scene *)DEG_get_evaluated_id(depsgraph, &scene->id);
@@ -263,7 +264,7 @@ static void backdrawview3d(
 	G.f |= G_BACKBUFSEL;
 
 	if (obact_eval && ((obact_eval->base_flag & BASE_VISIBLED) != 0)) {
-		draw_object_backbufsel(depsgraph, scene_eval, v3d, rv3d, obact_eval);
+		draw_object_backbufsel(depsgraph, scene_eval, v3d, rv3d, obact_eval, select_mode);
 	}
 
 	if (rv3d->gpuoffscreen)
@@ -301,13 +302,18 @@ static void view3d_opengl_read_Z_pixels(ARegion *ar, int x, int y, int w, int h,
 	glReadPixels(ar->winrct.xmin + x, ar->winrct.ymin + y, w, h, format, type, data);
 }
 
-void ED_view3d_backbuf_validate(ViewContext *vc)
+void ED_view3d_backbuf_validate_with_select_mode(ViewContext *vc, short select_mode)
 {
 	if (vc->v3d->flag & V3D_INVALID_BACKBUF) {
-		backdrawview3d(vc->depsgraph, vc->scene, vc->ar, vc->v3d, vc->obact, vc->obedit);
+		backdrawview3d(vc->depsgraph, vc->scene, vc->ar, vc->v3d, vc->obact, vc->obedit, select_mode);
 	}
 }
 
+void ED_view3d_backbuf_validate(ViewContext *vc)
+{
+	ED_view3d_backbuf_validate_with_select_mode(vc, -1);
+}
+
 /**
  * allow for small values [0.5 - 2.5],
  * and large values, FLT_MAX by clamping by the area size
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index ec9d5ba0e83..da8afa7a390 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -133,7 +133,9 @@ void VIEW3D_OT_walk(struct wmOperatorType *ot);
 void VIEW3D_OT_ruler(struct wmOperatorType *ot);
 
 /* drawobject.c */
-void draw_object_backbufsel(struct Depsgraph *depsgraph, Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob);
+void draw_object_backbufsel(
+        struct Depsgraph *depsgraph, Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob,
+        short select_mode);
 
 int view3d_effective_drawtype(const struct View3D *v3d);



More information about the Bf-blender-cvs mailing list