optionally use guarded alloc for tiles compositor, also replace allocation functions...
[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 *> inputsockets;
51
52         /**
53          * @brief the list of actual outputsockets @see OutputSocket
54          */
55         vector<OutputSocket *> outputsockets;
56
57 protected:
58         /**
59          * @brief get access to the vector of input sockets
60          */
61         inline vector<InputSocket *>& getInputSockets() { return this->inputsockets; }
62         
63         /**
64          * @brief get access to the vector of input sockets
65          */
66         inline vector<OutputSocket *>& getOutputSockets() { return this->outputsockets; }
67
68
69 public:
70         /**
71          * @brief destructor
72          * clean up memory related to this NodeBase.
73          */
74         virtual ~NodeBase();
75         
76         /**
77          * @brief is this node an operation?
78          * This is true when the instance is of the subclass NodeOperation.
79          * @return [true:false]
80          * @see NodeOperation
81          */
82         virtual const int isOperation() const { return false; }
83         
84         /**
85          * @brief check if this is an input node
86          * An input node is a node that only has output sockets and no input sockets
87          * @return [false..true]
88          */
89         const bool isInputNode() const;
90         
91         /**
92          * @brief Return the number of input sockets of this node.
93          */
94         const unsigned int getNumberOfInputSockets() const { return this->inputsockets.size(); }
95
96         /**
97          * @brief Return the number of output sockets of this node.
98          */
99         const unsigned int getNumberOfOutputSockets() const { return this->outputsockets.size(); }
100
101         /**
102          * get the reference to a certain outputsocket
103          * @param index
104          * the index of the needed outputsocket
105          */
106         OutputSocket *getOutputSocket(const unsigned int index);
107         
108         /**
109          * get the reference to the first outputsocket
110          * @param index
111          * the index of the needed outputsocket
112          */
113         inline OutputSocket *getOutputSocket() { return getOutputSocket(0); }
114         
115         /**
116          * get the reference to a certain inputsocket
117          * @param index
118          * the index of the needed inputsocket
119          */
120         InputSocket *getInputSocket(const unsigned int index);
121         
122         
123         virtual bool isStatic() const { return false; }
124         void getStaticValues(float *result) const { }
125 protected:
126         NodeBase();
127         
128         /**
129          * @brief add an InputSocket to the collection of inputsockets
130          * @note may only be called in an constructor
131          * @param socket the InputSocket to add
132          */
133         void addInputSocket(DataType datatype);
134         void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode);
135         void addInputSocket(DataType datatype, InputSocketResizeMode resizeMode, bNodeSocket *socket);
136         
137         /**
138          * @brief add an OutputSocket to the collection of outputsockets
139          * @note may only be called in an constructor
140          * @param socket the OutputSocket to add
141          */
142         void addOutputSocket(DataType datatype);
143         void addOutputSocket(DataType datatype, bNodeSocket *socket);
144
145
146 #ifdef WITH_CXX_GUARDEDALLOC
147         MEM_CXX_CLASS_ALLOC_FUNCS("COM:NodeBase")
148 #endif
149 };
150
151 #endif