3
11
This repository has been archived on 2024-05-16. You can view files and clone it, but cannot push or open issues or pull requests.
blender-addons-contrib/netrender/baking.py

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)