Revision: 37463
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37463
Author:   joeedh
Date:     2011-06-14 03:16:08 +0000 (Tue, 14 Jun 2011)
Log Message:
-----------
=bmesh=

Removed the DerivedMesh face iterators (they sucked).
This should make subsurf faster.  Also sped up multires
a bit (not sure if it's strictly correct, need to look
at it later).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/multires.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
    branches/bmesh/blender/source/blender/editors/mesh/editface.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/sculpt.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2011-06-14 03:16:08 UTC (rev 37463)
@@ -104,43 +104,6 @@
       Also, the mface origindex layer indexes mpolys, not mfaces.
 */
 
-/*DM Iterators.  For now, first implement face iterators.
-  These are read-only, at least for now.*/
-
-typedef struct DMLoopIter {
-       void (*step)(void *self);
-       int done;
-
-       int index, vindex, eindex;
-       MVert v; /*copy of the associated vert's data*/ 
-
-       /*note: if layer is -1, then the active layer is retrieved.
-         loop refers to per-face-vertex data.*/
-       void *(*getLoopCDData)(void *self, int type, int layer);
-       void *(*getVertCDData)(void *self, int type, int layer);
-} DMLoopIter;
-
-typedef struct DMFaceIter {
-       void (*step)(void *self);
-       void (*free)(void *self);
-       int done;
-
-       int index;
-       int len;
-
-       /*you can set mat_nr and flags, and the backends 
-         must detect and update the internal faces*/
-       int mat_nr;
-       int flags;
-
-       /*note: you may only use one
-         loop iterator at a time.*/
-       DMLoopIter *(*getLoopsIter)(void *self);
-
-       /*if layer is -1, returns active layer*/
-       void *(*getCDData)(void *self, int type, int layer);
-} DMFaceIter;
-
 typedef struct DMGridData {
        float co[3];
        float no[3];
@@ -170,9 +133,6 @@
 
        /* Misc. Queries */
        
-       /*face iterator.  initializes iter.*/
-       DMFaceIter *(*newFaceIter)(DerivedMesh *dm);
-
        /*recalculates mesh tesselation*/
        void (*recalcTesselation)(DerivedMesh *dm);
 
@@ -199,6 +159,8 @@
        struct MVert *(*getVertArray)(DerivedMesh *dm);
        struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
        struct MFace *(*getTessFaceArray)(DerivedMesh *dm);
+       struct MLoop *(*getLoopArray)(DerivedMesh *dm);
+       struct MPoly *(*getPolyArray)(DerivedMesh *dm);
 
        /* copy all verts/edges/faces from the derived mesh into
         * *{vert/edge/face}_r (must point to a buffer large enough)
@@ -206,6 +168,8 @@
        void (*copyVertArray)(DerivedMesh *dm, struct MVert *vert_r);
        void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
        void (*copyTessFaceArray)(DerivedMesh *dm, struct MFace *face_r);
+               void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *loop_r);
+               void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *poly_r);
 
        /* return a copy of all verts/edges/faces from the derived mesh
         * it is the caller's responsibility to free the returned pointer
@@ -213,6 +177,8 @@
        struct MVert *(*dupVertArray)(DerivedMesh *dm);
        struct MEdge *(*dupEdgeArray)(DerivedMesh *dm);
        struct MFace *(*dupTessFaceArray)(DerivedMesh *dm);
+               struct MLoop *(*dupLoopArray)(DerivedMesh *dm);
+               struct MPoly *(*dupPolyArray)(DerivedMesh *dm);
 
        /* return a pointer to a single element of vert/edge/face custom data
         * from the derived mesh (this gives a pointer to the actual data, not

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2011-06-14 03:16:08 UTC (rev 37463)
@@ -125,6 +125,34 @@
        return mface;
 }
 
+static MLoop *dm_getLoopArray(DerivedMesh *dm)
+{
+       MLoop *mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+
+       if (!mloop) {
+               mloop = CustomData_add_layer(&dm->loopData, CD_MLOOP, 
CD_CALLOC, NULL,
+                       dm->numLoopData);
+               CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, 
CD_FLAG_TEMPORARY);
+               dm->copyLoopArray(dm, mloop);
+       }
+
+       return mloop;
+}
+
+static MPoly *dm_getPolyArray(DerivedMesh *dm)
+{
+       MPoly *mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+
+       if (!mpoly) {
+               mpoly = CustomData_add_layer(&dm->polyData, CD_MPOLY, 
CD_CALLOC, NULL,
+                       dm->getNumFaces(dm));
+               CustomData_set_layer_flag(&dm->polyData, CD_MPOLY, 
CD_FLAG_TEMPORARY);
+               dm->copyPolyArray(dm, mpoly);
+       }
+
+       return mpoly;
+}
+
 static MVert *dm_dupVertArray(DerivedMesh *dm)
 {
        MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm),
@@ -155,6 +183,26 @@
        return tmp;
 }
 
+static MLoop *dm_dupLoopArray(DerivedMesh *dm)
+{
+       MLoop *tmp = MEM_callocN(sizeof(*tmp) * dm->numLoopData,
+                                                        "dm_dupLoopArray tmp");
+
+       if(tmp) dm->copyLoopArray(dm, tmp);
+
+       return tmp;
+}
+
+static MPoly *dm_dupPolyArray(DerivedMesh *dm)
+{
+       MPoly *tmp = MEM_callocN(sizeof(*tmp) * dm->numFaceData,
+                                                        "dm_dupPolyArray tmp");
+
+       if(tmp) dm->copyPolyArray(dm, tmp);
+
+       return tmp;
+}
+
 static CustomData *dm_getVertCData(DerivedMesh *dm)
 {
        return &dm->vertData;
@@ -186,9 +234,13 @@
        dm->getVertArray = dm_getVertArray;
        dm->getEdgeArray = dm_getEdgeArray;
        dm->getTessFaceArray = dm_getFaceArray;
+       dm->getLoopArray = dm_getLoopArray;
+       dm->getPolyArray = dm_getPolyArray;
        dm->dupVertArray = dm_dupVertArray;
        dm->dupEdgeArray = dm_dupEdgeArray;
        dm->dupTessFaceArray = dm_dupFaceArray;
+       dm->dupLoopArray = dm_dupLoopArray;
+       dm->dupPolyArray = dm_dupPolyArray;
 
        dm->getVertDataLayout = dm_getVertCData;
        dm->getEdgeDataLayout = dm_getEdgeCData;
@@ -272,105 +324,29 @@
        }
 }
 
-static void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, 
DerivedMesh *dm, int totloop)
+void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
 {
-       DMFaceIter *iter = dm->newFaceIter(dm);
-       DMLoopIter *liter;
-       CustomData *oldata, *opdata;
-       MPoly *mpoly;
-       MLoop *mloop;
-       int p, l, i, j, lasttype;
+       CustomData_copy(&source->loopData, &target->loopData, 
CD_MASK_DERIVEDMESH, CD_CALLOC, source->numLoopData);
+       CustomData_copy(&source->polyData, &target->polyData, 
CD_MASK_DERIVEDMESH, CD_CALLOC, source->numPolyData);
 
-       oldata = dm->getLoopDataLayout(dm);
-       opdata = dm->getFaceDataLayout(dm);
+       target->numLoopData = source->numLoopData;
+       target->numPolyData = source->numPolyData;
 
-       CustomData_copy(oldata, ldata, CD_MASK_DERIVEDMESH, CD_CALLOC, totloop);
-       CustomData_copy(opdata, pdata, CD_MASK_DERIVEDMESH, CD_CALLOC, 
dm->getNumFaces(dm));
+       if (!CustomData_has_layer(&target->polyData, CD_MPOLY)) {
+               MPoly *mpoly;
+               MLoop *mloop;
 
-       mloop = MEM_callocN(sizeof(MLoop)*totloop, "MLoop from 
dm_add_polys_from_iter");
-       CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop);
-       mpoly = MEM_callocN(sizeof(MPoly)*dm->getNumFaces(dm), "MPoly from 
dm_add_polys_from_iter");
-       CustomData_add_layer(pdata, CD_MPOLY, CD_ASSIGN, mpoly, 
dm->getNumFaces(dm));
-
-       l = 0;
-       for (p=0; !iter->done; iter->step(iter), mpoly++, p++) {
-               mpoly->flag = iter->flags;
-               mpoly->loopstart = l;
-               mpoly->totloop = iter->len;
-               mpoly->mat_nr = iter->mat_nr;
-               
-               j = 0;
-               lasttype = -1;
-               for (i=0; i<opdata->totlayer; i++) {
-                       void *e1, *e2;
-
-                       if (opdata->layers[i].type == lasttype)
-                               j++;
-                       else
-                               j = 0;
-
-                       if (opdata->layers[i].type == CD_MPOLY)
-                               continue;
-                       
-                       e1 = iter->getCDData(iter, opdata->layers[i].type, j);
-                       e2 = (char*)CustomData_get_n(pdata, 
opdata->layers[i].type, p, j);
-                       
-                       if (!e2)
-                               continue;
-
-                       CustomData_copy_elements(opdata->layers[i].type, e1, 
e2, 1);
-                       
-                       lasttype = opdata->layers[i].type;                      
        
-               }
-
-               liter = iter->getLoopsIter(iter);
-               for (; !liter->done; liter->step(liter), mloop++, l++) {
-                       mloop->v = liter->vindex;
-                       mloop->e = liter->eindex;
-
-                       j = 0;
-                       lasttype = -1;
-                       for (i=0; i<oldata->totlayer; i++) {
-                               void *e1, *e2;
-
-                               if (oldata->layers[i].type == CD_MLOOP)
-                                       continue;
-                               
-                               if (oldata->layers[i].type == lasttype)
-                                       j++;
-                               else
-                                       j = 0;
-
-                               e1 = liter->getLoopCDData(liter, 
oldata->layers[i].type, j);
-                               e2 = CustomData_get_n(ldata, 
oldata->layers[i].type, l, j);
-                               
-                               if (!e2)
-                                       continue;
-
-                               
CustomData_copy_elements(oldata->layers[i].type, e1, e2, 1);
-                               lasttype = oldata->layers[i].type;              
                
-                       }
-               }
+               mloop = source->dupLoopArray(source);
+               mpoly = source->dupPolyArray(source);
+               CustomData_add_layer(&target->loopData, CD_MLOOP, CD_ASSIGN, 
mloop, source->numLoopData);
+               CustomData_add_layer(&target->polyData, CD_MPOLY, CD_ASSIGN, 
mpoly, source->numPolyData);
        }
-       iter->free(iter);
 }
 
-void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
-{
-       DMFaceIter *iter = source->newFaceIter(source);
-       int totloop = source->numLoopData;
-
-       dm_add_polys_from_iter(&target->loopData, &target->polyData, source, 
totloop);
-
-       target->numLoopData = totloop;
-       target->numPolyData = source->getNumFaces(source);
-}
-
 void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
 {
        /* dm might depend on me, so we need to do everything with a local copy 
*/
        Mesh tmp = *me;
-       DMFaceIter *iter;
        int totvert, totedge, totface, totloop, totpoly;
        int did_shapekeys=0;
        
@@ -384,14 +360,7 @@
        totedge = tmp.totedge = dm->getNumEdges(dm);
        totface = tmp.totface = dm->getNumTessFaces(dm);
        totpoly = tmp.totpoly = dm->getNumFaces(dm);
-       
-       totloop = 0;
-       for (iter=dm->newFaceIter(dm); !iter->done; iter->step(iter)) {
-               totloop += iter->len;
-       }
-       iter->free(iter);
-       
-       tmp.totloop = totloop;
+       totloop = tmp.totloop = dm->numLoopData;
 
        CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, 
totvert);
        CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, 
