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:
Diffstat (limited to 'source/blender/blenkernel/intern/layer.c')
-rw-r--r--source/blender/blenkernel/intern/layer.c89
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;