blender/release/io/netrender/utils.py
Martin Poirier afee963155 First commit draft for network rendering.
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.
2009-08-29 17:25:22 +00:00

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)})