totedge);
@@ -432,9 +401,14 @@
                CustomData_add_layer(&tmp.edata, CD_MEDGE, CD_ASSIGN, 
dm->dupEdgeArray(dm), totedge);
        if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
                CustomData_add_layer(&tmp.fdata, CD_MFACE, CD_ASSIGN, 
dm->dupTessFaceArray(dm), totface);
-       if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY))
-               dm_add_polys_from_iter(&tmp.ldata, &tmp.pdata, dm, totloop);
+       if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY)) {
+               tmp.mloop = dm->dupLoopArray(dm);
+               tmp.mpoly = dm->dupPolyArray(dm);
 
+               CustomData_add_layer(&tmp.ldata, CD_MLOOP, CD_ASSIGN, 
tmp.mloop, tmp.totloop);
+               CustomData_add_layer(&tmp.pdata, CD_MPOLY, CD_ASSIGN, 
tmp.mpoly, tmp.totpoly);
+       }
+
        /* object had got displacement layer, should copy this layer to save 
sculpted data */
        /* NOTE: maybe some other layers should be copied? nazgul */
        if(CustomData_has_layer(&me->ldata, CD_MDISPS)) {
@@ -455,7 +429,7 @@
        /*  ok, this should now use new CD shapekey data,
            which shouuld be fed through the modifier 
                stack*/
-       if(tmp.totvert != me->totvert && !did_shapekeys) {
+       if(tmp.totvert != me->totvert && !did_shapekeys && me->key) {

@@ 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