blender/release/io/netrender/client.py

89 lines
2.4 KiB
Python

import bpy
import sys, os
import http, http.client, http.server, urllib
import subprocess, shutil, time, hashlib
import netrender.slave as slave
import netrender.master as master
from netrender.utils import *
class NetworkRenderEngine(bpy.types.RenderEngine):
__idname__ = 'NET_RENDER'
__label__ = "Network Render"
def render(self, scene):
if scene.network_render.mode == "RENDER_CLIENT":
self.render_client(scene)
elif scene.network_render.mode == "RENDER_SLAVE":
self.render_slave(scene)
elif scene.network_render.mode == "RENDER_MASTER":
self.render_master(scene)
else:
print("UNKNOWN OPERATION MODE")
def render_master(self, scene):
server_address = (scene.network_render.server_address, scene.network_render.server_port)
httpd = master.RenderMasterServer(server_address, master.RenderHandler, scene.network_render.path)
httpd.timeout = 1
httpd.stats = self.update_stats
while not self.test_break():
httpd.handle_request()
def render_slave(self, scene):
slave.render_slave(self, scene)
def render_client(self, scene):
netsettings = scene.network_render
self.update_stats("", "Network render client initiation")
conn = clientConnection(scene)
if conn:
# Sending file
self.update_stats("", "Network render exporting")
job_id = netsettings.job_id
# reading back result
self.update_stats("", "Network render waiting for results")
clientRequestResult(conn, scene, job_id)
response = conn.getresponse()
if response.status == http.client.NO_CONTENT:
netsettings.job_id = clientSendJob(conn, scene)
clientRequestResult(conn, scene, job_id)
while response.status == http.client.ACCEPTED and not self.test_break():
print("waiting")
time.sleep(1)
clientRequestResult(conn, scene, job_id)
response = conn.getresponse()
if response.status != http.client.OK:
conn.close()
return
r = scene.render_data
x= int(r.resolution_x*r.resolution_percentage*0.01)
y= int(r.resolution_y*r.resolution_percentage*0.01)
f = open(netsetting.path + "output.exr", "wb")
buf = response.read(1024)
while buf:
f.write(buf)
buf = response.read(1024)
f.close()
result = self.begin_result(0, 0, x, y)
result.load_from_file(netsettings.path + "output.exr", 0, 0)
self.end_result(result)
conn.close()
bpy.types.register(NetworkRenderEngine)