Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-07-15 05:34:59 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-07-15 05:34:59 +0400
commitd4ab6f3a9e75d987c48ea1828f3f8f879fb26f04 (patch)
tree0fe6e76323cca2ff0330c73eca3f33ee2d36f444
parent3c4c2478b60602b179009c9da5c3aecb5bcd0632 (diff)
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.
-rw-r--r--source/blender/blenlib/BLI_listbase.h2
-rw-r--r--source/blender/blenlib/intern/listbase.c4
-rw-r--r--source/blender/editors/object/object_transform.c30
3 files changed, 29 insertions, 7 deletions
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))