Removal of old transform() <sob> part one.
[blender.git] / source / blender / src / editobject.c
index bba768ca4332ad1a9252255a51011565f394bf6d..89f21c471c572dcc0f7d589c496f11804a5dc1e0 100644 (file)
@@ -47,7 +47,6 @@
 #include <unistd.h>
 #else
 #include <io.h>
-#include "BLI_winstuff.h"
 #endif
 #include "MEM_guardedalloc.h"
 #include "PIL_time.h"
@@ -60,6 +59,7 @@
 #include "DNA_action_types.h"
 #include "DNA_armature_types.h"
 #include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_effect_types.h"
 #include "DNA_ika_types.h"
@@ -68,6 +68,7 @@
 #include "DNA_key_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_lattice_types.h"
+#include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_meta_types.h"
@@ -80,7 +81,6 @@
 #include "DNA_userdef_types.h"
 #include "DNA_property_types.h"
 #include "DNA_vfont_types.h"
-#include "DNA_constraint_types.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
@@ -96,6 +96,7 @@
 #include "BKE_booleanops.h"
 #include "BKE_curve.h"
 #include "BKE_displist.h"
+#include "BKE_DerivedMesh.h"
 #include "BKE_effect.h"
 #include "BKE_font.h"
 #include "BKE_global.h"
 #include "BSE_editipo.h"
 #include "BSE_filesel.h"       /* For activate_databrowse() */
 #include "BSE_view.h"
+#include "BSE_drawview.h"
 #include "BSE_trans_types.h"
 #include "BSE_editipo_types.h"
 
 #include "BDR_editcurve.h"
 #include "BDR_unwrapper.h"
 
-#include "render.h"
 #include <time.h>
 #include "mydevice.h"
 #include "nla.h"
 
 #include "blendef.h"
 
+#include "BIF_transform.h"
+
 #include "BIF_poseobject.h"
 
 /*  extern Lattice *copy_lattice(Lattice *lt); */
@@ -187,7 +190,14 @@ float centre[3], centroid[3];
 
 void mirrormenu(void);
 
-void add_object_draw(int type) /* for toolbox */
+/* local prototypes -------------*/
+int pose_flags_reset_done(Object *); /* used in transform_generic.c */
+void figure_bone_nocalc(Object *); /* used in transform.c */
+void figure_pose_updating(void); /* used in transform.c */
+void constline_callback(void);  /* used in drawview.c */
+/* --------------------------------- */
+
+void add_object_draw(int type) /* for toolbox or menus, only non-editmode stuff */
 {
        Object *ob;
        
@@ -198,7 +208,16 @@ void add_object_draw(int type)     /* for toolbox */
                if (G.obedit) exit_editmode(2); // freedata, and undo
                ob= add_object(type);
                base_init_from_view3d(BASACT, G.vd);
-
+               
+               /* only undo pushes on objects without editmode... */
+               if(type==OB_EMPTY) BIF_undo_push("Add Empty");
+               else if(type==OB_LAMP) {
+                       BIF_undo_push("Add Lamp");
+                       if(G.vd->drawtype == OB_SHADED) reshadeall_displist();
+               }
+               else if(type==OB_LATTICE) BIF_undo_push("Add Lattice");
+               else if(type==OB_CAMERA) BIF_undo_push("Add Camera");
+               
                allqueue(REDRAWVIEW3D, 0);
        }
 
@@ -229,6 +248,7 @@ void add_objectLamp(short type)
        allqueue(REDRAWALL, 0);
 }
 
+// really bad, doesnt do constraints, that has been coded in test_scene_constraints();
 void free_and_unlink_base(Base *base)
 {
        if (base==BASACT)
@@ -242,6 +262,7 @@ void free_and_unlink_base(Base *base)
 void delete_obj(int ok)
 {
        Base *base;
+       int islamp= 0;
        
        if(G.obpose) return;
        if(G.obedit) return;
@@ -253,6 +274,7 @@ void delete_obj(int ok)
 
                if TESTBASE(base) {
                        if(ok==0 &&  (ok=okee("Erase selected"))==0) return;
+                       if(base->object->type==OB_LAMP) islamp= 1;
                        
                        free_and_unlink_base(base);
                }
@@ -264,7 +286,10 @@ void delete_obj(int ok)
        G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT);
        setcursor_space(SPACE_VIEW3D, CURSOR_STD);
        
-       test_scene_constraints();
+       if(islamp && G.vd->drawtype==OB_SHADED) reshadeall_displist();
+
+       test_scene_constraints(); // do because of delete obj
+       
        allqueue(REDRAWVIEW3D, 0);
        redraw_test_buttons(OBACT);
        allqueue (REDRAWACTION, 0);
@@ -277,7 +302,7 @@ void delete_obj(int ok)
        BIF_undo_push("Delete object(s)");
 }
 
-int return_editmesh_indexar(int **indexar, float *cent)
+static int return_editmesh_indexar(int **indexar, float *cent)
 {
        EditMesh *em = G.editMesh;
        EditVert *eve;
@@ -317,9 +342,10 @@ static void select_editmesh_hook(ObHook *hook)
                        if(index < hook->totindex-1) index++;
                }
        }
+       EM_select_flush();
 }
 
-int return_editlattice_indexar(int **indexar, float *cent)
+static int return_editlattice_indexar(int **indexar, float *cent)
 {
        BPoint *bp;
        int *index, nr, totvert=0, a;
@@ -376,7 +402,7 @@ static void select_editlattice_hook(ObHook *hook)
        }
 }
 
-int return_editcurve_indexar(int **indexar, float *cent)
+static int return_editcurve_indexar(int **indexar, float *cent)
 {
        extern ListBase editNurb;
        Nurb *nu;
@@ -746,7 +772,7 @@ void make_track(void)
                allqueue(REDRAWOOPS, 0);
                sort_baselist(G.scene);
        }
-       BIF_undo_push("make Track");
+       BIF_undo_push("Make Track");
 }
 
 void apply_obmat(Object *ob)
@@ -872,8 +898,6 @@ void clear_object(char mode)
        else if(mode=='o') str= "Clear origin";
        else return;
        
-       if(okee(str)==0) return;
-       
        if (G.obpose){
 
                switch (G.obpose->type){
@@ -1130,7 +1154,7 @@ void make_parent(void)
                bFollowPathConstraint *data;
 
                mode= pupmenu("Make Parent %t|Normal Parent %x1|Follow Path %x2|Curve Deform %x3");
-               if(mode==0){
+               if(mode<=0){
                        return;
                }
                else if(mode==1) {
@@ -1228,7 +1252,7 @@ void make_parent(void)
                                return;
                        }
        }
-               else {
+       else {
                if(qual & LR_SHIFTKEY) {
                        if(okee("Make parent without inverse")==0) return;
                }
@@ -1366,7 +1390,7 @@ void enter_editmode(void)
        if(G.scene->id.lib) return;
        base= BASACT;
        if(base==0) return;
-       if((base->lay & G.vd->lay)==0) return;
+       if((G.vd==NULL || (base->lay & G.vd->lay))==0) return;
        
        ob= base->object;
        if(ob->data==0) return;
@@ -1512,6 +1536,10 @@ void exit_editmode(int freedata) /* freedata==0 at render, 1= freedata, 2= do un
        
        /* displist make is different in editmode */
        if(freedata) G.obedit= NULL;
+
+       /* total remake of softbody data */
+       if(ob->softflag & OB_SB_ENABLE) sbObjectToSoftbody(ob);
+       
        makeDispList(ob);
 
        /* has this influence at other objects? */
@@ -1549,8 +1577,6 @@ void exit_editmode(int freedata)  /* freedata==0 at render, 1= freedata, 2= do un
                allqueue(REDRAWOOPS, 0);
        }
        scrarea_queue_headredraw(curarea);
-
-       if(ob->softflag) object_to_softbody(ob);
        
        if(G.obedit==NULL && freedata==2) 
                BIF_undo_push("Editmode");
@@ -1578,29 +1604,39 @@ void docentre(int centremode)
        Nurb *nu, *nu1;
        EditVert *eve;
        float cent[3], centn[3], min[3], max[3], omat[3][3];
-       int a;
+       int a, total= 0;
        MVert *mvert;
 
        if(G.scene->id.lib) return;
-
+       
+       cent[0]= cent[1]= cent[2]= 0.0;
+       
        if(G.obedit) {
 
                INIT_MINMAX(min, max);
        
                if(G.obedit->type==OB_MESH) {
-                       eve= em->verts.first;
-                       while(eve) {
-                               DO_MINMAX(eve->co, min, max);
-                               eve= eve->next;
-                       }
-                       cent[0]= (min[0]+max[0])/2.0f;
-                       cent[1]= (min[1]+max[1])/2.0f;
-                       cent[2]= (min[2]+max[2])/2.0f;
+                       for(eve= em->verts.first; eve; eve= eve->next) {
+                               if(G.vd->around==V3D_CENTROID) {
+                                       total++;
+                                       VECADD(cent, cent, eve->co);
+                               }
+                               else {
+                                       DO_MINMAX(eve->co, min, max);
+                               }
+                       }
+                       
+                       if(G.vd->around==V3D_CENTROID) {
+                               VecMulf(cent, 1.0f/(float)total);
+                       }
+                       else {
+                               cent[0]= (min[0]+max[0])/2.0f;
+                               cent[1]= (min[1]+max[1])/2.0f;
+                               cent[2]= (min[2]+max[2])/2.0f;
+                       }
                        
-                       eve= em->verts.first;
-                       while(eve) {
+                       for(eve= em->verts.first; eve; eve= eve->next) {
                                VecSubf(eve->co, eve->co, cent);                        
-                               eve= eve->next;
                        }
                }
        }
@@ -1827,7 +1863,8 @@ void movetolayer(void)
 {
        Base *base;
        unsigned int lay= 0, local;
-
+       int islamp= 0;
+       
        if(G.scene->id.lib) return;
 
        base= FIRSTBASE;
@@ -1844,13 +1881,17 @@ void movetolayer(void)
        base= FIRSTBASE;
        while(base) {
                if TESTBASE(base) {
-                       local= base->lay & 0xFF000000;
+                       /* upper byte is used for local view */
+                       local= base->lay & 0xFF000000;  
                        base->lay= lay + local;
-
                        base->object->lay= lay;
+                       if(base->object->type==OB_LAMP) islamp= 1;
                }
                base= base->next;
        }
+       
+       if(islamp && G.vd->drawtype == OB_SHADED) reshadeall_displist();
+
        countall();
        allqueue(REDRAWBUTSEDIT, 0);
        allqueue(REDRAWVIEW3D, 0);
@@ -2053,7 +2094,7 @@ void special_editmenu(void)
 
 void convertmenu(void)
 {
-       Base *base, *basen, *basact;
+       Base *base, *basen, *basact, *basedel=NULL;
        Object *ob, *ob1;
        Curve *cu;
        MetaBall *mb;
@@ -2074,7 +2115,7 @@ void convertmenu(void)
                if(nr>0) ok= 1;
        }
        else if(ob->type==OB_MBALL) {
-               nr= pupmenu("Convert Metaball to%t|Mesh (keep original)");
+               nr= pupmenu("Convert Metaball to%t|Mesh (keep original)%x1|Mesh (Delete Original)%x2");
                if(nr>0) ok= 1;
        }
        else if(ob->type==OB_CURVE) {
@@ -2086,7 +2127,7 @@ void convertmenu(void)
                if(nr>0) ok= 1;
        }
        else if(ob->type==OB_MESH && mesh_uses_displist((Mesh*) ob->data)) {
-               nr= pupmenu("Convert SubSurf to%t|Mesh (Keep Original)");
+               nr= pupmenu("Convert SubSurf to%t|Mesh (Keep Original)%x1|Mesh (Delete Original)%x2");
                if(nr>0) ok= 1;
        }
        if(ok==0) return;
@@ -2114,6 +2155,9 @@ void convertmenu(void)
                                
                                if (mesh_uses_displist(oldme)) {
                                        DispListMesh *dlm;
+                                       DerivedMesh *dm;
+
+                                       basedel = base;
 
                                        ob->flag |= OB_DONE;
 
@@ -2138,12 +2182,20 @@ void convertmenu(void)
                                                me->mat= MEM_dupallocN(oldme->mat);
                                                for(a=0; a<ob1->totcol; a++) id_us_plus((ID *)me->mat[a]);
                                        }
-                                               
-                                       dlm= subsurf_make_dispListMesh_from_mesh(oldme, NULL, oldme->subdiv, oldme->flag);
+                                       
+                                       dm= subsurf_make_derived_from_mesh(oldme, oldme->subdiv);
+                                       dlm= dm->convertToDispListMesh(dm);
+                                       dm->release(dm);
+
                                        displistmesh_to_mesh(dlm, ob1->data);
                                        displistmesh_free(dlm);
 
-                                       tex_space_mesh(me);
+                                       /* texspace and normals */
+                                       BASACT= basen;
+                                       enter_editmode();
+                                       exit_editmode(1); // freedata, but no undo
+                                       BASACT= basact;
+                                       
                                }
                        }
                        else if(ob->type==OB_FONT) {
@@ -2188,10 +2240,11 @@ void convertmenu(void)
                        }
                        else if(ob->type==OB_MBALL) {
                        
-                               if(nr==1) {
+                               if(nr==1 || nr == 2) {
                                        ob= find_basis_mball(ob);
                                        
                                        if(ob->disp.first && !(ob->flag&OB_DONE)) {
+                                               basedel = base;
                                        
                                                ob->flag |= OB_DONE;
 
@@ -2224,8 +2277,14 @@ void convertmenu(void)
                        }
                }
                base= base->next;
+               if(basedel != NULL && nr == 2)
+                       free_and_unlink_base(basedel);  
+               basedel = NULL;                         
        }
        
+       test_scene_constraints();       // always call after delete object
+       
+       countall();
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWOOPS, 0);
        allqueue(REDRAWBUTSEDIT, 0);
@@ -2381,6 +2440,8 @@ void copy_attr_menu()
 
        if( give_parteff(ob) ) strcat(str, "|Particle Settings%x20");
 
+       if(ob->soft) strcat(str, "|Soft Body Settings%x23");
+       
        event= pupmenu(str);
        if(event<= 0) return;
        
@@ -2553,7 +2614,7 @@ void copy_attr(short event)
                                                makeDispList(base->object);
                                        }
                                }
-                               else if(event==22){
+                               else if(event==22) {
                                        /* Clear the constraints on the target */
                                        free_constraints(&base->object->constraints);
                                        free_constraint_channels(&base->object->constraintChannels);
@@ -2567,6 +2628,12 @@ void copy_attr(short event)
 
                                        base->object->activecon = NULL;
                                }
+                               else if(event==23) {
+                                       base->object->softflag= ob->softflag;
+                                       if(base->object->soft) sbFree(base->object->soft);
+                                       
+                                       base->object->soft= copy_softbody(ob->soft);
+                               }
                        }
                }
                base= base->next;
