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/blenkernel/BKE_layer.h | |
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/blenkernel/BKE_layer.h')
-rw-r--r-- | source/blender/blenkernel/BKE_layer.h | 103 |
1 files changed, 67 insertions, 36 deletions
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 2d736b41d1a..e98fa189379 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -53,6 +53,7 @@ struct Main; struct Object; struct RenderEngine; struct Scene; +struct View3D; struct ViewLayer; struct WorkSpace; @@ -140,6 +141,11 @@ void BKE_layer_eval_view_layer_indexed( /* iterators */ +typedef struct ObjectsVisibleIteratorData { + struct ViewLayer *view_layer; + struct View3D *v3d; +} ObjectsVisibleIteratorData; + void BKE_view_layer_selected_objects_iterator_begin(BLI_Iterator *iter, void *data_in); void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter); void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter); @@ -155,6 +161,7 @@ void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter); struct ObjectsInModeIteratorData { int object_mode; struct ViewLayer *view_layer; + struct View3D *v3d; struct Base *base_active; }; @@ -174,39 +181,57 @@ void BKE_view_layer_visible_bases_iterator_begin(BLI_Iterator *iter, void *data_ void BKE_view_layer_visible_bases_iterator_next(BLI_Iterator *iter); void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter); -#define FOREACH_SELECTED_OBJECT_BEGIN(view_layer, _instance) \ +#define FOREACH_SELECTED_OBJECT_BEGIN(_view_layer, _v3d, _instance) \ +{ \ + struct ObjectsVisibleIteratorData data_ = { \ + .view_layer = _view_layer, \ + .v3d = _v3d, \ + }; \ ITER_BEGIN(BKE_view_layer_selected_objects_iterator_begin, \ BKE_view_layer_selected_objects_iterator_next, \ BKE_view_layer_selected_objects_iterator_end, \ - view_layer, Object *, _instance) + &data_, Object *, _instance) #define FOREACH_SELECTED_OBJECT_END \ - ITER_END + ITER_END; \ +} ((void)0) -#define FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN(view_layer, _instance) \ +#define FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN(_view_layer, _v3d, _instance) \ +{ \ + struct ObjectsVisibleIteratorData data_ = { \ + .view_layer = _view_layer, \ + .v3d = _v3d, \ + }; \ ITER_BEGIN(BKE_view_layer_selected_editable_objects_iterator_begin, \ BKE_view_layer_selected_editable_objects_iterator_next, \ BKE_view_layer_selected_editable_objects_iterator_end, \ - view_layer, Object *, _instance) + &data_, Object *, _instance) #define FOREACH_SELECTED_EDITABLE_OBJECT_END \ - ITER_END + ITER_END; \ +} ((void)0) -#define FOREACH_VISIBLE_OBJECT_BEGIN(view_layer, _instance) \ +#define FOREACH_VISIBLE_OBJECT_BEGIN(_view_layer, _v3d, _instance) \ +{ \ + struct ObjectsVisibleIteratorData data_ = { \ + .view_layer = _view_layer, \ + .v3d = _v3d, \ + }; \ ITER_BEGIN(BKE_view_layer_visible_objects_iterator_begin, \ BKE_view_layer_visible_objects_iterator_next, \ BKE_view_layer_visible_objects_iterator_end, \ - view_layer, Object *, _instance) + &data_, Object *, _instance) #define FOREACH_VISIBLE_OBJECT_END \ - ITER_END - + ITER_END; \ +} ((void)0) -#define FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _object_mode, _instance) \ +#define FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _v3d, _object_mode, _instance) \ { \ struct ObjectsInModeIteratorData data_ = { \ .object_mode = _object_mode, \ .view_layer = _view_layer, \ + .v3d = _v3d, \ .base_active = _view_layer->basact, \ }; \ ITER_BEGIN(BKE_view_layer_bases_in_mode_iterator_begin, \ @@ -218,14 +243,14 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter); ITER_END; \ } ((void)0) -#define FOREACH_BASE_IN_EDIT_MODE_BEGIN(_view_layer, _instance) \ - FOREACH_BASE_IN_MODE_BEGIN(_view_layer, OB_MODE_EDIT, _instance) +#define FOREACH_BASE_IN_EDIT_MODE_BEGIN(_view_layer, _v3d, _instance) \ + FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _v3d, OB_MODE_EDIT, _instance) #define FOREACH_BASE_IN_EDIT_MODE_END \ FOREACH_BASE_IN_MODE_END -#define FOREACH_OBJECT_IN_MODE_BEGIN(_view_layer, _object_mode, _instance) \ - FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _object_mode, _base) { \ +#define FOREACH_OBJECT_IN_MODE_BEGIN(_view_layer, _v3d, _object_mode, _instance) \ + FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _v3d, _object_mode, _base) { \ Object *_instance = _base->object; #define FOREACH_OBJECT_IN_MODE_END \ @@ -247,14 +272,20 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter); #define FOREACH_SELECTED_BASE_END \ ITER_END -#define FOREACH_VISIBLE_BASE_BEGIN(view_layer, _instance) \ +#define FOREACH_VISIBLE_BASE_BEGIN(_view_layer, _v3d, _instance) \ +{ \ + struct ObjectsVisibleIteratorData data_ = { \ + .view_layer = _view_layer, \ + .v3d = _v3d, \ + }; \ ITER_BEGIN(BKE_view_layer_visible_bases_iterator_begin, \ BKE_view_layer_visible_bases_iterator_next, \ BKE_view_layer_visible_bases_iterator_end, \ - view_layer, Base *, _instance) + &data_, Base *, _instance) #define FOREACH_VISIBLE_BASE_END \ - ITER_END + ITER_END; \ +} ((void)0) #define FOREACH_OBJECT_BEGIN(view_layer, _instance) \ @@ -332,21 +363,21 @@ struct ObjectsInModeParams { }; Base **BKE_view_layer_array_from_bases_in_mode_params( - struct ViewLayer *view_layer, uint *r_len, + struct ViewLayer *view_layer, struct View3D *v3d, uint *r_len, const struct ObjectsInModeParams *params); struct Object **BKE_view_layer_array_from_objects_in_mode_params( - struct ViewLayer *view_layer, uint *len, + struct ViewLayer *view_layer, struct View3D *v3d, uint *len, const struct ObjectsInModeParams *params); -#define BKE_view_layer_array_from_objects_in_mode(view_layer, r_len, ...) \ +#define BKE_view_layer_array_from_objects_in_mode(view_layer, v3d, r_len, ...) \ BKE_view_layer_array_from_objects_in_mode_params( \ - view_layer, r_len, \ + view_layer, v3d, r_len, \ &(const struct ObjectsInModeParams)__VA_ARGS__) -#define BKE_view_layer_array_from_bases_in_mode(view_layer, r_len, ...) \ +#define BKE_view_layer_array_from_bases_in_mode(view_layer, v3d, r_len, ...) \ BKE_view_layer_array_from_bases_in_mode_params( \ - view_layer, r_len, \ + view_layer, v3d, r_len, \ &(const struct ObjectsInModeParams)__VA_ARGS__) bool BKE_view_layer_filter_edit_mesh_has_uvs(struct Object *ob, void *user_data); @@ -354,38 +385,38 @@ bool BKE_view_layer_filter_edit_mesh_has_edges(struct Object *ob, void *user_dat /* Utility macros that wrap common args (add more as needed). */ -#define BKE_view_layer_array_from_objects_in_edit_mode(view_layer, r_len) \ +#define BKE_view_layer_array_from_objects_in_edit_mode(view_layer, v3d, r_len) \ BKE_view_layer_array_from_objects_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = OB_MODE_EDIT}); -#define BKE_view_layer_array_from_bases_in_edit_mode(view_layer, r_len) \ +#define BKE_view_layer_array_from_bases_in_edit_mode(view_layer, v3d, r_len) \ BKE_view_layer_array_from_bases_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = OB_MODE_EDIT}); -#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, r_len) \ +#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len) \ BKE_view_layer_array_from_objects_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = OB_MODE_EDIT, \ .no_dup_data = true}); -#define BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, r_len) \ +#define BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, v3d, r_len) \ BKE_view_layer_array_from_bases_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = OB_MODE_EDIT, \ .no_dup_data = true}); -#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, r_len) \ +#define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs(view_layer, v3d, r_len) \ BKE_view_layer_array_from_objects_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = OB_MODE_EDIT, \ .no_dup_data = true, \ .filter_fn = BKE_view_layer_filter_edit_mesh_has_uvs}); -#define BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, r_len, mode) \ +#define BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, v3d, r_len, mode) \ BKE_view_layer_array_from_objects_in_mode( \ - view_layer, r_len, { \ + view_layer, v3d, r_len, { \ .object_mode = mode, \ .no_dup_data = true}); |