Skip to content

Commit

Permalink
Update implementations of extract and separate (#1800)
Browse files Browse the repository at this point in the history
This changelist updates the implementations of the extract and separate nodes, removing their dependence on channels attributes.

This is a first step towards converting channels attributes to nodes in the upgrade logic for MaterialX 1.39.
  • Loading branch information
jstone-lucasfilm committed May 5, 2024
1 parent 19c0108 commit fc41eb1
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 87 deletions.
7 changes: 7 additions & 0 deletions libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,13 @@
<implementation name="IM_creatematrix_vector3_matrix44_genglsl" nodedef="ND_creatematrix_vector3_matrix44" file="mx_creatematrix_vector3_matrix44.glsl" function="mx_creatematrix_vector3_matrix44" target="genglsl" />
<implementation name="IM_creatematrix_vector4_matrix44_genglsl" nodedef="ND_creatematrix_vector4_matrix44" file="mx_creatematrix_vector4_matrix44.glsl" function="mx_creatematrix_vector4_matrix44" target="genglsl" />

<!-- <extract> -->
<implementation name="IM_extract_color3_genglsl" nodedef="ND_extract_color3" sourcecode="{{in}}[{{index}}]" target="genglsl" />
<implementation name="IM_extract_color4_genglsl" nodedef="ND_extract_color4" sourcecode="{{in}}[{{index}}]" target="genglsl" />
<implementation name="IM_extract_vector2_genglsl" nodedef="ND_extract_vector2" sourcecode="{{in}}[{{index}}]" target="genglsl" />
<implementation name="IM_extract_vector3_genglsl" nodedef="ND_extract_vector3" sourcecode="{{in}}[{{index}}]" target="genglsl" />
<implementation name="IM_extract_vector4_genglsl" nodedef="ND_extract_vector4" sourcecode="{{in}}[{{index}}]" target="genglsl" />

<!-- ======================================================================== -->
<!-- Convolution nodes -->
<!-- ======================================================================== -->
Expand Down
7 changes: 7 additions & 0 deletions libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,13 @@
<implementation name="IM_creatematrix_vector3_matrix44_genmdl" nodedef="ND_creatematrix_vector3_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_creatematrix_vector3_matrix44({{in1}}, {{in2}}, {{in3}}, {{in4}})" target="genmdl" />
<implementation name="IM_creatematrix_vector4_matrix44_genmdl" nodedef="ND_creatematrix_vector4_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_creatematrix_vector4_matrix44({{in1}}, {{in2}}, {{in3}}, {{in4}})" target="genmdl" />

<!-- <extract> -->
<implementation name="IM_extract_color3_genmdl" nodedef="ND_extract_color3" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_color3({{in}}, {{index}})" target="genmdl" />
<implementation name="IM_extract_color4_genmdl" nodedef="ND_extract_color4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_color4({{in}}, {{index}})" target="genmdl" />
<implementation name="IM_extract_vector2_genmdl" nodedef="ND_extract_vector2" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector2({{in}}, {{index}})" target="genmdl" />
<implementation name="IM_extract_vector3_genmdl" nodedef="ND_extract_vector3" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector3({{in}}, {{index}})" target="genmdl" />
<implementation name="IM_extract_vector4_genmdl" nodedef="ND_extract_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector4({{in}}, {{index}})" target="genmdl" />

<!-- ======================================================================== -->
<!-- Convolution nodes -->
<!-- ======================================================================== -->
Expand Down
7 changes: 7 additions & 0 deletions libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,13 @@
<implementation name="IM_creatematrix_vector3_matrix44_genmsl" nodedef="ND_creatematrix_vector3_matrix44" file="../genglsl/mx_creatematrix_vector3_matrix44.glsl" function="mx_creatematrix_vector3_matrix44" target="genmsl" />
<implementation name="IM_creatematrix_vector4_matrix44_genmsl" nodedef="ND_creatematrix_vector4_matrix44" file="../genglsl/mx_creatematrix_vector4_matrix44.glsl" function="mx_creatematrix_vector4_matrix44" target="genmsl" />

<!-- <extract> -->
<implementation name="IM_extract_color3_genmsl" nodedef="ND_extract_color3" sourcecode="{{in}}[{{index}}]" target="genmsl" />
<implementation name="IM_extract_color4_genmsl" nodedef="ND_extract_color4" sourcecode="{{in}}[{{index}}]" target="genmsl" />
<implementation name="IM_extract_vector2_genmsl" nodedef="ND_extract_vector2" sourcecode="{{in}}[{{index}}]" target="genmsl" />
<implementation name="IM_extract_vector3_genmsl" nodedef="ND_extract_vector3" sourcecode="{{in}}[{{index}}]" target="genmsl" />
<implementation name="IM_extract_vector4_genmsl" nodedef="ND_extract_vector4" sourcecode="{{in}}[{{index}}]" target="genmsl" />

<!-- ======================================================================== -->
<!-- Convolution nodes -->
<!-- ======================================================================== -->
Expand Down
34 changes: 34 additions & 0 deletions libraries/stdlib/genosl/include/mx_funcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
//

float mx_ternary(int expr, float v1, float v2) { if (expr) return v1; else return v2; }
int mx_ternary(int expr, int v1, int v2) { if (expr) return v1; else return v2; }
color mx_ternary(int expr, color v1, color v2) { if (expr) return v1; else return v2; }
color4 mx_ternary(int expr, color4 v1, color4 v2) { if (expr) return v1; else return v2; }
vector mx_ternary(int expr, vector v1, vector v2) { if (expr) return v1; else return v2; }
Expand Down Expand Up @@ -99,6 +100,39 @@ matrix mx_subtract(matrix a, float b)
}


