19def main():
20 parser = argparse.ArgumentParser(description="Conveter from MaterialX to glTF Texture Procedurals.")
21 parser.add_argument(dest="input", help="Input file/folder.")
22 parser.add_argument("-o", "--output", help="Output file/folder. The default is current folder.")
23 parser.add_argument('-s', '--schema', default=None, help='Schema file to use for validation. The default is None.')
24 opts = parser.parse_args()
25
26 logger = lg.getLogger('gltfCmd')
27 lg.basicConfig(level=lg.INFO)
28
29 if not MxGLTFPTUtil.have_version(1, 39, 1):
30 logger.error("MaterialX version 1.39.1 or higher is required.")
31 sys.exit(-1)
32
33 file_list = []
34 extension = '.mtlx'
35 if os.path.isdir(opts.input):
36 file_list = MxGLTFPT.get_files(opts.input, extension)
37 else:
38 extension = os.path.splitext(opts.input)[1]
39 if extension not in ['.mtlx']:
40 logger.error(f'Invalid file extension: {extension}. Extension must be .mtlx.')
41 return
42 file_list.append(opts.input)
43
44 if not file_list:
45 logger.warning(f'No MaterialX files found in: {opts.input}')
46 return
47
48 stdlib, libFiles = MxGLTFPTUtil.load_standard_libraries()
49
50 converter = MxGLTFPT.glTFMaterialXConverter()
51
52
53 output_folder = '.'
54 if opts.output:
55 output_folder = opts.output
56 if not os.path.exists(output_folder):
57 os.makedirs(output_folder)
58
59
60 schema = None
61 schema_file = opts.schema
62 if schema_file and os.path.exists(schema_file):
63 with open(schema_file, 'r') as f:
64 schema = json.load(f)
65 logger.info(f'Loaded schema file: {schema_file}')
66
67 for input_file in file_list:
68 logger.info(f'Processing: {input_file}')
69 mxdoc = MxGLTFPTUtil.create_working_document([stdlib])
70 MxGLTFPTUtil.read_materialX_document(mxdoc, input_file)
71 valid, errors = MxGLTFPTUtil.validate_document(mxdoc)
72
73 if not valid:
74 logger.warning(f'MaterialX document: {input_file} is invalid. Erors: {errors}')
75 continue
76
77
78 json_string, status = converter.materialX_to_glTF(mxdoc)
79 if json_string:
80 if schema:
81 json_data = json.loads(json_string)
82 try:
83 json_validate(instance=json_data, schema=schema)
84 logger.info('- JSON validation successful')
85 except jsonschema.exceptions.ValidationError as e:
86 logger.info('- JSON validation errors, ' + e)
87
88
89 outputFile = os.path.join(output_folder, os.path.basename(input_file).replace('.mtlx', '.gltf'))
90 with open(outputFile, 'w') as f:
91 logger.info(f'Writing glTF: {outputFile}')
92 f.write(json_string)
93
94 else:
95 logger.warning(f'Error: {status}')
96