From 30a966a726230801d67bfba7ebd2d845bc35f931 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 30 Jan 2018 10:52:25 -0200 Subject: [PATCH] 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. --- source/blender/blenkernel/intern/layer.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) 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; }