Bugfix #5313
authorTon Roosendaal <ton@blender.org>
Mon, 27 Nov 2006 15:23:21 +0000 (15:23 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 27 Nov 2006 15:23:21 +0000 (15:23 +0000)
3D Window "Transform properties" was using bad globals for buttons, this
caused things not work with multiple 3d windows open, and (in editmode)
set one panel to "Local" and the other to "Global".

Also:
- added undo push for moving bone to a layer
- protected Ikey for posemode to not show a menu without selection

source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_view3d_types.h
source/blender/src/drawview.c
source/blender/src/editipo.c
source/blender/src/poseobject.c
source/blender/src/space.c

index da927c5b60bb5556294ab4882cfc4085ae25af8b..955936ea53e22b0506fc0fa7a8a19a3df4f49137 100644 (file)
@@ -3661,6 +3661,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
                                v3d->afterdraw.first= v3d->afterdraw.last= NULL;
                                v3d->clipbb= newdataadr(fd, v3d->clipbb);
                                v3d->retopo_view_data= NULL;
+                               v3d->properties_storage= NULL;
                        }
                        else if (sl->spacetype==SPACE_OOPS) {
                                SpaceOops *soops= (SpaceOops*) sl;
index 11af418a59a2b2840fe1f5d3d2ad29e66d97fca1..c174c9752523a3a9fa345030e350c7724ff57342 100644 (file)
@@ -136,9 +136,11 @@ typedef struct View3D {
 
        short flag, flag2;
        
-       short gridsubdiv;       // Number of subdivisions in the grid between each highlighted grid line
+       short gridsubdiv;       /* Number of subdivisions in the grid between each highlighted grid line */
        
        short pad2[2];
+       
+       void *properties_storage;       /* Nkey panel stores stuff here, not in file */
 
 } View3D;
 
index 1839cf1b7f45bd7a36089e6703495346866ece77..47da7dfb07be496e9b5cc4c59438c287f220d573 100644 (file)
@@ -1524,24 +1524,25 @@ static void load_bgpic_image(char *name)
        
 }
 
-/* this one assumes there is only one global active object in blender...  (for object panel) */
-static float ob_eul[4];        // used for quat too....
-static float ob_scale[3]; // need temp space due to linked values
-static float ob_dims[3];
-static short link_scale = 0;
-
-/* this one assumes there is only one editmode in blender...  (for object panel) */
-static float ve_median[5];
+/* temporal struct for storing transform properties */
+typedef struct {
+       float ob_eul[4];        // used for quat too....
+       float ob_scale[3]; // need temp space due to linked values
+       float ob_dims[3];
+       short link_scale;
+       float ve_median[5];
+       int curdef;
+       float *defweightp;
+} TransformProperties;
 
 /* is used for both read and write... */
 static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
 {
-       static int curdef=0;
-       static float *defweightp= NULL;
        EditMesh *em = G.editMesh;
        EditVert *eve, *evedef=NULL;
        EditEdge *eed;
        MDeformVert *dvert=NULL;
+       TransformProperties *tfp= G.vd->properties_storage;
        float median[5];
        int tot, totw, totweight, totedge;
        char defstr[320];
@@ -1584,15 +1585,15 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
                                        if(max<320) strcat(defstr, str);
                                }
                                else printf("oh no!\n");
-                               if(curdef==dvert->dw[i].def_nr) {
+                               if(tfp->curdef==dvert->dw[i].def_nr) {
                                        init= 0;
-                                       defweightp= &dvert->dw[i].weight;
+                                       tfp->defweightp= &dvert->dw[i].weight;
                                }
                        }
                        
                        if(init) {      // needs new initialized 
-                               curdef= dvert->dw[0].def_nr;
-                               defweightp= &dvert->dw[0].weight;
+                               tfp->curdef= dvert->dw[0].def_nr;
+                               tfp->defweightp= &dvert->dw[0].weight;
                        }
                }
        }
@@ -1681,44 +1682,44 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
                uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Global",              160, 150, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays global values");
                uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Local",              230, 150, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays local values");
                
