Revision: 43141
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43141
Author:   campbellbarton
Date:     2012-01-04 20:11:08 +0000 (Wed, 04 Jan 2012)
Log Message:
-----------
convert screw modifier to create MPolys rather then MFaces

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_screw.c

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_screw.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_screw.c  
2012-01-04 19:18:11 UTC (rev 43140)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_screw.c  
2012-01-04 20:11:08 UTC (rev 43141)
@@ -132,6 +132,23 @@
        tltmd->iter= sltmd->iter;
 }
 
+#if 0
+static int findEd(MEdge *medge_new, int toted, int v1, int v2)
+{
+       int i;
+
+       for (i = 0; i < toted; i++) {
+               if ( (medge_new[i].v1 == v1 && medge_new[i].v2 == v2) ||
+                    (medge_new[i].v1 == v2 && medge_new[i].v2 == v1) )
+               {
+                       return i;
+               }
+       }
+
+       return -1;
+}
+#endif
+
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                                                DerivedMesh *derivedData,
                                                int useRenderParams,
@@ -142,13 +159,13 @@
        ScrewModifierData *ltmd= (ScrewModifierData*) md;
        
        int *origindex;
-       int mface_index=0;
+       int mpoly_index=0;
        int step;
        int i, j;
        unsigned int i1, i2;
        int step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
        const int do_flip = ltmd->flag & MOD_SCREW_NORMAL_FLIP ? 1 : 0;
-       int maxVerts=0, maxEdges=0, maxFaces=0;
+       int maxVerts=0, maxEdges=0, maxPolys=0;
        const unsigned int totvert= dm->getNumVerts(dm);
        const unsigned int totedge= dm->getNumEdges(dm);
 
@@ -166,7 +183,8 @@
        short other_axis_1, other_axis_2;
        float *tmpf1, *tmpf2;
        
-       MFace *mface_new, *mf_new;
+       MPoly *mpoly_new, *mp_new;
+       MLoop *mloop_new, *ml_new;
        MEdge *medge_orig, *med_orig, *med_new, *med_new_firstloop, *medge_new;
        MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base;
 
@@ -278,7 +296,7 @@
                maxVerts =      totvert  * step_tot; /* -1 because we're 
joining back up */
                maxEdges =      (totvert * step_tot) + /* these are the edges 
between new verts */
                                        (totedge * step_tot); /* -1 because 
vert edges join */
-               maxFaces =      totedge * step_tot;
+               maxPolys =      totedge * step_tot;
 
                screw_ofs= 0.0f;
        }
@@ -289,21 +307,30 @@
                maxVerts =      totvert  * step_tot; /* -1 because we're 
joining back up */
                maxEdges =      (totvert * (step_tot-1)) + /* these are the 
edges between new verts */
                                        (totedge * step_tot); /* -1 because 
vert edges join */
-               maxFaces =      totedge * (step_tot-1);
+               maxPolys =      totedge * (step_tot-1);
        }
        
-       result= CDDM_from_template(dm, maxVerts, maxEdges, maxFaces, 0, 0);
+       result= CDDM_from_template(dm, maxVerts, maxEdges, 0, maxPolys * 4, 
maxPolys);
        
        /* copy verts from mesh */
        mvert_orig =    dm->getVertArray(dm);
        medge_orig =    dm->getEdgeArray(dm);
        
        mvert_new =             result->getVertArray(result);
-       mface_new =             result->getTessFaceArray(result);
+       mpoly_new =             result->getPolyArray(result);
+       mloop_new =             result->getLoopArray(result);
        medge_new =             result->getEdgeArray(result);
-       
-       origindex= result->getTessFaceDataArray(result, CD_ORIGINDEX);
 
+       if (!CustomData_has_layer(&result->polyData, CD_ORIGINDEX)) {
+               CustomData_add_layer(&result->polyData, CD_ORIGINDEX, 
CD_CALLOC, NULL, maxPolys);
+       }
+
+#if 0 // trunk
+       origindex = result->getPolyDataArray(result, CD_ORIGINDEX);
+#else // bmesh
+       origindex = CustomData_get_layer(&result->polyData, CD_ORIGINDEX);
+#endif
+
        DM_copy_vert_data(dm, result, 0, 0, totvert); /* copy first otherwise 
this overwrites our own vertex normals */
        
        /* Set the locations of the first set of verts */
@@ -746,7 +773,8 @@
                }
        }
        
