Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_outliner/outliner_edit.c
| Context not available. | |||||
| RNA_def_string(ot->srna, "material", "Material", MAX_ID_NAME, "Material", "Target Material"); | RNA_def_string(ot->srna, "material", "Material", MAX_ID_NAME, "Material", "Target Material"); | ||||
| } | } | ||||
| static int material_drop_group_invoke(bContext *C, wmOperator *op, const wmEvent *event) | |||||
| { | |||||
| Scene *sce; | |||||
| Material *ma = NULL; | |||||
| Group *group = NULL; | |||||
| GroupObject *group_object = NULL; | |||||
| SpaceOops *soops = CTX_wm_space_outliner(C); | |||||
| ARegion *ar = CTX_wm_region(C); | |||||
| TreeElement *te = NULL; | |||||
| char mat_name[MAX_ID_NAME - 2]; | |||||
| char group_name[MAX_ID_NAME - 2]; | |||||
| float fmval[2]; | |||||
| int n; | |||||
| UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fmval[0], &fmval[1]); | |||||
| /* Find object hovered over */ | |||||
| te = outliner_dropzone_find(soops, fmval, 1); | |||||
| if (te) { | |||||
| RNA_string_set(op->ptr, "group", te->name); | |||||
| // get material | |||||
| RNA_string_get(op->ptr, "material", mat_name); | |||||
| ma = (Material *)BKE_libblock_find_name(ID_MA, mat_name); | |||||
| // get group | |||||
| RNA_string_get(op->ptr, "group", group_name); | |||||
| group = (Group *)BKE_libblock_find_name(ID_GR, group_name); | |||||
| if (ELEM(NULL, ma, group)) { | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| /* loop over all group members and assign material to all of them*/ | |||||
| for (group_object = group->gobject.first; group_object; group_object = group_object->next) { | |||||
| /* default is to ADD material in new slot */ | |||||
| //assign_material(group_object->ob, ma, group_object->ob->totcol + 1, BKE_MAT_ASSIGN_USERPREF); | |||||
| /* trying out behaviour of replacing the mat in last slot -- actually think its better?... */ | |||||
| assign_material(group_object->ob, ma, group_object->ob->totcol, BKE_MAT_ASSIGN_USERPREF); | |||||
| } | |||||
| WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C)); | |||||
| WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, ma); | |||||
| return OPERATOR_FINISHED; | |||||
| } | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| void OUTLINER_OT_material_drop_group(wmOperatorType *ot) | |||||
| { | |||||
| /* identifiers */ | |||||
| ot->name = "Assign Material To All Objects in Group"; | |||||
| ot->description = "Assign Material To All Objects in Group"; | |||||
| ot->idname = "OUTLINER_OT_material_drop_group"; | |||||
| /* api callbacks */ | |||||
| ot->invoke = material_drop_group_invoke; | |||||
| ot->poll = ED_operator_outliner_active; | |||||
| /* flags */ | |||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; | |||||
| /* properties */ | |||||
| RNA_def_string(ot->srna, "group", "Group", MAX_ID_NAME, "Group", "Target Group"); | |||||
| RNA_def_string(ot->srna, "material", "Material", MAX_ID_NAME, "Material", "Target Material"); | |||||
| } | |||||
| Context not available. | |||||