Depsgraph: New dependency graph integration commit
[blender.git] / source / blender / depsgraph / intern / depsgraph_intern.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): None Yet
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  *
26  * API's for internal use in the Depsgraph
27  * - Also, defines for "Node Type Info"
28  */
29
30 #ifndef __DEPSGRAPH_INTERN_H__
31 #define __DEPSGRAPH_INTERN_H__
32
33 #include <cstdlib>
34
35 #include "MEM_guardedalloc.h"
36
37 #include "depsgraph.h"
38 #include "depsnode.h"
39
40 struct Main;
41 struct Group;
42 struct Scene;
43
44 /* Graph Building ======================================================== */
45
46 /**
47  * Build depsgraph for the given group, and dump results in given graph container
48  * This is usually used for building subgraphs for groups to use...
49  */
50 void DEG_graph_build_from_group(Depsgraph *graph, struct Main *bmain, struct Group *group);
51
52 /* Build subgraph for group */
53 DepsNode *DEG_graph_build_group_subgraph(Depsgraph *graph_main, struct Main *bmain, struct Group *group);
54
55 /* Graph Copying ========================================================= */
56 /* (Part of the Filtering API) */
57
58 /**
59  * Depsgraph Copying Context (dcc)
60  *
61  * Keeps track of node relationships/links/etc. during the copy
62  * operation so that they can be safely remapped...
63  */
64 typedef struct DepsgraphCopyContext {
65         struct GHash *nodes_hash;   /* <DepsNode, DepsNode> mapping from src node to dst node */
66         struct GHash *rels_hash;    // XXX: same for relationships?
67
68         // XXX: filtering criteria...
69 } DepsgraphCopyContext;
70
71 /* Internal Filtering API ---------------------------------------------- */
72
73 /* Create filtering context */
74 // XXX: needs params for conditions?
75 DepsgraphCopyContext *DEG_filter_init(void);
76
77 /* Free filtering context once filtering is done */
78 void DEG_filter_cleanup(DepsgraphCopyContext *dcc);
79
80
81 /* Data Copy Operations ------------------------------------------------ */
82
83 /**
84  * Make a (deep) copy of provided node and it's little subgraph
85  * \warning Newly created node is not added to the existing graph
86  * \param dcc: Context info for helping resolve links
87  */
88 DepsNode *DEG_copy_node(DepsgraphCopyContext *dcc, const DepsNode *src);
89
90 /* Node Types Handling ================================================= */
91
92 /* "Typeinfo" for Node Types ------------------------------------------- */
93
94 /* Typeinfo Struct (nti) */
95 struct DepsNodeFactory {
96         virtual eDepsNode_Type type() const = 0;
97         virtual eDepsNode_Class tclass() const = 0;
98         virtual const char *tname() const = 0;
99
100         virtual DepsNode *create_node(const ID *id, const string &subdata, const string &name) const = 0;
101         virtual DepsNode *copy_node(DepsgraphCopyContext *dcc, const DepsNode *copy) const = 0;
102 };
103
104 template <class NodeType>
105 struct DepsNodeFactoryImpl : public DepsNodeFactory {
106         eDepsNode_Type type() const { return NodeType::typeinfo.type; }
107         eDepsNode_Class tclass() const { return NodeType::typeinfo.tclass; }
108         const char *tname() const { return NodeType::typeinfo.tname; }
109
110         DepsNode *create_node(const ID *id, const string &subdata, const string &name) const
111         {
112                 DepsNode *node = OBJECT_GUARDED_NEW(NodeType);
113
114                 /* populate base node settings */
115                 node->type = type();
116                 node->tclass = tclass();
117
118                 if (!name.empty())
119                         /* set name if provided ... */
120                         node->name = name;
121                 else
122                         /* ... otherwise use default type name */
123                         node->name = tname();
124
125                 node->init(id, subdata);
126
127                 return node;
128         }
129
130         virtual DepsNode *copy_node(DepsgraphCopyContext *dcc, const DepsNode *copy) const
131         {
132                 BLI_assert(copy->type == type());
133                 DepsNode *node = OBJECT_GUARDED_NEW(NodeType);
134
135                 /* populate base node settings */
136                 node->type = type();
137                 node->tclass = tclass();
138                 // XXX: need to review the name here, as we can't have exact duplicates...
139                 node->name = copy->name;
140
141                 node->copy(dcc, static_cast<const NodeType *>(copy));
142
143                 return node;
144         }
145 };
146
147 /* Typeinfo Management -------------------------------------------------- */
148
149 /* Register typeinfo */
150 void DEG_register_node_typeinfo(DepsNodeFactory *factory);
151
152 /* Get typeinfo for specified type */
153 DepsNodeFactory *DEG_get_node_factory(const eDepsNode_Type type);
154
155 /* Get typeinfo for provided node */
156 DepsNodeFactory *DEG_node_get_factory(const DepsNode *node);
157
158 /* Editors Integration -------------------------------------------------- */
159
160 void deg_editors_id_update(struct Main *bmain, struct ID *id);
161
162 void deg_editors_scene_update(struct Main *bmain, struct Scene *scene, bool updated);
163
164 #endif  /* __DEPSGRAPH_INTERN_H__ */