Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/subsurf_ccg.c')
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c996
1 files changed, 115 insertions, 881 deletions
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3b6a7dba40b..c72ac868154 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -73,10 +73,9 @@ struct CCGDerivedMesh {
DerivedMesh dm;
CCGSubSurf *ss;
- int fromEditmesh, drawInteriorEdges, useSubsurfUv;
+ int drawInteriorEdges, useSubsurfUv;
Mesh *me;
- DispListMesh *dlm;
struct {int startVert; CCGVert *vert;} *vertMap;
struct {int startVert; int startEdge; CCGEdge *edge;} *edgeMap;
@@ -265,12 +264,12 @@ static void get_face_uv_map_vert(UvVertMap *vmap, struct MFace *mf, int fi, CCGV
}
}
-static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispListMesh *dlm) {
- MFace *mface = dlm?dlm->mface:me->mface;
- TFace *tface = dlm?dlm->tface:me->tface;
- MVert *mvert = dlm?dlm->mvert:me->mvert;
- int totvert = dlm?dlm->totvert:me->totvert;
- int totface = dlm?dlm->totface:me->totface;
+static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm) {
+ MFace *mface = dm->getFaceArray(dm);
+ MVert *mvert = dm->getVertArray(dm);
+ MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE);
+ int totvert = dm->getNumVerts(dm);
+ int totface = dm->getNumFaces(dm);
int i, j, seam;
UvMapVert *v;
UvVertMap *vmap;
@@ -364,7 +363,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispLis
}
#if 0
-static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, DispListMesh *dlm, MEdge *medge, TFace *tface)
+static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, DispListMesh *dlm, MEdge *medge, MTFace *tface)
{
unsigned int flags = 0;
int N = ccgSubSurf_getEdgeNumFaces(ss, e);
@@ -394,402 +393,6 @@ static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditme
}
#endif
-static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, int ssFromEditmesh, int drawInteriorEdges, int useSubsurfUv, Mesh *inMe, DispListMesh *inDLM) {
- DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm");
- int edgeSize = ccgSubSurf_getEdgeSize(ss);
- int gridSize = ccgSubSurf_getGridSize(ss);
- int edgeBase, faceBase;
- int i, j, k, S, x, y, index;
- int vertBase = 0;
- TFace *tface = NULL;
- MEdge *medge = NULL;
- MFace *mface = NULL;
- MCol *mcol = NULL;
- CCGVertIterator *vi;
- CCGEdgeIterator *ei;
- CCGFaceIterator *fi;
- CCGFace **faceMap2, **faceMap2Uv = NULL;
- CCGEdge **edgeMap2;
- CCGVert **vertMap2;
- int totvert, totedge, totface;
- CCGSubSurf *uvss= NULL;
-
- totvert = ccgSubSurf_getNumVerts(ss);
- vertMap2 = MEM_mallocN(totvert*sizeof(*vertMap2), "vertmap");
- vi = ccgSubSurf_getVertIterator(ss);
- for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
-
- if (ssFromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(ccgdm,ss,v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
- }
- ccgVertIterator_free(vi);
-
- totedge = ccgSubSurf_getNumEdges(ss);
- edgeMap2 = MEM_mallocN(totedge*sizeof(*edgeMap2), "edgemap");
- ei = ccgSubSurf_getEdgeIterator(ss);
- for (i=0; !ccgEdgeIterator_isStopped(ei); i++,ccgEdgeIterator_next(ei)) {
- CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
-
- if (ssFromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(ccgdm,ss,e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
- }
-
- totface = ccgSubSurf_getNumFaces(ss);
- faceMap2 = MEM_mallocN(totface*sizeof(*faceMap2), "facemap");
- fi = ccgSubSurf_getFaceIterator(ss);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
-
- if (ssFromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(ccgdm,ss,f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
- }
- ccgFaceIterator_free(fi);
-
- if (!ssFromEditmesh) {
- if (inDLM) {
- tface = inDLM->tface;
- medge = inDLM->medge;
- mface = inDLM->mface;
- mcol = inDLM->mcol;
- } else if (inMe) {
- tface = inMe->tface;
- medge = inMe->medge;
- mface = inMe->mface;
- mcol = inMe->mcol;
- }
- }
-
- dlm->totvert = ccgSubSurf_getNumFinalVerts(ss);
- dlm->totedge = ccgSubSurf_getNumFinalEdges(ss);
- dlm->totface = ccgSubSurf_getNumFinalFaces(ss);
-
- dlm->mvert = MEM_callocN(dlm->totvert*sizeof(*dlm->mvert), "dlm->mvert");
- dlm->medge = MEM_callocN(dlm->totedge*sizeof(*dlm->medge), "dlm->medge");
- dlm->mface = MEM_callocN(dlm->totface*sizeof(*dlm->mface), "dlm->mface");
- if (!ssFromEditmesh && tface) {
- dlm->tface = MEM_callocN(dlm->totface*sizeof(*dlm->tface), "dlm->tface");
- dlm->mcol = NULL;
- } else if (!ssFromEditmesh && mcol) {
- dlm->tface = NULL;
- dlm->mcol = MEM_mallocN(dlm->totface*4*sizeof(*dlm->mcol), "dlm->mcol");
- } else {
- dlm->tface = NULL;
- dlm->mcol = NULL;
- }
-
-
- if (useSubsurfUv && tface) {
- /* not for editmesh currently */
- uvss= _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
-
- if (ss_sync_from_uv(uvss, ss, inMe, inDLM)) {
- faceMap2Uv = MEM_mallocN(totface*sizeof(*faceMap2Uv), "facemapuv");
-
- fi = ccgSubSurf_getFaceIterator(uvss);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
- faceMap2Uv[(int) ccgSubSurf_getFaceFaceHandle(uvss, f)] = f;
- }
- ccgFaceIterator_free(fi);
- }
- }
-
- /* Load vertices... we do in this funny order because
- * all "added" vertices" are required to appear first
- * in the displist (before STEPINDEX flags start). Also
- * note that the vertex with index 0 is always a face
- * center vert, this is relied upon to ensure we don't
- * need to do silly test_index_face calls.
- *
- * NOTE (artificer): The STEPINDEX flag has been removed, so this
- * funny order is no longer strictly necessary, but it works.
- */
-
- faceBase = i = 0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
-
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceCenterData(ss, f));
-
- for (S=0; S<numVerts; S++) {
- for (x=1; x<gridSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
- }
- }
-
- for (S=0; S<numVerts; S++) {
- for (y=1; y<gridSize-1; y++) {
- for (x=1; x<gridSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceGridData(ss, f, S, x, y));
- }
- }
- }
-
- *((int*) ccgSubSurf_getFaceUserData(ss, f)) = faceBase;
- faceBase += 1 + numVerts*((gridSize-2) + (gridSize-2)*(gridSize-2));
- }
-
- edgeBase = i;
- for (index=0; index<totedge; index++) {
- CCGEdge *e= edgeMap2[index];
- int x;
-
- for (x=1; x<edgeSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getEdgeData(ss, e, x));
- }
-
- *((int*) ccgSubSurf_getEdgeUserData(ss, e)) = edgeBase;
- edgeBase += edgeSize-2;
- }
-
- vertBase = i;
- for (index=0; index<totvert; index++) {
- CCGVert *v = vertMap2[index];
- VecCopyf(dlm->mvert[i].co, ccgSubSurf_getVertData(ss, v));
- *((int*) ccgSubSurf_getVertUserData(ss, v)) = i++;
- }
-
- // load edges
-
- i = 0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
-
- for (k=0; k<numVerts; k++) {
- for (x=0; x<gridSize-1; x++) {
- MEdge *med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, x, 0, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, x+1, 0, edgeSize, gridSize);
- i++;
- }
-
- for (x=1; x<gridSize-1; x++) {
- for (y=0; y<gridSize-1; y++) {
- MEdge *med;
-
- med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, x, y, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, x, y+1, edgeSize, gridSize);
- i++;
-
- med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, y, x, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, y+1, x, edgeSize, gridSize);
- i++;
- }
- }
- }
- }
-
- for (index=0; index<totedge; index++) {
- CCGEdge *e= edgeMap2[index];
- unsigned int flags = 0;
-
- if (!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
-
- if (ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW|ME_EDGERENDER;
- if (eed->seam) {
- flags |= ME_SEAM;
- }
- } else if(medge){
- int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- if (edgeIdx!=-1) {
- MEdge *origMed = &medge[edgeIdx];
-
- if (inDLM) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag&ME_SEAM)|ME_EDGEDRAW|ME_EDGERENDER;
- }
- }
- } else {
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- }
-
- for (x=0; x<edgeSize-1; x++) {
- MEdge *med = &dlm->medge[i];
- med->v1 = getEdgeIndex(ss, e, x, edgeSize);
- med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- med->flag = flags;
- i++;
- }
- }
-
- // load faces
-
- i=0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- CCGFace *uvf = faceMap2Uv? faceMap2Uv[index]: NULL;
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
- float edge_data[4][6];
- float corner_data[4][6];
- float center_data[6] = {0};
- int numDataComponents = 0;
- TFace *origTFace = NULL;
- int mat_nr;
- int flag;
-
- if (!ssFromEditmesh && mface) {
- int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
- MFace *origMFace = &mface[origIdx];
-
- if (tface) {
- origTFace = &tface[origIdx];
-
- for (S=0; S<numVerts; S++) {
- unsigned char *col = (unsigned char*) &origTFace->col[S];
- corner_data[S][0] = col[0]/255.0f;
- corner_data[S][1] = col[1]/255.0f;
- corner_data[S][2] = col[2]/255.0f;
- corner_data[S][3] = col[3]/255.0f;
- if (!uvf) {
- corner_data[S][4] = origTFace->uv[S][0];
- corner_data[S][5] = origTFace->uv[S][1];
- }
- }
- numDataComponents = uvf? 4: 6;
- } else if (mcol) {
- MCol *origMCol = &mcol[origIdx*4];
-
- for (S=0; S<numVerts; S++) {
- unsigned char *col = (unsigned char*) &origMCol[S];
- corner_data[S][0] = col[0]/255.0f;
- corner_data[S][1] = col[1]/255.0f;
- corner_data[S][2] = col[2]/255.0f;
- corner_data[S][3] = col[3]/255.0f;
- }
- numDataComponents = 4;
- }
-
- for (S=0; S<numVerts; S++) {
- for (k=0; k<numDataComponents; k++) {
- edge_data[S][k] = (corner_data[S][k] + corner_data[(S+1)%numVerts][k])*0.5f;
- center_data[k]+= corner_data[S][k];
- }
- }
- for (k=0; k<numDataComponents; k++) {
- center_data[k]/= numVerts;
- }
-
- mat_nr = origMFace->mat_nr;
- flag = origMFace->flag;
- } else if(ssFromEditmesh) {
- EditFace *ef = ccgSubSurf_getFaceFaceHandle(ss, f);
- mat_nr = ef->mat_nr;
- flag = ef->flag;
- } else {
- mat_nr = 0;
- flag = 0;
- }
-
- for (S=0; S<numVerts; S++) {
- int prevS= (S-1+numVerts)%numVerts;
-
- for (y=0; y<gridSize-1; y++) {
- for (x=0; x<gridSize-1; x++) {
- float smoothuv[4][3];
-
- MFace *mf = &dlm->mface[i];
- mf->v1 = getFaceIndex(ss, f, S, x+0, y+0, edgeSize, gridSize);
- mf->v2 = getFaceIndex(ss, f, S, x+0, y+1, edgeSize, gridSize);
- mf->v3 = getFaceIndex(ss, f, S, x+1, y+1, edgeSize, gridSize);
- mf->v4 = getFaceIndex(ss, f, S, x+1, y+0, edgeSize, gridSize);
- mf->mat_nr = mat_nr;
- mf->flag = flag;
-
- if(uvf) {
- VECCOPY(smoothuv[0], getFaceUV(uvss, uvf, S, x+0, y+0, edgeSize, gridSize));
- VECCOPY(smoothuv[1], getFaceUV(uvss, uvf, S, x+0, y+1, edgeSize, gridSize));
- VECCOPY(smoothuv[2], getFaceUV(uvss, uvf, S, x+1, y+1, edgeSize, gridSize));
- VECCOPY(smoothuv[3], getFaceUV(uvss, uvf, S, x+1, y+0, edgeSize, gridSize));
- }
-
- for (j=0; j<4; j++) {
- int fx = x + (j==2||j==3);
- int fy = y + (j==1||j==2);
- float x_v = (float) fx/(gridSize-1);
- float y_v = (float) fy/(gridSize-1);
- float data[6];
-
- for (k=0; k<numDataComponents; k++) {
- data[k] = (center_data[k]*(1.0f-x_v) + edge_data[S][k]*x_v)*(1.0f-y_v) +
- (edge_data[prevS][k]*(1.0f-x_v) + corner_data[S][k]*x_v)*y_v;
- }
-
- if (dlm->tface) {
- TFace *tf = &dlm->tface[i];
- unsigned char col[4];
- col[0] = (int) (data[0]*255);
- col[1] = (int) (data[1]*255);
- col[2] = (int) (data[2]*255);
- col[3] = (int) (data[3]*255);
- tf->col[j] = *((unsigned int*) col);
- if (uvf) {
- tf->uv[j][0] = smoothuv[j][0];
- tf->uv[j][1] = smoothuv[j][1];
- }
- else {
- tf->uv[j][0] = (float)(data[4]);
- tf->uv[j][1] = (float)(data[5]);
- }
- } else if (dlm->mcol) {
- unsigned char *col = (unsigned char*) &dlm->mcol[i*4+j];
- col[0] = (int) (data[0]*255);
- col[1] = (int) (data[1]*255);
- col[2] = (int) (data[2]*255);
- col[3] = (int) (data[3]*255);
- }
- }
-
- if (dlm->tface) {
- TFace *tf = &dlm->tface[i];
- tf->tpage = origTFace->tpage;
- tf->flag = origTFace->flag;
- tf->transp = origTFace->transp;
- tf->mode = origTFace->mode;
- tf->tile = origTFace->tile;
- }
-
- i++;
- }
- }
- }
- }
-
- MEM_freeN(faceMap2);
- MEM_freeN(edgeMap2);
- MEM_freeN(vertMap2);
-
- if(uvss) {
- ccgSubSurf_free(uvss);
- MEM_freeN(faceMap2Uv);
- }
-
- mesh_calc_normals(dlm->mvert, dlm->totvert, dlm->mface, dlm->totface, &dlm->nors);
-
- return dlm;
-}
-
/* face weighting - taken from Brecht's element data patch */
static void calc_ss_weights(int gridFaces,
FaceVertWeight **qweight, FaceVertWeight **tweight)
@@ -855,7 +458,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
MVert *mvert;
MEdge *med;
MFace *mf;
- TFace *tface;
+ MTFace *tface;
CCGSubSurf *uvss = NULL;
int *origIndex;
FaceVertWeight *qweight, *tweight;
@@ -869,11 +472,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if(ssFromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(NULL, ss, v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
+ vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
}
ccgVertIterator_free(vi);
@@ -883,11 +482,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if(ssFromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(NULL, ss, e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
+ edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -896,11 +491,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if(ssFromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(NULL, ss, f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
+ faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
}
ccgFaceIterator_free(fi);
@@ -908,7 +499,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
result = CDDM_from_template(dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
} else {
result = CDDM_new(ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
@@ -917,20 +508,10 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
if(useSubsurfUv && tface) {
- /* slightly dodgy hack to use current ss_sync_from_uv function */
- DispListMesh dlm;
-
- dlm.mface = dm->dupFaceArray(dm);
- dlm.tface = tface;
- dlm.mvert = dm->dupVertArray(dm);
- dlm.totvert = dm->getNumVerts(dm);
- dlm.totface = dm->getNumFaces(dm);
-
- /* not for editmesh currently */
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
- if(ss_sync_from_uv(uvss, ss, NULL, &dlm)) {
+ if(ss_sync_from_uv(uvss, ss, dm)) {
faceMap2Uv = MEM_mallocN(totface * sizeof(*faceMap2Uv),
"facemapuv");
@@ -941,15 +522,12 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
ccgFaceIterator_free(fi);
}
-
- MEM_freeN(dlm.mface);
- MEM_freeN(dlm.mvert);
}
// load verts
faceBase = i = 0;
mvert = CDDM_get_verts(result);
- origIndex = result->getVertData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getVertData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -960,10 +538,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- if(ssFromEditmesh)
- vertIdx[S] = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
}
DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
@@ -1025,19 +600,11 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int x;
int vertIdx[2];
- if(ssFromEditmesh) {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = ccgDM_getVertMapIndex(NULL, ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = ccgDM_getVertMapIndex(NULL, ss, v);
- } else {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- }
+ CCGVert *v;
+ v = ccgSubSurf_getEdgeVert0(ss, e);
+ vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ v = ccgSubSurf_getEdgeVert1(ss, e);
+ vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
for(x = 1; x < edgeSize - 1; x++) {
float w[2];
@@ -1060,10 +627,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
CCGVert *v = vertMap2[index];
int vertIdx;
- if(ssFromEditmesh)
- vertIdx = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
DM_copy_vert_data(dm, result, vertIdx, i, 1);
VecCopyf(mvert->co, ccgSubSurf_getVertData(ss, v));
@@ -1078,7 +642,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
// load edges
i = 0;
med = CDDM_get_edges(result);
- origIndex = result->getEdgeData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getEdgeData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -1127,23 +691,13 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
- if(ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if(eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else {
- int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
+ int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
- if(edgeIdx != -1 && dm) {
- MEdge origMed;
- dm->getEdge(dm, edgeIdx, &origMed);
+ if(edgeIdx != -1 && dm) {
+ MEdge origMed;
+ dm->getEdge(dm, edgeIdx, &origMed);
- flags |= origMed.flag;
- }
+ flags |= origMed.flag;
}
for(x = 0; x < edgeSize - 1; x++) {
@@ -1160,7 +714,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
// load faces
i = 0;
mf = CDDM_get_faces(result);
- origIndex = result->getFaceData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getFaceData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -1218,8 +772,8 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
if(uvf) {
- TFace *tf = DM_get_face_data(result, i,
- LAYERTYPE_TFACE);
+ MTFace *tf = DM_get_face_data(result, i,
+ CD_MTFACE);
float *newuv;
newuv = getFaceUV(uvss, uvf, S, x + 0, y + 0,
@@ -1262,77 +816,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
return result;
}
-static void ss_sync_from_mesh(CCGSubSurf *ss, Mesh *me, DispListMesh *dlm, float (*vertexCos)[3], int useFlatSubdiv) {
- float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
- CCGVertHDL fVerts[4];
- MVert *mvert = dlm?dlm->mvert:me->mvert;
- MEdge *medge = dlm?dlm->medge:me->medge;
- MFace *mface = dlm?dlm->mface:me->mface;
- int totvert = dlm?dlm->totvert:me->totvert;
- int totedge = dlm?dlm->totedge:me->totedge;
- int totface = dlm?dlm->totface:me->totface;
- int i, index;
-
- ccgSubSurf_initFullSync(ss);
-
- for (i=0,index=-1; i<totvert; i++) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, (CCGVertHDL) i, vertexCos?vertexCos[i]:mvert[i].co, 0, &v);
-
- if (!dlm) index++;
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = index;
- }
-
- if (medge) {
- for (i=0, index=-1; i<totedge; i++) {
- MEdge *med = &medge[i];
- CCGEdge *e;
- float crease = useFlatSubdiv?creaseFactor:med->crease*creaseFactor/255.0f;
-
- ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) med->v1, (CCGVertHDL) med->v2, crease, &e);
-
- if (!dlm) index++;
- ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1] = index;
- }
- }
-
- for (i=0, index=-1; i<totface; i++) {
- MFace *mf = &((MFace*) mface)[i];
- CCGFace *f;
-
- if (!dlm) index++;
-
- fVerts[0] = (CCGVertHDL) mf->v1;
- fVerts[1] = (CCGVertHDL) mf->v2;
- fVerts[2] = (CCGVertHDL) mf->v3;
- fVerts[3] = (CCGVertHDL) mf->v4;
-
- // this is very bad, means mesh is internally consistent.
- // it is not really possible to continue without modifying
- // other parts of code significantly to handle missing faces.
- // since this really shouldn't even be possible we just bail.
- if (ccgSubSurf_syncFace(ss, (CCGFaceHDL) i, fVerts[3]?4:3, fVerts, &f)==eCCGError_InvalidValue) {
- static int hasGivenError = 0;
-
- if (!hasGivenError) {
- if (!me) {
- error("Unrecoverable error in SubSurf calculation, mesh is inconsistent.");
- } else {
- error("Unrecoverable error in SubSurf calculation, mesh(%s) is inconsistent.", me->id.name+2);
- }
-
- hasGivenError = 1;
- }
-
- return;
- }
-
- ((int*) ccgSubSurf_getFaceUserData(ss, f))[1] = index;
- }
-
- ccgSubSurf_processSync(ss);
-}
-
static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
float (*vertexCos)[3], int useFlatSubdiv)
{
@@ -1343,9 +826,9 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
int totface = dm->getNumFaces(dm);
int i;
int *index;
- MVert *mvert = dm->dupVertArray(dm);
- MEdge *medge = dm->dupEdgeArray(dm);
- MFace *mface = dm->dupFaceArray(dm);
+ MVert *mvert = dm->getVertArray(dm);
+ MEdge *medge = dm->getEdgeArray(dm);
+ MFace *mface = dm->getFaceArray(dm);
MVert *mv;
MEdge *me;
MFace *mf;
@@ -1353,7 +836,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
ccgSubSurf_initFullSync(ss);
mv = mvert;
- index = (int *)dm->getVertDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
for(i = 0; i < totvert; i++, mv++, index++) {
CCGVert *v;
@@ -1367,7 +850,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
me = medge;
- index = (int *)dm->getEdgeDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getEdgeDataArray(dm, CD_ORIGINDEX);
for(i = 0; i < totedge; i++, me++, index++) {
CCGEdge *e;
float crease;
@@ -1382,7 +865,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
mf = mface;
- index = (int *)dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getFaceDataArray(dm, CD_ORIGINDEX);
for (i = 0; i < totface; i++, mf++, index++) {
CCGFace *f;
@@ -1413,55 +896,6 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
ccgSubSurf_processSync(ss);
-
- MEM_freeN(mvert);
- MEM_freeN(medge);
- MEM_freeN(mface);
-}
-
-void ss_sync_from_editmesh(CCGSubSurf *ss, EditMesh *em, float (*vertCos)[3], int useFlatSubdiv)
-{
- float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
- EditVert *ev, *fVerts[4];
- EditEdge *ee;
- EditFace *ef;
- int i;
-
- ccgSubSurf_initFullSync(ss);
-
- if (vertCos) {
- for (i=0,ev=em->verts.first; ev; i++,ev=ev->next) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, ev, vertCos[i], 0, &v);
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = i;
- }
- } else {
- for (i=0,ev=em->verts.first; ev; i++,ev=ev->next) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, ev, ev->co, 0, &v);
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = i;
- }
- }
-
- for (i=0,ee=em->edges.first; ee; i++,ee=ee->next) {
- CCGEdge *e;
- ccgSubSurf_syncEdge(ss, ee, ee->v1, ee->v2, useFlatSubdiv?creaseFactor:ee->crease*creaseFactor, &e);
- ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1] = i;
- }
-
- for (i=0,ef=em->faces.first; ef; i++,ef=ef->next) {
- CCGFace *f;
-
- fVerts[0] = ef->v1;
- fVerts[1] = ef->v2;
- fVerts[2] = ef->v3;
- fVerts[3] = ef->v4;
-
- ccgSubSurf_syncFace(ss, ef, ef->v4?4:3, (CCGVertHDL*) fVerts, &f);
- ((int*) ccgSubSurf_getFaceUserData(ss, f))[1] = i;
- }
-
- ccgSubSurf_processSync(ss);
}
/***/
@@ -1678,28 +1112,15 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
med->v1 = getEdgeIndex(ss, e, x, edgeSize);
med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- if(ccgdm->fromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if(eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else if(ccgdm->dlm || ccgdm->me) {
+ if(ccgdm->me) {
int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
if(edgeIdx!=-1) {
- MEdge *medge = (ccgdm->dlm ? ccgdm->dlm->medge
- : ccgdm->me->medge);
+ MEdge *medge = ccgdm->me->medge;
MEdge *origMed = &medge[edgeIdx];
- if(ccgdm->dlm) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
+ flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
}
} else {
flags |= ME_EDGEDRAW | ME_EDGERENDER;
@@ -1724,7 +1145,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
int grid;
int x, y;
int lastface = ccgSubSurf_getNumFaces(ss) - 1;
- int *faceFlags = dm->getFaceData(dm, faceNum, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceData(dm, faceNum, CD_FLAGS);
memset(mf, 0, sizeof(*mf));
@@ -1746,11 +1167,11 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
mf->v3 = getFaceIndex(ss, f, grid, x+1, y+1, edgeSize, gridSize);
mf->v4 = getFaceIndex(ss, f, grid, x+1, y+0, edgeSize, gridSize);
- if(faceFlags) mf->flag = *faceFlags;
+ if(faceFlags) mf->flag = faceFlags[i];
else mf->flag = ME_SMOOTH;
}
-static void ccgDM_getFinalVertArray(DerivedMesh *dm, MVert *mvert)
+static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1804,7 +1225,7 @@ static void ccgDM_getFinalVertArray(DerivedMesh *dm, MVert *mvert)
}
}
-static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
+static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1815,10 +1236,7 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
int i = 0;
MEdge *origEdges = NULL;
- if(!ccgdm->fromEditmesh) {
- if(ccgdm->dlm) origEdges = ccgdm->dlm->medge;
- else if(ccgdm->me) origEdges = ccgdm->me->medge;
- }
+ if(ccgdm->me) origEdges = ccgdm->me->medge;
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
@@ -1870,26 +1288,14 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
- if(ccgdm->fromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if (eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else if(origEdges){
+ if(origEdges){
int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
if(edgeIdx != -1) {
MEdge *origMed = &origEdges[edgeIdx];
- if(ccgdm->dlm) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
+ flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
}
} else {
flags |= ME_EDGEDRAW | ME_EDGERENDER;
@@ -1905,7 +1311,7 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
}
}
-static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
+static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1915,12 +1321,9 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
int edgeSize = ccgSubSurf_getEdgeSize(ss);
int i = 0;
MFace *origFaces = NULL;
- int *faceFlags = dm->getFaceDataArray(dm, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
- if(!ccgdm->fromEditmesh) {
- if(ccgdm->dlm) origFaces = ccgdm->dlm->mface;
- else if(ccgdm->me) origFaces = ccgdm->me->mface;
- }
+ if(ccgdm->me) origFaces = ccgdm->me->mface;
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
@@ -1930,16 +1333,12 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
int flag = ME_SMOOTH; /* assume face is smooth by default */
if(!faceFlags) {
- if(!ccgdm->fromEditmesh && origFaces) {
+ if(origFaces) {
int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
MFace *origMFace = &origFaces[origIdx];
mat_nr = origMFace->mat_nr;
flag = origMFace->flag;
- } else if(ccgdm->fromEditmesh) {
- EditFace *ef = ccgSubSurf_getFaceFaceHandle(ss, f);
- mat_nr = ef->mat_nr;
- flag = ef->flag;
}
}
@@ -1956,7 +1355,7 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
mf->v4 = getFaceIndex(ss, f, S, x + 1, y + 0,
edgeSize, gridSize);
mf->mat_nr = mat_nr;
- if(faceFlags) mf->flag = faceFlags[i];
+ if(faceFlags) mf->flag = faceFlags[index];
else mf->flag = flag;
i++;
@@ -1986,11 +1385,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if (ccgdm->fromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(ccgdm,ss,v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
+ vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
}
ccgVertIterator_free(vi);
@@ -2000,11 +1395,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (i=0; !ccgEdgeIterator_isStopped(ei); i++,ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if (ccgdm->fromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(ccgdm,ss,e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
+ edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2013,11 +1404,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if (ccgdm->fromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(ccgdm,ss,f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
+ faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
}
ccgFaceIterator_free(fi);
@@ -2095,11 +1482,6 @@ static void ccgDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData
ccgEdgeIterator_free(ei);
}
-static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
-
- return ss_to_displistmesh(ccgdm->ss, ccgdm, ccgdm->fromEditmesh, ccgdm->drawInteriorEdges, ccgdm->useSubsurfUv, ccgdm->me, ccgdm->dlm);
-}
static void ccgDM_drawVerts(DerivedMesh *dm) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -2240,7 +1622,7 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) {
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->dlm?ccgdm->dlm->mface:ccgdm->me->mface;
+ MFace *mface = ccgdm->me->mface;
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -2364,7 +1746,7 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned ch
ccgFaceIterator_free(fi);
}
-static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tface, int matnr))
+static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(MTFace *tface, MCol *mcol, int matnr))
{
/* unimplemented, no textures in editmode anyway */
}
@@ -2376,9 +1758,8 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->dlm?ccgdm->dlm->mface:ccgdm->me->mface;
- TFace *tface = ccgdm->dlm?ccgdm->dlm->tface:ccgdm->me->tface;
- MCol *mcol = ccgdm->dlm?ccgdm->dlm->mcol:ccgdm->me->mcol;
+ MFace *mface = ccgdm->me->mface;
+ MCol *mcol = ccgdm->me->mcol;
// float uv[4][2];
// float col[4][3];
@@ -2388,20 +1769,14 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
int index = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
MFace *mf = &mface[index];
- TFace *tf = tface?&tface[index]:NULL;
unsigned char *cp= NULL;
int findex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
int flag = (findex == -1)? 0: setDrawParams(userData, findex);
- if (flag==0) {
+ if (flag==0)
continue;
- } else if (flag==1) {
- if (tf) {
- cp= (unsigned char*) tf->col;
- } else if (mcol) {
- cp= (unsigned char*) &mcol[index*4];
- }
- }
+ else if (flag==1 && mcol)
+ cp= (unsigned char*) &mcol[index*4];
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
@@ -2465,7 +1840,7 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
Mesh *me = mdm->me;
MVert *mvert= mdm->verts;
MFace *mface= me->mface;
- TFace *tface = me->tface;
+ MTFace *tface = me->mtface;
float *nors = mdm->nors;
int a;
@@ -2496,7 +1871,7 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int i, gridSize = ccgSubSurf_getGridSize(ss);
- int *faceFlags = dm->getFaceDataArray(dm, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
for (i=0; !ccgFaceIterator_isStopped(fi); i++,ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -2504,12 +1879,9 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
int drawSmooth, index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
int origIndex;
- if(ccgdm->fromEditmesh) {
- origIndex = index;
- } else {
- origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
- }
- if(faceFlags) drawSmooth = (*faceFlags & ME_SMOOTH);
+ origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
+
+ if(faceFlags) drawSmooth = (faceFlags[origIndex] & ME_SMOOTH);
else drawSmooth = 1;
if (index!=-1 && (!setDrawOptions || setDrawOptions(userData, index, &drawSmooth))) {
@@ -2646,20 +2018,18 @@ static void ccgDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *us
static void ccgDM_release(DerivedMesh *dm) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
- DM_release(dm);
-
- if (ccgdm->dlm) displistmesh_free(ccgdm->dlm);
-
- MEM_freeN(ccgdm->vertMap);
- MEM_freeN(ccgdm->edgeMap);
- MEM_freeN(ccgdm->faceMap);
- MEM_freeN(ccgdm);
+ if (DM_release(dm)) {
+ MEM_freeN(ccgdm->vertMap);
+ MEM_freeN(ccgdm->edgeMap);
+ MEM_freeN(ccgdm->faceMap);
+ MEM_freeN(ccgdm);
+ }
}
-static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
+static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int drawInteriorEdges,
int useSubsurfUv, Mesh *me,
- DispListMesh *dlm, DerivedMesh *dm)
+ DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
CCGVertIterator *vi;
@@ -2680,7 +2050,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
MVert *mvert = NULL;
MEdge *medge = NULL;
MFace *mface = NULL;
- TFace *tface;
+ MTFace *tface;
CCGSubSurf *uvss = NULL;
CCGFace **faceMap2Uv = NULL;
FaceVertWeight *qweight, *tweight;
@@ -2689,15 +2059,14 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
DM_from_template(&ccgdm->dm, dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
- DM_add_face_layer(&ccgdm->dm, LAYERTYPE_FLAGS, LAYERFLAG_NOCOPY, NULL);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
+ DM_add_face_layer(&ccgdm->dm, CD_FLAGS, CD_FLAG_NOCOPY, NULL);
} else {
DM_init(&ccgdm->dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- if(dlm) tface = dlm->tface;
- else if(me) tface = me->tface;
+ if(me) tface = me->mtface;
else tface = NULL;
}
@@ -2709,9 +2078,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.getVert = ccgDM_getFinalVert;
ccgdm->dm.getEdge = ccgDM_getFinalEdge;
ccgdm->dm.getFace = ccgDM_getFinalFace;
- ccgdm->dm.getVertArray = ccgDM_getFinalVertArray;
- ccgdm->dm.getEdgeArray = ccgDM_getFinalEdgeArray;
- ccgdm->dm.getFaceArray = ccgDM_getFinalFaceArray;
+ ccgdm->dm.copyVertArray = ccgDM_copyFinalVertArray;
+ ccgdm->dm.copyEdgeArray = ccgDM_copyFinalEdgeArray;
+ ccgdm->dm.copyFaceArray = ccgDM_copyFinalFaceArray;
ccgdm->dm.getVertData = DM_get_vert_data;
ccgdm->dm.getEdgeData = DM_get_edge_data;
ccgdm->dm.getFaceData = DM_get_face_data;
@@ -2723,7 +2092,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.foreachMappedVert = ccgDM_foreachMappedVert;
ccgdm->dm.foreachMappedEdge = ccgDM_foreachMappedEdge;
ccgdm->dm.foreachMappedFaceCenter = ccgDM_foreachMappedFaceCenter;
- ccgdm->dm.convertToDispListMesh = ccgDM_convertToDispListMesh;
ccgdm->dm.drawVerts = ccgDM_drawVerts;
ccgdm->dm.drawEdges = ccgDM_drawEdges;
@@ -2740,11 +2108,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.release = ccgDM_release;
ccgdm->ss = ss;
- ccgdm->fromEditmesh = fromEditmesh;
ccgdm->drawInteriorEdges = drawInteriorEdges;
ccgdm->useSubsurfUv = useSubsurfUv;
ccgdm->me = me;
- ccgdm->dlm = dlm;
totvert = ccgSubSurf_getNumVerts(ss);
ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
@@ -2752,11 +2118,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if(fromEditmesh) {
- ccgdm->vertMap[ccgDM_getVertMapIndex(ccgdm, ss, v)].vert = v;
- } else {
- ccgdm->vertMap[(int) ccgSubSurf_getVertVertHandle(ss, v)].vert = v;
- }
+ ccgdm->vertMap[(int) ccgSubSurf_getVertVertHandle(ss, v)].vert = v;
}
ccgVertIterator_free(vi);
@@ -2766,11 +2128,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if(fromEditmesh) {
- ccgdm->edgeMap[ccgDM_getEdgeMapIndex(ccgdm,ss,e)].edge = e;
- } else {
- ccgdm->edgeMap[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)].edge = e;
- }
+ ccgdm->edgeMap[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)].edge = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2779,29 +2137,16 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if(fromEditmesh) {
- ccgdm->faceMap[ccgDM_getFaceMapIndex(ccgdm,ss,f)].face = f;
- } else {
- ccgdm->faceMap[(int) ccgSubSurf_getFaceFaceHandle(ss, f)].face = f;
- }
+ ccgdm->faceMap[(int) ccgSubSurf_getFaceFaceHandle(ss, f)].face = f;
}
ccgFaceIterator_free(fi);
if(useSubsurfUv && tface) {
- /* slightly dodgy hack to use current ss_sync_from_uv function */
- DispListMesh dlm;
-
- dlm.mface = dm->dupFaceArray(dm);
- dlm.tface = tface;
- dlm.mvert = dm->dupVertArray(dm);
- dlm.totvert = dm->getNumVerts(dm);
- dlm.totface = dm->getNumFaces(dm);
-
/* not for editmesh currently */
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
- if(ss_sync_from_uv(uvss, ss, NULL, &dlm)) {
+ if(ss_sync_from_uv(uvss, ss, dm)) {
faceMap2Uv = MEM_mallocN(totface * sizeof(*faceMap2Uv),
"facemapuv");
@@ -2812,9 +2157,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
}
ccgFaceIterator_free(fi);
}
-
- MEM_freeN(dlm.mface);
- MEM_freeN(dlm.mvert);
}
edgeSize = ccgSubSurf_getEdgeSize(ss);
@@ -2832,24 +2174,20 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
faceNum = 0;
if(dm) {
- mvert = dm->dupVertArray(dm);
- medge = dm->dupEdgeArray(dm);
- mface = dm->dupFaceArray(dm);
- } else if(dlm) {
- mvert = dlm->mvert;
- medge = dlm->medge;
- mface = dlm->mface;
+ mvert = dm->getVertArray(dm);
+ medge = dm->getEdgeArray(dm);
+ mface = dm->getFaceArray(dm);
} else if(me) {
mvert = me->mvert;
medge = me->medge;
mface = me->mface;
}
- vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
- edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
- faceOrigIndex = DM_get_face_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
+ vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
+ edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);
+ faceOrigIndex = DM_get_face_data_layer(&ccgdm->dm, CD_ORIGINDEX);
- faceFlags = DM_get_face_data_layer(&ccgdm->dm, LAYERTYPE_FLAGS);
+ faceFlags = DM_get_face_data_layer(&ccgdm->dm, CD_FLAGS);
for(index = 0; index < totface; ++index) {
CCGFace *f = ccgdm->faceMap[index].face;
@@ -2872,10 +2210,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- if(fromEditmesh)
- vertIdx[S] = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
}
DM_interp_vert_data(dm, &ccgdm->dm, vertIdx, weight[0][0],
@@ -2924,7 +2259,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(i = 0; i < numFinalEdges; ++i)
*(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i,
- LAYERTYPE_ORIGINDEX) = ORIGINDEX_NONE;
+ CD_ORIGINDEX) = ORIGINDEX_NONE;
for(S = 0; S < numVerts; S++) {
int prevS = (S - 1 + numVerts) % numVerts;
@@ -2950,8 +2285,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
weight++;
if(uvf) {
- TFace *tf = DM_get_face_data(&ccgdm->dm, faceNum,
- LAYERTYPE_TFACE);
+ MTFace *tf = DM_get_face_data(&ccgdm->dm, faceNum,
+ CD_MTFACE);
float *newuv;
newuv = getFaceUV(uvss, uvf, S, x + 0, y + 0,
@@ -2969,18 +2304,15 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
}
*faceOrigIndex = mapIndex;
- if(mface)
- *faceFlags = mface[origIndex].flag;
- else
- *faceFlags = ME_SMOOTH;
++faceOrigIndex;
- ++faceFlags;
++faceNum;
}
}
}
+ faceFlags[index] = mface[origIndex].flag;
+
edgeNum += numFinalEdges;
}
@@ -2996,19 +2328,11 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
int x;
int vertIdx[2];
- if(fromEditmesh) {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = ccgDM_getVertMapIndex(NULL, ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = ccgDM_getVertMapIndex(NULL, ss, v);
- } else {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- }
+ CCGVert *v;
+ v = ccgSubSurf_getEdgeVert0(ss, e);
+ vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ v = ccgSubSurf_getEdgeVert1(ss, e);
+ vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
ccgdm->edgeMap[index].startVert = vertNum;
ccgdm->edgeMap[index].startEdge = edgeNum;
@@ -3028,7 +2352,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(i = 0; i < numFinalEdges; ++i)
*(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i,
- LAYERTYPE_ORIGINDEX) = mapIndex;
+ CD_ORIGINDEX) = mapIndex;
edgeNum += numFinalEdges;
}
@@ -3038,10 +2362,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
int mapIndex = ccgDM_getVertMapIndex(ccgdm, ccgdm->ss, v);
int vertIdx;
- if(fromEditmesh)
- vertIdx = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
ccgdm->vertMap[index].startVert = vertNum;
@@ -3049,17 +2370,12 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
*((int*) ccgSubSurf_getVertUserData(ss, v)) = vertNum;
DM_copy_vert_data(dm, &ccgdm->dm, vertIdx, vertNum, 1);
+
*vertOrigIndex = mapIndex;
++vertOrigIndex;
++vertNum;
}
- if(dm) {
- MEM_freeN(mvert);
- MEM_freeN(medge);
- MEM_freeN(mface);
- }
-
MEM_freeN(qweight);
MEM_freeN(tweight);
@@ -3068,91 +2384,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
/***/
-DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, SubsurfModifierData *smd, float (*vertCos)[3]) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
-
- smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, useSimple);
- ss_sync_from_editmesh(smd->emCache, em, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 1, drawInteriorEdges, 0, NULL, NULL, NULL);
-}
-
-DerivedMesh *subsurf_make_derived_from_dlm_em(DispListMesh *dlm, SubsurfModifierData *smd, float (*vertCos)[3]) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- int useSubsurfUv = smd->flags&eSubsurfModifierFlag_SubsurfUv;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
-
- smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, useSimple);
-
- ss_sync_from_mesh(smd->emCache, NULL, dlm, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 0, drawInteriorEdges, useSubsurfUv, NULL, dlm, NULL);
-}
-
-DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, SubsurfModifierData *smd, int useRenderParams, float (*vertCos)[3], int isFinalCalc) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useSubsurfUv = smd->flags&eSubsurfModifierFlag_SubsurfUv;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
- DispListMesh *ndlm;
-
- /* Do not use cache in render mode. */
- if (useRenderParams) {
- CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
-
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- ndlm = ss_to_displistmesh(ss, NULL, 0, drawInteriorEdges, useSubsurfUv, me, dlm);
- if (dlm) displistmesh_free(dlm);
-
- ccgSubSurf_free(ss);
-
- return derivedmesh_from_displistmesh(ndlm, NULL);
- } else {
- int useIncremental = (smd->flags&eSubsurfModifierFlag_Incremental);
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- CCGSubSurf *ss;
-
- /* It is quite possible there is a much better place to do this. It
- * depends a bit on how rigourously we expect this function to never
- * be called in editmode. In semi-theory we could share a single
- * cache, but the handles used inside and outside editmode are not
- * the same so we would need some way of converting them. Its probably
- * not worth the effort. But then why am I even writing this long
- * comment that no one will read? Hmmm. - zr
- */
- if (smd->emCache) {
- ccgSubSurf_free(smd->emCache);
- smd->emCache = NULL;
- }
-
- if (useIncremental && isFinalCalc) {
- smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, useAging, 0, useSimple);
-
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(ss, 0, drawInteriorEdges, useSubsurfUv, me, dlm, NULL);
- } else {
- if (smd->mCache && isFinalCalc) {
- ccgSubSurf_free(smd->mCache);
- smd->mCache = NULL;
- }
-
- ss = _getSubSurf(NULL, smd->levels, 0, 1, useSimple);
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- ndlm = ss_to_displistmesh(ss, NULL, 0, drawInteriorEdges, useSubsurfUv, me, dlm);
-
- if (dlm) displistmesh_free(dlm);
- ccgSubSurf_free(ss);
-
- return derivedmesh_from_displistmesh(ndlm, NULL);
- }
- }
-}
-
struct DerivedMesh *subsurf_make_derived_from_derived(
struct DerivedMesh *dm,
struct SubsurfModifierData *smd,
@@ -3170,9 +2401,9 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
useSimple);
ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
- return (DerivedMesh *)getCCGDerivedMesh(smd->emCache, 0,
+ return (DerivedMesh *)getCCGDerivedMesh(smd->emCache,
drawInteriorEdges,
- useSubsurfUv, NULL, NULL, dm);
+ useSubsurfUv, NULL, dm);
} else if(useRenderParams) {
/* Do not use cache in render mode. */
CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
@@ -3240,8 +2471,9 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
CCGSubSurf *ss = _getSubSurf(NULL, 1, 0, 1, 0);
float edge_sum[3], face_sum[3];
CCGVertIterator *vi;
+ DerivedMesh *dm = CDDM_from_mesh(me, NULL);
- ss_sync_from_mesh(ss, me, NULL, NULL, 0);
+ ss_sync_from_derivedmesh(ss, dm, NULL, 0);
vi = ccgSubSurf_getVertIterator(ss);
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
@@ -3272,5 +2504,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
ccgVertIterator_free(vi);
ccgSubSurf_free(ss);
+
+ dm->release(dm);
}