Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-10-07 20:32:55 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-10-07 20:32:55 +0400
commit763358fe913c9ede43921f3ccc4cd6fdbfc5f809 (patch)
treed9ecd1ce68e412717e86502efe1380c507b08ec3
parentdf63ccd904f28c3796f15ae14afcb18b45831fe9 (diff)
copy icon in the material buttons list view so you can copy the current set of materials to other selected objects, (like Ctrl+L, Materials in 2.4x)
-rw-r--r--release/scripts/ui/buttons_material.py1
-rw-r--r--source/blender/blenkernel/BKE_material.h1
-rw-r--r--source/blender/blenkernel/intern/material.c19
-rw-r--r--source/blender/editors/render/render_intern.h1
-rw-r--r--source/blender/editors/render/render_ops.c1
-rw-r--r--source/blender/editors/render/render_shading.c38
6 files changed, 61 insertions, 0 deletions
diff --git a/release/scripts/ui/buttons_material.py b/release/scripts/ui/buttons_material.py
index e91e324f49d..03e11e003e2 100644
--- a/release/scripts/ui/buttons_material.py
+++ b/release/scripts/ui/buttons_material.py
@@ -59,6 +59,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel):
col = row.column(align=True)
col.itemO("object.material_slot_add", icon='ICON_ZOOMIN', text="")
col.itemO("object.material_slot_remove", icon='ICON_ZOOMOUT', text="")
+ col.itemO("object.material_slot_copy", icon='ICON_COPYDOWN', text="")
if ob.mode == 'EDIT':
row = layout.row(align=True)
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 382754ee2b2..b6645ef8737 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -58,6 +58,7 @@ short *give_totcolp(struct Object *ob);
struct Material *give_current_material(struct Object *ob, int act);
struct ID *material_from(struct Object *ob, int act);
void assign_material(struct Object *ob, struct Material *ma, int act);
+void assign_matarar(struct Object *ob, struct Material ***matar, int totcol);
int 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 7e742dc5631..b44c59baaca 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -625,6 +625,25 @@ void assign_material(Object *ob, Material *ma, int act)
test_object_materials(ob->data);
}
+/* XXX - this calls many more update calls per object then are needed, could be optimized */
+void assign_matarar(struct Object *ob, struct Material ***matar, int totcol)
+{
+ int i, actcol_orig= ob->actcol;
+
+ while(ob->totcol)
+ object_remove_material_slot(ob);
+
+ /* now we have the right number of slots */
+ for(i=0; i<totcol; i++)
+ assign_material(ob, (*matar)[i], i+1);
+
+ if(actcol_orig > ob->totcol)
+ actcol_orig= ob->totcol;
+
+ ob->actcol= actcol_orig;
+}
+
+
int find_material_index(Object *ob, Material *ma)
{
Material ***matarar;
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index dccc2d36002..d3ecbbc56e8 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -37,6 +37,7 @@ void OBJECT_OT_material_slot_remove(struct wmOperatorType *ot);
void OBJECT_OT_material_slot_assign(struct wmOperatorType *ot);
void OBJECT_OT_material_slot_select(struct wmOperatorType *ot);
void OBJECT_OT_material_slot_deselect(struct wmOperatorType *ot);
+void OBJECT_OT_material_slot_copy(struct wmOperatorType *ot);
void MATERIAL_OT_new(struct wmOperatorType *ot);
void TEXTURE_OT_new(struct wmOperatorType *ot);
diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c
index 8b60582d466..7d35dff7493 100644
--- a/source/blender/editors/render/render_ops.c
+++ b/source/blender/editors/render/render_ops.c
@@ -43,6 +43,7 @@ void ED_operatortypes_render(void)
WM_operatortype_append(OBJECT_OT_material_slot_assign);
WM_operatortype_append(OBJECT_OT_material_slot_select);
WM_operatortype_append(OBJECT_OT_material_slot_deselect);
+ WM_operatortype_append(OBJECT_OT_material_slot_copy);
WM_operatortype_append(MATERIAL_OT_new);
WM_operatortype_append(TEXTURE_OT_new);
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 56605ad0970..26df0df935b 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -431,6 +431,44 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
+static int material_slot_copy_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Material ***matar;
+
+ if(!ob || !(matar= give_matarar(ob)))
+ return OPERATOR_CANCELLED;
+
+ CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
+ if(ob != ob_iter && give_matarar(ob_iter)) {
+ assign_matarar(ob_iter, matar, ob->totcol);
+ if(ob_iter->totcol==ob->totcol) {
+ ob_iter->actcol= ob->actcol;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter);
+ }
+ }
+ }
+ CTX_DATA_END;
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OBJECT_OT_material_slot_copy(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy Material to Others";
+ ot->idname= "OBJECT_OT_material_slot_copy";
+ ot->description="Copies materials to other selected objects.";
+
+ /* api callbacks */
+ ot->exec= material_slot_copy_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/********************** new material operator *********************/
static int new_material_exec(bContext *C, wmOperator *op)