-               memcpy(ve_median, median, sizeof(ve_median));
+               memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
                
                uiBlockBeginAlign(block);
                if(tot==1) {
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex X:", 10, 110, 290, 19, &(ve_median[0]), -lim, lim, 10, 3, "");
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Y:", 10, 90, 290, 19, &(ve_median[1]), -lim, lim, 10, 3, "");
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Z:", 10, 70, 290, 19, &(ve_median[2]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
                        if(totw==1)
-                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex W:", 10, 50, 290, 19, &(ve_median[3]), 0.01, 100.0, 10, 3, "");
+                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
                        uiBlockEndAlign(block);
        
                        if(defstr[0]) {
                                uiDefBut(block, LABEL, 1, "Vertex Deform Groups",               10, 40, 290, 20, NULL, 0.0, 0.0, 0, 0, "");
 
                                uiBlockBeginAlign(block);
-                               uiDefButF(block, NUM, B_NOP, "Weight:",                 10, 20, 150, 19, defweightp, 0.0f, 1.0f, 10, 3, "Weight value");
-                               uiDefButI(block, MENU, REDRAWVIEW3D, defstr,    160, 20, 140, 19, &curdef, 0.0, 0.0, 0, 0, "Current Vertex Group");
+                               uiDefButF(block, NUM, B_NOP, "Weight:",                 10, 20, 150, 19, tfp->defweightp, 0.0f, 1.0f, 10, 3, "Weight value");
+                               uiDefButI(block, MENU, REDRAWVIEW3D, defstr,    160, 20, 140, 19, &tfp->curdef, 0.0, 0.0, 0, 0, "Current Vertex Group");
                                uiBlockEndAlign(block);
                        }
                        else if(totweight)
-                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",   10, 20, 290, 19, &(ve_median[4]), 0.0, 1.0, 10, 3, "");
+                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",   10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
 
                }
                else {
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median X:", 10, 110, 290, 19, &(ve_median[0]), -lim, lim, 10, 3, "");
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Y:", 10, 90, 290, 19, &(ve_median[1]), -lim, lim, 10, 3, "");
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Z:", 10, 70, 290, 19, &(ve_median[2]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
                        if(totw==tot)
-                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median W:", 10, 50, 290, 19, &(ve_median[3]), 0.01, 100.0, 10, 3, "");
+                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
                        uiBlockEndAlign(block);
                        if(totweight)
-                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",   10, 20, 290, 19, &(ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
+                               uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",   10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
                }
                
                if(totedge==1)
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease W:", 10, 30, 290, 19, &(ve_median[3]), 0.0, 1.0, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease W:", 10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
                else if(totedge>1)
