diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index 7f497a1d872..58abfae4556 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -1584,6 +1584,7 @@ static void add_bone_input (Object *ob) cursLoc= give_cursor(); VECCOPY (curs,cursLoc); + G.moving= G_TRANSFORM_EDIT; while (addbones>0){ afbreek=0; @@ -1741,6 +1742,7 @@ static void add_bone_input (Object *ob) } /* End of bone adding loop*/ countall(); + G.moving= 0; } diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index 18163948034..e3f8be49af9 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -292,7 +292,8 @@ static void createTransTexspace(void) /* ********************* pose mode ************* */ /* callback, make sure it's identical structured as next one */ -static void count_bone_select(ListBase *lb, int *counter) +/* also used to count for manipulator */ +void count_bone_select(ListBase *lb, int *counter) { Bone *bone; @@ -309,7 +310,7 @@ static void count_bone_select(ListBase *lb, int *counter) } } -/* callback */ +/* recursive */ static void add_pose_transdata(ListBase *lb, Object *ob, TransData **tdp) { Bone *bone; @@ -2389,7 +2390,7 @@ int Rotation(TransInfo *t, short mval[2]) /* ************************** TRACKBALL *************************** */ -static void initTrackball(TransInfo *t) +void initTrackball(TransInfo *t) { t->idx_max = 1; t->num.idx_max = 1; @@ -2430,7 +2431,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a } } -static int Trackball(TransInfo *t, short mval[2]) +int Trackball(TransInfo *t, short mval[2]) { char str[50]; float axis1[3], axis2[3]; diff --git a/source/blender/src/transform.h b/source/blender/src/transform.h index d10c066f547..47f02ca9990 100755 --- a/source/blender/src/transform.h +++ b/source/blender/src/transform.h @@ -192,5 +192,10 @@ int Tilt(TransInfo *t, short mval[2]); void initTrackball(TransInfo *t); int Trackball(TransInfo *t, short mval[2]); +/* exported from transform.c */ +struct ListBase; +void count_bone_select(struct ListBase *lb, int *counter); + + #endif diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c index 630abceb609..447e0d04590 100755 --- a/source/blender/src/transform_generics.c +++ b/source/blender/src/transform_generics.c @@ -132,7 +132,7 @@ void getViewVector(float coord[3], float vec[3]) { Mat4MulVec4fl(G.vd->viewinv, p2); - VecSubf(vec, p2, p1); + VecSubf(vec, p1, p2); } else { VECCOPY(vec, G.vd->viewinv[2]); diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c index 59ee7304f9d..74075f2883d 100644 --- a/source/blender/src/transform_manipulator.c +++ b/source/blender/src/transform_manipulator.c @@ -57,6 +57,7 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" +#include "BKE_armature.h" #include "BKE_global.h" #include "BKE_lattice.h" #include "BKE_object.h" @@ -121,6 +122,28 @@ static void calc_tw_center(float *co) VecAddf(twcent, twcent, co); } +/* callback */ +static void stats_pose(ListBase *lb) +{ + Bone *bone; + float vec[3]; + + for(bone= lb->first; bone; bone= bone->next) { + if (bone->flag & BONE_SELECTED) { + /* We don't let IK children get "grabbed" */ + /* ALERT! abusive global Trans here */ + if ( (Trans.mode!=TFM_TRANSLATION) || (bone->flag & BONE_IK_TOPARENT)==0 ) { + + get_bone_root_pos (bone, vec, 1); + + calc_tw_center(vec); + return; // see above function + } + } + stats_pose(&bone->childbase); + } +} + /* centroid, boundbox, of selection */ /* returns total items selected */ @@ -248,7 +271,19 @@ static int calc_manipulator(ScrArea *sa) } } else if(G.obpose) { - ; + bArmature *arm= G.obpose->data; + + /* count total */ + count_bone_select(&arm->bonebase, &totsel); + if(totsel) { + /* recursive get stats */ + stats_pose(&arm->bonebase); + + VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid! + Mat4MulVecfl(G.obpose->obmat, G.scene->twcent); + Mat4MulVecfl(G.obpose->obmat, G.scene->twmin); + Mat4MulVecfl(G.obpose->obmat, G.scene->twmax); + } } else if(G.f & (G_FACESELECT + G_VERTEXPAINT + G_TEXTUREPAINT +G_WEIGHTPAINT)) { ; @@ -439,10 +474,9 @@ static void draw_manipulator_rotate(float mat[][4]) Mat3CpyMat4(smat, mat); Mat3Inv(imat, smat); - getViewVector(mat[3], offset); - VecMulf(offset, -1.0f); Mat3MulVecfl(imat, offset); + Normalise(offset); // matrix space is such that 1.0 = size of sphere BIF_ThemeColor(TH_TRANSFORM); glBegin(GL_LINES);