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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to