Merge branch 'master' into blender2.8
[blender.git] / source / blender / depsgraph / intern / depsgraph.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
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  * The Original Code is Copyright (C) 2013 Blender Foundation.
19  * All rights reserved.
20  *
21  * Original Author: Joshua Leung
22  * Contributor(s): Sergey Sharybin
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/depsgraph/intern/depsgraph.h
28  *  \ingroup depsgraph
29  *
30  * Datatypes for internal use in the Depsgraph
31  *
32  * All of these datatypes are only really used within the "core" depsgraph.
33  * In particular, node types declared here form the structure of operations
34  * in the graph.
35  */
36
37 #pragma once
38
39 #include "BLI_threads.h"  /* for SpinLock */
40
41 #include "intern/depsgraph_types.h"
42
43 struct ID;
44 struct GHash;
45 struct Main;
46 struct GSet;
47 struct PointerRNA;
48 struct PropertyRNA;
49 struct Scene;
50 struct ViewLayer;
51
52 namespace DEG {
53
54 struct DepsNode;
55 struct TimeSourceDepsNode;
56 struct IDDepsNode;
57 struct ComponentDepsNode;
58 struct OperationDepsNode;
59
60 /* *************************** */
61 /* Relationships Between Nodes */
62
63 /* Settings/Tags on Relationship */
64 typedef enum eDepsRelation_Flag {
65         /* "touched" tag is used when filtering, to know which to collect */
66         DEPSREL_FLAG_TEMP_TAG   = (1 << 0),
67
68         /* "cyclic" link - when detecting cycles, this relationship was the one
69          * which triggers a cyclic relationship to exist in the graph
70          */
71         DEPSREL_FLAG_CYCLIC     = (1 << 1),
72 } eDepsRelation_Flag;
73
74 /* B depends on A (A -> B) */
75 struct DepsRelation {
76         /* the nodes in the relationship (since this is shared between the nodes) */
77         DepsNode *from;               /* A */
78         DepsNode *to;                 /* B */
79
80         /* relationship attributes */
81         const char *name;             /* label for debugging */
82
83         int flag;                     /* (eDepsRelation_Flag) */
84
85         DepsRelation(DepsNode *from,
86                      DepsNode *to,
87                      const char *description);
88
89         ~DepsRelation();
90
91         void unlink();
92 };
93
94 /* ********* */
95 /* Depsgraph */
96
97 /* Dependency Graph object */
98 struct Depsgraph {
99         // TODO(sergey): Go away from C++ container and use some native BLI.
100         typedef vector<OperationDepsNode *> OperationNodes;
101         typedef vector<IDDepsNode *> IDDepsNodes;
102
103         Depsgraph();
104         ~Depsgraph();
105
106         /**
107          * Convenience wrapper to find node given just pointer + property.
108          *
109          * \param ptr: pointer to the data that node will represent
110          * \param prop: optional property affected - providing this effectively
111          *              results in inner nodes being returned
112          *
113          * \return A node matching the required characteristics if it exists
114          * or NULL if no such node exists in the graph
115          */
116         DepsNode *find_node_from_pointer(const PointerRNA *ptr, const PropertyRNA *prop) const;
117
118         TimeSourceDepsNode *add_time_source();
119         TimeSourceDepsNode *find_time_source() const;
120
121         IDDepsNode *find_id_node(const ID *id) const;
122         IDDepsNode *add_id_node(ID *id, bool do_tag = true, ID *id_cow_hint = NULL);
123         void clear_id_nodes();
124
125         /* Add new relationship between two nodes. */
126         DepsRelation *add_new_relation(OperationDepsNode *from,
127                                        OperationDepsNode *to,
128                                        const char *description,
129                                        bool check_unique = false);
130
131         DepsRelation *add_new_relation(DepsNode *from,
132                                        DepsNode *to,
133                                        const char *description,
134                                        bool check_unique = false);
135
136         /* Check whether two nodes are connected by relation with given
137          * description. Description might be NULL to check ANY relation between
138          * given nodes.
139          */
140         DepsRelation *check_nodes_connected(const DepsNode *from,
141                                             const DepsNode *to,
142                                             const char *description);
143
144         /* Tag a specific node as needing updates. */
145         void add_entry_tag(OperationDepsNode *node);
146
147         /* Clear storage used by all nodes. */
148         void clear_all_nodes();
149
150         /* Copy-on-Write Functionality ........ */
151
152         /* For given original ID get ID which is created by CoW system. */
153         ID *get_cow_id(const ID *id_orig) const;
154
155         /* Core Graph Functionality ........... */
156
157         /* <ID : IDDepsNode> mapping from ID blocks to nodes representing these
158          * blocks, used for quick lookups.
159          */
160         GHash *id_hash;
161
162         /* Ordered list of ID nodes, order matches ID allocation order.
163          * Used for faster iteration, especially for areas which are critical to
164          * keep exact order of iteration.
165          */
166         IDDepsNodes id_nodes;
167
168         /* Top-level time source node. */
169         TimeSourceDepsNode *time_source;
170
171         /* Indicates whether relations needs to be updated. */
172         bool need_update;
173
174         /* Quick-Access Temp Data ............. */
175
176         /* Nodes which have been tagged as "directly modified". */
177         GSet *entry_tags;
178
179         /* Convenience Data ................... */
180
181         /* XXX: should be collected after building (if actually needed?) */
182         /* All operation nodes, sorted in order of single-thread traversal order. */
183         OperationNodes operations;
184
185         /* Spin lock for threading-critical operations.
186          * Mainly used by graph evaluation.
187          */
188         SpinLock lock;
189
190         /* Scene and layer this dependency graph is built for. */
191         Scene *scene;
192         ViewLayer *view_layer;
193 };
194
195 }  // namespace DEG