Shift+O subdivision switching now also allows to switch

particle systems on/off if they exist.
This commit is contained in:
2007-12-17 12:54:39 +00:00
parent f33f7ed62a
commit bb6640a63c
3 changed files with 103 additions and 46 deletions

View File

@@ -2099,7 +2099,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
} }
} }
for(md=first; md; md=md->next) for(md=firstmd; md; md=md->next)
modifier_freeTemporaryData(md); modifier_freeTemporaryData(md);
/* Yay, we are done. If we have a DerivedMesh and deformed vertices /* Yay, we are done. If we have a DerivedMesh and deformed vertices

View File

@@ -1639,7 +1639,7 @@ void modifiers_explodeFacepa(void *arg1, void *arg2)
emd->flag |= eExplodeFlag_CalcFaces; 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; ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md_v;

View File

@@ -2818,54 +2818,90 @@ void convertmenu(void)
DAG_scene_sort(G.scene); DAG_scene_sort(G.scene);
} }
/* Change subdivision properties of mesh object ob, if /* Change subdivision or particle properties of mesh object ob, if level==-1
* level==-1 then toggle subsurf, else set to level. * then toggle subsurf, else set to level set allows to toggle multiple
* *set allows to toggle multiple selections * selections */
*/
static void object_flip_subdivison(Object *ob, int *set, int level, int mode, int ingroup) static void object_has_subdivision_particles(Object *ob, int *havesubdiv, int *havepart, int depth)
{ {
ModifierData *md;
if(ob->type==OB_MESH) { if(ob->type==OB_MESH) {
md = modifiers_findByType(ob, eModifierType_Subsurf); if(modifiers_findByType(ob, eModifierType_Subsurf))
*havesubdiv= 1;
if (md) { if(modifiers_findByType(ob, eModifierType_ParticleSystem))
SubsurfModifierData *smd = (SubsurfModifierData*) md; *havepart= 1;
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(!ingroup && *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;
}
ob->recalc |= OB_RECALC_DATA;
} }
if(ob->dup_group) { if(ob->dup_group && depth <= 4) {
GroupObject *go; GroupObject *go;
for(go= ob->dup_group->gobject.first; go; go= go->next) for(go= ob->dup_group->gobject.first; go; go= go->next)
object_flip_subdivison(go->ob, set, level, mode, 1); 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) {
if(particles) {
for(md=ob->modifiers.first; md; md=md->next) {
if(md->type == eModifierType_ParticleSystem) {
ParticleSystemModifierData *psmd = (ParticleSystemModifierData*)md;
if(*set == -1)
*set= psmd->modifier.mode&(mode);
if (*set)
psmd->modifier.mode &= ~(mode);
else
psmd->modifier.mode |= (mode);
modifiers_psysEnable(ob, md);
}
}
}
else {
md = modifiers_findByType(ob, eModifierType_Subsurf);
if (md) {
SubsurfModifierData *smd = (SubsurfModifierData*) md;
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;
}
}
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
if(ob->dup_group && depth<=4) {
GroupObject *go;
for(go= ob->dup_group->gobject.first; go; go= go->next)
object_flip_subdivison_particles(go->ob, set, level, mode, particles, depth+1);
} }
} }
@@ -2877,16 +2913,34 @@ void flip_subdivison(int level)
{ {
Base *base; Base *base;
int set= -1; int set= -1;
int mode; int mode, pupmode, particles= 0, havesubdiv= 0, havepart= 0;
if(G.qual & LR_ALTKEY) if(G.qual & LR_ALTKEY)
mode= eModifierMode_Realtime; mode= eModifierMode_Realtime;
else else
mode= eModifierMode_Render|eModifierMode_Realtime; 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) for(base= G.scene->base.first; base; base= base->next)
if(((level==-1) && (TESTBASE(base))) || (TESTBASELIB(base))) 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(); countall();
allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWVIEW3D, 0);
@@ -2895,7 +2949,10 @@ void flip_subdivison(int level)
allqueue(REDRAWBUTSOBJECT, 0); allqueue(REDRAWBUTSOBJECT, 0);
DAG_scene_flush_update(G.scene, screen_view3d_layers()); 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) static void copymenu_properties(Object *ob)