diff options
Diffstat (limited to 'source/blender/functions/FN_multi_function_network.hh')
-rw-r--r-- | source/blender/functions/FN_multi_function_network.hh | 135 |
1 files changed, 89 insertions, 46 deletions
diff --git a/source/blender/functions/FN_multi_function_network.hh b/source/blender/functions/FN_multi_function_network.hh index a9d8508cdb8..7a9f5b4cfaf 100644 --- a/source/blender/functions/FN_multi_function_network.hh +++ b/source/blender/functions/FN_multi_function_network.hh @@ -14,8 +14,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef __FN_MULTI_FUNCTION_NETWORK_HH__ -#define __FN_MULTI_FUNCTION_NETWORK_HH__ +#pragma once /** \file * \ingroup fn @@ -62,14 +61,14 @@ class MFNode : NonCopyable, NonMovable { Span<MFInputSocket *> inputs_; Span<MFOutputSocket *> outputs_; bool is_dummy_; - uint id_; + int id_; friend MFNetwork; public: StringRefNull name() const; - uint id() const; + int id() const; MFNetwork &network(); const MFNetwork &network() const; @@ -83,11 +82,11 @@ class MFNode : NonCopyable, NonMovable { MFFunctionNode &as_function(); const MFFunctionNode &as_function() const; - MFInputSocket &input(uint index); - const MFInputSocket &input(uint index) const; + MFInputSocket &input(int index); + const MFInputSocket &input(int index) const; - MFOutputSocket &output(uint index); - const MFOutputSocket &output(uint index) const; + MFOutputSocket &output(int index); + const MFOutputSocket &output(int index) const; Span<MFInputSocket *> inputs(); Span<const MFInputSocket *> inputs() const; @@ -95,9 +94,7 @@ class MFNode : NonCopyable, NonMovable { Span<MFOutputSocket *> outputs(); Span<const MFOutputSocket *> outputs() const; - template<typename FuncT> void foreach_origin_socket(const FuncT &func) const; - - bool all_inputs_have_origin() const; + bool has_unlinked_inputs() const; private: void destruct_sockets(); @@ -106,8 +103,8 @@ class MFNode : NonCopyable, NonMovable { class MFFunctionNode : public MFNode { private: const MultiFunction *function_; - Span<uint> input_param_indices_; - Span<uint> output_param_indices_; + Span<int> input_param_indices_; + Span<int> output_param_indices_; friend MFNetwork; @@ -116,8 +113,8 @@ class MFFunctionNode : public MFNode { const MultiFunction &function() const; - const MFInputSocket &input_for_param(uint param_index) const; - const MFOutputSocket &output_for_param(uint param_index) const; + const MFInputSocket &input_for_param(int param_index) const; + const MFOutputSocket &output_for_param(int param_index) const; }; class MFDummyNode : public MFNode { @@ -139,9 +136,9 @@ class MFSocket : NonCopyable, NonMovable { protected: MFNode *node_; bool is_output_; - uint index_; + int index_; MFDataType data_type_; - uint id_; + int id_; StringRefNull name_; friend MFNetwork; @@ -149,7 +146,8 @@ class MFSocket : NonCopyable, NonMovable { public: StringRefNull name() const; - uint id() const; + int id() const; + int index() const; const MFDataType &data_type() const; @@ -216,10 +214,27 @@ class MFNetwork : NonCopyable, NonMovable { void relink(MFOutputSocket &old_output, MFOutputSocket &new_output); void remove(MFNode &node); + void remove(Span<MFNode *> nodes); + + int socket_id_amount() const; + int node_id_amount() const; + + Span<MFDummyNode *> dummy_nodes(); + Span<MFFunctionNode *> function_nodes(); + + MFNode *node_or_null_by_id(int id); + const MFNode *node_or_null_by_id(int id) const; + + MFSocket *socket_or_null_by_id(int id); + const MFSocket *socket_or_null_by_id(int id) const; - uint max_socket_id() const; + void find_dependencies(Span<const MFInputSocket *> sockets, + VectorSet<const MFOutputSocket *> &r_dummy_sockets, + VectorSet<const MFInputSocket *> &r_unlinked_inputs) const; - std::string to_dot() const; + bool have_dummy_or_unlinked_dependencies(Span<const MFInputSocket *> sockets) const; + + std::string to_dot(Span<const MFNode *> marked_nodes = {}) const; }; /* -------------------------------------------------------------------- @@ -236,7 +251,7 @@ inline StringRefNull MFNode::name() const } } -inline uint MFNode::id() const +inline int MFNode::id() const { return id_; } @@ -285,22 +300,22 @@ inline const MFFunctionNode &MFNode::as_function() const return *(const MFFunctionNode *)this; } -inline MFInputSocket &MFNode::input(uint index) +inline MFInputSocket &MFNode::input(int index) { return *inputs_[index]; } -inline const MFInputSocket &MFNode::input(uint index) const +inline const MFInputSocket &MFNode::input(int index) const { return *inputs_[index]; } -inline MFOutputSocket &MFNode::output(uint index) +inline MFOutputSocket &MFNode::output(int index) { return *outputs_[index]; } -inline const MFOutputSocket &MFNode::output(uint index) const +inline const MFOutputSocket &MFNode::output(int index) const { return *outputs_[index]; } @@ -325,24 +340,14 @@ inline Span<const MFOutputSocket *> MFNode::outputs() const return outputs_; } -template<typename FuncT> void MFNode::foreach_origin_socket(const FuncT &func) const -{ - for (const MFInputSocket *socket : inputs_) { - const MFOutputSocket *origin = socket->origin(); - if (origin != nullptr) { - func(*origin); - } - } -} - -inline bool MFNode::all_inputs_have_origin() const +inline bool MFNode::has_unlinked_inputs() const { for (const MFInputSocket *socket : inputs_) { if (socket->origin() == nullptr) { - return false; + return true; } } - return true; + return false; } /* -------------------------------------------------------------------- @@ -359,12 +364,12 @@ inline const MultiFunction &MFFunctionNode::function() const return *function_; } -inline const MFInputSocket &MFFunctionNode::input_for_param(uint param_index) const +inline const MFInputSocket &MFFunctionNode::input_for_param(int param_index) const { return this->input(input_param_indices_.first_index(param_index)); } -inline const MFOutputSocket &MFFunctionNode::output_for_param(uint param_index) const +inline const MFOutputSocket &MFFunctionNode::output_for_param(int param_index) const { return this->output(output_param_indices_.first_index(param_index)); } @@ -397,11 +402,16 @@ inline StringRefNull MFSocket::name() const return name_; } -inline uint MFSocket::id() const +inline int MFSocket::id() const { return id_; } +inline int MFSocket::index() const +{ + return index_; +} + inline const MFDataType &MFSocket::data_type() const { return data_type_; @@ -476,18 +486,51 @@ inline Span<MFInputSocket *> MFOutputSocket::targets() inline Span<const MFInputSocket *> MFOutputSocket::targets() const { - return targets_.as_span(); + return targets_; } /* -------------------------------------------------------------------- * MFNetwork inline methods. */ -inline uint MFNetwork::max_socket_id() const +inline Span<MFDummyNode *> MFNetwork::dummy_nodes() { - return socket_or_null_by_id_.size() - 1; + return dummy_nodes_; } -} // namespace blender::fn +inline Span<MFFunctionNode *> MFNetwork::function_nodes() +{ + return function_nodes_; +} -#endif /* __FN_MULTI_FUNCTION_NETWORK_HH__ */ +inline MFNode *MFNetwork::node_or_null_by_id(int id) +{ + return node_or_null_by_id_[id]; +} + +inline const MFNode *MFNetwork::node_or_null_by_id(int id) const +{ + return node_or_null_by_id_[id]; +} + +inline MFSocket *MFNetwork::socket_or_null_by_id(int id) +{ + return socket_or_null_by_id_[id]; +} + +inline const MFSocket *MFNetwork::socket_or_null_by_id(int id) const +{ + return socket_or_null_by_id_[id]; +} + +inline int MFNetwork::socket_id_amount() const +{ + return socket_or_null_by_id_.size(); +} + +inline int MFNetwork::node_id_amount() const +{ + return node_or_null_by_id_.size(); +} + +} // namespace blender::fn |