forked from bartvdbraak/blender
Fix [#21760] Snap to Origin doesn't work
Removed the 'Snap selected to origin' operator, it was dysfunctional and other operators contain better functionality to do the same things.
This commit is contained in:
parent
6996d7b032
commit
58a38bfc08
@ -207,7 +207,6 @@ class VIEW3D_MT_snap(bpy.types.Menu):
|
||||
|
||||
layout.operator("view3d.snap_selected_to_grid", text="Selection to Grid")
|
||||
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor")
|
||||
layout.operator("view3d.snap_selected_to_center", text="Selection to Origin")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@ -175,7 +175,6 @@ int minmax_verts(Object *obedit, float *min, float *max);
|
||||
|
||||
void VIEW3D_OT_snap_selected_to_grid(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_snap_selected_to_cursor(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_snap_selected_to_center(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_snap_cursor_to_grid(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_snap_cursor_to_center(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_snap_cursor_to_selected(struct wmOperatorType *ot);
|
||||
|
@ -93,7 +93,6 @@ void view3d_operatortypes(void)
|
||||
|
||||
WM_operatortype_append(VIEW3D_OT_snap_selected_to_grid);
|
||||
WM_operatortype_append(VIEW3D_OT_snap_selected_to_cursor);
|
||||
WM_operatortype_append(VIEW3D_OT_snap_selected_to_center);
|
||||
WM_operatortype_append(VIEW3D_OT_snap_cursor_to_grid);
|
||||
WM_operatortype_append(VIEW3D_OT_snap_cursor_to_center);
|
||||
WM_operatortype_append(VIEW3D_OT_snap_cursor_to_selected);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user