diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2018-11-25 14:50:34 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2018-11-25 14:50:34 +0300 |
commit | 4c3ed98ca27667c3403361199096e31eaa93cce2 (patch) | |
tree | 653c568d9d0547f7ac4beb847a590912d97102c0 /source/blender/editors/object | |
parent | e60c49ecf06815039137c98f86a7198d6ee81e14 (diff) |
Local View
Bring back per-viewport localview. This is based on Blender 2.79.
We have a limit of 16 different local view viewports.
We are using both the numpad /, as well as the regular /.
Missing features:
* Hack to make sure lights are always visible.
* Make rendered mode with external engines to support this as well
(probably just need to support this in the RNA iterators).
* Support over 16 viewports by taking existing viewports out of local view.
The code can use a cleanup pass in the future to unify the test to see
if an object is visible (or we can use TESTBASE in more places).
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_edit.c | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_random.c | 2 | ||||
-rw-r--r-- | source/blender/editors/object/object_select.c | 31 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 2 |
4 files changed, 27 insertions, 14 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index c376b0cf78f..5852fcff7e9 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -682,6 +682,7 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); Object *obact = OBACT(view_layer); if (!is_mode_set) { @@ -693,7 +694,7 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op) if (!is_mode_set) { ED_object_editmode_enter(C, EM_WAITCURSOR); if (obact->mode & mode_flag) { - FOREACH_SELECTED_OBJECT_BEGIN(view_layer, ob) + FOREACH_SELECTED_OBJECT_BEGIN(view_layer, v3d, ob) { if ((ob != obact) && (ob->type == obact->type)) { ED_object_editmode_enter_ex(bmain, scene, ob, EM_WAITCURSOR | EM_NO_CONTEXT); @@ -805,7 +806,8 @@ static int posemode_exec(bContext *C, wmOperator *op) if (ok) { struct Main *bmain = CTX_data_main(C); ViewLayer *view_layer = CTX_data_view_layer(C); - FOREACH_SELECTED_OBJECT_BEGIN(view_layer, ob) + View3D *v3d = CTX_wm_view3d(C); + FOREACH_SELECTED_OBJECT_BEGIN(view_layer, v3d, ob) { if ((ob != obact) && (ob->type == OB_ARMATURE) && diff --git a/source/blender/editors/object/object_random.c b/source/blender/editors/object/object_random.c index 918c1c8d8e7..8291b68f15f 100644 --- a/source/blender/editors/object/object_random.c +++ b/source/blender/editors/object/object_random.c @@ -109,7 +109,7 @@ static int object_rand_verts_exec(bContext *C, wmOperator *op) bool changed_multi = false; uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, ob_mode); + Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, CTX_wm_view3d(C), &objects_len, ob_mode); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { Object *ob_iter = objects[ob_index]; diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 10e9b58b38b..c4538a8951f 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -138,11 +138,14 @@ void ED_object_base_activate(bContext *C, Base *base) DEG_id_tag_update(&CTX_data_scene(C)->id, DEG_TAG_SELECT_UPDATE); } -bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, int action, bool *r_any_visible) +bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible) { if (action == SEL_TOGGLE) { action = SEL_SELECT; - FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) { + FOREACH_VISIBLE_BASE_BEGIN(view_layer, v3d, base) { + if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) { + continue; + } if ((base->flag & BASE_SELECTED) != 0) { action = SEL_DESELECT; break; @@ -153,7 +156,10 @@ bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, int action, bool *r_a bool any_visible = false; bool changed = false; - FOREACH_VISIBLE_BASE_BEGIN(view_layer, base) { + FOREACH_VISIBLE_BASE_BEGIN(view_layer, v3d, base) { + if (v3d && ((v3d->object_type_exclude_select & (1 << base->object->type)) != 0)) { + continue; + } switch (action) { case SEL_SELECT: if ((base->flag & BASE_SELECTED) == 0) { @@ -188,9 +194,9 @@ bool ED_object_base_deselect_all_ex(ViewLayer *view_layer, int action, bool *r_a } -bool ED_object_base_deselect_all(ViewLayer *view_layer, int action) +bool ED_object_base_deselect_all(ViewLayer *view_layer, View3D *v3d, int action) { - return ED_object_base_deselect_all_ex(view_layer, action, NULL); + return ED_object_base_deselect_all_ex(view_layer, v3d, action, NULL); } /********************** Jump To Object Utilities **********************/ @@ -258,6 +264,7 @@ bool ED_object_jump_to_object( bContext *C, Object *ob, const bool UNUSED(reveal_hidden)) { ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base == NULL) { @@ -269,7 +276,7 @@ bool ED_object_jump_to_object( if (view_layer->basact != base || !(base->flag & BASE_SELECTED)) { /* Select if not selected. */ if (!(base->flag & BASE_SELECTED)) { - ED_object_base_deselect_all(view_layer, SEL_DESELECT); + ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT); if (base->flag & BASE_VISIBLE) { ED_object_base_select(base, BA_SELECT); @@ -388,13 +395,14 @@ static bool objects_selectable_poll(bContext *C) static int object_select_by_type_exec(bContext *C, wmOperator *op) { ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); short obtype, extend; obtype = RNA_enum_get(op->ptr, "type"); extend = RNA_boolean_get(op->ptr, "extend"); if (extend == 0) { - ED_object_base_deselect_all(view_layer, SEL_DESELECT); + ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT); } CTX_DATA_BEGIN (C, Base *, base, visible_bases) @@ -610,6 +618,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); Object *ob; int nr = RNA_enum_get(op->ptr, "type"); bool changed = false, extend; @@ -617,7 +626,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) extend = RNA_boolean_get(op->ptr, "extend"); if (extend == 0) { - ED_object_base_deselect_all(view_layer, SEL_DESELECT); + ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT); } ob = OBACT(view_layer); @@ -981,6 +990,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); Object *ob; const int type = RNA_enum_get(op->ptr, "type"); bool changed = false, extend; @@ -988,7 +998,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op) extend = RNA_boolean_get(op->ptr, "extend"); if (extend == 0) { - changed = ED_object_base_deselect_all(view_layer, SEL_DESELECT); + changed = ED_object_base_deselect_all(view_layer, v3d, SEL_DESELECT); } ob = OBACT(view_layer); @@ -1073,10 +1083,11 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot) static int object_select_all_exec(bContext *C, wmOperator *op) { ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); int action = RNA_enum_get(op->ptr, "action"); bool any_visible = false; - bool changed = ED_object_base_deselect_all_ex(view_layer, action, &any_visible); + bool changed = ED_object_base_deselect_all_ex(view_layer, v3d, action, &any_visible); if (changed) { Scene *scene = CTX_data_scene(C); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 1c7375c08b1..1a0c129e23a 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -3126,7 +3126,7 @@ static int vertex_group_smooth_exec(bContext *C, wmOperator *op) ViewLayer *view_layer = CTX_data_view_layer(C); uint objects_len = 0; - Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); + Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, CTX_wm_view3d(C), &objects_len); for (uint ob_index = 0; ob_index < objects_len; ob_index++) { Object *ob = objects[ob_index]; |