Rename any instance of scene layer or render layer in code with view layer
[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
92 /* ********* */
93 /* Depsgraph */
94
95 /* Dependency Graph object */
96 struct Depsgraph {
97         // TODO(sergey): Go away from C++ container and use some native BLI.
98         typedef vector<OperationDepsNode *> OperationNodes;
99         typedef vector<IDDepsNode *> IDDepsNodes;
100
101         Depsgraph();
102         ~Depsgraph();
103
104         /**
105          * Convenience wrapper to find node given just pointer + property.
106          *
107          * \param ptr: pointer to the data that node will represent
108          * \param prop: optional property affected - providing this effectively
109          *              results in inner nodes being returned
110          *
111          * \return A node matching the required characteristics if it exists
112          * or NULL if no such node exists in the graph
113          */
114         DepsNode *find_node_from_pointer(const PointerRNA *ptr, const PropertyRNA *prop) const;
115
116         TimeSourceDepsNode *add_time_source();
117         TimeSourceDepsNode *find_time_source() const;
118
119         IDDepsNode *find_id_node(const ID *id) const;
120         IDDepsNode *add_id_node(ID *id, bool do_tag = true, ID *id_cow_hint = NULL);
121         void clear_id_nodes();
122
123         /* Add new relationship between two nodes. */
124         DepsRelation *add_new_relation(OperationDepsNode *from,
125                                        OperationDepsNode *to,
126                                        const char *description);
127
128         DepsRelation *add_new_relation(DepsNode *from,
129                                        DepsNode *to,
130                                        const char *description);
131
132         /* Tag a specific node as needing updates. */
133         void add_entry_tag(OperationDepsNode *node);
134
135         /* Clear storage used by all nodes. */
136         void clear_all_nodes();
137
138         /* Copy-on-Write Functionality ........ */
139
140         /* For given original ID get ID which is created by CoW system. */
141         ID *get_cow_id(const ID *id_orig) const;
142
143         /* Core Graph Functionality ........... */
144
145         /* <ID : IDDepsNode> mapping from ID blocks to nodes representing these
146          * blocks, used for quick lookups.
147          */
148         GHash *id_hash;
149
150         /* Ordered list of ID nodes, order matches ID allocation order.
151          * Used for faster iteration, especially for areas which are critical to
152          * keep exact order of iteration.
153          */
154         IDDepsNodes id_nodes;
155
156         /* Top-level time source node. */
157         TimeSourceDepsNode *time_source;
158
159         /* Indicates whether relations needs to be updated. */
160         bool need_update;
161
162         /* Quick-Access Temp Data ............. */
163
164         /* Nodes which have been tagged as "directly modified". */
165         GSet *entry_tags;
166
167         /* Convenience Data ................... */
168
169         /* XXX: should be collected after building (if actually needed?) */
170         /* All operation nodes, sorted in order of single-thread traversal order. */
171         OperationNodes operations;
172
173         /* Spin lock for threading-critical operations.
174          * Mainly used by graph evaluation.
175          */
176         SpinLock lock;
177
178         /* Scene and layer this dependency graph is built for. */
179         Scene *scene;
180         ViewLayer *view_layer;
181 };
182
183 }  // namespace DEG