diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 7188368a95f..780126852ed 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -26,6 +26,7 @@ */ #include +#include #include "MEM_guardedalloc.h" @@ -704,6 +705,8 @@ static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *eve uiItemMenuEnumO(layout, "Lamp", ICON_OUTLINER_OB_LAMP, "OBJECT_OT_lamp_add", "type"); uiItemS(layout); uiItemMenuEnumO(layout, "Force Field", ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_effector_add", "type"); + uiItemS(layout); + uiItemMenuEnumO(layout, "Group Instance", ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_group_instance_add", "type"); uiPupMenuEnd(C, pup); @@ -728,6 +731,81 @@ void OBJECT_OT_primitive_add(wmOperatorType *ot) ot->flag= 0; } +/* add dupligroup */ +static EnumPropertyItem *add_dupligroup_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + EnumPropertyItem *item= NULL, item_tmp; + int totitem= 0; + int i= 0; + Group *group; + + if(C==NULL) + return NULL; + + memset(&item_tmp, 0, sizeof(item_tmp)); + + for(group= CTX_data_main(C)->group.first; group; group= group->id.next) { + item_tmp.identifier= item_tmp.name= group->id.name+2; + item_tmp.value= i++; + RNA_enum_item_add(&item, &totitem, &item_tmp); + } + + if(i>0) { + *free= 1; + return item; + } + else { + return NULL; + } +} + +static int group_instance_add_exec(bContext *C, wmOperator *op) +{ + /* XXX, using an enum for library lookups is a bit dodgy */ + Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "type")); + + if(group) { + Object *ob= object_add_type(C, OB_EMPTY); + rename_id(&ob->id, group->id.name+2); + ob->dup_group= group; + ob->transflag |= OB_DUPLIGROUP; + id_us_plus(&group->id); + + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; +} + +/* only used as menu */ +void OBJECT_OT_group_instance_add(wmOperatorType *ot) +{ + PropertyRNA *prop; + static EnumPropertyItem prop_group_dummy_types[] = { + {0, NULL, 0, NULL, NULL} + }; + + /* identifiers */ + ot->name= "Add Group Instance"; + ot->description = "Add a dupligroup instance."; + ot->idname= "OBJECT_OT_group_instance_add"; + + /* api callbacks */ + ot->exec= group_instance_add_exec; + + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= 0; + + /* properties */ + prop= RNA_def_enum(ot->srna, "type", prop_group_dummy_types, 0, "Type", ""); + RNA_def_enum_funcs(prop, add_dupligroup_itemf); +} + /**************************** Delete Object *************************/ /* remove base from a specific scene */ diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 474715c593b..1a7d3841aaa 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -92,6 +92,7 @@ void OBJECT_OT_armature_add(struct wmOperatorType *ot); void OBJECT_OT_lamp_add(struct wmOperatorType *ot); void OBJECT_OT_primitive_add(struct wmOperatorType *ot); /* only used as menu */ void OBJECT_OT_effector_add(struct wmOperatorType *ot); +void OBJECT_OT_group_instance_add(struct wmOperatorType *ot); void OBJECT_OT_duplicates_make_real(struct wmOperatorType *ot); void OBJECT_OT_duplicate(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 91e21e77f3a..82135bf3804 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -118,6 +118,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_lamp_add); WM_operatortype_append(OBJECT_OT_add); WM_operatortype_append(OBJECT_OT_effector_add); + WM_operatortype_append(OBJECT_OT_group_instance_add); WM_operatortype_append(OBJECT_OT_primitive_add); WM_operatortype_append(OBJECT_OT_mesh_add); WM_operatortype_append(OBJECT_OT_metaball_add);