[Bf-blender-cvs] [0bfc90a] multiview: Multiview: refactor of UV/Image editor and image flags

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


Commit: 0bfc90a317d040179353b817c640e7487e62d03a
Author: Dalai Felinto
Date:   Sat May 10 15:00:03 2014 -0300
https://developer.blender.org/rB0bfc90a317d040179353b817c640e7487e62d03a

Multiview: refactor of UV/Image editor and image flags

* showing 3d only when image is 3d and show 3d is on
* improve logic in 3dview to only handle 3d when in camera
* setting show_stereo as default mode for image editor
* image and Imageuser flags re-arranged
* image IMA_IS_STEREO flag set when opening image =)

* missing: rendered image needs to be tagged as IMA_IS_STEREO too
* also in some cases I need to force to see a different render layer to
  get everything working

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

M	release/scripts/startup/bl_ui/space_image.py
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_draw.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/imbuf/intern/openexr/openexr_api.cpp
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_image.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/render/intern/source/render_result.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_stereo.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index f19e77e..0277b7e 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -430,6 +430,10 @@ class IMAGE_HT_header(Header):
 
         if ima:
             # layers
+            if sima.is_stereo:
+                row = layout.row()
+                row.prop(sima, "show_stereo", text="")
+
             layout.template_image_layers(ima, iuser)
 
             # draw options
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 1545d66..926570e 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2379,20 +2379,33 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
 
 	if (iuser) {
 		short index = 0, rl_index = 0, rp_index;
+		short view;
+		bool is_stereo = RE_HasStereo3D(rr) && (iuser->flag & IMA_SHOW_STEREO);
+
+		view = is_stereo ? iuser->eye : iuser->view;
 
 		for (rl = rr->layers.first; rl; rl = rl->next, rl_index++) {
 			rp_index = 0;
-			for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++, rp_index++)
-				if (iuser->layer == rl_index && iuser->pass == rp_index)
+
+			for (rpass = rl->passes.first; rpass; rpass = rpass->next, index++, rp_index++) {
+				if (iuser->layer == rl_index &&
+				    iuser->passtype == rpass->passtype &&
+				    view == rpass->view_id) {
 					break;
+				}
+			}
 			if (rpass)
 				break;
 		}
 
-		if (rpass)
+		if (rpass) {
 			iuser->multi_index = index;
-		else
+			iuser->pass = rp_index;
+		}
+		else {
 			iuser->multi_index = 0;
+			iuser->pass = 0;
+		}
 	}
 	if (rpass == NULL) {
 		rl = rr->layers.first;
@@ -2467,6 +2480,19 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
 		ima->rr->framenr = framenr;
 }
 
+static void image_check_stereo(Image *ima)
+{
+	if (!ima->rr) {
+		ima->flag &= ~IMA_IS_STEREO;
+		return;
+	}
+
+	if (RE_HasStereo3D(ima->rr))
+		ima->flag |= IMA_IS_STEREO;
+	else
+		ima->flag &= ~IMA_IS_STEREO;
+}
+
 /* common stuff to do with images after loading */
 static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
 {
@@ -2484,6 +2510,8 @@ static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
 
 	ima->ok = IMA_OK_LOADED;
 
+	/* set proper stereo 3d flag */
+	image_check_stereo(ima);
 }
 
 static int imbuf_alpha_flags_for_image(Image *ima)
@@ -2782,7 +2810,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
 	pass = iuser->pass;
 	actview = iuser->view;
 
