Skip to content

Commit 5e0e578

Browse files
authored
Add extract node support for matrix33 and matrix44 types (#2812)
Add extract node definitions for matrix33 and matrix44 types, enabling row vector extraction by index from matrices. - matrix33 extract returns vector3 (row index 0-2) - matrix44 extract returns vector4 (row index 0-3) Includes node definitions, implementations for GLSL, MDL, and OSL backends, and corresponding unit tests.
1 parent c60016a commit 5e0e578

10 files changed

Lines changed: 91 additions & 2 deletions

File tree

documents/Specification/MaterialX.StandardNodes.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,15 +2105,23 @@ Channel nodes are used to perform channel manipulations and data type conversion
21052105

21062106
### `extract`
21072107

2108-
Isolate a single float channel from a __vectorN__ or __colorN__ stream.
2108+
Isolate a single channel from a __colorN__, __vectorN__, or __matrixNN__ stream.
2109+
2110+
When the input is a __colorN__ or __vectorN__, the node extracts a single float component by index. When the input is a __matrix33__ or __matrix44__, the node extracts a row vector by index.
21092111

21102112
|Port |Description |Type |Default |
21112113
|-------|--------------------------------------------|---------------|--------|
21122114
|`in` |The input stream from which to extract `out`|colorN, vectorN|__zero__|
21132115
|`index`|The index of the channel in `in` to extract |integer |0 |
21142116
|`out` |Output: the `index`th channel of `in` |float |0.0 |
21152117

2116-
The valid range for `index` should be clamped to $[0,N)$ in the user interface, where __N__ is the size of the input vector stream. `index` is a uniform, non-varying value. Any `index` values outside of the valid range should result in an error.
2118+
|Port |Description |Type |Default |
2119+
|-------|---------------------------------------------|------------------|--------|
2120+
|`in` |The input matrix from which to extract a row |matrix33, matrix44|__zero__|
2121+
|`index`|The index of the row in `in` to extract |integer |0 |
2122+
|`out` |Output: the `index`th row of `in` as a vector|vector3, vector4 |__zero__|
2123+
2124+
The valid range for `index` should be clamped to $[0,N)$ in the user interface, where __N__ is the number of components (for vector/color inputs) or rows (for matrix inputs). `index` is a uniform, non-varying value. Any `index` values outside of the valid range should result in an error.
21172125

21182126
<a id="node-convert"> </a>
21192127

libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,8 @@
726726
<implementation name="IM_extract_vector2_genglsl" nodedef="ND_extract_vector2" sourcecode="{{in}}[{{index}}]" target="genglsl" />
727727
<implementation name="IM_extract_vector3_genglsl" nodedef="ND_extract_vector3" sourcecode="{{in}}[{{index}}]" target="genglsl" />
728728
<implementation name="IM_extract_vector4_genglsl" nodedef="ND_extract_vector4" sourcecode="{{in}}[{{index}}]" target="genglsl" />
729+
<implementation name="IM_extract_matrix33_genglsl" nodedef="ND_extract_matrix33" sourcecode="{{in}}[{{index}}]" target="genglsl" />
730+
<implementation name="IM_extract_matrix44_genglsl" nodedef="ND_extract_matrix44" sourcecode="{{in}}[{{index}}]" target="genglsl" />
729731

730732
<!-- ======================================================================== -->
731733
<!-- Convolution nodes -->

libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,8 @@
740740
<implementation name="IM_extract_vector2_genmdl" nodedef="ND_extract_vector2" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector2({{in}}, {{index}})" target="genmdl" />
741741
<implementation name="IM_extract_vector3_genmdl" nodedef="ND_extract_vector3" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector3({{in}}, {{index}})" target="genmdl" />
742742
<implementation name="IM_extract_vector4_genmdl" nodedef="ND_extract_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_vector4({{in}}, {{index}})" target="genmdl" />
743+
<implementation name="IM_extract_matrix33_genmdl" nodedef="ND_extract_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_matrix33({{in}}, {{index}})" target="genmdl" />
744+
<implementation name="IM_extract_matrix44_genmdl" nodedef="ND_extract_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_extract_matrix44({{in}}, {{index}})" target="genmdl" />
743745

744746
<!-- ======================================================================== -->
745747
<!-- Convolution nodes -->

libraries/stdlib/genosl/include/mx_funcs.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,20 @@ float mx_extract(vector4 in, int index)
132132
else return in.w;
133133
}
134134

135+
vector mx_extract(matrix33 in, int index)
136+
{
137+
if (index == 0) return vector(in.m[0][0], in.m[0][1], in.m[0][2]);
138+
else if (index == 1) return vector(in.m[1][0], in.m[1][1], in.m[1][2]);
139+
else return vector(in.m[2][0], in.m[2][1], in.m[2][2]);
140+
}
141+
142+
vector4 mx_extract(matrix in, int index)
143+
{
144+
if (index == 0) return vector4(in[0][0], in[0][1], in[0][2], in[0][3]);
145+
else if (index == 1) return vector4(in[1][0], in[1][1], in[1][2], in[1][3]);
146+
else if (index == 2) return vector4(in[2][0], in[2][1], in[2][2], in[2][3]);
147+
else return vector4(in[3][0], in[3][1], in[3][2], in[3][3]);
148+
}
135149

