[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16921] trunk/blender/source/blender: Fix for bug #17752: the particle modifier convert button didn't

Brecht Van Lommel brecht at blender.org
Sat Oct 4 21:58:08 CEST 2008


Revision: 16921
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16921
Author:   blendix
Date:     2008-10-04 21:58:08 +0200 (Sat, 04 Oct 2008)

Log Message:
-----------
Fix for bug #17752: the particle modifier convert button didn't
do anything for dupli objects and groups, which could already
be converted with ctrl+shift+A, but convert can do it as well.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BDR_editobject.h
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/include/BDR_editobject.h
===================================================================
--- trunk/blender/source/blender/include/BDR_editobject.h	2008-10-04 17:04:23 UTC (rev 16920)
+++ trunk/blender/source/blender/include/BDR_editobject.h	2008-10-04 19:58:08 UTC (rev 16921)
@@ -76,6 +76,7 @@
 void make_links_menu(void);
 void make_links(short event);
 void make_duplilist_real(void);
+void make_object_duplilist_real(struct Base *base);
 void apply_objects_locrot(void);
 void apply_objects_scale(void);
 void apply_objects_rot(void);

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2008-10-04 17:04:23 UTC (rev 16920)
+++ trunk/blender/source/blender/src/buttons_editing.c	2008-10-04 19:58:08 UTC (rev 16921)
@@ -1248,6 +1248,7 @@
 	ModifierData *md = mdv;
 	ParticleSystem *psys;
 	ParticleCacheKey *key, **cache;
+	ParticleSettings *part;
 	Mesh *me;
 	MVert *mvert;
 	MEdge *medge;
@@ -1260,78 +1261,90 @@
 	if(G.f & G_PARTICLEEDIT) return;
 
 	psys=((ParticleSystemModifierData *)md)->psys;
+	part= psys->part;
 
-	if(psys->part->draw_as != PART_DRAW_PATH || psys->pathcache == 0) return;
+	if(part->draw_as == PART_DRAW_GR || part->draw_as == PART_DRAW_OB) {
+		make_object_duplilist_real(NULL);
+	}
+	else {
+		if(part->draw_as != PART_DRAW_PATH || psys->pathcache == 0)
+			return;
 
-	totpart= psys->totcached;
-	totchild= psys->totchildcache;
+		totpart= psys->totcached;
+		totchild= psys->totchildcache;
 
-	if(totchild && (psys->part->draw&PART_DRAW_PARENT)==0)
-		totpart= 0;
+		if(totchild && (part->draw&PART_DRAW_PARENT)==0)
+			totpart= 0;
 
-	/* count */
-	cache= psys->pathcache;
-	for(a=0; a<totpart; a++) {
-		key= cache[a];
-		totvert+= key->steps+1;
-		totedge+= key->steps;
-	}
+		/* count */
+		cache= psys->pathcache;
+		for(a=0; a<totpart; a++) {
+			key= cache[a];
+			totvert+= key->steps+1;
+			totedge+= key->steps;
+		}
 
-	cache= psys->childcache;
-	for(a=0; a<totchild; a++) {
-		key= cache[a];
-		totvert+= key->steps+1;
-		totedge+= key->steps;
-	}
+		cache= psys->childcache;
+		for(a=0; a<totchild; a++) {
+			key= cache[a];
+			totvert+= key->steps+1;
+			totedge+= key->steps;
+		}
 
-	if(totvert==0) return;
+		if(totvert==0) return;
 
-	/* add new mesh */
-	obn= add_object(OB_MESH);
-	me= obn->data;
-	
-	me->totvert= totvert;
-	me->totedge= totedge;
-	
-	me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
-	me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
-	me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0);
-	
-	mvert= me->mvert;
-	medge= me->medge;
+		/* add new mesh */
+		obn= add_object(OB_MESH);
+		me= obn->data;
+		
+		me->totvert= totvert;
+		me->totedge= totedge;
+		
+		me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
+		me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+		me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, 0);
+		
+		mvert= me->mvert;
+		medge= me->medge;
 
-	/* copy coordinates */
-	cache= psys->pathcache;
-	for(a=0; a<totpart; a++) {
-		key= cache[a];
-		kmax= key->steps;
-		for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
-			VECCOPY(mvert->co,key->co);
-			if(k) {
-				medge->v1= cvert-1;
-				medge->v2= cvert;
-				medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
-				medge++;
+		/* copy coordinates */
+		cache= psys->pathcache;
+		for(a=0; a<totpart; a++) {
+			key= cache[a];
+			kmax= key->steps;
+			for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+				VECCOPY(mvert->co,key->co);
+				if(k) {
+					medge->v1= cvert-1;
+					medge->v2= cvert;
+					medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
+					medge++;
+				}
 			}
 		}
-	}
 
