diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-12-11 23:02:21 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-12-11 23:02:21 +0300 |
commit | 457057a9e817d5cb410b9464616b6e05cfb054ee (patch) | |
tree | e576a995c7df2979b9c369b07ce5fedbcea7564e /source/blender/src/editobject.c | |
parent | 160e6afdb8dc36b7d3a982a0411e633be165d2f4 (diff) |
Fix for mirroring issues in particle mode, where the particles were
not mirrored exactly, though the problem is not completely solved.
The way local frames are computed for particles is still not fully
symmetric, which shows especially on long hairs...
Also made the shift+o subsurf switch work recursively into
dupli-groups, did only the first level before.
Diffstat (limited to 'source/blender/src/editobject.c')
-rw-r--r-- | source/blender/src/editobject.c | 80 |
1 files changed, 39 insertions, 41 deletions
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c index 1bf3fe7ea72..193bd0f46c4 100644 --- a/source/blender/src/editobject.c +++ b/source/blender/src/editobject.c @@ -2822,44 +2822,51 @@ void convertmenu(void) * 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) +static void object_flip_subdivison(Object *ob, int *set, int level, int mode, int ingroup) { ModifierData *md; - if(ob->type!=OB_MESH) - return; - - 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); + if(ob->type==OB_MESH) { + 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->modifier.mode |= (mode); + smd->levels = level; } - } else { - smd->levels = level; - } - } - else if(*set != 0) { - SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf); + } + else if(!ingroup && *set != 0) { + SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf); - BLI_addtail(&ob->modifiers, smd); + BLI_addtail(&ob->modifiers, smd); - if (level!=-1) { - smd->levels = level; + if (level!=-1) { + smd->levels = level; + } + + if(*set == -1) + *set= 1; } - - if(*set == -1) - *set= 1; + + ob->recalc |= OB_RECALC_DATA; + } + + if(ob->dup_group) { + GroupObject *go; + + for(go= ob->dup_group->gobject.first; go; go= go->next) + object_flip_subdivison(go->ob, set, level, mode, 1); } - ob->recalc |= OB_RECALC_DATA; } /* Change subdivision properties of mesh object ob, if @@ -2877,18 +2884,9 @@ void flip_subdivison(int level) else mode= eModifierMode_Render|eModifierMode_Realtime; - 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); - - if(base->object->dup_group) { - GroupObject *go; - for(go= base->object->dup_group->gobject.first; go; go= go->next) - if( modifiers_findByType(go->ob, eModifierType_Subsurf)) /* only when exists */ - object_flip_subdivison(go->ob, &set, level, mode); - } - } - } + 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); countall(); allqueue(REDRAWVIEW3D, 0); |