50 using TraversalQueue = deque<OperationNode *>;
52 using DEGForeachOperation = void (*)(OperationNode *,
void *);
54 bool deg_foreach_needs_visit(
const OperationNode *op_node,
const int flags)
78 Set<OperationNode *> scheduled;
84 for (OperationNode *op_node : comp_node->operations) {
85 if (!deg_foreach_needs_visit(op_node, flags)) {
88 queue.push_back(op_node);
89 scheduled.add(op_node);
93 while (!
queue.empty()) {
95 OperationNode *op_node =
queue.front();
100 if (op_node->outlinks.size() == 1) {
101 OperationNode *to_node = (OperationNode *)op_node->outlinks[0]->to;
102 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
103 scheduled.add_new(to_node);
111 for (Relation *rel : op_node->outlinks) {
112 OperationNode *to_node = (OperationNode *)rel->to;
113 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
114 queue.push_front(to_node);
115 scheduled.add_new(to_node);
124 struct ForeachIDComponentData {
131 void deg_foreach_dependent_component_callback(OperationNode *op_node,
void *user_data_v)
133 ForeachIDComponentData *
user_data =
reinterpret_cast<ForeachIDComponentData *
>(user_data_v);
134 ComponentNode *comp_node = op_node->owner;
135 IDNode *
id_node = comp_node->owner;
150 ForeachIDComponentData
data;
154 deg_foreach_dependent_operation(
graph,
156 source_component_type,
158 deg_foreach_dependent_component_callback,
162 struct ForeachIDData {
169 void deg_foreach_dependent_ID_callback(OperationNode *op_node,
void *user_data_v)
171 ForeachIDData *
user_data =
reinterpret_cast<ForeachIDData *
>(user_data_v);
172 ComponentNode *comp_node = op_node->owner;
173 IDNode *
id_node = comp_node->owner;
189 deg_foreach_dependent_operation(
206 TraversalQueue
queue;
207 Set<OperationNode *> scheduled;
209 for (OperationNode *op_node : comp_node->operations) {
210 queue.push_back(op_node);
211 scheduled.add(op_node);
217 while (!
queue.empty()) {
219 OperationNode *op_node =
queue.front();
223 ComponentNode *comp_node = op_node->owner;
224 IDNode *
id_node = comp_node->owner;
231 if (op_node->inlinks.size() == 1) {
232 Node *
from = op_node->inlinks[0]->from;
234 OperationNode *from_node = (OperationNode *)
from;
235 if (scheduled.add(from_node)) {
244 for (Relation *rel : op_node->inlinks) {
247 OperationNode *from_node = (OperationNode *)
from;
248 if (scheduled.add(from_node)) {
249 queue.push_front(from_node);
284 deg::deg_foreach_dependent_ID_component(
struct Depsgraph Depsgraph
@ DEG_FOREACH_COMPONENT_IGNORE_TRANSFORM_SOLVERS
void(* DEGForeachIDComponentCallback)(ID *id, eDepsObjectComponentType component, void *user_data)
void(* DEGForeachIDCallback)(ID *id, void *user_data)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
const Depsgraph * depsgraph
void DEG_foreach_dependent_ID_component(const Depsgraph *depsgraph, const ID *id, eDepsObjectComponentType source_component_type, int flags, DEGForeachIDComponentCallback callback, void *user_data)
void DEG_foreach_ID(const Depsgraph *depsgraph, DEGForeachIDCallback callback, void *user_data)
void DEG_foreach_dependent_ID(const Depsgraph *depsgraph, const ID *id, DEGForeachIDCallback callback, void *user_data)
Set< ComponentNode * > visited
DEGForeachIDComponentCallback callback
void DEG_foreach_ancestor_ID(const Depsgraph *depsgraph, const ID *id, DEGForeachIDCallback callback, void *user_data)
ThreadQueue * queue
all scheduled work for the cpu
eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)
IDNode * find_id_node(const ID *id) const
Map< ComponentIDKey, ComponentNode * > components