Skip to content

Commit dd878df

Browse files
committed
Material: Material interface
1 parent 37dfe9f commit dd878df

File tree

3 files changed

+41
-29
lines changed

3 files changed

+41
-29
lines changed

tests/util/ConverterTestCase.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,39 @@ def check_material_binding(self, prim: Usd.Prim, material: UsdShade.Material):
2525
bound_material = material_binding.GetDirectBindingRel().GetTargets()[0]
2626
self.assertEqual(bound_material, material.GetPrim().GetPath())
2727

28-
def get_material_diffuse_color(self, material: UsdShade.Material) -> Gf.Vec3f | None:
28+
def _get_input_value(self, shader: UsdShade.Shader, input_name: str):
29+
value_attrs = UsdShade.Utils.GetValueProducingAttributes(shader.GetInput(input_name))
30+
31+
# If no value is set, returns None.
32+
if not value_attrs or len(value_attrs) == 0:
33+
return None
34+
35+
return value_attrs[0].Get()
36+
37+
def _get_material_input_value(self, material: UsdShade.Material, input_name: str):
2938
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
30-
return shader.GetInput("diffuseColor").Get()
39+
return self._get_input_value(shader, input_name)
40+
41+
def get_material_diffuse_color(self, material: UsdShade.Material) -> Gf.Vec3f | None:
42+
return self._get_material_input_value(material, "diffuseColor")
3143

3244
def get_material_specular_color(self, material: UsdShade.Material) -> Gf.Vec3f | None:
33-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
34-
return shader.GetInput("specularColor").Get()
45+
return self._get_material_input_value(material, "specularColor")
3546

3647
def get_material_specular_workflow(self, material: UsdShade.Material) -> bool:
37-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
38-
return shader.GetInput("useSpecularWorkflow").Get() == 1
48+
return self._get_material_input_value(material, "useSpecularWorkflow") == 1
3949

4050
def get_material_opacity(self, material: UsdShade.Material) -> float:
41-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
42-
return shader.GetInput("opacity").Get()
51+
return self._get_material_input_value(material, "opacity")
4352

4453
def get_material_roughness(self, material: UsdShade.Material) -> float:
45-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
46-
return shader.GetInput("roughness").Get()
54+
return self._get_material_input_value(material, "roughness")
4755

4856
def get_material_metallic(self, material: UsdShade.Material) -> float:
49-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
50-
return shader.GetInput("metallic").Get()
57+
return self._get_material_input_value(material, "metallic")
5158

5259
def get_material_ior(self, material: UsdShade.Material) -> float:
53-
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
54-
return shader.GetInput("ior").Get()
60+
return self._get_material_input_value(material, "ior")
5561

5662
def get_material_texture_path(self, material: UsdShade.Material, texture_type: str = "diffuseColor") -> pathlib.Path:
5763
"""
@@ -69,9 +75,9 @@ def get_material_texture_path(self, material: UsdShade.Material, texture_type: s
6975
self.assertTrue(texture_input.HasConnectedSource())
7076

7177
connected_source = texture_input.GetConnectedSource()
72-
texture_prim = connected_source[0].GetPrim()
73-
texture_file_attr = texture_prim.GetAttribute("inputs:file")
74-
return pathlib.Path(texture_file_attr.Get().path)
78+
texture_shader = UsdShade.Shader(connected_source[0].GetPrim())
79+
texture_file_value = self._get_input_value(texture_shader, "file")
80+
return pathlib.Path(texture_file_value.path)
7581

7682
def get_material_diffuse_color_texture_fallback(self, material: UsdShade.Material) -> Gf.Vec4f | None:
7783
shader: UsdShade.Shader = usdex.core.computeEffectivePreviewSurfaceShader(material)
@@ -80,5 +86,5 @@ def get_material_diffuse_color_texture_fallback(self, material: UsdShade.Materia
8086
source = diffuse_color_input.GetConnectedSource()
8187
if len(source) > 0 and isinstance(source[0], UsdShade.ConnectableAPI) and source[0].GetPrim().IsA(UsdShade.Shader):
8288
diffuse_texture_shader = UsdShade.Shader(source[0].GetPrim())
83-
return diffuse_texture_shader.GetInput("fallback").Get()
89+
return self._get_input_value(diffuse_texture_shader, "fallback")
8490
return None

urdf_usd_converter/_impl/_flatten.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ def export_flattened(asset_stage: Usd.Stage, output_dir: str, asset_dir: str, as
1717
asset_identifier = f"{output_path.absolute().as_posix()}/{asset_stem}.{asset_format}"
1818
usdex.core.exportLayer(layer, asset_identifier, get_authoring_metadata(), comment)
1919

20-
# fix all PreviewMaterial inputs:file to ./Textures/xxx
20+
# fix all PreviewMaterial material interface asset inputs from abs to rel paths (./Textures/xxx)
2121
stage = Usd.Stage.Open(asset_identifier)
2222
for prim in stage.Traverse():
23-
if prim.IsA(UsdShade.Shader):
24-
shader = UsdShade.Shader(prim)
25-
file_input = shader.GetInput("file")
26-
if file_input and file_input.Get() is not None:
27-
file_path = pathlib.Path(file_input.Get().path if hasattr(file_input.Get(), "path") else file_input.Get())
28-
tmpdir = pathlib.Path(tempfile.gettempdir())
29-
if file_path.is_relative_to(tmpdir):
30-
new_path = f"./{Tokens.Textures}/{file_path.name}"
31-
file_input.Set(Sdf.AssetPath(new_path))
23+
if prim.IsA(UsdShade.Material):
24+
material = UsdShade.Material(prim)
25+
for input in material.GetInputs(onlyAuthored=True):
26+
if input.GetTypeName() == Sdf.ValueTypeNames.Asset:
27+
file_path = pathlib.Path(input.Get().path)
28+
tmpdir = pathlib.Path(tempfile.gettempdir())
29+
if file_path.is_relative_to(tmpdir):
30+
new_path = f"./{Tokens.Textures}/{file_path.name}"
31+
input.Set(Sdf.AssetPath(new_path))
3232
stage.Save()
3333
# copy texture to output dir
3434
temp_textures_dir = pathlib.Path(asset_dir) / Tokens.Payload / Tokens.Textures

urdf_usd_converter/_impl/material.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ def _convert_material(
180180
if specular_texture_path:
181181
_add_specular_texture_to_preview_material(material_prim, _get_texture_asset_path(specular_texture_path, texture_paths, data))
182182

183+
result = usdex.core.addPreviewMaterialInterface(material_prim)
184+
if not result:
185+
Tf.RaiseRuntimeError(f'Failed to add material instance to material prim "{material_prim.GetPath()}"')
186+
187+
material_prim.GetPrim().SetInstanceable(True)
188+
183189
return material_prim
184190

185191

@@ -209,7 +215,7 @@ def _add_specular_texture_to_preview_material(material_prim: UsdShade.Material,
209215
material_prim, "SpecularTexture", specular_texture_path, usdex.core.ColorSpace.eAuto, fallback
210216
)
211217

212-
# Connect the PreviewSurface shader "roughness" to the roughness tex shader output
218+
# Connect the PreviewSurface shader "specularColor" to the specular texture shader output
213219
specular_color_input.ConnectToSource(texture_reader.CreateOutput("rgb", Sdf.ValueTypeNames.Float3))
214220

215221

0 commit comments

Comments
 (0)