[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