15 @brief Command to fetch MaterialX assets from PolyHaven and download them.
17 parser = argparse.ArgumentParser(description=
"Fetch MaterialX assets from PolyHaven")
18 parser.add_argument(
"-id",
"--download_id", type=str, default=
"", help=
"Filter ID to fetch MaterialX assets (e.g. 'polystyrene')")
19 parser.add_argument(
"-res",
"--download_resolution", type=str, default=
"1k", help=
"Resolution of the MaterialX assets to download (e.g. '1k', '2k', '4k', '8k') ")
20 parser.add_argument(
"-fe",
"--fetch", action=
'store_true', help=
"Fetch and save the MaterialX assets to a file")
21 parser.add_argument(
"-l",
"--load", action=
'store_true', help=
"Load the MaterialX assets")
22 parser.add_argument(
"-df",
"--data_folder", type=str, default=
"", help=
"Data folder to save / load MaterialX assets")
23 parser.add_argument(
"-c",
"--count", type=int, default=
None, help=
"Number of assets to fetch (default: 1)")
24 parser.add_argument(
'-exr',
'--keep_exr', action=
'store_true', help=
"Keep EXR textures instead of converting to PNG (requires OpenImageIO)")
25 parser.add_argument(
'-x',
'--extract_zip', action=
'store_true', help=
"Extract downloaded ZIP files")
27 args = parser.parse_args()
28 data_file =
"polyhaven_materialx_assets.json"
30 download_id = args.download_id
31 resolution = args.download_resolution
32 load = args.load
or args.download_id !=
""
33 data_folder = args.data_folder
37 materialx_assets =
None
40 fetch_count = args.count
41 if fetch_count
and fetch_count < 1:
43 fetch_location = Path(data_folder) / data_file
44 logger.info(f
"Fetching MaterialX assets to {fetch_location}...")
45 materialx_assets, all_assets, filtered_polyhaven_assets = loader.fetch_materialx_assets(download_id=download_id, max_items=fetch_count)
46 with open(fetch_location,
"w")
as f:
47 logger.info(f
"- Saving MaterialX assets to {fetch_location}...")
48 json.dump(materialx_assets, f, indent=4)
51 all_location = Path(data_folder) /
"polyhaven_assets.json"
52 with open(all_location,
"w")
as f:
53 json.dump(all_assets, f, indent=4)
54 logger.info(f
"Saved all assets to {all_location}")
56 filtered_location = Path(data_folder) /
"filtered_polyhaven_assets.json"
57 with open(filtered_location,
"w")
as f:
58 json.dump(filtered_polyhaven_assets, f, indent=4)
59 logger.info(f
"Saved MaterialX assets to {filtered_location}")
62 load_location = Path(data_folder) / data_file
63 if not load_location.exists():
64 load_location = Path(__file__).parent /
"data" /
"PolyHavenMaterialX" / data_file
65 if not load_location.exists():
66 logger.info(f
"No MaterialX assets found at {load_location}. Please run with --fetch to fetch assets first.")
69 with open(load_location,
"r")
as f:
70 logger.info(f
"Loaded MaterialX assets from {load_location}")
71 materialx_assets = json.load(f)
75 keep_exr = args.keep_exr
if args.keep_exr
else False
76 convert_exr_to_png =
not keep_exr
77 extract_zip = args.extract_zip
if args.extract_zip
else False
78 if materialx_assets
and download_id:
80 entry_id = download_id +
'_' + resolution
81 entry = materialx_assets.get(entry_id)
83 logger.info(f
"Downloading asset with ID '{download_id}', resolution '{resolution}'")
84 asset_list = {entry_id: entry, resolution: resolution}
85 id, mtlx_string, texture_binaries = loader.download_asset(asset_list, convert_exr_to_png)
87 loader.save_materialx_with_textures(id, mtlx_string, texture_binaries, data_folder, extract_zip)
89 logger.info(f
"No asset found with ID '{entry_id}' in the MaterialX assets.")