Check for mvert coords and normals when doing mesh.validate() and set invalid
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 1 Dec 2011 19:21:58 +0000 (19:21 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 1 Dec 2011 19:21:58 +0000 (19:21 +0000)
coordinates to zero and zero-length normals to Z-up direction.

source/blender/blenkernel/intern/mesh_validate.c

index ec24f72874dd9ecca8eeb3f91e3367a74500fd40..4295133b469d97057b454c88b0ce80e47cc9d73a 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_edgehash.h"
+#include "BLI_math_base.h"
 
 #include "BKE_DerivedMesh.h"
 
@@ -117,7 +118,7 @@ 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)
+int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes)
 {
 #      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; }
@@ -126,10 +127,12 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
        MEdge *med;
        MFace *mf;
        MFace *mf_prev;
+       MVert *mvert= mverts;
        unsigned int i;
 
        int do_face_free= FALSE;
        int do_edge_free= FALSE;
+       int verts_fixed= FALSE;
 
        int do_edge_recalc= FALSE;
 
@@ -149,6 +152,29 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
                do_edge_recalc= TRUE;
        }
 
+       for(i=1; i<totvert; i++, mvert++) {
+               int j;
+               int fix_normal= TRUE;
+
+               for(j=0; j<3; j++) {
+                       if(isnan(mvert->co[j]) || !finite(mvert->co[j])) {
+                               PRINT("    vertex %u: has invalid coordinate\n", i);
+                               zero_v3(mvert->co);
+
+                               verts_fixed= TRUE;
+                       }
+
+                       if(mvert->no[j]!=0)
+                               fix_normal= FALSE;
+               }
+
+               if(fix_normal) {
+                       PRINT("    vertex %u: has zero normal, assuming Z-up normal\n", i);
+                       mvert->no[2]= SHRT_MAX;
+                       verts_fixed= TRUE;
+               }
+       }
+
        for(i=0, med= medges; i<totedge; i++, med++) {
                int remove= FALSE;
                if(med->v1 == med->v2) {
@@ -300,7 +326,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
                }
        }
 
-       return (do_face_free || do_edge_free || do_edge_recalc);
+       return (verts_fixed || do_face_free || do_edge_free || do_edge_recalc);
 }
 
 static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)