-	if (iuser->flag & IMA_STEREO3D) {
+	if ((iuser->flag & IMA_SHOW_STEREO) && (ima->flag & IMA_IS_STEREO)) {
 		/* view == 0 shows stereo */
 		if (actview == 0)
 			actview = iuser->eye;
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index a50d753..4de22ed 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -43,6 +43,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_camera_types.h"
+#include "DNA_view3d_types.h"
 
 #include "DNA_genfile.h"
 
@@ -285,6 +286,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 		Scene *scene;
 		SceneRenderView *srv;
 		Camera *cam;
+		bScreen *screen;
 
 		if (!DNA_struct_elem_find(fd->filesdna, "RenderData", "ListBase", "views")) {
 			for (scene = main->scene.first; scene; scene = scene->id.next) {
@@ -298,6 +300,30 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 
+		for (screen = main->screen.first; screen; screen = screen->id.next) {
+			ScrArea *sa;
+			for (sa = screen->areabase.first; sa; sa = sa->next) {
+				SpaceLink *sl;
+
+				for (sl = sa->spacedata.first; sl; sl= sl->next) {
+					switch (sl->spacetype) {
+						case SPACE_VIEW3D:
+						{
+							View3D *v3d = (View3D*) sl;
+							v3d->stereo_camera = STEREO_3D_ID;
+							break;
+						}
+						case SPACE_IMAGE:
+						{
+							SpaceImage *sima = (SpaceImage *) sl;
+							sima->iuser.flag |= IMA_SHOW_STEREO;
+							break;
+						}
+					}
+				}
+			}
+		}
+
 		if (!DNA_struct_elem_find(fd->filesdna, "Camera", "CameraStereoSettings", "stereo")) {
 			for (cam = main->camera.first; cam; cam = cam->id.next) {
 				cam->stereo.interocular_distance = 0.065;
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 1a4619c..108e32e 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -393,7 +393,7 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *
 	fake_name = ui_imageuser_pass_fake_name(rl);
 
 	if (fake_name) {
-		BLI_strncpy(rpass_fake.internal_name, fake_name, sizeof(rpass_fake.name));
+		BLI_strncpy(rpass_fake.internal_name, fake_name, sizeof(rpass_fake.internal_name));
 		nr += 1;
 	}
 
@@ -408,7 +408,7 @@ static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *
 
 final:
 		uiDefButS(block, BUTM, B_NOP, IFACE_(rpass->internal_name), 0, 0,
-		          UI_UNIT_X * 5, UI_UNIT_X, &iuser->pass, (float) nr, 0.0, 0, -1, "");
+		          UI_UNIT_X * 5, UI_UNIT_X, &iuser->passtype, (float) rpass->passtype, 0.0, 0, -1, "");
 	}
 
 	if (fake_name) {
@@ -449,100 +449,15 @@ static void ui_imageuser_view_menu(bContext *UNUSED(C), uiLayout *layout, void *
 	BLI_assert(nr == -1);
 }
 
-/* get the view for the current eye */
-static int get_view_from_renderesult(RenderResult *rr, const char *viewname)
-{
-	RenderView *rv;
-	int nr;
-
-	for (nr=0, rv = (RenderView *)rr->views.first; rv; rv=rv->next, nr++) {
-
-		if (strcmp(rv->name, viewname) == 0)
-			return nr;
-	}
-
-	return 0;
-}
-
-/* return the real pass id */
-/* similar to get_multiview_pass_id in image_ops.c */
-static int get_pass_id(RenderResult *rr, ImageUser *iuser)
-{
-	RenderLayer *rl;
-	RenderPass *rpass = NULL;
-	int passtype;
-	short rl_index = 0, rp_index;
-	int view_id = iuser->view;
-
-	int view_left, view_right;
-	int show_stereo3d = false;
-
-	if (rr == NULL || iuser == NULL)
-		return 0;
-
-	if (BLI_countlist(&rr->views) < 2)
-		return iuser->pass_tmp;
-
-	/* view == 0 shows stereo */
-	if ((iuser->flag & IMA_STEREO3D)) {
-		if(view_id-- == 0)
-			show_stereo3d = true;
-	}
-
-	if (show_stereo3d) {
-		view_right = get_view_from_renderesult(rr, STEREO_RIGHT_NAME);
-		view_left = get_view_from_renderesult(rr, STEREO_LEFT_NAME);
-	}
-
-	if (RE_HasFakeLayer(rr))
-		rl_index ++; /* fake compo/sequencer layer */
-
-	rl = BLI_findlink(&rr->layers, rl_index);
-	if (!rl) return iuser->pass_tmp;
-
-	rp_index = 0;
-	passtype = 0;
-	for (rpass = rl->passes.first; rpass; rpass = rpass->next, rp_index++) {
-		if (iuser->pass_tmp == rp_index)
-			passtype = rpass->passtype;
-
-		if (rpass->passtype == passtype) {
-			if (show_stereo3d == false) {
-				if (rpass->view_id == view_id)
-					return rp_index;
-			}
-			else {
-				if (rpass->view_id == view_right)
-					iuser->pass_right = rp_index;
-				else if (rpass->view_id == view_left)
-					iuser->pass_left = rp_index;
-			}
-		}
-	}
-
-	if (show_stereo3d == true) {
-		iuser->pass = iuser->pass_right;
-		BKE_image_multilayer_index(rr, iuser);
-		iuser->multi_index_right = iuser->multi_index;
-
-		iuser->pass = iuser->pass_left;
-		BKE_image_multilayer_index(rr, iuser);
-		iuser->multi_index_left = iuser->multi_index;
-	}
-
-	return iuser->pass_tmp;
-}
-
 /* 5 layer button callbacks... */
 static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v) 
 {
 	ImageUser *iuser = iuser_v;
 
-	iuser->pass = get_pass_id(rr_v, iuser);
-
 	BKE_image_multilayer_index(rr_v, iuser); 
 	WM_event_add_notifier(C, NC_IMAGE | ND_DRAW, NULL);
 }
+
 static void image_multi_inclay_cb(bContext *C, void *rr_v, void *iuser_v) 
 {
 	RenderResult *rr = rr_v;
@@ -666,13 +581,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
 		fake_name = ui_imageuser_pass_fake_name(rl);
 		rpass = (rl ? BLI_findlink(&rl->passes, iuser->pass  - (fake_name ? 1 : 0)) : NULL);
 
-		display_name = rpass ? rpass->name : (fake_name ? fake_name : "");
+		display_name = rpass ? rpass->internal_name : (fake_name ? fake_name : "");
 		but = uiDefMenuBut(block, ui_imageuser_pass_menu, rnd_pt, display_name, 0, 0, wmenu3, UI_UNIT_Y, TIP_("Select Pass"));
 		uiButSetFunc(but, image_multi_cb, rr, iuser);
 		uiButSetMenuFromPulldown(but);
 
 		/* view */
-		if (BLI_countlist(&rr->views) > 1) {
+		if (BLI_countlist(&rr->views) > 1 && ((iuser->flag & IMA_SHOW_STEREO) == 0)) {
 			rview = BLI_findlink(&rr->views, iuser->view);
 			display_name = rview ? rview->name : "";
 
@@ -680,8 +595,6 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
 			uiButSetFunc(but, image_multi_cb, rr, iuser);
 			uiButSetMenuFromPulldown(but);
 		}
-		else
-			iuser->flag &= ~IMA_STEREO3D;
 	}
 }
 
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 45d4086..74fc3f5 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -801,7 +801,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
 	Image *ima;
 	ImBuf *ibuf;
 	float zoomx, zoomy;
-	bool show_viewer, show_render, show_paint;
+	bool show_viewer, show_render, show_paint, show_stereo3d;
 	void *lock;
 
 	/* XXX can we do this in refresh? */
@@ -831,6 +831,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
 	show_viewer = (ima && ima->source == IMA_SRC_VIEWER) != 0;
 	show_render = (show_viewer && ima->type == IMA_TYPE_R_RESULT) != 0;
 	show_paint = (ima && (sima->mode == SI_MODE_PAINT) && (show_viewer == false) && (show_render == false));
+	show_stereo3d = (ima && ima->rr && (ima->flag & IMA_IS_STEREO) && (sima->iuser.flag & IMA_SHOW_STEREO));
 
 	if (show_viewer) {
 		/* use locked draw for drawing viewer image buffer since the compositor
@@ -841,18 +842,9 @@ void draw_image_main(const bContext *C, ARegion *ar)
 		BLI_lock_thread(LOCK_DRAW_IMAGE);
 	}
 
-	/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list