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 GSet;
46 struct PointerRNA;
47 struct PropertyRNA;
48 struct Scene;
49
50 namespace DEG {
51
52 struct DepsNode;
53 struct TimeSourceDepsNode;
54 struct IDDepsNode;
55 struct ComponentDepsNode;
56 struct OperationDepsNode;
57
58 /* *************************** */
59 /* Relationships Between Nodes */
60
61 /* Settings/Tags on Relationship */
62 typedef enum eDepsRelation_Flag {
63         /* "touched" tag is used when filtering, to know which to collect */
64         DEPSREL_FLAG_TEMP_TAG   = (1 << 0),
65
66         /* "cyclic" link - when detecting cycles, this relationship was the one
67          * which triggers a cyclic relationship to exist in the graph
68          */
69         DEPSREL_FLAG_CYCLIC     = (1 << 1),
70 } eDepsRelation_Flag;
71
72 /* B depends on A (A -> B) */
73 struct DepsRelation {
74         /* the nodes in the relationship (since this is shared between the nodes) */
75         DepsNode *from;               /* A */
76         DepsNode *to;                 /* B */
77
78         /* relationship attributes */
79         const char *name;             /* label for debugging */
80
81         int flag;                     /* (eDepsRelation_Flag) */
82
83         DepsRelation(DepsNode *from,
84                      DepsNode *to,
85                      const char *description);
86
87         ~DepsRelation();
88 };
89
90 /* ********* */
91 /* Depsgraph */
92
93 /* Dependency Graph object */
94 struct Depsgraph {
95         typedef vector<OperationDepsNode *> OperationNodes;
96
97         Depsgraph();
98         ~Depsgraph();
99
100         /**
101          * Convenience wrapper to find node given just pointer + property.
102          *
103          * \param ptr: pointer to the data that node will represent
104          * \param prop: optional property affected - providing this effectively results in inner nodes being returned
105          *
106          * \return A node matching the required characteristics if it exists
107          * or NULL if no such node exists in the graph
108          */
109         DepsNode *find_node_from_pointer(const PointerRNA *ptr, const PropertyRNA *prop) const;
110
111         TimeSourceDepsNode *add_time_source();
112         TimeSourceDepsNode *find_time_source() const;
113
114         IDDepsNode *find_id_node(const ID *id) const;
115         IDDepsNode *add_id_node(ID *id, const char *name = "");
116         void clear_id_nodes();
117
118         /* Add new relationship between two nodes. */
119         DepsRelation *add_new_relation(OperationDepsNode *from,
120                                        OperationDepsNode *to,
121                                        const char *description);
122
123         DepsRelation *add_new_relation(DepsNode *from,
124                                        DepsNode *to,
125                                        const char *description);
126
127         /* Tag a specific node as needing updates. */
128         void add_entry_tag(OperationDepsNode *node);
129
130         /* Clear storage used by all nodes. */
131         void clear_all_nodes();
132
133         /* Core Graph Functionality ........... */
134
135         /* <ID : IDDepsNode> mapping from ID blocks to nodes representing these blocks
136          * (for quick lookups). */
137         GHash *id_hash;
138
139         /* Top-level time source node. */
140         TimeSourceDepsNode *time_source;
141
142         /* Indicates whether relations needs to be updated. */
143         bool need_update;
144
145         /* Quick-Access Temp Data ............. */
146
147         /* Nodes which have been tagged as "directly modified". */
148         GSet *entry_tags;
149
150         /* Convenience Data ................... */
151
152         /* XXX: should be collected after building (if actually needed?) */
153         /* All operation nodes, sorted in order of single-thread traversal order. */
154         OperationNodes operations;
155
156         /* Spin lock for threading-critical operations.
157          * Mainly used by graph evaluation.
158          */
159         SpinLock lock;
160
161         // XXX: additional stuff like eval contexts, mempools for allocating nodes from, etc.
162
163         Scene *scene; /* XXX: We really shouldn't do that, but it's required for shader preview */
164 };
165
166 }  // namespace DEG