-                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease W:",  10, 30, 290, 19, &(ve_median[3]), 0.0, 1.0, 10, 3, "");
+                       uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease W:",  10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
                
        }
        else {  // apply
@@ -1726,11 +1727,11 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
                if(G.vd->flag & V3D_GLOBAL_STATS) {
                        Mat4Invert(ob->imat, ob->obmat);
                        Mat4MulVecfl(ob->imat, median);
-                       Mat4MulVecfl(ob->imat, ve_median);
+                       Mat4MulVecfl(ob->imat, tfp->ve_median);
                }
-               VecSubf(median, ve_median, median);
-               median[3]= ve_median[3]-median[3];
-               median[4]= ve_median[4]-median[4];
+               VecSubf(median, tfp->ve_median, median);
+               median[3]= tfp->ve_median[3]-median[3];
+               median[4]= tfp->ve_median[4]-median[4];
                
                if(ob->type==OB_MESH) {
                        
@@ -1745,8 +1746,8 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
                        for(eed= em->edges.first; eed; eed= eed->next) {
                                if(eed->f & SELECT) {
                                        /* ensure the median can be set to zero or one */
-                                       if(ve_median[3]==0.0f) eed->crease= 0.0f;
-                                       else if(ve_median[3]==1.0f) eed->crease= 1.0f;
+                                       if(tfp->ve_median[3]==0.0f) eed->crease= 0.0f;
+                                       else if(tfp->ve_median[3]==1.0f) eed->crease= 1.0f;
                                        else {
                                                eed->crease+= median[3];
                                                CLAMP(eed->crease, 0.0, 1.0);
@@ -1850,6 +1851,7 @@ static void v3d_posearmature_buts(uiBlock *block, Object *ob, float lim)
        bArmature *arm;
        bPoseChannel *pchan;
        Bone *bone;
+       TransformProperties *tfp= G.vd->properties_storage;
 
        arm = get_armature(OBACT);
        if (!arm || !ob->pose) return;
@@ -1864,10 +1866,10 @@ static void v3d_posearmature_buts(uiBlock *block, Object *ob, float lim)
        but= uiDefBut(block, TEX, B_DIFF, "Bone:",                              160, 140, 140, 19, bone->name, 1, 31, 0, 0, "");
        uiButSetFunc(but, validate_bonebutton_cb, bone, NULL);
        
-       QuatToEul(pchan->quat, ob_eul);
-       ob_eul[0]*= 180.0/M_PI;
-       ob_eul[1]*= 180.0/M_PI;
-       ob_eul[2]*= 180.0/M_PI;
+       QuatToEul(pchan->quat, tfp->ob_eul);
+       tfp->ob_eul[0]*= 180.0/M_PI;
+       tfp->ob_eul[1]*= 180.0/M_PI;
+       tfp->ob_eul[2]*= 180.0/M_PI;
        
        uiBlockBeginAlign(block);
        uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, REDRAWVIEW3D, ICON_UNLOCKED,     10,140,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
@@ -1879,11 +1881,11 @@ static void v3d_posearmature_buts(uiBlock *block, Object *ob, float lim)
 
        uiBlockBeginAlign(block);
        uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, REDRAWVIEW3D, ICON_UNLOCKED,     10,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotX:",        30, 70, 120, 19, ob_eul, -1000.0, 1000.0, 100, 3, "");
+       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotX:",        30, 70, 120, 19, tfp->ob_eul, -1000.0, 1000.0, 100, 3, "");
        uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, REDRAWVIEW3D, ICON_UNLOCKED,     10,50,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotY:",        30, 50, 120, 19, ob_eul+1, -1000.0, 1000.0, 100, 3, "");
+       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotY:",        30, 50, 120, 19, tfp->ob_eul+1, -1000.0, 1000.0, 100, 3, "");
        uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, REDRAWVIEW3D, ICON_UNLOCKED,     10,30,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotZ:",        30, 30, 120, 19, ob_eul+2, -1000.0, 1000.0, 100, 3, "");
+       uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotZ:",        30, 30, 120, 19, tfp->ob_eul+2, -1000.0, 1000.0, 100, 3, "");
        
        uiBlockBeginAlign(block);
        uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, REDRAWVIEW3D, ICON_UNLOCKED,   160,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
@@ -1900,6 +1902,7 @@ static void v3d_editarmature_buts(uiBlock *block, Object *ob, float lim)
        bArmature *arm= G.obedit->data;
        EditBone *ebone;
        uiBut *but;
+       TransformProperties *tfp= G.vd->properties_storage;
        
        ebone= G.edbo.first;
 
@@ -1923,8 +1926,8 @@ static void v3d_editarmature_buts(uiBlock *block, Object *ob, float lim)
        uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipY:",        160, 50, 140, 19, ebone->tail+1, -lim, lim, 10, 3, "");
        uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipZ:",        160, 30, 140, 19, ebone->tail+2, -lim, lim, 10, 3, "");
        uiBlockEndAlign(block);
-       ob_eul[0]= 180.0*ebone->roll/M_PI;
-       uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:",        10, 100, 140, 19, ob_eul, -lim, lim, 1000, 3, "");
+       tfp->ob_eul[0]= 180.0*ebone->roll/M_PI;
+       uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:",        10, 100, 140, 19, tfp->ob_eul, -lim, lim, 1000, 3, "");
        
 
        uiBlockBeginAlign(block);
@@ -1971,6 +1974,7 @@ void do_viewbuts(unsigned short event)
        BoundBox *bb;
        View3D *vd;
        Object *ob= OBACT;
+       TransformProperties *tfp= G.vd->properties_storage;
        char *name;
        
        vd= G.vd;
@@ -2035,9 +2039,9 @@ void do_viewbuts(unsigned short event)
                
        case B_OBJECTPANELROT:
                if(ob) {
-                       ob->rot[0]= M_PI*ob_eul[0]/180.0;
-                       ob->rot[1]= M_PI*ob_eul[1]/180.0;
-                       ob->rot[2]= M_PI*ob_eul[2]/180.0;
+                       ob->rot[0]= M_PI*tfp->ob_eul[0]/180.0;
+                       ob->rot[1]= M_PI*tfp->ob_eul[1]/180.0;
+                       ob->rot[2]= M_PI*tfp->ob_eul[2]/180.0;
                        DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
                        allqueue(REDRAWVIEW3D, 1);
                }
@@ -2050,28 +2054,28 @@ void do_viewbuts(unsigned short event)
 
                        /* figure out which axis changed */
                        axis = 0;
-                       max = fabs(ob_scale[0] - ob->size[0]);
-                       tmp = fabs(ob_scale[1] - ob->size[1]);
+                       max = fabs(tfp->ob_scale[0] - ob->size[0]);
+                       tmp = fabs(tfp->ob_scale[1] - ob->size[1]);
                        if (tmp > max) {
                                axis = 1;
                                max = tmp;
                        }
-                       tmp = fabs(ob_scale[2] - ob->size[2]);
+                       tmp = fabs(tfp->ob_scale[2] - ob->size[2]);
                        if (tmp > max) {
                                axis = 2;
                                max = tmp;
                        }
                
-                       if (ob->size[axis] != ob_scale[axis]) {
-                               if (link_scale) {
+                       if (ob->size[axis] != tfp->ob_scale[axis]) {
+                               if (tfp->link_scale) {
                                        if (fabs(ob->size[axis]) > FLT_EPSILON) {
-                                               ratio = ob_scale[axis] / ob->size[axis];
+                                               ratio = tfp->ob_scale[axis] / ob->size[axis];
                                                ob->size[0] *= ratio;
                                                ob->size[1] *= ratio;
                                                ob->size[2] *= ratio;
                                        }
                                }
-                               ob->size[axis] = ob_scale[axis];
+                               ob->size[axis] = tfp->ob_scale[axis];
 
                                DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
                                allqueue(REDRAWVIEW3D, 1);
@@ -2097,10 +2101,10 @@ void do_viewbuts(unsigned short event)
 
                        /* for each axis changed */
                        for (axis = 0; axis<3; axis++) {
-                               if (fabs(old_dims[axis] - ob_dims[axis]) > 0.0001) {
+                               if (fabs(old_dims[axis] - tfp->ob_dims[axis]) > 0.0001) {
                                        if (old_dims[axis] > 0.0) {
-                                               ratio = ob_dims[axis] / old_dims[axis]; 
-                                               if (link_scale) {
+                                               ratio = tfp->ob_dims[axis] / old_dims[axis]; 
+                                               if (tfp->link_scale) {
                                                        ob->size[0] *= ratio;
                                                        ob->size[1] *= ratio;
                                                        ob->size[2] *= ratio;
@@ -2112,14 +2116,14 @@ void do_viewbuts(unsigned short event)
                                        }
                                        else {
                                                if (len[axis] > 0) {
-                                                       ob->size[axis] = ob_dims[axis] / len[axis];
+                                                       ob->size[axis] = tfp->ob_dims[axis] / len[axis];
                                                }
                                        }
                                }
                        }
                        
                        /* prevent multiple B_OBJECTPANELDIMS events to keep scaling, cycling with TAB on buttons can cause that */
-                       VECCOPY(ob_dims, old_dims);
+                       VECCOPY(tfp->ob_dims, old_dims);
                        
                        DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
                        allqueue(REDRAWVIEW3D, 1);
@@ -2156,7 +2160,7 @@ void do_viewbuts(unsigned short event)
                                        break;
                        }
                        if (ebone) {
-                               ebone->roll= M_PI*ob_eul[0]/180.0;
+                               ebone->roll= M_PI*tfp->ob_eul[0]/180.0;
                                //      Update our parent
                                if (ebone->parent && ebone->flag & BONE_CONNECTED){
                                        VECCOPY (ebone->parent->tail, ebone->head);
@@ -2211,9 +2215,9 @@ void do_viewbuts(unsigned short event)
                        if (!pchan) return;
                        
                        /* make a copy to eul[3], to allow TAB on buttons to work */
-                       eul[0]= M_PI*ob_eul[0]/180.0;
-                       eul[1]= M_PI*ob_eul[1]/180.0;
-                       eul[2]= M_PI*ob_eul[2]/180.0;
+                       eul[0]= M_PI*tfp->ob_eul[0]/180.0;
+                       eul[1]= M_PI*tfp->ob_eul[1]/180.0;
+                       eul[2]= M_PI*tfp->ob_eul[2]/180.0;
                        EulToQuat(eul, pchan->quat);
                }
                /* no break, pass on */
@@ -2233,17 +2237,20 @@ static void view3d_panel_object(short cntrl)    // VIEW3D_HANDLER_OBJECT
        uiBlock *block;
        uiBut *bt;
        Object *ob= OBACT;
+       TransformProperties *tfp;
        float lim;
        static char hexcol[128];
        
        if(ob==NULL) return;
 
+       /* make sure we got storage */
+       if(G.vd->properties_storage==NULL)
+               G.vd->properties_storage= MEM_callocN(sizeof(TransformProperties), "TransformProperties");
+       tfp= G.vd->properties_storage;
+       
        block= uiNewBlock(&curarea->uiblocks, "view3d_panel_object", UI_EMBOSS, UI_HELV, curarea->win);
        uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
        uiSetPanelHandler(VIEW3D_HANDLER_OBJECT);  // for close and esc
-       
-/* (ton) can't use the rename trick for paint... panel names and settings are stored in the files and
-   used to find previous locations when re-open. This causes flipping */
 
        if((G.f & G_SCULPTMODE) && !G.obedit) {
                if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 425, 234)) return;
@@ -2312,32 +2319,32 @@ static void view3d_panel_object(short cntrl)    // VIEW3D_HANDLER_OBJECT
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, REDRAWVIEW3D, ICON_UNLOCKED,     10,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
                uiDefButF(block, NUM, B_OBJECTPANEL, "LocZ:",           30, 110, 120, 19, &(ob->loc[2]), -lim, lim, 100, 3, "");
                
-               ob_eul[0]= 180.0*ob->rot[0]/M_PI;
-               ob_eul[1]= 180.0*ob->rot[1]/M_PI;
-               ob_eul[2]= 180.0*ob->rot[2]/M_PI;
+               tfp->ob_eul[0]= 180.0*ob->rot[0]/M_PI;
+               tfp->ob_eul[1]= 180.0*ob->rot[1]/M_PI;
+               tfp->ob_eul[2]= 180.0*ob->rot[2]/M_PI;
                
                uiBlockBeginAlign(block);
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, REDRAWVIEW3D, ICON_UNLOCKED,     160,150,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:",        180, 150, 120, 19, &(ob_eul[0]), -lim, lim, 1000, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:",        180, 150, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, "");
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, REDRAWVIEW3D, ICON_UNLOCKED,     160,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:",        180, 130, 120, 19, &(ob_eul[1]), -lim, lim, 1000, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:",        180, 130, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, "");
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, REDRAWVIEW3D, ICON_UNLOCKED,     160,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:",        180, 110, 120, 19, &(ob_eul[2]), -lim, lim, 1000, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:",        180, 110, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, "");
 
-               ob_scale[0]= ob->size[0];
-               ob_scale[1]= ob->size[1];
-               ob_scale[2]= ob->size[2];
+               tfp->ob_scale[0]= ob->size[0];
+               tfp->ob_scale[1]= ob->size[1];
+               tfp->ob_scale[2]= ob->size[2];
 
                uiBlockBeginAlign(block);
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, REDRAWVIEW3D, ICON_UNLOCKED,   10,80,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleX:",            30, 80, 120, 19, &(ob_scale[0]), -lim, lim, 10, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleX:",            30, 80, 120, 19, &(tfp->ob_scale[0]), -lim, lim, 10, 3, "");
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, REDRAWVIEW3D, ICON_UNLOCKED,   10,60,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleY:",            30, 60, 120, 19, &(ob_scale[1]), -lim, lim, 10, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleY:",            30, 60, 120, 19, &(tfp->ob_scale[1]), -lim, lim, 10, 3, "");
                uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, REDRAWVIEW3D, ICON_UNLOCKED,   10,40,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
-               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleZ:",            30, 40, 120, 19, &(ob_scale[2]), -lim, lim, 10, 3, "");
+               uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleZ:",            30, 40, 120, 19, &(tfp->ob_scale[2]), -lim, lim, 10, 3, "");
                uiBlockEndAlign(block);
                
-               uiDefButS(block, TOG, REDRAWVIEW3D, "Link Scale",               10, 10, 140, 19, &(link_scale), 0, 1, 0, 0, "Scale values vary proportionally in all directions");
+               uiDefButS(block, TOG, REDRAWVIEW3D, "Link Scale",               10, 10, 140, 19, &(tfp->link_scale), 0, 1, 0, 0, "Scale values vary proportionally in all directions");
 
                bb= object_get_boundbox(ob);
                if (bb) {
@@ -2345,14 +2352,14 @@ static void view3d_panel_object(short cntrl)    // VIEW3D_HANDLER_OBJECT
 
                        Mat4ToSize(ob->obmat, scale);
 
-                       ob_dims[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]);
-                       ob_dims[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]);
-                       ob_dims[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]);
+                       tfp->ob_dims[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]);
+                       tfp->ob_dims[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]);
+                       tfp->ob_dims[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]);
 
                        uiBlockBeginAlign(block);
