Revision: 41908
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41908
Author:   campbellbarton
Date:     2011-11-16 12:38:40 +0000 (Wed, 16 Nov 2011)
Log Message:
-----------
prepare for flagging the bmesh has having invalid index values, so we can skip 
looping over all elements if its already valid.

- went over every BM_SetIndex call and added comments about its use, if its 
setting dirty values or correct ones.
- replace loops over all elements _just_ to set index values, with a new 
function, BM_ElemIndex_Ensure(...), this will eventually only initialize values 
when they are dirty.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/bmesh/operators/createops.c
    branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/bmesh/operators/mirror.c
    branches/bmesh/blender/source/blender/bmesh/operators/removedoubles.c
    branches/bmesh/blender/source/blender/bmesh/operators/utils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
    branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
    branches/bmesh/blender/source/blender/editors/mesh/meshtools.c
    branches/bmesh/blender/source/blender/editors/object/object_vgroup.c
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c
    
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
    branches/bmesh/blender/source/blender/editors/util/crazyspace.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_array.c

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-16 12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2011-11-16 12:38:40 UTC (rev 41908)
@@ -1997,11 +1997,6 @@
        /*add tesselation mface layers*/
        CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, 
em->tottri);
 
-       /* set vert index */
-       eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
-       for (i=0; eve; eve=BMIter_Step(&iter), i++)
-               BM_SetIndex(eve, i);
-
        index = dm->getVertDataArray(dm, CD_ORIGINDEX);
 
        eve = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
@@ -2010,7 +2005,7 @@
 
                copy_v3_v3(mv->co, eve->co);
 
-               BM_SetIndex(eve, i);
+               BM_SetIndex(eve, i); /* set_inline */
 
                normal_float_to_short_v3(mv->no, eve->no);
 
@@ -2023,13 +2018,14 @@
 
                CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, 
eve->head.data, i);
        }
+       bm->elem_index_dirty &= ~BM_VERT;
 
        index = dm->getEdgeDataArray(dm, CD_ORIGINDEX);
        eed = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL);
        for (i=0; eed; eed=BMIter_Step(&iter), i++, index++) {
                MEdge *med = &medge[i];
 
-               BM_SetIndex(eed, i);
+               BM_SetIndex(eed, i); /* set_inline */
 
                med->v1 = BM_GetIndex(eed->v1);
                med->v2 = BM_GetIndex(eed->v2);
@@ -2044,11 +2040,9 @@
                CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, 
eed->head.data, i);
                if (add_orig) *index = i;
        }
+       bm->elem_index_dirty &= ~BM_EDGE;
 
-       efa = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
-       for (i=0; efa; i++, efa=BMIter_Step(&iter)) {
-               BM_SetIndex(efa, i);
-       }
+       BM_ElemIndex_Ensure(em->bm, BM_FACE);
 
        polyindex = dm->getTessFaceDataArray(dm, CD_POLYINDEX);
        index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c  
2011-11-16 12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c  
2011-11-16 12:38:40 UTC (rev 41908)
@@ -402,10 +402,7 @@
                BMVert *eve;
                BMIter viter;
 
-               eve = BMIter_New(&viter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&viter), i++) {
-                       BM_SetIndex(eve, i);
-               }
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT);
 
                eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL);
                for(i=0; eed; i++,eed=BMIter_Step(&iter))
@@ -428,13 +425,8 @@
        int i;
        
        if (bmdm->vertexCos) {
-               BMVert *eve;
-               BMIter viter;
 
-               eve = BMIter_New(&viter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&viter), i++) {
-                       BM_SetIndex(eve, i);
-               }
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT);
 
                glBegin(GL_LINES);
                eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL);
@@ -472,11 +464,8 @@
        int i;
 
        if (bmdm->vertexCos) {
-               BMVert *eve;
 
-               eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&iter), i++)
-                       BM_SetIndex(eve, i);
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT);
 
                glBegin(GL_LINES);
                eed = BMIter_New(&iter, bmdm->tc->bm, BM_EDGES_OF_MESH, NULL);
@@ -581,9 +570,7 @@
        int i;
 
        if (bmdm->vertexCos) {
-               eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&iter), i++)
-                       BM_SetIndex(eve, i);
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT);
        }
 
        efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL);
