[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59790] trunk/blender/source/blender/ blenkernel: debug option for modifier stack calculation USE_MODIFIER_VALIDATE,

Campbell Barton ideasman42 at gmail.com
Wed Sep 4 03:29:36 CEST 2013


Revision: 59790
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59790
Author:   campbellbarton
Date:     2013-09-04 01:29:34 +0000 (Wed, 04 Sep 2013)
Log Message:
-----------
debug option for modifier stack calculation USE_MODIFIER_VALIDATE,
checks that every modifier gives a valid mesh (very slow) - so off by default even in debug mode.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-09-04 01:15:23 UTC (rev 59789)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2013-09-04 01:29:34 UTC (rev 59790)
@@ -735,6 +735,8 @@
 char *DM_debug_info(DerivedMesh *dm);
 void DM_debug_print(DerivedMesh *dm);
 void DM_debug_print_cdlayers(CustomData *cdata);
+
+bool DM_is_valid(DerivedMesh *dm);
 #endif
 
 BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) ATTR_NONNULL(1);

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-09-04 01:15:23 UTC (rev 59789)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2013-09-04 01:29:34 UTC (rev 59790)
@@ -341,7 +341,7 @@
 /* mesh_validate.c */
 /* XXX Loop v/e are unsigned, so using max uint_32 value as invalid marker... */
 #define INVALID_LOOP_EDGE_MARKER 4294967295u
-int BKE_mesh_validate_arrays(
+bool BKE_mesh_validate_arrays(
         struct Mesh *me,
         struct MVert *mverts, unsigned int totvert,
         struct MEdge *medges, unsigned int totedge,
@@ -349,9 +349,17 @@
         struct MLoop *mloops, unsigned int totloop,
         struct MPoly *mpolys, unsigned int totpoly,
         struct MDeformVert *dverts, /* assume totvert length */
-        const bool do_verbose, const bool do_fixes);
+        const bool do_verbose, const bool do_fixes,
+        bool *r_change);
+
+bool BKE_mesh_validate_all_customdata(
+        struct CustomData *vdata, struct CustomData *edata,
+        struct CustomData *ldata, struct CustomData *pdata,
+        uint64_t mask,  /* should be CustomDataMask but thats not defined */
+        const bool do_verbose, const bool do_fixes,
+        bool *r_change);
+
 int BKE_mesh_validate(struct Mesh *me, const int do_verbose);
-int BKE_mesh_validate_dm(struct DerivedMesh *dm);
 
 void BKE_mesh_calc_edges(struct Mesh *mesh, bool update, const bool select);
 

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-09-04 01:15:23 UTC (rev 59789)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-09-04 01:29:34 UTC (rev 59790)
@@ -82,12 +82,21 @@
 #include "GPU_extensions.h"
 #include "GPU_material.h"
 
+/* very slow! enable for testing only! */
+// #define USE_MODIFIER_VALIDATE
+
+#ifdef USE_MODIFIER_VALIDATE
+#  define ASSERT_IS_VALID_DM(dm) (BLI_assert((dm == NULL) || (DM_is_valid(dm) == true)))
+#else
+#  define ASSERT_IS_VALID_DM(dm)
+#endif
+
 static void add_shapekey_layers(DerivedMesh *dm, Mesh *me, Object *ob);
 static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid);
 
-///////////////////////////////////
-///////////////////////////////////
 
+/* -------------------------------------------------------------------- */
+
 static MVert *dm_getVertArray(DerivedMesh *dm)
 {
 	MVert *mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
@@ -879,6 +888,7 @@
 			add_shapekey_layers(tdm, me, ob);
 		
 		dm = modwrap_applyModifier(md, ob, tdm, 0);
+		ASSERT_IS_VALID_DM(dm);
 
 		if (tdm != dm) tdm->release(tdm);
 	}
@@ -1650,6 +1660,7 @@
 			}
 			else {
 				dm = CDDM_from_mesh(me, ob);
+				ASSERT_IS_VALID_DM(dm);
 
 				if (build_shapekey_layers)
 					add_shapekey_layers(dm, me, ob);
@@ -1707,6 +1718,7 @@
 			}
 
 			ndm = modwrap_applyModifier(md, ob, dm, app_flags);
