[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