SHOW:
|
|
- or go back to the newest paste.
1 | import datetime | |
2 | import time | |
3 | import sys | |
4 | xsi = Application | |
5 | ||
6 | - | def RedshiftSelectCudaDevices(deviceIds): |
6 | + | |
7 | - | Application.Redshift_SelectCudaDevices(eval(deviceIds)) |
7 | + | |
8 | xsi.LogMessage(datetime.datetime.now().strftime("' %H:%M.%S") + " rrSI : " + str(msg)) | |
9 | else: | |
10 | xsi.LogMessage(datetime.datetime.now().strftime("' %H:%M.%S") + " rrSI - " + str(lvl) + ": " + str(msg)) | |
11 | ||
12 | def logMessageDebug(lvl, msg): | |
13 | if (False): | |
14 | logMessage(lvl, msg) | |
15 | ||
16 | ||
17 | def flushLog(): | |
18 | sys.stdout.flush() | |
19 | sys.stderr.flush() | |
20 | ||
21 | def applyRendererOptions_Arnold(inPass,inVerbose,inArnoldAc,inRenderThreads, inRenderDemo,inRenderDisplace): | |
22 | if ((inRenderDemo!= None) and (len(str(inRenderDemo))>0)): | |
23 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.abort_on_license_fail",False) | |
24 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.skip_license_check",True) | |
25 | else: | |
26 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.abort_on_license_fail",True) | |
27 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.skip_license_check",False) | |
28 | if ((inArnoldAc!= None) and (len(str(inArnoldAc))>0)): | |
29 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.AA_samples",inArnoldAc) | |
30 | if ((inVerbose!= None) and (len(str(inVerbose))>0)): | |
31 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.log_level",inVerbose) | |
32 | if ((inRenderThreads!= None) and (len(str(inRenderThreads))>0)): | |
33 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.autodetect_threads",False) | |
34 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.threads",inRenderThreads) | |
35 | if ((inRenderDisplace!= None) and (len(str(inRenderDisplace))>0)): | |
36 | xsi.SetValue(str(inPass)+".Arnold_Render_Options.ignore_displacement",inRenderDisplace) | |
37 | ||
38 | ||
39 | def applyRendererOptions_Vray(inPass,inFName,inVerbose): | |
40 | if ((inVerbose!= None) and (len(str(inVerbose))>0)): | |
41 | xsi.SetValue(str(inPass)+".VRay_Options.sys_level",inVerbose) | |
42 | filName=inFName | |
43 | dirName="" | |
44 | PD="/" | |
45 | if (inFName.find("\\")>=0): | |
46 | PD="\\" | |
47 | pos= inFName.rfind(PD); | |
48 | if (pos>0): | |
49 | filName= inFName[pos+1:] | |
50 | dirName= inFName[0:pos] | |
51 | pos= filName.rfind("."); | |
52 | if (pos>0): | |
53 | filName= filName[0:pos] | |
54 | xsi.SetValue(str(inPass)+".VRay_Options.out_save_in",dirName) | |
55 | xsi.SetValue(str(inPass)+".VRay_Options.out_img_file_name",filName) | |
56 | xsi.SetValue(str(inPass)+".VRay_Options.gsw_dont_rend_finimg",False) | |
57 | ||
58 | ||
59 | ||
60 | ||
61 | def applyRendererOptions_MRay(inPass,inVerbose,inMrayAAsmin,inMrayAAsmax, inRenderDisplace): | |
62 | if ((inRenderDisplace!= None) and (len(str(inRenderDisplace))>0)): | |
63 | xsi.SetValue(str(inPass)+".mentalray.EnableDisplacementShaders",inRenderDisplace) | |
64 | if ((inVerbose!= None) and (len(str(inVerbose))>0)): | |
65 | xsi.SetValue(str(inPass)+".mentalray.VerbosityLevel",inVerbose) | |
66 | if ((inMrayAAsmin!= None) and (len(str(inMrayAAsmin))>0)): | |
67 | xsi.SetValue(str(inPass)+".mentalray.SamplesMin",inMrayAAsmin) | |
68 | if ((inMrayAAsmax!= None) and (len(str(inMrayAAsmax))>0)): | |
69 | xsi.SetValue(str(inPass)+".mentalray.SamplesMax",inMrayAAsmax) | |
70 | ||
71 | ||
72 | kso_global_inPass = "" | |
73 | ||
74 | def ksoRenderFrame(inFrStart,inFrEnd,inFrStep ): | |
75 | logMessage("","Changing scene frame to frame #"+str(inFrStart)+" ...") | |
76 | xsi.SetValue("PlayControl.Current", inFrStart, "") | |
77 | xsi.SceneRefresh() | |
78 | logMessage("","Starting to render frame #"+str(inFrStart)+" ...") | |
79 | global kso_global_inPass | |
80 | beforeFrame=datetime.datetime.now() | |
81 | xsi.renderpass (kso_global_inPass ,"", inFrStart,inFrEnd,inFrStep) | |
82 | nrofFrames=((inFrEnd-inFrStart)/inFrStep+1) | |
83 | afterFrame=datetime.datetime.now() | |
84 | afterFrame=afterFrame-beforeFrame; | |
85 | afterFrame=afterFrame/nrofFrames | |
86 | logMessage("","Average time per frame: "+str(afterFrame)+" h:m:s.ms") | |
87 | logMessage("","rrKSO Frame(s) done #"+str(inFrEnd)+" ") | |
88 | xsi.LogMessage(" ") | |
89 | xsi.LogMessage(" ") | |
90 | xsi.LogMessage(" ") | |
91 | flushLog() | |
92 | ||
93 | ||
94 | ||
95 | ||
96 | def rrKSOStartServer(inKSOPort): | |
97 | import kso_tcp | |
98 | kso_tcp.log_command="Application.LogMessage(' \\\'" | |
99 | logMessage("","rrKSO startup...") | |
100 | if ((inKSOPort== None) or (len(str(inKSOPort))<=0)): | |
101 | inKSOPort=7774 | |
102 | HOST, PORT = "localhost", 7774 | |
103 | server = kso_tcp.rrKSOServer((HOST, PORT), kso_tcp.rrKSOTCPHandler) | |
104 | logMessage("","rrKSO server started") | |
105 | kso_tcp.rrKSONextCommand="" | |
106 | while server.continueLoop: | |
107 | try: | |
108 | logMessageDebug("","rrKSO waiting for new command...") | |
109 | server.handle_request() | |
110 | time.sleep(1) # handle_request() seem to return before handle() completed execution | |
111 | except Exception, e: | |
112 | logMessage("ERR", e) | |
113 | server.continueLoop= False; | |
114 | import traceback | |
115 | logMessage("ERR",traceback.format_exc()) | |
116 | xsi.LogMessage(" ") | |
117 | xsi.LogMessage(" ") | |
118 | xsi.LogMessage(" ") | |
119 | logMessage("","rrKSONextCommand '"+ kso_tcp.rrKSONextCommand+"'") | |
120 | flushLog() | |
121 | if (len(kso_tcp.rrKSONextCommand)>0): | |
122 | if ((kso_tcp.rrKSONextCommand=="ksoQuit()") or (kso_tcp.rrKSONextCommand=="ksoQuit()\n")): | |
123 | server.continueLoop=False | |
124 | kso_tcp.rrKSONextCommand="" | |
125 | else: | |
126 | exec (kso_tcp.rrKSONextCommand) | |
127 | kso_tcp.rrKSONextCommand="" | |
128 | logMessage("","rrKSO closed") | |
129 | ||
130 | def render_KSO(inPass,inFrStart,inFrEnd,inFrStep,inKSOPort): | |
131 | logMessage("","Importing kso...") | |
132 | global kso_global_inPass | |
133 | kso_global_inPass= inPass | |
134 | rrKSOStartServer(inKSOPort) | |
135 | ||
136 | ||
137 | def render_default(inPass,inFrStart,inFrEnd,inFrStep): | |
138 | xsi.renderpass (inPass ,"", inFrStart,inFrEnd,inFrStep) | |
139 | ||
140 | ||
141 | def getParam(allArgList, argFindName): | |
142 | argFindName=argFindName.lower() | |
143 | for argComb in allArgList: | |
144 | arg= argComb.split(":") | |
145 | if (len(arg)<2): | |
146 | continue | |
147 | argName=arg[0].strip().lower() | |
148 | argValue=arg[1] | |
149 | if (len(arg)>2): # e.g. C:\program files\... | |
150 | argValue+=":" + arg[2] | |
151 | if (len(arg)>3): | |
152 | argValue+=":" + arg[3] | |
153 | argValue=argValue.strip() | |
154 | if (argName==argFindName): | |
155 | logMessage("","Flag "+argFindName.ljust(15)+": '"+argValue+"'"); | |
156 | return argValue | |
157 | return "" | |
158 | ||
159 | ||
160 | ||
161 | def rrStart(argAll): | |
162 | logMessage("","") | |
163 | timeStart=datetime.datetime.now() | |
164 | #argAll is almost a JSON string, but it is not to keep the commandline cleaner and less error prone | |
165 | allArgList= argAll.split(",") | |
166 | logMessageDebug("DGB",allArgList) | |
167 | inSName=getParam(allArgList,"SName") | |
168 | inKSOMode=getParam(allArgList,"KSOMode") | |
169 | inKSOPort=getParam(allArgList,"KSOPort") | |
170 | inDb=getParam(allArgList,"Db") | |
171 | inPass=getParam(allArgList,"Pass") | |
172 | inSkipFrame=getParam(allArgList,"SkipFrame") | |
173 | inFName=getParam(allArgList,"FName") | |
174 | inFExt=getParam(allArgList,"FExt") | |
175 | inFPadding=getParam(allArgList,"FPadding") | |
176 | inFType=getParam(allArgList,"FType") | |
177 | inFNameChannelAdd=getParam(allArgList,"FNameChannelAdd") | |
178 | inFrStart=getParam(allArgList,"FrStart") | |
179 | inFrEnd=getParam(allArgList,"FrEnd") | |
180 | inFrStep=getParam(allArgList,"FrStep") | |
181 | inFrOffset=getParam(allArgList,"FrOffset") | |
182 | inCamera=getParam(allArgList,"Camera") | |
183 | inVerbose=getParam(allArgList,"Verbose") | |
184 | inMrayAAsmin=getParam(allArgList,"MrayAAsmin") | |
185 | inMrayAAsmax=getParam(allArgList,"MrayAAsmax") | |
186 | inArnoldAc=getParam(allArgList,"ArnoldAc") | |
187 | inResX=getParam(allArgList,"ResX") | |
188 | inResY=getParam(allArgList,"ResY") | |
189 | inRegionX1=getParam(allArgList,"RegionX1") | |
190 | inRegionX2=getParam(allArgList,"RegionX2") | |
191 | inRegionY1=getParam(allArgList,"RegionY1") | |
192 | inRegionY2=getParam(allArgList,"RegionY2") | |
193 | inRenderThreads=getParam(allArgList,"RenderThreads") | |
194 | inRenderDemo=getParam(allArgList,"RenderDemo") | |
195 | inRenderDisplace=getParam(allArgList,"RenderDisplace") | |
196 | inPyModPath=getParam(allArgList,"PyModPath") | |
197 | #[RS] Get Redshift CUDA devices list from args | |
198 | inRedshiftCudaDevices=getParam(allArgList,"RsCudaDevices") | |
199 | ||
200 | if ((inPyModPath!= None) and (len(inPyModPath)>0)): | |
201 | import sys | |
202 | sys.path.append(inPyModPath) | |
203 | ||
204 | if ((inDb!= None) and (len(inDb)>0)): | |
205 | logMessage("","Set project to '" + inDb+"'...") | |
206 | xsi.ActiveProject = inDb | |
207 | logMessage("", "Active Project: " + str(xsi.ActiveProject2.Path)) | |
208 | ||
209 | logMessage("", "Loading Scene '" + str(inSName)+"'...") | |
210 | xsi.OpenScene(inSName, False, "") | |
211 | if ((inDb!= None) and (len(inDb)>0)): | |
212 | logMessage("","Set project to '" + inDb+"'...") | |
213 | xsi.ActiveProject = inDb | |
214 | logMessage("", "Active Project: " + str(xsi.ActiveProject2.Path)) | |
215 | ||
216 | ||
217 | if ((inPass!= None) and (len(inPass)>0)): | |
218 | logMessage("","Set pass to '" + str(inPass) +"'") | |
219 | inPass= "Passes." + str(inPass) | |
220 | xsi.SetCurrentPass(str(inPass)) | |
221 | else: | |
222 | inPass= xsi.GetCurrentPass() | |
223 | logMessage("","Using current pass '" + inPass +"'") | |
224 | ||
225 | renderer=xsi.GetValue(str(inPass)+".renderer") | |
226 | if (len(renderer)==0): | |
227 | renderer = xsi.GetValue("Passes.RenderOptions.Renderer") | |
228 | logMessage("","renderer used: '" + renderer +"'") | |
229 | ||
230 | if ((inCamera!= None) and (len(inCamera)>0)): | |
231 | logMessage("","Set renderer to " +inCamera) | |
232 | xsi.SetValue(str(inPass)+".Camera",inCamera) | |
233 | ||
234 | if ((inSkipFrame!= None) and (len(str(inSkipFrame))>0)): | |
235 | logMessage("","Set FrameSkipRendered to " +str(inSkipFrame)) | |
236 | xsi.SetValue(str(inPass)+".FrameSkipRendered",inSkipFrame) | |
237 | ||
238 | if ((inResX!= None) and (len(str(inResX))>0)): | |
239 | logMessage("","Set width to " +str(inResX)) | |
240 | if (xsi.GetValue(str(inPass)+".ImageFormatOverride")): | |
241 | xsi.SetValue(str(inPass)+".ImageWidth",inResX) | |
242 | else: | |
243 | xsi.SetValue("Passes.RenderOptions.ImageWidth",inResX) | |
244 | ||
245 | if ((inResY!= None) and (len(str(inResY))>0)): | |
246 | logMessage("","Set height to " +str(inResY)) | |
247 | if (xsi.GetValue(str(inPass)+".ImageFormatOverride")): | |
248 | xsi.SetValue(str(inPass)+".ImageLockAspectRatio",False) | |
249 | xsi.SetValue(str(inPass)+".ImageHeight",inResY) | |
250 | else: | |
251 | xsi.SetValue("Passes.RenderOptions.ImageLockAspectRatio",False) | |
252 | xsi.SetValue("Passes.RenderOptions.ImageHeight",inResY) | |
253 | ||
254 | if ((inRegionX1!= None) and (len(str(inRegionX1))>0)): | |
255 | xsi.SetValue(str(inPass)+".CropWindowEnabled",True) | |
256 | xsi.SetValue(str(inPass)+".SelectionTracking",False) | |
257 | xsi.SetValue(str(inPass)+".CropWindowOffsetY",0) | |
258 | xsi.SetValue(str(inPass)+".CropWindowHeight",9999) | |
259 | xsi.SetValue(str(inPass)+".CropWindowOffsetX",inRegionX1) | |
260 | xsi.SetValue(str(inPass)+".CropWindowWidth",(inRegionX2-inRegionX1+1)) | |
261 | if ((inRegionX1!= None) and (len(str(inRegionX1))>0)): | |
262 | xsi.SetValue(str(inPass)+".CropWindowOffsetY",inRegionY1) | |
263 | xsi.SetValue(str(inPass)+".CropWindowHeight",(inRegionY2-inRegionY1+1)) | |
264 | logMessage("","Set region to X:" +str(inRegionX1)+"-" +str(inRegionX2)+" Y:" +str(inRegionX1)+"-" +str(inRegionX2)) | |
265 | else: | |
266 | logMessage("","Set region to X:" +str(inRegionX1)+"-" +str(inRegionX2)) | |
267 | ||
268 | if ((inFPadding!= None) and (len(str(inFPadding))>0)): | |
269 | if (inFPadding<=4): | |
270 | logMessage("","Set frame padding to " +str(inFPadding)) | |
271 | xsi.SetValue("Passes.RenderOptions.FramePadding",inFPadding) | |
272 | ||
273 | inFNameCopy=inFName | |
274 | ||
275 | if ((inFName!= None) and (len(str(inFName))>0)): | |
276 | xsi.SetValue(str(inPass)+".Main.Enabled", True) | |
277 | inFName=inFName.replace("<Layer>", "[Pass]") | |
278 | inFName=inFName.replace("<Channel>", "[Framebuffer]") | |
279 | inFName=inFName.replace("<Camera>", "[Camera]") | |
280 | inFName=inFName.replace("<Camera_no.>", "[Camera]") | |
281 | orgFileName=xsi.GetValue(str(inPass)+".Main.Filename") | |
282 | if ((inFPadding!= None) and (len(str(inFPadding))>0)): | |
283 | if (inFPadding>4): | |
284 | for o in range(1, int(inFPadding)): | |
285 | inFName= inFName+"#" | |
286 | else: | |
287 | inFName= inFName+"[Frame]" | |
288 | else: | |
289 | inFName= inFName + "[Frame " | |
290 | if ((inFrOffset!= None) and (len(str(inFrOffset))>0) and (int(inFrOffset)!=0)): | |
291 | if (int(inFrOffset<0)): | |
292 | inFName= inFName + str(inFrOffset) | |
293 | else: | |
294 | inFName= inFName + "+" +str(inFrOffset) | |
295 | inFName= inFName + "]" | |
296 | if ((inFExt!= None) and (len(inFExt)>0)): | |
297 | inFName= inFName + inFExt | |
298 | logMessage("","Set Filename to " +inFName) | |
299 | xsi.SetValue(str(inPass)+".Main.Filename",inFName) | |
300 | if (renderer=="Arnold Render" and (orgFileName.lower().find("framebuffer")<=0)): | |
301 | oPass= xsi.GetValue(str(inPass)) | |
302 | for fbuffer in oPass.Framebuffers: | |
303 | if (orgFileName==xsi.GetValue(fbuffer.FileName)): | |
304 | logMessage("","Set Channel Filename to " +inFName) | |
305 | fbuffer.FileName=inFName | |
306 | ||
307 | ||
308 | if ((inFNameChannelAdd!= None) and (len(str(inFNameChannelAdd))>0)): | |
309 | oPass= xsi.GetValue(str(inPass)) | |
310 | for fbuffer in oPass.Framebuffers: | |
311 | if (fbuffer.name!="Main"): | |
312 | chFname= xsi.GetValue(fbuffer.Filename) | |
313 | chDname="" | |
314 | spos=chFname.lower().find("[Frame") | |
315 | if (spos>0): | |
316 | chDname = chFname[spos:] | |
317 | chFname = chFname[0:spos-1] | |
318 | chDname="."+chdname | |
319 | else: | |
320 | spos=chFname.lower().find("#") | |
321 | if (spos>0): | |
322 | chDname = chFname[spos:] | |
323 | chFname = chFname[0:spos-1] | |
324 | chDname="."+chDname | |
325 | if ((chFname[-1] != ".") and (chFname[-1] != "_")): | |
326 | chFname=chFname +"." | |
327 | chFname= chFname + inFNameChannelAdd + chDname | |
328 | xsi.SetValue(fbuffer.Filename, chFname) | |
329 | logMessage("","Set framebuffer output to " +inFName) | |
330 | ||
331 | #[RS] Select CUDA devices for Redshift | |
332 | Application.Redshift_SelectCudaDevices(eval(inRedshiftCudaDevices)) | |
333 | ||
334 | if (renderer=="Arnold Render"): | |
335 | applyRendererOptions_Arnold(inPass,inVerbose,inArnoldAc,inRenderThreads, inRenderDemo,inRenderDisplace) | |
336 | elif (renderer=="VRay"): | |
337 | applyRendererOptions_Vray(inPass,inFName,inVerbose) | |
338 | else: | |
339 | applyRendererOptions_MRay(inPass,inVerbose,inMrayAAsmin,inMrayAAsmax, inRenderDisplace) | |
340 | ||
341 | ||
342 | inFrStart=int(inFrStart) | |
343 | inFrEnd=int(inFrEnd) | |
344 | inFrStep=int(inFrStep) | |
345 | logMessage("","Changing current frame to " +str(inFrStart)) | |
346 | xsi.SetValue("PlayControl.Current", inFrStart, "") | |
347 | xsi.SceneRefresh() | |
348 | logMessage("","Scene init done, starting to render... ") | |
349 | timeEnd=datetime.datetime.now() | |
350 | timeEnd=timeEnd - timeStart; | |
351 | logMessage("","Scene load time: "+str(timeEnd)+" h:m:s.ms") | |
352 | ||
353 | ||
354 | if ((inKSOMode!= None) and (len(str(inKSOMode))>0)): | |
355 | render_KSO(inPass,inFrStart,inFrEnd,inFrStep,inKSOPort) | |
356 | else: | |
357 | render_default(inPass,inFrStart,inFrEnd,inFrStep) | |
358 | ||
359 | logMessage("","Render done") |