From 1d9f90ed42ba61d615dd0188e39cc12f0b71493f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 2 Nov 2009 16:07:49 +0000 Subject: [PATCH] - all add object operators now take view_align as an argument, and enter_editmode where its used. Makes running the operator from python pradictable without having to know the user prefs. - missing return in function - python error in view3d (assumed active object exists) --- release/scripts/ui/space_view3d.py | 2 +- source/blender/editors/curve/editfont.c | 2 +- source/blender/editors/include/ED_object.h | 10 +- source/blender/editors/mesh/editmesh_add.c | 92 +++++++++-- source/blender/editors/object/object_add.c | 151 ++++++++++++------ .../editors/sculpt_paint/paint_vertex.c | 2 +- .../editors/space_view3d/view3d_edit.c | 5 +- source/blender/makesrna/intern/rna_access.c | 3 + 8 files changed, 197 insertions(+), 70 deletions(-) diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py index 24484f84e44..ac65a3dae45 100644 --- a/release/scripts/ui/space_view3d.py +++ b/release/scripts/ui/space_view3d.py @@ -1334,7 +1334,7 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): col.itemR(view, "all_object_centers") col.itemR(view, "relationship_lines") if ob and ob.type == 'MESH': - mesh = context.active_object.data + mesh = ob.data col.itemR(mesh, "all_edges") col = layout.column() diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 2be567e1921..6ebc9c8a1c9 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -479,7 +479,7 @@ static void txt_add_object(bContext *C, TextLine *firstline, int totline, float obedit= add_object(scene, OB_FONT); base= scene->basact; - ED_object_base_init_from_view(C, base); + ED_object_base_init_from_view(C, base, 1); /* seems to assume view align ? TODO - look into this, could be an operator option */ where_is_object(scene, obedit); obedit->loc[0] += offset[0]; diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index b136baa6bdb..3d445016d98 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -42,6 +42,9 @@ struct Mesh; struct Curve; struct ReportList; struct ModifierData; +struct wmOperatorType; +struct wmOperator; +struct wmEvent; /* object_edit.c */ void ED_operatortypes_object(void); @@ -74,8 +77,11 @@ void ED_object_toggle_modes(struct bContext *C, int mode); void ED_object_exit_editmode(struct bContext *C, int flag); void ED_object_enter_editmode(struct bContext *C, int flag); -void ED_object_base_init_from_view(struct bContext *C, struct Base *base); -struct Object *ED_object_add_type(struct bContext *C, int type); +void ED_object_base_init_from_view(struct bContext *C, struct Base *base, int view_align); +void ED_object_add_generic_props(struct wmOperatorType *ot, int do_editmode); +int ED_object_add_generic_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event); +void ED_object_add_generic_get_opts(struct wmOperator *op, int *view_align, int *enter_editmode); +struct Object *ED_object_add_type(struct bContext *C, int type, int view_align, int enter_editmode); void ED_object_single_users(struct Scene *scene, int full); diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index e7cf03cd230..85c3558c2ef 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1273,7 +1273,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se /* uses context to figure out transform for primitive */ /* returns standard diameter */ -static float new_primitive_matrix(bContext *C, float primmat[][4]) +static float new_primitive_matrix(bContext *C, int view_align, float primmat[][4]) { Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); @@ -1283,7 +1283,7 @@ static float new_primitive_matrix(bContext *C, float primmat[][4]) Mat4One(primmat); - if(rv3d && (U.flag & USER_ADD_VIEWALIGNED)) { + if(rv3d && view_align) { Mat3CpyMat4(vmat, rv3d->viewmat); } else Mat3One(vmat); @@ -1307,7 +1307,8 @@ static float new_primitive_matrix(bContext *C, float primmat[][4]) /* ********* add primitive operators ************* */ -static void make_prim_ext(bContext *C, int type, int tot, int seg, +static void make_prim_ext(bContext *C, int view_align, int enter_editmode, + int type, int tot, int seg, int subdiv, float dia, float depth, int ext, int fill) { Object *obedit= CTX_data_edit_object(C); @@ -1316,14 +1317,14 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg, if(obedit==NULL || obedit->type!=OB_MESH) { /* create editmode */ - ED_object_add_type(C, OB_MESH); + ED_object_add_type(C, OB_MESH, view_align, FALSE); ED_object_enter_editmode(C, EM_DO_UNDO); obedit= CTX_data_edit_object(C); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - dia *= new_primitive_matrix(C, mat); + dia *= new_primitive_matrix(C, view_align, mat); make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill); @@ -1332,7 +1333,7 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg, /* userdef */ - if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */ } WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); @@ -1340,8 +1341,11 @@ static void make_prim_ext(bContext *C, int type, int tot, int seg, static int add_primitive_plane_exec(bContext *C, wmOperator *op) { + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */ - make_prim_ext(C, PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1); + make_prim_ext(C, view_align, enter_editmode, PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1); return OPERATOR_FINISHED; } @@ -1353,17 +1357,23 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_plane_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_plane_exec; ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_cube_exec(bContext *C, wmOperator *op) { + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */ - make_prim_ext(C, PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1); + make_prim_ext(C, view_align, enter_editmode, PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1); return OPERATOR_FINISHED; } @@ -1375,16 +1385,23 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_cube_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_cube_exec; ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_circle_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0, + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0, RNA_float_get(op->ptr,"radius"), 0.0f, 0, RNA_boolean_get(op->ptr, "fill")); @@ -1399,6 +1416,7 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_circle_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_circle_exec; ot->poll= ED_operator_scene_editable; @@ -1409,11 +1427,17 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot) RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, "Vertices", "", 3, 500); RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, "Radius", "", 0.001, 100.00); RNA_def_boolean(ot->srna, "fill", 0, "Fill", ""); + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_tube_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0, + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0, RNA_float_get(op->ptr,"radius"), RNA_float_get(op->ptr, "depth"), 1, RNA_boolean_get(op->ptr, "cap_ends")); @@ -1429,6 +1453,7 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_tube_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_tube_exec; ot->poll= ED_operator_scene_editable; @@ -1440,11 +1465,17 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot) RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, "Radius", "", 0.001, 100.00); RNA_def_float(ot->srna, "depth", 1.0f, 0.0, FLT_MAX, "Depth", "", 0.001, 100.00); RNA_def_boolean(ot->srna, "cap_ends", 1, "Cap Ends", ""); + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_cone_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0, + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0, RNA_float_get(op->ptr,"radius"), RNA_float_get(op->ptr, "depth"), 0, RNA_boolean_get(op->ptr, "cap_end")); @@ -1459,6 +1490,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_cone_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_cone_exec; ot->poll= ED_operator_scene_editable; @@ -1471,11 +1503,16 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot) RNA_def_float(ot->srna, "depth", 1.0f, 0.0, FLT_MAX, "Depth", "", 0.001, 100.00); RNA_def_boolean(ot->srna, "cap_end", 0, "Cap End", ""); + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_grid_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"), + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"), RNA_int_get(op->ptr, "y_subdivisions"), 0, RNA_float_get(op->ptr,"size"), 0.0f, 0, 1); @@ -1490,6 +1527,7 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_grid_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_grid_exec; ot->poll= ED_operator_scene_editable; @@ -1500,11 +1538,18 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot) RNA_def_int(ot->srna, "x_subdivisions", 10, INT_MIN, INT_MAX, "X Subdivisions", "", 3, 1000); RNA_def_int(ot->srna, "y_subdivisions", 10, INT_MIN, INT_MAX, "Y Subdivisions", "", 3, 1000); RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, "Size", "", 0.001, FLT_MAX); + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_monkey_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0); + return OPERATOR_FINISHED; } @@ -1516,16 +1561,23 @@ void MESH_OT_primitive_monkey_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_monkey_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_monkey_exec; ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"), + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"), RNA_int_get(op->ptr, "segments"), 0, RNA_float_get(op->ptr,"size"), 0.0f, 0, 0); @@ -1540,6 +1592,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_uv_sphere_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_uvsphere_exec; ot->poll= ED_operator_scene_editable; @@ -1550,11 +1603,17 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot) RNA_def_int(ot->srna, "segments", 32, INT_MIN, INT_MAX, "Segments", "", 3, 500); RNA_def_int(ot->srna, "rings", 24, INT_MIN, INT_MAX, "Rings", "", 3, 500); RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, "Size", "", 0.001, 100.00); + + ED_object_add_generic_props(ot, TRUE); } static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) { - make_prim_ext(C, PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"), + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + + make_prim_ext(C, view_align, enter_editmode, + PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"), RNA_float_get(op->ptr,"size"), 0.0f, 0, 0); return OPERATOR_FINISHED; @@ -1568,6 +1627,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot) ot->idname= "MESH_OT_primitive_ico_sphere_add"; /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; ot->exec= add_primitive_icosphere_exec; ot->poll= ED_operator_scene_editable; @@ -1577,6 +1637,8 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot) /* props */ RNA_def_int(ot->srna, "subdivisions", 2, 0, 6, "Subdivisions", "", 0, 8); RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00); + + ED_object_add_generic_props(ot, TRUE); } /****************** add duplicate operator ***************/ diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index f61cf9b9b0c..0a7b6daa854 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -99,7 +99,7 @@ /************************** Exported *****************************/ -void ED_object_base_init_from_view(bContext *C, Base *base) +void ED_object_base_init_from_view(bContext *C, Base *base, int view_align) { View3D *v3d= CTX_wm_view3d(C); Scene *scene= CTX_data_scene(C); @@ -122,7 +122,7 @@ void ED_object_base_init_from_view(bContext *C, Base *base) VECCOPY(ob->loc, scene->cursor); } - if (U.flag & USER_ADD_VIEWALIGNED) { + if (view_align) { RegionView3D *rv3d = CTX_wm_region_view3d(C); if(rv3d) { rv3d->viewquat[0]= -rv3d->viewquat[0]; @@ -141,8 +141,42 @@ void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menu /* keep here to get things compile, remove later */ } +void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode) +{ + RNA_def_boolean(ot->srna, "view_align", 0, "View Align", "Align the new object to the view."); + + if(do_editmode) + RNA_def_boolean(ot->srna, "enter_editmode", 0, "Enter Editmode", "Enter editmode when adding this object."); +} + +static void object_add_generic_invoke_options(bContext *C, wmOperator *op) +{ + if (!RNA_property_is_set(op->ptr, "view_align")) + RNA_boolean_set(op->ptr, "view_align", U.flag & USER_ADD_VIEWALIGNED); + + if(RNA_struct_find_property(op->ptr, "enter_editmode")) /* optional */ + if (!RNA_property_is_set(op->ptr, "enter_editmode")) + RNA_boolean_set(op->ptr, "enter_editmode", U.flag & USER_ADD_EDITMODE); +} + +int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + object_add_generic_invoke_options(C, op); + return op->type->exec(C, op); +} + +void ED_object_add_generic_get_opts(wmOperator *op, int *view_align, int *enter_editmode) +{ + *view_align= RNA_boolean_get(op->ptr, "view_align"); + *enter_editmode = FALSE; + + if(RNA_struct_find_property(op->ptr, "enter_editmode") && RNA_boolean_get(op->ptr, "enter_editmode")) { + *enter_editmode = TRUE; + } +} + /* for object add primitive operators */ -Object *ED_object_add_type(bContext *C, int type) +Object *ED_object_add_type(bContext *C, int type, int view_align, int enter_editmode) { Scene *scene= CTX_data_scene(C); Object *ob; @@ -157,17 +191,22 @@ Object *ED_object_add_type(bContext *C, int type) ED_base_object_activate(C, BASACT); /* more editor stuff */ - ED_object_base_init_from_view(C, BASACT); + ED_object_base_init_from_view(C, BASACT, view_align); DAG_scene_sort(scene); + if(enter_editmode) + ED_object_enter_editmode(C, 0); + return ob; } /* for object add operator */ static int object_add_exec(bContext *C, wmOperator *op) { - ED_object_add_type(C, RNA_enum_get(op->ptr, "type")); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), view_align, enter_editmode); return OPERATOR_FINISHED; } @@ -180,7 +219,7 @@ void OBJECT_OT_add(wmOperatorType *ot) ot->idname= "OBJECT_OT_add"; /* api callbacks */ - ot->invoke= WM_menu_invoke; + ot->invoke= ED_object_add_generic_invoke; ot->exec= object_add_exec; ot->poll= ED_operator_scene_editable; @@ -189,6 +228,8 @@ void OBJECT_OT_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "type", object_type_items, 0, "Type", ""); + + ED_object_add_generic_props(ot, TRUE); } /********************* Add Effector Operator ********************/ @@ -215,53 +256,41 @@ void add_effector_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or me } /* for effector add primitive operators */ -static Object *effector_add_type(bContext *C, int type) +static Object *effector_add_type(bContext *C, wmOperator *op, int type) { - Scene *scene= CTX_data_scene(C); Object *ob; - - /* for as long scene has editmode... */ - if (CTX_data_edit_object(C)) - ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO); /* freedata, and undo */ - - /* deselects all, sets scene->basact */ + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + if(type==PFIELD_GUIDE) { - ob = add_object(scene, OB_CURVE); + ob= ED_object_add_type(C, OB_CURVE, view_align, FALSE); + ((Curve*)ob->data)->flag |= CU_PATH|CU_3D; ED_object_enter_editmode(C, 0); BLI_addtail(curve_get_editcurve(ob), add_nurbs_primitive(C, CU_NURBS|CU_PRIM_PATH, 1)); - ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); + + if(!enter_editmode) + ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } else { - ob= add_object(scene, OB_EMPTY); - + ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE); switch(type) { case PFIELD_WIND: case PFIELD_VORTEX: ob->empty_drawtype = OB_SINGLE_ARROW; - break; + break; } } - - - + ob->pd= object_add_collision_fields(type); - /* editor level activate, notifiers */ - ED_base_object_activate(C, BASACT); - - /* more editor stuff */ - ED_object_base_init_from_view(C, BASACT); - - DAG_scene_sort(scene); - return ob; } /* for object add operator */ static int effector_add_exec(bContext *C, wmOperator *op) { - effector_add_type(C, RNA_int_get(op->ptr, "type")); + effector_add_type(C, op, RNA_int_get(op->ptr, "type")); return OPERATOR_FINISHED; } @@ -283,6 +312,8 @@ void OBJECT_OT_effector_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "type", field_type_items, 0, "Type", ""); + + ED_object_add_generic_props(ot, TRUE); } /* ***************** add primitives *************** */ @@ -302,10 +333,11 @@ static int object_add_curve_exec(bContext *C, wmOperator *op) ListBase *editnurb; Nurb *nu; int newob= 0, type= RNA_enum_get(op->ptr, "type"); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); if(obedit==NULL || obedit->type!=OB_CURVE) { - ED_object_add_type(C, OB_CURVE); - ED_object_enter_editmode(C, 0); + ED_object_add_type(C, OB_CURVE, view_align, TRUE); newob = 1; obedit= CTX_data_edit_object(C); @@ -319,7 +351,7 @@ static int object_add_curve_exec(bContext *C, wmOperator *op) BLI_addtail(editnurb, nu); /* userdef */ - if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } @@ -334,6 +366,8 @@ static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; + object_add_generic_invoke_options(C, op); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); if(!obedit || obedit->type == OB_CURVE) @@ -362,6 +396,8 @@ void OBJECT_OT_curve_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", ""); + + ED_object_add_generic_props(ot, TRUE); } static EnumPropertyItem prop_surface_types[]= { @@ -380,10 +416,11 @@ static int object_add_surface_exec(bContext *C, wmOperator *op) ListBase *editnurb; Nurb *nu; int newob= 0; + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); if(obedit==NULL || obedit->type!=OB_SURF) { - ED_object_add_type(C, OB_SURF); - ED_object_enter_editmode(C, 0); + ED_object_add_type(C, OB_SURF, view_align, TRUE); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); @@ -394,7 +431,7 @@ static int object_add_surface_exec(bContext *C, wmOperator *op) BLI_addtail(editnurb, nu); /* userdef */ - if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } @@ -411,7 +448,7 @@ void OBJECT_OT_surface_add(wmOperatorType *ot) ot->idname= "OBJECT_OT_surface_add"; /* api callbacks */ - ot->invoke= WM_menu_invoke; + ot->invoke= ED_object_add_generic_invoke; // WM_menu_invoke ot->exec= object_add_surface_exec; ot->poll= ED_operator_scene_editable; @@ -420,6 +457,7 @@ void OBJECT_OT_surface_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", ""); + ED_object_add_generic_props(ot, TRUE); } static EnumPropertyItem prop_metaball_types[]= { @@ -437,10 +475,11 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) MetaBall *mball; MetaElem *elem; int newob= 0; + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); if(obedit==NULL || obedit->type!=OB_MBALL) { - ED_object_add_type(C, OB_MBALL); - ED_object_enter_editmode(C, 0); + ED_object_add_type(C, OB_MBALL, view_align, TRUE); newob = 1; } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); @@ -451,7 +490,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) BLI_addtail(mball->editelems, elem); /* userdef */ - if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } @@ -466,6 +505,8 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *even uiPopupMenu *pup; uiLayout *layout; + object_add_generic_invoke_options(C, op); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); if(!obedit || obedit->type == OB_MBALL) @@ -493,19 +534,19 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", ""); + ED_object_add_generic_props(ot, TRUE); } static int object_add_text_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); if(obedit && obedit->type==OB_FONT) return OPERATOR_CANCELLED; - ED_object_add_type(C, OB_FONT); + ED_object_add_type(C, OB_FONT, view_align, enter_editmode); obedit= CTX_data_active_object(C); - - if(U.flag & USER_ADD_EDITMODE) - ED_object_enter_editmode(C, 0); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); @@ -525,6 +566,7 @@ void OBJECT_OT_text_add(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ED_object_add_generic_props(ot, TRUE); } static int object_armature_add_exec(bContext *C, wmOperator *op) @@ -533,9 +575,11 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) View3D *v3d= CTX_wm_view3d(C); RegionView3D *rv3d= NULL; int newob= 0; + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { - obedit= ED_object_add_type(C, OB_ARMATURE); + obedit= ED_object_add_type(C, OB_ARMATURE, view_align, TRUE); ED_object_enter_editmode(C, 0); obedit= CTX_data_edit_object(C); newob = 1; @@ -554,7 +598,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) add_primitive_bone(CTX_data_scene(C), v3d, rv3d); /* userdef */ - if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + if (newob && !enter_editmode) { ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO); } @@ -576,14 +620,17 @@ void OBJECT_OT_armature_add(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ED_object_add_generic_props(ot, TRUE); } static int object_lamp_add_exec(bContext *C, wmOperator *op) { Object *ob; int type= RNA_enum_get(op->ptr, "type"); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); - ob= ED_object_add_type(C, OB_LAMP); + ob= ED_object_add_type(C, OB_LAMP, view_align, FALSE); if(ob && ob->data) ((Lamp*)ob->data)->type= type; @@ -615,6 +662,8 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot) /* properties */ RNA_def_enum(ot->srna, "type", lamp_type_items, 0, "Type", ""); + + ED_object_add_generic_props(ot, FALSE); } /* add dupligroup */ @@ -644,8 +693,11 @@ 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")); + int view_align, enter_editmode; + ED_object_add_generic_get_opts(op, &view_align, &enter_editmode); + if(group) { - Object *ob= ED_object_add_type(C, OB_EMPTY); + Object *ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE); rename_id(&ob->id, group->id.name+2); ob->dup_group= group; ob->transflag |= OB_DUPLIGROUP; @@ -684,6 +736,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot) /* properties */ prop= RNA_def_enum(ot->srna, "type", prop_group_dummy_types, 0, "Type", ""); RNA_def_enum_funcs(prop, add_dupligroup_itemf); + ED_object_add_generic_props(ot, FALSE); } /**************************** Delete Object *************************/ diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 9d673581368..f425fa01ebe 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1272,7 +1272,7 @@ static char *wpaint_make_validmap(Mesh *me, Object *ob) } if (!i) - return; + return NULL; validmap = MEM_callocN(i, "wpaint valid map"); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 46e188bfa12..e76dc1aaa00 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1970,7 +1970,10 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot) ot->invoke= set_3dcursor_invoke; ot->poll= ED_operator_view3d_active; - + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + /* rna later */ } diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index b7120c58fef..fac18ba7942 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -903,6 +903,9 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value) BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop; IDProperty *idprop; + /* just incase other values are passed */ + if(value) value= 1; + if((idprop=rna_idproperty_check(&prop, ptr))) IDP_Int(idprop)= value; else if(bprop->set)