30using TraversalQueue = std::deque<OperationNode *>;
34bool deg_foreach_needs_visit(
const OperationNode *op_node,
const int flags)
44void deg_foreach_dependent_operation(
const Depsgraph * ,
45 const IDNode *target_id_node,
48 DEGForeachOperation callback,
51 if (target_id_node ==
nullptr) {
58 Set<OperationNode *> scheduled;
59 for (
ComponentNode *comp_node : target_id_node->components.values()) {
72 if (!deg_foreach_needs_visit(op_node, flags)) {
75 queue.push_back(op_node);
76 scheduled.
add(op_node);
80 while (!queue.empty()) {
85 callback(op_node, user_data);
87 if (op_node->outlinks.size() == 1) {
89 if (!scheduled.
contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
98 for (
Relation *rel : op_node->outlinks) {
100 if (!scheduled.
contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
101 queue.push_front(to_node);
111struct ForeachIDComponentData {
113 IDNode *target_id_node;
114 Set<ComponentNode *> visited;
117void deg_foreach_dependent_component_callback(
OperationNode *op_node,
void *user_data_v)
119 ForeachIDComponentData *user_data =
reinterpret_cast<ForeachIDComponentData *
>(user_data_v);
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;
135 data.callback = callback;
136 data.target_id_node = graph->find_id_node(
id);
137 deg_foreach_dependent_operation(graph,
139 source_component_type,
141 deg_foreach_dependent_component_callback,
145struct ForeachIDData {
147 IDNode *target_id_node;
148 Set<IDNode *> visited;
151void deg_foreach_dependent_ID_callback(
OperationNode *op_node,
void *user_data_v)
153 ForeachIDData *user_data =
reinterpret_cast<ForeachIDData *
>(user_data_v);
155 IDNode *id_node = comp_node->owner;
156 if (id_node != user_data->target_id_node && !user_data->visited.contains(id_node)) {
157 user_data->callback(id_node->id_orig);
158 user_data->visited.add_new(id_node);
165 data.callback = callback;
166 data.target_id_node = graph->find_id_node(
id);
167 deg_foreach_dependent_operation(
174 IDNode *target_id_node = graph->find_id_node(
id);
175 if (target_id_node ==
nullptr) {
181 TraversalQueue queue;
182 Set<OperationNode *> scheduled;
183 for (
ComponentNode *comp_node : target_id_node->components.values()) {
185 queue.push_back(op_node);
186 scheduled.
add(op_node);
189 Set<IDNode *> visited;
190 visited.
add_new(target_id_node);
192 while (!queue.empty()) {
199 IDNode *id_node = comp_node->owner;
202 callback(id_node->id_orig);
206 if (op_node->inlinks.size() == 1) {
210 if (scheduled.
add(from_node)) {
219 for (
Relation *rel : op_node->inlinks) {
220 Node *from = rel->from;
223 if (scheduled.
add(from_node)) {
224 queue.push_front(from_node);
237 callback(id_node->id_orig);
257 deg::deg_foreach_dependent_ID_component(
blender::FunctionRef< void(ID *id, eDepsObjectComponentType component)> DEGForeachIDComponentCallback
@ DEG_FOREACH_COMPONENT_IGNORE_TRANSFORM_SOLVERS
blender::FunctionRef< void(ID *id)> DEGForeachIDCallback
BMesh const char void * data
BPy_StructRNA * depsgraph
bool contains(const Key &key) const
void add_new(const Key &key)
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)
void DEG_foreach_ancestor_ID(const Depsgraph *depsgraph, const ID *id, DEGForeachIDCallback callback)
eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)