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/collection.c')
-rw-r--r--source/blender/blenkernel/intern/collection.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 08ece42e6bb..426f8a44aff 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -2078,14 +2078,18 @@ typedef struct SceneObjectsIteratorData {
BLI_Iterator scene_collection_iter;
} SceneObjectsIteratorData;
-void BKE_scene_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
+static void scene_objects_iterator_begin(BLI_Iterator *iter, Scene *scene, GSet *visited_objects)
{
- Scene *scene = data_in;
SceneObjectsIteratorData *data = MEM_callocN(sizeof(SceneObjectsIteratorData), __func__);
iter->data = data;
/* Lookup list to make sure that each object is only processed once. */
- data->visited = BLI_gset_ptr_new(__func__);
+ if (visited_objects != NULL) {
+ data->visited = visited_objects;
+ }
+ else {
+ data->visited = BLI_gset_ptr_new(__func__);
+ }
/* We wrap the scenecollection iterator here to go over the scene collections. */
BKE_scene_collections_iterator_begin(&data->scene_collection_iter, scene);
@@ -2096,6 +2100,13 @@ void BKE_scene_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
BKE_scene_objects_iterator_next(iter);
}
+void BKE_scene_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
+{
+ Scene *scene = data_in;
+
+ scene_objects_iterator_begin(iter, scene, NULL);
+}
+
/**
* Ensures we only get each object once, even when included in several collections.
*/
@@ -2149,9 +2160,34 @@ void BKE_scene_objects_iterator_end(BLI_Iterator *iter)
SceneObjectsIteratorData *data = iter->data;
if (data) {
BKE_scene_collections_iterator_end(&data->scene_collection_iter);
- BLI_gset_free(data->visited, NULL);
+ if (data->visited != NULL) {
+ BLI_gset_free(data->visited, NULL);
+ }
MEM_freeN(data);
}
}
+/** Generate a new GSet (or extend given `objects_gset` if not NULL) with all objects referenced by
+ * all collections of given `scene`.
+ *
+ * \note: This will include objects without a base currently (because they would belong to excluded
+ * collections only e.g.). */
+GSet *BKE_scene_objects_as_gset(Scene *scene, GSet *objects_gset)
+{
+ BLI_Iterator iter;
+ scene_objects_iterator_begin(&iter, scene, objects_gset);
+ while (iter.valid) {
+ BKE_scene_objects_iterator_next(&iter);
+ }
+
+ /* `return_gset` is either given `objects_gset` (if non-NULL), or the GSet allocated by the
+ * iterator. Either way, we want to get it back, and prevent `BKE_scene_objects_iterator_end`
+ * from freeing it. */
+ GSet *return_gset = ((SceneObjectsIteratorData *)iter.data)->visited;
+ ((SceneObjectsIteratorData *)iter.data)->visited = NULL;
+ BKE_scene_objects_iterator_end(&iter);
+
+ return return_gset;
+}
+
/** \} */