From f62f07734f1f0042bf4afc12cbf0676654d20b8a Mon Sep 17 00:00:00 2001 From: Ben Batt Date: Sun, 29 Apr 2007 14:00:30 +0000 Subject: Patch #5629 - Mirror modifier axis' to be toggleable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- source/blender/blenkernel/BKE_blender.h | 2 +- source/blender/blenkernel/intern/modifier.c | 33 ++++++++++++++++++++++++---- source/blender/blenloader/intern/readfile.c | 26 ++++++++++++++++++++++ source/blender/makesdna/DNA_modifier_types.h | 3 +++ source/blender/src/buttons_editing.c | 6 ++--- 5 files changed, 62 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 2707ea592f8..a96c1b43170 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -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 diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 020fd846e7d..2e269bb6fdc 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -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) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 3606b1cb3c5..ceab6863aa6 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -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; + } + } + } } } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 278e04c3f44..836cf171643 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -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; diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 976d50cd9e1..d113179bbe2 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -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", -- cgit v1.2.3