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/mesh_validate.c')
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c119
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;