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