Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-12-07 04:59:04 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-12-07 05:01:26 +0300
commit341d5b08b0f6743ddd03bc9868a96d311b509900 (patch)
tree2f6479e76330932ad8ab96bb6c9afe5bceca4593 /source/blender/editors/object/object_add.c
parenta48bd6cc74298cbd5ed66c8ab8de33f3713950c8 (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.c112
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