Command to download GPUOpen materials.
8def GPUOpenLoaderCmd():
9 '''
10 @brief Command to download GPUOpen materials
11 '''
12 logger = logging.getLogger('GPUO_CMD')
13 logging.basicConfig(level=logging.INFO)
14
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'
30 )
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()
39
40 loader = gpuo.GPUOpenMaterialLoader()
41 materials = None
42
43 if opts.loadFromPackage:
44 logger.info(f'> Load materials from package')
45 materials = loader.readPackageFiles()
46 else:
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}')
51 sys.exit(1)
52
53 logger.info(f'> Load materials from files: {filePaths}')
54 materials = loader.readMaterialFiles(filePaths)
55 else:
56
57 logger.info(f'> Download materials from GPUOpen')
58 materials = loader.getMaterials()
59
60 renders = loader.getRenders(force=True)
61 loader.getMaterialPreviews()
62
63 outputFolder = 'GPUOpenMaterialX'
64 if opts.output:
65 if not os.path.exists(opts.output):
66 logger.error(f'Error: Output directory does not exist: {opts.output}')
67 sys.exit(1)
68 else:
69 outputFolder = opts.output
70
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')
80
81
82 searchExpr = ''
83 if opts.extractExpression:
84 searchExpr = opts.extractExpression
85 if len(searchExpr) == 0:
86 logger.info(f'> No search expression given.')
87 else:
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:
92 data = dataItem[0]
93 title = dataItem[1]
94 url = dataItem[2]
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)
97
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}')
103 sys.exit(1)
104
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}')
110 if data:
111 loader.writePackageDataToFile(data, outputFolder, title, url)
112
113 if opts.materialNames:
114 materialNamesFile = os.path.join(outputFolder, 'GPUOpenMaterialX_Names.json')
115 logger.info(f'> Save materials names to file: {materialNamesFile}')
116 sorted = True
117 loader.writeMaterialNamesToFile(materialNamesFile, sorted)
118