[Bf-blender-cvs] [5bd7ed4] multiview: Multiview Base Commit 7/10: Window Manager (to draw in stereo 3d)

Dalai Felinto noreply at git.blender.org
Sat May 10 20:18:14 CEST 2014


Commit: 5bd7ed4298af55f95619f2899dc202b288127e04
Author: Dalai Felinto
Date:   Sat May 10 14:58:24 2014 -0300
https://developer.blender.org/rB5bd7ed4298af55f95619f2899dc202b288127e04

Multiview Base Commit 7/10: Window Manager (to draw in stereo 3d)

This is part of the multiview rebase from a github to git.blender.org
repository. The rebase was made based on file areas, so build is likely
broken in some of those parts, but it bulds fine in the end.

The documentation and sample files were removed and now live in:
https://github.com/dfelinto/multiview-samples

The original git history can be found in:
https://github.com/dfelinto/blender/tree/multiview-pre-b3d

Code contributors of the original branch in github:
* Alexey Akishin
* Gabriel Caraballo

Original design made in contribution with Francesco Siddi
Original branch and design partially reviewed by Brecht Van Lommel

===================================================================

M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/windowmanager/CMakeLists.txt
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_operators.c
A	source/blender/windowmanager/intern/wm_stereo.c
M	source/blender/windowmanager/intern/wm_subwindow.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/wm.h
M	source/blender/windowmanager/wm_draw.h
A	source/blender/windowmanager/wm_stereo.h

===================================================================

diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index a17e416..8dbbe4b 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -197,7 +197,7 @@ typedef struct wmWindow {
 	struct wmGesture *tweak;      /* internal for wm_operators.c */
 
 	int drawmethod, drawfail;     /* internal for wm_draw.c only */
-	void *drawdata;               /* internal for wm_draw.c only */
+	ListBase drawdata;            /* internal for wm_draw.c only */
 
 	ListBase queue;               /* all events (ghost level events were handled) */
 	ListBase handlers;            /* window+screen handlers, handled last */
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 5f99329..c1bea22 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -64,6 +64,7 @@ set(SRC
 	intern/wm_operators.c
 	intern/wm_subwindow.c
 	intern/wm_window.c
+	intern/wm_stereo.c
 
 	WM_api.h
 	WM_keymap.h
@@ -76,6 +77,7 @@ set(SRC
 	wm_files.h
 	wm_subwindow.h
 	wm_window.h
+	wm_stereo.h
 )
 
 add_definitions(-DGLEW_STATIC)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 64cada9..2701c91 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -104,6 +104,7 @@ void		WM_window_open_temp	(struct bContext *C, struct rcti *position, int type);
 			/* returns true if draw method is triple buffer */
 bool		WM_is_draw_triple(struct wmWindow *win);
 
+bool		WM_stereo_enabled(wmWindow *win, bool only_fullscreen_test);
 
 
 			/* files */
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 96824ec..d4c66ea 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -165,6 +165,7 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
 			if (ar->swinid) {
 				CTX_wm_region_set(C, ar);
 				ED_region_do_draw(C, ar);
+				ar->do_draw = false;
 				wm_paintcursor_draw(C, ar);
 				CTX_wm_region_set(C, NULL);
 			}
@@ -175,12 +176,14 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
 	}
 
 	ED_screen_draw(win);
+	win->screen->do_draw = false;
 
 	/* draw overlapping regions */
 	for (ar = screen->regionbase.first; ar; ar = ar->next) {
 		if (ar->swinid) {
 			CTX_wm_menu_set(C, ar);
 			ED_region_do_draw(C, ar);
+			ar->do_draw = false;
 			CTX_wm_menu_set(C, NULL);
 		}
 	}
@@ -278,6 +281,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 				if (ar->do_draw) {
 					CTX_wm_region_set(C, ar);
 					ED_region_do_draw(C, ar);
+					ar->do_draw = false;
 					wm_paintcursor_draw(C, ar);
 					CTX_wm_region_set(C, NULL);
 
@@ -288,6 +292,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 					if (ar->swap == WIN_FRONT_OK) {
 						CTX_wm_region_set(C, ar);
 						ED_region_do_draw(C, ar);
+						ar->do_draw = false;
 						wm_paintcursor_draw(C, ar);
 						CTX_wm_region_set(C, NULL);
 
@@ -300,7 +305,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 				}
 			}
 		}
