Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-02-24 09:56:06 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-24 09:56:06 +0400
commit6b85b96952becb00c6ad1ec185a9ac229a3ea344 (patch)
treeebad6e50b1fef40754df90a0590153155273b4cf /source/blender/bmesh
parentb9b0c3dfb44e929b4b9f7181e8ee16ea7cff8deb (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.h2
-rw-r--r--source/blender/bmesh/bmesh_iterators.h9
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators.c18
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c14
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);
}