Commit: 9d2b6b56ac64d3d26f758c5bf0391f21734c3f2d
Author: Dalai Felinto
Date:   Mon Dec 19 18:13:47 2016 +0100
Branches: render-layers
https://developer.blender.org/rB9d2b6b56ac64d3d26f758c5bf0391f21734c3f2d

Fixup on BKE_scene_objects_Iterator_next

===================================================================

M       source/blender/blenkernel/intern/collection.c

===================================================================

diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index 0305753..58533c2 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -319,36 +319,53 @@ void BKE_scene_objects_Iterator_begin(Iterator *iter, 
void *data_in)
        iter->current = sc->objects.first;
 }
 
+/* gets the next unique object */
+static LinkData *object_base_next(GSet *gs, LinkData *link)
+{
+       if (link == NULL) {
+               return NULL;
+       }
+
+       LinkData *link_next = link->next;
+       if (link_next) {
+               Object *ob = link_next->data;
+               if (!BLI_gset_haskey(gs, ob)) {
+                       BLI_gset_add(gs, ob);
+                       return link_next;
+               }
+               else {
+                       return object_base_next(gs, link_next);
+               }
+       }
+       return NULL;
+}
+
 void BKE_scene_objects_Iterator_next(Iterator *iter)
 {
        SceneObjectsIteratorData *data = iter->data;
+       LinkData *link = object_base_next(data->visited, data->link);
 
-       if (data->link->next) {
-               data->link = data->link->next;
-               iter->current = data->link->data;
+       if (link) {
+               data->link = link;
+               iter->current = link->data;
        }
        else {
-               //TODO redo logic
-               while (data->scene_collection_iter.valid) {
+               do {
+                       
BKE_scene_collections_Iterator_next(&data->scene_collection_iter);
                        SceneCollection *sc = 
data->scene_collection_iter.current;
-                       if (sc->objects.first) {
-                               data->link = sc->objects.first;
+                       /* get the first unique object of this collection */
+                       LinkData *new_link = object_base_next(data->visited, 
sc->objects.first);
+                       if (new_link) {
+                               data->link = new_link;
                                iter->current = data->link->data;
                                break;
                        }
-               
BKE_scene_collections_Iterator_next(&data->scene_collection_iter);
-               }
+               } while (data->scene_collection_iter.valid);
 
                if (!data->scene_collection_iter.valid) {
                        iter->valid = false;
                }
        }
-
-#if 0 // TODO
-       if (!BLI_gset_haskey(visited, ob)) {                                  \
-               BLI_gset_add(visited, ob);
-       }
-#endif
 }
 
 void BKE_scene_objects_Iterator_end(Iterator *iter)

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to