Revision: 20939
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20939
Author:   joeedh
Date:     2009-06-16 22:08:40 +0200 (Tue, 16 Jun 2009)

Log Message:
-----------
further fixes for modifiers, and edge loop select works now.

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/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h  
2009-06-16 20:08:40 UTC (rev 20939)
@@ -65,7 +65,7 @@
 /* number of sub-elements each mesh element has (for interpolation) */
 #define SUB_ELEMS_VERT 0
 #define SUB_ELEMS_EDGE 2
-#define SUB_ELEMS_FACE 4
+#define SUB_ELEMS_FACE 50
 
 /*
 note: all mface interfaces now officially operate on tesselated data.

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c       
2009-06-16 20:08:40 UTC (rev 20939)
@@ -240,8 +240,8 @@
                CustomData_free_temporary(&dm->vertData, dm->numVertData);
                CustomData_free_temporary(&dm->edgeData, dm->numEdgeData);
                CustomData_free_temporary(&dm->faceData, dm->numFaceData);
-               CustomData_free(&dm->loopData, dm->numLoopData);
-               CustomData_free(&dm->polyData, dm->numPolyData);
+               CustomData_free_temporary(&dm->loopData, dm->numLoopData);
+               CustomData_free_temporary(&dm->polyData, dm->numPolyData);
 
                return 0;
        }
@@ -357,6 +357,8 @@
        CustomData_free(&me->vdata, me->totvert);
        CustomData_free(&me->edata, me->totedge);
        CustomData_free(&me->fdata, me->totface);
+       CustomData_free(&me->ldata, me->totloop);
+       CustomData_free(&me->pdata, me->totpoly);
 
        /* if the number of verts has changed, remove invalid data */
        if(tmp.totvert != me->totvert) {

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c     
2009-06-16 20:08:40 UTC (rev 20939)
@@ -781,8 +781,14 @@
        MVert *mv = cddm->mvert;
        MPoly *mf = cddm->mpoly;
        MLoop *ml = cddm->mloop;
-       int i, j, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+       float (*cents)[3];
+       float (*nors)[3];
+       int *flens;
+       int i, j, orig, *index;
+       int maxf=0;
 
+       index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+       mf = cddm->mpoly;
        for(i = 0; i < dm->numPolyData; i++, mf++) {
                float cent[3];
                float no[3];
@@ -790,8 +796,7 @@
                if (index) {
                        orig = *index++;
                        if(orig == ORIGINDEX_NONE) continue;
-               }
-               else
+               } else
                        orig = i;
                
                ml = &cddm->mloop[mf->loopstart];
@@ -804,14 +809,15 @@
                ml = &cddm->mloop[mf->loopstart];
                if (j > 3) {
                        CalcNormFloat4(mv[ml->v].co, mv[(ml+1)->v].co,
-                                      mv[(ml+2)->v].co, mv[(ml+3)->v].co, no);
+                                      mv[(ml+2)->v].co, mv[(ml+3)->v].co, no);
                } else {
                        CalcNormFloat(mv[ml->v].co, mv[(ml+1)->v].co,
-                                      mv[(ml+2)->v].co, no);
+                                      mv[(ml+2)->v].co, no);
                }
 
                func(userData, orig, cent, no);
        }
+
 }
 
 static void cdDM_release(DerivedMesh *dm)
@@ -1651,7 +1657,7 @@
        MLoop *ml;
        MPoly *mp;
        EdgeHash *eh = BLI_edgehash_new();
-       int i, l, totloop;
+       int i, l, totloop, *index1, *index2;
        
        me = cddm->medge;
        for (i=0; i<cddm->dm.numEdgeData; i++, me++) {
@@ -1664,14 +1670,25 @@
                totloop += mf->v4 ? 4 : 3;
        }
 
