[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