1- # SPDX-FileCopyrightText: Copyright (c) 2025 The Newton Developers
1+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 The Newton Developers
22# SPDX-License-Identifier: Apache-2.0
33
44import pathlib
@@ -31,23 +31,31 @@ def _get_shader(self, material_name: str) -> UsdShade.Shader:
3131 self .assertTrue (material_prim )
3232 return usdex .core .computeEffectivePreviewSurfaceShader (UsdShade .Material (material_prim ))
3333
34+ def _get_input_value (self , shader : UsdShade .Shader , input_name : str ):
35+ value_attrs = UsdShade .Utils .GetValueProducingAttributes (shader .GetInput (input_name ))
36+
37+ # The values are defined in the material interface, not in the shader
38+ self .assertEqual (value_attrs [0 ].GetPrim (), shader .GetPrim ().GetParent ())
39+
40+ return value_attrs [0 ].Get ()
41+
3442 def test_metallic_material (self ):
3543 shader = self ._get_shader ("BlueMetallic" )
36- self .assertEqual (shader . GetInput ( "diffuseColor" ). Get ( ), Gf .Vec3f (0 , 0 , 1 ))
37- self .assertEqual (shader . GetInput ( "opacity" ). Get ( ), 1 )
38- self .assertAlmostEqual (shader . GetInput ( "roughness" ). Get ( ), 0.7 )
39- self .assertAlmostEqual (shader . GetInput ( "metallic" ). Get ( ), 0.8 )
44+ self .assertEqual (self . _get_input_value ( shader , "diffuseColor" ), Gf .Vec3f (0 , 0 , 1 ))
45+ self .assertEqual (self . _get_input_value ( shader , "opacity" ), 1 )
46+ self .assertAlmostEqual (self . _get_input_value ( shader , "roughness" ), 0.7 )
47+ self .assertAlmostEqual (self . _get_input_value ( shader , "metallic" ), 0.8 )
4048 self .assertFalse (shader .GetInput ("useSpecularWorkflow" ))
4149
4250 def test_specular_material (self ):
4351 shader = self ._get_shader ("GreenSpecular" )
44- self .assertEqual (shader . GetInput ( "useSpecularWorkflow" ). Get ( ), 1 )
45- self .assertAlmostEqual (shader . GetInput ( "specularColor" ). Get ( ), Gf .Vec3f (0.8 ))
52+ self .assertEqual (self . _get_input_value ( shader , "useSpecularWorkflow" ), 1 )
53+ self .assertAlmostEqual (self . _get_input_value ( shader , "specularColor" ), Gf .Vec3f (0.8 ))
4654
4755 def test_emissive_material (self ):
4856 shader = self ._get_shader ("RedEmissive" )
49- self .assertEqual (shader . GetInput ( "diffuseColor" ). Get ( ), Gf .Vec3f (1 , 0 , 0 ))
50- self .assertEqual (shader . GetInput ( "emissiveColor" ). Get ( ), Gf .Vec3f (0.5 , 0 , 0 ))
57+ self .assertEqual (self . _get_input_value ( shader , "diffuseColor" ), Gf .Vec3f (1 , 0 , 0 ))
58+ self .assertEqual (self . _get_input_value ( shader , "emissiveColor" ), Gf .Vec3f (0.5 , 0 , 0 ))
5159
5260 def test_textured_material (self ):
5361 shader = self ._get_shader ("Grid" )
@@ -60,9 +68,8 @@ def test_textured_material(self):
6068
6169 # Check that the connected source is a relative asset path to the expected texture
6270 connected_source = texture_input .GetConnectedSource ()
63- texture_prim = connected_source [0 ].GetPrim ()
64- texture_file_attr = texture_prim .GetAttribute ("inputs:file" )
65- self .assertEqual (texture_file_attr .Get ().path , "./Textures/grid.png" )
71+ texture_shader = UsdShade .Shader (connected_source [0 ].GetPrim ())
72+ self .assertEqual (self ._get_input_value (texture_shader , "file" ).path , "./Textures/grid.png" )
6673
6774 def test_material_binding (self ):
6875 textured_box_prim = self .stage .GetPrimAtPath (f"/{ self .model_name } /Geometry/TexturedBox" )
@@ -79,13 +86,21 @@ def test_material_binding(self):
7986 # materials are references to the material library layer
8087 self .assertTrue (material .GetPrim ().HasAuthoredReferences ())
8188
89+ def test_instanceable_material (self ):
90+ shader = self ._get_shader ("BlueMetallic" )
91+ self .assertTrue (shader )
92+ material_prim = shader .GetPrim ().GetParent ()
93+ self .assertTrue (material_prim )
94+ self .assertTrue (material_prim .GetPrim ().IsInstanceable ())
95+ self .assertTrue (material_prim .GetPrim ().IsInstance ())
96+ self .assertTrue (shader .GetPrim ().IsInstanceProxy ())
97+
8298 def test_unnamed_texture_material (self ):
8399 shader = self ._get_shader ("UnnamedTexture" )
84100 self .assertTrue (shader )
85101 texture_input : UsdShade .Input = shader .GetInput ("diffuseColor" )
86102 self .assertTrue (texture_input .HasConnectedSource ())
87103
88104 connected_source = texture_input .GetConnectedSource ()
89- texture_prim = connected_source [0 ].GetPrim ()
90- texture_file_attr = texture_prim .GetAttribute ("inputs:file" )
91- self .assertEqual (texture_file_attr .Get ().path , "./Textures/grid.png" )
105+ texture_shader = UsdShade .Shader (connected_source [0 ].GetPrim ())
106+ self .assertEqual (self ._get_input_value (texture_shader , "file" ).path , "./Textures/grid.png" )
0 commit comments