[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20194] trunk/blender/source/blender: Bugfix #18725

Ton Roosendaal ton at blender.org
Thu May 14 11:32:48 CEST 2009


Revision: 20194
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20194
Author:   ton
Date:     2009-05-14 11:32:47 +0200 (Thu, 14 May 2009)

Log Message:
-----------
Bugfix #18725

Particles using group-duplication, with Metaballs in group, enter eternal
loop in our code now. This is a non-supported case... metaball code doesn't
support recursions. Added a provision in code to catch this case, and print
an error in console to denote this.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2009-05-14 07:59:44 UTC (rev 20193)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2009-05-14 09:32:47 UTC (rev 20194)
@@ -297,7 +297,10 @@
 	splitIDname(basis->id.name+2, basisname, &basisnr);
 	totelem= 0;
 
-	next_object(0, 0, 0);
+	/* XXX recursion check, see scene.c, just too simple code this next_object() */
+	if(F_ERROR==next_object(0, 0, 0))
+		return NULL;
+	
 	while(next_object(1, &base, &ob)) {
 		
 		if (ob->type==OB_MBALL) {

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2009-05-14 07:59:44 UTC (rev 20193)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2009-05-14 09:32:47 UTC (rev 20194)
@@ -402,16 +402,25 @@
 {
 	static ListBase *duplilist= NULL;
 	static DupliObject *dupob;
-	static int fase;
+	static int fase= F_START, in_next_object= 0;
 	int run_again=1;
 	
 	/* init */
 	if(val==0) {
 		fase= F_START;
 		dupob= NULL;
+		
+		/* XXX particle systems with metas+dupligroups call this recursively */
+		/* see bug #18725 */
+		if(in_next_object) {
+			printf("ERROR: MetaBall generation called recursively, not supported\n");
+			
+			return F_ERROR;
+		}
 	}
 	else {
-
+		in_next_object= 1;
+		
 		/* run_again is set when a duplilist has been ended */
 		while(run_again) {
 			run_again= 0;
@@ -493,6 +502,9 @@
 		}
 	}
 	
+	/* reset recursion test */
+	in_next_object= 0;
+	
 	return fase;
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2009-05-14 07:59:44 UTC (rev 20193)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2009-05-14 09:32:47 UTC (rev 20194)
@@ -788,6 +788,7 @@
 #define PROP_RANDOM		6
 
 	/* return flag next_object function */
+#define F_ERROR			-1
 #define F_START			0
 #define F_SCENE			1
 #define F_SET			2





More information about the Bf-blender-cvs mailing list