Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2009-08-29 21:25:22 +0400
committerMartin Poirier <theeth@yahoo.com>2009-08-29 21:25:22 +0400
commitafee963155a2776066d377ed590e755217948d0f (patch)
tree7612d20af38df7bd4c97da9595e6bc8fde35d6f2 /release/io/netrender/client.py
parente6f2f4db285be1ccdc9c9871171afb1f9e2a4f6c (diff)
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.
Diffstat (limited to 'release/io/netrender/client.py')
-rw-r--r--release/io/netrender/client.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/release/io/netrender/client.py b/release/io/netrender/client.py
new file mode 100644
index 00000000000..90039a3273a
--- /dev/null
+++ b/release/io/netrender/client.py
@@ -0,0 +1,87 @@
+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)
+ 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):
+ self.update_stats("", "Network render client initiation")
+
+ conn = clientConnection(scene)
+
+ if conn:
+ # Sending file
+
+ self.update_stats("", "Network render exporting")
+
+ job_id = scene.network_render.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:
+ scene.network_render.job_id = clientSendJob(conn, scene)
+ clientRequestResult(conn, scene, job_id)
+
+ while response.status == http.client.PROCESSING 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(PATH_PREFIX + "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(PATH_PREFIX + "output.exr", 0, 0)
+ self.end_result(result)
+
+ conn.close()
+
+bpy.types.register(NetworkRenderEngine)
+