diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-24 09:56:06 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-24 09:56:06 +0400 |
commit | 6b85b96952becb00c6ad1ec185a9ac229a3ea344 (patch) | |
tree | ebad6e50b1fef40754df90a0590153155273b4cf /source/blender/bmesh | |
parent | b9b0c3dfb44e929b4b9f7181e8ee16ea7cff8deb (diff) |
bmesh py api (some api changes and doc additions)
* remove 'select' and 'hide' from BMLoop
* remove BMesh.update
* add BMesh.normal_update(skip_hidden=False)
* add BMElemSet.index_update(), eg: bm.verts.index_update()
bmesh api
* BM_mesh_normals_update() now takes skip_hidden as an argument
(previously this was default behavior), however this isnt good when
using BMesh modifiers, where you want all normals to be recalculated.
* add bm_iter_itype_htype_map[], to get the iter type from a BMesh
iterator.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/bmesh.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/bmesh_iterators.h | 9 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators.c | 18 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mesh.c | 14 |
4 files changed, 34 insertions, 9 deletions
diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 4535e7b8c58..dab70ac35bf 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -123,7 +123,7 @@ void BM_mesh_free(BMesh *bm); /* frees mesh, but not actual BMesh struct */ void BM_mesh_data_free(BMesh *bm); -void BM_mesh_normals_update(BMesh *bm); +void BM_mesh_normals_update(BMesh *bm, const short skip_hidden); /* Construction */ BMVert *BM_vert_create(BMesh *bm, const float co[3], const BMVert *example); diff --git a/source/blender/bmesh/bmesh_iterators.h b/source/blender/bmesh/bmesh_iterators.h index 08da4f9a949..ccbed3ecd01 100644 --- a/source/blender/bmesh/bmesh_iterators.h +++ b/source/blender/bmesh/bmesh_iterators.h @@ -49,7 +49,9 @@ */ /* these iterator over all elements of a specific - * type in the mesh.*/ + * type in the mesh. + * + * be sure to keep 'bm_iter_itype_htype_map' in sync with any changes */ typedef enum BMIterType { BM_VERTS_OF_MESH = 1, BM_EDGES_OF_MESH = 2, @@ -74,6 +76,11 @@ typedef enum BMIterType { BM_LOOPS_OF_EDGE = 14 } BMIterType; +#define BM_ITYPE_MAX 15 + +/* the iterator htype for each iterator */ +extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX]; + #define BM_ITER(ele, iter, bm, itype, data) \ ele = BM_iter_new(iter, bm, itype, data); \ diff --git a/source/blender/bmesh/intern/bmesh_iterators.c b/source/blender/bmesh/intern/bmesh_iterators.c index 281f42300ff..fb63ab36ef5 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.c +++ b/source/blender/bmesh/intern/bmesh_iterators.c @@ -32,6 +32,24 @@ #include "bmesh.h" #include "bmesh_private.h" +const char bm_iter_itype_htype_map[BM_ITYPE_MAX] = { + '\0', + BM_VERT, /* BM_VERTS_OF_MESH */ + BM_EDGE, /* BM_EDGES_OF_MESH */ + BM_FACE, /* BM_FACES_OF_MESH */ + BM_EDGE, /* BM_EDGES_OF_VERT */ + BM_FACE, /* BM_FACES_OF_VERT */ + BM_LOOP, /* BM_LOOPS_OF_VERT */ + BM_VERT, /* BM_VERTS_OF_EDGE */ + BM_FACE, /* BM_FACES_OF_EDGE */ + BM_VERT, /* BM_VERTS_OF_FACE */ + BM_EDGE, /* BM_EDGES_OF_FACE */ + BM_LOOP, /* BM_LOOPS_OF_FACE */ + BM_LOOP, /* BM_ALL_LOOPS_OF_FACE */ + BM_LOOP, /* BM_LOOPS_OF_LOOP */ + BM_LOOP /* BM_LOOPS_OF_EDGE */ +}; + /* * note, we have BM_vert_at_index/BM_edge_at_index/BM_face_at_index for arrays */ diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index a378ddaeabb..9621e593f3a 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -208,7 +208,7 @@ void BM_mesh_free(BMesh *bm) * */ -void BM_mesh_normals_update(BMesh *bm) +void BM_mesh_normals_update(BMesh *bm, const short skip_hidden) { BMVert *v; BMFace *f; @@ -225,7 +225,7 @@ void BM_mesh_normals_update(BMesh *bm) /* first, find out the largest face in mesh */ BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) { - if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) + if (skip_hidden && BM_elem_flag_test(f, BM_ELEM_HIDDEN)) continue; if (f->len > maxlength) maxlength = f->len; @@ -239,7 +239,7 @@ void BM_mesh_normals_update(BMesh *bm) /* calculate all face normals */ BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) { - if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) + if (skip_hidden && BM_elem_flag_test(f, BM_ELEM_HIDDEN)) continue; #if 0 /* UNUSED */ if (f->head.flag & BM_NONORMCALC) @@ -251,7 +251,7 @@ void BM_mesh_normals_update(BMesh *bm) /* Zero out vertex normals */ BM_ITER(v, &verts, bm, BM_VERTS_OF_MESH, NULL) { - if (BM_elem_flag_test(v, BM_ELEM_HIDDEN)) + if (skip_hidden && BM_elem_flag_test(v, BM_ELEM_HIDDEN)) continue; zero_v3(v->no); @@ -280,7 +280,7 @@ void BM_mesh_normals_update(BMesh *bm) /* add weighted face normals to vertices */ BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) { - if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) + if (skip_hidden && BM_elem_flag_test(f, BM_ELEM_HIDDEN)) continue; BM_ITER(l, &loops, bm, BM_LOOPS_OF_FACE, f) { @@ -310,7 +310,7 @@ void BM_mesh_normals_update(BMesh *bm) /* normalize the accumulated vertex normals */ BM_ITER(v, &verts, bm, BM_VERTS_OF_MESH, NULL) { - if (BM_elem_flag_test(v, BM_ELEM_HIDDEN)) + if (skip_hidden && BM_elem_flag_test(v, BM_ELEM_HIDDEN)) continue; if (normalize_v3(v->no) == 0.0f) { @@ -473,7 +473,7 @@ void bmesh_end_edit(BMesh *bm, int flag) bm->opflag = 0; /* compute normals, clear temp flags and flush selections */ - BM_mesh_normals_update(bm); + BM_mesh_normals_update(bm, TRUE); BM_mesh_select_mode_flush(bm); } |