[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29083] trunk/blender/source/blender/ blenkernel/intern/anim.c: Disable using own emitter object (self) as dupliobject/group for particles, fixes bugs:

Janne Karhu jhkarh at gmail.com
Sun May 30 18:09:16 CEST 2010


Revision: 29083
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29083
Author:   jhk
Date:     2010-05-30 18:09:16 +0200 (Sun, 30 May 2010)

Log Message:
-----------
Disable using own emitter object (self) as dupliobject/group for particles, fixes bugs:
[#21994] hair particle system with dupli object set to particle system object itself results in 100% cpu usage
[#22023] [Rev 28117]Can't bake particles?
[#22065] in a particle system, setting the emitter as the dupli object crashes blender after pressing alt+a to animate

Revision Links:
--------------
    http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28117

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2010-05-30 15:55:16 UTC (rev 29082)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2010-05-30 16:09:16 UTC (rev 29083)
@@ -1188,12 +1188,22 @@
 	BLI_srandom(31415926 + psys->seed);
 	
 	lay= scene->lay;
-	if((psys->renderdata || part->draw_as==PART_DRAW_REND) &&
-		((part->ren_as == PART_DRAW_OB && part->dup_ob) ||
-		(part->ren_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first))) {
+	if((psys->renderdata || part->draw_as==PART_DRAW_REND) && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
 
-		psys_check_group_weights(part);
+		/* first check for loops (particle system object used as dupli object) */
+		if(part->ren_as == PART_DRAW_OB) {
+			if(ELEM(part->dup_ob, NULL, par))
+				return;
+		}
+		else { /*PART_DRAW_GR */
+			if(part->dup_group == NULL || part->dup_group->gobject.first == NULL)
+				return;
 
+			for(go=part->dup_group->gobject.first; go; go=go->next)
+				if(go->ob == par)
+					return;
+		}
+
 		/* if we have a hair particle system, use the path cache */
 		if(part->type == PART_HAIR) {
 			if(psys->flag & PSYS_HAIR_DONE)
@@ -1206,6 +1216,8 @@
 			totpart = psys->totcached;
 		}
 
+		psys_check_group_weights(part);
+
 		psys->lattice = psys_get_lattice(&sim);
 
 		/* gather list of objects or single object */





More information about the Bf-blender-cvs mailing list