diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 40cf95dfa5d..1b140276c22 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -5269,7 +5269,9 @@ static int curve_prim_add(bContext *C, wmOperator *op, int type){ float mat[4][4]; //object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; + if(obedit==NULL || obedit->type!=OB_CURVE) { Curve *cu; diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index da4896b3435..a03cd135f1c 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -88,7 +88,7 @@ float ED_object_new_primitive_matrix(struct bContext *C, struct Object *editob, 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 bContext *C, struct wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer); +int ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer); struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer); 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 f0e6f40af30..a7a0a854f1b 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1304,7 +1304,8 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */ make_prim_ext(C, loc, rot, enter_editmode, layer, @@ -1336,7 +1337,8 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */ make_prim_ext(C, loc, rot, enter_editmode, layer, @@ -1368,7 +1370,8 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0, @@ -1407,7 +1410,8 @@ static int add_primitive_tube_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0, @@ -1448,7 +1452,8 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0, @@ -1488,7 +1493,8 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"), @@ -1527,7 +1533,8 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0); @@ -1559,7 +1566,8 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"), @@ -1598,7 +1606,8 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; make_prim_ext(C, loc, rot, enter_editmode, layer, PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"), diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 9f8fe7ba0f2..e29c23b1f4d 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -232,7 +232,7 @@ int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event) return op->type->exec(C, op); } -void ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer) +int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer) { int a, layer_values[32]; int view_align; @@ -241,7 +241,23 @@ void ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, flo if(RNA_struct_find_property(op->ptr, "enter_editmode") && RNA_boolean_get(op->ptr, "enter_editmode")) { *enter_editmode = TRUE; } - + + if(RNA_property_is_set(op->ptr, "layer")) { + RNA_boolean_get_array(op->ptr, "layer", layer_values); + + for(a=0; a<32; a++) { + if(layer_values[a]) + *layer |= (1 << a); + else + *layer &= ~(1 << a); + } + } + else { + /* not set, use the scenes layers */ + Scene *scene = CTX_data_scene(C); + *layer = scene->layact; + } + if (RNA_property_is_set(op->ptr, "view_align")) view_align = RNA_boolean_get(op->ptr, "view_align"); else @@ -254,13 +270,13 @@ void ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, flo RNA_float_get_array(op->ptr, "location", loc); - RNA_boolean_get_array(op->ptr, "layer", layer_values); - - for(a=0; a<32; a++) - if(layer_values[a]) - *layer |= (1 << a); - else - *layer &= ~(1 << a); + + if(*layer == 0) { + BKE_report(op->reports, RPT_ERROR, "Property 'layer' has no values set"); + return 0; + } + + return 1; } /* for object add primitive operators */ @@ -298,7 +314,9 @@ static int object_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; + ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer); return OPERATOR_FINISHED; @@ -357,7 +375,9 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) float mat[4][4]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return NULL; if(type==PFIELD_GUIDE) { ob= ED_object_add_type(C, OB_CURVE, loc, rot, FALSE, layer); @@ -391,8 +411,9 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) /* for object add operator */ static int effector_add_exec(bContext *C, wmOperator *op) { - effector_add_type(C, op, RNA_int_get(op->ptr, "type")); - + if(effector_add_type(C, op, RNA_int_get(op->ptr, "type")) == NULL) + return OPERATOR_CANCELLED; + return OPERATOR_FINISHED; } @@ -432,7 +453,9 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) RNA_boolean_set(op->ptr, "view_align", 1); object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_CAMERA, loc, rot, FALSE, layer); @@ -489,7 +512,9 @@ static int object_add_surface_exec(bContext *C, wmOperator *op) float mat[4][4]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(obedit==NULL || obedit->type!=OB_SURF) { obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE, layer); @@ -554,7 +579,9 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) float mat[4][4]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(obedit==NULL || obedit->type!=OB_MBALL) { obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer); @@ -624,7 +651,8 @@ static int object_add_text_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(obedit && obedit->type==OB_FONT) return OPERATOR_CANCELLED; @@ -664,7 +692,8 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { obedit= ED_object_add_type(C, OB_ARMATURE, loc, rot, TRUE, layer); @@ -719,7 +748,8 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer); if(ob && ob->data) @@ -766,7 +796,8 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + return OPERATOR_CANCELLED; if(group) { Object *ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE, layer);