fix own error BLI_rctf_cent_x/y were incorrectly returning int's, also quiet some...
[blender.git] / source / blender / compositor / intern / COM_NodeBase.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_NodeBase_h
24 #define _COM_NodeBase_h
25
26 #include "COM_InputSocket.h"
27 #include "COM_OutputSocket.h"
28 #include "DNA_node_types.h"
29 #include "BKE_text.h"
30 #include <vector>
31 #include <string>
32
33 using namespace std;
34
35
36 class NodeOperation;
37 class ExecutionSystem;
38
39 /**
40  * @brief The NodeBase class is the super-class of all node related objects like @see Node @see NodeOperation
41  * the reason for the existence of this class is to support graph-nodes when using ExecutionSystem
42  * the NodeBase also contains the reference to InputSocket and OutputSocket.
43  * @ingroup Model
44  */
45 class NodeBase {
46 private:
47         /**
48          * @brief the list of actual inputsockets @see InputSocket
49          */
50         vector<InputSocket *> m_inputsockets;
51
52         /**
53          * @brief the list of actual outputsockets @see OutputSocket
54          */
55         vector<OutputSocket *> m_outputsockets;
56
57         /**
58          * @brief stores the reference to the SDNA bNode struct
59          */
60         bNode *m_editorNode;
61
62 protected:
63         /**
64          * @brief get access to the vector of input sockets
65          */
66         inline vector<InputSocket *>& getInputSockets() { return this->m_inputsockets; }
67         
68         /**
69          * @brief get access to the vector of input sockets
70          */
71         inline vector<OutputSocket *>& getOutputSockets() { return this->m_outputsockets; }
72
73
74 protected:
75         /**
76          * @brief destructor
77          * clean up memory related to this NodeBase.
78          */
79         virtual ~NodeBase();
80         
81 public:
82         /**
83          * @brief get the reference to the SDNA bNode struct
84          */
85         bNode *getbNode() {return m_editorNode;}
86         
87         /**
88          * @brief set the reference to the bNode
89          * @note used in Node instances to receive the storage/settings and complex node for highlight during execution
90          * @param bNode
91          */
92         void setbNode(bNode *bNode) {this->m_editorNode = bNode;}
93         
94         /**
95          * @brief is this node an operation?
96          * This is true when the instance is of the subclass NodeOperation.
97          * @return [true:false]
98          * @see NodeOperation
99          */
100         virtual const bool isOperation() const { return false; }
101         
102         /**
103          * @brief check if this is an input node
104          * An input node is a node that only has output sockets and no input sockets
105          * @return [false..true]
106          */
107         const bool isInputNode() const;
108         
109         /**
110          * @brief Return the number of input sockets of this node.
111          */
112         const unsigned int getNumberOfInputSockets() const { return this->m_inputsockets.size(); }
113
114         /**
115          * @brief Return the number of output sockets of this node.
116          */
117         const unsigned int getNumberOfOutputSockets() const { return this->m_outputsockets.size(); }
118
119         /**
120          * get the reference to a certain outputsocket
121          * @param index
122          * the index of the needed outputsocket
123          */
124         OutputSocket *getOutputSocket(const unsigned int index);
125         
126         /**
127          * get the reference to the first outputsocket
128          * @param index
129          * the index of the needed outputsocket
130          */
131         inline OutputSocket *getOutputSocket() { return getOutputSocket(0); }
132         
133         /**
134          * get the reference to a certain inputsocket
135          * @param index
136          * the index of the needed inputsocket
137          */
138         InputSocket *getInputSocket(const unsigned int index);
139         
140         
141         virtual bool isStatic() const { return false; }
142         void getStaticValues(float *result) const { }
143 protected:
144         NodeBase();
145         
146         /**
147          * @brief add an InputSocket to the collection of inputsockets
148          * @note may only be called in an constructor
149          * @param socket the InputSocket to add
150          */
151         void addInputSocket(DataType datatype);
152         void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode);
153         void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket *socket);
154         
155         /**
156          * @brief add an OutputSocket to the collection of outputsockets
157          * @note may only be called in an constructor
158          * @param socket the OutputSocket to add
159          */
160         void addOutputSocket(DataType datatype);
161         void addOutputSocket(DataType datatype, bNodeSocket *socket);
162
163
164 #ifdef WITH_CXX_GUARDEDALLOC
165         MEM_CXX_CLASS_ALLOC_FUNCS("COM:NodeBase")
166 #endif
167 };
168
169 #endif