@@ -2867,14 +2934,18 @@ void apply_object()
                ob= OBACT;
                if(ob==0) return;
                
-               if(ob->transflag & OB_DUPLI) make_duplilist_real();
+               if(ob->transflag & OB_DUPLI) {
+                       make_duplilist_real();
+               }
                else {
-                       if(okee("Apply deformation")==0) return;
-                       object_apply_deform(ob);
-                       allqueue(REDRAWVIEW3D, 0);
-
-                       return;
+                       if(okee("Apply deformation")) {
+                               object_apply_deform(ob);
+                               BIF_undo_push("Apply deformation");
+                       }
                }
+               allqueue(REDRAWVIEW3D, 0);
+
+               return;
        }
 
        if(okee("Apply size and rotation")==0) return;
@@ -2910,6 +2981,7 @@ void apply_object()
                                /* texspace and normals */
                                BASACT= base;
                                enter_editmode();
+                               BIF_undo_push("Applied object");        // editmode undo itself
                                exit_editmode(1); // freedata, but no undo
                                BASACT= basact;                         
                                
@@ -2977,6 +3049,7 @@ void apply_object()
                                /* texspace and normals */
                                BASACT= base;
                                enter_editmode();
+                               BIF_undo_push("Applied object");        // editmode undo itself
                                exit_editmode(1); // freedata, but no undo
                                BASACT= basact;
                        }
@@ -3062,7 +3135,8 @@ static void clear_pose_update_flag(Object *ob) {
        }
 }
 
