Depsgraph: Cleanup, de-duplicate couple of utility functions
[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
27 /** \file blender/depsgraph/intern/depsgraph_intern.h
28  *  \ingroup depsgraph
29  *
30  * API's for internal use in the Depsgraph
31  * - Also, defines for "Node Type Info"
32  */
33
34 #pragma once
35
36 #include <cstdlib>
37
38 #include "MEM_guardedalloc.h"
39
40 extern "C" {
41 #include "BKE_global.h"
42 }
43
44 #include "intern/nodes/deg_node.h"
45 #include "intern/nodes/deg_node_component.h"
46 #include "intern/nodes/deg_node_operation.h"
47 #include "intern/depsgraph.h"
48
49 struct Main;
50 struct Group;
51 struct Scene;
52
53 namespace DEG {
54
55 /* Node Types Handling ================================================= */
56
57 /* "Typeinfo" for Node Types ------------------------------------------- */
58
59 /* Typeinfo Struct (nti) */
60 struct DepsNodeFactory {
61         virtual eDepsNode_Type type() const = 0;
62         virtual eDepsNode_Class tclass() const = 0;
63         virtual const char *tname() const = 0;
64
65         virtual DepsNode *create_node(const ID *id,
66                                       const char *subdata,
67                                       const char *name) const = 0;
68 };
69
70 template <class NodeType>
71 struct DepsNodeFactoryImpl : public DepsNodeFactory {
72         eDepsNode_Type type() const { return NodeType::typeinfo.type; }
73         eDepsNode_Class tclass() const { return NodeType::typeinfo.tclass; }
74         const char *tname() const { return NodeType::typeinfo.tname; }
75
76         DepsNode *create_node(const ID *id, const char *subdata, const char *name) const
77         {
78                 DepsNode *node = OBJECT_GUARDED_NEW(NodeType);
79
80                 /* populate base node settings */
81                 node->type = type();
82                 node->tclass = tclass();
83
84                 if (name[0] != '\0') {
85                         /* set name if provided ... */
86                         node->name = name;
87                 }
88                 else {
89                         /* ... otherwise use default type name */
90                         node->name = tname();
91                 }
92
93                 node->init(id, subdata);
94
95                 return node;
96         }
97 };
98
99 /* Typeinfo Management -------------------------------------------------- */
100
101 /* Register typeinfo */
102 void deg_register_node_typeinfo(DepsNodeFactory *factory);
103
104 /* Get typeinfo for specified type */
105 DepsNodeFactory *deg_get_node_factory(const eDepsNode_Type type);
106
107 /* Get typeinfo for provided node */
108 DepsNodeFactory *deg_node_get_factory(const DepsNode *node);
109
110 /* Editors Integration -------------------------------------------------- */
111
112 void deg_editors_id_update(struct Main *bmain, struct ID *id);
113
114 void deg_editors_scene_update(struct Main *bmain, struct Scene *scene, bool updated);
115
116 /* Tagging helpers ------------------------------------------------------ */
117
118 void lib_id_recalc_tag(struct Main *bmain, struct ID *id);
119 void lib_id_recalc_data_tag(struct Main *bmain, struct ID *id);
120
121 #define DEG_DEBUG_PRINTF(...) \
122         do { \
123                 if (G.debug & G_DEBUG_DEPSGRAPH) { \
124                         fprintf(stderr, __VA_ARGS__); \
125                 } \
126         } while (0)
127
128 }  // namespace DEG