diff options
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 89 |
1 files changed, 70 insertions, 19 deletions
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 2f9c818934f..4405255b874 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -1096,9 +1096,40 @@ void BKE_override_layer_collection_boolean_add( /** \name Private Iterator Helpers * \{ */ -static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in, const int flag) +typedef struct LayerObjectBaseIteratorData { + View3D *v3d; + Base *base; +} LayerObjectBaseIteratorData; + +static bool object_bases_iterator_is_valid_ex(View3D *v3d, Base *base, const int flag) +{ + if (v3d != NULL) { + if ((v3d->object_type_exclude_viewport & (1 << base->object->type)) != 0) { + return false; + } + + if (v3d->localvd && ((base->local_view_bits & v3d->local_view_uuid) == 0)) { + return false; + } + } + + if ((base->flag & flag) == 0) { + return false; + } + + return true; +} + +static bool object_bases_iterator_is_valid(View3D *v3d, Base *base) +{ + return object_bases_iterator_is_valid_ex(v3d, base, ~(0)); +} + +static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, const int flag) { - ViewLayer *view_layer = data_in; + ObjectsVisibleIteratorData *data_in = data_in_v; + ViewLayer *view_layer = data_in->view_layer; + View3D *v3d = data_in->v3d; Base *base = view_layer->object_bases.first; /* when there are no objects */ @@ -1107,9 +1138,13 @@ static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in, const return; } - iter->data = base; + LayerObjectBaseIteratorData *data = MEM_callocN(sizeof(LayerObjectBaseIteratorData), __func__); + iter->data = data; - if ((base->flag & flag) == 0) { + data->v3d = v3d; + data->base = base; + + if (object_bases_iterator_is_valid_ex(v3d, base, flag) == false) { object_bases_iterator_next(iter, flag); } else { @@ -1119,12 +1154,13 @@ static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in, const static void object_bases_iterator_next(BLI_Iterator *iter, const int flag) { - Base *base = ((Base *)iter->data)->next; + LayerObjectBaseIteratorData *data = iter->data; + Base *base = data->base->next; while (base) { - if ((base->flag & flag) != 0) { + if (object_bases_iterator_is_valid_ex(data->v3d, base, flag)) { iter->current = base; - iter->data = base; + data->base = base; return; } base = base->next; @@ -1133,6 +1169,11 @@ static void object_bases_iterator_next(BLI_Iterator *iter, const int flag) iter->valid = false; } +static void object_bases_iterator_end(BLI_Iterator *iter) +{ + MEM_SAFE_FREE(iter->data); +} + static void objects_iterator_begin(BLI_Iterator *iter, void *data_in, const int flag) { object_bases_iterator_begin(iter, data_in, flag); @@ -1151,6 +1192,11 @@ static void objects_iterator_next(BLI_Iterator *iter, const int flag) } } +static void objects_iterator_end(BLI_Iterator *iter) +{ + object_bases_iterator_end(iter); +} + /* -------------------------------------------------------------------- */ /** \name BKE_view_layer_selected_objects_iterator * See: #FOREACH_SELECTED_OBJECT_BEGIN @@ -1166,9 +1212,9 @@ void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter) objects_iterator_next(iter, BASE_SELECTED); } -void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *UNUSED(iter)) +void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter) { - /* do nothing */ + objects_iterator_end(iter); } /** \} */ @@ -1187,9 +1233,9 @@ void BKE_view_layer_visible_objects_iterator_next(BLI_Iterator *iter) objects_iterator_next(iter, BASE_VISIBLE); } -void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *UNUSED(iter)) +void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *iter) { - /* do nothing */ + objects_iterator_end(iter); } /** \} */ @@ -1221,9 +1267,9 @@ void BKE_view_layer_selected_editable_objects_iterator_next(BLI_Iterator *iter) } while (iter->valid && BKE_object_is_libdata((Object *)iter->current) != false); } -void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *UNUSED(iter)) +void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter) { - /* do nothing */ + objects_iterator_end(iter); } /** \} */ @@ -1234,7 +1280,7 @@ void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *UNUSED( void BKE_view_layer_selected_bases_iterator_begin(BLI_Iterator *iter, void *data_in) { - object_bases_iterator_begin(iter, data_in, BASE_SELECTED); + objects_iterator_begin(iter, data_in, BASE_SELECTED); } void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter) @@ -1242,9 +1288,9 @@ void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter) object_bases_iterator_next(iter, BASE_SELECTED); } -void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *UNUSED(iter)) +void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter) { - /* do nothing */ + object_bases_iterator_end(iter); } /** \} */ @@ -1263,9 +1309,9 @@ void BKE_view_layer_visible_bases_iterator_next(BLI_Iterator *iter) object_bases_iterator_next(iter, BASE_VISIBLE); } -void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *UNUSED(iter)) +void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter) { - /* do nothing */ + object_bases_iterator_end(iter); } /** \} */ @@ -1377,6 +1423,10 @@ void BKE_view_layer_bases_in_mode_iterator_begin(BLI_Iterator *iter, void *data_ } iter->data = data_in; iter->current = base; + + if (object_bases_iterator_is_valid(data->v3d, base) == false) { + BKE_view_layer_bases_in_mode_iterator_next(iter); + } } void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter) @@ -1398,7 +1448,8 @@ void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter) while (base) { if ((base->object->type == data->base_active->object->type) && (base != data->base_active) && - (base->object->mode & data->object_mode)) + (base->object->mode & data->object_mode) && + object_bases_iterator_is_valid(data->v3d, base)) { iter->current = base; return; |