diff -r 07aa9f9a76e5 source/blender/include/BIF_editarmature.h --- source/blender/include/BIF_editarmature.h Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/include/BIF_editarmature.h Tue Jul 15 19:52:58 2008 +0200 @@ -134,6 +134,8 @@ void hide_selected_armature_bones(void); void hide_selected_armature_bones(void); void hide_unselected_armature_bones(void); void show_all_armature_bones(void); +void lock_selected_armature_bones(void); +void unlock_selected_armature_bones(void); #define BONESEL_ROOT 0x10000000 #define BONESEL_TIP 0x20000000 diff -r 07aa9f9a76e5 source/blender/makesdna/DNA_armature_types.h --- source/blender/makesdna/DNA_armature_types.h Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/makesdna/DNA_armature_types.h Tue Jul 15 19:52:58 2008 +0200 @@ -154,7 +154,8 @@ typedef enum eBone_Flag { BONE_NO_SCALE = (1<<15), /* No parent scale */ BONE_HIDDEN_PG = (1<<16), /* hidden bone when drawing PoseChannels (for ghost drawing) */ BONE_DRAWWIRE = (1<<17), /* bone should be drawn as OB_WIRE, regardless of draw-types of view+armature */ - BONE_NO_CYCLICOFFSET = (1<<18) /* when no parent, bone will not get cyclic offset */ + BONE_NO_CYCLICOFFSET = (1<<18), /* when no parent, bone will not get cyclic offset */ + BONE_EDITMODE_LOCKED = (1<<19) /* bone transforms are locked in editmode */ } eBone_Flag; #endif diff -r 07aa9f9a76e5 source/blender/makesdna/DNA_object_types.h --- source/blender/makesdna/DNA_object_types.h Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/makesdna/DNA_object_types.h Tue Jul 15 19:52:58 2008 +0200 @@ -466,9 +466,11 @@ extern Object workob; #define OB_LOCK_ROTX 8 #define OB_LOCK_ROTY 16 #define OB_LOCK_ROTZ 32 +#define OB_LOCK_ROT 56 #define OB_LOCK_SCALEX 64 #define OB_LOCK_SCALEY 128 #define OB_LOCK_SCALEZ 256 +#define OB_LOCK_SCALE 448 /* ob->softflag in DNA_object_force.h */ diff -r 07aa9f9a76e5 source/blender/python/api2_2x/Armature.c --- source/blender/python/api2_2x/Armature.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/python/api2_2x/Armature.c Tue Jul 15 19:52:58 2008 +0200 @@ -1469,6 +1469,8 @@ PyObject *Armature_Init(void) PyConstant_NewInt("BONE_SELECTED", BONE_SELECTED)); PyModule_AddObject(module, "TIP_SELECTED", PyConstant_NewInt("TIP_SELECTED", BONE_TIPSEL)); + PyModule_AddObject(module, "LOCKED_EDIT", + PyConstant_NewInt("LOCKED_EDIT", BONE_EDITMODE_LOCKED)); PyModule_AddObject(module, "OCTAHEDRON", PyConstant_NewInt("OCTAHEDRON", ARM_OCTA)); diff -r 07aa9f9a76e5 source/blender/python/api2_2x/Bone.c --- source/blender/python/api2_2x/Bone.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/python/api2_2x/Bone.c Tue Jul 15 19:52:58 2008 +0200 @@ -368,6 +368,10 @@ static PyObject *EditBone_getOptions(BPy if (PyList_Append(list, EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) goto RuntimeError; + if(self->editbone->flag & BONE_EDITMODE_LOCKED) + if (PyList_Append(list, + EXPP_GetModuleConstant("Blender.Armature", "LOCKED_EDIT")) == -1) + goto RuntimeError; }else{ if(self->flag & BONE_CONNECTED) if (PyList_Append(list, @@ -400,6 +404,10 @@ static PyObject *EditBone_getOptions(BPy if(self->flag & BONE_TIPSEL) if (PyList_Append(list, EXPP_GetModuleConstant("Blender.Armature", "TIP_SELECTED")) == -1) + goto RuntimeError; + if(self->flag & BONE_EDITMODE_LOCKED) + if (PyList_Append(list, + EXPP_GetModuleConstant("Blender.Armature", "LOCKED_EDIT")) == -1) goto RuntimeError; } @@ -422,7 +430,7 @@ static int EditBone_CheckValidConstant(P return 0; if (!STREQ3(PyString_AsString(name), "CONNECTED", "HINGE", "NO_DEFORM") && !STREQ3(PyString_AsString(name), "ROOT_SELECTED", "BONE_SELECTED", "TIP_SELECTED") && - !STREQ2(PyString_AsString(name), "MULTIPLY", "HIDDEN_EDIT")) + !STREQ3(PyString_AsString(name), "MULTIPLY", "HIDDEN_EDIT", "LOCKED_EDIT")) return 0; else return 1; diff -r 07aa9f9a76e5 source/blender/python/api2_2x/doc/Armature.py --- source/blender/python/api2_2x/doc/Armature.py Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/python/api2_2x/doc/Armature.py Tue Jul 15 19:52:58 2008 +0200 @@ -89,6 +89,8 @@ Example:: @type BONE_SELECTED: Constant @var TIP_SELECTED: Tip of the Bone is selected @type TIP_SELECTED: Constant +@var LOCKED_EDIT: Prevents the bone from being transformed in editmode +@type LOCKED_EDIT: Constant @var OCTAHEDRON: Bones drawn as octahedrons @type OCTAHEDRON: Constant @var STICK: Bones drawn as a line @@ -352,6 +354,7 @@ class Editbone: - Armature.ROOT_SELECTED: Selection of root ball of bone - Armature.BONE_SELECTED: Selection of bone - Armature.TIP_SELECTED: Selection of tip ball of bone + - Armature.LOCKED_EDIT: Prevents the bone from being transformed in editmode @type options: List of Constants @ivar subdivision: The number of bone subdivisions. @type subdivision: Int diff -r 07aa9f9a76e5 source/blender/src/buttons_editing.c --- source/blender/src/buttons_editing.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/buttons_editing.c Tue Jul 15 19:52:58 2008 +0200 @@ -4371,11 +4371,12 @@ static void editing_panel_armature_bones uiDefButF(block, NUM,B_ARM_RECALCDATA, "Weight:", 225, by-19,105, 18, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation weight"); /* bone types */ - uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone"); - uiDefButBitI(block, TOG, BONE_NO_SCALE, B_ARM_RECALCDATA, "S", 70,by-38,20,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit scale from parent Bone"); - uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 90, by-38, 80, 18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry"); - uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 170,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup"); - uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, "Hide", 250,by-38,80,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in Edit Mode"); + uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,60,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone"); + uiDefButBitI(block, TOG, BONE_NO_SCALE, B_ARM_RECALCDATA, "S", 50,by-38,20,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit scale from parent Bone"); + uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 70, by-38, 80, 18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry"); + uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 150,by-38,60,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup"); + uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, "Hide", 210,by-38,60,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in Edit Mode"); + uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, REDRAWVIEW3D, "Lock", 270,by-38,60,18, &curBone->flag, 0, 0, 0, 0, "Prevents this bone from being transformed in Edit Mode"); /* layers */ uiBlockBeginAlign(block); diff -r 07aa9f9a76e5 source/blender/src/drawview.c --- source/blender/src/drawview.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/drawview.c Tue Jul 15 19:52:58 2008 +0200 @@ -1984,6 +1984,8 @@ static void v3d_editarmature_buts(uiBloc 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, ""); + uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, REDRAWVIEW3D, "Lock", 160, 100, 140, 19, &(ebone->flag), 0, 0, 0, 0, "Prevents bone from being transformed in edit mode"); + uiBlockBeginAlign(block); uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailRadius:", 10, 150, 140, 19, &ebone->rad_tail, 0, lim, 10, 3, ""); if (ebone->parent && ebone->flag & BONE_CONNECTED ) diff -r 07aa9f9a76e5 source/blender/src/editarmature.c --- source/blender/src/editarmature.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/editarmature.c Tue Jul 15 19:52:58 2008 +0200 @@ -3148,6 +3148,42 @@ void subdivide_armature(int numcuts) else BIF_undo_push("Subdivide multi"); } +void lock_selected_armature_bones(void) +{ + bArmature *arm= G.obedit->data; + EditBone *ebone; + + for (ebone = G.edbo.first; ebone; ebone=ebone->next) { + if (arm->layer & ebone->layer) { + if (ebone->flag & (BONE_SELECTED)) { + ebone->flag |= BONE_EDITMODE_LOCKED; + } + } + } + countall(); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWBUTSEDIT, 0); + BIF_undo_push("Lock Bones"); +} + +void unlock_selected_armature_bones(void) +{ + bArmature *arm= G.obedit->data; + EditBone *ebone; + + for (ebone = G.edbo.first; ebone; ebone=ebone->next) { + if (arm->layer & ebone->layer) { + if (ebone->flag & (BONE_SELECTED)) { + ebone->flag &= ~BONE_EDITMODE_LOCKED; + } + } + } + countall(); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWBUTSEDIT, 0); + BIF_undo_push("Unlock Bones"); +} + /* ***************** Pose tools ********************* */ void clear_armature(Object *ob, char mode) diff -r 07aa9f9a76e5 source/blender/src/editobject.c --- source/blender/src/editobject.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/editobject.c Tue Jul 15 19:52:58 2008 +0200 @@ -2760,7 +2760,7 @@ void special_editmenu(void) DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); } else if(G.obedit->type==OB_ARMATURE) { - nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6"); + nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6|%l|Lock%x7|Unlock%x8"); if(nr==1) subdivide_armature(1); if(nr==2) { @@ -2773,6 +2773,10 @@ void special_editmenu(void) else if(ELEM3(nr, 4, 5, 6)) { armature_autoside_names(nr-4); } + else if(nr==7) + lock_selected_armature_bones(); + else if(nr==8) + unlock_selected_armature_bones(); } else if(G.obedit->type==OB_LATTICE) { static float weight= 1.0f; diff -r 07aa9f9a76e5 source/blender/src/transform_conversions.c --- source/blender/src/transform_conversions.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/transform_conversions.c Tue Jul 15 19:52:58 2008 +0200 @@ -1087,6 +1087,8 @@ static void createTransArmatureVerts(Tra VECCOPY (td->center, td->iloc); td->loc= ebo->tail; td->flag= TD_SELECTED; + if (ebo->flag & BONE_EDITMODE_LOCKED) + td->protectflag = OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE; Mat3CpyMat3(td->smtx, smtx); Mat3CpyMat3(td->mtx, mtx); @@ -1102,6 +1104,8 @@ static void createTransArmatureVerts(Tra VECCOPY (td->center, td->iloc); td->loc= ebo->head; td->flag= TD_SELECTED; + if (ebo->flag & BONE_EDITMODE_LOCKED) + td->protectflag = OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE; Mat3CpyMat3(td->smtx, smtx); Mat3CpyMat3(td->mtx, mtx); diff -r 07aa9f9a76e5 source/blender/src/transform_manipulator.c --- source/blender/src/transform_manipulator.c Tue Jul 15 14:59:09 2008 +0200 +++ source/blender/src/transform_manipulator.c Tue Jul 15 19:52:58 2008 +0200 @@ -170,6 +170,13 @@ static void stats_pose(View3D *v3d, bPos } } +/* for edit mode */ +static void stats_editbone(View3D *v3d, EditBone *ebo) +{ + if (ebo->flag & BONE_EDITMODE_LOCKED) + protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &v3d->twdrawflag); +} + /* only counts the parent selection, and tags transform flag */ /* bad call... should re-use method from transform_conversion once */ static void count_bone_select(TransInfo *t, bArmature *arm, ListBase *lb, int do_it) @@ -257,6 +264,9 @@ int calc_manipulator_stats(ScrArea *sa) if (ebo->flag & BONE_ROOTSEL) { calc_tw_center(ebo->head); totsel++; + } + if (ebo->flag & BONE_SELECTED) { + stats_editbone(v3d, ebo); } } }