Revision: 53235
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53235
Author:   campbellbarton
Date:     2012-12-21 07:28:14 +0000 (Fri, 21 Dec 2012)
Log Message:
-----------
minor bmesh improvements
- use 2 omp sections for vert -> (edge, face) selection flushing.
- dont use face-loop iterator for cddm_from_bmesh_ex conversion to give some 
speedup (some modifiers use this).
- use float(*)[3] for functions that return coords.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h  2012-12-21 07:24:31 UTC 
(rev 53234)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h  2012-12-21 07:28:14 UTC 
(rev 53235)
@@ -132,7 +132,7 @@
 void BKE_mesh_make_local(struct Mesh *me);
 void BKE_mesh_boundbox_calc(struct Mesh *me, float r_loc[3], float r_size[3]);
 void BKE_mesh_texspace_calc(struct Mesh *me);
-float *BKE_mesh_orco_verts_get(struct Object *ob);
+float (*BKE_mesh_orco_verts_get(struct Object *ob))[3];
 void   BKE_mesh_orco_verts_transform(struct Mesh *me, float (*orco)[3], int 
totvert, int invert);
 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int 
mfindex, int nr);
 struct Mesh *BKE_mesh_from_object(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2012-12-21 07:28:14 UTC (rev 53235)
@@ -857,30 +857,27 @@
        return dm;
 }
 
-static float *get_editbmesh_orco_verts(BMEditMesh *em)
+static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
 {
        BMIter iter;
        BMVert *eve;
-       float *orco;
-       int a, totvert;
+       float (*orco)[3];
+       int i;
 
        /* these may not really be the orco's, but it's only for preview.
         * could be solver better once, but isn't simple */
-
-       totvert = em->bm->totvert;
        
-       orco = MEM_mallocN(sizeof(float) * 3 * totvert, "BMEditMesh Orco");
+       orco = MEM_mallocN(sizeof(float) * 3 * em->bm->totvert, "BMEditMesh 
Orco");
 
-       eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
-       for (a = 0; eve; eve = BM_iter_step(&iter), a += 3) {
-               copy_v3_v3(orco + a, eve->co);
+       BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+               copy_v3_v3(orco[i], eve->co);
        }
        
        return orco;
 }
 
 /* orco custom data layer */
-static void *get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int 
*free)
+static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int 
*free))[3]
 {
        *free = 0;
 
@@ -889,9 +886,9 @@
                *free = 1;
 
                if (em)
-                       return (float(*)[3])get_editbmesh_orco_verts(em);
+                       return get_editbmesh_orco_verts(em);
                else
-                       return (float(*)[3])BKE_mesh_orco_verts_get(ob);
+                       return BKE_mesh_orco_verts_get(ob);
        }
        else if (layer == CD_CLOTH_ORCO) {
                /* apply shape key for cloth, this should really be solved
@@ -1815,17 +1812,18 @@
        BLI_linklist_free((LinkNode *)datamasks, NULL);
 }
 
-float (*editbmesh_get_vertex_cos(BMEditMesh * em, int *numVerts_r))[3]
+float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *numVerts_r))[3]
 {
-       int i, numVerts = *numVerts_r = em->bm->totvert;
-       float (*cos)[3];
        BMIter iter;
        BMVert *eve;
+       float (*cos)[3];
+       int i;
 
-       cos = MEM_mallocN(sizeof(float) * 3 * numVerts, "vertexcos");
+       *numVerts_r = em->bm->totvert;
 
-       eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
-       for (i = 0; eve; eve = BM_iter_step(&iter), i++) {
+       cos = MEM_mallocN(sizeof(float) * 3 * em->bm->totvert, "vertexcos");
+
+       BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
                copy_v3_v3(cos[i], eve->co);
        }
 

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c      
2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c      
2012-12-21 07:28:14 UTC (rev 53235)
@@ -1875,7 +1875,7 @@
                                   bm->totface);
 
        CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
-       BMIter iter, liter;
+       BMIter iter;
        BMVert *eve;
        BMEdge *eed;
        BMFace *efa;
@@ -1913,7 +1913,7 @@
                         CD_CALLOC, dm->numLoopData);
        CustomData_merge(&bm->pdata, &dm->polyData, mask,
                         CD_CALLOC, dm->numPolyData);
-       
+
        /* add tessellation mface layers */
        if (use_tessface) {
                CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, 
&dm->loopData, em_tottri);
@@ -2002,7 +2002,8 @@
        j = 0;
        efa = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL);
        for (i = 0; efa; i++, efa = BM_iter_step(&iter), index++) {
-               BMLoop *l;
+               BMLoop *l_iter;
+               BMLoop *l_first;
                MPoly *mp = &mpoly[i];
 
                BM_elem_index_set(efa, i); /* set_inline */
@@ -2011,15 +2012,16 @@
                mp->flag = BM_face_flag_to_mflag(efa);
                mp->loopstart = j;
                mp->mat_nr = efa->mat_nr;
-               
-               BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-                       mloop->v = BM_elem_index_get(l->v);
-                       mloop->e = BM_elem_index_get(l->e);
-                       CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, 
l->head.data, j);
 