-                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:",               160, 80, 140, 19, &(ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size");
-                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:",               160, 60, 140, 19, &(ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size");
-                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:",               160, 40, 140, 19, &(ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size");
+                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:",               160, 80, 140, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size");
+                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:",               160, 60, 140, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size");
+                       uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:",               160, 40, 140, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size");
 
                        uiBlockEndAlign(block);
                }
index f0a9edd58269805c57ee14f94138cab907c11b11..408992545b9fffd72b76843ee2f2815db541139d 100644 (file)
@@ -2673,6 +2673,13 @@ void common_insertkey(void)
                ob= OBACT;
 
                if (ob && (ob->flag & OB_POSEMODE)) {
+                       bPoseChannel *pchan;
+                       
+                       set_pose_keys(ob);  // sets pchan->flag to POSE_KEY if bone selected
+                       for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next)
+                               if (pchan->flag & POSE_KEY)
+                                       break;
+                       if(pchan==NULL) return;
                        strcpy(menustr, "Insert Key%t|Loc%x0|Rot%x1|Scale%x2|LocRot%x3|LocRotScale%x4|Avail%x9|Needed%x15|VisualLoc%x11|VisualRot%x12|VisualLocRot%x13");
                }
                else {
@@ -2708,7 +2715,6 @@ void common_insertkey(void)
                                return;
                        }
 
-                       set_pose_keys(ob);  // sets pchan->flag to POSE_KEY if bone selected
                        id= &ob->id;
                        for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
                                if (pchan->flag & POSE_KEY){
index 8b4908852a1289f3ce27967d67cf9794ad4f898e..7f61505131a518c6fa1d1036aeb670c47249e155 100644 (file)
@@ -947,6 +947,7 @@ void pose_movetolayer(void)
                        }
                }
                
+               BIF_undo_push("Move Bone layer");
                allqueue(REDRAWVIEW3D, 0);
                allqueue(REDRAWACTION, 0);
                allqueue(REDRAWBUTSEDIT, 0);
index 9d10fda2bb37717ee73b42236018cdc57374a9b3..b9bce7b60e042d3a6a2812f4305520d6e712e6cd 100644 (file)
@@ -5030,6 +5030,7 @@ void freespacelist(ScrArea *sa)
                                vd->depths= NULL;
                        }
                        retopo_free_view_data(vd);
+                       if(vd->properties_storage) MEM_freeN(vd->properties_storage);
                        if(G.vd==vd) G.vd= NULL;
                        if(vd->ri) { 
                                BIF_view3d_previewrender_free(vd);