[Bf-blender-cvs] [b6f5e8d9a1a] master: Fix T51524: Instantiated Hair Object which has dupligroup children and hidden orig objects of group crash at render.

Bastien Montagne noreply at git.blender.org
Fri May 19 19:40:36 CEST 2017


Commit: b6f5e8d9a1aa29720167cf1b1700f76b3e5950a1
Author: Bastien Montagne
Date:   Fri May 19 19:33:52 2017 +0200
Branches: master
https://developer.blender.org/rBb6f5e8d9a1aa29720167cf1b1700f76b3e5950a1

Fix T51524: Instantiated Hair Object which has dupligroup children and hidden orig objects of group crash at render.

Note that this is speculative fix, actually precisely understanding what
happens in this code is... not easy.

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

M	source/blender/render/intern/source/convertblender.c

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

diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 263ea3d4ef2..41ff8e046e7 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4701,6 +4701,12 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
 	if (ob->particlesystem.first) {
 		psysindex= 1;
 		for (psys=ob->particlesystem.first; psys; psys=psys->next, psysindex++) {
+			/* It seems that we may generate psys->renderdata recursively in some nasty intricated cases of
+			 * several levels of bupliobject (see T51524).
+			 * For now, basic rule is, do not restore psys if it was already in 'render state'.
+			 * Another, more robust solution could be to add some reference counting to that renderdata... */
+			const bool psys_has_renderdata = (psys->renderdata != NULL);
+
 			if (!psys_check_enabled(ob, psys, G.is_rendering))
 				continue;
 			
@@ -4712,8 +4718,9 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
 			if (dob)
 				psys->flag |= PSYS_USE_IMAT;
 			init_render_object_data(re, obr, timeoffset);
-			if (!(re->r.scemode & R_VIEWPORT_PREVIEW))
+			if (!(re->r.scemode & R_VIEWPORT_PREVIEW) && !psys_has_renderdata) {
 				psys_render_restore(ob, psys);
+			}
 			psys->flag &= ~PSYS_USE_IMAT;
 
 			/* only add instance for objects that have not been used for dupli */




More information about the Bf-blender-cvs mailing list