[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58249] trunk/blender/source/blender: fix [#36107] Moving origin of instanced objects doesn't work properly

Campbell Barton ideasman42 at gmail.com
Mon Jul 15 03:35:03 CEST 2013


Revision: 58249
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58249
Author:   campbellbarton
Date:     2013-07-15 01:34:59 +0000 (Mon, 15 Jul 2013)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_listbase.h
    trunk/blender/source/blender/blenlib/intern/listbase.c
    trunk/blender/source/blender/editors/object/object_transform.c

Modified: trunk/blender/source/blender/blenlib/BLI_listbase.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_listbase.h	2013-07-14 23:41:33 UTC (rev 58248)
+++ trunk/blender/source/blender/blenlib/BLI_listbase.h	2013-07-15 01:34:59 UTC (rev 58249)
@@ -72,7 +72,7 @@
 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);

Modified: trunk/blender/source/blender/blenlib/intern/listbase.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/listbase.c	2013-07-14 23:41:33 UTC (rev 58248)
+++ trunk/blender/source/blender/blenlib/intern/listbase.c	2013-07-15 01:34:59 UTC (rev 58249)
@@ -557,14 +557,14 @@
 /**
  * \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;

Modified: trunk/blender/source/blender/editors/object/object_transform.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_transform.c	2013-07-14 23:41:33 UTC (rev 58248)
+++ trunk/blender/source/blender/editors/object/object_transform.c	2013-07-15 01:34:59 UTC (rev 58249)
@@ -682,12 +682,17 @@
 {
 	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,13 +751,26 @@
 		}
 	}
 
+	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;
+		}
 	}
-	CTX_DATA_END;
 
+	if (ctx_ob_act) {
+		BLI_rotatelist(&ctx_data_list, (LinkData *)ctx_ob_act);
+	}
+
 	for (tob = bmain->object.first; tob; tob = tob->id.next) {
 		if (tob->data)
 			((ID *)tob->data)->flag &= ~LIB_DOIT;
@@ -760,8 +778,12 @@
 			((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 @@
 			}
 		}
 	}
-	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))




More information about the Bf-blender-cvs mailing list