[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28570] branches/render25/source/blender: particle and pointcaches now check if they are recursing; e.g.

Joseph Eagar joeedh at gmail.com
Tue May 4 14:26:00 CEST 2010


Revision: 28570
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28570
Author:   joeedh
Date:     2010-05-04 14:26:00 +0200 (Tue, 04 May 2010)

Log Message:
-----------
particle and pointcaches now check if they are recursing; e.g. a particle system instancing itself.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/BKE_particle.h
    branches/render25/source/blender/blenkernel/intern/pointcache.c
    branches/render25/source/blender/editors/space_view3d/drawobject.c
    branches/render25/source/blender/makesdna/DNA_object_types.h

Modified: branches/render25/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/render25/source/blender/blenkernel/BKE_particle.h	2010-05-04 11:54:44 UTC (rev 28569)
+++ branches/render25/source/blender/blenkernel/BKE_particle.h	2010-05-04 12:26:00 UTC (rev 28570)
@@ -182,6 +182,7 @@
 	float *ma_r, *ma_g, *ma_b;
 	int tot_vec_size, flag;
 	int totpoint, totve;
+	int draw_depth; /*used to detect and abort recursions*/
 } ParticleDrawData;
 
 #define PARTICLE_DRAW_DATA_UPDATED  1

Modified: branches/render25/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/pointcache.c	2010-05-04 11:54:44 UTC (rev 28569)
+++ branches/render25/source/blender/blenkernel/intern/pointcache.c	2010-05-04 12:26:00 UTC (rev 28570)
@@ -996,6 +996,14 @@
 
 	lb->first= lb->last= NULL;
 
+	/*we could actually allow a user-definable number of dupli recursions, but for now
+	  simply don't allow it at all*/
+
+	if (ob->dupli_depth)
+		return;
+
+	ob->dupli_depth++;
+
 	if(ob->soft) {
 		pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
 		BKE_ptcache_id_from_softbody(pid, ob, ob->soft);
@@ -1047,6 +1055,8 @@
 			free_object_duplilist(lb_dupli_ob);	/* does restore */
 		}
 	}
+
+	ob->dupli_depth--;
 }
 
 

Modified: branches/render25/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/render25/source/blender/editors/space_view3d/drawobject.c	2010-05-04 11:54:44 UTC (rev 28569)
+++ branches/render25/source/blender/editors/space_view3d/drawobject.c	2010-05-04 12:26:00 UTC (rev 28570)
@@ -3433,7 +3433,7 @@
 	ParticleKey state, *states=0;
 	ParticleBillboardData bb;
 	ParticleSimulationData sim = {scene, ob, psys, NULL};
-	ParticleDrawData *pdd = psys->pdd;
+	ParticleDrawData *pdd = psys;
 	Material *ma;
 	float vel[3], imat[4][4];
 	float timestep, pixsize=1.0, pa_size, r_tilt, r_length;
@@ -3449,6 +3449,10 @@
 	if(psys==0)
 		return;
 
+	pdd = psys->pdd;
+	if (pdd && pdd->draw_depth)
+		return;
+
 	part=psys->part;
 	pars=psys->particles;
 
@@ -3667,6 +3671,10 @@
 		pdd->tot_vec_size= tot_vec_size;
 	}
 
+	/*increment draw_depth, used to deal with recursions*/
+	if (pdd)
+		pdd->draw_depth++;
+
 	psys->lattice= psys_get_lattice(&sim);
 
 	if(pdd && draw_as!=PART_DRAW_PATH){
@@ -4010,6 +4018,10 @@
 
 	psys->flag &= ~PSYS_DRAWING;
 
+	/*decrement the recursion tracker variable*/
+	if (pdd)
+		pdd->draw_depth--;
+
 	/* draw data can't be saved for billboards as they must update to target changes */
 	if(draw_as == PART_DRAW_BB) {
 		psys_free_pdd(psys);

Modified: branches/render25/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_object_types.h	2010-05-04 11:54:44 UTC (rev 28569)
+++ branches/render25/source/blender/makesdna/DNA_object_types.h	2010-05-04 12:26:00 UTC (rev 28570)
@@ -259,7 +259,7 @@
 
 	float *groupmat;		/* runtime, temporarily set during group evaluation */
 	int groupmodified;		/* runtime, to indicate if we modified object matrix */
-	int pad3;
+	int dupli_depth;        /* used to detect if an object references itself through its duplis */
 } Object;
 
 /* Warning, this is not used anymore because hooks are now modifiers */





More information about the Bf-blender-cvs mailing list