def unpack_asset(data): utils.p('unpacking asset') asset_data = data['asset_data'] # utils.pprint(asset_data) blend_file_name = os.path.basename(bpy.data.filepath) ext = os.path.splitext(blend_file_name)[1] resolution = asset_data.get('resolution', 'blend') # TODO - passing resolution inside asset data might not be the best solution tex_dir_path = paths.get_texture_directory(asset_data, resolution=resolution) tex_dir_abs = bpy.path.abspath(tex_dir_path) if not os.path.exists(tex_dir_abs): try: os.mkdir(tex_dir_abs) except Exception as e: print(e) bpy.data.use_autopack = False for image in bpy.data.images: if image.name != 'Render Result': # suffix = paths.resolution_suffix(data['suffix']) fp = get_texture_filepath(tex_dir_path, image, resolution=resolution) utils.p('unpacking file', image.name) utils.p(image.filepath, fp) for pf in image.packed_files: pf.filepath = fp # bpy.path.abspath(fp) image.filepath = fp # bpy.path.abspath(fp) image.filepath_raw = fp # bpy.path.abspath(fp) # image.save() if len(image.packed_files) > 0: # image.unpack(method='REMOVE') image.unpack(method='WRITE_ORIGINAL') bpy.ops.wm.save_mainfile(compress=False) # now try to delete the .blend1 file try: os.remove(bpy.data.filepath + '1') except Exception as e: print(e)
def generate_lower_resolutions(data): asset_data = data['asset_data'] actres = get_current_resolution() # first let's skip procedural assets base_fpath = bpy.data.filepath s = bpy.context.scene print('current resolution of the asset ', actres) if actres > 0: p2res = paths.round_to_closest_resolution(actres) orig_res = p2res print(p2res) finished = False files = [] # now skip assets that have lowest possible resolution already if p2res != [0]: original_textures_filesize = 0 for i in bpy.data.images: abspath = bpy.path.abspath(i.filepath) if os.path.exists(abspath): original_textures_filesize += os.path.getsize(abspath) while not finished: blend_file_name = os.path.basename(base_fpath) dirn = os.path.dirname(base_fpath) fn_strip, ext = os.path.splitext(blend_file_name) fn = fn_strip + paths.resolution_suffix[p2res] + ext fpath = os.path.join(dirn, fn) tex_dir_path = paths.get_texture_directory(asset_data, resolution=p2res) tex_dir_abs = bpy.path.abspath(tex_dir_path) if not os.path.exists(tex_dir_abs): os.mkdir(tex_dir_abs) reduced_textures_filessize = 0 for i in bpy.data.images: if i.name != 'Render Result': print('scaling ', i.name, i.size[0], i.size[1]) fp = get_texture_filepath(tex_dir_path, i, resolution=p2res) if p2res == orig_res: # first, let's link the image back to the original one. i['blenderkit_original_path'] = i.filepath # first round also makes reductions on the image, while keeping resolution make_possible_reductions_on_image( i, fp, do_reductions=True, do_downscale=False) else: # lower resolutions only downscale make_possible_reductions_on_image( i, fp, do_reductions=False, do_downscale=True) abspath = bpy.path.abspath(i.filepath) if os.path.exists(abspath): reduced_textures_filessize += os.path.getsize( abspath) i.pack() # save print(fpath) # save the file bpy.ops.wm.save_as_mainfile(filepath=fpath, compress=True, copy=True) # compare file sizes print( f'textures size was reduced from {original_textures_filesize} to {reduced_textures_filessize}' ) if reduced_textures_filessize < original_textures_filesize: # this limits from uploaidng especially same-as-original resolution files in case when there is no advantage. # usually however the advantage can be big also for same as original resolution files.append({ "type": p2res, "index": 0, "file_path": fpath }) print('prepared resolution file: ', p2res) if rkeys.index(p2res) == 0: finished = True else: p2res = rkeys[rkeys.index(p2res) - 1] print('uploading resolution files') upload_resolutions(files, data) preferences = bpy.context.preferences.addons[ 'blenderkit'].preferences patch_asset_empty(data['asset_data']['id'], preferences.api_key) return