[Bf-blender-cvs] [30a966a7262] blender2.8: Fix FOREACH_OBJECT_RENDERABLE recursion going over the roof

Dalai Felinto noreply at git.blender.org
Tue Jan 30 13:58:27 CET 2018


Commit: 30a966a726230801d67bfba7ebd2d845bc35f931
Author: Dalai Felinto
Date:   Tue Jan 30 10:52:25 2018 -0200
Branches: blender2.8
https://developer.blender.org/rB30a966a726230801d67bfba7ebd2d845bc35f931

Fix FOREACH_OBJECT_RENDERABLE recursion going over the roof

This was leading to so much recursion that it was failing here.
How to test it: Open wanderer.blend and try to render (F12).

Note: This won't fix F12 rendering for wanderer with Eevee. Something else is
going wrong there.

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

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

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c6515d0c47a..e6ef3c5ce69 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -1992,6 +1992,9 @@ void BKE_renderable_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
 
 void BKE_renderable_objects_iterator_next(BLI_Iterator *iter)
 {
+	/* Set it early in case we need to exit and we are running from within a loop. */
+	iter->skip = true;
+
 	ObjectsRenderableIteratorData *data = iter->data;
 	Base *base = data->iter.base->next;
 
@@ -2002,8 +2005,8 @@ void BKE_renderable_objects_iterator_next(BLI_Iterator *iter)
 		iter->current = ob;
 		data->iter.base = base;
 
-		if ((base->flag & BASE_VISIBLED) == 0) {
-			BKE_renderable_objects_iterator_next(iter);
+		if ((base->flag & BASE_VISIBLED) != 0) {
+			iter->skip = false;
 		}
 		return;
 	}
@@ -2016,8 +2019,6 @@ void BKE_renderable_objects_iterator_next(BLI_Iterator *iter)
 
 				Base base_iter = {(Base *)view_layer->object_bases.first, NULL};
 				data->iter.base = &base_iter;
-
-				BKE_renderable_objects_iterator_next(iter);
 				return;
 			}
 		}
@@ -2025,7 +2026,6 @@ void BKE_renderable_objects_iterator_next(BLI_Iterator *iter)
 		/* Setup the "set" for the next iteration. */
 		Scene scene = {.set = data->scene};
 		data->iter.set = &scene;
-		BKE_renderable_objects_iterator_next(iter);
 		return;
 	}
 
@@ -2035,8 +2035,6 @@ void BKE_renderable_objects_iterator_next(BLI_Iterator *iter)
 
 		Base base_iter = {(Base *)view_layer->object_bases.first, NULL};
 		data->iter.base = &base_iter;
-
-		BKE_renderable_objects_iterator_next(iter);
 		return;
 	}



More information about the Bf-blender-cvs mailing list