Cleanup: remove non-existing function declarations
[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_color_types.h"
29 #include "DNA_node_types.h"
30 #include "COM_Node.h"
31 #include "BKE_text.h"
32 #include "COM_ExecutionGroup.h"
33 #include "COM_NodeOperation.h"
34
35 /**
36  * \page execution Execution model
37  * In order to get to an efficient model for execution, several steps are being done. these steps are explained below.
38  *
39  * \section EM_Step1 Step 1: translating blender node system to the new compsitor system
40  * Blenders node structure is based on C structs (DNA). These structs are not efficient in the new architecture.
41  * We want to use classes in order to simplify the system.
42  * during this step the blender node_tree is evaluated and converted to a CPP node system.
43  *
44  * \see ExecutionSystem
45  * \see Converter.convert
46  * \see Node
47  *
48  * \section EM_Step2 Step2: translating nodes to operations
49  * Ungrouping the GroupNodes. Group nodes are node_tree's in node_tree's.
50  * The new system only supports a single level of node_tree. We will 'flatten' the system in a single level.
51  * \see GroupNode
52  * \see ExecutionSystemHelper.ungroup
53  *
54  * Every node has the ability to convert itself to operations. The node itself is responsible to create a correct
55  * 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,
57  * but replaces itself with a ConvertColorToBWOperation.
58  * More complex nodes can use different NodeOperation based on settings; like MixNode.
59  * based on the selected Mixtype a different operation will be used.
60  * for more information see the page about creating new Nodes. [@subpage newnode]
61  *
62  * \see ExecutionSystem.convertToOperations
63  * \see Node.convertToOperations
64  * \see NodeOperation base class for all operations in the system
65  *
66  * \section EM_Step3 Step3: add additional conversions to the operation system
67  *   - Data type conversions: the system has 3 data types COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR.
68  *     The user can connect a Value socket to a color socket.
69  *     As values are ordered differently than colors a conversion happens.
70  *
71  *   - Image size conversions: the system can automatically convert when resolutions do not match.
72  *     An NodeInput has a resize mode. This can be any of the following settings.
73  *     - [@ref InputSocketResizeMode.COM_SC_CENTER]: The center of both images are aligned
74  *     - [@ref InputSocketResizeMode.COM_SC_FIT_WIDTH]: The width of both images are aligned
75  *     - [@ref InputSocketResizeMode.COM_SC_FIT_HEIGHT]: the height of both images are aligned
76  *     - [@ref InputSocketResizeMode.COM_SC_FIT]: The width, or the height of both images are aligned to make sure that it fits.
77  *     - [@ref InputSocketResizeMode.COM_SC_STRETCH]: The width and the height of both images are aligned
78  *     - [@ref InputSocketResizeMode.COM_SC_NO_RESIZE]: bottom left of the images are aligned.
79  *
80  * \see Converter.convertDataType Datatype conversions
81  * \see Converter.convertResolution Image size conversions
82  *
83  * \section EM_Step4 Step4: group operations in executions groups
84  * ExecutionGroup are groups of operations that are calculated as being one bigger operation.
85  * All operations will be part of an ExecutionGroup.
86  * Complex nodes will be added to separate groups. Between ExecutionGroup's the data will be stored in MemoryBuffers.
87  * ReadBufferOperations and WriteBufferOperations are added where needed.
88  *
89  * <pre>
90  *
91  *        +------------------------------+      +----------------+
92  *        | ExecutionGroup A             |      |ExecutionGroup B|   ExecutionGroup
93  *        | +----------+     +----------+|      |+----------+    |
94  *   /----->| Operation|---->| Operation|-\ /--->| Operation|-\  |   NodeOperation
95  *   |    | | A        |     | B        ||| |   || C        | |  |
96  *   |    | | cFFA     |  /->| cFFA     ||| |   || cFFA     | |  |
97  *   |    | +----------+  |  +----------+|| |   |+----------+ |  |
98  *   |    +---------------|--------------+v |   +-------------v--+
99  * +-*----+           +---*--+         +--*-*--+           +--*----+
100  * |inputA|           |inputB|         |outputA|           |outputB| MemoryBuffer
101  * |cFAA  |           |cFAA  |         |cFAA   |           |cFAA   |
102  * +------+           +------+         +-------+           +-------+
103  * </pre>
104  * \see ExecutionSystem.groupOperations method doing this step
105  * \see ExecutionSystem.addReadWriteBufferOperations
106  * \see NodeOperation.isComplex
107  * \see ExecutionGroup class representing the ExecutionGroup
108  */
109
110 /**
111  * \brief the ExecutionSystem contains the whole compositor tree.
112  */
113 class ExecutionSystem {
114 public:
115         typedef std::vector<NodeOperation*> Operations;
116         typedef std::vector<ExecutionGroup*> Groups;
117
118 private:
119         /**
120          * \brief the context used during execution
121          */
122         CompositorContext m_context;
123
124         /**
125          * \brief vector of operations
126          */
127         Operations m_operations;
128
129         /**
130          * \brief vector of groups
131          */
132         Groups m_groups;
133
134 private: //methods
135         /**
136          * find all execution group with output nodes
137          */
138         void findOutputExecutionGroup(vector<ExecutionGroup *> *result, CompositorPriority priority) const;
139
140         /**
141          * find all execution group with output nodes
142          */
143         void findOutputExecutionGroup(vector<ExecutionGroup *> *result) const;
144
145 public:
146         /**
147          * \brief Create a new ExecutionSystem and initialize it with the
148          * editingtree.
149          *
150          * \param editingtree: [bNodeTree *]
151          * \param rendering: [true false]
152          */
153         ExecutionSystem(RenderData *rd, Scene *scene, bNodeTree *editingtree, bool rendering, bool fastcalculation,
154                         const ColorManagedViewSettings *viewSettings, const ColorManagedDisplaySettings *displaySettings,
155                         const char *viewName);
156
157         /**
158          * Destructor
159          */
160         ~ExecutionSystem();
161
162         void set_operations(const Operations &operations, const Groups &groups);
163
164         /**
165          * \brief execute this system
166          * - initialize the NodeOperation's and ExecutionGroup's
167          * - schedule the output ExecutionGroup's based on their priority
168          * - deinitialize the ExecutionGroup's and NodeOperation's
169          */
170         void execute();
171
172         /**
173          * \brief get the reference to the compositor context
174          */
175         const CompositorContext &getContext() const { return this->m_context; }
176
177 private:
178         void executeGroups(CompositorPriority priority);
179
180         /* allow the DebugInfo class to look at internals */
181         friend class DebugInfo;
182
183 #ifdef WITH_CXX_GUARDEDALLOC
184         MEM_CXX_CLASS_ALLOC_FUNCS("COM:ExecutionSystem")
185 #endif
186 };
187
188 #endif /* __COM_EXECUTIONSYSTEM_H__ */