[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13394] trunk/blender/source/blender/src/ outliner.c: added a function to the outliner for groups - " Link Group Objects to Scene"

Campbell Barton ideasman42 at gmail.com
Fri Jan 25 00:23:35 CET 2008


Revision: 13394
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13394
Author:   campbellbarton
Date:     2008-01-25 00:23:34 +0100 (Fri, 25 Jan 2008)

Log Message:
-----------
added a function to the outliner for groups - "Link Group Objects to Scene"
in some cases 
removed some globals from the 

Modified Paths:
--------------
    trunk/blender/source/blender/src/outliner.c

Modified: trunk/blender/source/blender/src/outliner.c
===================================================================
--- trunk/blender/source/blender/src/outliner.c	2008-01-24 22:43:42 UTC (rev 13393)
+++ trunk/blender/source/blender/src/outliner.c	2008-01-24 23:23:34 UTC (rev 13394)
@@ -2362,9 +2362,11 @@
 
 /* ************ SELECTION OPERATIONS ********* */
 
-static int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0; // globals, euh... you can do better
-
-static void set_operation_types(SpaceOops *soops, ListBase *lb)
+static void set_operation_types(SpaceOops *soops, ListBase *lb,
+				int *scenelevel,
+				int *objectlevel,
+				int *idlevel,
+				int *datalevel)
 {
 	TreeElement *te;
 	TreeStoreElem *tselem;
@@ -2374,22 +2376,22 @@
 		if(tselem->flag & TSE_SELECTED) {
 			if(tselem->type) {
 #ifdef WITH_VERSE
-				if(te->idcode==ID_VS) datalevel= TSE_VERSE_SESSION;
-				else if(te->idcode==ID_VN) datalevel= TSE_VERSE_OBJ_NODE;
-				else if(datalevel==0) datalevel= tselem->type;
+				if(te->idcode==ID_VS) *datalevel= TSE_VERSE_SESSION;
+				else if(te->idcode==ID_VN) *datalevel= TSE_VERSE_OBJ_NODE;
+				else if(*datalevel==0) *datalevel= tselem->type;
 #else
-				if(datalevel==0) datalevel= tselem->type;
+				if(*datalevel==0) *datalevel= tselem->type;
 #endif
-				else if(datalevel!=tselem->type) datalevel= -1;
+				else if(*datalevel!=tselem->type) *datalevel= -1;
 			}
 			else {
 				int idcode= GS(tselem->id->name);
 				switch(idcode) {
 					case ID_SCE:
-						scenelevel= 1;
+						*scenelevel= 1;
 						break;
 					case ID_OB:
-						objectlevel= 1;
+						*objectlevel= 1;
 						break;
 						
 					case ID_ME: case ID_CU: case ID_MB: case ID_LT:
@@ -2397,13 +2399,16 @@
 					case ID_MA: case ID_TE: case ID_IP: case ID_IM:
 					case ID_SO: case ID_KE: case ID_WO: case ID_AC:
 					case ID_NLA: case ID_TXT: case ID_GR:
-						if(idlevel==0) idlevel= idcode;
-						else if(idlevel!=idcode) idlevel= -1;
+						if(*idlevel==0) *idlevel= idcode;
+						else if(*idlevel!=idcode) *idlevel= -1;
 							break;
 				}
 			}
 		}
-		if((tselem->flag & TSE_CLOSED)==0) set_operation_types(soops, &te->subtree);
+		if((tselem->flag & TSE_CLOSED)==0) {
+			set_operation_types(soops, &te->subtree,
+								scenelevel, objectlevel, idlevel, datalevel);
+		}
 	}
 }
 
@@ -2559,6 +2564,30 @@
 	}
 }
 
+static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+{
+	Group *group= (Group *)tselem->id;
+	GroupObject *gob;
+	Base *base;
+	
+	for(gob=group->gobject.first; gob; gob=gob->next) {
+		base= object_in_scene(gob->ob, G.scene);
+		if (base) {
+			base->object->flag |= SELECT;
+			base->flag |= SELECT;
+		} else {
+				
+			/* link to scene */
+			base= MEM_callocN( sizeof(Base), "add_base");
+			BLI_addhead(&G.scene->base, base);
+			base->lay= (1<<20)-1; /*G.vd->lay;*/ /* would be nice to use the 3d layer but the include's not here */
+			gob->ob->flag |= SELECT;
+			base->flag = gob->ob->flag;
+			base->object= gob->ob;
+		}
+	}
+}
+
 static void outliner_do_object_operation(SpaceOops *soops, ListBase *lb, 
 										 void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *))
 {
@@ -2674,12 +2703,10 @@
 void outliner_operation_menu(ScrArea *sa)
 {
 	SpaceOops *soops= sa->spacedata.first;
+	int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0;
 	
-	// bad globals
-	scenelevel= objectlevel= idlevel= datalevel=0;
+	set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel);
 	
-	set_operation_types(soops, &soops->tree);
-	
 	if(scenelevel) {
 		if(objectlevel || datalevel || idlevel) error("Mixed selection");
 		//else pupmenu("Scene Operations%t|Delete");
@@ -2719,8 +2746,13 @@
 	else if(idlevel) {
 		if(idlevel==-1 || datalevel) error("Mixed selection");
 		else {
-			short event= pupmenu("Unlink %x1|Make Local %x2");
+			short event;
+			if (idlevel==ID_GR)
+				event = pupmenu("Unlink %x1|Make Local %x2|Link Group Objects to Scene%x3");
+			else
+				event = pupmenu("Unlink %x1|Make Local %x2");
 			
+			
 			if(event==1) {
 				switch(idlevel) {
 					case ID_MA:
@@ -2747,6 +2779,10 @@
 				BIF_undo_push("Localized Data");
 				allqueue(REDRAWALL, 0); 
 			}
+			else if(event==3 && idlevel==ID_GR) {
+				outliner_do_libdata_operation(soops, &soops->tree, group_linkobs2scene_cb);
+				BIF_undo_push("Link Group Objects to Scene");
+			}
 		}
 	}
 	else if(datalevel) {





More information about the Bf-blender-cvs mailing list