diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h index 78eecba7cdc..7842d9cbd5f 100755 --- a/source/blender/include/transform.h +++ b/source/blender/include/transform.h @@ -40,6 +40,7 @@ struct TransInfo; struct TransData; struct NumInput; +struct Object; typedef struct NumInput { short idx; @@ -156,6 +157,8 @@ typedef struct TransInfo { char *undostr; /* if set, uses this string for undo */ float spacemtx[3][3]; /* orientation matrix of the current space */ char spacename[32]; /* name of the current space */ + + struct Object *poseobj; /* if t->flag & T_POSE, this denotes pose object */ } TransInfo; @@ -264,7 +267,7 @@ int calc_manipulator_stats(struct ScrArea *sa); void createTransData(TransInfo *t); void sort_trans_data_dist(TransInfo *t); void add_tdi_poin(float *poin, float *old, float delta); -void special_aftertrans_update(short canceled); +void special_aftertrans_update(TransInfo *t); /*********************** Constraints *****************************/ diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 62a5338b505..b6429769dea 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -2989,11 +2989,11 @@ static void editing_panel_mesh_paint(void) if(uiNewPanel(curarea, block, "Paint", "Editing", 640, 0, 318, 204)==0) return; - if(G.f & ( G_WEIGHTPAINT)) - { + if(G.f & G_WEIGHTPAINT) { Object *ob; ob= OBACT; - if(ob==NULL) return; + + if(ob==NULL) return; uiBlockBeginAlign(block); uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Weight:",2010,160,400,19, &editbutvweight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength"); @@ -3012,9 +3012,9 @@ static void editing_panel_mesh_paint(void) uiDefButF(block, NUMSLI, 0, "Size ", 2010,80,400,19, &Gvp.size, 2.0, 64.0, 0, 0, "The size of the brush"); uiBlockEndAlign(block); if(ob){ - uiBlockBeginAlign(block); - uiDefButBitC(block, TOG, OB_DRAWWIRE, REDRAWVIEW3D, "Wire", 2010,40,194,29, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes"); - uiBlockEndAlign(block); + uiBlockBeginAlign(block); + uiDefButBitC(block, TOG, OB_DRAWWIRE, REDRAWVIEW3D, "Wire", 2010,40,194,29, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes"); + uiBlockEndAlign(block); } } else{ diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index d70cf34140a..ce9ffad1bf0 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -1266,10 +1266,14 @@ void mouse_select(void) } if(has_bones && basact) { - if( do_pose_selectbuffer(basact, buffer, hits) ) { // bone found + if( do_pose_selectbuffer(basact, buffer, hits) ) { // then bone is found /* in weightpaint, we use selected bone to select vertexgroup, so no switch to new active object */ if(G.f & G_WEIGHTPAINT) { + /* we make the armature selected */ + basact->flag|= SELECT; + basact->object->flag= basact->flag; + /* prevent activating */ basact= NULL; } } diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index 053f50f6df6..4ce4bc5ae1a 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -100,16 +100,21 @@ float MatSpace[3][3]; /* bad frontbuffer call... because it is used in transform after force_draw() */ -static void helpline(float *vec, int local) +static void helpline(TransInfo *t, float *vec) { float vecrot[3], cent[2]; short mval[2]; VECCOPY(vecrot, vec); - if(local) { - Object *ob= OBACT; + if(t->flag & T_EDIT) { + Object *ob=G.obedit; if(ob) Mat4MulVecfl(ob->obmat, vecrot); } + else if(t->flag & T_POSE) { + Object *ob=t->poseobj; + if(ob) Mat4MulVecfl(ob->obmat, vecrot); + } + getmouseco_areawin(mval); project_float(vecrot, cent); // no overflow in extreme cases if(cent[0]!=3200.0f) { @@ -616,11 +621,11 @@ void Transform() } Trans.undostr= NULL; - /* free data, reset vars */ + /* free data */ postTrans(&Trans); - /* aftertrans does insert ipos and action channels, and clears base flags */ - special_aftertrans_update((short)(Trans.state == TRANS_CANCEL)); + /* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */ + special_aftertrans_update(&Trans); /* send events out for redraws */ allqueue(REDRAWVIEW3D, 0); @@ -774,7 +779,7 @@ void ManipulatorTransform() postTrans(&Trans); /* aftertrans does insert ipos and action channels, and clears base flags */ - special_aftertrans_update((short)(Trans.state == TRANS_CANCEL)); + special_aftertrans_update(&Trans); /* send events out for redraws */ allqueue(REDRAWVIEW3D, 0); @@ -914,7 +919,7 @@ int Warp(TransInfo *t, short mval[2]) force_draw(0); - helpline(gcursor, t->flag & (T_EDIT|T_POSE)); + helpline(t, gcursor); return 1; } @@ -998,7 +1003,7 @@ int Shear(TransInfo *t, short mval[2]) force_draw(0); - helpline (t->center, t->flag & (T_EDIT|T_POSE)); + helpline (t, t->center); return 1; } @@ -1250,7 +1255,7 @@ int Resize(TransInfo *t, short mval[2]) force_draw(0); - if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE)); + if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center); return 1; } @@ -1344,7 +1349,7 @@ int ToSphere(TransInfo *t, short mval[2]) force_draw(0); - helpline (t->center, t->flag & (T_EDIT|T_POSE)); + helpline (t, t->center); return 1; } @@ -1582,7 +1587,7 @@ int Rotation(TransInfo *t, short mval[2]) force_draw(0); - if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE)); + if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center); return 1; } @@ -1684,7 +1689,7 @@ int Trackball(TransInfo *t, short mval[2]) force_draw(0); - if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE)); + if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center); return 1; } @@ -1961,7 +1966,7 @@ int Tilt(TransInfo *t, short mval[2]) force_draw(0); - helpline (t->center, t->flag & (T_EDIT|T_POSE)); + helpline (t, t->center); return 1; } @@ -2133,7 +2138,7 @@ int Crease(TransInfo *t, short mval[2]) force_draw(0); - helpline (t->center, t->flag & (T_EDIT|T_POSE)); + helpline (t, t->center); return 1; } @@ -2331,7 +2336,7 @@ int BoneSize(TransInfo *t, short mval[2]) force_draw(0); - if(!(t->flag & T_USES_MANIPULATOR)) helpline (t->center, t->flag & (T_EDIT|T_POSE)); + if(!(t->flag & T_USES_MANIPULATOR)) helpline (t, t->center); return 1; } diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c index 149a9fe6d7f..a4ddf8d7096 100755 --- a/source/blender/src/transform_conversions.c +++ b/source/blender/src/transform_conversions.c @@ -454,9 +454,8 @@ static int add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tra } /* only called with pose mode active object now */ -static void createTransPose(TransInfo *t) +static void createTransPose(Object *ob, TransInfo *t) { - Object *ob= OBACT; bArmature *arm; bPoseChannel *pchan; TransData *td; @@ -482,6 +481,9 @@ static void createTransPose(TransInfo *t) } if(t->total==0) return; + t->flag |= T_POSE; + t->poseobj= ob; // we also allow non-active objects to be transformed, in weightpaint + /* init trans data */ td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransPoseBone"); tdx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransPoseBoneExt"); @@ -1353,19 +1355,24 @@ static void clear_trans_object_base_flags(void) } /* inserting keys, refresh ipo-keys, softbody, redraw events... (ton) */ -void special_aftertrans_update(short cancelled) +/* note; transdata has been freed already! */ +void special_aftertrans_update(TransInfo *t) { - Object *ob= OBACT; + Object *ob; Base *base; int redrawipo=0; - + int cancelled= (t->state == TRANS_CANCEL); + if(G.obedit); // nothing - else if (ob && (ob->flag & OB_POSEMODE)) { - bArmature *arm= ob->data; + else if( (t->flag & T_POSE) && t->poseobj) { + bArmature *arm; bAction *act; bPose *pose; bPoseChannel *pchan; + ob= t->poseobj; + arm= ob->data; + if(cancelled) /* if cancelled we do the update always */ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); else if(G.flags & G_RECORDKEYS) { @@ -1636,8 +1643,21 @@ void createTransData(TransInfo *t) } } else if (ob && (ob->flag & OB_POSEMODE)) { - t->flag |= T_POSE; - createTransPose(t); + createTransPose(OBACT, t); + } + else if (G.f & G_WEIGHTPAINT) { + /* exception, we look for the one selected armature */ + Base *base; + for(base=FIRSTBASE; base; base= base->next) { + if(TESTBASELIB(base)) { + if(base->object->type==OB_ARMATURE) + if(base->object->flag & OB_POSEMODE) + break; + } + } + if(base) { + createTransPose(base->object, t); + } } else { createTransObject(t); diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c index 32afcd6ea20..d938b43299d 100755 --- a/source/blender/src/transform_generics.c +++ b/source/blender/src/transform_generics.c @@ -142,7 +142,6 @@ static void transform_armature_mirror_update(void) /* called for objects updating while transform acts, once per redraw */ void recalcData(TransInfo *t) { - Object *ob= OBACT; if (G.obedit) { if (G.obedit->type == OB_MESH) { @@ -191,7 +190,8 @@ void recalcData(TransInfo *t) DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); /* sets recalc flags */ } } - else if(ob && (ob->flag & OB_POSEMODE)) { + else if( (t->flag & T_POSE) && t->poseobj) { + Object *ob= t->poseobj; bArmature *arm= ob->data; /* old optimize trick... this enforces to bypass the depgraph */ @@ -302,10 +302,9 @@ void drawLine(float *center, float *dir, char axis, short options) void initTrans (TransInfo *t) { - Object *ob= OBACT; /* moving: is shown in drawobject() (transform color) */ - if(G.obedit || (ob && (ob->flag & OB_POSEMODE)) ) G.moving= G_TRANSFORM_EDIT; + if(G.obedit || (t->flag & T_POSE) ) G.moving= G_TRANSFORM_EDIT; else G.moving= G_TRANSFORM_OBJ; t->data = NULL; @@ -497,7 +496,7 @@ void calculateCenterCursor(TransInfo *t) VECCOPY(t->center, cursor); if(t->flag & (T_EDIT|T_POSE)) { - Object *ob= G.obedit?G.obedit:OBACT; + Object *ob= G.obedit?G.obedit:t->poseobj; float mat[3][3], imat[3][3]; float vec[3]; @@ -535,7 +534,7 @@ void calculateCenterMedian(TransInfo *t) VECCOPY(t->center, partial); if (t->flag & (T_EDIT|T_POSE)) { - Object *ob= G.obedit?G.obedit:OBACT; + Object *ob= G.obedit?G.obedit:t->poseobj; float vec[3]; VECCOPY(vec, t->center); @@ -574,7 +573,7 @@ void calculateCenterBound(TransInfo *t) VecMulf(t->center, 0.5); if (t->flag & (T_EDIT|T_POSE)) { - Object *ob= G.obedit?G.obedit:OBACT; + Object *ob= G.obedit?G.obedit:t->poseobj; float vec[3]; VECCOPY(vec, t->center); @@ -618,7 +617,7 @@ void calculateCenter(TransInfo *t) /* setting constraint center */ VECCOPY(t->con.center, t->center); if(t->flag & (T_EDIT|T_POSE)) { - Object *ob= G.obedit?G.obedit:OBACT; + Object *ob= G.obedit?G.obedit:t->poseobj; Mat4MulVecfl(ob->obmat, t->con.center); }