Check for mvert coords and normals when doing mesh.validate() and set invalid

coordinates to zero and zero-length normals to Z-up direction.
This commit is contained in:
Sergey Sharybin 2011-12-01 19:21:58 +00:00
parent fa3c345dfa
commit d6d6ffd770

@ -38,6 +38,7 @@
#include "BLI_utildefines.h" #include "BLI_utildefines.h"
#include "BLI_edgehash.h" #include "BLI_edgehash.h"
#include "BLI_math_base.h"
#include "BKE_DerivedMesh.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 #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_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
# define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_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; MEdge *med;
MFace *mf; MFace *mf;
MFace *mf_prev; MFace *mf_prev;
MVert *mvert= mverts;
unsigned int i; unsigned int i;
int do_face_free= FALSE; int do_face_free= FALSE;
int do_edge_free= FALSE; int do_edge_free= FALSE;
int verts_fixed= FALSE;
int do_edge_recalc= 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; 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++) { for(i=0, med= medges; i<totedge; i++, med++) {
int remove= FALSE; int remove= FALSE;
if(med->v1 == med->v2) { 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) static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)