Cleanup: commas at the end of enums
[blender.git] / source / blender / blenkernel / depsgraph_private.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) 2004 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): none yet.
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file blender/blenkernel/depsgraph_private.h
27  *  \ingroup bke
28  */
29
30 #ifndef __DEPSGRAPH_PRIVATE_H__
31 #define __DEPSGRAPH_PRIVATE_H__
32
33 #include "BKE_depsgraph.h"
34 #include "DNA_constraint_types.h"
35 #include "BKE_constraint.h"
36
37 struct Scene;
38 struct Group;
39 struct EffectorWeights;
40 struct ModifierData;
41
42 /* **** DAG relation types *** */
43
44 /* scene link to object */
45 #define DAG_RL_SCENE        (1 << 0)
46 /* object link to data */
47 #define DAG_RL_DATA         (1 << 1)
48
49 /* object changes object (parent, track, constraints) */
50 #define DAG_RL_OB_OB        (1 << 2)
51 /* object changes obdata (hooks, constraints) */
52 #define DAG_RL_OB_DATA      (1 << 3)
53 /* data changes object (vertex parent) */
54 #define DAG_RL_DATA_OB      (1 << 4)
55 /* data changes data (deformers) */
56 #define DAG_RL_DATA_DATA    (1 << 5)
57
58 #define DAG_NO_RELATION     (1 << 6)
59
60 #define DAG_RL_ALL_BUT_DATA (DAG_RL_SCENE | DAG_RL_OB_OB | DAG_RL_OB_DATA | DAG_RL_DATA_OB | DAG_RL_DATA_DATA)
61 #define DAG_RL_ALL          (DAG_RL_ALL_BUT_DATA | DAG_RL_DATA)
62
63
64 #define DAGQUEUEALLOC 50
65
66 enum {
67         DAG_WHITE = 0,
68         DAG_GRAY = 1,
69         DAG_BLACK = 2,
70 };
71
72 typedef struct DagAdjList {
73         struct DagNode *node;
74         short type;
75         int count;  /* number of identical arcs */
76         unsigned int lay;   // for flushing redraw/rebuild events
77         const char *name;
78         struct DagAdjList *next;
79 } DagAdjList;
80
81
82 typedef struct DagNode {
83         int color;
84         short type;
85         float x, y, k;
86         void *ob;
87         void *first_ancestor;
88         int ancestor_count;
89         unsigned int lay;               /* accumulated layers of its relations + itself */
90         unsigned int scelay;            /* layers due to being in scene */
91         uint64_t customdata_mask;       /* customdata mask */
92         int lasttime;       /* if lasttime != DagForest->time, this node was not evaluated yet for flushing */
93         int BFS_dist;       /* BFS distance */
94         int DFS_dist;       /* DFS distance */
95         int DFS_dvtm;       /* DFS discovery time */
96         int DFS_fntm;       /* DFS Finishing time */
97         struct DagAdjList *child;
98         struct DagAdjList *parent;
99         struct DagNode *next;
100
101         /* Threaded evaluation routines */
102         uint32_t num_pending_parents;  /* number of parents which are not updated yet
103                                         * this node has got.
104                                         * Used by threaded update for faster detect whether node could be
105                                         * updated aready.
106                                         */
107         bool scheduled;
108
109         /* Runtime flags mainly used to determine which extra data is to be evaluated
110          * during object_handle_update(). Such an extra data is what depends on the
111          * DAG topology, meaning this flags indicates the data evaluation of which
112          * depends on the node dependencies.
113          */
114         short eval_flags;
115 } DagNode;
116
117 typedef struct DagNodeQueueElem {
118         struct DagNode *node;
119         struct DagNodeQueueElem *next;
120 } DagNodeQueueElem;
121
122 typedef struct DagNodeQueue {
123         DagNodeQueueElem *first;
124         DagNodeQueueElem *last;
125         int count;
126         int maxlevel;
127         struct DagNodeQueue *freenodes;
128 } DagNodeQueue;
129
130 /* forest as we may have more than one DAG unconnected */
131 typedef struct DagForest {
132         ListBase DagNode;
133         struct GHash *nodeHash;
134         int numNodes;
135         bool is_acyclic;
136         int time;  /* for flushing/tagging, compare with node->lasttime */
137         bool ugly_hack_sorry;  /* prevent type check */
138         bool need_update;
139 } DagForest;
140
141 // queue operations
142 DagNodeQueue *queue_create(int slots);
143 void queue_raz(DagNodeQueue *queue);
144 void push_queue(DagNodeQueue *queue, DagNode *node);
145 void push_stack(DagNodeQueue *queue, DagNode *node);
146 DagNode *pop_queue(DagNodeQueue *queue);
147 DagNode *get_top_node_queue(DagNodeQueue *queue);
148 void queue_delete(DagNodeQueue *queue);
149
150 // Dag management
151 DagForest *dag_init(void);
152 DagForest *build_dag(struct Main *bmain, struct Scene *sce, short mask);
153 void free_forest(struct DagForest *Dag);
154 DagNode *dag_find_node(DagForest *forest, void *fob);
155 DagNode *dag_add_node(DagForest *forest, void *fob);
156 DagNode *dag_get_node(DagForest *forest, void *fob);
157 DagNode *dag_get_sub_node(DagForest *forest, void *fob);
158 void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name);
159
160 typedef bool (*DagCollobjFilterFunction)(struct Object *obj, struct ModifierData *md);
161
162 void dag_add_collision_relations(DagForest *dag, struct Scene *scene, Object *ob, DagNode *node, struct Group *group, int layer, unsigned int modifier_type, DagCollobjFilterFunction fn, bool dupli, const char *name);
163 void dag_add_forcefield_relations(DagForest *dag, struct Scene *scene, Object *ob, DagNode *node, struct EffectorWeights *eff, bool add_absorption, int skip_forcefield, const char *name);
164
165 void graph_print_queue(DagNodeQueue *nqueue);
166 void graph_print_queue_dist(DagNodeQueue *nqueue);
167 void graph_print_adj_list(DagForest *dag);
168
169 #endif /* __DEPSGRAPH_PRIVATE_H__ */