Merge branch 'master' into blender2.8
[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 DEGEditorUpdateContext;
50 struct Group;
51 struct Main;
52 struct Scene;
53
54 namespace DEG {
55
56 /* Node Types Handling ================================================= */
57
58 /* "Typeinfo" for Node Types ------------------------------------------- */
59
60 /* Typeinfo Struct (nti) */
61 struct DepsNodeFactory {
62         virtual eDepsNode_Type type() const = 0;
63         virtual const char *tname() const = 0;
64         virtual int id_recalc_tag() const = 0;
65
66         virtual DepsNode *create_node(const ID *id,
67                                       const char *subdata,
68                                       const char *name) const = 0;
69 };
70
71 template <class NodeType>
72 struct DepsNodeFactoryImpl : public DepsNodeFactory {
73         eDepsNode_Type type() const { return NodeType::typeinfo.type; }
74         const char *tname() const { return NodeType::typeinfo.tname; }
75         int id_recalc_tag() const { return NodeType::typeinfo.id_recalc_tag; }
76
77         DepsNode *create_node(const ID *id, const char *subdata, const char *name) const
78         {
79                 DepsNode *node = OBJECT_GUARDED_NEW(NodeType);
80
81                 /* populate base node settings */
82                 node->type = type();
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_type_get_factory(const eDepsNode_Type type);
106
107 /* Editors Integration -------------------------------------------------- */
108
109 void deg_editors_id_update(const DEGEditorUpdateContext *update_ctx,
110                            struct ID *id);
111
112 void deg_editors_scene_update(const DEGEditorUpdateContext *update_ctx,
113                               bool updated);
114
115 #define DEG_DEBUG_PRINTF(...)               \
116         do {                                    \
117                 if (G.debug & G_DEBUG_DEPSGRAPH) {  \
118                         fprintf(stderr, __VA_ARGS__);   \
119                         fflush(stderr);                 \
120                 }                                   \
121         } while (0)
122
123 #define DEG_ERROR_PRINTF(...)               \
124         do {                                    \
125                 fprintf(stderr, __VA_ARGS__);       \
126                 fflush(stderr);                     \
127         } while (0)
128
129 }  // namespace DEG