diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-14 15:29:58 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-14 15:29:58 +0400 |
commit | 503b7d5b9a385fdcd220df3142857300d912d80c (patch) | |
tree | d25f1c3c59edd0e8c30faf984cc681af9ada9fc8 /source | |
parent | 1979720d0324b84e4993557d30ff833f71e688fd (diff) |
add materials.clear() method, matching other python list method.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_curve.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 28 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 56 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 33 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_ID.c | 17 |
7 files changed, 119 insertions, 27 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 93f9ec276aa..baa90e7a856 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -69,7 +69,8 @@ bool BKE_curve_minmax(struct Curve *cu, float min[3], float max[3]); bool BKE_curve_center_median(struct Curve *cu, float cent[3]); bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]); void BKE_curve_translate(struct Curve *cu, float offset[3], int do_keys); -void BKE_curve_delete_material_index(struct Curve *cu, int index); +void BKE_curve_material_index_remove(struct Curve *cu, int index); +void BKE_curve_material_index_clear(struct Curve *cu); ListBase *BKE_curve_nurbs_get(struct Curve *cu); diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 5d8406ba76f..f52dc030873 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -87,9 +87,9 @@ int object_add_material_slot(struct Object *ob); int object_remove_material_slot(struct Object *ob); /* rna api */ -void material_append_id(struct ID *id, struct Material *ma); -struct Material *material_pop_id(struct ID *id, int index, bool remove_material_slot); /* index is an int because of RNA */ - +void BKE_material_append_id(struct ID *id, struct Material *ma); +struct Material *BKE_material_pop_id(struct ID *id, int index, bool update_data); /* index is an int because of RNA */ +void BKE_material_clear_id(struct ID *id, bool update_data); /* rendering */ void init_render_material(struct Material *, int, float *); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 1c88a5c45dd..e582af77d61 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -188,7 +188,8 @@ void BKE_mesh_from_nurbs_displist(struct Object *ob, struct ListBase *dispbase, void BKE_mesh_from_nurbs(struct Object *ob); void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test); void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob); -void BKE_mesh_delete_material_index(struct Mesh *me, short index); +void BKE_mesh_material_index_remove(struct Mesh *me, short index); +void BKE_mesh_material_index_clear(struct Mesh *me); void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth); void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh); void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index b02d587940a..2285d7d8dc0 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -3819,7 +3819,7 @@ void BKE_curve_translate(Curve *cu, float offset[3], int do_keys) } } -void BKE_curve_delete_material_index(Curve *cu, int index) +void BKE_curve_material_index_remove(Curve *cu, int index) { const int curvetype = BKE_curve_type_get(cu); @@ -3838,8 +3838,32 @@ void BKE_curve_delete_material_index(Curve *cu, int index) for (nu = cu->nurb.first; nu; nu = nu->next) { if (nu->mat_nr && nu->mat_nr >= index) { nu->mat_nr--; - if (curvetype == OB_CURVE) + if (curvetype == OB_CURVE) { nu->charidx--; + } + } + } + } +} + +void BKE_curve_material_index_clear(Curve *cu) +{ + const int curvetype = BKE_curve_type_get(cu); + + if (curvetype == OB_FONT) { + struct CharInfo *info = cu->strinfo; + int i; + for (i = cu->len - 1; i >= 0; i--, info++) { + info->mat_nr = 0; + } + } + else { + Nurb *nu; + + for (nu = cu->nurb.first; nu; nu = nu->next) { + nu->mat_nr = 0; + if (curvetype == OB_CURVE) { + nu->charidx = 0; } } } diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index b9114c24091..1bda662a8b0 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -537,17 +537,17 @@ short *give_totcolp_id(ID *id) return NULL; } -static void data_delete_material_index_id(ID *id, short index) +static void material_data_index_remove_id(ID *id, short index) { /* ensure we don't try get materials from non-obdata */ BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); switch (GS(id->name)) { case ID_ME: - BKE_mesh_delete_material_index((Mesh *)id, index); + BKE_mesh_material_index_remove((Mesh *)id, index); break; case ID_CU: - BKE_curve_delete_material_index((Curve *)id, index); + BKE_curve_material_index_remove((Curve *)id, index); break; case ID_MB: /* meta-elems don't have materials atm */ @@ -555,7 +555,25 @@ static void data_delete_material_index_id(ID *id, short index) } } -void material_append_id(ID *id, Material *ma) +static void material_data_index_clear_id(ID *id) +{ + /* ensure we don't try get materials from non-obdata */ + BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); + + switch (GS(id->name)) { + case ID_ME: + BKE_mesh_material_index_clear((Mesh *)id); + break; + case ID_CU: + BKE_curve_material_index_clear((Curve *)id); + break; + case ID_MB: + /* meta-elems don't have materials atm */ + break; + } +} + +void BKE_material_append_id(ID *id, Material *ma) { Material ***matar; if ((matar = give_matarar_id(id))) { @@ -572,7 +590,7 @@ void material_append_id(ID *id, Material *ma) } } -Material *material_pop_id(ID *id, int index_i, bool remove_material_slot) +Material *BKE_material_pop_id(ID *id, int index_i, bool update_data) { short index = (short)index_i; Material *ret = NULL; @@ -597,9 +615,9 @@ Material *material_pop_id(ID *id, int index_i, bool remove_material_slot) test_object_materials(G.main, id); } - if (remove_material_slot) { + if (update_data) { /* decrease mat_nr index */ - data_delete_material_index_id(id, index); + material_data_index_remove_id(id, index); } } } @@ -607,6 +625,24 @@ Material *material_pop_id(ID *id, int index_i, bool remove_material_slot) return ret; } +void BKE_material_clear_id(struct ID *id, bool update_data) +{ + Material ***matar; + if ((matar = give_matarar_id(id))) { + short *totcol = give_totcolp_id(id); + *totcol = 0; + if (*matar) { + MEM_freeN(*matar); + *matar = NULL; + } + + if (update_data) { + /* decrease mat_nr index */ + material_data_index_clear_id(id); + } + } +} + Material *give_current_material(Object *ob, short act) { Material ***matarar, *ma; @@ -1217,7 +1253,7 @@ int object_remove_material_slot(Object *ob) /* check indices from mesh */ if (ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT)) { - data_delete_material_index_id((ID *)ob->data, actcol - 1); + material_data_index_remove_id((ID *)ob->data, actcol - 1); BKE_displist_free(&ob->disp); } @@ -1693,7 +1729,7 @@ static short mesh_getmaterialnumber(Mesh *me, Material *ma) /* append material */ static short mesh_addmaterial(Mesh *me, Material *ma) { - material_append_id(&me->id, NULL); + BKE_material_append_id(&me->id, NULL); me->mat[me->totcol - 1] = ma; id_us_plus(&ma->id); @@ -1832,7 +1868,7 @@ static void convert_tfacematerial(Main *main, Material *ma) /* remove material from mesh */ for (a = 0; a < me->totcol; ) { if (me->mat[a] == ma) { - material_pop_id(&me->id, a, true); + BKE_material_pop_id(&me->id, a, true); } else { a++; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 095957b40d5..0db1f92f70f 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1852,20 +1852,37 @@ void BKE_mesh_to_curve(Scene *scene, Object *ob) } } -void BKE_mesh_delete_material_index(Mesh *me, short index) +void BKE_mesh_material_index_remove(Mesh *me, short index) { + MPoly *mp; + MFace *mf; int i; - for (i = 0; i < me->totpoly; i++) { - MPoly *mp = &((MPoly *) me->mpoly)[i]; - if (mp->mat_nr && mp->mat_nr >= index) + for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) { + if (mp->mat_nr && mp->mat_nr >= index) { mp->mat_nr--; + } } - - for (i = 0; i < me->totface; i++) { - MFace *mf = &((MFace *) me->mface)[i]; - if (mf->mat_nr && mf->mat_nr >= index) + + for (mf = me->mface, i = 0; i < me->totface; i++, mf++) { + if (mf->mat_nr && mf->mat_nr >= index) { mf->mat_nr--; + } + } +} + +void BKE_mesh_material_index_clear(Mesh *me) +{ + MPoly *mp; + MFace *mf; + int i; + + for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) { + mp->mat_nr = 0; + } + + for (mf = me->mface, i = 0; i < me->totface; i++, mf++) { + mf->mat_nr = 0; } } diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 76337da3261..26febf217a6 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -347,7 +347,7 @@ int rna_IDMaterials_assign_int(PointerRNA *ptr, int key, const PointerRNA *assig static void rna_IDMaterials_append_id(ID *id, Material *ma) { - material_append_id(id, ma); + BKE_material_append_id(id, ma); WM_main_add_notifier(NC_OBJECT | ND_DRAW, id); WM_main_add_notifier(NC_OBJECT | ND_OB_SHADING, id); @@ -367,7 +367,7 @@ static Material *rna_IDMaterials_pop_id(ID *id, ReportList *reports, int index_i return NULL; } - ma = material_pop_id(id, index_i, remove_material_slot); + ma = BKE_material_pop_id(id, index_i, remove_material_slot); if (*totcol == totcol_orig) { BKE_report(reports, RPT_ERROR, "No material to removed"); @@ -381,6 +381,15 @@ static Material *rna_IDMaterials_pop_id(ID *id, ReportList *reports, int index_i return ma; } +static void rna_IDMaterials_clear_id(ID *id, int remove_material_slot) +{ + BKE_material_clear_id(id, remove_material_slot); + + DAG_id_tag_update(id, OB_RECALC_DATA); + WM_main_add_notifier(NC_OBJECT | ND_DRAW, id); + WM_main_add_notifier(NC_OBJECT | ND_OB_SHADING, id); +} + static void rna_Library_filepath_set(PointerRNA *ptr, const char *value) { Library *lib = (Library *)ptr->data; @@ -499,6 +508,10 @@ static void rna_def_ID_materials(BlenderRNA *brna) RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned"); parm = RNA_def_pointer(func, "material", "Material", "", "Material to remove"); RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "clear", "rna_IDMaterials_clear_id"); + RNA_def_function_ui_description(func, "Remove all materials from the data block"); + RNA_def_boolean(func, "update_data", 0, "", "Update data by re-adjusting the material slots assigned"); } static void rna_def_ID(BlenderRNA *brna) |