+			ASSERT_IS_VALID_DM(ndm);
 
 			if (ndm) {
 				/* if the modifier returned a new dm, release the old one */
@@ -1733,6 +1745,7 @@
 				                  mti->requiredDataMask(ob, md) : 0));
 
 				ndm = modwrap_applyModifier(md, ob, orcodm, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO);
+				ASSERT_IS_VALID_DM(ndm);
 
 				if (ndm) {
 					/* if the modifier returned a new dm, release the old one */
@@ -1750,6 +1763,7 @@
 				DM_set_only_copy(clothorcodm, nextmask | CD_MASK_ORIGINDEX);
 
 				ndm = modwrap_applyModifier(md, ob, clothorcodm, (app_flags & ~MOD_APPLY_USECACHE) | MOD_APPLY_ORCO);
+				ASSERT_IS_VALID_DM(ndm);
 
 				if (ndm) {
 					/* if the modifier returned a new dm, release the old one */
@@ -2052,6 +2066,7 @@
 			}
 			else {
 				dm = CDDM_from_editbmesh(em, FALSE, FALSE);
+				ASSERT_IS_VALID_DM(dm);
 
 				if (deformedVerts) {
 					CDDM_apply_vert_coords(dm, deformedVerts);
@@ -2075,6 +2090,7 @@
 					ndm = modwrap_applyModifierEM(md, ob, em, orcodm, MOD_APPLY_ORCO);
 				else
 					ndm = modwrap_applyModifier(md, ob, orcodm, MOD_APPLY_ORCO);
+				ASSERT_IS_VALID_DM(ndm);
 
 				if (ndm) {
 					/* if the modifier returned a new dm, release the old one */
@@ -2100,6 +2116,7 @@
 				ndm = modwrap_applyModifierEM(md, ob, em, dm, MOD_APPLY_USECACHE);
 			else
 				ndm = modwrap_applyModifier(md, ob, dm, MOD_APPLY_USECACHE);
+			ASSERT_IS_VALID_DM(ndm);
 
 			if (ndm) {
 				if (dm && dm != ndm)
@@ -3261,4 +3278,35 @@
 	printf("}\n");
 }
 
+bool DM_is_valid(DerivedMesh *dm)
+{
+	const bool do_verbose = true;
+	const bool do_fixes = false;
+
+	bool is_valid = true;
+	bool is_change = true;
+
+	is_valid &= BKE_mesh_validate_all_customdata(
+	        dm->getVertDataLayout(dm),
+	        dm->getEdgeDataLayout(dm),
+	        dm->getLoopDataLayout(dm),
+	        dm->getPolyDataLayout(dm),
+	        0,  /* setting mask here isn't useful, gives false positives */
+	        do_verbose, do_fixes, &is_change);
+
+	is_valid &= BKE_mesh_validate_arrays(
+	        NULL,
+	        dm->getVertArray(dm), dm->getNumVerts(dm),
+	        dm->getEdgeArray(dm), dm->getNumEdges(dm),
+	        dm->getTessFaceArray(dm), dm->getNumTessFaces(dm),
+	        dm->getLoopArray(dm), dm->getNumLoops(dm),
+	        dm->getPolyArray(dm), dm->getNumPolys(dm),
+	        dm->getVertDataArray(dm, CD_MDEFORMVERT),
+	        do_verbose, do_fixes, &is_change);
+
+	BLI_assert(is_change == false);
+
+	return is_valid;
+}
+
 #endif /* NDEBUG */

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2013-09-04 01:15:23 UTC (rev 59789)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2013-09-04 01:29:34 UTC (rev 59790)
@@ -182,16 +182,28 @@
 	return sp1->loopstart > sp2->loopstart ? 1 : sp1->loopstart < sp2->loopstart ? -1 : 0;
 }
 
-#define PRINT if (do_verbose) printf
+#define PRINT_MSG(...) (void) \
+	( \
+	 ((do_verbose) ? printf(__VA_ARGS__) : 0))
 
-int BKE_mesh_validate_arrays(Mesh *mesh,
-                             MVert *mverts, unsigned int totvert,
-                             MEdge *medges, unsigned int totedge,
-                             MFace *mfaces, unsigned int totface,
-                             MLoop *mloops, unsigned int totloop,
-                             MPoly *mpolys, unsigned int totpoly,
-                             MDeformVert *dverts, /* assume totvert length */
-                             const bool do_verbose, const bool do_fixes)
+#define PRINT_ERR(...) (void) \
+	(is_valid = false, \
+	 ((do_verbose) ? printf(__VA_ARGS__) : 0))
+
+/**
+ * Validate the mesh, \a do_fixes requires \a mesh to be non-null.
+ *
+ * \return false if no changes needed to be made.
+ */
+bool BKE_mesh_validate_arrays(Mesh *mesh,
+                              MVert *mverts, unsigned int totvert,
+                              MEdge *medges, unsigned int totedge,
+                              MFace *mfaces, unsigned int totface,
+                              MLoop *mloops, unsigned int totloop,
+                              MPoly *mpolys, unsigned int totpoly,
+                              MDeformVert *dverts, /* assume totvert length */
+                              const bool do_verbose, const bool do_fixes,
+                              bool *r_change)
 {
 #   define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; do_edge_free = true; } (void)0
 #   define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
@@ -206,6 +218,8 @@
 	unsigned int i, j;
 	int *v;
 
+	bool is_valid = true;
+
 	bool do_edge_free = false;
 	bool do_face_free = false;
 	bool do_polyloop_free = false; /* This regroups loops and polys! */
@@ -220,11 +234,11 @@
 
 	BLI_assert(!(do_fixes && mesh == NULL));
 
-	PRINT("%s: verts(%u), edges(%u), loops(%u), polygons(%u)\n",
-	      __func__, totvert, totedge, totloop, totpoly);
+	PRINT_MSG("%s: verts(%u), edges(%u), loops(%u), polygons(%u)\n",
+	          __func__, totvert, totedge, totloop, totpoly);
 
 	if (totedge == 0 && totpoly != 0) {
-		PRINT("\tLogical error, %u polygons and 0 edges\n", totpoly);
+		PRINT_ERR("\tLogical error, %u polygons and 0 edges\n", totpoly);
 		do_edge_recalc = do_fixes;
 	}
 
@@ -233,7 +247,7 @@
 
 		for (j = 0; j < 3; j++) {
 			if (!finite(mv->co[j])) {
-				PRINT("\tVertex %u: has invalid coordinate\n", i);
+				PRINT_ERR("\tVertex %u: has invalid coordinate\n", i);
 
 				if (do_fixes) {
 					zero_v3(mv->co);
@@ -247,7 +261,7 @@
 		}
 
 		if (fix_normal) {
-			PRINT("\tVertex %u: has zero normal, assuming Z-up normal\n", i);
+			PRINT_ERR("\tVertex %u: has zero normal, assuming Z-up normal\n", i);
 			if (do_fixes) {
 				mv->no[2] = SHRT_MAX;
 				verts_fixed = TRUE;
@@ -258,21 +272,21 @@
 	for (i = 0, me = medges; i < totedge; i++, me++) {
 		int remove = FALSE;
 		if (me->v1 == me->v2) {
-			PRINT("\tEdge %u: has matching verts, both %u\n", i, me->v1);
+			PRINT_ERR("\tEdge %u: has matching verts, both %u\n", i, me->v1);
 			remove = do_fixes;
 		}
 		if (me->v1 >= totvert) {
-			PRINT("\tEdge %u: v1 index out of range, %u\n", i, me->v1);
+			PRINT_ERR("\tEdge %u: v1 index out of range, %u\n", i, me->v1);
 			remove = do_fixes;
 		}
 		if (me->v2 >= totvert) {
-			PRINT("\tEdge %u: v2 index out of range, %u\n", i, me->v2);
+			PRINT_ERR("\tEdge %u: v2 index out of range, %u\n", i, me->v2);
 			remove = do_fixes;
 		}
 
 		if (BLI_edgehash_haskey(edge_hash, me->v1, me->v2)) {
-			PRINT("\tEdge %u: is a duplicate of %d\n", i,
-			      GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));
+			PRINT_ERR("\tEdge %u: is a duplicate of %d\n", i,
+			          GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list