diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_validate.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 119 |
1 files changed, 56 insertions, 63 deletions
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 0dac4b8cd80..b3a9bf98d37 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -115,10 +115,9 @@ static int search_face_cmp(const void *v1, const void *v2) } -#define PRINT if(do_verbose) printf - int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes) { +# define PRINT if(do_verbose) printf # define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; } # define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; } @@ -283,6 +282,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve PRINT("BKE_mesh_validate: finished\n\n"); +# undef PRINT # undef REMOVE_EDGE_TAG # undef REMOVE_FACE_TAG @@ -303,62 +303,17 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve return (do_face_free || do_edge_free || do_edge_recalc); } -static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes) -{ - int i= 0, has_fixes= 0; - - while(i<data->totlayer) { - CustomDataLayer *layer= &data->layers[i]; - int mask= 1 << layer->type; - int ok= 1; - - if((mask&CD_MASK_MESH)==0) { - PRINT("CustomDataLayer type %d which isn't in CD_MASK_MESH is stored in Mehs structure\n", layer->type); - - if(do_fixes) { - CustomData_free_layer(data, layer->type, 0, i); - ok= 0; - has_fixes= 1; - } - } - - if(ok) - i++; - } - - return has_fixes; -} - -#undef PRINT - -int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes) -{ - int vfixed= 0, efixed= 0, ffixed= 0; - - vfixed= mesh_validate_customdata(vdata, do_verbose, do_fixes); - efixed= mesh_validate_customdata(edata, do_verbose, do_fixes); - ffixed= mesh_validate_customdata(fdata, do_verbose, do_fixes); - - return vfixed || efixed || ffixed; -} - int BKE_mesh_validate(Mesh *me, int do_verbose) { - int layers_fixed= 0, arrays_fixed= 0; - if(do_verbose) { printf("MESH: %s\n", me->id.name+2); } - - layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE); - arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE); - - return layers_fixed || arrays_fixed; + return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE); } int BKE_mesh_validate_dm(DerivedMesh *dm) { - return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getFaceArray(dm), dm->getNumFaces(dm), TRUE, FALSE); + return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), TRUE, FALSE); } void BKE_mesh_calc_edges(Mesh *mesh, int update) @@ -369,6 +324,7 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update) MEdge *med, *med_orig; EdgeHash *eh = BLI_edgehash_new(); int i, totedge, totface = mesh->totface; + int med_index; if(mesh->totedge==0) update= 0; @@ -381,20 +337,37 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update) BLI_edgehash_insert(eh, med->v1, med->v2, med); } - for (i = 0; i < totface; i++, mf++) { - if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2)) - BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL); - if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3)) - BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL); - - if (mf->v4) { - if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4)) - BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL); - if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1)) - BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL); - } else { - if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1)) - BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL); + if(mesh->totpoly) { + /* mesh loops (bmesh only) */ + MPoly *mp= mesh->mpoly; + for(i=0; i < mesh->totpoly; i++, mp++) { + MLoop *l= &mesh->mloop[mp->loopstart]; + int j, l_prev= (l + (mp->totloop-1))->v; + for (j=0; j < mp->totloop; j++, l++) { + if (!BLI_edgehash_haskey(eh, l_prev, l->v)) { + BLI_edgehash_insert(eh, l_prev, l->v, NULL); + } + l_prev= l->v; + } + } + } + else { + /* regular faces (note, we could remove this for bmesh - campbell) */ + for (i = 0; i < totface; i++, mf++) { + if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2)) + BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL); + if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3)) + BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL); + + if (mf->v4) { + if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4)) + BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL); + if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1)) + BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL); + } else { + if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1)) + BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL); + } } } @@ -415,9 +388,29 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update) BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2); med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */ } + + /* store the new edge index in the hash value */ + BLI_edgehashIterator_setValue(ehi, SET_INT_IN_POINTER(i)); } BLI_edgehashIterator_free(ehi); + if (mesh->totpoly) { + /* second pass, iterate through all loops again and assign + the newly created edges to them. */ + MPoly *mp= mesh->mpoly; + for(i=0; i < mesh->totpoly; i++, mp++) { + MLoop *l= &mesh->mloop[mp->loopstart]; + MLoop *l_prev= (l + (mp->totloop-1)); + int j; + for (j=0; j < mp->totloop; j++, l++) { + /* lookup hashed edge index */ + med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v)); + l_prev->e = med_index; + l_prev= l; + } + } + } + /* free old CustomData and assign new one */ CustomData_free(&mesh->edata, mesh->totedge); mesh->edata = edata; |