Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / intern / mesh_validate.c
index af4d1265cfd62972bb555757af94183ed3323e05..421ecf264ee8b2c14908c09804f4b3fba17f9af5 100644 (file)
@@ -223,11 +223,11 @@ bool BKE_mesh_validate_arrays(
         const bool do_verbose, const bool do_fixes,
         bool *r_changed)
 {
-#   define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; free_flag.edges = do_fixes; } (void)0
-#   define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
+#define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; free_flag.edges = do_fixes; } (void)0
+#define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
 
-#   define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; free_flag.polyloops = do_fixes; } (void)0
-#   define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; free_flag.polyloops = do_fixes; } (void)0
+#define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; free_flag.polyloops = do_fixes; } (void)0
+#define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; free_flag.polyloops = do_fixes; } (void)0
 
        MVert *mv = mverts;
        MEdge *me;
@@ -820,7 +820,7 @@ bool BKE_mesh_validate_arrays(
 }
 
 static bool mesh_validate_customdata(
-        CustomData *data, CustomDataMask mask,
+        CustomData *data, CustomDataMask mask, const uint totitems,
         const bool do_verbose, const bool do_fixes,
         bool *r_change)
 {
@@ -859,8 +859,13 @@ static bool mesh_validate_customdata(
                        }
                }
 
-               if (ok)
+               if (ok) {
+                       if (CustomData_layer_validate(layer, totitems, do_fixes)) {
+                               PRINT_ERR("\tCustomDataLayer type %d has some invalid data\n", layer->type);
+                               has_fixes = do_fixes;
+                       }
                        i++;
+               }
        }
 
        PRINT_MSG("%s: Finished (is_valid=%d)\n\n", __func__, (int)!has_fixes);
@@ -874,8 +879,10 @@ static bool mesh_validate_customdata(
  * \returns is_valid.
  */
 bool BKE_mesh_validate_all_customdata(
-        CustomData *vdata, CustomData *edata,
-        CustomData *ldata, CustomData *pdata,
+        CustomData *vdata, const uint totvert,
+        CustomData *edata, const uint totedge,
+        CustomData *ldata, const uint totloop,
+        CustomData *pdata, const uint totpoly,
         const bool check_meshmask,
         const bool do_verbose, const bool do_fixes,
         bool *r_change)
@@ -885,10 +892,10 @@ bool BKE_mesh_validate_all_customdata(
        int tot_uvloop, tot_vcolloop;
        CustomDataMask mask = check_meshmask ? CD_MASK_MESH : 0;
 
-       is_valid &= mesh_validate_customdata(vdata, mask, do_verbose, do_fixes, &is_change_v);
-       is_valid &= mesh_validate_customdata(edata, mask, do_verbose, do_fixes, &is_change_e);
-       is_valid &= mesh_validate_customdata(ldata, mask, do_verbose, do_fixes, &is_change_l);
-       is_valid &= mesh_validate_customdata(pdata, mask, do_verbose, do_fixes, &is_change_p);
+       is_valid &= mesh_validate_customdata(vdata, mask, totvert, do_verbose, do_fixes, &is_change_v);
+       is_valid &= mesh_validate_customdata(edata, mask, totedge, do_verbose, do_fixes, &is_change_e);
+       is_valid &= mesh_validate_customdata(ldata, mask, totloop, do_verbose, do_fixes, &is_change_l);
+       is_valid &= mesh_validate_customdata(pdata, mask, totpoly, do_verbose, do_fixes, &is_change_p);
 
        tot_uvloop = CustomData_number_of_layers(ldata, CD_MLOOPUV);
        tot_vcolloop = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
@@ -931,7 +938,10 @@ bool BKE_mesh_validate(Mesh *me, const bool do_verbose, const bool cddata_check_
        }
 
        is_valid &= BKE_mesh_validate_all_customdata(
-               &me->vdata, &me->edata, &me->ldata, &me->pdata,
+               &me->vdata, me->totvert,
+               &me->edata, me->totedge,
+               &me->ldata, me->totloop,
+               &me->pdata, me->totpoly,
                cddata_check_mask,
                do_verbose, true,
                &changed);
@@ -948,7 +958,7 @@ bool BKE_mesh_validate(Mesh *me, const bool do_verbose, const bool cddata_check_
                &changed);
 
        if (changed) {
-               DEG_id_tag_update(&me->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&me->id, ID_RECALC_GEOMETRY);
                return true;
        }
        else {
@@ -972,7 +982,10 @@ bool BKE_mesh_is_valid(Mesh *me)
        bool changed = true;
 
        is_valid &= BKE_mesh_validate_all_customdata(
-               &me->vdata, &me->edata, &me->ldata, &me->pdata,
+               &me->vdata, me->totvert,
+               &me->edata, me->totedge,
+               &me->ldata, me->totloop,
+               &me->pdata, me->totpoly,
                false,  /* setting mask here isn't useful, gives false positives */
                do_verbose, do_fixes, &changed);
 
@@ -1012,7 +1025,7 @@ bool BKE_mesh_validate_material_indices(Mesh *me)
        }
 
        if (!is_valid) {
-               DEG_id_tag_update(&me->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&me->id, ID_RECALC_GEOMETRY);
                return true;
        }
        else {
@@ -1350,8 +1363,8 @@ void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old)
 /**
  * Calculate edges from polygons
  *
- * \param mesh  The mesh to add edges into
- * \param update  When true create new edges co-exist
+ * \param mesh: The mesh to add edges into
+ * \param update: When true create new edges co-exist
  */
 void BKE_mesh_calc_edges(Mesh *mesh, bool update, const bool select)
 {
@@ -1460,7 +1473,7 @@ void BKE_mesh_calc_edges_loose(Mesh *mesh)
 /**
  * Calculate/create edges from tessface data
  *
- * \param mesh  The mesh to add edges into
+ * \param mesh: The mesh to add edges into
  */
 
 void BKE_mesh_calc_edges_tessface(Mesh *mesh)