diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-01-17 02:21:30 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-01-17 02:21:30 +0400 |
commit | e7a6efa2a78f216db928617c73a12b784aaf21e8 (patch) | |
tree | 27cc1376d3f05ddaa2df782a71a8b167569fed5d /source | |
parent | d9bbcb371a73b87532877791a948ceddde288b07 (diff) |
Code Cleanup: move delete funcs out of bmesh_construct.c into own file
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/bmesh/bmesh.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.c | 219 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_construct.h | 6 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_delete.c | 259 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_delete.h | 36 |
6 files changed, 298 insertions, 225 deletions
diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt index 8d87e290b6c..2cd256e2346 100644 --- a/source/blender/bmesh/CMakeLists.txt +++ b/source/blender/bmesh/CMakeLists.txt @@ -80,6 +80,8 @@ set(SRC intern/bmesh_core.h intern/bmesh_edgeloop.c intern/bmesh_edgeloop.h + intern/bmesh_delete.c + intern/bmesh_delete.h intern/bmesh_inline.h intern/bmesh_interp.c intern/bmesh_interp.h diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 52aeff77fca..8b5250b7c1e 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -244,6 +244,7 @@ extern "C" { #include "intern/bmesh_core.h" #include "intern/bmesh_construct.h" +#include "intern/bmesh_delete.h" #include "intern/bmesh_edgeloop.h" #include "intern/bmesh_interp.h" #include "intern/bmesh_iterators.h" diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c index 1a7464ce340..a8f8f92518a 100644 --- a/source/blender/bmesh/intern/bmesh_construct.c +++ b/source/blender/bmesh/intern/bmesh_construct.c @@ -494,225 +494,6 @@ BMFace *BM_face_create_ngon_vcloud(BMesh *bm, BMVert **vert_arr, int len, return f; } -/** - * Called by operators to remove elements that they have marked for - * removal. - */ -void BMO_remove_tagged_faces(BMesh *bm, const short oflag) -{ - BMFace *f, *f_next; - BMIter iter; - - BM_ITER_MESH_MUTABLE (f, f_next, &iter, bm, BM_FACES_OF_MESH) { - if (BMO_elem_flag_test(bm, f, oflag)) { - BM_face_kill(bm, f); - } - } -} - -void BMO_remove_tagged_edges(BMesh *bm, const short oflag) -{ - BMEdge *e, *e_next; - BMIter iter; - - BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) { - if (BMO_elem_flag_test(bm, e, oflag)) { - BM_edge_kill(bm, e); - } - } -} - -void BMO_remove_tagged_verts(BMesh *bm, const short oflag) -{ - BMVert *v, *v_next; - BMIter iter; - - BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { - if (BMO_elem_flag_test(bm, v, oflag)) { - BM_vert_kill(bm, v); - } - } -} - -/** - * you need to make remove tagged verts/edges/faces - * api functions that take a filter callback..... - * and this new filter type will be for opstack flags. - * This is because the BM_remove_taggedXXX functions bypass iterator API. - * - Ops don't care about 'UI' considerations like selection state, hide state, etc. - * If you want to work on unhidden selections for instance, - * copy output from a 'select context' operator to another operator.... - */ - -static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag) -{ - BMVert *v; - BMEdge *e; - BMFace *f; - - BMIter iter; - BMIter itersub; - - BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { - if (BMO_elem_flag_test(bm, v, oflag)) { - /* Visit edge */ - BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) { - BMO_elem_flag_enable(bm, e, oflag); - } - /* Visit face */ - BM_ITER_ELEM (f, &itersub, v, BM_FACES_OF_VERT) { - BMO_elem_flag_enable(bm, f, oflag); - } - } - } - - BMO_remove_tagged_faces(bm, oflag); - BMO_remove_tagged_edges(bm, oflag); - BMO_remove_tagged_verts(bm, oflag); -} - -static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag) -{ - BMEdge *e; - BMFace *f; - - BMIter iter; - BMIter itersub; - - BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { - if (BMO_elem_flag_test(bm, e, oflag)) { - BM_ITER_ELEM (f, &itersub, e, BM_FACES_OF_EDGE) { - BMO_elem_flag_enable(bm, f, oflag); - } - } - } - BMO_remove_tagged_faces(bm, oflag); - BMO_remove_tagged_edges(bm, oflag); -} - -#define DEL_WIREVERT (1 << 10) - -/** - * \warning oflag applies to different types in some contexts, - * not just the type being removed. - * - * \warning take care, uses operator flag DEL_WIREVERT - */ -void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type) -{ - BMVert *v; - BMEdge *e; - BMFace *f; - - BMIter viter; - BMIter eiter; - BMIter fiter; - - switch (type) { - case DEL_VERTS: - { - bmo_remove_tagged_context_verts(bm, oflag); - - break; - } - case DEL_EDGES: - { - /* flush down to vert */ - BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { - if (BMO_elem_flag_test(bm, e, oflag)) { - BMO_elem_flag_enable(bm, e->v1, oflag); - BMO_elem_flag_enable(bm, e->v2, oflag); - } - } - bmo_remove_tagged_context_edges(bm, oflag); - /* remove loose vertice */ - BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) { - if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e))) - BMO_elem_flag_enable(bm, v, DEL_WIREVERT); - } - BMO_remove_tagged_verts(bm, DEL_WIREVERT); - - break; - } - case DEL_EDGESFACES: - { - bmo_remove_tagged_context_edges(bm, oflag); - - break; - } - case DEL_ONLYFACES: - { - BMO_remove_tagged_faces(bm, oflag); - - break; - } - case DEL_ONLYTAGGED: - { - BMO_remove_tagged_faces(bm, oflag); - BMO_remove_tagged_edges(bm, oflag); - BMO_remove_tagged_verts(bm, oflag); - - break; - } - case DEL_FACES: - { - /* go through and mark all edges and all verts of all faces for delete */ - BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { - if (BMO_elem_flag_test(bm, f, oflag)) { - for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) - BMO_elem_flag_enable(bm, e, oflag); - for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) - BMO_elem_flag_enable(bm, v, oflag); - } - } - /* now go through and mark all remaining faces all edges for keeping */ - BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { - if (!BMO_elem_flag_test(bm, f, oflag)) { - for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) { - BMO_elem_flag_disable(bm, e, oflag); - } - for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) { - BMO_elem_flag_disable(bm, v, oflag); - } - } - } - /* also mark all the vertices of remaining edges for keeping */ - BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { - if (!BMO_elem_flag_test(bm, e, oflag)) { - BMO_elem_flag_disable(bm, e->v1, oflag); - BMO_elem_flag_disable(bm, e->v2, oflag); - } - } - /* now delete marked face */ - BMO_remove_tagged_faces(bm, oflag); - /* delete marked edge */ - BMO_remove_tagged_edges(bm, oflag); - /* remove loose vertice */ - BMO_remove_tagged_verts(bm, oflag); - - break; - } - case DEL_ALL: - { - /* does this option even belong in here? */ - BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { - BMO_elem_flag_enable(bm, f, oflag); - } - BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { - BMO_elem_flag_enable(bm, e, oflag); - } - BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) { - BMO_elem_flag_enable(bm, v, oflag); - } - - BMO_remove_tagged_faces(bm, oflag); - BMO_remove_tagged_edges(bm, oflag); - BMO_remove_tagged_verts(bm, oflag); - - break; - } - } -} /*************************************************************/ diff --git a/source/blender/bmesh/intern/bmesh_construct.h b/source/blender/bmesh/intern/bmesh_construct.h index e85c97dffd9..12d3a4bd474 100644 --- a/source/blender/bmesh/intern/bmesh_construct.h +++ b/source/blender/bmesh/intern/bmesh_construct.h @@ -44,12 +44,6 @@ BMFace *BM_face_create_ngon_verts(BMesh *bm, BMVert **vert_arr, const int len, BMFace *BM_face_create_ngon_vcloud(BMesh *bm, BMVert **vert_arr, int len, const BMFace *f_example, const eBMCreateFlag create_flag); -void BMO_remove_tagged_faces(BMesh *bm, const short oflag); -void BMO_remove_tagged_edges(BMesh *bm, const short oflag); -void BMO_remove_tagged_verts(BMesh *bm, const short oflag); - -void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type); - void BM_elem_attrs_copy_ex(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v, const char hflag_mask); void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v); diff --git a/source/blender/bmesh/intern/bmesh_delete.c b/source/blender/bmesh/intern/bmesh_delete.c new file mode 100644 index 00000000000..45d95fce546 --- /dev/null +++ b/source/blender/bmesh/intern/bmesh_delete.c @@ -0,0 +1,259 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Geoffrey Bantle. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/bmesh/intern/bmesh_delete.c + * \ingroup bmesh + * + * BM remove functions. + */ + +#include "MEM_guardedalloc.h" + +#include "BLI_utildefines.h" + +#include "bmesh.h" +#include "intern/bmesh_private.h" + +/** + * Called by operators to remove elements that they have marked for + * removal. + */ +void BMO_remove_tagged_faces(BMesh *bm, const short oflag) +{ + BMFace *f, *f_next; + BMIter iter; + + BM_ITER_MESH_MUTABLE (f, f_next, &iter, bm, BM_FACES_OF_MESH) { + if (BMO_elem_flag_test(bm, f, oflag)) { + BM_face_kill(bm, f); + } + } +} + +void BMO_remove_tagged_edges(BMesh *bm, const short oflag) +{ + BMEdge *e, *e_next; + BMIter iter; + + BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) { + if (BMO_elem_flag_test(bm, e, oflag)) { + BM_edge_kill(bm, e); + } + } +} + +void BMO_remove_tagged_verts(BMesh *bm, const short oflag) +{ + BMVert *v, *v_next; + BMIter iter; + + BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { + if (BMO_elem_flag_test(bm, v, oflag)) { + BM_vert_kill(bm, v); + } + } +} + +/** + * you need to make remove tagged verts/edges/faces + * api functions that take a filter callback..... + * and this new filter type will be for opstack flags. + * This is because the BM_remove_taggedXXX functions bypass iterator API. + * - Ops don't care about 'UI' considerations like selection state, hide state, etc. + * If you want to work on unhidden selections for instance, + * copy output from a 'select context' operator to another operator.... + */ + +static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag) +{ + BMVert *v; + BMEdge *e; + BMFace *f; + + BMIter iter; + BMIter itersub; + + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + if (BMO_elem_flag_test(bm, v, oflag)) { + /* Visit edge */ + BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) { + BMO_elem_flag_enable(bm, e, oflag); + } + /* Visit face */ + BM_ITER_ELEM (f, &itersub, v, BM_FACES_OF_VERT) { + BMO_elem_flag_enable(bm, f, oflag); + } + } + } + + BMO_remove_tagged_faces(bm, oflag); + BMO_remove_tagged_edges(bm, oflag); + BMO_remove_tagged_verts(bm, oflag); +} + +static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag) +{ + BMEdge *e; + BMFace *f; + + BMIter iter; + BMIter itersub; + + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { + if (BMO_elem_flag_test(bm, e, oflag)) { + BM_ITER_ELEM (f, &itersub, e, BM_FACES_OF_EDGE) { + BMO_elem_flag_enable(bm, f, oflag); + } + } + } + BMO_remove_tagged_faces(bm, oflag); + BMO_remove_tagged_edges(bm, oflag); +} + +#define DEL_WIREVERT (1 << 10) + +/** + * \warning oflag applies to different types in some contexts, + * not just the type being removed. + * + * \warning take care, uses operator flag DEL_WIREVERT + */ +void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type) +{ + BMVert *v; + BMEdge *e; + BMFace *f; + + BMIter viter; + BMIter eiter; + BMIter fiter; + + switch (type) { + case DEL_VERTS: + { + bmo_remove_tagged_context_verts(bm, oflag); + + break; + } + case DEL_EDGES: + { + /* flush down to vert */ + BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { + if (BMO_elem_flag_test(bm, e, oflag)) { + BMO_elem_flag_enable(bm, e->v1, oflag); + BMO_elem_flag_enable(bm, e->v2, oflag); + } + } + bmo_remove_tagged_context_edges(bm, oflag); + /* remove loose vertice */ + BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) { + if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e))) + BMO_elem_flag_enable(bm, v, DEL_WIREVERT); + } + BMO_remove_tagged_verts(bm, DEL_WIREVERT); + + break; + } + case DEL_EDGESFACES: + { + bmo_remove_tagged_context_edges(bm, oflag); + + break; + } + case DEL_ONLYFACES: + { + BMO_remove_tagged_faces(bm, oflag); + + break; + } + case DEL_ONLYTAGGED: + { + BMO_remove_tagged_faces(bm, oflag); + BMO_remove_tagged_edges(bm, oflag); + BMO_remove_tagged_verts(bm, oflag); + + break; + } + case DEL_FACES: + { + /* go through and mark all edges and all verts of all faces for delete */ + BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { + if (BMO_elem_flag_test(bm, f, oflag)) { + for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) + BMO_elem_flag_enable(bm, e, oflag); + for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) + BMO_elem_flag_enable(bm, v, oflag); + } + } + /* now go through and mark all remaining faces all edges for keeping */ + BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { + if (!BMO_elem_flag_test(bm, f, oflag)) { + for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) { + BMO_elem_flag_disable(bm, e, oflag); + } + for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) { + BMO_elem_flag_disable(bm, v, oflag); + } + } + } + /* also mark all the vertices of remaining edges for keeping */ + BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { + if (!BMO_elem_flag_test(bm, e, oflag)) { + BMO_elem_flag_disable(bm, e->v1, oflag); + BMO_elem_flag_disable(bm, e->v2, oflag); + } + } + /* now delete marked face */ + BMO_remove_tagged_faces(bm, oflag); + /* delete marked edge */ + BMO_remove_tagged_edges(bm, oflag); + /* remove loose vertice */ + BMO_remove_tagged_verts(bm, oflag); + + break; + } + case DEL_ALL: + { + /* does this option even belong in here? */ + BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) { + BMO_elem_flag_enable(bm, f, oflag); + } + BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) { + BMO_elem_flag_enable(bm, e, oflag); + } + BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) { + BMO_elem_flag_enable(bm, v, oflag); + } + + BMO_remove_tagged_faces(bm, oflag); + BMO_remove_tagged_edges(bm, oflag); + BMO_remove_tagged_verts(bm, oflag); + + break; + } + } +} diff --git a/source/blender/bmesh/intern/bmesh_delete.h b/source/blender/bmesh/intern/bmesh_delete.h new file mode 100644 index 00000000000..5e9134d0f5e --- /dev/null +++ b/source/blender/bmesh/intern/bmesh_delete.h @@ -0,0 +1,36 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Geoffrey Bantle. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __BMESH_DELETE_H__ +#define __BMESH_DELETE_H__ + +/** \file blender/bmesh/intern/bmesh_delete.h + * \ingroup bmesh + */ + +void BMO_remove_tagged_faces(BMesh *bm, const short oflag); +void BMO_remove_tagged_edges(BMesh *bm, const short oflag); +void BMO_remove_tagged_verts(BMesh *bm, const short oflag); + +void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type); + +#endif /* __BMESH_DELETE_H__ */ |