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:
-rw-r--r--source/blender/blenkernel/BKE_mesh.h6
-rw-r--r--source/blender/blenkernel/intern/mesh.c2
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c38
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c5
4 files changed, 24 insertions, 27 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index f5e8901ac70..02d52e10fa5 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -152,9 +152,9 @@ int mesh_center_bounds(struct Mesh *me, float cent[3]);
void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
/* mesh_validate.c */
-void BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, int totvert, struct MEdge *medges, int totedge, struct MFace *mfaces, int totface, const short do_verbose, const short do_fixes);
-void BKE_mesh_validate(struct Mesh *me);
-void BKE_mesh_validate_dm(struct DerivedMesh *dm);
+int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, int totvert, struct MEdge *medges, int totedge, struct MFace *mfaces, int totface, const short do_verbose, const short do_fixes);
+int BKE_mesh_validate(struct Mesh *me, int do_verbose);
+int BKE_mesh_validate_dm(struct DerivedMesh *dm);
void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 24b680703f9..2953fb17e90 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -709,7 +709,7 @@ void mesh_strip_loose_edges(Mesh *me)
int a,b;
for (a=b=0; a<me->totedge; a++) {
- if (me->medge[a].v1==me->medge[a].v2) {
+ if (me->medge[a].v1!=me->medge[a].v2) {
if (a!=b) {
memcpy(&me->medge[b],&me->medge[a],sizeof(me->medge[b]));
CustomData_copy_data(&me->edata, &me->edata, a, b, 1);
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index e45d3a48047..35a23a17115 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -109,7 +109,7 @@ static int search_face_cmp(const void *v1, const void *v2)
return 0;
}
-void BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge *medges, int totedge, MFace *mfaces, int totface, const short do_verbose, const short do_fixes)
+int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge *medges, int totedge, MFace *mfaces, 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; }
@@ -169,17 +169,15 @@ void BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdg
}
}
- for(i=0, mf=mfaces; i<totface; i++, mf++) {
- unsigned int fverts[4];
- // unsigned int fedges[4];
- int fidx;
+ for(i=0, mf=mfaces, sf=sort_faces; i<totface; i++, mf++) {
int remove= FALSE;
+ int fidx;
fidx = mf->v4 ? 3:2;
do {
- fverts[fidx]= *(&mf->v1 + fidx);
- if(fverts[fidx] >= totvert) {
- PRINT(" face %d: 'v%d' index out of range, %d\n", i, fidx + 1, fverts[fidx]);
+ sf->v[fidx]= *(&mf->v1 + fidx);
+ if(sf->v[fidx] >= totvert) {
+ PRINT(" face %d: 'v%d' index out of range, %d\n", i, fidx + 1, sf->v[fidx]);
remove= do_fixes;
}
} while (fidx--);
@@ -220,21 +218,15 @@ void BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdg
sort_faces[totsortface].index = i;
if(mf->v4) {
- qsort(fverts, 4, sizeof(unsigned int), uint_cmp);
- sort_faces[i].v[0] = fverts[0];
- sort_faces[i].v[1] = fverts[1];
- sort_faces[i].v[2] = fverts[2];
- sort_faces[i].v[3] = fverts[3];
+ qsort(sf->v, 4, sizeof(unsigned int), uint_cmp);
}
else {
- qsort(fverts, 3, sizeof(unsigned int), uint_cmp);
- sort_faces[i].v[0] = fverts[0];
- sort_faces[i].v[1] = fverts[1];
- sort_faces[i].v[2] = fverts[2];
- sort_faces[i].v[3] = UINT_MAX;
+ qsort(sf->v, 3, sizeof(unsigned int), uint_cmp);
+ sf->v[3] = UINT_MAX;
}
totsortface++;
+ sf++;
}
}
if(remove) {
@@ -322,17 +314,19 @@ void BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdg
BKE_mesh_calc_edges(me, TRUE);
}
}
+
+ return (do_face_free || do_edge_free || do_edge_recalc);
}
-void BKE_mesh_validate(Mesh *me)
+int BKE_mesh_validate(Mesh *me, int do_verbose)
{
printf("MESH: %s\n", me->id.name+2);
- BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, TRUE, TRUE);
+ return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
}
-void BKE_mesh_validate_dm(DerivedMesh *dm)
+int BKE_mesh_validate_dm(DerivedMesh *dm)
{
- 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->getFaceArray(dm), dm->getNumFaces(dm), TRUE, FALSE);
}
void BKE_mesh_calc_edges(Mesh *mesh, int update)
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index dd78e93835e..3090f8512e0 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -59,7 +59,10 @@ void RNA_api_mesh(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
func= RNA_def_function(srna, "validate", "BKE_mesh_validate");
- RNA_def_function_ui_description(func, "validate geometry.");
+ RNA_def_function_ui_description(func, "validate geometry, return True when the mesh has had invalid geometry corrected/removed.");
+ parm= RNA_def_boolean(func, "verbose", 0, "Verbose", "Output information about the errors found");
+ parm= RNA_def_boolean(func, "result", 0, "Result", "");
+ RNA_def_function_return(func, parm);
}
#endif