3@file physicallyBasedMaterialXCmd.py
4@brief Convert Physically Based Materials to MaterialX Command Line Utility
5@details This script converts Physically Based Materials to MaterialX using the MaterialX Python API.
6@details The script can be run from the command line with the following options:
7@details --shadingModel: Shading models to use for conversion. If not specified then all will be used.
8@details Options: standard_surface, gltf_pbr, open_pbr_surface
9@details --outputDir: Output directory for MaterialX files
10@details --writeJSON: Write materials JSON file. Default is True
11@details --separateFiles: Convert individual MaterialX files per material. Default is false
12@details Example usage:
13@details - python physicallyBasedMaterialXCmd.py
14@details - python physicallyBasedMaterialXCmd.py --outputDir=myfolder
15@details - python physicallyBasedMaterialXCmd.py --writeJSON=False
16@details - python physicallyBasedMaterialXCmd.py --shadingModel=gltf_pbr,open_pbr_surface
17@details - python physicallyBasedMaterialXCmd.py --shadingModel=open_pbr_surface --separateFiles=True
19import os, sys, argparse, logging
22import physicallyBasedMaterialX
as pbmx
24def physicallBasedMaterialXCmd():
25 logger = logging.getLogger(
'PB_CMD')
26 logging.basicConfig(level=logging.INFO)
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()
44 outputDir =
'PhysicallyBasedMaterialX'
46 if not os.path.exists(opts.outputDir):
47 logger.info(f
'Error: Output directory does not exist: {opts.outputDir}')
50 outputDir = opts.outputDir
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']
61 for shadingModel
in shadingModels:
62 shadingModelPrefixes.append(shadingModePrefixMap[shadingModel])
64 writeJSON = opts.writeJSON
65 separateFiles = opts.separateFiles
69 loader = pbmx.PhysicallyBasedMaterialLoader(mx,
None)
71 readRemapping = opts.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)
78 writeRemapping = opts.writeRemapping
80 outputFile = os.path.join(outputDir,
'PhysicallyBasedToMtlxMappings.json')
81 logger.info(f
'> Write remapping file: {outputFile}')
82 loader.writeRemappingFile(outputFile)
85 if not os.path.exists(opts.loadFromFile):
86 logger.info(f
'> Error: File does not exist: {opts.loadFromFile}')
88 logger.info(f
'> Load materials from file: {opts.loadFromFile}')
89 jsonMat = loader.loadMaterialsFromFile(opts.loadFromFile)
91 jsonMat = loader.getMaterialsFromURL()
96 os.makedirs(outputDir, exist_ok=
True)
99 logger.info(f
'> Write PB material file: {outputDir}/PhysicallyBasedMaterial.json')
100 loader.writeJSONToFile(os.path.join(outputDir,
'PhysicallyBasedMaterial.json'))
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)
108 fileName = os.path.join(outputDir, f
'PhysicallyBasedMaterialX_{prefix}.mtlx')
109 loader.writeMaterialXToFile(fileName)
110 logger.info(f
'> Write: {fileName}')
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)
121 fileName = os.path.join(outputDir, f
'PB_{prefix}_{mat}.mtlx')
122 loader.writeMaterialXToFile(fileName)
123 logger.info(f
'> Write: {fileName}')
126 logger.info(
'Could not retrieve PhysicallyBased Materials')
128if __name__ ==
'__main__':
129 physicallBasedMaterialXCmd()