diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-09 16:54:13 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-10 15:49:49 +0400 |
commit | f93bc7693a530632455d3ec7acc4bce54a1f85bc (patch) | |
tree | d0e067438cbc547875b3cb77e53904c5ea2a537d /source/blender/bmesh/tools/bmesh_wireframe.c | |
parent | 19e627cab34a04a3d01b2e3a868b7bf91d56e8f9 (diff) |
Backport revisions for the 2.70a releasev2.70a
d2660a0, 6e99fb0, 58c22d8, 83f2012 + ff21f6a, a7ed1db. cc6b106
7997e38, 9d4b54b, efb48fc, 3fc293c, 29f359c, 77c1d17, 92a539e,
c626462, f48828b, 6452d9f, 765d077, 74518b2, af16d46, 8da4936,
6babbf5, f0106d2, f88776b, ee72cba, 467596d, e21a7b3, eed3974,
71a2ff1, ccf9afd, 44d6c68, 30fdfc3, b69809c, b0a8e4c, bd57ec6,
3b0832d, 2a25676, 3977b76, fb25a86, 9bbb30b, 51abc2b, 0ebade5,
2c0e32f, 3deaf7d, ea01b24, c61eb64, f3db038, a6fb670, eedde31,
b66a954, 7ff123c, f5b79df, 7148c97, 54a8753, fcaa018, 4c73001,
7a21330, 07578be, e9a64e2, fd3de8b, ae792e9, b7712a7 + 3600622,
d9557d0, 6d973b8, 688257d, 4acb57a, 95ac6bc,
Also backported openmp changes to sculpt making it so number
of real CPU cores is used as a number of threads here.
Diffstat (limited to 'source/blender/bmesh/tools/bmesh_wireframe.c')
-rw-r--r-- | source/blender/bmesh/tools/bmesh_wireframe.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/source/blender/bmesh/tools/bmesh_wireframe.c b/source/blender/bmesh/tools/bmesh_wireframe.c index db4601d6134..824a4164559 100644 --- a/source/blender/bmesh/tools/bmesh_wireframe.c +++ b/source/blender/bmesh/tools/bmesh_wireframe.c @@ -529,8 +529,62 @@ void BM_mesh_wireframe( } if (use_replace) { - for (i = 0; i < totvert_orig; i++) { - BM_vert_kill(bm, verts_src[i]); + + if (use_tag) { + /* only remove faces which are original and used to make wire, + * use 'verts_pos' and 'verts_neg' to avoid a feedback loop. */ + + /* vertex must be from 'verts_src' */ +#define VERT_DUPE_TEST_ORIG(v) (verts_neg[BM_elem_index_get(v)] != NULL) +#define VERT_DUPE_TEST(v) (verts_pos[BM_elem_index_get(v)] != NULL) +#define VERT_DUPE_CLEAR(v) { verts_pos[BM_elem_index_get(v)] = NULL; } (void)0 + + /* first ensure we keep all verts which are used in faces that weren't + * entirely made into wire. */ + BM_ITER_MESH (f_src, &iter, bm, BM_FACES_OF_MESH) { + int mix_flag = 0; + BMLoop *l_iter, *l_first; + + /* skip new faces */ + if (BM_elem_index_get(f_src) == -1) { + continue; + } + + l_iter = l_first = BM_FACE_FIRST_LOOP(f_src); + do { + mix_flag |= (VERT_DUPE_TEST_ORIG(l_iter->v) ? 1 : 2); + if (mix_flag == (1 | 2)) { + break; + } + } while ((l_iter = l_iter->next) != l_first); + + if (mix_flag == (1 | 2)) { + l_iter = l_first = BM_FACE_FIRST_LOOP(f_src); + do { + VERT_DUPE_CLEAR(l_iter->v); + } while ((l_iter = l_iter->next) != l_first); + } + } + + /* now remove any verts which were made into wire by all faces */ + for (i = 0; i < totvert_orig; i++) { + v_src = verts_src[i]; + BLI_assert(i == BM_elem_index_get(v_src)); + if (VERT_DUPE_TEST(v_src)) { + BM_vert_kill(bm, v_src); + } + } + +#undef VERT_DUPE_TEST_ORIG +#undef VERT_DUPE_TEST +#undef VERT_DUPE_CLEAR + + } + else { + /* simple case, no tags - replace all */ + for (i = 0; i < totvert_orig; i++) { + BM_vert_kill(bm, verts_src[i]); + } } } |