From d4ab6f3a9e75d987c48ea1828f3f8f879fb26f04 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 15 Jul 2013 01:34:59 +0000 Subject: fix [#36107] Moving origin of instanced objects doesn't work properly now use the active object first if its selected, this means when multiple instances are selected, using the active object gives a predictable outcome. --- source/blender/blenlib/BLI_listbase.h | 2 +- source/blender/blenlib/intern/listbase.c | 4 ++-- source/blender/editors/object/object_transform.c | 30 ++++++++++++++++++++---- 3 files changed, 29 insertions(+), 7 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h index 767f61b29dd..4c7ddf7ba66 100644 --- a/source/blender/blenlib/BLI_listbase.h +++ b/source/blender/blenlib/BLI_listbase.h @@ -72,7 +72,7 @@ void BLI_freelinkN(struct ListBase *listbase, void *vlink); void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src); void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src); void BLI_reverselist(struct ListBase *lb); -void BLI_rotatelist(struct ListBase *lb, LinkData *vlink); +void BLI_rotatelist(struct ListBase *lb, void *vlink); /* create a generic list node containing link to provided data */ struct LinkData *BLI_genericNodeN(void *data); diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c index f060a2771fe..ded4f31ae05 100644 --- a/source/blender/blenlib/intern/listbase.c +++ b/source/blender/blenlib/intern/listbase.c @@ -557,14 +557,14 @@ void BLI_reverselist(ListBase *lb) /** * \param vlink Link to make first. */ -void BLI_rotatelist(ListBase *lb, LinkData *vlink) +void BLI_rotatelist(ListBase *lb, void *vlink) { /* make circular */ ((LinkData *)lb->first)->prev = lb->last; ((LinkData *)lb->last)->next = lb->first; lb->first = vlink; - lb->last = vlink->prev; + lb->last = ((LinkData *)vlink)->prev; ((LinkData *)lb->first)->prev = NULL; ((LinkData *)lb->last)->next = NULL; diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 424333810a8..366aa72f2b8 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -682,12 +682,17 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + Object *obact = CTX_data_active_object(C); Object *obedit = CTX_data_edit_object(C); Object *tob; float cursor[3], cent[3], cent_neg[3], centn[3]; int centermode = RNA_enum_get(op->ptr, "type"); int around = RNA_enum_get(op->ptr, "center"); /* initialized from v3d->around */ + ListBase ctx_data_list; + CollectionPointerLink *ctx_ob; + CollectionPointerLink *ctx_ob_act = NULL; + /* keep track of what is changed */ int tot_change = 0, tot_lib_error = 0, tot_multiuser_arm_error = 0; @@ -746,12 +751,25 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) } } + CTX_data_selected_editable_objects(C, &ctx_data_list); + /* reset flags */ - CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) + for (ctx_ob = ctx_data_list.first; + ctx_ob; + ctx_ob = ctx_ob->next) { + Object *ob = ctx_ob->ptr.data; ob->flag &= ~OB_DONE; + + /* move active first */ + if (ob == obact) { + ctx_ob_act = ctx_ob; + } + } + + if (ctx_ob_act) { + BLI_rotatelist(&ctx_data_list, (LinkData *)ctx_ob_act); } - CTX_DATA_END; for (tob = bmain->object.first; tob; tob = tob->id.next) { if (tob->data) @@ -760,8 +778,12 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) ((ID *)tob->dup_group)->flag &= ~LIB_DOIT; } - CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects) + for (ctx_ob = ctx_data_list.first; + ctx_ob; + ctx_ob = ctx_ob->next) { + Object *ob = ctx_ob->ptr.data; + if ((ob->flag & OB_DONE) == 0) { int do_inverse_offset = FALSE; ob->flag |= OB_DONE; @@ -992,7 +1014,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) } } } - CTX_DATA_END; + BLI_freelistN(&ctx_data_list); for (tob = bmain->object.first; tob; tob = tob->id.next) if (tob->data && (((ID *)tob->data)->flag & LIB_DOIT)) -- cgit v1.2.3