rename remaining class members with m_ prefix.
[blender.git] / source / blender / compositor / intern / COM_ExecutionSystem.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 class ExecutionGroup;
24
25 #ifndef _COM_ExecutionSystem_h
26 #define _COM_ExecutionSystem_h
27
28 #include "DNA_node_types.h"
29 #include <vector>
30 #include "COM_Node.h"
31 #include "COM_SocketConnection.h"
32 #include "BKE_text.h"
33 #include "COM_ExecutionGroup.h"
34 #include "COM_NodeOperation.h"
35
36 using namespace std;
37
38 /**
39  * @page execution Execution model
40  * In order to get to an efficient model for execution, serveral steps are being done. these steps are explained below.
41  *
42  * @section EM_Step1 Step 1: translating blender node system to the new compsitor system
43  * Blenders node structure is based on C structs (DNA). These structs are not efficient in the new architecture. We want to use classes in order to simplify the system.
44  * during this step the blender node_tree is evaluated and converted to a CPP node system.
45  *
46  * @see ExecutionSystem
47  * @see Converter.convert
48  * @see Node
49  *
50  * @section EM_Step2 Step2: translating nodes to operations
51  * Ungrouping the GroupNodes. Group nodes are node_tree's in node_tree's. The new system only supports a single level of node_tree. We will 'flatten' the system in a single level.
52  * @see GroupNode
53  * @see ExecutionSystemHelper.ungroup
54  *
55  * Every node has the ability to convert itself to operations. The node itself is responsible to create a correct NodeOperation setup based on its internal settings.
56  * Most Node only need to convert it to its NodeOperation. Like a ColorToBWNode doesn't check anything, but replaces itself with a ConvertColorToBWOperation.
57  * More complex nodes can use different NodeOperation based on settings; like MixNode. based on the selected Mixtype a different operation will be used.
58  * for more information see the page about creating new Nodes. [@subpage newnode]
59  *
60  * @see ExecutionSystem.convertToOperations
61  * @see Node.convertToOperations
62  * @see NodeOperation base class for all operations in the system
63  *
64  * @section EM_Step3 Step3: add additional conversions to the operation system
65  *   - Data type conversions: the system has 3 data types COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR. The user can connect a Value socket to a color socket. As values are ordered differently than colors a conversion happens.
66  *
67  *   - Image size conversions: the system can automatically convert when resolutions do not match. An InputSocket has a resize mode. This can be any of the folowing settings.
68  *     - [@ref InputSocketResizeMode.COM_SC_CENTER]: The center of both images are aligned
69  *     - [@ref InputSocketResizeMode.COM_SC_FIT_WIDTH]: The width of both images are aligned
70  *     - [@ref InputSocketResizeMode.COM_SC_FIT_HEIGHT]: the height of both images are aligned
71  *     - [@ref InputSocketResizeMode.COM_SC_FIT]: The width, or the height of both images are aligned to make sure that it fits.
72  *     - [@ref InputSocketResizeMode.COM_SC_STRETCH]: The width and the height of both images are aligned
73  *     - [@ref InputSocketResizeMode.COM_SC_NO_RESIZE]: bottom left of the images are aligned.
74  *
75  * @see Converter.convertDataType Datatype conversions
76  * @see Converter.convertResolution Image size conversions
77  *
78  * @section EM_Step4 Step4: group operations in executions groups
79  * ExecutionGroup are groups of operations that are calculated as being one bigger operation. All operations will be part of an ExecutionGroup.
80  * Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored in MemoryBuffers. ReadBufferOperations and WriteBufferOperations are added where needed.
81  *
82  * <pre>
83  *
84  *        +------------------------------+      +----------------+
85  *        | ExecutionGroup A             |      |ExecutionGroup B|   ExecutionGroup
86  *        | +----------+     +----------+|      |+----------+    |
87  *   /----->| Operation|---->| Operation|-\ /--->| Operation|-\  |   NodeOperation
88  *   |    | | A        |     | B        ||| |   || C        | |  |
89  *   |    | | cFFA     |  /->| cFFA     ||| |   || cFFA     | |  |
90  *   |    | +----------+  |  +----------+|| |   |+----------+ |  |
91  *   |    +---------------|--------------+v |   +-------------v--+
92  * +-*----+           +---*--+         +--*-*--+           +--*----+
93  * |inputA|           |inputB|         |outputA|           |outputB| MemoryBuffer
94  * |cFAA  |           |cFAA  |         |cFAA   |           |cFAA   |
95  * +------+           +------+         +-------+           +-------+
96  * </pre>
97  * @see ExecutionSystem.groupOperations method doing this step
98  * @see ExecutionSystem.addReadWriteBufferOperations
99  * @see NodeOperation.isComplex
100  * @see ExecutionGroup class representing the ExecutionGroup
101  */
102
103 /**
104  * @brief the ExecutionSystem contains the whole compositor tree.
105  */
106 class ExecutionSystem {
107 private:
108         /**
109          * @brief the context used during execution
110          */
111         CompositorContext m_context;
112
113         /**
114          * @brief vector of nodes
115          */
116         vector<Node *> m_nodes;
117
118         /**
119          * @brief vector of operations
120          */
121         vector<NodeOperation *> m_operations;
122
123         /**
124          * @brief vector of groups
125          */
126         vector<ExecutionGroup *> m_groups;
127
128         /**
129          * @brief vector of connections
130          */
131         vector<SocketConnection *> m_connections;
132
133 private: //methods
134         /**
135          * @brief add ReadBufferOperation and WriteBufferOperation around an operation
136          * @param operation the operation to add the bufferoperations around.
137          */
138         void addReadWriteBufferOperations(NodeOperation *operation);
139
140
141         /**
142          * find all execution group with output nodes
143          */
144         void findOutputExecutionGroup(vector<ExecutionGroup *> *result, CompositorPriority priority) const;
145         
146         /**
147          * find all execution group with output nodes
148          */
149         void findOutputExecutionGroup(vector<ExecutionGroup *> *result) const;
150
151 public:
152         /**
153          * @brief Create a new ExecutionSystem and initialize it with the
154          * editingtree.
155          *
156          * @param editingtree [bNodeTree*]
157          * @param rendering [true false]
158          */
159         ExecutionSystem(RenderData *rd, bNodeTree *editingtree, bool rendering);
160
161         /**
162          * Destructor
163          */
164         ~ExecutionSystem();
165
166
167         /**
168          * @brief execute this system
169          *  - initialize the NodeOperation's and ExecutionGroup's
170          *  - schedule the output ExecutionGroup's based on their priority
171          *  - deinitialize the ExecutionGroup's and NodeOperation's
172          */
173         void execute();
174
175         /**
176          * @brief Add an operation to the operation list
177          *
178          * @param operation the operation to add
179          */
180         void addOperation(NodeOperation *operation);
181
182         /**
183          * Add an editor link to the system. convert it to an socketconnection (CPP-representative)
184          * this converted socket is returned.
185          */
186         SocketConnection *addNodeLink(bNodeLink *bNodeLink);
187         void addSocketConnection(SocketConnection *connection);
188
189         /**
190          * @brief Convert all nodes to operations
191          */
192         void convertToOperations();
193
194         /**
195          * @brief group operations in ExecutionGroup's
196          * @see ExecutionGroup
197          */
198         void groupOperations();
199
200         /**
201          * @brief get the reference to the compositor context
202          */
203         CompositorContext& getContext() { return this->m_context; }
204
205         /**
206          * @brief get the reference to the compositor nodes
207          */
208         vector<Node *>& getNodes() { return this->m_nodes; }
209
210         /**
211          * @brief get the reference to the compositor connections
212          */
213         vector<SocketConnection *>& getConnections() { return this->m_connections; }
214
215         /**
216          * @brief get the reference to the list of execution groups
217          */
218         vector<ExecutionGroup *>& getExecutionGroups() { return this->m_groups; }
219
220         /**
221          * @brief get the reference to the list of operations
222          */
223         vector<NodeOperation *>& getOperations() { return this->m_operations; }
224
225 private:
226
227         /**
228          * @brief determine the actual data types of all sockets
229          * @param nodes list of nodes or operations to do the data type determination
230          */
231         void determineActualSocketDataTypes(vector<NodeBase *> &nodes);
232         
233         void executeGroups(CompositorPriority priority);
234
235 #ifdef WITH_CXX_GUARDEDALLOC
236         MEM_CXX_CLASS_ALLOC_FUNCS("COM:ExecutionSystem")
237 #endif
238 };
239
240 #endif /* _COM_ExecutionSystem_h */