34 using TraversalQueue = deque<OperationNode *>;
36 using DEGForeachOperation =
void (*)(OperationNode *,
void *);
38 bool deg_foreach_needs_visit(
const OperationNode *op_node,
const int flags)
62 Set<OperationNode *> scheduled;
74 for (OperationNode *op_node : comp_node->operations) {
75 if (!deg_foreach_needs_visit(op_node, flags)) {
78 queue.push_back(op_node);
79 scheduled.add(op_node);
83 while (!
queue.empty()) {
85 OperationNode *op_node =
queue.front();
90 if (op_node->outlinks.size() == 1) {
91 OperationNode *to_node = (OperationNode *)op_node->outlinks[0]->to;
92 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
93 scheduled.add_new(to_node);
101 for (Relation *rel : op_node->outlinks) {
102 OperationNode *to_node = (OperationNode *)rel->to;
103 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
104 queue.push_front(to_node);
105 scheduled.add_new(to_node);
114 struct ForeachIDComponentData {
121 void deg_foreach_dependent_component_callback(OperationNode *op_node,
void *user_data_v)
123 ForeachIDComponentData *
user_data =
reinterpret_cast<ForeachIDComponentData *
>(user_data_v);
124 ComponentNode *comp_node = op_node->owner;
125 IDNode *
id_node = comp_node->owner;
140 ForeachIDComponentData
data;
144 deg_foreach_dependent_operation(
graph,
146 source_component_type,
148 deg_foreach_dependent_component_callback,
152 struct ForeachIDData {
159 void deg_foreach_dependent_ID_callback(OperationNode *op_node,
void *user_data_v)
161 ForeachIDData *
user_data =
reinterpret_cast<ForeachIDData *
>(user_data_v);
162 ComponentNode *comp_node = op_node->owner;
163 IDNode *
id_node = comp_node->owner;
179 deg_foreach_dependent_operation(
196 TraversalQueue
queue;
197 Set<OperationNode *> scheduled;
199 for (OperationNode *op_node : comp_node->operations) {
200 queue.push_back(op_node);
201 scheduled.add(op_node);
207 while (!
queue.empty()) {
209 OperationNode *op_node =
queue.front();
213 ComponentNode *comp_node = op_node->owner;
214 IDNode *
id_node = comp_node->owner;
221 if (op_node->inlinks.size() == 1) {
222 Node *
from = op_node->inlinks[0]->from;
224 OperationNode *from_node = (OperationNode *)
from;
225 if (scheduled.add(from_node)) {
234 for (Relation *rel : op_node->inlinks) {
237 OperationNode *from_node = (OperationNode *)
from;
238 if (scheduled.add(from_node)) {
239 queue.push_front(from_node);
274 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)
SyclQueue void void size_t num_bytes void
eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)
IDNode * find_id_node(const ID *id) const
Map< ComponentIDKey, ComponentNode * > components