10 @brief Command to download GPUOpen materials
12 logger = logging.getLogger(
'GPUO_CMD')
13 logging.basicConfig(level=logging.INFO)
15 parser = argparse.ArgumentParser(description=
'Get materials information and material package from AMD GPUOpen.'
16 ' By default the materials will be downloaded and a named and index material'
17 ' package will be extracted.')
18 parser.add_argument(
'--materialNames', type=bool, default=
None,
19 help=
'Return material names. Default is False')
20 parser.add_argument(
'--loadFromPackage', type=bool, default=
None,
21 help=
'Load materials from a package. Default is True. If false, materials will be downloaded.')
22 parser.add_argument(
'--loadMaterials', type=str, default=
'',
23 help=
'Folder to load materials from. All JSON files with post-fix _#.json are loaded. Default is false'
24 ' meaning to download materials')
25 parser.add_argument(
'--saveMaterials', type=bool, default=
None,
26 help=
'Save material lists. Default is None.'
27 ' Has no effect if --loadMaterials is set')
28 parser.add_argument(
'--extractExpression', type=str, default=
'Oliana Blue Painted Wood',
29 help=
'Extract out a package for a materials which match a given expression. Default is a sample material'
31 parser.add_argument(
'--extractIndices', type=str, default=
'',
32 help=
'Extract out a package for a materials which match a given material list, material index, and package index.'
33 ' Default is empty. Format is: <materialList>,<materialIndex>,<materialPackage>')
34 parser.add_argument(
'--output', type=str, default=
'',
35 help=
'Output folder for data files. Default location is GPUOpenMaterialX.')
36 parser.add_argument(
'--unzip', type=bool, default=
None,
37 help=
'Unzip the downloaded package. Default is None.')
38 opts = parser.parse_args()
40 loader = gpuo.GPUOpenMaterialLoader()
43 if opts.loadFromPackage:
44 logger.info(f
'> Load materials from package')
45 materials = loader.readPackageFiles()
47 if opts.loadMaterials:
48 filePaths = loader.getMaterialFileNames(opts.loadMaterials)
49 if len(filePaths) == 0:
50 logger.error(f
'Error: No files found in folder: {opts.loadMaterials}')
53 logger.info(f
'> Load materials from files: {filePaths}')
54 materials = loader.readMaterialFiles(filePaths)
57 logger.info(f
'> Download materials from GPUOpen')
58 materials = loader.getMaterials()
60 renders = loader.getRenders(force=
True)
61 loader.getMaterialPreviews()
63 outputFolder =
'GPUOpenMaterialX'
65 if not os.path.exists(opts.output):
66 logger.error(f
'Error: Output directory does not exist: {opts.output}')
69 outputFolder = opts.output
71 materialNames = loader.getMaterialNames()
72 materialCount = len(materialNames)
73 previewCount = len(loader.getMaterialPreviews())
74 rendersCount = len(loader.getRenders(force=
False)[
'renders'])
75 logger.info(f
'Have {materialCount} materials and {previewCount} previews, and {rendersCount} renders.')
76 if opts.saveMaterials:
77 loader.writeMaterialFiles(outputFolder,
'GPUOpenMaterialX')
78 loader.writeRenderFiles(outputFolder,
'GPUOpenMaterialX_Renders')
79 loader.writeMaterialPreviewFile(outputFolder,
'GPUOpenMaterialX_Previews')
83 if opts.extractExpression:
84 searchExpr = opts.extractExpression
85 if len(searchExpr) == 0:
86 logger.info(f
'> No search expression given.')
88 dataItems = loader.downloadPackageByExpression(searchExpr, 0)
89 toMB = 1.0 / (1024.0 * 1024.0)
90 unzipFile = opts.unzip
if opts.unzip
else False
91 for dataItem
in dataItems:
95 logger.info(f
'Write package data to file: {title}, Data size: {len(data)*toMB:.2f} MB')
96 loader.writePackageDataToFile(data, outputFolder, title, url, unzipFile=unzipFile)
98 extractIndices = opts.extractIndices
99 if len(extractIndices) > 0:
100 indices = extractIndices.split(
',')
101 if len(indices) != 3:
102 logger.error(f
'Error: Invalid indices given: {extractIndices}')
105 materialList = int(indices[0])
106 materialIndex = int(indices[1])
107 materialPackage = int(indices[2])
108 [data, title, url] = loader.downloadPackage(materialList, materialIndex, materialPackage)
109 logger.info(f
'> Download material: {title} List: {materialList}. Index: {materialIndex}. Package: {materialPackage}. Preview URL:{url}')
111 loader.writePackageDataToFile(data, outputFolder, title, url)
113 if opts.materialNames:
114 materialNamesFile = os.path.join(outputFolder,
'GPUOpenMaterialX_Names.json')
115 logger.info(f
'> Save materials names to file: {materialNamesFile}')
117 loader.writeMaterialNamesToFile(materialNamesFile, sorted)