[Bf-blender-cvs] [1e2ddc4] multiview: Viewer Node: Backend work to get viewer node working for multiview

Dalai Felinto noreply at git.blender.org
Tue Aug 19 15:22:21 CEST 2014


Commit: 1e2ddc45c1e099f17e1a818f1c605ca513f26427
Author: Dalai Felinto
Date:   Mon Aug 18 19:27:40 2014 +0200
Branches: multiview
https://developer.blender.org/rB1e2ddc45c1e099f17e1a818f1c605ca513f26427

Viewer Node: Backend work to get viewer node working for multiview

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

M	source/blender/blenkernel/intern/image.c
M	source/blender/compositor/nodes/COM_ViewerNode.cpp
M	source/blender/compositor/operations/COM_ViewerOperation.cpp
M	source/blender/compositor/operations/COM_ViewerOperation.h
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_draw.c

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

diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index f01eeed..d5cb1e1 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2433,10 +2433,18 @@ bool BKE_image_is_stereo(Scene *scene, Image *ima)
 
 static void image_set_stereo_flag(Image *ima, RenderResult *rr)
 {
-	if (rr && RE_RenderResult_is_stereo(rr))
-		ima->flag |= IMA_IS_STEREO;
-	else
+	if (rr) {
+		if (RE_RenderResult_is_stereo(rr))
+			ima->flag |= IMA_IS_STEREO;
+		else
+			ima->flag &= ~IMA_IS_STEREO;
+	}
+	else if (ima->source == IMA_SRC_VIEWER &&
+	         ima->type == IMA_TYPE_COMPOSITE) {
+	}
+	else {
 		ima->flag &= ~IMA_IS_STEREO;
+	}
 }
 
 RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
@@ -3152,13 +3160,22 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
 
 					/* XXX anim play for viewer nodes not yet supported */
 					frame = 0; // XXX iuser ? iuser->framenr : 0;
-					ibuf = image_get_cached_ibuf_for_index_frame(ima, 0, frame);
+
+					if ((ima->flag & IMA_IS_STEREO) &&
+					    (iuser->flag & IMA_SHOW_STEREO))
+					{
+						index = iuser->eye;
+					}
+					else {
+						index = (iuser ? iuser->view : 0);
+					}
+					ibuf = image_get_cached_ibuf_for_index_frame(ima, index, frame);
 
 					if (!ibuf) {
 						/* Composite Viewer, all handled in compositor */
 						/* fake ibuf, will be filled in compositor */
 						ibuf = IMB_allocImBuf(256, 256, 32, IB_rect);
-						image_assign_ibuf(ima, ibuf, 0, frame);
+						image_assign_ibuf(ima, ibuf, index, frame);
 					}
 				}
 			}
diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp
index 07aa960..d3df5d5 100644
--- a/source/blender/compositor/nodes/COM_ViewerNode.cpp
+++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp
@@ -22,6 +22,7 @@
 
 #include "COM_ViewerNode.h"
 #include "BKE_global.h"
+#include "BLI_listbase.h"
 
 #include "COM_ViewerOperation.h"
 #include "COM_ExecutionSystem.h"
@@ -31,6 +32,20 @@ ViewerNode::ViewerNode(bNode *editorNode) : Node(editorNode)
 	/* pass */
 }
 
