[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42324] trunk/blender/source/blender/ blenkernel/intern/mesh_validate.c: Check for mvert coords and normals when doing mesh.validate() and set invalid

Sergey Sharybin sergey.vfx at gmail.com
Thu Dec 1 20:22:02 CET 2011


Revision: 42324
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42324
Author:   nazgul
Date:     2011-12-01 19:21:58 +0000 (Thu, 01 Dec 2011)
Log Message:
-----------
Check for mvert coords and normals when doing mesh.validate() and set invalid
coordinates to zero and zero-length normals to Z-up direction.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-01 18:49:42 UTC (rev 42323)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-12-01 19:21:58 UTC (rev 42324)
@@ -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 @@
 
 #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 @@
 	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 @@
 		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 @@
 		}
 	}
 
-	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)




More information about the Bf-blender-cvs mailing list