def generate_lower_resolutions_hdr(asset_data, fpath): '''generates lower resolutions for HDR images''' hdr = bpy.data.images.load(fpath) actres = max(hdr.size[0], hdr.size[1]) p2res = paths.round_to_closest_resolution(actres) original_filesize = os.path.getsize( fpath) # for comparison on the original level i = 0 finished = False files = [] while not finished: dirn = os.path.dirname(fpath) fn_strip, ext = os.path.splitext(fpath) ext = '.exr' if i > 0: downscale(hdr) hdr_resolution_filepath = fn_strip + paths.resolution_suffix[ p2res] + ext image_utils.img_save_as(hdr, filepath=hdr_resolution_filepath, file_format='OPEN_EXR', quality=20, color_mode='RGB', compression=15, view_transform='Raw', exr_codec='DWAA') if os.path.exists(hdr_resolution_filepath): reduced_filesize = os.path.getsize(hdr_resolution_filepath) # compare file sizes print( f'HDR size was reduced from {original_filesize} to {reduced_filesize}' ) if reduced_filesize < original_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": hdr_resolution_filepath }) print('prepared resolution file: ', p2res) if rkeys.index(p2res) == 0: finished = True else: p2res = rkeys[rkeys.index(p2res) - 1] i += 1 print('uploading resolution files') upload_resolutions(files, asset_data) preferences = bpy.context.preferences.addons['blenderkit'].preferences patch_asset_empty(asset_data['id'], preferences.api_key)
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