+       CustomData_free(&cddm->dm.polyData, cddm->dm.numPolyData);
+       CustomData_free(&cddm->dm.loopData, cddm->dm.numLoopData);
+       
+       cddm->dm.numLoopData = totloop;
+       cddm->dm.numPolyData = cddm->dm.numFaceData;
+
+       if (!totloop) return;
+
        cddm->mloop = MEM_callocN(sizeof(MLoop)*totloop, "cddm->mloop in 
CDDM_tessfaces_to_faces");
-       cddm->dm.numLoopData = totloop;
        cddm->mpoly = MEM_callocN(sizeof(MPoly)*cddm->dm.numFaceData, 
"cddm->mpoly in CDDM_tessfaces_to_faces");
-       cddm->dm.numPolyData = cddm->dm.numFaceData;
        
        CustomData_add_layer(&cddm->dm.loopData, CD_MLOOP, CD_ASSIGN, 
cddm->mloop, totloop);
        CustomData_add_layer(&cddm->dm.polyData, CD_MPOLY, CD_ASSIGN, 
cddm->mpoly, cddm->dm.numPolyData);
-       
+       CustomData_merge(&cddm->dm.faceData, &cddm->dm.polyData, 
+               CD_MASK_DERIVEDMESH, CD_DUPLICATE, cddm->dm.numFaceData);
+
+       index1 = CustomData_get_layer(&cddm->dm.faceData, CD_ORIGINDEX);
+       index2 = CustomData_get_layer(&cddm->dm.polyData, CD_ORIGINDEX);
+
        mf = cddm->mface;
        mp = cddm->mpoly;
        ml = cddm->mloop;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c        
2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c        
2009-06-16 20:08:40 UTC (rev 20939)
@@ -806,7 +806,7 @@
 
                if(layer->flag & CD_FLAG_NOCOPY) continue;
                else if(!((int)mask & (int)(1 << (int)type))) continue;
-               else if(number < CustomData_number_of_layers(dest, type)) 
continue;
+               else if(number+1 < CustomData_number_of_layers(dest, type)) 
continue;
 
                if((alloctype == CD_ASSIGN) && (layer->flag & CD_FLAG_NOFREE))
                        newlayer = customData_add_layer__internal(dest, type, 
CD_REFERENCE,

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c       
2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c       
2009-06-16 20:08:40 UTC (rev 20939)
@@ -428,7 +428,7 @@
 }
 #endif
 
-/* face weighting */
+
 static void calc_ss_weights(int gridFaces,
                             FaceVertWeight **qweight, FaceVertWeight **tweight)
 {
@@ -472,6 +472,61 @@
        }
 }
 
+/* face weighting */
+typedef struct FaceVertWeightEntry {
+       FaceVertWeight *weight;
+       int valid;
+} FaceVertWeightEntry;
+
+typedef struct WeightTable {
+       FaceVertWeightEntry *weight_table;
+       int len;
+} WeightTable;
+
+static FaceVertWeight *get_ss_weights(WeightTable *wtable, int gridFaces, int 
faceLen)
+{
+       int i;
+
+       /*ensure we have at least the triangle and quad weights*/
+       if (wtable->len < 4) {
+               wtable->weight_table = 
MEM_callocN(sizeof(FaceVertWeightEntry)*5, "weight table alloc");
+               wtable->len = 5;
+
+               calc_ss_weights(gridFaces, &wtable->weight_table[4].weight, 
&wtable->weight_table[3].weight);
+               wtable->weight_table[4].valid = wtable->weight_table[3].valid = 
1;
+       }
+       
+       if (wtable->len <= faceLen) {
+               void *tmp = 
MEM_callocN(sizeof(FaceVertWeightEntry)*(faceLen+1), "weight table alloc 2");
+               
+               memcpy(tmp, wtable->weight_table, 
sizeof(FaceVertWeightEntry)*wtable->len);
+               MEM_freeN(wtable->weight_table);
+               
+               wtable->weight_table = tmp;
+               wtable->len = faceLen+1;
+       }
+
+       if (!wtable->weight_table[faceLen].valid) {
+               /*ok, need to calculate weights here*/
+               wtable->weight_table[faceLen].weight =
+                       MEM_callocN(sizeof(FaceVertWeight)*gridFaces*gridFaces, 
+                                   "vert face weight");
+               wtable->weight_table[faceLen].valid = 1;
+       }
+
+       return wtable->weight_table[faceLen].weight;
+}
+
+void free_ss_weights(WeightTable *wtable)
+{
+       int i;
+
+       for (i=0; i<wtable->len; i++) {
+               if (wtable->weight_table[i].valid)
+                       MEM_freeN(wtable->weight_table[i].weight);
+       }
+}
+
 static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
                                  int drawInteriorEdges, int useSubsurfUv,
                                  DerivedMesh *dm, MultiresSubsurf *ms)