-	cache=psys->childcache;
-	for(a=0; a<totchild; a++) {
-		key=cache[a];
-		kmax=key->steps;
-		for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
-			VECCOPY(mvert->co,key->co);
-			if(k) {
-				medge->v1=cvert-1;
-				medge->v2=cvert;
-				medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
-				medge++;
+		cache=psys->childcache;
+		for(a=0; a<totchild; a++) {
+			key=cache[a];
+			kmax=key->steps;
+			for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+				VECCOPY(mvert->co,key->co);
+				if(k) {
+					medge->v1=cvert-1;
+					medge->v2=cvert;
+					medge->flag= ME_EDGEDRAW|ME_EDGERENDER|ME_LOOSEEDGE;
+					medge++;
+				}
 			}
 		}
 	}
 
 	DAG_scene_sort(G.scene);
+
+	allqueue(REDRAWVIEW3D, 0);
+	allqueue(REDRAWOOPS, 0);
+	
+	BIF_undo_push("Convert particles to mesh object(s).");
 }
 
 static void modifiers_applyModifier(void *obv, void *mdv)
@@ -1870,8 +1883,15 @@
 
 			uiBlockBeginAlign(block);
 			if (md->type==eModifierType_ParticleSystem) {
-				but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Convert",	lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
-				uiButSetFunc(but, modifiers_convertParticles, ob, md);
+				ParticleSystem *psys;
+		    	psys= ((ParticleSystemModifierData *)md)->psys;
+
+	    		if(!(G.f & G_PARTICLEEDIT)) {
+					if(ELEM3(psys->part->draw_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache) {
+						but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Convert",	lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
+						uiButSetFunc(but, modifiers_convertParticles, ob, md);
+					}
+				}
 			}
 			else{
 				but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Apply",	lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c	2008-10-04 17:04:23 UTC (rev 16920)
+++ trunk/blender/source/blender/src/editobject.c	2008-10-04 19:58:08 UTC (rev 16921)
@@ -5404,10 +5404,51 @@
 	}
 }
 
+void make_object_duplilist_real(Base *base)
+{
+	Base *basen;
+	Object *ob;
+	ListBase *lb;
+	DupliObject *dob;
+
+	if(!base && !(base = BASACT))
+		return;
+
+	if(!(base->object->transflag & OB_DUPLI))
+		return;
+
+	lb= object_duplilist(G.scene, base->object);
+	
+	for(dob= lb->first; dob; dob= dob->next) {
+		ob= copy_object(dob->ob);
+		/* font duplis can have a totcol without material, we get them from parent
+		* should be implemented better...
+		*/
+		if(ob->mat==NULL) ob->totcol= 0;
+		
+		basen= MEM_dupallocN(base);
+		basen->flag &= ~OB_FROMDUPLI;
+		BLI_addhead(&G.scene->base, basen);	/* addhead: othwise eternal loop */
+		basen->object= ob;
+		ob->ipo= NULL;		/* make sure apply works */
+		ob->parent= ob->track= NULL;
+		ob->disp.first= ob->disp.last= NULL;
+		ob->transflag &= ~OB_DUPLI;	
+		
+		Mat4CpyMat4(ob->obmat, dob->mat);
+		apply_obmat(ob);
+	}
+	
+	copy_object_set_idnew(0);
+	
+	free_object_duplilist(lb);
+	
+	base->object->transflag &= ~OB_DUPLI;	
+}
+
 void make_duplilist_real()
 {
-	Base *base, *basen;
-	Object *ob;
+	Base *base;
 	/*	extern ListBase duplilist; */
 	
 	if(okee("Make dupli objects real")==0) return;
@@ -5417,37 +5458,7 @@
 	base= FIRSTBASE;
 	while(base) {
 		if TESTBASE(base) {
-			
-			if(base->object->transflag & OB_DUPLI) {
-				ListBase *lb= object_duplilist(G.scene, base->object);
-				DupliObject *dob;
-				
-				for(dob= lb->first; dob; dob= dob->next) {
-					ob= copy_object(dob->ob);
-					/* font duplis can have a totcol without material, we get them from parent
-					* should be implemented better...
-					*/
-					if(ob->mat==NULL) ob->totcol= 0;
-					
-					basen= MEM_dupallocN(base);
-					basen->flag &= ~OB_FROMDUPLI;
-					BLI_addhead(&G.scene->base, basen);	/* addhead: othwise eternal loop */
-					basen->object= ob;
-					ob->ipo= NULL;		/* make sure apply works */
-					ob->parent= ob->track= NULL;
-					ob->disp.first= ob->disp.last= NULL;
-					ob->transflag &= ~OB_DUPLI;	
-					
-					Mat4CpyMat4(ob->obmat, dob->mat);
-					apply_obmat(ob);
-				}
-				
-				copy_object_set_idnew(0);
-				
-				free_object_duplilist(lb);
-				
-				base->object->transflag &= ~OB_DUPLI;	
-			}
+			make_object_duplilist_real(base);
 		}
 		base= base->next;
 	}





More information about the Bf-blender-cvs mailing list