3from pxr
import Usd, UsdShade, Sdf, UsdGeom
7def create_material_reference(materialx_file, usda_file, geometry, flatten=False):
9 if not os.path.exists(materialx_file):
10 print(f
"Error: The MaterialX file '{materialx_file}' does not exist.")
14 stage = Usd.Stage.CreateInMemory()
17 material_path =
'/World/MaterialX'
19 material_path +=
'/Materials'
21 material_prim = stage.DefinePrim(Sdf.Path(material_path))
25 materialx_reference = Sdf.Reference(materialx_file,
"/MaterialX")
26 material_prim.GetPrim().GetReferences().AddReference(materialx_reference)
28 stage.documentation = f
"Stage referencing: {materialx_file}"
30 if flatten
or geometry:
31 flattened_layer = stage.Flatten()
32 flattened_layer.documentation = f
"Flattened stage referencing: {materialx_file}"
33 temp_stage = Usd.Stage.Open(flattened_layer)
36 scene_path =
'/World/Scene'
37 SPHERE_PATH =
'/World/Scene/Sphere'
39 scene_prim = stage.DefinePrim(Sdf.Path(scene_path),
'Xform')
40 sphere = UsdGeom.Sphere.Define(stage, SPHERE_PATH)
41 material_binding = UsdShade.MaterialBindingAPI.Apply(sphere.GetPrim())
45 for child_prim
in temp_stage.Traverse():
46 if child_prim.GetTypeName() ==
"Material":
47 material = UsdShade.Material(child_prim)
51 print(f
'# Bind material {material.GetPath()} to {sphere.GetPath()}')
54 material_binding.Bind(material)
57 scene_prim = temp_stage.DefinePrim(Sdf.Path(scene_path),
'Xform')
58 sphere = UsdGeom.Sphere.Define(temp_stage, SPHERE_PATH)
60 material_binding = UsdShade.MaterialBindingAPI.Apply(sphere.GetPrim())
61 material_binding.Bind(material)
64 usd_string = temp_stage.ExportToString()
66 usd_string = stage.GetRootLayer().ExportToString()
71 with open(usda_file,
'w')
as f:
78 parser = argparse.ArgumentParser(description=
"Create a MaterialX reference in a USD file.")
79 parser.add_argument(
"input_materialx_file", type=str, help=
"The MaterialX file to reference.")
80 parser.add_argument(
"-o",
"--output_usda_file", type=str, default=
None, help=
"The output USD file to create.")
81 parser.add_argument(
"-g",
"--geometry", type=str, default=
"_default_sphere_", help=
"The geometry to apply the material to.")
82 parser.add_argument(
"-f",
"--flatten", action=
"store_true", help=
"Flatten the stage before saving.")
83 args = parser.parse_args()
85 materialx_file = args.input_materialx_file
86 usda_file = args.output_usda_file
87 flatten = args.flatten
89 geometry = args.geometry
90 if geometry !=
"_default_sphere_":
92 create_material_reference(materialx_file, usda_file, geometry, flatten)
94if __name__ ==
"__main__":