forked from bartvdbraak/blender
support for external images, blacklisting slaves on errors and proper job termination on cancel
This commit is contained in:
parent
25f4fe5d13
commit
434af76286
@ -26,6 +26,9 @@ def clientSendJob(conn, scene, anim = False, chunks = 5):
|
||||
if job_name == "[default]":
|
||||
job_name = name
|
||||
|
||||
###########################
|
||||
# LIBRARIES
|
||||
###########################
|
||||
for lib in bpy.data.libraries:
|
||||
lib_path = lib.filename
|
||||
|
||||
@ -34,11 +37,13 @@ def clientSendJob(conn, scene, anim = False, chunks = 5):
|
||||
|
||||
job.addFile(lib_path)
|
||||
|
||||
###########################
|
||||
# POINT CACHES
|
||||
###########################
|
||||
|
||||
root, ext = os.path.splitext(name)
|
||||
cache_path = path + os.sep + "blendcache_" + root + os.sep # need an API call for that
|
||||
|
||||
print("cache:", cache_path)
|
||||
|
||||
if os.path.exists(cache_path):
|
||||
caches = {}
|
||||
pattern = re.compile("([a-zA-Z0-9]+)_([0-9]+)_[0-9]+\.bphys")
|
||||
@ -80,7 +85,14 @@ def clientSendJob(conn, scene, anim = False, chunks = 5):
|
||||
previous_frame = previous_item[0]
|
||||
job.addFile(cache_path + current_file, previous_frame + 1, next_frame - 1)
|
||||
|
||||
print(job.files)
|
||||
###########################
|
||||
# IMAGES
|
||||
###########################
|
||||
for image in bpy.data.images:
|
||||
if image.source == "FILE" and not image.packed_file:
|
||||
job.addFile(image.filename)
|
||||
|
||||
# print(job.files)
|
||||
|
||||
job.name = job_name
|
||||
|
||||
|
@ -477,33 +477,43 @@ class RenderHandler(http.server.BaseHTTPRequestHandler):
|
||||
print("writing result file")
|
||||
self.server.stats("", "Receiving render result")
|
||||
|
||||
job_id = self.headers['job-id']
|
||||
slave_id = self.headers['slave-id']
|
||||
|
||||
job = self.server.getJobByID(job_id)
|
||||
slave = self.server.updateSlave(slave_id)
|
||||
|
||||
if job:
|
||||
job_frame = int(self.headers['job-frame'])
|
||||
job_result = int(self.headers['job-result'])
|
||||
job_time = float(self.headers['job-time'])
|
||||
if slave: # only if slave id is valid
|
||||
job_id = self.headers['job-id']
|
||||
|
||||
if job_result == DONE:
|
||||
length = int(self.headers['content-length'])
|
||||
buf = self.rfile.read(length)
|
||||
f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb')
|
||||
f.write(buf)
|
||||
f.close()
|
||||
|
||||
del buf
|
||||
|
||||
job = self.server.getJobByID(job_id)
|
||||
frame = job[job_frame]
|
||||
frame.status = job_result
|
||||
frame.time = job_time
|
||||
|
||||
self.server.updateSlave(self.headers['slave-id'])
|
||||
|
||||
self.send_head()
|
||||
else: # job not found
|
||||
if job:
|
||||
job_frame = int(self.headers['job-frame'])
|
||||
job_result = int(self.headers['job-result'])
|
||||
job_time = float(self.headers['job-time'])
|
||||
|
||||
frame = job[job_frame]
|
||||
|
||||
if job_result == DONE:
|
||||
length = int(self.headers['content-length'])
|
||||
buf = self.rfile.read(length)
|
||||
f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb')
|
||||
f.write(buf)
|
||||
f.close()
|
||||
|
||||
del buf
|
||||
elif job_result == ERROR:
|
||||
# blacklist slave on this job on error
|
||||
job.blacklist.append(slave.id)
|
||||
|
||||
frame.status = job_result
|
||||
frame.time = job_time
|
||||
|
||||
self.server.updateSlave(self.headers['slave-id'])
|
||||
|
||||
self.send_head()
|
||||
else: # job not found
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
else: # invalid slave id
|
||||
self.send_head(http.client.NO_CONTENT)
|
||||
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
elif self.path == "log":
|
||||
|
@ -119,6 +119,9 @@ def render_slave(engine, scene):
|
||||
run_t = current_t
|
||||
|
||||
if cancelled:
|
||||
# kill process if needed
|
||||
if process.poll() == None:
|
||||
process.terminate()
|
||||
continue # to next frame
|
||||
|
||||
total_t = time.time() - start_t
|
||||
|
Loading…
Reference in New Issue
Block a user