From fc41eb16323eaf1e18a6acc496fb852e58cb798b Mon Sep 17 00:00:00 2001 From: Jonathan Stone Date: Sun, 5 May 2024 10:26:08 -0700 Subject: [PATCH] Update implementations of extract and separate (#1800) 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. --- .../stdlib/genglsl/stdlib_genglsl_impl.mtlx | 7 + .../stdlib/genmdl/stdlib_genmdl_impl.mtlx | 7 + .../stdlib/genmsl/stdlib_genmsl_impl.mtlx | 7 + libraries/stdlib/genosl/include/mx_funcs.h | 34 ++++ .../stdlib/genosl/stdlib_genosl_impl.mtlx | 7 + libraries/stdlib/stdlib_defs.mtlx | 2 +- libraries/stdlib/stdlib_ng.mtlx | 160 +++++++++--------- .../mdl/materialx/stdlib_1_6.mdl | 86 +++++++++- 8 files changed, 223 insertions(+), 87 deletions(-) diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx index 5892a41a41..b8da7c99be 100644 --- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx +++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx @@ -705,6 +705,13 @@ + + + + + + + diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx index 4a9956fcf6..374700e1d7 100644 --- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx +++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx @@ -717,6 +717,13 @@ + + + + + + + diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx index 49c635a98c..6a82be9b46 100644 --- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx +++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx @@ -705,6 +705,13 @@ + + + + + + + diff --git a/libraries/stdlib/genosl/include/mx_funcs.h b/libraries/stdlib/genosl/include/mx_funcs.h index 4db654c6fa..6d371575a6 100644 --- a/libraries/stdlib/genosl/include/mx_funcs.h +++ b/libraries/stdlib/genosl/include/mx_funcs.h @@ -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; } @@ -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); diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx index 3a7fc5806e..8070c7ec89 100644 --- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx +++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx @@ -708,6 +708,13 @@ + + + + + + + diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx index e1be593233..0fccb8c5a3 100644 --- a/libraries/stdlib/stdlib_defs.mtlx +++ b/libraries/stdlib/stdlib_defs.mtlx @@ -4412,7 +4412,7 @@ diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx index 19c183af0e..fcb1a4aacf 100644 --- a/libraries/stdlib/stdlib_ng.mtlx +++ b/libraries/stdlib/stdlib_ng.mtlx @@ -3977,10 +3977,10 @@ - + - + @@ -4006,10 +4006,10 @@ - + - + @@ -4146,101 +4146,99 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - + + + + + + + + + + + + + - + + + + + + + + + - - - - - + + + + + + + + + + - + + + + + - - - + + + + - + - - - - + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + + + + + + diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl index eec2e29f9d..c93743f2de 100644 --- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl +++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl @@ -4461,11 +4461,87 @@ export float4x4 mx_creatematrix_vector4_matrix44( mxp_in4[0], mxp_in4[1], mxp_in4[2], mxp_in4[3]); } -// Nodedef: ND_extract_color3 is represented by a nodegraph: NG_extract_color3 -// Nodedef: ND_extract_color4 is represented by a nodegraph: NG_extract_color4 -// Nodedef: ND_extract_vector2 is represented by a nodegraph: NG_extract_vector2 -// Nodedef: ND_extract_vector3 is represented by a nodegraph: NG_extract_vector3 -// Nodedef: ND_extract_vector4 is represented by a nodegraph: NG_extract_vector4 +export float mx_extract_color3( + color mxp_in = color(0.0, 0.0, 0.0), + float mxp_index = int(0) +) + [[ + anno::description("Node Group: channel") + ]] +{ + switch (mxp_index) + { + case 0: return float3(mxp_in).r; + case 1: return float3(mxp_in).g; + default: return float3(mxp_in).b; + } +} + +export float mx_extract_color4( + core::mk_color4 mxp_in = core::mk_color4(0.0, 0.0, 0.0, 0.0), + float mxp_index = int(0) +) + [[ + anno::description("Node Group: channel") + ]] +{ + switch (mxp_index) + { + case 0: return float3(mxp_in.rgb).r; + case 1: return float3(mxp_in.rgb).g; + case 2: return float3(mxp_in.rgb).b; + default: return mxp_in.a; + } +} + +export float mx_extract_vector2( + float2 mxp_in = float2(0.0, 0.0), + float mxp_index = int(0) +) + [[ + anno::description("Node Group: channel") + ]] +{ + switch (mxp_index) + { + case 0: return mxp_in.x; + default: return mxp_in.y; + } +} + +export float mx_extract_vector3( + float3 mxp_in = float3(0.0, 0.0, 0.0), + float mxp_index = int(0) +) + [[ + anno::description("Node Group: channel") + ]] +{ + switch (mxp_index) + { + case 0: return mxp_in.x; + case 1: return mxp_in.y; + default: return mxp_in.z; + } +} + +export float mx_extract_vector4( + float4 mxp_in = float4(0.0, 0.0, 0.0, 0.0), + float mxp_index = int(0) +) + [[ + anno::description("Node Group: channel") + ]] +{ + switch (mxp_index) + { + case 0: return mxp_in.x; + case 1: return mxp_in.y; + case 2: return mxp_in.z; + default: return mxp_in.w; + } +} + // Nodedef: ND_separate2_vector2 is represented by a nodegraph: NG_separate2_vector2 // Nodedef: ND_separate3_color3 is represented by a nodegraph: NG_separate3_color3 // Nodedef: ND_separate3_vector3 is represented by a nodegraph: NG_separate3_vector3