[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18632] branches/blender2.5/blender/source /blender: 2.5: WM Compositing

Brecht Van Lommel brecht at blender.org
Fri Jan 23 04:52:56 CET 2009


Revision: 18632
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18632
Author:   blendix
Date:     2009-01-23 04:52:52 +0100 (Fri, 23 Jan 2009)

Log Message:
-----------
2.5: WM Compositing

* Triple Buffer is now more complete:
  - Proper handling of window resize, duplicate, etc.
  - It now uses 3x3 textures (or less) if the power of two sizes
    do not match well. That still has a worst case wast of 23.4%,
    but better than 300%.
  - It can also use the ARB/NV/EXT_texture_rectangle extension
    now, which may be supported on hardware that does not support
    ARB_texture_non_power_of_two.
  - Gesture, menu and brushe redraws now require no redraws at all
    from the area regions. So even on a high poly scene just moving
    the paint cursor or opening a menu should be fast.

* Testing can be done by setting the "Window Draw Method" in the
  User Preferences in the outliner. "Overlap" is still default,
  since "Triple Buffer" has not been tested on computers other than
  mine, would like to avoid crashing Blender on startup in case
  there is a common bug, but it's ready for testing now.

  - For reference "Full" draws the full window each time.
  - "Triple Buffer" should work for both swap copy and swap exchange
    systems, the latter still need the -E command line option for
    "Overlap".
  - Resizing and going fullscreen still gives flicker here but no
    more than "Full" drawing.

* Partial Redraw was added. ED_region_tag_redraw_partial takes a
  rect in window coordinates to define a subarea of the region.
  On region draw it will then set glScissor to a smaller area, and
  ar->drawrct will always be set to either the partial or full
  window rect. The latter can then be used for clipping in the 3D
  view or clipping interface drawing. Neither is implemented yet.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_userdef_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_draw.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_subwindow.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/windowmanager/wm_draw.h

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-01-23 03:52:52 UTC (rev 18632)
@@ -4007,8 +4007,9 @@
 		win->handlers.first= win->handlers.last= NULL;
 		win->subwindows.first= win->subwindows.last= NULL;
 
-		win->drawtex= 0;
-		win->drawmethod= 0;
+		win->drawdata= NULL;
+		win->drawmethod= -1;
+		win->drawfail= 0;
 	}
 	
 	wm->operators.first= wm->operators.last= NULL;
@@ -4459,6 +4460,8 @@
 	ar->swinid= 0;
 	ar->type= NULL;
 	ar->swap= 0;
+	ar->do_draw= 0;
+	memset(&ar->drawrct, 0, sizeof(ar->drawrct));
 }
 
 /* for the saved 2.50 files without regiondata */
@@ -4497,6 +4500,7 @@
 	sc->context= NULL;
 
 	sc->mainwin= sc->subwinactive= 0;	/* indices */
+	sc->swap= 0;
 	
 	/* hacky patch... but people have been saving files with the verse-blender,
 	   causing the handler to keep running for ever, with no means to disable it */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2009-01-23 03:52:52 UTC (rev 18632)
@@ -41,6 +41,7 @@
 struct SpaceType;
 struct AreagionType;
 struct uiBlock;
+struct rcti;
 
 /* regions */
 void	ED_region_do_listen(ARegion *ar, struct wmNotifier *note);
@@ -49,6 +50,7 @@
 void	ED_region_pixelspace(struct ARegion *ar);
 void	ED_region_init(struct bContext *C, struct ARegion *ar);
 void	ED_region_tag_redraw(struct ARegion *ar);
+void	ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
 
 /* spaces */
 void	ED_spacetypes_init(void);

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c	2009-01-23 03:52:52 UTC (rev 18632)
@@ -45,6 +45,7 @@
 
 #include "WM_api.h"
 #include "WM_types.h"
+#include "wm_draw.h"
 #include "wm_subwindow.h"
 #include "wm_window.h"
 
