Add helper to validate (and fix) material indices of meshes' polygons, curves' spline...
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 17 Jul 2014 15:12:12 +0000 (17:12 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 17 Jul 2014 15:16:07 +0000 (17:16 +0200)
Useful especially for importer addons.

Reviewers: campbellbarton

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D650

source/blender/blenkernel/BKE_curve.h
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/mesh_validate.c
source/blender/makesrna/intern/rna_curve_api.c
source/blender/makesrna/intern/rna_mesh_api.c

index 0f9f8cb2f087570b8ac86c759ea7fb4ac6854bab..c6aaeb8cc642f4c3f79b7e322a72e3df7bab0c86 100644 (file)
@@ -87,6 +87,7 @@ bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]);
 void BKE_curve_translate(struct Curve *cu, float offset[3], const bool do_keys);
 void BKE_curve_material_index_remove(struct Curve *cu, int index);
 void BKE_curve_material_index_clear(struct Curve *cu);
+int BKE_curve_material_index_validate(struct Curve *cu);
 
 ListBase    *BKE_curve_nurbs_get(struct Curve *cu);
 
index 975a8fd63df744f4312754441d47a974478c7f94..d0c268df93cb9e2b7b362569ea9d21cec151e624 100644 (file)
@@ -287,6 +287,7 @@ void BKE_mesh_calc_relative_deform(
 
 int BKE_mesh_validate(struct Mesh *me, const int do_verbose);
 void BKE_mesh_cd_validate(struct Mesh *me);
+int BKE_mesh_validate_material_indices(struct Mesh *me);
 
 bool BKE_mesh_validate_arrays(
         struct Mesh *me,
index 0abe956b5999f609e14eaed0eeb1d0d59cd4327b..eaeffdf6fef9b36ce4c71737004b8422f8777254 100644 (file)
@@ -52,6 +52,7 @@
 
 #include "BKE_animsys.h"
 #include "BKE_curve.h"
+#include "BKE_depsgraph.h"
 #include "BKE_displist.h"
 #include "BKE_font.h"
 #include "BKE_global.h"
@@ -4230,6 +4231,45 @@ void BKE_curve_material_index_clear(Curve *cu)
        }
 }
 
+int BKE_curve_material_index_validate(Curve *cu)
+{
+       const int curvetype = BKE_curve_type_get(cu);
+       bool is_valid = true;
+
+       if (curvetype == OB_FONT) {
+               CharInfo *info = cu->strinfo;
+               const int max_idx = max_ii(0, cu->totcol);  /* OB_FONT use 1 as first mat index, not 0!!! */
+               int i;
+               for (i = cu->len_wchar - 1; i >= 0; i--, info++) {
+                       if (info->mat_nr > max_idx) {
+                               info->mat_nr = 0;
+                               is_valid = false;
+                       }
+               }
+       }
+       else {
+               Nurb *nu;
+               const int max_idx = max_ii(0, cu->totcol - 1);
+               for (nu = cu->nurb.first; nu; nu = nu->next) {
+                       if (nu->mat_nr > max_idx) {
+                               nu->mat_nr = 0;
+                               if (curvetype == OB_CURVE) {
+                                       nu->charidx = 0;
+                               }
+                               is_valid = false;
+                       }
+               }
+       }
+
+       if (!is_valid) {
+               DAG_id_tag_update(&cu->id, OB_RECALC_DATA);
+               return true;
+       }
+       else {
+               return false;
+       }
+}
+
 void BKE_curve_rect_from_textbox(const struct Curve *cu, const struct TextBox *tb, struct rctf *r_rect)
 {
        r_rect->xmin = cu->xof + tb->x;
index 858fe83b43fed4c5a953f5186496f8e67fbe34d1..e14bb9377da4ea4de9ca1e12125d13b71a0cc986 100644 (file)
@@ -909,8 +909,6 @@ static bool mesh_validate_customdata(CustomData *data, CustomDataMask mask,
        return is_valid;
 }
 
-#undef PRINT
-
 /**
  * \returns is_valid.
  */
@@ -1052,8 +1050,36 @@ void BKE_mesh_cd_validate(Mesh *me)
                }
        }
 }
-/** \} */
 
+/**
+ * Check all material indices of polygons are valid, invalid ones are set to 0.
+ * \returns is_valid.
+ */
+int BKE_mesh_validate_material_indices(Mesh *me)
+{
+       MPoly *mp;
+       const int max_idx = max_ii(0, me->totcol - 1);
+       const int totpoly = me->totpoly;
+       int i;
+       bool is_valid = true;
+
+       for (mp = me->mpoly, i = 0; i < totpoly; i++, mp++) {
+               if (mp->mat_nr > max_idx) {
+                       mp->mat_nr = 0;
+                       is_valid = false;
+               }
+       }
+
+       if (!is_valid) {
+               DAG_id_tag_update(&me->id, OB_RECALC_DATA);
+               return true;
+       }
+       else {
+               return false;
+       }
+}
+
+/** \} */
 
 
 /* -------------------------------------------------------------------- */
index b689242f68f70f3fb76e98ea26f57d61181ccbe4..560cb633a199fb9cc35498750d6488fda6e4127a 100644 (file)
@@ -58,6 +58,12 @@ void RNA_api_curve(StructRNA *srna)
        RNA_def_function_ui_description(func, "Transform curve by a matrix");
        parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
        RNA_def_property_flag(parm, PROP_REQUIRED);
+
+       func = RNA_def_function(srna, "validate_material_indices", "BKE_curve_material_index_validate");
+       RNA_def_function_ui_description(func, "Validate material indices of splines or letters, return True when the curve "
+                                       "has had invalid indices corrected (to default 0)");
+       parm = RNA_def_boolean(func, "result", 0, "Result", "");
+       RNA_def_function_return(func, parm);
 }
 
 #endif
index 212859cfea40e56981f0220a28bde7c71571d803..3b0635156255195b9a30c1265dedefed85bab613 100644 (file)
@@ -206,11 +206,17 @@ void RNA_api_mesh(StructRNA *srna)
        RNA_def_function_return(func, parm);
 
        func = RNA_def_function(srna, "validate", "BKE_mesh_validate");
-       RNA_def_function_ui_description(func, "validate geometry, return True when the mesh has had "
+       RNA_def_function_ui_description(func, "Validate geometry, return True when the mesh has had "
                                        "invalid geometry corrected/removed");
        RNA_def_boolean(func, "verbose", 0, "Verbose", "Output information about the errors found");
        parm = RNA_def_boolean(func, "result", 0, "Result", "");
        RNA_def_function_return(func, parm);
+
+       func = RNA_def_function(srna, "validate_material_indices", "BKE_mesh_validate_material_indices");
+       RNA_def_function_ui_description(func, "Validate material indices of polygons, return True when the mesh has had "
+                                       "invalid indices corrected (to default 0)");
+       parm = RNA_def_boolean(func, "result", 0, "Result", "");
+       RNA_def_function_return(func, parm);
 }
 
 #endif