diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2012-08-12 21:12:07 +0400 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2012-08-12 21:12:07 +0400 |
commit | 3ebbfe2c406955ed765a697825cde0c891e83a24 (patch) | |
tree | f4e06ea01bca2221722f93a0c413b7d90712a028 /source/blender | |
parent | b2fdb3f50e0eb4aa1725c33c54afc0901d829c59 (diff) |
new parameter in assign_material() to specify where material shall be assigned: object, obdata, by userpref(default) (as discussed with ideasman_42)
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_material.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 39 | ||||
-rw-r--r-- | source/blender/editors/object/object_relations.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_outliner/outliner_edit.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object.c | 4 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean_util.c | 2 |
6 files changed, 42 insertions, 19 deletions
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 2407330a237..030af85ba84 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -67,10 +67,16 @@ short *give_totcolp(struct Object *ob); struct Material ***give_matarar_id(struct ID *id); /* same but for ID's */ short *give_totcolp_id(struct ID *id); +enum { + BKE_MAT_ASSIGN_USERPREF, + BKE_MAT_ASSIGN_OBDATA, + BKE_MAT_ASSIGN_OBJECT +}; + struct Material *give_current_material(struct Object *ob, short act); struct ID *material_from(struct Object *ob, short act); void assign_material_id(struct ID *id, struct Material *ma, short act); -void assign_material(struct Object *ob, struct Material *ma, short act); +void assign_material(struct Object *ob, struct Material *ma, short act, int assign_type); void assign_matarar(struct Object *ob, struct Material ***matar, short totcol); short find_material_index(struct Object *ob, struct Material *ma); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index f888cf60a24..71e3feb9ced 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -774,11 +774,12 @@ void assign_material_id(ID *id, Material *ma, short act) test_object_materials(id); } -void assign_material(Object *ob, Material *ma, short act) +void assign_material(Object *ob, Material *ma, short act, int assign_type) { Material *mao, **matar, ***matarar; char *matbits; short *totcolp; + char bit=0; if (act > MAXMAT) return; if (act < 1) act = 1; @@ -805,8 +806,29 @@ void assign_material(Object *ob, Material *ma, short act) *matarar = matar; *totcolp = act; } - + + // Determine the object/mesh linking + if (assign_type == BKE_MAT_ASSIGN_USERPREF && ob->actcol) { + /* copy from previous material */ + bit = ob->matbits[ob->actcol - 1]; + } + else { + switch(assign_type) { + case BKE_MAT_ASSIGN_OBDATA: + bit = 0; + break; + case BKE_MAT_ASSIGN_OBJECT: + bit = 1; + break; + case BKE_MAT_ASSIGN_USERPREF: + default: + bit = (U.flag & USER_MAT_ON_OB) ? 1 : 0; + break; + } + } + if (act > ob->totcol) { + /* Need more space in the material arrays */ matar = MEM_callocN(sizeof(void *) * act, "matarray2"); matbits = MEM_callocN(sizeof(char) * act, "matbits1"); if (ob->totcol) { @@ -818,17 +840,12 @@ void assign_material(Object *ob, Material *ma, short act) ob->mat = matar; ob->matbits = matbits; ob->totcol = act; - - /* copy object/mesh linking, or assign based on userpref */ - if (ob->actcol) - ob->matbits[act - 1] = ob->matbits[ob->actcol - 1]; - else - ob->matbits[act - 1] = (U.flag & USER_MAT_ON_OB) ? 1 : 0; } /* do it */ - if (ob->matbits[act - 1]) { /* in object */ + ob->matbits[act - 1] = bit; + if (bit == 1) { /* in object */ mao = ob->mat[act - 1]; if (mao) mao->id.us--; ob->mat[act - 1] = ma; @@ -854,7 +871,7 @@ void assign_matarar(struct Object *ob, struct Material ***matar, short totcol) /* now we have the right number of slots */ for (i = 0; i < totcol; i++) - assign_material(ob, (*matar)[i], i + 1); + assign_material(ob, (*matar)[i], i + 1, BKE_MAT_ASSIGN_USERPREF); if (actcol_orig > ob->totcol) actcol_orig = ob->totcol; @@ -888,7 +905,7 @@ int object_add_material_slot(Object *ob) if (ob == NULL) return FALSE; if (ob->totcol >= MAXMAT) return FALSE; - assign_material(ob, NULL, ob->totcol + 1); + assign_material(ob, NULL, ob->totcol + 1, BKE_MAT_ASSIGN_USERPREF); ob->actcol = ob->totcol; return TRUE; } diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 561ebafc0d7..d8c964ff2df 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1368,7 +1368,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op) /* new approach, using functions from kernel */ for (a = 0; a < ob_src->totcol; a++) { Material *ma = give_current_material(ob_src, a + 1); - assign_material(ob_dst, ma, a + 1); /* also works with ma==NULL */ + assign_material(ob_dst, ma, a + 1, BKE_MAT_ASSIGN_USERPREF); /* also works with ma==NULL */ } break; case MAKE_LINKS_ANIMDATA: @@ -1692,7 +1692,7 @@ static void single_mat_users(Scene *scene, int flag, int do_textures) BKE_copy_animdata_id_action(&man->id); man->id.us = 0; - assign_material(ob, man, a); + assign_material(ob, man, a, BKE_MAT_ASSIGN_USERPREF); if (do_textures) { for (b = 0; b < MAX_MTEX; b++) { @@ -2044,7 +2044,7 @@ static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *even if (base == NULL || ma == NULL) return OPERATOR_CANCELLED; - assign_material(base->object, ma, 1); + assign_material(base->object, ma, 1, BKE_MAT_ASSIGN_USERPREF); DAG_ids_flush_update(bmain, 0); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C)); diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 0388ba86b84..4fa8686bce3 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -1851,7 +1851,7 @@ static int material_drop_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } - assign_material(ob, ma, ob->totcol + 1); + assign_material(ob, ma, ob->totcol + 1, BKE_MAT_ASSIGN_USERPREF); DAG_ids_flush_update(bmain, 0); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C)); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 9770b51654c..e1f45e4de17 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -663,7 +663,7 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value) Object *ob = (Object *)ptr->id.data; DAG_id_tag_update(value.data, 0); - assign_material(ob, value.data, ob->actcol); + assign_material(ob, value.data, ob->actcol, BKE_MAT_ASSIGN_USERPREF); } static void rna_Object_active_particle_system_index_range(PointerRNA *ptr, int *min, int *max, @@ -820,7 +820,7 @@ static void rna_MaterialSlot_material_set(PointerRNA *ptr, PointerRNA value) Object *ob = (Object *)ptr->id.data; int index = (Material **)ptr->data - ob->mat; - assign_material(ob, value.data, index + 1); + assign_material(ob, value.data, index + 1, BKE_MAT_ASSIGN_USERPREF); } static int rna_MaterialSlot_link_get(PointerRNA *ptr) diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c index 9ff35c227de..bded11ddfa7 100644 --- a/source/blender/modifiers/intern/MOD_boolean_util.c +++ b/source/blender/modifiers/intern/MOD_boolean_util.c @@ -632,7 +632,7 @@ int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type) /* add materials to object */ for (a = 0; a < totmat; a++) - assign_material(ob_new, mat[a], a + 1); + assign_material(ob_new, mat[a], a + 1, BKE_MAT_ASSIGN_USERPREF); MEM_freeN(mat); |