-		
+
 		wm_area_mark_invalid_backbuf(sa);
 		CTX_wm_area_set(C, NULL);
 	}
@@ -308,6 +313,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 	/* after area regions so we can do area 'overlay' drawing */
 	if (screen->do_draw) {
 		ED_screen_draw(win);
+		win->screen->do_draw = false;
 
 		if (exchange)
 			screen->swap = WIN_FRONT_OK;
@@ -315,6 +321,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 	else if (exchange) {
 		if (screen->swap == WIN_FRONT_OK) {
 			ED_screen_draw(win);
+			win->screen->do_draw = false;
 			screen->swap = WIN_BOTH_OK;
 		}
 		else if (screen->swap == WIN_BACK_OK)
@@ -328,6 +335,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
 		if (ar->swinid && ar->do_draw) {
 			CTX_wm_menu_set(C, ar);
 			ED_region_do_draw(C, ar);
+			ar->do_draw = false;
 			CTX_wm_menu_set(C, NULL);
 		}
 	}
@@ -360,15 +368,6 @@ static void wm_method_draw_damage(bContext *C, wmWindow *win)
 /*   used. if not, multiple smaller ones are used, with   */
 /*   worst case wasted space being 23.4% for 3x3 textures */
 
-#define MAX_N_TEX 3
-
-typedef struct wmDrawTriple {
-	GLuint bind[MAX_N_TEX * MAX_N_TEX];
-	int x[MAX_N_TEX], y[MAX_N_TEX];
-	int nx, ny;
-	GLenum target;
-} wmDrawTriple;
-
 static void split_width(int x, int n, int *splitx, int *nx)
 {
 	int a, newnx, waste;
@@ -405,16 +404,13 @@ static void split_width(int x, int n, int *splitx, int *nx)
 	}
 }
 
-static void wm_draw_triple_free(wmWindow *win)
+static void wm_draw_triple_free(wmDrawTriple *triple)
 {
-	if (win->drawdata) {
-		wmDrawTriple *triple = win->drawdata;
+	if (triple) {
 
 		glDeleteTextures(triple->nx * triple->ny, triple->bind);
 
 		MEM_freeN(triple);
-
-		win->drawdata = NULL;
 	}
 }
 
@@ -499,7 +495,7 @@ static int wm_triple_gen_textures(wmWindow *win, wmDrawTriple *triple)
 	return 1;
 }
 
-static void wm_triple_draw_textures(wmWindow *win, wmDrawTriple *triple, float alpha)
+void wm_triple_draw_textures(wmWindow *win, wmDrawTriple *triple, float alpha)
 {
 	const int winsize_x = WM_window_pixels_x(win);
 	const int winsize_y = WM_window_pixels_y(win);
@@ -571,7 +567,7 @@ static void wm_triple_copy_textures(wmWindow *win, wmDrawTriple *triple)
 	glBindTexture(triple->target, 0);
 }
 
-static void wm_draw_region_blend(wmWindow *win, ARegion *ar)
+static void wm_draw_region_blend(wmWindow *win, ARegion *ar, wmDrawTriple *triple)
 {
 	float fac = ED_region_blend_factor(ar);
 	
@@ -580,7 +576,7 @@ static void wm_draw_region_blend(wmWindow *win, ARegion *ar)
 		wmSubWindowScissorSet(win, win->screen->mainwin, &ar->winrct, true);
 
 		glEnable(GL_BLEND);
-		wm_triple_draw_textures(win, win->drawdata, 1.0f - fac);
+		wm_triple_draw_textures(win, triple, 1.0f - fac);
 		glDisable(GL_BLEND);
 	}
 }
@@ -589,29 +585,44 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
 	wmDrawTriple *triple;
+	wmDrawData *dd, *drawdata = (wmDrawData *) win->drawdata.first;
 	bScreen *screen = win->screen;
 	ScrArea *sa;
 	ARegion *ar;
-	int copytex = 0, paintcursor = 1;
+	int copytex = false, paintcursor = true;
 