+static bool ViewerNodeIsStereo(const RenderData *rd)
+{
+	SceneRenderView *srv[2];
+
+	if ((rd->scemode & R_MULTIVIEW) == 0)
+		return false;
+
+	srv[0] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_LEFT_NAME, offsetof(SceneRenderView, name));
+	srv[1] = (SceneRenderView *)BLI_findstring(&rd->views, STEREO_RIGHT_NAME, offsetof(SceneRenderView, name));
+
+	return (srv[0] && ((srv[0]->viewflag & SCE_VIEW_DISABLE) == 0) &&
+	        srv[1] && ((srv[1]->viewflag & SCE_VIEW_DISABLE) == 0));
+}
+
 void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const
 {
 	bNode *editorNode = this->getbNode();
@@ -51,6 +66,7 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC
 	viewerOperation->setCenterY(editorNode->custom4);
 	/* alpha socket gives either 1 or a custom alpha value if "use alpha" is enabled */
 	viewerOperation->setUseAlphaInput(ignore_alpha || alphaSocket->isLinked());
+	viewerOperation->setViewId(context.getViewId());
 
 	viewerOperation->setViewSettings(context.getViewSettings());
 	viewerOperation->setDisplaySettings(context.getDisplaySettings());
@@ -75,4 +91,16 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC
 
 	if (do_output)
 		converter.registerViewer(viewerOperation);
+
+	if (image) {
+		BLI_lock_thread(LOCK_DRAW_IMAGE);
+		if (ViewerNodeIsStereo(context.getRenderData())) {
+			image->flag |= IMA_IS_STEREO;
+		}
+		else {
+			image->flag &= ~IMA_IS_STEREO;
+			imageUser->flag &= ~IMA_SHOW_STEREO;
+		}
+		BLI_unlock_thread(LOCK_DRAW_IMAGE);
+	}
 }
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cpp b/source/blender/compositor/operations/COM_ViewerOperation.cpp
index 53c0acd..4e0d39f 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.cpp
+++ b/source/blender/compositor/operations/COM_ViewerOperation.cpp
@@ -124,7 +124,14 @@ void ViewerOperation::initImage()
 {
 	Image *ima = this->m_image;
 	void *lock;
-	ImBuf *ibuf = BKE_image_acquire_ibuf(ima, this->m_imageUser, &lock);
+	ImBuf *ibuf;
+	ImageUser iuser = *this->m_imageUser;
+
+	/* local changes to the original ImageUser */
+	iuser.view = this->m_actview;
+	iuser.flag &= ~IMA_SHOW_STEREO;
+
+	ibuf = BKE_image_acquire_ibuf(ima, &iuser, &lock);
 
 	if (!ibuf) return;
 	BLI_lock_thread(LOCK_DRAW_IMAGE);
diff --git a/source/blender/compositor/operations/COM_ViewerOperation.h b/source/blender/compositor/operations/COM_ViewerOperation.h
index dcc7ffa..2a7719b 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.h
+++ b/source/blender/compositor/operations/COM_ViewerOperation.h
@@ -33,6 +33,7 @@ private:
 	float *m_depthBuffer;
 	Image *m_image;
 	ImageUser *m_imageUser;
+	int m_actview;
 	bool m_active;
 	float m_centerX;
 	float m_centerY;
@@ -67,6 +68,7 @@ public:
 	const CompositorPriority getRenderPriority() const;
 	bool isViewerOperation() const { return true; }
 	void setUseAlphaInput(bool value) { this->m_useAlphaInput = value; }
+	void setViewId(int actview) { this->m_actview = actview; }
 
 	void setViewSettings(const ColorManagedViewSettings *viewSettings) { this->m_viewSettings = viewSettings; }
 	void setDisplaySettings(const ColorManagedDisplaySettings *displaySettings) { this->m_displaySettings = displaySettings; }
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index cab326c..dc9fb3a 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -420,7 +420,37 @@ final:
 	BLI_assert(nr == -1);
 }
 
