Skip to content

Commit a3a7744

Browse files
authored
MDL 1.9 updates (#2102)
add new version to GenMDL and remove uniform restriction from material IOR Minor updates: - improve MDL printing by adding named parameters - handle 1-element mixes (basically scale) above layers - improve blur and height to normal to return something meaningful (before totally broken) - improve non-material outputs that can be rendered, e.g. float3x3 and float4x4 - preparations for MDL 1.10 - remove shader parameters from the public MDL material interface. backsurfaceshader and displacementshader showed up with default values only after recent upstream changes
1 parent a368aac commit a3a7744

File tree

14 files changed

+961
-64
lines changed

14 files changed

+961
-64
lines changed

libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<materialx version="1.39">
33

44
<!-- <oren_nayar_diffuse_bsdf> -->
5-
<implementation name="IM_oren_nayar_diffuse_bsdf_genmdl" nodedef="ND_oren_nayar_diffuse_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_oren_nayar_diffuse_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_roughness:{{roughness}}, mxp_normal:{{normal}})" target="genmdl" />
5+
<implementation name="IM_oren_nayar_diffuse_bsdf_genmdl" nodedef="ND_oren_nayar_diffuse_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_oren_nayar_diffuse_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_roughness:{{roughness}}, mxp_normal:{{normal}}, mxp_energy_compensation:{{energy_compensation}})" target="genmdl" />
66

77
<!-- <burley_diffuse_bsdf> -->
88
<implementation name="IM_burley_diffuse_bsdf_genmdl" nodedef="ND_burley_diffuse_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_burley_diffuse_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_roughness:{{roughness}}, mxp_normal:{{normal}})" target="genmdl" />
@@ -11,13 +11,13 @@
1111
<implementation name="IM_translucent_bsdf_genmdl" nodedef="ND_translucent_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_translucent_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_normal:{{normal}})" target="genmdl" />
1212

1313
<!-- <dielectric_bsdf> -->
14-
<implementation name="IM_dielectric_bsdf_genmdl" nodedef="ND_dielectric_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_dielectric_bsdf(mxp_weight:{{weight}}, mxp_tint:{{tint}}, mxp_ior:{{ior}}, mxp_roughness:{{roughness}}, mxp_thinfilm_thickness:{{thinfilm_thickness}}, mxp_thinfilm_ior:{{thinfilm_ior}}, mxp_normal:{{normal}}, mxp_tangent:{{tangent}}, mxp_distribution:{{distribution}}, mxp_scatter_mode:{{scatter_mode}}, mxp_base:{{base}})" target="genmdl" />
14+
<implementation name="IM_dielectric_bsdf_genmdl" nodedef="ND_dielectric_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_dielectric_bsdf(mxp_weight:{{weight}}, mxp_tint:{{tint}}, mxp_ior:{{ior}}, mxp_roughness:{{roughness}}, mxp_thinfilm_thickness:{{thinfilm_thickness}}, mxp_thinfilm_ior:{{thinfilm_ior}}, mxp_normal:{{normal}}, mxp_tangent:{{tangent}}, mxp_distribution:{{distribution}}, mxp_scatter_mode:{{scatter_mode}}, mxp_base:{{base}}, mxp_top_weight:{{top_weight}})" target="genmdl" />
1515

1616
<!-- <conductor_bsdf> -->
1717
<implementation name="IM_conductor_bsdf_genmdl" nodedef="ND_conductor_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_conductor_bsdf(mxp_weight:{{weight}}, mxp_ior:{{ior}}, mxp_extinction:{{extinction}}, mxp_roughness:{{roughness}}, mxp_thinfilm_thickness:{{thinfilm_thickness}}, mxp_thinfilm_ior:{{thinfilm_ior}}, mxp_normal:{{normal}}, mxp_tangent:{{tangent}}, mxp_distribution:{{distribution}})" target="genmdl" />
1818

1919
<!-- <generalized_schlick_bsdf> -->
20-
<implementation name="IM_generalized_schlick_bsdf_genmdl" nodedef="ND_generalized_schlick_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_generalized_schlick_bsdf(mxp_weight:{{weight}}, mxp_color0:{{color0}}, mxp_color90:{{color90}}, mxp_exponent:{{exponent}},mxp_roughness:{{roughness}}, mxp_thinfilm_thickness:{{thinfilm_thickness}}, mxp_thinfilm_ior:{{thinfilm_ior}}, mxp_normal:{{normal}}, mxp_tangent:{{tangent}}, mxp_distribution:{{distribution}}, mxp_scatter_mode:{{scatter_mode}}, mxp_base:{{base}})" target="genmdl" />
20+
<implementation name="IM_generalized_schlick_bsdf_genmdl" nodedef="ND_generalized_schlick_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_generalized_schlick_bsdf(mxp_weight:{{weight}}, mxp_color0:{{color0}}, mxp_color82:{{color82}}, mxp_color90:{{color90}}, mxp_exponent:{{exponent}},mxp_roughness:{{roughness}}, mxp_thinfilm_thickness:{{thinfilm_thickness}}, mxp_thinfilm_ior:{{thinfilm_ior}}, mxp_normal:{{normal}}, mxp_tangent:{{tangent}}, mxp_distribution:{{distribution}}, mxp_scatter_mode:{{scatter_mode}}, mxp_base:{{base}}, mxp_top_weight:{{top_weight}})" target="genmdl" />
2121

2222
<!-- <subsurface_bsdf> -->
2323
<implementation name="IM_subsurface_bsdf_genmdl" nodedef="ND_subsurface_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_subsurface_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_radius:{{radius}}, mxp_anisotropy:{{anisotropy}}, mxp_normal:{{normal}})" target="genmdl" />

libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@
695695
<implementation name="IM_combine3_vector3_genmdl" nodedef="ND_combine3_vector3" target="genmdl" sourcecode="float3( {{in1}},{{in2}},{{in3}} )" />
696696

697697
<!-- <combine4> -->
698-
<implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" sourcecode="color4( {{in1}},{{in2}},{{in3}},{{in4}} )" />
698+
<implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" sourcecode="materialx::core::mk_color4( {{in1}},{{in2}},{{in3}},{{in4}} )" />
699699
<implementation name="IM_combine4_vector4_genmdl" nodedef="ND_combine4_vector4" target="genmdl" sourcecode="float4( {{in1}},{{in2}},{{in3}},{{in4}} )" />
700700

701701
<!-- <creatematrix> -->

source/MaterialXGenMdl/MdlShaderGenerator.cpp

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ const string IMPORT_ALL = " import *";
5252
const string MDL_VERSION_1_6 = "1.6";
5353
const string MDL_VERSION_1_7 = "1.7";
5454
const string MDL_VERSION_1_8 = "1.8";
55+
const string MDL_VERSION_1_9 = "1.9";
5556
const string MDL_VERSION_SUFFIX_1_6 = "1_6";
5657
const string MDL_VERSION_SUFFIX_1_7 = "1_7";
5758
const string MDL_VERSION_SUFFIX_1_8 = "1_8";
59+
const string MDL_VERSION_SUFFIX_1_9 = "1_9";
5860

5961
} // anonymous namespace
6062

