Index: source/blender/include/BIF_editview.h =================================================================== --- source/blender/include/BIF_editview.h (revision 15055) +++ source/blender/include/BIF_editview.h (working copy) @@ -54,6 +54,7 @@ void set_render_border(void); void view3d_border_zoom(void); void view3d_edit_clipping(struct View3D *v3d); +void align_view_to_transform_orientation(struct View3D *v3d); #endif Index: source/blender/include/BSE_view.h =================================================================== --- source/blender/include/BSE_view.h (revision 15055) +++ source/blender/include/BSE_view.h (working copy) @@ -80,6 +80,7 @@ int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); void setwinmatrixview3d(int winx, int winy, struct rctf *rect); +void mat_to_viewmat(float mat[][4], short smooth); void obmat_to_viewmat(struct Object *ob, short smooth); void setviewmatrixview3d(void); float *give_cursor(void); Index: source/blender/include/BIF_transform.h =================================================================== --- source/blender/include/BIF_transform.h (revision 15055) +++ source/blender/include/BIF_transform.h (working copy) @@ -106,6 +106,7 @@ char * BIF_menustringTransformOrientation(char *title); /* the returned value was allocated and needs to be freed after use */ int BIF_countTransformOrientation(); +void BIF_getTransformOrientationMatrix(int mode, float mat[][3]); /* Drawing callbacks */ void BIF_drawConstraint(void); Index: source/blender/src/editview.c =================================================================== --- source/blender/src/editview.c (revision 15055) +++ source/blender/src/editview.c (working copy) @@ -94,7 +94,9 @@ #include "BIF_space.h" #include "BIF_screen.h" #include "BIF_toolbox.h" +#include "BIF_transform.h" /* to access CTO */ + #include "BDR_editobject.h" /* For headerprint */ #include "BDR_sculptmode.h" #include "BDR_vpaint.h" @@ -2911,3 +2913,25 @@ } } +void align_view_to_transform_orientation(View3D *v3d) +{ + short val; + char *str_menu = BIF_menustringTransformOrientation("Align View"); + val = pupmenu(str_menu); + MEM_freeN(str_menu); + + if (val >= 0) + { + float mat[4][4]; + float orientation[3][3]; + + BIF_getTransformOrientationMatrix(val, orientation); + + Mat4CpyMat3(mat, orientation); + + VECCOPY(mat[3], G.vd->viewinv[3]) + mat[3][3] = 1; + + mat_to_viewmat(mat, 1); + } +} Index: source/blender/src/transform_orientations.c =================================================================== --- source/blender/src/transform_orientations.c (revision 15055) +++ source/blender/src/transform_orientations.c (working copy) @@ -352,7 +352,7 @@ char *str_menu, *p; - str_menu = MEM_callocN(strlen(menu) + strlen(title) + 40 * BIF_countTransformOrientation(), "UserTransSpace from matrix"); + str_menu = MEM_callocN(strlen(menu) + strlen(title) + 40 * BIF_countTransformOrientation() + 16, "Orientation Menu"); p = str_menu; p += sprintf(str_menu, "%s", title); Index: source/blender/src/transform.c =================================================================== --- source/blender/src/transform.c (revision 15055) +++ source/blender/src/transform.c (working copy) @@ -531,6 +531,24 @@ } } +void BIF_getTransformOrientationMatrix(int mode, float mat[][3]) +{ + int old_mode = G.vd->twmode; + + /* Remove all ugly globals from here */ + G.vd->twmode = mode; + + if(curarea->spacetype == SPACE_VIEW3D) { + calc_manipulator_stats(curarea); /* especially that one */ + Mat3CpyMat4(mat, G.vd->twmat); + Mat3Ortho(mat); + } + else + Mat3One(mat); + + G.vd->twmode = old_mode; +} + static void view_editmove(unsigned short event) { int refresh = 0; Index: source/blender/src/edit.c =================================================================== --- source/blender/src/edit.c (revision 15055) +++ source/blender/src/edit.c (working copy) @@ -1837,7 +1837,7 @@ void alignmenu() { short val; - char *str_menu = BIF_menustringTransformOrientation("Align"); + char *str_menu = BIF_menustringTransformOrientation("Align Object"); val= pupmenu(str_menu); MEM_freeN(str_menu); Index: source/blender/src/space.c =================================================================== --- source/blender/src/space.c (revision 15055) +++ source/blender/src/space.c (working copy) @@ -2779,6 +2779,11 @@ scrarea_queue_winredraw(curarea); } } + else if (G.qual == LR_CTRLKEY) + { + align_view_to_transform_orientation(G.vd); + scrarea_queue_winredraw(curarea); + } break; case PADPERIOD: /* '.' */ if(G.qual==0) Index: source/blender/src/header_view3d.c =================================================================== --- source/blender/src/header_view3d.c (revision 15055) +++ source/blender/src/header_view3d.c (working copy) @@ -422,6 +422,9 @@ curs= give_cursor(); curs[0]=curs[1]=curs[2]= 0.0; break; + case 7: /* Align View to CTO */ + align_view_to_transform_orientation(v3d); + break; } allqueue(REDRAWVIEW3D, 0); } @@ -446,6 +449,7 @@ } else { uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, ""); } + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Transform Orientation|Ctrl NumPad *", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 50); Index: source/blender/src/view.c =================================================================== --- source/blender/src/view.c (revision 15055) +++ source/blender/src/view.c (working copy) @@ -1443,14 +1443,14 @@ glMatrixMode(GL_MODELVIEW); } -void obmat_to_viewmat(Object *ob, short smooth) +void mat_to_viewmat(float mat[][4], short smooth) { float bmat[4][4]; float tmat[3][3]; G.vd->view= 0; /* dont show the grid */ - Mat4CpyMat4(bmat, ob->obmat); + Mat4CpyMat4(bmat, mat); Mat4Ortho(bmat); Mat4Invert(G.vd->viewmat, bmat); @@ -1486,6 +1486,11 @@ } } +void obmat_to_viewmat(Object *ob, short smooth) +{ + mat_to_viewmat(ob->obmat, smooth); +} + /* dont set windows active in in here, is used by renderwin too */ void setviewmatrixview3d() {