+               l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+               do {
+                       mloop->v = BM_elem_index_get(l_iter->v);
+                       mloop->e = BM_elem_index_get(l_iter->e);
+                       CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, 
l_iter->head.data, j);
+
                        j++;
                        mloop++;
-               }
+               } while ((l_iter = l_iter->next) != l_first);
 
                CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, 
efa->head.data, i);
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c       2012-12-21 
07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c       2012-12-21 
07:28:14 UTC (rev 53235)
@@ -731,7 +731,7 @@
        if (r_size) copy_v3_v3(r_size, me->size);
 }
 
-float *BKE_mesh_orco_verts_get(Object *ob)
+float (*BKE_mesh_orco_verts_get(Object *ob))[3]
 {
        Mesh *me = ob->data;
        MVert *mvert = NULL;
@@ -748,7 +748,7 @@
                copy_v3_v3(vcos[a], mvert->co);
        }
 
-       return (float *)vcos;
+       return vcos;
 }
 
 void BKE_mesh_orco_verts_transform(Mesh *me, float (*orco)[3], int totvert, 
int invert)

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c   2012-12-21 
07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c   2012-12-21 
07:28:14 UTC (rev 53235)
@@ -86,41 +86,50 @@
        BMIter eiter;
        BMIter fiter;
 
-       int ok;
-
        if (selectmode & SCE_SELECT_VERTEX) {
-               BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
-                       if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
-                           BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
-                           !BM_elem_flag_test(e, BM_ELEM_HIDDEN))
+               /* both loops only set edge/face flags and read off verts */
+#pragma omp parallel sections if (bm->totedge + bm->totface >= BM_OMP_LIMIT)
+               {
+#pragma omp section
                        {
-                               BM_elem_flag_enable(e, BM_ELEM_SELECT);
+                               BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+                                       if (BM_elem_flag_test(e->v1, 
BM_ELEM_SELECT) &&
+                                               BM_elem_flag_test(e->v2, 
BM_ELEM_SELECT) &&
+                                               !BM_elem_flag_test(e, 
BM_ELEM_HIDDEN))
+                                       {
+                                               BM_elem_flag_enable(e, 
BM_ELEM_SELECT);
+                                       }
+                                       else {
+                                               BM_elem_flag_disable(e, 
BM_ELEM_SELECT);
+                                       }
+                               }
                        }
-                       else {
-                               BM_elem_flag_disable(e, BM_ELEM_SELECT);
-                       }
-               }
-               BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
-                       ok = TRUE;
-                       if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
-                               l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-                               do {
-                                       if (!BM_elem_flag_test(l_iter->v, 
BM_ELEM_SELECT)) {
+#pragma omp section
+                       {
+                               BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
+                                       int ok = TRUE;
+                                       if (!BM_elem_flag_test(f, 
BM_ELEM_HIDDEN)) {
+                                               l_iter = l_first = 
BM_FACE_FIRST_LOOP(f);
+                                               do {
+                                                       if 
(!BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT)) {
+                                                               ok = FALSE;
+                                                               break;
+                                                       }
+                                               } while ((l_iter = 
l_iter->next) != l_first);
+                                       }
+                                       else {
                                                ok = FALSE;
-                                               break;
                                        }
-                               } while ((l_iter = l_iter->next) != l_first);
+
+                                       BM_elem_flag_set(f, BM_ELEM_SELECT, ok);
+                               }
                        }
-                       else {
-                               ok = FALSE;
-                       }
-
-                       BM_elem_flag_set(f, BM_ELEM_SELECT, ok);
                }
+               /* end sections */
        }
        else if (selectmode & SCE_SELECT_EDGE) {
                BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
-                       ok = TRUE;
+                       int ok = TRUE;
                        if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
                                l_iter = l_first = BM_FACE_FIRST_LOOP(f);
                                do {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to