Blender
V4.5
source
blender
nodes
shader
materialx
group_nodes.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
5
#include "
group_nodes.h
"
6
#include "
node_parser.h
"
7
8
#include "
BKE_node_runtime.hh
"
9
10
#ifdef USE_MATERIALX_NODEGRAPH
11
# include "
BLI_vector.hh
"
12
#endif
13
14
namespace
blender::nodes::materialx
{
15
16
GroupNodeParser::GroupNodeParser
(
NodeGraph
&
graph
,
17
const
bNode
*
node
,
18
const
bNodeSocket
*socket_out,
19
NodeItem::Type
to_type
,
20
GroupNodeParser
*group_parser,
21
bool
use_group_default)
22
:
NodeParser
(
graph
,
node
, socket_out,
to_type
, group_parser),
23
use_group_default_(use_group_default)
24
{
25
}
26
27
NodeItem
GroupNodeParser::compute
()
28
{
29
const
bNodeTree
*ngroup =
reinterpret_cast<
const
bNodeTree
*
>
(
node_
->
id
);
30
ngroup->ensure_topology_cache();
31
const
bNode
*node_out = ngroup->group_output_node();
32
if
(!node_out) {
33
return
empty
();
34
}
35
36
NodeGraph
group_graph(
graph_
, ngroup->
id
.
name
+ 2);
37
38
NodeItem
out
=
GroupOutputNodeParser
(
39
group_graph, node_out,
socket_out_
,
to_type_
,
this
,
use_group_default_
)
40
.
compute_full
();
41
42
#ifdef USE_MATERIALX_NODEGRAPH
43
/* We have to be in NodeParser's graph_, therefore copying output */
44
NodeItem
res =
empty
();
45
res.
output
=
out
.output;
46
return
res;
47
#else
48
return
out
;
49
#endif
50
}
51
52
NodeItem
GroupNodeParser::compute_full
()
53
{
54
NodeItem
res =
compute
();
55
if
(NodeItem::is_arithmetic(
to_type_
)) {
56
res = res.
convert
(
to_type_
);
57
}
58
return
res;
59
}
60
61
NodeItem
GroupOutputNodeParser::compute
()
62
{
63
#ifdef USE_MATERIALX_NODEGRAPH
64
Vector<NodeItem>
values;
65
for
(
const
auto
*socket_in :
node_
->input_sockets()) {
66
NodeItem
value
=
get_input_value
(
67
socket_in->index(), NodeItem::is_arithmetic(
to_type_
) ?
NodeItem::Type::Any
:
to_type_
);
68
if
(
value
.value) {
69
value
=
create_node
(
"constant"
,
value
.type(), {{
"value"
, value}});
70
}
71
values.
append
(
value
);
72
}
73
Vector<NodeItem>
outputs
;
74
for
(
int
i = 0; i < values.size(); ++i) {
75
if
(values[i]) {
76
outputs
.append(create_output(out_name(node_->input_sockets()[i]), values[i]));
77
}
78
}
79
return
outputs
[socket_out_->index()];
80
#else
81
if
(use_group_default_) {
82
return
get_input_value(socket_out_->index(), to_type_);
83
}
84
return
get_input_link(socket_out_->index(), to_type_);
85
#endif
86
}
87
88
NodeItem
GroupOutputNodeParser::compute_full()
89
{
90
CLOG_INFO
(
LOG_MATERIALX_SHADER
,
91
1,
92
"%s [%d] => %s"
,
93
node_->name,
94
node_->typeinfo->type_legacy,
95
NodeItem::type(to_type_).c_str());
96
97
#ifdef USE_MATERIALX_NODEGRAPH
98
/* Checking if output was already computed */
99
NodeItem
res = graph_.get_output(out_name(socket_out_));
100
if
(res.
output
) {
101
return
res;
102
}
103
104
res = compute();
105
return
res;
106
#else
107
return
compute();
108
#endif
109
}
110
111
std::string GroupOutputNodeParser::out_name(
const
bNodeSocket
*out_socket)
112
{
113
return
MaterialX::createValidName(std::string(
"out_"
) + out_socket->
name
);
114
}
115
116
NodeItem
GroupInputNodeParser::compute()
117
{
118
#ifdef USE_MATERIALX_NODEGRAPH
119
NodeItem
value
= group_parser_->get_input_link(socket_out_->index(), to_type_);
120
if
(!
value
) {
121
return
empty();
122
}
123
124
if
(
value
.value) {
125
value
= group_parser_->create_node(
"constant"
,
value
.type(), {{
"value"
, value}});
126
}
127
return
create_input(in_name(),
value
);
128
#else
129
if
(use_group_default_) {
130
return
group_parser_->get_input_value(socket_out_->index(), to_type_);
131
}
132
return
group_parser_->get_input_link(socket_out_->index(), to_type_);
133
#endif
134
}
135
136
NodeItem
GroupInputNodeParser::compute_full()
137
{
138
CLOG_INFO
(
LOG_MATERIALX_SHADER
,
139
1,
140
"%s [%d] => %s"
,
141
node_->name,
142
node_->typeinfo->type_legacy,
143
NodeItem::type(to_type_).c_str());
144
145
#ifdef USE_MATERIALX_NODEGRAPH
146
/* Checking if input was already computed */
147
NodeItem
res = graph_.get_input(in_name());
148
if
(res.
input
) {
149
return
res;
150
}
151
152
res = compute();
153
return
res;
154
#else
155
return
compute();
156
#endif
157
}
158
159
std::string GroupInputNodeParser::in_name()
const
160
{
161
return
MaterialX::createValidName(std::string(
"in_"
) + socket_out_->name);
162
}
163
164
}
// namespace blender::nodes::materialx
BKE_node_runtime.hh
BLI_vector.hh
CLOG_INFO
#define CLOG_INFO(clg_ref, level,...)
Definition
CLG_log.h:179
blender::Vector
Definition
BLI_vector.hh:76
blender::Vector::append
void append(const T &value)
Definition
BLI_vector.hh:489
blender::nodes::materialx::GroupNodeParser
Definition
group_nodes.h:17
blender::nodes::materialx::GroupNodeParser::GroupNodeParser
GroupNodeParser(NodeGraph &graph, const bNode *node, const bNodeSocket *socket_out, NodeItem::Type to_type, GroupNodeParser *group_parser, bool use_group_default)
Definition
group_nodes.cc:16
blender::nodes::materialx::GroupNodeParser::compute
NodeItem compute() override
Definition
group_nodes.cc:27
blender::nodes::materialx::GroupNodeParser::compute_full
NodeItem compute_full() override
Definition
group_nodes.cc:52
blender::nodes::materialx::GroupNodeParser::use_group_default_
bool use_group_default_
Definition
group_nodes.h:21
blender::nodes::materialx::GroupOutputNodeParser
Definition
group_nodes.h:34
blender::nodes::materialx::GroupOutputNodeParser::compute_full
NodeItem compute_full() override
Definition
group_nodes.cc:88
blender::nodes::materialx::GroupOutputNodeParser::compute
NodeItem compute() override
Definition
group_nodes.cc:61
blender::nodes::materialx::NodeItem
Definition
node_item.h:18
blender::nodes::materialx::NodeItem::Type
Type
Definition
node_item.h:22
blender::nodes::materialx::NodeItem::Type::Any
@ Any
blender::nodes::materialx::NodeItem::input
MaterialX::InputPtr input
Definition
node_item.h:55
blender::nodes::materialx::NodeItem::output
MaterialX::OutputPtr output
Definition
node_item.h:56
blender::nodes::materialx::NodeItem::convert
NodeItem convert(Type to_type) const
Definition
node_item.cc:517
blender::nodes::materialx::NodeParser
Definition
node_parser.h:25
blender::nodes::materialx::NodeParser::get_input_value
NodeItem get_input_value(const std::string &name, NodeItem::Type to_type)
Definition
node_parser.cc:111
blender::nodes::materialx::NodeParser::node_
const bNode * node_
Definition
node_parser.h:28
blender::nodes::materialx::NodeParser::socket_out_
const bNodeSocket * socket_out_
Definition
node_parser.h:29
blender::nodes::materialx::NodeParser::graph_
NodeGraph & graph_
Definition
node_parser.h:27
blender::nodes::materialx::NodeParser::create_node
NodeItem create_node(const std::string &category, NodeItem::Type type)
Definition
node_parser.cc:69
blender::nodes::materialx::NodeParser::empty
NodeItem empty() const
Definition
node_parser.cc:131
blender::nodes::materialx::NodeParser::to_type_
NodeItem::Type to_type_
Definition
node_parser.h:30
node
OperationNode * node
Definition
deg_builder_cycle.cc:38
graph
Depsgraph * graph
Definition
deg_builder_cycle.cc:51
out
#define out
Definition
gpu_glsl_cpp_stubs.hh:947
group_nodes.h
blender::gpu::shader::to_type
static Type to_type(const eGPUType type)
Definition
gpu_shader_create_info.hh:292
blender::nodes::materialx
Definition
group_nodes.cc:14
blender::nodes::materialx::LOG_MATERIALX_SHADER
struct CLG_LogRef * LOG_MATERIALX_SHADER
node_parser.h
outputs
static blender::bke::bNodeSocketTemplate outputs[]
Definition
node_texture_at.cc:16
ID::name
char name[66]
Definition
DNA_ID.h:415
bNodeSocket
Definition
DNA_node_types.h:120
bNodeSocket::name
char name[64]
Definition
DNA_node_types.h:129
bNodeTree
Definition
DNA_node_types.h:752
bNodeTree::id
ID id
Definition
DNA_node_types.h:758
bNode
Definition
DNA_node_types.h:415
bNode::id
struct ID * id
Definition
DNA_node_types.h:486
blender::nodes::materialx::NodeGraph
Definition
node_graph.h:27
value
T value
Definition
usd_reader_camera.cc:34
Generated on Fri Apr 3 2026 06:33:18 for Blender by
doxygen
1.11.0