Nodes: add utilities to check if there are undefined nodes/sockets

This commit is contained in:
2021-06-11 14:54:44 +02:00
parent c0367b19e2
commit fe22635bf6
4 changed files with 39 additions and 0 deletions

View File

@@ -173,6 +173,7 @@ class DerivedNodeTree {
Span<const NodeTreeRef *> used_node_tree_refs() const;
bool has_link_cycles() const;
bool has_undefined_nodes_or_sockets() const;
void foreach_node(FunctionRef<void(DNode)> callback) const;
std::string to_dot() const;

View File

@@ -125,6 +125,7 @@ class SocketRef : NonCopyable, NonMovable {
bNodeTree *btree() const;
bool is_available() const;
bool is_undefined() const;
void *default_value() const;
template<typename T> T *default_value() const;
@@ -197,6 +198,7 @@ class NodeRef : NonCopyable, NonMovable {
bool is_group_output_node() const;
bool is_muted() const;
bool is_frame() const;
bool is_undefined() const;
void *storage() const;
template<typename T> T *storage() const;
@@ -260,6 +262,7 @@ class NodeTreeRef : NonCopyable, NonMovable {
Span<const LinkRef *> links() const;
bool has_link_cycles() const;
bool has_undefined_nodes_or_sockets() const;
bNodeTree *btree() const;
StringRefNull name() const;
@@ -417,6 +420,11 @@ inline bool SocketRef::is_available() const
return (bsocket_->flag & SOCK_UNAVAIL) == 0;
}
inline bool SocketRef::is_undefined() const
{
return bsocket_->typeinfo == &NodeSocketTypeUndefined;
}
inline void *SocketRef::default_value() const
{
return bsocket_->default_value;
@@ -554,6 +562,11 @@ inline bool NodeRef::is_frame() const
return bnode_->type == NODE_FRAME;
}
inline bool NodeRef::is_undefined() const
{
return bnode_->typeinfo == &NodeTypeUndefined;
}
inline bool NodeRef::is_muted() const
{
return (bnode_->flag & NODE_MUTED) != 0;

View File

@@ -84,6 +84,16 @@ bool DerivedNodeTree::has_link_cycles() const
return false;
}
bool DerivedNodeTree::has_undefined_nodes_or_sockets() const
{
for (const NodeTreeRef *tree_ref : used_node_tree_refs_) {
if (tree_ref->has_undefined_nodes_or_sockets()) {
return true;
}
}
return false;
}
/* Calls the given callback on all nodes in the (possibly nested) derived node tree. */
void DerivedNodeTree::foreach_node(FunctionRef<void(DNode)> callback) const
{

View File

@@ -358,6 +358,21 @@ bool NodeTreeRef::has_link_cycles() const
return false;
}
bool NodeTreeRef::has_undefined_nodes_or_sockets() const
{
for (const NodeRef *node : nodes_by_id_) {
if (node->is_undefined()) {
return true;
}
}
for (const SocketRef *socket : sockets_by_id_) {
if (socket->is_undefined()) {
return true;
}
}
return true;
}
std::string NodeTreeRef::to_dot() const
{
dot::DirectedGraph digraph;