@@ -191,6 +193,27 @@ ShaderPtr MdlShaderGenerator::generate(const string& name, ElementPtr element, G
191193
emitLineBreak(stage);
192194
}
193195

196+
// Emit shader inputs that have been filtered during printing of the public interface
197+
const string uniformPrefix = _syntax->getUniformQualifier() + " ";
198+
for (ShaderGraphInputSocket* inputSocket : graph.getInputSockets())
199+
{
200+
if (inputSocket->getConnections().size() &&
201+
(inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_SHADER ||
202+
inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_CLOSURE ||
203+
inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_MATERIAL))
204+
{
205+
const string& qualifier = inputSocket->isUniform() || inputSocket->getType() == Type::FILENAME
206+
? uniformPrefix
207+
: EMPTY_STRING;
208+
const string& type = _syntax->getTypeName(inputSocket->getType());
209+
210+
emitLineBegin(stage);
211+
emitString(qualifier + type + " " + inputSocket->getVariable() + " = ", stage);
212+
emitString(_syntax->getDefaultValue(inputSocket->getType(), true), stage);
213+
emitLineEnd(stage, true);
214+
}
215+
}
216+
194217
// Emit all texturing nodes. These are inputs to any
195218
// closure/shader nodes and need to be emitted first.
196219
emitFunctionCalls(graph, context, stage, ShaderNode::Classification::TEXTURE);
@@ -215,6 +238,7 @@ ShaderPtr MdlShaderGenerator::generate(const string& name, ElementPtr element, G
215238
const string result = getUpstreamResult(outputSocket, context);
216239

217240
const TypeDesc outputType = outputSocket->getType();
241+
// Try to return some meaningful color in case the output is not a material
218242
if (graph.hasClassification(ShaderNode::Classification::TEXTURE))
219243
{
220244
if (outputType == Type::DISPLACEMENTSHADER)
@@ -229,7 +253,25 @@ ShaderPtr MdlShaderGenerator::generate(const string& name, ElementPtr element, G
229253
else
230254
{
231255
emitLine("float3 displacement__ = float3(0.0)", stage);
232-
emitLine("color finalOutput__ = mk_color3(" + result + ")", stage);
256+
std::string finalOutput = "mk_color3(0.0)";
257+
if (outputType == Type::BOOLEAN)
258+
finalOutput = result + " ? mk_color3(0.0, 1.0, 0.0) : mk_color3(1.0, 0.0, 0.0)";
259+
else if (outputType == Type::INTEGER)
260+
finalOutput = "mk_color3(" + result + " / 100)"; // arbitrary
261+
else if (outputType == Type::FLOAT)
262+
finalOutput = "mk_color3(" + result + ")";
263+
else if (outputType == Type::VECTOR2)
264+
finalOutput = "mk_color3(" + result + ".x, " + result + ".y, 0.0)";
265+
else if (outputType == Type::VECTOR3)
266+
finalOutput = "mk_color3(" + result + ")";
267+
else if (outputType == Type::COLOR3)
268+
finalOutput = result;
269+
else if (outputType == Type::COLOR4)
270+
finalOutput = result + ".rgb";
271+
else if (outputType == Type::MATRIX33 || outputType == Type::MATRIX44)
272+
finalOutput = "mk_color3(" + result + "[0][0], " + result + "[1][1], " + result + "[2][2])";
273+
274+
emitLine("color finalOutput__ = " + finalOutput, stage);
233275
}
234276

235277
// End shader body
@@ -527,6 +569,13 @@ ShaderPtr MdlShaderGenerator::createShader(const string& name, ElementPtr elemen
527569
// and are editable by users.
528570
if (inputSocket->getConnections().size() && graph->isEditable(*inputSocket))
529571
{
572+
if (inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_SHADER ||
573+
inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_CLOSURE ||
574+
inputSocket->getType().getSemantic() == TypeDesc::SEMANTIC_MATERIAL)
575+
{
576+
continue;
577+
}
578+
530579
inputs->add(inputSocket->getSelf());
531580
}
532581
}
@@ -537,7 +586,7 @@ ShaderPtr MdlShaderGenerator::createShader(const string& name, ElementPtr elemen
537586
outputs->add(outputSocket->getSelf());
538587
}
539588

540-
// MDL does not allow varying data connected to transmission IOR.
589+
// MDL does not allow varying data connected to transmission IOR until MDL 1.9.
541590
// We must find all uses of transmission IOR and make sure we don't
542591
// have a varying connection to it. If a varying connection is found
543592
// we break that connection and revert to using default value on that
@@ -552,8 +601,14 @@ ShaderPtr MdlShaderGenerator::createShader(const string& name, ElementPtr elemen
552601
// this fix will disconnect the transmission IOR on the inside, but
553602
// still support the connection to reflection IOR.
554603
//
555-
if (graph->hasClassification(ShaderNode::Classification::SHADER) ||
556-
graph->hasClassification(ShaderNode::Classification::CLOSURE))
604+
GenMdlOptions::MdlVersion version = getMdlVersion(context);
605+
bool uniformIorRequired =
606+
version == GenMdlOptions::MdlVersion::MDL_1_6 ||
607+
version == GenMdlOptions::MdlVersion::MDL_1_7 ||
608+
version == GenMdlOptions::MdlVersion::MDL_1_8;
609+
if (uniformIorRequired && (
610+
graph->hasClassification(ShaderNode::Classification::SHADER) ||
611+
graph->hasClassification(ShaderNode::Classification::CLOSURE)))
557612
{
558613
// Find dependencies on transmission IOR.
559614
std::set<ShaderGraph*> graphsWithIorDependency;
@@ -641,10 +696,15 @@ void MdlShaderGenerator::emitShaderInputs(const DocumentPtr doc, const VariableB
641696
}
642697
}
643698

644-
void MdlShaderGenerator::emitMdlVersionNumber(GenContext& context, ShaderStage& stage) const
699+
GenMdlOptions::MdlVersion MdlShaderGenerator::getMdlVersion(GenContext& context) const
645700
{
646701
GenMdlOptionsPtr options = context.getUserData<GenMdlOptions>(GenMdlOptions::GEN_CONTEXT_USER_DATA_KEY);
647-
GenMdlOptions::MdlVersion version = options ? options->targetVersion : GenMdlOptions::MdlVersion::MDL_LATEST;
702+
return options ? options->targetVersion : GenMdlOptions::MdlVersion::MDL_LATEST;
703+
}
704+
705+
void MdlShaderGenerator::emitMdlVersionNumber(GenContext& context, ShaderStage& stage) const
706+
{
707+
GenMdlOptions::MdlVersion version = getMdlVersion(context);
648708

649709
emitLineBegin(stage);
650710
emitString("mdl ", stage);
@@ -656,30 +716,35 @@ void MdlShaderGenerator::emitMdlVersionNumber(GenContext& context, ShaderStage&
656716
case GenMdlOptions::MdlVersion::MDL_1_7:
657717
emitString(MDL_VERSION_1_7, stage);
658718
break;
719+
case GenMdlOptions::MdlVersion::MDL_1_8:
720+
emitString(MDL_VERSION_1_8, stage);
721+
break;
659722
default:
660-
// GenMdlOptions::MdlVersion::MDL_1_8
723+
// GenMdlOptions::MdlVersion::MDL_1_9
661724
// GenMdlOptions::MdlVersion::MDL_LATEST
662-
emitString(MDL_VERSION_1_8, stage);
725+
emitString(MDL_VERSION_1_9, stage);
663726
break;
664727
}
665728
emitLineEnd(stage, true);
666729
}
667730

731+
668732
const string& MdlShaderGenerator::getMdlVersionFilenameSuffix(GenContext& context) const
669733
{
670-
GenMdlOptionsPtr options = context.getUserData<GenMdlOptions>(GenMdlOptions::GEN_CONTEXT_USER_DATA_KEY);
671-
GenMdlOptions::MdlVersion version = options ? options->targetVersion : GenMdlOptions::MdlVersion::MDL_LATEST;
734+
GenMdlOptions::MdlVersion version = getMdlVersion(context);
672735

673736
switch (version)
674737
{
675738
case GenMdlOptions::MdlVersion::MDL_1_6:
676739
return MDL_VERSION_SUFFIX_1_6;
677740
case GenMdlOptions::MdlVersion::MDL_1_7:
678741
return MDL_VERSION_SUFFIX_1_7;
742+
case GenMdlOptions::MdlVersion::MDL_1_8:
743+
return MDL_VERSION_SUFFIX_1_8;
679744
default:
680-
// GenMdlOptions::MdlVersion::MDL_1_8
745+
// GenMdlOptions::MdlVersion::MDL_1_9
681746
// GenMdlOptions::MdlVersion::MDL_LATEST
682-
return MDL_VERSION_SUFFIX_1_8;
747+
return MDL_VERSION_SUFFIX_1_9;
683748
}
684749
}
685750

source/MaterialXGenMdl/MdlShaderGenerator.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ class MX_GENMDL_API GenMdlOptions : public GenUserData
2525
MDL_1_6,
2626
MDL_1_7,
2727
MDL_1_8,
28-
MDL_LATEST = MDL_1_8
28+
MDL_1_9,
29+
MDL_LATEST = MDL_1_9
2930
};
3031

3132
/// Create MDL code generator options with default values.
@@ -76,7 +77,11 @@ class MX_GENMDL_API MdlShaderGenerator : public ShaderGenerator
7677
/// Map of code snippets for geomprops in MDL.
7778
static const std::unordered_map<string, string> GEOMPROP_DEFINITIONS;
7879

79-
/// Add the MDL file header containing the version number of the generated module..
80+
/// Get the selected MDL target language version number from the context option.
81+
/// If not set, the latest version supported by GenMdl is returned.
82+
GenMdlOptions::MdlVersion getMdlVersion(GenContext& context) const;
83+
84+
/// Add the MDL file header containing the version number of the generated module.
8085
void emitMdlVersionNumber(GenContext& context, ShaderStage& stage) const;
8186

8287
/// Add the version number suffix appended to MDL modules that use versions.

source/MaterialXGenMdl/Nodes/ClosureLayerNodeMdl.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ MATERIALX_NAMESPACE_BEGIN
1616

1717
const string StringConstantsMdl::TOP = "top";
1818
const string StringConstantsMdl::BASE = "base";
19+
const string StringConstantsMdl::FG = "fg";
20+
const string StringConstantsMdl::BG = "bg";
21+
const string StringConstantsMdl::MIX = "mix";
22+
const string StringConstantsMdl::TOP_WEIGHT = "top_weight";
1923

2024
ShaderNodeImplPtr ClosureLayerNodeMdl::create()
2125
{
@@ -101,6 +105,7 @@ void ClosureLayerNodeMdl::emitFunctionCall(const ShaderNode& _node, GenContext&
101105

102106
// Transport the base bsdf further than one layer
103107
ShaderNode* baseReceiverNode = top;
108+
ShaderNode* mixTopWeightNode = nullptr;
104109
while (true)
105110
{
106111
// If the top node is again a layer, we don't want to override the base
@@ -111,6 +116,26 @@ void ClosureLayerNodeMdl::emitFunctionCall(const ShaderNode& _node, GenContext&
111116
}
112117
else
113118
{
119+
// TODO is there a more efficient way to check if the node is a mix_bsdf?
120+
std::string name = top->getImplementation().getName();
121+
if (name == "IM_mix_bsdf_genmdl")
122+
{
123+
// handle one special case: the top node is a mix where either fg or bg is empty
124+
// so basically a scale factor
125+
ShaderOutput* fgOutput = top->getInput(StringConstantsMdl::FG)->getConnection();
126+
ShaderOutput* bgOutput = top->getInput(StringConstantsMdl::BG)->getConnection();
127+
ShaderOutput* mixOutput = top->getInput(StringConstantsMdl::MIX)->getConnection();
128+
ShaderNode* fg = fgOutput ? fgOutput->getNode() : nullptr;
129+
ShaderNode* bg = bgOutput ? bgOutput->getNode() : nullptr;
130+
ShaderNode* mix = mixOutput ? mixOutput->getNode() : nullptr;
131+
if ((fg && !bg) || (!fg && bg))
132+
{
133+
baseReceiverNode = fg ? fg : bg; // take the node that is valid
134+
top = baseReceiverNode;
135+
mixTopWeightNode = mix;
136+
}
137+
break;
138+
}
114139
// we stop at elemental bsdfs
115140
// TODO handle mix, add, and multiply
116141
break;
@@ -150,6 +175,11 @@ void ClosureLayerNodeMdl::emitFunctionCall(const ShaderNode& _node, GenContext&
150175
// base BSDF connection and output variable name from the
151176
// layer operator itself.
152177
topNodeBaseInput->makeConnection(base->getOutput());
178+
if (mixTopWeightNode)
179+
{
180+
ShaderInput* topNodeTopWeightInput = baseReceiverNode->getInput(StringConstantsMdl::TOP_WEIGHT);
181+
topNodeTopWeightInput->makeConnection(mixTopWeightNode->getOutput());
182+
}
153183
ScopedSetVariableName setVariable(output->getVariable(), top->getOutput());
154184

155185
// Make the call.
@@ -171,6 +201,21 @@ void LayerableNodeMdl::addInputs(ShaderNode& node, GenContext& /*context*/) cons
171201
{
172202
// Add the input to hold base layer BSDF.
173203
node.addInput(StringConstantsMdl::BASE, Type::BSDF);
204+
205+
// Set the top level weight default to 1.0
206+
ShaderInput* topWeightNode = node.addInput(StringConstantsMdl::TOP_WEIGHT, Type::FLOAT);
207+
ValuePtr value = TypedValue<float>::createValue(1.0f);
208+
topWeightNode->setValue(value);
209+
}
210+
211+
bool LayerableNodeMdl::isEditable(const ShaderInput& input) const
212+
{
213+
if (input.getName() == StringConstantsMdl::BASE ||
214+
input.getName() == StringConstantsMdl::TOP_WEIGHT)
215+
{
216+
return false;
217+
}
218+
return BASE::isEditable(input);
174219
}
175220

176221
MATERIALX_NAMESPACE_END

source/MaterialXGenMdl/Nodes/ClosureLayerNodeMdl.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ class MX_GENMDL_API StringConstantsMdl
2323
/// String constants
2424
static const string TOP; ///< layer parameter name of the top component
2525
static const string BASE; ///< layer parameter name of the base component
26+
static const string FG; ///< mix parameter name of the foreground
27+
static const string BG; ///< mix parameter name of the background
28+
static const string MIX; ///< mix parameter name of the amount
29+
static const string TOP_WEIGHT; ///< mix amount forwarded into layer top component
2630
};
2731

2832
/// Closure layer node implementation for MDL.
@@ -40,11 +44,14 @@ class MX_GENMDL_API ClosureLayerNodeMdl : public ShaderNodeImpl
4044
/// Note, not all elemental bsdfs support this kind of transformation.
4145
class MX_GENMDL_API LayerableNodeMdl : public SourceCodeNodeMdl
4246
{
47+
using BASE = SourceCodeNodeMdl;
48+
4349
public:
4450
virtual ~LayerableNodeMdl() = default;
4551
static ShaderNodeImplPtr create();
4652

4753
void addInputs(ShaderNode& node, GenContext&) const override;
54+
bool isEditable(const ShaderInput& input) const override;
4855
};
4956

5057
MATERIALX_NAMESPACE_END

0 commit comments

Comments
 (0)