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.
This commit is contained in:
@@ -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);
|
||||
} else {
|
||||
smd->modifier.mode |= (mode);
|
||||
}
|
||||
} else {
|
||||
smd->levels = level;
|
||||
}
|
||||
}
|
||||
else if(*set != 0) {
|
||||
SubsurfModifierData *smd = (SubsurfModifierData*) modifier_new(eModifierType_Subsurf);
|
||||
|
||||
BLI_addtail(&ob->modifiers, smd);
|
||||
|
||||
if (level!=-1) {
|
||||
smd->levels = level;
|
||||
}
|
||||
if(ob->type==OB_MESH) {
|
||||
md = modifiers_findByType(ob, eModifierType_Subsurf);
|
||||
|
||||
if(*set == -1)
|
||||
*set= 1;
|
||||
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(!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) {
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user