136150
float mx_remap(float in, float inLow, float inHigh, float outLow, float outHigh, int doClamp)
137151
{

libraries/stdlib/genosl/stdlib_genosl_impl.mtlx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,8 @@
749749
<implementation name="IM_extract_vector2_genosl" nodedef="ND_extract_vector2" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
750750
<implementation name="IM_extract_vector3_genosl" nodedef="ND_extract_vector3" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
751751
<implementation name="IM_extract_vector4_genosl" nodedef="ND_extract_vector4" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
752+
<implementation name="IM_extract_matrix33_genosl" nodedef="ND_extract_matrix33" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
753+
<implementation name="IM_extract_matrix44_genosl" nodedef="ND_extract_matrix44" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
752754

753755
<!-- ======================================================================== -->
754756
<!-- Convolution nodes -->

libraries/stdlib/stdlib_defs.mtlx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4919,6 +4919,16 @@
49194919
<input name="index" type="integer" value="0" uimin="0" uimax="3" uniform="true" />
49204920
<output name="out" type="float" default="0.0" />
49214921
</nodedef>
4922+
<nodedef name="ND_extract_matrix33" node="extract" nodegroup="channel">
4923+
<input name="in" type="matrix33" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
4924+
<input name="index" type="integer" value="0" uimin="0" uimax="2" uniform="true" />
4925+
<output name="out" type="vector3" default="0.0, 0.0, 0.0" />
4926+
</nodedef>
4927+
<nodedef name="ND_extract_matrix44" node="extract" nodegroup="channel">
4928+
<input name="in" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
4929+
<input name="index" type="integer" value="0" uimin="0" uimax="3" uniform="true" />
4930+
<output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
4931+
</nodedef>
49224932

49234933
<!--
49244934
Node: <separate2>, <separate3>, <separate4> Supplemental Nodes

resources/Materials/TestSuite/stdlib/channel/extract.mtlx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,18 @@
3535
</extract>
3636
<output name="out" type="float" nodename="extract1" />
3737
</nodegraph>
38+
<nodegraph name="extract_matrix33">
39+
<extract name="extract1" type="vector3">
40+
<input name="in" type="matrix33" value="1.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.25" />
41+
<input name="index" type="integer" value="1" />
42+
</extract>
43+
<output name="out" type="vector3" nodename="extract1" />
44+
</nodegraph>
45+
<nodegraph name="extract_matrix44">
46+
<extract name="extract1" type="vector4">
47+
<input name="in" type="matrix44" value="1.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.125" />
48+
<input name="index" type="integer" value="1" />
49+
</extract>
50+
<output name="out" type="vector4" nodename="extract1" />
51+
</nodegraph>
3852
</materialx>

source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4472,6 +4472,39 @@ export float mx_extract_vector4(
44724472
}
44734473
}
44744474

4475+
export float3 mx_extract_matrix33(
4476+
float3x3 mxp_in = float3x3(0.0),
4477+
int mxp_index = int(0)
4478+
)
4479+
[[
4480+
anno::description("Node Group: channel")
4481+
]]
4482+
{
4483+
switch (mxp_index)
4484+
{
4485+
case 0: return mxp_in[0];
4486+
case 1: return mxp_in[1];
4487+
default: return mxp_in[2];
4488+
}
4489+
}
4490+
4491+
export float4 mx_extract_matrix44(
4492+
float4x4 mxp_in = float4x4(0.0),
4493+
int mxp_index = int(0)
4494+
)
4495+
[[
4496+
anno::description("Node Group: channel")
4497+
]]
4498+
{
4499+
switch (mxp_index)
4500+
{
4501+
case 0: return mxp_in[0];
4502+
case 1: return mxp_in[1];
4503+
case 2: return mxp_in[2];
4504+
default: return mxp_in[3];
4505+
}
4506+
}
4507+
44754508
// Nodedef: ND_separate2_vector2 is represented by a nodegraph: NG_separate2_vector2
44764509
// Nodedef: ND_separate3_color3 is represented by a nodegraph: NG_separate3_color3
44774510
// Nodedef: ND_separate3_vector3 is represented by a nodegraph: NG_separate3_vector3

source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ export using .::stdlib_1_7 import mx_extract_color4;
298298
export using .::stdlib_1_7 import mx_extract_vector2;
299299
export using .::stdlib_1_7 import mx_extract_vector3;
300300
export using .::stdlib_1_7 import mx_extract_vector4;
301+
export using .::stdlib_1_7 import mx_extract_matrix33;
302+
export using .::stdlib_1_7 import mx_extract_matrix44;
301303
export using .::stdlib_1_7 import mx_heighttonormal_vector3;
302304
export using .::stdlib_1_7 import mx_noise2d_float;
303305
export using .::stdlib_1_7 import mx_noise2d_float2;

source/MaterialXGenMdl/mdl/materialx/stdlib_1_9.mdl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ export using .::stdlib_1_7 import mx_extract_color4;
298298
export using .::stdlib_1_7 import mx_extract_vector2;
299299
export using .::stdlib_1_7 import mx_extract_vector3;
300300
export using .::stdlib_1_7 import mx_extract_vector4;
301+
export using .::stdlib_1_7 import mx_extract_matrix33;
302+
export using .::stdlib_1_7 import mx_extract_matrix44;
301303
export using .::stdlib_1_7 import mx_heighttonormal_vector3;
302304
export using .::stdlib_1_7 import mx_noise2d_float;
303305
export using .::stdlib_1_7 import mx_noise2d_float2;

0 commit comments

Comments
 (0)