Commit: 36305cb27ad3929a33fecf7c162b0fc9ef26d545
Author: Stefan Werner
Date:   Tue Apr 18 20:24:33 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rB36305cb27ad3929a33fecf7c162b0fc9ef26d545

Compositor: Cryptomatte node can now have inputs added and removed as necessary

===================================================================

M       source/blender/blenkernel/BKE_node.h
M       source/blender/compositor/nodes/COM_CryptomatteNode.cpp
M       source/blender/compositor/operations/COM_CryptomatteOperation.cpp
M       source/blender/compositor/operations/COM_CryptomatteOperation.h
M       source/blender/editors/space_node/drawnode.c
M       source/blender/editors/space_node/node_edit.c
M       source/blender/editors/space_node/node_intern.h
M       source/blender/editors/space_node/node_ops.c
M       source/blender/makesdna/DNA_node_types.h
M       source/blender/nodes/composite/nodes/node_composite_cryptomatte.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 75356cd13e7..e4bd086bdaf 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -993,6 +993,8 @@ void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, 
bNode *node);
 
 void ntreeCompositCryptomatteSyncFromAdd(bNodeTree *ntree, bNode *node);
 void ntreeCompositCryptomatteSyncFromRemove(bNodeTree *ntree, bNode *node);
+struct bNodeSocket *ntreeCompositCryptomatteAddSocket(struct bNodeTree *ntree, 
struct bNode *node);
+int ntreeCompositCryptomatteRemoveSocket(struct bNodeTree *ntree, struct bNode 
*node);
 
 /** \} */
 
diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cpp 
b/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
index 2b41c60c163..03e403ca29d 100644
--- a/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cpp
@@ -265,24 +265,24 @@ void CryptomatteNode::convertToOperations(NodeConverter 
&converter, const Compos
        NodeOutput *outputSocketImage = this->getOutputSocket(0);
        NodeOutput *outputSocketMatte = this->getOutputSocket(1);
        NodeOutput *outputCryptoPick = this->getOutputSocket(2);
-       
+
        bNode *node = this->getbNode();
-       CryptomatteOperation *operation = new CryptomatteOperation();
        NodeCryptomatte *cryptoMatteSettings = (NodeCryptomatte *)node->storage;
-       if(cryptoMatteSettings) {
+       CryptomatteOperation *operation = new 
CryptomatteOperation(cryptoMatteSettings->num_inputs);
+       if (cryptoMatteSettings) {
                std::string input = cryptoMatteSettings->matte_id;
-               if(!input.empty()) {
+               if (!input.empty()) {
                        // split the string by commas, ignoring white space
                        std::istringstream ss(input);
-                       while( ss.good() )
+                       while (ss.good())
                        {
                                std::string token;
                                getline(ss, token, ',');
                                size_t first = token.find_first_not_of(' ');
                                size_t last = token.find_last_not_of(' ');
-                               token = token.substr(first, (last-first+1));
+                               token = token.substr(first, (last - first + 1));
                                if (*token.begin() == '<' && *(--token.end()) 
== '>')
-                                       
operation->addObjectIndex(atof(token.substr(1, token.length()-2).c_str()));
+                                       
operation->addObjectIndex(atof(token.substr(1, token.length() - 2).c_str()));
                                else {
                                        uint32_t hash = 0;
                                        MurmurHash3_x86_32(token.c_str(), 
token.length(), 0, &hash);
@@ -291,11 +291,12 @@ void CryptomatteNode::convertToOperations(NodeConverter 
&converter, const Compos
                        }
                }
        }
-       
+
        converter.addOperation(operation);
-       
-       for(int i = 0; i < 6; i++)
-               converter.mapInputSocket(this->getInputSocket(i+1), 
operation->getInputSocket(i));
+
+       for (int i = 0; i < cryptoMatteSettings->num_inputs; i++) {
+               converter.mapInputSocket(this->getInputSocket(i + 1), 
operation->getInputSocket(i));
+       }
        
        SeparateChannelOperation *separateOperation = new 
SeparateChannelOperation;
        separateOperation->setChannel(3);
diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp 
b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
index a6521e5bfdb..c27c56fdd0e 100644
--- a/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
+++ b/source/blender/compositor/operations/COM_CryptomatteOperation.cpp
@@ -20,26 +20,28 @@
 
 #include "COM_CryptomatteOperation.h"
 
-CryptomatteOperation::CryptomatteOperation() : NodeOperation()
+CryptomatteOperation::CryptomatteOperation(size_t num_inputs) : NodeOperation()
 {
-       for(int i = 0; i < 6; i++) {
-               inputs[i] = NULL;
+       for(size_t i = 0; i < num_inputs; i++) {
                this->addInputSocket(COM_DT_COLOR);
        }
+       inputs.resize(num_inputs);
        this->addOutputSocket(COM_DT_COLOR);
        this->setComplex(true);
 }
 
 void CryptomatteOperation::initExecution()
 {
-       for(int i = 0; i < 6; i++)
+       for (size_t i = 0; i < inputs.size(); i++) {
                inputs[i] = this->getInputSocketReader(i);
+       }
 }
 
 void CryptomatteOperation::addObjectIndex(float objectIndex)
 {
-       if(objectIndex != 0.f)
+       if (objectIndex != 0.f) {
                m_objectIndex.push_back(objectIndex);
+       }
 }
 
 void CryptomatteOperation::executePixel(float output[4],
@@ -49,7 +51,7 @@ void CryptomatteOperation::executePixel(float output[4],
 {
        float input[4];
        output[0] = output[1] = output[2] = output[3] = 0.0f;
-       for(int i = 0; i < 6; i++) {
+       for (size_t i = 0; i < inputs.size(); i++) {
                inputs[i]->read(input, x, y, data);
                if (i == 0) {
                        // write the frontmost object as false color for picking
diff --git a/source/blender/compositor/operations/COM_CryptomatteOperation.h 
b/source/blender/compositor/operations/COM_CryptomatteOperation.h
index 6dc682902bc..65453b30961 100644
--- a/source/blender/compositor/operations/COM_CryptomatteOperation.h
+++ b/source/blender/compositor/operations/COM_CryptomatteOperation.h
@@ -27,9 +27,9 @@ class CryptomatteOperation : public NodeOperation {
 private:
        std::vector<float> m_objectIndex;
 public:
-       SocketReader *inputs[6];
+       std::vector<SocketReader *> inputs;
 
-       CryptomatteOperation();
+       CryptomatteOperation(size_t num_inputs = 6);
 
        void initExecution();
        void executePixel(float output[4], int x, int y, void *data);
diff --git a/source/blender/editors/space_node/drawnode.c 
b/source/blender/editors/space_node/drawnode.c
index 4feca3a2088..620ec573d52 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -2504,6 +2504,12 @@ static void node_composit_buts_cryptomatte(uiLayout 
*layout, bContext *UNUSED(C)
        uiItemR(row, ptr, "remove", 0, NULL, ICON_NONE);
 }
 
+static void node_composit_buts_cryptomatte_ex(uiLayout *layout, bContext 
*UNUSED(C), PointerRNA *UNUSED(ptr))
+{
+       uiItemO(layout, IFACE_("Add Input"), ICON_ZOOMIN, 
"NODE_OT_cryptomatte_add_socket");
+       uiItemO(layout, IFACE_("Remove Input"), ICON_ZOOMOUT, 
"NODE_OT_cryptomatte_remove_socket");
+}
+
 static void node_composit_buts_brightcontrast(uiLayout *layout, bContext 
*UNUSED(C), PointerRNA *ptr)
 {
        uiItemR(layout, ptr, "use_premultiply", 0, NULL, ICON_NONE);
@@ -2738,6 +2744,7 @@ static void node_composit_set_butfunc(bNodeType *ntype)
                        break;
                case CMP_NODE_CRYPTOMATTE:
                        ntype->draw_buttons = node_composit_buts_cryptomatte;
+                       ntype->draw_buttons_ex = 
node_composit_buts_cryptomatte_ex;
                        break;
                case CMP_NODE_BRIGHTCONTRAST:
                        ntype->draw_buttons = node_composit_buts_brightcontrast;
diff --git a/source/blender/editors/space_node/node_edit.c 
b/source/blender/editors/space_node/node_edit.c
index 9dc39b1839b..c279ac77a73 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -2602,3 +2602,92 @@ void NODE_OT_clear_viewer_border(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+/* ****************** Cryptomatte Add Socket  ******************* */
+
+static int node_cryptomatte_add_socket_exec(bContext *C, wmOperator *op)
+{
+       Scene *scene = CTX_data_scene(C);
+       SpaceNode *snode = CTX_wm_space_node(C);
+       PointerRNA ptr = CTX_data_pointer_get(C, "node");
+       bNodeTree *ntree = NULL;
+       bNode *node = NULL;
+       char file_path[MAX_NAME];
+
+       if (ptr.data) {
+               node = ptr.data;
+               ntree = ptr.id.data;
+       }
+       else if (snode && snode->edittree) {
+               ntree = snode->edittree;
+               node = nodeGetActive(snode->edittree);
+       }
+
+       if (!node || node->type != CMP_NODE_CRYPTOMATTE)
+               return OPERATOR_CANCELLED;
+
+       ntreeCompositCryptomatteAddSocket(ntree, node);
+
+       snode_notify(C, snode);
+
+       return OPERATOR_FINISHED;
+}
+
+void NODE_OT_cryptomatte_add_socket(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Add Cryptomatte Socket";
+       ot->description = "Add a new input to a cryptomatte node";
+       ot->idname = "NODE_OT_cryptomatte_add_socket";
+
+       /* callbacks */
+       ot->exec = node_cryptomatte_add_socket_exec;
+       ot->poll = composite_node_editable;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+/* ****************** Cryptomatte Remove Socket  ******************* */
+
+static int node_cryptomatte_remove_socket_exec(bContext *C, wmOperator 
*UNUSED(op))
+{
+       SpaceNode *snode = CTX_wm_space_node(C);
+       PointerRNA ptr = CTX_data_pointer_get(C, "node");
+       bNodeTree *ntree = NULL;
+       bNode *node = NULL;
+
+       if (ptr.data) {
+               node = ptr.data;
+               ntree = ptr.id.data;
+       }
+       else if (snode && snode->edittree) {
+               ntree = snode->edittree;
+               node = nodeGetActive(snode->edittree);
+       }
+
+       if (!node || node->type != CMP_NODE_CRYPTOMATTE)
+               return OPERATOR_CANCELLED;
+
+       if (!ntreeCompositCryptomatteRemoveSocket(ntree, node))
+               return OPERATOR_CANCELLED;
+
+       snode_notify(C, snode);
+
+       return OPERATOR_FINISHED;
+}
+
+void NODE_OT_cryptomatte_remove_socket(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Remove Cryptomatte Socket";
+       ot->description = "Remove input from a crytpomatte node";
+       ot->idname = "NODE_OT_cryptomatte_remove_socket";
+
+       /* callbacks */
+       ot->exec = node_cryptomatte_remove_socket_exec;
+       ot->poll = composite_node_editable;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/space_node/node_intern.h 
b/source/blender/editors/space_node/node_intern.h
index 6b8fa0b88fe..63a27f3026c 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -220,6 +220,9 @@ void NODE_OT_shader_script_update(struct wmOperatorType 
*ot);
 void NODE_OT_viewer_border(struct wmOperatorType *ot);
 void NODE_OT_clear_viewer_border(struct wmOperatorType *ot);
 
+void NODE_OT_cryptomatte_add_socket(struct wmOperatorType *ot);
+void NODE_OT_cryptomatte_remove_socket(struct wmOperatorType *ot);
+
 extern const char *node_context_dir[];
 
 // XXXXXX
diff --git a/source/blender/editors/space_node/node_ops.c 
b/source/blender/editors/space_node/node_ops.c
index 5118d52efc4..66c56995b37 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -130,6 +130,9 @@ void node_operatortypes(void)
        WM_operatortype_append(NODE_OT_tree_socket_add);
        WM_operatortype_append(NODE_OT_tree_socket_remove);
        WM_operatortype_append(NODE_OT_tree_socket_move);
+
+       WM_operatortype_append(NODE_OT_cryptomatte_add_socket);
+       WM_operatortype_append(NODE_OT_cryptomatte_remove_socke

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to