@@ -620,16 +607,9 @@
                float (*vertexCos)[3]= bmdm->vertexCos;
                float (*vertexNos)[3]= bmdm->vertexNos;
                float (*faceNos)[3]=   bmdm->faceNos;
-               BMVert *eve;
                
-               eve = BMIter_New(&iter, bmdm->tc->bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&iter), i++)
-                       BM_SetIndex(eve, i);
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT | BM_FACE);
 
-               efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL);
-               for (i=0; efa; efa=BMIter_Step(&iter), i++)
-                       BM_SetIndex(efa, i);
-
                for (i=0; i<bmdm->tc->tottri; i++) {
                        BMLoop **l = bmdm->tc->looptris[i];
                        int drawSmooth;
@@ -694,9 +674,7 @@
                        }
                }
        } else {
-               efa = BMIter_New(&iter, bmdm->tc->bm, BM_FACES_OF_MESH, NULL);
-               for (i=0; efa; efa=BMIter_Step(&iter), i++)
-                       BM_SetIndex(efa, i);
+               BM_ElemIndex_Ensure(bmdm->tc->bm, BM_FACE);
 
                for (i=0; i<bmdm->tc->tottri; i++) {
                        BMLoop **l = bmdm->tc->looptris[i];
@@ -809,16 +787,12 @@
 
        /* always use smooth shading even for flat faces, else vertex colors 
wont interpolate */
        glShadeModel(GL_SMOOTH);
-       
-       i = 0;
-       BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL)
-               BM_SetIndex(efa, i++);
 
+       BM_ElemIndex_Ensure(bm, BM_FACE);
+
        if (vertexCos) {
-               i = 0;
-               BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL)
-                       BM_SetIndex(eve, i++);
-                               
+               BM_ElemIndex_Ensure(bm, BM_VERT);
+
                glBegin(GL_TRIANGLES);
                for (i=0; i<em->tottri; i++) {
                        BMLoop **ls = em->looptris[i];
@@ -891,10 +865,8 @@
                }
                glEnd();
        } else {
-               i = 0;
-               BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL)
-                       BM_SetIndex(eve, i++);
-                               
+               BM_ElemIndex_Ensure(bm, BM_VERT);
+
                for (i=0; i<em->tottri; i++) {
                        BMLoop **ls = em->looptris[i];
                        MTexPoly *tp= CustomData_bmesh_get(&bm->pdata, 
ls[0]->f->head.data, CD_MTEXPOLY);
@@ -1022,9 +994,7 @@
 
        /* always use smooth shading even for flat faces, else vertex colors 
wont interpolate */
        glShadeModel(GL_SMOOTH);
-       BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
-                BM_SetIndex(eve, i);
-       }
+       BM_ElemIndex_Ensure(bm, BM_VERT | BM_FACE);
 
 #define PASSATTRIB(loop, eve, vert) {                                          
                                        \
        if(attribs.totorco) {                                                   
                                                        \
@@ -1047,9 +1017,6 @@
        }                                                                       
                                                                                
\
        }
        