-static int pose_flags_reset_done(Object *ob) {
+/* exposed in transform.c */
+int pose_flags_reset_done(Object *ob) {
        /* Clear the constraint done status for every pose channe;
         * that has been flagged as needing constant updating
         */
@@ -3096,7 +3170,7 @@ static int is_ob_constraint_target(Object *ob, ListBase *conlist) {
 
 }
 
-int clear_bone_nocalc(Object *ob, Bone *bone, void *ptr) {
+static int clear_bone_nocalc(Object *ob, Bone *bone, void *ptr) {
        /* When we aren't transform()-ing, we'll want to turn off
         * the no calc flag for bone bone in case the frame changes,
         * or something
@@ -3119,7 +3193,7 @@ static void clear_bone_nocalc_ob(Object *ob) {
 
 }
 
-int set_bone_nocalc(Object *ob, Bone *bone, void *ptr) {
+static int set_bone_nocalc(Object *ob, Bone *bone, void *ptr) {
        /* Calculating bone transformation makes thins slow ...
         * lets set the no calc flag for a bone by default
         */
@@ -3128,7 +3202,7 @@ int set_bone_nocalc(Object *ob, Bone *bone, void *ptr) {
        return 0;
 }
 
-int selected_bone_docalc(Object *ob, Bone *bone, void *ptr) {
+static int selected_bone_docalc(Object *ob, Bone *bone, void *ptr) {
        /* Let's clear the no calc flag for selected bones.
         * This function always returns 1 for non-no calc bones
         * (a.k.a., the 'do calc' bones) so that the bone_looper 
@@ -3279,7 +3353,8 @@ static void figure_bone_nocalc_core(Object *ob, bArmature *arm) {
        }
 }
 
-static void figure_bone_nocalc(Object *ob) {
+/* exposed in transform.c */
+void figure_bone_nocalc(Object *ob) {
        /* Let's figure out which bones need to be recalculated,
         * and which don't. Calculations are based on which bones
         * are selected, and the constraints that love them.
@@ -3299,7 +3374,7 @@ static void figure_bone_nocalc(Object *ob) {
        figure_bone_nocalc_core(ob, arm);
 }
 
-int bone_nocalc2chan_trans_update(Object *ob, Bone *bone, void *ptr) {
+static int bone_nocalc2chan_trans_update(Object *ob, Bone *bone, void *ptr) {
        /* Set PCHAN_TRANS_UPDATE for channels with bones that don't have
         * the no calc flag set ... I hate this.
         */
@@ -3317,7 +3392,7 @@ int bone_nocalc2chan_trans_update(Object *ob, Bone *bone, void *ptr) {
        return 0;
 }
 
-void clear_gonna_move(void) {
+static void clear_gonna_move(void) {
        Base *base;
 
        /* clear the gonna move flag */
@@ -3326,7 +3401,7 @@ void clear_gonna_move(void) {
        }
 }
 
-int is_parent_gonna_move(Object *ob) {
+static int is_parent_gonna_move(Object *ob) {
        if ( (ob->parent) &&
                 (ob->parent->flag & OB_GONNA_MOVE) ) {
                return 1;
@@ -3334,7 +3409,7 @@ int is_parent_gonna_move(Object *ob) {
        return 0;
 }
 
-int is_constraint_target_gonna_move(Object *ob) {
+static int is_constraint_target_gonna_move(Object *ob) {
        Object *tarOb;
        bConstraint *con;
        bPoseChannel *chan;
@@ -3360,7 +3435,7 @@ int is_constraint_target_gonna_move(Object *ob) {
        return 0;
 }
 
-void flag_moving_objects(void) {
+static void flag_moving_objects(void) {
        Base *base;
        int numgonnamove = 0, oldnumgonnamove = -1;
 
@@ -3446,6 +3521,9 @@ static int pose_do_update_flag(Object *ob) {
        return do_update;
 }
 
+/* this is a confusing call, it also does the constraint update flags, but was not used...
+   hopefully transform refactor will take care better of it (ton) */
+/* exposed int transform.c */
 void figure_pose_updating(void)
 {
        Base *base;
@@ -3456,8 +3534,17 @@ void figure_pose_updating(void)
                /* Recalculate the pose if necessary, regardless of
                 * whether the layer is visible or not.
                 */
-               if (pose_do_update_flag(base->object))
+               if (pose_do_update_flag(base->object)) {
                        base->flag |= BA_WHERE_UPDATE;
+               }
+               else if(base->object->flag & OB_GONNA_MOVE) {
+                       /* if position updates, deform info could change too */
+                       if(base->object->hooks.first) base->flag |= BA_DISP_UPDATE;
+                       else if(base->object->parent) {
+                               if(base->object->parent->type==OB_LATTICE || base->object->partype==PARSKEL)
+                                       base->flag |= BA_DISP_UPDATE;
+                       }
+               }
        }
 
 }
@@ -3865,9 +3952,10 @@ void make_trans_verts(float *min, float *max, int mode)
        TransVert *tv=NULL;
        MetaElem *ml;
        EditVert *eve;
-       int a;
        EditBone        *ebo;
-       
+       float total;
+       int a;
+
        tottrans= 0; // global!
        
        INIT_MINMAX(min, max);
@@ -4068,18 +4156,21 @@ void make_trans_verts(float *min, float *max, int mode)
        
        /* cent etc */
        tv= transvmain;
+       total= 0.0;
        for(a=0; a<tottrans; a++, tv++) {
                if(tv->flag & SELECT) {
                        centroid[0]+= tv->oldloc[0];
                        centroid[1]+= tv->oldloc[1];
                        centroid[2]+= tv->oldloc[2];
-
+                       total+= 1.0;
                        DO_MINMAX(tv->oldloc, min, max);
                }
        }
-       centroid[0]/= G.totvertsel;
-       centroid[1]/= G.totvertsel;
-       centroid[2]/= G.totvertsel;
+       if(total!=0.0) {
+               centroid[0]/= total;
+               centroid[1]/= total;
+               centroid[2]/= total;
+       }
 
        centre[0]= (min[0]+max[0])/2.0;
        centre[1]= (min[1]+max[1])/2.0;
@@ -4087,18 +4178,20 @@ void make_trans_verts(float *min, float *max, int mode)
        
 }
 
+/* now only in use by drawimage.c */
 void draw_prop_circle()
 {
-       float tmat[4][4], imat[4][4];
-       
-       if(G.moving) {
+       if (G.f & G_PROPORTIONAL) {
+               float tmat[4][4], imat[4][4];
 
-               BIF_ThemeColor(TH_GRID);
+               if(G.moving) {
+                       BIF_ThemeColor(TH_GRID);
 
-               mygetmatrix(tmat);
-               Mat4Invert(imat, tmat);
+                       mygetmatrix(tmat);
+                       Mat4Invert(imat, tmat);
 
-               drawcircball(prop_cent, prop_size, imat);
+                       drawcircball(GL_LINE_LOOP, prop_cent, prop_size, imat);
+               }
        }
 }
 
@@ -4293,7 +4386,6 @@ void special_aftertrans_update(char mode, int flip, short canceled, int keyflags
        Base *base;
        MetaBall *mb;
        Curve *cu;
-       Ika *ika;
        int doit,redrawipo=0;
 
        
@@ -4374,10 +4466,19 @@ void special_aftertrans_update(char mode, int flip, short canceled, int keyflags
                                
                                where_is_object(ob);
 
-                               if(ob->type==OB_IKA) {
-                                       ika= ob->data;                                  
-                                       VecMat4MulVecfl(ika->effg, ob->obmat, ika->eff);
-                                       itterate_ika(ob);
+                               if(ob->type==OB_ARMATURE && canceled) {
+                                       /* Unfortunately, sometimes when you escape
+                                        * a transform on an object that is the
+                                        * target of an IK constraint on an armature
+                                        * bone, the rotations are not restored
+                                        * correctly on the bones in the IK chain. 
+                                        * There is probably a nice, elegant way to fix 
+                                        * this using transdata, but this system is so 
+                                        * darn confusing that we'll do it this brute
+                                        * force way instead:
+                                        */
+                                       clear_pose_constraint_status(ob);
+                                       make_displists_by_armature(ob);
                                }
                        }
                        if(base->flag & BA_DISP_UPDATE) {
@@ -4415,6 +4516,8 @@ void special_aftertrans_update(char mode, int flip, short canceled, int keyflags
                                        makeDispList(ob);
                        }
                        
+                       if(ob->softflag & OB_SB_ENABLE) sbObjectReset(ob);
+                       
                        where_is_object(ob);    /* always do, for track etc. */
 
                        /* Set autokey if necessary */
@@ -4474,23 +4577,6 @@ void calc_trans_verts(void)
        }
 }
 
-
-static int test_midtog_proj(short xn, short yn, short *mval)
-{
-       float x,y,z;
-
-       /* which movement is the largest? that'll be the one */
-       xn= (xn-mval[0]);
-       yn= (yn-mval[1]);
-       x = fabs(G.vd->persinv[0][0]*xn + G.vd->persinv[1][0]*yn);
-       y = fabs(G.vd->persinv[0][1]*xn + G.vd->persinv[1][1]*yn);
-       z = fabs(G.vd->persinv[0][2]*xn + G.vd->persinv[1][2]*yn);
-
-       if(x>=y && x>=z) return 0;
-       else if(y>=x && y>=z) return 1;
-       else return 2;
-}
-
 void apply_keyb_grid(float *val, float fac1, float fac2, float fac3, int invert)
 {
        /* fac1 is for 'nothing', fac2 for CTRL, fac3 for SHIFT */
@@ -4513,7 +4599,7 @@ void apply_keyb_grid(float *val, float fac1, float fac2, float fac3, int invert)
        }
 }
 
-
+/* exported to transform.c */
 void compatible_eul(float *eul, float *oldrot)
 {
        float dx, dy, dz;
@@ -4734,2025 +4820,136 @@ int my_clock(void)
        return (int)ftime;
 }
 
-static void view_editmove(unsigned char event)
-{
-       /* Regular:   Zoom in */
-       /* Shift:     Scroll up */
-       /* Ctrl:      Scroll right */
-       /* Alt-Shift: Rotate up */
-       /* Alt-Ctrl:  Rotate right */
-
-       switch(event) {
-               case WHEELUPMOUSE:
-
-                       if( G.qual & LR_SHIFTKEY ) {
-                               if( G.qual & LR_ALTKEY ) { 
-                                       G.qual &= ~LR_SHIFTKEY;
-                                       persptoetsen(PAD2);
-                                       G.qual |= LR_SHIFTKEY;
-                               } else {
-                                       persptoetsen(PAD2);
-                               }
-                       } else if( G.qual & LR_CTRLKEY ) {
-                               if( G.qual & LR_ALTKEY ) { 
-                                       G.qual &= ~LR_CTRLKEY;
-                                       persptoetsen(PAD4);
-                                       G.qual |= LR_CTRLKEY;
-                               } else {
-                                       persptoetsen(PAD4);
-                               }
-                       } else if(U.uiflag & USER_WHEELZOOMDIR) 
-                               persptoetsen(PADMINUS);
-                       else
-                               persptoetsen(PADPLUSKEY);
-
-                       break;
-               case WHEELDOWNMOUSE:
-                       if( G.qual & LR_SHIFTKEY ) {
-                               if( G.qual & LR_ALTKEY ) { 
-                                       G.qual &= ~LR_SHIFTKEY;
-                                       persptoetsen(PAD8);
-                                       G.qual |= LR_SHIFTKEY;
-                               } else {
-                                       persptoetsen(PAD8);
-                               }
-                       } else if( G.qual & LR_CTRLKEY ) {
-                               if( G.qual & LR_ALTKEY ) { 
-                                       G.qual &= ~LR_CTRLKEY;
-                                       persptoetsen(PAD6);
-                                       G.qual |= LR_CTRLKEY;
-                               } else {
-                                       persptoetsen(PAD6);
-                               }
-                       } else if(U.uiflag & USER_WHEELZOOMDIR) 
-                               persptoetsen(PADPLUSKEY);
-                       else
-                               persptoetsen(PADMINUS);
-                       
-                       break;
-       }
-}
-
-/* *********************** AXIS CONSTRAINT HELPER LINE *************** */
 
-static void constline(float *center, float *dir, char axis, float axismat[][3])
+void std_rmouse_transform(void (*xf_func)(int, int))
 {
-       extern void make_axis_color(char *col, char *col2, char axis);  // drawview.c
-       float v1[3], v2[3], v3[3];
-       char col[3], col2[3];
-       
-       if(G.obedit) mymultmatrix(G.obedit->obmat);     // sets opengl viewing
-
-       VecCopyf(v3, dir);
-       VecMulf(v3, G.vd->far);
+       short mval[2];
+       short xo, yo;
+       short timer=0;
+       short mousebut;
        
-       VecSubf(v2, center, v3);
-       VecAddf(v1, center, v3);
-
-       BIF_GetThemeColor3ubv(TH_GRID, col);
-       make_axis_color(col, col2, axis);
-       glColor3ubv(col2);
-
-       setlinestyle(0);
-       glBegin(GL_LINE_STRIP); 
-               glVertex3fv(v1); 
-               glVertex3fv(v2); 
-       glEnd();
+       /* check for left mouse select/right mouse select user pref */
+       if (U.flag & USER_LMOUSESELECT) mousebut = L_MOUSE;
+               else mousebut = R_MOUSE;
        
-       if(axismat) {
-               float mat[4][4];
-               
-               Mat4CpyMat3(mat, axismat);
-               VecAddf(mat[3], mat[3], center);
-               
-               mymultmatrix(mat);
-               BIF_ThemeColor(TH_TEXT);
-               drawaxes(2.0);
-       }
+       getmouseco_areawin(mval);
+       xo= mval[0]; 
+       yo= mval[1];
        
-       myloadmatrix(G.vd->viewmat);
-
-}
-
-
-#define XTRANS         0x01
-#define YTRANS         0x02
-#define ZTRANS         0x04
-#define TRANSLOCAL     0x80
-#define XTRANSLOCAL    (XTRANS|TRANSLOCAL)
-#define YTRANSLOCAL    (YTRANS|TRANSLOCAL)
-#define ZTRANSLOCAL    (ZTRANS|TRANSLOCAL)
-
-/* temporal storage for callback */
-struct constline_temp {
-       int mode, axismode, midtog;
-       float *centre, *vx, *vy, *vz;
-       float *imat;
-};
-
-static struct constline_temp cnst={0,0}; // init
-
-/* called while transform(), store the relevant values in struct  */
-static void set_constline_callback(int mode, int axismode, int midtog, 
-                                               float *centre, float imat[][3], float *vx, float *vy, float *vz)
-{
-       cnst.mode= mode;
-       cnst.axismode= axismode;
-       cnst.midtog= midtog;
-       cnst.centre= centre;
-       cnst.imat= (float *)imat;
-       cnst.vx= vx;
-       cnst.vy= vy;
-       cnst.vz= vz;
-}
+       while(get_mbut() & mousebut) {
+               getmouseco_areawin(mval);
+               if(abs(mval[0]-xo)+abs(mval[1]-yo) > 10) {
+                       if(curarea->spacetype==SPACE_VIEW3D)
+                               Transform(TFM_TRANSLATION, CTX_NONE);
+                       else
+                               xf_func('g', 0);
 
-/* is called from drawview.c after drawing objects */
-void constline_callback(void)
-{
-       TransOb *tob;
-       int a;
-       
-       if(cnst.mode==0 || cnst.axismode==0) return;    // uninitialized or no helpline
-       
-       // check further:
-       if( (cnst.mode == 'C') || (cnst.mode == 'w') || (cnst.mode=='N') ) return; 
-       if( ((cnst.mode=='R')||(cnst.mode=='r')) && (cnst.midtog) ) return;
-               
-       if(G.obedit) {  // only one helpline in editmode
-               float matone[3][3];
-               Mat3One(matone);
-               
-               switch (cnst.axismode) {
-               case XTRANSLOCAL: constline(cnst.centre, cnst.vx, 'x', matone); break;
-               case YTRANSLOCAL: constline(cnst.centre, cnst.vy, 'y', matone); break;
-               case ZTRANSLOCAL: constline(cnst.centre, cnst.vz, 'z', matone); break;
-               case XTRANS: constline(cnst.centre, cnst.imat, 'x', NULL); break;
-               case YTRANS: constline(cnst.centre, cnst.imat+3, 'y', NULL); break;
-               case ZTRANS: constline(cnst.centre, cnst.imat+6, 'z', NULL); break;
-               }
-       }
-       else if(cnst.axismode < TRANSLOCAL) {   // for multiple objects one helpline...
-               switch (cnst.axismode) {
-               case XTRANS: constline(cnst.centre, cnst.vx, 'x', NULL); break;
-               case YTRANS: constline(cnst.centre, cnst.vy, 'y', NULL); break;
-               case ZTRANS: constline(cnst.centre, cnst.vz, 'z', NULL); break;
+                       while(get_mbut() & mousebut) BIF_wait_for_statechange();
+                       return;
                }
-       }
-       else {  // unless it's local transform
-               tob= transmain;
-               for(a=0; a<tottrans; a++, tob++) {
-                       switch (cnst.axismode) {
-                       case XTRANSLOCAL: constline(tob->loc, tob->axismat[0], 'x', tob->axismat); break;
-                       case YTRANSLOCAL: constline(tob->loc, tob->axismat[1], 'y', tob->axismat); break;
-                       case ZTRANSLOCAL: constline(tob->loc, tob->axismat[2], 'z', tob->axismat); break;
+               else {
+                       PIL_sleep_ms(10);
+                       timer++;
+                       if(timer>=10*U.tb_rightmouse) {
+                               toolbox_n();
+                               return;
                        }
                }
        }
+       /* if gets here it's a select */
+       BIF_undo_push("Select");
 }
 
-/* *********************** END AXIS CONSTRAINT HELPER LINE *************** */
-/* *********************** TRANSFORM()  *************** */
-
-static char *transform_mode_to_string(int mode)
+void rightmouse_transform(void)
 {
-       switch(mode) {
-               case 'g':       return("Grab"); break;
-               case 's':       return("Scale"); break;
-               case 'r':       return("Rotate"); break;
-               case 'G':       return("Grab Proportional"); break;
-               case 'C':       return("Scale Proportional"); break;
-               case 'R':       return("Rotate Proportional"); break;
-               case 'S':       return("Shear"); break;
-               case 'N':       return("Shrink/Fatten"); break;
-               case 'w':       return("Warp"); break;
-               case 'd':       return("Duplicate"); break;
-                          case 'n':       return("Extrude"); break;
-               default:        return("Transform");
-       }
+       std_rmouse_transform(Transform);
 }
 
-/* 
-'g' 'G' -> Grab / Grab with PET
-'n'     -> Grab with vert normal (after extrude)
-'r' 'R' -> Rotate / Rotate with PET
-'s' 'C' -> Scale / Scale with PET
-'S'            -> Shear
-'t'            -> Tilt
-'w'            -> Warp
-'N'            -> Shrink/Fatten
-*/
-void transform(int mode)
-{
-       short canceled = 0;
-       TransOb *tob;
-       TransVert *tv;
-       float *edge_creases=NULL;       /* edge transform isnt really supported... */
-       float vec[3], min[3], max[3], dvec[3], d_dvec[3], dvecp[3], rot0[3], rot1[3], rot2[3], axis[3];
-       float totmat[3][3], omat[3][3], imat[3][3], mat[3][3], tmat[3][3], phi, dphi;
-
-       float persinv[3][3], persmat[3][3], viewinv[4][4], imat4[4][4];
-       float *curs, dx1, dx2, dy1, dy2, eul[3], quat[4], rot[3], phi0, phi1, deler, rad = 0.0;
-       float sizefac, size[3], sizelo[3], smat[3][3], xref=1.0, yref=1.0, zref= 1.0;
-       float si, co, dist=0.0, startcircumfac = 0.0, circumfac, oldval[3];
-       int axismode=0, time, fast=0, a, midtog=0, firsttime=1, wrong= 0, cameragrab= 0, gridflag;
-       unsigned short event=0;
-       short mval[2], breakloop=0, doit, xn, yn, xc, yc, xo, yo = 0, val;
-       char str[100], *undostr;
-       int     keyflags = 0;
-
-       float addvec[3] = {0,0,0}; // for new typing code
-       short ax = 0, del = 0, typemode = 0; // also for new typing thingy
-       short pe[3] = {0,0,0}; // again for the same thing. Determines if the period key has been pressed.
-       short mi[3] = {1,1,1}; // same thing again. Determines whether or not the minus key has been pressed (in order to add or substract new numbers).
-       short numchange[3] = {0,0,0}; // Determines whether or not one axis recieved changes (mainly for scaling)
-
-       float vx[3] = {1,0,0}, vy[3] = {0,1,0}, vz[3] = {0,0,1};
-
-       if (mode % 'x' == 0)
-               axismode = XTRANSLOCAL;
-       else if (mode % 'X' == 0)
-               axismode = XTRANS;
-       else if (mode % 'y' == 0)
-               axismode = YTRANSLOCAL;
-       else if (mode % 'Y' == 0)
-               axismode = YTRANS;
-       else if (mode % 'z' == 0)
-               axismode = ZTRANSLOCAL;
-       else if (mode % 'Z' == 0)
-               axismode = ZTRANS;
-
-       if (mode % 'g' == 0)
-               mode = 'g';
-       else if (mode % 'r' == 0)
-               mode = 'r';
-       else if (mode % 's' == 0)
-               mode = 's';
-       
-       /* used in end of function */
-       undostr= transform_mode_to_string(mode);
-       
-       if(G.obedit && (G.f & G_PROPORTIONAL)) {
-               if(mode=='g') mode= 'G';
-               if(mode=='r') mode= 'R';
-               if(mode=='s') mode= 'C';
-       }
-       /* form duplicate routines */
-       if(mode=='d') mode= 'g';
-
-       /* this can cause floating exception at dec alpha */
-       d_dvec[0]= d_dvec[1]= d_dvec[2]= 0.0;
-       dvec[0]= dvec[1]= dvec[2]= 0.0;
 
-       if(G.scene->id.lib) return;
+/* ************************************** */
 
-       if(mode=='t') {
-               if(G.obedit==0 || G.obedit->type!=OB_CURVE) return;
-       }
-       if(mode=='w' && G.obedit==0) return;
 
-       /* what data will be involved? */
-       if(G.obedit) {
-               if(mode=='N') vertexnormals(0);
+void single_object_users(int flag)     
+{
+       Base *base;
+       Object *ob, *obn;
+       
+       clear_sca_new_poins();  /* sensor/contr/act */
 
-               /* min en max needed for warp */
-               if(mode=='G' || mode=='R' || mode=='C') make_trans_verts(min, max, 1);
-               else make_trans_verts(min, max, 0);
-       }
-       else if (G.obpose){
+       /* duplicate */
+       base= FIRSTBASE;
+       while(base) {
+               ob= base->object;
+               
+               if( (base->flag & flag)==flag) {
 
-               switch (G.obpose->type) {
-               case OB_ARMATURE:
-                       /* figure out which bones need calculating */
-                       figure_bone_nocalc(G.obpose);
-                       figure_pose_updating();
-                       make_trans_bones((char)mode);
+                       if(ob->id.lib==0 && ob->id.us>1) {
                        
-                       if(mode=='g' && tottrans==0) {
-                               mode= 'r';
-                               make_trans_bones((char)mode);
+                               obn= copy_object(ob);
+                               ob->id.us--;
+                               base->object= obn;
                        }
-                       
-                       break;
                }
+               base= base->next;
        }
-       else {
-               int opt= 0;
-               if (mode=='g' || mode=='G') opt= 'g';
-               else if (mode=='r' || mode=='R') opt= 'r';
-               else if (mode=='s' || mode=='S') opt= 's';
-
-               setbaseflags_for_editing(opt);
-               figure_pose_updating();
-               make_trans_objects();
-       }
-
-       if(tottrans==0) {
-               if(G.obedit==0) clearbaseflags_for_editing();
-               return;
-       }
-
-       if(G.obedit==0 && mode=='S') return;
        
-       if(G.vd->around==V3D_LOCAL) {
-               if(G.obedit) {
-                       centre[0]= centre[1]= centre[2]= 0.0;
-               }
-
-       }
-       if(G.vd->around==V3D_CENTROID) {
-               VECCOPY(centre, centroid);
-       }
-       else if(G.vd->around==V3D_CURSOR) {
-               curs= give_cursor();
-               VECCOPY(centre, curs);
-
-               if(G.obedit) {
-                       VecSubf(centre, centre, G.obedit->obmat[3]);
-                       Mat3CpyMat4(mat, G.obedit->obmat);
-                       Mat3Inv(imat, mat);
-                       Mat3MulVecfl(imat, centre);
+       ID_NEW(G.scene->camera);
+       if(G.vd) ID_NEW(G.vd->camera);
+       
+       /* object pointers */
+       base= FIRSTBASE;
+       while(base) {
+               ob= base->object;
+               if(ob->id.lib==0) {
+                       if( (base->flag & flag)==flag) {
+                               
+                               relink_constraints(&base->object->constraints);
+                               if (base->object->pose){
+                                       bPoseChannel *chan;
+                                       for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
+                                               relink_constraints(&chan->constraints);
+                                       }
+                               }
+                               if(base->object->hooks.first) {
+                                       ObHook *hook= base->object->hooks.first;
+                                       while(hook) {
+                                               ID_NEW(hook->parent);
+                                               hook= hook->next;
+                                       }
+                               }
+                               
+                               ID_NEW(ob->parent);
+                               ID_NEW(ob->track);
+                               
+                       }
                }
-
-       }
-
-       /* Always rotate around object centroid */
-       if (G.obpose){
-               VECCOPY (centre, centroid);
-       }
-
-       /* moving: is shown in drawobject() */
-       if(G.obedit) G.moving= 2;
-       else G.moving= 1;
-
-       areawinset(curarea->win);
-
-       /* the persinv is polluted with translation, do not use!! */
-       Mat3CpyMat4(persmat, G.vd->persmat);
-       Mat3Inv(persinv, persmat);
-
-       VECCOPY(rot0, persinv[0]);
-       Normalise(rot0);
-       VECCOPY(rot1, persinv[1]);
-       Normalise(rot1);
-       VECCOPY(rot2, persinv[2]);
-       Normalise(rot2);
-
-       /* init vars */
-
-       Mat4Invert(viewinv, G.vd->viewmat);
-
-       if(transvmain) {
-               VECCOPY(vec, centre);
-               Mat4MulVecfl(G.obedit->obmat, vec);
-               initgrabz(vec[0], vec[1], vec[2]);
-               project_short_noclip(vec, mval);
+               base= base->next;
        }
-       else {
-               /* voor panning from cameraview */
-               if( G.vd->camera==OBACT && G.vd->persp>1) {
-                       /* 6.0 = 6 grid units */
-                       centre[0]+= -6.0*rot2[0];
-                       centre[1]+= -6.0*rot2[1];
-                       centre[2]+= -6.0*rot2[2];
-               }
 
-               initgrabz(centre[0], centre[1], centre[2]);
-               project_short_noclip(centre, mval);
+       set_sca_new_poins();
+}
 
-               if( G.vd->camera==OBACT && G.vd->persp>1) {
-                       centre[0]+= 6.0*rot2[0];
-                       centre[1]+= 6.0*rot2[1];
-                       centre[2]+= 6.0*rot2[2];
+void new_id_matar(Material **matar, int totcol)
+{
+       ID *id;
+       int a;
+       
+       for(a=0; a<totcol; a++) {
+               id= (ID *)matar[a];
+               if(id && id->lib==0) {
+                       if(id->newid) {
+                               matar[a]= (Material *)id->newid;
+                               id_us_plus(id->newid);
+                               id->us--;
+                       }
+                       else if(id->us>1) {
+                               matar[a]= copy_material(matar[a]);
+                               id->us--;
+                               id->newid= (ID *)matar[a];
+                       }
                }
        }
-
-       VECCOPY(prop_cent, centre);
-
-       xc= mval[0];
-       yc= mval[1];
-
-       if(G.obedit) {
-               Mat3CpyMat4(omat, G.obedit->obmat);
-               Mat3Inv(imat, omat);
-
-               Mat4Invert(imat4, G.obedit->obmat);
-       }
-
-       else if(G.obpose) {
-               Mat3CpyMat4(omat, G.obpose->obmat);
-               Mat3Inv(imat, omat);
-
-               Mat4Invert(imat4, G.obpose->obmat);
-       }
-
-       else {
-               if(transmain) {
-                       if(OBACT &&  G.vd->persp>1 && G.vd->camera==OBACT) {
-                               cameragrab= 1;
-                               xc= curarea->winx/2;
-                               yc= curarea->winy/2;
-                       }
-               }
-       }
-
-       if((mode=='r' || mode=='s' || mode=='S') && xc==32000) {
-               error("Centre far out of view");
-               wrong= 1;
-       }
-
-       if(mode=='w' && G.obedit) {
-               Mat4MulVecfl(G.obedit->obmat, min);
-               Mat4MulVecfl(G.vd->viewmat, min);
-               Mat4MulVecfl(G.obedit->obmat, max);
-               Mat4MulVecfl(G.vd->viewmat, max);
-
-               centre[0]= (min[0]+max[0])/2.0;
-               centre[1]= (min[1]+max[1])/2.0;
-               centre[2]= (min[2]+max[2])/2.0;
-
-                       /* cursor is centre */
-               curs= give_cursor();
-               VECCOPY(axis, curs);
-               Mat4MulVecfl(G.vd->viewmat, axis);
-               rad= sqrt( (axis[0]-centre[0])*(axis[0]-centre[0])+(axis[1]-centre[1])*(axis[1]-centre[1]) );
-               dist= max[0]-centre[0];
-               if(dist==0.0) wrong= 1;
-               else startcircumfac= (90*rad*M_PI)/(360.0*dist);
-       }
-
-       getmouseco_areawin(mval);
-       xn=xo= mval[0];
-       yn=yo= mval[1];
-       dx1= xc-xn;
-       dy1= yc-yn;
-       phi= phi0= phi1= 0.0;
-
-       sizefac= sqrt( (float)((yc-yn)*(yc-yn)+(xn-xc)*(xn-xc)) );
-       if(sizefac<2.0) sizefac= 2.0;
-
-       gridflag= U.flag;
-
-       while(wrong==0 && breakloop==0) {
-
-               getmouseco_areawin(mval);
-               if(mval[0]!=xo || mval[1]!=yo || firsttime) {
-                       if(firsttime) {
-
-                               /* not really nice, but who cares! */
-                               oldval[0]= oldval[1]= oldval[2]= MAXFLOAT;
-
-                               /* proportional precalc */
-                               if(mode=='G' || mode=='R' || mode=='C') {
-                                       if(transvmain) {
-                                               tv= transvmain;
-                                               for(a=0; a<tottrans; a++, tv++) {
-                                                       set_proportional_weight(tv, min, max);
-                                               }
-                                       }
-                               }
-                       }
-                       firsttime= 0;
-
-                       if(mode=='g' || mode=='G' || mode=='n') {
-                               float dot; /* for grab along normal */
-                               char gmode[10] = "";
-
-                               keyflags |= KEYFLAG_LOC;
-
-                               if (axismode==XTRANSLOCAL) strcpy(gmode, "Local X: ");
-                               if (axismode==YTRANSLOCAL) strcpy(gmode, "Local Y: ");
-                               if (axismode==ZTRANSLOCAL) strcpy(gmode, "Local Z: ");
-                               if (axismode==XTRANS) strcpy(gmode, "X Axis: ");
-                               if (axismode==YTRANS) strcpy(gmode, "Y Axis: ");
-                               if (axismode==ZTRANS) strcpy(gmode, "Z Axis: ");
-
-                               if(axismode) {
-                                       if(cameragrab) {
-                                               dx1= 0.002*(mval[1]-yn)*G.vd->grid;
-                                               dvec[0]-= dx1*G.vd->viewinv[2][0];
-                                               dvec[1]-= dx1*G.vd->viewinv[2][1];
-                                               dvec[2]-= dx1*G.vd->viewinv[2][2];
-                                               firsttime= 1;   /* so it keeps going */
-                                       }
-                                       else {
-                                               window_to_3d(dvec, mval[0]-xn, mval[1]-yn);
-                                               if(axismode & XTRANS) dvec[1]=dvec[2]= 0.0;
-                                               if(axismode & YTRANS) dvec[0]=dvec[2]= 0.0;
-                                               if(axismode & ZTRANS) dvec[0]=dvec[1]= 0.0;
-                                       }
-                               }
-                               else window_to_3d(dvec, mval[0]-xn, mval[1]-yn);
-
-                               if (typemode){
-                                       dvec[0] = addvec[0];
-                                       dvec[1] = addvec[1];
-                                       dvec[2] = addvec[2];
-                                       if(axismode == XTRANS) dvec[1]=dvec[2]= 0.0;
-                                       if(axismode == YTRANS) dvec[0]=dvec[2]= 0.0;
-                                       if(axismode == ZTRANS) dvec[0]=dvec[1]= 0.0;
-                               }
-
-                               /* grids */
-                               if(G.qual & LR_SHIFTKEY) {
-                                       dvec[0]= 0.1*(dvec[0]-d_dvec[0])+d_dvec[0];
-                                       dvec[1]= 0.1*(dvec[1]-d_dvec[1])+d_dvec[1];
-                                       dvec[2]= 0.1*(dvec[2]-d_dvec[2])+d_dvec[2];
-                               }
-                               if (mode != 'n') {
-                                       apply_keyb_grid(dvec, 0.0, G.vd->grid, 0.1*G.vd->grid, gridflag & USER_AUTOGRABGRID);
-                                       apply_keyb_grid(dvec+1, 0.0, G.vd->grid, 0.1*G.vd->grid, gridflag & USER_AUTOGRABGRID);
-                                       apply_keyb_grid(dvec+2, 0.0, G.vd->grid, 0.1*G.vd->grid, gridflag & USER_AUTOGRABGRID);
-                               }
-
-                               if(dvec[0]!=oldval[0] ||dvec[1]!=oldval[1] ||dvec[2]!=oldval[2]) {
-                                       VECCOPY(oldval, dvec);
-
-                                       /* speedup for vertices */
-                                       if (G.obedit) {
-                                               VECCOPY(dvecp, dvec);
-                                               if (axismode&TRANSLOCAL && typemode) {
-                                                       if(axismode==XTRANSLOCAL) dvecp[1]=dvecp[2]=0;
-                                                       if(axismode==YTRANSLOCAL) dvecp[0]=dvecp[2]=0;
-                                                       if(axismode==ZTRANSLOCAL) dvecp[0]=dvecp[1]=0;
-                                                       VECCOPY(dvec, dvecp);
-                                               }
-                                               else {
-                                                       Mat3MulVecfl(imat, dvecp);
-                                                       if(axismode==XTRANSLOCAL) dvecp[1]=dvecp[2]=0;
-                                                       if(axismode==YTRANSLOCAL) dvecp[0]=dvecp[2]=0;
-                                                       if(axismode==ZTRANSLOCAL) dvecp[0]=dvecp[1]=0;
-                                                       if(axismode&TRANSLOCAL){
-                                                               VECCOPY(dvec, dvecp);
-                                                               Mat3MulVecfl(omat, dvec);
-                                                       }
-                                               }
-                                       }
-
-                                       if(mode=='n') {
-                                               tv= transvmain;
-                                               if(tv->nor) {
-                                                       dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
-                                                       apply_keyb_grid(&dot, 0.0, G.vd->grid, 0.1*G.vd->grid, gridflag & USER_AUTOGRABGRID);
-                                                       dvec[0] = dot;
-                                                       dvec[1] = dvec[2] = 0.0;
-                                               }
-                                       }
-
-                                       /* apply */
-                                       tob= transmain;
-                                       tv= transvmain;
-
-                                       for(a=0; a<tottrans; a++, tob++, tv++) {
-
-                                               if(transmain) {
-                                                       VECCOPY(dvecp, dvec);
-                                                       if(axismode & TRANSLOCAL)
-                                                               Mat3MulVecfl(tob->axismat, dvecp);
-
-                                                       if(transmode==TRANS_TEX) Mat3MulVecfl(tob->obinv, dvecp);
-
-                                                       if(tob->flag & TOB_IKA) {
-                                                               VecAddf(tob->eff, tob->oldeff, dvecp);
-                                                       }
-                                                       else
-                                                               Mat3MulVecfl(tob->parinv, dvecp);
-
-                                                       if(tob->flag & TOB_IPO) {
-                                                               add_ipo_tob_poin(tob->locx, tob->oldloc, dvecp[0]);
-                                                               add_ipo_tob_poin(tob->locy, tob->oldloc+1, dvecp[1]);
-                                                               add_ipo_tob_poin(tob->locz, tob->oldloc+2, dvecp[2]);
-                                                       }
-                                                       else if(tob->loc) {
-                                                               VecAddf(tob->loc, tob->oldloc, dvecp);
-                                                       }
-                                               }
-                                               else {
-                                                       if(mode=='G') {
-                                                               tv->loc[0]= tv->oldloc[0]+tv->fac*dvecp[0];
-                                                               tv->loc[1]= tv->oldloc[1]+tv->fac*dvecp[1];
-                                                               tv->loc[2]= tv->oldloc[2]+tv->fac*dvecp[2];
-                                                       }
-                                                       else if(mode=='n' && tv->nor) {
-                                                               //float dot; /* dot product dvec with normal */
-                                                               
-                                                               //dot= tv->nor[0]*dvecp[0] + tv->nor[1]*dvecp[1] + tv->nor[2]*dvecp[2];
-                                                               tv->loc[0]= tv->oldloc[0]+dot*tv->nor[0];
-                                                               tv->loc[1]= tv->oldloc[1]+dot*tv->nor[1];
-                                                               tv->loc[2]= tv->oldloc[2]+dot*tv->nor[2];
-                                                       }
-                                                       else VecAddf(tv->loc, tv->oldloc, dvecp);
-                                               }
-
-                                       }
-
-                                       if(mode=='n' && tv->nor) {
-                                               if (typemode)
-                                                       sprintf(str, "D: >%.4f< Along faces normal", dvec[0]);
-                                               else
-                                                       sprintf(str, "D: %.4f Along faces normal", dvec[0]);
-                                       }
-                                       else {
-                                               if (typemode){
-                                                       switch (ax){
-                                                       case 0:
-                                                               sprintf(str, "%sDx: >%.4f<   Dy: %.4f  Dz: %.4f", gmode, dvec[0], dvec[1], dvec[2]);
-                                                               break;
-                                                       case 1:
-                                                               sprintf(str, "%sDx: %.4f   Dy: >%.4f<  Dz: %.4f", gmode, dvec[0], dvec[1], dvec[2]);
-                                                               break;
-                                                       case 2:
-                                                               sprintf(str, "%sDx: %.4f   Dy: %.4f  Dz: >%.4f<", gmode, dvec[0], dvec[1], dvec[2]);
-                                                       }
-                                               }
-                                               else
-                                                       sprintf(str, "%sDx: %.4f   Dy: %.4f  Dz: %.4f", gmode, dvec[0], dvec[1], dvec[2]);
-                                       }
-                                       headerprint(str);
-
-                                       time= my_clock();
-
-                                       if(G.obedit) calc_trans_verts();
-                                       special_trans_update(keyflags);
-
-                                       if (cameragrab && midtog)
-                                               set_constline_callback(mode, ZTRANSLOCAL, midtog, centre, imat, vx, vy, vz);
-                                       else
-                                               set_constline_callback(mode, axismode, midtog, centre, imat, vx, vy, vz);
-
-                                       if(fast==0) {
-                                               force_draw();
-                                               time= my_clock()-time;
-                                               if(time>50) fast= 1;
-                                       }
-                                       else {
-                                               scrarea_do_windraw(curarea);
-                                               screen_swapbuffers();
-                                       }
-                               }
-                       }
-                       else if(mode=='r' || mode=='t' || mode=='R') {
-                               int turntable = 0;
-                               doit= 0;
-                               keyflags |= KEYFLAG_ROT;
-                               dx2= xc-mval[0];
-                               dy2= yc-mval[1];
-
-                               if(midtog && (mode=='r' || mode=='R')) {
-                                       turntable = 1;
-                                       phi0+= .007*(float)(dy2-dy1);
-                                       phi1+= .007*(float)(dx1-dx2);
-
-                                       apply_keyb_grid(&phi0, 0.0, (5.0/180)*M_PI, (1.0/180)*M_PI, gridflag & USER_AUTOROTGRID);
-                                       apply_keyb_grid(&phi1, 0.0, (5.0/180)*M_PI, (1.0/180)*M_PI, gridflag & USER_AUTOROTGRID);
-
-                                       if(typemode){
-                                               VecRotToMat3(rot0, addvec[1]*M_PI/180.0, smat);
-                                               VecRotToMat3(rot1, addvec[2]*M_PI/180.0, totmat);
-
-                                               Mat3MulMat3(mat, smat, totmat);
-                                               doit= 1;
-                                       }
-                                       else if(oldval[0]!=phi0 || oldval[1]!=phi1){
-                                               VecRotToMat3(rot0, phi0, smat);
-                                               VecRotToMat3(rot1, phi1, totmat);
-
-                                               Mat3MulMat3(mat, smat, totmat);
-                                               dx1= dx2;
-                                               dy1= dy2;
-                                               oldval[0]= phi0;
-                                               oldval[1]= phi1;
-                                               doit= 1;
-                                       }
-                               }
-                               else {
-                                       deler= sqrt( (dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2));
-                                       if(deler>1.0) {
-
-                                               dphi= (dx1*dx2+dy1*dy2)/deler;
-                                               dphi= saacos(dphi);
-                                               if( (dx1*dy2-dx2*dy1)>0.0 ) dphi= -dphi;
-
-                                               if(G.qual & LR_SHIFTKEY) phi+= dphi/30.0;
-                                               else phi+= dphi;
-
-                                               apply_keyb_grid(&phi, 0.0, (5.0/180)*M_PI, (1.0/180)*M_PI, gridflag & USER_AUTOROTGRID);
-
-                                               if(axismode) {
-                                                       if(axismode==XTRANS) vec[0]= -1.0; else vec[0]= 0.0;
-                                                       if(axismode==YTRANS) vec[1]= 1.0; else vec[1]= 0.0;
-                                                       if(axismode==ZTRANS) vec[2]= -1.0; else vec[2]= 0.0;
-                                                       if (G.obedit){
-                                                               if (axismode == XTRANSLOCAL) VECCOPY(vec, G.obedit->obmat[0]);
-                                                               if (axismode == YTRANSLOCAL) VECCOPY(vec, G.obedit->obmat[1]);
-                                                               if (axismode == ZTRANSLOCAL) VECCOPY(vec, G.obedit->obmat[2]);
-                                                               if (axismode & TRANSLOCAL) VecMulf(vec, -1.0);
-                                                       }
-                                               }
-
-                                               if(typemode){
-                                                       doit= 1;
-                                                       if(axismode) {
-                                                               VecRotToMat3(vec, addvec[0]*M_PI/180.0, mat);
-                                                       }
-                                                       else VecRotToMat3(rot2, addvec[0]*M_PI/180.0, mat);
-                                               }
-                                               else if(oldval[2]!=phi) {
-                                                       dx1= dx2;
-                                                       dy1= dy2;
-                                                       oldval[2]= phi;
-                                                       doit= 1;
-                                                       if(axismode) {
-                                                               VecRotToMat3(vec, phi, mat);
-                                                       }
-                                                       else VecRotToMat3(rot2, phi, mat);
-                                               }
-                                       }
-
-                               }
-                               
-                               if(doit) {
-                                       /* apply */
-                                       tob= transmain;
-                                       tv= transvmain;
-
-                                       for(a=0; a<tottrans; a++, tob++, tv++) {
-                                               if(transmain) {
-                                                       /* rotation in three steps:
-                                                        * 1. editrot correction for parent
-                                                        * 2. distill from this the euler. Always do this step because MatToEul is pretty weak
-                                                        * 3. multiply with its own rotation, calculate euler.
-                                                        */
-
-                                                       if ((G.vd->flag & V3D_ALIGN)==0) {
-
-                                                       /* Roll around local axis */
-                                                       if (mode=='r' || mode=='R'){
-
-                                                               if (tob && axismode && (turntable == 0)){
-                                                                       if (axismode == XTRANSLOCAL){
-                                                                               VECCOPY(vec, tob->axismat[0]);
-                                                                       }
-                                                                       if (axismode == YTRANSLOCAL){
-                                                                               VECCOPY(vec, tob->axismat[1]);
-                                                                       }
-                                                                       if (axismode == ZTRANSLOCAL){
-                                                                               VECCOPY(vec, tob->axismat[2]);
-                                                                       }
-                                                                       /* Correct the vector */
-                                                                       if ((axismode & TRANSLOCAL) && ((G.vd->viewmat[0][2] * vec[0]+G.vd->viewmat[1][2] * vec[1]+G.vd->viewmat[2][2] * vec[2])>0)){
-                                                                               vec[0]*=-1;
-                                                                               vec[1]*=-1;
-                                                                               vec[2]*=-1;
-                                                                       }
-
-                                                                       if (typemode)
-                                                                               VecRotToMat3(vec, addvec[0] * M_PI / 180.0, mat);
-                                                                       else
-                                                                               VecRotToMat3(vec, phi, mat);
-
-                                                               }
-                                                       }
-                                                       Mat3MulSerie(smat, tob->parmat, mat, tob->parinv, 0, 0, 0, 0, 0);
-
-                                                       /* 2 */
-                                                       if( (tob->ob->transflag & OB_QUAT) == 0 && tob->rot){
-                                                               Mat3ToEul(smat, eul);
-                                                               EulToMat3(eul, smat);
-                                                       }
-
-                                                       /* 3 */
-                                                       /* we now work with rot+drot */
-
-                                                       if(tob->ob->transflag & OB_QUAT || !tob->rot) {
-
-                                                               /* drot+rot TO DO! */
-                                                               Mat3ToQuat(smat, quat); // Original
-                                                               QuatMul(tob->quat, quat, tob->oldquat);
-
-                                                               if(tob->flag & TOB_IPO) {
-
-                                                                       if(tob->flag & TOB_IPODROT) {
-                                                                               /* VecSubf(rot, eul, tob->oldrot); */
-                                                                       }
-                                                                       else {
-                                                                               /* VecSubf(rot, eul, tob->olddrot); */
-                                                                       }
-
-                                                                       /* VecMulf(rot, 9.0/M_PI_2); */
-                                                                       /* VecSubf(rot, rot, tob->oldrot+3); */
-
-                                                                       /* add_ipo_tob_poin(tob->rotx, tob->oldrot+3, rot[0]); */
-                                                                       /* add_ipo_tob_poin(tob->roty, tob->oldrot+4, rot[1]); */
-                                                                       /* add_ipo_tob_poin(tob->rotz, tob->oldrot+5, rot[2]); */
-
-                                                               }
-                                                               else {
-                                                                       /* QuatSub(tob->quat, quat, tob->oldquat); */
-                                                               }
-                                                       }
-                                                       else {
-                                                               VecAddf(eul, tob->oldrot, tob->olddrot);
-                                                               EulToMat3(eul, tmat);
-
-                                                               Mat3MulMat3(totmat, smat, tmat);
-
-                                                               Mat3ToEul(totmat, eul);
-
-                                                               /* Eul is not allowed to differ too much from old eul.
-                                                                * This has only been tested for dx && dz
-                                                                */
-
-                                                               compatible_eul(eul, tob->oldrot);
-
-                                                               if(tob->flag & TOB_IPO) {
-
-                                                                       if(tob->flag & TOB_IPODROT) {
-                                                                               VecSubf(rot, eul, tob->oldrot);
-                                                                       }
-                                                                       else {
-                                                                               VecSubf(rot, eul, tob->olddrot);
-                                                                       }
-
-                                                                       VecMulf(rot, 9.0/M_PI_2);
-                                                                       VecSubf(rot, rot, tob->oldrot+3);
-
-
-                                                                       add_ipo_tob_poin(tob->rotx, tob->oldrot+3, rot[0]);
-                                                                       add_ipo_tob_poin(tob->roty, tob->oldrot+4, rot[1]);
-                                                                       add_ipo_tob_poin(tob->rotz, tob->oldrot+5, rot[2]);
-
-                                                               }
-                                                               else {
-                                                                       VecSubf(tob->rot, eul, tob->olddrot);
-                                                               }
-
-                                                               /* See if we've moved */
-                                                               if (!VecCompare (tob->loc, tob->oldloc, 0.01)){
-                                                                       keyflags |= KEYFLAG_LOC;
-                                                               }
-
-                                                       }
-                                               }
-
-                                                       if(G.vd->around!=V3D_LOCAL && (!G.obpose))  {
-                                                               float vec[3];   // make local, the other vec stores rot axis
-
-                                                               /* translation */
-                                                               VecSubf(vec, tob->obvec, centre);
-                                                               Mat3MulVecfl(mat, vec);
-                                                               VecAddf(vec, vec, centre);
-                                                               /* vec now is the location where the object has to be */
-                                                               VecSubf(vec, vec, tob->obvec);
-                                                               Mat3MulVecfl(tob->parinv, vec);
-
-                                                               if(tob->flag & TOB_IPO) {
-                                                                       add_ipo_tob_poin(tob->locx, tob->oldloc, vec[0]);
-                                                                       add_ipo_tob_poin(tob->locy, tob->oldloc+1, vec[1]);
-                                                                       add_ipo_tob_poin(tob->locz, tob->oldloc+2, vec[2]);
-                                                               }
-                                                               else if(tob->loc) {
-                                                                       VecAddf(tob->loc, tob->oldloc, vec);
-                                                               }
-                                                       }
-                                               }
-                                               else {
-                                                       if(mode=='t') {
-                                                               if(tv->val) *(tv->val)= tv->oldval-phi;
-                                                       }
-                                                       else {
-
-                                                               if(mode=='R') {
-
-                                                                       if(midtog) {
-                                                                               if (typemode){
-                                                                                       VecRotToMat3(rot0, tv->fac*addvec[1] * M_PI / 180.0, smat);
-                                                                                       VecRotToMat3(rot1, tv->fac*addvec[2] * M_PI / 180.0, totmat);
-                                                                               }
-                                                                               else{
-                                                                                       VecRotToMat3(rot0, tv->fac*phi0, smat);
-                                                                                       VecRotToMat3(rot1, tv->fac*phi1, totmat);
-                                                                               }
-
-                                                                               Mat3MulMat3(mat, smat, totmat);
-                                                                       }
-                                                                       else {
-                                                                               if (typemode)
-                                                                                       VecRotToMat3(rot2, tv->fac*addvec[0] * M_PI / 180.0, mat);
-                                                                               else
-                                                                                       VecRotToMat3(rot2, tv->fac*phi, mat);
-                                                                       }
-
-                                                               }
-
-                                                               Mat3MulMat3(totmat, mat, omat);
-                                                               Mat3MulMat3(smat, imat, totmat);
-
-                                                               VecSubf(vec, tv->oldloc, centre);
-                                                               Mat3MulVecfl(smat, vec);
-
-                                                               VecAddf(tv->loc, vec, centre);
-                                                       }
-                                               }
-                                       }
-
-
-                                       if(midtog){
-                                               if (typemode){
-                                                       if (ax == 1)
-                                                               sprintf(str, "Rotx: >%.2f<  Roty: %.2f", addvec[1], addvec[2]);
-                                                       if (ax == 2)
-                                                               sprintf(str, "Rotx: %.2f  Roty: >%.2f<", addvec[1], addvec[2]);
-                                               }
-                                               else
-                                                       sprintf(str, "Rotx: %.2f  Roty: %.2f", 180.0*phi0/M_PI, 180.0*phi1/M_PI);
-                                       }
-                                       else if(axismode) {
-                                               if (typemode){
-                                                       if(axismode==XTRANS) sprintf(str, "Rot X: >%.2f<", addvec[0]);
-                                                       else if(axismode==YTRANS) sprintf(str, "Rot Y: >%.2f<", addvec[0]);
-                                                       else if(axismode==ZTRANS) sprintf(str, "Rot Z: >%.2f<", addvec[0]);
-                                                       else if(axismode==XTRANSLOCAL) sprintf(str, "Local Rot X: >%.2f<", addvec[0]);
-                                                       else if(axismode==YTRANSLOCAL) sprintf(str, "Local Rot Y: >%.2f<", addvec[0]);
-                                                       else if(axismode==ZTRANSLOCAL) sprintf(str, "Local Rot Z: >%.2f<", addvec[0]);
-                                               }
-                                               else{
-                                                       if(axismode==XTRANS) sprintf(str, "Rot X: %.2f", 180.0*phi/M_PI);
-                                                       else if(axismode==YTRANS) sprintf(str, "Rot Y: %.2f", 180.0*phi/M_PI);
-                                                       else if(axismode==ZTRANS) sprintf(str, "Rot Z: %.2f", 180.0*phi/M_PI);
-                                                       else if(axismode==XTRANSLOCAL) sprintf(str, "Local Rot X: %.2f", 180.0*phi/M_PI);
-                                                       else if(axismode==YTRANSLOCAL) sprintf(str, "Local Rot Y: %.2f", 180.0*phi/M_PI);
-                                                       else if(axismode==ZTRANSLOCAL) sprintf(str, "Local Rot Z: %.2f", 180.0*phi/M_PI);
-                                               }
-                                       }
-                                       else{
-                                               if (typemode)
-                                                       sprintf(str, "Rot: >%.2f<", addvec[0]);
-                                               else
-                                                       sprintf(str, "Rot: %.2f", 180.0*phi/M_PI);
-                                       }
-                                       headerprint(str);
-
-                                       time= my_clock();
-
-                                       if(G.obedit) calc_trans_verts();
-                                       special_trans_update(keyflags);
-
-                                       set_constline_callback(mode, axismode, midtog, centre, imat, vx, vy, vz);
-
-                                       if(fast==0) {
-                                               force_draw();
-                                               time= my_clock()-time;
-                                               if(time>50) fast= 1;
-                                       }
-                                       else {
-                                               scrarea_do_windraw(curarea);
-                                               screen_swapbuffers();
-                                       }
-                                       if(tottrans>1 || G.vd->around==V3D_CURSOR) helpline(centre);
-                                       else if (G.obpose) helpline (centre);
-                               }
-                       }
-                       else if(mode=='s' || mode=='S' || mode=='C' || mode=='N') {
-                               keyflags |= KEYFLAG_SIZE;
-
-                               if(mode=='S') {
-                                       size[0]= 1.0-(float)(xn-mval[0])*0.005;
-                                       size[1]= 1.0-(float)(yn-mval[1])*0.005;
-                                       size[2]= 1.0;
-                               }
-                               else size[0]=size[1]=size[2]= (sqrt( (float)((yc-mval[1])*(yc-mval[1])+(mval[0]-xc)*(mval[0]-xc)) ))/sizefac;
-
-                               if (typemode){
-                                       if (numchange[0]) size[0] = addvec[0]; else size[0] = 1;
-                                       if (numchange[1]) size[1] = addvec[1]; else size[1] = 1;
-                                       if (numchange[2]) size[2] = addvec[2]; else size[2] = 1;
-                               }
-
-                               if(axismode && mode=='s') {
-                                       /* shear has no axismode */
-                                       if (!(G.obedit)){
-                                               if(axismode==XTRANS) axismode = XTRANSLOCAL;
-                                               if(axismode==YTRANS) axismode = YTRANSLOCAL;
-                                               if(axismode==ZTRANS) axismode = ZTRANSLOCAL;
-                                       }
-                                       if(axismode==XTRANS) size[1]=size[2]= 1.0;
-                                       if(axismode==YTRANS) size[0]=size[2]= 1.0;
-                                       if(axismode==ZTRANS) size[1]=size[0]= 1.0;
-                                       if(axismode==XTRANSLOCAL) size[1]=size[2]= 1.0;
-                                       if(axismode==YTRANSLOCAL) size[0]=size[2]= 1.0;
-                                       if(axismode==ZTRANSLOCAL) size[1]=size[0]= 1.0;
-                               }
-
-/* X en Y flip, there are 2 methods: at  |**| removing comments makes flips local
-
-                               if(transvmain) {
-
-                                               // x flip
-                                       val= test_midtog_proj(mval[0]+10, mval[1], mval);
-                                       size[val]*= xref;
-                                               // y flip
-                                       val= test_midtog_proj(mval[0], mval[1]+10, mval);
-                                       size[val]*= yref;
-
-                               } */
-
-
-                               /* grid */
-                               apply_keyb_grid(size, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-                               apply_keyb_grid(size+1, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-                               apply_keyb_grid(size+2, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-
-                               if(transmain) {
-                                       size[0]= MINSIZE(size[0], 0.001);
-                                       size[1]= MINSIZE(size[1], 0.001);
-                                       size[2]= MINSIZE(size[2], 0.001);
-                               }
-
-                               if(size[0]!=oldval[0] ||size[1]!=oldval[1] ||size[2]!=oldval[2]) {
-                                       VECCOPY(oldval, size);
-
-                                       SizeToMat3(size, mat);
-
-                                       /* apply */
-                                       tob= transmain;
-                                       tv= transvmain;
-
-                                       for(a=0; a<tottrans; a++, tob++, tv++) {
-                                               if(transmain) {
-                                                       /* size local with respect to parent AND own rotation */
-                                                       /* local wrt parent: */
-
-                                                       if ((G.vd->flag & V3D_ALIGN)==0) {
-
-                                                       Mat3MulSerie(smat, tob->parmat, mat, tob->parinv, 0, 0,0 ,0, 0);
-
-                                                       /* local wrt own rotation: */
-                                                       Mat3MulSerie(totmat, tob->obmat, smat, tob->obinv, 0, 0, 0,0 ,0);
-
-                                                       /* XXX this can yield garbage in case of inverted sizes (< 0.0)
-                                                                                                       */
-                                                       if(!midtog) {
-                                                               sizelo[0]= size[0];
-                                                               sizelo[1]= size[1];
-                                                               sizelo[2]= size[2];
-                                                       } else {
-                                                       /* in this case the previous calculation of the size is wrong */
-                                                               sizelo[0]= totmat[0][0];
-                                                               sizelo[1]= totmat[1][1];
-                                                               sizelo[2]= totmat[2][2];
-                                                               apply_keyb_grid(sizelo, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-                                                               apply_keyb_grid(sizelo+1, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-                                                               apply_keyb_grid(sizelo+2, 0.0, 0.1, 0.01, gridflag & USER_AUTOSIZEGRID);
-                                                       }
-
-                                                               /* x flip */
-    /**/                                               /* sizelo[0]*= xref; */
-                                                               /* y flip */
-    /**/                                               /* sizelo[1]*= yref; */
-                                                               /* z flip */
-    /**/                                               /* sizelo[2]*= zref; */
-
-
-                                                       /* what you see is what you want; not what you get! */
-                                                       /* correction for delta size */
-                                                       if(tob->flag & TOB_IPO) {
-                                                               /* calculate delta size (equal for size and dsize) */
-
-                                                               vec[0]= (tob->oldsize[0]+tob->olddsize[0])*(sizelo[0] -1.0);
-                                                               vec[1]= (tob->oldsize[1]+tob->olddsize[1])*(sizelo[1] -1.0);
-                                                               vec[2]= (tob->oldsize[2]+tob->olddsize[2])*(sizelo[2] -1.0);
-
-                                                               add_ipo_tob_poin(tob->sizex, tob->oldsize+3, vec[0]);
-                                                               add_ipo_tob_poin(tob->sizey, tob->oldsize+4, vec[1]);
-                                                               add_ipo_tob_poin(tob->sizez, tob->oldsize+5, vec[2]);
-
-                                                       }
-                                                       else {
-                                                               tob->size[0]= (tob->oldsize[0]+tob->olddsize[0])*sizelo[0] -tob->olddsize[0];
-                                                               tob->size[1]= (tob->oldsize[1]+tob->olddsize[1])*sizelo[1] -tob->olddsize[1];
-                                                               tob->size[2]= (tob->oldsize[2]+tob->olddsize[2])*sizelo[2] -tob->olddsize[2];
-                                                       }
-                                                       } else {
-                                                               sizelo[0]= size[0];
-                                                               sizelo[1]= size[1];
-                                                               sizelo[2]= size[2];
-                                                       }
-
-                                                       if(G.vd->around!=V3D_LOCAL && !G.obpose) {
-                                                               /* translation */
-                                                               VecSubf(vec, tob->obvec, centre);
-                                                               Mat3MulVecfl(mat, vec);
-                                                               VecAddf(vec, vec, centre);
-                                                               /* vec is the location where the object has to be */
-                                                               VecSubf(vec, vec, tob->obvec);
-                                                               Mat3MulVecfl(tob->parinv, vec);
-
-                                                               if(tob->flag & TOB_IPO) {
-                                                                       add_ipo_tob_poin(tob->locx, tob->oldloc, vec[0]);
-                                                                       add_ipo_tob_poin(tob->locy, tob->oldloc+1, vec[1]);
-                                                                       add_ipo_tob_poin(tob->locz, tob->oldloc+2, vec[2]);
-                                                               }
-                                                               else if(tob->loc) {
-                                                                       if(transmode==TRANS_TEX) ;
-                                                                       else  VecAddf(tob->loc, tob->oldloc, vec);
-                                                               }
-                                                       }
-                                               }
-                                               else {  /* vertices */
-
-                                                       /* for print */
-                                                       VECCOPY(sizelo, size);
-
-                                                       if(mode=='C') {
-                                                               size[0]= tv->fac*size[0]+ 1.0-tv->fac;;
-                                                               size[1]= tv->fac*size[1]+ 1.0-tv->fac;;
-                                                               size[2]= tv->fac*size[2]+ 1.0-tv->fac;;
-                                                               SizeToMat3(size, mat);
-                                                               VECCOPY(size, oldval);
-                                                       }
-
-                                                       if(mode=='S') { /* shear */
-                                                               Mat3One(tmat);
-                                                               tmat[0][0]= tmat[2][2]= tmat[1][1]= 1.0;
-                                                               tmat[1][0]= size[0]-1.0;
-
-                                                               Mat3MulMat3(totmat, persmat, omat);
-                                                               Mat3MulMat3(mat, tmat, totmat);
-                                                               Mat3MulMat3(totmat, persinv, mat);
-                                                               Mat3MulMat3(smat, imat, totmat);
-                                                       }
-                                                       else {
-                                                               if (axismode & TRANSLOCAL)
-                                                                       Mat3CpyMat3(smat, mat);
-                                                               else {
-                                                                       Mat3MulMat3(totmat, imat, mat);
-                                                                       Mat3MulMat3(smat, totmat, omat);
-                                                               }
-                                                       }
-
-                                                       if(mode=='N' && tv->nor!=NULL) {
-                                                               tv->loc[0]= tv->oldloc[0] + (size[0]-1.0)*tv->nor[0];
-                                                               tv->loc[1]= tv->oldloc[1] + (size[1]-1.0)*tv->nor[1];
-                                                               tv->loc[2]= tv->oldloc[2] + (size[2]-1.0)*tv->nor[2];
-                                                       }
-                                                       else {
-                                                               VecSubf(vec, tv->oldloc, centre);
-                                                               Mat3MulVecfl(smat, vec);
-                                                               VecAddf(tv->loc, vec, centre);
-
-                                                               if(G.obedit->type==OB_MBALL) *(tv->val)= size[0]*tv->oldval;
-                                                       }
-                                               }
-                                       }
-                                       if(mode=='s') {
-                                               if (typemode){
-                                                       switch (ax){
-                                                       case 0:
-                                                               sprintf(str, "Sizex: >%.3f<   Sizey: >%.3f<  Sizez: >%.3f<", sizelo[0], sizelo[1], sizelo[2]);
-                                                               break;
-                                                       case 1:
-                                                               sprintf(str, "Sizex: >%.3f<   Sizey: %.3f  Sizez: %.3f", sizelo[0], sizelo[1], sizelo[2]);
-                                                               break;
-                                                       case 2:
-                                                               sprintf(str, "Sizex: %.3f   Sizey: >%.3f<  Sizez: %.3f", sizelo[0], sizelo[1], sizelo[2]);
-                                                               break;
-                                                       case 3:
-                                                               sprintf(str, "Sizex: %.3f   Sizey: %.3f  Sizez: >%.3f<", sizelo[0], sizelo[1], sizelo[2]);
-                                                       }
-                                               }
-                                               else
-                                                       sprintf(str, "Sizex: %.3f   Sizey: %.3f  Sizez: %.3f", sizelo[0], sizelo[1], sizelo[2]);
-                                       }
-                                       else if (mode=='S') {
-                                               if (typemode)
-                                                       sprintf(str, "Shear: >%.3f<", sizelo[0]);
-                                               else
-                                                       sprintf(str, "Shear: %.3f", sizelo[0]);
-                                       }
-                                       else if (mode=='C') {
-                                               if (typemode)
-                                                       sprintf(str, "Size: >%.3f<", sizelo[0]);
-                                               else
-                                                       sprintf(str, "Size: %.3f", sizelo[0]);
-                                       }
-                                       else if (mode=='N') {
-                                               if (typemode)
-                                                       sprintf(str, "Shrink/Fatten: >%.3f< ", size[0]);
-                                               else
-                                                       sprintf(str, "Shrink/Fatten: %.3f", size[0]);
-                                       }
-
-                                       headerprint(str);
-
-                                       time= my_clock();
-
-                                       if(G.obedit) calc_trans_verts();
-                                       special_trans_update(keyflags);
-
-                                       set_constline_callback(mode, axismode, midtog, centre, imat, vx, vy, vz);
-
-                                       if(fast==0) {
-                                               force_draw();
-                                               time= my_clock()-time;
-                                               if(time>50) fast= 1;
-                                       }
-                                       else {
-                                               scrarea_do_windraw(curarea);
-                                               screen_swapbuffers();
-                                       }
-                                       if(tottrans>1 || G.vd->around==V3D_CURSOR) helpline(centre);
-                               }
-                       }
-                       else if(mode=='w') {
-                               float Dist1;
-
-                               window_to_3d(dvec, 1, 1);
-
-                               circumfac= startcircumfac+ 0.05*( mval[1] - yn)*Normalise(dvec);
-
-                               /* calc angle for print */
-                               dist= max[0]-centre[0];
-                               Dist1 = dist;
-                               phi0= 360*circumfac*dist/(rad*M_PI);
-
-                               if ((typemode) && (addvec[0])){
-                                       phi0 = addvec[0];
-                               }
-
-                               if((G.qual & LR_CTRLKEY) && (typemode == 0)){
-                                       phi0= 5.0*floor(phi0/5.0);
-                                       circumfac= (phi0*rad*M_PI)/(360.0*dist);
-                               }
-
-                               if (typemode && addvec[0])
-                                       sprintf(str, "Warp >%3.3f<", addvec[0]);
-                               else
-                                       sprintf(str, "Warp %3.3f", phi0);
-                               headerprint(str);
-
-                               /* each vertex transform individually */
-                               tob= transmain;
-                               tv= transvmain;
-
-                               for(a=0; a<tottrans; a++, tob++, tv++) {
-                                       if(transvmain) {
-
-                                               /* translate point to centre, rotate in such a way that outline==distance */
-
-                                               VECCOPY(vec, tv->oldloc);
-                                               Mat4MulVecfl(G.obedit->obmat, vec);
-                                               Mat4MulVecfl(G.vd->viewmat, vec);
-
-                                               dist= vec[0]-centre[0];
-
-                                               if ((typemode) && (addvec[0]))
-                                                       phi0= (Dist1*addvec[0]*M_PI/(360.0*dist)) - 0.5*M_PI;
-                                               else
-                                                       phi0= (circumfac*dist/rad) - 0.5*M_PI;
-
-                                               co= cos(phi0);
-                                               si= sin(phi0);
-
-                                               vec[0]= (centre[0]-axis[0]);
-                                               vec[1]= (vec[1]-axis[1]);
-
-                                               tv->loc[0]= si*vec[0]+co*vec[1]+axis[0];
-
-                                               tv->loc[1]= co*vec[0]-si*vec[1]+axis[1];
-                                               tv->loc[2]= vec[2];
-
-                                               Mat4MulVecfl(viewinv, tv->loc);
-                                               Mat4MulVecfl(imat4, tv->loc);
-
-                                       }
-                               }
-
-                               if(G.obedit) calc_trans_verts();
-                               special_trans_update(keyflags);
-
-                               if(fast==0) {
-                                       time= my_clock();
-                                       force_draw();
-                                       time= my_clock()-time;
-                                       if(time>50) fast= 1;
-                               }
-                               else {
-                                       scrarea_do_windraw(curarea);
-                                       screen_swapbuffers();
-                               }
-                       }
-                       else if(mode=='e') {
-                               /* edge sharpening */
-                               /* only  works in edit mode */
-                               if (G.obedit && G.editMesh) {
-                                       EditMesh *em = G.editMesh;
-                                       EditEdge *ee;
-                                       Mesh *me= G.obedit->data;
-                                       float mincr=10.0, maxcr= 0.0;
-                                       int tot= 0;
-                                       
-                                       /* for esc and calculus */
-                                       if(edge_creases==NULL) {
-                                               
-                                               for(ee = em->edges.first; ee; ee= ee->next, tot++);
-                                               edge_creases= MEM_mallocN(sizeof(float)*tot, "transform creases");
-                                               
-                                               for(tot= 0, ee = em->edges.first; ee; ee= ee->next, tot++)
-                                                       edge_creases[tot]= ee->crease;
-                                       }
-                                       
-                                       /* this is sufficient to invoke edges added in mesh, but only in editmode */
-                                       if(me->medge==NULL) {
-                                               me->medge= MEM_callocN(sizeof(MEdge), "fake medge");
-                                               me->totedge= 1;
-                                               allqueue(REDRAWBUTSEDIT, 0);
-                                       }
-                                       
-                                       /* we use input method like scaling, but map effictive range to:
-                                          scale 1.0-0.5 : crease no change to full sharp
-                                          scale 1.0-2.0 : crease no change to full round */
-                                       dist= (sqrt( (float)((yc-mval[1])*(yc-mval[1])+(mval[0]-xc)*(mval[0]-xc)) ))/sizefac;
-                                       CLAMP(dist, 0.5, 2.0);
-                                       if(dist<1.0) dist= 2.0*(dist-0.5);
-                                       
-                                       for(tot= 0, ee = em->edges.first; ee; ee= ee->next, tot++) {
-                                               if ((ee->v1->f & 1) && (ee->v2->f & 1)) {
-                                                       /* this edge is selected */
-                                                       if(dist<1.0) 
-                                                               ee->crease = (1.0 - dist) + dist*edge_creases[tot];
-                                                       else 
-                                                               ee->crease = (2.0-dist)*edge_creases[tot];
-                                                       
-                                                       CLAMP(ee->crease, 0.0, 1.0);
-                                                       if(mincr>ee->crease) mincr= ee->crease;
-                                                       if(maxcr<ee->crease) maxcr= ee->crease;
-                                               }
-                                       }
-
-                                       if(mincr==10.0) wrong= 1;
-                                       else {
-                                               if(mincr==maxcr) sprintf(str, "Edge sharpness: %.3f", mincr);
-                                               else sprintf(str, "Edge sharpness range: %.3f - %.3f", mincr, maxcr);
-                                               headerprint(str);
-
-                                               if(G.obedit) calc_trans_verts();
-                                               special_trans_update(keyflags);
-
-                                               if(fast==0) {
-                                                       time= my_clock();
-                                                       force_draw();
-                                                       time= my_clock()-time;
-                                                       if(time>50) fast= 1;
-                                               }
-                                               else {
-                                                       scrarea_do_windraw(curarea);
-                                                       screen_swapbuffers();
-                                               }
-                                       }
-                               }
-                               else {
-                                       wrong = 1;
-                               }
-                       }
-                       /* Help line drawing starts here */
-               }
-
-               while( qtest() ) {
-                       float add_num = 0; // numerical value to be added
-
-                       event= extern_qread(&val);
-
-                       if(val) {
-                               /* no-numpad option likes minus for numeric input better */
-                               if ((U.flag & USER_NONUMPAD) && typemode && event==PADMINUS) event = MINUSKEY;
-
-                               switch(event) {
-                               case ESCKEY:
-                               case LEFTMOUSE:
-                               case RIGHTMOUSE:
-                               case SPACEKEY:
-                               case PADENTER:
-                               case RETKEY:
-                                       breakloop= 1;
-                                       break;
-                               case MIDDLEMOUSE:
-                                       midtog= ~midtog;
-                                       if(midtog) {
-                                               int proj;
-
-                                               proj= test_midtog_proj(xn, yn, mval);
-                                               if (proj==0)
-                                                       axismode=XTRANS;
-                                               if (proj==1)
-                                                       axismode=YTRANS;
-                                               if (proj==2)
-                                                       axismode=ZTRANS;
-
-                                               phi0= phi1= 0.0;
-                                               if(cameragrab) {
-                                                       dvec[0]= dvec[1]= dvec[2]= 0.0;
-                                               }
-                                       }
-                                       else
-                                               axismode = 0;
-
-                                       if ((mode == 'r') || (mode == 'R')){
-                                               if (midtog){ax = 1;}
-                                               else{ax = 0;}
-                                       }
-                                       firsttime= 1;
-                                       break;
-                               case GKEY:
-                               case RKEY:
-                               case SKEY:
-                                       /* Resetting the variables */
-                                       addvec[0]=addvec[1]=addvec[2]=0;
-                                       ax = del = typemode = 0;
-                                       pe[0]=pe[1]=pe[2]=0;
-                                       mi[0]=mi[1]=mi[2]=1;
-                                       numchange[0]=numchange[1]=numchange[2]=0;
-
-                                       getmouseco_areawin(mval);
-                                       xn=xo= mval[0];
-                                       yn=xo= mval[1];
-                                       dx1= xc-xn;
-                                       dy1= yc-yn;
-                                       phi= phi0= phi1= 0.0;
-                                       sizefac= sqrt( (float)((yc-yn)*(yc-yn)+(xn-xc)*(xn-xc)) );
-                                       if(sizefac<2.0) sizefac= 2.0;
-
-                                       if (G.obedit && (G.f & G_PROPORTIONAL)) {
-                                               if(event==GKEY) mode= 'G';
-                                               else if(event==RKEY) mode= 'R';
-                                               else if(event==SKEY && G.qual == LR_ALTKEY) mode= 'N';
-                                               else if(event==SKEY && G.qual == LR_CTRLKEY) mode= 'S';
-                                               else if(event==SKEY) mode= 'C';
-                                       } else {
-                                               if(event==GKEY) mode= 'g';
-                                               else if(event==RKEY) mode= 'r';
-                                               else if(event==SKEY && G.qual==LR_ALTKEY && G.obedit) mode= 'N';
-                                               else if(event==SKEY && G.qual==LR_CTRLKEY && G.obedit) mode= 'S';
-                                               else if(event==SKEY) mode= 's';
-                                       }
-
-                                       firsttime= 1;
-
-                                       tob= transmain;
-                                       tv= transvmain;
-                                       for(a=0; a<tottrans; a++, tob++, tv++) {
-                                               if(transmain) {
-                                                       restore_tob(tob);
-                                               }
-                                               else {
-                                                       VECCOPY(tv->loc, tv->oldloc);
-                                               }
-                                       }
-                                       break;
-
-                               case XKEY:
-                                       if (axismode==XTRANS)
-                                               axismode=XTRANSLOCAL;
-                                       else if (axismode==XTRANSLOCAL)
-                                               axismode=0;
-                                       else{
-                                               axismode= XTRANS;
-                                       }
-                    if (mode == 'g') {
-                            if (axismode & XTRANS)
-                                    ax = 0;
-                    } else if (mode == 's') {
-                            if (axismode & XTRANS)
-                                    ax = 1;
-                    }
-                                       firsttime=1;
-                                       break;
-
-                               case YKEY:
-                                       if (axismode==YTRANS)
-                                               axismode=YTRANSLOCAL;
-                                       else if (axismode==YTRANSLOCAL)
-                                               axismode=0;
-                                       else{
-                                               axismode= YTRANS;
-                                       }
-                    if (mode == 'g') {
-                            if (axismode & YTRANS)
-                                    ax = 1;
-                    } else if (mode == 's') {
-                            if (axismode & YTRANS)
-                                    ax = 2;
-                    }
-                                       firsttime=1;
-                                       break;
-
-                               case ZKEY:
-                                       if (axismode==ZTRANS)
-                                               axismode=ZTRANSLOCAL;
-                                       else if (axismode==ZTRANSLOCAL)
-                                               axismode=0;
-                                       else{
-                                               axismode= ZTRANS;
-                                       }
-                    if (mode == 'g') {
-                            if (axismode & ZTRANS)
-                                    ax = 2;
-                    } else if (mode == 's') {
-                            if (axismode & ZTRANS)
-                                    ax = 3;
-                    }
-                                       firsttime=1;
-                                       break;
-                               case WHEELDOWNMOUSE:
-                               case PADPLUSKEY:
-                                       if(G.f & G_PROPORTIONAL) {
-                                               prop_size*= 1.1;
-                                               firsttime= 1;
-                                       }
-                                       else {
-                                               if(event == WHEELDOWNMOUSE)
-                                                       view_editmove(event);
-                                               else
-                                                       persptoetsen(PADPLUSKEY);
-                                         firsttime= 1;
-                                       }
-                                       break;
-
-                               case WHEELUPMOUSE:
-                               case PADMINUS:
-                                       if(G.f & G_PROPORTIONAL) {
-                                               prop_size*= 0.90909090;
-                                               firsttime= 1;
-                                       }
-                                       else {
-                                               if(event == WHEELUPMOUSE)
-                                                       view_editmove(event);
-                                               else
-                                                 persptoetsen(PADMINUS);
-                                         firsttime= 1;
-                                       }
-                                       break;
-
-                               case LEFTSHIFTKEY:
-                               case RIGHTSHIFTKEY:
-                                       VECCOPY(d_dvec, dvec);
-                               case LEFTCTRLKEY:
-                               case RIGHTCTRLKEY:
-                                       firsttime= 1;
-                                       break;
-                               case NKEY:
-                                       {
-                                               // toggle between typemode = 0 and typemode = 1
-                                               typemode *= -1;
-                                               typemode += 1;
-                                               firsttime = 1;
-                                       }
-                                       break;
-                               case BACKSPACEKEY:
-                                       {
-                                               if (typemode){
-                                                       if (((mode == 's') && (ax == 0)) || (mode == 'N')){
-                                                               addvec[0]=addvec[1]=addvec[2]=0;
-                                                               pe[0]=pe[1]=pe[2]=0;
-                                                               mi[0]=mi[1]=mi[2]=1;
-                                                               numchange[0]=numchange[1]=numchange[2]=0;
-                                                       }
-                                                       else if (del == 1){
-                                                               addvec[0]=addvec[1]=addvec[2]=0;
-                                                               pe[0]=pe[1]=pe[2]=0;
-                                                               mi[0]=mi[1]=mi[2]=1;
-                                                               numchange[0]=numchange[1]=numchange[2]=0;
-                                                               del = 0;
-                                                       }
-                                                       else if (mode == 's'){
-                                                               addvec[ax-1]=0;
-                                                               pe[ax-1]=0;
-                                                               mi[ax-1]=1;
-                                                               numchange[ax-1]=0;
-                                                               del = 1;
-                                                       }
-                                                       else if ((mode == 'r') || (mode == 'R')){
-                                                               phi -= M_PI * addvec[ax] / 180;
-                                                               addvec[ax] = 0;
-                                                               pe[ax]=0;
-                                                               mi[ax]=1;
-                                                               numchange[ax]=0;
-                                                               del = 1;
-                                                       }
-                                                       else{
-                                                               addvec[ax] = 0;
-                                                               pe[ax]=0;
-                                                               mi[ax]=1;
-                                                               numchange[ax]=0;
-                                                               del = 1;
-                                                       }
-                                               }
-                                               else{
-                                                       getmouseco_areawin(mval);
-                                                       xn=xo= mval[0];
-                                                       yn=xo= mval[1];
-                                                       dx1= xc-xn;
-                                                       dy1= yc-yn;
-                                                       phi= phi0= phi1= 0.0;
-                                                       sizefac= sqrt( (float)((yc-yn)*(yc-yn)+(xn-xc)*(xn-xc)) );
-                                                       if(sizefac<2.0) sizefac= 2.0;
-                                               }
-                                               firsttime = 1;
-                                               break;
-                                       }
-                               case PERIODKEY:
-                               case PADPERIOD:
-                                       {
-                                               typemode = 1;
-                                               del = 0;
-                                               if (((mode == 's') && (ax == 0)) || (mode == 'N')){
-                                                       if (pe[0] == 0){pe[0] = 1;}
-                                                       if (pe[1] == 0){pe[1] = 1;}
-                                                       if (pe[2] == 0){pe[2] = 1;}
-                                               }
-                                               else if (mode == 's'){
-                                                       if (pe[ax-1] == 0){pe[ax-1] = 1;}
-                                               }
-                                               else{
-                                                       if (pe[ax] == 0){pe[ax] = 1;}
-                                               }
-                                               break;
-                                       }
-                               case MINUSKEY:
-                                       {
-                                               del = 0;
-                                               if (((mode == 's') && (ax==0)) || (mode == 'N')){
-                                                       addvec[0]*=-1;
-                                                       mi[0] *= -1;
-                                                       addvec[1]*=-1;
-                                                       mi[1] *= -1;
-                                                       addvec[2]*=-1;
-                                                       mi[2] *= -1;
-                                               }
-                                               else if (mode == 's'){
-                                                       addvec[ax-1]*=-1;
-                                                       mi[ax-1] *= -1;
-                                               }
-                                               else{
-                                                       addvec[ax]*=-1;
-                                                       mi[ax] *= -1;
-                                               }
-                                               firsttime = 1;
-                                               break;
-                                       }
-                               case TABKEY:
-                                       {
-                                               typemode = 1;
-                                               del = 0;
-                                               if ((mode == 'S') || (mode == 'w') || (mode == 'C') || (mode == 'N') || (mode == 'n'))
-                                                       break;
-                                               if ((mode != 'r') && (mode != 'R')){
-                            if (axismode != 0)
-                                    break;
-                                                       ax += 1;
-                                                       if (mode == 's'){
-                                                               if (ax == 4){ax=0;}
-                                                       }
-                                                       else if (ax == 3){ax=0;}
-                                                       firsttime = 1;
-                                               }
-                                               else if (((mode == 'r') || (mode == 'R')) && (midtog)){
-                                                       ax += 1;
-                                                       if (ax == 3){ax = 1;}
-                                                       firsttime = 1;
-                                               }
-                                               break;
-                                       }
-                               case PAD9:
-                               case NINEKEY:
-                                       {add_num += 1;}
-                               case PAD8:
-                               case EIGHTKEY:
-                                       {add_num += 1;}
-                               case PAD7:
-                               case SEVENKEY:
-                                       {add_num += 1;}
-                               case PAD6:
-                               case SIXKEY:
-                                       {add_num += 1;}
-                               case PAD5:
-                               case FIVEKEY:
-                                       {add_num += 1;}
-                               case PAD4:
-                               case FOURKEY:
-                                       {add_num += 1;}
-                               case PAD3:
-                               case THREEKEY:
-                                       {add_num += 1;}
-                               case PAD2:
-                               case TWOKEY:
-                                       {add_num += 1;}
-                               case PAD1:
-                               case ONEKEY:
-                                       {add_num += 1;}
-                               case PAD0:
-                               case ZEROKEY:
-                                       {
-                                               typemode = 1;
-                                               del = 0;
-                                               if (mode == 's'){
-                            if (axismode & XTRANS)
-                                    ax = 1;
-                            if (axismode & YTRANS)
-                                    ax = 2;
-                            if (axismode & ZTRANS)
-                                    ax = 3;
-                                                       if (ax == 0){
-                                                               if (pe[0]){
-                                                                       int div = 1;
-                                                                       int i;
-                                                                       for (i = 0; i < pe[ax]; i++){div*=10;}
-                                                                       addvec[0] += mi[0] * add_num / div;
-                                                                       pe[0]+=1;
-                                                                       addvec[1] += mi[1] * add_num / div;
-                                                                       pe[1]+=1;
-                                                                       addvec[2] += mi[2] * add_num / div;
-                                                                       pe[2]+=1;
-                                                               }
-                                                               else{
-                                                                       addvec[0] *= 10;
-                                                                       addvec[0] += mi[0] * add_num;
-                                                                       addvec[1] *= 10;
-                                                                       addvec[1] += mi[1] * add_num;
-                                                                       addvec[2] *= 10;
-                                                                       addvec[2] += mi[2] * add_num;
-                                                               }
-                                                               numchange[0]=numchange[1]=numchange[2]=1;
-                                                       }
-                                                       else{
-                                                               if (pe[ax-1]){
-                                                                       int div = 1;
-                                                                       int i;
-                                                                       for (i = 0; i < pe[ax-1]; i++){div*=10;}
-                                                                       addvec[ax-1] += mi[ax-1] * add_num / div;
-                                                                       pe[ax-1]+=1;
-                                                               }
-                                                               else{
-                                                                       addvec[ax-1] *= 10;
-                                                                       addvec[ax-1] += mi[ax-1] * add_num;
-                                                               }
-                                                               numchange[ax-1]=1;
-                                                       }
-
-                                               }
-                                               else if (mode == 'N'){
-                                                       if (pe[0]){
-                                                               int div = 1;
-                                                               int i;
-                                                               for (i = 0; i < pe[ax]; i++){div*=10;}
-                                                               addvec[0] += mi[0] * add_num / div;
-                                                               pe[0]+=1;
-                                                               addvec[1] += mi[1] * add_num / div;
-                                                               pe[1]+=1;
-                                                               addvec[2] += mi[2] * add_num / div;
-                                                               pe[2]+=1;
-                                                       }
-                                                       else{
-                                                               addvec[0] *= 10;
-                                                               addvec[0] += mi[0] * add_num;
-                                                               addvec[1] *= 10;
-                                                               addvec[1] += mi[1] * add_num;
-                                                               addvec[2] *= 10;
-                                                               addvec[2] += mi[2] * add_num;
-                                                       }
-                                                       numchange[0]=numchange[1]=numchange[2]=1;
-                                               }
-                                               else if ((mode == 'r') || (mode == 'R')){
-                                                       if (pe[ax]){
-                                                               int div = 1;
-                                                               int i;
-                                                               for (i = 0; i < pe[ax]; i++){div*=10;}
-                                                               addvec[ax] += mi[ax] * add_num / div;
-                                                               pe[ax]+=1;
-                                                       }
-                                                       else{
-                                                               addvec[ax] *= 10;
-                                                               addvec[ax] += mi[ax] * add_num;
-                                                       }
-                                                       numchange[ax]=1;
-                                               }
-                                               else{
-                            if (axismode & XTRANS)
-                                    ax = 0;
-                            if (axismode & YTRANS)
-                                    ax = 1;
-                            if (axismode & ZTRANS)
-                                    ax = 2;
-                                                       if (pe[ax]){
-                                                               int div = 1;
-                                                               int i;
-                                                               for (i = 0; i < pe[ax]; i++){div*=10;}
-                                                               addvec[ax] += mi[ax] * add_num / div;
-                                                               pe[ax]+=1;
-                                                       }
-                                                       else{
-                                                               addvec[ax] *= 10;
-                                                               addvec[ax] += mi[ax] * add_num;
-                                                       }
-                                                       numchange[ax]=1;
-                                               }
-                                               firsttime=1;
-                                       }
-                                       break;
-                               }
-
-                               arrows_move_cursor(event);
-                       }
-                       if(event==0 || breakloop) break;
-
-               }
-               xo= mval[0];
-               yo= mval[1];
-
-               if( qtest()==0) PIL_sleep_ms(1);
-
-       }
-       G.moving= 0;
-
-       if(event==ESCKEY || event==RIGHTMOUSE) {
-               canceled=1;
-               
-               if(edge_creases) {      // exception case, edges dont fit in Trans structs...
-                       EditEdge *ee;
-                       int tot;
-                       
-                       for(tot= 0, ee = G.editMesh->edges.first; ee; ee= ee->next, tot++)
-                               ee->crease= edge_creases[tot];
-                       
-                       makeDispList(G.obedit);
-               }
-               else {
-                       
-                       tv= transvmain;
-                       tob= transmain;
-                       for(a=0; a<tottrans; a++, tob++, tv++) {
-                               if(transmain) {
-                                       restore_tob(tob);
-                               }
-                               else {
-                                       VECCOPY(tv->loc, tv->oldloc);
-                                       if(tv->val) *(tv->val)= tv->oldval;
-                               }
-                       }
-                       if(G.obedit) calc_trans_verts();
-               }
-               special_trans_update(keyflags);
-       }
-
-       a= 0;
-       if(xref<0) a++;
-       if(yref<0) a++;
-       if(zref<0) a++;
-       special_aftertrans_update(mode, a & 1, canceled, keyflags);
-
-       allqueue(REDRAWVIEW3D, 0);
-       scrarea_queue_headredraw(curarea);
-
-       clearbaseflags_for_editing();
-
-       if(transmain) MEM_freeN(transmain);
-       transmain= NULL;
-       if(transvmain) MEM_freeN(transvmain);
-       transvmain= NULL;
-       if(edge_creases) MEM_freeN(edge_creases);
-       
-       tottrans= 0;
-
-       /* undo after transform, since it's storing current situations */
-       if(canceled==0) 
-               BIF_undo_push(undostr);
-}
-
-void std_rmouse_transform(void (*xf_func)(int))
-{
-       short mval[2];
-       short xo, yo;
-       short timer=0;
-       short mousebut;
-       
-       /* check for left mouse select/right mouse select user pref */
-       if (U.flag & USER_LMOUSESELECT) mousebut = L_MOUSE;
-               else mousebut = R_MOUSE;
-       
-       getmouseco_areawin(mval);
-       xo= mval[0]; 
-       yo= mval[1];
-       
-       while(get_mbut() & mousebut) {
-               getmouseco_areawin(mval);
-               if(abs(mval[0]-xo)+abs(mval[1]-yo) > 10) {
-                       xf_func('g');
-                       while(get_mbut() & mousebut) BIF_wait_for_statechange();
-                       return;
-               }
-               else {
-                       PIL_sleep_ms(10);
-                       timer++;
-                       if(timer>=10*U.tb_rightmouse) {
-                               toolbox_n();
-                               return;
-                       }
-               }
-       }
-       /* if gets here it's a select */
-       BIF_undo_push("Select");
-}
-
-void rightmouse_transform(void)
-{
-       std_rmouse_transform(transform);
-}
-
-
-/* ************************************** */
-
-
-void single_object_users(int flag)     
-       /* after this call clear_id_newpoins() */
-{
-       Base *base;
-       Object *ob, *obn;
-       
-       clear_sca_new_poins();  /* sensor/contr/act */
-
-       /* duplicate */
-       base= FIRSTBASE;
-       while(base) {
-               ob= base->object;
-               
-               if( (base->flag & flag)==flag) {
-
-                       if(ob->id.lib==0 && ob->id.us>1) {
-                       
-                               obn= copy_object(ob);
-                               ob->id.us--;
-                               base->object= obn;
-                       }
-               }
-               base= base->next;
-       }
-       
-       ID_NEW(G.scene->camera);
-       if(G.vd) ID_NEW(G.vd->camera);
-       
-       /* object pointers */
-       base= FIRSTBASE;
-       while(base) {
-               ob= base->object;
-               if(ob->id.lib==0) {
-                       if( (base->flag & flag)==flag) {
-                               
-                               relink_constraints(&base->object->constraints);
-                               if (base->object->pose){
-                                       bPoseChannel *chan;
-                                       for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
-                                               relink_constraints(&chan->constraints);
-                                       }
-                               }
-                               if(base->object->hooks.first) {
-                                       ObHook *hook= base->object->hooks.first;
-                                       while(hook) {
-                                               ID_NEW(hook->parent);
-                                               hook= hook->next;
-                                       }
-                               }
-                               
-                               ID_NEW(ob->parent);
-                               ID_NEW(ob->track);
-                               
-                       }
-               }
-               base= base->next;
-       }
-
-       set_sca_new_poins();
-}
-
-void new_id_matar(Material **matar, int totcol)
-{
-       ID *id;
-       int a;
-       
-       for(a=0; a<totcol; a++) {
-               id= (ID *)matar[a];
-               if(id && id->lib==0) {
-                       if(id->newid) {
-                               matar[a]= (Material *)id->newid;
-                               id_us_plus(id->newid);
-                               id->us--;
-                       }
-                       else if(id->us>1) {
-                               matar[a]= copy_material(matar[a]);
-                               id->us--;
-                               id->newid= (ID *)matar[a];
-                       }
-               }
-       }
-}
+}
 
 void single_obdata_users(int flag)
 {
@@ -6779,7 +4976,7 @@ void single_obdata_users(int flag)
                                case OB_LAMP:
                                        if(id && id->us>1 && id->lib==0) {
                                                ob->data= la= copy_lamp(ob->data);
-                                               for(a=0; a<8; a++) {
+                                               for(a=0; a<MAX_MTEX; a++) {
                                                        if(la->mtex[a]) {
                                                                ID_NEW(la->mtex[a]->object);
                                                        }
@@ -6920,7 +5117,7 @@ void single_mat_users(int flag)
                                                        ma->ipo->id.us--;
                                                }
                                                
-                                               for(b=0; b<8; b++) {
+                                               for(b=0; b<MAX_MTEX; b++) {
                                                        if(ma->mtex[b] && ma->mtex[b]->tex) {
                                                                tex= ma->mtex[b]->tex;
                                                                if(tex->id.us>1) {
@@ -6970,7 +5167,7 @@ void single_tex_users_expand()
        ma= G.main->mat.first;
        while(ma) {
                if(ma->id.flag & LIB_NEW) {
-                       for(b=0; b<8; b++) {
+                       for(b=0; b<MAX_MTEX; b++) {
                                if(ma->mtex[b] && ma->mtex[b]->tex) {
                                        do_single_tex_user( &(ma->mtex[b]->tex) );
                                }
@@ -6982,7 +5179,7 @@ void single_tex_users_expand()
        la= G.main->lamp.first;
        while(la) {
                if(la->id.flag & LIB_NEW) {
-                       for(b=0; b<6; b++) {
+                       for(b=0; b<MAX_MTEX; b++) {
                                if(la->mtex[b] && la->mtex[b]->tex) {
                                        do_single_tex_user( &(la->mtex[b]->tex) );
                                }
@@ -6993,7 +5190,7 @@ void single_tex_users_expand()
        wo= G.main->world.first;
        while(wo) {
                if(wo->id.flag & LIB_NEW) {
-                       for(b=0; b<6; b++) {
+                       for(b=0; b<MAX_MTEX; b++) {
                                if(wo->mtex[b] && wo->mtex[b]->tex) {
                                        do_single_tex_user( &(wo->mtex[b]->tex) );
                                }
@@ -7050,7 +5247,7 @@ void single_mat_users_expand(void)
        ma= G.main->mat.first;
        while(ma) {
                if(ma->id.flag & LIB_NEW) {
-                       for(a=0; a<8; a++) {
+                       for(a=0; a<MAX_MTEX; a++) {
                                if(ma->mtex[a]) {
                                        ID_NEW(ma->mtex[a]->object);
                                }
@@ -7066,6 +5263,8 @@ void single_user(void)
        
        if(G.scene->id.lib) return;
 
+       clear_id_newpoins();
+       
        nr= pupmenu("Make Single User%t|Object|Object & ObData|Object & ObData & Materials+Tex|Materials+Tex");
        if(nr>0) {
        
@@ -7207,7 +5406,7 @@ void make_local(void)
                        
                        if(ob->type==OB_LAMP) {
                                la= ob->data;
-                               for(b=0; b<8; b++) {
+                               for(b=0; b<MAX_MTEX; b++) {
                                        if(la->mtex[b] && la->mtex[b]->tex) {
                                                make_local_texture(la->mtex[b]->tex);
                                        }
@@ -7220,7 +5419,7 @@ void make_local(void)
                                        if(ma) {
                                                make_local_material(ma);
                                        
-                                               for(b=0; b<8; b++) {
+                                               for(b=0; b<MAX_MTEX; b++) {
                                                        if(ma->mtex[b] && ma->mtex[b]->tex) {
                                                                make_local_texture(ma->mtex[b]->tex);
                                                        }
@@ -7237,7 +5436,7 @@ void make_local(void)
                                        if(ma) {
                                                make_local_material(ma);
                                        
-                                               for(b=0; b<8; b++) {
+                                               for(b=0; b<MAX_MTEX; b++) {
                                                        if(ma->mtex[b] && ma->mtex[b]->tex) {
                                                                make_local_texture(ma->mtex[b]->tex);
                                                        }
@@ -7449,6 +5648,7 @@ void adduplicate(float *dtrans)
        while(base) {
                if TESTBASELIB(base) {
                        
+                       relink_constraints(&base->object->constraints);
                        if (base->object->pose){
                                bPoseChannel *chan;
                                for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
@@ -7478,7 +5678,7 @@ void adduplicate(float *dtrans)
                                ma= (Material *)mao->id.newid;
                                
                                if(dupflag & USER_DUP_TEX) {
-                                       for(a=0; a<8; a++) {
+                                       for(a=0; a<MAX_MTEX; a++) {
                                                if(ma->mtex[a]) {
                                                        id= (ID *)ma->mtex[a]->tex;
                                                        if(id) {
@@ -7506,7 +5706,7 @@ void adduplicate(float *dtrans)
        clear_id_newpoins();
        
        countall();
-       if(dtrans==0) transform('g');
+       if(dtrans==0) Transform(TFM_TRANSLATION, CTX_NONE);
        
        set_active_base(BASACT);
        
@@ -7590,7 +5790,7 @@ void selectlinks(int nr)
                                                if(mat1==mat) base->flag |= SELECT;
                                        }
                                        else if(mat1 && nr==4) {
-                                               for(b=0; b<8; b++) {
+                                               for(b=0; b<MAX_MTEX; b++) {
                                                        if(mat1->mtex[b]) {
                                                                if(tex==mat1->mtex[b]->tex) base->flag |= SELECT;
                                                        }
@@ -7632,7 +5832,7 @@ void image_aspect(void)
                        for(a=1; a<=ob->totcol; a++) {
                                ma= give_current_material(ob, a);
                                if(ma) {
-                                       for(b=0; b<8; b++) {
+                                       for(b=0; b<MAX_MTEX; b++) {
                                                if(ma->mtex[b] && ma->mtex[b]->tex) {
                                                        tex= ma->mtex[b]->tex;
                                                        if(tex->type==TEX_IMAGE && tex->ima && tex->ima->ibuf) {
@@ -7748,7 +5948,7 @@ void select_select_keys(void)
        allspace(REMAKEIPO, 0);
        allqueue(REDRAWIPO, 0);
 
-       BIF_undo_push("Selet keys");
+       BIF_undo_push("Select keys");
 
 }
 
@@ -7852,13 +6052,13 @@ void texspace_edit(void)
        }
        
 
-       transmode= TRANS_TEX;
+       //transmode= TRANS_TEX;
        
-       if(nr==1) transform('g');
-       else if(nr==2) transform('s');
-       else if(nr==3) transform('r');
+       if(nr==1) Transform(TFM_TRANSLATION, CTX_TEXTURE);
+       else if(nr==2) Transform(TFM_RESIZE, CTX_TEXTURE);
+       else if(nr==3) Transform(TFM_ROTATION, CTX_TEXTURE);
        
-       transmode= 0;
+       //transmode= 0;
 }
 
 void first_base(void)
@@ -7895,7 +6095,8 @@ void make_displists_by_obdata(void *obdata) {
 
 void mirror_edit(short mode) 
 {
-       short axis, a;
+       int a;
+       short axis;
        float mat[3][3], imat[3][3], min[3], max[3];
        TransVert *tv;
 
@@ -8026,7 +6227,8 @@ void mirror_edit(short mode)
 void mirror_object(short mode) 
 {
        TransOb *tob;
-       short a, axis;
+       int a;
+       short axis;
        float off[3], imat[3][3];
 
        setbaseflags_for_editing('s');
@@ -8074,6 +6276,7 @@ void mirror_object(short mode)
        
        special_aftertrans_update('m', 1, 0, 0);
 
+       BIF_undo_push("Mirror");
        allqueue(REDRAWVIEW3D, 0);
        scrarea_queue_headredraw(curarea);
 
@@ -8100,8 +6303,5 @@ void mirrormenu(void)
 
                if (mode==-1) return; /* return */
                mirror_edit(mode); /* separating functionality from interface | call*/
-
-               BIF_undo_push("Mirror");
-
        }
-}
\ No newline at end of file
+}