From d25747ee751096de2e417a7da1316bf5bf81c25a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 1 Aug 2010 11:00:36 +0000 Subject: bugfix's [#23108] bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN') dosen't work in console [#23115] Crash when moving armature origin - setting the armature in editmode would leave editdata in some cases. - transforming selected linked objects to account for the movement of the obdata was only done for meshes, now do for curves and text3d. - added utility functions for getting curve & mesh bounds. - text3d moving center wasn't working at all. - changed drawobject.c to use BLI_math funcs in more places. - remove some unused code from operator object.origin_set. --- source/blender/blenkernel/BKE_curve.h | 4 + source/blender/blenkernel/BKE_mesh.h | 5 + source/blender/blenkernel/intern/curve.c | 117 ++++++- source/blender/blenkernel/intern/mesh.c | 86 ++++-- source/blender/editors/armature/editarmature.c | 48 +-- source/blender/editors/include/ED_armature.h | 2 +- source/blender/editors/object/object_transform.c | 373 ++++++++++------------- source/blender/editors/space_view3d/drawobject.c | 149 +++++---- 8 files changed, 437 insertions(+), 347 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index e83ea4b809c..bcc92b477a7 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -107,5 +107,9 @@ int clamp_nurb_order_v( struct Nurb *nu); ListBase *BKE_curve_nurbs(struct Curve *cu); +int curve_bounds(struct Curve *cu, float min[3], float max[3]); +int curve_center_median(struct Curve *cu, float cent[3]); +int curve_center_bounds(struct Curve *cu, float cent[3]); +void curve_translate(struct Curve *cu, float offset[3], int do_keys); #endif diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 3b6cf8803d8..8c5979222f0 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -140,7 +140,12 @@ int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to void mesh_layers_menu_concat(struct CustomData *data, int type, char *str); int mesh_layers_menu(struct CustomData *data, int type); +/* vertex level transformations & checks (no derived mesh) */ +int mesh_bounds(struct Mesh *me, float min[3], float max[3]); +int mesh_center_median(struct Mesh *me, float cent[3]); +int mesh_center_bounds(struct Mesh *me, float cent[3]); +void mesh_translate(struct Mesh *me, float offset[3], int do_keys); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 4142ad7128f..1a30e85c5c4 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -276,7 +276,7 @@ void tex_space_curve(Curve *cu) { DispList *dl; BoundBox *bb; - float *fp, min[3], max[3], loc[3], size[3]; + float *fp, min[3], max[3]; int tot, doit= 0; if(cu->bb==NULL) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox"); @@ -303,20 +303,15 @@ void tex_space_curve(Curve *cu) min[0] = min[1] = min[2] = -1.0f; max[0] = max[1] = max[2] = 1.0f; } - - loc[0]= (min[0]+max[0])/2.0f; - loc[1]= (min[1]+max[1])/2.0f; - loc[2]= (min[2]+max[2])/2.0f; - - size[0]= (max[0]-min[0])/2.0f; - size[1]= (max[1]-min[1])/2.0f; - size[2]= (max[2]-min[2])/2.0f; boundbox_set_from_min_max(bb, min, max); if(cu->texflag & CU_AUTOSPACE) { - VECCOPY(cu->loc, loc); - VECCOPY(cu->size, size); + mid_v3_v3v3(cu->loc, min, max); + cu->size[0]= (max[0]-min[0])/2.0f; + cu->size[1]= (max[1]-min[1])/2.0f; + cu->size[2]= (max[2]-min[2])/2.0f; + cu->rot[0]= cu->rot[1]= cu->rot[2]= 0.0; if(cu->size[0]==0.0) cu->size[0]= 1.0; @@ -3107,3 +3102,103 @@ ListBase *BKE_curve_nurbs(Curve *cu) return &cu->nurb; } + + +/* basic vertex data functions */ +int curve_bounds(Curve *cu, float min[3], float max[3]) +{ + ListBase *nurb_lb= BKE_curve_nurbs(cu); + Nurb *nu; + + INIT_MINMAX(min, max); + + for(nu= nurb_lb->first; nu; nu= nu->next) + minmaxNurb(nu, min, max); + + return (nurb_lb->first != NULL); +} + +int curve_center_median(Curve *cu, float cent[3]) +{ + ListBase *nurb_lb= BKE_curve_nurbs(cu); + Nurb *nu; + int total= 0; + + zero_v3(cent); + + for(nu= nurb_lb->first; nu; nu= nu->next) { + int i; + + if(nu->type == CU_BEZIER) { + BezTriple *bezt; + i= nu->pntsu; + total += i * 3; + for(bezt= nu->bezt; i--; bezt++) { + add_v3_v3(cent, bezt->vec[0]); + add_v3_v3(cent, bezt->vec[1]); + add_v3_v3(cent, bezt->vec[2]); + } + } + else { + BPoint *bp; + i= nu->pntsu*nu->pntsv; + total += i; + for(bp= nu->bp; i--; bp++) { + add_v3_v3(cent, bp->vec); + } + } + } + + mul_v3_fl(cent, 1.0f/(float)total); + + return (total != 0); +} + +int curve_center_bounds(Curve *cu, float cent[3]) +{ + float min[3], max[3]; + + if(curve_bounds(cu, min, max)) { + mid_v3_v3v3(cent, min, max); + return 1; + } + + return 0; +} + +void curve_translate(Curve *cu, float offset[3], int do_keys) +{ + ListBase *nurb_lb= BKE_curve_nurbs(cu); + Nurb *nu; + int i; + + for(nu= nurb_lb->first; nu; nu= nu->next) { + BezTriple *bezt; + BPoint *bp; + + if(nu->type == CU_BEZIER) { + i= nu->pntsu; + for(bezt= nu->bezt; i--; bezt++) { + add_v3_v3(bezt->vec[0], offset); + add_v3_v3(bezt->vec[1], offset); + add_v3_v3(bezt->vec[2], offset); + } + } + else { + i= nu->pntsu*nu->pntsv; + for(bp= nu->bp; i--; bp++) { + add_v3_v3(bp->vec, offset); + } + } + } + + if (do_keys && cu->key) { + KeyBlock *kb; + for (kb=cu->key->block.first; kb; kb=kb->next) { + float *fp= kb->data; + for (i= kb->totelem; i--; fp+=3) { + add_v3_v3(fp, offset); + } + } + } +} diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 66e8c10206c..ab7b0694836 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -320,33 +320,22 @@ void make_local_mesh(Mesh *me) void boundbox_mesh(Mesh *me, float *loc, float *size) { - MVert *mvert; BoundBox *bb; float min[3], max[3]; float mloc[3], msize[3]; - int a; if(me->bb==0) me->bb= MEM_callocN(sizeof(BoundBox), "boundbox"); bb= me->bb; - - INIT_MINMAX(min, max); if (!loc) loc= mloc; if (!size) size= msize; - mvert= me->mvert; - for(a=0; atotvert; a++, mvert++) { - DO_MINMAX(mvert->co, min, max); - } - - if(!me->totvert) { + if(!mesh_bounds(me, min, max)) { min[0] = min[1] = min[2] = -1.0f; max[0] = max[1] = max[2] = 1.0f; } - loc[0]= (min[0]+max[0])/2.0f; - loc[1]= (min[1]+max[1])/2.0f; - loc[2]= (min[2]+max[2])/2.0f; + mid_v3_v3v3(loc, min, max); size[0]= (max[0]-min[0])/2.0f; size[1]= (max[1]-min[1])/2.0f; @@ -369,9 +358,9 @@ void tex_space_mesh(Mesh *me) else if(size[a]<0.0 && size[a]> -0.00001) size[a]= -0.00001; } - VECCOPY(me->loc, loc); - VECCOPY(me->size, size); - me->rot[0]= me->rot[1]= me->rot[2]= 0.0; + copy_v3_v3(me->loc, loc); + copy_v3_v3(me->size, size); + zero_v3(me->rot); } } @@ -413,9 +402,7 @@ float *get_mesh_orco_verts(Object *ob) totvert = MIN2(tme->totvert, me->totvert); for(a=0; aco[0]; - vcos[a][1]= mvert->co[1]; - vcos[a][2]= mvert->co[2]; + copy_v3_v3(vcos[a], mvert->co); } return (float*)vcos; @@ -431,9 +418,7 @@ void transform_mesh_orco_verts(Mesh *me, float (*orco)[3], int totvert, int inve if(invert) { for(a=0; apv= NULL; } } + +/* basic vertex data functions */ +int mesh_bounds(Mesh *me, float min[3], float max[3]) +{ + int i= me->totvert; + MVert *mvert; + INIT_MINMAX(min, max); + for(mvert= me->mvert; i--; mvert++) { + DO_MINMAX(mvert->co, min, max); + } + + return (me->totvert != 0); +} + +int mesh_center_median(Mesh *me, float cent[3]) +{ + int i= me->totvert; + MVert *mvert; + zero_v3(cent); + for(mvert= me->mvert; i--; mvert++) { + add_v3_v3(cent, mvert->co); + } + mul_v3_fl(cent, 1.0f/(float)me->totvert); + + return (me->totvert != 0); +} + +int mesh_center_bounds(Mesh *me, float cent[3]) +{ + float min[3], max[3]; + + if(mesh_bounds(me, min, max)) { + mid_v3_v3v3(cent, min, max); + return 1; + } + + return 0; +} + +void mesh_translate(Mesh *me, float offset[3], int do_keys) +{ + int i= me->totvert; + MVert *mvert; + for(mvert= me->mvert; i--; mvert++) { + add_v3_v3(mvert->co, offset); + } + + if (do_keys && me->key) { + KeyBlock *kb; + for (kb=me->key->block.first; kb; kb=kb->next) { + float *fp= kb->data; + for (i= kb->totelem; i--; fp+=3) { + add_v3_v3(fp, offset); + } + } + } +} diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 989c5bdc0ba..480bade1dc3 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -421,34 +421,45 @@ void ED_armature_apply_transform(Object *ob, float mat[4][4]) /* exported for use in editors/object/ */ /* 0 == do center, 1 == center new, 2 == center cursor */ -void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) +void docenter_armature (Scene *scene, Object *ob, float cursor[3], int centermode, int around) { Object *obedit= scene->obedit; // XXX get from context EditBone *ebone; bArmature *arm= ob->data; - float cent[3] = {0.0f, 0.0f, 0.0f}; - float min[3], max[3]; + float cent[3]; /* Put the armature into editmode */ - if(ob!=obedit) + if(ob != obedit) { ED_armature_to_edit(ob); + obedit= NULL; /* we cant use this so behave as if there is no obedit */ + } /* Find the centerpoint */ if (centermode == 2) { - float *fp= give_cursor(scene, v3d); - copy_v3_v3(cent, fp); + copy_v3_v3(cent, cursor); invert_m4_m4(ob->imat, ob->obmat); mul_m4_v3(ob->imat, cent); } else { - INIT_MINMAX(min, max); - - for (ebone= arm->edbo->first; ebone; ebone=ebone->next) { - DO_MINMAX(ebone->head, min, max); - DO_MINMAX(ebone->tail, min, max); + if(around==V3D_CENTROID) { + int total= 0; + zero_v3(cent); + for (ebone= arm->edbo->first; ebone; ebone=ebone->next) { + total+=2; + add_v3_v3(cent, ebone->head); + add_v3_v3(cent, ebone->tail); + } + mul_v3_fl(cent, 1.0f/(float)total); + } + else { + float min[3], max[3]; + INIT_MINMAX(min, max); + for (ebone= arm->edbo->first; ebone; ebone=ebone->next) { + DO_MINMAX(ebone->head, min, max); + DO_MINMAX(ebone->tail, min, max); + } + mid_v3_v3v3(cent, min, max); } - - mid_v3_v3v3(cent, min, max); } /* Do the adjustments */ @@ -458,16 +469,16 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) } /* Turn the list into an armature */ - ED_armature_from_edit(ob); - + if(obedit==NULL) { + ED_armature_from_edit(ob); + ED_armature_edit_free(ob); + } + /* Adjust object location for new centerpoint */ if(centermode && obedit==NULL) { mul_mat3_m4_v3(ob->obmat, cent); /* ommit translation part */ add_v3_v3(ob->loc, cent); } - else { - ED_armature_edit_free(ob); - } } /* ---------------------- */ @@ -2018,7 +2029,6 @@ void ED_armature_edit_free(struct Object *ob) BLI_freelistN(arm->edbo); } - MEM_freeN(arm->edbo); arm->edbo= NULL; } diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index d2d1e2a1d69..52db36e188d 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -120,7 +120,7 @@ void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone); void transform_armature_mirror_update(struct Object *obedit); void clear_armature(struct Scene *scene, struct Object *ob, char mode); -void docenter_armature (struct Scene *scene, struct View3D *v3d, struct Object *ob, int centermode); +void docenter_armature (struct Scene *scene, struct Object *ob, float cursor[3], int centermode, int around); void ED_armature_apply_transform(struct Object *ob, float mat[4][4]); diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index bc8a2a2fc60..bd23d3a4b67 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -694,81 +694,73 @@ void texspace_edit(Scene *scene, View3D *v3d) /********************* Set Object Center ************************/ -static EnumPropertyItem prop_set_center_types[] = { - {0, "GEOMETRY_ORIGIN", 0, "Geometry to Origin", "Move object geometry to object origin"}, - {1, "ORIGIN_GEOMETRY", 0, "Origin to Geometry", "Move object origin to center of object geometry"}, - {2, "ORIGIN_CURSOR", 0, "Origin to 3D Cursor", "Move object origin to position of the 3d cursor"}, - {0, NULL, 0, NULL, NULL} +enum { + GEOMETRY_TO_ORIGIN=0, + ORIGIN_TO_GEOMETRY, + ORIGIN_TO_CURSOR }; -/* 0 == do center, 1 == center new, 2 == center cursor */ static int object_origin_set_exec(bContext *C, wmOperator *op) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); - View3D *v3d= CTX_wm_view3d(C); Object *obedit= CTX_data_edit_object(C); Object *tob; - Mesh *me, *tme; - Curve *cu; -/* BezTriple *bezt; - BPoint *bp; */ - Nurb *nu, *nu1; - EditVert *eve; - float cent[3], centn[3], min[3], max[3]; - int a, total= 0; + float cursor[3], cent[3], cent_neg[3], centn[3], min[3], max[3]; int centermode = RNA_enum_get(op->ptr, "type"); - + int around = RNA_enum_get(op->ptr, "center"); /* initialized from v3d->around */ + /* keep track of what is changed */ int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0; - MVert *mvert; - if(scene->id.lib || v3d==NULL){ - BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data"); - return OPERATOR_CANCELLED; - } - if (obedit && centermode > 0) { + if (obedit && centermode != GEOMETRY_TO_ORIGIN) { BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode"); return OPERATOR_CANCELLED; } + else { + /* get the view settings if 'around' isnt set and the view is available */ + View3D *v3d= CTX_wm_view3d(C); + copy_v3_v3(cursor, give_cursor(scene, v3d)); + if(v3d && !RNA_property_is_set(op->ptr, "around")) + around= v3d->around; + } + zero_v3(cent); - - if(obedit) { + if(obedit) { INIT_MINMAX(min, max); - + if(obedit->type==OB_MESH) { Mesh *me= obedit->data; EditMesh *em = BKE_mesh_get_editmesh(me); + EditVert *eve; - for(eve= em->verts.first; eve; eve= eve->next) { - if(v3d->around==V3D_CENTROID) { + if(around==V3D_CENTROID) { + int total= 0; + for(eve= em->verts.first; eve; eve= eve->next) { total++; add_v3_v3(cent, eve->co); } - else { - DO_MINMAX(eve->co, min, max); - } - } - - if(v3d->around==V3D_CENTROID) { mul_v3_fl(cent, 1.0f/(float)total); } else { + for(eve= em->verts.first; eve; eve= eve->next) { + DO_MINMAX(eve->co, min, max); + } mid_v3_v3v3(cent, min, max); } - + for(eve= em->verts.first; eve; eve= eve->next) { - sub_v3_v3(eve->co, cent); + sub_v3_v3(eve->co, cent); } - + recalc_editnormals(em); tot_change++; DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); BKE_mesh_end_editmesh(me, em); } } - + /* reset flags */ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { ob->flag &= ~OB_DONE; @@ -779,190 +771,93 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if(tob->data) ((ID *)tob->data)->flag &= ~LIB_DOIT; } - + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { if((ob->flag & OB_DONE)==0) { ob->flag |= OB_DONE; - - if(obedit==NULL && (me=get_mesh(ob)) ) { - if (me->id.lib) { - tot_lib_error++; - } else { - if(centermode==2) { - copy_v3_v3(cent, give_cursor(scene, v3d)); - invert_m4_m4(ob->imat, ob->obmat); - mul_m4_v3(ob->imat, cent); - } else { - INIT_MINMAX(min, max); - mvert= me->mvert; - for(a=0; atotvert; a++, mvert++) { - DO_MINMAX(mvert->co, min, max); - } - - mid_v3_v3v3(cent, min, max); - } - mvert= me->mvert; - for(a=0; atotvert; a++, mvert++) { - sub_v3_v3(mvert->co, cent); - } - - if (me->key) { - KeyBlock *kb; - for (kb=me->key->block.first; kb; kb=kb->next) { - float *fp= kb->data; - - for (a=0; atotelem; a++, fp+=3) { - sub_v3_v3(fp, cent); - } - } - } + if(ob->data == NULL) { + /* pass */ + } + else if (((ID *)ob->data)->lib) { + tot_lib_error++; + } - tot_change++; - me->id.flag |= LIB_DOIT; - - if(centermode) { - copy_v3_v3(centn, cent); - mul_mat3_m4_v3(ob->obmat, centn); /* ommit translation part */ - add_v3_v3(ob->loc, centn); - - where_is_object(scene, ob); - ignore_parent_tx(bmain, scene, ob); - - /* other users? */ - CTX_DATA_BEGIN(C, Object*, ob_other, selected_editable_objects) { - if((ob_other->flag & OB_DONE)==0) { - tme= get_mesh(ob_other); - - if(tme==me) { - - ob_other->flag |= OB_DONE; - ob_other->recalc= OB_RECALC_OB|OB_RECALC_DATA; - - copy_v3_v3(centn, cent); - mul_mat3_m4_v3(ob_other->obmat, centn); /* ommit translation part */ - add_v3_v3(ob_other->loc, centn); - - where_is_object(scene, ob_other); - ignore_parent_tx(bmain, scene, ob_other); - - if(!(tme->id.flag & LIB_DOIT)) { - mvert= tme->mvert; - for(a=0; atotvert; a++, mvert++) { - sub_v3_v3(mvert->co, cent); - } - - if (tme->key) { - KeyBlock *kb; - for (kb=tme->key->block.first; kb; kb=kb->next) { - float *fp= kb->data; - - for (a=0; atotelem; a++, fp+=3) { - sub_v3_v3(fp, cent); - } - } - } - - tot_change++; - tme->id.flag |= LIB_DOIT; - } - } - } - } - CTX_DATA_END; - } + if(obedit==NULL && ob->type==OB_MESH) { + Mesh *me= ob->data; + + if(centermode == ORIGIN_TO_CURSOR) { + copy_v3_v3(cent, cursor); + invert_m4_m4(ob->imat, ob->obmat); + mul_m4_v3(ob->imat, cent); + } else { + if(around==V3D_CENTROID) + mesh_center_median(me, cent); + else + mesh_center_bounds(me, cent); } + + negate_v3_v3(cent_neg, cent); + mesh_translate(me, cent_neg, 1); + + tot_change++; + me->id.flag |= LIB_DOIT; } else if (ELEM(ob->type, OB_CURVE, OB_SURF)) { - - /* weak code here... (ton) */ - if(obedit==ob) { - ListBase *editnurb= curve_get_editcurve(obedit); + Curve *cu= ob->data; - nu1= editnurb->first; - cu= obedit->data; + if(centermode == ORIGIN_TO_CURSOR) { + copy_v3_v3(cent, cursor); + invert_m4_m4(ob->imat, ob->obmat); + mul_m4_v3(ob->imat, cent); } else { - cu= ob->data; - nu1= cu->nurb.first; + if(around==V3D_CENTROID) + curve_center_median(cu, cent); + else + curve_center_bounds(cu, cent); } - - if (cu->id.lib) { - tot_lib_error++; - } else { - if(centermode==2) { - copy_v3_v3(cent, give_cursor(scene, v3d)); - invert_m4_m4(ob->imat, ob->obmat); - mul_m4_v3(ob->imat, cent); - /* don't allow Z change if curve is 2D */ - if( !( cu->flag & CU_3D ) ) - cent[2] = 0.0; - } - else { - INIT_MINMAX(min, max); - - nu= nu1; - while(nu) { - minmaxNurb(nu, min, max); - nu= nu->next; - } - - mid_v3_v3v3(cent, min, max); - } - - nu= nu1; - while(nu) { - if(nu->type == CU_BEZIER) { - a= nu->pntsu; - while (a--) { - sub_v3_v3(nu->bezt[a].vec[0], cent); - sub_v3_v3(nu->bezt[a].vec[1], cent); - sub_v3_v3(nu->bezt[a].vec[2], cent); - } - } - else { - a= nu->pntsu*nu->pntsv; - while (a--) - sub_v3_v3(nu->bp[a].vec, cent); - } - nu= nu->next; - } - - if(centermode && obedit==NULL) { - mul_mat3_m4_v3(ob->obmat, cent); /* ommit translation part */ - add_v3_v3(ob->loc, cent); - where_is_object(scene, ob); - ignore_parent_tx(bmain, scene, ob); - } - - tot_change++; - cu->id.flag |= LIB_DOIT; + /* don't allow Z change if curve is 2D */ + if( !( cu->flag & CU_3D ) ) + cent[2] = 0.0; - if(obedit) { - if (centermode==0) { - DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - } - break; + negate_v3_v3(cent_neg, cent); + curve_translate(cu, cent_neg, 1); + + tot_change++; + cu->id.flag |= LIB_DOIT; + + if(obedit) { + if (centermode == GEOMETRY_TO_ORIGIN) { + DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); } + break; } } else if(ob->type==OB_FONT) { /* get from bb */ - - cu= ob->data; - - if(cu->bb==NULL) { + + Curve *cu= ob->data; + + if(cu->bb==NULL && (centermode != ORIGIN_TO_CURSOR)) { /* do nothing*/ - } else if (cu->id.lib) { - tot_lib_error++; - } else { - cu->xof= -0.5f*( cu->bb->vec[4][0] - cu->bb->vec[0][0]); - cu->yof= -0.5f -0.5f*( cu->bb->vec[0][1] - cu->bb->vec[2][1]); /* extra 0.5 is the height o above line */ - - /* not really ok, do this better once! */ - cu->xof /= cu->fsize; - cu->yof /= cu->fsize; + } + else { + if(centermode == ORIGIN_TO_CURSOR) { + copy_v3_v3(cent, cursor); + invert_m4_m4(ob->imat, ob->obmat); + mul_m4_v3(ob->imat, cent); + } + else { + cent[0]= 0.5f * ( cu->bb->vec[4][0] + cu->bb->vec[0][0]); + cent[1]= 0.5f * ( cu->bb->vec[0][1] + cu->bb->vec[2][1]) - 0.5f; /* extra 0.5 is the height o above line */ + } + + cent[2]= 0.0f; + + cu->xof= cu->xof - (cent[0] / cu->fsize); + cu->yof= cu->yof - (cent[1] / cu->fsize); tot_change++; cu->id.flag |= LIB_DOIT; @@ -970,29 +865,58 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) } else if(ob->type==OB_ARMATURE) { bArmature *arm = ob->data; - - if (arm->id.lib) { - tot_lib_error++; - } else if(ID_REAL_USERS(arm) > 1) { + + if(ID_REAL_USERS(arm) > 1) { /*BKE_report(op->reports, RPT_ERROR, "Can't apply to a multi user armature"); return;*/ tot_multiuser_arm_error++; - } else { - /* Function to recenter armatures in editarmature.c + } + else { + /* Function to recenter armatures in editarmature.c * Bone + object locations are handled there. */ - docenter_armature(scene, v3d, ob, centermode); + docenter_armature(scene, ob, cursor, centermode, around); tot_change++; - cu->id.flag |= LIB_DOIT; - + arm->id.flag |= LIB_DOIT; + where_is_object(scene, ob); ignore_parent_tx(bmain, scene, ob); - - if(obedit) + + if(obedit) break; } } + + /* offset other selected objects */ + if(centermode != GEOMETRY_TO_ORIGIN) { + /* was the object data modified + * note: the functions above must set 'cent' */ + if(ob->data && (((ID *)ob->data)->flag && LIB_DOIT) && ob->type != OB_ARMATURE) { + copy_v3_v3(centn, cent); + mul_mat3_m4_v3(ob->obmat, centn); /* ommit translation part */ + add_v3_v3(ob->loc, centn); + + where_is_object(scene, ob); + ignore_parent_tx(bmain, scene, ob); + + /* other users? */ + CTX_DATA_BEGIN(C, Object*, ob_other, selected_editable_objects) { + if((ob_other->flag & OB_DONE)==0 && (ob_other->data == ob->data)) { + ob_other->flag |= OB_DONE; + ob_other->recalc= OB_RECALC_OB|OB_RECALC_DATA; + + copy_v3_v3(centn, cent); + mul_mat3_m4_v3(ob_other->obmat, centn); /* ommit translation part */ + add_v3_v3(ob_other->loc, centn); + + where_is_object(scene, ob_other); + ignore_parent_tx(bmain, scene, ob_other); + } + } + CTX_DATA_END; + } + } } } CTX_DATA_END; @@ -1002,26 +926,39 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) tob->recalc= OB_RECALC_OB|OB_RECALC_DATA; } } - + if (tot_change) { DAG_ids_flush_update(0); WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); } - + /* Warn if any errors occurred */ if (tot_lib_error+tot_multiuser_arm_error) { - BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change); + BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change); if (tot_lib_error) BKE_reportf(op->reports, RPT_WARNING, "|%i linked library objects",tot_lib_error); if (tot_multiuser_arm_error) BKE_reportf(op->reports, RPT_WARNING, "|%i multiuser armature object(s)",tot_multiuser_arm_error); } - + return OPERATOR_FINISHED; } void OBJECT_OT_origin_set(wmOperatorType *ot) { + static EnumPropertyItem prop_set_center_types[] = { + {GEOMETRY_TO_ORIGIN, "GEOMETRY_ORIGIN", 0, "Geometry to Origin", "Move object geometry to object origin"}, + {ORIGIN_TO_GEOMETRY, "ORIGIN_GEOMETRY", 0, "Origin to Geometry", "Move object origin to center of object geometry"}, + {ORIGIN_TO_CURSOR, "ORIGIN_CURSOR", 0, "Origin to 3D Cursor", "Move object origin to position of the 3d cursor"}, + {0, NULL, 0, NULL, NULL} + }; + + static EnumPropertyItem prop_set_bounds_types[] = { + {V3D_CENTROID, "MEDIAN", 0, "Median Center", ""}, + {V3D_CENTER, "BOUNDS", 0, "Bounds Center", ""}, + {0, NULL, 0, NULL, NULL} + }; + /* identifiers */ ot->name= "Set Origin"; ot->description = "Set the object's origin, by either moving the data, or set to center of data, or use 3d cursor"; @@ -1031,12 +968,12 @@ void OBJECT_OT_origin_set(wmOperatorType *ot) ot->invoke= WM_menu_invoke; ot->exec= object_origin_set_exec; - ot->poll= ED_operator_view3d_active; + ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; ot->prop= RNA_def_enum(ot->srna, "type", prop_set_center_types, 0, "Type", ""); - + RNA_def_enum(ot->srna, "center", prop_set_bounds_types, V3D_CENTROID, "Center", ""); } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 9d0c5bcd898..54775affe3f 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -146,7 +146,7 @@ static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, int l return; } - VECCOPY(vec4, vec); + copy_v3_v3(vec4, vec); vec4[3]= 1.0; mul_m4_v4(rv3d->persmatob, vec4); @@ -175,7 +175,7 @@ static void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr) adr[0]= IS_CLIPPED; - VECCOPY(vec4, vec); + copy_v3_v3(vec4, vec); vec4[3]= 1.0; mul_m4_v4(rv3d->persmatob, vec4); @@ -1146,7 +1146,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* and back to viewspace */ glLoadMatrixf(rv3d->viewmat); - VECCOPY(vec, ob->obmat[3]); + copy_v3_v3(vec, ob->obmat[3]); setlinestyle(0); @@ -3257,7 +3257,7 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix case PART_DRAW_DOT: { if(vd) { - VECCOPY(vd,state->co) pdd->vd+=3; + copy_v3_v3(vd,state->co); pdd->vd+=3; } if(cd) { cd[0]=ma_r; @@ -3282,7 +3282,7 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix cd[14]=cd[17]=1.0; pdd->cd+=18; - VECCOPY(vec2,state->co); + copy_v3_v3(vec2,state->co); } else { if(cd) { @@ -3291,47 +3291,47 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b; pdd->cd+=18; } - VECSUB(vec2,state->co,vec); + sub_v3_v3v3(vec2, state->co, vec); } - VECADD(vec,state->co,vec); - VECCOPY(pdd->vd,vec); pdd->vd+=3; - VECCOPY(pdd->vd,vec2); pdd->vd+=3; + add_v3_v3(vec, state->co); + copy_v3_v3(pdd->vd,vec); pdd->vd+=3; + copy_v3_v3(pdd->vd,vec2); pdd->vd+=3; vec[1]=2.0f*pixsize; vec[0]=vec[2]=0.0; mul_qt_v3(state->rot,vec); if(draw_as==PART_DRAW_AXIS){ - VECCOPY(vec2,state->co); + copy_v3_v3(vec2,state->co); } - else VECSUB(vec2,state->co,vec); + else sub_v3_v3v3(vec2, state->co, vec); - VECADD(vec,state->co,vec); - VECCOPY(pdd->vd,vec); pdd->vd+=3; - VECCOPY(pdd->vd,vec2); pdd->vd+=3; + add_v3_v3(vec, state->co); + copy_v3_v3(pdd->vd,vec); pdd->vd+=3; + copy_v3_v3(pdd->vd,vec2); pdd->vd+=3; vec[2]=2.0f*pixsize; vec[0]=vec[1]=0.0; mul_qt_v3(state->rot,vec); if(draw_as==PART_DRAW_AXIS){ - VECCOPY(vec2,state->co); + copy_v3_v3(vec2,state->co); } - else VECSUB(vec2,state->co,vec); + else sub_v3_v3v3(vec2, state->co, vec); - VECADD(vec,state->co,vec); + add_v3_v3(vec, state->co); - VECCOPY(pdd->vd,vec); pdd->vd+=3; - VECCOPY(pdd->vd,vec2); pdd->vd+=3; + copy_v3_v3(pdd->vd,vec); pdd->vd+=3; + copy_v3_v3(pdd->vd,vec2); pdd->vd+=3; break; } case PART_DRAW_LINE: { - VECCOPY(vec,state->vel); + copy_v3_v3(vec,state->vel); normalize_v3(vec); if(draw & PART_DRAW_VEL_LENGTH) mul_v3_fl(vec,len_v3(state->vel)); - VECADDFAC(pdd->vd,state->co,vec,-draw_line[0]); pdd->vd+=3; - VECADDFAC(pdd->vd,state->co,vec,draw_line[1]); pdd->vd+=3; + madd_v3_v3v3fl(pdd->vd, state->co, vec, -draw_line[0]); pdd->vd+=3; + madd_v3_v3v3fl(pdd->vd, state->co, vec, draw_line[1]); pdd->vd+=3; if(cd) { cd[0]=cd[3]=ma_r; cd[1]=cd[4]=ma_g; @@ -3358,27 +3358,27 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix } - VECCOPY(bb->vec, state->co); - VECCOPY(bb->vel, state->vel); + copy_v3_v3(bb->vec, state->co); + copy_v3_v3(bb->vel, state->vel); psys_make_billboard(bb, xvec, yvec, zvec, bb_center); - VECADD(pdd->vd,bb_center,xvec); - VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + add_v3_v3v3(pdd->vd, bb_center, xvec); + add_v3_v3(pdd->vd, yvec); pdd->vd+=3; - VECSUB(pdd->vd,bb_center,xvec); - VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + sub_v3_v3v3(pdd->vd, bb_center, vec); + add_v3_v3(pdd->vd, yvec); pdd->vd+=3; - VECSUB(pdd->vd,bb_center,xvec); - VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + sub_v3_v3v3(pdd->vd, bb_center, xvec); + sub_v3_v3v3(pdd->vd, pdd->vd,yvec); pdd->vd+=3; - VECADD(pdd->vd,bb_center,xvec); - VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3; + add_v3_v3v3(pdd->vd, bb_center, xvec); + sub_v3_v3v3(pdd->vd, pdd->vd, yvec); pdd->vd+=3; - VECCOPY(pdd->nd, zvec); pdd->nd+=3; - VECCOPY(pdd->nd, zvec); pdd->nd+=3; - VECCOPY(pdd->nd, zvec); pdd->nd+=3; - VECCOPY(pdd->nd, zvec); pdd->nd+=3; + copy_v3_v3(pdd->nd, zvec); pdd->nd+=3; + copy_v3_v3(pdd->nd, zvec); pdd->nd+=3; + copy_v3_v3(pdd->nd, zvec); pdd->nd+=3; + copy_v3_v3(pdd->nd, zvec); pdd->nd+=3; break; } } @@ -3787,11 +3787,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv /* additional things to draw for each particle */ /* (velocity, size and number) */ if((part->draw & PART_DRAW_VEL) && pdd->vedata){ - VECCOPY(pdd->ved,state.co); - pdd->ved+=3; - VECCOPY(vel,state.vel); - mul_v3_fl(vel,timestep); - VECADD(pdd->ved,state.co,vel); + copy_v3_v3(pdd->ved,state.co); + pdd->ved += 3; + mul_v3_v3fl(vel, state.vel, timestep); + add_v3_v3v3(pdd->ved, state.co, vel); pdd->ved+=3; totve++; @@ -4069,7 +4068,7 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj if(timed) { for(k=0, pcol=pathcol, pkey=path; kcol); + copy_v3_v3(pcol, pkey->col); pcol[3] = 1.0f - fabs((float)CFRA - pkey->time)/(float)pset->fade_frames; } @@ -4107,15 +4106,15 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj for(k=0, key=point->keys; ktotkey; k++, key++){ if(pd) { - VECCOPY(pd, key->co); + copy_v3_v3(pd, key->co); pd += 3; } if(key->flag&PEK_SELECT){ - VECCOPY(cd,sel_col); + copy_v3_v3(cd,sel_col); } else{ - VECCOPY(cd,nosel_col); + copy_v3_v3(cd,nosel_col); } if(timed) @@ -4189,12 +4188,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[1] = root[2] = 0.0f; root[0] = -drw_size; mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); tip[1] = tip[2] = 0.0f; tip[0] = drw_size; mul_m3_v3(tr,tip); - VECADD(tip,tip,com); + add_v3_v3(tip, com); glVertex3fv(tip); glEnd(); @@ -4202,7 +4201,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4211,7 +4210,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4220,7 +4219,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] =th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4229,7 +4228,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4240,12 +4239,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] = root[2] = 0.0f; root[1] = -drw_size; mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); tip[0] = tip[2] = 0.0f; tip[1] = drw_size; mul_m3_v3(tr,tip); - VECADD(tip,tip,com); + add_v3_v3(tip, com); glVertex3fv(tip); glEnd(); @@ -4253,7 +4252,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[1] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4262,7 +4261,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[1] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4271,7 +4270,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[1] =th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4280,7 +4279,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[1] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4290,12 +4289,12 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[0] = root[1] = 0.0f; root[2] = -drw_size; mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); tip[0] = tip[1] = 0.0f; tip[2] = drw_size; mul_m3_v3(tr,tip); - VECADD(tip,tip,com); + add_v3_v3(tip, com); glVertex3fv(tip); glEnd(); @@ -4303,7 +4302,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[2] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4312,7 +4311,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[2] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4321,7 +4320,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[2] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4330,7 +4329,7 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float root[2] = th; glBegin(GL_LINES); mul_m3_v3(tr,root); - VECADD(root,root,com); + add_v3_v3(root, com); glVertex3fv(root); glVertex3fv(tip); glEnd(); @@ -4869,12 +4868,10 @@ static void drawspiral(float *cent, float rad, float tmat[][4], int start) start *= -1; } - VECCOPY(vx, tmat[0]); - VECCOPY(vy, tmat[1]); - mul_v3_fl(vx, rad); - mul_v3_fl(vy, rad); + mul_v3_v3fl(vx, tmat[0], rad); + mul_v3_v3fl(vy, tmat[1], rad); - VECCOPY(vec, cent); + copy_v3_v3(vec, cent); if (inverse==0) { for(a=0; atype, OB_CURVE, OB_SURF, OB_FONT) { Curve *cu= ob->data; - VECCOPY(size, cu->size); - VECCOPY(loc, cu->loc); + copy_v3_v3(size, cu->size); + copy_v3_v3(loc, cu->loc); } else if(ob->type==OB_MBALL) { MetaBall *mb= ob->data; - VECCOPY(size, mb->size); - VECCOPY(loc, mb->loc); + copy_v3_v3(size, mb->size); + copy_v3_v3(loc, mb->loc); } else return; @@ -5781,8 +5778,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if (cu->linewidth != 0.0) { cpack(0xff44ff); UI_ThemeColor(TH_WIRE); - VECCOPY(vec1, ob->orig); - VECCOPY(vec2, ob->orig); + copy_v3_v3(vec1, ob->orig); + copy_v3_v3(vec2, ob->orig); vec1[0] += cu->linewidth; vec2[0] += cu->linewidth; vec1[1] += cu->linedist * cu->fsize; @@ -6071,7 +6068,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(density[index] > FLT_EPSILON) { float color[3]; - VECCOPY(tmp, smd->domain->p0); + copy_v3_v3(tmp, smd->domain->p0); tmp[0] += smd->domain->dx * x + smd->domain->dx * 0.5; tmp[1] += smd->domain->dx * y + smd->domain->dx * 0.5; tmp[2] += smd->domain->dx * z + smd->domain->dx * 0.5; -- cgit v1.2.3