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


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to