# ##### BEGIN GPL LICENSE BLOCK ##### # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # ##### END GPL LICENSE BLOCK ##### import sys, os import subprocess import bpy DEBUG = False from netrender.utils import * BLENDER_PATH = sys.argv[0] def reset(job): main_file = job.files[0] job_full_path = main_file.filepath if os.path.exists(job_full_path + ".bak"): os.remove(job_full_path) # repathed file os.renames(job_full_path + ".bak", job_full_path) def update(job): paths = [] main_file = job.files[0] job_full_path = main_file.filepath path, ext = os.path.splitext(job_full_path) new_path = path + ".remap" + ext original_path = main_file.original_path # Disable for now. Partial repath should work anyway #all = main_file.filepath != main_file.original_path all = False for rfile in job.files[1:]: if all or rfile.original_path != rfile.filepath: paths.append(rfile.original_path) paths.append(rfile.filepath) # Only update if needed if paths: process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-P", __file__, "--", new_path, original_path] + paths, stdout=sys.stdout, stderr=subprocess.STDOUT) process.wait() os.renames(job_full_path, job_full_path + ".bak") os.renames(new_path, job_full_path) def process(original_path, paths): if DEBUG: print("==========================================================") original_directory = os.path.dirname(original_path) path_map = {} for i in range(0, len(paths), 2): # special case for point cache if paths[i].endswith(".bphys"): path, filename = os.path.split(paths[i+1]) cache_name = filename.split("_")[0] if DEBUG: print(cache_name, path) path_map[cache_name] = path # special case for fluids elif paths[i].endswith(".bobj.gz"): if DEBUG: print(os.path.split(paths[i])[0], os.path.split(paths[i+1])[0]) path_map[os.path.split(paths[i])[0]] = os.path.split(paths[i+1])[0] else: if DEBUG: print(paths[i], paths[i+1]) path_map[paths[i]] = paths[i+1] if DEBUG: print("----------------------------------------------------------") # TODO original paths aren't really the original path, they are the normalized path # so we repath using the filenames only. ########################### # LIBRARIES ########################### for lib in bpy.data.libraries: file_path = bpy.path.abspath(lib.filepath, start=original_directory) new_path = path_map.get(file_path, None) if DEBUG: print(file_path, new_path) if new_path: lib.filepath = new_path ########################### # IMAGES ########################### for image in bpy.data.images: if image.source == "FILE" and not image.packed_file: file_path = bpy.path.abspath(image.filepath, start=original_directory) new_path = path_map.get(file_path, None) if DEBUG: print(file_path, new_path) if new_path: image.filepath = new_path ########################### # FLUID + POINT CACHE ########################### def pointCacheFunc(object, owner, point_cache): if not point_cache.use_disk_cache: return cache_name = cacheName(object, point_cache) new_path = path_map.get(cache_name, None) if DEBUG: print(cache_name, new_path) if new_path: point_cache.use_external = True point_cache.filepath = new_path point_cache.name = cache_name def fluidFunc(object, modifier, cache_path): fluid = modifier.settings new_path = path_map.get(cache_path, None) if new_path: fluid.path = new_path def multiresFunc(object, modifier, cache_path): new_path = path_map.get(cache_path, None) if new_path: modifier.filepath = new_path processObjectDependencies(pointCacheFunc, fluidFunc, multiresFunc) if DEBUG: print("==========================================================") if __name__ == "__main__": try: i = sys.argv.index("--") except: i = 0 if i: new_path, original_path, *args = sys.argv[i+1:] process(original_path, args) bpy.ops.wm.save_as_mainfile(filepath=new_path, check_existing=False)