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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user