Patch #5629 - Mirror modifier axis' to be toggleable

This patch makes the X, Y and Z axes of the mirror modifier individually
toggleable, so it is possible to mirror in more than one direction with a
single modifier.

Thanks to Juho Vepsäläinen (bebraw) for the patch!

NOTE: BLENDER_SUBVERSION has been incremented to support translation from old
      to new axis specification.
This commit is contained in:
Ben Batt
2007-04-29 14:00:30 +00:00
parent 99135b0674
commit f62f07734f
5 changed files with 62 additions and 8 deletions

View File

@@ -44,7 +44,7 @@ struct ListBase;
struct MemFile;
#define BLENDER_VERSION 243
#define BLENDER_SUBVERSION 0
#define BLENDER_SUBVERSION 1
#define BLENDER_MINVERSION 240
#define BLENDER_MINSUBVERSION 0

View File

@@ -1240,11 +1240,12 @@ static void mirrorModifier_copyData(ModifierData *md, ModifierData *target)
tmmd->tolerance = mmd->tolerance;
}
static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
DerivedMesh *dm,
int initFlags)
static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
DerivedMesh *dm,
int initFlags,
int axis)
{
int i, axis = mmd->axis;
int i;
float tolerance = mmd->tolerance;
DerivedMesh *result;
int numVerts, numEdges, numFaces;
@@ -1381,6 +1382,30 @@ static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
return result;
}
static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
DerivedMesh *dm,
int initFlags)
{
DerivedMesh *result = dm;
/* check which axes have been toggled and mirror accordingly */
if(mmd->flag & MOD_MIR_AXIS_X) {
result = doMirrorOnAxis(mmd, result, initFlags, 0);
}
if(mmd->flag & MOD_MIR_AXIS_Y) {
DerivedMesh *tmp = result;
result = doMirrorOnAxis(mmd, result, initFlags, 1);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
if(mmd->flag & MOD_MIR_AXIS_Z) {
DerivedMesh *tmp = result;
result = doMirrorOnAxis(mmd, result, initFlags, 2);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
return result;
}
static DerivedMesh *mirrorModifier_applyModifier(
ModifierData *md, Object *ob, DerivedMesh *derivedData,
int useRenderParams, int isFinalCalc)

View File

@@ -6389,6 +6389,32 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
unique_vertexgroup_name(curdef, ob);
}
}
if(main->versionfile < 243 || main->subversionfile < 1) {
ModifierData *md;
/* translate old mirror modifier axis values to new flags */
for (md=ob->modifiers.first; md; md=md->next) {
if (md->type==eModifierType_Mirror) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
switch(mmd->axis)
{
case 0:
mmd->flag |= MOD_MIR_AXIS_X;
break;
case 1:
mmd->flag |= MOD_MIR_AXIS_Y;
break;
case 2:
mmd->flag |= MOD_MIR_AXIS_Z;
break;
}
mmd->axis = 0;
}
}
}
}
}

View File

@@ -162,6 +162,9 @@ typedef struct MirrorModifierData {
#define MOD_MIR_CLIPPING 1<<0
#define MOD_MIR_MIRROR_U 1<<1
#define MOD_MIR_MIRROR_V 1<<2
#define MOD_MIR_AXIS_X 1<<3
#define MOD_MIR_AXIS_Y 1<<4
#define MOD_MIR_AXIS_Z 1<<5
typedef struct EdgeSplitModifierData {
ModifierData modifier;

View File

@@ -1681,9 +1681,9 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
} else if (md->type==eModifierType_Mirror) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Merge Limit:", lx, (cy-=19), buttonWidth,19, &mmd->tolerance, 0.0, 1.0, 10, 10, "Distance from axis within which mirrored vertices are merged");
uiDefButS(block, ROW, B_MODIFIER_RECALC, "X", lx, (cy-=19), 20,19, &mmd->axis, 1, 0, 0, 0, "Specify the axis to mirror about");
uiDefButS(block, ROW, B_MODIFIER_RECALC, "Y", lx+20, cy, 20,19, &mmd->axis, 1, 1, 0, 0, "Specify the axis to mirror about");
uiDefButS(block, ROW, B_MODIFIER_RECALC, "Z", lx+40, cy, 20,19, &mmd->axis, 1, 2, 0, 0, "Specify the axis to mirror about");
uiDefButBitS(block, TOG, MOD_MIR_AXIS_X, B_MODIFIER_RECALC, "X", lx,(cy-=19),20,19, &mmd->flag, 0, 0, 0, 0, "Enable X axis mirror");
uiDefButBitS(block, TOG, MOD_MIR_AXIS_Y, B_MODIFIER_RECALC, "Y", lx+20,cy,20,19, &mmd->flag, 0, 0, 0, 0, "Enable Y axis mirror");
uiDefButBitS(block, TOG, MOD_MIR_AXIS_Z, B_MODIFIER_RECALC, "Z", lx+40,cy,20,19, &mmd->flag, 0, 0, 0, 0, "Enable Z axis mirror");
uiDefButBitS(block, TOG, MOD_MIR_CLIPPING, B_MODIFIER_RECALC, "Do Clipping", lx+60, cy, buttonWidth-60,19, &mmd->flag, 1, 2, 0, 0, "Prevents during Transform vertices to go through Mirror");
uiDefButBitS(block, TOG, MOD_MIR_MIRROR_U, B_MODIFIER_RECALC,
"Mirror U",