diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_subsurf.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 105 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 135 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 15 |
6 files changed, 147 insertions, 118 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 22dfbf3da9b..8b038ed8a5d 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -75,6 +75,9 @@ struct DerivedMesh { /* Get vertex location, undefined if index is not valid */ void (*getVertCo)(DerivedMesh *dm, int index, float co_r[3]); + /* Fill the array (of length .getNumVerts()) with all vertex locations */ + void (*getVertCos)(DerivedMesh *dm, float (*cos_r)[3]); + /* Get vertex normal, undefined if index is not valid */ void (*getVertNo)(DerivedMesh *dm, int index, float no_r[3]); @@ -152,6 +155,9 @@ DerivedMesh *mesh_get_derived_final(struct Object *ob, int *needsFree_r); DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r); DerivedMesh *mesh_get_derived_deform(struct Object *ob, int *needsFree_r); +DerivedMesh *mesh_create_derived_no_deform(struct Mesh *me, float (*vertCos)[3]); +DerivedMesh *mesh_create_derived_no_deform_render(struct Mesh *me, float (*vertCos)[3]); + /* IMPORTANT: The functions below do not return "true" DerivedMesh * objects, rather they are just proxies for the mesh or editmesh * objects and are used to keep the drawing code consistent. They diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 399a62788aa..4ec8c88bbf4 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -37,7 +37,7 @@ struct DerivedMesh; struct EditMesh; struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, short type, struct DerivedMesh *oldDerived); -struct DerivedMesh *subsurf_make_derived_from_mesh(struct Object *ob, int subdivLevels, int useDeformVerts); +struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, struct Object *deformedVertsOb, float (*vertCos)[3]); void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]); diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 2dec39f4b86..b72b0933813 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -65,6 +65,7 @@ typedef struct { DerivedMesh dm; Object *ob; + Mesh *me; MVert *verts; float *nors; @@ -74,7 +75,7 @@ typedef struct { static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm"); dlm->totvert = me->totvert; @@ -94,7 +95,7 @@ static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm) static void meshDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; int i; if (me->totvert) { @@ -106,6 +107,19 @@ static void meshDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) } } +static void meshDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3]) +{ + MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; + Mesh *me = mdm->me; + int i; + + for (i=0; i<me->totvert; i++) { + cos_r[i][0] = mdm->verts[i].co[0]; + cos_r[i][1] = mdm->verts[i].co[1]; + cos_r[i][2] = mdm->verts[i].co[2]; + } +} + static void meshDM_getVertCo(DerivedMesh *dm, int index, float co_r[3]) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; @@ -129,10 +143,10 @@ static void meshDM_getVertNo(DerivedMesh *dm, int index, float no_r[3]) static void meshDM_drawVerts(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; int a, start=0, end=me->totvert; - set_buildvars(mdm->ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); glBegin(GL_POINTS); for(a= start; a<end; a++) { @@ -143,11 +157,11 @@ static void meshDM_drawVerts(DerivedMesh *dm) static void meshDM_drawEdges(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me= mdm->ob->data; + Mesh *me= mdm->me; int a, start= 0, end= me->totface; MFace *mface = me->mface; - set_buildvars(mdm->ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); mface+= start; // edges can't cope with buildvars, draw with @@ -205,11 +219,11 @@ static void meshDM_drawEdges(DerivedMesh *dm) static void meshDM_drawLooseEdges(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; MFace *mface= me->mface; int a, start=0, end=me->totface; - set_buildvars(mdm->ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); mface+= start; glBegin(GL_LINES); @@ -224,14 +238,14 @@ static void meshDM_drawLooseEdges(DerivedMesh *dm) static void meshDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; MVert *mvert= mdm->verts; MFace *mface= me->mface; float *nors = mdm->nors; int a, start=0, end=me->totface; int glmode=-1, shademodel=-1, matnr=-1, drawCurrentMat=1; - set_buildvars(mdm->ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); mface+= start; #define PASSVERT(index, punoBit) { \ @@ -286,13 +300,12 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned char *col1, unsigned char *col2) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Object *ob= mdm->ob; - Mesh *me= ob->data; + Mesh *me= mdm->me; MFace *mface= me->mface; int a, glmode, start=0, end=me->totface; unsigned char *cp1, *cp2; - set_buildvars(ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); mface+= start; col1+= 4*start; if(col2) col2+= 4*start; @@ -357,14 +370,14 @@ static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned ch static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, int matnr)) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; MVert *mvert= mdm->verts; MFace *mface= me->mface; TFace *tface = me->tface; float *nors = mdm->nors; int a, start=0, end=me->totface; - set_buildvars(mdm->ob, &start, &end); + if (mdm->ob) set_buildvars(mdm->ob, &start, &end); for (a=start; a<end; a++) { MFace *mf= &mface[a]; @@ -414,14 +427,14 @@ static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, static int meshDM_getNumVerts(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; return me->totvert; } static int meshDM_getNumFaces(DerivedMesh *dm) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; - Mesh *me = mdm->ob->data; + Mesh *me = mdm->me; return me->totface; } @@ -431,14 +444,13 @@ static void meshDM_release(DerivedMesh *dm) MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; if (mdm->freeNors) MEM_freeN(mdm->nors); - if (mdm->verts!=((Mesh*) mdm->ob->data)->mvert) MEM_freeN(mdm->verts); + if (mdm->verts!=((Mesh*) mdm->me)->mvert) MEM_freeN(mdm->verts); MEM_freeN(mdm); } -static DerivedMesh *getMeshDerivedMesh(Object *ob, MVert *deformedVerts, float *nors) +static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVerts, float *nors, float (*vertCos)[3]) { MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "mdm"); - Mesh *me = ob->data; mdm->dm.getMinMax = meshDM_getMinMax; @@ -446,6 +458,7 @@ static DerivedMesh *getMeshDerivedMesh(Object *ob, MVert *deformedVerts, float * mdm->dm.getNumVerts = meshDM_getNumVerts; mdm->dm.getNumFaces = meshDM_getNumFaces; + mdm->dm.getVertCos = meshDM_getVertCos; mdm->dm.getVertCo = meshDM_getVertCo; mdm->dm.getVertNo = meshDM_getVertNo; @@ -462,9 +475,21 @@ static DerivedMesh *getMeshDerivedMesh(Object *ob, MVert *deformedVerts, float * mdm->dm.release = meshDM_release; mdm->ob = ob; + mdm->me = me; mdm->nors = nors; mdm->freeNors = 0; + if (vertCos) { + int i; + + deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedVerts"); + for (i=0; i<me->totvert; i++) { + deformedVerts[i].co[0] = vertCos[i][0]; + deformedVerts[i].co[1] = vertCos[i][1]; + deformedVerts[i].co[2] = vertCos[i][2]; + } + } + if (deformedVerts) { mdm->verts = deformedVerts; mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors); @@ -889,6 +914,18 @@ static void ssDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) } } +static void ssDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3]) +{ + SSDerivedMesh *ssdm = (SSDerivedMesh*) dm; + int i; + + for (i=0; i<ssdm->dlm->totvert; i++) { + cos_r[i][0] = ssdm->dlm->mvert[i].co[0]; + cos_r[i][1] = ssdm->dlm->mvert[i].co[1]; + cos_r[i][2] = ssdm->dlm->mvert[i].co[2]; + } +} + static int ssDM_getNumVerts(DerivedMesh *dm) { SSDerivedMesh *ssdm = (SSDerivedMesh*) dm; @@ -928,6 +965,8 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm) ssdm->dm.getNumFaces = ssDM_getNumFaces; ssdm->dm.convertToDispListMesh = ssDM_convertToDispListMesh; + ssdm->dm.getVertCos = ssDM_getVertCos; + ssdm->dm.drawVerts = ssDM_drawVerts; ssdm->dm.drawEdges = ssDM_drawEdges; @@ -1014,7 +1053,7 @@ DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r) *needsFree_r = 1; meDL = me->disp.first; - return getMeshDerivedMesh(ob, NULL, meDL?meDL->nors:NULL); + return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL); } } @@ -1038,7 +1077,7 @@ DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree_r) if(G.obedit && me==G.obedit->data) { return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->subsurftype, NULL); } else { - return subsurf_make_derived_from_mesh(ob, me->subdivr, 1); + return subsurf_make_derived_from_mesh(ob->data, me->subdivr, ob, NULL); } } else { return mesh_get_derived_deform(ob, needsFree_r); @@ -1056,7 +1095,7 @@ DerivedMesh *mesh_get_base_derived(Object *ob) } else { DispList *meDL = me->disp.first; - return getMeshDerivedMesh(ob, NULL, meDL?meDL->nors:NULL); + return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL); } } @@ -1082,5 +1121,23 @@ DerivedMesh *derivedmesh_from_mesh(Object *ob, MVert *deformedVerts) { Mesh *me = ob->data; - return getMeshDerivedMesh(ob, deformedVerts, NULL); + return getMeshDerivedMesh(ob->data, ob, deformedVerts, NULL, NULL); +} + +DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3]) +{ + if ((me->flag&ME_SUBSURF) && me->subdiv) { + return subsurf_make_derived_from_mesh(me, me->subdiv, NULL, vertCos); + } else { + return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos); + } +} + +DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3]) +{ + if ((me->flag&ME_SUBSURF) && me->subdivr) { + return subsurf_make_derived_from_mesh(me, me->subdivr, NULL, vertCos); + } else { + return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos); + } } diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index ca4822f0dd3..6ce0118dd6c 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1447,7 +1447,7 @@ void makeDispListMesh(Object *ob) if (ob==G.obedit) { G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived); } else { - me->derived= subsurf_make_derived_from_mesh(ob, me->subdiv, 1); + me->derived= subsurf_make_derived_from_mesh(ob->data, me->subdiv, ob, NULL); } } diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 61c75ef79e8..7aa5b8ca0b7 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -428,112 +428,73 @@ void mesh_get_texspace(Mesh *me, float *loc_r, float *rot_r, float *size_r) if (size_r) VECCOPY(size_r, me->size); } -static float *make_orco_displist_mesh(Object *ob, int subdivlvl) +static float *make_orco_mesh_internal(Mesh *me, int render) { - Mesh *me= ob->data; + float (*orcoData)[3]; + int a, totvert; + float loc[3], size[3]; DerivedMesh *dm; - DispListMesh *dlm; - float *orco, *fp, loc[3], size[3]; - int i; - - if (G.obedit && G.obedit->data==me) { - dm= subsurf_make_derived_from_editmesh(G.editMesh, subdivlvl, me->subsurftype, NULL); - dlm= dm->convertToDispListMesh(dm); - dm->release(dm); - } else { - /* if there's a key, set the first one */ - if(me->key && me->texcomesh==0) { - cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0); - } + float (*vcos)[3] = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh"); - dm= subsurf_make_derived_from_mesh(ob, subdivlvl, 0); - dlm= dm->convertToDispListMesh(dm); - dm->release(dm); - - /* Restore correct key */ - do_ob_key(ob); - } + /* Get appropriate vertex coordinates */ - fp= orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco"); - - mesh_get_texspace(me, loc, NULL, size); - for(i=0; i<dlm->totvert; i++,fp+=3) { - fp[0]= (dlm->mvert[i].co[0] - loc[0])/size[0]; - fp[1]= (dlm->mvert[i].co[1] - loc[1])/size[1]; - fp[2]= (dlm->mvert[i].co[2] - loc[2])/size[2]; - } - - displistmesh_free(dlm); - - return orco; -} - -static float *make_orco_mesh(Mesh *me) -{ - MVert *mvert; - KeyBlock *kb; - float *orcoData, *orco, *fp; - int a, totvert; - float loc[3], size[3]; - - totvert= me->totvert; - orco= orcoData= MEM_mallocN(sizeof(float)*3*totvert, "orco mesh"); + if(me->key && me->texcomesh==0 && me->key->refkey) { + KeyBlock *kb= me->key->refkey; + float *fp= kb->data; + totvert= MIN2(kb->totelem, me->totvert); - mesh_get_texspace(me, loc, NULL, size); - if(me->key && me->texcomesh==0) { - kb= me->key->refkey; - if (kb) { /***** BUG *****/ - fp= kb->data; - - for(a=0; a<totvert; a++, orco+=3) { - orco[0]= (fp[0]-loc[0])/size[0]; - orco[1]= (fp[1]-loc[1])/size[1]; - orco[2]= (fp[2]-loc[2])/size[2]; - - /* only increase mvert when totvert <= kb->totelem */ - if(a<kb->totelem) fp+=3; - } + for(a=0; a<totvert; a++, fp+=3) { + vcos[a][0]= fp[0]; + vcos[a][1]= fp[1]; + vcos[a][2]= fp[2]; } } else { - if(me->texcomesh) { - me= me->texcomesh; - } - - mvert= me->mvert; - for(a=0; a<totvert; a++, orco+=3) { - orco[0]= (mvert->co[0]-loc[0])/size[0]; - orco[1]= (mvert->co[1]-loc[1])/size[1]; - orco[2]= (mvert->co[2]-loc[2])/size[2]; - - /* only increase mvert when totvert <= me->totvert */ - if(a<me->totvert) mvert++; + Mesh *tme = me->texcomesh?me->texcomesh:me; + MVert *mvert = tme->mvert; + totvert = MIN2(tme->totvert, me->totvert); + + for(a=0; a<totvert; a++, mvert++) { + vcos[a][0]= mvert->co[0]; + vcos[a][1]= mvert->co[1]; + vcos[a][2]= mvert->co[2]; } } - return orcoData; + /* Apply orco-changing modifiers */ + + if (render) { + dm = mesh_create_derived_no_deform_render(me, vcos); + } else { + dm = mesh_create_derived_no_deform(me, vcos); + } + totvert = dm->getNumVerts(dm); + + orcoData = MEM_mallocN(sizeof(*orcoData)*totvert, "orcoData"); + dm->getVertCos(dm, orcoData); + dm->release(dm); + MEM_freeN(vcos); + + mesh_get_texspace(me, loc, NULL, size); + + for(a=0; a<totvert; a++) { + float *co = orcoData[a]; + co[0] = (co[0]-loc[0])/size[0]; + co[1] = (co[1]-loc[1])/size[1]; + co[2] = (co[2]-loc[2])/size[2]; + } + + return (float*) orcoData; } float *mesh_create_orco_render(Object *ob) { - Mesh *me = ob->data; - - if ((me->flag&ME_SUBSURF) && me->subdivr) { - return make_orco_displist_mesh(ob, me->subdivr); - } else { - return make_orco_mesh(me); - } + return make_orco_mesh_internal(ob->data, 1); } float *mesh_create_orco(Object *ob) { - Mesh *me = ob->data; - - if ((me->flag&ME_SUBSURF) && me->subdiv) { - return make_orco_displist_mesh(ob, me->subdiv); - } else { - return make_orco_mesh(me); - } + return make_orco_mesh_internal(ob->data, 0); } /** rotates the vertices of a face in case v[2] or v[3] (vertex index) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 5b417d15d7f..559848b2932 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -73,6 +73,7 @@ typedef struct _SubSurf { Mesh *me; Object *deformOb; + float (*vertCos)[3]; } SubSurf; typedef struct _VertData { @@ -144,7 +145,7 @@ static SubSurf *subSurf_fromEditmesh(EditMesh *em, int subdivLevels, int useAgin return ss; } -static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, Object *deformOb) { +static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, Object *deformOb, float (*vertCos)[3]) { SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_m"); ss->controlType = SUBSURF_CONTROLTYPE_MESH; @@ -152,6 +153,7 @@ static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, ss->subSurf = _getSubSurf(ss, subdivLevels, 1); ss->me = me; ss->deformOb = deformOb; + ss->vertCos = vertCos; ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f); @@ -515,6 +517,10 @@ static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) { } displistmesh_free(dlm); + } else if (ss->vertCos) { + for (i=0; i<ss->me->totvert; i++) { + ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->vertCos[i]); + } } else { for (i=0; i<ss->me->totvert; i++) { ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->me->mvert[i].co); @@ -1017,10 +1023,9 @@ DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels, return (DerivedMesh*) ccgdm; } -DerivedMesh *subsurf_make_derived_from_mesh(Object *ob, int subdivLevels, int useDeformVerts) { - Mesh *me = ob->data; +DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, Object *deformedVertsOb, float (*vertCos)[3]) { int useFlatSubdiv = me->subsurftype==ME_SIMPLE_SUBSURF; - SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, useDeformVerts?ob:NULL); + SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, deformedVertsOb, vertCos); DispListMesh *dlm; subSurf_sync(ss, useFlatSubdiv); @@ -1039,7 +1044,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) * calculated vert positions is incorrect for the verts * on the boundary of the mesh. */ - SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL); + SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL, NULL); float edge_sum[3], face_sum[3]; CCGVertIterator *vi; |