|
|
|
|
@@ -872,204 +872,6 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
|
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ************************************** */
|
|
|
|
|
|
|
|
|
|
static int snap_selected_to_center(bContext *C, wmOperator *op)
|
|
|
|
|
{
|
|
|
|
|
extern float originmat[3][3]; /* XXX object.c */
|
|
|
|
|
Object *obedit= CTX_data_edit_object(C);
|
|
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
|
View3D *v3d= CTX_wm_view3d(C);
|
|
|
|
|
TransVert *tv;
|
|
|
|
|
float snaploc[3], imat[3][3], bmat[3][3], vec[3], min[3], max[3], centroid[3];
|
|
|
|
|
int count, a;
|
|
|
|
|
|
|
|
|
|
/*calculate the snaplocation (centerpoint) */
|
|
|
|
|
count= 0;
|
|
|
|
|
INIT_MINMAX(min, max);
|
|
|
|
|
centroid[0]= centroid[1]= centroid[2]= 0.0f;
|
|
|
|
|
snaploc[0]= snaploc[1]= snaploc[2]= 0.0f;
|
|
|
|
|
|
|
|
|
|
if(obedit) {
|
|
|
|
|
tottrans= 0;
|
|
|
|
|
|
|
|
|
|
if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
|
|
|
|
|
make_trans_verts(obedit, bmat[0], bmat[1], 0);
|
|
|
|
|
if(tottrans==0) return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
|
|
copy_m3_m4(bmat, obedit->obmat);
|
|
|
|
|
invert_m3_m3(imat, bmat);
|
|
|
|
|
|
|
|
|
|
tv= transvmain;
|
|
|
|
|
for(a=0; a<tottrans; a++, tv++) {
|
|
|
|
|
VECCOPY(vec, tv->loc);
|
|
|
|
|
mul_m3_v3(bmat, vec);
|
|
|
|
|
add_v3_v3v3(vec, vec, obedit->obmat[3]);
|
|
|
|
|
add_v3_v3v3(centroid, centroid, vec);
|
|
|
|
|
DO_MINMAX(vec, min, max);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(v3d->around==V3D_CENTROID) {
|
|
|
|
|
mul_v3_fl(centroid, 1.0/(float)tottrans);
|
|
|
|
|
VECCOPY(snaploc, centroid);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
snaploc[0]= (min[0]+max[0])/2;
|
|
|
|
|
snaploc[1]= (min[1]+max[1])/2;
|
|
|
|
|
snaploc[2]= (min[2]+max[2])/2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MEM_freeN(transvmain);
|
|
|
|
|
transvmain= NULL;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
|
|
|
|
|
if(ob->mode & OB_MODE_POSE) {
|
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
|
bArmature *arm= ob->data;
|
|
|
|
|
|
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
|
|
|
|
|
if(pchan->bone->flag & BONE_SELECTED) {
|
|
|
|
|
if(pchan->bone->layer & arm->layer) {
|
|
|
|
|
VECCOPY(vec, pchan->pose_mat[3]);
|
|
|
|
|
add_v3_v3v3(centroid, centroid, vec);
|
|
|
|
|
DO_MINMAX(vec, min, max);
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* not armature bones (i.e. objects) */
|
|
|
|
|
VECCOPY(vec, ob->obmat[3]);
|
|
|
|
|
add_v3_v3v3(centroid, centroid, vec);
|
|
|
|
|
DO_MINMAX(vec, min, max);
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
CTX_DATA_END;
|
|
|
|
|
|
|
|
|
|
if(count) {
|
|
|
|
|
if(v3d->around==V3D_CENTROID) {
|
|
|
|
|
mul_v3_fl(centroid, 1.0/(float)count);
|
|
|
|
|
VECCOPY(snaploc, centroid);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
snaploc[0]= (min[0]+max[0])/2;
|
|
|
|
|
snaploc[1]= (min[1]+max[1])/2;
|
|
|
|
|
snaploc[2]= (min[2]+max[2])/2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Snap the selection to the snaplocation (duh!) */
|
|
|
|
|
if(obedit) {
|
|
|
|
|
tottrans= 0;
|
|
|
|
|
|
|
|
|
|
if ELEM6(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
|
|
|
|
|
make_trans_verts(obedit, bmat[0], bmat[1], 0);
|
|
|
|
|
if(tottrans==0) return OPERATOR_CANCELLED;
|
|
|
|
|
|
|
|
|
|
copy_m3_m4(bmat, obedit->obmat);
|
|
|
|
|
invert_m3_m3(imat, bmat);
|
|
|
|
|
|
|
|
|
|
tv= transvmain;
|
|
|
|
|
for(a=0; a<tottrans; a++, tv++) {
|
|
|
|
|
vec[0]= snaploc[0]-obedit->obmat[3][0];
|
|
|
|
|
vec[1]= snaploc[1]-obedit->obmat[3][1];
|
|
|
|
|
vec[2]= snaploc[2]-obedit->obmat[3][2];
|
|
|
|
|
|
|
|
|
|
mul_m3_v3(imat, vec);
|
|
|
|
|
VECCOPY(tv->loc, vec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
special_transvert_update(scene, obedit);
|
|
|
|
|
|
|
|
|
|
MEM_freeN(transvmain);
|
|
|
|
|
transvmain= NULL;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
|
|
|
|
|
if(ob->mode & OB_MODE_POSE) {
|
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
|
bArmature *arm= ob->data;
|
|
|
|
|
|
|
|
|
|
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
|
|
|
|
|
if(pchan->bone->flag & BONE_SELECTED) {
|
|
|
|
|
if(pchan->bone->layer & arm->layer) {
|
|
|
|
|
if((pchan->bone->flag & BONE_CONNECTED)==0) {
|
|
|
|
|
/* get location of cursor in bone-space */
|
|
|
|
|
armature_loc_pose_to_bone(pchan, snaploc, vec);
|
|
|
|
|
|
|
|
|
|
/* calculate new position */
|
|
|
|
|
VECCOPY(pchan->loc, vec);
|
|
|
|
|
}
|
|
|
|
|
/* if the bone has a parent and is connected to the parent,
|
|
|
|
|
* don't do anything - will break chain unless we do auto-ik.
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* auto-keyframing */
|
|
|
|
|
ob->pose->flag |= POSE_DO_UNLOCK;
|
|
|
|
|
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
|
|
|
|
|
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ob->recalc |= OB_RECALC_OB;
|
|
|
|
|
|
|
|
|
|
vec[0]= -ob->obmat[3][0] + snaploc[0];
|
|
|
|
|
vec[1]= -ob->obmat[3][1] + snaploc[1];
|
|
|
|
|
vec[2]= -ob->obmat[3][2] + snaploc[2];
|
|
|
|
|
|
|
|
|
|
if(ob->parent) {
|
|
|
|
|
where_is_object(scene, ob);
|
|
|
|
|
|
|
|
|
|
invert_m3_m3(imat, originmat);
|
|
|
|
|
mul_m3_v3(imat, vec);
|
|
|
|
|
ob->loc[0]+= vec[0];
|
|
|
|
|
ob->loc[1]+= vec[1];
|
|
|
|
|
ob->loc[2]+= vec[2];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ob->loc[0]+= vec[0];
|
|
|
|
|
ob->loc[1]+= vec[1];
|
|
|
|
|
ob->loc[2]+= vec[2];
|
|
|
|
|
}
|
|
|
|
|
/* auto-keyframing */
|
|
|
|
|
// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
CTX_DATA_END;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DAG_ids_flush_update(0);
|
|
|
|
|
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
|
|
|
|
|
|
|
|
|
|
return OPERATOR_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VIEW3D_OT_snap_selected_to_center(wmOperatorType *ot)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/* identifiers */
|
|
|
|
|
ot->name= "Snap Selection to Center";
|
|
|
|
|
ot->description= "Snap selected items to selections geometric center";
|
|
|
|
|
ot->idname= "VIEW3D_OT_snap_selected_to_center";
|
|
|
|
|
|
|
|
|
|
/* api callbacks */
|
|
|
|
|
ot->exec= snap_selected_to_center;
|
|
|
|
|
ot->poll= ED_operator_view3d_active;
|
|
|
|
|
|
|
|
|
|
/* flags */
|
|
|
|
|
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* **************************************************** */
|
|
|
|
|
/*New Code - Snap Cursor to Center -*/
|
|
|
|
|
static int snap_curs_to_center(bContext *C, wmOperator *op)
|
|
|
|
|
|