From a2f357edc2afb8f3ded60bc0e48c4015d6ad8f40 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Wed, 31 Jul 2019 12:04:52 -0700 Subject: Add operator for removing unused material slots Reviewers: campbellbarton, brecht Reviewed By: brecht Subscribers: brecht Differential Revision: https://developer.blender.org/D4991 --- source/blender/blenkernel/BKE_curve.h | 1 + source/blender/blenkernel/BKE_gpencil.h | 1 + source/blender/blenkernel/BKE_material.h | 1 + source/blender/blenkernel/BKE_mesh.h | 1 + source/blender/blenkernel/intern/curve.c | 26 ++++++++++++++++++++++++++ source/blender/blenkernel/intern/gpencil.c | 16 ++++++++++++++++ source/blender/blenkernel/intern/material.c | 20 ++++++++++++++++++++ source/blender/blenkernel/intern/mesh.c | 21 +++++++++++++++++++++ 8 files changed, 87 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index df1e7a7baea..51ff4673aba 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -109,6 +109,7 @@ void BKE_curve_transform(struct Curve *cu, const bool do_props); 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); +bool BKE_curve_material_index_used(struct Curve *cu, int index); void BKE_curve_material_index_clear(struct Curve *cu); bool BKE_curve_material_index_validate(struct Curve *cu); void BKE_curve_material_remap(struct Curve *cu, const unsigned int *remap, unsigned int remap_len); diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index ae1000d1b99..60e9e6b91d3 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -87,6 +87,7 @@ void BKE_gpencil_frame_delete_laststroke(struct bGPDlayer *gpl, struct bGPDframe /* materials */ void BKE_gpencil_material_index_reassign(struct bGPdata *gpd, int totcol, int index); +bool BKE_gpencil_material_index_used(struct bGPdata *gpd, int index); void BKE_gpencil_material_remap(struct bGPdata *gpd, const unsigned int *remap, unsigned int remap_len); diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 268cf831456..b1200c7e608 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -90,6 +90,7 @@ void assign_matarar(struct Main *bmain, struct Object *ob, struct Material ***ma short BKE_object_material_slot_find_index(struct Object *ob, struct Material *ma); bool BKE_object_material_slot_add(struct Main *bmain, struct Object *ob); bool BKE_object_material_slot_remove(struct Main *bmain, struct Object *ob); +bool BKE_object_material_slot_used(struct ID *id, short actcol); struct MaterialGPencilStyle *BKE_material_gpencil_settings_get(struct Object *ob, short act); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 3b7fe208bb6..59812df246f 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -182,6 +182,7 @@ void BKE_mesh_to_curve(struct Main *bmain, struct Scene *scene, struct Object *ob); void BKE_mesh_material_index_remove(struct Mesh *me, short index); +bool BKE_mesh_material_index_used(struct Mesh *me, short index); void BKE_mesh_material_index_clear(struct Mesh *me); void BKE_mesh_material_remap(struct Mesh *me, const unsigned int *remap, unsigned int remap_len); void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 931c0ed73d3..efdfa2c19bb 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -5313,6 +5313,32 @@ void BKE_curve_material_index_remove(Curve *cu, int index) } } +bool BKE_curve_material_index_used(Curve *cu, int index) +{ + const int curvetype = BKE_curve_type_get(cu); + + if (curvetype == OB_FONT) { + struct CharInfo *info = cu->strinfo; + int i; + for (i = cu->len_wchar - 1; i >= 0; i--, info++) { + if (info->mat_nr == index) { + return true; + } + } + } + else { + Nurb *nu; + + for (nu = cu->nurb.first; nu; nu = nu->next) { + if (nu->mat_nr == index) { + return true; + } + } + } + + return false; +} + void BKE_curve_material_index_clear(Curve *cu) { const int curvetype = BKE_curve_type_get(cu); diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 058c0d10b8e..7d732235f7e 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -1662,6 +1662,22 @@ void BKE_gpencil_material_index_reassign(bGPdata *gpd, int totcol, int index) } } +/* remove strokes using a material */ +bool BKE_gpencil_material_index_used(bGPdata *gpd, int index) +{ + for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { + for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) { + for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) { + if (gps->mat_nr == index) { + return true; + } + } + } + } + + return false; +} + void BKE_gpencil_material_remap(struct bGPdata *gpd, const unsigned int *remap, unsigned int remap_len) diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 391af8b96ab..1382b863637 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -366,6 +366,26 @@ static void material_data_index_remove_id(ID *id, short index) } } +bool BKE_object_material_slot_used(ID *id, short actcol) +{ + /* 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: + return BKE_mesh_material_index_used((Mesh *)id, actcol - 1); + case ID_CU: + return BKE_curve_material_index_used((Curve *)id, actcol - 1); + case ID_MB: + /* meta-elems don't have materials atm */ + return false; + case ID_GD: + return BKE_gpencil_material_index_used((bGPdata *)id, actcol - 1); + default: + return false; + } +} + static void material_data_index_clear_id(ID *id) { /* ensure we don't try get materials from non-obdata */ diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index f38161546e2..7e755e54eaa 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1206,6 +1206,27 @@ void BKE_mesh_material_index_remove(Mesh *me, short index) } } +bool BKE_mesh_material_index_used(Mesh *me, short index) +{ + MPoly *mp; + MFace *mf; + int i; + + for (mp = me->mpoly, i = 0; i < me->totpoly; i++, mp++) { + if (mp->mat_nr == index) { + return true; + } + } + + for (mf = me->mface, i = 0; i < me->totface; i++, mf++) { + if (mf->mat_nr == index) { + return true; + } + } + + return false; +} + void BKE_mesh_material_index_clear(Mesh *me) { MPoly *mp; -- cgit v1.2.3