-	if (win->drawdata) {
+	if (drawdata && drawdata->triple) {
 		glClearColor(0, 0, 0, 0);
 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 		wmSubWindowSet(win, screen->mainwin);
 
-		wm_triple_draw_textures(win, win->drawdata, 1.0f);
+		wm_triple_draw_textures(win, drawdata->triple, 1.0f);
 	}
 	else {
-		win->drawdata = MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple");
+		/* we run it when we start OR when we turn stereo on */
+		if (drawdata == NULL) {
+			drawdata = MEM_callocN(sizeof(wmDrawData), "wmDrawData");
+			BLI_addhead(&win->drawdata, drawdata);
+		}
+
+		drawdata->triple = MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple");
 
-		if (!wm_triple_gen_textures(win, win->drawdata)) {
+		if (!wm_triple_gen_textures(win, drawdata->triple)) {
 			wm_draw_triple_fail(C, win);
 			return;
 		}
 	}
 
-	triple = win->drawdata;
+	/* it means stereo was just turned off */
+	/* note: we are removing all drawdatas that are not the first */
+	for (dd = drawdata->next; dd; dd = dd->next) {
+		wm_draw_triple_free(dd->triple);
+		BLI_remlink(&win->drawdata, dd);
+		MEM_freeN(dd);
+	}
+
+	triple = drawdata->triple;
 
 	/* draw marked area regions */
 	for (sa = screen->areabase.first; sa; sa = sa->next) {
@@ -619,16 +630,17 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
 
 		for (ar = sa->regionbase.first; ar; ar = ar->next) {
 			if (ar->swinid && ar->do_draw) {
-				
-				if (ar->overlap == 0) {
+
+				if (ar->overlap == false) {
 					CTX_wm_region_set(C, ar);
 					ED_region_do_draw(C, ar);
+					ar->do_draw = false;
 					CTX_wm_region_set(C, NULL);
-					copytex = 1;
+					copytex = true;
 				}
 			}
 		}
-		
+
 		wm_area_mark_invalid_backbuf(sa);
 		CTX_wm_area_set(C, NULL);
 	}
@@ -662,14 +674,15 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
 	/* draw overlapping area regions (always like popups) */
 	for (sa = screen->areabase.first; sa; sa = sa->next) {
 		CTX_wm_area_set(C, sa);
-		
+
 		for (ar = sa->regionbase.first; ar; ar = ar->next) {
 			if (ar->swinid && ar->overlap) {
 				CTX_wm_region_set(C, ar);
 				ED_region_do_draw(C, ar);
+				ar->do_draw = false;
 				CTX_wm_region_set(C, NULL);
-				
-				wm_draw_region_blend(win, ar);
+
+				wm_draw_region_blend(win, ar, triple);
 			}
 		}
 
@@ -678,28 +691,187 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
 
 	/* after area regions so we can do area 'overlay' drawing */
 	ED_screen_draw(win);
+	win->screen->do_draw = false;
 
 	/* draw floating regions (menus) */
 	for (ar = screen->regionbase.first; ar; ar = ar->next) {
 		if (ar->swinid) {
 			CTX_wm_menu_set(C, ar);
 			ED_region_do_draw(C, ar);
+			ar->do_draw = false;
 			CTX_wm_menu_set(C, NULL);
 			/* when a menu is being drawn, don't do the paint cursors */
-			paintcursor = 0;
+			paintcursor = false;
 		}
 	}
 
 	/* always draw, not only when screen tagged */
 	if (win->gesture.first)
 		wm_gesture_draw(win);
-	
+
 	/* needs pixel coords in screen */
 	if (wm->drags.first) {
 		wm_drags_draw(C, win, NULL);
 	}
 }
 
+static void wm_method_draw_triple_multiview(bContext *C, wmWindow *win, StereoViews sview)
+{
+	wmWindowManager *wm = CTX_wm_manager(C);
+	wmDrawData *drawdata;
+	wmDrawTriple *triple_data, *triple_all;
+	bScreen *screen = win->screen;
+	ScrArea *sa;
+	ARegion *ar;
+	int copytex = false, paintcursor = true;
+	int id;
+
+	/* we store the triple_data in sequence to triple_all */
+	for (id=0;id < 2;id++) {
+		drawdata = BLI_findlink(&win->drawdata, (sview * 2) + id);
+
+		if (drawdata && drawdata->triple) {
+			glClearColor(0, 0, 0, 0);
+			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+			wmSubWindowSet(win, screen->mainwin);
+
+			wm_triple_draw_textures(w

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list