[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41281] trunk/blender/source/blender/ blenkernel/intern/mesh_validate.c: Workaround for #29009: Adding modifier deletes half existing mesh

Sergey Sharybin g.ulairi at gmail.com
Tue Oct 25 16:39:28 CEST 2011


Revision: 41281
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41281
Author:   nazgul
Date:     2011-10-25 14:39:27 +0000 (Tue, 25 Oct 2011)
Log Message:
-----------
Workaround for #29009: Adding modifier deletes half existing mesh

Several issues are causing problem:
- Damaged mesh topology
- Customdata layers which shouldn't be stored in Mesh
- Inconsistent normals

This patch implements custom data "filtering" when doing Mesh.validate()
from script/console to remove all customdata layers which shouldn't
be stored in Mesh.

To make .blend from report working fine again, validate should be called for
all meshes in file, then normals should be made consistent (Ctrl-N in edit mode)
and then boolean operation can be successfully applied.

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-10-25 13:44:35 UTC (rev 41280)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2011-10-25 14:39:27 UTC (rev 41281)
@@ -115,9 +115,10 @@
 
 }
 
+#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)
 {
-#	define PRINT if(do_verbose) printf
 #	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; }
 
@@ -282,7 +283,6 @@
 
 	PRINT("BKE_mesh_validate: finished\n\n");
 
-#	 undef PRINT
 #	 undef REMOVE_EDGE_TAG
 #	 undef REMOVE_FACE_TAG
 
@@ -303,12 +303,57 @@
 	return (do_face_free || do_edge_free || do_edge_recalc);
 }
 
+static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
+{
+	int i= 0, has_fixes= 0;
+
+	while(i<data->totlayer) {
+		CustomDataLayer *layer= &data->layers[i];
+		int mask= 1 << layer->type;
+		int ok= 1;
+
+		if((mask&CD_MASK_MESH)==0) {
+			PRINT("CustomDataLayer type %d which isn't in CD_MASK_MESH is stored in Mehs structure\n", layer->type);
+
+			if(do_fixes) {
+				CustomData_free_layer(data, layer->type, 0, i);
+				ok= 0;
+				has_fixes= 1;
+			}
+		}
+
+		if(ok)
+			i++;
+	}
+
+	return has_fixes;
+}
+
+#undef PRINT
+
+int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes)
+{
+	int vfixed= 0, efixed= 0, ffixed= 0;
+
+	vfixed= mesh_validate_customdata(vdata, do_verbose, do_fixes);
+	efixed= mesh_validate_customdata(edata, do_verbose, do_fixes);
+	ffixed= mesh_validate_customdata(fdata, do_verbose, do_fixes);
+
+	return vfixed || efixed || ffixed;
+}
+
 int BKE_mesh_validate(Mesh *me, int do_verbose)
 {
+	int layers_fixed= 0, arrays_fixed= 0;
+
 	if(do_verbose) {
 		printf("MESH: %s\n", me->id.name+2);
 	}
-	return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+
+	layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE);
+	arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+
+	return layers_fixed || arrays_fixed;
 }
 
 int BKE_mesh_validate_dm(DerivedMesh *dm)




More information about the Bf-blender-cvs mailing list