float mx_extract(color in, int index)
{
return in[index];
}

float mx_extract(color4 in, int index)
{
if (index == 0) return in.rgb.r;
else if (index == 1) return in.rgb.g;
else if (index == 2) return in.rgb.b;
else return in.a;
}

float mx_extract(vector2 in, int index)
{
if (index == 0) return in.x;
else return in.y;
}

float mx_extract(vector in, int index)
{
return in[index];
}

float mx_extract(vector4 in, int index)
{
if (index == 0) return in.x;
else if (index == 1) return in.y;
else if (index == 2) return in.z;
else return in.w;
}


float mx_remap(float in, float inLow, float inHigh, float outLow, float outHigh, int doClamp)
{
float x = (in - inLow)/(inHigh-inLow);
Expand Down
7 changes: 7 additions & 0 deletions libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,13 @@
<implementation name="IM_creatematrix_vector3_matrix44_genosl" nodedef="ND_creatematrix_vector3_matrix44" file="mx_creatematrix.osl" function="mx_creatematrix_vector3_matrix44" target="genosl" />
<implementation name="IM_creatematrix_vector4_matrix44_genosl" nodedef="ND_creatematrix_vector4_matrix44" file="mx_creatematrix.osl" function="mx_creatematrix_vector4_matrix44" target="genosl" />

<!-- <extract> -->
<implementation name="IM_extract_color3_genosl" nodedef="ND_extract_color3" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
<implementation name="IM_extract_color4_genosl" nodedef="ND_extract_color4" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
<implementation name="IM_extract_vector2_genosl" nodedef="ND_extract_vector2" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
<implementation name="IM_extract_vector3_genosl" nodedef="ND_extract_vector3" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
<implementation name="IM_extract_vector4_genosl" nodedef="ND_extract_vector4" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />

<!-- ======================================================================== -->
<!-- Convolution nodes -->
<!-- ======================================================================== -->
Expand Down
2 changes: 1 addition & 1 deletion libraries/stdlib/stdlib_defs.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -4412,7 +4412,7 @@
</nodedef>

<!--
Node: <extract> Supplemental Node
Node: <extract>
Extract a single channel from a colorN or vectorN stream, outputting a float.
-->
<nodedef name="ND_extract_color3" node="extract" nodegroup="channel">
Expand Down
160 changes: 79 additions & 81 deletions libraries/stdlib/stdlib_ng.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -3977,10 +3977,10 @@
</nodegraph>
<nodegraph name="NG_overlay_color3" nodedef="ND_overlay_color3">
<output name="out" type="color3" nodename="N_combine" />
<separate3 name="N_split_color3_fg" type="multioutput" nodedef="ND_separate3_color3">
<separate3 name="N_split_color3_fg" type="multioutput">
<input name="in" type="color3" interfacename="fg" />
</separate3>
<separate3 name="N_split_color3_bg" type="multioutput" nodedef="ND_separate3_color3">
<separate3 name="N_split_color3_bg" type="multioutput">
<input name="in" type="color3" interfacename="bg" />
</separate3>
<combine3 name="N_combine" type="color3" nodedef="ND_combine3_color3">
Expand All @@ -4006,10 +4006,10 @@
</nodegraph>
<nodegraph name="NG_overlay_color4" nodedef="ND_overlay_color4">
<output name="out" type="color4" nodename="N_combine" />
<separate4 name="N_split_fg" type="multioutput" nodedef="ND_separate4_color4">
<separate4 name="N_split_fg" type="multioutput">
<input name="in" type="color4" interfacename="fg" />
</separate4>
<separate4 name="N_split_bg" type="multioutput" nodedef="ND_separate4_color4">
<separate4 name="N_split_bg" type="multioutput">
<input name="in" type="color4" interfacename="bg" />
</separate4>
<overlay name="N_overlay_r" type="float" nodedef="ND_overlay_float">
Expand Down Expand Up @@ -4146,101 +4146,99 @@
<output name="out" type="surfaceshader" nodename="surface" />
</nodegraph>

<!--
Node: <extract>
Extract a single channel from a colorN or vectorN stream, outputting a float.
-->
<nodegraph name="NG_extract_color3" nodedef="ND_extract_color3">
<switch name="N_sw_color3" type="float">
<input name="in1" type="float" interfacename="in" channels="r" />
<input name="in2" type="float" interfacename="in" channels="g" />
<input name="in3" type="float" interfacename="in" channels="b" />
<input name="which" type="integer" interfacename="index" />
</switch>
<output name="out" type="float" nodename="N_sw_color3" />
</nodegraph>
<nodegraph name="NG_extract_color4" nodedef="ND_extract_color4">
<switch name="N_sw_color4" type="float">
<input name="in1" type="float" interfacename="in" channels="r" />
<input name="in2" type="float" interfacename="in" channels="g" />
<input name="in3" type="float" interfacename="in" channels="b" />
<input name="in4" type="float" interfacename="in" channels="a" />
<input name="which" type="integer" interfacename="index" />
</switch>
<output name="out" type="float" nodename="N_sw_color4" />
</nodegraph>
<nodegraph name="NG_extract_vector2" nodedef="ND_extract_vector2">
<switch name="N_sw_vector2" type="float">
<input name="in1" type="float" interfacename="in" channels="x" />
<input name="in2" type="float" interfacename="in" channels="y" />
<input name="which" type="integer" interfacename="index" />
</switch>
<output name="out" type="float" nodename="N_sw_vector2" />
</nodegraph>
<nodegraph name="NG_extract_vector3" nodedef="ND_extract_vector3">
<switch name="N_sw_vector3" type="float">
<input name="in1" type="float" interfacename="in" channels="x" />
<input name="in2" type="float" interfacename="in" channels="y" />
<input name="in3" type="float" interfacename="in" channels="z" />
<input name="which" type="integer" interfacename="index" />
</switch>
<output name="out" type="float" nodename="N_sw_vector3" />
</nodegraph>
<nodegraph name="NG_extract_vector4" nodedef="ND_extract_vector4">
<switch name="N_sw_vector4" type="float">
<input name="in1" type="float" interfacename="in" channels="x" />
<input name="in2" type="float" interfacename="in" channels="y" />
<input name="in3" type="float" interfacename="in" channels="z" />
<input name="in4" type="float" interfacename="in" channels="w" />
<input name="which" type="integer" interfacename="index" />
</switch>
<output name="out" type="float" nodename="N_sw_vector4" />
</nodegraph>

<!--
Nodes: <separate2>, <separate3>, <separate4>
Output each of the channels of a color/vector stream as a separate float output.
-->
<nodegraph name="NG_separate3_color3" nodedef="ND_separate3_color3">
<dot name="N_dot_color3" type="color3">
<extract name="N_extract_0" type="float">
<input name="in" type="color3" interfacename="in" />
</dot>
<output name="outr" type="float" nodename="N_dot_color3" channels="r" />
<output name="outg" type="float" nodename="N_dot_color3" channels="g" />
<output name="outb" type="float" nodename="N_dot_color3" channels="b" />
<input name="index" type="integer" value="0" />
</extract>
<extract name="N_extract_1" type="float">
<input name="in" type="color3" interfacename="in" />
<input name="index" type="integer" value="1" />
</extract>
<extract name="N_extract_2" type="float">
<input name="in" type="color3" interfacename="in" />
<input name="index" type="integer" value="2" />
</extract>
<output name="outr" type="float" nodename="N_extract_0" />
<output name="outg" type="float" nodename="N_extract_1" />
<output name="outb" type="float" nodename="N_extract_2" />
</nodegraph>
<nodegraph name="NG_separate4_color4" nodedef="ND_separate4_color4">
<dot name="N_dot_color4" type="color4">
<extract name="N_extract_0" type="float">
<input name="in" type="color4" interfacename="in" />
<input name="index" type="integer" value="0" />
</extract>
<extract name="N_extract_1" type="float">
<input name="in" type="color4" interfacename="in" />
<input name="index" type="integer" value="1" />
</extract>
<extract name="N_extract_2" type="float">
<input name="in" type="color4" interfacename="in" />
</dot>
<output name="outr" type="float" nodename="N_dot_color4" channels="r" />
<output name="outg" type="float" nodename="N_dot_color4" channels="g" />
<output name="outb" type="float" nodename="N_dot_color4" channels="b" />
<output name="outa" type="float" nodename="N_dot_color4" channels="a" />
<input name="index" type="integer" value="2" />
</extract>
<extract name="N_extract_3" type="float">
<input name="in" type="color4" interfacename="in" />
<input name="index" type="integer" value="3" />
</extract>
<output name="outr" type="float" nodename="N_extract_0" />
<output name="outg" type="float" nodename="N_extract_1" />
<output name="outb" type="float" nodename="N_extract_2" />
<output name="outa" type="float" nodename="N_extract_3" />
</nodegraph>
<nodegraph name="NG_separate2_vector2" nodedef="ND_separate2_vector2">
<dot name="N_dot_vector2" type="vector2">
<extract name="N_extract_0" type="float">
<input name="in" type="vector2" interfacename="in" />
<input name="index" type="integer" value="0" />
</extract>
<extract name="N_extract_1" type="float">
<input name="in" type="vector2" interfacename="in" />
</dot>
<output name="outx" type="float" nodename="N_dot_vector2" channels="x" />
<output name="outy" type="float" nodename="N_dot_vector2" channels="y" />
<input name="index" type="integer" value="1" />
</extract>
<output name="outx" type="float" nodename="N_extract_0" />
<output name="outy" type="float" nodename="N_extract_1" />
</nodegraph>
<nodegraph name="NG_separate3_vector3" nodedef="ND_separate3_vector3">
<dot name="N_dot_vector3" type="vector3">
<extract name="N_extract_0" type="float">
<input name="in" type="vector3" interfacename="in" />
</dot>
<output name="outx" type="float" nodename="N_dot_vector3" channels="x" />
<output name="outy" type="float" nodename="N_dot_vector3" channels="y" />
<output name="outz" type="float" nodename="N_dot_vector3" channels="z" />
<input name="index" type="integer" value="0" />
</extract>
<extract name="N_extract_1" type="float">
<input name="in" type="vector3" interfacename="in" />
<input name="index" type="integer" value="1" />
</extract>
<extract name="N_extract_2" type="float">
<input name="in" type="vector3" interfacename="in" />
<input name="index" type="integer" value="2" />
</extract>
<output name="outx" type="float" nodename="N_extract_0" />
<output name="outy" type="float" nodename="N_extract_1" />
<output name="outz" type="float" nodename="N_extract_2" />
</nodegraph>
<nodegraph name="NG_separate4_vector4" nodedef="ND_separate4_vector4">
<dot name="N_dot_vector4" type="vector4">
<extract name="N_extract_0" type="float">
<input name="in" type="vector4" interfacename="in" />
</dot>
<output name="outx" type="float" nodename="N_dot_vector4" channels="x" />
<output name="outy" type="float" nodename="N_dot_vector4" channels="y" />
<output name="outz" type="float" nodename="N_dot_vector4" channels="z" />
<output name="outw" type="float" nodename="N_dot_vector4" channels="w" />
<input name="index" type="integer" value="0" />
</extract>
<extract name="N_extract_1" type="float">
<input name="in" type="vector4" interfacename="in" />
<input name="index" type="integer" value="1" />
</extract>
<extract name="N_extract_2" type="float">
<input name="in" type="vector4" interfacename="in" />
<input name="index" type="integer" value="2" />
</extract>
<extract name="N_extract_3" type="float">
<input name="in" type="vector4" interfacename="in" />
<input name="index" type="integer" value="3" />
</extract>
<output name="outx" type="float" nodename="N_extract_0" />
<output name="outy" type="float" nodename="N_extract_1" />
<output name="outz" type="float" nodename="N_extract_2" />
<output name="outw" type="float" nodename="N_extract_3" />
</nodegraph>

<!-- ======================================================================== -->
Expand Down
Loading

0 comments on commit fc41eb1

Please sign in to comment.