diff options
Diffstat (limited to 'source/blender/editors/object/object_add.c')
-rw-r--r-- | source/blender/editors/object/object_add.c | 282 |
1 files changed, 151 insertions, 131 deletions
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index e4b71368315..c997baa3a30 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -43,8 +43,10 @@ #include "BLI_math.h" #include "BLI_listbase.h" +#include "BLI_utildefines.h" #include "BKE_anim.h" +#include "BKE_animsys.h" #include "BKE_armature.h" #include "BKE_constraint.h" #include "BKE_context.h" @@ -104,15 +106,16 @@ void ED_object_location_from_view(bContext *C, float *loc) void ED_object_rotation_from_view(bContext *C, float *rot) { - RegionView3D *rv3d= ED_view3d_context_rv3d(C); - + RegionView3D *rv3d= CTX_wm_region_view3d(C); if(rv3d) { - rv3d->viewquat[0]= -rv3d->viewquat[0]; - quat_to_eul( rot, rv3d->viewquat); - rv3d->viewquat[0]= -rv3d->viewquat[0]; + float quat[4]; + copy_qt_qt(quat, rv3d->viewquat); + quat[0]= -quat[0]; + quat_to_eul(rot, quat); + } + else { + zero_v3(rot); } - else - rot[0] = rot[1] = rot[2] = 0.f; } void ED_object_base_init_transform(bContext *C, Base *base, float *loc, float *rot) @@ -161,11 +164,6 @@ float ED_object_new_primitive_matrix(bContext *C, Object *obedit, float *loc, fl /********************* Add Object Operator ********************/ -void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */ -{ - /* keep here to get things compile, remove later */ -} - void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode) { PropertyRNA *prop; @@ -218,7 +216,7 @@ static void object_add_generic_invoke_options(bContext *C, wmOperator *op) } } -int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event) +int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { object_add_generic_invoke_options(C, op); return op->type->exec(C, op); @@ -260,9 +258,11 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa view_align = FALSE; else if (RNA_property_is_set(op->ptr, "view_align")) view_align = RNA_boolean_get(op->ptr, "view_align"); - else + else { view_align = U.flag & USER_ADD_VIEWALIGNED; - + RNA_boolean_set(op->ptr, "view_align", view_align); + } + if (view_align) ED_object_rotation_from_view(C, rot); else @@ -280,6 +280,7 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa } /* for object add primitive operators */ +/* do not call undo push in this function (users of this function have to) */ Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer) { Main *bmain= CTX_data_main(C); @@ -336,7 +337,7 @@ void OBJECT_OT_add(wmOperatorType *ot) ot->invoke= ED_object_add_generic_invoke; ot->exec= object_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -363,11 +364,6 @@ static EnumPropertyItem field_type_items[] = { {PFIELD_DRAG, "DRAG", ICON_FORCE_DRAG, "Drag", ""}, {0, NULL, 0, NULL, NULL}}; -void add_effector_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */ -{ - /* keep here to get things compile, remove later */ -} - /* for effector add primitive operators */ static Object *effector_add_type(bContext *C, wmOperator *op, int type) { @@ -408,6 +404,8 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) ob->pd= object_add_collision_fields(type); + DAG_scene_sort(CTX_data_main(C), CTX_data_scene(C)); + return ob; } @@ -431,7 +429,7 @@ void OBJECT_OT_effector_add(wmOperatorType *ot) ot->invoke= WM_menu_invoke; ot->exec= effector_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -482,7 +480,7 @@ void OBJECT_OT_camera_add(wmOperatorType *ot) /* api callbacks */ ot->exec= object_camera_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -492,20 +490,10 @@ void OBJECT_OT_camera_add(wmOperatorType *ot) /* ***************** add primitives *************** */ - -static EnumPropertyItem prop_metaball_types[]= { - {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""}, - {MB_TUBE, "MBALL_CAPSULE", ICON_META_CAPSULE, "Meta Capsule", ""}, - {MB_PLANE, "MBALL_PLANE", ICON_META_PLANE, "Meta Plane", ""}, - {MB_CUBE, "MBALL_CUBE", ICON_META_CUBE, "Meta Cube", ""}, - {MB_ELIPSOID, "MBALL_ELLIPSOID", ICON_META_ELLIPSOID, "Meta Ellipsoid", ""}, - {0, NULL, 0, NULL, NULL} -}; - static int object_metaball_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); - MetaElem *elem; + /*MetaElem *elem;*/ /*UNUSED*/ int newob= 0; int enter_editmode; unsigned int layer; @@ -521,12 +509,12 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer); newob = 1; } - else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); + else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); - elem= (MetaElem*)add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob); - + /* elem= (MetaElem *) */ add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob); + /* userdef */ if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA); @@ -537,7 +525,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { Object *obedit= CTX_data_edit_object(C); uiPopupMenu *pup; @@ -545,7 +533,7 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *even object_add_generic_invoke_options(C, op); - pup= uiPupMenuBegin(C, op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, ICON_NULL); layout= uiPupMenuLayout(pup); if(!obedit || obedit->type == OB_MBALL) uiItemsEnumO(layout, op->type->idname, "type"); @@ -571,7 +559,7 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", ""); + RNA_def_enum(ot->srna, "type", metaelem_type_items, 0, "Primitive", ""); ED_object_add_generic_props(ot, TRUE); } @@ -606,7 +594,7 @@ void OBJECT_OT_text_add(wmOperatorType *ot) /* api callbacks */ ot->invoke= ED_object_add_generic_invoke; ot->exec= object_add_text_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -617,7 +605,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); View3D *v3d= CTX_wm_view3d(C); - RegionView3D *rv3d= NULL; + RegionView3D *rv3d= CTX_wm_region_view3d(C); int newob= 0; int enter_editmode; unsigned int layer; @@ -632,16 +620,13 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) ED_object_enter_editmode(C, 0); newob = 1; } - else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); + else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); if(obedit==NULL) { BKE_report(op->reports, RPT_ERROR, "Cannot create editmode armature."); return OPERATOR_CANCELLED; } - if(v3d) - rv3d= CTX_wm_region(C)->regiondata; - /* v3d and rv3d are allowed to be NULL */ add_primitive_bone(CTX_data_scene(C), v3d, rv3d); @@ -664,14 +649,14 @@ void OBJECT_OT_armature_add(wmOperatorType *ot) /* api callbacks */ ot->invoke= ED_object_add_generic_invoke; ot->exec= object_armature_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ED_object_add_generic_props(ot, TRUE); } -static char *get_lamp_defname(int type) +static const char *get_lamp_defname(int type) { switch (type) { case LA_LOCAL: return "Point"; @@ -697,9 +682,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer); - if(ob && ob->data) - ((Lamp*)ob->data)->type= type; - + ((Lamp*)ob->data)->type= type; rename_id((ID *)ob, get_lamp_defname(type)); rename_id((ID *)ob->data, get_lamp_defname(type)); @@ -724,7 +707,7 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_menu_invoke; ot->exec= object_lamp_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -781,7 +764,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot) ot->invoke= WM_enum_search_invoke; ot->exec= group_instance_add_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -805,7 +788,7 @@ void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base) MEM_freeN(base); } -static int object_delete_exec(bContext *C, wmOperator *op) +static int object_delete_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); @@ -817,6 +800,10 @@ static int object_delete_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Base*, base, selected_bases) { if(base->object->type==OB_LAMP) islamp= 1; + + /* deselect object -- it could be used in other scenes */ + base->object->flag &= ~SELECT; + /* remove from current scene only */ ED_base_object_free_and_unlink(bmain, scene, base); } @@ -843,7 +830,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_operator_confirm; ot->exec= object_delete_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -851,7 +838,7 @@ void OBJECT_OT_delete(wmOperatorType *ot) /**************************** Copy Utilities ******************************/ -static void copy_object__forwardModifierLinks(void *userData, Object *ob, +static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin) { /* this is copied from ID_NEW; it might be better to have a macro */ @@ -984,14 +971,19 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base) basen->lay= base->lay; BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */ basen->object= ob; - ob->ipo= NULL; /* make sure apply works */ - ob->parent= ob->track= NULL; + + /* make sure apply works */ + BKE_free_animdata(&ob->id); + ob->adt = NULL; + + ob->parent= NULL; + ob->constraints.first= ob->constraints.last= NULL; ob->disp.first= ob->disp.last= NULL; ob->transflag &= ~OB_DUPLI; ob->lay= base->lay; copy_m4_m4(ob->obmat, dob->mat); - object_apply_mat4(ob, ob->obmat); + object_apply_mat4(ob, ob->obmat, FALSE, FALSE); } copy_object_set_idnew(C, 0); @@ -1001,7 +993,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base) base->object->transflag &= ~OB_DUPLI; } -static int object_duplicates_make_real_exec(bContext *C, wmOperator *op) +static int object_duplicates_make_real_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); @@ -1010,6 +1002,9 @@ static int object_duplicates_make_real_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { make_object_duplilist_real(C, scene, base); + + /* dependencies were changed */ + WM_event_add_notifier(C, NC_OBJECT|ND_PARENT, base->object); } CTX_DATA_END; @@ -1032,7 +1027,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot) /* api callbacks */ ot->exec= object_duplicates_make_real_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1047,9 +1042,7 @@ static EnumPropertyItem convert_target_items[]= { static void curvetomesh(Scene *scene, Object *ob) { - Curve *cu= ob->data; - - if(cu->disp.first==0) + if(ob->disp.first==0) makeDispListCurveTypes(scene, ob, 0); /* force creation */ nurbs_to_mesh(ob); /* also does users */ @@ -1077,7 +1070,7 @@ static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob) } obn= copy_object(ob); - obn->recalc |= OB_RECALC_ALL; + obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; basen= MEM_mallocN(sizeof(Base), "duplibase"); *basen= *base; @@ -1102,8 +1095,8 @@ static int convert_exec(bContext *C, wmOperator *op) Nurb *nu; MetaBall *mb; Mesh *me; - int target= RNA_enum_get(op->ptr, "target"); - int keep_original= RNA_boolean_get(op->ptr, "keep_original"); + const short target= RNA_enum_get(op->ptr, "target"); + const short keep_original= RNA_boolean_get(op->ptr, "keep_original"); int a, mballConverted= 0; /* don't forget multiple users! */ @@ -1112,17 +1105,31 @@ static int convert_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { ob= base->object; ob->flag &= ~OB_DONE; + + /* flag data thats not been edited (only needed for !keep_original) */ + if(ob->data) { + ((ID *)ob->data)->flag |= LIB_DOIT; + } } CTX_DATA_END; CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { ob= base->object; - if(ob->flag & OB_DONE) { + if(ob->flag & OB_DONE || !IS_TAGGED(ob->data)) { if (ob->type != target) { base->flag &= ~SELECT; ob->flag &= ~SELECT; } + + /* obdata already modified */ + if(!IS_TAGGED(ob->data)) { + /* When 2 objects with linked data are selected, converting both + * would keep modifiers on all but the converted object [#26003] */ + if(ob->type == OB_MESH) { + object_free_modifiers(ob); /* after derivedmesh calls! */ + } + } } else if (ob->type==OB_MESH && target == OB_CURVE) { ob->flag |= OB_DONE; @@ -1161,7 +1168,7 @@ static int convert_exec(bContext *C, wmOperator *op) newob->data= copy_mesh(me); } else { newob = ob; - ob->recalc |= OB_RECALC_ALL; + ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; } /* make new mesh data from the original copy */ @@ -1194,7 +1201,7 @@ static int convert_exec(bContext *C, wmOperator *op) cu= newob->data; - if (!cu->disp.first) + if (!newob->disp.first) makeDispListCurveTypes(scene, newob, 0); newob->type= OB_CURVE; @@ -1222,7 +1229,7 @@ static int convert_exec(bContext *C, wmOperator *op) for(ob1= bmain->object.first; ob1; ob1=ob1->id.next) { if(ob1->data==ob->data) { ob1->type= OB_CURVE; - ob1->recalc |= OB_RECALC_ALL; + ob1->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; } } } @@ -1231,8 +1238,12 @@ static int convert_exec(bContext *C, wmOperator *op) for(nu=cu->nurb.first; nu; nu=nu->next) nu->charidx= 0; - if(target == OB_MESH) + if(target == OB_MESH) { curvetomesh(scene, newob); + + /* meshes doesn't use displist */ + freedisplist(&newob->disp); + } } else if(ELEM(ob->type, OB_CURVE, OB_SURF)) { ob->flag |= OB_DONE; @@ -1249,19 +1260,17 @@ static int convert_exec(bContext *C, wmOperator *op) newob->data= copy_curve(ob->data); } else { newob= ob; + + /* meshes doesn't use displist */ + freedisplist(&newob->disp); } curvetomesh(scene, newob); } } - else if(ob->type==OB_MBALL) { + else if(ob->type==OB_MBALL && target == OB_MESH) { Object *baseob; - if (target != OB_MESH) { - ob->flag |= OB_DONE; - continue; - } - base->flag &= ~SELECT; ob->flag &= ~SELECT; @@ -1303,11 +1312,12 @@ static int convert_exec(bContext *C, wmOperator *op) mballConverted= 1; } - else - continue; } - else + else { continue; + } + + /* tag obdata if it was been changed */ /* If the original object is active then make this object active */ if(basen) { @@ -1319,8 +1329,9 @@ static int convert_exec(bContext *C, wmOperator *op) basen= NULL; } - if (!keep_original) { - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + if (!keep_original && (ob->flag & OB_DONE)) { + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + ((ID *)ob->data)->flag &= ~LIB_DOIT; /* flag not to convert this datablock again */ } /* delete original if needed */ @@ -1359,11 +1370,13 @@ static int convert_exec(bContext *C, wmOperator *op) ED_base_object_activate(C, basact); BASACT= basact; } else if (BASACT->object->flag & OB_DONE) { - WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER|ND_DATA, BASACT->object); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, BASACT->object); + WM_event_add_notifier(C, NC_OBJECT|ND_DATA, BASACT->object); } DAG_scene_sort(bmain, scene); - WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */ + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene); + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); return OPERATOR_FINISHED; } @@ -1413,7 +1426,7 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base } else { obn= copy_object(ob); - obn->recalc |= OB_RECALC_ALL; + obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; basen= MEM_mallocN(sizeof(Base), "duplibase"); *basen= *base; @@ -1449,17 +1462,12 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base } } } - if(dupflag & USER_DUP_ACT){ /* Not buttons in the UI to modify this, add later? */ - id= (ID *)obn->action; - if (id){ - ID_NEW_US(obn->action) - else{ - obn->action= copy_action(obn->action); - } - id->us--; - } - } #endif // XXX old animation system + + if(dupflag & USER_DUP_ACT) { + BKE_copy_animdata_id_action(&obn->id); + } + if(dupflag & USER_DUP_MAT) { for(a=0; a<obn->totcol; a++) { id= (ID *)obn->mat[a]; @@ -1467,6 +1475,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base ID_NEW_US(obn->mat[a]) else obn->mat[a]= copy_material(obn->mat[a]); id->us--; + + if(dupflag & USER_DUP_ACT) { + BKE_copy_animdata_id_action(&obn->mat[a]->id); + } } } } @@ -1477,6 +1489,11 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base if(id) { ID_NEW_US(psys->part) else psys->part= psys_copy_settings(psys->part); + + if(dupflag & USER_DUP_ACT) { + BKE_copy_animdata_id_action(&psys->part->id); + } + id->us--; } } @@ -1544,7 +1561,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base case OB_LAMP: if(dupflag & USER_DUP_LAMP) { ID_NEW_US2(obn->data ) - else obn->data= copy_lamp(obn->data); + else { + obn->data= copy_lamp(obn->data); + didit= 1; + } id->us--; } break; @@ -1568,29 +1588,42 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base case OB_LATTICE: if(dupflag!=0) { ID_NEW_US2(obn->data ) - else obn->data= copy_lattice(obn->data); + else { + obn->data= copy_lattice(obn->data); + didit= 1; + } id->us--; } break; case OB_CAMERA: if(dupflag!=0) { ID_NEW_US2(obn->data ) - else obn->data= copy_camera(obn->data); + else { + obn->data= copy_camera(obn->data); + didit= 1; + } id->us--; } break; } - - if(dupflag & USER_DUP_MAT) { - matarar= give_matarar(obn); - if(didit && matarar) { - for(a=0; a<obn->totcol; a++) { - id= (ID *)(*matarar)[a]; - if(id) { - ID_NEW_US( (*matarar)[a] ) - else (*matarar)[a]= copy_material((*matarar)[a]); - - id->us--; + + /* check if obdata is copied */ + if(didit) { + if(dupflag & USER_DUP_ACT) { + BKE_copy_animdata_id_action((ID *)obn->data); + } + + if(dupflag & USER_DUP_MAT) { + matarar= give_matarar(obn); + if(matarar) { + for(a=0; a<obn->totcol; a++) { + id= (ID *)(*matarar)[a]; + if(id) { + ID_NEW_US( (*matarar)[a] ) + else (*matarar)[a]= copy_material((*matarar)[a]); + + id->us--; + } } } } @@ -1647,8 +1680,10 @@ static int duplicate_exec(bContext *C, wmOperator *op) /* new object becomes active */ if(BASACT==base) ED_base_object_activate(C, basen); - - ED_render_id_flush_update(bmain, basen->object->data); + + if(basen->object->data) { + DAG_id_tag_update(basen->object->data, 0); + } } CTX_DATA_END; @@ -1673,7 +1708,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot) /* api callbacks */ ot->exec= duplicate_exec; - ot->poll= ED_operator_scene_editable; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1686,20 +1721,6 @@ void OBJECT_OT_duplicate(wmOperatorType *ot) /* **************** add named object, for dragdrop ************* */ -/* contextual operator dupli */ - -static int add_named_poll(bContext *C) -{ - if(!ED_operator_scene_editable(C)) { - return 0; - } else { - Object *ob= CTX_data_active_object(C); - if(ob && ob->mode != OB_MODE_OBJECT) - return 0; - else - return 1; - } -} static int add_named_exec(bContext *C, wmOperator *op) { @@ -1758,7 +1779,7 @@ void OBJECT_OT_add_named(wmOperatorType *ot) /* api callbacks */ ot->exec= add_named_exec; - ot->poll= add_named_poll; + ot->poll= ED_operator_objectmode; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1782,7 +1803,6 @@ static int join_poll(bContext *C) return 0; } - static int join_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); @@ -1796,7 +1816,7 @@ static int join_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "Can't edit external libdata."); return OPERATOR_CANCELLED; } - + if(ob->type == OB_MESH) return join_mesh_exec(C, op); else if(ELEM(ob->type, OB_CURVE, OB_SURF)) |