diff options
Diffstat (limited to 'source/blender/compositor')
4 files changed, 25 insertions, 17 deletions
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp index c3aaf8358fe..6e4bff460d1 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.cpp +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -38,19 +38,19 @@ ImageNode::ImageNode(bNode *editorNode) : Node(editorNode) /* pass */ } -NodeOperation *ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int pass, DataType datatype) +NodeOperation *ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int passindex, DataType datatype) { OutputSocket *outputSocket = this->getOutputSocket(outputsocketIndex); MultilayerBaseOperation *operation = NULL; switch (datatype) { case COM_DT_VALUE: - operation = new MultilayerValueOperation(pass); + operation = new MultilayerValueOperation(passindex); break; case COM_DT_VECTOR: - operation = new MultilayerVectorOperation(pass); + operation = new MultilayerVectorOperation(passindex); break; case COM_DT_COLOR: - operation = new MultilayerColorOperation(pass); + operation = new MultilayerColorOperation(passindex); break; default: break; @@ -93,10 +93,19 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *c socket = this->getOutputSocket(index); if (socket->isConnected() || index == 0) { bNodeSocket *bnodeSocket = socket->getbNodeSocket(); - NodeImageLayer *storage = (NodeImageLayer *)bnodeSocket->storage; - int passindex = storage->pass_index; - + /* 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 = storage->pass_index;*/ 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; if (rpass) { imageuser->pass = passindex; switch (rpass->channels) { diff --git a/source/blender/compositor/nodes/COM_ImageNode.h b/source/blender/compositor/nodes/COM_ImageNode.h index 49006efbed5..12b4da6c8b3 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.h +++ b/source/blender/compositor/nodes/COM_ImageNode.h @@ -35,7 +35,7 @@ extern "C" { */ class ImageNode : public Node { private: - NodeOperation *doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int pass, DataType datatype); + NodeOperation *doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int passindex, DataType datatype); public: ImageNode(bNode *editorNode); void convertToOperations(ExecutionSystem *graph, CompositorContext *context); diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp index 1a2a1e77833..e2a95b2e33b 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp @@ -27,16 +27,15 @@ extern "C" { #include "IMB_imbuf_types.h" } -MultilayerBaseOperation::MultilayerBaseOperation(int pass) : BaseImageOperation() +MultilayerBaseOperation::MultilayerBaseOperation(int passindex) : BaseImageOperation() { - this->m_passId = pass; + this->m_passId = passindex; } ImBuf *MultilayerBaseOperation::getImBuf() { - RenderPass *rpass; - rpass = (RenderPass *)BLI_findlink(&this->m_renderlayer->passes, this->m_passId); + RenderPass *rpass = (RenderPass *)BLI_findlink(&this->m_renderlayer->passes, this->m_passId); if (rpass) { - this->m_imageUser->pass = this->m_passId; + this->m_imageUser->pass = m_passId; BKE_image_multilayer_index(this->m_image->rr, this->m_imageUser); return BaseImageOperation::getImBuf(); } diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.h b/source/blender/compositor/operations/COM_MultilayerImageOperation.h index 3c498e962b5..065bcc7da1e 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.h +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.h @@ -37,13 +37,13 @@ public: /** * Constructor */ - MultilayerBaseOperation(int pass); + MultilayerBaseOperation(int passindex); void setRenderLayer(RenderLayer *renderlayer) { this->m_renderlayer = renderlayer; } }; class MultilayerColorOperation : public MultilayerBaseOperation { public: - MultilayerColorOperation(int pass) : MultilayerBaseOperation(pass) { + MultilayerColorOperation(int passindex) : MultilayerBaseOperation(passindex) { this->addOutputSocket(COM_DT_COLOR); } void executePixel(float output[4], float x, float y, PixelSampler sampler); @@ -51,7 +51,7 @@ public: class MultilayerValueOperation : public MultilayerBaseOperation { public: - MultilayerValueOperation(int pass) : MultilayerBaseOperation(pass) { + MultilayerValueOperation(int passindex) : MultilayerBaseOperation(passindex) { this->addOutputSocket(COM_DT_VALUE); } void executePixel(float output[4], float x, float y, PixelSampler sampler); @@ -59,7 +59,7 @@ public: class MultilayerVectorOperation : public MultilayerBaseOperation { public: - MultilayerVectorOperation(int pass) : MultilayerBaseOperation(pass) { + MultilayerVectorOperation(int passindex) : MultilayerBaseOperation(passindex) { this->addOutputSocket(COM_DT_VECTOR); } void executePixel(float output[4], float x, float y, PixelSampler sampler); |