34 if (dsocket->is_available()) {
36 if (data_type.has_value()) {
37 input_types.
append(*data_type);
42 if (dsocket->is_available()) {
44 if (data_type.has_value()) {
45 output_types.
append(*data_type);
51 name, input_types, output_types);
57 constexpr
int stack_capacity = 10;
64 if (dsocket->is_available()) {
65 std::optional<fn::MFDataType> data_type =
socket_mf_type_get(*dsocket->bsocket()->typeinfo);
66 if (data_type.has_value()) {
67 input_types.
append(*data_type);
68 input_names.
append(dsocket->name());
69 input_dsockets.
append(dsocket);
79 if (dsocket->is_available()) {
80 std::optional<fn::MFDataType> data_type =
socket_mf_type_get(*dsocket->bsocket()->typeinfo);
81 if (data_type.has_value()) {
82 output_types.
append(*data_type);
83 output_names.
append(dsocket->name());
84 output_dsockets.
append(dsocket);
90 dnode->
name(), input_types, output_types, input_names, output_names);
120 if (dnode->is_group_input_node() || dnode->is_group_output_node()) {
137 NodeMFNetworkBuilder builder{common, dnode};
150 if (
type.is_single()) {
152 AT,
type.single_type(),
type.single_type().default_value());
160 return node.output(0);
180 const DInputSocket to_dsocket{dnode.context(), socket_ref};
181 if (!to_dsocket->is_available()) {
193 to_dsocket.foreach_origin_socket([&](
DSocket socket) { from_dsockets.append(socket); });
194 if (from_dsockets.size() > 1) {
195 fn::MFOutputSocket &from_socket = insert_default_value_for_type(common, to_type);
196 for (fn::MFInputSocket *to_socket : to_sockets) {
197 common.network.add_link(from_socket, *to_socket);
201 if (from_dsockets.is_empty()) {
203 fn::MFOutputSocket *built_socket = insert_unlinked_input(common, to_dsocket);
204 for (fn::MFInputSocket *to_socket : to_sockets) {
205 common.network.add_link(*built_socket, *to_socket);
209 if (from_dsockets[0]->is_input()) {
210 DInputSocket from_dsocket{from_dsockets[0]};
212 for (fn::MFInputSocket *to_socket : to_sockets) {
213 common.network.add_link(*built_socket, *to_socket);
217 DOutputSocket from_dsocket{from_dsockets[0]};
218 fn::MFOutputSocket *from_socket = &common.network_map.lookup(from_dsocket);
219 const fn::MFDataType from_type = from_socket->data_type();
221 if (from_type != to_type) {
222 const fn::MultiFunction *conversion_fn =
224 if (conversion_fn !=
nullptr) {
225 fn::MFNode &
node = common.network.add_function(*conversion_fn);
226 common.network.add_link(*from_socket,
node.input(0));
227 from_socket = &
node.output(0);
234 for (fn::MFInputSocket *to_socket : to_sockets) {
235 common.network.add_link(*from_socket, *to_socket);
281 bool has_multiple_nodes =
false;
282 bool has_dummy_nodes =
false;
284 auto check_mf_node = [&](
fn::MFNode &mf_node) {
285 if (mf_node.is_function()) {
286 if (single_function_node ==
nullptr) {
289 if (&mf_node != single_function_node) {
290 has_multiple_nodes =
true;
295 has_dummy_nodes =
true;
300 if (dsocket->is_available()) {
303 check_mf_node(mf_input->node());
308 if (dsocket->is_available()) {
310 check_mf_node(mf_output.
node());
314 if (has_dummy_nodes) {
315 return NodeExpandType::HasDummyNodes;
317 if (has_multiple_nodes) {
318 return NodeExpandType::MultipleFunctionNodes;
320 *r_single_function = &single_function_node->
function();
321 return NodeExpandType::SingleFunctionNode;
332 if (dsocket->is_available()) {
337 network.
add_link(fn_input, *mf_input);
338 dummy_fn_inputs.
append(&fn_input);
344 if (dsocket->is_available()) {
348 network.
add_link(mf_output, fn_output);
349 dummy_fn_outputs.
append(&fn_output);
354 __func__, std::move(dummy_fn_inputs), std::move(dummy_fn_outputs));
385 switch (expand_type) {
386 case NodeExpandType::HasDummyNodes: {
390 case NodeExpandType::SingleFunctionNode: {
392 functions_by_node.
add_new(dnode, single_function);
395 case NodeExpandType::MultipleFunctionNodes: {
399 dnode, network, network_map, scope);
400 functions_by_node.
add_new(dnode, &fn);
406 return functions_by_node;
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
void add_new(const Key &key, const Value &value)
T & construct(const char *name, Args &&... args)
void append(const T &value)
std::string to_string() const
const MultiFunction & function() const
MFDummyNode & add_dummy(StringRef name, Span< MFDataType > input_types, Span< MFDataType > output_types, Span< StringRef > input_names, Span< StringRef > output_names)
void add_link(MFOutputSocket &from, MFInputSocket &to)
MFFunctionNode & add_function(const MultiFunction &function)
MFOutputSocket & add_input(StringRef name, MFDataType data_type)
MFInputSocket & add_output(StringRef name, MFDataType data_type)
Span< MFInputSocket * > inputs()
MFFunctionNode & as_function()
Span< MFOutputSocket * > outputs()
const MFDataType & data_type() const
const DTreeContext * context() const
const fn::MultiFunction * get_conversion_multi_function(fn::MFDataType from, fn::MFDataType to) const
void foreach_node(FunctionRef< void(DNode)> callback) const
void add(const DSocket &dsocket, fn::MFSocket &socket)
fn::MFOutputSocket & lookup(const DOutputSocket &dsocket)
const fn::MultiFunction & get_default_fn(StringRef name)
bNodeType * typeinfo() const
Span< const InputSocketRef * > inputs() const
Span< const OutputSocketRef * > outputs() const
bool is_group_node() const
StringRefNull name() const
bNodeSocketType * typeinfo() const
DEGForeachIDComponentCallback callback
void socket_expand_in_mf_network(SocketMFNetworkBuilder &builder)
static void foreach_node_to_insert(CommonMFNetworkBuilderData &common, FunctionRef< void(DNode)> callback)
std::optional< MFDataType > socket_mf_type_get(const bNodeSocketType &stype)
bool socket_is_mf_data_socket(const bNodeSocketType &stype)
MultiFunctionByNode get_multi_function_per_node(const DerivedNodeTree &tree, ResourceScope &scope)
const DataTypeConversions & get_implicit_type_conversions()
static void insert_nodes(CommonMFNetworkBuilderData &common)
MFNetworkTreeMap insert_node_tree_into_mf_network(fn::MFNetwork &network, const DerivedNodeTree &tree, ResourceScope &scope)
static bool has_data_sockets(const DNode &dnode)
static void insert_dummy_node(CommonMFNetworkBuilderData &common, const DNode &dnode)
static const fn::MultiFunction & create_function_for_node_that_expands_into_multiple(const DNode &dnode, fn::MFNetwork &network, MFNetworkTreeMap &network_map, ResourceScope &scope)
static void insert_links_and_unlinked_inputs(CommonMFNetworkBuilderData &common)
static NodeExpandType get_node_expand_type(MFNetworkTreeMap &network_map, const DNode &dnode, const fn::MultiFunction **r_single_function)
static fn::MFOutputSocket * insert_unlinked_input(CommonMFNetworkBuilderData &common, const DInputSocket &dsocket)
static fn::MFOutputSocket & insert_default_value_for_type(CommonMFNetworkBuilderData &common, fn::MFDataType type)
NodeExpandInMFNetworkFunction expand_in_mf_network
const DerivedNodeTree & tree
MFNetworkTreeMap & network_map