Merge with trunk, revision 28528 - 28976.
[blender-staging.git] / release / scripts / io / netrender / repath.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 import sys, os
20 import subprocess
21
22 import bpy
23
24 from netrender.utils import *
25 import netrender.model
26
27 BLENDER_PATH = sys.argv[0]
28
29 def reset(job):
30     main_file = job.files[0]
31     
32     job_full_path = main_file.filepath
33
34     if os.path.exists(job_full_path + ".bak"):
35         os.remove(job_full_path) # repathed file
36         os.renames(job_full_path + ".bak", job_full_path)
37
38 def update(job):
39     paths = []
40     
41     main_file = job.files[0]
42     
43     job_full_path = main_file.filepath
44
45         
46     path, ext = os.path.splitext(job_full_path)
47     
48     new_path = path + ".remap" + ext 
49     
50     all = main_file.filepath == main_file.original_path 
51     
52     for rfile in job.files[1:]:
53         if all or rfile.original_path != rfile.filepath:
54             paths.append(rfile.original_path)
55             paths.append(rfile.filepath)
56     
57     # Only update if needed
58     if paths:        
59         process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-P", __file__, "--", new_path] + paths, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
60         process.wait()
61         
62         os.renames(job_full_path, job_full_path + ".bak")
63         os.renames(new_path, job_full_path)
64
65 def process(paths):
66     def processPointCache(point_cache):
67         point_cache.external = False
68
69     def processFluid(fluid):
70         new_path = path_map.get(fluid.path, None)
71         if new_path:
72             fluid.path = new_path
73     
74     path_map = {}
75     for i in range(0, len(paths), 2):
76         # special case for point cache
77         if paths[i].endswith(".bphys"):
78             pass # Don't need them in the map, they all use the default external path
79             # NOTE: This is probably not correct all the time, need to be fixed.
80         # special case for fluids
81         elif paths[i].endswith(".bobj.gz"):
82             path_map[os.path.split(paths[i])[0]] = os.path.split(paths[i+1])[0]
83         else:
84             path_map[paths[i]] = paths[i+1]
85     
86     ###########################
87     # LIBRARIES
88     ###########################
89     for lib in bpy.data.libraries:
90         file_path = bpy.utils.expandpath(lib.filename)
91         new_path = path_map.get(file_path, None)
92         if new_path:
93             lib.filename = new_path
94
95     ###########################
96     # IMAGES
97     ###########################
98     for image in bpy.data.images:
99         if image.source == "FILE" and not image.packed_file:
100             file_path = bpy.utils.expandpath(image.filename)
101             new_path = path_map.get(file_path, None)
102             if new_path:
103                 image.filename = new_path
104             
105
106     ###########################
107     # FLUID + POINT CACHE
108     ###########################
109     for object in bpy.data.objects:
110         for modifier in object.modifiers:
111             if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN":
112                 processFluid(settings)
113             elif modifier.type == "CLOTH":
114                 processPointCache(modifier.point_cache)
115             elif modifier.type == "SOFT_BODY":
116                 processPointCache(modifier.point_cache)
117             elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
118                 processPointCache(modifier.domain_settings.point_cache_low)
119                 if modifier.domain_settings.highres:
120                     processPointCache(modifier.domain_settings.point_cache_high)
121             elif modifier.type == "MULTIRES" and modifier.external:
122                 file_path = bpy.utils.expandpath(modifier.filename)
123                 new_path = path_map.get(file_path, None)
124                 if new_path:
125                     modifier.filename = new_path
126
127         # particles modifier are stupid and don't contain data
128         # we have to go through the object property
129         for psys in object.particle_systems:
130             processPointCache(psys.point_cache)
131                 
132
133 if __name__ == "__main__":
134     try:
135         i = sys.argv.index("--")
136     except:
137         i = 0
138     
139     if i:
140         new_path = sys.argv[i+1]
141         args = sys.argv[i+2:]
142         
143         process(args)
144         
145         bpy.ops.wm.save_as_mainfile(path=new_path, check_existing=False)