@@ -237,6 +238,8 @@
 
 void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar)
 {
+	ar->regiondata= NULL;
+	wm_draw_region_clear(CTX_wm_window(C), ar);
 	ED_region_exit(C, ar);
 	BKE_area_region_free(NULL, ar);		/* NULL: no spacetype */
 	BLI_freelinkN(&sc->regionbase, ar);
@@ -393,8 +396,6 @@
 void ui_tooltip_free(bContext *C, ARegion *ar)
 {
 	ui_remove_temporary_region(C, CTX_wm_screen(C), ar);
-
-	WM_event_add_notifier(C, NC_WINDOW, NULL);	// XXX provide rect for window
 }
 
 /************************* Creating Menu Blocks **********************/
@@ -711,8 +712,6 @@
 {
 	ui_remove_temporary_region(C, CTX_wm_screen(C), handle->region);
 	MEM_freeN(handle);
-
-	WM_event_add_notifier(C, NC_WINDOW, NULL);	// XXX provide rect for window
 }
 
 /***************************** Menu Button ***************************/

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2009-01-23 03:52:52 UTC (rev 18632)
@@ -192,9 +192,19 @@
 	wmWindow *win= CTX_wm_window(C);
 	ScrArea *sa= CTX_wm_area(C);
 	ARegionType *at= ar->type;
+
+	/* if no partial draw rect set, full rect */
+	if(ar->drawrct.xmin == ar->drawrct.xmax)
+		ar->drawrct= ar->winrct;
 	
+	/* extra clip for safety */
+	ar->drawrct.xmin= MAX2(ar->winrct.xmin, ar->drawrct.xmin);
+	ar->drawrct.ymin= MAX2(ar->winrct.ymin, ar->drawrct.ymin);
+	ar->drawrct.xmax= MIN2(ar->winrct.xmax, ar->drawrct.xmax);
+	ar->drawrct.ymax= MIN2(ar->winrct.ymax, ar->drawrct.ymax);
+	
 	/* note; this sets state, so we can use wmOrtho and friends */
-	wmSubWindowSet(win, ar->swinid);
+	wmSubWindowScissorSet(win, ar->swinid, &ar->drawrct);
 	
 	/* optional header info instead? */
 	if(ar->headerstr) {
@@ -223,6 +233,7 @@
 	ED_region_pixelspace(ar);
 	
 	ar->do_draw= 0;
+	memset(&ar->drawrct, 0, sizeof(ar->drawrct));
 }
 
 /* **********************************
@@ -232,17 +243,38 @@
 
 void ED_region_tag_redraw(ARegion *ar)
 {
-	if(ar)
+	if(ar) {
+		/* zero region means full region redraw */
 		ar->do_draw= 1;
+		memset(&ar->drawrct, 0, sizeof(ar->drawrct));
+	}
 }
 
+void ED_region_tag_redraw_partial(ARegion *ar, rcti *rct)
+{
+	if(ar) {
+		if(!ar->do_draw) {
+			/* no redraw set yet, set partial region */
+			ar->do_draw= 1;
+			ar->drawrct= *rct;
+		}
+		else if(ar->drawrct.xmin != ar->drawrct.xmax) {
+			/* partial redraw already set, expand region */
+			ar->drawrct.xmin= MIN2(ar->drawrct.xmin, rct->xmin);
+			ar->drawrct.ymin= MIN2(ar->drawrct.ymin, rct->ymin);
+			ar->drawrct.xmax= MAX2(ar->drawrct.xmax, rct->xmax);
+			ar->drawrct.ymax= MAX2(ar->drawrct.ymax, rct->ymax);
+		}
+	}
+}
+
 void ED_area_tag_redraw(ScrArea *sa)
 {
 	ARegion *ar;
 	
 	if(sa)
 		for(ar= sa->regionbase.first; ar; ar= ar->next)
-			ar->do_draw= 1;
+			ED_region_tag_redraw(ar);
 }
 
 void ED_area_tag_refresh(ScrArea *sa)

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h	2009-01-23 03:52:52 UTC (rev 18632)
@@ -54,9 +54,10 @@
 	short full, winid;					/* winid from WM, starts with 1 */
 	short do_draw;						/* notifier for drawing edges */
 	short do_refresh;					/* notifier for scale screen, changed screen, etc */
