fix [#31489] EdgeSplit modifier prevents All Edge to be work correctly since 2.63
authorCampbell Barton <ideasman42@gmail.com>
Tue, 22 May 2012 07:26:45 +0000 (07:26 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 22 May 2012 07:26:45 +0000 (07:26 +0000)
bmesh regression where the edge-draw flag was cleared when bmesh modifiers were used.

source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/bmesh/bmesh_class.h
source/blender/bmesh/intern/bmesh_construct.c
source/blender/bmesh/intern/bmesh_mesh_conv.c

index a34d2ec..4a07e4b 100644 (file)
@@ -1891,6 +1891,14 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis
                
                med->flag = BM_edge_flag_to_mflag(eed);
 
+               /* handle this differently to editmode switching,
+                * only enable draw for single user edges rather then calculating angle */
+               if ((med->flag & ME_EDGEDRAW) == 0) {
+                       if (eed->l && eed->l == eed->l->radial_next) {
+                               med->flag |= ME_EDGEDRAW;
+                       }
+               }
+
                CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i);
                if (add_orig) *index = i;
        }
index c536a22..737efde 100644 (file)
@@ -225,9 +225,10 @@ enum {
                                  * when temp tagging is handy.
                                  * always assume dirty & clear before use. */
 
-       /* we have 2 spare flags which is awesome but since we're limited to 8
+       BM_ELEM_DRAW    = (1 << 5), /* edge display */
+
+       /* we have 1 spare flag which is awesome but since we're limited to 8
         * only add new flags with care! - campbell */
-       /* BM_ELEM_SPARE  = (1 << 5), */
        /* BM_ELEM_SPARE  = (1 << 6), */
 
        BM_ELEM_INTERNAL_TAG = (1 << 7) /* for low level internal API tagging,
index 684237b..589a5fb 100644 (file)
@@ -973,6 +973,7 @@ char BM_edge_flag_from_mflag(const short meflag)
 {
        return ( ((meflag & SELECT)        ? BM_ELEM_SELECT : 0) |
                 ((meflag & ME_SEAM)       ? BM_ELEM_SEAM   : 0) |
+                ((meflag & ME_EDGEDRAW)   ? BM_ELEM_DRAW   : 0) |
                 ((meflag & ME_SHARP) == 0 ? BM_ELEM_SMOOTH : 0) | /* invert */
                 ((meflag & ME_HIDE)       ? BM_ELEM_HIDDEN : 0)
                 );
@@ -994,16 +995,18 @@ char  BM_vert_flag_to_mflag(BMVert *eve)
                 ((hflag & BM_ELEM_HIDDEN)  ? ME_HIDE : 0)
                 );
 }
+
 short BM_edge_flag_to_mflag(BMEdge *eed)
 {
        const char hflag = eed->head.hflag;
 
-       return ( ((hflag & BM_ELEM_SELECT)       ? SELECT    : 0) |
-                ((hflag & BM_ELEM_SEAM)         ? ME_SEAM   : 0) |
-                ((hflag & BM_ELEM_SMOOTH) == 0  ? ME_SHARP  : 0) |
-                ((hflag & BM_ELEM_HIDDEN)       ? ME_HIDE   : 0) |
-                ((BM_edge_is_wire(eed)) ? ME_LOOSEEDGE : 0) | /* not typical */
-                (ME_EDGEDRAW | ME_EDGERENDER)
+       return ( ((hflag & BM_ELEM_SELECT)       ? SELECT       : 0) |
+                ((hflag & BM_ELEM_SEAM)         ? ME_SEAM      : 0) |
+                ((hflag & BM_ELEM_DRAW)         ? ME_EDGEDRAW  : 0) |
+                ((hflag & BM_ELEM_SMOOTH) == 0  ? ME_SHARP     : 0) |
+                ((hflag & BM_ELEM_HIDDEN)       ? ME_HIDE      : 0) |
+                ((BM_edge_is_wire(eed))         ? ME_LOOSEEDGE : 0) | /* not typical */
+                ME_EDGERENDER
                 );
 }
 char  BM_face_flag_to_mflag(BMFace *efa)
index 351fb8e..a8c27e0 100644 (file)
@@ -495,6 +495,9 @@ BLI_INLINE void bmesh_quick_edgedraw_flag(MEdge *med, BMEdge *e)
        {
                med->flag &= ~ME_EDGEDRAW;
        }
+       else {
+               med->flag |= ME_EDGEDRAW;
+       }
 }
 
 void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)