diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-12-07 04:59:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-12-07 05:01:26 +0300 |
commit | 341d5b08b0f6743ddd03bc9868a96d311b509900 (patch) | |
tree | 2f6479e76330932ad8ab96bb6c9afe5bceca4593 /source/blender/editors/object/object_add.c | |
parent | a48bd6cc74298cbd5ed66c8ab8de33f3713950c8 (diff) |
Fix adding objects in local view
Diffstat (limited to 'source/blender/editors/object/object_add.c')
-rw-r--r-- | source/blender/editors/object/object_add.c | 112 |
1 files changed, 70 insertions, 42 deletions
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index b6641d6b101..785ca542e9d 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -309,9 +309,10 @@ void ED_object_add_mesh_props(wmOperatorType *ot) RNA_def_boolean(ot->srna, "calc_uvs", true, "Generate UVs", "Generate a default UV map"); } -bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view_align_axis, - float loc[3], float rot[3], - bool *enter_editmode, bool *is_view_aligned) +bool ED_object_add_generic_get_opts( + bContext *C, wmOperator *op, const char view_align_axis, + float loc[3], float rot[3], + bool *enter_editmode, ushort *local_view_bits, bool *is_view_aligned) { PropertyRNA *prop; @@ -329,6 +330,13 @@ bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view } } + if (local_view_bits) { + View3D *v3d = CTX_wm_view3d(C); + if (v3d && v3d->localvd) { + *local_view_bits = v3d->local_view_uuid; + } + } + /* Location! */ { float _loc[3]; @@ -379,7 +387,7 @@ Object *ED_object_add_type( bContext *C, int type, const char *name, const float loc[3], const float rot[3], - bool enter_editmode) + bool enter_editmode, ushort local_view_bits) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); @@ -393,6 +401,7 @@ Object *ED_object_add_type( /* deselects all, sets active object */ ob = BKE_object_add(bmain, scene, view_layer, type, name); + BASACT(view_layer)->local_view_bits = local_view_bits; /* editor level activate, notifiers */ ED_object_base_activate(C, view_layer->basact); @@ -424,14 +433,15 @@ static int object_add_exec(bContext *C, wmOperator *op) { Object *ob; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3], radius; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } radius = RNA_float_get(op->ptr, "radius"); - ob = ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), NULL, loc, rot, enter_editmode); + ob = ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), NULL, loc, rot, enter_editmode, local_view_bits); if (ob->type == OB_LATTICE) { /* lattice is a special case! @@ -486,17 +496,18 @@ static int lightprobe_add_exec(bContext *C, wmOperator *op) LightProbe *probe; int type; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3]; float radius; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } type = RNA_enum_get(op->ptr, "type"); radius = RNA_float_get(op->ptr, "radius"); - ob = ED_object_add_type(C, OB_LIGHTPROBE, get_lightprobe_defname(type), loc, rot, false); + ob = ED_object_add_type(C, OB_LIGHTPROBE, get_lightprobe_defname(type), loc, rot, false, local_view_bits); BKE_object_obdata_size_init(ob, radius); probe = (LightProbe *)ob->data; @@ -556,21 +567,22 @@ static int effector_add_exec(bContext *C, wmOperator *op) Object *ob; int type; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3]; float mat[4][4]; float dia; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } type = RNA_enum_get(op->ptr, "type"); dia = RNA_float_get(op->ptr, "radius"); if (type == PFIELD_GUIDE) { Curve *cu; const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "CurveGuide"); - ob = ED_object_add_type(C, OB_CURVE, name, loc, rot, false); + ob = ED_object_add_type(C, OB_CURVE, name, loc, rot, false, local_view_bits); cu = ob->data; cu->flag |= CU_PATH | CU_3D; @@ -582,7 +594,7 @@ static int effector_add_exec(bContext *C, wmOperator *op) } else { const char *name = CTX_DATA_(BLT_I18NCONTEXT_ID_OBJECT, "Field"); - ob = ED_object_add_type(C, OB_EMPTY, name, loc, rot, false); + ob = ED_object_add_type(C, OB_EMPTY, name, loc, rot, false, local_view_bits); BKE_object_obdata_size_init(ob, dia); if (ELEM(type, PFIELD_WIND, PFIELD_VORTEX)) ob->empty_drawtype = OB_SINGLE_ARROW; @@ -625,15 +637,16 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) Object *ob; Camera *cam; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3]; /* force view align for cameras */ RNA_boolean_set(op->ptr, "view_align", true); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - - ob = ED_object_add_type(C, OB_CAMERA, NULL, loc, rot, false); + } + ob = ED_object_add_type(C, OB_CAMERA, NULL, loc, rot, false, local_view_bits); if (v3d) { if (v3d->camera == NULL) @@ -680,16 +693,17 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) Object *obedit = CTX_data_edit_object(C); bool newob = false; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3]; float mat[4][4]; float dia; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } if (obedit == NULL || obedit->type != OB_MBALL) { - obedit = ED_object_add_type(C, OB_MBALL, NULL, loc, rot, true); + obedit = ED_object_add_type(C, OB_MBALL, NULL, loc, rot, true, local_view_bits); newob = true; } else { @@ -738,16 +752,17 @@ static int object_add_text_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3]; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } if (obedit && obedit->type == OB_FONT) return OPERATOR_CANCELLED; - obedit = ED_object_add_type(C, OB_FONT, NULL, loc, rot, enter_editmode); + obedit = ED_object_add_type(C, OB_FONT, NULL, loc, rot, enter_editmode, local_view_bits); BKE_object_obdata_size_init(obedit, RNA_float_get(op->ptr, "radius")); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); @@ -782,15 +797,16 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) RegionView3D *rv3d = CTX_wm_region_view3d(C); bool newob = false; bool enter_editmode; + ushort local_view_bits; float loc[3], rot[3], dia; bool view_aligned = rv3d && (U.flag & USER_ADD_VIEWALIGNED); WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } if ((obedit == NULL) || (obedit->type != OB_ARMATURE)) { - obedit = ED_object_add_type(C, OB_ARMATURE, NULL, loc, rot, true); + obedit = ED_object_add_type(C, OB_ARMATURE, NULL, loc, rot, true, local_view_bits); ED_object_editmode_enter(C, 0); newob = true; } @@ -840,13 +856,14 @@ static int object_empty_add_exec(bContext *C, wmOperator *op) { Object *ob; int type = RNA_enum_get(op->ptr, "type"); + ushort local_view_bits; float loc[3], rot[3]; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - - ob = ED_object_add_type(C, OB_EMPTY, NULL, loc, rot, false); + } + ob = ED_object_add_type(C, OB_EMPTY, NULL, loc, rot, false, local_view_bits); BKE_object_empty_draw_type_set(ob, type); BKE_object_obdata_size_init(ob, RNA_float_get(op->ptr, "radius")); @@ -899,7 +916,14 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv ob = ob_cursor; } else { - ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, NULL, false); + /* add new empty */ + ushort local_view_bits; + float rot[3]; + + if (!ED_object_add_generic_get_opts(C, op, 'Z', NULL, rot, NULL, &local_view_bits, NULL)) { + return OPERATOR_CANCELLED; + } + ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, rot, false, local_view_bits); ED_object_location_from_view(C, ob->loc); ED_view3d_cursor3d_position(C, event->mval, false, ob->loc); @@ -951,14 +975,15 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op) const int type = RNA_enum_get(op->ptr, "type"); + ushort local_view_bits; float loc[3], rot[3]; bool newob = false; /* Note: We use 'Y' here (not 'Z'), as */ WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, NULL, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, NULL, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } /* add new object if not currently editing a GP object, * or if "empty" was chosen (i.e. user wants a blank GP canvas) */ @@ -982,7 +1007,7 @@ static int object_gpencil_add_exec(bContext *C, wmOperator *op) } float radius = RNA_float_get(op->ptr, "radius"); - ob = ED_object_add_type(C, OB_GPENCIL, ob_name, loc, rot, true); + ob = ED_object_add_type(C, OB_GPENCIL, ob_name, loc, rot, true, local_view_bits); gpd = ob->data; newob = true; @@ -1080,13 +1105,14 @@ static int object_light_add_exec(bContext *C, wmOperator *op) Object *ob; Lamp *la; int type = RNA_enum_get(op->ptr, "type"); + ushort local_view_bits; float loc[3], rot[3]; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - - ob = ED_object_add_type(C, OB_LAMP, get_light_defname(type), loc, rot, false); + } + ob = ED_object_add_type(C, OB_LAMP, get_light_defname(type), loc, rot, false, local_view_bits); float size = RNA_float_get(op->ptr, "radius"); /* Better defaults for light size. */ @@ -1143,6 +1169,7 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); Collection *collection; + ushort local_view_bits; float loc[3], rot[3]; if (RNA_struct_property_is_set(op->ptr, "name")) { @@ -1164,9 +1191,9 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op) else collection = BLI_findlink(&CTX_data_main(C)->collection, RNA_enum_get(op->ptr, "collection")); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - + } if (collection) { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -1177,7 +1204,7 @@ static int collection_instance_add_exec(bContext *C, wmOperator *op) active_lc = BKE_layer_collection_activate_parent(view_layer, active_lc); } - Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, loc, rot, false); + Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, loc, rot, false, local_view_bits); ob->dup_group = collection; ob->transflag |= OB_DUPLICOLLECTION; id_us_plus(&collection->id); @@ -1225,13 +1252,14 @@ void OBJECT_OT_collection_instance_add(wmOperatorType *ot) static int object_speaker_add_exec(bContext *C, wmOperator *op) { Object *ob; + ushort local_view_bits; float loc[3], rot[3]; Scene *scene = CTX_data_scene(C); - if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &local_view_bits, NULL)) { return OPERATOR_CANCELLED; - - ob = ED_object_add_type(C, OB_SPEAKER, NULL, loc, rot, false); + } + ob = ED_object_add_type(C, OB_SPEAKER, NULL, loc, rot, false, local_view_bits); /* to make it easier to start using this immediately in NLA, a default sound clip is created * ready to be moved around to retime the sound and/or make new sound clips |