MaterialXMaterials 0.0.3
Utilities for retrieving materials from remote servers
Loading...
Searching...
No Matches
physicallyBasedMaterialXCmd.py
Go to the documentation of this file.
1#/usr/bin/env python3
2'''
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
18'''
19import os, sys, argparse, logging
20
21import MaterialX as mx # type: ignore
22import physicallyBasedMaterialX as pbmx
23
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
128if __name__ == '__main__':
129 physicallBasedMaterialXCmd()