bgl do not bind parts of OpenGL that are not exposed in core profiles
[blender.git] / source / blender / depsgraph / intern / builder / deg_builder_relations.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: Lukas Toenne
22  * Contributor(s): None Yet
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/depsgraph/intern/builder/deg_builder_relations.h
28  *  \ingroup depsgraph
29  */
30
31 #pragma once
32
33 #include <cstdio>
34
35 #include "intern/depsgraph_types.h"
36
37 #include "DNA_ID.h"
38
39 #include "RNA_access.h"
40 #include "RNA_types.h"
41
42 #include "BLI_utildefines.h"
43 #include "BLI_string.h"
44
45 #include "intern/nodes/deg_node.h"
46 #include "intern/nodes/deg_node_operation.h"
47
48 struct Base;
49 struct bGPdata;
50 struct ListBase;
51 struct GHash;
52 struct ID;
53 struct FCurve;
54 struct Group;
55 struct Key;
56 struct Main;
57 struct Material;
58 struct MTex;
59 struct bNodeTree;
60 struct Object;
61 struct bPoseChannel;
62 struct bConstraint;
63 struct Scene;
64 struct Tex;
65 struct World;
66 struct EffectorWeights;
67 struct ParticleSystem;
68
69 struct PropertyRNA;
70
71 namespace DEG {
72
73 struct Depsgraph;
74 struct DepsNode;
75 struct DepsNodeHandle;
76 struct RootDepsNode;
77 struct SubgraphDepsNode;
78 struct IDDepsNode;
79 struct TimeSourceDepsNode;
80 struct ComponentDepsNode;
81 struct OperationDepsNode;
82 struct RootPChanMap;
83
84 struct RootKey {
85         RootKey();
86 };
87
88 struct TimeSourceKey
89 {
90         TimeSourceKey();
91         TimeSourceKey(ID *id);
92
93         string identifier() const;
94
95         ID *id;
96 };
97
98 struct ComponentKey
99 {
100         ComponentKey();
101         ComponentKey(ID *id, eDepsNode_Type type, const char *name = "");
102
103         string identifier() const;
104
105         ID *id;
106         eDepsNode_Type type;
107         const char *name;
108 };
109
110 struct OperationKey
111 {
112         OperationKey();
113         OperationKey(ID *id,
114                      eDepsNode_Type component_type,
115                      const char *name,
116                      int name_tag = -1);
117         OperationKey(ID *id,
118                      eDepsNode_Type component_type,
119                      const char *component_name,
120                      const char *name,
121                      int name_tag);
122
123         OperationKey(ID *id,
124                      eDepsNode_Type component_type,
125                      eDepsOperation_Code opcode);
126         OperationKey(ID *id,
127                      eDepsNode_Type component_type,
128                      const char *component_name,
129                      eDepsOperation_Code opcode);
130
131         OperationKey(ID *id,
132                      eDepsNode_Type component_type,
133                      eDepsOperation_Code opcode,
134                      const char *name,
135                      int name_tag = -1);
136         OperationKey(ID *id,
137                      eDepsNode_Type component_type,
138                      const char *component_name,
139                      eDepsOperation_Code opcode,
140                      const char *name,
141                      int name_tag = -1);
142
143         string identifier() const;
144
145         ID *id;
146         eDepsNode_Type component_type;
147         const char *component_name;
148         eDepsOperation_Code opcode;
149         const char *name;
150         int name_tag;
151 };
152
153 struct RNAPathKey
154 {
155         /* NOTE: see depsgraph_build.cpp for implementation */
156         RNAPathKey(ID *id, const char *path);
157
158         RNAPathKey(ID *id, const PointerRNA &ptr, PropertyRNA *prop);
159
160         string identifier() const;
161
162         ID *id;
163         PointerRNA ptr;
164         PropertyRNA *prop;
165 };
166
167 struct DepsgraphRelationBuilder
168 {
169         DepsgraphRelationBuilder(Depsgraph *graph);
170
171         template <typename KeyFrom, typename KeyTo>
172         void add_relation(const KeyFrom& key_from,
173                           const KeyTo& key_to,
174                           eDepsRelation_Type type,
175                           const char *description);
176
177         template <typename KeyTo>
178         void add_relation(const TimeSourceKey& key_from,
179                           const KeyTo& key_to,
180                           eDepsRelation_Type type,
181                           const char *description);
182
183         template <typename KeyType>
184         void add_node_handle_relation(const KeyType& key_from,
185                                       const DepsNodeHandle *handle,
186                                       eDepsRelation_Type type,
187                                       const char *description);
188
189         void build_scene(Main *bmain, Scene *scene);
190         void build_group(Main *bmain, Scene *scene, Object *object, Group *group);
191         void build_object(Main *bmain, Scene *scene, Object *ob);
192         void build_object_parent(Object *ob);
193         void build_constraints(Scene *scene, ID *id,
194                                eDepsNode_Type component_type,
195                                const char *component_subdata,
196                                ListBase *constraints,
197                                RootPChanMap *root_map);
198         void build_animdata(ID *id);
199         void build_driver(ID *id, FCurve *fcurve);
200         void build_world(World *world);
201         void build_rigidbody(Scene *scene);
202         void build_particles(Scene *scene, Object *ob);
203         void build_ik_pose(Object *ob,
204                            bPoseChannel *pchan,
205                            bConstraint *con,
206                            RootPChanMap *root_map);
207         void build_splineik_pose(Object *ob,
208                                  bPoseChannel *pchan,
209                                  bConstraint *con,
210                                  RootPChanMap *root_map);
211         void build_rig(Scene *scene, Object *ob);
212         void build_proxy_rig(Object *ob);
213         void build_shapekeys(ID *obdata, Key *key);
214         void build_obdata_geom(Main *bmain, Scene *scene, Object *ob);
215         void build_camera(Object *ob);
216         void build_lamp(Object *ob);
217         void build_nodetree(ID *owner, bNodeTree *ntree);
218         void build_material(ID *owner, Material *ma);
219         void build_texture(ID *owner, Tex *tex);
220         void build_texture_stack(ID *owner, MTex **texture_stack);
221         void build_compositor(Scene *scene);
222         void build_gpencil(ID *owner, bGPdata *gpd);
223
224         void add_collision_relations(const OperationKey &key, Scene *scene, Object *ob, Group *group, int layer, bool dupli, const char *name);
225         void add_forcefield_relations(const OperationKey &key, Scene *scene, Object *ob, EffectorWeights *eff, bool add_absorption, const char *name);
226
227         template <typename KeyType>
228         OperationDepsNode *find_operation_node(const KeyType &key);
229
230 protected:
231         RootDepsNode *find_node(const RootKey &key) const;
232         TimeSourceDepsNode *find_node(const TimeSourceKey &key) const;
233         ComponentDepsNode *find_node(const ComponentKey &key) const;
234         OperationDepsNode *find_node(const OperationKey &key) const;
235         DepsNode *find_node(const RNAPathKey &key) const;
236         OperationDepsNode *has_node(const OperationKey &key) const;
237
238         void add_time_relation(TimeSourceDepsNode *timesrc,
239                                DepsNode *node_to,
240                                const char *description);
241         void add_operation_relation(OperationDepsNode *node_from,
242                                     OperationDepsNode *node_to,
243                                     eDepsRelation_Type type,
244                                     const char *description);
245
246         template <typename KeyType>
247         DepsNodeHandle create_node_handle(const KeyType& key,
248                                           const char *default_name = "");
249
250         bool needs_animdata_node(ID *id);
251
252 private:
253         Depsgraph *m_graph;
254 };
255
256 struct DepsNodeHandle
257 {
258         DepsNodeHandle(DepsgraphRelationBuilder *builder, OperationDepsNode *node, const char *default_name = "") :
259             builder(builder),
260             node(node),
261             default_name(default_name)
262         {
263                 BLI_assert(node != NULL);
264         }
265
266         DepsgraphRelationBuilder *builder;
267         OperationDepsNode *node;
268         const char *default_name;
269 };
270
271 /* Utilities for Builders ----------------------------------------------------- */
272
273 template <typename KeyType>
274 OperationDepsNode *DepsgraphRelationBuilder::find_operation_node(const KeyType& key)
275 {
276         DepsNode *node = find_node(key);
277         return node != NULL ? node->get_exit_operation() : NULL;
278 }
279
280 template <typename KeyFrom, typename KeyTo>
281 void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from,
282                                             const KeyTo &key_to,
283                                             eDepsRelation_Type type,
284                                             const char *description)
285 {
286         DepsNode *node_from = find_node(key_from);
287         DepsNode *node_to = find_node(key_to);
288         OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
289         OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
290         if (op_from && op_to) {
291                 add_operation_relation(op_from, op_to, type, description);
292         }
293         else {
294                 if (!op_from) {
295                         /* XXX TODO handle as error or report if needed */
296                         node_from = find_node(key_from);
297                         fprintf(stderr, "add_relation(%d, %s) - Could not find op_from (%s)\n",
298                                 type, description, key_from.identifier().c_str());
299                 }
300                 else {
301                         fprintf(stderr, "add_relation(%d, %s) - Failed, but op_from (%s) was ok\n",
302                                 type, description, key_from.identifier().c_str());
303                 }
304                 if (!op_to) {
305                         /* XXX TODO handle as error or report if needed */
306                         fprintf(stderr, "add_relation(%d, %s) - Could not find op_to (%s)\n",
307                                 type, description, key_to.identifier().c_str());
308                 }
309                 else {
310                         fprintf(stderr, "add_relation(%d, %s) - Failed, but op_to (%s) was ok\n",
311                                 type, description, key_to.identifier().c_str());
312                 }
313         }
314 }
315
316 template <typename KeyTo>
317 void DepsgraphRelationBuilder::add_relation(const TimeSourceKey &key_from,
318                                             const KeyTo &key_to,
319                                             eDepsRelation_Type type,
320                                             const char *description)
321 {
322         (void)type;  /* Ignored in release builds. */
323         BLI_assert(type == DEPSREL_TYPE_TIME);
324         TimeSourceDepsNode *time_from = find_node(key_from);
325         DepsNode *node_to = find_node(key_to);
326         OperationDepsNode *op_to = node_to ? node_to->get_entry_operation() : NULL;
327         if (time_from && op_to) {
328                 add_time_relation(time_from, op_to, description);
329         }
330         else {
331         }
332 }
333
334 template <typename KeyType>
335 void DepsgraphRelationBuilder::add_node_handle_relation(
336         const KeyType &key_from,
337         const DepsNodeHandle *handle,
338         eDepsRelation_Type type,
339         const char *description)
340 {
341         DepsNode *node_from = find_node(key_from);
342         OperationDepsNode *op_from = node_from ? node_from->get_exit_operation() : NULL;
343         OperationDepsNode *op_to = handle->node->get_entry_operation();
344         if (op_from && op_to) {
345                 add_operation_relation(op_from, op_to, type, description);
346         }
347         else {
348                 if (!op_from) {
349                         fprintf(stderr, "add_node_handle_relation(%d, %s) - Could not find op_from (%s)\n",
350                                 type, description, key_from.identifier().c_str());
351                 }
352                 if (!op_to) {
353                         fprintf(stderr, "add_node_handle_relation(%d, %s) - Could not find op_to (%s)\n",
354                                 type, description, key_from.identifier().c_str());
355                 }
356         }
357 }
358
359 template <typename KeyType>
360 DepsNodeHandle DepsgraphRelationBuilder::create_node_handle(
361         const KeyType &key,
362         const char *default_name)
363 {
364         return DepsNodeHandle(this, find_node(key), default_name);
365 }
366
367 }  // namespace DEG