[Bf-blender-cvs] [610a66b] multiview: Compositor: Image Node to work correctly with MultiView images
Dalai Felinto
noreply at git.blender.org
Tue Aug 26 02:44:33 CEST 2014
Commit: 610a66bf8c547d084e61aac338976e3f312ee3c4
Author: Dalai Felinto
Date: Tue Aug 26 02:42:10 2014 +0200
Branches: multiview
https://developer.blender.org/rB610a66bf8c547d084e61aac338976e3f312ee3c4
Compositor: Image Node to work correctly with MultiView images
===================================================================
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/intern/image.c
M source/blender/compositor/nodes/COM_ImageNode.cpp
M source/blender/compositor/nodes/COM_ImageNode.h
M source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
M source/blender/compositor/operations/COM_MultilayerImageOperation.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index e9f02e3..c83d1f3 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -196,9 +196,6 @@ void BKE_image_update_frame(const struct Main *bmain, int cfra);
/* sets index offset for multilayer files */
struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser);
-/* sets index offset for multiview files */
-struct RenderPass *BKE_image_multiview_index(struct RenderResult *rr, struct ImageUser *iuser);
-
/* for multilayer images as well as for render-viewer */
bool BKE_image_is_stereo(struct Scene *scene, struct Image *ima);
struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, struct Image *ima);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 832082d..d85d08f 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2388,11 +2388,10 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
return NULL;
if (iuser) {
- short index = 0, rl_index = 0, rp_index;
- short view;
+ short index = 0, rv_index, rl_index = 0, rp_index;
bool is_stereo = RE_RenderResult_is_stereo(rr) && (iuser->flag & IMA_SHOW_STEREO);
- view = is_stereo ? iuser->eye : iuser->view;
+ rv_index = is_stereo ? iuser->eye : iuser->view;
for (rl = rr->layers.first; rl; rl = rl->next, rl_index++) {
rp_index = 0;
@@ -2400,7 +2399,7 @@ RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
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) {
+ rv_index == rpass->view_id) {
break;
}
}
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp
index 5cca55e..5c238b2 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.cpp
+++ b/source/blender/compositor/nodes/COM_ImageNode.cpp
@@ -39,19 +39,19 @@ ImageNode::ImageNode(bNode *editorNode) : Node(editorNode)
}
NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter, RenderLayer *rl, Image *image, ImageUser *user,
- int framenumber, int outputsocketIndex, int passindex, DataType datatype) const
+ int framenumber, int outputsocketIndex, int passtype, int view, DataType datatype) const
{
NodeOutput *outputSocket = this->getOutputSocket(outputsocketIndex);
MultilayerBaseOperation *operation = NULL;
switch (datatype) {
case COM_DT_VALUE:
- operation = new MultilayerValueOperation(passindex);
+ operation = new MultilayerValueOperation(passtype, view);
break;
case COM_DT_VECTOR:
- operation = new MultilayerVectorOperation(passindex);
+ operation = new MultilayerVectorOperation(passtype, view);
break;
case COM_DT_COLOR:
- operation = new MultilayerColorOperation(passindex);
+ operation = new MultilayerColorOperation(passtype, view);
break;
default:
break;
@@ -67,42 +67,6 @@ NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter, RenderLaye
return operation;
}
-int ImageNode::getPassIndex(const CompositorContext &context, ListBase *passes, ListBase *views, int passindex, int view_ui) const
-{
- if (BLI_countlist(views) < 2)
- return passindex;
-
- const RenderData *rd= context.getRenderData();
- int actview = context.getViewId();
-
- bool is_multiview = (view_ui == 0); /* if view selected == All (0) */
- RenderView *rv;
- const char *view = NULL;
-
- if (! is_multiview) {
- rv = (RenderView *)BLI_findlink(views, view_ui - 1);
- view = rv->name;
- }
- else {
- /* heuristic to match image name with scene names */
- view = this->RenderData_get_actview_name(rd, actview);
-
- /* this should never happen, but it doesn't hurt to be safe */
- if (view == NULL)
- return passindex;
-
- /* check if the view name exists in the image */
- if(! BLI_findstring(views, view, offsetof(RenderView, name)))
- return passindex;
- }
-
- RenderPass *rpass = (RenderPass *)BLI_findlink(passes, passindex);
- char passname[64];
-
- sprintf(passname, "%s.%s", rpass->internal_name, view);
- return BLI_findstringindex(passes, passname, offsetof(RenderPass, name));
-}
-
void ImageNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const
{
/// Image output
@@ -131,39 +95,39 @@ void ImageNode::convertToOperations(NodeConverter &converter, const CompositorCo
NodeOperation *operation = NULL;
socket = this->getOutputSocket(index);
bNodeSocket *bnodeSocket = socket->getbNodeSocket();
- /* Passes in the file can differ from passes stored in sockets (#36755).
- * Look up the correct file pass using the socket identifier instead.
- */
-#if 0
- NodeImageLayer *storage = (NodeImageLayer *)bnodeSocket->storage;*/
- int passindex = getPassIndex(context, &rl->passes, &image->rr->views, storage->pass_index, imageuser->view);
- RenderPass *rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex);
-#endif
- int passindex;
- RenderPass *rpass;
- for (rpass = (RenderPass *)rl->passes.first, passindex = 0; rpass; rpass = rpass->next, ++passindex)
- if (STREQ(rpass->name, bnodeSocket->identifier))
- break;
+ RenderPass *rpass = (RenderPass*) BLI_findstring(&rl->passes, bnodeSocket->identifier, offsetof(RenderPass, internal_name));
+
+ int view = (rpass ? rpass->view_id : 0);
+ /* returns the image view to use for the current active view */
if (BLI_countlist(&image->rr->views) > 1) {
- NodeImageLayer *storage = (NodeImageLayer *)bnodeSocket->storage;
- passindex = getPassIndex(context, &rl->passes, &image->rr->views, storage->pass_index, imageuser->view);
- rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex);
+ const int view_image = imageuser->view;
+ const bool is_allview = (view_image == 0); /* if view selected == All (0) */
+
+ if (is_allview) {
+ /* heuristic to match image name with scene names */
+ const char *view_name = this->RenderData_get_actview_name(context.getRenderData(), context.getViewId());
+
+ /* check if the view name exists in the image */
+ view = BLI_findstringindex(&image->rr->views, view_name, offsetof(RenderView, name));
+ }
+ else {
+ view = view_image - 1;
+ }
}
if (rpass) {
- imageuser->pass = passindex;
switch (rpass->channels) {
case 1:
- operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_VALUE);
+ operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, rpass->passtype, view, COM_DT_VALUE);
break;
/* using image operations for both 3 and 4 channels (RGB and RGBA respectively) */
/* XXX any way to detect actual vector images? */
case 3:
- operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_VECTOR);
+ operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, rpass->passtype, view, COM_DT_VECTOR);
break;
case 4:
- operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_COLOR);
+ operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, rpass->passtype, view, COM_DT_COLOR);
break;
default:
/* dummy operation is added below */
diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h
index d9e6eff..2677945 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.h
+++ b/source/blender/compositor/nodes/COM_ImageNode.h
@@ -36,8 +36,7 @@ extern "C" {
class ImageNode : public Node {
private:
NodeOperation *doMultilayerCheck(NodeConverter &converter, RenderLayer *rl, Image *image, ImageUser *user,
- int framenumber, int outputsocketIndex, int passindex, DataType datatype) const;
- int getPassIndex(const CompositorContext &context, struct ListBase *passes, struct ListBase *views, int passindex, int view_id) const;
+ int framenumber, int outputsocketIndex, int passtype, int view, DataType datatype) const;
public:
ImageNode(bNode *editorNode);
void convertToOperations(NodeConverter &converter, const CompositorContext &context) const;
diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
index 23fba5a..6a532f7 100644
--- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
+++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
@@ -27,18 +27,27 @@ extern "C" {
# include "IMB_imbuf_types.h"
}
-MultilayerBaseOperation::MultilayerBaseOperation(int passindex) : BaseImageOperation()
+MultilayerBaseOperation::MultilayerBaseOperation(int passtype, int view) : BaseImageOperation()
{
- this->m_passId = passindex;
+ this->m_passtype = passtype;
+ this->m_view = view;
}
+
ImBuf *MultilayerBaseOperation::getImBuf()
{
- RenderPass *rpass = (RenderPass *)BLI_findlink(&this->m_renderlayer->passes, this->m_passId);
- if (rpass) {
- this->m_imageUser->pass = m_passId;
- BKE_image_multilayer_index(this->m_image->rr, this->m_imageUser);
- return BaseImageOperation::getImBuf();
+ /* temporarily changes the view to get the right ImBuf */
+ int view = this->m_imageUser->view;
+
+ this->m_imageUser->view = this->m_view;
+ this->m_imageUser->passtype = this->m_passtype;
+
+ if (BKE_image_multilayer_index(this->m_image->rr, this->m_imageUser)) {
+ ImBuf *ibuf = BaseImageOperation::getImBuf();
+ this->m_imageUser->view = view;
+ return ibuf;
}
+
+ this->m_imageUser->view = view;
return NULL;
}
diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list