30using TraversalQueue = std::deque<OperationNode *>;
32using DEGForeachOperation = void (*)(OperationNode *,
void *);
34bool deg_foreach_needs_visit(
const OperationNode *op_node,
const int flags)
44void deg_foreach_dependent_operation(
const Depsgraph * ,
58 Set<OperationNode *> scheduled;
59 for (ComponentNode *comp_node :
target_id_node->components.values()) {
71 for (OperationNode *op_node : comp_node->operations) {
72 if (!deg_foreach_needs_visit(op_node, flags)) {
75 queue.push_back(op_node);
76 scheduled.add(op_node);
80 while (!queue.empty()) {
82 OperationNode *op_node = queue.front();
87 if (op_node->outlinks.size() == 1) {
88 OperationNode *to_node = (OperationNode *)op_node->outlinks[0]->to;
89 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
90 scheduled.add_new(to_node);
98 for (Relation *rel : op_node->outlinks) {
99 OperationNode *to_node = (OperationNode *)rel->to;
100 if (!scheduled.contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
101 queue.push_front(to_node);
102 scheduled.add_new(to_node);
111struct ForeachIDComponentData {
117void deg_foreach_dependent_component_callback(OperationNode *op_node,
void *user_data_v)
119 ForeachIDComponentData *user_data =
reinterpret_cast<ForeachIDComponentData *
>(user_data_v);
120 ComponentNode *comp_node = op_node->owner;
121 IDNode *
id_node = comp_node->owner;
122 if (
id_node != user_data->target_id_node && !user_data->visited.contains(comp_node)) {
124 user_data->visited.add_new(comp_node);
128void deg_foreach_dependent_ID_component(
const Depsgraph *
graph,
134 ForeachIDComponentData
data;
137 deg_foreach_dependent_operation(
graph,
139 source_component_type,
141 deg_foreach_dependent_component_callback,
145struct ForeachIDData {
151void deg_foreach_dependent_ID_callback(OperationNode *op_node,
void *user_data_v)
153 ForeachIDData *user_data =
reinterpret_cast<ForeachIDData *
>(user_data_v);
154 ComponentNode *comp_node = op_node->owner;
155 IDNode *
id_node = comp_node->owner;
156 if (
id_node != user_data->target_id_node && !user_data->visited.contains(
id_node)) {
158 user_data->visited.add_new(
id_node);
167 deg_foreach_dependent_operation(
181 TraversalQueue queue;
182 Set<OperationNode *> scheduled;
183 for (ComponentNode *comp_node :
target_id_node->components.values()) {
184 for (OperationNode *op_node : comp_node->operations) {
185 queue.push_back(op_node);
186 scheduled.add(op_node);
192 while (!queue.empty()) {
194 OperationNode *op_node = queue.front();
198 ComponentNode *comp_node = op_node->owner;
199 IDNode *
id_node = comp_node->owner;
206 if (op_node->inlinks.size() == 1) {
207 Node *
from = op_node->inlinks[0]->from;
209 OperationNode *from_node = (OperationNode *)
from;
210 if (scheduled.add(from_node)) {
219 for (Relation *rel : op_node->inlinks) {
222 OperationNode *from_node = (OperationNode *)
from;
223 if (scheduled.add(from_node)) {
224 queue.push_front(from_node);
257 deg::deg_foreach_dependent_ID_component(
@ DEG_FOREACH_COMPONENT_IGNORE_TRANSFORM_SOLVERS
const Depsgraph * depsgraph
void DEG_foreach_ID(const Depsgraph *depsgraph, DEGForeachIDCallback callback)
void DEG_foreach_dependent_ID_component(const Depsgraph *depsgraph, const ID *id, eDepsObjectComponentType source_component_type, int flags, DEGForeachIDComponentCallback callback)
void DEG_foreach_dependent_ID(const Depsgraph *depsgraph, const ID *id, DEGForeachIDCallback callback)
Set< ComponentNode * > visited
DEGForeachIDComponentCallback callback
void DEG_foreach_ancestor_ID(const Depsgraph *depsgraph, const ID *id, DEGForeachIDCallback callback)
eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)
IDNode * find_id_node(const ID *id) const