forked from bartvdbraak/blender
afee963155
Docs are here: http://wiki.blender.org/index.php/User:Theeth/netrender Should be easy to test if people want too, just follow the instructions on wiki Code is still very much in flux, so I'd like if people would refrain from making changes (send patches directly to me if you must). The UI side is very crap, it's basically there just to get things testable. See wiki for known bugs.
81 lines
1.8 KiB
Python
81 lines
1.8 KiB
Python
import bpy
|
|
import sys, os
|
|
import http, http.client, http.server, urllib
|
|
import subprocess, shutil, time, hashlib
|
|
|
|
VERSION = b"0.3"
|
|
|
|
PATH_PREFIX = "/tmp/"
|
|
|
|
QUEUED = 0
|
|
DISPATCHED = 1
|
|
DONE = 2
|
|
ERROR = 3
|
|
|
|
def clientConnection(scene):
|
|
netrender = scene.network_render
|
|
|
|
conn = http.client.HTTPConnection(netrender.server_address, netrender.server_port)
|
|
|
|
if clientVerifyVersion(conn):
|
|
return conn
|
|
else:
|
|
conn.close()
|
|
return None
|
|
|
|
def clientVerifyVersion(conn):
|
|
conn.request("GET", "version")
|
|
response = conn.getresponse()
|
|
|
|
if response.status != http.client.OK:
|
|
conn.close()
|
|
return False
|
|
|
|
server_version = response.read()
|
|
|
|
if server_version != VERSION:
|
|
print("Incorrect server version!")
|
|
print("expected", VERSION, "received", server_version)
|
|
return False
|
|
|
|
return True
|
|
|
|
def clientSendJob(conn, scene, anim = False, chunks = 5):
|
|
|
|
if anim:
|
|
job_frame = "%i:%i" % (scene.start_frame, scene.end_frame)
|
|
else:
|
|
job_frame = "%i" % (scene.current_frame, )
|
|
|
|
blacklist = []
|
|
|
|
filename = bpy.data.filename
|
|
|
|
name = scene.network_render.job_name
|
|
|
|
if name == "[default]":
|
|
path, name = os.path.split(filename)
|
|
|
|
for slave in scene.network_render.slaves_blacklist:
|
|
blacklist.append(slave.id)
|
|
|
|
blacklist = " ".join(blacklist)
|
|
|
|
headers = {"job-frame":job_frame, "job-name":name, "job-chunks": str(chunks), "slave-blacklist": blacklist}
|
|
|
|
# try to send path first
|
|
conn.request("POST", "job", filename, headers=headers)
|
|
response = conn.getresponse()
|
|
|
|
# if not found, send whole file
|
|
if response.status == http.client.NOT_FOUND:
|
|
f = open(bpy.data.filename, "rb")
|
|
conn.request("PUT", "file", f, headers=headers)
|
|
f.close()
|
|
response = conn.getresponse()
|
|
|
|
return response.getheader("job-id")
|
|
|
|
def clientRequestResult(conn, scene, job_id):
|
|
conn.request("GET", "render", headers={"job-id": job_id, "job-frame":str(scene.current_frame)})
|