[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20939] branches/bmesh/blender/source/ blender: further fixes for modifiers, and edge loop select works now.
Joseph Eagar
joeedh at gmail.com
Tue Jun 16 22:08:40 CEST 2009
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. @@
More information about the Bf-blender-cvs
mailing list