diff options
Diffstat (limited to 'source/blender/compositor/nodes/COM_ImageNode.cpp')
-rw-r--r-- | source/blender/compositor/nodes/COM_ImageNode.cpp | 170 |
1 files changed, 80 insertions, 90 deletions
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp index 5571a186333..e105f530eb2 100644 --- a/source/blender/compositor/nodes/COM_ImageNode.cpp +++ b/source/blender/compositor/nodes/COM_ImageNode.cpp @@ -38,9 +38,10 @@ ImageNode::ImageNode(bNode *editorNode) : Node(editorNode) /* pass */ } -NodeOperation *ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer *rl, Image *image, ImageUser *user, int framenumber, int outputsocketIndex, int passindex, DataType datatype) +NodeOperation *ImageNode::doMultilayerCheck(NodeConverter &converter, RenderLayer *rl, Image *image, ImageUser *user, + int framenumber, int outputsocketIndex, int passindex, DataType datatype) const { - OutputSocket *outputSocket = this->getOutputSocket(outputsocketIndex); + NodeOutput *outputSocket = this->getOutputSocket(outputsocketIndex); MultilayerBaseOperation *operation = NULL; switch (datatype) { case COM_DT_VALUE: @@ -59,22 +60,24 @@ NodeOperation *ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer operation->setRenderLayer(rl); operation->setImageUser(user); operation->setFramenumber(framenumber); - outputSocket->relinkConnections(operation->getOutputSocket()); - system->addOperation(operation); + + converter.addOperation(operation); + converter.mapOutputSocket(outputSocket, operation->getOutputSocket()); + return operation; } -void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context) +void ImageNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const { /// Image output - OutputSocket *outputImage = this->getOutputSocket(0); + NodeOutput *outputImage = this->getOutputSocket(0); bNode *editorNode = this->getbNode(); Image *image = (Image *)editorNode->id; ImageUser *imageuser = (ImageUser *)editorNode->storage; - int framenumber = context->getFramenumber(); + int framenumber = context.getFramenumber(); int numberOfOutputs = this->getNumberOfOutputSockets(); bool outputStraightAlpha = (editorNode->custom1 & CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT) != 0; - BKE_image_user_frame_calc(imageuser, context->getFramenumber(), 0); + BKE_image_user_frame_calc(imageuser, context.getFramenumber(), 0); /* force a load, we assume iuser index will be set OK anyway */ if (image && image->type == IMA_TYPE_MULTILAYER) { @@ -83,7 +86,7 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *c if (image->rr) { RenderLayer *rl = (RenderLayer *)BLI_findlink(&image->rr->layers, imageuser->layer); if (rl) { - OutputSocket *socket; + NodeOutput *socket; int index; is_multilayer_ok = true; @@ -91,50 +94,47 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *c for (index = 0; index < numberOfOutputs; index++) { NodeOperation *operation = NULL; socket = this->getOutputSocket(index); - if (socket->isConnected() || index == 0) { - 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. - */ + 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 = storage->pass_index;*/ - RenderPass *rpass = (RenderPass *)BLI_findlink(&rl->passes, passindex); + 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)) + 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) { + case 1: + operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_VALUE); break; - if (rpass) { - imageuser->pass = passindex; - switch (rpass->channels) { - case 1: - operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, 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(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_VECTOR); - break; - case 4: - operation = doMultilayerCheck(graph, rl, image, imageuser, framenumber, index, passindex, COM_DT_COLOR); - break; - default: - /* dummy operation is added below */ - break; - } - - if (index == 0 && operation) { - addPreviewOperation(graph, context, operation->getOutputSocket()); - } + case 3: + operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_VECTOR); + break; + case 4: + operation = doMultilayerCheck(converter, rl, image, imageuser, framenumber, index, passindex, COM_DT_COLOR); + break; + default: + /* dummy operation is added below */ + break; + } + + if (index == 0 && operation) { + converter.addPreview(operation->getOutputSocket()); } } - + /* incase we can't load the layer */ - if (operation == NULL) { - convertToOperations_invalid_index(graph, index); - } + if (operation == NULL) + converter.setInvalidOutput(getOutputSocket(index)); } } } @@ -142,66 +142,56 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *c /* without this, multilayer that fail to load will crash blender [#32490] */ if (is_multilayer_ok == false) { - int index; - vector<OutputSocket *> &outputsockets = this->getOutputSockets(); - for (index = 0; index < outputsockets.size(); index++) { - const float warning_color[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - SetColorOperation *operation = new SetColorOperation(); - operation->setChannels(warning_color); - - /* link the operation */ - this->getOutputSocket(index)->relinkConnections(operation->getOutputSocket()); - graph->addOperation(operation); - } + for (int i = 0; i < getNumberOfOutputSockets(); ++i) + converter.setInvalidOutput(getOutputSocket(i)); } } else { if (numberOfOutputs > 0) { ImageOperation *operation = new ImageOperation(); - if (outputImage->isConnected()) { - if (outputStraightAlpha) { - NodeOperation *alphaConvertOperation = new ConvertPremulToStraightOperation(); - addLink(graph, operation->getOutputSocket(0), alphaConvertOperation->getInputSocket(0)); - outputImage->relinkConnections(alphaConvertOperation->getOutputSocket()); - graph->addOperation(alphaConvertOperation); - } - else { - outputImage->relinkConnections(operation->getOutputSocket()); - } - } operation->setImage(image); operation->setImageUser(imageuser); operation->setFramenumber(framenumber); - graph->addOperation(operation); - addPreviewOperation(graph, context, operation->getOutputSocket()); + converter.addOperation(operation); + + if (outputStraightAlpha) { + NodeOperation *alphaConvertOperation = new ConvertPremulToStraightOperation(); + + converter.addOperation(alphaConvertOperation); + converter.mapOutputSocket(outputImage, alphaConvertOperation->getOutputSocket()); + converter.addLink(operation->getOutputSocket(0), alphaConvertOperation->getInputSocket(0)); + } + else { + converter.mapOutputSocket(outputImage, operation->getOutputSocket()); + } + + converter.addPreview(operation->getOutputSocket()); } if (numberOfOutputs > 1) { - OutputSocket *alphaImage = this->getOutputSocket(1); - if (alphaImage->isConnected()) { - ImageAlphaOperation *alphaOperation = new ImageAlphaOperation(); - alphaOperation->setImage(image); - alphaOperation->setImageUser(imageuser); - alphaOperation->setFramenumber(framenumber); - alphaImage->relinkConnections(alphaOperation->getOutputSocket()); - graph->addOperation(alphaOperation); - } + NodeOutput *alphaImage = this->getOutputSocket(1); + ImageAlphaOperation *alphaOperation = new ImageAlphaOperation(); + alphaOperation->setImage(image); + alphaOperation->setImageUser(imageuser); + alphaOperation->setFramenumber(framenumber); + converter.addOperation(alphaOperation); + + converter.mapOutputSocket(alphaImage, alphaOperation->getOutputSocket()); } if (numberOfOutputs > 2) { - OutputSocket *depthImage = this->getOutputSocket(2); - if (depthImage->isConnected()) { - ImageDepthOperation *depthOperation = new ImageDepthOperation(); - depthOperation->setImage(image); - depthOperation->setImageUser(imageuser); - depthOperation->setFramenumber(framenumber); - depthImage->relinkConnections(depthOperation->getOutputSocket()); - graph->addOperation(depthOperation); - } + NodeOutput *depthImage = this->getOutputSocket(2); + ImageDepthOperation *depthOperation = new ImageDepthOperation(); + depthOperation->setImage(image); + depthOperation->setImageUser(imageuser); + depthOperation->setFramenumber(framenumber); + converter.addOperation(depthOperation); + + converter.mapOutputSocket(depthImage, depthOperation->getOutputSocket()); } if (numberOfOutputs > 3) { /* happens when unlinking image datablock from multilayer node */ for (int i = 3; i < numberOfOutputs; i++) { - OutputSocket *output = this->getOutputSocket(i); + NodeOutput *output = this->getOutputSocket(i); NodeOperation *operation = NULL; switch (output->getDataType()) { case COM_DT_VALUE: @@ -233,8 +223,8 @@ void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext *c } if (operation) { - output->relinkConnections(operation->getOutputSocket()); - graph->addOperation(operation); + converter.addOperation(operation); + converter.mapOutputSocket(output, operation->getOutputSocket()); } } } |