def create_asset_bundle(self, model_path: Union[Path, str], cleanup: bool, wnid: int = -1, wcategory: str = "", scale: float = 1) -> (List[Path], Path): """ Create an asset bundle for each operating system. Typically, this is the only function you'll want to use. This function calls in sequence: `fbx_to_obj()`, `obj_to_wrl()`, `wrl_to_obj()`, `move_files_to_unity_project()`, `create_prefab()`, `prefab_to_asset_bundle()`, and `create_record()`. :param model_path: The path to the model. :param cleanup: If true, remove temporary files after usage. :param wnid: The WordNet ID. :param wcategory: The WordNet category. :param scale: The scale of the object. :return The paths to each asset bundle as Path objects (from pathlib) and the path to the metadata record file as a Path object (from pathlib). """ model_path = self.get_model_path(model_path) model_name = model_path.stem # Create the asset bundles. obj_path, is_new = self.fbx_to_obj(model_path) wrl_path = self.obj_to_wrl(model_path) obj_colliders_path = self.wrl_to_obj(wrl_path, model_name) copied_file_paths = self.move_files_to_unity_project(obj_colliders_path, model_path) prefab_path, report_path = self.create_prefab(f"{model_name}_colliders.obj", model_name, model_path.suffix) asset_bundle_paths = self.prefab_to_asset_bundle(prefab_path, model_name) # Parse the URLs. urls = self.get_local_urls(asset_bundle_paths) # Create the metadata record. record_path = self.create_record(model_name, wnid, wcategory, scale, urls) # Remove the temporary files. if cleanup: paths = [wrl_path, obj_colliders_path, prefab_path, report_path] paths.extend(copied_file_paths) if is_new: paths.append(obj_path) assert model_path not in paths for path in paths: if not path.exists(): continue path.unlink() # Remove all materials. materials_directory = self.get_resources_directory().joinpath("Materials") if materials_directory.exists(): shutil.rmtree(str(materials_directory.resolve())) if not self.quiet: print("Removed temporary files.") if not self.quiet: print("DONE!") return asset_bundle_paths, record_path
def prefab_to_asset_bundle(self, prefab_path: Path, model_name: str, platforms: List[str] = None) -> List[Path]: """ Given a .prefab, create asset bundles and write them to disk. :param prefab_path: The path to the .prefab file. :param model_name: The name of the model, minus its file extension. :param platforms: Platforms to build asset bundles for. Options: "windows", "osx", "linux". If None, build all. :return The paths to the asset bundles. """ if platforms is None: platforms = ["windows", "osx", "linux"] assert prefab_path.exists(), f"Missing prefab: {prefab_path.resolve()}" if not self.quiet: print("Creating local asset bundles") asset_bundle_call = self.unity_call[:] platforms_call = "" for p in platforms: platforms_call += p + "," platforms_call = platforms_call[:-1] asset_bundle_call.extend([ "-executeMethod", "AssetBundleCreator.BuildAssetBundle", "-modelname=" + model_name, "-platforms=" + platforms_call ]) call(asset_bundle_call) new_asset_bundles_directory = self.get_assets_directory().joinpath( "NewAssetBundles") new_asset_bundles_directory = new_asset_bundles_directory.joinpath( model_name) assert new_asset_bundles_directory.exists( ), f"No asset bundles found: {new_asset_bundles_directory.resolve()}" paths = [] # Iterate through all target platforms and build asset bundles. for platform_key in platforms: asset_bundle_platform = S3_TO_UNITY[platform_key] bundle_path = new_asset_bundles_directory.joinpath( asset_bundle_platform).joinpath(model_name) assert bundle_path.exists( ), f"Missing asset bundle: {asset_bundle_platform}" paths.append(bundle_path) if not self.quiet: print("Created local asset bundles.") return paths