[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32244] trunk/blender/source/blender: Fix #23629: Layers doesn't sign there are objects on them, only if the object is selected

Sergey Sharybin g.ulairi at gmail.com
Sat Oct 2 11:28:41 CEST 2010


Revision: 32244
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32244
Author:   nazgul
Date:     2010-10-02 11:28:41 +0200 (Sat, 02 Oct 2010)

Log Message:
-----------
Fix #23629: Layers doesn't sign there are objects on them, only if the object is selected

Also fixed layer buttons update when changing scene/screen

Modified Paths:
--------------
    trunk/blender/source/blender/editors/screen/screen_edit.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/windowmanager/WM_types.h

Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c	2010-10-02 09:17:32 UTC (rev 32243)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c	2010-10-02 09:28:41 UTC (rev 32244)
@@ -1312,6 +1312,7 @@
 		
 		ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
 		WM_event_add_notifier(C, NC_WINDOW, NULL);
+		WM_event_add_notifier(C, NC_SCREEN|ND_SCREENSET, sc);
 		
 		/* makes button hilites work */
 		WM_event_add_mousemove(C);

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-10-02 09:17:32 UTC (rev 32243)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2010-10-02 09:28:41 UTC (rev 32244)
@@ -529,30 +529,30 @@
 	return NULL;
 }
 
-static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn)
+static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, Scene *scene)
 {
 	wmWindow *win= wmn->wm->winactive;
 	ScrArea *sa;
+	int lay_used= 0;
+	Base *base;
 
 	if (!win) return;
 
+	base= scene->base.first;
+	while(base) {
+		lay_used|= base->lay;
+
+		if (lay_used & (1<<20-1)) break;
+
+		base= base->next;
+	}
+
 	sa= win->screen->areabase.first;
-
 	while(sa) {
 		if(sa->spacetype == SPACE_VIEW3D)
 			if(BLI_findindex(&sa->regionbase, ar) >= 0) {
 				View3D *v3d= sa->spacedata.first;
-				Scene *scene= wmn->reference;
-				Base *base;
-
-				v3d->lay_used= 0;
-				base= scene->base.first;
-				while(base) {
-					v3d->lay_used|= base->lay;
-
-					base= base->next;
-				}
-
+				v3d->lay_used= lay_used;
 				break;
 			}
 
@@ -562,6 +562,8 @@
 
 static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
 {
+	bScreen *sc;
+
 	/* context changes */
 	switch(wmn->category) {
 		case NC_ANIMATION:
@@ -584,7 +586,7 @@
 		case NC_SCENE:
 			switch(wmn->data) {
 				case ND_LAYER_CONTENT:
-					view3d_recalc_used_layers(ar, wmn);
+					view3d_recalc_used_layers(ar, wmn, wmn->reference);
 					ED_region_tag_redraw(ar);
 					break;
 				case ND_FRAME:
@@ -681,10 +683,22 @@
 				ED_region_tag_redraw(ar);
 			break;
 		case NC_SCREEN:
-			if(wmn->data == ND_GPENCIL)	
-				ED_region_tag_redraw(ar);
-			else if(wmn->data==ND_ANIMPLAY)
-				ED_region_tag_redraw(ar);
+			switch(wmn->data) {
+				case ND_GPENCIL:
+				case ND_ANIMPLAY:
+					ED_region_tag_redraw(ar);
+					break;
+				case ND_SCREENBROWSE:
+				case ND_SCREENDELETE:
+				case ND_SCREENSET:
+					/* screen was changed, need to update used layers due to NC_SCENE|ND_LAYER_CONTENT */
+					/* updates used layers only for View3D in active screen */
+					sc= wmn->reference;
+					view3d_recalc_used_layers(ar, wmn, sc->scene);
+					ED_region_tag_redraw(ar);
+					break;
+			}
+
 			break;
 	}
 }

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-10-02 09:17:32 UTC (rev 32243)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-10-02 09:28:41 UTC (rev 32244)
@@ -2260,7 +2260,7 @@
 	Base *base;
 	Object *ob;
 	float backcol[3];
-	int retopo= 0, sculptparticle= 0;
+	int retopo= 0, sculptparticle= 0, lay_used= 0;
 	Object *obact = OBACT;
 	char *grid_unit= NULL;
 
@@ -2363,8 +2363,12 @@
 		/* Transp and X-ray afterdraw stuff for sets is done later */
 	}
 
+	lay_used= 0;
+
 	/* then draw not selected and the duplis, but skip editmode object */
 	for(base= scene->base.first; base; base= base->next) {
+		lay_used |= base->lay;
+
 		if(v3d->lay & base->lay) {
 			
 			/* dupli drawing */
@@ -2378,6 +2382,20 @@
 		}
 	}
 
+	if(v3d->lay_used != lay_used) { /* happens when loading old files or loading with UI load */
+		ARegion *ar;
+		ScrArea *sa= CTX_wm_area(C);
+
+		/* find header and force tag redraw */
+		for(ar= sa->regionbase.first; ar; ar= ar->next)
+			if(ar->regiontype==RGN_TYPE_HEADER) {
+				ED_region_tag_redraw(ar);
+				break;
+			}
+
+		v3d->lay_used= lay_used;
+	}
+
 //	retopo= retopo_mesh_check() || retopo_curve_check();
 	sculptparticle= (obact && obact->mode & (OB_MODE_PARTICLE_EDIT)) && !scene->obedit;
 	if(retopo)

Modified: trunk/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_types.h	2010-10-02 09:17:32 UTC (rev 32243)
+++ trunk/blender/source/blender/windowmanager/WM_types.h	2010-10-02 09:28:41 UTC (rev 32244)
@@ -167,6 +167,7 @@
 #define ND_ANIMPLAY			(4<<16)
 #define ND_GPENCIL			(5<<16)
 #define ND_EDITOR_CHANGED	(6<<16) /*sent to new editors after switching to them*/
+#define ND_SCREENSET		(7<<16)
 
 	/* NC_SCENE Scene */
 #define ND_SCENEBROWSE		(1<<16)





More information about the Bf-blender-cvs mailing list