* make it possible to composite without an compositor node [#31878]
[blender.git] / source / blender / compositor / intern / COM_ExecutionSystemHelper.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_ExecutionSystemHelper_h
26 #define _COM_ExecutionSystemHelper_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
35 using namespace std;
36
37 /**
38  *
39  */
40 class ExecutionSystemHelper {
41
42 public:
43
44         /**
45          * @brief add an bNodeTree to the nodes list and connections
46          * @param system Execution system
47          * @param nodes_start Starting index in the system's nodes list for nodes in this tree.
48          * @param tree bNodeTree to add
49          * @return Node representing the "Compositor node" of the maintree. or NULL when a subtree is added
50          */
51         static void addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree *tree, bNode *groupnode);
52
53         /**
54          * @brief add an editor node to the system.
55          * this node is converted to a Node instance.
56          * and the converted node is returned
57          *
58          * @param bNode node to add
59          * @return Node that represents the bNode or null when not able to convert.
60          */
61         static Node *addNode(vector<Node *>& nodes, bNode *bNode, bool isInActiveGroup);
62
63         /**
64          * @brief Add a Node to a list
65          *
66          * @param nodes the list where the node needs to be added to
67          * @param node the node to be added
68          */
69         static void addNode(vector<Node *>& nodes, Node *node);
70
71         /**
72          * @brief Add an operation to the operation list
73          *
74          * The id of the operation is updated.
75          *
76          * @param operations the list where the operation need to be added to
77          * @param operation the operation to add
78          */
79         static void addOperation(vector<NodeOperation *> &operations, NodeOperation *operation);
80
81         /**
82          * @brief Add an ExecutionGroup to a list
83          *
84          * The id of the ExecutionGroup is updated.
85          *
86          * @param executionGroups the list where the executionGroup need to be added to
87          * @param executionGroup the ExecutionGroup to add
88          */
89         static void addExecutionGroup(vector<ExecutionGroup *>& executionGroups, ExecutionGroup *executionGroup);
90
91         /**
92          * Find all Node Operations that needs to be executed.
93          * @param rendering
94          * the rendering parameter will tell what type of execution we are doing
95          * FALSE is editing, TRUE is rendering
96          */
97         static void findOutputNodeOperations(vector<NodeOperation *> *result, vector<NodeOperation *>& operations, bool rendering);
98
99         /**
100          * @brief add a bNodeLink to the list of links
101          * the bNodeLink will be wrapped in a SocketConnection
102          *
103          * @note Cyclic links will be ignored
104          *
105          * @param node_range list of possible nodes for lookup.
106          * @param links list of links to add the bNodeLink to
107          * @param bNodeLink the link to be added
108          * @return the created SocketConnection or NULL
109          */
110         static SocketConnection *addNodeLink(NodeRange &node_range, vector<SocketConnection *>& links, bNodeLink *bNodeLink);
111
112         /**
113          * @brief create a new SocketConnection and add to a vector of links
114          * @param links the vector of links
115          * @param fromSocket the startpoint of the connection
116          * @param toSocket the endpoint of the connection
117          * @return the new created SocketConnection
118          */
119         static SocketConnection *addLink(vector<SocketConnection *>& links, OutputSocket *fromSocket, InputSocket *toSocket);
120
121         /**
122          * @brief dumps the content of the execution system to standard out
123          * @param system the execution system to dump
124          */
125         static void debugDump(ExecutionSystem *system);
126 };
127 #endif