Refactoring of tiles opencl implementation:
[blender.git] / source / blender / compositor / intern / COM_Node.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor: 
19  *              Jeroen Bakker 
20  *              Monique Dewanchand
21  */
22
23 #ifndef _COM_Node_h
24 #define _COM_Node_h
25
26 #include "COM_NodeBase.h"
27 #include "COM_InputSocket.h"
28 #include "COM_OutputSocket.h"
29 #include "COM_CompositorContext.h"
30 #include "DNA_node_types.h"
31 #include "BKE_text.h"
32 #include "COM_ExecutionSystem.h"
33 #include <vector>
34 #include <string>
35
36 using namespace std;
37
38 class Node;
39 class NodeOperation;
40 class ExecutionSystem;
41
42 typedef vector<Node *> NodeList;
43 typedef NodeList::iterator NodeIterator;
44 typedef pair<NodeIterator, NodeIterator> NodeRange;
45
46 /**
47  * My node documentation.
48  */
49 class Node : public NodeBase {
50 private:
51         /**
52          * @brief stores the reference to the SDNA bNode struct
53          */
54         bNode *editorNode;
55
56         /**
57          * @brief Is this node part of the active group
58          */
59         bool inActiveGroup;
60
61 public:
62         Node(bNode *editorNode, bool create_sockets = true);
63         
64         /**
65          * @brief get the reference to the SDNA bNode struct
66          */
67         bNode *getbNode();
68         
69         /**
70          * @brief Is this node in the active group (the group that is being edited)
71          * @param isInActiveGroup
72          */
73         void setIsInActiveGroup(bool isInActiveGroup) { this->inActiveGroup = isInActiveGroup; }
74         
75         /**
76          * @brief Is this node part of the active group
77          * the active group is the group that is currently being edited. When no group is edited, 
78          * the active group will be the main tree (all nodes that are not part of a group will be active)
79          * @return bool [false:true]
80          */
81         inline bool isInActiveGroup() { return this->inActiveGroup; }
82
83         /**
84          * @brief convert node to operation
85          *
86          * @todo this must be described furter
87          *
88          * @param system the ExecutionSystem where the operations need to be added
89          * @param context reference to the CompositorContext
90          */
91         virtual void convertToOperations(ExecutionSystem *system, CompositorContext *context) = 0;
92         
93         /**
94          * this method adds a SetValueOperation as input of the input socket.
95          * This can only be used from the convertToOperation method. all other usages are not allowed
96          */
97         void addSetValueOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex);
98         
99         /**
100          * this method adds a SetColorOperation as input of the input socket.
101          * This can only be used from the convertToOperation method. all other usages are not allowed
102          */
103         void addSetColorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex);
104         
105         /**
106          * this method adds a SetVectorOperation as input of the input socket.
107          * This can only be used from the convertToOperation method. all other usages are not allowed
108          */
109         void addSetVectorOperation(ExecutionSystem *graph, InputSocket *inputsocket, int editorNodeInputSocketIndex);
110         
111         /**
112          * Creates a new link between an outputSocket and inputSocket and registrates the link to the graph
113          * @return the new created link
114          */
115         SocketConnection *addLink(ExecutionSystem *graph, OutputSocket *outputSocket, InputSocket *inputsocket);
116         
117         /**
118          * is this node a group node.
119          */
120         virtual bool isGroupNode() const { return false; }
121         /**
122          * is this node a proxy node.
123          */
124         virtual bool isProxyNode() const { return false; }
125         
126         /**
127          * @brief find the InputSocket by bNodeSocket
128          *
129          * @param socket
130          */
131         InputSocket *findInputSocketBybNodeSocket(bNodeSocket *socket);
132         
133         /**
134          * @brief find the OutputSocket by bNodeSocket
135          *
136          * @param socket
137          */
138         OutputSocket *findOutputSocketBybNodeSocket(bNodeSocket *socket);
139 protected:
140         
141         Node();
142         
143         void addPreviewOperation(ExecutionSystem *system, InputSocket *inputSocket);
144         void addPreviewOperation(ExecutionSystem *system, OutputSocket *outputSocket);
145         
146         bNodeSocket *getEditorInputSocket(int editorNodeInputSocketIndex);
147         bNodeSocket *getEditorOutputSocket(int editorNodeOutputSocketIndex);
148 private:
149 };
150
151 #endif