diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-03-14 06:15:56 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-03-14 06:21:16 +0300 |
commit | 66043cc6c1911c9b8af971fb26916ed8363549ce (patch) | |
tree | 978851064d7a7dc167e7deb511814a33afceb5d6 /source/blender/bmesh/intern | |
parent | 0024768f8838cbbdd00fcbe181b771a5523a521f (diff) |
Fix T47788: Symmetrize flips multi-res data
Symmetrize was unusable with multi-res data,
add an option for the bmesh operator not to flip the multi-res depth.
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.c | 30 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.h | 4 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mods.c | 3 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_polygon.c | 12 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_polygon.h | 3 |
6 files changed, 39 insertions, 14 deletions
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 9f680df7e09..86f13e8bd13 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -1044,13 +1044,18 @@ static int UNUSED_FUNCTION(bm_loop_length)(BMLoop *l) * * BMESH_TODO: reinsert validation code. * + * \param cd_loop_mdisp_offset: Cached result of `CustomData_get_offset(&bm->ldata, CD_MDISPS)`. + * \param use_loop_mdisp_flip: When set, flip the Z-depth of the mdisp, + * (use when flipping normals, disable when mirroring, eg: symmetrize). + * * \return Success */ -static bool bm_loop_reverse_loop(BMesh *bm, BMFace *f +static bool bm_loop_reverse_loop( + BMesh *bm, BMFace *f, #ifdef USE_BMESH_HOLES - , BMLoopList *lst + BMLoopList *lst, #endif - ) + const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip) { #ifdef USE_BMESH_HOLES @@ -1060,7 +1065,6 @@ static bool bm_loop_reverse_loop(BMesh *bm, BMFace *f #endif const int len = f->len; - const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS); BMLoop *l_iter, *oldprev, *oldnext; BMEdge **edar = BLI_array_alloca(edar, len); int i, j, edok; @@ -1100,15 +1104,19 @@ static bool bm_loop_reverse_loop(BMesh *bm, BMFace *f SWAP(float, co_a[0], co_a[1]); SWAP(float, co_b[0], co_b[1]); - co_a[2] *= -1.0f; - co_b[2] *= -1.0f; + if (use_loop_mdisp_flip) { + co_a[2] *= -1.0f; + co_b[2] *= -1.0f; + } } co_a = co[x * sides + x]; SWAP(float, co_a[0], co_a[1]); - co_a[2] *= -1.0f; + if (use_loop_mdisp_flip) { + co_a[2] *= -1.0f; + } } } } @@ -1155,12 +1163,14 @@ static bool bm_loop_reverse_loop(BMesh *bm, BMFace *f /** * \brief Flip the faces direction */ -bool bmesh_loop_reverse(BMesh *bm, BMFace *f) +bool bmesh_loop_reverse( + BMesh *bm, BMFace *f, + const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip) { #ifdef USE_BMESH_HOLES - return bm_loop_reverse_loop(bm, f, f->loops.first); + return bm_loop_reverse_loop(bm, f, f->loops.first, cd_loop_mdisp_offset, use_loop_mdisp_flip); #else - return bm_loop_reverse_loop(bm, f); + return bm_loop_reverse_loop(bm, f, cd_loop_mdisp_offset, use_loop_mdisp_flip); #endif } diff --git a/source/blender/bmesh/intern/bmesh_core.h b/source/blender/bmesh/intern/bmesh_core.h index 808967a39ca..fb5702bc574 100644 --- a/source/blender/bmesh/intern/bmesh_core.h +++ b/source/blender/bmesh/intern/bmesh_core.h @@ -75,7 +75,9 @@ void bmesh_vert_separate( BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len, const bool copy_select); -bool bmesh_loop_reverse(BMesh *bm, BMFace *f); +bool bmesh_loop_reverse( + BMesh *bm, BMFace *f, + const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip); BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const bool do_del); void BM_vert_separate( diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index 273d5dba94d..d3c847de64e 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -244,7 +244,8 @@ BMFace *BM_faces_join_pair(BMesh *bm, BMFace *f_a, BMFace *f_b, BMEdge *e, const BLI_assert(l_a && l_b); if (l_a->v == l_b->v) { - bmesh_loop_reverse(bm, f_b); + const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS); + bmesh_loop_reverse(bm, f_b, cd_loop_mdisp_offset, true); } return BM_faces_join(bm, faces, 2, do_del); diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 72a8dac534a..7e4a1358a9b 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -243,6 +243,7 @@ static BMOpDefine bmo_reverse_faces_def = { "reverse_faces", /* slots_in */ {{"faces", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* input faces */ + {"flip_multires", BMO_OP_SLOT_BOOL}, /* maintain multi-res offset */ {{'\0'}}, }, {{{'\0'}}}, /* no output */ diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c index 40f6078dc0b..62b29e61d08 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.c +++ b/source/blender/bmesh/intern/bmesh_polygon.c @@ -702,12 +702,20 @@ void BM_face_calc_center_mean_vcos( * Reverses the winding of a face. * \note This updates the calculated normal. */ -void BM_face_normal_flip(BMesh *bm, BMFace *f) +void BM_face_normal_flip_ex( + BMesh *bm, BMFace *f, + const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip) { - bmesh_loop_reverse(bm, f); + bmesh_loop_reverse(bm, f, cd_loop_mdisp_offset, use_loop_mdisp_flip); negate_v3(f->no); } +void BM_face_normal_flip(BMesh *bm, BMFace *f) +{ + const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS); + BM_face_normal_flip_ex(bm, f, cd_loop_mdisp_offset, true); +} + /* detects if two line segments cross each other (intersects). * note, there could be more winding cases then there needs to be. */ static bool line_crosses_v2f(const float v1[2], const float v2[2], const float v3[2], const float v4[2]) diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h index a1d17101ece..8f0df81af73 100644 --- a/source/blender/bmesh/intern/bmesh_polygon.h +++ b/source/blender/bmesh/intern/bmesh_polygon.h @@ -62,6 +62,9 @@ bool BM_vert_calc_normal(const BMVert *v, float r_no[3]); void BM_vert_normal_update(BMVert *v) ATTR_NONNULL(); void BM_vert_normal_update_all(BMVert *v) ATTR_NONNULL(); +void BM_face_normal_flip_ex( + BMesh *bm, BMFace *f, + const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip) ATTR_NONNULL(); void BM_face_normal_flip(BMesh *bm, BMFace *f) ATTR_NONNULL(); bool BM_face_point_inside_test(const BMFace *f, const float co[3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); |