-static void ui_imageuser_view_menu(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p)
+static void ui_imageuser_view_menu_viewer(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p)
+{
+	void **ptrpair = ptrpair_p;
+	uiBlock *block = uiLayoutGetBlock(layout);
+	ImageUser *iuser = ptrpair[1];
+	RenderData *rd = ptrpair[3];
+	SceneRenderView *srv;
+	int nr;
+
+	uiBlockSetCurLayout(block, layout);
+	uiLayoutColumn(layout, false);
+
+	uiDefBut(block, LABEL, 0, IFACE_("View"),
+	         0, 0, UI_UNIT_X * 5, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+
+	uiItemS(layout);
+
+	nr = 0;
+	for (srv = rd ? rd->views.first : NULL; srv; srv = srv->next) {
+		if ((srv->viewflag & SCE_VIEW_DISABLE))
+			continue;
+
+		uiDefButS(block, BUTM, B_NOP, IFACE_(srv->name), 0, 0,
+		          UI_UNIT_X * 5, UI_UNIT_X, &iuser->view, (float) nr++, 0.0, 0, -1, "");
+	}
+
+	if (iuser->view >= nr)
+		iuser->view = 0;
+}
+
+static void ui_imageuser_view_menu_rr(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p)
 {
 	void **ptrpair = ptrpair_p;
 	uiBlock *block = uiLayoutGetBlock(layout);
@@ -530,15 +560,17 @@ static void image_user_change(bContext *C, void *iuser_v, void *unused)
 }
 #endif
 
-static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w, short *render_slot)
+/* we only pass RenderData if image is stereo and from a Viewer Node */
+static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, RenderData *rd, ImageUser *iuser, int w, short *render_slot)
 {
-	static void *rnd_pt[3];  /* XXX, workaround */
+	static void *rnd_pt[4];  /* XXX, workaround */
 	uiBlock *block = uiLayoutGetBlock(layout);
 	uiBut *but;
 	RenderLayer *rl = NULL;
 	int wmenu1, wmenu2, wmenu3, wmenu4;
 	const char *fake_name;
-	const char *display_name;
+	const char *display_name = "";
+	const bool show_stereo = (iuser->flag & IMA_SHOW_STEREO);
 
 	uiLayoutRow(layout, true);
 
@@ -551,6 +583,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
 	rnd_pt[0] = rr;
 	rnd_pt[1] = iuser;
 	rnd_pt[2] = NULL;
+	rnd_pt[3] = NULL;
 
 	/* menu buts */
 	if (render_slot) {
@@ -587,15 +620,35 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image
 		uiButSetMenuFromPulldown(but);
 
 		/* view */
-		if (BLI_countlist(&rr->views) > 1 && ((iuser->flag & IMA_SHOW_STEREO) == 0)) {
+		if (BLI_countlist(&rr->views) > 1 && !show_stereo) {
 			rview = BLI_findlink(&rr->views, iuser->view);
 			display_name = rview ? rview->name : "";
 
-			but = uiDefMenuBut(block, ui_imageuser_view_menu, rnd_pt, display_name, 0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
+			but = uiDefMenuBut(block, ui_imageuser_view_menu_rr, rnd_pt, display_name, 0, 0, wmenu4, UI_UNIT_Y, TIP_("Select View"));
 			uiButSetFunc(but, image_multi_cb, rr, iuser);
 			uiButSetMenuFromPulldown(but);
 		}
 	}
+
+	/* we only pass rd if image is stereo and showing viewer for the compositor */
+	else if (rd && !show_stereo) {
+		SceneRenderView *srv;
+		int nr = 0;
+		rnd_pt[3] = rd;
+
+		for (srv = rd->views.first; srv; srv = srv->next) {
+			if ((srv->viewflag & SCE_VIEW_DISABLE))
+				continue;
+
+			if (nr++ == iuser->view) {
+				display_name = srv->name;
+				break;
+			}
+		}
+
+		but = uiDefMenuBut(block, ui_imageuser_view_menu_viewer, rnd_pt, display_name, 0, 0, wmenu1, UI_UNIT_Y, TIP_("Select View"));
+		uiButSetMenuFromPulldown(but);
+	}
 }
 
 static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, short *render_slot)
@@ -620,7 +673,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr,
 	but = uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT,  0, 0, 0.90f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Next Layer"));
 	uiButSetFunc(but, image_multi_inclay_cb, rr, iuser);
 
-	uiblock_layer_pass_buttons(row, rr, iuser, 230 * dpi_fac, render_slot);
+	uiblock_layer_pass_buttons(row, rr, NULL, iuser, 230 * dpi_fac, render_slot);
 
 	/* decrease, increase arrows */
 	but = uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT,   0, 0, 0.85f * UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, TIP_("Previous Pass"));
@@ -1028,10 +1081,14 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
 	if (ima && iuser) {
 		const float dpi_fac = UI_DPI_FAC;
 		RenderResult *rr;
+		bool is_viewer_stereo = ima->source == IMA_SRC_VIEWER &&
+		                        i

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list