Revision: 35967
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35967
Author:   joeedh
Date:     2011-04-03 00:25:01 +0000 (Sun, 03 Apr 2011)
Log Message:
-----------
=bmesh=

Implemented the solidify modifier (but
not the editmode tool, yet).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c  
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c  
2011-04-03 00:25:01 UTC (rev 35967)
@@ -581,6 +581,7 @@
                        if(tree != NULL)
                        {
                                /* XXX, for snap only, em & dm are assumed to 
be aligned, since dm is the em's cage */
+#if 0 //BMESH_TODO
                                EditMesh *em= data->em_evil;
                                if(em) {
                                        EditFace *efa= em->faces.first;
@@ -596,6 +597,9 @@
                                                        
BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
                                                }
                                        }
+#else
+                               if (0) {
+#endif
                                }
                                else {
                                        for(i = 0; i < numFaces; i++) {

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c        
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c        
2011-04-03 00:25:01 UTC (rev 35967)
@@ -1221,6 +1221,7 @@
        }
 
        data->totsize = offset;
+       customData_update_typemap(data);
 }
 
 int CustomData_get_layer_index(const CustomData *data, int type)
@@ -1666,10 +1667,10 @@
 
                if (i != j)
                        data->layers[j] = data->layers[i];
-
-               if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY)
+               
+               if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY) {
                        customData_free_layer__internal(layer, totelem);
-               else
+               } else
                        j++;
        }
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c        
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c        
2011-04-03 00:25:01 UTC (rev 35967)
@@ -599,7 +599,9 @@
        }
 
        //free memory
-       if(ss_mesh)
+       if(ss_mesh) {
+               ss_mesh->needsFree = 1;
                ss_mesh->release(ss_mesh);
+       }
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c       
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c       
2011-04-03 00:25:01 UTC (rev 35967)
@@ -82,7 +82,7 @@
        if(mmd->totlvl) {
                if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
                        /* multires always needs a displacement layer */
-                       CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, 
NULL, me->totface);
+                       CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, 
NULL, me->totloop);
                }
        }
 

Modified: 
branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c     
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c     
2011-04-03 00:25:01 UTC (rev 35967)
@@ -90,11 +90,16 @@
        int *origv = NULL, *origf = NULL, *of, *ov;
        BLI_array_declare(origv);
        BLI_array_declare(origf);
+       DerivedMesh *copy = NULL;
        int i;
        
        if (nmd->resolution <= 0)
                return dm;
        
+       if (!CDDM_Check(dm)) {
+               dm = copy = CDDM_copy(dm, 0);
+       }
+       
        CDDM_recalc_tesselation(dm, 0);
        
        mf = dm->getTessFaceArray(dm);
@@ -291,6 +296,12 @@
        dummy->needsFree = 1;
        dummy->release(dummy);
        
+       if (copy) {
+               copy->needsFree = 1;
+               copy->release(dm);
+               copy = copy;
+       }
+
        return cddm;
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c       
2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c       
2011-04-03 00:25:01 UTC (rev 35967)
@@ -40,6 +40,8 @@
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
 #include "BLI_utildefines.h"
+#include "BLI_array.h"
+#include "BLI_smallhash.h"
 
 #include "BKE_cdderivedmesh.h"
 #include "BKE_mesh.h"
@@ -59,7 +61,8 @@
 static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
 {
        int i, numVerts, numEdges, numFaces;
-       MFace *mface, *mf;
+       MPoly *mpoly, *mp;
+       MLoop *mloop, *ml;
        MVert *mvert, *mv;
 
        float (*face_nors)[3];
@@ -69,9 +72,10 @@
        numVerts = dm->getNumVerts(dm);
        numEdges = dm->getNumEdges(dm);
        numFaces = dm->getNumFaces(dm);
-       mface = dm->getTessFaceArray(dm);
+       mpoly = CDDM_get_polys(dm);
        mvert = dm->getVertArray(dm);
-
+       mloop = CDDM_get_loops(dm);
+       
        /* we don't want to overwrite any referenced layers */
 
        /*
@@ -80,14 +84,14 @@
        cddm->mvert = mv;
        */
 
-       face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+       face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
        if(!face_nors) {
                calc_face_nors = 1;
-               face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, 
CD_CALLOC, NULL, numFaces);
+               face_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, 
CD_CALLOC, NULL, numFaces);
        }
 
        mv = mvert;
-       mf = mface;
+       mp = mpoly;
 
        {
                EdgeHash *edge_hash = BLI_edgehash_new();
@@ -110,27 +114,19 @@
                                        edge_ref->f2=i; \
                                }
 
-               for(i = 0; i < numFaces; i++, mf++) {
+               for(i = 0; i < numFaces; i++, mp++) {
+                       int j;
+                       
                        f_no = face_nors[i];
+                       if(calc_face_nors)
+                               mesh_calc_poly_normal(mp, mloop+mp->loopstart, 
mvert, f_no);
 
-                       if(mf->v4) {
-                               if(calc_face_nors)
-                                       normal_quad_v3(f_no, mv[mf->v1].co, 
mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co);
-
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, 
mf->v2);
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, 
mf->v3);
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, 
mf->v4);
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v4, 
mf->v1);
-                       } else {
-                               if(calc_face_nors)
-                                       normal_tri_v3(f_no, mv[mf->v1].co, 
mv[mf->v2].co, mv[mf->v3].co);
-
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, 
mf->v2);
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, 
mf->v3);
-                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, 
mf->v1);
+                       ml = mloop + mp->loopstart;
+                       for (j=0; j<mp->totloop; j++) {
+                               NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml[j].v, 
ml[(j+1)%mp->totloop].v);
                        }
                }
