def setUp(self): self.output_file_name = os.path.join(tempfile.gettempdir(), "result.exr") ai.AiBegin() ai.AiMsgSetConsoleFlags(ai.AI_LOG_NONE) ai.AiMsgSetConsoleFlags(ai.AI_LOG_WARNINGS | ai.AI_LOG_ERRORS) options = ai.AiUniverseGetOptions() ai.AiNodeSetBool(options, "skip_license_check", True) ai.AiNodeSetInt(options, "xres", 16) ai.AiNodeSetInt(options, "yres", 16) self.my_camera = ai.AiNode("persp_camera", "my_camera", None) self.my_filter = ai.AiNode("gaussian_filter", "my_filter", None) self.my_driver = ai.AiNode("driver_exr", "my_driver", None) self.my_cryptomatte = ai.AiNode("cryptomatte", "my_cryptomatte", None) ai.AiNodeSetStr(self.my_driver, "filename", self.output_file_name) ai.AiNodeSetPtr(options, "aov_shaders", self.my_cryptomatte) self.assertTrue( self.my_cryptomatte, ("Cryptomatte node could not be created, plugin may not be " "loaded in Python. (There may be binary compatibily issues " "with Python). "))
def testProceduralsShareInstances(self): class PlaneProcedural(IECore.Renderer.Procedural): def __init__(self): IECore.Renderer.Procedural.__init__(self) def bound(self): return IECore.Box3f(IECore.V3f(-10, -10, -0.01), IECore.V3f(10, 10, 0.01)) def render(self, renderer): IECore.MeshPrimitive.createPlane( IECore.Box2f(IECore.V2f(-10), IECore.V2f(10))).render(renderer) def hash(self): h = IECore.MurmurHash() return h def arnoldMessageCallback(logMask, severity, msg, tabs): self.__arnoldMessages.append(msg) r = IECoreArnold.Renderer() messageCallback = arnold.AtMsgCallBack(arnoldMessageCallback) arnold.AiMsgSetCallback(messageCallback) self.__arnoldMessages = [] arnold.AiMsgSetConsoleFlags(arnold.AI_LOG_ALL) with IECore.WorldBlock(r): r.concatTransform( IECore.M44f.createTranslated(IECore.V3f(0, 0, -5))) for i in range(0, 100): r.procedural(PlaneProcedural()) # we can't check for the existence of ginstances by examining the nodes after rendering, # because it seems that after rendering, arnold reports the type of ginstances # as being the type of the thing they point to, rather than "ginstance". so instead we # check for evidence in the log. polyMeshStats = [ m for m in self.__arnoldMessages if m.startswith("polymeshes") ][0] self.failUnless("99" in polyMeshStats) # check that there are no bounding box warnings boundingBoxWarnings = [ m for m in self.__arnoldMessages if "bounding box" in m ] self.assertEqual(len(boundingBoxWarnings), 0)
def render_ass(ass, remove_ass=False): imagefilename = None ai.AiBegin() ai.AiLoadPlugins(os.environ['ARNOLD_PLUGIN_PATH']) ai.AiASSLoad (ass, ai.AI_NODE_ALL) ai.AiRender() ai.AiEnd() # read out file ai.AiBegin() ai.AiMsgSetConsoleFlags(ai.AI_LOG_ALL) ai.AiASSLoad(ass, ai.AI_NODE_ALL) iter = ai.AiUniverseGetNodeIterator(ai.AI_NODE_ALL) while not ai.AiNodeIteratorFinished(iter): node = ai.AiNodeIteratorGetNext(iter) if ai.AiNodeIs( node, "driver_jpeg" ): imagefilename = ai.AiNodeGetStr( node, "filename" ) ai.AiNodeIteratorDestroy(iter) ai.AiEnd() if remove_ass: os.remove(ass) return imagefilename
def renderGeo(self): arnold.AiBegin() arnold.AiMsgSetLogFileName(self._logFile) arnold.AiMsgSetConsoleFlags(arnold.AI_LOG_ALL) # create a sphere geometric primitive sph = arnold.AiNode("sphere") arnold.AiNodeSetStr(sph, "name", "mysphere") arnold.AiNodeSetVec(sph, "center", 0.0, 4.0, 0.0) arnold.AiNodeSetFlt(sph, "radius", 5.0) # create a red standard shader shader1 = arnold.AiNode("standard") arnold.AiNodeSetStr(shader1, "name", "myshader1") arnold.AiNodeSetRGB(shader1, "Kd_color", self._color[0], self._color[1], self._color[2]) arnold.AiNodeSetFlt(shader1, "Ks", 0.05) # assign the shaders to the geometric objects arnold.AiNodeSetPtr(sph, "shader", shader1) # create a perspective camera camera = arnold.AiNode("persp_camera") arnold.AiNodeSetStr(camera, "name", "mycamera") # position the camera (alternatively you can set 'matrix') arnold.AiNodeSetVec(camera, "position", 0.0, 10.0, 35.0) arnold.AiNodeSetVec(camera, "look_at", 0.0, 3.0, 0.0) arnold.AiNodeSetFlt(camera, "fov", 45.0) # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_A") # // position the light (alternatively use 'matrix') arnold.AiNodeSetVec(light, "position", 0.0, 30.0, 0.0) arnold.AiNodeSetFlt(light, "intensity", 10.0) # alternatively, use 'exposure' arnold.AiNodeSetFlt(light, "radius", 4.0) # for soft shadows # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_B") # // position the light (alternatively use 'matrix') arnold.AiNodeSetVec(light, "position", 0.0, -30.0, 0.0) arnold.AiNodeSetFlt(light, "intensity", 10.0) # alternatively, use 'exposure' arnold.AiNodeSetFlt(light, "radius", 4.0) # for soft shadows # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_C") # // position the light (alternatively use 'matrix') arnold.AiNodeSetVec(light, "position", 0.0, 4.0, 20.0) arnold.AiNodeSetFlt(light, "intensity", 5.0) # alternatively, use 'exposure' arnold.AiNodeSetFlt(light, "radius", 15.0) # for soft shadows # // get the global options node and set some options options = arnold.AiUniverseGetOptions() arnold.AiNodeSetInt(options, "AA_samples", 8) arnold.AiNodeSetInt(options, "xres", 480) arnold.AiNodeSetInt(options, "yres", 360) arnold.AiNodeSetInt(options, "GI_diffuse_depth", 4) # // set the active camera (optional, since there is only one camera) arnold.AiNodeSetPtr(options, "camera", camera) # create an output driver node driver = arnold.AiNode("driver_jpeg") arnold.AiNodeSetStr(driver, "name", "mydriver") arnold.AiNodeSetStr(driver, "filename", self._sceneName) arnold.AiNodeSetFlt(driver, "gamma", 2.2) # create a gaussian filter node filter = arnold.AiNode("gaussian_filter") arnold.AiNodeSetStr(filter, "name", "myfilter") # assign the driver and filter to the main (beauty) AOV, # which is called "RGBA" and is of type RGBA outputs_array = arnold.AiArrayAllocate(1, 1, arnold.AI_TYPE_STRING) arnold.AiArraySetStr(outputs_array, 0, "RGBA RGBA myfilter mydriver") arnold.AiNodeSetArray(options, "outputs", outputs_array) # finally, render the image! arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA) # // Arnold session shutdown arnold.AiEnd()
def _worker(data, new_data, redraw_event, mmap_size, mmap_name, state): print("+++ _worker: started") import os import ctypes dir = os.path.dirname(__file__) if dir not in sys.path: sys.path.append(dir) import arnold nodes = {} nptrs = [] # nodes linked by AiNodeSetPtr links = [] # nodes linked by AiNodeLink def _AiNodeSetArray(node, param, value): t, a = value _len = len(a) if t == arnold.AI_TYPE_VECTOR: _len //= 3 elif t == arnold.AI_TYPE_UINT: pass _a = arnold.AiArrayConvert(_len, 1, t, ctypes.c_void_p(a.ctypes.data)) arnold.AiNodeSetArray(node, param, _a) _AiNodeSet = { 'NodeSocketShader': lambda n, i, v: True, 'NodeSocketBool': lambda n, i, v: arnold.AiNodeSetBool(n, i, v), 'NodeSocketInt': lambda n, i, v: arnold.AiNodeSetInt(n, i, v), 'NodeSocketFloat': lambda n, i, v: arnold.AiNodeSetFlt(n, i, v), 'NodeSocketColor': lambda n, i, v: arnold.AiNodeSetRGBA(n, i, *v), 'NodeSocketVector': lambda n, i, v: arnold.AiNodeSetVec(n, i, *v), 'NodeSocketVectorXYZ': lambda n, i, v: arnold.AiNodeSetVector(n, i, *v), 'NodeSocketString': lambda n, i, v: arnold.AiNodeSetStr(n, i, v), 'ArnoldNodeSocketColor': lambda n, i, v: arnold.AiNodeSetRGB(n, i, *v), 'ArnoldNodeSocketByte': lambda n, i, v: arnold.AiNodeSetByte(n, i, v), 'ArnoldNodeSocketProperty': lambda n, i, v: True, 'BOOL': lambda n, p, v: arnold.AiNodeSetBool(n, p, v), 'BYTE': lambda n, p, v: arnold.AiNodeSetByte(n, p, v), 'INT': lambda n, p, v: arnold.AiNodeSetInt(n, p, v), 'FLOAT': lambda n, p, v: arnold.AiNodeSetFlt(n, p, v), 'VECTOR2': lambda n, p, v: arnold.AiNodeSetVec2(n, p, *v), 'RGB': lambda n, p, v: arnold.AiNodeSetRGB(n, p, *v), 'RGBA': lambda n, p, v: arnold.AiNodeSetRGBA(n, p, *v), 'VECTOR': lambda n, p, v: arnold.AiNodeSetVec(n, p, *v), 'STRING': lambda n, p, v: arnold.AiNodeSetStr(n, p, v), 'MATRIX': lambda n, p, v: arnold.AiNodeSetMatrix(n, p, arnold.AtMatrix(*v)), 'ARRAY': _AiNodeSetArray, 'LINK': lambda n, p, v: links.append((n, p, v)), 'NODE': lambda n, p, v: nptrs.append((n, p, v)), } arnold.AiBegin() try: arnold.AiMsgSetConsoleFlags(arnold.AI_LOG_ALL) arnold.AiMsgSetConsoleFlags(0x000E) from pprint import pprint as pp pp(data) ## Nodes for node in data['nodes']: nt, np = node anode = arnold.AiNode(nt) for n, (t, v) in np.items(): _AiNodeSet[t](anode, n, v) nodes[id(node)] = anode options = arnold.AiUniverseGetOptions() for n, (t, v) in data['options'].items(): _AiNodeSet[t](options, n, v) for n, p, v in nptrs: arnold.AiNodeSetPtr(n, p, nodes[id(v)]) for n, p, v in links: arnold.AiNodeLink(nodes[id(v)], p, n) ## Outputs filter = arnold.AiNode("gaussian_filter") arnold.AiNodeSetStr(filter, "name", "__filter") driver = arnold.AiNode("driver_display_callback") arnold.AiNodeSetStr(driver, "name", "__driver") outputs_aovs = (b"RGBA RGBA __filter __driver", ) outputs = arnold.AiArray(len(outputs_aovs), 1, arnold.AI_TYPE_STRING, *outputs_aovs) arnold.AiNodeSetArray(options, "outputs", outputs) sl = data['sl'] del nodes, nptrs, links, data _rect = lambda n, w, h: numpy.frombuffer( mmap.mmap(-1, w * h * 4 * 4, n), dtype=numpy.float32).reshape( [h, w, 4]) rect = _rect(mmap_name, *mmap_size) def _callback(x, y, width, height, buffer, data): print("+++ _callback:", x, y, width, height, ctypes.cast(buffer, ctypes.c_void_p)) if buffer: try: if new_data.poll(): arnold.AiRenderInterrupt() else: print("+++ _callback: tile", x, y, width, height) _buffer = ctypes.cast(buffer, ctypes.POINTER(ctypes.c_float)) a = numpy.ctypeslib.as_array(buffer, shape=(height, width, 4)) rect[y:y + height, x:x + width] = a redraw_event.set() return finally: arnold.AiFree(buffer) elif not new_data.poll(): return arnold.AiRenderAbort() #print("+++ _callback: abort") cb = arnold.AtDisplayCallBack(_callback) arnold.AiNodeSetPtr(driver, "callback", cb) class _Dict(dict): def update(self, u): for k, v in u.items(): if isinstance(v, dict): self[k] = _Dict.update(self.get(k, {}), v) else: self[k] = u[k] return self while state.value != ABORT: for _sl in range(*sl): arnold.AiNodeSetInt(options, "AA_samples", _sl) res = arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA) if res != arnold.AI_SUCCESS: break if state.value == ABORT: print("+++ _worker: abort") break data = _Dict() _data = new_data.recv() while _data is not None: from pprint import pprint as pp print("+++ _worker: data") pp(_data) data.update(_data) if not new_data.poll(): _nodes = data.get('nodes') if _nodes is not None: for name, params in _nodes.items(): node = arnold.AiNodeLookUpByName(name) for n, (t, v) in params.items(): _AiNodeSet[t](node, n, v) opts = data.get('options') if opts is not None: for n, (t, v) in opts.items(): _AiNodeSet[t](options, n, v) size = data.get('mmap_size') if size is not None: rect = _rect(mmap_name, *size) break _data = new_data.recv() finally: arnold.AiEnd() print("+++ _worker: finished")
def renderGeo(self): """ This method calls the arnold functions to setup and scene and render the image """ # Beging the arnold session arnold.AiBegin() # Set the log for debugging arnold.AiMsgSetLogFileName(self.log) arnold.AiMsgSetConsoleFlags(arnold.AI_LOG_ALL) # Set the attributes for shader attributes = { "Kd_color": ("rgb", (self._color[0], self._color[1], self._color[2])), "Ks": ("float", 0.05), "Ko": ("float", .5), } # Create a simple shader shader = _arnoldRenderUtils.createSimpleShader("standard", "myshader1", attributes) # Set the attributes for a geo attributes = { "center": ("vector", (0.0, 4.0, 0.0)), "radius": ("float", 5.0), "shader": ("pointer", shader) } # Create a simple sphere and set the shader created above sph = _arnoldRenderUtils.createGeometry("sphere", "mysphere", attributes) # Set camera attributes attributes = { "position": ("vector", (0.0, 10.0, 35.0)), "look_at": ("vector", (0.0, 3.0, 0.0)), "fov": ("float", 45.0), } # create a perspective camera camera = _arnoldRenderUtils.createCamera("persp_camera", "scene_Camera", attributes) # Set light attributes attributes = { "position": ("vector", (0.0, 30.0, 0.0)), "intensity": ("float", 10.0), "radius": ("float", 4.0), } # Create point lights with different attributes point_lightA = _arnoldRenderUtils.createLight("point_light", "pointLight_A", attributes) # Point Light B attributes["position"] = ("vector", (0.0, -30.0, 0.0)) point_lightB = _arnoldRenderUtils.createLight("point_light", "pointLight_B", attributes) # Point light C attributes = { "position": ("vector", (0.0, 4.0, 20.0)), "intensity": ("float", 5.0), "radius": ("float", 15.0), } point_lightC = _arnoldRenderUtils.createLight("point_light", "pointLight_C", attributes) # Set attributes for render Parameters attributes = { "AA_samples": ("integer", 8), "xres": ("integer", 480), "yres": ("integer", 360), "GI_diffuse_depth": ("integer", 4), "camera": ("pointer", camera), } # Set the render options options = _arnoldRenderUtils.createUniverseOptions(attributes) # Set the driver attributes attributes = { "filename": ("string", os.path.basename(self.image)), "gamma": ("float", 2.2), } driver = _arnoldRenderUtils.createOutputDriver("driver_jpeg", "scene_driver", attributes) # Create a filter filter = _arnoldRenderUtils.createFilter("gaussian_filter", "scene_filter", {}) # Create an output array with the filter and driver outputArrayElements = ["RGBA RGBA scene_filter scene_driver"] outputs_array = _arnoldRenderUtils.createOutputArray( arnold.AI_TYPE_STRING, outputArrayElements, {}) attributes = { "outputs": ("array", outputs_array), } _arnoldRenderUtils.assignAttributes(options, attributes) # render the image arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA) # Arnold session shutdown arnold.AiEnd()
def renderGeo(self): """ This method calls the arnold functions to setup and scene and render the image """ arnold.AiBegin() arnold.AiMsgSetLogFileName(self.log) arnold.AiMsgSetConsoleFlags(arnold.AI_LOG_ALL) attributes = { "Kd_color": ("rgb", (self._color[0], self._color[1], self._color[2])), "Ks": ("float", 0.05), "Ko": ("float", .5), } shader = createSimpleShader("standard", "myshader1", attributes) attributes = { "center": ("vector", (0.0, 4.0, 0.0)), "radius": ("float", 5.0), "shader": ("pointer", shader) } sph = createGeometry("sphere", "mysphere", attributes) # attributes["center"] = ("vector", (1.0, 2.0, 3.0)) # sph1 = createGeometry("sphere", "mysphere", attributes) # assignAttributes(sph, {"radius": ("float", 0.9)}) # arnold.AiNodeSetRGB(shader1, "Kd_color", self._color[0], self._color[1], self._color[2]) # arnold.AiNodeSetFlt(shader1, "Ks", 0.05) # # assign the shaders to the geometric objects # arnold.AiNodeSetPtr(sph, "shader", shader1) # create a perspective camera camera = arnold.AiNode("persp_camera") arnold.AiNodeSetStr(camera, "name", "mycamera") arnold.AiNodeSetVec(camera, "position", 0.0, 10.0, 35.0) arnold.AiNodeSetVec(camera, "look_at", 0.0, 3.0, 0.0) arnold.AiNodeSetFlt(camera, "fov", 45.0) # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_A") arnold.AiNodeSetVec(light, "position", 0.0, 30.0, 0.0) arnold.AiNodeSetFlt(light, "intensity", 10.0) arnold.AiNodeSetFlt(light, "radius", 4.0) # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_B") arnold.AiNodeSetVec(light, "position", 0.0, -30.0, 0.0) arnold.AiNodeSetFlt(light, "intensity", 10.0) arnold.AiNodeSetFlt(light, "radius", 4.0) # create a point light source light = arnold.AiNode("point_light") arnold.AiNodeSetStr(light, "name", "pointLight_C") arnold.AiNodeSetVec(light, "position", 0.0, 4.0, 20.0) arnold.AiNodeSetFlt(light, "intensity", 5.0) arnold.AiNodeSetFlt(light, "radius", 15.0) # get the global options node and set some options options = arnold.AiUniverseGetOptions() arnold.AiNodeSetInt(options, "AA_samples", 8) arnold.AiNodeSetInt(options, "xres", 480) arnold.AiNodeSetInt(options, "yres", 360) arnold.AiNodeSetInt(options, "GI_diffuse_depth", 4) arnold.AiNodeSetPtr(options, "camera", camera) # create an output driver node driver = arnold.AiNode("driver_jpeg") arnold.AiNodeSetStr(driver, "name", "mydriver") # arnold.AiNodeSetStr(driver, "filepath", os.path.dirname(self.image)) arnold.AiNodeSetStr(driver, "filename", os.path.basename(self.image)) arnold.AiNodeSetFlt(driver, "gamma", 2.2) # create a gaussian filter node filter = arnold.AiNode("gaussian_filter") arnold.AiNodeSetStr(filter, "name", "myfilter") # assign the driver and filter to the main (beauty) AOV, # which is called "RGBA" and is of type RGBA outputs_array = arnold.AiArrayAllocate(1, 1, arnold.AI_TYPE_STRING) arnold.AiArraySetStr(outputs_array, 0, "RGBA RGBA myfilter mydriver") arnold.AiNodeSetArray(options, "outputs", outputs_array) # finally, render the image! arnold.AiRender(arnold.AI_RENDER_MODE_CAMERA) # // Arnold session shutdown arnold.AiEnd()