155 lines
4.4 KiB
Python
155 lines
4.4 KiB
Python
# ##### 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 bpy
|
|
import sys, subprocess, re
|
|
|
|
from netrender.utils import *
|
|
|
|
|
|
def commandToTask(command):
|
|
i = command.index("|")
|
|
ri = command.rindex("|")
|
|
return (command[:i], command[i+1:ri], command[ri+1:])
|
|
|
|
def taskToCommand(task):
|
|
return "|".join(task)
|
|
|
|
def bake(job, tasks):
|
|
main_file = job.files[0]
|
|
job_full_path = main_file.filepath
|
|
|
|
task_commands = []
|
|
for task in tasks:
|
|
task_commands.extend(task)
|
|
|
|
process = subprocess.Popen(
|
|
[bpy.app.binary_path,
|
|
"-b",
|
|
"-y",
|
|
"-noaudio",
|
|
job_full_path,
|
|
"-P", __file__,
|
|
"--",
|
|
] + task_commands,
|
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
|
)
|
|
|
|
return process
|
|
|
|
result_pattern = re.compile("BAKE FILE\[ ([0-9]+) \]: (.*)")
|
|
def resultsFromOuput(lines):
|
|
results = []
|
|
for line in lines:
|
|
match = result_pattern.match(line)
|
|
|
|
if match:
|
|
task_id = int(match.groups()[0])
|
|
task_filename = match.groups()[1]
|
|
|
|
results.append((task_id, task_filename))
|
|
|
|
return results
|
|
|
|
def bake_cache(obj, point_cache, task_index):
|
|
if point_cache.is_baked:
|
|
bpy.ops.ptcache.free_bake({"point_cache": point_cache})
|
|
|
|
point_cache.use_disk_cache = True
|
|
point_cache.use_external = False
|
|
|
|
bpy.ops.ptcache.bake({"point_cache": point_cache}, bake=True)
|
|
|
|
results = cache_results(obj, point_cache)
|
|
|
|
print()
|
|
|
|
for filename in results:
|
|
print("BAKE FILE[", task_index, "]:", filename)
|
|
|
|
|
|
def cache_results(obj, point_cache):
|
|
name = cacheName(obj, point_cache)
|
|
default_path = cachePath(bpy.data.filepath)
|
|
|
|
cache_path = bpy.path.abspath(point_cache.filepath) if point_cache.use_external else default_path
|
|
|
|
index = "%02i" % point_cache.index
|
|
|
|
if os.path.exists(cache_path):
|
|
pattern = re.compile(name + "_([0-9]+)_" + index + "\.bphys")
|
|
|
|
cache_files = []
|
|
|
|
for cache_file in sorted(os.listdir(cache_path)):
|
|
match = pattern.match(cache_file)
|
|
|
|
if match:
|
|
cache_files.append(os.path.join(cache_path, cache_file))
|
|
|
|
cache_files.sort()
|
|
|
|
return cache_files
|
|
|
|
return []
|
|
|
|
def process_generic(obj, index, task_index):
|
|
modifier = obj.modifiers[index]
|
|
point_cache = modifier.point_cache
|
|
bake_cache(obj, point_cache, task_index)
|
|
|
|
def process_smoke(obj, index, task_index):
|
|
modifier = obj.modifiers[index]
|
|
point_cache = modifier.domain_settings.point_cache
|
|
bake_cache(obj, point_cache, task_index)
|
|
|
|
def process_particle(obj, index, task_index):
|
|
psys = obj.particle_systems[index]
|
|
point_cache = psys.point_cache
|
|
bake_cache(obj, point_cache, task_index)
|
|
|
|
def process_paint(obj, index, task_index):
|
|
modifier = obj.modifiers[index]
|
|
for surface in modifier.canvas_settings.canvas_surfaces:
|
|
bake_cache(obj, surface.point_cache, task_index)
|
|
|
|
def process_null(obj, index, task_index):
|
|
raise ValueException("No baking possible with arguments: " + " ".join(sys.argv))
|
|
|
|
process_funcs = {}
|
|
process_funcs["CLOTH"] = process_generic
|
|
process_funcs["SOFT_BODY"] = process_generic
|
|
process_funcs["PARTICLE_SYSTEM"] = process_particle
|
|
process_funcs["SMOKE"] = process_smoke
|
|
process_funcs["DYNAMIC_PAINT"] = process_paint
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
i = sys.argv.index("--")
|
|
except:
|
|
i = 0
|
|
|
|
if i:
|
|
task_args = sys.argv[i+1:]
|
|
for i in range(0, len(task_args), 3):
|
|
bake_type = task_args[i]
|
|
obj = bpy.data.objects[task_args[i+1]]
|
|
index = int(task_args[i+2])
|
|
|
|
process_funcs.get(bake_type, process_null)(obj, index, i)
|