35using TraversalQueue = deque<OperationNode *>;
39bool deg_foreach_needs_visit(
const OperationNode *op_node,
const int flags)
49void deg_foreach_dependent_operation(
const Depsgraph * ,
50 const IDNode *target_id_node,
53 DEGForeachOperation callback,
56 if (target_id_node ==
nullptr) {
63 Set<OperationNode *> scheduled;
64 for (
ComponentNode *comp_node : target_id_node->components.values()) {
77 if (!deg_foreach_needs_visit(op_node, flags)) {
80 queue.push_back(op_node);
81 scheduled.
add(op_node);
85 while (!
queue.empty()) {
90 callback(op_node, user_data);
92 if (op_node->outlinks.size() == 1) {
94 if (!scheduled.
contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
103 for (
Relation *rel : op_node->outlinks) {
105 if (!scheduled.
contains(to_node) && deg_foreach_needs_visit(to_node, flags)) {
106 queue.push_front(to_node);
116struct ForeachIDComponentData {
118 IDNode *target_id_node;
119 Set<ComponentNode *> visited;
122void deg_foreach_dependent_component_callback(
OperationNode *op_node,
void *user_data_v)
124 ForeachIDComponentData *user_data =
reinterpret_cast<ForeachIDComponentData *
>(user_data_v);
126 IDNode *id_node = comp_node->owner;
127 if (id_node != user_data->target_id_node && !user_data->visited.contains(comp_node)) {
129 user_data->visited.add_new(comp_node);
133void deg_foreach_dependent_ID_component(
const Depsgraph *graph,
139 ForeachIDComponentData
data;
140 data.callback = callback;
141 data.target_id_node = graph->find_id_node(
id);
142 deg_foreach_dependent_operation(graph,
144 source_component_type,
146 deg_foreach_dependent_component_callback,
150struct ForeachIDData {
152 IDNode *target_id_node;
153 Set<IDNode *> visited;
156void deg_foreach_dependent_ID_callback(
OperationNode *op_node,
void *user_data_v)
158 ForeachIDData *user_data =
reinterpret_cast<ForeachIDData *
>(user_data_v);
160 IDNode *id_node = comp_node->owner;
161 if (id_node != user_data->target_id_node && !user_data->visited.contains(id_node)) {
162 user_data->callback(id_node->id_orig);
163 user_data->visited.add_new(id_node);
170 data.callback = callback;
171 data.target_id_node = graph->find_id_node(
id);
172 deg_foreach_dependent_operation(
179 IDNode *target_id_node = graph->find_id_node(
id);
180 if (target_id_node ==
nullptr) {
186 TraversalQueue
queue;
187 Set<OperationNode *> scheduled;
188 for (
ComponentNode *comp_node : target_id_node->components.values()) {
190 queue.push_back(op_node);
191 scheduled.
add(op_node);
194 Set<IDNode *> visited;
195 visited.
add_new(target_id_node);
197 while (!
queue.empty()) {
204 IDNode *id_node = comp_node->owner;
207 callback(id_node->id_orig);
211 if (op_node->inlinks.size() == 1) {
215 if (scheduled.
add(from_node)) {
224 for (
Relation *rel : op_node->inlinks) {
225 Node *from = rel->from;
228 if (scheduled.
add(from_node)) {
229 queue.push_front(from_node);
242 callback(id_node->id_orig);
262 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
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
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)
ThreadQueue * queue
all scheduled work for the cpu
eDepsObjectComponentType nodeTypeToObjectComponent(NodeType type)