[Bf-blender-cvs] [9d2b6b5] render-layers: Fixup on BKE_scene_objects_Iterator_next

Dalai Felinto noreply at git.blender.org
Mon Dec 19 18:13:52 CET 2016


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)




More information about the Bf-blender-cvs mailing list