Code cleanup: use r_ prefix for return args
[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 /* **** DAG relation types *** */
38
39 /* scene link to object */
40 #define DAG_RL_SCENE        (1 << 0)
41 /* object link to data */
42 #define DAG_RL_DATA         (1 << 1)
43
44 /* object changes object (parent, track, constraints) */
45 #define DAG_RL_OB_OB        (1 << 2)
46 /* object changes obdata (hooks, constraints) */
47 #define DAG_RL_OB_DATA      (1 << 3)
48 /* data changes object (vertex parent) */
49 #define DAG_RL_DATA_OB      (1 << 4)
50 /* data changes data (deformers) */
51 #define DAG_RL_DATA_DATA    (1 << 5)
52
53 #define DAG_NO_RELATION     (1 << 6)
54
55 #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)
56 #define DAG_RL_ALL          (DAG_RL_ALL_BUT_DATA | DAG_RL_DATA)
57
58
59 #define DAGQUEUEALLOC 50
60
61 enum {
62         DAG_WHITE = 0,
63         DAG_GRAY = 1,
64         DAG_BLACK = 2
65 };
66
67 typedef struct DagAdjList {
68         struct DagNode *node;
69         short type;
70         int count;  /* number of identical arcs */
71         unsigned int lay;   // for flushing redraw/rebuild events
72         const char *name;
73         struct DagAdjList *next;
74 } DagAdjList;
75
76
77 typedef struct DagNode {
78         int color;
79         short type;
80         float x, y, k;
81         void *ob;
82         void *first_ancestor;
83         int ancestor_count;
84         unsigned int lay;               /* accumulated layers of its relations + itself */
85         unsigned int scelay;            /* layers due to being in scene */
86         uint64_t customdata_mask;       /* customdata mask */
87         int lasttime;       /* if lasttime != DagForest->time, this node was not evaluated yet for flushing */
88         int BFS_dist;       /* BFS distance */
89         int DFS_dist;       /* DFS distance */
90         int DFS_dvtm;       /* DFS discovery time */
91         int DFS_fntm;       /* DFS Finishing time */
92         struct DagAdjList *child;
93         struct DagAdjList *parent;
94         struct DagNode *next;
95
96         /* Threaded evaluation routines */
97         uint32_t num_pending_parents;  /* number of parents which are not updated yet
98                                         * this node has got.
99                                         * Used by threaded update for faster detect whether node could be
100                                         * updated aready.
101                                         */
102         bool scheduled;
103
104         /* Runtime flags mainly used to determine which extra data is to be evaluated
105          * during object_handle_update(). Such an extra data is what depends on the
106          * DAG topology, meaning this flags indicates the data evaluation of which
107          * depends on the node dependencies.
108          */
109         short eval_flags;
110 } DagNode;
111
112 typedef struct DagNodeQueueElem {
113         struct DagNode *node;
114         struct DagNodeQueueElem *next;
115 } DagNodeQueueElem;
116
117 typedef struct DagNodeQueue {
118         DagNodeQueueElem *first;
119         DagNodeQueueElem *last;
120         int count;
121         int maxlevel;
122         struct DagNodeQueue *freenodes;
123 } DagNodeQueue;
124
125 /* forest as we may have more than one DAG unconnected */
126 typedef struct DagForest {
127         ListBase DagNode;
128         struct GHash *nodeHash;
129         int numNodes;
130         bool is_acyclic;
131         int time;  /* for flushing/tagging, compare with node->lasttime */
132 } DagForest;
133
134 // queue operations
135 DagNodeQueue *queue_create(int slots);
136 void queue_raz(DagNodeQueue *queue);
137 void push_queue(DagNodeQueue *queue, DagNode *node);
138 void push_stack(DagNodeQueue *queue, DagNode *node);
139 DagNode *pop_queue(DagNodeQueue *queue);
140 DagNode *get_top_node_queue(DagNodeQueue *queue);
141 void queue_delete(DagNodeQueue *queue);
142
143 // Dag management
144 DagForest *dag_init(void);
145 DagForest *build_dag(struct Main *bmain, struct Scene *sce, short mask);
146 void free_forest(struct DagForest *Dag);
147 DagNode *dag_find_node(DagForest *forest, void *fob);
148 DagNode *dag_add_node(DagForest *forest, void *fob);
149 DagNode *dag_get_node(DagForest *forest, void *fob);
150 DagNode *dag_get_sub_node(DagForest *forest, void *fob);
151 void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name);
152
153 void graph_print_queue(DagNodeQueue *nqueue);
154 void graph_print_queue_dist(DagNodeQueue *nqueue);
155 void graph_print_adj_list(DagForest *dag);
156
157 #endif /* __DEPSGRAPH_PRIVATE_H__ */