Cleanup: remove non-existing function declarations
[blender.git] / source / blender / compositor / intern / COM_NodeOperationBuilder.h
1 /*
2  * Copyright 2013, 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  *      Lukas Toenne
20  */
21
22 #ifndef __COM_NODEOPERATIONBUILDER_H__
23 #define __COM_NODEOPERATIONBUILDER_H__
24
25 #include <map>
26 #include <set>
27 #include <vector>
28
29 #include "COM_NodeGraph.h"
30
31 using std::vector;
32
33 class CompositorContext;
34
35 class Node;
36 class NodeInput;
37 class NodeOutput;
38
39 class ExecutionSystem;
40 class ExecutionGroup;
41 class NodeOperation;
42 class NodeOperationInput;
43 class NodeOperationOutput;
44
45 class PreviewOperation;
46 class WriteBufferOperation;
47 class ViewerOperation;
48
49 class NodeOperationBuilder {
50 public:
51         class Link {
52         private:
53                 NodeOperationOutput *m_from;
54                 NodeOperationInput *m_to;
55
56         public:
57                 Link(NodeOperationOutput *from, NodeOperationInput *to) :
58                     m_from(from),
59                     m_to(to)
60                 {}
61
62                 NodeOperationOutput *from() const { return m_from; }
63                 NodeOperationInput *to() const { return m_to; }
64         };
65
66         typedef std::vector<NodeOperation *> Operations;
67         typedef std::vector<Link> Links;
68         typedef std::vector<ExecutionGroup *> Groups;
69
70         typedef std::map<NodeOperationInput *, NodeInput *> InputSocketMap;
71         typedef std::map<NodeOutput *, NodeOperationOutput *> OutputSocketMap;
72
73         typedef std::vector<NodeOperationInput *> OpInputs;
74         typedef std::map<NodeInput *, OpInputs> OpInputInverseMap;
75
76 private:
77         const CompositorContext *m_context;
78         NodeGraph m_graph;
79
80         Operations m_operations;
81         Links m_links;
82         Groups m_groups;
83
84         /** Maps operation inputs to node inputs */
85         InputSocketMap m_input_map;
86         /** Maps node outputs to operation outputs */
87         OutputSocketMap m_output_map;
88
89         Node *m_current_node;
90
91         /** Operation that will be writing to the viewer image
92          *  Only one operation can occupy this place at a time,
93          *  to avoid race conditions
94          */
95         ViewerOperation *m_active_viewer;
96
97 public:
98         NodeOperationBuilder(const CompositorContext *context, bNodeTree *b_nodetree);
99         ~NodeOperationBuilder();
100
101         const CompositorContext &context() const { return *m_context; }
102
103         void convertToOperations(ExecutionSystem *system);
104
105         void addOperation(NodeOperation *operation);
106
107         /** Map input socket of the current node to an operation socket */
108         void mapInputSocket(NodeInput *node_socket, NodeOperationInput *operation_socket);
109         /** Map output socket of the current node to an operation socket */
110         void mapOutputSocket(NodeOutput *node_socket, NodeOperationOutput *operation_socket);
111
112         void addLink(NodeOperationOutput *from, NodeOperationInput *to);
113         void removeInputLink(NodeOperationInput *to);
114
115         /** Add a preview operation for a operation output */
116         void addPreview(NodeOperationOutput *output);
117         /** Add a preview operation for a node input */
118         void addNodeInputPreview(NodeInput *input);
119
120         /** Define a viewer operation as the active output, if possible */
121         void registerViewer(ViewerOperation *viewer);
122         /** The currently active viewer output operation */
123         ViewerOperation *active_viewer() const { return m_active_viewer; }
124
125 protected:
126         static NodeInput *find_node_input(const InputSocketMap &map, NodeOperationInput *op_input);
127         static const OpInputs &find_operation_inputs(const OpInputInverseMap &map, NodeInput *node_input);
128         static NodeOperationOutput *find_operation_output(const OutputSocketMap &map, NodeOutput *node_output);
129
130         /** Add datatype conversion where needed */
131         void add_datatype_conversions();
132
133         /** Construct a constant value operation for every unconnected input */
134         void add_operation_input_constants();
135         void add_input_constant_value(NodeOperationInput *input, NodeInput *node_input);
136
137         /** Replace proxy operations with direct links */
138         void resolve_proxies();
139
140         /** Calculate resolution for each operation */
141         void determineResolutions();
142
143         /** Helper function to store connected inputs for replacement */
144         OpInputs cache_output_links(NodeOperationOutput *output) const;
145         /** Find a connected write buffer operation to an OpOutput */
146         WriteBufferOperation *find_attached_write_buffer_operation(NodeOperationOutput *output) const;
147         /** Add read/write buffer operations around complex operations */
148         void add_complex_operation_buffers();
149         void add_input_buffers(NodeOperation *operation, NodeOperationInput *input);
150         void add_output_buffers(NodeOperation *operation, NodeOperationOutput *output);
151
152         /** Remove unreachable operations */
153         void prune_operations();
154
155         /** Sort operations by link dependencies */
156         void sort_operations();
157
158         /** Create execution groups */
159         void group_operations();
160         ExecutionGroup *make_group(NodeOperation *op);
161
162 private:
163         PreviewOperation *make_preview_operation() const;
164
165 #ifdef WITH_CXX_GUARDEDALLOC
166         MEM_CXX_CLASS_ALLOC_FUNCS("COM:NodeCompilerImpl")
167 #endif
168 };
169
170 #endif /* __COM_NODEOPERATIONBUILDER_H__ */