-
+               
                for(edge_iter = BLI_edgehashIterator_new(edge_hash); 
!BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
                        /* Get the edge vert indices, and edge value (the face 
indices that use it)*/
                        BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, 
(int*)&ed_v2);
@@ -196,7 +192,6 @@
        return dataMask;
 }
 
-
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob, 
                                                DerivedMesh *dm,
                                                int UNUSED(useRenderParams),
@@ -206,20 +201,22 @@
        DerivedMesh *result, *copy;
        const SolidifyModifierData *smd = (SolidifyModifierData*) md;
 
-       MFace *mf, *mface, *orig_mface;
+       MVert *mv, *mvert, *orig_mvert;
        MEdge *ed, *medge, *orig_medge;
-       MVert *mv, *mvert, *orig_mvert;
-
+       MLoop *ml, *mloop, *orig_mloop;
+       MPoly *mp, *mpoly, *orig_mpoly;
        const int numVerts = dm->getNumVerts(dm);
        const int numEdges = dm->getNumEdges(dm);
        const int numFaces = dm->getNumFaces(dm);
-
+       int numLoops=0, newLoops=0, newFaces=0, newEdges=0;
+       int j;
+       
        /* use for edges */
        int *new_vert_arr= NULL;
-       int newFaces = 0;
-
+       BLI_array_declare(new_vert_arr);
        int *new_edge_arr= NULL;
-       int newEdges = 0;
+       BLI_array_declare(new_edge_arr);
+       int *old_vert_arr = MEM_callocN(sizeof(int)*numVerts, "old_vert_arr in 
solidify");
 
        int *edge_users= NULL;
        char *edge_order= NULL;
@@ -236,11 +233,22 @@
 
        if (defgrp_index >= 0)
                dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+       
+       if (!CDDM_Check(dm)) {
+               DerivedMesh *dm2 = CDDM_copy(dm, 0);
+               dm->needsFree = 1;
+               dm->release(dm);
+               dm = dm2;
+       }
+       
+       numLoops = dm->numLoopData;
+       newLoops = 0;
+       
+       orig_mvert = CDDM_get_verts(dm);
+       orig_medge = CDDM_get_edges(dm);
+       orig_mloop = CDDM_get_loops(dm);
+       orig_mpoly = CDDM_get_polys(dm);
 
-       orig_mface = dm->getTessFaceArray(dm);
-       orig_medge = dm->getEdgeArray(dm);
-       orig_mvert = dm->getVertArray(dm);
-
        if(smd->flag & MOD_SOLIDIFY_RIM) {
                EdgeHash *edgehash = BLI_edgehash_new();
                EdgeHashIterator *ehi;
@@ -272,28 +280,20 @@
                edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod 
edges");
                edge_order= MEM_mallocN(sizeof(char) * numEdges, "solid_mod 
eorder");
                memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges);
-
-               for(i=0, mf=orig_mface; i<numFaces; i++, mf++) {
-                       if(mf->v4) {
-                               ADD_EDGE_USER(mf->v1, mf->v2, 0);
-                               ADD_EDGE_USER(mf->v2, mf->v3, 1);
-                               ADD_EDGE_USER(mf->v3, mf->v4, 2);
-                               ADD_EDGE_USER(mf->v4, mf->v1, 3);
-                       }
-                       else {
-                               ADD_EDGE_USER(mf->v1, mf->v2, 0);
-                               ADD_EDGE_USER(mf->v2, mf->v3, 1);
-                               ADD_EDGE_USER(mf->v3, mf->v1, 2);
-                       }
+               
+               for (i=0, mp=orig_mpoly; i<numFaces; i++, mp++) {
+                       MLoop *ml;
+                       
+                       for (ml=orig_mloop + mp->loopstart, j=0; j<mp->totloop; 
ml++, j++) {
+                               MLoop *ml2 = orig_mloop + mp->loopstart + 
(j+1)%mp->totloop;
+                               ADD_EDGE_USER(ml->v, ml2->v, j);
+                       }       
                }
 
 #undef ADD_EDGE_USER
 #undef INVALID_UNUSED
 #undef INVALID_PAIR
 
-
-               new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod 
arr");
-
                ehi= BLI_edgehashIterator_new(edgehash);
                for(; !BLI_edgehashIterator_isDone(ehi); 
BLI_edgehashIterator_step(ehi)) {
                        eidx= 
GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
@@ -301,18 +301,17 @@
                                BLI_edgehashIterator_getKey(ehi, &v1, &v2);
                                orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
                                orig_mvert[v2].flag |= ME_VERT_TMP_TAG;
-                               new_edge_arr[newFaces]= eidx;
+                               BLI_array_append(new_edge_arr, eidx);
                                newFaces++;
+                               newLoops += 4;
                        }
                }
                BLI_edgehashIterator_free(ehi);
 
-
-
-               new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod 
new_varr");
                for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) {
                        if(mv->flag & ME_VERT_TMP_TAG) {
-                               new_vert_arr[newEdges] = i;
+                               old_vert_arr[i] = BLI_array_count(new_vert_arr);
+                               BLI_array_append(new_vert_arr, i);
                                newEdges++;
 
                                mv->flag &= ~ME_VERT_TMP_TAG;
@@ -327,40 +326,49 @@
                dm_calc_normal(dm, vert_nors);
        }
 
-       result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + 
newEdges, (numFaces * 2) + newFaces, 0, 0);
+       result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + 
newEdges, 0, (numLoops*2) + newLoops, (numFaces * 2) + newFaces);
 
-       mface = result->getTessFaceArray(result);

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