-       BM_ITER_INDEX(efa, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
-               BM_SetIndex(efa, i);
-       }
        
        for (i=0, ltri=em->looptris[0]; i<em->tottri; i++, ltri += 3) {
                int drawSmooth;
@@ -1150,9 +1117,7 @@
        /* always use smooth shading even for flat faces, else vertex colors 
wont interpolate */
        glShadeModel(GL_SMOOTH);
 
-       BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
-                BM_SetIndex(eve, i);
-       }
+       BM_ElemIndex_Ensure(bm, BM_VERT);
 
 #define PASSATTRIB(loop, eve, vert) {                                          
                                        \
        if(attribs.totorco) {                                                   
                                                        \
@@ -1405,12 +1370,9 @@
        BMIter iter;
        BMVert *ev;
        int has_bweight = CustomData_has_layer(&bm->edata, CD_BWEIGHT);
-       int i, has_crease = CustomData_has_layer(&bm->edata, CD_CREASE);
+       int has_crease = CustomData_has_layer(&bm->edata, CD_CREASE);
 
-       /* store vertex indices in tmp union */
-       ev = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
-       for (i=0; ev; ev=BMIter_Step(&iter), i++)
-               BM_SetIndex(ev, i);
+       BM_ElemIndex_Ensure(bm, BM_VERT);
 
        ee = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL);
        for( ; ee; ee=BMIter_Step(&iter), edge_r++) {
@@ -1439,10 +1401,7 @@
        BMLoop **l;
        int i;
 
-       /* store vertexes indices in tmp union */
-       i = 0;
-       BM_ITER(ev, &iter, bm, BM_VERTS_OF_MESH, NULL)
-               BM_SetIndex(ev, i++);
+       BM_ElemIndex_Ensure(bmdm->tc->bm, BM_VERT);
 
        for (i=0; i<bmdm->tc->tottri; i++, face_r++) {
                l = bmdm->tc->looptris[i];
@@ -1467,22 +1426,11 @@
        /* EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; */ /* UNUSED */
        BMesh *bm = ((EditDerivedBMesh *)dm)->tc->bm;
        BMIter iter, liter;
-       BMVert *v;
        BMFace *f;
        BMLoop *l;
-       BMEdge *e;
-       int i;
 
-       i = 0;
-       BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
-               BM_SetIndex(v, i++);
-       }
+       BM_ElemIndex_Ensure(bm, BM_VERT | BM_EDGE);
 
-       i = 0;
-       BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
-               BM_SetIndex(e, i++);
-       }
-
        BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
                BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
                        loop_r->v = BM_GetIndex(l->v);
@@ -1714,12 +1662,10 @@
                BMIter iter;
                int totface = bmdm->tc->tottri;
                int i;
-               
-               eve=BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL);
-               for (i=0; eve; eve=BMIter_Step(&iter), i++)
-                       BM_SetIndex(eve, i);
 
-               bmdm->vertexNos = MEM_callocN(sizeof(*bmdm->vertexNos)*i, 
"bmdm_vno");
+               BM_ElemIndex_Ensure(bm, BM_VERT);
+
+               bmdm->vertexNos = MEM_callocN(sizeof(*bmdm->vertexNos) * 
bm->totvert, "bmdm_vno");
                bmdm->faceNos = MEM_mallocN(sizeof(*bmdm->faceNos)*totface, 
"bmdm_vno");
 
                for (i=0; i<bmdm->tc->tottri; i++) {

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-11-16 12:27:24 UTC 
(rev 41907)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2011-11-16 12:38:40 UTC 
(rev 41908)
@@ -154,6 +154,31 @@
 /*stuff for dealing BM_ToggleHFlag header flags*/
 BM_INLINE void BM_ToggleHFlag(void *element, const char hflag);
 BM_INLINE void BM_MergeHFlag(void *element_a, void *element_b);
+
+/* notes on BM_SetIndex(...) usage,
+ * Set index is sometimes abused as temp storage, other times we cant be
+ * sure if the index values are valid because certain operations have modified
+ * the mesh structure.
+ *
+ * To set the elements to valid indicies 'BM_ElemIndex_Ensure' should be used
+ * rather then adding inline loops, however there are cases where we still
+ * set the index directly
+ *
+ * In an attempt to manage this, here are 3 tags Im adding to uses of
+ * 'BM_SetIndex'
+ *
+ * - 'set_inline'  -- since the data is already being looped over set to a
+ *                    valid value inline.
+ *
+ * - 'set_dirty!'  -- intentionally sets the index to an invalid value,
+ *                    flagging 'bm->elem_index_dirty' so we dont use it.
+ *
+ * - 'set_ok'      -- this is valid use since the part of the code is low 
level.
+ *
+ * - 'set_loop'    -- currently loop index values are not used used much so
+ *                    assume each case they are dirty.
+ * - campbell */
+
 BM_INLINE void BM_SetIndex(void *element, const int index);
 BM_INLINE int BM_GetIndex(const void *element);
 

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h   2011-11-16 
12:27:24 UTC (rev 41907)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_class.h   2011-11-16 
12:38:40 UTC (rev 41908)
@@ -123,6 +123,12 @@
 typedef struct BMesh {
        int totvert, totedge, totloop, totface;
        int totvertsel, totedgesel, totfacesel;
+
+       /* flag index arrays as being dirty so we can check if they are clean 
and

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to