-	short do_gesture;					/* notifier for gesture draw. */
+	short do_draw_gesture;				/* notifier for gesture draw. */
+	short do_draw_paintcursor;			/* notifier for paint cursor draw. */
 	short swap;							/* indicator to survive swap-exchange systems */
-	short pad[2];
+	short pad;
 	
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
@@ -127,6 +128,7 @@
 	
 	View2D v2d;					/* 2D-View scrolling/zoom info (most regions are 2d anyways) */
 	rcti winrct;				/* coordinates of region */
+	rcti drawrct;				/* runtime for partial redraw, same or smaller than winrct */
 	short winx, winy;			/* size */
 	
 	short swinid;

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_userdef_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_userdef_types.h	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_userdef_types.h	2009-01-23 03:52:52 UTC (rev 18632)
@@ -215,6 +215,8 @@
 	
 	short autokey_mode;		/* autokeying mode */
 	short autokey_flag;		/* flags for autokeying */
+
+	int wmdrawmethod, pad;
 	
 	struct ColorBand coba_weight;	/* from texture.h */
 } UserDef;
@@ -325,6 +327,11 @@
 #define USER_VRML_AUTOSCALE		2
 #define USER_VRML_TWOSIDED		4
 
+/* wm draw method */
+#define USER_DRAW_OVERLAP		0
+#define USER_DRAW_TRIPLE		1
+#define USER_DRAW_FULL			2
+
 /* tw_flag (transform widget) */
 
 /* gp_settings (Grease Pencil Settings) */

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2009-01-23 03:52:52 UTC (rev 18632)
@@ -99,9 +99,8 @@
 	
 	struct wmSubWindow *curswin;	/* internal for wm_subwindow.c only */
 
-	unsigned int drawtex;		/* internal for wm_draw.c only */
-	int drawtexw, drawtexh;		/* internal for wm_draw.c only */
-	int drawmethod;				/* internal for wm_draw.c only */
+	int drawmethod, drawfail;	/* internal for wm_draw.c only */
+	void *drawdata;				/* internal for wm_draw.c only */
 	
 	ListBase timers;
 	

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c	2009-01-23 03:41:05 UTC (rev 18631)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_userdef.c	2009-01-23 03:52:52 UTC (rev 18632)
@@ -1513,6 +1513,12 @@
 		{2048, "AUDIO_SAMPLES_2048", "2048", "Set audio mixing buffer size to 2048 samples"},
 		{0, NULL, NULL, NULL}};
 
+	static EnumPropertyItem draw_method_items[] = {
+		{USER_DRAW_TRIPLE, "TRIPLE_BUFFER", "Triple Buffer", "Use a third buffer for minimal redraws at the cost of more memory."},
+		{USER_DRAW_OVERLAP, "OVERLAP", "Overlap", "Redraw all overlapping regions, minimal memory usage but more redraws."},
+		{USER_DRAW_FULL, "FULL", "Full", "Do a full redraw each time, slow, only use for reference or when all else fails."},
+		{0, NULL, NULL, NULL}};
+
 	/* System & OpenGL */
 
 	prop= RNA_def_property(srna, "solid_lights", PROP_COLLECTION, PROP_NONE);
@@ -1592,6 +1598,11 @@
 	RNA_def_property_range(prop, 1, 3600);
 	RNA_def_property_ui_text(prop, "Texture Collection Rate", "Number of seconds between each run of the GL texture garbage collector.");
 
+	prop= RNA_def_property(srna, "window_draw_method", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "wmdrawmethod");
+	RNA_def_property_enum_items(prop, draw_method_items);
+	RNA_def_property_ui_text(prop, "Window Draw Method", "Drawing method used by the window manager.");
+
 	prop= RNA_def_property(srna, "audio_mixing_buffer", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "mixbufsize");
 	RNA_def_property_enum_items(prop, audio_mixing_samples_items);

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list