@@ -493,11 +548,13 @@
        int totvert, totedge, totface;
        MVert *mvert;
        MEdge *med;
+       float *w = NULL;
+       WeightTable wtable;
+       V_DECLARE(w);
        MFace *mf;
        int *origIndex;
-       FaceVertWeight *qweight, *tweight;
 
-       calc_ss_weights(gridFaces, &qweight, &tweight);
+       memset(&wtable, 0, sizeof(wtable));
 
        /* vert map */
        totvert = ccgSubSurf_getNumVerts(ss);
@@ -554,7 +611,7 @@
        for(index = 0; index < totface; index++) {
                CCGFace *f = faceMap2[index];
                int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
-               FaceVertWeight *weight = (numVerts == 4) ? qweight : tweight;
+               FaceVertWeight *weight = get_ss_weights(&wtable, gridFaces, 
numVerts);
 
                V_RESET(vertIdx);
 
@@ -572,19 +629,22 @@
                ++origIndex;
                i++;
 
+               V_RESET(w);
+               for (x=0; x<numVerts; x++) {
+                       V_GROW(w);
+               }
 
-#if 0 //BMESH_TODO
                for(S = 0; S < numVerts; S++) {
                        int prevS = (S - 1 + numVerts) % numVerts;
                        int nextS = (S + 1) % numVerts;
-                       int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3;
+                       int otherS = (numVerts >= 4) ? (S + 2) % numVerts : 3;
 
                        for(x = 1; x < gridFaces; x++) {
-                               float w[4];
                                w[prevS]  = weight[x][0][0];
                                w[S]      = weight[x][0][1];
                                w[nextS]  = weight[x][0][2];
                                w[otherS] = weight[x][0][3];
+
                                DM_interp_vert_data(dm, result, vertIdx, w, 
numVerts, i);
                                VecCopyf(mvert->co,
                                         ccgSubSurf_getFaceGridEdgeData(ss, f, 
S, x));
@@ -595,20 +655,25 @@
                                i++;
                        }
                }
+               
+               V_RESET(w);
+               for (x=0; x<numVerts; x++) {
+                       V_GROW(w);
+               }
 
                for(S = 0; S < numVerts; S++) {
                        int prevS = (S - 1 + numVerts) % numVerts;
                        int nextS = (S + 1) % numVerts;
                        int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3;
-
+                       
                        for(y = 1; y < gridFaces; y++) {
                                for(x = 1; x < gridFaces; x++) {
-                                       float w[4];
                                        w[prevS]  = weight[y * gridFaces + 
x][0][0];
                                        w[S]      = weight[y * gridFaces + 
x][0][1];
                                        w[nextS]  = weight[y * gridFaces + 
x][0][2];
                                        w[otherS] = weight[y * gridFaces + 
x][0][3];
                                        DM_interp_vert_data(dm, result, 
vertIdx, w, numVerts, i);
+
                                        VecCopyf(mvert->co,
                                                 ccgSubSurf_getFaceGridData(ss, 
f, S, x, y));
                                        *origIndex = ORIGINDEX_NONE;
@@ -618,7 +683,6 @@
                                }
                        }
                }
-#endif
                *((int*)ccgSubSurf_getFaceUserData(ss, f)) = faceBase;
                faceBase += 1 + numVerts * ((gridSize-2) + (gridSize-2) * 
(gridSize-2));
        }
@@ -634,12 +698,14 @@
                vertIdx[0] = 
GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
                v = ccgSubSurf_getEdgeVert1(e);
                vertIdx[1] = 
GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+               
+               for(x = 1; x < edgeSize - 1; x++) {
+                       float w2[2];
 
-               for(x = 1; x < edgeSize - 1; x++) {
-                       float w[2];
-                       w[1] = (float) x / (edgeSize - 1);
-                       w[0] = 1 - w[1];
-                       DM_interp_vert_data(dm, result, vertIdx, w, 2, i);
+                       w2[1] = (float) x / (edgeSize - 1);
+                       w2[0] = 1 - w2[1];

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to