== Align to Transform Orientation ==

New rotation alignement fonction

Rotates objects/Pose bones to match the selected transform orientation.

Can be used to align to view, active object (normal) and custom transform orientations.

Accessible in the Object -> Transform submenu and through the hotkey Ctrl-Alt-A (which was previously a fall through for Apply but only Ctrl-A and Ctrl-Shift-A did anything special).

Can be eventually made to work in edit mode (not too hard).
This commit is contained in:
Martin Poirier 2008-03-10 00:27:17 +00:00
parent 1a4f7a861e
commit cbfbe53ebe
5 changed files with 77 additions and 1 deletions

@ -62,6 +62,7 @@
#define TFM_BAKE_TIME 23
#define TFM_BEVEL 24
#define TFM_BWEIGHT 25
#define TFM_ALIGN 26
/* TRANSFORM CONTEXTS */
#define CTX_NONE 0

@ -373,6 +373,9 @@ int BakeTime(TransInfo *t, short mval[2]);
void initMirror(TransInfo *t);
int Mirror(TransInfo *t, short mval[2]);
void initAlign(TransInfo *t);
int Align(TransInfo *t, short mval[2]);
/*********************** transform_conversions.c ********** */
struct ListBase;
void flushTransIpoData(TransInfo *t);

@ -1786,6 +1786,10 @@ static void do_view3d_transformmenu(void *arg, int event)
case 20:
G.scene->snap_target = SCE_SNAP_TARGET_ACTIVE;
break;
case 21:
initTransform(TFM_ALIGN, CTX_NO_PET|CTX_AUTOCONFIRM);
Transform();
break;
}
allqueue(REDRAWVIEW3D, 0);
}
@ -1835,6 +1839,7 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
if (!G.obedit) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align to Transform Orientation", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
}
if (BIF_snappingSupported())

@ -1743,7 +1743,15 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case AKEY:
if(G.qual & LR_CTRLKEY) apply_object(); /* also with shift! */
if (G.obedit == 0 && G.qual == (LR_CTRLKEY|LR_ALTKEY)) {
if(okee("Align to Transform Orientation")) {
initTransform(TFM_ALIGN, CTX_NO_PET|CTX_AUTOCONFIRM);
Transform();
}
}
else if(G.qual & LR_CTRLKEY) { /* also with shift! */
apply_object();
}
else if((G.qual==LR_SHIFTKEY)) {
toolbox_n_add();
}

@ -943,6 +943,7 @@ void initTransform(int mode, int context) {
if(Trans.spacetype==SPACE_VIEW3D) {
calc_manipulator_stats(curarea);
Mat3CpyMat4(Trans.spacemtx, G.vd->twmat);
Mat3Ortho(Trans.spacemtx);
}
else
Mat3One(Trans.spacemtx);
@ -1041,6 +1042,9 @@ void initTransform(int mode, int context) {
case TFM_BWEIGHT:
initBevelWeight(&Trans);
break;
case TFM_ALIGN:
initAlign(&Trans);
break;
}
}
@ -4024,6 +4028,61 @@ int Mirror(TransInfo *t, short mval[2])
return 1;
}
/* ************************** ALIGN *************************** */
void initAlign(TransInfo *t)
{
t->flag |= T_NO_CONSTRAINT;
t->transform = Align;
}
int Align(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float center[3];
int i;
/* saving original center */
VECCOPY(center, t->center);
for(i = 0 ; i < t->total; i++, td++)
{
float mat[3][3], invmat[3][3];
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
/* around local centers */
if (t->flag & (T_OBJECT|T_POSE)) {
VECCOPY(t->center, td->center);
}
else {
if(G.scene->selectmode & SCE_SELECT_FACE) {
VECCOPY(t->center, td->center);
}
}
Mat3Inv(invmat, td->axismtx);
Mat3MulMat3(mat, t->spacemtx, invmat);
ElementRotation(t, td, mat);
}
/* restoring original center */
VECCOPY(t->center, center);
recalcData(t);
headerprint("Align");
return 1;
}
/* ************************** ANIM EDITORS - TRANSFORM TOOLS *************************** */
/* ---------------- Special Helpers for Various Settings ------------- */