Commit: 005dabbd9ad51b75aef260168c81d5a826d4eb4f Author: Lukas Tönne Date: Fri Apr 25 12:00:35 2014 +0200 https://developer.blender.org/rB005dabbd9ad51b75aef260168c81d5a826d4eb4f
Fix T39799: Backdrop (compositor) ignores alpha. This issue is because of a somewhat "special" behavior in old code, which got lost during rB09874df: There was a variant of the `relinkConnections` function which would leave the socket completely unconnected. This is not a valid state really (given that each unconnected input must otherwise connected to a constant `Set` type node), but was used as a way to distinguish connected alpha/depth sockets in composite and viewer output nodes. https://developer.blender.org/diffusion/B/browse/master/source/blender/compositor/intern/COM_InputSocket.cpp;28a829893c702918afc5ac1945a06eaefa611594$69 After the large cleanup patch ({D309}) every socket is now automatically connected to a constant, such that `getInputSocketReader` will never return a NULL pointer. This breaks the previous test method, which needs to be replaced by more explicit flags. Luckily this was done only for very few output nodes (Composite, Viewer, Output-File). These now use the regular SetValueOperation default in case "use alpha" is disabled, but set this to an explicit 1.0 value instead of mapping to the nod [...] =================================================================== M source/blender/compositor/intern/COM_NodeConverter.cpp M source/blender/compositor/intern/COM_NodeConverter.h M source/blender/compositor/intern/COM_NodeOperationBuilder.cpp M source/blender/compositor/nodes/COM_CompositorNode.cpp M source/blender/compositor/nodes/COM_OutputFileNode.cpp M source/blender/compositor/nodes/COM_ViewerNode.cpp M source/blender/compositor/operations/COM_CompositorOperation.cpp M source/blender/compositor/operations/COM_CompositorOperation.h M source/blender/compositor/operations/COM_OutputFileOperation.cpp M source/blender/compositor/operations/COM_OutputFileOperation.h M source/blender/compositor/operations/COM_ViewerOperation.cpp M source/blender/compositor/operations/COM_ViewerOperation.h =================================================================== diff --git a/source/blender/compositor/intern/COM_NodeConverter.cpp b/source/blender/compositor/intern/COM_NodeConverter.cpp index 833fced..5965ead 100644 --- a/source/blender/compositor/intern/COM_NodeConverter.cpp +++ b/source/blender/compositor/intern/COM_NodeConverter.cpp @@ -103,6 +103,33 @@ NodeOperationInput *NodeConverter::addOutputProxy(NodeOutput *output) return proxy->getInputSocket(0); } +void NodeConverter::addInputValue(NodeOperationInput *input, float value) +{ + SetValueOperation *operation = new SetValueOperation(); + operation->setValue(value); + + m_builder->addOperation(operation); + m_builder->addLink(operation->getOutputSocket(), input); +} + +void NodeConverter::addInputColor(NodeOperationInput *input, const float value[4]) +{ + SetColorOperation *operation = new SetColorOperation(); + operation->setChannels(value); + + m_builder->addOperation(operation); + m_builder->addLink(operation->getOutputSocket(), input); +} + +void NodeConverter::addInputVector(NodeOperationInput *input, const float value[3]) +{ + SetVectorOperation *operation = new SetVectorOperation(); + operation->setVector(value); + + m_builder->addOperation(operation); + m_builder->addLink(operation->getOutputSocket(), input); +} + void NodeConverter::addOutputValue(NodeOutput *output, float value) { SetValueOperation *operation = new SetValueOperation(); diff --git a/source/blender/compositor/intern/COM_NodeConverter.h b/source/blender/compositor/intern/COM_NodeConverter.h index a67dafd..cad8408 100644 --- a/source/blender/compositor/intern/COM_NodeConverter.h +++ b/source/blender/compositor/intern/COM_NodeConverter.h @@ -75,6 +75,13 @@ public: */ NodeOperationInput *addOutputProxy(NodeOutput *output); + /** Define a constant input value. */ + void addInputValue(NodeOperationInput *input, float value); + /** Define a constant input color. */ + void addInputColor(NodeOperationInput *input, const float value[4]); + /** Define a constant input vector. */ + void addInputVector(NodeOperationInput *input, const float value[3]); + /** Define a constant output value. */ void addOutputValue(NodeOutput *output, float value); /** Define a constant output color. */ diff --git a/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp b/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp index fdea320..a90bac8 100644 --- a/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp +++ b/source/blender/compositor/intern/COM_NodeOperationBuilder.cpp @@ -85,7 +85,11 @@ void NodeOperationBuilder::convertToOperations(ExecutionSystem *system) const OpInputs &op_to_list = find_operation_inputs(inverse_input_map, to); if (!op_from || op_to_list.empty()) { /* XXX allow this? error/debug message? */ - BLI_assert(false); + //BLI_assert(false); + /* XXX note: this can happen with certain nodes (e.g. OutputFile) + * which only generate operations in certain circumstances (rendering) + * just let this pass silently for now ... + */ continue; } diff --git a/source/blender/compositor/nodes/COM_CompositorNode.cpp b/source/blender/compositor/nodes/COM_CompositorNode.cpp index 868528a..3d79eb6 100644 --- a/source/blender/compositor/nodes/COM_CompositorNode.cpp +++ b/source/blender/compositor/nodes/COM_CompositorNode.cpp @@ -34,6 +34,7 @@ void CompositorNode::convertToOperations(NodeConverter &converter, const Composi bNode *editorNode = this->getbNode(); bool is_active = (editorNode->flag & NODE_DO_OUTPUT_RECALC) || context.isRendering(); + bool ignore_alpha = editorNode->custom2 & CMP_NODE_OUTPUT_IGNORE_ALPHA; NodeInput *imageSocket = this->getInputSocket(0); NodeInput *alphaSocket = this->getInputSocket(1); @@ -43,12 +44,17 @@ void CompositorNode::convertToOperations(NodeConverter &converter, const Composi compositorOperation->setSceneName(context.getScene()->id.name); compositorOperation->setRenderData(context.getRenderData()); compositorOperation->setbNodeTree(context.getbNodeTree()); - compositorOperation->setIgnoreAlpha(editorNode->custom2 & CMP_NODE_OUTPUT_IGNORE_ALPHA); + /* alpha socket gives either 1 or a custom alpha value if "use alpha" is enabled */ + compositorOperation->setUseAlphaInput(ignore_alpha || alphaSocket->isLinked()); compositorOperation->setActive(is_active); converter.addOperation(compositorOperation); converter.mapInputSocket(imageSocket, compositorOperation->getInputSocket(0)); - converter.mapInputSocket(alphaSocket, compositorOperation->getInputSocket(1)); + /* only use alpha link if "use alpha" is enabled */ + if (ignore_alpha) + converter.addInputValue(compositorOperation->getInputSocket(1), 1.0f); + else + converter.mapInputSocket(alphaSocket, compositorOperation->getInputSocket(1)); converter.mapInputSocket(depthSocket, compositorOperation->getInputSocket(2)); converter.addNodeInputPreview(imageSocket); diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.cpp b/source/blender/compositor/nodes/COM_OutputFileNode.cpp index 83b138c..92fa74b 100644 --- a/source/blender/compositor/nodes/COM_OutputFileNode.cpp +++ b/source/blender/compositor/nodes/COM_OutputFileNode.cpp @@ -56,7 +56,8 @@ void OutputFileNode::convertToOperations(NodeConverter &converter, const Composi NodeInput *input = getInputSocket(i); NodeImageMultiFileSocket *sockdata = (NodeImageMultiFileSocket *)input->getbNodeSocket()->storage; - outputOperation->add_layer(sockdata->layer, input->getDataType()); + /* note: layer becomes an empty placeholder if the input is not linked */ + outputOperation->add_layer(sockdata->layer, input->getDataType(), input->isLinked()); converter.mapInputSocket(input, outputOperation->getInputSocket(i)); diff --git a/source/blender/compositor/nodes/COM_ViewerNode.cpp b/source/blender/compositor/nodes/COM_ViewerNode.cpp index 5e37bf0..09a3cea 100644 --- a/source/blender/compositor/nodes/COM_ViewerNode.cpp +++ b/source/blender/compositor/nodes/COM_ViewerNode.cpp @@ -36,6 +36,7 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC bNode *editorNode = this->getbNode(); bool is_active = (editorNode->flag & NODE_DO_OUTPUT_RECALC || context.isRendering()) && ((editorNode->flag & NODE_DO_OUTPUT) && this->isInActiveGroup()); + bool ignore_alpha = editorNode->custom2 & CMP_NODE_OUTPUT_IGNORE_ALPHA; NodeInput *imageSocket = this->getInputSocket(0); NodeInput *alphaSocket = this->getInputSocket(1); @@ -50,7 +51,8 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC viewerOperation->setChunkOrder((OrderOfChunks)editorNode->custom1); viewerOperation->setCenterX(editorNode->custom3); viewerOperation->setCenterY(editorNode->custom4); - viewerOperation->setIgnoreAlpha(editorNode->custom2 & CMP_NODE_OUTPUT_IGNORE_ALPHA); + /* alpha socket gives either 1 or a custom alpha value if "use alpha" is enabled */ + viewerOperation->setUseAlphaInput(ignore_alpha || alphaSocket->isLinked()); viewerOperation->setViewSettings(context.getViewSettings()); viewerOperation->setDisplaySettings(context.getDisplaySettings()); @@ -64,7 +66,11 @@ void ViewerNode::convertToOperations(NodeConverter &converter, const CompositorC converter.addOperation(viewerOperation); converter.mapInputSocket(imageSocket, viewerOperation->getInputSocket(0)); - converter.mapInputSocket(alphaSocket, viewerOperation->getInputSocket(1)); + /* only use alpha link if "use alpha" is enabled */ + if (ignore_alpha) + converter.addInputValue(viewerOperation->getInputSocket(1), 1.0f); + else + converter.mapInputSocket(alphaSocket, viewerOperation->getInputSocket(1)); converter.mapInputSocket(depthSocket, viewerOperation->getInputSocket(2)); converter.addNodeInputPreview(imageSocket); diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cpp b/source/blender/compositor/operations/COM_CompositorOperation.cpp index 14aba26..ef331a5 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cpp +++ b/source/blender/compositor/operations/COM_CompositorOperation.cpp @@ -48,7 +48,7 @@ CompositorOperation::CompositorOperation() : NodeOperation() this->m_alphaInput = NULL; this->m_depthInput = NULL; - this->m_ignoreAlpha = false; + this->m_useAlphaInput = false; this->m_active = false; this->m_sceneName[0] = '\0'; @@ -188,21 +188,14 @@ void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber) int input_x = x + dx, input_y = y + dy; this->m_imageInput->readSampled(color, input_x, input_y, COM_PS_NEAREST); - if (this->m_ignoreAlpha) { - color[3] = 1.0f; - } - else { - if (this->m_alphaInput != NULL) { - this->m_alphaInput->readSampled(&(color[3]), input_x, input_y, COM_PS_NEAREST); - } + if (this->m_useAlphaInput) { + this->m_alphaInput->readSampled(&(color[3]), input_x, input_y, COM_PS_NEAREST); } copy_v4_v4(buffer + offset4, color); - if (this->m_depthInput != NULL) { - this->m_depthInput->readSampled(color, input_x, input_y, COM_PS_NEAREST); - zbuffer[offset] = color[0]; - } + this->m_depthInput->readSampled(color, input_x, input_y, COM_PS_NEAREST); + zbuffer[offset] = color[0]; offset4 += COM_NUMBER_OF_CHANNELS; offset++; if (isBreaked()) { diff --git a/source/blender/compositor/operations/COM_CompositorOperation.h b/source/blender/compositor/operations/COM_CompositorOperation.h index d33e89e..771c32f 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.h +++ b/source/blender/compositor/operations/COM_CompositorOperation.h @@ -69,7 +69,7 @@ private: /** * @brief Ignore any alpha input */ - bool m_ignoreAlpha; + bool m_useAlphaInput; /** * @brief operation is active for calculating final compo result @@ -86,7 +86,7 @@ public: void deinitExecution(); const CompositorPriority getRenderPriority() const { return COM_PRIORITY_MEDIUM; } void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]); - void setIgnoreAlpha(bool value) { this->m_ignoreAlpha = value; } + void setUseAlphaInput(bool value) { this->m_useAlphaInput = value; } void setActive(bool a @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-blender-cvs
