MaterialXMaterials 0.0.3
Utilities for retrieving materials from remote servers
Loading...
Searching...
No Matches
physicallyBasedMaterialXCmd.py File Reference

Convert Physically Based Materials to MaterialX Command Line Utility. More...

Go to the source code of this file.

Functions

 materialxMaterials.physicallyBasedMaterialXCmd.physicallBasedMaterialXCmd ()
 

Detailed Description

Convert Physically Based Materials to MaterialX Command Line Utility.

This script converts Physically Based Materials to MaterialX using the MaterialX Python API.

The script can be run from the command line with the following options:

–shadingModel: Shading models to use for conversion. If not specified then all will be used.

Options: standard_surface, gltf_pbr, open_pbr_surface

–outputDir: Output directory for MaterialX files

–writeJSON: Write materials JSON file. Default is True

–separateFiles: Convert individual MaterialX files per material. Default is false

Example usage:

Definition in file physicallyBasedMaterialXCmd.py.

Function Documentation

◆ physicallBasedMaterialXCmd()

materialxMaterials.physicallyBasedMaterialXCmd.physicallBasedMaterialXCmd ( )

Definition at line 24 of file physicallyBasedMaterialXCmd.py.

24def physicallBasedMaterialXCmd():
25 logger = logging.getLogger('PB_CMD')
26 logging.basicConfig(level=logging.INFO)
27
28 # TODO: Add arguments for shading model, and output directory using argparse
29 parser = argparse.ArgumentParser(description='Convert Physically Based Materials to MaterialX')
30 parser.add_argument('-m', '--shadingModel', type=str, default='', help='Shading models to use for conversion. '
31 ' If not specified then all will be used. '
32 ' Options: standard_surface, gltf_pbr, open_pbr_surface')
33 parser.add_argument('-o', '--outputDir', type=str, default='',
34 help='Output directory for MaterialX files. Default location is PhysicallyBasedMaterialX')
35 parser.add_argument('-j', '--writeJSON', type=bool, default=True,
36 help='Write materials JSON file. Default is True')
37 parser.add_argument('-s', '--separateFiles', type=bool, default=False,
38 help='Convert individual MaterialX files per material. Default is false')
39 parser.add_argument('-l', '--loadFromFile', type=str, default='', help='Load materials a specified file')
40 parser.add_argument('-wr', '--writeRemapping', type=bool, default=True, help='Write remapping from PhysicallyBased to MaterialX. Default is False')
41 parser.add_argument('-rr', '--readRemapping', type=str, default='', help='Read remapping from PhysicallyBased to MaterialX. Default is empty')
42 opts = parser.parse_args()
43
44 outputDir = 'PhysicallyBasedMaterialX'
45 if opts.outputDir:
46 if not os.path.exists(opts.outputDir):
47 logger.info(f'Error: Output directory does not exist: {opts.outputDir}')
48 sys.exit(1)
49 else:
50 outputDir = opts.outputDir
51
52 shadingModels = []
53 if opts.shadingModel:
54 shadingModels = opts.shadingModel.split(',')
55 shadingModePrefixMap = { 'standard_surface': 'SS', 'gltf_pbr': 'GLTF', 'open_pbr_surface': 'OPBR' }
56 shadingModelPrefixes = []
57 if len(shadingModels) == 0:
58 shadingModels = ['standard_surface', 'gltf_pbr', 'open_pbr_surface']
59 shadingModelPrefixes = ['SS', 'GLTF', 'OPBR']
60 else:
61 for shadingModel in shadingModels:
62 shadingModelPrefixes.append(shadingModePrefixMap[shadingModel])
63
64 writeJSON = opts.writeJSON
65 separateFiles = opts.separateFiles
66
67 # Create loader and get PhysicallyBasedMaterials
68 jsonMat = None
69 loader = pbmx.PhysicallyBasedMaterialLoader(mx, None)
70
71 readRemapping = opts.readRemapping
72 if readRemapping:
73 if not os.path.exists(readRemapping):
74 logger.info(f'> Error: Remapping file does not exist: {readRemapping}')
75 logger.info(f'> Read remapping file: {readRemapping}')
76 loader.readRemappingFile(readRemapping)
77 else:
78 writeRemapping = opts.writeRemapping
79 if writeRemapping:
80 outputFile = os.path.join(outputDir, 'PhysicallyBasedToMtlxMappings.json')
81 logger.info(f'> Write remapping file: {outputFile}')
82 loader.writeRemappingFile(outputFile)
83
84 if opts.loadFromFile:
85 if not os.path.exists(opts.loadFromFile):
86 logger.info(f'> Error: File does not exist: {opts.loadFromFile}')
87 sys.exit(1)
88 logger.info(f'> Load materials from file: {opts.loadFromFile}')
89 jsonMat = loader.loadMaterialsFromFile(opts.loadFromFile)
90 else:
91 jsonMat = loader.getMaterialsFromURL()
92
93 if jsonMat:
94
95 # Create folder for MaterialX call PhysicallyBasedMaterialX
96 os.makedirs(outputDir, exist_ok=True)
97
98 if writeJSON:
99 logger.info(f'> Write PB material file: {outputDir}/PhysicallyBasedMaterial.json')
100 loader.writeJSONToFile(os.path.join(outputDir, 'PhysicallyBasedMaterial.json'))
101
102 if not separateFiles:
103 for shadingModel, prefix in zip(shadingModels, shadingModelPrefixes):
104 logger.info(f'> Generate MaterialX for shading model: {shadingModel}')
105 matdoc = loader.convertToMaterialX([], shadingModel, {}, prefix)
106 valid, errors = loader.validateMaterialXDocument(matdoc)
107 if valid:
108 fileName = os.path.join(outputDir, f'PhysicallyBasedMaterialX_{prefix}.mtlx')
109 loader.writeMaterialXToFile(fileName)
110 logger.info(f'> Write: {fileName}')
111
112 else:
113 for shadingModel, prefix in zip(shadingModels, shadingModelPrefixes):
114 logger.info(f'> Generate MaterialX for shading model: {shadingModel}')
115 for mat in loader.getJSONMaterialNames():
116 materialFilter = [mat]
117 matdoc = loader.convertToMaterialX(materialFilter, shadingModel, {}, prefix)
118 if matdoc is not None:
119 valid, errors = loader.validateMaterialXDocument(matdoc)
120 if valid:
121 fileName = os.path.join(outputDir, f'PB_{prefix}_{mat}.mtlx')
122 loader.writeMaterialXToFile(fileName)
123 logger.info(f'> Write: {fileName}')
124
125 else:
126 logger.info('Could not retrieve PhysicallyBased Materials')
127