Revision: 34753
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34753
Author:   campbellbarton
Date:     2011-02-10 09:29:31 +0000 (Thu, 10 Feb 2011)
Log Message:
-----------
mesh.validate() now returns True if any corrections were made.
tested that correcting invalid meshes works by generating random meshes and 
checking that only the first call to mesh.validate() makes changes.

found 2 bugs in mesh validation.
- face sorting array wasn't assigned correct indices.
- removing invalid edges used wrong comparison.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
    trunk/blender/source/blender/makesrna/intern/rna_mesh_api.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h  2011-02-10 07:22:56 UTC 
(rev 34752)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h  2011-02-10 09:29:31 UTC 
(rev 34753)
@@ -152,9 +152,9 @@
 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);
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c       2011-02-10 
07:22:56 UTC (rev 34752)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c       2011-02-10 
09:29:31 UTC (rev 34753)
@@ -709,7 +709,7 @@
        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);

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c      
2011-02-10 07:22:56 UTC (rev 34752)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c      
2011-02-10 09:29:31 UTC (rev 34753)
@@ -109,7 +109,7 @@
        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 @@
                }
        }
 
-       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 @@
                                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 @@
                        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)

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh_api.c 2011-02-10 
07:22:56 UTC (rev 34752)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh_api.c 2011-02-10 
09:29:31 UTC (rev 34753)
@@ -59,7 +59,10 @@
        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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to