[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12925] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Dec 17 13:54:40 CET 2007


Revision: 12925
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12925
Author:   blendix
Date:     2007-12-17 13:54:39 +0100 (Mon, 17 Dec 2007)

Log Message:
-----------

Shift+O subdivision switching now also allows to switch
particle systems on/off if they exist.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-17 11:47:24 UTC (rev 12924)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-17 12:54:39 UTC (rev 12925)
@@ -2099,7 +2099,7 @@
 		}
 	}
 
-	for(md=first; md; md=md->next)
+	for(md=firstmd; md; md=md->next)
 		modifier_freeTemporaryData(md);
 
 	/* Yay, we are done. If we have a DerivedMesh and deformed vertices

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2007-12-17 11:47:24 UTC (rev 12924)
+++ trunk/blender/source/blender/src/buttons_editing.c	2007-12-17 12:54:39 UTC (rev 12925)
@@ -1639,7 +1639,7 @@
 	emd->flag |= eExplodeFlag_CalcFaces;
 }
 
-static void modifiers_psysEnable(void *ob_v, void *md_v)
+void modifiers_psysEnable(void *ob_v, void *md_v)
 {
 	ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md_v;
 

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c	2007-12-17 11:47:24 UTC (rev 12924)
+++ trunk/blender/source/blender/src/editobject.c	2007-12-17 12:54:39 UTC (rev 12925)
@@ -2818,54 +2818,90 @@
 	DAG_scene_sort(G.scene);
 }
 
-	/* Change subdivision properties of mesh object ob, if
-	 * level==-1 then toggle subsurf, else set to level.
-     * *set allows to toggle multiple selections
-	 */
-static void object_flip_subdivison(Object *ob, int *set, int level, int mode, int ingroup)
+/* Change subdivision or particle properties of mesh object ob, if level==-1
+ * then toggle subsurf, else set to level set allows to toggle multiple
+ * selections */
+
+static void object_has_subdivision_particles(Object *ob, int *havesubdiv, int *havepart, int depth)
 {
+	if(ob->type==OB_MESH) {
+		if(modifiers_findByType(ob, eModifierType_Subsurf))
+			*havesubdiv= 1;
+		if(modifiers_findByType(ob, eModifierType_ParticleSystem))
+			*havepart= 1;
+	}
+
+	if(ob->dup_group && depth <= 4) {
+		GroupObject *go;
+
+		for(go= ob->dup_group->gobject.first; go; go= go->next)
+			object_has_subdivision_particles(go->ob, havesubdiv, havepart, depth+1);
+	}
+}
+
+static void object_flip_subdivison_particles(Object *ob, int *set, int level, int mode, int particles, int depth)
+{
+	void modifiers_psysEnable(void *ob_v, void *md_v);
 	ModifierData *md;
 
 	if(ob->type==OB_MESH) {
-		md = modifiers_findByType(ob, eModifierType_Subsurf);
-		
-		if (md) {
-			SubsurfModifierData *smd = (SubsurfModifierData*) md;
+		if(particles) {
+			for(md=ob->modifiers.first; md; md=md->next) {
+				if(md->type == eModifierType_ParticleSystem) {
+					ParticleSystemModifierData *psmd = (ParticleSystemModifierData*)md;
 
-			if (level == -1) {
-				if(*set == -1) 
-					*set= smd->modifier.mode&(mode);
-											  
-				if (*set) {
-					smd->modifier.mode &= ~(mode);
-				} else {
-					smd->modifier.mode |= (mode);
+					if(*set == -1)
+						*set= psmd->modifier.mode&(mode);
+
+					if (*set)
+						psmd->modifier.mode &= ~(mode);
+					else
+						psmd->modifier.mode |= (mode);
+
+					modifiers_psysEnable(ob, md);
 				}
-			} else {
-				smd->levels = level;
 			}
-		} 
-		else if(!ingroup && *set != 0) {
-			SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+		}
+		else {
+			md = modifiers_findByType(ob, eModifierType_Subsurf);
 
-			BLI_addtail(&ob->modifiers, smd);
+			if (md) {
+				SubsurfModifierData *smd = (SubsurfModifierData*) md;
 
-			if (level!=-1) {
-				smd->levels = level;
+				if (level == -1) {
+					if(*set == -1) 
+						*set= smd->modifier.mode&(mode);
+
+					if (*set)
+						smd->modifier.mode &= ~(mode);
+					else
+						smd->modifier.mode |= (mode);
+				} else {
+					smd->levels = level;
+				}
+			} 
+			else if(depth == 0 && *set != 0) {
+				SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
+
+				BLI_addtail(&ob->modifiers, smd);
+
+				if (level!=-1) {
+					smd->levels = level;
+				}
+				
+				if(*set == -1)
+					*set= 1;
 			}
-			
-			if(*set == -1)
-				*set= 1;
 		}
 
-		ob->recalc |= OB_RECALC_DATA;
+		DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
 	}
 
-	if(ob->dup_group) {
+	if(ob->dup_group && depth<=4) {
 		GroupObject *go;
 
 		for(go= ob->dup_group->gobject.first; go; go= go->next)
-			object_flip_subdivison(go->ob, set, level, mode, 1);
+			object_flip_subdivison_particles(go->ob, set, level, mode, particles, depth+1);
 	}
 }
 
@@ -2877,16 +2913,34 @@
 {
 	Base *base;
 	int set= -1;
-	int mode;
+	int mode, pupmode, particles= 0, havesubdiv= 0, havepart= 0;
 	
 	if(G.qual & LR_ALTKEY)
 		mode= eModifierMode_Realtime;
 	else
 		mode= eModifierMode_Render|eModifierMode_Realtime;
 	
+	if(level == -1) {
+		for(base= G.scene->base.first; base; base= base->next)
+			if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base)))
+				object_has_subdivision_particles(base->object, &havesubdiv, &havepart, 0);
+	}
+	else
+		havesubdiv= 1;
+	
+	if(havesubdiv && havepart) {
+		pupmode= pupmenu("Switch%t|Subsurf %x1|Particle Systems %x2");
+		if(pupmode <= 0)
+			return;
+		else if(pupmode == 2)
+			particles= 1;
+	}
+	else if(havepart)
+		particles= 1;
+	
 	for(base= G.scene->base.first; base; base= base->next)
 		if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base)))
-			object_flip_subdivison(base->object, &set, level, mode, 0);
+			object_flip_subdivison_particles(base->object, &set, level, mode, particles, 0);
 	
 	countall();
 	allqueue(REDRAWVIEW3D, 0);
@@ -2895,7 +2949,10 @@
 	allqueue(REDRAWBUTSOBJECT, 0);
 	DAG_scene_flush_update(G.scene, screen_view3d_layers());
 	
-	BIF_undo_push("Switch subsurf on/off");
+	if(particles)
+		BIF_undo_push("Switch particles on/off");
+	else
+		BIF_undo_push("Switch subsurf on/off");
 }
  
 static void copymenu_properties(Object *ob)





More information about the Bf-blender-cvs mailing list