-       mf_new= mface_new;
+       mp_new= mpoly_new;
+       ml_new= mloop_new;
        med_new_firstloop= medge_new;
        
        for (i=0; i < totedge; i++, med_new_firstloop++) {
@@ -758,27 +786,37 @@
                        
                        /* new face */
                        if(do_flip) {
-                               mf_new->v4= i1;
-                               mf_new->v3= i2;
-                               mf_new->v2= i2 + totvert;
-                               mf_new->v1= i1 + totvert;
+                               ml_new[3].v = i1;
+                               ml_new[2].v = i2;
+                               ml_new[1].v = i2 + totvert;
+                               ml_new[0].v = i1 + totvert;
+
+                               ml_new[2].e = step == 0 ? i : (totedge + 
(totvert * step_tot) + step + (i * (step_tot - 1))) - 1;
+                               ml_new[1].e = totedge + i2;
+                               ml_new[0].e = totedge + (totvert * step_tot) + 
step + (i * (step_tot - 1));
+                               ml_new[3].e = totedge + i1;
                        }
                        else {
-                               mf_new->v1= i1;
-                               mf_new->v2= i2;
-                               mf_new->v3= i2 + totvert;
-                               mf_new->v4= i1 + totvert;
+                               ml_new[0].v = i1;
+                               ml_new[1].v = i2;
+                               ml_new[2].v = i2 + totvert;
+                               ml_new[3].v = i1 + totvert;
+
+                               ml_new[0].e = step == 0 ? i : (totedge + 
(totvert * step_tot) + step + (i * (step_tot - 1))) - 1;
+                               ml_new[1].e = totedge + i2;
+                               ml_new[2].e = totedge + (totvert * step_tot) + 
step + (i * (step_tot - 1));
+                               ml_new[3].e = totedge + i1;
                        }
+
+
+                       mp_new->loopstart = mpoly_index * 4;
+                       mp_new->totloop = 4;
+                       mp_new->flag= ME_SMOOTH;
+                       origindex[mpoly_index]= ORIGINDEX_NONE;
+                       mp_new++;
+                       ml_new += 4;
+                       mpoly_index++;
                        
-                       if( !mf_new->v3 || !mf_new->v4 ) {
-                               SWAP(unsigned int, mf_new->v1, mf_new->v3);
-                               SWAP(unsigned int, mf_new->v2, mf_new->v4);
-                       }
-                       mf_new->flag= ME_SMOOTH;
-                       origindex[mface_index]= ORIGINDEX_NONE;
-                       mf_new++;
-                       mface_index++;
-                       
                        /* new vertical edge */
                        if (step) { /* The first set is already dome */
                                med_new->v1= i1;
@@ -794,26 +832,35 @@
                /* close the loop*/
                if (close) { 
                        if(do_flip) {
-                               mf_new->v4= i1;
-                               mf_new->v3= i2;
-                               mf_new->v2= med_new_firstloop->v2;
-                               mf_new->v1= med_new_firstloop->v1;
+                               ml_new[3].v = i1;
+                               ml_new[2].v = i2;
+                               ml_new[1].v = med_new_firstloop->v2;
+                               ml_new[0].v = med_new_firstloop->v1;
+
+                               ml_new[2].e = (totedge + (totvert * step_tot) + 
step + (i * (step_tot - 1))) - 1;
+                               ml_new[1].e = totedge + i2;
+                               ml_new[0].e = i;
+                               ml_new[3].e = totedge + i1;
                        }
                        else {
-                               mf_new->v1= i1;
-                               mf_new->v2= i2;
-                               mf_new->v3= med_new_firstloop->v2;
-                               mf_new->v4= med_new_firstloop->v1;
+                               ml_new[0].v = i1;
+                               ml_new[1].v = i2;
+                               ml_new[2].v = med_new_firstloop->v2;
+                               ml_new[3].v = med_new_firstloop->v1;
+
+                               ml_new[0].e = (totedge + (totvert * step_tot) + 
step + (i * (step_tot - 1))) - 1;
+                               ml_new[1].e = totedge + i2;
+                               ml_new[2].e = i;
+                               ml_new[3].e = totedge + i1;
                        }
 
-                       if( !mf_new->v3 || !mf_new->v4 ) {
-                               SWAP(unsigned int, mf_new->v1, mf_new->v3);
-                               SWAP(unsigned int, mf_new->v2, mf_new->v4);
-                       }
-                       mf_new->flag= ME_SMOOTH;
-                       origindex[mface_index]= ORIGINDEX_NONE;
-                       mf_new++;
-                       mface_index++;
+                       mp_new->loopstart = mpoly_index * 4;
+                       mp_new->totloop = 4;
+                       mp_new->flag= ME_SMOOTH;
+                       origindex[mpoly_index]= ORIGINDEX_NONE;
+                       mp_new++;
+                       ml_new += 4;
+                       mpoly_index++;
                }
                
                /* new vertical edge */
@@ -824,10 +871,38 @@
                med_new++;
        }
 
-       /* BMesh implimentation info - need to calculate polys before 
recalculating
-        * normals, since normal calc overwrites MFaces from Polys */
-       CDDM_tessfaces_to_faces(result);
+       /* validate */
+#if 0
+       {
+               i = 0;
+               printf("\n");
+               for ( ; i < maxPolys * 4; i += 4) {
+                       int ii;
+                       ml_new = mloop_new + i;
+                       ii = findEd(medge_new, maxEdges, ml_new[0].v, 
ml_new[1].v);
+                       printf("%d %d -- ", ii, ml_new[0].e);
+                       ml_new[0].e = ii;
 
+                       ii = findEd(medge_new, maxEdges, ml_new[1].v, 
ml_new[2].v);
+                       printf("%d %d -- ", ii, ml_new[1].e);
+                       ml_new[1].e = ii;
+
+                       ii = findEd(medge_new, maxEdges, ml_new[2].v, 
ml_new[3].v);
+                       printf("%d %d -- ", ii, ml_new[2].e);
+                       ml_new[2].e = ii;
+
+                       ii = findEd(medge_new, maxEdges, ml_new[3].v, 
ml_new[0].v);
+                       printf("%d %d\n", ii, ml_new[3].e);
+                       ml_new[3].e = ii;
+
+               }
+       }
+#endif
+
+
+       /* BMESH_TODO - remove this and make modifiers create their own 
tessfaces on demand */
+       CDDM_recalc_tesselation(result);
+
        if((ltmd->flag & MOD_SCREW_NORMAL_CALC) == 0) {
                CDDM_calc_normals(result);
        }

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

Reply via email to